Compare commits

..

73 Commits

Author SHA1 Message Date
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
Colin McLeod
a71abd9fe3 Bumping version to 0.14.1 2015-06-29 14:59:30 -07:00
Colin McLeod
f1d804e3a1 Adding total DPS to outfit page and comparisons 2015-06-29 11:57:29 -07:00
Colin McLeod
aa7479d111 Updating Federal Dropship agility 2015-06-29 10:36:49 -07:00
Colin McLeod
7c23fb3884 Bumping version to 0.14.0 2015-06-26 11:00:46 -07:00
Colin McLeod
b707015d9c Fix power plant toggle power bug 2015-06-26 11:00:11 -07:00
Colin McLeod
10d5611dcd Seperate discounts for ship and components, added discounts for 5,10,15,20,25 percent off 2015-06-25 20:26:22 -07:00
Colin McLeod
9009a2a434 Bumping to 0.13.4, fixing courier bulkhead mass 2015-06-24 13:17:23 -07:00
Colin McLeod
8b98a98faf lint fix 2015-06-23 23:47:27 -07:00
Colin McLeod
44de3e4bbc Minor CSS refactor, outfit page tweak 2015-06-23 23:45:30 -07:00
Colin McLeod
ba2e9a12b0 Tweak chart axis labels 2015-06-23 11:47:23 -07:00
Colin McLeod
57304f55c1 Merge pull request #62 from Maverick-JM/master
Fixes for Windows phone and IE
2015-06-23 11:47:09 -07:00
Maverick
1eea358c35 Typo in the comments :). 2015-06-23 23:10:04 +10:00
Maverick
f671b7c34f Fix for the top menu not working in IE 11 (and probably older IE too). 2015-06-23 23:04:07 +10:00
Maverick
211028d80d Fix for the whole app not working on Windows phones as a Windows phone, this was somewhat vexing :)). 2015-06-23 22:27:24 +10:00
Justin Murtagh
c79359ea2f Merge pull request #6 from cmmcleod/master
Update my fork.
2015-06-23 22:04:34 +10:00
Colin McLeod
93f92da1df Adding line chart, adding speed function 2015-06-19 19:04:45 -07:00
Colin McLeod
25020293ec Fix unique internal component regression bug, add tests, bump to 0.13.3 2015-06-19 10:29:26 -07:00
Colin McLeod
4e7f1d3e8b Updating README and disclaimer text 2015-06-18 16:32:45 -07:00
Colin McLeod
e6ba0a14e8 Minor tweak to slot size position 2015-06-18 15:51:58 -07:00
Colin McLeod
b285a433b2 Bumping version to 0.13.2 2015-06-18 09:52:48 -07:00
Colin McLeod
f19c786f64 Update ship armour stats 2015-06-18 09:52:18 -07:00
Justin Murtagh
6fb2247dd7 Merge pull request #5 from cmmcleod/master
Merge back post-responsive priority stuff.
2015-06-12 07:12:13 +10:00
77 changed files with 1852 additions and 2461 deletions

View File

