mirror of
https://github.com/EDCD/coriolis.git
synced 2025-12-08 14:33:22 +00:00
Compare commits
66 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f0bdcd5557 | ||
|
|
b1ee0e44f3 | ||
|
|
c96e6afbd7 | ||
|
|
77334341ea | ||
|
|
5f22743778 | ||
|
|
03986cb88a | ||
|
|
c796adf40d | ||
|
|
2890ff5537 | ||
|
|
a6ba61a2bf | ||
|
|
db5e080992 | ||
|
|
63d7f98e2c | ||
|
|
7997ff6ae9 | ||
|
|
b3126cf6b6 | ||
|
|
ab1ea53ce3 | ||
|
|
82a87cb653 | ||
|
|
d2fc526039 | ||
|
|
88587c6487 | ||
|
|
4578dbf906 | ||
|
|
cd48ef6f86 | ||
|
|
0f0e67ec9c | ||
|
|
bbb2a223af | ||
|
|
5278e52e2f | ||
|
|
e6290abef7 | ||
|
|
346fee1208 | ||
|
|
1b9f5f870e | ||
|
|
26b624d1dd | ||
|
|
7cbd9732b7 | ||
|
|
44152116b4 | ||
|
|
3ad35992fc | ||
|
|
e963eb24a0 | ||
|
|
827e2b403c | ||
|
|
0fd4712021 | ||
|
|
ae0af05e78 | ||
|
|
dd00f283e6 | ||
|
|
eddf968629 | ||
|
|
7fdd83ba84 | ||
|
|
1bb4f6850e | ||
|
|
f47b931380 | ||
|
|
d9f686f0d6 | ||
|
|
73cef20073 | ||
|
|
fd68565d8e | ||
|
|
a45d165d33 | ||
|
|
904f828d83 | ||
|
|
f00420c92f | ||
|
|
457705014c | ||
|
|
6faf3765e0 | ||
|
|
4abdce2b70 | ||
|
|
3b44f5fe27 | ||
|
|
7332dc69ed | ||
|
|
381387c04f | ||
|
|
e0db9fdfb0 | ||
|
|
a8d66b22af | ||
|
|
bdc1e622f9 | ||
|
|
ad8130ae9b | ||
|
|
394a3bb9f1 | ||
|
|
54907b462c | ||
|
|
1350de1910 | ||
|
|
89d3fd69e1 | ||
|
|
7325081ec9 | ||
|
|
680872a302 | ||
|
|
a3c65d6c69 | ||
|
|
a189265326 | ||
|
|
b447e913ff | ||
|
|
b5a249fb4b | ||
|
|
ae081c147e | ||
|
|
3ce0d0bdd8 |
@@ -5,9 +5,9 @@
|
||||
<link rel="stylesheet" href="/app.css">
|
||||
|
||||
<!-- Standard headers -->
|
||||
<meta name="description" content="A ship outfitting and comparison tool for Elite Dangerous">
|
||||
<meta name="description" content="A ship builder, outfitting and comparison tool for Elite Dangerous">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="viewport" content="width = device-width, initial-scale = 1.0">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
|
||||
<link rel="manifest" href="/images/logo/manifest.json">
|
||||
<link rel="icon" sizes="152x152 192x192" type="image/png" href="/images/logo/192x192.png">
|
||||
<link rel="shortcut icon" href="/images/logo/favicon.ico">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
angular.module('app', ['ui.router', 'ct.ui.router.extras.sticky', 'ui.sortable', 'shipyard', 'ngLodash', 'app.templates'])
|
||||
.run(['$rootScope', '$location', '$window', '$document', '$state', 'commonArray', 'shipPurpose', 'shipSize', 'hardPointClass', 'GroupMap', 'Persist', 'Discounts',
|
||||
function($rootScope, $location, $window, $doc, $state, CArr, shipPurpose, sz, hpc, GroupMap, Persist, Discounts) {
|
||||
.run(['$rootScope', '$location', '$window', '$document', '$state', 'commonArray', 'shipSize', 'hardPointClass', 'GroupMap', 'Persist', 'Discounts',
|
||||
function($rootScope, $location, $window, $doc, $state, CArr, sz, hpc, GroupMap, Persist, Discounts) {
|
||||
// App is running as a standalone web app on tablet/mobile
|
||||
var isStandAlone;
|
||||
// This was causing issues on Windows phones ($window.external was causing Angular js to throw an exception). Backup is to try this and set isStandAlone to false if this fails.
|
||||
@@ -35,18 +35,22 @@ function($rootScope, $location, $window, $doc, $state, CArr, shipPurpose, sz, hp
|
||||
|
||||
// Global Reference variables
|
||||
$rootScope.CArr = CArr;
|
||||
$rootScope.SP = shipPurpose;
|
||||
$rootScope.SZ = sz;
|
||||
$rootScope.HPC = hpc;
|
||||
$rootScope.GMAP = GroupMap;
|
||||
$rootScope.insurance = { opts: [{ name: 'Standard', pct: 0.05 }, { name: 'Alpha', pct: 0.025 }, { name: 'Beta', pct: 0.035 }] };
|
||||
$rootScope.insurance = { opts: [{ name: 'Standard', pct: 0.05 }, { name: 'Alpha', pct: 0.025 }, { name: 'Beta', pct: 0.0375 }] };
|
||||
$rootScope. discounts = { opts: Discounts };
|
||||
$rootScope.STATUS = ['', 'DISABLED', 'OFF', 'ON'];
|
||||
$rootScope.STATUS_CLASS = ['', 'disabled', 'warning', 'secondary-disabled'];
|
||||
$rootScope.title = 'Coriolis';
|
||||
|
||||
$rootScope.cName = function(c) {
|
||||
return c.c ? c.c.name ? c.c.name : GroupMap[c.c.grp] : null;
|
||||
/**
|
||||
* Returns the name of the component mounted in the specified slot
|
||||
* @param {Object} slot The slot object
|
||||
* @return {String} The component name
|
||||
*/
|
||||
$rootScope.cName = function(slot) {
|
||||
return slot.c ? slot.c.name ? slot.c.name : GroupMap[slot.c.grp] : null;
|
||||
};
|
||||
|
||||
// Formatters
|
||||
|
||||
@@ -46,7 +46,7 @@ angular.module('app').config(['$provide', '$stateProvider', '$urlRouterProvider'
|
||||
// Modal States and views
|
||||
.state('modal', { abstract: true, views: { 'modal': { templateUrl: 'views/_modal.html', controller: 'ModalController' } } })
|
||||
.state('modal.about', { views: { 'modal-content': { templateUrl: 'views/modal-about.html' } } })
|
||||
.state('modal.export', { params: { title: null, data: null, promise: null }, views: { 'modal-content': { templateUrl: 'views/modal-export.html', controller: 'ExportController' } } })
|
||||
.state('modal.export', { params: { title: null, data: null, promise: null, description: null }, views: { 'modal-content': { templateUrl: 'views/modal-export.html', controller: 'ExportController' } } })
|
||||
.state('modal.import', { params: { obj: null }, views: { 'modal-content': { templateUrl: 'views/modal-import.html', controller: 'ImportController' } } })
|
||||
.state('modal.link', { params: { url: null }, views: { 'modal-content': { templateUrl: 'views/modal-link.html', controller: 'LinkController' } } })
|
||||
.state('modal.delete', { views: { 'modal-content': { templateUrl: 'views/modal-delete.html', controller: 'DeleteController' } } });
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
angular.module('app').controller('ExportController', ['$scope', '$stateParams', function($scope, $stateParams) {
|
||||
|
||||
$scope.title = $stateParams.title || 'Export';
|
||||
$scope.description = $stateParams.description;
|
||||
|
||||
if ($stateParams.promise) {
|
||||
$scope.export = 'Generating...';
|
||||
$stateParams.promise.then(function(data) {
|
||||
$scope.export = data;
|
||||
$scope.export = (typeof data === 'object') ? angular.toJson(data, true) : data;
|
||||
});
|
||||
} else {
|
||||
$scope.export = angular.toJson($stateParams.data, true);
|
||||
|
||||
@@ -1,57 +1,111 @@
|
||||
angular.module('app').controller('ImportController', ['$scope', '$stateParams', 'ShipsDB', 'Ship', 'Persist', 'Serializer', function($scope, $stateParams, Ships, Ship, Persist, Serializer) {
|
||||
angular.module('app').controller('ImportController', ['lodash', '$rootScope', '$scope', '$stateParams', 'ShipsDB', 'Ship', 'Persist', 'Serializer', function(_, $rootScope, $scope, $stateParams, Ships, Ship, Persist, Serializer) {
|
||||
$scope.jsonValid = false;
|
||||
$scope.importData = null;
|
||||
$scope.importJSON = null;
|
||||
$scope.errorMsg = null;
|
||||
$scope.canEdit = true;
|
||||
$scope.builds = $stateParams.obj || null;
|
||||
$scope.ships = Ships;
|
||||
|
||||
$scope.validateJson = function() {
|
||||
var importObj = null;
|
||||
$scope.jsonValid = false;
|
||||
$scope.errorMsg = null;
|
||||
$scope.builds = null;
|
||||
function validateBuild(shipId, code, name) {
|
||||
var shipData = Ships[shipId];
|
||||
|
||||
if (!$scope.importData) { return; }
|
||||
if (!shipData) {
|
||||
throw '"' + shipId + '" is not a valid Ship Id!';
|
||||
}
|
||||
if (typeof name != 'string' || name.length < 3) {
|
||||
throw shipData.properties.name + ' build "' + name + '" must be a string at least 3 characters long!';
|
||||
}
|
||||
if (typeof code != 'string' || code.length < 10) {
|
||||
throw shipData.properties.name + ' build "' + name + '" is not valid!';
|
||||
}
|
||||
try {
|
||||
Serializer.toShip(new Ship(shipId, shipData.properties, shipData.slots), code);
|
||||
} catch (e) {
|
||||
throw shipData.properties.name + ' build "' + name + '" is not valid!';
|
||||
}
|
||||
}
|
||||
|
||||
function detailedJsonToBuild(detailedBuild) {
|
||||
var ship;
|
||||
if (!detailedBuild.name) {
|
||||
throw 'Build Name missing!';
|
||||
}
|
||||
|
||||
try {
|
||||
importObj = angular.fromJson($scope.importData);
|
||||
ship = Serializer.fromDetailedBuild(detailedBuild);
|
||||
} catch (e) {
|
||||
throw detailedBuild.ship + ' Build "' + detailedBuild.name + '": Invalid data';
|
||||
}
|
||||
|
||||
return { shipId: ship.id, name: detailedBuild.name, code: Serializer.fromShip(ship) };
|
||||
}
|
||||
|
||||
function importBackup(importData) {
|
||||
if (importData.builds && typeof importData.builds == 'object') {
|
||||
for (var shipId in importData.builds) {
|
||||
for (var buildName in importData.builds[shipId]) {
|
||||
validateBuild(shipId, importData.builds[shipId][buildName], buildName);
|
||||
}
|
||||
}
|
||||
$scope.builds = importData.builds;
|
||||
} else {
|
||||
throw 'builds must be an object!';
|
||||
}
|
||||
if (importData.comparisons) {
|
||||
// TODO: check ship/builds exist for comparison
|
||||
$scope.comparisons = importData.comparisons;
|
||||
}
|
||||
if (importData.discounts instanceof Array && importData.discounts.length == 2) {
|
||||
$scope.discounts = importData.discounts;
|
||||
}
|
||||
if (typeof importData.insurance == 'string' && importData.insurance.length > 3) {
|
||||
$scope.insurance = importData.insurance;
|
||||
}
|
||||
}
|
||||
|
||||
function importDetailedArray(importArr) {
|
||||
var builds = {};
|
||||
for (var i = 0, l = importArr.length; i < l; i++) {
|
||||
var build = detailedJsonToBuild(importArr[i]);
|
||||
if (!builds[build.shipId]) {
|
||||
builds[build.shipId] = {};
|
||||
}
|
||||
builds[build.shipId][build.name] = build.code;
|
||||
}
|
||||
$scope.builds = builds;
|
||||
}
|
||||
|
||||
$scope.validateJson = function() {
|
||||
var importData = null;
|
||||
$scope.jsonValid = false;
|
||||
$scope.errorMsg = null;
|
||||
$scope.builds = $scope.discounts = $scope.comparisons = $scope.insurance = null;
|
||||
|
||||
if (!$scope.importJSON) { return; }
|
||||
|
||||
try {
|
||||
importData = angular.fromJson($scope.importJSON);
|
||||
} catch (e) {
|
||||
$scope.errorMsg = 'Cannot Parse JSON!';
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof importObj != 'object') {
|
||||
$scope.errorMsg = 'Must be an object!';
|
||||
if (!importData || typeof importData != 'object') {
|
||||
$scope.errorMsg = 'Must be an object or array!';
|
||||
return;
|
||||
}
|
||||
|
||||
if ((!importObj.builds || !Object.keys(importObj.builds).length)) {
|
||||
$scope.errorMsg = 'No builds in data';
|
||||
return;
|
||||
}
|
||||
|
||||
for (var shipId in importObj.builds) {
|
||||
var shipData = Ships[shipId];
|
||||
if (shipData) {
|
||||
for (var buildName in importObj.builds[shipId]) {
|
||||
if (typeof importObj.builds[shipId][buildName] != 'string') {
|
||||
$scope.errorMsg = shipData.properties.name + ' build "' + buildName + '" must be a string!';
|
||||
return;
|
||||
}
|
||||
try {
|
||||
// Actually build the ship with the code to ensure it's valid
|
||||
Serializer.toShip(new Ship(shipId, shipData.properties, shipData.slots), importObj.builds[shipId][buildName]);
|
||||
} catch (e) {
|
||||
$scope.errorMsg = shipData.properties.name + ' build "' + buildName + '" is not valid!';
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$scope.errorMsg = '"' + shipId + '"" is not a valid Ship Id!';
|
||||
return;
|
||||
try {
|
||||
if (importData instanceof Array) { // Must be detailed export json
|
||||
importDetailedArray(importData);
|
||||
} else if (importData.ship && importData.name) { // Using JSON from a single ship build export
|
||||
importDetailedArray([importData]); // Convert to array with singleobject
|
||||
} else { // Using Backup JSON
|
||||
importBackup(importData);
|
||||
}
|
||||
$scope.builds = importObj.builds;
|
||||
} catch (e) {
|
||||
$scope.errorMsg = e;
|
||||
return;
|
||||
}
|
||||
|
||||
$scope.jsonValid = true;
|
||||
@@ -61,32 +115,73 @@ angular.module('app').controller('ImportController', ['$scope', '$stateParams',
|
||||
return Persist.getBuild(shipId, name) !== null;
|
||||
};
|
||||
|
||||
$scope.hasComparison = function(name) {
|
||||
return Persist.getComparison(name) !== null;
|
||||
};
|
||||
|
||||
$scope.process = function() {
|
||||
var builds = $scope.builds;
|
||||
for (var shipId in builds) {
|
||||
for (var buildName in builds[shipId]) {
|
||||
var code = builds[shipId][buildName];
|
||||
// Update builds object such that orginal name retained, but can be renamed
|
||||
builds[shipId][buildName] = {
|
||||
code: code,
|
||||
useName: buildName
|
||||
};
|
||||
if ($scope.builds) {
|
||||
var builds = $scope.builds;
|
||||
for (var shipId in builds) {
|
||||
for (var buildName in builds[shipId]) {
|
||||
var code = builds[shipId][buildName];
|
||||
// Update builds object such that orginal name retained, but can be renamed
|
||||
builds[shipId][buildName] = {
|
||||
code: code,
|
||||
useName: buildName
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($scope.comparisons) {
|
||||
var comparisons = $scope.comparisons;
|
||||
for (var name in comparisons) {
|
||||
comparisons[name].useName = name;
|
||||
}
|
||||
}
|
||||
|
||||
$scope.processed = true;
|
||||
};
|
||||
|
||||
$scope.import = function() {
|
||||
var builds = $scope.builds;
|
||||
for (var shipId in builds) {
|
||||
for (var buildName in builds[shipId]) {
|
||||
var build = builds[shipId][buildName];
|
||||
var name = build.useName.trim();
|
||||
if (name) {
|
||||
Persist.saveBuild(shipId, name, build.code);
|
||||
|
||||
if ($scope.builds) {
|
||||
var builds = $scope.builds;
|
||||
for (var shipId in builds) {
|
||||
for (var buildName in builds[shipId]) {
|
||||
var build = builds[shipId][buildName];
|
||||
var name = build.useName.trim();
|
||||
if (name) {
|
||||
Persist.saveBuild(shipId, name, build.code);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($scope.comparisons) {
|
||||
var comparisons = $scope.comparisons;
|
||||
for (var comp in comparisons) {
|
||||
var comparison = comparisons[comp];
|
||||
var useName = comparison.useName.trim();
|
||||
if (useName) {
|
||||
Persist.saveComparison(useName, comparison.builds, comparison.facets);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($scope.discounts) {
|
||||
$rootScope.discounts.ship = $scope.discounts[0];
|
||||
$rootScope.discounts.components = $scope.discounts[1];
|
||||
$rootScope.$broadcast('discountChange');
|
||||
Persist.setDiscount($scope.discounts);
|
||||
}
|
||||
|
||||
if ($scope.insurance) {
|
||||
$rootScope.insurance.current = $scope.insurance;
|
||||
Persist.setInsurance($scope.insurance);
|
||||
}
|
||||
|
||||
$scope.$parent.dismiss();
|
||||
};
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
angular.module('app').controller('OutfitController', ['$window', '$rootScope', '$scope', '$state', '$stateParams', 'ShipsDB', 'Ship', 'Components', 'Serializer', 'Persist', 'calcTotalRange', 'calcSpeed', function($window, $rootScope, $scope, $state, $p, Ships, Ship, Components, Serializer, Persist, calcTotalRange, calcSpeed) {
|
||||
var win = angular.element($window); // Angularized window object for event triggering
|
||||
var data = Ships[$p.shipId]; // Retrieve the basic ship properties, slots and defaults
|
||||
var ship = new Ship($p.shipId, data.properties, data.slots); // Create a new Ship instance
|
||||
var win = angular.element($window); // Angularized window object for event triggering
|
||||
var retrofitShip = new Ship($p.shipId, data.properties, data.slots); // Create a new Ship for retrofit comparison
|
||||
|
||||
// Update the ship instance with the code (if provided) or the 'factory' defaults.
|
||||
if ($p.code) {
|
||||
@@ -11,8 +12,6 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
|
||||
ship.buildWith(data.defaults); // Populate with default components
|
||||
}
|
||||
|
||||
ship.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
|
||||
|
||||
$scope.buildName = $p.bn;
|
||||
$rootScope.title = ship.name + ($scope.buildName ? ' - ' + $scope.buildName : '');
|
||||
$scope.ship = ship;
|
||||
@@ -32,11 +31,27 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
|
||||
$scope.selectedSlot = null;
|
||||
$scope.savedCode = Persist.getBuild(ship.id, $scope.buildName);
|
||||
$scope.canSave = Persist.isEnabled();
|
||||
$scope.allBuilds = Persist.builds;
|
||||
$scope.fuel = 0;
|
||||
$scope.pwrDesc = false;
|
||||
$scope.pwrPredicate = 'type';
|
||||
$scope.retroDesc = false;
|
||||
$scope.retroPredicate = 'netCost';
|
||||
$scope.costDesc = true;
|
||||
$scope.costPredicate = 'c.cost';
|
||||
$scope.costTab = Persist.getCostTab() || 'costs';
|
||||
|
||||
if ($scope.savedCode) {
|
||||
Serializer.toShip(retrofitShip, $scope.savedCode); // Populate components from last save
|
||||
$scope.retrofitBuild = $scope.buildName;
|
||||
} else {
|
||||
retrofitShip.buildWith(data.defaults);
|
||||
$scope.retrofitBuild = null;
|
||||
}
|
||||
|
||||
ship.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
|
||||
retrofitShip.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
|
||||
updateRetrofitCosts();
|
||||
|
||||
$scope.jrSeries = {
|
||||
xMin: 0,
|
||||
@@ -189,10 +204,28 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
|
||||
if ($scope.code != $scope.savedCode) {
|
||||
Persist.saveBuild(ship.id, $scope.buildName, $scope.code);
|
||||
$scope.savedCode = $scope.code;
|
||||
if ($scope.retrofitBuild === $scope.buildName) {
|
||||
Serializer.toShip(retrofitShip, $scope.code);
|
||||
}
|
||||
updateState($scope.code);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Export the build to detailed JSON
|
||||
*/
|
||||
$scope.exportBuild = function(e) {
|
||||
e.stopPropagation();
|
||||
|
||||
if ($scope.buildName) {
|
||||
$state.go('modal.export', {
|
||||
title: $scope.buildName + ' Export',
|
||||
description: 'A detailed JSON export of your build for use in other sites and tools',
|
||||
data: Serializer.toDetailedBuild($scope.buildName, ship, $scope.code || Serializer.fromShip(ship))
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Permanently delete the current build and redirect/reload this controller
|
||||
* with the 'factory' build of the current ship.
|
||||
@@ -232,6 +265,11 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
|
||||
$scope.pwrPredicate = key;
|
||||
};
|
||||
|
||||
$scope.sortRetrofit = function(key) {
|
||||
$scope.retroDesc = $scope.retroPredicate == key ? !$scope.retroDesc : $scope.retroDesc;
|
||||
$scope.retroPredicate = key;
|
||||
};
|
||||
|
||||
/**
|
||||
* Toggle the power on/off for the selected component
|
||||
* @param {object} item The component being toggled
|
||||
@@ -266,6 +304,15 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
|
||||
return ship.getSlotStatus(slot, true);
|
||||
};
|
||||
|
||||
$scope.setRetrofitBase = function() {
|
||||
if ($scope.retrofitBuild) {
|
||||
Serializer.toShip(retrofitShip, Persist.getBuild(ship.id, $scope.retrofitBuild));
|
||||
} else {
|
||||
retrofitShip.buildWith(data.defaults);
|
||||
}
|
||||
updateRetrofitCosts();
|
||||
};
|
||||
|
||||
// Utilify functions
|
||||
|
||||
function updateState(code) {
|
||||
@@ -274,17 +321,70 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
|
||||
$scope.speedSeries.xMax = $scope.trSeries.xMax = $scope.jrSeries.xMax = ship.cargoCapacity;
|
||||
$scope.jrSeries.yMax = ship.unladenRange;
|
||||
$scope.trSeries.yMax = ship.unladenTotalRange;
|
||||
updateRetrofitCosts();
|
||||
win.triggerHandler('pwrchange');
|
||||
}
|
||||
|
||||
function updateRetrofitCosts() {
|
||||
var costs = $scope.retrofitList = [];
|
||||
var cName = $rootScope.cName;
|
||||
var total = 0, i, l, item;
|
||||
|
||||
if (ship.bulkheads.id != retrofitShip.bulkheads.id) {
|
||||
item = {
|
||||
buyClassRating: ship.bulkheads.c.class + ship.bulkheads.c.rating,
|
||||
buyName: cName(ship.bulkheads),
|
||||
sellClassRating: retrofitShip.bulkheads.c.class + retrofitShip.bulkheads.c.rating,
|
||||
sellName: cName(retrofitShip.bulkheads),
|
||||
netCost: ship.bulkheads.discountedCost - retrofitShip.bulkheads.discountedCost
|
||||
};
|
||||
costs.push(item);
|
||||
total += item.netCost;
|
||||
}
|
||||
|
||||
for (var g in { common: 1, internal: 1, hardpoints: 1 }) {
|
||||
var retroSlotGroup = retrofitShip[g];
|
||||
var slotGroup = ship[g];
|
||||
for (i = 0, l = slotGroup.length; i < l; i++) {
|
||||
if (slotGroup[i].id != retroSlotGroup[i].id) {
|
||||
item = { netCost: 0 };
|
||||
if (slotGroup[i].id) {
|
||||
item.buyName = cName(slotGroup[i]);
|
||||
item.buyClassRating = slotGroup[i].c.class + slotGroup[i].c.rating;
|
||||
item.netCost = slotGroup[i].discountedCost;
|
||||
}
|
||||
if (retroSlotGroup[i].id) {
|
||||
item.sellName = cName(retroSlotGroup[i]);
|
||||
item.sellClassRating = retroSlotGroup[i].c.class + retroSlotGroup[i].c.rating;
|
||||
item.netCost -= retroSlotGroup[i].discountedCost;
|
||||
}
|
||||
costs.push(item);
|
||||
total += item.netCost;
|
||||
}
|
||||
}
|
||||
}
|
||||
$scope.retrofitTotal = total;
|
||||
}
|
||||
|
||||
$scope.updateCostTab = function(tab) {
|
||||
Persist.setCostTab(tab);
|
||||
$scope.costTab = tab;
|
||||
};
|
||||
|
||||
$scope.pdWarning = function(pd) {
|
||||
return pd.enginecapacity < ship.boostEnergy;
|
||||
};
|
||||
|
||||
// Hide any open menu/slot/etc if the background is clicked
|
||||
$scope.$on('close', function() {
|
||||
$scope.selectedSlot = null;
|
||||
});
|
||||
|
||||
// Hide any open menu/slot/etc if the background is clicked
|
||||
// Hide any open menu/slot/etc if the background is clicked
|
||||
$scope.$on('discountChange', function() {
|
||||
ship.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
|
||||
retrofitShip.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
|
||||
updateRetrofitCosts();
|
||||
});
|
||||
|
||||
}]);
|
||||
|
||||
@@ -2,13 +2,13 @@ angular.module('app').directive('componentSelect', function() {
|
||||
|
||||
// Generting the HTML in this manner is MUCH faster than using an angular template.
|
||||
|
||||
function appendGroup(list, opts, cid, mass) {
|
||||
function appendGroup(list, opts, cid, mass, checkWarning) {
|
||||
var prevClass = null, prevRating = null;
|
||||
for (var i = 0; i < opts.length; i++) {
|
||||
var o = opts[i];
|
||||
var id = o.id || (o.class + o.rating); // Common components' ID is their class and rating
|
||||
|
||||
if (i > 0 && opts.length > 3 && o.class != prevClass && (!o.grp || o.rating != prevRating || o.mode)) {
|
||||
if (i > 0 && opts.length > 4 && o.class != prevClass && (o.rating != prevRating || o.mode)) {
|
||||
list.push('<br/>');
|
||||
}
|
||||
|
||||
@@ -18,13 +18,17 @@ angular.module('app').directive('componentSelect', function() {
|
||||
list.push(' active');
|
||||
}
|
||||
|
||||
if (checkWarning && checkWarning(opts[i])) {
|
||||
list.push(' warning');
|
||||
}
|
||||
|
||||
list.push((o.maxmass && mass > o.maxmass) ? ' disabled"' : '" cpid="', id, '">');
|
||||
|
||||
if (o.mode) {
|
||||
list.push('<svg cpid="', id, '" class="icon lg"><use xlink:href="#mount-', o.mode, '"></use></svg> ');
|
||||
list.push('<svg cpid="', id, '" class="icon lg"><use cpid="', id, '" xlink:href="#mount-', o.mode, '"></use></svg> ');
|
||||
}
|
||||
|
||||
list.push(o.class, o.rating);
|
||||
list.push('<span cpid="', id, '">', o.class, o.rating);
|
||||
|
||||
if (o.missile) {
|
||||
list.push('/' + o.missile);
|
||||
@@ -35,7 +39,7 @@ angular.module('app').directive('componentSelect', function() {
|
||||
list.push(' ' + o.name);
|
||||
}
|
||||
|
||||
list.push('</li>');
|
||||
list.push('</span></li>');
|
||||
prevClass = o.class;
|
||||
prevRating = o.rating;
|
||||
}
|
||||
@@ -47,7 +51,8 @@ angular.module('app').directive('componentSelect', function() {
|
||||
opts: '=', // Component Options object
|
||||
groups: '=', // Groups of Component Options
|
||||
mass: '=', // Current ship unladen mass
|
||||
s: '=' // Current Slot
|
||||
s: '=', // Current Slot
|
||||
warning: '=' // Check warning function
|
||||
},
|
||||
link: function(scope, element) {
|
||||
var list = [];
|
||||
@@ -64,12 +69,12 @@ angular.module('app').directive('componentSelect', function() {
|
||||
var grp = groups[g];
|
||||
var grpCode = grp[Object.keys(grp)[0]].grp; // Nasty operation to get the grp property of the first/any single component
|
||||
list.push('<div id="', grpCode, '" class="select-group">', g, '</div><ul>');
|
||||
appendGroup(list, grp, cid, mass);
|
||||
appendGroup(list, grp, cid, mass, scope.warning);
|
||||
list.push('</ul>');
|
||||
}
|
||||
} else {
|
||||
list.push('<ul>');
|
||||
appendGroup(list, opts, cid, mass);
|
||||
appendGroup(list, opts, cid, mass, scope.warning);
|
||||
list.push('</ul>');
|
||||
}
|
||||
|
||||
|
||||
@@ -3,10 +3,12 @@ angular.module('app').directive('contextMenu', ['$parse', function($parse) {
|
||||
var fn = $parse(attrs.contextMenu);
|
||||
|
||||
element.bind('contextmenu', function(e) {
|
||||
scope.$apply(function() {
|
||||
e.preventDefault();
|
||||
fn(scope, { $event: e });
|
||||
});
|
||||
if (!e.shiftKey) {
|
||||
scope.$apply(function() {
|
||||
e.preventDefault();
|
||||
fn(scope, { $event: e });
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
}]);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', 'Persist', 'ShipsDB', function(_, $rootScope, Persist, ships) {
|
||||
angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', '$state', 'Persist', 'Serializer', 'ShipsDB', function(_, $rootScope, $state, Persist, Serializer, ships) {
|
||||
|
||||
return {
|
||||
restrict: 'E',
|
||||
@@ -18,17 +18,6 @@ angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', 'Pers
|
||||
$rootScope.discounts.ship = savedDiscounts[0];
|
||||
$rootScope.discounts.components = savedDiscounts[1];
|
||||
|
||||
// Close menus if a navigation change event occurs
|
||||
$rootScope.$on('$stateChangeStart', function() {
|
||||
scope.openedMenu = null;
|
||||
});
|
||||
|
||||
// Listen to close event to close opened menus or modals
|
||||
$rootScope.$on('close', function() {
|
||||
scope.openedMenu = null;
|
||||
$rootScope.showAbout = false;
|
||||
});
|
||||
|
||||
/**
|
||||
* Save selected insurance option
|
||||
*/
|
||||
@@ -44,6 +33,28 @@ angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', 'Pers
|
||||
$rootScope.$broadcast('discountChange');
|
||||
};
|
||||
|
||||
scope.backup = function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
scope.openedMenu = null;
|
||||
$state.go('modal.export', {
|
||||
title: 'Backup',
|
||||
data: Persist.getAll(),
|
||||
description: 'Backup of all Coriolis data to save or transfer to another browser/device'
|
||||
});
|
||||
};
|
||||
|
||||
scope.detailedExport = function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
scope.openedMenu = null;
|
||||
$state.go('modal.export', {
|
||||
title: 'Detailed Export',
|
||||
data: Serializer.toDetailedExport(scope.allBuilds),
|
||||
description: 'Detailed export of all builds for use with other tools and sites'
|
||||
});
|
||||
};
|
||||
|
||||
scope.openMenu = function(e, menu) {
|
||||
e.stopPropagation();
|
||||
if (menu == scope.openedMenu) {
|
||||
@@ -58,16 +69,15 @@ angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', 'Pers
|
||||
scope.openedMenu = menu;
|
||||
};
|
||||
|
||||
scope.about = function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
// Close menus if a navigation change event occurs
|
||||
$rootScope.$on('$stateChangeStart', function() {
|
||||
scope.openedMenu = null;
|
||||
$rootScope.showAbout = true;
|
||||
};
|
||||
});
|
||||
|
||||
$rootScope.hideAbout = function() {
|
||||
$rootScope.showAbout = false;
|
||||
};
|
||||
// Listen to close event to close opened menus or modals
|
||||
$rootScope.$on('close', function() {
|
||||
scope.openedMenu = null;
|
||||
});
|
||||
|
||||
scope.$watchCollection('allBuilds', function() {
|
||||
scope.buildsList = Object.keys(scope.allBuilds).sort();
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
angular.module('app').service('Persist', ['$window', 'lodash', function($window, _) {
|
||||
var LS_KEY_BUILDS = 'builds';
|
||||
var LS_KEY_COMPARISONS = 'comparisons';
|
||||
var LS_KEY_COST_TAB = 'costTab';
|
||||
var LS_KEY_INSURANCE = 'insurance';
|
||||
var LS_KEY_DISCOUNTS = 'discounts';
|
||||
var localStorage = $window.localStorage;
|
||||
var buildJson = null;
|
||||
var comparisonJson = null;
|
||||
@@ -117,7 +120,7 @@ angular.module('app').service('Persist', ['$window', 'lodash', function($window,
|
||||
}
|
||||
this.comparisons[name] = {
|
||||
facets: facets,
|
||||
builds: _.map(builds, function(b) { return { shipId: b.id, buildName: b.buildName }; })
|
||||
builds: _.map(builds, function(b) { return { shipId: b.id || b.shipId, buildName: b.buildName }; })
|
||||
};
|
||||
localStorage.setItem(LS_KEY_COMPARISONS, angular.toJson(this.comparisons));
|
||||
this.state.hasComparisons = true;
|
||||
@@ -162,13 +165,23 @@ angular.module('app').service('Persist', ['$window', 'lodash', function($window,
|
||||
}
|
||||
};
|
||||
|
||||
this.getAll = function() {
|
||||
var data = {};
|
||||
data[LS_KEY_BUILDS] = this.builds;
|
||||
data[LS_KEY_COMPARISONS] = this.comparisons;
|
||||
data[LS_KEY_INSURANCE] = this.getInsurance();
|
||||
data[LS_KEY_DISCOUNTS] = this.getDiscount();
|
||||
|
||||
return data;
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the saved insurance type
|
||||
* @return {string} The name of the saved insurance type of null
|
||||
*/
|
||||
this.getInsurance = function() {
|
||||
if (this.lsEnabled) {
|
||||
return localStorage.getItem('insurance');
|
||||
return localStorage.getItem(LS_KEY_INSURANCE);
|
||||
}
|
||||
return null;
|
||||
};
|
||||
@@ -179,7 +192,7 @@ angular.module('app').service('Persist', ['$window', 'lodash', function($window,
|
||||
*/
|
||||
this.setInsurance = function(name) {
|
||||
if (this.lsEnabled) {
|
||||
return localStorage.setItem('insurance', name);
|
||||
return localStorage.setItem(LS_KEY_INSURANCE, name);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -189,7 +202,7 @@ angular.module('app').service('Persist', ['$window', 'lodash', function($window,
|
||||
*/
|
||||
this.setDiscount = function(val) {
|
||||
if (this.lsEnabled) {
|
||||
return localStorage.setItem('discounts', angular.toJson(val));
|
||||
return localStorage.setItem(LS_KEY_DISCOUNTS, angular.toJson(val));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -199,7 +212,28 @@ angular.module('app').service('Persist', ['$window', 'lodash', function($window,
|
||||
*/
|
||||
this.getDiscount = function() {
|
||||
if (this.lsEnabled) {
|
||||
return angular.fromJson(localStorage.getItem('discounts'));
|
||||
return angular.fromJson(localStorage.getItem(LS_KEY_DISCOUNTS));
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Persist selected cost tab
|
||||
* @param {number} val Discount value/amount
|
||||
*/
|
||||
this.setCostTab = function(tabName) {
|
||||
if (this.lsEnabled) {
|
||||
return localStorage.setItem(LS_KEY_COST_TAB, tabName);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the saved discount
|
||||
* @return {number} val Discount value/amount
|
||||
*/
|
||||
this.getCostTab = function() {
|
||||
if (this.lsEnabled) {
|
||||
return localStorage.getItem(LS_KEY_COST_TAB);
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Service managing seralization and deserialization of models for use in URLs and persistene.
|
||||
*/
|
||||
angular.module('app').service('Serializer', ['lodash', function(_) {
|
||||
angular.module('app').service('Serializer', ['lodash', 'GroupMap', 'MountMap', 'ShipsDB', 'Ship', 'Components', '$state', function(_, GroupMap, MountMap, ShipsDB, Ship, Components, $state) {
|
||||
|
||||
/**
|
||||
* Serializes the ships selected components for all slots to a URL friendly string.
|
||||
@@ -32,8 +32,8 @@ angular.module('app').service('Serializer', ['lodash', function(_) {
|
||||
* Updates an existing ship instance's slots with components determined by the
|
||||
* code.
|
||||
*
|
||||
* @param {Ship} ship The ship instance to be updated
|
||||
* @param {string} code The string to deserialize
|
||||
* @param {Ship} ship The ship instance to be updated
|
||||
* @param {string} dataString The string to deserialize
|
||||
*/
|
||||
this.toShip = function(ship, dataString) {
|
||||
var common = new Array(ship.common.length),
|
||||
@@ -54,10 +54,6 @@ angular.module('app').service('Serializer', ['lodash', function(_) {
|
||||
|
||||
decodeToArray(code, internal, decodeToArray(code, hardpoints, decodeToArray(code, common, 1)));
|
||||
|
||||
// get the remaining substring / split into parts for
|
||||
// - priorities
|
||||
// - enabled/disabled
|
||||
|
||||
ship.buildWith(
|
||||
{
|
||||
bulkheads: code.charAt(0) * 1,
|
||||
@@ -70,6 +66,103 @@ angular.module('app').service('Serializer', ['lodash', function(_) {
|
||||
);
|
||||
};
|
||||
|
||||
this.toDetailedBuild = function(buildName, ship, code) {
|
||||
var standard = ship.common,
|
||||
hardpoints = ship.hardpoints,
|
||||
internal = ship.internal;
|
||||
|
||||
var data = {
|
||||
$schema: 'http://cdn.coriolis.io/schemas/ship-loadout/1.json#',
|
||||
name: buildName,
|
||||
ship: ship.name,
|
||||
references: [{
|
||||
name: 'Coriolis.io',
|
||||
url: $state.href('outfit', { shipId: ship.id, code: code, bn: buildName }, { absolute: true }),
|
||||
code: code,
|
||||
shipId: ship.id
|
||||
}],
|
||||
components: {
|
||||
standard: {
|
||||
bulkheads: ship.bulkheads.c.name,
|
||||
powerPlant: { class: standard[0].c.class, rating: standard[0].c.rating },
|
||||
thrusters: { class: standard[1].c.class, rating: standard[1].c.rating },
|
||||
frameShiftDrive: { class: standard[2].c.class, rating: standard[2].c.rating },
|
||||
lifeSupport: { class: standard[3].c.class, rating: standard[3].c.rating },
|
||||
powerDistributor: { class: standard[4].c.class, rating: standard[4].c.rating },
|
||||
sensors: { class: standard[5].c.class, rating: standard[5].c.rating },
|
||||
fuelTank: { class: standard[6].c.class, rating: standard[6].c.rating }
|
||||
},
|
||||
hardpoints: _.map(_.filter(hardpoints, function(slot) { return slot.maxClass > 0; }), slotToSchema),
|
||||
utility: _.map(_.filter(hardpoints, function(slot) { return slot.maxClass === 0; }), slotToSchema),
|
||||
internal: _.map(internal, slotToSchema)
|
||||
},
|
||||
stats: {}
|
||||
};
|
||||
|
||||
for (var stat in ship) {
|
||||
if (!isNaN(ship[stat])) {
|
||||
data.stats[stat] = Math.round(ship[stat] * 100) / 100;
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
};
|
||||
|
||||
this.fromDetailedBuild = function(detailedBuild) {
|
||||
var shipId = _.findKey(ShipsDB, { properties: { name: detailedBuild.ship } });
|
||||
|
||||
if (!shipId) {
|
||||
throw 'No such ship: ' + detailedBuild.ship;
|
||||
}
|
||||
|
||||
var comps = detailedBuild.components;
|
||||
var shipData = ShipsDB[shipId];
|
||||
var ship = new Ship(shipId, shipData.properties, shipData.slots);
|
||||
var bulkheads = Components.bulkheadIndex(comps.standard.bulkheads);
|
||||
|
||||
if (bulkheads < 0) {
|
||||
throw 'Invalid bulkheads: ' + comps.standard.bulkheads;
|
||||
}
|
||||
|
||||
var common = _.map(
|
||||
['powerPlant', 'thrusters', 'frameShiftDrive', 'lifeSupport', 'powerDistributor', 'sensors', 'fuelTank'],
|
||||
function(c) {
|
||||
if (!comps.standard[c].class || !comps.standard[c].rating) {
|
||||
throw 'Invalid value for ' + c;
|
||||
}
|
||||
return comps.standard[c].class + comps.standard[c].rating;
|
||||
}
|
||||
);
|
||||
|
||||
var internal = _.map(comps.internal, function(c) { return c ? Components.findInternalId(c.group, c.class, c.rating, c.name) : 0; });
|
||||
|
||||
var hardpoints = _.map(comps.hardpoints, function(c) {
|
||||
return c ? Components.findHardpointId(c.group, c.class, c.rating, c.name, MountMap[c.mount], c.missile) : 0;
|
||||
});
|
||||
hardpoints = hardpoints.concat(_.map(comps.utility, function(c) {
|
||||
return c ? Components.findHardpointId(c.group, c.class, c.rating, c.name, MountMap[c.mount]) : 0;
|
||||
}));
|
||||
|
||||
ship.buildWith({ bulkheads: bulkheads, common: common, hardpoints: hardpoints, internal: internal });
|
||||
|
||||
return ship;
|
||||
};
|
||||
|
||||
this.toDetailedExport = function(builds) {
|
||||
var data = [];
|
||||
|
||||
for (var shipId in builds) {
|
||||
for (var buildName in builds[shipId]) {
|
||||
var code = builds[shipId][buildName];
|
||||
var shipData = ShipsDB[shipId];
|
||||
var ship = new Ship(shipId, shipData.properties, shipData.slots);
|
||||
this.toShip(ship, code);
|
||||
data.push(this.toDetailedBuild(buildName, ship, code));
|
||||
}
|
||||
}
|
||||
return data;
|
||||
};
|
||||
|
||||
this.fromComparison = function(name, builds, facets, predicate, desc) {
|
||||
var shipBuilds = [];
|
||||
|
||||
@@ -118,4 +211,22 @@ angular.module('app').service('Serializer', ['lodash', function(_) {
|
||||
return codePos;
|
||||
}
|
||||
|
||||
function slotToSchema(slot) {
|
||||
if (slot.c) {
|
||||
var o = { class: slot.c.class, rating: slot.c.rating, group: GroupMap[slot.c.grp] };
|
||||
if (slot.c.name) {
|
||||
o.name = slot.c.name;
|
||||
}
|
||||
if (slot.c.mode) {
|
||||
o.mount = MountMap[slot.c.mode];
|
||||
}
|
||||
if (slot.c.missile) {
|
||||
o.missile = slot.c.missile;
|
||||
}
|
||||
return o;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
}]);
|
||||
|
||||
@@ -14,26 +14,27 @@ angular.module('shipyard').factory('ComponentSet', ['lodash', function(_) {
|
||||
this.hpClass = {};
|
||||
this.intClass = {};
|
||||
|
||||
for (var i = 0; i < components.common.length; i++) {
|
||||
var max = maxCommonArr[i];
|
||||
switch (i) {
|
||||
// Slots where component class must be equal to slot class
|
||||
case 3: // Life Support
|
||||
case 5: // Sensors
|
||||
this.common[i] = filter(components.common[i], max, max, this.mass);
|
||||
break;
|
||||
// Other slots can have a component of class lower than the slot class
|
||||
default:
|
||||
this.common[i] = filter(components.common[i], max, 0, this.mass);
|
||||
}
|
||||
}
|
||||
this.common[0] = filter(components.common[0], maxCommonArr[0], 0, mass); // Power Plant
|
||||
this.common[2] = filter(components.common[2], maxCommonArr[2], 0, mass); // FSD
|
||||
this.common[4] = filter(components.common[4], maxCommonArr[4], 0, mass); // Power Distributor
|
||||
this.common[6] = filter(components.common[6], maxCommonArr[6], 0, mass); // Fuel Tank
|
||||
|
||||
// Thrusters, filter components by class only (to show full list of ratings for that class)
|
||||
var minThrusterClass = _.reduce(components.common[1], function(minClass, thruster) {
|
||||
return (thruster.maxmass >= mass && thruster.class < minClass) ? thruster.class : minClass;
|
||||
}, maxCommonArr[1]);
|
||||
this.common[1] = filter(components.common[1], maxCommonArr[1], minThrusterClass, 0); // Thrusters
|
||||
|
||||
// Slots where component class must be equal to slot class
|
||||
this.common[3] = filter(components.common[3], maxCommonArr[3], maxCommonArr[3], 0); // Life Supprt
|
||||
this.common[5] = filter(components.common[5], maxCommonArr[5], maxCommonArr[5], mass); // Sensors
|
||||
|
||||
for (var h in components.hardpoints) {
|
||||
this.hardpoints[h] = filter(components.hardpoints[h], maxHardPoint, 0, this.mass);
|
||||
this.hardpoints[h] = filter(components.hardpoints[h], maxHardPoint, 0, mass);
|
||||
}
|
||||
|
||||
for (var g in components.internal) {
|
||||
this.internal[g] = filter(components.internal[g], maxInternal, 0, this.mass);
|
||||
this.internal[g] = filter(components.internal[g], maxInternal, 0, mass);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength', 'calcJumpRange', 'calcTotalRange', 'lodash', function(Components, calcShieldStrength, calcJumpRange, calcTotalRange, _) {
|
||||
angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength', 'calcJumpRange', 'calcTotalRange', 'lodash', 'ArmourMultiplier', function(Components, calcShieldStrength, calcJumpRange, calcTotalRange, _, ArmourMultiplier) {
|
||||
|
||||
/**
|
||||
* Returns the power usage type of a slot and it's particular component
|
||||
@@ -40,7 +40,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
|
||||
}
|
||||
}
|
||||
// Make a Ship 'slot'/item similar to other slots
|
||||
this.c = { incCost: true, type: 'SHIP', discountedCost: this.cost, c: { name: this.name, cost: this.cost } };
|
||||
this.c = { incCost: true, type: 'SHIP', discountedCost: this.hullCost, c: { name: this.name, cost: this.hullCost } };
|
||||
|
||||
this.costList = _.union(this.internal, this.common, this.hardpoints);
|
||||
this.costList.push(this.bulkheads); // Add The bulkheads
|
||||
@@ -55,8 +55,8 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
|
||||
this.powerList.unshift(this.common[2]); // Add FSD
|
||||
this.powerList.unshift(this.common[0]); // Add Power Plant
|
||||
|
||||
this.shipDiscount = 1;
|
||||
this.componentDiscount = 1;
|
||||
this.shipCostMultiplier = 1;
|
||||
this.componentCostMultiplier = 1;
|
||||
|
||||
this.priorityBands = [
|
||||
{ deployed: 0, retracted: 0, retOnly: 0 },
|
||||
@@ -84,10 +84,10 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
|
||||
this.cargoCapacity = 0;
|
||||
this.ladenMass = 0;
|
||||
this.armourAdded = 0;
|
||||
this.armourMultiplier = 1;
|
||||
this.shieldMultiplier = 1;
|
||||
this.totalCost = this.c.incCost ? this.c.discountedCost : 0;
|
||||
this.unladenMass = this.mass;
|
||||
this.armourTotal = this.armour;
|
||||
this.unladenMass = this.hullMass;
|
||||
this.totalDps = 0;
|
||||
|
||||
this.bulkheads.c = null;
|
||||
@@ -157,7 +157,8 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
|
||||
var oldBulkhead = this.bulkheads.c;
|
||||
this.bulkheads.id = index;
|
||||
this.bulkheads.c = Components.bulkheads(this.id, index);
|
||||
this.bulkheads.discountedCost = this.bulkheads.c.cost * this.componentDiscount;
|
||||
this.bulkheads.discountedCost = this.bulkheads.c.cost * this.componentCostMultiplier;
|
||||
this.armourMultiplier = ArmourMultiplier[index];
|
||||
this.updateStats(this.bulkheads, this.bulkheads.c, oldBulkhead, preventUpdate);
|
||||
};
|
||||
|
||||
@@ -173,7 +174,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
|
||||
Ship.prototype.use = function(slot, id, component, preventUpdate) {
|
||||
if (slot.id != id) { // Selecting a different component
|
||||
// Slot is an internal slot, is not being emptied, and the selected component group/type must be of unique
|
||||
if (slot.cat == 2 && component && _.includes(['sg', 'rf', 'fs'], component.grp)) {
|
||||
if (slot.cat == 2 && component && _.includes(['psg', 'sg', 'rf', 'fs'], component.grp)) {
|
||||
// Find another internal slot that already has this type/group installed
|
||||
var similarSlot = this.findInternalByGroup(component.grp);
|
||||
// If another slot has an installed component with of the same type
|
||||
@@ -186,7 +187,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
|
||||
var oldComponent = slot.c;
|
||||
slot.id = id;
|
||||
slot.c = component;
|
||||
slot.discountedCost = (component && component.cost) ? component.cost * this.componentDiscount : 0;
|
||||
slot.discountedCost = (component && component.cost) ? component.cost * this.componentCostMultiplier : 0;
|
||||
this.updateStats(slot, component, oldComponent, preventUpdate);
|
||||
}
|
||||
};
|
||||
@@ -210,9 +211,17 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
|
||||
* @return {number} The index of the slot in ship.internal
|
||||
*/
|
||||
Ship.prototype.findInternalByGroup = function(group) {
|
||||
var index = _.findIndex(this.internal, function(slot) {
|
||||
return slot.c && slot.c.grp == group;
|
||||
});
|
||||
var index;
|
||||
if (group == 'sg' || group == 'psg') {
|
||||
index = _.findIndex(this.internal, function(slot) {
|
||||
return slot.c && (slot.c.grp == 'sg' || slot.c.grp == 'psg');
|
||||
});
|
||||
} else {
|
||||
index = _.findIndex(this.internal, function(slot) {
|
||||
return slot.c && slot.c.grp == group;
|
||||
});
|
||||
}
|
||||
|
||||
if (index !== -1) {
|
||||
return this.internal[index];
|
||||
}
|
||||
@@ -254,7 +263,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
|
||||
if (slot.c) {
|
||||
this.priorityBands[slot.priority][powerUsageType(slot, slot.c)] += enabled ? slot.c.power : -slot.c.power;
|
||||
|
||||
if (slot.c.grp == 'sg') {
|
||||
if (slot.c.grp == 'sg' || slot.c.grp == 'psg') {
|
||||
this.updateShieldStrength();
|
||||
} else if (slot.c.grp == 'sb') {
|
||||
this.shieldMultiplier += slot.c.shieldmul * (enabled ? 1 : -1);
|
||||
@@ -305,7 +314,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
|
||||
}
|
||||
|
||||
if (slot.incCost && old.cost) {
|
||||
this.totalCost -= old.cost * this.componentDiscount;
|
||||
this.totalCost -= old.cost * this.componentCostMultiplier;
|
||||
}
|
||||
|
||||
if (old.power && slot.enabled) {
|
||||
@@ -327,9 +336,6 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
|
||||
case 'cr':
|
||||
this.cargoCapacity += n.capacity;
|
||||
break;
|
||||
case 't':
|
||||
this.maxMass = n.maxmass;
|
||||
break;
|
||||
case 'hr':
|
||||
this.armourAdded += n.armouradd;
|
||||
break;
|
||||
@@ -339,7 +345,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
|
||||
}
|
||||
|
||||
if (slot.incCost && n.cost) {
|
||||
this.totalCost += n.cost * this.componentDiscount;
|
||||
this.totalCost += n.cost * this.componentCostMultiplier;
|
||||
}
|
||||
|
||||
if (n.power && slot.enabled) {
|
||||
@@ -354,7 +360,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
|
||||
}
|
||||
|
||||
this.ladenMass = this.unladenMass + this.cargoCapacity + this.fuelCapacity;
|
||||
this.armourTotal = this.armourAdded + this.armour;
|
||||
this.armour = this.armourAdded + Math.round(this.baseArmour * this.armourMultiplier);
|
||||
|
||||
if (!preventUpdate) {
|
||||
if (powerChange) {
|
||||
@@ -382,7 +388,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
|
||||
|
||||
Ship.prototype.updateShieldStrength = function() {
|
||||
var sgSlot = this.findInternalByGroup('sg'); // Find Shield Generator slot Index if any
|
||||
this.shieldStrength = sgSlot && sgSlot.enabled ? calcShieldStrength(this.mass, this.shields, sgSlot.c, this.shieldMultiplier) : 0;
|
||||
this.shieldStrength = sgSlot && sgSlot.enabled ? calcShieldStrength(this.hullMass, this.baseShieldStrength, sgSlot.c, this.shieldMultiplier) : 0;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -400,24 +406,24 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
|
||||
|
||||
/**
|
||||
* Recalculate all item costs and total based on discounts.
|
||||
* @param {number} shipDiscount Ship cost multiplier discount (e.g. 0.9 === 10% discount)
|
||||
* @param {number} componentDiscount Component cost multiplier discount (e.g. 0.75 === 25% discount)
|
||||
* @param {number} shipCostMultiplier Ship cost multiplier discount (e.g. 0.9 === 10% discount)
|
||||
* @param {number} componentCostMultiplier Component cost multiplier discount (e.g. 0.75 === 25% discount)
|
||||
*/
|
||||
Ship.prototype.applyDiscounts = function(shipDiscount, componentDiscount) {
|
||||
Ship.prototype.applyDiscounts = function(shipCostMultiplier, componentCostMultiplier) {
|
||||
var total = 0;
|
||||
var costList = this.costList;
|
||||
|
||||
for (var i = 0, l = costList.length; i < l; i++) {
|
||||
var item = costList[i];
|
||||
if (item.c && item.c.cost) {
|
||||
item.discountedCost = item.c.cost * (item.type == 'SHIP' ? shipDiscount : componentDiscount);
|
||||
item.discountedCost = item.c.cost * (item.type == 'SHIP' ? shipCostMultiplier : componentCostMultiplier);
|
||||
if (item.incCost) {
|
||||
total += item.discountedCost;
|
||||
}
|
||||
}
|
||||
}
|
||||
this.shipDiscount = shipDiscount;
|
||||
this.componentDiscount = componentDiscount;
|
||||
this.shipCostMultiplier = shipCostMultiplier;
|
||||
this.componentCostMultiplier = componentCostMultiplier;
|
||||
this.totalCost = total;
|
||||
};
|
||||
|
||||
|
||||
@@ -10,6 +10,13 @@ angular.module('shipyard', ['ngLodash'])
|
||||
// Create 'angularized' references to DB.This will aid testing
|
||||
.constant('ShipsDB', DB.ships)
|
||||
.constant('ComponentsDB', DB.components)
|
||||
.value('ArmourMultiplier', [
|
||||
1, // Lightweight
|
||||
1.4, // Reinforced
|
||||
1.945, // Military
|
||||
1.945, // Mirrored
|
||||
1.945 // Reactive
|
||||
])
|
||||
.value('commonArray', [
|
||||
'Power Plant',
|
||||
'Thrusters',
|
||||
@@ -32,19 +39,20 @@ angular.module('shipyard', ['ngLodash'])
|
||||
|
||||
// Internal
|
||||
fs: 'Fuel Scoop',
|
||||
sc: 'Scanners',
|
||||
am: 'Auto Field-Maint. Unit',
|
||||
cr: 'Cargo Racks',
|
||||
sc: 'Scanner',
|
||||
am: 'Auto Field-Maintenance Unit',
|
||||
cr: 'Cargo Rack',
|
||||
fi: 'FSD Interdictor',
|
||||
hb: 'Hatch Breaker Limpet Ctrl',
|
||||
hb: 'Hatch Breaker Limpet Controller',
|
||||
hr: 'Hull Reinforcement Package',
|
||||
rf: 'Refinery',
|
||||
scb: 'Shield Cell Bank',
|
||||
sg: 'Shield Generator',
|
||||
psg: 'Prismatic Shield Generator',
|
||||
dc: 'Docking Computer',
|
||||
fx: 'Fuel Transfer Limpet Ctrl',
|
||||
pc: 'Prospector Limpet Ctrl',
|
||||
cc: 'Collector Limpet Ctrl',
|
||||
fx: 'Fuel Transfer Limpet Controller',
|
||||
pc: 'Prospector Limpet Controller',
|
||||
cc: 'Collector Limpet Controller',
|
||||
|
||||
// Hard Points
|
||||
bl: 'Beam Laser',
|
||||
@@ -65,12 +73,13 @@ angular.module('shipyard', ['ngLodash'])
|
||||
sb: 'Shield Booster',
|
||||
tp: 'Torpedo Pylon'
|
||||
})
|
||||
.value('shipPurpose', {
|
||||
mp: 'Multi Purpose',
|
||||
fr: 'Freighter',
|
||||
ex: 'Explorer',
|
||||
co: 'Combat',
|
||||
pa: 'Passenger Transport'
|
||||
.value('MountMap', {
|
||||
'F': 'Fixed',
|
||||
'G': 'Gimballed',
|
||||
'T': 'Turret',
|
||||
'Fixed': 'F',
|
||||
'Gimballed': 'G',
|
||||
'Turret': 'T'
|
||||
})
|
||||
.value('shipSize', [
|
||||
'N/A',
|
||||
@@ -108,7 +117,7 @@ angular.module('shipyard', ['ngLodash'])
|
||||
},
|
||||
{ // 2
|
||||
title: 'Armour',
|
||||
props: ['armourTotal'],
|
||||
props: ['armour'],
|
||||
unit: '',
|
||||
fmt: 'fCrd'
|
||||
},
|
||||
@@ -206,13 +215,13 @@ angular.module('shipyard', ['ngLodash'])
|
||||
*/
|
||||
.value('calcTotalRange', function(mass, fsd, fuel) {
|
||||
var fuelRemaining = fuel % fsd.maxfuel; // Fuel left after making N max jumps
|
||||
var jumps = fuel / fsd.maxfuel;
|
||||
var jumps = Math.floor(fuel / fsd.maxfuel);
|
||||
mass += fuelRemaining;
|
||||
// Going backwards, start with the last jump using the remaining fuel
|
||||
var totalRange = fuelRemaining > 0 ? Math.pow(fuelRemaining / fsd.fuelmul, 1 / fsd.fuelpower ) * fsd.optmass / mass : 0;
|
||||
// For each max fuel jump, calculate the max jump range based on fuel left in the tank
|
||||
for (var j = 0, l = Math.floor(jumps); j < l; j++) {
|
||||
fuelRemaining += fsd.maxfuel;
|
||||
// For each max fuel jump, calculate the max jump range based on fuel mass left in the tank
|
||||
for (var j = 0; j < jumps; j++) {
|
||||
mass += fsd.maxfuel;
|
||||
totalRange += Math.pow(fsd.maxfuel / fsd.fuelmul, 1 / fsd.fuelpower ) * fsd.optmass / mass;
|
||||
}
|
||||
return totalRange;
|
||||
|
||||
@@ -32,6 +32,41 @@ angular.module('shipyard').service('Components', ['lodash', 'ComponentsDB', 'Shi
|
||||
return null;
|
||||
};
|
||||
|
||||
this.findInternalId = function(groupName, clss, rating, name) {
|
||||
var group = C.internal[groupName];
|
||||
|
||||
if (!group) {
|
||||
throw 'Invalid internal group: ' + groupName;
|
||||
}
|
||||
|
||||
for (var i = 0, l = group.length; i < l; i++) {
|
||||
if (group[i].class == clss && group[i].rating == rating && ((!name && !group[i].name) || group[i].name == name)) {
|
||||
return group[i].id;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
this.findHardpointId = function(groupName, clss, rating, name, mode, missile) {
|
||||
var group = C.hardpoints[groupName];
|
||||
|
||||
if (!group) {
|
||||
throw 'Invalid hardpoint group: ' + groupName;
|
||||
}
|
||||
|
||||
for (var i = 0, l = group.length; i < l; i++) {
|
||||
if (group[i].class == clss && group[i].rating == rating && group[i].mode == mode
|
||||
&& ((!name && !group[i].name) || group[i].name == name)
|
||||
&& ((!missile && !group[i].missile) || group[i].missile == missile)
|
||||
) {
|
||||
return group[i].id;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* Looks up the bulkhead component for a specific ship and bulkhead
|
||||
* @param {string} shipId Unique ship Id/Key
|
||||
@@ -42,6 +77,10 @@ angular.module('shipyard').service('Components', ['lodash', 'ComponentsDB', 'Shi
|
||||
return C.bulkheads[shipId][bulkheadsId];
|
||||
};
|
||||
|
||||
this.bulkheadIndex = function(bulkheadName) {
|
||||
return ['Lightweight Alloy', 'Reinforced Alloy', 'Military Grade Composite', 'Mirrored Surface Composite', 'Reactive Surface Composite'].indexOf(bulkheadName);
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates a new ComponentSet that contains all available components
|
||||
* that the specified ship is eligible to use.
|
||||
@@ -51,7 +90,7 @@ angular.module('shipyard').service('Components', ['lodash', 'ComponentsDB', 'Shi
|
||||
*/
|
||||
this.forShip = function(shipId) {
|
||||
var ship = Ships[shipId];
|
||||
return new ComponentSet(C, ship.properties.mass + 5, ship.slots.common, ship.slots.internal[0], ship.slots.hardpoints[0]);
|
||||
return new ComponentSet(C, ship.minMassFilter || ship.properties.hullMass + 5, ship.slots.common, ship.slots.internal[0], ship.slots.hardpoints[0]);
|
||||
};
|
||||
|
||||
}]);
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
html, body {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
text-rendering: optimizeLegibility;
|
||||
}
|
||||
|
||||
@@ -32,6 +33,8 @@ body {
|
||||
padding: 0;
|
||||
font-family: @fStandard;
|
||||
letter-spacing: 0.05em;
|
||||
overflow-x: hidden;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
|
||||
div, a, li {
|
||||
@@ -40,7 +43,9 @@ div, a, li {
|
||||
|
||||
#main {
|
||||
margin: 0;
|
||||
padding: 0.5em 0;
|
||||
padding: 0.5em 0.5em;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
min-height: 90%;
|
||||
clear: both;
|
||||
text-align: center;
|
||||
|
||||
@@ -66,3 +66,7 @@
|
||||
color: @warning-disabled;
|
||||
fill: @warning-disabled;
|
||||
}
|
||||
|
||||
.bg-warning-disabled {
|
||||
background-color: @warning-disabled;
|
||||
}
|
||||
|
||||
@@ -84,6 +84,19 @@ header {
|
||||
-webkit-overflow-scrolling: touch;
|
||||
max-height: 500px;
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
width: 0.5em;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar-track {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background-color: @warning-disabled;
|
||||
}
|
||||
|
||||
|
||||
.smallTablet({
|
||||
max-height: 400px;
|
||||
left: 0;
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
input {
|
||||
background: none;
|
||||
line-height: 1.3em;
|
||||
width: 20em;
|
||||
width: 15em;
|
||||
font-size: 0.9em;
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
@@ -72,7 +72,7 @@
|
||||
}
|
||||
|
||||
.largePhone({
|
||||
width: 70%;
|
||||
width: 60%;
|
||||
});
|
||||
|
||||
.medPhone({
|
||||
@@ -99,6 +99,12 @@
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.optional-hide {
|
||||
.largePhone({
|
||||
display: none;
|
||||
});
|
||||
}
|
||||
|
||||
table.total {
|
||||
width: 100%;
|
||||
|
||||
@@ -113,6 +119,26 @@ table.total {
|
||||
}
|
||||
}
|
||||
|
||||
.tabs {
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
margin-bottom: 1px;
|
||||
|
||||
&, th {
|
||||
border-collapse: collapse;
|
||||
color: @primary-disabled;
|
||||
background-color: @primary-bg;
|
||||
border: 1px solid @primary-disabled;
|
||||
padding-top: 1px;
|
||||
}
|
||||
|
||||
.active {
|
||||
color: @primary-bg;
|
||||
background-color: @primary-disabled;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.group {
|
||||
width: 25%;
|
||||
padding: 0.5em 0.2em;
|
||||
@@ -122,11 +148,6 @@ table.total {
|
||||
.user-select-none();
|
||||
cursor: default;
|
||||
|
||||
[ng-click] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
|
||||
h1 {
|
||||
font-family: @fStandard;
|
||||
color: @bgBlack;
|
||||
@@ -141,6 +162,12 @@ table.total {
|
||||
|
||||
.smallTablet({
|
||||
width: 50%;
|
||||
|
||||
.axis.x {
|
||||
g.tick:nth-child(2n + 1) text {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
.largePhone({
|
||||
@@ -164,14 +191,6 @@ table.total {
|
||||
&.third {
|
||||
width: 33%;
|
||||
|
||||
.smallTablet({
|
||||
.axis.x {
|
||||
g.tick:nth-child(2n + 1) text {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
.largePhone({
|
||||
width: 100% !important;
|
||||
});
|
||||
@@ -228,9 +247,6 @@ table.total {
|
||||
&:nth-child(3) {
|
||||
display: none;
|
||||
}
|
||||
&:nth-child(2) {
|
||||
font-size: 0.7em;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -1,3 +1,27 @@
|
||||
select {
|
||||
.border-radius(0);
|
||||
cursor: pointer;
|
||||
background: none;
|
||||
color: @primary-disabled;
|
||||
font-family: @fStandard;
|
||||
font-size: 1em;
|
||||
background-color: transparent;
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
appearance: none;
|
||||
padding: 0.1em 0.5em;
|
||||
outline:none;
|
||||
border: 0;
|
||||
|
||||
&:focus {
|
||||
outline:none;
|
||||
}
|
||||
|
||||
&::-moz-focus-inner {
|
||||
border: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.select {
|
||||
color: @primary-disabled;
|
||||
position: absolute;
|
||||
@@ -5,17 +29,34 @@
|
||||
padding: 0.5em 0;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
max-height: 300px;
|
||||
max-height: 400px;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
z-index: 0;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
background-color: @bg;
|
||||
border: 1px solid @primary;
|
||||
white-space: nowrap;
|
||||
text-align: center;
|
||||
|
||||
.tablet({
|
||||
max-height: 300px;
|
||||
});
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
width: 0.5em;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar-track {
|
||||
background-color: transparent;
|
||||
border-left: 1px solid @primary;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background-color: @primary-disabled;
|
||||
}
|
||||
|
||||
.select-group {
|
||||
white-space: nowrap;
|
||||
line-height: 1.5em;
|
||||
text-align: left;
|
||||
margin: 0.5em 0;
|
||||
@@ -24,66 +65,66 @@
|
||||
border-bottom: 1px solid @primary-disabled;
|
||||
}
|
||||
|
||||
.empty-c, .c, .lc {
|
||||
cursor: pointer;
|
||||
@optionSpacing: 2em;
|
||||
|
||||
.empty-c, .c, .lc {
|
||||
white-space: nowrap;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
line-height:@optionSpacing;
|
||||
color: @primary-disabled;
|
||||
stroke-width: 1em;
|
||||
stroke-width: 0.5em;
|
||||
stroke: @primary-disabled;
|
||||
|
||||
&:hover {
|
||||
color: @warning;
|
||||
stroke: @warning;
|
||||
border-color: @primary;
|
||||
color: @primary;
|
||||
stroke: @primary;
|
||||
}
|
||||
}
|
||||
|
||||
.lc, .c {
|
||||
border:1px solid @primary-disabled;
|
||||
padding: 0.1em 0.2em;
|
||||
margin: 0.3em;
|
||||
|
||||
&.warning {
|
||||
border-color: @warning-disabled;
|
||||
color: @warning-disabled;
|
||||
stroke: @warning-disabled;
|
||||
|
||||
&:hover {
|
||||
border-color: @warning;
|
||||
color: @warning;
|
||||
stroke: @warning;
|
||||
}
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
cursor: not-allowed;
|
||||
border-color: @disabled;
|
||||
color: @disabled;
|
||||
stroke: @disabled;
|
||||
}
|
||||
&.active {
|
||||
border-color: @secondary;
|
||||
color: @secondary;
|
||||
stroke: @secondary;
|
||||
}
|
||||
}
|
||||
|
||||
@optionSpacing: 2em;
|
||||
|
||||
.lc {
|
||||
line-height:@optionSpacing;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.empty-c {
|
||||
line-height:@optionSpacing;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
||||
.c {
|
||||
border:1px solid @primary-disabled;
|
||||
display: inline-block;
|
||||
padding: 0.1em;
|
||||
margin: 0.3em;
|
||||
width: 2em;
|
||||
line-height: @optionSpacing;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
border:1px solid @warning;
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
border:1px solid @disabled;
|
||||
}
|
||||
&.active {
|
||||
border:1px solid @secondary;
|
||||
}
|
||||
span {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
ul {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
min-width: 15em;
|
||||
min-width: 16em;
|
||||
margin: 0 auto;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
@@ -91,7 +132,7 @@
|
||||
|
||||
&.hardpoint {
|
||||
.c {
|
||||
width: 4.4em;
|
||||
width: 4.5em;
|
||||
padding: 0.1em 0.2em;
|
||||
}
|
||||
ul {
|
||||
|
||||
@@ -24,6 +24,13 @@
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
.name {
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
max-width: 80%;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.cb {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
@@ -8,6 +8,10 @@ table {
|
||||
color: @primary;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
[ng-click] {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
thead {
|
||||
|
||||
281
app/schemas/ship-loadout/1.json
Normal file
281
app/schemas/ship-loadout/1.json
Normal file
@@ -0,0 +1,281 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"id": "http://cdn.coriolis.io/schemas/ship-loadout/1-draft.json#",
|
||||
"title": "Ship Loadout",
|
||||
"type": "object",
|
||||
"description": "The details for a specific ship build/loadout",
|
||||
"required": ["name", "ship", "components"],
|
||||
"properties": {
|
||||
"name": {
|
||||
"description": "The name of the build/loadout",
|
||||
"type": "string",
|
||||
"minLength": 2
|
||||
},
|
||||
"ship": {
|
||||
"description": "The full display name of the ship",
|
||||
"type": "string",
|
||||
"minimum": 3
|
||||
},
|
||||
"manufacturer": {
|
||||
"description": "The ship manufacturer",
|
||||
"type": "string"
|
||||
},
|
||||
"references" : {
|
||||
"description": "3rd Party references and/or links to this build/loadout",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"required": ["name","url"],
|
||||
"additionalProperties": true,
|
||||
"properties": {
|
||||
"name": {
|
||||
"description": "The name of the 3rd party, .e.g 'Coriolis.io' or 'E:D Shipyard'",
|
||||
"type": "string"
|
||||
},
|
||||
"url": {
|
||||
"description": "The link/url to the 3rd party referencing this build/loadout",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"description": "The components used by this build",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["standard", "internal", "hardpoints", "utility"],
|
||||
"properties": {
|
||||
"standard": {
|
||||
"description": "The set of standard components across all ships",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["bulkheads", "powerPlant", "thrusters", "frameShiftDrive", "lifeSupport", "powerDistributor", "sensors", "fuelTank"],
|
||||
"properties": {
|
||||
"bulkheads": {
|
||||
"enum": ["Lightweight Alloy", "Reinforced Alloy", "Military Grade Composite", "Mirrored Surface Composite", "Reactive Surface Composite"]
|
||||
},
|
||||
"powerPlant": {
|
||||
"required": ["class", "rating"],
|
||||
"properties": {
|
||||
"class": { "type": "integer", "minimum": 2, "maximum": 8 },
|
||||
"rating": { "$ref": "#/definitions/standardRatings" }
|
||||
}
|
||||
},
|
||||
"thrusters": {
|
||||
"required": ["class", "rating"],
|
||||
"properties": {
|
||||
"class": { "type": "integer", "minimum": 2, "maximum": 8 },
|
||||
"rating": { "$ref": "#/definitions/standardRatings" }
|
||||
}
|
||||
},
|
||||
"frameShiftDrive": {
|
||||
"required": ["class", "rating"],
|
||||
"properties": {
|
||||
"class": { "type": "integer", "minimum": 2, "maximum": 8 },
|
||||
"rating": { "$ref": "#/definitions/standardRatings" }
|
||||
}
|
||||
},
|
||||
"lifeSupport": {
|
||||
"required": ["class", "rating"],
|
||||
"properties": {
|
||||
"class": { "type": "integer", "minimum": 1, "maximum": 6 },
|
||||
"rating": { "$ref": "#/definitions/standardRatings" }
|
||||
}
|
||||
},
|
||||
"powerDistributor": {
|
||||
"required": ["class", "rating"],
|
||||
"properties": {
|
||||
"class": { "type": "integer", "minimum": 1, "maximum": 8 },
|
||||
"rating": { "$ref": "#/definitions/standardRatings" }
|
||||
}
|
||||
},
|
||||
"sensors": {
|
||||
"required": ["class", "rating"],
|
||||
"properties": {
|
||||
"class": { "type": "integer", "minimum": 1, "maximum": 8 },
|
||||
"rating": { "$ref": "#/definitions/standardRatings" }
|
||||
}
|
||||
},
|
||||
"fuelTank": {
|
||||
"required": ["class", "rating"],
|
||||
"properties": {
|
||||
"class": { "type": "integer", "minimum": 1, "maximum": 6 },
|
||||
"rating": { "$ref": "#/definitions/standardRatings" }
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"internal": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": ["object", "null"],
|
||||
"required": ["class", "rating", "group"],
|
||||
"properties" : {
|
||||
"class": { "type": "integer", "minimum": 1, "maximum": 8 },
|
||||
"rating": { "$ref": "#/definitions/standardRatings" },
|
||||
"group": {
|
||||
"description": "The group of the component, e.g. 'Shield Generator', or 'Cargo Rack'",
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"description": "The name identifying the component (if applicable), e.g. 'Advance Discovery Scanner', or 'Detailed Surface Scanner'",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"minItems": 3
|
||||
},
|
||||
"hardpoints": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": ["object", "null"],
|
||||
"required": ["class", "rating", "group", "mount"],
|
||||
"properties" : {
|
||||
"class": { "type": "integer", "minimum": 1, "maximum": 4 },
|
||||
"rating": { "$ref": "#/definitions/allRatings" },
|
||||
"mount": { "type": "string", "enum": ["Fixed", "Gimballed", "Turret"] },
|
||||
"group": {
|
||||
"description": "The group of the component, e.g. 'Beam Laser', or 'Missile Rack'",
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"description": "The name identifing the component (if applicable), e.g. 'Retributor', or 'Mining Lance'",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"minItems": 1
|
||||
},
|
||||
"utility": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": ["object", "null"],
|
||||
"required": ["class", "rating", "group"],
|
||||
"properties" : {
|
||||
"class": { "type": "integer", "minimum": 0, "maximum": 0 },
|
||||
"rating": { "$ref": "#/definitions/allRatings" },
|
||||
"group": {
|
||||
"description": "The group of the component, e.g. 'Shield Booster', or 'Kill Warrant Scanner'",
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"description": "The name identifing the component (if applicable), e.g. 'Point Defence', or 'Electronic Countermeasure'",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"minItems": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
"stats": {
|
||||
"description": "Optional statistics from the build",
|
||||
"type": "object",
|
||||
"additionalProperties": true,
|
||||
"properties": {
|
||||
"agility": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"armour": {
|
||||
"description": "Sum of base armour + any hull reinforcements",
|
||||
"type": "integer",
|
||||
"minimum": 1
|
||||
},
|
||||
"armourAdded":{
|
||||
"description": "Armour added through Hull reinforcement",
|
||||
"type": "integer",
|
||||
"minimum": 1
|
||||
},
|
||||
"baseShieldStrength": {
|
||||
"type": "integer",
|
||||
"minimum": 1
|
||||
},
|
||||
"baseArmour": {
|
||||
"type": "integer",
|
||||
"minimum": 1
|
||||
},
|
||||
"boost": {
|
||||
"description": "Maximum boost speed of the ships (4 pips, straight-line)",
|
||||
"type": "number",
|
||||
"minimum": 1
|
||||
},
|
||||
"cargoCapacity": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"class": {
|
||||
"description": "Ship Class/Size [Small, Medium, Large]",
|
||||
"enum": [1,2,3]
|
||||
},
|
||||
"dps": {
|
||||
"description": "Cumulative DPS based on the in-game 1-10 statistic",
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"hullCost": {
|
||||
"description": "Cost of the ship's hull",
|
||||
"type": "integer",
|
||||
"minimum": 1
|
||||
},
|
||||
"hullMass": {
|
||||
"description": "Mass of the Ship hull only",
|
||||
"type": "number",
|
||||
"minimum": 1
|
||||
},
|
||||
"fuelCapacity": {
|
||||
"type": "integer",
|
||||
"minimum": 1
|
||||
},
|
||||
"fullTankRange": {
|
||||
"description": "Single Jump range with a full tank (unladenMass + fuel)",
|
||||
"type": "number",
|
||||
"minimum": 0
|
||||
},
|
||||
"ladenMass": {
|
||||
"description": "Mass of the Ship + fuel + cargo (hull + all components + fuel tank + cargo capacity)",
|
||||
"type": "number",
|
||||
"minimum": 1
|
||||
},
|
||||
"ladenRange": {
|
||||
"description": "Single Jump range with full cargo load, see ladenMass",
|
||||
"type": "number",
|
||||
"minimum": 0
|
||||
},
|
||||
"masslock": {
|
||||
"description": "Mass Lock Factor of the Ship",
|
||||
"type": "integer",
|
||||
"minimum": 1
|
||||
},
|
||||
"shieldStrength": {
|
||||
"description": "Shield strengh in Mega Joules (Mj)",
|
||||
"type": "number",
|
||||
"minimum": 0
|
||||
},
|
||||
"speed": {
|
||||
"description": "Maximum speed of the ships (4 pips, straight-line)",
|
||||
"type": "number",
|
||||
"minimum": 1
|
||||
},
|
||||
"totalCost": {
|
||||
"type": "integer",
|
||||
"minimum": 1
|
||||
},
|
||||
"unladenRange": {
|
||||
"description": "Single Jump range when unladen, see unladenMass",
|
||||
"type": "number",
|
||||
"minimum": 0
|
||||
},
|
||||
"unladenMass": {
|
||||
"description": "Mass of the Ship (hull + all components)",
|
||||
"type": "number",
|
||||
"minimum": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"definitions": {
|
||||
"standardRatings": { "enum": ["A", "B", "C", "D", "E"] },
|
||||
"allRatings": { "enum": ["A", "B", "C", "D", "E", "F", "I" ] }
|
||||
}
|
||||
}
|
||||
@@ -63,7 +63,8 @@
|
||||
<hr />
|
||||
<ul>
|
||||
Builds & Comparisons
|
||||
<li><a href="#" class="block" ui-sref="modal.export({data: {builds: allBuilds}})">Export</a></li>
|
||||
<li><a href="#" class="block" ng-click="backup($event)">Backup</a></li>
|
||||
<li><a href="#" class="block" ng-click="detailedExport($event)">Detailed Export</a></li>
|
||||
<li><a href="#" class="block" ui-sref="modal.import">Import</a></li>
|
||||
<li><a href="#" class="block" ui-sref="modal.delete">Delete All</a></li>
|
||||
</ul>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<div class="sz" ng-bind="c.maxClass"></div>
|
||||
<div class="empty" ng-if="!c.c">EMPTY</div>
|
||||
<div ng-if="c.c">
|
||||
{{c.c.class}}{{c.c.rating}} {{c.c.name || lbl}}
|
||||
<div class="l name">{{c.c.class}}{{c.c.rating}} {{c.c.name || lbl}}</div>
|
||||
<div class="r">{{c.c.mass || c.c.capacity || '0'}} <u>T</u></div>
|
||||
<div class="cb"></div>
|
||||
<div class="l" ng-if="c.c.optmass">Opt: {{c.c.optmass}} <u>T</u></div>
|
||||
<div class="l" ng-if="c.c.maxmass">Max: {{c.c.maxmass}} <u>T</u></div>
|
||||
<div class="l" ng-if="c.c.optmass">Optimal Mass: {{c.c.optmass}} <u>T</u></div>
|
||||
<div class="l" ng-if="c.c.maxmass">Max Mass: {{c.c.maxmass}} <u>T</u></div>
|
||||
<div class="l" ng-if="c.c.bins">{{c.c.bins}} <u>Bins</u></div>
|
||||
<div class="l" ng-if="c.c.rate">Rate: {{c.c.rate}} <u>Kg/s</u> Refuel Time: {{$r.fTime(fuel * 1000 / c.c.rate)}}</div>
|
||||
<div class="l" ng-if="c.c.ammo">Ammo: {{c.c.ammo}}</div>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<h2 ng-bind="title"></h2>
|
||||
<div ng-if="description" ng-bind="description"></div>
|
||||
<div>
|
||||
<textarea class="cb json" ng-click="onTextClick($event)" ng-bind="export"></textarea>
|
||||
</div>
|
||||
|
||||
@@ -1,24 +1,38 @@
|
||||
<h2>Import</h2>
|
||||
<div ng-show="!processed">
|
||||
<textarea class="cb json" ng-model="importData" ng-change="validateJson()" placeholder="Paste JSON Here"></textarea>
|
||||
<textarea class="cb json" ng-model="importJSON" ng-change="validateJson()" placeholder="Paste JSON Here"></textarea>
|
||||
<button class="l" ng-click="process()" ng-disabled="!jsonValid">Proceed</button>
|
||||
<div class="l warning" style="margin-left:3em;">{{errorMsg}}</div>
|
||||
</div>
|
||||
|
||||
<div ng-show="processed">
|
||||
<table class="l" style="overflow:hidden;margin: 1em 0; width: 100%;">
|
||||
<thead><tr><th>Ship</th><th>Build Name</th><th>Action</th></tr></thead>
|
||||
<thead><tr><th style="text-align:left">Ship</th><th style="text-align:left">Build Name</th><th>Action</th></tr></thead>
|
||||
<tbody ng-repeat="(shipId,shipBuilds) in builds">
|
||||
<tr class="cb" ng-repeat="(buildName, b) in shipBuilds">
|
||||
<td>{{ships[shipId].properties.name}}</td>
|
||||
<td><input type="text" ng-model="b.useName"/></td>
|
||||
<td ng-class="{warning: hasBuild(shipId, b.useName) == true, disabled: b.useName == ''}">
|
||||
<td style="text-align:center" ng-class="{warning: hasBuild(shipId, b.useName) == true, disabled: b.useName == ''}">
|
||||
<span ng-show="b.useName">{{ hasBuild(shipId, b.useName)? 'Overwrite' : 'Create' }}</span>
|
||||
<span ng-show="b.useName == ''">Skip</span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<table class="l" style="overflow:hidden;margin: 1em 0; width: 100%;" ng-if="comparisons">
|
||||
<thead><tr><th style="text-align:left">Comparison</th><th>Action</th></tr></thead>
|
||||
<tbody>
|
||||
<tr class="cb" ng-repeat="(name, comparison) in comparisons">
|
||||
<td><input type="text" ng-model="comparison.useName"/></td>
|
||||
<td style="text-align:center" ng-class="{warning: hasComparison(comparison.useName) == true, disabled: comparison.useName == ''}">
|
||||
<span ng-show="comparison.useName">{{ hasComparison(comparison.useName)? 'Overwrite' : 'Create' }}</span>
|
||||
<span ng-show="comparison.useName == ''">Skip</span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<button class="cl l" ng-click="import()"><svg class="icon"><use xlink:href="#download"></use></svg> Import</button>
|
||||
<button class="l" style="margin-left: 2em;" ng-click="processed = false" ng-show="canEdit">Edit JSON</button>
|
||||
</div>
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
<button ng-click="stripBuild()">
|
||||
<svg class="icon lg"><use xlink:href="#feather"></use></svg><span class="button-lbl">Low-Weight</span>
|
||||
</button>
|
||||
<button ng-click="exportBuild($event)" ng-disabled="!buildName">
|
||||
<svg class="icon lg"><use xlink:href="#download"></use></svg><span class="button-lbl">Export</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -29,17 +32,20 @@
|
||||
<th rowspan="2">Size</th>
|
||||
<th rowspan="2">Agility</th>
|
||||
<th rowspan="2">Speed</th>
|
||||
<th rowspan="2">Boost</th>
|
||||
<th rowspan="2" ng-class="{'bg-warning-disabled': pd.c.enginecapacity < ship.boostEnergy}">Boost</th>
|
||||
<th rowspan="2">DPS</th>
|
||||
<th rowspan="2">Armour</th>
|
||||
<th rowspan="2">Shields</th>
|
||||
<th colspan="2">Mass</th>
|
||||
<th colspan="3">Mass</th>
|
||||
<th rowspan="2">Cargo</th>
|
||||
<th rowspan="2">Fuel</th>
|
||||
<th colspan="3">Jump Range</th>
|
||||
<th colspan="3">Total Range</th>
|
||||
<th rowspan="2">Lock<br>Factor</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="lft">Unladen</th>
|
||||
<th class="lft">Hull</th>
|
||||
<th>Unladen</th>
|
||||
<th>Laden</th>
|
||||
<th class="lft">Max</th>
|
||||
<th>Full Tank</th>
|
||||
@@ -54,9 +60,18 @@
|
||||
<td ng-bind="SZ[ship.class]"></td>
|
||||
<td>{{ship.agility}}/10</td>
|
||||
<td>{{fRound(ship.speed)}} <u>m/s</u></td>
|
||||
<td>{{fRound(ship.boost)}} <u>m/s</u></td>
|
||||
<td>{{ship.armourTotal}} <span ng-if="ship.armourAdded">({{ship.armour}} + {{ship.armourAdded}})</span></td>
|
||||
<td>
|
||||
<span ng-if="pd.c.enginecapacity >= ship.boostEnergy">{{fRound(ship.boost)}} <u>m/s</u></span>
|
||||
<span class="warning" ng-if="pd.c.enginecapacity < ship.boostEnergy">0 <svg class="icon"><use xlink:href="#warning"></use></svg></span>
|
||||
</td>
|
||||
<td>{{fRound(ship.totalDps)}}</td>
|
||||
<td>
|
||||
{{ship.armour}}
|
||||
<span ng-if="ship.armourAdded || ship.armourMultiplier > 1">(<span ng-if="ship.armourMultiplier > 1">{{fRPct(ship.armourMultiplier)}}</span>
|
||||
<span ng-if="ship.armourAdded">+ {{ship.armourAdded}}</span>)</span>
|
||||
</td>
|
||||
<td>{{fRound(ship.shieldStrength)}} <u>MJ</u> <span ng-if="ship.shieldMultiplier > 1 && ship.shieldStrength > 0">({{fRPct(ship.shieldMultiplier)}})</span></td>
|
||||
<td>{{ship.hullMass}} <u>T</u></td>
|
||||
<td>{{fRound(ship.unladenMass)}} <u>T</u></td>
|
||||
<td>{{fRound(ship.ladenMass)}} <u>T</u></td>
|
||||
<td>{{fRound(ship.cargoCapacity)}} <u>T</u></td>
|
||||
@@ -67,6 +82,7 @@
|
||||
<td>{{fRound(ship.maxJumpCount)}}</td>
|
||||
<td>{{fRound(ship.unladenTotalRange)}} <u>LY</u></td>
|
||||
<td>{{fRound(ship.ladenTotalRange)}} <u>LY</u></td>
|
||||
<td ng-bind="ship.masslock"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -111,7 +127,7 @@
|
||||
<div class="l">Optimal Mass: {{th.c.optmass}} <u>T</u></div>
|
||||
<div class="l">Max Mass: {{th.c.maxmass}} <u>T</u></div>
|
||||
</div>
|
||||
<div component-select class="select" s="th" mass="ship.unladenMass" opts="availCS.common[1]" ng-if="selectedSlot==th" ng-click="select('c',th,$event)"></div>
|
||||
<div component-select class="select" s="th" mass="ship.ladenMass" opts="availCS.common[1]" ng-if="selectedSlot==th" ng-click="select('c',th,$event)"></div>
|
||||
</div>
|
||||
<div class="slot" ng-click="selectSlot($event, fsd)" ng-class="{selected: selectedSlot==fsd}">
|
||||
<div class="details">
|
||||
@@ -135,7 +151,7 @@
|
||||
<div component-select class="select" s="ls" opts="availCS.common[3]" ng-if="selectedSlot==ls" ng-click="select('c',ls,$event)"></div>
|
||||
</div>
|
||||
<div class="slot" ng-click="selectSlot($event, pd)" ng-class="{selected: selectedSlot==pd}">
|
||||
<div class="details">
|
||||
<div class="details" ng-class="{warning: pd.c.enginecapacity < ship.boostEnergy}">
|
||||
<div class="sz">{{::pd.maxClass}}</div>
|
||||
<div class="l">{{pd.id}} Power Distributor</div>
|
||||
<div class="r">{{pd.c.mass}} <u>T</u></div>
|
||||
@@ -144,7 +160,7 @@
|
||||
<div class="l">SYS: {{pd.c.systemcapacity}} <u>MJ</u> / {{pd.c.systemrecharge}} <u>MW</u></div>
|
||||
<div class="l">ENG: {{pd.c.enginecapacity}} <u>MJ</u> / {{pd.c.enginerecharge}} <u>MW</u></div>
|
||||
</div>
|
||||
<div component-select class="select" s="pd" opts="availCS.common[4]" ng-if="selectedSlot==pd" ng-click="select('c',pd,$event)"></div>
|
||||
<div component-select class="select" s="pd" warning="pdWarning" opts="availCS.common[4]" ng-if="selectedSlot==pd" ng-click="select('c',pd,$event)"></div>
|
||||
</div>
|
||||
<div class="slot" ng-click="selectSlot($event, ss)" ng-class="{selected: selectedSlot==ss}">
|
||||
<div class="details">
|
||||
@@ -237,28 +253,36 @@
|
||||
</div>
|
||||
|
||||
<div class="group half">
|
||||
<table style="width:100%">
|
||||
<table class="tabs">
|
||||
<thead>
|
||||
<tr class="main">
|
||||
<th colspan="2" class="sortable le" ng-click="sortCost(cName)">
|
||||
Component
|
||||
<div class="r">
|
||||
<u ng-if="discounts.ship < 1">[Ship {{fRPct(1 - discounts.ship)}} off]</u>
|
||||
<u ng-if="discounts.components < 1">[Components {{fRPct(1 - discounts.components)}} off]</u>
|
||||
</div>
|
||||
</th>
|
||||
<th class="sortable le" ng-click="sortCost('discountedCost')">Credits</th>
|
||||
<tr>
|
||||
<th style="width:50%" ng-class="{active: costTab == 'retrofit'}" ng-click="updateCostTab('retrofit')">Retrofit Costs</th>
|
||||
<th style="width:50%" ng-class="{active: costTab == 'costs'}" ng-click="updateCostTab('costs')">Costs</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="highlight" ng-repeat="item in costList | orderBy:costPredicate:costDesc" ng-if="item.c.cost > 0" ng-class="{disabled:!item.incCost}">
|
||||
<td class="toggleable" style="width:1em;" ng-click="toggleCost(item)">{{item.c.class}}{{item.c.rating}}</td>
|
||||
<td class="le toggleable shorten" ng-click="toggleCost(item)">{{cName(item)}}</td>
|
||||
<td class="ri toggleable" ng-click="toggleCost(item)">{{fCrd(item.discountedCost)}} <u>CR</u></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="total">
|
||||
|
||||
<div ng-if="costTab == 'costs'">
|
||||
<table style="width:100%">
|
||||
<thead>
|
||||
<tr class="main">
|
||||
<th colspan="2" class="sortable le" ng-click="sortCost(cName)">
|
||||
Component
|
||||
<u class="optional-hide" ng-if="discounts.ship < 1">[Ship {{fRPct(1 - discounts.ship)}} off]</u>
|
||||
<u class="optional-hide" ng-if="discounts.components < 1">[Components {{fRPct(1 - discounts.components)}} off]</u>
|
||||
</th>
|
||||
<th class="sortable le" ng-click="sortCost('discountedCost')">Credits</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="highlight" ng-repeat="item in costList | orderBy:costPredicate:costDesc" ng-if="item.c.cost > 0" ng-class="{disabled:!item.incCost}">
|
||||
<td class="toggleable" style="width:1em;" ng-click="toggleCost(item)">{{item.c.class}}{{item.c.rating}}</td>
|
||||
<td class="le toggleable shorten" ng-click="toggleCost(item)">{{cName(item)}}</td>
|
||||
<td class="ri toggleable" ng-click="toggleCost(item)">{{fCrd(item.discountedCost)}} <u>CR</u></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="total">
|
||||
<tr class="ri">
|
||||
<td class="lbl">Total</td>
|
||||
<td>{{fCrd(ship.totalCost)}} <u>CR</u></td>
|
||||
@@ -267,7 +291,52 @@
|
||||
<td class="lbl">Insurance</td>
|
||||
<td>{{fCrd(ship.totalCost * insurance.current.pct)}} <u>CR</u></td>
|
||||
</tr>
|
||||
</table>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div ng-if="costTab == 'retrofit'">
|
||||
<div class="scroll-x">
|
||||
<table style="width:100%">
|
||||
<thead>
|
||||
<tr class="main">
|
||||
<th colspan="2" class="sortable le" ng-click="sortRetrofit('sellName')">Sell</th>
|
||||
<th colspan="2" class="sortable le" ng-click="sortRetrofit('buyName')">Buy</th>
|
||||
<th class="sortable le" ng-click="sortRetrofit('netCost')">
|
||||
Net Cost <u class="optional-hide" ng-if="discounts.components < 1">[{{fRPct(1 - discounts.components)}} off]</u>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr ng-if="!retrofitList || retrofitList.length == 0">
|
||||
<td colspan="5" style="padding: 3em 0;">No Retrofitting changes</td>
|
||||
</tr>
|
||||
<tr class="highlight" ng-repeat="item in retrofitList | orderBy:retroPredicate:retroDesc">
|
||||
<td style="width:1em;">{{item.sellClassRating}}</td>
|
||||
<td class="le shorten">{{item.sellName}}</td>
|
||||
<td style="width:1em;">{{item.buyClassRating}}</td>
|
||||
<td class="le shorten">{{item.buyName}}</td>
|
||||
<td class="ri" ng-class="item.netCost > 0 ? 'warning' : 'secondary-disabled'">{{ fCrd(item.netCost)}} <u>CR</u></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<table class="total">
|
||||
<tr class="ri">
|
||||
<td class="lbl">Cost</td>
|
||||
<td colspan="2" ng-class="retrofitTotal > 0 ? 'warning' : 'secondary-disabled'">{{fCrd(retrofitTotal)}} <u>CR</u></td>
|
||||
</tr>
|
||||
<tr class="ri">
|
||||
<td class="lbl">Retrofit from</td>
|
||||
<td class="cen" style="border-right:none;width: 1em;"><u class="primary-disabled">▾</u></td>
|
||||
<td style="border-left:none;padding:0;">
|
||||
<select style="width: 100%;padding: 0" ng-model="$parent.retrofitBuild" ng-change="setRetrofitBase()" ng-options="name as name for (name, build) in allBuilds[ship.id]">
|
||||
<option value="">Stock / Standard</option>
|
||||
</select>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="group half">
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
"dependencies": {
|
||||
"d3": "~3.5.5",
|
||||
"ng-lodash": "~0.2.0",
|
||||
"ui-router-extras": "~0.0.13",
|
||||
"ui-router-extras": "0.0.13",
|
||||
"angular-ui-router": "^0.2.15",
|
||||
"d3-tip": "~0.6.7",
|
||||
"ng-sortable": "~1.2.1",
|
||||
|
||||
@@ -1,562 +1,42 @@
|
||||
{
|
||||
"8E": {
|
||||
"grp": "pd",
|
||||
"class": 8,
|
||||
"rating": "E",
|
||||
"cost": 697584,
|
||||
"mass": 160,
|
||||
"power": 0.64,
|
||||
"weaponcapacity": 48,
|
||||
"weaponrecharge": 4.8,
|
||||
"enginecapacity": 32,
|
||||
"enginerecharge": 3.2,
|
||||
"systemcapacity": 32,
|
||||
"systemrecharge": 3.2
|
||||
},
|
||||
"8D": {
|
||||
"grp": "pd",
|
||||
"class": 8,
|
||||
"rating": "D",
|
||||
"cost": 1743961,
|
||||
"mass": 64,
|
||||
"power": 0.72,
|
||||
"weaponcapacity": 54,
|
||||
"weaponrecharge": 5.4,
|
||||
"enginecapacity": 36,
|
||||
"enginerecharge": 3.6,
|
||||
"systemcapacity": 36,
|
||||
"systemrecharge": 3.6
|
||||
},
|
||||
"8C": {
|
||||
"grp": "pd",
|
||||
"class": 8,
|
||||
"rating": "C",
|
||||
"cost": 4359903,
|
||||
"mass": 160,
|
||||
"power": 0.8,
|
||||
"weaponcapacity": 60,
|
||||
"weaponrecharge": 6,
|
||||
"enginecapacity": 40,
|
||||
"enginerecharge": 4,
|
||||
"systemcapacity": 40,
|
||||
"systemrecharge": 4
|
||||
},
|
||||
"8B": {
|
||||
"grp": "pd",
|
||||
"class": 8,
|
||||
"rating": "B",
|
||||
"cost": 10899756,
|
||||
"mass": 256,
|
||||
"power": 0.88,
|
||||
"weaponcapacity": 66,
|
||||
"weaponrecharge": 6.6,
|
||||
"enginecapacity": 44,
|
||||
"enginerecharge": 4.4,
|
||||
"systemcapacity": 44,
|
||||
"systemrecharge": 4.4
|
||||
},
|
||||
"8A": {
|
||||
"grp": "pd",
|
||||
"class": 8,
|
||||
"rating": "A",
|
||||
"cost": 27249391,
|
||||
"mass": 160,
|
||||
"power": 0.96,
|
||||
"weaponcapacity": 72,
|
||||
"weaponrecharge": 7.2,
|
||||
"enginecapacity": 48,
|
||||
"enginerecharge": 4.8,
|
||||
"systemcapacity": 48,
|
||||
"systemrecharge": 4.8
|
||||
},
|
||||
"7E": {
|
||||
"grp": "pd",
|
||||
"class": 7,
|
||||
"rating": "E",
|
||||
"cost": 249137,
|
||||
"mass": 80,
|
||||
"power": 0.59,
|
||||
"weaponcapacity": 41,
|
||||
"weaponrecharge": 4.1,
|
||||
"enginecapacity": 27,
|
||||
"enginerecharge": 2.6,
|
||||
"systemcapacity": 27,
|
||||
"systemrecharge": 2.6
|
||||
},
|
||||
"7D": {
|
||||
"grp": "pd",
|
||||
"class": 7,
|
||||
"rating": "D",
|
||||
"cost": 622843,
|
||||
"mass": 32,
|
||||
"power": 0.67,
|
||||
"weaponcapacity": 46,
|
||||
"weaponrecharge": 4.6,
|
||||
"enginecapacity": 31,
|
||||
"enginerecharge": 3,
|
||||
"systemcapacity": 31,
|
||||
"systemrecharge": 3
|
||||
},
|
||||
"7C": {
|
||||
"grp": "pd",
|
||||
"class": 7,
|
||||
"rating": "C",
|
||||
"cost": 1557108,
|
||||
"mass": 80,
|
||||
"power": 0.74,
|
||||
"weaponcapacity": 51,
|
||||
"weaponrecharge": 5.1,
|
||||
"enginecapacity": 34,
|
||||
"enginerecharge": 3.3,
|
||||
"systemcapacity": 34,
|
||||
"systemrecharge": 3.3
|
||||
},
|
||||
"7B": {
|
||||
"grp": "pd",
|
||||
"class": 7,
|
||||
"rating": "B",
|
||||
"cost": 3892770,
|
||||
"mass": 128,
|
||||
"power": 0.81,
|
||||
"weaponcapacity": 56,
|
||||
"weaponrecharge": 5.6,
|
||||
"enginecapacity": 37,
|
||||
"enginerecharge": 3.6,
|
||||
"systemcapacity": 37,
|
||||
"systemrecharge": 3.6
|
||||
},
|
||||
"7A": {
|
||||
"grp": "pd",
|
||||
"class": 7,
|
||||
"rating": "A",
|
||||
"cost": 9731925,
|
||||
"mass": 80,
|
||||
"power": 0.89,
|
||||
"weaponcapacity": 61,
|
||||
"weaponrecharge": 6.1,
|
||||
"enginecapacity": 41,
|
||||
"enginerecharge": 4,
|
||||
"systemcapacity": 41,
|
||||
"systemrecharge": 4
|
||||
},
|
||||
"6E": {
|
||||
"grp": "pd",
|
||||
"class": 6,
|
||||
"rating": "E",
|
||||
"cost": 88978,
|
||||
"mass": 40,
|
||||
"power": 0.54,
|
||||
"weaponcapacity": 34,
|
||||
"weaponrecharge": 3.4,
|
||||
"enginecapacity": 23,
|
||||
"enginerecharge": 2.2,
|
||||
"systemcapacity": 23,
|
||||
"systemrecharge": 2.2
|
||||
},
|
||||
"6D": {
|
||||
"grp": "pd",
|
||||
"class": 6,
|
||||
"rating": "D",
|
||||
"cost": 222444,
|
||||
"mass": 16,
|
||||
"power": 0.61,
|
||||
"weaponcapacity": 38,
|
||||
"weaponrecharge": 3.9,
|
||||
"enginecapacity": 26,
|
||||
"enginerecharge": 2.4,
|
||||
"systemcapacity": 26,
|
||||
"systemrecharge": 2.4
|
||||
},
|
||||
"6C": {
|
||||
"grp": "pd",
|
||||
"class": 6,
|
||||
"rating": "C",
|
||||
"cost": 556110,
|
||||
"mass": 40,
|
||||
"power": 0.68,
|
||||
"weaponcapacity": 42,
|
||||
"weaponrecharge": 4.3,
|
||||
"enginecapacity": 29,
|
||||
"enginerecharge": 2.7,
|
||||
"systemcapacity": 29,
|
||||
"systemrecharge": 2.7
|
||||
},
|
||||
"6B": {
|
||||
"grp": "pd",
|
||||
"class": 6,
|
||||
"rating": "B",
|
||||
"cost": 1390275,
|
||||
"mass": 64,
|
||||
"power": 0.75,
|
||||
"weaponcapacity": 46,
|
||||
"weaponrecharge": 4.7,
|
||||
"enginecapacity": 32,
|
||||
"enginerecharge": 3,
|
||||
"systemcapacity": 32,
|
||||
"systemrecharge": 3
|
||||
},
|
||||
"6A": {
|
||||
"grp": "pd",
|
||||
"class": 6,
|
||||
"rating": "A",
|
||||
"cost": 3475688,
|
||||
"mass": 40,
|
||||
"power": 0.82,
|
||||
"weaponcapacity": 50,
|
||||
"weaponrecharge": 5.2,
|
||||
"enginecapacity": 35,
|
||||
"enginerecharge": 3.2,
|
||||
"systemcapacity": 35,
|
||||
"systemrecharge": 3.2
|
||||
},
|
||||
"5E": {
|
||||
"grp": "pd",
|
||||
"class": 5,
|
||||
"rating": "E",
|
||||
"cost": 31778,
|
||||
"mass": 20,
|
||||
"power": 0.5,
|
||||
"weaponcapacity": 27,
|
||||
"weaponrecharge": 2.9,
|
||||
"enginecapacity": 19,
|
||||
"enginerecharge": 1.7,
|
||||
"systemcapacity": 19,
|
||||
"systemrecharge": 1.7
|
||||
},
|
||||
"5D": {
|
||||
"grp": "pd",
|
||||
"class": 5,
|
||||
"rating": "D",
|
||||
"cost": 79444,
|
||||
"mass": 8,
|
||||
"power": 0.56,
|
||||
"weaponcapacity": 31,
|
||||
"weaponrecharge": 3.2,
|
||||
"enginecapacity": 22,
|
||||
"enginerecharge": 1.9,
|
||||
"systemcapacity": 22,
|
||||
"systemrecharge": 1.9
|
||||
},
|
||||
"5C": {
|
||||
"grp": "pd",
|
||||
"class": 5,
|
||||
"rating": "C",
|
||||
"cost": 198611,
|
||||
"mass": 20,
|
||||
"power": 0.62,
|
||||
"weaponcapacity": 34,
|
||||
"weaponrecharge": 3.6,
|
||||
"enginecapacity": 24,
|
||||
"enginerecharge": 2.1,
|
||||
"systemcapacity": 24,
|
||||
"systemrecharge": 2.1
|
||||
},
|
||||
"5B": {
|
||||
"grp": "pd",
|
||||
"class": 5,
|
||||
"rating": "B",
|
||||
"cost": 496527,
|
||||
"mass": 32,
|
||||
"power": 0.68,
|
||||
"weaponcapacity": 37,
|
||||
"weaponrecharge": 4,
|
||||
"enginecapacity": 26,
|
||||
"enginerecharge": 2.3,
|
||||
"systemcapacity": 26,
|
||||
"systemrecharge": 2.3
|
||||
},
|
||||
"5A": {
|
||||
"grp": "pd",
|
||||
"class": 5,
|
||||
"rating": "A",
|
||||
"cost": 1241317,
|
||||
"mass": 20,
|
||||
"power": 0.74,
|
||||
"weaponcapacity": 41,
|
||||
"weaponrecharge": 4.3,
|
||||
"enginecapacity": 29,
|
||||
"enginerecharge": 2.5,
|
||||
"systemcapacity": 29,
|
||||
"systemrecharge": 2.5
|
||||
},
|
||||
"4E": {
|
||||
"grp": "pd",
|
||||
"class": 4,
|
||||
"rating": "E",
|
||||
"cost": 11349,
|
||||
"mass": 10,
|
||||
"power": 0.45,
|
||||
"weaponcapacity": 22,
|
||||
"weaponrecharge": 2.3,
|
||||
"enginecapacity": 15,
|
||||
"enginerecharge": 1.3,
|
||||
"systemcapacity": 15,
|
||||
"systemrecharge": 1.3
|
||||
},
|
||||
"4D": {
|
||||
"grp": "pd",
|
||||
"class": 4,
|
||||
"rating": "D",
|
||||
"cost": 28373,
|
||||
"mass": 4,
|
||||
"power": 0.5,
|
||||
"weaponcapacity": 24,
|
||||
"weaponrecharge": 2.6,
|
||||
"enginecapacity": 17,
|
||||
"enginerecharge": 1.4,
|
||||
"systemcapacity": 17,
|
||||
"systemrecharge": 1.4
|
||||
},
|
||||
"4C": {
|
||||
"grp": "pd",
|
||||
"class": 4,
|
||||
"rating": "C",
|
||||
"cost": 70932,
|
||||
"mass": 10,
|
||||
"power": 0.56,
|
||||
"weaponcapacity": 27,
|
||||
"weaponrecharge": 2.9,
|
||||
"enginecapacity": 19,
|
||||
"enginerecharge": 1.6,
|
||||
"systemcapacity": 19,
|
||||
"systemrecharge": 1.6
|
||||
},
|
||||
"4B": {
|
||||
"grp": "pd",
|
||||
"class": 4,
|
||||
"rating": "B",
|
||||
"cost": 177331,
|
||||
"mass": 16,
|
||||
"power": 0.62,
|
||||
"weaponcapacity": 30,
|
||||
"weaponrecharge": 3.2,
|
||||
"enginecapacity": 21,
|
||||
"enginerecharge": 1.8,
|
||||
"systemcapacity": 21,
|
||||
"systemrecharge": 1.8
|
||||
},
|
||||
"4A": {
|
||||
"grp": "pd",
|
||||
"class": 4,
|
||||
"rating": "A",
|
||||
"cost": 443328,
|
||||
"mass": 10,
|
||||
"power": 0.67,
|
||||
"weaponcapacity": 32,
|
||||
"weaponrecharge": 3.5,
|
||||
"enginecapacity": 23,
|
||||
"enginerecharge": 1.9,
|
||||
"systemcapacity": 23,
|
||||
"systemrecharge": 1.9
|
||||
},
|
||||
"3E": {
|
||||
"grp": "pd",
|
||||
"class": 3,
|
||||
"rating": "E",
|
||||
"cost": 4053,
|
||||
"mass": 5,
|
||||
"power": 0.4,
|
||||
"weaponcapacity": 16,
|
||||
"weaponrecharge": 1.8,
|
||||
"enginecapacity": 12,
|
||||
"enginerecharge": 0.9,
|
||||
"systemcapacity": 12,
|
||||
"systemrecharge": 0.9
|
||||
},
|
||||
"3D": {
|
||||
"grp": "pd",
|
||||
"class": 3,
|
||||
"rating": "D",
|
||||
"cost": 10133,
|
||||
"mass": 2,
|
||||
"power": 0.45,
|
||||
"weaponcapacity": 18,
|
||||
"weaponrecharge": 2.1,
|
||||
"enginecapacity": 14,
|
||||
"enginerecharge": 1,
|
||||
"systemcapacity": 14,
|
||||
"systemrecharge": 1
|
||||
},
|
||||
"3C": {
|
||||
"grp": "pd",
|
||||
"class": 3,
|
||||
"rating": "C",
|
||||
"cost": 25333,
|
||||
"mass": 5,
|
||||
"power": 0.5,
|
||||
"weaponcapacity": 20,
|
||||
"weaponrecharge": 2.3,
|
||||
"enginecapacity": 15,
|
||||
"enginerecharge": 1.1,
|
||||
"systemcapacity": 15,
|
||||
"systemrecharge": 1.1
|
||||
},
|
||||
"3B": {
|
||||
"grp": "pd",
|
||||
"class": 3,
|
||||
"rating": "B",
|
||||
"cost": 63333,
|
||||
"mass": 8,
|
||||
"power": 0.55,
|
||||
"weaponcapacity": 22,
|
||||
"weaponrecharge": 2.5,
|
||||
"enginecapacity": 17,
|
||||
"enginerecharge": 1.2,
|
||||
"systemcapacity": 17,
|
||||
"systemrecharge": 1.2
|
||||
},
|
||||
"3A": {
|
||||
"grp": "pd",
|
||||
"class": 3,
|
||||
"rating": "A",
|
||||
"cost": 158331,
|
||||
"mass": 5,
|
||||
"power": 0.6,
|
||||
"weaponcapacity": 24,
|
||||
"weaponrecharge": 2.8,
|
||||
"enginecapacity": 18,
|
||||
"enginerecharge": 1.3,
|
||||
"systemcapacity": 18,
|
||||
"systemrecharge": 1.3
|
||||
},
|
||||
"2E": {
|
||||
"grp": "pd",
|
||||
"class": 2,
|
||||
"rating": "E",
|
||||
"cost": 1448,
|
||||
"mass": 2.5,
|
||||
"power": 0.36,
|
||||
"weaponcapacity": 12,
|
||||
"weaponrecharge": 1.4,
|
||||
"enginecapacity": 10,
|
||||
"enginerecharge": 0.6,
|
||||
"systemcapacity": 10,
|
||||
"systemrecharge": 0.6
|
||||
},
|
||||
"2D": {
|
||||
"grp": "pd",
|
||||
"class": 2,
|
||||
"rating": "D",
|
||||
"cost": 3619,
|
||||
"mass": 1,
|
||||
"power": 0.41,
|
||||
"weaponcapacity": 14,
|
||||
"weaponrecharge": 1.6,
|
||||
"enginecapacity": 11,
|
||||
"enginerecharge": 0.6,
|
||||
"systemcapacity": 11,
|
||||
"systemrecharge": 0.6
|
||||
},
|
||||
"2C": {
|
||||
"grp": "pd",
|
||||
"class": 2,
|
||||
"rating": "C",
|
||||
"cost": 9048,
|
||||
"mass": 2.5,
|
||||
"power": 0.45,
|
||||
"weaponcapacity": 15,
|
||||
"weaponrecharge": 1.8,
|
||||
"enginecapacity": 12,
|
||||
"enginerecharge": 0.7,
|
||||
"systemcapacity": 12,
|
||||
"systemrecharge": 0.7
|
||||
},
|
||||
"2B": {
|
||||
"grp": "pd",
|
||||
"class": 2,
|
||||
"rating": "B",
|
||||
"cost": 22619,
|
||||
"mass": 4,
|
||||
"power": 0.5,
|
||||
"weaponcapacity": 17,
|
||||
"weaponrecharge": 2,
|
||||
"enginecapacity": 13,
|
||||
"enginerecharge": 0.8,
|
||||
"systemcapacity": 13,
|
||||
"systemrecharge": 0.8
|
||||
},
|
||||
"2A": {
|
||||
"grp": "pd",
|
||||
"class": 2,
|
||||
"rating": "A",
|
||||
"cost": 56547,
|
||||
"mass": 2.5,
|
||||
"power": 0.54,
|
||||
"weaponcapacity": 18,
|
||||
"weaponrecharge": 2.2,
|
||||
"enginecapacity": 14,
|
||||
"enginerecharge": 0.8,
|
||||
"systemcapacity": 14,
|
||||
"systemrecharge": 0.8
|
||||
},
|
||||
"1E": {
|
||||
"grp": "pd",
|
||||
"class": 1,
|
||||
"rating": "E",
|
||||
"cost": 517,
|
||||
"mass": 1.3,
|
||||
"power": 0.32,
|
||||
"weaponcapacity": 10,
|
||||
"weaponrecharge": 1.2,
|
||||
"enginecapacity": 8,
|
||||
"enginerecharge": 0.4,
|
||||
"systemcapacity": 8,
|
||||
"systemrecharge": 0.4
|
||||
},
|
||||
"1D": {
|
||||
"grp": "pd",
|
||||
"class": 1,
|
||||
"rating": "D",
|
||||
"cost": 1293,
|
||||
"mass": 0.5,
|
||||
"power": 0.36,
|
||||
"weaponcapacity": 11,
|
||||
"weaponrecharge": 1.4,
|
||||
"enginecapacity": 9,
|
||||
"enginerecharge": 0.5,
|
||||
"systemcapacity": 9,
|
||||
"systemrecharge": 0.5
|
||||
},
|
||||
"1C": {
|
||||
"grp": "pd",
|
||||
"class": 1,
|
||||
"rating": "C",
|
||||
"cost": 3231,
|
||||
"mass": 1.3,
|
||||
"power": 0.4,
|
||||
"weaponcapacity": 12,
|
||||
"weaponrecharge": 1.5,
|
||||
"enginecapacity": 10,
|
||||
"enginerecharge": 0.5,
|
||||
"systemcapacity": 10,
|
||||
"systemrecharge": 0.5
|
||||
},
|
||||
"1B": {
|
||||
"grp": "pd",
|
||||
"class": 1,
|
||||
"rating": "B",
|
||||
"cost": 8078,
|
||||
"mass": 2,
|
||||
"power": 0.44,
|
||||
"weaponcapacity": 13,
|
||||
"weaponrecharge": 1.7,
|
||||
"enginecapacity": 11,
|
||||
"enginerecharge": 0.6,
|
||||
"systemcapacity": 11,
|
||||
"systemrecharge": 0.6
|
||||
},
|
||||
"1A": {
|
||||
"grp": "pd",
|
||||
"class": 1,
|
||||
"rating": "A",
|
||||
"cost": 20195,
|
||||
"mass": 1.3,
|
||||
"power": 0.48,
|
||||
"weaponcapacity": 14,
|
||||
"weaponrecharge": 1.8,
|
||||
"enginecapacity": 12,
|
||||
"enginerecharge": 0.6,
|
||||
"systemcapacity": 12,
|
||||
"systemrecharge": 0.6
|
||||
}
|
||||
"8E": { "grp": "pd", "class": 8, "rating": "E", "cost": 697584, "mass": 160, "power": 0.64, "weaponcapacity": 48, "weaponrecharge": 4.8, "enginecapacity": 32, "enginerecharge": 3.2, "systemcapacity": 32, "systemrecharge": 3.2 },
|
||||
"8D": { "grp": "pd", "class": 8, "rating": "D", "cost": 1743961, "mass": 64, "power": 0.72, "weaponcapacity": 54, "weaponrecharge": 5.4, "enginecapacity": 36, "enginerecharge": 3.6, "systemcapacity": 36, "systemrecharge": 3.6 },
|
||||
"8C": { "grp": "pd", "class": 8, "rating": "C", "cost": 4359903, "mass": 160, "power": 0.8, "weaponcapacity": 60, "weaponrecharge": 6, "enginecapacity": 40, "enginerecharge": 4, "systemcapacity": 40, "systemrecharge": 4 },
|
||||
"8B": { "grp": "pd", "class": 8, "rating": "B", "cost": 10899756, "mass": 256, "power": 0.88, "weaponcapacity": 66, "weaponrecharge": 6.6, "enginecapacity": 44, "enginerecharge": 4.4, "systemcapacity": 44, "systemrecharge": 4.4 },
|
||||
"8A": { "grp": "pd", "class": 8, "rating": "A", "cost": 27249391, "mass": 160, "power": 0.96, "weaponcapacity": 72, "weaponrecharge": 7.2, "enginecapacity": 48, "enginerecharge": 4.8, "systemcapacity": 48, "systemrecharge": 4.8 },
|
||||
"7E": { "grp": "pd", "class": 7, "rating": "E", "cost": 249137, "mass": 80, "power": 0.59, "weaponcapacity": 41, "weaponrecharge": 4.1, "enginecapacity": 27, "enginerecharge": 2.6, "systemcapacity": 27, "systemrecharge": 2.6 },
|
||||
"7D": { "grp": "pd", "class": 7, "rating": "D", "cost": 622843, "mass": 32, "power": 0.67, "weaponcapacity": 46, "weaponrecharge": 4.6, "enginecapacity": 31, "enginerecharge": 3, "systemcapacity": 31, "systemrecharge": 3 },
|
||||
"7C": { "grp": "pd", "class": 7, "rating": "C", "cost": 1557108, "mass": 80, "power": 0.74, "weaponcapacity": 51, "weaponrecharge": 5.1, "enginecapacity": 34, "enginerecharge": 3.3, "systemcapacity": 34, "systemrecharge": 3.3 },
|
||||
"7B": { "grp": "pd", "class": 7, "rating": "B", "cost": 3892770, "mass": 128, "power": 0.81, "weaponcapacity": 56, "weaponrecharge": 5.6, "enginecapacity": 37, "enginerecharge": 3.6, "systemcapacity": 37, "systemrecharge": 3.6 },
|
||||
"7A": { "grp": "pd", "class": 7, "rating": "A", "cost": 9731925, "mass": 80, "power": 0.89, "weaponcapacity": 61, "weaponrecharge": 6.1, "enginecapacity": 41, "enginerecharge": 4, "systemcapacity": 41, "systemrecharge": 4 },
|
||||
"6E": { "grp": "pd", "class": 6, "rating": "E", "cost": 88978, "mass": 40, "power": 0.54, "weaponcapacity": 34, "weaponrecharge": 3.4, "enginecapacity": 23, "enginerecharge": 2.2, "systemcapacity": 23, "systemrecharge": 2.2 },
|
||||
"6D": { "grp": "pd", "class": 6, "rating": "D", "cost": 222444, "mass": 16, "power": 0.61, "weaponcapacity": 38, "weaponrecharge": 3.9, "enginecapacity": 26, "enginerecharge": 2.4, "systemcapacity": 26, "systemrecharge": 2.4 },
|
||||
"6C": { "grp": "pd", "class": 6, "rating": "C", "cost": 556110, "mass": 40, "power": 0.68, "weaponcapacity": 42, "weaponrecharge": 4.3, "enginecapacity": 29, "enginerecharge": 2.7, "systemcapacity": 29, "systemrecharge": 2.7 },
|
||||
"6B": { "grp": "pd", "class": 6, "rating": "B", "cost": 1390275, "mass": 64, "power": 0.75, "weaponcapacity": 46, "weaponrecharge": 4.7, "enginecapacity": 32, "enginerecharge": 3, "systemcapacity": 32, "systemrecharge": 3 },
|
||||
"6A": { "grp": "pd", "class": 6, "rating": "A", "cost": 3475688, "mass": 40, "power": 0.82, "weaponcapacity": 50, "weaponrecharge": 5.2, "enginecapacity": 35, "enginerecharge": 3.2, "systemcapacity": 35, "systemrecharge": 3.2 },
|
||||
"5E": { "grp": "pd", "class": 5, "rating": "E", "cost": 31778, "mass": 20, "power": 0.5, "weaponcapacity": 27, "weaponrecharge": 2.9, "enginecapacity": 19, "enginerecharge": 1.7, "systemcapacity": 19, "systemrecharge": 1.7 },
|
||||
"5D": { "grp": "pd", "class": 5, "rating": "D", "cost": 79444, "mass": 8, "power": 0.56, "weaponcapacity": 31, "weaponrecharge": 3.2, "enginecapacity": 22, "enginerecharge": 1.9, "systemcapacity": 22, "systemrecharge": 1.9 },
|
||||
"5C": { "grp": "pd", "class": 5, "rating": "C", "cost": 198611, "mass": 20, "power": 0.62, "weaponcapacity": 34, "weaponrecharge": 3.6, "enginecapacity": 24, "enginerecharge": 2.1, "systemcapacity": 24, "systemrecharge": 2.1 },
|
||||
"5B": { "grp": "pd", "class": 5, "rating": "B", "cost": 496527, "mass": 32, "power": 0.68, "weaponcapacity": 37, "weaponrecharge": 4, "enginecapacity": 26, "enginerecharge": 2.3, "systemcapacity": 26, "systemrecharge": 2.3 },
|
||||
"5A": { "grp": "pd", "class": 5, "rating": "A", "cost": 1241317, "mass": 20, "power": 0.74, "weaponcapacity": 41, "weaponrecharge": 4.3, "enginecapacity": 29, "enginerecharge": 2.5, "systemcapacity": 29, "systemrecharge": 2.5 },
|
||||
"4E": { "grp": "pd", "class": 4, "rating": "E", "cost": 11349, "mass": 10, "power": 0.45, "weaponcapacity": 22, "weaponrecharge": 2.3, "enginecapacity": 15, "enginerecharge": 1.3, "systemcapacity": 15, "systemrecharge": 1.3 },
|
||||
"4D": { "grp": "pd", "class": 4, "rating": "D", "cost": 28373, "mass": 4, "power": 0.5, "weaponcapacity": 24, "weaponrecharge": 2.6, "enginecapacity": 17, "enginerecharge": 1.4, "systemcapacity": 17, "systemrecharge": 1.4 },
|
||||
"4C": { "grp": "pd", "class": 4, "rating": "C", "cost": 70932, "mass": 10, "power": 0.56, "weaponcapacity": 27, "weaponrecharge": 2.9, "enginecapacity": 19, "enginerecharge": 1.6, "systemcapacity": 19, "systemrecharge": 1.6 },
|
||||
"4B": { "grp": "pd", "class": 4, "rating": "B", "cost": 177331, "mass": 16, "power": 0.62, "weaponcapacity": 30, "weaponrecharge": 3.2, "enginecapacity": 21, "enginerecharge": 1.8, "systemcapacity": 21, "systemrecharge": 1.8 },
|
||||
"4A": { "grp": "pd", "class": 4, "rating": "A", "cost": 443328, "mass": 10, "power": 0.67, "weaponcapacity": 32, "weaponrecharge": 3.5, "enginecapacity": 23, "enginerecharge": 1.9, "systemcapacity": 23, "systemrecharge": 1.9 },
|
||||
"3E": { "grp": "pd", "class": 3, "rating": "E", "cost": 4053, "mass": 5, "power": 0.4, "weaponcapacity": 16, "weaponrecharge": 1.8, "enginecapacity": 12, "enginerecharge": 0.9, "systemcapacity": 12, "systemrecharge": 0.9 },
|
||||
"3D": { "grp": "pd", "class": 3, "rating": "D", "cost": 10133, "mass": 2, "power": 0.45, "weaponcapacity": 18, "weaponrecharge": 2.1, "enginecapacity": 14, "enginerecharge": 1, "systemcapacity": 14, "systemrecharge": 1 },
|
||||
"3C": { "grp": "pd", "class": 3, "rating": "C", "cost": 25333, "mass": 5, "power": 0.5, "weaponcapacity": 20, "weaponrecharge": 2.3, "enginecapacity": 15, "enginerecharge": 1.1, "systemcapacity": 15, "systemrecharge": 1.1 },
|
||||
"3B": { "grp": "pd", "class": 3, "rating": "B", "cost": 63333, "mass": 8, "power": 0.55, "weaponcapacity": 22, "weaponrecharge": 2.5, "enginecapacity": 17, "enginerecharge": 1.2, "systemcapacity": 17, "systemrecharge": 1.2 },
|
||||
"3A": { "grp": "pd", "class": 3, "rating": "A", "cost": 158331, "mass": 5, "power": 0.6, "weaponcapacity": 24, "weaponrecharge": 2.8, "enginecapacity": 18, "enginerecharge": 1.3, "systemcapacity": 18, "systemrecharge": 1.3 },
|
||||
"2E": { "grp": "pd", "class": 2, "rating": "E", "cost": 1448, "mass": 2.5, "power": 0.36, "weaponcapacity": 12, "weaponrecharge": 1.4, "enginecapacity": 10, "enginerecharge": 0.6, "systemcapacity": 10, "systemrecharge": 0.6 },
|
||||
"2D": { "grp": "pd", "class": 2, "rating": "D", "cost": 3619, "mass": 1, "power": 0.41, "weaponcapacity": 14, "weaponrecharge": 1.6, "enginecapacity": 11, "enginerecharge": 0.6, "systemcapacity": 11, "systemrecharge": 0.6 },
|
||||
"2C": { "grp": "pd", "class": 2, "rating": "C", "cost": 9048, "mass": 2.5, "power": 0.45, "weaponcapacity": 15, "weaponrecharge": 1.8, "enginecapacity": 12, "enginerecharge": 0.7, "systemcapacity": 12, "systemrecharge": 0.7 },
|
||||
"2B": { "grp": "pd", "class": 2, "rating": "B", "cost": 22619, "mass": 4, "power": 0.5, "weaponcapacity": 17, "weaponrecharge": 2, "enginecapacity": 13, "enginerecharge": 0.8, "systemcapacity": 13, "systemrecharge": 0.8 },
|
||||
"2A": { "grp": "pd", "class": 2, "rating": "A", "cost": 56547, "mass": 2.5, "power": 0.54, "weaponcapacity": 18, "weaponrecharge": 2.2, "enginecapacity": 14, "enginerecharge": 0.8, "systemcapacity": 14, "systemrecharge": 0.8 },
|
||||
"1E": { "grp": "pd", "class": 1, "rating": "E", "cost": 517, "mass": 1.3, "power": 0.32, "weaponcapacity": 10, "weaponrecharge": 1.2, "enginecapacity": 8, "enginerecharge": 0.4, "systemcapacity": 8, "systemrecharge": 0.4 },
|
||||
"1D": { "grp": "pd", "class": 1, "rating": "D", "cost": 1293, "mass": 0.5, "power": 0.36, "weaponcapacity": 11, "weaponrecharge": 1.4, "enginecapacity": 9, "enginerecharge": 0.5, "systemcapacity": 9, "systemrecharge": 0.5 },
|
||||
"1C": { "grp": "pd", "class": 1, "rating": "C", "cost": 3231, "mass": 1.3, "power": 0.4, "weaponcapacity": 12, "weaponrecharge": 1.5, "enginecapacity": 10, "enginerecharge": 0.5, "systemcapacity": 10, "systemrecharge": 0.5 },
|
||||
"1B": { "grp": "pd", "class": 1, "rating": "B", "cost": 8078, "mass": 2, "power": 0.44, "weaponcapacity": 13, "weaponrecharge": 1.7, "enginecapacity": 11, "enginerecharge": 0.6, "systemcapacity": 11, "systemrecharge": 0.6 },
|
||||
"1A": { "grp": "pd", "class": 1, "rating": "A", "cost": 20195, "mass": 1.3, "power": 0.48, "weaponcapacity": 14, "weaponrecharge": 1.8, "enginecapacity": 12, "enginerecharge": 0.6, "systemcapacity": 12, "systemrecharge": 0.6 }
|
||||
}
|
||||
@@ -1,302 +1,32 @@
|
||||
{
|
||||
"7E": {
|
||||
"grp": "t",
|
||||
"class": 7,
|
||||
"rating": "E",
|
||||
"cost": 633199,
|
||||
"mass": 80,
|
||||
"power": 6.08,
|
||||
"optmass": 1440,
|
||||
"maxmass": 2160
|
||||
},
|
||||
"7D": {
|
||||
"grp": "t",
|
||||
"class": 7,
|
||||
"rating": "D",
|
||||
"cost": 1899597,
|
||||
"mass": 32,
|
||||
"power": 6.84,
|
||||
"optmass": 1620,
|
||||
"maxmass": 2430
|
||||
},
|
||||
"7C": {
|
||||
"grp": "t",
|
||||
"class": 7,
|
||||
"rating": "C",
|
||||
"cost": 5698790,
|
||||
"mass": 80,
|
||||
"power": 7.6,
|
||||
"optmass": 1800,
|
||||
"maxmass": 2700
|
||||
},
|
||||
"7B": {
|
||||
"grp": "t",
|
||||
"class": 7,
|
||||
"rating": "B",
|
||||
"cost": 17096371,
|
||||
"mass": 128,
|
||||
"power": 8.36,
|
||||
"optmass": 1980,
|
||||
"maxmass": 2970
|
||||
},
|
||||
"7A": {
|
||||
"grp": "t",
|
||||
"class": 7,
|
||||
"rating": "A",
|
||||
"cost": 51289112,
|
||||
"mass": 80,
|
||||
"power": 9.12,
|
||||
"optmass": 2160,
|
||||
"maxmass": 3240
|
||||
},
|
||||
"6E": {
|
||||
"grp": "t",
|
||||
"class": 6,
|
||||
"rating": "E",
|
||||
"cost": 199747,
|
||||
"mass": 40,
|
||||
"power": 5.04,
|
||||
"optmass": 960,
|
||||
"maxmass": 1440
|
||||
},
|
||||
"6D": {
|
||||
"grp": "t",
|
||||
"class": 6,
|
||||
"rating": "D",
|
||||
"cost": 599242,
|
||||
"mass": 16,
|
||||
"power": 5.67,
|
||||
"optmass": 1080,
|
||||
"maxmass": 1620
|
||||
},
|
||||
"6C": {
|
||||
"grp": "t",
|
||||
"class": 6,
|
||||
"rating": "C",
|
||||
"cost": 1797726,
|
||||
"mass": 40,
|
||||
"power": 6.3,
|
||||
"optmass": 1200,
|
||||
"maxmass": 1800
|
||||
},
|
||||
"6B": {
|
||||
"grp": "t",
|
||||
"class": 6,
|
||||
"rating": "B",
|
||||
"cost": 5393177,
|
||||
"mass": 64,
|
||||
"power": 6.93,
|
||||
"optmass": 1320,
|
||||
"maxmass": 1980
|
||||
},
|
||||
"6A": {
|
||||
"grp": "t",
|
||||
"class": 6,
|
||||
"rating": "A",
|
||||
"cost": 16179531,
|
||||
"mass": 40,
|
||||
"power": 7.56,
|
||||
"optmass": 1440,
|
||||
"maxmass": 2160
|
||||
},
|
||||
"5E": {
|
||||
"grp": "t",
|
||||
"class": 5,
|
||||
"rating": "E",
|
||||
"cost": 63012,
|
||||
"mass": 20,
|
||||
"power": 4.08,
|
||||
"optmass": 560,
|
||||
"maxmass": 840
|
||||
},
|
||||
"5D": {
|
||||
"grp": "t",
|
||||
"class": 5,
|
||||
"rating": "D",
|
||||
"cost": 189035,
|
||||
"mass": 8,
|
||||
"power": 4.59,
|
||||
"optmass": 630,
|
||||
"maxmass": 945
|
||||
},
|
||||
"5C": {
|
||||
"grp": "t",
|
||||
"class": 5,
|
||||
"rating": "C",
|
||||
"cost": 567106,
|
||||
"mass": 20,
|
||||
"power": 5.1,
|
||||
"optmass": 700,
|
||||
"maxmass": 1050
|
||||
},
|
||||
"5B": {
|
||||
"grp": "t",
|
||||
"class": 5,
|
||||
"rating": "B",
|
||||
"cost": 1701318,
|
||||
"mass": 32,
|
||||
"power": 5.61,
|
||||
"optmass": 770,
|
||||
"maxmass": 1155
|
||||
},
|
||||
"5A": {
|
||||
"grp": "t",
|
||||
"class": 5,
|
||||
"rating": "A",
|
||||
"cost": 5103953,
|
||||
"mass": 20,
|
||||
"power": 6.12,
|
||||
"optmass": 840,
|
||||
"maxmass": 1260
|
||||
},
|
||||
"4E": {
|
||||
"grp": "t",
|
||||
"class": 4,
|
||||
"rating": "E",
|
||||
"cost": 19878,
|
||||
"mass": 10,
|
||||
"power": 3.82,
|
||||
"optmass": 280,
|
||||
"maxmass": 420
|
||||
},
|
||||
"4D": {
|
||||
"grp": "t",
|
||||
"class": 4,
|
||||
"rating": "D",
|
||||
"cost": 59633,
|
||||
"mass": 4,
|
||||
"power": 3.69,
|
||||
"optmass": 315,
|
||||
"maxmass": 473
|
||||
},
|
||||
"4C": {
|
||||
"grp": "t",
|
||||
"class": 4,
|
||||
"rating": "C",
|
||||
"cost": 178898,
|
||||
"mass": 10,
|
||||
"power": 4.1,
|
||||
"optmass": 350,
|
||||
"maxmass": 525
|
||||
},
|
||||
"4B": {
|
||||
"grp": "t",
|
||||
"class": 4,
|
||||
"rating": "B",
|
||||
"cost": 536693,
|
||||
"mass": 16,
|
||||
"power": 4.51,
|
||||
"optmass": 385,
|
||||
"maxmass": 578
|
||||
},
|
||||
"4A": {
|
||||
"grp": "t",
|
||||
"class": 4,
|
||||
"rating": "A",
|
||||
"cost": 1610080,
|
||||
"mass": 10,
|
||||
"power": 4.92,
|
||||
"optmass": 420,
|
||||
"maxmass": 630
|
||||
},
|
||||
"3E": {
|
||||
"grp": "t",
|
||||
"class": 3,
|
||||
"rating": "E",
|
||||
"cost": 6271,
|
||||
"mass": 5,
|
||||
"power": 2.48,
|
||||
"optmass": 80,
|
||||
"maxmass": 120
|
||||
},
|
||||
"3D": {
|
||||
"grp": "t",
|
||||
"class": 3,
|
||||
"rating": "D",
|
||||
"cost": 18812,
|
||||
"mass": 2,
|
||||
"power": 2.79,
|
||||
"optmass": 90,
|
||||
"maxmass": 135
|
||||
},
|
||||
"3C": {
|
||||
"grp": "t",
|
||||
"class": 3,
|
||||
"rating": "C",
|
||||
"cost": 56435,
|
||||
"mass": 5,
|
||||
"power": 3.1,
|
||||
"optmass": 100,
|
||||
"maxmass": 150
|
||||
},
|
||||
"3B": {
|
||||
"grp": "t",
|
||||
"class": 3,
|
||||
"rating": "B",
|
||||
"cost": 169304,
|
||||
"mass": 8,
|
||||
"power": 3.41,
|
||||
"optmass": 110,
|
||||
"maxmass": 165
|
||||
},
|
||||
"3A": {
|
||||
"grp": "t",
|
||||
"class": 3,
|
||||
"rating": "A",
|
||||
"cost": 507912,
|
||||
"mass": 5,
|
||||
"power": 3.72,
|
||||
"optmass": 120,
|
||||
"maxmass": 180
|
||||
},
|
||||
"2E": {
|
||||
"grp": "t",
|
||||
"class": 2,
|
||||
"rating": "E",
|
||||
"cost": 1978,
|
||||
"mass": 2.5,
|
||||
"power": 2,
|
||||
"optmass": 48,
|
||||
"maxmass": 72
|
||||
},
|
||||
"2D": {
|
||||
"grp": "t",
|
||||
"class": 2,
|
||||
"rating": "D",
|
||||
"cost": 5934,
|
||||
"mass": 1,
|
||||
"power": 2.25,
|
||||
"optmass": 54,
|
||||
"maxmass": 81
|
||||
},
|
||||
"2C": {
|
||||
"grp": "t",
|
||||
"class": 2,
|
||||
"rating": "C",
|
||||
"cost": 17803,
|
||||
"mass": 2.5,
|
||||
"power": 2.5,
|
||||
"optmass": 60,
|
||||
"maxmass": 90
|
||||
},
|
||||
"2B": {
|
||||
"grp": "t",
|
||||
"class": 2,
|
||||
"rating": "B",
|
||||
"cost": 53408,
|
||||
"mass": 4,
|
||||
"power": 2.75,
|
||||
"optmass": 66,
|
||||
"maxmass": 99
|
||||
},
|
||||
"2A": {
|
||||
"grp": "t",
|
||||
"class": 2,
|
||||
"rating": "A",
|
||||
"cost": 160224,
|
||||
"mass": 2.5,
|
||||
"power": 3,
|
||||
"optmass": 72,
|
||||
"maxmass": 108
|
||||
}
|
||||
"7E": { "grp": "t", "class": 7, "rating": "E", "cost": 633199, "mass": 80, "power": 6.08, "optmass": 1440, "maxmass": 2160 },
|
||||
"7D": { "grp": "t", "class": 7, "rating": "D", "cost": 1899597, "mass": 32, "power": 6.84, "optmass": 1620, "maxmass": 2430 },
|
||||
"7C": { "grp": "t", "class": 7, "rating": "C", "cost": 5698790, "mass": 80, "power": 7.6, "optmass": 1800, "maxmass": 2700 },
|
||||
"7B": { "grp": "t", "class": 7, "rating": "B", "cost": 17096371, "mass": 128, "power": 8.36, "optmass": 1980, "maxmass": 2970 },
|
||||
"7A": { "grp": "t", "class": 7, "rating": "A", "cost": 51289112, "mass": 80, "power": 9.12, "optmass": 2160, "maxmass": 3240 },
|
||||
"6E": { "grp": "t", "class": 6, "rating": "E", "cost": 199747, "mass": 40, "power": 5.04, "optmass": 960, "maxmass": 1440 },
|
||||
"6D": { "grp": "t", "class": 6, "rating": "D", "cost": 599242, "mass": 16, "power": 5.67, "optmass": 1080, "maxmass": 1620 },
|
||||
"6C": { "grp": "t", "class": 6, "rating": "C", "cost": 1797726, "mass": 40, "power": 6.3, "optmass": 1200, "maxmass": 1800 },
|
||||
"6B": { "grp": "t", "class": 6, "rating": "B", "cost": 5393177, "mass": 64, "power": 6.93, "optmass": 1320, "maxmass": 1980 },
|
||||
"6A": { "grp": "t", "class": 6, "rating": "A", "cost": 16179531, "mass": 40, "power": 7.56, "optmass": 1440, "maxmass": 2160 },
|
||||
"5E": { "grp": "t", "class": 5, "rating": "E", "cost": 63012, "mass": 20, "power": 4.08, "optmass": 560, "maxmass": 840 },
|
||||
"5D": { "grp": "t", "class": 5, "rating": "D", "cost": 189035, "mass": 8, "power": 4.59, "optmass": 630, "maxmass": 945 },
|
||||
"5C": { "grp": "t", "class": 5, "rating": "C", "cost": 567106, "mass": 20, "power": 5.1, "optmass": 700, "maxmass": 1050 },
|
||||
"5B": { "grp": "t", "class": 5, "rating": "B", "cost": 1701318, "mass": 32, "power": 5.61, "optmass": 770, "maxmass": 1155 },
|
||||
"5A": { "grp": "t", "class": 5, "rating": "A", "cost": 5103953, "mass": 20, "power": 6.12, "optmass": 840, "maxmass": 1260 },
|
||||
"4E": { "grp": "t", "class": 4, "rating": "E", "cost": 19878, "mass": 10, "power": 3.82, "optmass": 280, "maxmass": 420 },
|
||||
"4D": { "grp": "t", "class": 4, "rating": "D", "cost": 59633, "mass": 4, "power": 3.69, "optmass": 315, "maxmass": 473 },
|
||||
"4C": { "grp": "t", "class": 4, "rating": "C", "cost": 178898, "mass": 10, "power": 4.1, "optmass": 350, "maxmass": 525 },
|
||||
"4B": { "grp": "t", "class": 4, "rating": "B", "cost": 536693, "mass": 16, "power": 4.51, "optmass": 385, "maxmass": 578 },
|
||||
"4A": { "grp": "t", "class": 4, "rating": "A", "cost": 1610080, "mass": 10, "power": 4.92, "optmass": 420, "maxmass": 630 },
|
||||
"3E": { "grp": "t", "class": 3, "rating": "E", "cost": 6271, "mass": 5, "power": 2.48, "optmass": 80, "maxmass": 120 },
|
||||
"3D": { "grp": "t", "class": 3, "rating": "D", "cost": 18812, "mass": 2, "power": 2.79, "optmass": 90, "maxmass": 135 },
|
||||
"3C": { "grp": "t", "class": 3, "rating": "C", "cost": 56435, "mass": 5, "power": 3.1, "optmass": 100, "maxmass": 150 },
|
||||
"3B": { "grp": "t", "class": 3, "rating": "B", "cost": 169304, "mass": 8, "power": 3.41, "optmass": 110, "maxmass": 165 },
|
||||
"3A": { "grp": "t", "class": 3, "rating": "A", "cost": 507912, "mass": 5, "power": 3.72, "optmass": 120, "maxmass": 180 },
|
||||
"2E": { "grp": "t", "class": 2, "rating": "E", "cost": 1978, "mass": 2.5, "power": 2, "optmass": 48, "maxmass": 72 },
|
||||
"2D": { "grp": "t", "class": 2, "rating": "D", "cost": 5934, "mass": 1, "power": 2.25, "optmass": 54, "maxmass": 81 },
|
||||
"2C": { "grp": "t", "class": 2, "rating": "C", "cost": 17803, "mass": 2.5, "power": 2.5, "optmass": 60, "maxmass": 90 },
|
||||
"2B": { "grp": "t", "class": 2, "rating": "B", "cost": 53408, "mass": 4, "power": 2.75, "optmass": 66, "maxmass": 99 },
|
||||
"2A": { "grp": "t", "class": 2, "rating": "A", "cost": 160224, "mass": 2.5, "power": 3, "optmass": 72, "maxmass": 108 }
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Beam Lasers" : [
|
||||
"Beam Laser": [
|
||||
{
|
||||
"id": "0u",
|
||||
"grp": "bl",
|
||||
@@ -161,6 +161,23 @@
|
||||
"mjdps" : 5.49,
|
||||
"mjeps" : 1.29,
|
||||
"thermload": 2
|
||||
},
|
||||
{
|
||||
"id": "b0",
|
||||
"grp": "bl",
|
||||
"name": "Retributor",
|
||||
"class": 1,
|
||||
"rating": "E",
|
||||
"cost": 56145,
|
||||
"mass": 2,
|
||||
"power": 0.69,
|
||||
"mode": "F",
|
||||
"type": "T",
|
||||
"damage": 0,
|
||||
"armourpen": "A",
|
||||
"rof": null,
|
||||
"dps": 3,
|
||||
"thermload": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Burst Lasers": [
|
||||
"Burst Laser": [
|
||||
{
|
||||
"id": "14",
|
||||
"grp": "ul",
|
||||
@@ -161,6 +161,23 @@
|
||||
"mjeps" : 0.63,
|
||||
"ssdam" : 2.24,
|
||||
"thermload": 1
|
||||
},
|
||||
{
|
||||
"id": "cy",
|
||||
"grp": "ul",
|
||||
"name": "Cytoscrambler",
|
||||
"class": 1,
|
||||
"rating": "F",
|
||||
"cost": 8800,
|
||||
"mass": 2,
|
||||
"power": 0.65,
|
||||
"mode": "F",
|
||||
"type": "T",
|
||||
"damage": 2,
|
||||
"armourpen": "A",
|
||||
"rof": 1.6,
|
||||
"dps": 3,
|
||||
"thermload": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Cannons": [
|
||||
"Cannon": [
|
||||
{
|
||||
"id": "1q",
|
||||
"grp": "c",
|
||||
@@ -15,7 +15,6 @@
|
||||
"rof": 0.4,
|
||||
"dps": 5,
|
||||
"thermload": 2,
|
||||
"grp": "c",
|
||||
"clip": 5,
|
||||
"mjdps": 8.13,
|
||||
"ssdam" : 37.13,
|
||||
@@ -36,7 +35,6 @@
|
||||
"rof": 0.4,
|
||||
"dps": 4,
|
||||
"thermload": 2,
|
||||
"grp": "c",
|
||||
"clip": 5,
|
||||
"mjdps": 10.97,
|
||||
"ssdam" : 30.94,
|
||||
@@ -57,7 +55,6 @@
|
||||
"rof": 0.4,
|
||||
"dps": 4,
|
||||
"thermload": 2,
|
||||
"grp": "c",
|
||||
"clip": 5,
|
||||
"mjdps": 8.13,
|
||||
"ssdam" : 22.28,
|
||||
@@ -78,7 +75,6 @@
|
||||
"rof": 0.4,
|
||||
"dps": 4,
|
||||
"thermload": 1,
|
||||
"grp": "c",
|
||||
"clip": 5,
|
||||
"mjdps" : 7.95,
|
||||
"ssdam" : 21.04,
|
||||
@@ -99,7 +95,6 @@
|
||||
"rof": 0.3,
|
||||
"dps": 4,
|
||||
"thermload": 1,
|
||||
"grp": "c",
|
||||
"clip": 5,
|
||||
"mjdps" : 3.58,
|
||||
"ssdam" : 12.38,
|
||||
@@ -120,7 +115,6 @@
|
||||
"rof": 0.5,
|
||||
"dps": 4,
|
||||
"thermload": 1,
|
||||
"grp": "c",
|
||||
"clip": 5,
|
||||
"mjdps" : 6.00,
|
||||
"ssdam" : 15.47,
|
||||
@@ -141,7 +135,6 @@
|
||||
"rof": 0.5,
|
||||
"dps": 3,
|
||||
"thermload": 1,
|
||||
"grp": "c",
|
||||
"clip": 5,
|
||||
"mjdps" : 6.24,
|
||||
"ssdam" : 15.47,
|
||||
@@ -162,7 +155,6 @@
|
||||
"rof": 0.3,
|
||||
"dps": 3,
|
||||
"thermload": 1,
|
||||
"grp": "c",
|
||||
"clip": 5,
|
||||
"mjdps" : 2.41,
|
||||
"ssdam" : 7.74,
|
||||
@@ -183,7 +175,6 @@
|
||||
"rof": 0.5,
|
||||
"dps": 3,
|
||||
"thermload": 1,
|
||||
"grp": "c",
|
||||
"clip": 5,
|
||||
"mjdps" : 4.00,
|
||||
"ssdam" : 9.59,
|
||||
@@ -204,7 +195,6 @@
|
||||
"rof": 0.5,
|
||||
"dps": 3,
|
||||
"thermload": 1,
|
||||
"grp": "c",
|
||||
"clip": 5,
|
||||
"mjdps" : 3.80,
|
||||
"ssdam" : 8.97,
|
||||
@@ -225,7 +215,6 @@
|
||||
"rof": 0.4,
|
||||
"dps": 3,
|
||||
"thermload": 1,
|
||||
"grp": "c",
|
||||
"clip": 5,
|
||||
"mjdps" : 1.35,
|
||||
"ssdam" : 4.13,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Cargo Scanners": [
|
||||
"Cargo Scanner": [
|
||||
{
|
||||
"id": "0d",
|
||||
"grp": "cs",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Countermeasures": [
|
||||
"Countermeasure": [
|
||||
{
|
||||
"id": "00",
|
||||
"grp": "cm",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Fragment Cannons": [
|
||||
"Fragment Cannon": [
|
||||
{
|
||||
"id": "1t",
|
||||
"grp": "fc",
|
||||
@@ -15,7 +15,6 @@
|
||||
"rof": 4.5,
|
||||
"dps": 10,
|
||||
"thermload": 1,
|
||||
"grp": "fc",
|
||||
"clip": 3,
|
||||
"mjdps": 15.19,
|
||||
"ssdam" : 28.36,
|
||||
@@ -36,7 +35,6 @@
|
||||
"rof": 4.8,
|
||||
"dps": 10,
|
||||
"thermload": 1,
|
||||
"grp": "fc",
|
||||
"clip": 3,
|
||||
"mjdps" : 12.77,
|
||||
"ssdam" : 23.21,
|
||||
@@ -57,7 +55,6 @@
|
||||
"rof": 3.3,
|
||||
"dps": 9,
|
||||
"thermload": 1,
|
||||
"grp": "fc",
|
||||
"clip": 3,
|
||||
"mjdps" : 6.85,
|
||||
"ssdam" : 12.89,
|
||||
@@ -78,7 +75,6 @@
|
||||
"rof": 5,
|
||||
"dps": 9,
|
||||
"thermload": 1,
|
||||
"grp": "fc",
|
||||
"clip": 3,
|
||||
"mjdps" : 9.50,
|
||||
"ssdam" : 18.05,
|
||||
@@ -100,7 +96,6 @@
|
||||
"rof": 5.3,
|
||||
"dps": 9,
|
||||
"thermload": 1,
|
||||
"grp": "fc",
|
||||
"clip": 3,
|
||||
"ammo": 30
|
||||
},
|
||||
@@ -119,7 +114,6 @@
|
||||
"rof": 3.7,
|
||||
"dps": 9,
|
||||
"thermload": 1,
|
||||
"grp": "fc",
|
||||
"clip": 3,
|
||||
"ammo": 30
|
||||
},
|
||||
@@ -138,7 +132,6 @@
|
||||
"rof": 5.5,
|
||||
"dps": 8,
|
||||
"thermload": 1,
|
||||
"grp": "fc",
|
||||
"clip": 3,
|
||||
"mjdps" : 5.53,
|
||||
"ssdam" : 10.31,
|
||||
@@ -159,7 +152,6 @@
|
||||
"rof": 5.8,
|
||||
"dps": 7,
|
||||
"thermload": 1,
|
||||
"grp": "fc",
|
||||
"clip": 3,
|
||||
"mjdps" : 3.58,
|
||||
"ssdam" : 6.45,
|
||||
@@ -180,11 +172,29 @@
|
||||
"rof": 4,
|
||||
"dps": 6,
|
||||
"thermload": 1,
|
||||
"grp": "fc",
|
||||
"clip": 3,
|
||||
"mjdps" : 2.11,
|
||||
"ssdam" : 3.87,
|
||||
"ammo": 30
|
||||
},
|
||||
{
|
||||
"id": "pa",
|
||||
"grp": "fc",
|
||||
"name": "Pacifier",
|
||||
"class": 3,
|
||||
"rating": "C",
|
||||
"cost": 1400832,
|
||||
"mass": 8,
|
||||
"power": 1.02,
|
||||
"mode": "F",
|
||||
"type": "K",
|
||||
"damage": 3,
|
||||
"armourpen": "A",
|
||||
"rof": 4.5,
|
||||
"dps": 9,
|
||||
"thermload": 1,
|
||||
"clip": 3,
|
||||
"ammo": 30
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Frame Shift Wake Scanners": [
|
||||
"Frame Shift Wake Scanner": [
|
||||
{
|
||||
"id": "0i",
|
||||
"grp": "ws",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Kill Warrant Scanners": [
|
||||
"Kill Warrant Scanner": [
|
||||
{
|
||||
"id": "0n",
|
||||
"grp": "kw",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Mine Launchers": [
|
||||
"Mine Launcher": [
|
||||
{
|
||||
"id": "2j",
|
||||
"grp": "nl",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Mining Lasers": [
|
||||
"Mining Laser": [
|
||||
{
|
||||
"id": "2l",
|
||||
"grp": "ml",
|
||||
@@ -10,10 +10,7 @@
|
||||
"power": 0.5,
|
||||
"mode": "F",
|
||||
"armourpen": "D",
|
||||
"thermload": 3,
|
||||
"grp": "ml",
|
||||
"clip": 1,
|
||||
"ammo": 1
|
||||
"thermload": 3
|
||||
},
|
||||
{
|
||||
"id": "2m",
|
||||
@@ -25,10 +22,23 @@
|
||||
"power": 0.75,
|
||||
"mode": "F",
|
||||
"armourpen": "D",
|
||||
"thermload": 5,
|
||||
"thermload": 5
|
||||
},
|
||||
{
|
||||
"id": "ml",
|
||||
"grp": "ml",
|
||||
"clip": 1,
|
||||
"ammo": 1
|
||||
"name": "Mining Lance",
|
||||
"class": 1,
|
||||
"rating": "D",
|
||||
"cost": 13600,
|
||||
"mass": 2,
|
||||
"power": 0.7,
|
||||
"mode": "F",
|
||||
"type": "T",
|
||||
"damage": 3,
|
||||
"dps": 3,
|
||||
"armourpen": "D",
|
||||
"thermload": 3
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Missile Racks": [
|
||||
"Missile Rack": [
|
||||
{
|
||||
"id": "2f",
|
||||
"grp": "mr",
|
||||
@@ -15,7 +15,6 @@
|
||||
"rof": 2.5,
|
||||
"dps": 8,
|
||||
"thermload": 3,
|
||||
"grp": "mr",
|
||||
"clip": 12,
|
||||
"ammo": 24,
|
||||
"mjdps": 1.72,
|
||||
@@ -37,7 +36,6 @@
|
||||
"rof": 0.3,
|
||||
"dps": 3,
|
||||
"thermload": 3,
|
||||
"grp": "mr",
|
||||
"clip": 6,
|
||||
"ammo": 18,
|
||||
"mjdps": 0.57,
|
||||
@@ -59,7 +57,6 @@
|
||||
"rof": 2.5,
|
||||
"dps": 8,
|
||||
"thermload": 3,
|
||||
"grp": "mr",
|
||||
"clip": 8,
|
||||
"ammo": 16,
|
||||
"mjdps": 1.63,
|
||||
@@ -81,12 +78,32 @@
|
||||
"rof": 0.3,
|
||||
"dps": 3,
|
||||
"thermload": 3,
|
||||
"grp": "mr",
|
||||
"clip": 6,
|
||||
"ammo": 6,
|
||||
"mjdps": 0.57,
|
||||
"ssdam" : 2.58,
|
||||
"missile": "S"
|
||||
},
|
||||
{
|
||||
"id": "Ph",
|
||||
"grp": "mr",
|
||||
"name": "Pack-Hound",
|
||||
"class": 2,
|
||||
"rating": "B",
|
||||
"cost": 1000832,
|
||||
"mass": 4,
|
||||
"power": 1.2,
|
||||
"mode": "F",
|
||||
"type": "E",
|
||||
"damage": 3,
|
||||
"armourpen": "F",
|
||||
"rof": 0.5,
|
||||
"dps": 4,
|
||||
"thermload": 3,
|
||||
"grp": "mr",
|
||||
"clip": 12,
|
||||
"ammo": 120,
|
||||
"missile": "S"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Multi-cannons": [
|
||||
"Multi-cannon": [
|
||||
{
|
||||
"id": "26",
|
||||
"grp": "mc",
|
||||
@@ -15,7 +15,6 @@
|
||||
"rof": 7,
|
||||
"dps": 4,
|
||||
"thermload": 1,
|
||||
"grp": "mc",
|
||||
"clip": 90,
|
||||
"mjdps" : 6.02,
|
||||
"ssdam" : 1.20,
|
||||
@@ -36,7 +35,6 @@
|
||||
"rof": 7.5,
|
||||
"dps": 4,
|
||||
"thermload": 1,
|
||||
"grp": "mc",
|
||||
"clip": 90,
|
||||
"mjdps" : 5.59,
|
||||
"ssdam" : 1.03,
|
||||
@@ -57,7 +55,6 @@
|
||||
"rof": 5.3,
|
||||
"dps": 3,
|
||||
"thermload": 1,
|
||||
"grp": "mc",
|
||||
"clip": 90,
|
||||
"mjdps" : 2.15,
|
||||
"ssdam" : 0.52,
|
||||
@@ -78,7 +75,6 @@
|
||||
"rof": 8,
|
||||
"dps": 3,
|
||||
"thermload": 1,
|
||||
"grp": "mc",
|
||||
"clip": 90,
|
||||
"mjdps" : 3.75,
|
||||
"ssdam" : 0.69,
|
||||
@@ -99,7 +95,6 @@
|
||||
"rof": 8.5,
|
||||
"dps": 3,
|
||||
"thermload": 1,
|
||||
"grp": "mc",
|
||||
"clip": 90,
|
||||
"mjdps" : 2.03,
|
||||
"ssdam" : 0.34,
|
||||
@@ -120,11 +115,29 @@
|
||||
"rof": 6,
|
||||
"dps": 2,
|
||||
"thermload": 1,
|
||||
"grp": "mc",
|
||||
"clip": 90,
|
||||
"mjdps" : 1.54,
|
||||
"ssdam" : 0.34,
|
||||
"ammo": 2100
|
||||
},
|
||||
{
|
||||
"id": "e0",
|
||||
"grp": "mc",
|
||||
"name": "Enforcer",
|
||||
"class": 1,
|
||||
"rating": "F",
|
||||
"cost": 13984,
|
||||
"mass": 2,
|
||||
"power": 0.28,
|
||||
"mode": "F",
|
||||
"type": "K",
|
||||
"damage": 4,
|
||||
"armourpen": "A",
|
||||
"rof": 4.3,
|
||||
"dps": 4,
|
||||
"thermload": 1,
|
||||
"clip": 60,
|
||||
"ammo": 1000
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Plasma Accelerators": [
|
||||
"Plasma Accelerator": [
|
||||
{
|
||||
"id": "1g",
|
||||
"grp": "pa",
|
||||
@@ -15,7 +15,6 @@
|
||||
"rof": 0.3,
|
||||
"dps": 4,
|
||||
"thermload": 10,
|
||||
"grp": "pa",
|
||||
"clip": 5,
|
||||
"mjdps" : 6.89,
|
||||
"ssdam" : 27.85,
|
||||
@@ -36,7 +35,6 @@
|
||||
"rof": 0.3,
|
||||
"dps": 4,
|
||||
"thermload": 8,
|
||||
"grp": "pa",
|
||||
"clip": 5,
|
||||
"mjdps" : 20.98,
|
||||
"ssdam" : 92.82,
|
||||
@@ -57,11 +55,29 @@
|
||||
"rof": 0.3,
|
||||
"dps": 5,
|
||||
"thermload": 10,
|
||||
"grp": "pa",
|
||||
"clip": 5,
|
||||
"mjdps" : 25.55,
|
||||
"ssdam" : 123.76,
|
||||
"ammo": 100
|
||||
},
|
||||
{
|
||||
"id": "Ap",
|
||||
"grp": "pa",
|
||||
"name": "Advanced",
|
||||
"class": 3,
|
||||
"rating": "B",
|
||||
"cost": 4119120,
|
||||
"mass": 8,
|
||||
"power": 1.97,
|
||||
"mode": "F",
|
||||
"type": "TK",
|
||||
"damage": 8,
|
||||
"armourpen": "A",
|
||||
"rof": 0.6,
|
||||
"dps": 4,
|
||||
"thermload": 4,
|
||||
"clip": 20,
|
||||
"ammo": 300
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Pulse Lasers": [
|
||||
"Pulse Laser": [
|
||||
{
|
||||
"id": "1d",
|
||||
"grp": "pl",
|
||||
@@ -170,6 +170,23 @@
|
||||
"mjeps" : 0.51,
|
||||
"ssdam" : 1.07,
|
||||
"thermload": 1
|
||||
},
|
||||
{
|
||||
"id": "PL",
|
||||
"grp": "pl",
|
||||
"name": "Distruptor",
|
||||
"class": 2,
|
||||
"rating": "E",
|
||||
"cost": 26400,
|
||||
"mass": 4,
|
||||
"power": 0.7,
|
||||
"mode": "F",
|
||||
"type": "T",
|
||||
"damage": 2,
|
||||
"armourpen": "A",
|
||||
"rof": 1.6,
|
||||
"dps": 2,
|
||||
"thermload": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Rail Guns": [
|
||||
"Rail Gun": [
|
||||
{
|
||||
"id": "29",
|
||||
"grp": "rg",
|
||||
@@ -15,7 +15,6 @@
|
||||
"rof": 0.6,
|
||||
"dps": 4,
|
||||
"thermload": 7,
|
||||
"grp": "rg",
|
||||
"clip": 1,
|
||||
"mjdps" : 13.75,
|
||||
"ssdam" : 24.75,
|
||||
@@ -36,11 +35,29 @@
|
||||
"rof": 0.5,
|
||||
"dps": 4,
|
||||
"thermload": 10,
|
||||
"grp": "rg",
|
||||
"clip": 1,
|
||||
"mjdps" : 21.66,
|
||||
"ssdam" : 43.32,
|
||||
"ammo": 30
|
||||
},
|
||||
{
|
||||
"id": "ih",
|
||||
"grp": "rg",
|
||||
"name": "Imperial Hammer",
|
||||
"class": 2,
|
||||
"rating": "B",
|
||||
"cost": 619200,
|
||||
"mass": 4,
|
||||
"power": 1.63,
|
||||
"mode": "F",
|
||||
"type": "TK",
|
||||
"damage": 5,
|
||||
"armourpen": "A",
|
||||
"rof": 0.6,
|
||||
"dps": 5,
|
||||
"thermload": 3,
|
||||
"clip": 3,
|
||||
"ammo": 90
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Shield Boosters": [
|
||||
"Shield Booster": [
|
||||
{
|
||||
"id": "08",
|
||||
"grp": "sb",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Torpedo Pylons": [
|
||||
"Torpedo Pylon": [
|
||||
{
|
||||
"id": "2h",
|
||||
"grp": "tp",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Auto Field-Maintenance Units": [
|
||||
"Auto Field-Maintenance Unit": [
|
||||
{
|
||||
"id": "1f",
|
||||
"grp": "am",
|
||||
|
||||
@@ -1,76 +1,12 @@
|
||||
{
|
||||
"Cargo Racks": [
|
||||
{
|
||||
"id": "07",
|
||||
"grp": "cr",
|
||||
"name": "Cargo Rack (256)",
|
||||
"class": 8,
|
||||
"rating": "E",
|
||||
"cost": 3829866,
|
||||
"capacity": 256
|
||||
},
|
||||
{
|
||||
"id": "06",
|
||||
"grp": "cr",
|
||||
"name": "Cargo Rack (128)",
|
||||
"class": 7,
|
||||
"rating": "E",
|
||||
"cost": 1178420,
|
||||
"capacity": 128
|
||||
},
|
||||
{
|
||||
"id": "05",
|
||||
"grp": "cr",
|
||||
"name": "Cargo Rack (64)",
|
||||
"class": 6,
|
||||
"rating": "E",
|
||||
"cost": 362591,
|
||||
"capacity": 64
|
||||
},
|
||||
{
|
||||
"id": "04",
|
||||
"grp": "cr",
|
||||
"name": "Cargo Rack (32)",
|
||||
"class": 5,
|
||||
"rating": "E",
|
||||
"cost": 111566,
|
||||
"capacity": 32
|
||||
},
|
||||
{
|
||||
"id": "03",
|
||||
"grp": "cr",
|
||||
"name": "Cargo Rack (16)",
|
||||
"class": 4,
|
||||
"rating": "E",
|
||||
"cost": 34328,
|
||||
"capacity": 16
|
||||
},
|
||||
{
|
||||
"id": "02",
|
||||
"grp": "cr",
|
||||
"name": "Cargo Rack (8)",
|
||||
"class": 3,
|
||||
"rating": "E",
|
||||
"cost": 10563,
|
||||
"capacity": 8
|
||||
},
|
||||
{
|
||||
"id": "01",
|
||||
"grp": "cr",
|
||||
"name": "Cargo Rack (4)",
|
||||
"class": 2,
|
||||
"rating": "E",
|
||||
"cost": 3250,
|
||||
"capacity": 4
|
||||
},
|
||||
{
|
||||
"id": "00",
|
||||
"grp": "cr",
|
||||
"name": "Cargo Rack (2)",
|
||||
"class": 1,
|
||||
"rating": "E",
|
||||
"cost": 1000,
|
||||
"capacity": 2
|
||||
}
|
||||
"Cargo Rack": [
|
||||
{ "id": "00", "grp": "cr", "class": 1, "rating": "E", "cost": 1000, "capacity": 2 },
|
||||
{ "id": "01", "grp": "cr", "class": 2, "rating": "E", "cost": 3250, "capacity": 4 },
|
||||
{ "id": "02", "grp": "cr", "class": 3, "rating": "E", "cost": 10563, "capacity": 8 },
|
||||
{ "id": "03", "grp": "cr", "class": 4, "rating": "E", "cost": 34328, "capacity": 16 },
|
||||
{ "id": "04", "grp": "cr", "class": 5, "rating": "E", "cost": 111566, "capacity": 32 },
|
||||
{ "id": "05", "grp": "cr", "class": 6, "rating": "E", "cost": 362591, "capacity": 64 },
|
||||
{ "id": "06", "grp": "cr", "class": 7, "rating": "E", "cost": 1178420, "capacity": 128 },
|
||||
{ "id": "07", "grp": "cr", "class": 8, "rating": "E", "cost": 3829866, "capacity": 256 }
|
||||
]
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Collector Limpet Ctrl": [
|
||||
"Collector Limpet Controller": [
|
||||
{ "id": "Cf", "grp":"cc", "class":7, "rating":"E", "cost": 437400, "mass": 32.0, "power":0.41, "range":1.36, "maximum": 4, "time":300 },
|
||||
{ "id": "Cg", "grp":"cc", "class":7, "rating":"D", "cost": 874800, "mass": 32.0, "power":0.55, "range":1.02, "maximum": 4, "time":600 },
|
||||
{ "id": "Ch", "grp":"cc", "class":7, "rating":"C", "cost":1749600, "mass": 80.0, "power":0.69, "range":1.70, "maximum": 4, "time":510 },
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Docking Computers": [
|
||||
"Docking Computer": [
|
||||
{
|
||||
"id": "24",
|
||||
"grp": "dc",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"FSD Interdictors": [
|
||||
"FSD Interdictor": [
|
||||
{
|
||||
"id": "6p",
|
||||
"grp": "fi",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Fuel Scoops": [
|
||||
"Fuel Scoop": [
|
||||
{
|
||||
"id": "3q",
|
||||
"grp": "fs",
|
||||
@@ -1,27 +1,27 @@
|
||||
{
|
||||
"Fuel Transfer Limpet Ctrl": [
|
||||
{ "id": "Ff", "grp":"fx", "class":7, "rating":"E", "cost": 437400, "mass": 80.0, "power":-0.55, "range":1.02, "maximum": 8 },
|
||||
{ "id": "Fg", "grp":"fx", "class":7, "rating":"D", "cost": 874800, "mass": 32.0, "power":-0.41, "range":1.36, "maximum": 8 },
|
||||
{ "id": "Fh", "grp":"fx", "class":7, "rating":"C", "cost":1749600, "mass": 80.0, "power":-0.69, "range":1.70, "maximum": 8 },
|
||||
{ "id": "Fi", "grp":"fx", "class":7, "rating":"B", "cost":3499200, "mass":128.0, "power":-0.97, "range":2.04, "maximum": 8 },
|
||||
{ "id": "Fj", "grp":"fx", "class":7, "rating":"A", "cost":6998400, "mass": 80.0, "power":-0.83, "range":2.38, "maximum": 8 },
|
||||
"Fuel Transfer Limpet Controller": [
|
||||
{ "id": "Ff", "grp":"fx", "class":7, "rating":"E", "cost": 437400, "mass": 80.0, "power":0.55, "range":1.02, "maximum": 8 },
|
||||
{ "id": "Fg", "grp":"fx", "class":7, "rating":"D", "cost": 874800, "mass": 32.0, "power":0.41, "range":1.36, "maximum": 8 },
|
||||
{ "id": "Fh", "grp":"fx", "class":7, "rating":"C", "cost":1749600, "mass": 80.0, "power":0.69, "range":1.70, "maximum": 8 },
|
||||
{ "id": "Fi", "grp":"fx", "class":7, "rating":"B", "cost":3499200, "mass":128.0, "power":0.97, "range":2.04, "maximum": 8 },
|
||||
{ "id": "Fj", "grp":"fx", "class":7, "rating":"A", "cost":6998400, "mass": 80.0, "power":0.83, "range":2.38, "maximum": 8 },
|
||||
|
||||
{ "id": "Fa", "grp":"fx", "class":5, "rating":"E", "cost": 48600, "mass": 20.0, "power":-0.40, "range":0.78, "maximum": 4 },
|
||||
{ "id": "Fb", "grp":"fx", "class":5, "rating":"D", "cost": 97200, "mass": 8.0, "power":-0.30, "range":1.04, "maximum": 4 },
|
||||
{ "id": "Fc", "grp":"fx", "class":5, "rating":"C", "cost": 194400, "mass": 20.0, "power":-0.50, "range":1.30, "maximum": 4 },
|
||||
{ "id": "Fd", "grp":"fx", "class":5, "rating":"B", "cost": 388800, "mass": 32.0, "power":-0.97, "range":1.56, "maximum": 4 },
|
||||
{ "id": "Fe", "grp":"fx", "class":5, "rating":"A", "cost": 777600, "mass": 20.0, "power":-0.60, "range":1.82, "maximum": 4 },
|
||||
{ "id": "Fa", "grp":"fx", "class":5, "rating":"E", "cost": 48600, "mass": 20.0, "power":0.40, "range":0.78, "maximum": 4 },
|
||||
{ "id": "Fb", "grp":"fx", "class":5, "rating":"D", "cost": 97200, "mass": 8.0, "power":0.30, "range":1.04, "maximum": 4 },
|
||||
{ "id": "Fc", "grp":"fx", "class":5, "rating":"C", "cost": 194400, "mass": 20.0, "power":0.50, "range":1.30, "maximum": 4 },
|
||||
{ "id": "Fd", "grp":"fx", "class":5, "rating":"B", "cost": 388800, "mass": 32.0, "power":0.97, "range":1.56, "maximum": 4 },
|
||||
{ "id": "Fe", "grp":"fx", "class":5, "rating":"A", "cost": 777600, "mass": 20.0, "power":0.60, "range":1.82, "maximum": 4 },
|
||||
|
||||
{ "id": "F5", "grp":"fx", "class":3, "rating":"E", "cost": 5400, "mass": 5.0, "power":-0.27, "range":0.66, "maximum": 2 },
|
||||
{ "id": "F6", "grp":"fx", "class":3, "rating":"D", "cost": 10800, "mass": 2.0, "power":-0.20, "range":0.88, "maximum": 2 },
|
||||
{ "id": "F7", "grp":"fx", "class":3, "rating":"C", "cost": 21600, "mass": 5.0, "power":-0.34, "range":1.10, "maximum": 2 },
|
||||
{ "id": "F8", "grp":"fx", "class":3, "rating":"B", "cost": 43200, "mass": 8.0, "power":-0.48, "range":1.32, "maximum": 2 },
|
||||
{ "id": "F9", "grp":"fx", "class":3, "rating":"A", "cost": 86400, "mass": 5.0, "power":-0.41, "range":1.54, "maximum": 2 },
|
||||
{ "id": "F5", "grp":"fx", "class":3, "rating":"E", "cost": 5400, "mass": 5.0, "power":0.27, "range":0.66, "maximum": 2 },
|
||||
{ "id": "F6", "grp":"fx", "class":3, "rating":"D", "cost": 10800, "mass": 2.0, "power":0.20, "range":0.88, "maximum": 2 },
|
||||
{ "id": "F7", "grp":"fx", "class":3, "rating":"C", "cost": 21600, "mass": 5.0, "power":0.34, "range":1.10, "maximum": 2 },
|
||||
{ "id": "F8", "grp":"fx", "class":3, "rating":"B", "cost": 43200, "mass": 8.0, "power":0.48, "range":1.32, "maximum": 2 },
|
||||
{ "id": "F9", "grp":"fx", "class":3, "rating":"A", "cost": 86400, "mass": 5.0, "power":0.41, "range":1.54, "maximum": 2 },
|
||||
|
||||
{ "id": "F0", "grp":"fx", "class":1, "rating":"E", "cost": 600, "mass": 1.3, "power":-0.18, "range":0.60, "maximum": 1 },
|
||||
{ "id": "F1", "grp":"fx", "class":1, "rating":"D", "cost": 1200, "mass": 0.5, "power":-0.14, "range":0.80, "maximum": 1 },
|
||||
{ "id": "F2", "grp":"fx", "class":1, "rating":"C", "cost": 2400, "mass": 1.3, "power":-0.23, "range":1.00, "maximum": 1 },
|
||||
{ "id": "F3", "grp":"fx", "class":1, "rating":"B", "cost": 4800, "mass": 2.0, "power":-0.32, "range":1.20, "maximum": 1 },
|
||||
{ "id": "F4", "grp":"fx", "class":1, "rating":"A", "cost": 9600, "mass": 1.3, "power":-0.28, "range":1.40, "maximum": 1 }
|
||||
{ "id": "F0", "grp":"fx", "class":1, "rating":"E", "cost": 600, "mass": 1.3, "power":0.18, "range":0.60, "maximum": 1 },
|
||||
{ "id": "F1", "grp":"fx", "class":1, "rating":"D", "cost": 1200, "mass": 0.5, "power":0.14, "range":0.80, "maximum": 1 },
|
||||
{ "id": "F2", "grp":"fx", "class":1, "rating":"C", "cost": 2400, "mass": 1.3, "power":0.23, "range":1.00, "maximum": 1 },
|
||||
{ "id": "F3", "grp":"fx", "class":1, "rating":"B", "cost": 4800, "mass": 2.0, "power":0.32, "range":1.20, "maximum": 1 },
|
||||
{ "id": "F4", "grp":"fx", "class":1, "rating":"A", "cost": 9600, "mass": 1.3, "power":0.28, "range":1.40, "maximum": 1 }
|
||||
]
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Hatch Breaker Limpet Ctrl": [
|
||||
"Hatch Breaker Limpet Controller": [
|
||||
{
|
||||
"id": "7d",
|
||||
"grp": "hb",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Hull Reinforcement Packages": [
|
||||
"Hull Reinforcement Package": [
|
||||
{
|
||||
"id": "2e",
|
||||
"grp": "hr",
|
||||
|
||||
@@ -1,52 +1,12 @@
|
||||
{
|
||||
"Fuel Tank": [
|
||||
{
|
||||
"id": "f1",
|
||||
"grp": "ft",
|
||||
"class": 1,
|
||||
"rating": "C",
|
||||
"cost": 1000,
|
||||
"capacity": 2
|
||||
},
|
||||
{
|
||||
"id": "f2",
|
||||
"grp": "ft",
|
||||
"class": 2,
|
||||
"rating": "C",
|
||||
"cost": 3750,
|
||||
"capacity": 4
|
||||
},
|
||||
{
|
||||
"id": "f3",
|
||||
"grp": "ft",
|
||||
"class": 3,
|
||||
"rating": "C",
|
||||
"cost": 7063,
|
||||
"capacity": 8
|
||||
},
|
||||
{
|
||||
"id": "f4",
|
||||
"grp": "ft",
|
||||
"class": 4,
|
||||
"rating": "C",
|
||||
"cost": 24734,
|
||||
"capacity": 16
|
||||
},
|
||||
{
|
||||
"id": "f5",
|
||||
"grp": "ft",
|
||||
"class": 5,
|
||||
"rating": "C",
|
||||
"cost": 97754,
|
||||
"capacity": 32
|
||||
},
|
||||
{
|
||||
"id": "f6",
|
||||
"grp": "ft",
|
||||
"class": 6,
|
||||
"rating": "C",
|
||||
"cost": 341577,
|
||||
"capacity": 64
|
||||
}
|
||||
{ "id": "f1", "grp": "ft", "class": 1, "rating": "C", "cost": 1000, "capacity": 2 },
|
||||
{ "id": "f2", "grp": "ft", "class": 2, "rating": "C", "cost": 3750, "capacity": 4 },
|
||||
{ "id": "f3", "grp": "ft", "class": 3, "rating": "C", "cost": 7063, "capacity": 8 },
|
||||
{ "id": "f4", "grp": "ft", "class": 4, "rating": "C", "cost": 24734, "capacity": 16 },
|
||||
{ "id": "f5", "grp": "ft", "class": 5, "rating": "C", "cost": 97754, "capacity": 32 },
|
||||
{ "id": "f6", "grp": "ft", "class": 6, "rating": "C", "cost": 341577, "capacity": 64 },
|
||||
{ "id": "f7", "grp": "ft", "class": 7, "rating": "C", "cost": 1780900, "capacity": 128 },
|
||||
{ "id": "f8", "grp": "ft", "class": 8, "rating": "C", "cost": 5428400, "capacity": 256 }
|
||||
]
|
||||
}
|
||||
11
data/components/internal/pristmatic_shield_generator.json
Normal file
11
data/components/internal/pristmatic_shield_generator.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"Prismatic Shield Generator": [
|
||||
{ "id": "p6", "grp": "psg", "class": 1, "rating": "A", "cost": 132195, "mass": 2.5, "power": 2.52, "minmass": 13, "optmass": 25, "maxmass": 63, "minmul": 2.04, "optmul": 1.44, "maxmul": 0.84 },
|
||||
{ "id": "p5", "grp": "psg", "class": 2, "rating": "A", "cost": 240336, "mass": 5, "power": 3.15, "minmass": 23, "optmass": 55, "maxmass": 138, "minmul": 2.04, "optmul": 1.44, "maxmul": 0.84 },
|
||||
{ "id": "p4", "grp": "psg", "class": 3, "rating": "A", "cost": 761868, "mass": 10, "power": 3.78, "minmass": 83, "optmass": 165, "maxmass": 413, "minmul": 2.04, "optmul": 1.44, "maxmul": 0.84 },
|
||||
{ "id": "p3", "grp": "psg", "class": 4, "rating": "A", "cost": 2415120, "mass": 20, "power": 4.62, "minmass": 143, "optmass": 285, "maxmass": 713, "minmul": 2.04, "optmul": 1.44, "maxmul": 0.84 },
|
||||
{ "id": "p2", "grp": "psg", "class": 5, "rating": "A", "cost": 7655930, "mass": 40, "power": 5.46, "minmass": 203, "optmass": 405, "maxmass": 1013, "minmul": 2.04, "optmul": 1.44, "maxmul": 0.84 },
|
||||
{ "id": "p1", "grp": "psg", "class": 6, "rating": "A", "cost": 24269297, "mass": 80, "power": 6.51, "minmass": 270, "optmass": 540, "maxmass": 1350, "minmul": 2.04, "optmul": 1.44, "maxmul": 0.84 },
|
||||
{ "id": "p0", "grp": "psg", "class": 7, "rating": "A", "cost": 76933668, "mass": 160, "power": 7.35, "minmass": 530, "optmass": 1060, "maxmass": 2650, "minmul": 2.04, "optmul": 1.44, "maxmul": 0.84 }
|
||||
]
|
||||
}
|
||||
@@ -1,27 +1,27 @@
|
||||
{
|
||||
"Prospector Limpet Ctrl": [
|
||||
{ "id": "Pf", "grp":"pc", "class":7, "rating":"E", "cost": 437400, "mass": 80.0, "power":-0.55, "range": 5.10, "maximum": 8 },
|
||||
{ "id": "Pg", "grp":"pc", "class":7, "rating":"D", "cost": 874800, "mass": 32.0, "power":-0.41, "range": 6.80, "maximum": 8 },
|
||||
{ "id": "Ph", "grp":"pc", "class":7, "rating":"C", "cost":1749600, "mass": 80.0, "power":-0.69, "range": 8.50, "maximum": 8 },
|
||||
{ "id": "Pi", "grp":"pc", "class":7, "rating":"B", "cost":3499200, "mass":128.0, "power":-0.97, "range":10.20, "maximum": 8 },
|
||||
{ "id": "Pj", "grp":"pc", "class":7, "rating":"A", "cost":6998400, "mass": 80.0, "power":-0.83, "range":11.90, "maximum": 8 },
|
||||
"Prospector Limpet Controller": [
|
||||
{ "id": "Pf", "grp":"pc", "class":7, "rating":"E", "cost": 437400, "mass": 80.0, "power":0.55, "range": 5.10, "maximum": 8 },
|
||||
{ "id": "Pg", "grp":"pc", "class":7, "rating":"D", "cost": 874800, "mass": 32.0, "power":0.41, "range": 6.80, "maximum": 8 },
|
||||
{ "id": "Ph", "grp":"pc", "class":7, "rating":"C", "cost":1749600, "mass": 80.0, "power":0.69, "range": 8.50, "maximum": 8 },
|
||||
{ "id": "Pi", "grp":"pc", "class":7, "rating":"B", "cost":3499200, "mass":128.0, "power":0.97, "range":10.20, "maximum": 8 },
|
||||
{ "id": "Pj", "grp":"pc", "class":7, "rating":"A", "cost":6998400, "mass": 80.0, "power":0.83, "range":11.90, "maximum": 8 },
|
||||
|
||||
{ "id": "Pa", "grp":"pc", "class":5, "rating":"E", "cost": 48600, "mass": 20.0, "power":-0.40, "range": 3.90, "maximum": 4 },
|
||||
{ "id": "Pb", "grp":"pc", "class":5, "rating":"D", "cost": 97200, "mass": 8.0, "power":-0.30, "range": 5.20, "maximum": 4 },
|
||||
{ "id": "Pc", "grp":"pc", "class":5, "rating":"C", "cost": 194400, "mass": 20.0, "power":-0.50, "range": 6.50, "maximum": 4 },
|
||||
{ "id": "Pd", "grp":"pc", "class":5, "rating":"B", "cost": 388800, "mass": 32.0, "power":-0.97, "range": 7.80, "maximum": 4 },
|
||||
{ "id": "Pe", "grp":"pc", "class":5, "rating":"A", "cost": 777600, "mass": 20.0, "power":-0.60, "range": 9.10, "maximum": 4 },
|
||||
{ "id": "Pa", "grp":"pc", "class":5, "rating":"E", "cost": 48600, "mass": 20.0, "power":0.40, "range": 3.90, "maximum": 4 },
|
||||
{ "id": "Pb", "grp":"pc", "class":5, "rating":"D", "cost": 97200, "mass": 8.0, "power":0.30, "range": 5.20, "maximum": 4 },
|
||||
{ "id": "Pc", "grp":"pc", "class":5, "rating":"C", "cost": 194400, "mass": 20.0, "power":0.50, "range": 6.50, "maximum": 4 },
|
||||
{ "id": "Pd", "grp":"pc", "class":5, "rating":"B", "cost": 388800, "mass": 32.0, "power":0.97, "range": 7.80, "maximum": 4 },
|
||||
{ "id": "Pe", "grp":"pc", "class":5, "rating":"A", "cost": 777600, "mass": 20.0, "power":0.60, "range": 9.10, "maximum": 4 },
|
||||
|
||||
{ "id": "P5", "grp":"pc", "class":3, "rating":"E", "cost": 5400, "mass": 5.0, "power":-0.27, "range": 3.30, "maximum": 2 },
|
||||
{ "id": "P6", "grp":"pc", "class":3, "rating":"D", "cost": 10800, "mass": 2.0, "power":-0.20, "range": 4.40, "maximum": 2 },
|
||||
{ "id": "P7", "grp":"pc", "class":3, "rating":"C", "cost": 21600, "mass": 5.0, "power":-0.34, "range": 5.50, "maximum": 2 },
|
||||
{ "id": "P8", "grp":"pc", "class":3, "rating":"B", "cost": 43200, "mass": 8.0, "power":-0.48, "range": 6.60, "maximum": 2 },
|
||||
{ "id": "P9", "grp":"pc", "class":3, "rating":"A", "cost": 86400, "mass": 5.0, "power":-0.41, "range": 7.70, "maximum": 2 },
|
||||
{ "id": "P5", "grp":"pc", "class":3, "rating":"E", "cost": 5400, "mass": 5.0, "power":0.27, "range": 3.30, "maximum": 2 },
|
||||
{ "id": "P6", "grp":"pc", "class":3, "rating":"D", "cost": 10800, "mass": 2.0, "power":0.20, "range": 4.40, "maximum": 2 },
|
||||
{ "id": "P7", "grp":"pc", "class":3, "rating":"C", "cost": 21600, "mass": 5.0, "power":0.34, "range": 5.50, "maximum": 2 },
|
||||
{ "id": "P8", "grp":"pc", "class":3, "rating":"B", "cost": 43200, "mass": 8.0, "power":0.48, "range": 6.60, "maximum": 2 },
|
||||
{ "id": "P9", "grp":"pc", "class":3, "rating":"A", "cost": 86400, "mass": 5.0, "power":0.41, "range": 7.70, "maximum": 2 },
|
||||
|
||||
{ "id": "P0", "grp":"pc", "class":1, "rating":"E", "cost": 600, "mass": 1.3, "power":-0.18, "range": 3.00, "maximum": 1 },
|
||||
{ "id": "P1", "grp":"pc", "class":1, "rating":"D", "cost": 1200, "mass": 0.5, "power":-0.14, "range": 4.00, "maximum": 1 },
|
||||
{ "id": "P2", "grp":"pc", "class":1, "rating":"C", "cost": 2400, "mass": 1.3, "power":-0.23, "range": 5.00, "maximum": 1 },
|
||||
{ "id": "P3", "grp":"pc", "class":1, "rating":"B", "cost": 4800, "mass": 2.0, "power":-0.32, "range": 6.00, "maximum": 1 },
|
||||
{ "id": "P4", "grp":"pc", "class":1, "rating":"A", "cost": 9600, "mass": 1.3, "power":-0.28, "range": 7.00, "maximum": 1 }
|
||||
{ "id": "P0", "grp":"pc", "class":1, "rating":"E", "cost": 600, "mass": 1.3, "power":0.18, "range": 3.00, "maximum": 1 },
|
||||
{ "id": "P1", "grp":"pc", "class":1, "rating":"D", "cost": 1200, "mass": 0.5, "power":0.14, "range": 4.00, "maximum": 1 },
|
||||
{ "id": "P2", "grp":"pc", "class":1, "rating":"C", "cost": 2400, "mass": 1.3, "power":0.23, "range": 5.00, "maximum": 1 },
|
||||
{ "id": "P3", "grp":"pc", "class":1, "rating":"B", "cost": 4800, "mass": 2.0, "power":0.32, "range": 6.00, "maximum": 1 },
|
||||
{ "id": "P4", "grp":"pc", "class":1, "rating":"A", "cost": 9600, "mass": 1.3, "power":0.28, "range": 7.00, "maximum": 1 }
|
||||
]
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Refineries": [
|
||||
"Refinery": [
|
||||
{
|
||||
"id": "23",
|
||||
"grp": "rf",
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"Scanners": [
|
||||
"Scanner": [
|
||||
{
|
||||
"id": "2f",
|
||||
"grp": "sc",
|
||||
"name": "Adv. Discovery Scanner",
|
||||
"name": "Advanced Discovery Scanner",
|
||||
"class": 1,
|
||||
"rating": "C",
|
||||
"cost": 1545000,
|
||||
@@ -14,7 +14,7 @@
|
||||
{
|
||||
"id": "2g",
|
||||
"grp": "sc",
|
||||
"name": "Inter. Discovery Scanner",
|
||||
"name": "Intermediate Discovery Scanner",
|
||||
"class": 1,
|
||||
"rating": "D",
|
||||
"cost": 505000,
|
||||
@@ -1,484 +1,44 @@
|
||||
{
|
||||
"Shield Cell Banks": [
|
||||
{
|
||||
"id": "65",
|
||||
"grp": "scb",
|
||||
"class": 8,
|
||||
"rating": "E",
|
||||
"cost": 697584,
|
||||
"mass": 160,
|
||||
"power": 1.44,
|
||||
"cells": 5,
|
||||
"rechargeRating": "C",
|
||||
"recharge": 0
|
||||
},
|
||||
{
|
||||
"id": "64",
|
||||
"grp": "scb",
|
||||
"class": 8,
|
||||
"rating": "D",
|
||||
"cost": 1743961,
|
||||
"mass": 64,
|
||||
"power": 1.92,
|
||||
"cells": 3,
|
||||
"rechargeRating": "C",
|
||||
"recharge": 0
|
||||
},
|
||||
{
|
||||
"id": "63",
|
||||
"grp": "scb",
|
||||
"class": 8,
|
||||
"rating": "C",
|
||||
"cost": 4359903,
|
||||
"mass": 160,
|
||||
"power": 2.4,
|
||||
"cells": 4,
|
||||
"rechargeRating": "B",
|
||||
"recharge": 0
|
||||
},
|
||||
{
|
||||
"id": "62",
|
||||
"grp": "scb",
|
||||
"class": 8,
|
||||
"rating": "B",
|
||||
"cost": 10899756,
|
||||
"mass": 256,
|
||||
"power": 2.88,
|
||||
"cells": 5,
|
||||
"rechargeRating": "A",
|
||||
"recharge": 0
|
||||
},
|
||||
{
|
||||
"id": "61",
|
||||
"grp": "scb",
|
||||
"class": 8,
|
||||
"rating": "A",
|
||||
"cost": 27249391,
|
||||
"mass": 160,
|
||||
"power": 3.36,
|
||||
"cells": 4,
|
||||
"rechargeRating": "A",
|
||||
"recharge": 0
|
||||
},
|
||||
{
|
||||
"id": "60",
|
||||
"grp": "scb",
|
||||
"class": 7,
|
||||
"rating": "E",
|
||||
"cost": 249137,
|
||||
"mass": 80,
|
||||
"power": 1.24,
|
||||
"cells": 5,
|
||||
"rechargeRating": "D",
|
||||
"recharge": 97
|
||||
},
|
||||
{
|
||||
"id": "5v",
|
||||
"grp": "scb",
|
||||
"class": 7,
|
||||
"rating": "D",
|
||||
"cost": 622843,
|
||||
"mass": 32,
|
||||
"power": 1.66,
|
||||
"cells": 3,
|
||||
"rechargeRating": "C",
|
||||
"recharge": 130
|
||||
},
|
||||
{
|
||||
"id": "5u",
|
||||
"grp": "scb",
|
||||
"class": 7,
|
||||
"rating": "C",
|
||||
"cost": 1557108,
|
||||
"mass": 80,
|
||||
"power": 2.07,
|
||||
"cells": 4,
|
||||
"rechargeRating": "B",
|
||||
"recharge": 163
|
||||
},
|
||||
{
|
||||
"id": "5t",
|
||||
"grp": "scb",
|
||||
"class": 7,
|
||||
"rating": "B",
|
||||
"cost": 3892770,
|
||||
"mass": 128,
|
||||
"power": 2.48,
|
||||
"cells": 5,
|
||||
"rechargeRating": "B",
|
||||
"recharge": 197
|
||||
},
|
||||
{
|
||||
"id": "5s",
|
||||
"grp": "scb",
|
||||
"class": 7,
|
||||
"rating": "A",
|
||||
"cost": 9731925,
|
||||
"mass": 80,
|
||||
"power": 2.9,
|
||||
"cells": 4,
|
||||
"rechargeRating": "A",
|
||||
"recharge": 230
|
||||
},
|
||||
{
|
||||
"id": "5r",
|
||||
"grp": "scb",
|
||||
"class": 6,
|
||||
"rating": "E",
|
||||
"cost": 88978,
|
||||
"mass": 40,
|
||||
"power": 1.06,
|
||||
"cells": 5,
|
||||
"rechargeRating": "D",
|
||||
"recharge": 92
|
||||
},
|
||||
{
|
||||
"id": "5q",
|
||||
"grp": "scb",
|
||||
"class": 6,
|
||||
"rating": "D",
|
||||
"cost": 222444,
|
||||
"mass": 16,
|
||||
"power": 1.42,
|
||||
"cells": 3,
|
||||
"rechargeRating": "C",
|
||||
"recharge": 120
|
||||
},
|
||||
{
|
||||
"id": "5p",
|
||||
"grp": "scb",
|
||||
"class": 6,
|
||||
"rating": "C",
|
||||
"cost": 556110,
|
||||
"mass": 40,
|
||||
"power": 1.77,
|
||||
"cells": 4,
|
||||
"rechargeRating": "C",
|
||||
"recharge": 148
|
||||
},
|
||||
{
|
||||
"id": "5o",
|
||||
"grp": "scb",
|
||||
"class": 6,
|
||||
"rating": "B",
|
||||
"cost": 1390275,
|
||||
"mass": 64,
|
||||
"power": 2.12,
|
||||
"cells": 5,
|
||||
"rechargeRating": "B",
|
||||
"recharge": 176
|
||||
},
|
||||
{
|
||||
"id": "5n",
|
||||
"grp": "scb",
|
||||
"class": 6,
|
||||
"rating": "A",
|
||||
"cost": 3475688,
|
||||
"mass": 40,
|
||||
"power": 2.48,
|
||||
"cells": 4,
|
||||
"rechargeRating": "A",
|
||||
"recharge": 204
|
||||
},
|
||||
{
|
||||
"id": "5m",
|
||||
"grp": "scb",
|
||||
"class": 5,
|
||||
"rating": "E",
|
||||
"cost": 31778,
|
||||
"mass": 20,
|
||||
"power": 0.9,
|
||||
"cells": 4,
|
||||
"rechargeRating": "D",
|
||||
"recharge": 82
|
||||
},
|
||||
{
|
||||
"id": "5l",
|
||||
"grp": "scb",
|
||||
"class": 5,
|
||||
"rating": "D",
|
||||
"cost": 79444,
|
||||
"mass": 8,
|
||||
"power": 1.2,
|
||||
"cells": 2,
|
||||
"rechargeRating": "C",
|
||||
"recharge": 109
|
||||
},
|
||||
{
|
||||
"id": "5k",
|
||||
"grp": "scb",
|
||||
"class": 5,
|
||||
"rating": "C",
|
||||
"cost": 198611,
|
||||
"mass": 20,
|
||||
"power": 1.5,
|
||||
"cells": 3,
|
||||
"rechargeRating": "C",
|
||||
"recharge": 135
|
||||
},
|
||||
{
|
||||
"id": "5j",
|
||||
"grp": "scb",
|
||||
"class": 5,
|
||||
"rating": "B",
|
||||
"cost": 496527,
|
||||
"mass": 32,
|
||||
"power": 1.8,
|
||||
"cells": 4,
|
||||
"rechargeRating": "B",
|
||||
"recharge": 162
|
||||
},
|
||||
{
|
||||
"id": "5i",
|
||||
"grp": "scb",
|
||||
"class": 5,
|
||||
"rating": "A",
|
||||
"cost": 1241317,
|
||||
"mass": 20,
|
||||
"power": 2.1,
|
||||
"cells": 3,
|
||||
"rechargeRating": "B",
|
||||
"recharge": 189
|
||||
},
|
||||
{
|
||||
"id": "5h",
|
||||
"grp": "scb",
|
||||
"class": 4,
|
||||
"rating": "E",
|
||||
"cost": 11349,
|
||||
"mass": 10,
|
||||
"power": 0.74,
|
||||
"cells": 4,
|
||||
"rechargeRating": "D",
|
||||
"recharge": 72
|
||||
},
|
||||
{
|
||||
"id": "5g",
|
||||
"grp": "scb",
|
||||
"class": 4,
|
||||
"rating": "D",
|
||||
"cost": 28373,
|
||||
"mass": 4,
|
||||
"power": 0.98,
|
||||
"cells": 2,
|
||||
"rechargeRating": "D",
|
||||
"recharge": 94
|
||||
},
|
||||
{
|
||||
"id": "5f",
|
||||
"grp": "scb",
|
||||
"class": 4,
|
||||
"rating": "C",
|
||||
"cost": 70932,
|
||||
"mass": 10,
|
||||
"power": 1.23,
|
||||
"cells": 3,
|
||||
"rechargeRating": "C",
|
||||
"recharge": 117
|
||||
},
|
||||
{
|
||||
"id": "5e",
|
||||
"grp": "scb",
|
||||
"class": 4,
|
||||
"rating": "B",
|
||||
"cost": 177331,
|
||||
"mass": 16,
|
||||
"power": 1.48,
|
||||
"cells": 4,
|
||||
"rechargeRating": "C",
|
||||
"recharge": 140
|
||||
},
|
||||
{
|
||||
"id": "5d",
|
||||
"grp": "scb",
|
||||
"class": 4,
|
||||
"rating": "A",
|
||||
"cost": 443328,
|
||||
"mass": 10,
|
||||
"power": 1.72,
|
||||
"cells": 3,
|
||||
"rechargeRating": "B",
|
||||
"recharge": 163
|
||||
},
|
||||
{
|
||||
"id": "5c",
|
||||
"grp": "scb",
|
||||
"class": 3,
|
||||
"rating": "E",
|
||||
"cost": 4053,
|
||||
"mass": 5,
|
||||
"power": 0.61,
|
||||
"cells": 4,
|
||||
"rechargeRating": "D",
|
||||
"recharge": 61
|
||||
},
|
||||
{
|
||||
"id": "5b",
|
||||
"grp": "scb",
|
||||
"class": 3,
|
||||
"rating": "D",
|
||||
"cost": 10133,
|
||||
"mass": 2,
|
||||
"power": 0.82,
|
||||
"cells": 2,
|
||||
"rechargeRating": "D",
|
||||
"recharge": 80
|
||||
},
|
||||
{
|
||||
"id": "5a",
|
||||
"grp": "scb",
|
||||
"class": 3,
|
||||
"rating": "C",
|
||||
"cost": 25333,
|
||||
"mass": 5,
|
||||
"power": 1.02,
|
||||
"cells": 3,
|
||||
"rechargeRating": "D",
|
||||
"recharge": 100
|
||||
},
|
||||
{
|
||||
"id": "59",
|
||||
"grp": "scb",
|
||||
"class": 3,
|
||||
"rating": "B",
|
||||
"cost": 63333,
|
||||
"mass": 8,
|
||||
"power": 1.22,
|
||||
"cells": 4,
|
||||
"rechargeRating": "C",
|
||||
"recharge": 119
|
||||
},
|
||||
{
|
||||
"id": "58",
|
||||
"grp": "scb",
|
||||
"class": 3,
|
||||
"rating": "A",
|
||||
"cost": 158331,
|
||||
"mass": 5,
|
||||
"power": 1.43,
|
||||
"cells": 3,
|
||||
"rechargeRating": "C",
|
||||
"recharge": 138
|
||||
},
|
||||
{
|
||||
"id": "57",
|
||||
"grp": "scb",
|
||||
"class": 2,
|
||||
"rating": "E",
|
||||
"cost": 1448,
|
||||
"mass": 2.5,
|
||||
"power": 0.5,
|
||||
"cells": 4,
|
||||
"rechargeRating": "E",
|
||||
"recharge": 46
|
||||
},
|
||||
{
|
||||
"id": "56",
|
||||
"grp": "scb",
|
||||
"class": 2,
|
||||
"rating": "D",
|
||||
"cost": 3619,
|
||||
"mass": 1,
|
||||
"power": 0.67,
|
||||
"cells": 2,
|
||||
"rechargeRating": "D",
|
||||
"recharge": 61
|
||||
},
|
||||
{
|
||||
"id": "55",
|
||||
"grp": "scb",
|
||||
"class": 2,
|
||||
"rating": "C",
|
||||
"cost": 9048,
|
||||
"mass": 2.5,
|
||||
"power": 0.84,
|
||||
"cells": 3,
|
||||
"rechargeRating": "D",
|
||||
"recharge": 77
|
||||
},
|
||||
{
|
||||
"id": "54",
|
||||
"grp": "scb",
|
||||
"class": 2,
|
||||
"rating": "B",
|
||||
"cost": 22619,
|
||||
"mass": 4,
|
||||
"power": 1.01,
|
||||
"cells": 4,
|
||||
"rechargeRating": "D",
|
||||
"recharge": 92
|
||||
},
|
||||
{
|
||||
"id": "53",
|
||||
"grp": "scb",
|
||||
"class": 2,
|
||||
"rating": "A",
|
||||
"cost": 56547,
|
||||
"mass": 2.5,
|
||||
"power": 1.18,
|
||||
"cells": 3,
|
||||
"rechargeRating": "C",
|
||||
"recharge": 107
|
||||
},
|
||||
{
|
||||
"id": "52",
|
||||
"grp": "scb",
|
||||
"class": 1,
|
||||
"rating": "E",
|
||||
"cost": 517,
|
||||
"mass": 1.3,
|
||||
"power": 0.41,
|
||||
"cells": 3,
|
||||
"rechargeRating": "E",
|
||||
"recharge": 31
|
||||
},
|
||||
{
|
||||
"id": "51",
|
||||
"grp": "scb",
|
||||
"class": 1,
|
||||
"rating": "D",
|
||||
"cost": 1293,
|
||||
"mass": 0.5,
|
||||
"power": 0.55,
|
||||
"cells": 1,
|
||||
"rechargeRating": "E",
|
||||
"recharge": 41
|
||||
},
|
||||
{
|
||||
"id": "50",
|
||||
"grp": "scb",
|
||||
"class": 1,
|
||||
"rating": "C",
|
||||
"cost": 3231,
|
||||
"mass": 1.3,
|
||||
"power": 0.69,
|
||||
"cells": 2,
|
||||
"rechargeRating": "D",
|
||||
"recharge": 51
|
||||
},
|
||||
{
|
||||
"id": "4v",
|
||||
"grp": "scb",
|
||||
"class": 1,
|
||||
"rating": "B",
|
||||
"cost": 8078,
|
||||
"mass": 2,
|
||||
"power": 0.83,
|
||||
"cells": 3,
|
||||
"rechargeRating": "D",
|
||||
"recharge": 61
|
||||
},
|
||||
{
|
||||
"id": "4u",
|
||||
"grp": "scb",
|
||||
"class": 1,
|
||||
"rating": "A",
|
||||
"cost": 20195,
|
||||
"mass": 1.3,
|
||||
"power": 0.97,
|
||||
"cells": 2,
|
||||
"rechargeRating": "D",
|
||||
"recharge": 72
|
||||
}
|
||||
"Shield Cell Bank": [
|
||||
{ "id": "65", "grp": "scb", "class": 8, "rating": "E", "cost": 697584, "mass": 160, "power": 1.44, "cells": 5, "rechargeRating": "C", "recharge": 0 },
|
||||
{ "id": "64", "grp": "scb", "class": 8, "rating": "D", "cost": 1743961, "mass": 64, "power": 1.92, "cells": 3, "rechargeRating": "C", "recharge": 0 },
|
||||
{ "id": "63", "grp": "scb", "class": 8, "rating": "C", "cost": 4359903, "mass": 160, "power": 2.4, "cells": 4, "rechargeRating": "B", "recharge": 0 },
|
||||
{ "id": "62", "grp": "scb", "class": 8, "rating": "B", "cost": 10899756, "mass": 256, "power": 2.88, "cells": 5, "rechargeRating": "A", "recharge": 0 },
|
||||
{ "id": "61", "grp": "scb", "class": 8, "rating": "A", "cost": 27249391, "mass": 160, "power": 3.36, "cells": 4, "rechargeRating": "A", "recharge": 0 },
|
||||
{ "id": "60", "grp": "scb", "class": 7, "rating": "E", "cost": 249137, "mass": 80, "power": 1.24, "cells": 5, "rechargeRating": "D", "recharge": 97 },
|
||||
{ "id": "5v", "grp": "scb", "class": 7, "rating": "D", "cost": 622843, "mass": 32, "power": 1.66, "cells": 3, "rechargeRating": "C", "recharge": 130 },
|
||||
{ "id": "5u", "grp": "scb", "class": 7, "rating": "C", "cost": 1557108, "mass": 80, "power": 2.07, "cells": 4, "rechargeRating": "B", "recharge": 163 },
|
||||
{ "id": "5t", "grp": "scb", "class": 7, "rating": "B", "cost": 3892770, "mass": 128, "power": 2.48, "cells": 5, "rechargeRating": "B", "recharge": 197 },
|
||||
{ "id": "5s", "grp": "scb", "class": 7, "rating": "A", "cost": 9731925, "mass": 80, "power": 2.9, "cells": 4, "rechargeRating": "A", "recharge": 230 },
|
||||
{ "id": "5r", "grp": "scb", "class": 6, "rating": "E", "cost": 88978, "mass": 40, "power": 1.06, "cells": 5, "rechargeRating": "D", "recharge": 92 },
|
||||
{ "id": "5q", "grp": "scb", "class": 6, "rating": "D", "cost": 222444, "mass": 16, "power": 1.42, "cells": 3, "rechargeRating": "C", "recharge": 120 },
|
||||
{ "id": "5p", "grp": "scb", "class": 6, "rating": "C", "cost": 556110, "mass": 40, "power": 1.77, "cells": 4, "rechargeRating": "C", "recharge": 148 },
|
||||
{ "id": "5o", "grp": "scb", "class": 6, "rating": "B", "cost": 1390275, "mass": 64, "power": 2.12, "cells": 5, "rechargeRating": "B", "recharge": 176 },
|
||||
{ "id": "5n", "grp": "scb", "class": 6, "rating": "A", "cost": 3475688, "mass": 40, "power": 2.48, "cells": 4, "rechargeRating": "A", "recharge": 204 },
|
||||
{ "id": "5m", "grp": "scb", "class": 5, "rating": "E", "cost": 31778, "mass": 20, "power": 0.9, "cells": 4, "rechargeRating": "D", "recharge": 82 },
|
||||
{ "id": "5l", "grp": "scb", "class": 5, "rating": "D", "cost": 79444, "mass": 8, "power": 1.2, "cells": 2, "rechargeRating": "C", "recharge": 109 },
|
||||
{ "id": "5k", "grp": "scb", "class": 5, "rating": "C", "cost": 198611, "mass": 20, "power": 1.5, "cells": 3, "rechargeRating": "C", "recharge": 135 },
|
||||
{ "id": "5j", "grp": "scb", "class": 5, "rating": "B", "cost": 496527, "mass": 32, "power": 1.8, "cells": 4, "rechargeRating": "B", "recharge": 162 },
|
||||
{ "id": "5i", "grp": "scb", "class": 5, "rating": "A", "cost": 1241317, "mass": 20, "power": 2.1, "cells": 3, "rechargeRating": "B", "recharge": 189 },
|
||||
{ "id": "5h", "grp": "scb", "class": 4, "rating": "E", "cost": 11349, "mass": 10, "power": 0.74, "cells": 4, "rechargeRating": "D", "recharge": 72 },
|
||||
{ "id": "5g", "grp": "scb", "class": 4, "rating": "D", "cost": 28373, "mass": 4, "power": 0.98, "cells": 2, "rechargeRating": "D", "recharge": 94 },
|
||||
{ "id": "5f", "grp": "scb", "class": 4, "rating": "C", "cost": 70932, "mass": 10, "power": 1.23, "cells": 3, "rechargeRating": "C", "recharge": 117 },
|
||||
{ "id": "5e", "grp": "scb", "class": 4, "rating": "B", "cost": 177331, "mass": 16, "power": 1.48, "cells": 4, "rechargeRating": "C", "recharge": 140 },
|
||||
{ "id": "5d", "grp": "scb", "class": 4, "rating": "A", "cost": 443328, "mass": 10, "power": 1.72, "cells": 3, "rechargeRating": "B", "recharge": 163 },
|
||||
{ "id": "5c", "grp": "scb", "class": 3, "rating": "E", "cost": 4053, "mass": 5, "power": 0.61, "cells": 4, "rechargeRating": "D", "recharge": 61 },
|
||||
{ "id": "5b", "grp": "scb", "class": 3, "rating": "D", "cost": 10133, "mass": 2, "power": 0.82, "cells": 2, "rechargeRating": "D", "recharge": 80 },
|
||||
{ "id": "5a", "grp": "scb", "class": 3, "rating": "C", "cost": 25333, "mass": 5, "power": 1.02, "cells": 3, "rechargeRating": "D", "recharge": 100 },
|
||||
{ "id": "59", "grp": "scb", "class": 3, "rating": "B", "cost": 63333, "mass": 8, "power": 1.22, "cells": 4, "rechargeRating": "C", "recharge": 119 },
|
||||
{ "id": "58", "grp": "scb", "class": 3, "rating": "A", "cost": 158331, "mass": 5, "power": 1.43, "cells": 3, "rechargeRating": "C", "recharge": 138 },
|
||||
{ "id": "57", "grp": "scb", "class": 2, "rating": "E", "cost": 1448, "mass": 2.5, "power": 0.5, "cells": 4, "rechargeRating": "E", "recharge": 46 },
|
||||
{ "id": "56", "grp": "scb", "class": 2, "rating": "D", "cost": 3619, "mass": 1, "power": 0.67, "cells": 2, "rechargeRating": "D", "recharge": 61 },
|
||||
{ "id": "55", "grp": "scb", "class": 2, "rating": "C", "cost": 9048, "mass": 2.5, "power": 0.84, "cells": 3, "rechargeRating": "D", "recharge": 77 },
|
||||
{ "id": "54", "grp": "scb", "class": 2, "rating": "B", "cost": 22619, "mass": 4, "power": 1.01, "cells": 4, "rechargeRating": "D", "recharge": 92 },
|
||||
{ "id": "53", "grp": "scb", "class": 2, "rating": "A", "cost": 56547, "mass": 2.5, "power": 1.18, "cells": 3, "rechargeRating": "C", "recharge": 107 },
|
||||
{ "id": "52", "grp": "scb", "class": 1, "rating": "E", "cost": 517, "mass": 1.3, "power": 0.41, "cells": 3, "rechargeRating": "E", "recharge": 31 },
|
||||
{ "id": "51", "grp": "scb", "class": 1, "rating": "D", "cost": 1293, "mass": 0.5, "power": 0.55, "cells": 1, "rechargeRating": "E", "recharge": 41 },
|
||||
{ "id": "50", "grp": "scb", "class": 1, "rating": "C", "cost": 3231, "mass": 1.3, "power": 0.69, "cells": 2, "rechargeRating": "D", "recharge": 51 },
|
||||
{ "id": "4v", "grp": "scb", "class": 1, "rating": "B", "cost": 8078, "mass": 2, "power": 0.83, "cells": 3, "rechargeRating": "D", "recharge": 61 },
|
||||
{ "id": "4u", "grp": "scb", "class": 1, "rating": "A", "cost": 20195, "mass": 1.3, "power": 0.97, "cells": 2, "rechargeRating": "D", "recharge": 72 }
|
||||
]
|
||||
}
|
||||
@@ -1,529 +1,39 @@
|
||||
{
|
||||
"Shield Generators": [
|
||||
{
|
||||
"id": "4t",
|
||||
"grp": "sg",
|
||||
"class": 8,
|
||||
"rating": "E",
|
||||
"cost": 2007241,
|
||||
"mass": 160,
|
||||
"power": 2.4,
|
||||
"minmass": 900,
|
||||
"optmass": 1800,
|
||||
"maxmass": 4500,
|
||||
"minmul": 1.3,
|
||||
"optmul": 0.8,
|
||||
"maxmul": 0.3
|
||||
},
|
||||
{
|
||||
"id": "4s",
|
||||
"grp": "sg",
|
||||
"class": 8,
|
||||
"rating": "D",
|
||||
"cost": 6021722,
|
||||
"mass": 64,
|
||||
"power": 3.2,
|
||||
"minmass": 900,
|
||||
"optmass": 1800,
|
||||
"maxmass": 4500,
|
||||
"minmul": 1.4,
|
||||
"optmul": 0.9,
|
||||
"maxmul": 0.4
|
||||
},
|
||||
{
|
||||
"id": "4r",
|
||||
"grp": "sg",
|
||||
"class": 8,
|
||||
"rating": "C",
|
||||
"cost": 18065165,
|
||||
"mass": 160,
|
||||
"power": 4,
|
||||
"minmass": 900,
|
||||
"optmass": 1800,
|
||||
"maxmass": 4500,
|
||||
"minmul": 1.5,
|
||||
"optmul": 1,
|
||||
"maxmul": 0.5
|
||||
},
|
||||
{
|
||||
"id": "4q",
|
||||
"grp": "sg",
|
||||
"class": 8,
|
||||
"rating": "B",
|
||||
"cost": 54195495,
|
||||
"mass": 256,
|
||||
"power": 4.8,
|
||||
"minmass": 900,
|
||||
"optmass": 1800,
|
||||
"maxmass": 4500,
|
||||
"minmul": 1.6,
|
||||
"optmul": 1.1,
|
||||
"maxmul": 0.6
|
||||
},
|
||||
{
|
||||
"id": "4p",
|
||||
"grp": "sg",
|
||||
"class": 8,
|
||||
"rating": "A",
|
||||
"cost": 162586486,
|
||||
"mass": 160,
|
||||
"power": 5.6,
|
||||
"minmass": 900,
|
||||
"optmass": 1800,
|
||||
"maxmass": 4500,
|
||||
"minmul": 1.7,
|
||||
"optmul": 1.2,
|
||||
"maxmul": 0.7
|
||||
},
|
||||
{
|
||||
"id": "4o",
|
||||
"grp": "sg",
|
||||
"class": 7,
|
||||
"rating": "E",
|
||||
"cost": 633199,
|
||||
"mass": 80,
|
||||
"power": 2.1,
|
||||
"minmass": 530,
|
||||
"optmass": 1060,
|
||||
"maxmass": 2650,
|
||||
"minmul": 1.3,
|
||||
"optmul": 0.8,
|
||||
"maxmul": 0.3
|
||||
},
|
||||
{
|
||||
"id": "4n",
|
||||
"grp": "sg",
|
||||
"class": 7,
|
||||
"rating": "D",
|
||||
"cost": 1899597,
|
||||
"mass": 32,
|
||||
"power": 2.8,
|
||||
"minmass": 530,
|
||||
"optmass": 1060,
|
||||
"maxmass": 2650,
|
||||
"minmul": 1.4,
|
||||
"optmul": 0.9,
|
||||
"maxmul": 0.4
|
||||
},
|
||||
{
|
||||
"id": "4m",
|
||||
"grp": "sg",
|
||||
"class": 7,
|
||||
"rating": "C",
|
||||
"cost": 5698790,
|
||||
"mass": 80,
|
||||
"power": 3.5,
|
||||
"minmass": 530,
|
||||
"optmass": 1060,
|
||||
"maxmass": 2650,
|
||||
"minmul": 1.5,
|
||||
"optmul": 1,
|
||||
"maxmul": 0.5
|
||||
},
|
||||
{
|
||||
"id": "4l",
|
||||
"grp": "sg",
|
||||
"class": 7,
|
||||
"rating": "B",
|
||||
"cost": 17096371,
|
||||
"mass": 128,
|
||||
"power": 4.2,
|
||||
"minmass": 530,
|
||||
"optmass": 1060,
|
||||
"maxmass": 2650,
|
||||
"minmul": 1.6,
|
||||
"optmul": 1.1,
|
||||
"maxmul": 0.6
|
||||
},
|
||||
{
|
||||
"id": "4k",
|
||||
"grp": "sg",
|
||||
"class": 7,
|
||||
"rating": "A",
|
||||
"cost": 51289112,
|
||||
"mass": 80,
|
||||
"power": 4.9,
|
||||
"minmass": 530,
|
||||
"optmass": 1060,
|
||||
"maxmass": 2650,
|
||||
"minmul": 1.7,
|
||||
"optmul": 1.2,
|
||||
"maxmul": 0.7
|
||||
},
|
||||
{
|
||||
"id": "4j",
|
||||
"grp": "sg",
|
||||
"class": 6,
|
||||
"rating": "E",
|
||||
"cost": 199747,
|
||||
"mass": 40,
|
||||
"power": 1.86,
|
||||
"minmass": 270,
|
||||
"optmass": 540,
|
||||
"maxmass": 1350,
|
||||
"minmul": 1.3,
|
||||
"optmul": 0.8,
|
||||
"maxmul": 0.3
|
||||
},
|
||||
{
|
||||
"id": "4i",
|
||||
"grp": "sg",
|
||||
"class": 6,
|
||||
"rating": "D",
|
||||
"cost": 599242,
|
||||
"mass": 16,
|
||||
"power": 2.48,
|
||||
"minmass": 270,
|
||||
"optmass": 540,
|
||||
"maxmass": 1350,
|
||||
"minmul": 1.4,
|
||||
"optmul": 0.9,
|
||||
"maxmul": 0.4
|
||||
},
|
||||
{
|
||||
"id": "4h",
|
||||
"grp": "sg",
|
||||
"class": 6,
|
||||
"rating": "C",
|
||||
"cost": 1797726,
|
||||
"mass": 40,
|
||||
"power": 3.1,
|
||||
"minmass": 270,
|
||||
"optmass": 540,
|
||||
"maxmass": 1350,
|
||||
"minmul": 1.5,
|
||||
"optmul": 1,
|
||||
"maxmul": 0.5
|
||||
},
|
||||
{
|
||||
"id": "4g",
|
||||
"grp": "sg",
|
||||
"class": 6,
|
||||
"rating": "B",
|
||||
"cost": 5393177,
|
||||
"mass": 64,
|
||||
"power": 3.72,
|
||||
"minmass": 270,
|
||||
"optmass": 540,
|
||||
"maxmass": 1350,
|
||||
"minmul": 1.6,
|
||||
"optmul": 1.1,
|
||||
"maxmul": 0.6
|
||||
},
|
||||
{
|
||||
"id": "4f",
|
||||
"grp": "sg",
|
||||
"class": 6,
|
||||
"rating": "A",
|
||||
"cost": 16179531,
|
||||
"mass": 40,
|
||||
"power": 4.34,
|
||||
"minmass": 270,
|
||||
"optmass": 540,
|
||||
"maxmass": 1350,
|
||||
"minmul": 1.7,
|
||||
"optmul": 1.2,
|
||||
"maxmul": 0.7
|
||||
},
|
||||
{
|
||||
"id": "4e",
|
||||
"grp": "sg",
|
||||
"class": 5,
|
||||
"rating": "E",
|
||||
"cost": 63012,
|
||||
"mass": 20,
|
||||
"power": 1.56,
|
||||
"minmass": 203,
|
||||
"optmass": 405,
|
||||
"maxmass": 1013,
|
||||
"minmul": 1.3,
|
||||
"optmul": 0.8,
|
||||
"maxmul": 0.3
|
||||
},
|
||||
{
|
||||
"id": "4d",
|
||||
"grp": "sg",
|
||||
"class": 5,
|
||||
"rating": "D",
|
||||
"cost": 189035,
|
||||
"mass": 8,
|
||||
"power": 2.08,
|
||||
"minmass": 203,
|
||||
"optmass": 405,
|
||||
"maxmass": 1013,
|
||||
"minmul": 1.4,
|
||||
"optmul": 0.9,
|
||||
"maxmul": 0.4
|
||||
},
|
||||
{
|
||||
"id": "4c",
|
||||
"grp": "sg",
|
||||
"class": 5,
|
||||
"rating": "C",
|
||||
"cost": 567106,
|
||||
"mass": 20,
|
||||
"power": 2.6,
|
||||
"minmass": 203,
|
||||
"optmass": 405,
|
||||
"maxmass": 1013,
|
||||
"minmul": 1.5,
|
||||
"optmul": 1,
|
||||
"maxmul": 0.5
|
||||
},
|
||||
{
|
||||
"id": "4b",
|
||||
"grp": "sg",
|
||||
"class": 5,
|
||||
"rating": "B",
|
||||
"cost": 1701318,
|
||||
"mass": 32,
|
||||
"power": 3.12,
|
||||
"minmass": 203,
|
||||
"optmass": 405,
|
||||
"maxmass": 1013,
|
||||
"minmul": 1.6,
|
||||
"optmul": 1.1,
|
||||
"maxmul": 0.6
|
||||
},
|
||||
{
|
||||
"id": "4a",
|
||||
"grp": "sg",
|
||||
"class": 5,
|
||||
"rating": "A",
|
||||
"cost": 5103953,
|
||||
"mass": 20,
|
||||
"power": 3.64,
|
||||
"minmass": 203,
|
||||
"optmass": 405,
|
||||
"maxmass": 1013,
|
||||
"minmul": 1.7,
|
||||
"optmul": 1.2,
|
||||
"maxmul": 0.7
|
||||
},
|
||||
{
|
||||
"id": "49",
|
||||
"grp": "sg",
|
||||
"class": 4,
|
||||
"rating": "E",
|
||||
"cost": 19878,
|
||||
"mass": 10,
|
||||
"power": 1.32,
|
||||
"minmass": 143,
|
||||
"optmass": 285,
|
||||
"maxmass": 713,
|
||||
"minmul": 1.3,
|
||||
"optmul": 0.8,
|
||||
"maxmul": 0.3
|
||||
},
|
||||
{
|
||||
"id": "48",
|
||||
"grp": "sg",
|
||||
"class": 4,
|
||||
"rating": "D",
|
||||
"cost": 59633,
|
||||
"mass": 4,
|
||||
"power": 1.76,
|
||||
"minmass": 143,
|
||||
"optmass": 285,
|
||||
"maxmass": 713,
|
||||
"minmul": 1.4,
|
||||
"optmul": 0.9,
|
||||
"maxmul": 0.4
|
||||
},
|
||||
{
|
||||
"id": "47",
|
||||
"grp": "sg",
|
||||
"class": 4,
|
||||
"rating": "C",
|
||||
"cost": 178898,
|
||||
"mass": 10,
|
||||
"power": 2.2,
|
||||
"minmass": 143,
|
||||
"optmass": 285,
|
||||
"maxmass": 713,
|
||||
"minmul": 1.5,
|
||||
"optmul": 1,
|
||||
"maxmul": 0.5
|
||||
},
|
||||
{
|
||||
"id": "46",
|
||||
"grp": "sg",
|
||||
"class": 4,
|
||||
"rating": "B",
|
||||
"cost": 536693,
|
||||
"mass": 16,
|
||||
"power": 2.64,
|
||||
"minmass": 143,
|
||||
"optmass": 285,
|
||||
"maxmass": 713,
|
||||
"minmul": 1.6,
|
||||
"optmul": 1.1,
|
||||
"maxmul": 0.6
|
||||
},
|
||||
{
|
||||
"id": "45",
|
||||
"grp": "sg",
|
||||
"class": 4,
|
||||
"rating": "A",
|
||||
"cost": 1610080,
|
||||
"mass": 10,
|
||||
"power": 3.08,
|
||||
"minmass": 143,
|
||||
"optmass": 285,
|
||||
"maxmass": 713,
|
||||
"minmul": 1.7,
|
||||
"optmul": 1.2,
|
||||
"maxmul": 0.7
|
||||
},
|
||||
{
|
||||
"id": "44",
|
||||
"grp": "sg",
|
||||
"class": 3,
|
||||
"rating": "E",
|
||||
"cost": 6271,
|
||||
"mass": 5,
|
||||
"power": 1.08,
|
||||
"minmass": 83,
|
||||
"optmass": 165,
|
||||
"maxmass": 413,
|
||||
"minmul": 1.3,
|
||||
"optmul": 0.8,
|
||||
"maxmul": 0.3
|
||||
},
|
||||
{
|
||||
"id": "43",
|
||||
"grp": "sg",
|
||||
"class": 3,
|
||||
"rating": "D",
|
||||
"cost": 18812,
|
||||
"mass": 2,
|
||||
"power": 1.44,
|
||||
"minmass": 83,
|
||||
"optmass": 165,
|
||||
"maxmass": 413,
|
||||
"minmul": 1.4,
|
||||
"optmul": 0.9,
|
||||
"maxmul": 0.4
|
||||
},
|
||||
{
|
||||
"id": "42",
|
||||
"grp": "sg",
|
||||
"class": 3,
|
||||
"rating": "C",
|
||||
"cost": 56435,
|
||||
"mass": 5,
|
||||
"power": 1.8,
|
||||
"minmass": 83,
|
||||
"optmass": 165,
|
||||
"maxmass": 413,
|
||||
"minmul": 1.5,
|
||||
"optmul": 1,
|
||||
"maxmul": 0.5
|
||||
},
|
||||
{
|
||||
"id": "41",
|
||||
"grp": "sg",
|
||||
"class": 3,
|
||||
"rating": "B",
|
||||
"cost": 169304,
|
||||
"mass": 8,
|
||||
"power": 2.16,
|
||||
"minmass": 83,
|
||||
"optmass": 165,
|
||||
"maxmass": 413,
|
||||
"minmul": 1.6,
|
||||
"optmul": 1.1,
|
||||
"maxmul": 0.6
|
||||
},
|
||||
{
|
||||
"id": "40",
|
||||
"grp": "sg",
|
||||
"class": 3,
|
||||
"rating": "A",
|
||||
"cost": 507912,
|
||||
"mass": 5,
|
||||
"power": 2.52,
|
||||
"minmass": 83,
|
||||
"optmass": 165,
|
||||
"maxmass": 413,
|
||||
"minmul": 1.7,
|
||||
"optmul": 1.2,
|
||||
"maxmul": 0.7
|
||||
},
|
||||
{
|
||||
"id": "3v",
|
||||
"grp": "sg",
|
||||
"class": 2,
|
||||
"rating": "E",
|
||||
"cost": 1978,
|
||||
"mass": 2.5,
|
||||
"power": 0.9,
|
||||
"minmass": 28,
|
||||
"optmass": 55,
|
||||
"maxmass": 138,
|
||||
"minmul": 1.3,
|
||||
"optmul": 0.8,
|
||||
"maxmul": 0.3
|
||||
},
|
||||
{
|
||||
"id": "3u",
|
||||
"grp": "sg",
|
||||
"class": 2,
|
||||
"rating": "D",
|
||||
"cost": 5934,
|
||||
"mass": 1,
|
||||
"power": 1.2,
|
||||
"minmass": 28,
|
||||
"optmass": 55,
|
||||
"maxmass": 138,
|
||||
"minmul": 1.4,
|
||||
"optmul": 0.9,
|
||||
"maxmul": 0.4
|
||||
},
|
||||
{
|
||||
"id": "3t",
|
||||
"grp": "sg",
|
||||
"class": 2,
|
||||
"rating": "C",
|
||||
"cost": 17803,
|
||||
"mass": 2.5,
|
||||
"power": 1.5,
|
||||
"minmass": 28,
|
||||
"optmass": 55,
|
||||
"maxmass": 138,
|
||||
"minmul": 1.5,
|
||||
"optmul": 1,
|
||||
"maxmul": 0.5
|
||||
},
|
||||
{
|
||||
"id": "3s",
|
||||
"grp": "sg",
|
||||
"class": 2,
|
||||
"rating": "B",
|
||||
"cost": 53408,
|
||||
"mass": 4,
|
||||
"power": 1.8,
|
||||
"minmass": 28,
|
||||
"optmass": 55,
|
||||
"maxmass": 138,
|
||||
"minmul": 1.6,
|
||||
"optmul": 1.1,
|
||||
"maxmul": 0.6
|
||||
},
|
||||
{
|
||||
"id": "3r",
|
||||
"grp": "sg",
|
||||
"class": 2,
|
||||
"rating": "A",
|
||||
"cost": 160224,
|
||||
"mass": 2.5,
|
||||
"power": 2.1,
|
||||
"minmass": 28,
|
||||
"optmass": 55,
|
||||
"maxmass": 138,
|
||||
"minmul": 1.7,
|
||||
"optmul": 1.2,
|
||||
"maxmul": 0.7
|
||||
}
|
||||
"Shield Generator": [
|
||||
{ "id": "4t", "grp": "sg", "class": 8, "rating": "E", "cost": 2007241, "mass": 160, "power": 2.4, "minmass": 900, "optmass": 1800, "maxmass": 4500, "minmul": 1.3, "optmul": 0.8, "maxmul": 0.3 },
|
||||
{ "id": "4s", "grp": "sg", "class": 8, "rating": "D", "cost": 6021722, "mass": 64, "power": 3.2, "minmass": 900, "optmass": 1800, "maxmass": 4500, "minmul": 1.4, "optmul": 0.9, "maxmul": 0.4 },
|
||||
{ "id": "4r", "grp": "sg", "class": 8, "rating": "C", "cost": 18065165, "mass": 160, "power": 4, "minmass": 900, "optmass": 1800, "maxmass": 4500, "minmul": 1.5, "optmul": 1, "maxmul": 0.5 },
|
||||
{ "id": "4q", "grp": "sg", "class": 8, "rating": "B", "cost": 54195495, "mass": 256, "power": 4.8, "minmass": 900, "optmass": 1800, "maxmass": 4500, "minmul": 1.6, "optmul": 1.1, "maxmul": 0.6 },
|
||||
{ "id": "4p", "grp": "sg", "class": 8, "rating": "A", "cost": 162586486, "mass": 160, "power": 5.6, "minmass": 900, "optmass": 1800, "maxmass": 4500, "minmul": 1.7, "optmul": 1.2, "maxmul": 0.7 },
|
||||
{ "id": "4o", "grp": "sg", "class": 7, "rating": "E", "cost": 633199, "mass": 80, "power": 2.1, "minmass": 530, "optmass": 1060, "maxmass": 2650, "minmul": 1.3, "optmul": 0.8, "maxmul": 0.3 },
|
||||
{ "id": "4n", "grp": "sg", "class": 7, "rating": "D", "cost": 1899597, "mass": 32, "power": 2.8, "minmass": 530, "optmass": 1060, "maxmass": 2650, "minmul": 1.4, "optmul": 0.9, "maxmul": 0.4 },
|
||||
{ "id": "4m", "grp": "sg", "class": 7, "rating": "C", "cost": 5698790, "mass": 80, "power": 3.5, "minmass": 530, "optmass": 1060, "maxmass": 2650, "minmul": 1.5, "optmul": 1, "maxmul": 0.5 },
|
||||
{ "id": "4l", "grp": "sg", "class": 7, "rating": "B", "cost": 17096371, "mass": 128, "power": 4.2, "minmass": 530, "optmass": 1060, "maxmass": 2650, "minmul": 1.6, "optmul": 1.1, "maxmul": 0.6 },
|
||||
{ "id": "4k", "grp": "sg", "class": 7, "rating": "A", "cost": 51289112, "mass": 80, "power": 4.9, "minmass": 530, "optmass": 1060, "maxmass": 2650, "minmul": 1.7, "optmul": 1.2, "maxmul": 0.7 },
|
||||
{ "id": "4j", "grp": "sg", "class": 6, "rating": "E", "cost": 199747, "mass": 40, "power": 1.86, "minmass": 270, "optmass": 540, "maxmass": 1350, "minmul": 1.3, "optmul": 0.8, "maxmul": 0.3 },
|
||||
{ "id": "4i", "grp": "sg", "class": 6, "rating": "D", "cost": 599242, "mass": 16, "power": 2.48, "minmass": 270, "optmass": 540, "maxmass": 1350, "minmul": 1.4, "optmul": 0.9, "maxmul": 0.4 },
|
||||
{ "id": "4h", "grp": "sg", "class": 6, "rating": "C", "cost": 1797726, "mass": 40, "power": 3.1, "minmass": 270, "optmass": 540, "maxmass": 1350, "minmul": 1.5, "optmul": 1, "maxmul": 0.5 },
|
||||
{ "id": "4g", "grp": "sg", "class": 6, "rating": "B", "cost": 5393177, "mass": 64, "power": 3.72, "minmass": 270, "optmass": 540, "maxmass": 1350, "minmul": 1.6, "optmul": 1.1, "maxmul": 0.6 },
|
||||
{ "id": "4f", "grp": "sg", "class": 6, "rating": "A", "cost": 16179531, "mass": 40, "power": 4.34, "minmass": 270, "optmass": 540, "maxmass": 1350, "minmul": 1.7, "optmul": 1.2, "maxmul": 0.7 },
|
||||
{ "id": "4e", "grp": "sg", "class": 5, "rating": "E", "cost": 63012, "mass": 20, "power": 1.56, "minmass": 203, "optmass": 405, "maxmass": 1013, "minmul": 1.3, "optmul": 0.8, "maxmul": 0.3 },
|
||||
{ "id": "4d", "grp": "sg", "class": 5, "rating": "D", "cost": 189035, "mass": 8, "power": 2.08, "minmass": 203, "optmass": 405, "maxmass": 1013, "minmul": 1.4, "optmul": 0.9, "maxmul": 0.4 },
|
||||
{ "id": "4c", "grp": "sg", "class": 5, "rating": "C", "cost": 567106, "mass": 20, "power": 2.6, "minmass": 203, "optmass": 405, "maxmass": 1013, "minmul": 1.5, "optmul": 1, "maxmul": 0.5 },
|
||||
{ "id": "4b", "grp": "sg", "class": 5, "rating": "B", "cost": 1701318, "mass": 32, "power": 3.12, "minmass": 203, "optmass": 405, "maxmass": 1013, "minmul": 1.6, "optmul": 1.1, "maxmul": 0.6 },
|
||||
{ "id": "4a", "grp": "sg", "class": 5, "rating": "A", "cost": 5103953, "mass": 20, "power": 3.64, "minmass": 203, "optmass": 405, "maxmass": 1013, "minmul": 1.7, "optmul": 1.2, "maxmul": 0.7 },
|
||||
{ "id": "49", "grp": "sg", "class": 4, "rating": "E", "cost": 19878, "mass": 10, "power": 1.32, "minmass": 143, "optmass": 285, "maxmass": 713, "minmul": 1.3, "optmul": 0.8, "maxmul": 0.3 },
|
||||
{ "id": "48", "grp": "sg", "class": 4, "rating": "D", "cost": 59633, "mass": 4, "power": 1.76, "minmass": 143, "optmass": 285, "maxmass": 713, "minmul": 1.4, "optmul": 0.9, "maxmul": 0.4 },
|
||||
{ "id": "47", "grp": "sg", "class": 4, "rating": "C", "cost": 178898, "mass": 10, "power": 2.2, "minmass": 143, "optmass": 285, "maxmass": 713, "minmul": 1.5, "optmul": 1, "maxmul": 0.5 },
|
||||
{ "id": "46", "grp": "sg", "class": 4, "rating": "B", "cost": 536693, "mass": 16, "power": 2.64, "minmass": 143, "optmass": 285, "maxmass": 713, "minmul": 1.6, "optmul": 1.1, "maxmul": 0.6 },
|
||||
{ "id": "45", "grp": "sg", "class": 4, "rating": "A", "cost": 1610080, "mass": 10, "power": 3.08, "minmass": 143, "optmass": 285, "maxmass": 713, "minmul": 1.7, "optmul": 1.2, "maxmul": 0.7 },
|
||||
{ "id": "44", "grp": "sg", "class": 3, "rating": "E", "cost": 6271, "mass": 5, "power": 1.08, "minmass": 83, "optmass": 165, "maxmass": 413, "minmul": 1.3, "optmul": 0.8, "maxmul": 0.3 },
|
||||
{ "id": "43", "grp": "sg", "class": 3, "rating": "D", "cost": 18812, "mass": 2, "power": 1.44, "minmass": 83, "optmass": 165, "maxmass": 413, "minmul": 1.4, "optmul": 0.9, "maxmul": 0.4 },
|
||||
{ "id": "42", "grp": "sg", "class": 3, "rating": "C", "cost": 56435, "mass": 5, "power": 1.8, "minmass": 83, "optmass": 165, "maxmass": 413, "minmul": 1.5, "optmul": 1, "maxmul": 0.5 },
|
||||
{ "id": "41", "grp": "sg", "class": 3, "rating": "B", "cost": 169304, "mass": 8, "power": 2.16, "minmass": 83, "optmass": 165, "maxmass": 413, "minmul": 1.6, "optmul": 1.1, "maxmul": 0.6 },
|
||||
{ "id": "40", "grp": "sg", "class": 3, "rating": "A", "cost": 507912, "mass": 5, "power": 2.52, "minmass": 83, "optmass": 165, "maxmass": 413, "minmul": 1.7, "optmul": 1.2, "maxmul": 0.7 },
|
||||
{ "id": "3v", "grp": "sg", "class": 2, "rating": "E", "cost": 1978, "mass": 2.5, "power": 0.9, "minmass": 28, "optmass": 55, "maxmass": 138, "minmul": 1.3, "optmul": 0.8, "maxmul": 0.3 },
|
||||
{ "id": "3u", "grp": "sg", "class": 2, "rating": "D", "cost": 5934, "mass": 1, "power": 1.2, "minmass": 28, "optmass": 55, "maxmass": 138, "minmul": 1.4, "optmul": 0.9, "maxmul": 0.4 },
|
||||
{ "id": "3t", "grp": "sg", "class": 2, "rating": "C", "cost": 17803, "mass": 2.5, "power": 1.5, "minmass": 28, "optmass": 55, "maxmass": 138, "minmul": 1.5, "optmul": 1, "maxmul": 0.5 },
|
||||
{ "id": "3s", "grp": "sg", "class": 2, "rating": "B", "cost": 53408, "mass": 4, "power": 1.8, "minmass": 28, "optmass": 55, "maxmass": 138, "minmul": 1.6, "optmul": 1.1, "maxmul": 0.6 },
|
||||
{ "id": "3r", "grp": "sg", "class": 2, "rating": "A", "cost": 160224, "mass": 2.5, "power": 2.1, "minmass": 28, "optmass": 55, "maxmass": 138, "minmul": 1.7, "optmul": 1.2, "maxmul": 0.7 }
|
||||
]
|
||||
}
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"adder": {
|
||||
"properties": {
|
||||
"grp": "ex",
|
||||
"name": "Adder",
|
||||
"manufacturer": "Zorgon Peterson",
|
||||
"class": 1,
|
||||
"cost": 39993,
|
||||
"hullCost": 39993,
|
||||
"speed": 220,
|
||||
"boost": 320,
|
||||
"boostEnergy": 9,
|
||||
"agility": 8,
|
||||
"shields": 60,
|
||||
"armour": 162,
|
||||
"fuelcost": 50,
|
||||
"mass": 35
|
||||
"baseShieldStrength": 60,
|
||||
"baseArmour": 162,
|
||||
"hullMass": 35,
|
||||
"masslock": 7
|
||||
},
|
||||
"retailCost": 87808,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"anaconda": {
|
||||
"properties": {
|
||||
"grp": "mp",
|
||||
"name": "Anaconda",
|
||||
"manufacturer": "Faulcon DeLacy",
|
||||
"class": 3,
|
||||
"cost": 141889932,
|
||||
"hullCost": 141889932,
|
||||
"speed": 180,
|
||||
"boost": 240,
|
||||
"boostEnergy": 29,
|
||||
"agility": 2,
|
||||
"shields": 350,
|
||||
"armour": 945,
|
||||
"fuelcost": 50,
|
||||
"mass": 400
|
||||
"baseShieldStrength": 350,
|
||||
"baseArmour": 945,
|
||||
"hullMass": 400,
|
||||
"masslock": 23
|
||||
},
|
||||
"retailCost": 146969451,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"asp": {
|
||||
"properties": {
|
||||
"grp": "ex",
|
||||
"name": "Asp Explorer",
|
||||
"manufacturer": "Lakon",
|
||||
"class": 2,
|
||||
"cost": 6135658,
|
||||
"hullCost": 6135658,
|
||||
"speed": 250,
|
||||
"boost": 340,
|
||||
"boostEnergy": 14,
|
||||
"agility": 6,
|
||||
"shields": 140,
|
||||
"armour": 378,
|
||||
"fuelcost": 50,
|
||||
"mass": 280
|
||||
"baseShieldStrength": 140,
|
||||
"baseArmour": 378,
|
||||
"hullMass": 280,
|
||||
"masslock": 11
|
||||
},
|
||||
"retailCost": 6661153,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"cobra_mk_iii": {
|
||||
"properties": {
|
||||
"grp": "mp",
|
||||
"name": "Cobra Mk III",
|
||||
"manufacturer": "Faulcon DeLacy",
|
||||
"class": 1,
|
||||
"cost": 235787,
|
||||
"hullCost": 235787,
|
||||
"speed": 280,
|
||||
"boost": 400,
|
||||
"boostEnergy": 11,
|
||||
"agility": 6,
|
||||
"shields": 80,
|
||||
"armour": 216,
|
||||
"fuelcost": 50,
|
||||
"mass": 180
|
||||
"baseShieldStrength": 80,
|
||||
"baseArmour": 216,
|
||||
"hullMass": 180,
|
||||
"masslock": 8
|
||||
},
|
||||
"retailCost": 379718,
|
||||
"slots": {
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
{
|
||||
"diamondback": {
|
||||
"properties": {
|
||||
"grp": "ex",
|
||||
"name": "Diamondback Scout",
|
||||
"manufacturer": "Lakon",
|
||||
"class": 1,
|
||||
"cost": 461342,
|
||||
"hullCost": 461341,
|
||||
"speed": 283,
|
||||
"boost": 384,
|
||||
"boostEnergy": 11,
|
||||
"agility": 8,
|
||||
"shields": 118,
|
||||
"armour": 216,
|
||||
"fuelcost": 50,
|
||||
"mass": 170
|
||||
"baseShieldStrength": 118,
|
||||
"baseArmour": 216,
|
||||
"hullMass": 170,
|
||||
"masslock": 8
|
||||
},
|
||||
"retailCost": 564330,
|
||||
"retailCost": 564329,
|
||||
"minMassFilter": 180.5,
|
||||
"slots": {
|
||||
"common": [
|
||||
4,
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"diamondback_explorer": {
|
||||
"properties": {
|
||||
"grp": "ex",
|
||||
"name": "Diamondback Explorer",
|
||||
"manufacturer": "Lakon",
|
||||
"class": 1,
|
||||
"cost": 1635691,
|
||||
"hullCost": 1635691,
|
||||
"speed": 242,
|
||||
"boost": 316,
|
||||
"boostEnergy": 14,
|
||||
"agility": 5,
|
||||
"shields": 146,
|
||||
"armour": 270,
|
||||
"fuelcost": 50,
|
||||
"mass": 298
|
||||
"baseShieldStrength": 146,
|
||||
"baseArmour": 270,
|
||||
"hullMass": 298,
|
||||
"masslock": 7
|
||||
},
|
||||
"retailCost": 1894760,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"eagle": {
|
||||
"properties": {
|
||||
"grp": "co",
|
||||
"name": "Eagle",
|
||||
"manufacturer": "Core Dynamics",
|
||||
"class": 1,
|
||||
"cost": 10446,
|
||||
"hullCost": 10446,
|
||||
"speed": 240,
|
||||
"boost": 350,
|
||||
"boostEnergy": 9,
|
||||
"agility": 10,
|
||||
"shields": 60,
|
||||
"armour": 72,
|
||||
"fuelcost": 50,
|
||||
"mass": 50
|
||||
"baseShieldStrength": 60,
|
||||
"baseArmour": 72,
|
||||
"hullMass": 50,
|
||||
"masslock": 6
|
||||
},
|
||||
"retailCost": 44800,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"federal_dropship": {
|
||||
"properties": {
|
||||
"grp": "mp",
|
||||
"name": "Federal Dropship",
|
||||
"manufacturer": "Core Dynamics",
|
||||
"class": 2,
|
||||
"cost": 18969990,
|
||||
"hullCost": 18969990,
|
||||
"speed": 180,
|
||||
"boost": 300,
|
||||
"boostEnergy": 21,
|
||||
"agility": 2,
|
||||
"shields": 200,
|
||||
"armour": 540,
|
||||
"fuelcost": 50,
|
||||
"mass": 580
|
||||
"baseShieldStrength": 200,
|
||||
"baseArmour": 540,
|
||||
"hullMass": 580,
|
||||
"masslock": 14
|
||||
},
|
||||
"retailCost": 19814205,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"fer_de_lance": {
|
||||
"properties": {
|
||||
"grp": "co",
|
||||
"name": "Fer-de-Lance",
|
||||
"manufacturer": "Zorgon Peterson",
|
||||
"class": 2,
|
||||
"cost": 51232230,
|
||||
"hullCost": 51232230,
|
||||
"speed": 260,
|
||||
"boost": 350,
|
||||
"boostEnergy": 21,
|
||||
"agility": 6,
|
||||
"shields": 300,
|
||||
"armour": 405,
|
||||
"fuelcost": 50,
|
||||
"mass": 250
|
||||
"baseShieldStrength": 300,
|
||||
"baseArmour": 405,
|
||||
"hullMass": 250,
|
||||
"masslock": 12
|
||||
},
|
||||
"retailCost": 51567040,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"hauler": {
|
||||
"properties": {
|
||||
"grp": "fr",
|
||||
"name": "Hauler",
|
||||
"manufacturer": "Zorgon Peterson",
|
||||
"class": 1,
|
||||
"cost": 29807,
|
||||
"hullCost": 29807,
|
||||
"speed": 200,
|
||||
"boost": 300,
|
||||
"agility": 6,
|
||||
"shields": 50,
|
||||
"armour": 90,
|
||||
"fuelcost": 50,
|
||||
"mass": 14
|
||||
"boostEnergy": 7,
|
||||
"baseShieldStrength": 50,
|
||||
"baseArmour": 90,
|
||||
"hullMass": 14,
|
||||
"masslock": 6
|
||||
},
|
||||
"retailCost": 52720,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"imperial_clipper": {
|
||||
"properties": {
|
||||
"grp": "mp",
|
||||
"name": "Imperial Clipper",
|
||||
"manufacturer": "Gutamaya",
|
||||
"class": 3,
|
||||
"cost": 21077784,
|
||||
"hullCost": 21077784,
|
||||
"speed": 300,
|
||||
"boost": 380,
|
||||
"boostEnergy": 21,
|
||||
"agility": 2,
|
||||
"shields": 180,
|
||||
"armour": 486,
|
||||
"fuelcost": 50,
|
||||
"mass": 400
|
||||
"baseShieldStrength": 180,
|
||||
"baseArmour": 486,
|
||||
"hullMass": 400,
|
||||
"masslock": 12
|
||||
},
|
||||
"retailCost": 22296860,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"imperial_courier": {
|
||||
"properties": {
|
||||
"grp": "mp",
|
||||
"name": "Imperial Courier",
|
||||
"manufacturer": "Gutamaya",
|
||||
"class": 1,
|
||||
"cost": 2481552,
|
||||
"hullCost": 2481552,
|
||||
"speed": 277,
|
||||
"boost": 380,
|
||||
"boostEnergy": 11,
|
||||
"agility": 6,
|
||||
"shields": 197,
|
||||
"armour": 144,
|
||||
"fuelcost": 50,
|
||||
"mass": 35
|
||||
"baseShieldStrength": 197,
|
||||
"baseArmour": 144,
|
||||
"hullMass": 35,
|
||||
"masslock": 7
|
||||
},
|
||||
"retailCost": 2542931,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"orca": {
|
||||
"properties": {
|
||||
"grp": "pa",
|
||||
"name": "Orca",
|
||||
"manufacturer": "Saud Kruger",
|
||||
"class": 3,
|
||||
"cost": 47798079,
|
||||
"hullCost": 47798079,
|
||||
"speed": 300,
|
||||
"boost": 380,
|
||||
"boostEnergy": 17,
|
||||
"agility": 2,
|
||||
"shields": 220,
|
||||
"armour": 396,
|
||||
"fuelcost": 50,
|
||||
"mass": 580
|
||||
"baseShieldStrength": 220,
|
||||
"baseArmour": 396,
|
||||
"hullMass": 580,
|
||||
"masslock": 13
|
||||
},
|
||||
"retailCost": 48539887,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"python": {
|
||||
"properties": {
|
||||
"grp": "mp",
|
||||
"name": "Python",
|
||||
"manufacturer": "Faulcon DeLacy",
|
||||
"class": 2,
|
||||
"cost": 55171395,
|
||||
"hullCost": 55171395,
|
||||
"speed": 230,
|
||||
"boost": 280,
|
||||
"boostEnergy": 24,
|
||||
"agility": 6,
|
||||
"shields": 260,
|
||||
"armour": 468,
|
||||
"fuelcost": 50,
|
||||
"mass": 350
|
||||
"baseShieldStrength": 260,
|
||||
"baseArmour": 468,
|
||||
"hullMass": 350,
|
||||
"masslock": 17
|
||||
},
|
||||
"retailCost": 56978179,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"sidewinder": {
|
||||
"properties": {
|
||||
"grp": "mp",
|
||||
"name": "Sidewinder",
|
||||
"manufacturer": "Faulcon DeLacy",
|
||||
"class": 1,
|
||||
"cost": 12887,
|
||||
"hullCost": 12887,
|
||||
"speed": 220,
|
||||
"boost": 320,
|
||||
"boostEnergy": 7,
|
||||
"agility": 8,
|
||||
"shields": 40,
|
||||
"armour": 108,
|
||||
"fuelcost": 50,
|
||||
"mass": 25
|
||||
"baseShieldStrength": 40,
|
||||
"baseArmour": 108,
|
||||
"hullMass": 25,
|
||||
"masslock": 6
|
||||
},
|
||||
"retailCost": 32000,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"type_6_transporter": {
|
||||
"properties": {
|
||||
"grp": "fr",
|
||||
"name": "Type-6 Transporter",
|
||||
"manufacturer": "Lakon",
|
||||
"class": 2,
|
||||
"cost": 865782,
|
||||
"hullCost": 865782,
|
||||
"speed": 220,
|
||||
"boost": 350,
|
||||
"boostEnergy": 11,
|
||||
"agility": 3,
|
||||
"shields": 90,
|
||||
"armour": 162,
|
||||
"fuelcost": 50,
|
||||
"mass": 155
|
||||
"baseShieldStrength": 90,
|
||||
"baseArmour": 162,
|
||||
"hullMass": 155,
|
||||
"masslock": 8
|
||||
},
|
||||
"retailCost": 1045945,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"type_7_transport": {
|
||||
"properties": {
|
||||
"grp": "fr",
|
||||
"name": "Type-7 Transporter",
|
||||
"manufacturer": "Lakon",
|
||||
"class": 3,
|
||||
"cost": 16881511,
|
||||
"hullCost": 16881511,
|
||||
"speed": 180,
|
||||
"boost": 300,
|
||||
"boostEnergy": 11,
|
||||
"agility": 2,
|
||||
"shields": 120,
|
||||
"armour": 216,
|
||||
"fuelcost": 50,
|
||||
"mass": 420
|
||||
"baseShieldStrength": 120,
|
||||
"baseArmour": 216,
|
||||
"hullMass": 420,
|
||||
"masslock": 10
|
||||
},
|
||||
"retailCost": 17472252,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"type_9_heavy": {
|
||||
"properties": {
|
||||
"grp": "fr",
|
||||
"name": "Type-9 Heavy",
|
||||
"manufacturer": "Lakon",
|
||||
"class": 3,
|
||||
"cost": 73255168,
|
||||
"hullCost": 73255168,
|
||||
"speed": 130,
|
||||
"boost": 200,
|
||||
"boostEnergy": 21,
|
||||
"agility": 0,
|
||||
"shields": 240,
|
||||
"armour": 432,
|
||||
"fuelcost": 50,
|
||||
"mass": 1000
|
||||
"baseShieldStrength": 240,
|
||||
"baseArmour": 432,
|
||||
"hullMass": 1000,
|
||||
"masslock": 16
|
||||
},
|
||||
"retailCost": 76555842,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"viper": {
|
||||
"properties": {
|
||||
"grp": "co",
|
||||
"name": "Viper",
|
||||
"manufacturer": "Faulcon DeLacy",
|
||||
"class": 1,
|
||||
"cost": 95893,
|
||||
"hullCost": 95893,
|
||||
"speed": 320,
|
||||
"boost": 400,
|
||||
"boostEnergy": 11,
|
||||
"agility": 6,
|
||||
"shields": 105,
|
||||
"armour": 126,
|
||||
"fuelcost": 50,
|
||||
"mass": 60
|
||||
"baseShieldStrength": 105,
|
||||
"baseArmour": 126,
|
||||
"hullMass": 60,
|
||||
"masslock": 7
|
||||
},
|
||||
"retailCost": 142931,
|
||||
"slots": {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"vulture": {
|
||||
"properties": {
|
||||
"grp": "co",
|
||||
"name": "Vulture",
|
||||
"manufacturer": "Core Dynamics",
|
||||
"class": 1,
|
||||
"cost": 4689629,
|
||||
"hullCost": 4689629,
|
||||
"speed": 210,
|
||||
"boost": 340,
|
||||
"boostEnergy": 17,
|
||||
"agility": 9,
|
||||
"shields": 240,
|
||||
"armour": 288,
|
||||
"fuelcost": 50,
|
||||
"mass": 230
|
||||
"baseShieldStrength": 240,
|
||||
"baseArmour": 288,
|
||||
"hullMass": 230,
|
||||
"masslock": 10
|
||||
},
|
||||
"retailCost": 4925615,
|
||||
"slots": {
|
||||
|
||||
10
gulpfile.js
10
gulpfile.js
@@ -60,7 +60,7 @@ gulp.task('js-lint', function() {
|
||||
});
|
||||
|
||||
gulp.task('json-lint', function() {
|
||||
return gulp.src('data/**/*.json')
|
||||
return gulp.src(['data/**/*.json' , 'app/schemas/**/*.json'])
|
||||
.pipe(jsonlint())
|
||||
.pipe(jsonlint.reporter())
|
||||
.pipe(jsonlint.failAfterError());
|
||||
@@ -126,7 +126,7 @@ gulp.task('js', function() {
|
||||
});
|
||||
|
||||
gulp.task('copy', function() {
|
||||
return gulp.src(['app/images/**','app/fonts/**','app/db.json'], {base: 'app/'})
|
||||
return gulp.src(['app/images/**','app/fonts/**','app/db.json', 'app/schemas/**'], {base: 'app/'})
|
||||
.pipe(gulp.dest('build'));
|
||||
});
|
||||
|
||||
@@ -140,7 +140,7 @@ gulp.task('generateIndexHTML', function(done) {
|
||||
gulp.src('app/index.html')
|
||||
.pipe(template({
|
||||
version: pkg.version,
|
||||
date : (new Date()).toLocaleDateString(),
|
||||
date : new Date().toISOString().slice(0, 10),
|
||||
uaTracking: process.env.CORIOLIS_UA_TRACKING || false,
|
||||
svgContent: svgIconsContent,
|
||||
gapiKey: process.env.CORIOLIS_GAPI_KEY
|
||||
@@ -192,7 +192,7 @@ gulp.task('serve-stop', function(cb) {
|
||||
|
||||
gulp.task('watch', function() {
|
||||
gulp.watch(['app/index.html','app/icons/*.svg'], ['generateIndexHTML']);
|
||||
gulp.watch(['app/images/**','app/fonts/**', 'app/db.json'], ['copy']);
|
||||
gulp.watch(['app/images/**','app/fonts/**', 'app/db.json', 'app/schemas/**'], ['copy']);
|
||||
gulp.watch('app/less/*.less', ['less']);
|
||||
gulp.watch('app/views/**/*', ['html2js']);
|
||||
gulp.watch('app/js/**/*.js', ['js']);
|
||||
@@ -201,7 +201,7 @@ gulp.task('watch', function() {
|
||||
});
|
||||
|
||||
gulp.task('cache-bust', function(done) {
|
||||
var rev_all = new revAll({ prefix: cdnHostStr, dontRenameFile: ['.html','db.json'] });
|
||||
var rev_all = new revAll({ prefix: cdnHostStr, dontRenameFile: ['.html','.json'] });
|
||||
var stream = gulp.src('build/**')
|
||||
.pipe(rev_all.revision())
|
||||
.pipe(gulp.dest('build'))
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
{
|
||||
"name": "coriolis_shipyard",
|
||||
"version": "0.14.1",
|
||||
"version": "1.3.0",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/cmmcleod/coriolis"
|
||||
},
|
||||
"private": true,
|
||||
"engine": "node >= 0.12.2",
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"angular-mocks": "1.3.x",
|
||||
"async": "0.9.x",
|
||||
@@ -30,9 +29,12 @@
|
||||
"gulp-uglify": "1.2.x",
|
||||
"gulp-util": "3.0.x",
|
||||
"jasmine-core": "2.3.x",
|
||||
"jsen": "^0.6.0",
|
||||
"json-concat": "0.0.x",
|
||||
"karma": "0.12.x",
|
||||
"karma-fixture": "^0.2.5",
|
||||
"karma-jasmine": "0.3.x",
|
||||
"karma-json-fixtures-preprocessor": "0.0.4",
|
||||
"karma-mocha-reporter": "1.0.x",
|
||||
"karma-phantomjs-launcher": "0.2.x",
|
||||
"main-bower-files": "2.8.x",
|
||||
|
||||
@@ -30,23 +30,23 @@ function writeDB(err, arr) {
|
||||
var shipOrder = Object.keys(arr[0]).sort();
|
||||
var internalOrder = Object.keys(arr[3]).sort();
|
||||
var hpOrder = [
|
||||
"Pulse Lasers",
|
||||
"Burst Lasers",
|
||||
"Beam Lasers",
|
||||
"Multi-cannons",
|
||||
"Cannons",
|
||||
"Fragment Cannons",
|
||||
"Rail Guns",
|
||||
"Plasma Accelerators",
|
||||
"Missile Racks",
|
||||
"Torpedo Pylons",
|
||||
"Mine Launchers",
|
||||
"Mining Lasers",
|
||||
"Shield Boosters",
|
||||
"Countermeasures",
|
||||
"Kill Warrant Scanners",
|
||||
"Frame Shift Wake Scanners",
|
||||
"Cargo Scanners"
|
||||
"Pulse Laser",
|
||||
"Burst Laser",
|
||||
"Beam Laser",
|
||||
"Multi-cannon",
|
||||
"Cannon",
|
||||
"Fragment Cannon",
|
||||
"Rail Gun",
|
||||
"Plasma Accelerator",
|
||||
"Missile Rack",
|
||||
"Torpedo Pylon",
|
||||
"Mine Launcher",
|
||||
"Mining Laser",
|
||||
"Cargo Scanner",
|
||||
"Countermeasure",
|
||||
"Frame Shift Wake Scanner",
|
||||
"Kill Warrant Scanner",
|
||||
"Shield Booster"
|
||||
];
|
||||
|
||||
for (var i = 0; i < internalOrder.length; i++) {
|
||||
|
||||
220
test/fixtures/anaconda-test-detailed-export.json
vendored
Normal file
220
test/fixtures/anaconda-test-detailed-export.json
vendored
Normal file
@@ -0,0 +1,220 @@
|
||||
{
|
||||
"$schema": "http://cdn.coriolis.io/schemas/ship-loadout/1.json#",
|
||||
"name": "Test",
|
||||
"ship": "Anaconda",
|
||||
"references": [
|
||||
{
|
||||
"name": "Coriolis.io",
|
||||
"url": "http://localhost:3300/outfit/anaconda/48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b?bn=Test",
|
||||
"code": "48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b",
|
||||
"shipId": "anaconda"
|
||||
}
|
||||
],
|
||||
"components": {
|
||||
"standard": {
|
||||
"bulkheads": "Reactive Surface Composite",
|
||||
"powerPlant": {
|
||||
"class": 8,
|
||||
"rating": "A"
|
||||
},
|
||||
"thrusters": {
|
||||
"class": 6,
|
||||
"rating": "A"
|
||||
},
|
||||
"frameShiftDrive": {
|
||||
"class": 6,
|
||||
"rating": "A"
|
||||
},
|
||||
"lifeSupport": {
|
||||
"class": 5,
|
||||
"rating": "A"
|
||||
},
|
||||
"powerDistributor": {
|
||||
"class": 8,
|
||||
"rating": "A"
|
||||
},
|
||||
"sensors": {
|
||||
"class": 8,
|
||||
"rating": "A"
|
||||
},
|
||||
"fuelTank": {
|
||||
"class": 5,
|
||||
"rating": "C"
|
||||
}
|
||||
},
|
||||
"hardpoints": [
|
||||
{
|
||||
"class": 4,
|
||||
"rating": "A",
|
||||
"group": "Plasma Accelerator",
|
||||
"mount": "Fixed"
|
||||
},
|
||||
{
|
||||
"class": 3,
|
||||
"rating": "D",
|
||||
"group": "Beam Laser",
|
||||
"mount": "Turret"
|
||||
},
|
||||
{
|
||||
"class": 3,
|
||||
"rating": "D",
|
||||
"group": "Beam Laser",
|
||||
"mount": "Turret"
|
||||
},
|
||||
{
|
||||
"class": 3,
|
||||
"rating": "D",
|
||||
"group": "Beam Laser",
|
||||
"mount": "Turret"
|
||||
},
|
||||
{
|
||||
"class": 2,
|
||||
"rating": "E",
|
||||
"group": "Cannon",
|
||||
"mount": "Turret"
|
||||
},
|
||||
{
|
||||
"class": 2,
|
||||
"rating": "E",
|
||||
"group": "Cannon",
|
||||
"mount": "Turret"
|
||||
},
|
||||
{
|
||||
"class": 1,
|
||||
"rating": "F",
|
||||
"group": "Beam Laser",
|
||||
"mount": "Turret"
|
||||
},
|
||||
{
|
||||
"class": 1,
|
||||
"rating": "F",
|
||||
"group": "Beam Laser",
|
||||
"mount": "Turret"
|
||||
}
|
||||
],
|
||||
"utility": [
|
||||
{
|
||||
"class": 0,
|
||||
"rating": "A",
|
||||
"group": "Shield Booster"
|
||||
},
|
||||
{
|
||||
"class": 0,
|
||||
"rating": "A",
|
||||
"group": "Shield Booster"
|
||||
},
|
||||
null,
|
||||
{
|
||||
"class": 0,
|
||||
"rating": "C",
|
||||
"group": "Kill Warrant Scanner"
|
||||
},
|
||||
{
|
||||
"class": 0,
|
||||
"rating": "C",
|
||||
"group": "Cargo Scanner"
|
||||
},
|
||||
{
|
||||
"class": 0,
|
||||
"rating": "F",
|
||||
"group": "Countermeasure",
|
||||
"name": "Electronic Countermeasure"
|
||||
},
|
||||
{
|
||||
"class": 0,
|
||||
"rating": "I",
|
||||
"group": "Countermeasure",
|
||||
"name": "Chaff Launcher"
|
||||
},
|
||||
{
|
||||
"class": 0,
|
||||
"rating": "I",
|
||||
"group": "Countermeasure",
|
||||
"name": "Point Defence"
|
||||
}
|
||||
],
|
||||
"internal": [
|
||||
{
|
||||
"class": 7,
|
||||
"rating": "A",
|
||||
"group": "Shield Generator"
|
||||
},
|
||||
{
|
||||
"class": 6,
|
||||
"rating": "A",
|
||||
"group": "Shield Cell Bank"
|
||||
},
|
||||
{
|
||||
"class": 6,
|
||||
"rating": "E",
|
||||
"group": "Cargo Rack"
|
||||
},
|
||||
{
|
||||
"class": 5,
|
||||
"rating": "D",
|
||||
"group": "Hull Reinforcement Package"
|
||||
},
|
||||
{
|
||||
"class": 5,
|
||||
"rating": "E",
|
||||
"group": "Cargo Rack"
|
||||
},
|
||||
null,
|
||||
null,
|
||||
{
|
||||
"class": 4,
|
||||
"rating": "E",
|
||||
"group": "Cargo Rack"
|
||||
},
|
||||
{
|
||||
"class": 4,
|
||||
"rating": "E",
|
||||
"group": "Cargo Rack"
|
||||
},
|
||||
{
|
||||
"class": 4,
|
||||
"rating": "A",
|
||||
"group": "Fuel Scoop"
|
||||
},
|
||||
{
|
||||
"class": 2,
|
||||
"rating": "A",
|
||||
"group": "FSD Interdictor"
|
||||
}
|
||||
]
|
||||
},
|
||||
"stats": {
|
||||
"class": 3,
|
||||
"hullCost": 141889932,
|
||||
"speed": 180,
|
||||
"boost": 240,
|
||||
"boostEnergy": 29,
|
||||
"agility": 2,
|
||||
"baseShieldStrength": 350,
|
||||
"baseArmour": 945,
|
||||
"hullMass": 400,
|
||||
"masslock": 23,
|
||||
"shipCostMultiplier": 1,
|
||||
"componentCostMultiplier": 1,
|
||||
"fuelCapacity": 32,
|
||||
"cargoCapacity": 128,
|
||||
"ladenMass": 1339.2,
|
||||
"armour": 2078,
|
||||
"armourAdded": 240,
|
||||
"armourMultiplier": 1.95,
|
||||
"shieldMultiplier": 1.4,
|
||||
"totalCost": 882362049,
|
||||
"unladenMass": 1179.2,
|
||||
"totalDps": 29,
|
||||
"powerAvailable": 36,
|
||||
"powerRetracted": 23.93,
|
||||
"powerDeployed": 35.56,
|
||||
"unladenRange": 18.49,
|
||||
"fullTankRange": 18.12,
|
||||
"ladenRange": 16.39,
|
||||
"unladenTotalRange": 73.21,
|
||||
"ladenTotalRange": 66.15,
|
||||
"maxJumpCount": 4,
|
||||
"shieldStrength": 833
|
||||
}
|
||||
}
|
||||
50
test/fixtures/expected-builds.json
vendored
Normal file
50
test/fixtures/expected-builds.json
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"type_6_transporter": {
|
||||
"Cargo": "02A4D4A2D2D2D4C-----04040303430101.Iw1-kA==.Aw1-kA==",
|
||||
"Miner": "03A4D4A2D2D2D4C2l2l---040403451q0101.Iw1-kA==.Aw1-kA==",
|
||||
"Hopper": "02A4D4A2D1A2D4C1717---030302024300-.Iw1-kA==.Aw1-kA=="
|
||||
},
|
||||
"type_7_transport": {
|
||||
"Cargo": "02A5D5A4D3D3D5C--------0505040403480101.Iw18aQ==.Aw18aQ==",
|
||||
"Miner": "04D5D5A4D2D3D5C--2l2l----0505041v03450000.Iw18aQ==.Aw18aQ=="
|
||||
},
|
||||
"federal_dropship": {
|
||||
"Cargo": "04D5D5A5D3D4D4C-1717------05040448020201.Iw18aQ==.Aw18aQ=="
|
||||
},
|
||||
"asp": {
|
||||
"Miner": "25A5A5A4D4A5A5C0s0s24242l2l---04054a1q02022o27.Iw18WQ==.Aw18WQ=="
|
||||
},
|
||||
"imperial_clipper": {
|
||||
"Cargo": "03A5D5A5D4D5D4C--0s0s----0605450302020101.Iw18aQ==.Aw18aQ==",
|
||||
"Dream": "26A6A5A5D6A5A4C0v0v0s0s0404040n4k5n5d2b29292o-.Iw18aQ==.Aw18aQ==",
|
||||
"Current": "04A6A5A5D4A5A4C----------------.Iw18aQ==.Aw18aQ=="
|
||||
},
|
||||
"type_9_heavy": {
|
||||
"Current": "04A7D6A5D5D4D6C---------0706054a0303020224.Iw18eQ==.Aw18eQ=="
|
||||
},
|
||||
"python": {
|
||||
"Cargo": "04A6D5A4D6D6D5C---------050505040448020201.Iw18eQ==.Aw18eQ==",
|
||||
"Miner": "06A6A5A4D6A6A5C0v0v0v2m2m0404--050505Ce4a1v02022o.Iw18eQ==.Aw18eQ==",
|
||||
"Dream": "27A6A5A4D7A6A5C0v0v0v27270404040m5n5n4f2d2d032t0201.Iw18eQ==.Aw18eQ==",
|
||||
"Missile": "07E6E5E4E7E6E5C2f2g2d2ePh----04044j03---002h.Iw18eQ==.Aw18eQ=="
|
||||
},
|
||||
"anaconda": {
|
||||
"Dream": "48A7A6A5D8A8A5C2c0o0o0o1m1m0q0q0404040l0b0100004k5n5n112d2d040303326b.Iw18ZlA=.Aw18ZlA=",
|
||||
"Cargo": "04A6D6A5D5D8D5C----------------0605050504040445030301.Iw18ZlA=.Aw18ZlA=",
|
||||
"Current": "04A6D6A5D5A8D5C----------------0605050504040403034524.Iw18ZlA=.Aw18ZlA=",
|
||||
"Explorer": "04A6D6A5D5A8D5C--------0202------f7050505040s372f2i4524.Iw18ZlA=.Aw18ZlA=",
|
||||
"Test": "48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.Iw18ZlA=.Aw18ZlA="
|
||||
},
|
||||
"diamondback_explorer": {
|
||||
"Explorer": "02A4D5A3D3D3D5C---0202--320p432i2f.Iw1-kA==.Aw1-kA=="
|
||||
},
|
||||
"vulture": {
|
||||
"Bounty Hunter": "34A4C4A3D5A4A3C1e1e0404-0l4a5d27662j.Iw19kA==.Aw19kA=="
|
||||
},
|
||||
"fer_de_lance": {
|
||||
"Attack": "25A5C4A4D6A4A3C1r0s0s0s0s000404-04-4a-5d27-.Iw18aQ==.Aw18aQ=="
|
||||
},
|
||||
"eagle": {
|
||||
"Figther": "42A3A3A1D2A2A2C0p0p24-40532j.Iw19A===.Aw19A==="
|
||||
}
|
||||
}
|
||||
50
test/fixtures/old-valid-export.json
vendored
Normal file
50
test/fixtures/old-valid-export.json
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"builds": {
|
||||
"type_6_transporter": {
|
||||
"Cargo": "02A4D4A2D2D2D4C-----04040303430101",
|
||||
"Miner": "03A4D4A2D2D2D4C2l2l---040403451q0101",
|
||||
"Hopper": "02A4D4A2D1A2D4C1717---030302024300-"
|
||||
},
|
||||
"type_7_transport": {
|
||||
"Cargo": "02A5D5A4D3D3D5C--------0505040403480101",
|
||||
"Miner": "04D5D5A4D2D3D5C--2l2l----0505041v03450000"
|
||||
},
|
||||
"federal_dropship": {
|
||||
"Cargo": "04D5D5A5D3D4D4C-1717------05040448020201"
|
||||
},
|
||||
"asp": {
|
||||
"Miner": "25A5A5A4D4A5A5C0s0s24242l2l---04054a1q02022o27"
|
||||
},
|
||||
"imperial_clipper": {
|
||||
"Cargo": "03A5D5A5D4D5D4C--0s0s----0605450302020101",
|
||||
"Dream": "26A6A5A5D6A5A4C0v0v0s0s0404040n4k5n5d2b29292o-.AwRj4yWU1I==.CwBhCYy6YRigzLIA",
|
||||
"Current": "04A6A5A5D4A5A4C----------------.AwRj4yWU1I==.CwBhCYy6YRigzLIA"
|
||||
},
|
||||
"type_9_heavy": {
|
||||
"Current": "04A7D6A5D5D4D6C---------0706054a0303020224.AwRj4yoo.EwBhEYy6dsg="
|
||||
},
|
||||
"python": {
|
||||
"Cargo": "04A6D5A4D6D6D5C---------050505040448020201.Iw18eQ==.Aw18eQ==",
|
||||
"Miner": "06A6A5A4D6A6A5C0v0v0v2m2m0404--050505Ce4a1v02022o.Iw18eQ==.IwBhBYy6dkCYg===",
|
||||
"Dream": "27A6A5A4D7A6A5C0v0v0v27270404040m5n5n4f2d2d032t0201.Iw1+gDBxA===.EwBhEYy6e0WEA==="
|
||||
},
|
||||
"anaconda": {
|
||||
"Dream": "48A7A6A5D8A8A5C2c0o0o0o1m1m0q0q0404040l0b0100004k5n5n112d2d040303326b.AwRj4yo5dig=.MwBhCYy6du3ARiA=",
|
||||
"Cargo": "04A6D6A5D5D8D5C----------------0605050504040445030301.Iw18ZlA=.Aw18ZlA=",
|
||||
"Current": "04A6D6A5D5A8D5C----------------0605050504040403034524.Iw18ZlA=.Aw18ZlA=",
|
||||
"Explorer": "04A6D6A5D5A8D5C--------0202------f7050505040s372f2i4524.AwRj4yVKJthA.AwhMIyungRhEA==="
|
||||
},
|
||||
"diamondback_explorer": {
|
||||
"Explorer": "02A4D5A3D3D3D5C---0202--320p432i2f.AwRj4zTI.AwiMIypI"
|
||||
},
|
||||
"vulture": {
|
||||
"Bounty Hunter": "34A4C4A3D5A4A3C1e1e0404-0l4a5d27662j.AwRj4y2I.MwBhBYy6wJmAjLIA"
|
||||
},
|
||||
"fer_de_lance": {
|
||||
"Attack": "25A5C4A4D6A4A3C1r0s0s0s0s000404-04-4a-5d27-.Iw18aQ==.CwBhrSu8EZyA"
|
||||
},
|
||||
"eagle": {
|
||||
"Figther": "42A3A3A1D2A2A2C0p0p24-40532j.AwRj49iA.AwgsIkEZigmIA==="
|
||||
}
|
||||
}
|
||||
}
|
||||
66
test/fixtures/valid-backup.json
vendored
Normal file
66
test/fixtures/valid-backup.json
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"builds": {
|
||||
"type_6_transporter": {
|
||||
"Cargo": "02A4D4A2D2D2D4C-----04040303430101",
|
||||
"Miner": "03A4D4A2D2D2D4C2l2l---040403451q0101",
|
||||
"Hopper": "02A4D4A2D1A2D4C1717---030302024300-"
|
||||
},
|
||||
"type_7_transport": {
|
||||
"Cargo": "02A5D5A4D3D3D5C--------0505040403480101",
|
||||
"Miner": "04D5D5A4D2D3D5C--2l2l----0505041v03450000"
|
||||
},
|
||||
"federal_dropship": {
|
||||
"Cargo": "04D5D5A5D3D4D4C-1717------05040448020201"
|
||||
},
|
||||
"asp": {
|
||||
"Miner": "25A5A5A4D4A5A5C0s0s24242l2l---04054a1q02022o27"
|
||||
},
|
||||
"cobra_mk_iii": {
|
||||
"Example": "24A4A4A3D3A3A4C0s0s2d2d0m0445032b2o2753.AwRj4yKA.CwBhEYyrKhmMQ===",
|
||||
},
|
||||
"imperial_clipper": {
|
||||
"Cargo": "03A5D5A5D4D5D4C--0s0s----0605450302020101",
|
||||
"Multi-purpose": "26A4A5A5D6A5A4C0v0v272704090j0h064f2c0302020101",
|
||||
"Current": "05A6D5A5D6A5A4C0v0v27270404050n4m05035d29292o01.AwRj4yrI.AwhMIyuBGNiA",
|
||||
"Dream": "26A6A5A5D6A5A4C0v0v0s0s04040c0n064f5d2b02022o0d.AwRj49UlmI==.AwiMIyuo"
|
||||
},
|
||||
"type_9_heavy": {
|
||||
"Cargo": "04A6D6A5D4D4D5C---------07064f040303010201.AwRj4yoo.EwBhEYy6dsg="
|
||||
},
|
||||
"python": {
|
||||
"Cargo": "04A6D5A4D6D6D5C---------050505044a03020201",
|
||||
"Miner": "04A6D5A4D6D6D5C---2m2m----050505044d1v02022o"
|
||||
},
|
||||
"anaconda": {
|
||||
"Dream": "48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404040l0b0100034k5n05050404040303326b.AwRj4yo5dig=.MwBhEYy6duwEziA=",
|
||||
"Cargo": "03A7D6A5D4D8D5C----------------060505054d040403030301.AwRj4yuqg===.Aw18ZlA="
|
||||
},
|
||||
"diamondback_explorer": {
|
||||
"Explorer": "02A4D5A3D3D3D5C-------320p432i2f.AwRj4zTI.AwiMIypI"
|
||||
}
|
||||
},
|
||||
"comparisons": {
|
||||
"Test": {
|
||||
"facets": [ 9, 6, 4, 1, 3, 2 ],
|
||||
"builds": [
|
||||
{
|
||||
"shipId": "anaconda",
|
||||
"buildName": "Dream"
|
||||
},
|
||||
{
|
||||
"shipId": "asp",
|
||||
"buildName": "Miner"
|
||||
},
|
||||
{
|
||||
"shipId": "diamondback_explorer",
|
||||
"buildName": "Explorer"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"insurance": "Beta",
|
||||
"discounts": [
|
||||
1,
|
||||
1
|
||||
]
|
||||
}
|
||||
3620
test/fixtures/valid-detailed-export.json
vendored
Normal file
3620
test/fixtures/valid-detailed-export.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,23 +1,27 @@
|
||||
// Karma configuration
|
||||
// Generated on Thu Jun 11 2015 19:39:40 GMT-0700 (PDT)
|
||||
|
||||
module.exports = function(config) {
|
||||
config.set({
|
||||
basePath: '',
|
||||
// frameworks to use
|
||||
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
|
||||
frameworks: ['jasmine'],
|
||||
// list of files / patterns to load in the browser
|
||||
frameworks: ['jasmine', 'fixture'],
|
||||
preprocessors: {
|
||||
'../build/schemas/**/*.json': ['json_fixtures'],
|
||||
'fixtures/**/*.json': ['json_fixtures']
|
||||
},
|
||||
files: [
|
||||
'../build/lib*.js',
|
||||
'../node_modules/angular-mocks/angular-mocks.js',
|
||||
'../node_modules/jsen/dist/jsen.js',
|
||||
'../build/app*.js',
|
||||
'tests/**/*.js'
|
||||
'../build/schemas/**/*.json',
|
||||
'fixtures/**/*.json',
|
||||
'tests/**/*.js',
|
||||
],
|
||||
jsonFixturesPreprocessor: {
|
||||
stripPrefix: '.*(/build/)',
|
||||
variableName: '__json__'
|
||||
},
|
||||
reporters: ['mocha'],
|
||||
port: 9876,
|
||||
colors: true,
|
||||
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
|
||||
logLevel: config.LOG_INFO,
|
||||
autoWatch: false,
|
||||
browsers: ['PhantomJS'],
|
||||
|
||||
140
test/tests/test-controller-import.js
Normal file
140
test/tests/test-controller-import.js
Normal file
@@ -0,0 +1,140 @@
|
||||
describe('Import Controller', function() {
|
||||
beforeEach(module('app'));
|
||||
|
||||
var importController, $rootScope, $stateParams, scope;
|
||||
|
||||
var eventStub = {
|
||||
preventDefault: function(){ },
|
||||
stopPropagation: function(){ }
|
||||
};
|
||||
|
||||
beforeEach(inject(function(_$rootScope_, $controller) {
|
||||
$rootScope = _$rootScope_;
|
||||
$rootScope.discounts = {
|
||||
ship: 1,
|
||||
components: 1
|
||||
};
|
||||
$stateParams = { };
|
||||
scope = $rootScope.$new();
|
||||
scope.$parent.dismiss = function() {};
|
||||
|
||||
var store = {};
|
||||
|
||||
spyOn(localStorage, 'getItem').and.callFake(function (key) {
|
||||
return store[key];
|
||||
});
|
||||
spyOn(localStorage, 'setItem').and.callFake(function (key, value) {
|
||||
return store[key] = value + '';
|
||||
});
|
||||
spyOn(localStorage, 'clear').and.callFake(function () {
|
||||
store = {};
|
||||
});
|
||||
|
||||
importController = $controller('ImportController', { $rootScope: $rootScope, $scope: scope, $stateParams: $stateParams });
|
||||
}));
|
||||
|
||||
describe('Import Backup', function() {
|
||||
|
||||
it('imports a valid backup', function() {
|
||||
var importData = __json__['fixtures/valid-backup'];
|
||||
scope.importJSON = angular.toJson(importData);
|
||||
scope.validateJson();
|
||||
expect(scope.jsonValid).toBeTruthy();
|
||||
expect(scope.errorMsg).toEqual(null);
|
||||
scope.process();
|
||||
expect(scope.processed).toBeTruthy();
|
||||
scope.import();
|
||||
expect(angular.fromJson(localStorage.getItem('builds'))).toEqual(importData.builds);
|
||||
expect(angular.fromJson(localStorage.getItem('comparisons'))).toEqual(importData.comparisons);
|
||||
expect(localStorage.getItem('insurance')).toEqual(importData.insurance);
|
||||
expect(angular.fromJson(localStorage.getItem('discounts'))).toEqual(importData.discounts);
|
||||
});
|
||||
|
||||
it('imports an old valid backup', function() {
|
||||
var importData = __json__['fixtures/old-valid-export'];
|
||||
scope.importJSON = angular.toJson(importData);
|
||||
scope.validateJson();
|
||||
expect(scope.jsonValid).toBeTruthy();
|
||||
expect(scope.errorMsg).toEqual(null);
|
||||
scope.process();
|
||||
expect(scope.processed).toBeTruthy();
|
||||
scope.import();
|
||||
expect(angular.fromJson(localStorage.getItem('builds'))).toEqual(importData.builds);
|
||||
});
|
||||
|
||||
it('catches an invalid backup', function() {
|
||||
var importData = __json__['fixtures/valid-backup'];
|
||||
|
||||
scope.importJSON = 'null';
|
||||
scope.validateJson();
|
||||
expect(scope.jsonValid).toBeFalsy();
|
||||
expect(scope.errorMsg).toEqual('Must be an object or array!');
|
||||
|
||||
scope.importJSON = '{ "builds": "Should not be a string" }';
|
||||
scope.validateJson();
|
||||
expect(scope.jsonValid).toBeFalsy();
|
||||
expect(scope.errorMsg).toEqual('builds must be an object!');
|
||||
|
||||
scope.importJSON = angular.toJson(importData).replace('anaconda', 'invalid_ship');
|
||||
scope.validateJson();
|
||||
expect(scope.jsonValid).toBeFalsy();
|
||||
expect(scope.errorMsg).toEqual('"invalid_ship" is not a valid Ship Id!');
|
||||
|
||||
scope.importJSON = angular.toJson(importData).replace('Dream', '');
|
||||
scope.validateJson();
|
||||
expect(scope.jsonValid).toBeFalsy();
|
||||
expect(scope.errorMsg).toEqual('Imperial Clipper build "" must be a string at least 3 characters long!');
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
describe('Import Detailed Build', function() {
|
||||
|
||||
it('imports a valid build', function() {
|
||||
var importData = __json__['fixtures/anaconda-test-detailed-export'];
|
||||
scope.importJSON = angular.toJson(importData);
|
||||
scope.validateJson();
|
||||
expect(scope.jsonValid).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.Iw18ZlA=.Aw18ZlA=' }
|
||||
});
|
||||
});
|
||||
|
||||
it('catches an invalid build', function() {
|
||||
var importData = __json__['fixtures/anaconda-test-detailed-export'];
|
||||
scope.importJSON = angular.toJson(importData).replace('components', 'comps');
|
||||
scope.validateJson();
|
||||
expect(scope.jsonValid).toBeFalsy();
|
||||
expect(scope.errorMsg).toEqual('Anaconda Build "Test": Invalid data');
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
describe('Import Detaild Builds Array', function() {
|
||||
|
||||
it('imports all builds', function() {
|
||||
var importData = __json__['fixtures/valid-detailed-export'];
|
||||
var expectedBuilds = __json__['fixtures/expected-builds'];
|
||||
scope.importJSON = angular.toJson(importData);
|
||||
scope.validateJson();
|
||||
expect(scope.jsonValid).toBeTruthy();
|
||||
expect(scope.errorMsg).toEqual(null);
|
||||
scope.process();
|
||||
expect(scope.processed).toBeTruthy();
|
||||
scope.import();
|
||||
var builds = angular.fromJson(localStorage.getItem('builds'));
|
||||
for (var s in builds) {
|
||||
for (var b in builds[s]) {
|
||||
expect(builds[s][b]).toEqual(expectedBuilds[s][b]);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
50
test/tests/test-controller-outfit.js
Normal file
50
test/tests/test-controller-outfit.js
Normal file
@@ -0,0 +1,50 @@
|
||||
describe("Outfit Controller", function() {
|
||||
beforeEach(module('app'));
|
||||
|
||||
var outfitController, $rootScope, $stateParams, scope;
|
||||
|
||||
var eventStub = {
|
||||
preventDefault: function(){ },
|
||||
stopPropagation: function(){ }
|
||||
};
|
||||
|
||||
beforeEach(inject(function(_$rootScope_, $controller) {
|
||||
$rootScope = _$rootScope_;
|
||||
$rootScope.discounts = { ship: 1, components: 1};
|
||||
$stateParams = { shipId: 'anaconda'};
|
||||
scope = $rootScope.$new();
|
||||
outfitController = $controller('OutfitController', { $rootScope: $rootScope, $scope: scope, $stateParams: $stateParams });
|
||||
}));
|
||||
|
||||
describe("Retrofitting Costs", function() {
|
||||
|
||||
it("are empty by default", function() {
|
||||
expect(scope.retrofitTotal).toEqual(0);
|
||||
expect(scope.retrofitList.length).toEqual(0);
|
||||
});
|
||||
|
||||
it("updates on bulkheads change", function() {
|
||||
scope.select('b', scope.ship.bulkheads, eventStub, "1"); // Use Reinforced Alloy Bulkheads
|
||||
expect(scope.retrofitTotal).toEqual(58787780);
|
||||
expect(scope.retrofitList.length).toEqual(1);
|
||||
scope.select('b', scope.ship.bulkheads, eventStub, "0"); // Use Reinforced Alloy Bulkheads
|
||||
expect(scope.retrofitTotal).toEqual(0);
|
||||
expect(scope.retrofitList.length).toEqual(0);
|
||||
});
|
||||
|
||||
it("updates on component change", function() {
|
||||
scope.select('h', scope.ship.hardpoints[0], eventStub, "0u"); // 3C/F Beam Laser
|
||||
expect(scope.retrofitTotal).toEqual(1177600);
|
||||
expect(scope.retrofitList.length).toEqual(1);
|
||||
scope.select('h', scope.ship.hardpoints[6], eventStub, "empty"); // Remove default pulse laser
|
||||
scope.select('h', scope.ship.hardpoints[7], eventStub, "empty"); // Remove default pulse laser
|
||||
expect(scope.retrofitTotal).toEqual(1173200);
|
||||
expect(scope.retrofitList.length).toEqual(3);
|
||||
scope.select('i', scope.ship.internal[3], eventStub, "11"); // Use 6A Auto field maintenance unit
|
||||
expect(scope.retrofitTotal).toEqual(16478701);
|
||||
expect(scope.retrofitList.length).toEqual(4);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
@@ -1,8 +1,8 @@
|
||||
describe("Database", function() {
|
||||
describe('Database', function() {
|
||||
|
||||
var shipProperties = ["grp", "name", "manufacturer", "class", "cost", "speed", "boost", "agility", "shields", "armour", "fuelcost", "mass"];
|
||||
var shipProperties = ['name', 'manufacturer', 'class', 'hullCost', 'speed', 'boost', 'agility', 'baseShieldStrength', 'baseArmour', 'hullMass', 'masslock'];
|
||||
|
||||
it("has ships and components", function() {
|
||||
it('has ships and components', function() {
|
||||
expect(DB.ships).toBeDefined()
|
||||
expect(DB.components.common).toBeDefined();
|
||||
expect(DB.components.hardpoints).toBeDefined();
|
||||
@@ -10,7 +10,7 @@ describe("Database", function() {
|
||||
expect(DB.components.bulkheads).toBeDefined();
|
||||
});
|
||||
|
||||
it("has unique IDs for every hardpoint", function() {
|
||||
it('has unique IDs for every hardpoint', function() {
|
||||
var ids = {};
|
||||
var groups = DB.components.hardpoints;
|
||||
|
||||
@@ -25,7 +25,7 @@ describe("Database", function() {
|
||||
}
|
||||
});
|
||||
|
||||
it("has valid internal components", function() {
|
||||
it('has unique IDs for every internal component', function() {
|
||||
var ids = {};
|
||||
var groups = DB.components.internal;
|
||||
|
||||
@@ -40,7 +40,7 @@ describe("Database", function() {
|
||||
}
|
||||
});
|
||||
|
||||
it("has data for every ship", function() {
|
||||
it('has data for every ship', function() {
|
||||
for (var s in DB.ships) {
|
||||
for (var p = 0; p < shipProperties.length; p++) {
|
||||
expect(DB.ships[s].properties[shipProperties[p]]).toBeDefined(shipProperties[p] + ' is missing for ' + s);
|
||||
@@ -49,12 +49,12 @@ describe("Database", function() {
|
||||
expect(DB.ships[s].defaults.common.length).toEqual(7, s + ' is missing common defaults');
|
||||
expect(DB.ships[s].slots.hardpoints.length).toEqual(DB.ships[s].defaults.hardpoints.length, s + ' hardpoint slots and defaults dont match');
|
||||
expect(DB.ships[s].slots.internal.length).toEqual(DB.ships[s].defaults.internal.length, s + ' hardpoint slots and defaults dont match');
|
||||
expect(DB.ships[s].retailCost).toBeGreaterThan(DB.ships[s].properties.cost, s + ' has invalid retail cost');
|
||||
expect(DB.ships[s].retailCost).toBeGreaterThan(DB.ships[s].properties.hullCost, s + ' has invalid retail cost');
|
||||
expect(DB.components.bulkheads[s]).toBeDefined(s + ' is missing bulkheads');
|
||||
}
|
||||
});
|
||||
|
||||
it("has components with a group defined", function() {
|
||||
it('has components with a group defined', function() {
|
||||
for (var i = 0; i < DB.components.common.length; i++) {
|
||||
var group = DB.components.common[i];
|
||||
for (var c in group) {
|
||||
|
||||
@@ -29,7 +29,7 @@ describe("Ship Factory", function() {
|
||||
expect(ship.unladenTotalRange).toBeGreaterThan(0, s + ' unladenTotalRange');
|
||||
expect(ship.ladenTotalRange).toBeGreaterThan(0, s + ' ladenTotalRange');
|
||||
expect(ship.shieldStrength).toBeGreaterThan(0, s + ' shieldStrength');
|
||||
expect(ship.armourTotal).toBeGreaterThan(0, s + ' armourTotal');
|
||||
expect(ship.armour).toBeGreaterThan(0, s + ' armour');
|
||||
}
|
||||
});
|
||||
|
||||
@@ -74,7 +74,7 @@ describe("Ship Factory", function() {
|
||||
var testShip = new Ship(id, cobra.properties, cobra.slots);
|
||||
testShip.buildWith(cobra.defaults);
|
||||
|
||||
var originalHullCost = testShip.cost;
|
||||
var originalHullCost = testShip.hullCost;
|
||||
var originalTotalCost = testShip.totalCost;
|
||||
var discount = 0.9;
|
||||
|
||||
|
||||
57
test/tests/test-service-serializer.js
Normal file
57
test/tests/test-service-serializer.js
Normal file
@@ -0,0 +1,57 @@
|
||||
describe("Serializer Service", function() {
|
||||
beforeEach(module('app'));
|
||||
|
||||
var Ship,
|
||||
Serializer,
|
||||
code = '48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b',
|
||||
anaconda = DB.ships['anaconda'],
|
||||
testBuild,
|
||||
exportData;
|
||||
|
||||
beforeEach(inject(function (_Ship_, _Serializer_) {
|
||||
Ship = _Ship_;
|
||||
Serializer = _Serializer_;
|
||||
}));
|
||||
|
||||
describe("To Detailed Build", function() {
|
||||
|
||||
beforeEach(function() {
|
||||
testBuild = new Ship('anaconda', anaconda.properties, anaconda.slots);
|
||||
Serializer.toShip(testBuild, code);
|
||||
exportData = Serializer.toDetailedBuild('Test', testBuild, code);
|
||||
});
|
||||
|
||||
it("conforms to the ship-loadout schema", function() {
|
||||
var shipLoadoutSchema = __json__['schemas/ship-loadout/1'];
|
||||
var validate = jsen(shipLoadoutSchema);
|
||||
var valid = validate(exportData);
|
||||
expect(valid).toBeTruthy();
|
||||
});
|
||||
|
||||
it("contains the correct components and stats", function() {
|
||||
var anacondaTestExport = __json__['fixtures/anaconda-test-detailed-export'];
|
||||
expect(exportData.components).toEqual(anacondaTestExport.components);
|
||||
expect(exportData.stats).toEqual(anacondaTestExport.stats);
|
||||
expect(exportData.ship).toEqual(anacondaTestExport.ship);
|
||||
expect(exportData.name).toEqual(anacondaTestExport.name);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
describe("From Detailed Build", function() {
|
||||
|
||||
it("builds the ship correctly", function() {
|
||||
var anacondaTestExport = __json__['fixtures/anaconda-test-detailed-export'];
|
||||
testBuildA = new Ship('anaconda', anaconda.properties, anaconda.slots);
|
||||
Serializer.toShip(testBuildA, code);
|
||||
testBuildB = Serializer.fromDetailedBuild(anacondaTestExport);
|
||||
|
||||
for(var p in testBuildB) {
|
||||
expect(testBuildB[p]).toEqual(testBuildA[p], p + ' does not match');
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
Reference in New Issue
Block a user