Compare commits

...

66 Commits

Author SHA1 Message Date
Colin McLeod
f0bdcd5557 Bumping version to 1.3.0 2015-07-20 13:42:38 -07:00
Colin McLeod
b1ee0e44f3 Linting fixes, update unit test 2015-07-20 13:42:21 -07:00
Colin McLeod
c96e6afbd7 Power Distributor required for Boost. Resolves #17 2015-07-20 13:37:03 -07:00
Colin McLeod
77334341ea Armour value improved by bulkhead 2015-07-20 00:55:51 -07:00
Colin McLeod
5f22743778 Bumping to version 1.2.0 2015-07-19 22:30:30 -07:00
Colin McLeod
03986cb88a Massive refactor for 3rd party import 2015-07-19 21:32:14 -07:00
Colin McLeod
c796adf40d Add Persist.getAll for backup purposes 2015-07-18 16:50:50 -07:00
Colin McLeod
2890ff5537 Add description to export modal 2015-07-18 16:50:03 -07:00
Colin McLeod
a6ba61a2bf Change loadout schema slightly 2015-07-18 14:46:22 -07:00
Colin McLeod
db5e080992 Change meta description 2015-07-18 14:45:36 -07:00
Colin McLeod
63d7f98e2c Fix total jump range calculation bug 2015-07-18 14:45:08 -07:00
Colin McLeod
7997ff6ae9 Correct Beta insurance rate 2015-07-17 09:07:16 -07:00
Colin McLeod
b3126cf6b6 Renaming data test for consistency 2015-07-15 21:11:23 -07:00
Colin McLeod
ab1ea53ce3 Implement export for 3rd Party sites 2015-07-15 16:13:17 -07:00
Colin McLeod
82a87cb653 Adjust select menu size for smaller windows 2015-07-15 15:31:40 -07:00
Colin McLeod
d2fc526039 Don't cachebust JSON files.. 2015-07-14 21:58:27 -07:00
Colin McLeod
88587c6487 Bumping version to 1.1.0 2015-07-14 21:48:11 -07:00
Colin McLeod
4578dbf906 Refactor many variable names, adding detailed json dump and schema 2015-07-14 21:44:12 -07:00
Colin McLeod
cd48ef6f86 Removing ship purpose 2015-07-13 12:33:40 -07:00
Colin McLeod
0f0e67ec9c Adding mass lock factor 2015-07-13 11:08:49 -07:00
Colin McLeod
bbb2a223af Updating price for mining lance 2015-07-13 10:58:05 -07:00
Colin McLeod
5278e52e2f Updating price for Pack-hound 2015-07-13 10:57:52 -07:00
Colin McLeod
e6290abef7 Correcting prices 2015-07-11 00:17:21 -07:00
Colin McLeod
346fee1208 Improve readbility of power distributor and thruster data 2015-07-07 18:29:25 -07:00
Colin McLeod
1b9f5f870e Change component select hover color 2015-07-07 18:29:07 -07:00
Colin McLeod
26b624d1dd Use default right-click action when SHIFT key is held 2015-07-07 15:34:28 -07:00
Colin McLeod
7cbd9732b7 List Utility mounts in alphabetical order 2015-07-07 14:51:23 -07:00
Colin McLeod
44152116b4 Linting fix 2015-07-07 11:30:38 -07:00
Colin McLeod
3ad35992fc Use full names for limpet controllers 2015-07-07 11:20:48 -07:00
Colin McLeod
e963eb24a0 Adding Imperial Hammer rail gun 2015-07-07 11:20:26 -07:00
Colin McLeod
827e2b403c Adding Distrupoter pulse laser 2015-07-07 11:20:07 -07:00
Colin McLeod
0fd4712021 Adding Advanced Plasma Accelerator 2015-07-07 11:19:49 -07:00
Colin McLeod
ae0af05e78 Adding Enforcer Multi-cannon 2015-07-07 11:19:31 -07:00
Colin McLeod
dd00f283e6 Adding Pack-Hound missle rack 2015-07-07 11:19:12 -07:00
Colin McLeod
eddf968629 Adding Mining Lance laser 2015-07-07 11:18:50 -07:00
Colin McLeod
7fdd83ba84 Adding Pacifier frag cannon 2015-07-07 11:18:28 -07:00
Colin McLeod
1bb4f6850e Clean up cannon data 2015-07-07 11:18:05 -07:00
Colin McLeod
f47b931380 Adding Cryptoscrambler burst laser 2015-07-07 11:17:45 -07:00
Colin McLeod
d9f686f0d6 Adding Retributor beam laser 2015-07-07 11:17:25 -07:00
Colin McLeod
73cef20073 Format for readability 2015-07-07 11:17:05 -07:00
Colin McLeod
fd68565d8e Adding prismatic Shield Generators 2015-07-07 11:16:40 -07:00
Colin McLeod
a45d165d33 UI Tweaks 2015-07-06 15:45:56 -07:00
Colin McLeod
904f828d83 Change cargo rack order, remove long name 2015-07-06 11:20:34 -07:00
Colin McLeod
f00420c92f UI Tweaks 2015-07-06 11:20:08 -07:00
Colin McLeod
457705014c Bumping version to 1.0.4 2015-07-03 18:25:54 -07:00
Colin McLeod
6faf3765e0 Fix to scroll to top on iOS 2015-07-03 18:23:19 -07:00
Colin McLeod
4abdce2b70 Fix button wrapping issue on small screens 2015-07-03 15:42:08 -07:00
Colin McLeod
3b44f5fe27 Bumping version 1.0.3 2015-07-03 15:33:47 -07:00
Colin McLeod
7332dc69ed Linting issues 2015-07-03 15:31:52 -07:00
Colin McLeod
381387c04f UI Tweaks, persist cost tab open, revert outfitting order to original 2015-07-03 15:30:49 -07:00
Colin McLeod
e0db9fdfb0 Fix scrolling on iOS 2015-07-03 12:15:35 -07:00
Colin McLeod
a8d66b22af Bumping version to 1.0.2 2015-07-02 20:43:13 -07:00
Colin McLeod
bdc1e622f9 UI Tweaks, scrolling fixes and improvements 2015-07-02 20:42:46 -07:00
Colin McLeod
ad8130ae9b Add missing class 7 & 8 internal fuel tanks 2015-07-02 19:24:52 -07:00
Colin McLeod
394a3bb9f1 Revert to ui-router-extras 0.0.13 due to bug introduced in 0.0.14 2015-07-02 10:41:24 -07:00
Colin McLeod
54907b462c Tweak select look and feel on firefox, safari 2015-07-01 23:41:32 -07:00
Colin McLeod
1350de1910 Empty retrofitting table color fix 2015-06-30 21:55:38 -07:00
Colin McLeod
89d3fd69e1 UI tweaks for mobile 2015-06-30 21:46:05 -07:00
Colin McLeod
7325081ec9 Version 1.0.0 :D 2015-06-30 21:09:19 -07:00
Colin McLeod
680872a302 Retrofitting costs added to outfit page 2015-06-30 21:06:12 -07:00
Colin McLeod
a3c65d6c69 Code comments 2015-06-30 19:25:57 -07:00
Colin McLeod
a189265326 Fix svg click bug in Chrome 2015-06-30 19:25:36 -07:00
Colin McLeod
b447e913ff no need to abbreviate shield details 2015-06-29 16:28:41 -07:00
Colin McLeod
b5a249fb4b Change latest version date format 2015-06-29 16:27:56 -07:00
Colin McLeod
ae081c147e Fix negative power for limpet controllers 2015-06-29 15:42:35 -07:00
Colin McLeod
3ce0d0bdd8 Add dps to outfit page 2015-06-29 15:03:04 -07:00
98 changed files with 5969 additions and 2526 deletions