@@ -6,11 +6,11 @@
The Coriolis project was inspired by [E:D Shipyard](http://www.edshipyard.com/) and, of course, [Elite Dangerous](http://www.elitedangerous.com). The ultimate goal of Coriolis is to provide rich features to support in-game play and planning while engaging the E:D community to support its development.
Coriolis was created for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments.
Coriolis was created for non-commercial purposes. Coriolis was created using assets and imagery from Elite: Dangerous, with the permission of Frontier Developments plc, for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments and no employee of Frontier Developments was involved in the making of it.
## Contributing
Please [submit issues](https://github.com/cmmcleod/coriolis/issues), or better yet [pull requests](http://www.elitedangerous.com) for any corrections or additions to the database or the code.
Please [submit issues](https://github.com/cmmcleod/coriolis/issues), or better yet [pull requests](https://github.com/cmmcleod/coriolis/pulls) for any corrections or additions to the database or the code.
### Feature Requests, Suggestions & Bugs
@@ -31,7 +31,8 @@ See [Data wiki](https://github.com/cmmcleod/coriolis/wiki/Database) for details
All Data and [associated JSON](https://github.com/cmmcleod/coriolis/tree/master/data) files are intellectual property and copyright of Frontier Developments plc ('Frontier', 'Frontier Developments') and are subject to their
[terms and conditions](https://www.frontierstore.net/terms-and-conditions/).
The code specificially for Coriolis.io is released under the MIT License.
The code (Javascript, CSS, HTML, and SVG files only) specificially for Coriolis.io is released under the MIT License.
Copyright (c) 2015 Coriolis.io, Colin McLeod
Permission is hereby granted, free of charge, to any person obtaining a copy

View File

@@ -7,7 +7,7 @@
<!-- Standard headers -->
<meta name="description" content="A ship 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">
@@ -66,7 +66,7 @@
<a href="https://github.com/cmmcleod/coriolis/releases/" target="_blank" title="Coriolis Github Project">Version <%= version %> - <%= date %></a>
</div>
<div style="max-width:50%" class="l">
Coriolis Shipyard was created for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments.
Coriolis was created using assets and imagery from Elite: Dangerous, with the permission of Frontier Developments plc, for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments and no employee of Frontier Developments was involved in the making of it.
</div>
</footer>

View File

@@ -1,8 +1,14 @@
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',
function($rootScope, $location, $window, $doc, $state, CArr, shipPurpose, sz, hpc, GroupMap, Persist) {
.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 = $window.navigator.standalone || ($window.external && $window.external.msIsSiteMode && $window.external.msIsSiteMode());
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.
try {
isStandAlone = $window.navigator.standalone || ($window.external && $window.external.msIsSiteMode && $window.external.msIsSiteMode());
} catch (ex) {
isStandAlone = false;
}
// Redirect any state transition errors to the error controller/state
$rootScope.$on('$stateChangeError', function(e, toState, toParams, fromState, fromParams, error) {
@@ -29,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.discounts = { opts: [{ name: 'None', pct: 1 }, { name: 'Founders World - 10%', pct: 0.90 }] };
$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

@@ -1,7 +1,8 @@
angular.module('app').controller('OutfitController', ['$window', '$rootScope', '$scope', '$state', '$stateParams', 'ShipsDB', 'Ship', 'Components', 'Serializer', 'Persist', 'calcTotalRange', function($window, $rootScope, $scope, $state, $p, Ships, Ship, Components, Serializer, Persist, calcTotalRange) {
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) {
@@ -30,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,
@@ -55,8 +72,7 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
title: 'Jump Range',
unit: 'LY'
}
},
watch: $scope.fsd
}
};
$scope.trSeries = {
@@ -78,8 +94,30 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
title: 'Total Range',
unit: 'LY'
}
}
};
$scope.speedSeries = {
xMin: 0,
xMax: ship.cargoCapacity,
yMax: 500,
yMin: 0,
series: ['speed', 'boost'],
func: function(cargo) { // X Axis is Cargo
return calcSpeed(ship.unladenMass + $scope.fuel + cargo, ship.speed, ship.boost, $scope.th.c);
}
};
$scope.speedChart = {
labels: {
xAxis: {
title: 'Cargo',
unit: 'T'
},
watch: $scope.fsd
yAxis: {
title: 'Speed',
unit: 'm/s'
}
}
};
/**
@@ -122,8 +160,7 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
ship.useBulkhead(id);
}
$scope.selectedSlot = null;
$scope.code = Serializer.fromShip(ship);
updateState();
updateState(Serializer.fromShip(ship));
}
};
@@ -133,8 +170,7 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
$scope.reloadBuild = function() {
if ($scope.buildName && $scope.savedCode) {
Serializer.toShip(ship, $scope.savedCode); // Repopulate with components from last save
$scope.code = $scope.savedCode;
updateState();
updateState($scope.savedCode);
}
};
@@ -149,8 +185,7 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
ship.hardpoints.forEach(function(slot) { ship.use(slot, null, null); });
ship.internal.forEach(function(slot) { ship.use(slot, null, null); });
ship.useBulkhead(0);
$scope.code = Serializer.fromShip(ship);
updateState();
updateState(Serializer.fromShip(ship));
};
/**
@@ -169,7 +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;
updateState();
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', {
data: Serializer.toJsonBuild(
$scope.buildName,
ship,
$state.href($state.current.name, $state.params, { absolute: true }),
$scope.code || Serializer.fromShip(ship)
)
});
}
};
@@ -212,27 +268,29 @@ 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
*/
$scope.togglePwr = function(c) {
ship.setSlotEnabled(c, !c.enabled);
$scope.code = Serializer.fromShip(ship);
updateState();
updateState(Serializer.fromShip(ship));
};
$scope.incPriority = function(c) {
if (ship.changePriority(c, c.priority + 1)) {
$scope.code = Serializer.fromShip(ship);
updateState();
updateState(Serializer.fromShip(ship));
}
};
$scope.decPriority = function(c) {
if (ship.changePriority(c, c.priority - 1)) {
$scope.code = Serializer.fromShip(ship);
updateState();
updateState(Serializer.fromShip(ship));
}
};
@@ -249,19 +307,83 @@ 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() {
function updateState(code) {
$scope.code = code;
$state.go('outfit', { shipId: ship.id, code: $scope.code, bn: $scope.buildName }, { location: 'replace', notify: false });
$scope.trSeries.xMax = $scope.jrSeries.xMax = ship.cargoCapacity;
$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;
};
// 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
$scope.$on('discountChange', function() {
ship.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
retrofitShip.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
updateRetrofitCosts();
});
}]);

View File

@@ -8,7 +8,7 @@ angular.module('app').directive('componentSelect', function() {
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/>');
}
@@ -21,10 +21,10 @@ angular.module('app').directive('componentSelect', function() {
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 +35,7 @@ angular.module('app').directive('componentSelect', function() {
list.push(' ' + o.name);
}
list.push('</li>');
list.push('</span></li>');
prevClass = o.class;
prevRating = o.rating;
}

View File

@@ -3,10 +3,12 @@ angular.module('app').directive('contextMenu', ['$parse', function($parse) {
var fn = $parse(attrs.contextMenu);
element.bind('contextmenu', function(e) {
if (!e.shiftKey) {
scope.$apply(function() {
e.preventDefault();
fn(scope, { $event: e });
});
}
});
};
}]);

View File

@@ -13,8 +13,10 @@ angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', 'Pers
scope.bs = Persist.state;
var insIndex = _.findIndex($rootScope.insurance.opts, 'name', Persist.getInsurance());
var savedDiscounts = Persist.getDiscount() || [1, 1];
$rootScope.insurance.current = $rootScope.insurance.opts[insIndex != -1 ? insIndex : 0];
$rootScope.discounts.current = $rootScope.discounts.opts[Persist.getDiscount() || 0];
$rootScope.discounts.ship = savedDiscounts[0];
$rootScope.discounts.components = savedDiscounts[1];
// Close menus if a navigation change event occurs
$rootScope.$on('$stateChangeStart', function() {
@@ -38,7 +40,8 @@ angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', 'Pers
* Save selected discount option
*/
scope.updateDiscount = function() {
Persist.setDiscount($rootScope.discounts.opts.indexOf($rootScope.discounts.current));
Persist.setDiscount([$rootScope.discounts.ship, $rootScope.discounts.components]);
$rootScope.$broadcast('discountChange');
};
scope.openMenu = function(e, menu) {

View File

@@ -0,0 +1,190 @@
angular.module('app').directive('lineChart', ['$window', function($window) {
return {
restrict: 'A',
scope: {
config: '=',
series: '='
},
link: function(scope, element) {
var seriesConfig = scope.series,
series = seriesConfig.series,
color = d3.scale.ordinal().range([ '#ff8c0d', '#1fb0ff', '#a05d56', '#d0743c']),
config = scope.config,
labels = config.labels,
margin = { top: 15, right: 15, bottom: 35, left: 60 },
fmt = d3.format('.3r'),
fmtLong = d3.format('.2f'),
func = seriesConfig.func,
drag = d3.behavior.drag(),
dragging = false,
// Define Scales
x = d3.scale.linear(),
y = d3.scale.linear(),
// Define Axes
xAxis = d3.svg.axis().scale(x).outerTickSize(0).orient('bottom').tickFormat(d3.format('.2r')),
yAxis = d3.svg.axis().scale(y).ticks(6).outerTickSize(0).orient('left').tickFormat(fmt),
data = [];
// Create chart
var svg = d3.select(element[0]).append('svg');
var vis = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
var lines = vis.append('g');
// Define Area
var line = d3.svg.line().y(function(d) { return y(d[1]); });
// Create Y Axis SVG Elements
var yTxt = vis.append('g').attr('class', 'y axis')
.append('text')
.attr('transform', 'rotate(-90)')
.attr('y', -50)
.attr('dy', '.1em')
.style('text-anchor', 'middle')
.text(labels.yAxis.title + ' (' + labels.yAxis.unit + ')');
// Create X Axis SVG Elements
var xLbl = vis.append('g').attr('class', 'x axis');
var xTxt = xLbl.append('text')
.attr('y', 30)
.attr('dy', '.1em')
.style('text-anchor', 'middle')
.text(labels.xAxis.title + ' (' + labels.xAxis.unit + ')');
// Create and Add tooltip
var tipWidth = (Math.max(labels.yAxis.unit.length, labels.xAxis.unit.length) * 1.25) + 2;
var tips = vis.append('g').style('display', 'none');
var background = vis.append('rect') // Background to capture hover/drag
.attr('fill-opacity', 0)
.on('mouseover', showTip)
.on('mouseout', hideTip)
.on('mousemove', moveTip)
.call(drag);
drag
.on('dragstart', function() {
dragging = true;
moveTip.call(this);
showTip();
})
.on('dragend', function() {
dragging = false;
hideTip();
})
.on('drag', moveTip);
/**
* Watch for changes in the series data (mass changes, etc)
*/
scope.$watchCollection('series', render);
angular.element($window).bind('orientationchange resize render', render);
function render() {
var width = element[0].parentElement.offsetWidth,
height = width * 0.5,
xMax = seriesConfig.xMax,
xMin = seriesConfig.xMin,
yMax = seriesConfig.yMax,
yMin = seriesConfig.yMin,
w = width - margin.left - margin.right,
h = height - margin.top - margin.bottom,
s, val, yVal, delta;
data.length = 0; // Reset Data array
if (seriesConfig.xMax == seriesConfig.xMin) {
line.x(function(d, i) { return i * w; });
} else {
line.x(function(d) { return x(d[0]); });
}
if (series) {
for (s = 0; s < series.length; s++) {
data.push([]);
}
if (xMax == xMin) {
yVal = func(xMin);
for (s = 0; s < series.length; s++) {
data[s].push( [ xMin, yVal[ series[s] ] ], [ 1, yVal[ series[s] ] ]);
}
} else {
delta = (xMax - xMin) / 30; // Only render 30 points on the graph
for (val = xMin; val <= xMax; val += delta) {
yVal = func(val);
for (s = 0; s < series.length; s++) {
data[s].push([ val, yVal[ series[s] ] ]);
}
}
}
} else {
var seriesData = [];
if (xMax == xMin) {
yVal = func(xMin);
seriesData.push([ xMin, yVal ], [ 1, yVal ]);
} else {
delta = (xMax - xMin) / 30; // Only render 30 points on the graph
for (val = xMin; val <= xMax; val += delta) {
seriesData.push([val, func(val) ]);
}
}
data.push(seriesData);
}
// Update Chart Size
svg.attr('width', width).attr('height', height);
background.attr('height', h).attr('width', w);
// Update domain and scale for axes
x.range([0, w]).domain([xMin, xMax]).clamp(true);
xLbl.attr('transform', 'translate(0,' + h + ')');
xTxt.attr('x', w / 2);
y.range([h, 0]).domain([yMin, yMax]);
yTxt.attr('x', -h / 2);
vis.selectAll('.y.axis').call(yAxis);
vis.selectAll('.x.axis').call(xAxis);
lines.selectAll('path.line')
.data(data)
.attr('d', line) // Update existing series
.enter() // Add new series
.append('path')
.attr('class', 'line')
.attr('stroke', function(d, i) { return color(i); })
.attr('stroke-width', 2)
.attr('d', line);
var tip = tips.selectAll('g.tooltip').data(data).enter().append('g').attr('class', 'tooltip');
tip.append('rect').attr('width', tipWidth + 'em').attr('height', '2em').attr('x', '0.5em').attr('y', '-1em').attr('class', 'tip');
tip.append('circle').attr('class', 'marker').attr('r', 4);
tip.append('text').attr('class', 'label x').attr('y', '-0.25em');
tip.append('text').attr('class', 'label y').attr('y', '0.85em');
}
function showTip() {
tips.style('display', null);
}
function hideTip() {
if (!dragging) {
tips.style('display', 'none');
}
}
function moveTip() {
var xPos = d3.mouse(this)[0], x0 = x.invert(xPos), y0 = func(x0), flip = (x0 / x.domain()[1] > 0.65);
var tip = tips.selectAll('g.tooltip').attr('transform', function(d, i) { return 'translate(' + x(x0) + ',' + y(series ? y0[series[i]] : y0) + ')'; });
tip.selectAll('rect').attr('x', flip ? (-tipWidth - 0.5) + 'em' : '0.5em').style('text-anchor', flip ? 'end' : 'start');
tip.selectAll('text.label').attr('x', flip ? '-1em' : '1em').style('text-anchor', flip ? 'end' : 'start');
tip.selectAll('text.label.x').text(fmtLong(x0) + ' ' + labels.xAxis.unit);
tips.selectAll('text.label.y').text(function(d, i) { return fmtLong(series ? y0[series[i]] : y0) + ' ' + labels.yAxis.unit; });
}
scope.$on('$destroy', function() {
angular.element($window).unbind('orientationchange resize render', render);
});
}
};
}]);

View File

@@ -189,7 +189,7 @@ angular.module('app').service('Persist', ['$window', 'lodash', function($window,
*/
this.setDiscount = function(val) {
if (this.lsEnabled) {
return localStorage.setItem('discount', val);
return localStorage.setItem('discounts', angular.toJson(val));
}
};
@@ -199,7 +199,28 @@ angular.module('app').service('Persist', ['$window', 'lodash', function($window,
*/
this.getDiscount = function() {
if (this.lsEnabled) {
return localStorage.getItem('discount');
return angular.fromJson(localStorage.getItem('discounts'));
}
return null;
};
/**
* Persist selected cost tab
* @param {number} val Discount value/amount
*/
this.setCostTab = function(tabName) {
if (this.lsEnabled) {
return localStorage.setItem('costTab', tabName);
}
};
/**
* Get the saved discount
* @return {number} val Discount value/amount
*/
this.getCostTab = function() {
if (this.lsEnabled) {
return localStorage.getItem('costTab');
}
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', function(_, GroupMap, MountMap) {
/**
* Serializes the ships selected components for all slots to a URL friendly string.
@@ -33,7 +33,7 @@ angular.module('app').service('Serializer', ['lodash', function(_) {
* code.
*
* @param {Ship} ship The ship instance to be updated
* @param {string} code The string to deserialize
* @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,48 @@ angular.module('app').service('Serializer', ['lodash', function(_) {
);
};
this.toJsonBuild = function(buildName, ship, url, code) {
var standard = ship.common,
hardpoints = ship.hardpoints,
internal = ship.internal;
var data = {
$schema: 'http://cdn.coriolis.io/schemas/ship-loadout/1-draft.json#',
name: buildName,
ship: ship.name,
references: [{
name: 'Coriolis.io',
url: url,
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.fromComparison = function(name, builds, facets, predicate, desc) {
var shipBuilds = [];
@@ -118,4 +156,19 @@ 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];
}
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) {
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
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[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

@@ -28,7 +28,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
function Ship(id, properties, slots) {
this.id = id;
this.cargoScoop = { c: Components.cargoScoop(), type: 'SYS' };
this.bulkheads = { incCost: true, maxClass: 8, discount: 1 };
this.bulkheads = { incCost: true, maxClass: 8 };
for (var p in properties) { this[p] = properties[p]; } // Copy all base properties from shipData
@@ -36,10 +36,11 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
var slotGroup = slots[slotType];
var group = this[slotType] = []; // Initialize Slot group (Common, Hardpoints, Internal)
for (var i = 0; i < slotGroup.length; i++) {
group.push({ id: null, c: null, incCost: true, maxClass: slotGroup[i], discount: 1 });
group.push({ id: null, c: null, incCost: true, maxClass: slotGroup[i] });
}
}
this.c = { incCost: true, discount: 1, c: { name: this.name, cost: this.cost } }; // Make a 'Ship' component similar to other components
// Make a Ship 'slot'/item similar to other slots
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
@@ -54,6 +55,9 @@ 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.shipCostMultiplier = 1;
this.componentCostMultiplier = 1;
this.priorityBands = [
{ deployed: 0, retracted: 0, retOnly: 0 },
{ deployed: 0, retracted: 0, retOnly: 0 },
@@ -81,9 +85,10 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
this.ladenMass = 0;
this.armourAdded = 0;
this.shieldMultiplier = 1;
this.totalCost = this.cost;
this.unladenMass = this.mass;
this.armourTotal = this.armour;
this.totalCost = this.c.incCost ? this.c.discountedCost : 0;
this.unladenMass = this.hullMass;
this.armour = this.baseArmour;
this.totalDps = 0;
this.bulkheads.c = null;
this.useBulkhead(comps.bulkheads || 0, true);
@@ -106,6 +111,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
common[i].priority = priorities ? priorities[i + 1] * 1 : 0;
common[i].type = 'SYS';
common[i].c = common[i].id = null; // Resetting 'old' component if there was one
common[i].discountedCost = 0;
this.use(common[i], comps.common[i], Components.common(i, comps.common[i]), true);
}
@@ -119,6 +125,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
hps[i].priority = priorities ? priorities[cl + i] * 1 : 0;
hps[i].type = hps[i].maxClass ? 'WEP' : 'SYS';
hps[i].c = hps[i].id = null; // Resetting 'old' component if there was one
hps[i].discountedCost = 0;
if (comps.hardpoints[i] !== 0) {
this.use(hps[i], comps.hardpoints[i], Components.hardpoints(comps.hardpoints[i]), true);
@@ -133,6 +140,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
internal[i].priority = priorities ? priorities[cl + i] * 1 : 0;
internal[i].type = 'SYS';
internal[i].id = internal[i].c = null; // Resetting 'old' component if there was one
internal[i].discountedCost = 0;
if (comps.internal[i] !== 0) {
this.use(internal[i], comps.internal[i], Components.internal(comps.internal[i]), true);
@@ -149,6 +157,7 @@ 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.componentCostMultiplier;
this.updateStats(this.bulkheads, this.bulkheads.c, oldBulkhead, preventUpdate);
};
@@ -164,18 +173,20 @@ 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
if (similarSlot && similarSlot !== slot) {
if (!preventUpdate && similarSlot && similarSlot !== slot) {
this.updateStats(similarSlot, null, similarSlot.c, true); // Update stats but don't trigger a global update
similarSlot.id = similarSlot.c = null; // Empty the slot
similarSlot.discountedCost = 0;
}
}
var oldComponent = slot.c;
slot.id = id;
slot.c = component;
slot.discountedCost = (component && component.cost) ? component.cost * this.componentCostMultiplier : 0;
this.updateStats(slot, component, oldComponent, preventUpdate);
}
};
@@ -199,9 +210,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) {
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];
}
@@ -232,7 +251,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
Ship.prototype.setCostIncluded = function(item, included) {
if (item.incCost != included && item.c) {
this.totalCost += included ? item.c.cost : -item.c.cost;
this.totalCost += included ? item.discountedCost : -item.discountedCost;
}
item.incCost = included;
};
@@ -243,11 +262,13 @@ 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);
this.updateShieldStrength();
} else if (slot.c.dps) {
this.totalDps += slot.c.dps * (enabled ? 1 : -1);
}
this.updatePower();
@@ -292,12 +313,16 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
}
if (slot.incCost && old.cost) {
this.totalCost -= old.cost;
this.totalCost -= old.cost * this.componentCostMultiplier;
}
if (old.power && slot.enabled) {
this.priorityBands[slot.priority][powerUsageType(slot, old)] -= old.power;
powerChange = true;
if (old.dps) {
this.totalDps -= old.dps;
}
}
this.unladenMass -= old.mass || 0;
}
@@ -310,9 +335,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;
@@ -322,18 +344,22 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
}
if (slot.incCost && n.cost) {
this.totalCost += n.cost;
this.totalCost += n.cost * this.componentCostMultiplier;
}
if (n.power && slot.enabled) {
this.priorityBands[slot.priority][powerUsageType(slot, n)] += n.power;
powerChange = true;
if (n.dps) {
this.totalDps += n.dps;
}
}
this.unladenMass += n.mass || 0;
}
this.ladenMass = this.unladenMass + this.cargoCapacity + this.fuelCapacity;
this.armourTotal = this.armourAdded + this.armour;
this.armour = this.armourAdded + this.baseArmour;
if (!preventUpdate) {
if (powerChange) {
@@ -361,7 +387,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;
};
/**
@@ -377,5 +403,28 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
this.maxJumpCount = Math.ceil(this.fuelCapacity / fsd.maxfuel);
};
/**
* Recalculate all item costs and total based on discounts.
* @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(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' ? shipCostMultiplier : componentCostMultiplier);
if (item.incCost) {
total += item.discountedCost;
}
}
}
this.shipCostMultiplier = shipCostMultiplier;
this.componentCostMultiplier = componentCostMultiplier;
this.totalCost = total;
};
return Ship;
}]);

View File

@@ -33,18 +33,19 @@ angular.module('shipyard', ['ngLodash'])
// Internal
fs: 'Fuel Scoop',
sc: 'Scanners',
am: 'Auto Field-Maint. Unit',
cr: 'Cargo Racks',
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 +66,10 @@ 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'
})
.value('shipSize', [
'N/A',
@@ -108,7 +107,7 @@ angular.module('shipyard', ['ngLodash'])
},
{ // 2
title: 'Armour',
props: ['armourTotal'],
props: ['armour'],
unit: '',
fmt: 'fCrd'
},
@@ -163,8 +162,28 @@ angular.module('shipyard', ['ngLodash'])
lbls: ['Unladen', 'Laden'],
unit: 'LY',
fmt: 'fRound'
},
{ // 11
title: 'DPS',
props: ['totalDps'],
lbls: ['Dps'],
unit: '',
fmt: 'fRound'
}
])
/**
* Set of all available / theoretical discounts
*
* @type {Object}
*/
.value('Discounts', {
'None': 1,
'5%': 0.95,
'10%': 0.90,
'15%': 0.85,
'20%': 0.80,
'25%': 0.75
})
/**
* Calculate the maximum single jump range based on mass and a specific FSD
*
@@ -208,9 +227,6 @@ angular.module('shipyard', ['ngLodash'])
* @return {number} Approximate shield strengh in MJ
*/
.value('calcShieldStrength', function(mass, shields, sg, multiplier) {
if (!sg) {
return 0;
}
if (mass <= sg.minmass) {
return shields * multiplier * sg.minmul;
}
@@ -221,4 +237,20 @@ angular.module('shipyard', ['ngLodash'])
return shields * multiplier * (sg.optmul + (mass - sg.optmass) / (sg.maxmass - sg.optmass) * (sg.maxmul - sg.optmul));
}
return shields * multiplier * sg.maxmul;
})
/**
* Calculate the a ships speed based on mass, and thrusters. Currently Innacurate / Incomplete :(
*
* @private
* @param {number} mass Current mass of the ship
* @param {number} baseSpeed Base speed m/s for ship
* @param {number} baseBoost Base boost m/s for ship
* @param {object} thrusters The shield generator used
* @return {object} Approximate speed and boost speed in m/s
*/
.value('calcSpeed', function(mass, baseSpeed, baseBoost) { //, thrusters) {
//var speed = baseSpeed * (1 + ((thrusters.optmass / mass) * 0.1 ) ); // TODO: find thruser coefficient(s)
//var boost = baseBoost * (1 + ((thrusters.optmass / mass) * 0.1 ) );
return { boost: baseSpeed, speed: baseBoost };
});

View File

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

@@ -15,16 +15,6 @@
width: 100%;
});
.medPhone({
.axis {
font-size: 0.8em;
g.tick:nth-child(2n + 1) text {
display: none;
}
}
});
h3 {
text-align: center;

View File

@@ -39,6 +39,7 @@ header {
}
.smallTablet({
position: static;
position: initial;
});
}
@@ -83,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;
@@ -139,20 +160,21 @@ table.total {
font-weight: normal;
}
tbody tr:hover {
background-color: @warning-bg;
}
.smallTablet({
width: 50%;
.axis.x {
g.tick:nth-child(2n + 1) text {
display: none;
}
}
});
.largePhone({
width: 100%;
});
&.dbl {
&.half {
width: 50%;
.tablet({
@@ -166,20 +188,10 @@ table.total {
});
}
&.semi {
width: 50%;
&.third {
width: 33%;
.smallTablet({
.axis {
font-size: 0.8em;
g.tick:nth-child(2n + 1) text {
display: none;
}
}
});
.medPhone({
.largePhone({
width: 100% !important;
});
}
@@ -235,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: 550px;
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,16 +65,20 @@
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;
color: @primary;
stroke: @primary;
}
&.disabled {
cursor: not-allowed;
@@ -46,30 +91,13 @@
}
}
@optionSpacing: 2em;
.lc {
line-height:@optionSpacing;
text-align: left;
}
.empty-c {
line-height:@optionSpacing;
text-align: center;
}
.c {
.lc, .c {
border:1px solid @primary-disabled;
display: inline-block;
padding: 0.1em;
padding: 0.1em 0.2em;
margin: 0.3em;
width: 2em;
line-height: @optionSpacing;
text-align: center;
&:hover {
border:1px solid @warning;
border:1px solid @primary;
}
&.disabled {
@@ -80,10 +108,19 @@
}
}
.c {
display: inline-block;
width: 2em;
}
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 +128,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;
}
@@ -44,6 +51,7 @@
border-right: 1px solid @primary-disabled;
box-sizing: border-box;
padding-top: 0.2em;
padding-left: 0.1em;
}
.empty {

View File

@@ -8,6 +8,10 @@ table {
color: @primary;
text-decoration: none;
}
[ng-click] {
cursor: pointer;
}
}
thead {
@@ -43,7 +47,6 @@ thead {
}
}
tbody tr {
&.tr {
@@ -55,6 +58,12 @@ tbody tr {
}
}
&.highlight {
&:hover {
background-color: @warning-bg;
}
}
td {
line-height: 1.4em;
padding: 0 0.3em;

View File

@@ -0,0 +1,287 @@
{
"$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"],
"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"
},
"shipId": {
"type": "string"
},
"code": {
"description": "The serialized code or string for the 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

@@ -53,8 +53,12 @@
<li><select ng-model="insurance.current" ng-options="ins.name for (i,ins) in insurance.opts" ng-change="updateInsurance()"></select></li>
</ul><br>
<ul>
Discount
<li><select ng-model="discounts.current" ng-options="d.name for (i,d) in discounts.opts" ng-change="updateDiscount()"></select></li>
Ship Discount
<li><select ng-model="discounts.ship" ng-options="i for (i,d) in discounts.opts" ng-change="updateDiscount()"></select></li>
</ul><br>
<ul>
Component Discount
<li><select ng-model="discounts.components" ng-options="i for (i,d) in discounts.opts" ng-change="updateDiscount()"></select></li>
</ul>
<hr />
<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

@@ -6,7 +6,7 @@
</div>
<div ng-show="processed">
<table class="l" style="overflow:hidden;margin: 1em 0;">
<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>
<tbody ng-repeat="(shipId,shipBuilds) in builds">
<tr class="cb" ng-repeat="(buildName, b) in shipBuilds">

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>
@@ -30,16 +33,19 @@
<th rowspan="2">Agility</th>
<th rowspan="2">Speed</th>
<th rowspan="2">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>
@@ -55,8 +61,10 @@
<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>{{fRound(ship.totalDps)}}</td>
<td>{{ship.armour}} <span ng-if="ship.armourAdded">({{ship.baseArmour}} + {{ship.armourAdded}})</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 +75,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 +120,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">
@@ -196,7 +205,7 @@
</div>
</div>
<div class="group dbl" id="componentPriority">
<div class="group half" id="componentPriority">
<table style="width:100%">
<thead>
<tr class="main">
@@ -210,7 +219,7 @@
</thead>
<tbody>
<tr>
<td ng-click="togglePwr(c)">{{pp.c.class}}{{pp.c.rating}}</td>
<td>{{pp.c.class}}{{pp.c.rating}}</td>
<td class="le shorten">Power Plant</td>
<td><u>SYS</u></td>
<td>1</td>
@@ -220,7 +229,7 @@
<td></td>
</tr>
<tr><td style="line-height:0;" colspan="8"><hr style="margin: 0 0 3px;background: #ff8c0d;border: 0;height: 1px;" /></td></tr>
<tr ng-repeat="c in powerList | orderBy:pwrPredicate:pwrDesc" ng-if="c.c.power" ng-class="{disabled:!c.enabled}">
<tr class="highlight" ng-repeat="c in powerList | orderBy:pwrPredicate:pwrDesc" ng-if="c.c.power" ng-class="{disabled:!c.enabled}">
<td style="width:1em;" ng-click="togglePwr(c)">{{c.c.class}}{{c.c.rating}}</td>
<td class="le shorten" ng-click="togglePwr(c)" ng-bind="cName(c)"></td>
<td ng-click="togglePwr(c)"><u ng-bind="c.type"></u></td>
@@ -236,45 +245,111 @@
<div style="margin-top: 1em" power-bands bands="priorityBands" available="ship.powerAvailable"></div>
</div>
<div class="group dbl">
<div class="group half">
<table class="tabs">
<thead>
<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>
</table>
<div ng-if="costTab == 'costs'">
<table style="width:100%">
<thead>
<tr class="main">
<th colspan="2" class="sortable le" ng-click="sortCost(cName)">Component</th>
<th class="sortable le" ng-click="sortCost('c.cost')">Credits</th>
<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 ng-repeat="c in costList | orderBy:costPredicate:costDesc" ng-if="c.c.cost > 0" ng-class="{disabled:!c.incCost}">
<td class="toggleable" style="width:1em;" ng-click="toggleCost(c)">{{c.c.class}}{{c.c.rating}}</td>
<td class="le toggleable shorten" ng-bind="cName(c)" ng-click="toggleCost(c)"></td>
<td class="ri toggleable" ng-click="toggleCost(c)">{{fCrd(discounts.current.pct * c.c.cost)}} <u>CR</u></td>
<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 * discounts.current.pct)}} <u>CR</u></td>
<td>{{fCrd(ship.totalCost)}} <u>CR</u></td>
</tr>
<tr class="ri">
<td class="lbl">Insurance</td>
<td>{{fCrd(ship.totalCost * discounts.current.pct * insurance.current.pct)}} <u>CR</u></td>
<td>{{fCrd(ship.totalCost * insurance.current.pct)}} <u>CR</u></td>
</tr>
</table>
</div>
<div class="group semi">
<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">
<h1>Jump Range</h1>
<div area-chart config="jrChart" series="jrSeries"></div>
<div line-chart config="jrChart" series="jrSeries"></div>
</div>
<div class="group semi">
<div class="group half">
<h1>Total Range</h1>
<div area-chart config="trChart" series="trSeries"></div>
<div line-chart config="trChart" series="trSeries"></div>
</div>
<div class="group dbl">
<!-- TODO: Add back in once calcSpeed is dynamic and accurate
<div class="group third">
<h1>Thruster Speed</h1>
<div line-chart config="speedChart" series="speedSeries"></div>
</div>
-->
<div class="group half">
<div slider max="ship.fuelCapacity" unit="'T'" on-change="::fuelChange(val)" style="position:relative; margin: 0 auto;">
<svg class="icon xl primary-disabled" style="position:absolute;height: 100%;"><use xlink:href="#fuel"></use></svg>
</div>

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

@@ -123,28 +123,28 @@
"class": 1,
"rating": "I",
"cost": 1017200,
"mass": 21
"mass": 4
},
{
"name": "Military Grade Composite",
"class": 1,
"rating": "I",
"cost": 2288600,
"mass": 42
"mass": 8
},
{
"name": "Mirrored Surface Composite",
"class": 1,
"rating": "I",
"cost": 5408800,
"mass": 42
"mass": 8
},
{
"name": "Reactive Surface Composite",
"class": 1,
"rating": "I",
"cost": 5993700,
"mass": 42
"mass": 8
}
],
"cobra_mk_iii": [

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

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

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

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

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

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

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

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

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

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

@@ -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,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
}
{ "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 Controllers": [
{ "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,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 Controllers": [
{ "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 Controllers": [
{
"id": "7d",
"grp": "hb",

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 Generators": [
{ "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 Controllers": [
{ "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,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
}
{ "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
}
{ "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,17 @@
{
"adder": {
"properties": {
"grp": "ex",
"name": "Adder",
"manufacturer": "Zorgon Peterson",
"class": 1,
"cost": 39993,
"hullCost": 39993,
"speed": 220,
"boost": 320,
"agility": 8,
"shields": 60,
"armour": 90,
"fuelcost": 50,
"mass": 35
"baseShieldStrength": 60,
"baseArmour": 162,
"hullMass": 35,
"masslock": 7
},
"retailCost": 87808,
"slots": {

View File

@@ -1,18 +1,17 @@
{
"anaconda": {
"properties": {
"grp": "mp",
"name": "Anaconda",
"manufacturer": "Faulcon DeLacy",
"class": 3,
"cost": 141889932,
"hullCost": 141889932,
"speed": 180,
"boost": 240,
"agility": 2,
"shields": 350,
"armour": 525,
"fuelcost": 50,
"mass": 400
"baseShieldStrength": 350,
"baseArmour": 945,
"hullMass": 400,
"masslock": 23
},
"retailCost": 146969451,
"slots": {

View File

@@ -1,18 +1,17 @@
{
"asp": {
"properties": {
"grp": "ex",
"name": "Asp Explorer",
"manufacturer": "Lakon",
"class": 2,
"cost": 6135658,
"hullCost": 6135658,
"speed": 250,
"boost": 340,
"agility": 6,
"shields": 140,
"armour": 210,
"fuelcost": 50,
"mass": 280
"baseShieldStrength": 140,
"baseArmour": 378,
"hullMass": 280,
"masslock": 11
},
"retailCost": 6661153,
"slots": {

View File

@@ -1,18 +1,17 @@
{
"cobra_mk_iii": {
"properties": {
"grp": "mp",
"name": "Cobra Mk III",
"manufacturer": "Faulcon DeLacy",
"class": 1,
"cost": 235787,
"hullCost": 235787,
"speed": 280,
"boost": 400,
"agility": 6,
"shields": 80,
"armour": 120,
"fuelcost": 50,
"mass": 180
"baseShieldStrength": 80,
"baseArmour": 216,
"hullMass": 180,
"masslock": 8
},
"retailCost": 379718,
"slots": {

View File

@@ -1,20 +1,20 @@
{
"diamondback": {
"properties": {
"grp": "ex",
"name": "Diamondback Scout",
"manufacturer": "Lakon",
"class": 1,
"cost": 461342,
"hullCost": 461341,
"speed": 283,
"boost": 384,
"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,17 @@
{
"diamondback_explorer": {
"properties": {
"grp": "ex",
"name": "Diamondback Explorer",
"manufacturer": "Lakon",
"class": 1,
"cost": 1635691,
"hullCost": 1635691,
"speed": 242,
"boost": 316,
"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,17 @@
{
"eagle": {
"properties": {
"grp": "co",
"name": "Eagle",
"manufacturer": "Core Dynamics",
"class": 1,
"cost": 10446,
"hullCost": 10446,
"speed": 240,
"boost": 350,
"agility": 10,
"shields": 60,
"armour": 40,
"fuelcost": 50,
"mass": 50
"baseShieldStrength": 60,
"baseArmour": 72,
"hullMass": 50,
"masslock": 6
},
"retailCost": 44800,
"slots": {

View File

@@ -1,18 +1,17 @@
{
"federal_dropship": {
"properties": {
"grp": "mp",
"name": "Federal Dropship",
"manufacturer": "Core Dynamics",
"class": 2,
"cost": 18969990,
"hullCost": 18969990,
"speed": 180,
"boost": 300,
"agility": 0,
"shields": 200,
"armour": 300,
"fuelcost": 50,
"mass": 580
"agility": 2,
"baseShieldStrength": 200,
"baseArmour": 540,
"hullMass": 580,
"masslock": 14
},
"retailCost": 19814205,
"slots": {

View File

@@ -1,18 +1,17 @@
{
"fer_de_lance": {
"properties": {
"grp": "co",
"name": "Fer-de-Lance",
"manufacturer": "Zorgon Peterson",
"class": 2,
"cost": 51232230,
"hullCost": 51232230,
"speed": 260,
"boost": 350,
"agility": 6,
"shields": 300,
"armour": 225,
"fuelcost": 50,
"mass": 250
"baseShieldStrength": 300,
"baseArmour": 405,
"hullMass": 250,
"masslock": 12
},
"retailCost": 51567040,
"slots": {

View File

@@ -1,18 +1,17 @@
{
"hauler": {
"properties": {
"grp": "fr",
"name": "Hauler",
"manufacturer": "Zorgon Peterson",
"class": 1,
"cost": 29807,
"hullCost": 29807,
"speed": 200,
"boost": 300,
"agility": 6,
"shields": 50,
"armour": 50,
"fuelcost": 50,
"mass": 14
"baseShieldStrength": 50,
"baseArmour": 90,
"hullMass": 14,
"masslock": 6
},
"retailCost": 52720,
"slots": {

View File

@@ -1,18 +1,17 @@
{
"imperial_clipper": {
"properties": {
"grp": "mp",
"name": "Imperial Clipper",
"manufacturer": "Gutamaya",
"class": 3,
"cost": 21077784,
"hullCost": 21077784,
"speed": 300,
"boost": 380,
"agility": 2,
"shields": 180,
"armour": 270,
"fuelcost": 50,
"mass": 400
"baseShieldStrength": 180,
"baseArmour": 486,
"hullMass": 400,
"masslock": 12
},
"retailCost": 22296860,
"slots": {

View File

@@ -1,18 +1,17 @@
{
"imperial_courier": {
"properties": {
"grp": "mp",
"name": "Imperial Courier",
"manufacturer": "Gutamaya",
"class": 1,
"cost": 2481552,
"hullCost": 2481552,
"speed": 277,
"boost": 380,
"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,17 @@
{
"orca": {
"properties": {
"grp": "pa",
"name": "Orca",
"manufacturer": "Saud Kruger",
"class": 3,
"cost": 47798079,
"hullCost": 47798079,
"speed": 300,
"boost": 380,
"agility": 2,
"shields": 220,
"armour": 220,
"fuelcost": 50,
"mass": 580
"baseShieldStrength": 220,
"baseArmour": 396,
"hullMass": 580,
"masslock": 13
},
"retailCost": 48539887,
"slots": {

View File

@@ -1,18 +1,17 @@
{
"python": {
"properties": {
"grp": "mp",
"name": "Python",
"manufacturer": "Faulcon DeLacy",
"class": 2,
"cost": 55171395,
"hullCost": 55171395,
"speed": 230,
"boost": 280,
"agility": 6,
"shields": 260,
"armour": 260,
"fuelcost": 50,
"mass": 350
"baseShieldStrength": 260,
"baseArmour": 468,
"hullMass": 350,
"masslock": 17
},
"retailCost": 56978179,
"slots": {

View File

@@ -1,18 +1,17 @@
{
"sidewinder": {
"properties": {
"grp": "mp",
"name": "Sidewinder",
"manufacturer": "Faulcon DeLacy",
"class": 1,
"cost": 12887,
"hullCost": 12887,
"speed": 220,
"boost": 320,
"agility": 8,
"shields": 40,
"armour": 60,
"fuelcost": 50,
"mass": 25
"baseShieldStrength": 40,
"baseArmour": 108,
"hullMass": 25,
"masslock": 6
},
"retailCost": 32000,
"slots": {

View File

@@ -1,18 +1,17 @@
{
"type_6_transporter": {
"properties": {
"grp": "fr",
"name": "Type-6 Transporter",
"manufacturer": "Lakon",
"class": 2,
"cost": 865782,
"hullCost": 865782,
"speed": 220,
"boost": 350,
"agility": 3,
"shields": 90,
"armour": 90,
"fuelcost": 50,
"mass": 155
"baseShieldStrength": 90,
"baseArmour": 162,
"hullMass": 155,
"masslock": 8
},
"retailCost": 1045945,
"slots": {

View File

@@ -1,18 +1,17 @@
{
"type_7_transport": {
"properties": {
"grp": "fr",
"name": "Type-7 Transporter",
"manufacturer": "Lakon",
"class": 3,
"cost": 16881511,
"hullCost": 16881511,
"speed": 180,
"boost": 300,
"agility": 2,
"shields": 120,
"armour": 120,
"fuelcost": 50,
"mass": 420
"baseShieldStrength": 120,
"baseArmour": 216,
"hullMass": 420,
"masslock": 10
},
"retailCost": 17472252,
"slots": {

View File

@@ -1,18 +1,17 @@
{
"type_9_heavy": {
"properties": {
"grp": "fr",
"name": "Type-9 Heavy",
"manufacturer": "Lakon",
"class": 3,
"cost": 73255168,
"hullCost": 73255168,
"speed": 130,
"boost": 200,
"agility": 0,
"shields": 240,
"armour": 240,
"fuelcost": 50,
"mass": 1000
"baseShieldStrength": 240,
"baseArmour": 432,
"hullMass": 1000,
"masslock": 16
},
"retailCost": 76555842,
"slots": {

View File

@@ -1,18 +1,17 @@
{
"viper": {
"properties": {
"grp": "co",
"name": "Viper",
"manufacturer": "Faulcon DeLacy",
"class": 1,
"cost": 95893,
"hullCost": 95893,
"speed": 320,
"boost": 400,
"agility": 6,
"shields": 105,
"armour": 70,
"fuelcost": 50,
"mass": 60
"baseShieldStrength": 105,
"baseArmour": 126,
"hullMass": 60,
"masslock": 7
},
"retailCost": 142931,
"slots": {

View File

@@ -1,18 +1,17 @@
{
"vulture": {
"properties": {
"grp": "co",
"name": "Vulture",
"manufacturer": "Core Dynamics",
"class": 1,
"cost": 4689629,
"hullCost": 4689629,
"speed": 210,
"boost": 340,
"agility": 9,
"shields": 240,
"armour": 160,
"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.13.1",
"version": "1.1.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

@@ -42,11 +42,11 @@ function writeDB(err, arr) {
"Torpedo Pylons",
"Mine Launchers",
"Mining Lasers",
"Shield Boosters",
"Cargo Scanners",
"Countermeasures",
"Kill Warrant Scanners",
"Frame Shift Wake Scanners",
"Cargo Scanners"
"Kill Warrant Scanners",
"Shield Boosters"
];
for (var i = 0; i < internalOrder.length; i++) {

View File

@@ -1,23 +1,25 @@
// 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']
},
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',
'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,50 @@
describe("Outfit Controller", function() {
beforeEach(module('app'));
var outfitController, 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 valid internal components', 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

@@ -1,10 +1,12 @@
describe("Ship Factory", function() {
var Ship;
var Components;
beforeEach(module('shipyard'));
beforeEach(inject(['Ship', function (_Ship_) {
beforeEach(inject(['Ship', 'Components', function (_Ship_, _Components_) {
Ship = _Ship_;
Components = _Components_;
}]));
it("can build all ships", function() {
@@ -27,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');
}
});
@@ -64,7 +66,88 @@ describe("Ship Factory", function() {
for(var p in testShip) {
expect(testShip[p]).toEqual(shipA[p], p + ' does not match');
}
});
it("discounts hull and components properly", function() {
var id = 'cobra_mk_iii';
var cobra = DB.ships[id];
var testShip = new Ship(id, cobra.properties, cobra.slots);
testShip.buildWith(cobra.defaults);
var originalHullCost = testShip.hullCost;
var originalTotalCost = testShip.totalCost;
var discount = 0.9;
expect(testShip.c.discountedCost).toEqual(originalHullCost, 'Hull cost does not match');
testShip.applyDiscounts(discount, discount);
// Floating point errors cause miniscule decimal places which are handled in the app by rounding/formatting
expect(Math.floor(testShip.c.discountedCost)).toEqual(Math.floor(originalHullCost * discount), 'Discounted Hull cost does not match');
expect(Math.floor(testShip.totalCost)).toEqual(Math.floor(originalTotalCost * discount), 'Discounted Total cost does not match');
testShip.applyDiscounts(1, 1); // No discount, 100% of cost
expect(testShip.c.discountedCost).toEqual(originalHullCost, 'Hull cost does not match');
expect(testShip.totalCost).toEqual(originalTotalCost, 'Total cost does not match');
testShip.applyDiscounts(discount, 1); // Only discount hull
expect(Math.floor(testShip.c.discountedCost)).toEqual(Math.round(originalHullCost * discount), 'Discounted Hull cost does not match');
expect(testShip.totalCost).toEqual(originalTotalCost - originalHullCost + testShip.c.discountedCost, 'Total cost does not match');
});
it("enforces a single shield generator", function() {
var id = 'anaconda';
var anacondaData = DB.ships[id];
var anaconda = new Ship(id, anacondaData.properties, anacondaData.slots);
anaconda.buildWith(anacondaData.defaults);
expect(anaconda.internal[2].c.grp).toEqual('sg', 'Anaconda default shield generator slot');
anaconda.use(anaconda.internal[1], '4j', Components.internal('4j')); // 6E Shield Generator
expect(anaconda.internal[2].c).toEqual(null, 'Anaconda default shield generator slot is empty');
expect(anaconda.internal[2].id).toEqual(null, 'Anaconda default shield generator slot id is null');
expect(anaconda.internal[1].id).toEqual('4j', 'Slot 1 should have SG 4j in it');
expect(anaconda.internal[1].c.grp).toEqual('sg','Slot 1 should have SG 4j in it');
});
it("enforces a single shield fuel scoop", function() {
var id = 'anaconda';
var anacondaData = DB.ships[id];
var anaconda = new Ship(id, anacondaData.properties, anacondaData.slots);
anaconda.buildWith(anacondaData.defaults);
anaconda.use(anaconda.internal[4], '32', Components.internal('32')); // 4A Fuel Scoop
expect(anaconda.internal[4].c.grp).toEqual('fs', 'Anaconda fuel scoop slot');
anaconda.use(anaconda.internal[3], '32', Components.internal('32'));
expect(anaconda.internal[4].c).toEqual(null, 'Anaconda original fuel scoop slot is empty');
expect(anaconda.internal[4].id).toEqual(null, 'Anaconda original fuel scoop slot id is null');
expect(anaconda.internal[3].id).toEqual('32', 'Slot 1 should have FS 32 in it');
expect(anaconda.internal[3].c.grp).toEqual('fs','Slot 1 should have FS 32 in it');
});
it("enforces a single refinery", function() {
var id = 'anaconda';
var anacondaData = DB.ships[id];
var anaconda = new Ship(id, anacondaData.properties, anacondaData.slots);
anaconda.buildWith(anacondaData.defaults);
anaconda.use(anaconda.internal[4], '23', Components.internal('23')); // 4E Refinery
expect(anaconda.internal[4].c.grp).toEqual('rf', 'Anaconda refinery slot');
anaconda.use(anaconda.internal[3], '23', Components.internal('23'));
expect(anaconda.internal[4].c).toEqual(null, 'Anaconda original refinery slot is empty');
expect(anaconda.internal[4].id).toEqual(null, 'Anaconda original refinery slot id is null');
expect(anaconda.internal[3].id).toEqual('23', 'Slot 1 should have RF 23 in it');
expect(anaconda.internal[3].c.grp).toEqual('rf','Slot 1 should have RF 23 in it');
});
});

View File

@@ -0,0 +1,41 @@
describe("Serializer Service", function() {
beforeEach(module('app'));
var Ship, Serializer;
beforeEach(inject(function (_Ship_, _Serializer_) {
Ship = _Ship_;
Serializer = _Serializer_;
}));
describe("Detailed Export", function() {
var code = '48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.AwRj4yo5dig=.MwBhEYy6duwEziA',
url = 'http://a.test.url.com',
anaconda = DB.ships['anaconda'],
testBuild,
exportData;
beforeEach(function() {
testBuild = new Ship('anaconda', anaconda.properties, anaconda.slots);
Serializer.toShip(testBuild, code);
exportData = Serializer.toJsonBuild('Test Build', testBuild, url, code);
});
it("conforms to the ship-loadout schema", function() {
var shipLoadoutSchema = __json__['/schemas/ship-loadout/1-draft'];
var validate = jsen(shipLoadoutSchema);
var valid = validate(exportData);
expect(valid).toBeTruthy();
});
xit("contains the correct components", function() {
// TODO: implement
});
xit("contains the correct stats", function() {
// TODO: implement
});
});
});