Add cargo hatch priority and status to be included in detailed export

This commit is contained in:
Colin McLeod
2015-09-01 18:36:57 -07:00
parent aac4c9a872
commit 1970616443
7 changed files with 54 additions and 34 deletions

View File

@@ -10,8 +10,8 @@ angular.module('app').service('Serializer', ['lodash', 'GroupMap', 'MountMap', '
*/ */
this.fromShip = function(ship) { this.fromShip = function(ship) {
var power = { var power = {
enabled: [ship.cargoScoop.enabled ? 1 : 0], enabled: [ship.cargoHatch.enabled ? 1 : 0],
priorities: [ship.cargoScoop.priority] priorities: [ship.cargoHatch.priority]
}; };
var data = [ var data = [
@@ -84,6 +84,7 @@ angular.module('app').service('Serializer', ['lodash', 'GroupMap', 'MountMap', '
components: { components: {
standard: { standard: {
bulkheads: ship.bulkheads.c.name, bulkheads: ship.bulkheads.c.name,
cargoHatch: { enabled: Boolean(ship.cargoHatch.enabled), priority: ship.cargoHatch.priority + 1 },
powerPlant: { class: standard[0].c.class, rating: standard[0].c.rating, enabled: Boolean(standard[0].enabled), priority: standard[0].priority + 1 }, powerPlant: { class: standard[0].c.class, rating: standard[0].c.rating, enabled: Boolean(standard[0].enabled), priority: standard[0].priority + 1 },
thrusters: { class: standard[1].c.class, rating: standard[1].c.rating, enabled: Boolean(standard[1].enabled), priority: standard[1].priority + 1 }, thrusters: { class: standard[1].c.class, rating: standard[1].c.rating, enabled: Boolean(standard[1].enabled), priority: standard[1].priority + 1 },
frameShiftDrive: { class: standard[2].c.class, rating: standard[2].c.rating, enabled: Boolean(standard[2].enabled), priority: standard[2].priority + 1 }, frameShiftDrive: { class: standard[2].c.class, rating: standard[2].c.rating, enabled: Boolean(standard[2].enabled), priority: standard[2].priority + 1 },
@@ -116,25 +117,26 @@ angular.module('app').service('Serializer', ['lodash', 'GroupMap', 'MountMap', '
} }
var comps = detailedBuild.components; var comps = detailedBuild.components;
var priorities = [ 0 ]; // cargoScoop var standard = comps.standard;
var enabled = [ true ]; // assume cargoScoop enabled var priorities = [ standard.cargoHatch && standard.cargoHatch.priority !== undefined ? standard.cargoHatch.priority - 1 : 0 ];
var enabled = [ standard.cargoHatch && standard.cargoHatch.enabled !== undefined ? standard.cargoHatch.enabled : true ];
var shipData = ShipsDB[shipId]; var shipData = ShipsDB[shipId];
var ship = new Ship(shipId, shipData.properties, shipData.slots); var ship = new Ship(shipId, shipData.properties, shipData.slots);
var bulkheads = Components.bulkheadIndex(comps.standard.bulkheads); var bulkheads = Components.bulkheadIndex(standard.bulkheads);
if (bulkheads < 0) { if (bulkheads < 0) {
throw 'Invalid bulkheads: ' + comps.standard.bulkheads; throw 'Invalid bulkheads: ' + standard.bulkheads;
} }
var common = _.map( var common = _.map(
['powerPlant', 'thrusters', 'frameShiftDrive', 'lifeSupport', 'powerDistributor', 'sensors', 'fuelTank'], ['powerPlant', 'thrusters', 'frameShiftDrive', 'lifeSupport', 'powerDistributor', 'sensors', 'fuelTank'],
function(c) { function(c) {
if (!comps.standard[c].class || !comps.standard[c].rating) { if (!standard[c].class || !standard[c].rating) {
throw 'Invalid value for ' + c; throw 'Invalid value for ' + c;
} }
priorities.push(comps.standard[c].priority === undefined ? 0 : comps.standard[c].priority - 1); priorities.push(standard[c].priority === undefined ? 0 : standard[c].priority - 1);
enabled.push(comps.standard[c].enabled === undefined ? true : comps.standard[c].enabled); enabled.push(standard[c].enabled === undefined ? true : standard[c].enabled);
return comps.standard[c].class + comps.standard[c].rating; return standard[c].class + standard[c].rating;
} }
); );

View File

@@ -27,7 +27,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
*/ */
function Ship(id, properties, slots) { function Ship(id, properties, slots) {
this.id = id; this.id = id;
this.cargoScoop = { c: Components.cargoScoop(), type: 'SYS' }; this.cargoHatch = { c: Components.cargoHatch(), type: 'SYS' };
this.bulkheads = { incCost: true, maxClass: 8 }; this.bulkheads = { incCost: true, maxClass: 8 };
for (var p in properties) { this[p] = properties[p]; } // Copy all base properties from shipData for (var p in properties) { this[p] = properties[p]; } // Copy all base properties from shipData
@@ -51,7 +51,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
this.costList.unshift(this.c); // Add the ship itself to the list this.costList.unshift(this.c); // Add the ship itself to the list
this.powerList = _.union(this.internal, this.hardpoints); this.powerList = _.union(this.internal, this.hardpoints);
this.powerList.unshift(this.cargoScoop); this.powerList.unshift(this.cargoHatch);
this.powerList.unshift(this.common[1]); // Add Thrusters this.powerList.unshift(this.common[1]); // Add Thrusters
this.powerList.unshift(this.common[5]); // Add Sensors this.powerList.unshift(this.common[5]); // Add Sensors
this.powerList.unshift(this.common[4]); // Add Power Distributor this.powerList.unshift(this.common[4]); // Add Power Distributor
@@ -96,8 +96,8 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
this.bulkheads.c = null; this.bulkheads.c = null;
this.useBulkhead(comps && comps.bulkheads ? comps.bulkheads : 0, true); this.useBulkhead(comps && comps.bulkheads ? comps.bulkheads : 0, true);
this.cargoScoop.priority = priorities ? priorities[0] * 1 : 0; this.cargoHatch.priority = priorities ? priorities[0] * 1 : 0;
this.cargoScoop.enabled = enabled ? enabled[0] * 1 : true; this.cargoHatch.enabled = enabled ? enabled[0] * 1 : true;
for (i = 0, l = this.priorityBands.length; i < l; i++) { for (i = 0, l = this.priorityBands.length; i < l; i++) {
this.priorityBands[i].deployed = 0; this.priorityBands[i].deployed = 0;
@@ -105,8 +105,8 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
this.priorityBands[i].retOnly = 0; this.priorityBands[i].retOnly = 0;
} }
if (this.cargoScoop.enabled) { if (this.cargoHatch.enabled) {
bands[this.cargoScoop.priority].retracted += this.cargoScoop.c.power; bands[this.cargoHatch.priority].retracted += this.cargoHatch.c.power;
} }
for (i = 0; i < cl; i++) { for (i = 0; i < cl; i++) {

View File

@@ -6,7 +6,7 @@ angular.module('shipyard').service('Components', ['lodash', 'ComponentsDB', 'Shi
GrpNameToCodeMap[GroupMap[grp]] = grp; GrpNameToCodeMap[GroupMap[grp]] = grp;
} }
this.cargoScoop = function() { this.cargoHatch = function() {
return { name: 'Cargo Hatch', class: 1, rating: 'H', power: 0.6 }; return { name: 'Cargo Hatch', class: 1, rating: 'H', power: 0.6 };
}; };

View File

@@ -49,11 +49,18 @@
"description": "The set of standard components across all ships", "description": "The set of standard components across all ships",
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
"required": ["bulkheads", "powerPlant", "thrusters", "frameShiftDrive", "lifeSupport", "powerDistributor", "sensors", "fuelTank"], "required": ["bulkheads", "powerPlant", "thrusters", "frameShiftDrive", "lifeSupport", "powerDistributor", "sensors", "fuelTank", "cargoHatch"],
"properties": { "properties": {
"bulkheads": { "bulkheads": {
"enum": ["Lightweight Alloy", "Reinforced Alloy", "Military Grade Composite", "Mirrored Surface Composite", "Reactive Surface Composite"] "enum": ["Lightweight Alloy", "Reinforced Alloy", "Military Grade Composite", "Mirrored Surface Composite", "Reactive Surface Composite"]
}, },
"cargoHatch": {
"required": ["enabled", "priority"],
"properties": {
"enabled": { "type": "boolean" },
"priority": { "type": "integer", "minimum": 1, "maximum": 5 }
}
},
"powerPlant": { "powerPlant": {
"required": ["class", "rating", "enabled", "priority"], "required": ["class", "rating", "enabled", "priority"],
"properties": { "properties": {

View File

@@ -13,6 +13,10 @@
"components": { "components": {
"standard": { "standard": {
"bulkheads": "Reactive Surface Composite", "bulkheads": "Reactive Surface Composite",
"cargoHatch": {
"enabled": false,
"priority": 5
},
"powerPlant": { "powerPlant": {
"class": 8, "class": 8,
"rating": "A", "rating": "A",
@@ -269,8 +273,8 @@
"unladenMass": 1179.2, "unladenMass": 1179.2,
"totalDps": 29, "totalDps": 29,
"powerAvailable": 36, "powerAvailable": 36,
"powerRetracted": 23.93, "powerRetracted": 23.33,
"powerDeployed": 35.36, "powerDeployed": 34.76,
"unladenRange": 18.49, "unladenRange": 18.49,
"fullTankRange": 18.12, "fullTankRange": 18.12,
"ladenRange": 16.39, "ladenRange": 16.39,

View File

@@ -98,8 +98,8 @@ describe('Import Controller', function() {
describe('Import Detailed Build', function() { describe('Import Detailed Build', function() {
it('imports a valid build', function() { it('imports a valid v1 build', function() {
var importData = __json__['fixtures/anaconda-test-detailed-export']; var importData = __json__['fixtures/anaconda-test-detailed-export-v1'];
scope.importString = angular.toJson(importData); scope.importString = angular.toJson(importData);
scope.validateImport(); scope.validateImport();
expect(scope.importValid).toBeTruthy(); expect(scope.importValid).toBeTruthy();
@@ -108,12 +108,26 @@ describe('Import Controller', function() {
expect(scope.processed).toBeTruthy(); expect(scope.processed).toBeTruthy();
scope.import(); scope.import();
expect(angular.fromJson(localStorage.getItem('builds'))).toEqual({ expect(angular.fromJson(localStorage.getItem('builds'))).toEqual({
anaconda: { 'Test': '48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.Iw18QDBNA===.AwhMJBGaei+JCyyiA===' } anaconda: { 'Test': '48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.Iw18ZlA=.Aw18ZlA=' }
});
});
it('imports a valid v2 build', function() {
var importData = __json__['fixtures/anaconda-test-detailed-export-v2'];
scope.importString = angular.toJson(importData);
scope.validateImport();
expect(scope.importValid).toBeTruthy();
expect(scope.errorMsg).toEqual(null);
scope.process();
expect(scope.processed).toBeTruthy();
scope.import();
expect(angular.fromJson(localStorage.getItem('builds'))).toEqual({
anaconda: { 'Test': '48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.AwRj4zNKqA==.CwBhCYzBGW9qCTSqs5xA' }
}); });
}); });
it('catches an invalid build', function() { it('catches an invalid build', function() {
var importData = __json__['fixtures/anaconda-test-detailed-export']; var importData = __json__['fixtures/anaconda-test-detailed-export-v2'];
scope.importString = angular.toJson(importData).replace('components', 'comps'); scope.importString = angular.toJson(importData).replace('components', 'comps');
scope.validateImport(); scope.validateImport();
expect(scope.importValid).toBeFalsy(); expect(scope.importValid).toBeFalsy();

View File

@@ -3,7 +3,7 @@ describe("Serializer Service", function() {
var Ship, var Ship,
Serializer, Serializer,
code = '48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.Iw18QDBNA===.AwhMJBGaei+JCyyiA===', code = '48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.AwRj4zNKqA==.CwBhCYzBGW9qCTSqs5xA',
anaconda = DB.ships['anaconda'], anaconda = DB.ships['anaconda'],
testBuild, testBuild,
exportData; exportData;
@@ -21,13 +21,6 @@ describe("Serializer Service", function() {
exportData = Serializer.toDetailedBuild('Test', testBuild, code); exportData = Serializer.toDetailedBuild('Test', testBuild, code);
}); });
it("conforms to the v1 ship-loadout schema", function() {
var shipLoadoutSchema = __json__['schemas/ship-loadout/1'];
var validate = jsen(shipLoadoutSchema);
var valid = validate(exportData);
expect(valid).toBeTruthy();
});
it("conforms to the v2 ship-loadout schema", function() { it("conforms to the v2 ship-loadout schema", function() {
var shipLoadoutSchema = __json__['schemas/ship-loadout/2']; var shipLoadoutSchema = __json__['schemas/ship-loadout/2'];
var validate = jsen(shipLoadoutSchema); var validate = jsen(shipLoadoutSchema);
@@ -36,7 +29,7 @@ describe("Serializer Service", function() {
}); });
it("contains the correct components and stats", function() { it("contains the correct components and stats", function() {
var anacondaTestExport = __json__['fixtures/anaconda-test-detailed-export']; var anacondaTestExport = __json__['fixtures/anaconda-test-detailed-export-v2'];
expect(exportData.components).toEqual(anacondaTestExport.components); expect(exportData.components).toEqual(anacondaTestExport.components);
expect(exportData.stats).toEqual(anacondaTestExport.stats); expect(exportData.stats).toEqual(anacondaTestExport.stats);
expect(exportData.ship).toEqual(anacondaTestExport.ship); expect(exportData.ship).toEqual(anacondaTestExport.ship);
@@ -48,7 +41,7 @@ describe("Serializer Service", function() {
describe("From Detailed Build", function() { describe("From Detailed Build", function() {
it("builds the ship correctly", function() { it("builds the ship correctly", function() {
var anacondaTestExport = __json__['fixtures/anaconda-test-detailed-export']; var anacondaTestExport = __json__['fixtures/anaconda-test-detailed-export-v2'];
testBuildA = new Ship('anaconda', anaconda.properties, anaconda.slots); testBuildA = new Ship('anaconda', anaconda.properties, anaconda.slots);
Serializer.toShip(testBuildA, code); Serializer.toShip(testBuildA, code);
testBuildB = Serializer.fromDetailedBuild(anacondaTestExport); testBuildB = Serializer.fromDetailedBuild(anacondaTestExport);