View File

@@ -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">

View File

@@ -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

View File

@@ -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' } } });

View File

@@ -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);

View File

@@ -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();
};

View File

@@ -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();
});
}]);

View File

@@ -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>');
}

View File

@@ -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 });
});
}
});
};
}]);

View File

@@ -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();

View File

@@ -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;
};

View File

@@ -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;
}
}]);

View File

@@ -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);
}
}

View File

@@ -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;
};

View File

@@ -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;

View File

@@ -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]);
};
}]);

View File

@@ -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;

View File

@@ -66,3 +66,7 @@
color: @warning-disabled;
fill: @warning-disabled;
}
.bg-warning-disabled {
background-color: @warning-disabled;
}

View File

@@ -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;

View File

@@ -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;
}
}
});

View File

@@ -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 {

View File

@@ -24,6 +24,13 @@
text-transform: none;
}
.name {
overflow: hidden;
white-space: nowrap;
max-width: 80%;
text-overflow: ellipsis;
}
.cb {
overflow: hidden;
}

View File

@@ -8,6 +8,10 @@ table {
color: @primary;
text-decoration: none;
}
[ng-click] {
cursor: pointer;
}
}
thead {

View 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" ] }
}
}

View File

@@ -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>

View File

@@ -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>&nbsp;&nbsp;&nbsp;Refuel Time: {{$r.fTime(fuel * 1000 / c.c.rate)}}</div>
<div class="l" ng-if="c.c.ammo">Ammo: {{c.c.ammo}}</div>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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">&#9662;</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">

View File

@@ -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",

View File

@@ -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 }
}

View File

@@ -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 }
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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,

View File

@@ -1,5 +1,5 @@
{
"Cargo Scanners": [
"Cargo Scanner": [
{
"id": "0d",
"grp": "cs",

View File

@@ -1,5 +1,5 @@
{
"Countermeasures": [
"Countermeasure": [
{
"id": "00",
"grp": "cm",

View File

@@ -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
}
]
}

View File

@@ -1,5 +1,5 @@
{
"Frame Shift Wake Scanners": [
"Frame Shift Wake Scanner": [
{
"id": "0i",
"grp": "ws",

View File

@@ -1,5 +1,5 @@
{
"Kill Warrant Scanners": [
"Kill Warrant Scanner": [
{
"id": "0n",
"grp": "kw",

View File

@@ -1,5 +1,5 @@
{
"Mine Launchers": [
"Mine Launcher": [
{
"id": "2j",
"grp": "nl",

View File

@@ -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
}
]
}

View File

@@ -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"
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -1,5 +1,5 @@
{
"Shield Boosters": [
"Shield Booster": [
{
"id": "08",
"grp": "sb",

View File

@@ -1,5 +1,5 @@
{
"Torpedo Pylons": [
"Torpedo Pylon": [
{
"id": "2h",
"grp": "tp",

View File

@@ -1,5 +1,5 @@
{
"Auto Field-Maintenance Units": [
"Auto Field-Maintenance Unit": [
{
"id": "1f",
"grp": "am",

View File

@@ -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 }
]
}

View File

@@ -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 },

View File

@@ -1,5 +1,5 @@
{
"Docking Computers": [
"Docking Computer": [
{
"id": "24",
"grp": "dc",

View File

@@ -1,5 +1,5 @@
{
"FSD Interdictors": [
"FSD Interdictor": [
{
"id": "6p",
"grp": "fi",

View File

@@ -1,5 +1,5 @@
{
"Fuel Scoops": [
"Fuel Scoop": [
{
"id": "3q",
"grp": "fs",

View File

@@ -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 }
]
}

View File

@@ -1,5 +1,5 @@
{
"Hatch Breaker Limpet Ctrl": [
"Hatch Breaker Limpet Controller": [
{
"id": "7d",
"grp": "hb",

View File

@@ -1,5 +1,5 @@
{
"Hull Reinforcement Packages": [
"Hull Reinforcement Package": [
{
"id": "2e",
"grp": "hr",

View File

@@ -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 }
]
}

View 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 }
]
}

View File

@@ -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 }
]
}

View File

@@ -1,5 +1,5 @@
{
"Refineries": [
"Refinery": [
{
"id": "23",
"grp": "rf",

View File

@@ -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,

View File

@@ -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 }
]
}

View File

@@ -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 }
]
}

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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,

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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'))

View File

@@ -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",

View File

@@ -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++) {

View 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
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

View File

@@ -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'],

View 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]);
}
}
});
});
});

View 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);
});
});
});

View File

@@ -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) {

View File

@@ -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;

View 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');
}
});
});
});