UI changes, added utilitiy services, persistance, serialization

This commit is contained in:
Colin McLeod
2015-05-01 01:14:29 -07:00
parent f736a078ec
commit 51ac98d10f
82 changed files with 2709 additions and 2516 deletions

View File

@@ -1,7 +1,7 @@
About
License
Development
@@ -9,9 +9,21 @@ Development
#Ship and Component Database
See Data Readme for details on structure, etc.
See Data Wiki for details on structure, etc.
Please submit issues, or better yet pull requests for any corrections or additions to the database.
Feature Requests and To Do List
#Feature Requests and To Do List
#To Do
#Data
#Internal Components
## Frame Shift Drive Interdictors
- Get actual range for range rating in Light seconds
#License

BIN
app/images/deep-space.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

View File

@@ -3,7 +3,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<base href="/">
<title>Coriolis Shipyard</title>
<title ng-bind="title">Coriolis</title>
<link rel="stylesheet" href="app.css">
<link rel="apple-touch-icon" sizes="76x76" href="images/logo/apple-touch-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="images/logo/apple-touch-icon-114x114.png">
@@ -24,7 +24,7 @@
<body>
<div id="bg"></div>
<shipyard-menu></shipyard-menu>
<div id="main" ng-view ng-click="bgClicked($event)"></div>
<div id="main" ui-view ng-click="bgClicked($event)"></div>
<footer>
<div class="right">Version <%= version %> - <%= date %></div>

View File

@@ -1,25 +1,45 @@
angular.module('app', ['ngRoute', 'shipyard', 'ngLodash', 'n3-line-chart', 'app.templates'])
.config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) {
angular.module('app', ['ui.router', 'shipyard', 'ngLodash', 'app.templates'])
.config(['$stateProvider', '$urlRouterProvider', '$locationProvider', function($stateProvider, $urlRouterProvider, $locationProvider) {
$locationProvider.html5Mode(true);
$routeProvider
.when('/:ship', { templateUrl: 'views/ship.html', controller: 'ShipController' })
.when('/:ship/:code', { templateUrl: 'views/ship.html', controller: 'ShipController' })
.when('/', { templateUrl: 'views/ships.html', controller: 'ShipyardController' });
$stateProvider
.state('outfit', {
url: '/outfit/:shipId/:code?bn',
params: {
// TODO: fix below, default, squash false not working
//shipId: { value: 'sidewinder', squash: false }, // Allow 'shipId' parameter to default to
code: { value: null, squash: true } // Allow 'code' parameter to be empty/optional
},
templateUrl: 'views/page-outfit.html',
controller: 'OutfitController',
resolve: {
shipId: ['$stateParams',function ($p) { // Ensure ship exists before loading controller
if (!DB.ships[$p.shipId]) {
throw { type: 404, message: 'Ship "' + $p.shipId + '" does not exist'};
}
}]
}
})
.state('shipyard', { url: '/', templateUrl: 'views/page-shipyard.html', controller: 'ShipyardController' })
.state('error', { params: {type:null, message:null, details: null }, templateUrl: 'views/page-error.html', controller: 'ErrorController' })
.state('notfound', { url: '*path', templateUrl: 'views/page-error.html', controller: 'ErrorController' });
}])
.run(['$rootScope','$document','$location','$route','commonArray','shipPurpose','shipSize','hardPointClass','internalGroupMap', function ($rootScope, $doc, $loc, $route, CArr, shipPurpose, sz, hpc, igMap) {
// Allow URL changes without reloading controllers/view
var original = $loc.path;
$loc.path = function (path, reload) {
if (reload === false) {
var lastRoute = $route.current;
var un = $rootScope.$on('$locationChangeSuccess', function () {
$route.current = lastRoute;
un();
});
}
return original.apply($loc, [path]);
};
.config(['$provide',function($provide) {
// Global Error Handler, redirects uncaught errors to the error page
$provide.decorator('$exceptionHandler', ['$delegate', '$injector', function ($delegate, $injector) {
return function(exception, cause) {
$injector.get('$state').go('error', { details: exception }, {location:false, reload:true}); // Go to error state, reload the controller, keep the current URL
$delegate(exception, cause);
};
}]);
}])
.run(['$rootScope','$document','$state','commonArray','shipPurpose','shipSize','hardPointClass','internalGroupMap','hardpointsGroupMap', function ($rootScope, $doc, $state, CArr, shipPurpose, sz, hpc, igMap, hgMap) {
// Redirect any state transition errors to the error controller/state
$rootScope.$on('$stateChangeError', function(e, toState, toParams, fromState, fromParams, error){
e.preventDefault();
$state.go('error',error, {location:false, reload:true}); // Go to error state, reload the controller, keep the current URL
});
// Global Reference variables
$rootScope.CArr = CArr;
@@ -27,7 +47,9 @@ angular.module('app', ['ngRoute', 'shipyard', 'ngLodash', 'n3-line-chart', 'app.
$rootScope.SZ = sz;
$rootScope.HPC = hpc;
$rootScope.igMap = igMap;
window.hgmap = $rootScope.hgMap = hgMap;
$rootScope.ships = DB.ships;
$rootScope.title = 'Coriolis';
// Formatters
$rootScope.fCrd = d3.format(',.0f');

View File

@@ -0,0 +1,15 @@
angular.module('app')
.controller('ErrorController', ['$rootScope','$scope','$stateParams', '$location', function ($rootScope, $scope, $p, $location) {
$rootScope.title = 'Error';
if ($p.path) { // If path is specified, 404
$scope.type = 404; // Deep Space Image...
$scope.message = ""
$scope.path = $p.path;
} else {
$scope.type = $p.type || 'unknown';
$scope.message = $p.message || "Uh, this is bad..";
$scope.path = $location.path();
}
}]);

View File

@@ -0,0 +1,101 @@
angular.module('app').controller('OutfitController', ['$rootScope','$scope', '$state', '$stateParams', 'Ship', 'Components', 'Serializer', 'Persist', function ($rootScope, $scope, $state, $p, Ship, Components, Serializer, Persist) {
var data = DB.ships[$p.shipId];
var ship = new Ship($p.shipId, data.properties, data.slots); // Create a new Ship instance
if ($p.code) {
Serializer.toShip(ship, $p.code); // Populate components from 'code' URL param
$scope.code = $p.code;
} else {
ship.buildWith(data.defaults); // Populate with default components
}
$scope.buildName = $p.bn;
$rootScope.title = ship.name + $scope.buildName? ' - ' + $scope.buildName: '';
$scope.ship = ship;
$scope.pp = ship.common[0]; // Power Plant
$scope.th = ship.common[1]; // Thruster
$scope.fsd = ship.common[2]; // Frame Shrift Drive
$scope.ls = ship.common[3]; // Life Support
$scope.pd = ship.common[4]; // Power Distributor
$scope.ss = ship.common[5]; // Sensors
$scope.ft = ship.common[6]; // Fuel Tank
$scope.hps = ship.hardpoints;
$scope.internal = ship.internal;
$scope.availCS = Components.forShip(ship.id);
$scope.selectedSlot = null;
$scope.lastSaveCode = Persist.getBuild(ship.id, $scope.buildName);
// for debugging
window.myScope = $scope;
$scope.selectSlot = function(e, slot) {
e.stopPropagation();
if ($scope.selectedSlot == slot) {
$scope.selectedSlot = null;
} else {
$scope.selectedSlot = slot;
}
};
$scope.select = function(type, slot, e) {
e.stopPropagation();
if (e.srcElement.id) {
if(type == 'h') {
ship.use(slot, e.srcElement.id, Components.hardpoints(e.srcElement.id));
} else if (type == 'c') {
ship.use(slot, e.srcElement.id, Components.common(ship.common.indexOf(slot), e.srcElement.id));
} else if (type == 'i') {
ship.use(slot, e.srcElement.id, Components.internal(e.srcElement.id));
} else if (type == 'b') {
ship.useBulkhead(slot, e.srcElement.id);
} else {
ship.use(slot, null, null);
}
$scope.selectedSlot = null;
$scope.code = Serializer.fromShip(ship);
$state.go('outfit', {shipId: ship.id, code: $scope.code, bn: $scope.buildName}, {location:'replace', notify:false});
$scope.canSave = true;
}
}
/**
* Reload the build from the last save.
*/
$scope.reloadBuild = function() {
if ($scope.buildName && $scope.lastSaveCode) {
Serializer.toShip(ship, $scope.lastSaveCode); // Repopulate with components from last save
$scope.code = $scope.lastSaveCode;
$state.go('outfit', {shipId: ship.id, code: $scope.lastSaveCode, bn: $scope.buildName}, {location:'replace', notify:false});
}
};
$scope.saveBuild = function() {
if ($scope.code && $scope.code != $scope.lastSaveCode) {
Persist.saveBuild(ship.id, $scope.buildName, $scope.code);
$scope.lastSaveCode = $scope.code;
$rootScope.$broadcast('buildSaved', ship.id, $scope.buildName, $scope.code);
}
}
$scope.deleteBuild = function() {
Persist.deleteBuild(ship.id, $scope.buildName);
$rootScope.$broadcast('buildDeleted', $scope.saveName, ship.id);
$state.go('outfit', {shipId: ship.id, code: null, bn: null}, {location:'replace', reload:true});
}
$rootScope.$on('keyup', function (e, keyEvent) {
if(keyEvent.keyCode == 27) { // on Escape
$scope.selectedSlot = null;
$scope.$apply();
}
else if(keyEvent.keycode == 83 && keyEvent.ctrlKey){ // CTRL + S
e.preventDefault();
$scope.saveBuild();
}
});
$rootScope.$on('bgClicked', function (e, keyEvent) {
$scope.selectedSlot = null;
});
}]);

View File

@@ -1,61 +0,0 @@
angular.module('app')
.controller('ShipController', ['$rootScope','$scope', '$routeParams', '$location', 'ShipFactory', 'components', function ($rootScope, $scope, $p, $loc, ShipFactory, Components) {
$scope.shipId = $p.ship;
// TODO: show 404 if ship not found.
var ship = ShipFactory($scope.shipId, DB.ships[$scope.shipId], $p.code);
$scope.ship = ship;
$scope.pp = ship.common[0]; // Power Plant
$scope.th = ship.common[1]; // Thruster
$scope.fsd = ship.common[2]; // Frame Shrift Drive
$scope.ls = ship.common[3]; // Life Support
$scope.pd = ship.common[4]; // Power Distributor
$scope.ss = ship.common[5]; // Sensors
$scope.ft = ship.common[6]; // Fuel Tank
$scope.hps = ship.hardpoints;
$scope.internal = ship.internal;
$scope.availCS = Components.forShip($scope.shipId);
$scope.selectedSlot = null;
// for debugging
window.ship = ship;
window.availcs = $scope.availCS;
$scope.selectSlot = function(e, slot) {
e.stopPropagation();
if ($scope.selectedSlot == slot) {
$scope.selectedSlot = null;
} else {
$scope.selectedSlot = slot;
}
};
$scope.selectComponent = function(slot, id, component) {
ship.use(slot, id, component);
$scope.selectedSlot = null;
$loc.path(ship.id + '/' + ship.code, false).replace();
}
$scope.hideMenus = function() {
$scope.selectedSlot = null;
}
$rootScope.$on('keyup', function (e, keyEvent) {
if(keyEvent.keyCode == 27) { // on Escape
$scope.hideMenus();
$scope.$apply();
}
// TODO: CTRL+S -> Save
});
$rootScope.$on('bgClicked', function (e, keyEvent) {
$scope.hideMenus();
});
// TODO: Save build
// TODO: name build + save
// Push new url history in this case
// TODO: delete build
// TODO: reset to ship defaults
// TODO: revert to last save
}]);

View File

@@ -1,4 +1,4 @@
angular.module('app')
.controller('ShipyardController', function () {
});
.controller('ShipyardController', ['$rootScope', function ($rootScope) {
$rootScope.title = 'Coriolis - Shipyard';
}]);

View File

@@ -2,15 +2,39 @@ angular.module('app').directive('componentSelect', [ function() {
return {
restrict: 'A',
scope:{
opts: '=', // Component Options object
slot: '=', // Slot Object
selectComponent: '&sc' // Select Component function
opts: '=', // Component Options object
},
templateUrl: 'views/component_select.html',
link: function (scope) {
scope.use = function(id, component) {
scope.selectComponent({s: scope.slot, id: id, c: component});
};
link: function(scope, element) {
var list = [], o, id;
var opts = scope.opts;
//TODO: take current ship mass into account if provided
// Generting the HTML in this manner is MUCH faster than using an angular template.
for (id in opts) {
o = opts[id];
list.push('<li class="');
list.push(o.name? 'lc' : 'c');
if (false) { // Omit id if mass is exceeded making it 'disabled'
list.push(' disabled"');
} else {
list.push('" id="');
}
list.push(id);
list.push('">');
list.push(o.class);
list.push(o.rating);
if(o.mode) {
list.push('/' + o.mode);
if(o.missile) {
list.push(o.missile);
}
}
if(o.name) {
list.push(' ' + o.name);
}
list.push('</li>');
}
element.html('<ul>' + list.join('') + '</ul>');
}
};
}]);

View File

@@ -1,4 +1,4 @@
angular.module('app').directive('shipRange', ['$rootScope','CalcJumpRange', function ($r, calcJumpRange) {
angular.module('app').directive('shipRange', ['$rootScope','calcJumpRange', function ($r, calcJumpRange) {
return {
restrict: 'A',

View File

@@ -1,12 +1,12 @@
angular.module('app').directive('hardpoint', ['$rootScope', function ($r) {
angular.module('app').directive('slotHardpoint', ['$rootScope', function ($r) {
return {
restrict: 'A',
scope:{
hp: '=',
size: '=',
opts: '='
lbl: '=',
},
templateUrl: 'views/hardpoint.html',
templateUrl: 'views/slot-hardpoint.html',
link: function (scope) {
scope.$r = $r;
}

View File

@@ -1,12 +1,12 @@
angular.module('app').directive('slotDetails', ['$rootScope', function ($r) {
angular.module('app').directive('slotInternal', ['$rootScope', function ($r) {
return {
restrict: 'A',
scope:{
c: '=',
c: '=slot',
lbl: '=',
opts: '='
},
templateUrl: 'views/slot.html',
templateUrl: 'views/slot-internal.html',
link: function(scope) {
scope.$r = $r;
}

58
app/js/service-persist.js Normal file
View File

@@ -0,0 +1,58 @@
angular.module('app').service('Persist', ['lodash', function (_) {
var LS_KEY = 'builds';
var buildJson = localStorage.getItem(LS_KEY);
if (buildJson) {
this.builds = angular.fromJson(localStorage.getItem(LS_KEY));
} else {
this.builds = {};
}
/**
* Persist a ship build in local storage.
*
* @param {string} shipId The unique id for a model of ship
* @param {string} name The name of the build
* @param {string} code The serialized code
*/
this.saveBuild = function (shipId, name, code) {
if (!this.builds[shipId]) {
this.builds[shipId] = {};
}
this.builds[shipId][name] = code;
localStorage.setItem(LS_KEY, angular.toJson(this.builds)); // Persist updated build collection to localstorage
}
/**
* Get the serialized code/string for a build. Returns null if a
* build is not found.
*
* @param {string} shipId The unique id for a model of ship
* @param {string} name The name of the build
* @return {string} The serialized build string.
*/
this.getBuild = function (shipId, name) {
if (this.builds[shipId]) {
return this.builds[shipId][name];
}
return null;
}
/**
* Delete a build from local storage. It will also delete the ship build collection if
* it becomes empty
*
* @param {string} shipId The unique id for a model of ship
* @param {string} name The name of the build
*/
this.deleteBuild = function (shipId, name) {
delete build[shipId][name];
if (Object.keys(build[shipId]).length == 0) {
delete build[shipId];
}
}
}]);

View File

@@ -0,0 +1,69 @@
/**
* Service managing seralization and deserialization of models for use in URLs and persistene.
*/
angular.module('app').service('Serializer', ['lodash', function (_) {
/**
* Serializes the ships selected components for all slots to a URL friendly string.
* @param {Ship} ship The ship to be serialized.
* @return {string} Encoded string of components
*/
this.fromShip = function(ship) {
var data = [
ship.bulkheads.id,
_.map(ship.common, idToStr),
_.map(ship.hardpoints, idToStr),
_.map(ship.internal, idToStr),
];
return _.flatten(data).join('');
};
/**
* Updates an existing ship instance's slots with components determined by the
* code.
*
* @param {Ship} ship The ship instance to be updated
* @param {string} code The string to deserialize
*/
this.toShip = function (ship, code) {
var commonCount = ship.common.length;
var hpCount = commonCount + ship.hardpoints.length;
var comps = {
bulkheads: code.charAt(0) * 1,
common: new Array(ship.common.length),
hardpoints: new Array(ship.hardpoints.length),
internal: new Array(ship.internal.length)
};
// TODO: improve...
for (var i = 1, c = 0, l = code.length; i < l; i++) {
var empty = code.charAt(i) == '-';
if (c < commonCount) {
comps.common[c] = empty? 0 : code.substring(i, i + 2);
} else if (c < hpCount) {
comps.hardpoints[c - commonCount] = empty? 0 : code.substring(i, i + 2);
} else {
comps.internal[c - hpCount] = empty? 0 : code.substring(i, i + 2);
}
if (!empty) {
i++;
}
c++;
}
ship.buildWith(comps);
};
/**
* Utility function to retrieve a safe string for selected component for a slot.
* Used for serialization to code only.
*
* @private
* @param {object} slot The slot object.
* @return {string} The id of the selected component or '-' if none selected
*/
function idToStr(slot) {
return (slot.id === null)? '-' : slot.id;
}
}]);

View File

@@ -1,40 +1,45 @@
angular.module('shipyard').factory('components', ['lodash', function (_) {
var C = DB.components;
angular.module('shipyard').factory('ComponentSet', ['lodash', function (_) {
function ComponentSet(shipId) {
var ship = DB.ships[shipId];
var maxInternal = ship.slotCap.internal[0];
this.mass = ship.mass;
function ComponentSet(components, mass, maxCommonArr, maxInternal, maxHardPoint) {
this.mass = mass;
this.common = {};
this.internal = {};
this.hardpoints = filter(C.hardpoints, ship.slotCap.hardpoints[0], 0, ship.mass);
this.bulkheads = C.bulkheads[shipId];
this.hardpoints = {};
this.hpClass = {};
this.intClass = {};
for (var i = 0; i < C.common.length; i ++) {
var max = ship.slotCap.common[i];
for (var i = 0; i < components.common.length; i ++) {
var max = maxCommonArr[i];
switch (i) {
// Slots where component class must be equal to slot class
case 3: // Life Support
case 5: // Sensors
this.common[i] = filter(C.common[i], max, max, ship.mass);
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(C.common[i], max, 0, ship.mass);
this.common[i] = filter(components.common[i], max, 0, this.mass);
}
}
for(var g in C.internal) {
this.internal[g] = filter(C.internal[g], maxInternal, 0, ship.mass);
for(var h in components.hardpoints) {
this.hardpoints[h] = filter(components.hardpoints[h], maxHardPoint, 0, this.mass);
}
for(var g in components.internal) {
this.internal[g] = filter(components.internal[g], maxInternal, 0, this.mass);
}
}
ComponentSet.prototype.getHps = function(c) {
if(!this.hpClass[c]) {
this.hpClass[c] = filter(this.hardpoints, c, c? 1 : 0, this.mass);
var o = this.hpClass[c] = {};
for(var key in this.hardpoints) {
var data = filter(this.hardpoints[key], c, c? 1 : 0, this.mass);
if(Object.keys(data).length) { // If group is not empty
o[key] = data;
}
}
}
return this.hpClass[c];
};
@@ -44,7 +49,7 @@ angular.module('shipyard').factory('components', ['lodash', function (_) {
var o = this.intClass[c] = {};
for(var key in this.internal) {
var data = filter(this.internal[key], c, 0, this.mass);
if(Object.keys(data).length) {
if(Object.keys(data).length) { // If group is not empty
o[key] = data;
}
}
@@ -62,16 +67,6 @@ angular.module('shipyard').factory('components', ['lodash', function (_) {
return set;
}
return {
forShip: function (shipId) {
return new ComponentSet(shipId);
},
findInternal: function(id) {
var c = _.find(C.internal, function(o) {
return o[id];
})
return c[id];
}
};
return ComponentSet;
}]);

View File

@@ -1,47 +1,30 @@
angular.module('shipyard').factory('ShipFactory', ['components', 'CalcShieldStrength', 'CalcJumpRange', 'lodash', function (Components, calcShieldStrength, calcJumpRange, _) {
angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength', 'calcJumpRange', 'lodash', function (Components, calcShieldStrength, calcJumpRange, _) {
/**
* Ship model used to track all ship components and properties.
*
* @param {string} id Unique ship Id / Key
* @param {object} shipData Data/defaults from the Ship database.
* @param {string} id Unique ship Id / Key
* @param {object} properties Basic ship properties such as name, manufacturer, mass, etc
* @param {object} slots Collection of slot groups (standard/common, internal, hardpoints) with their max class size.
*/
function Ship(id, shipData) {
function Ship(id, properties, slots) {
this.id = id;
this.defaults = shipData.defaultComponents;
this.incCost = true;
this.cargoScoop = { enabled: true, c: { name: 'Cargo Scoop', class: 1, rating: 'H', power: 0.6} };
this.sgSI = null; // Shield Generator Slot Index
this.cargoScoop = { enabled: true, c: Components.cargoScoop() };
this.bulkheads = { incCost: true, maxClass: 8 };
this.sgSI = null; // Shield Generator Index
// Copy all base properties from shipData
angular.forEach(shipData,function(o,k){
if(typeof o != 'object') {
this[k] = o;
}
}.bind(this));
for (p in properties) { this[p] = properties[p]; } // Copy all base properties from shipData
angular.forEach(shipData.slotCap, function (slots, slotGroup) { // Initialize all slots
this[slotGroup] = []; // Initialize Slot group (Common, Hardpoints, Internal)
for(var i = 0; i < slots.length; i++){
this[slotGroup].push({id: null, c: null, enabled: true, incCost: true, maxClass: slots[i]});
for (groupName in slots) { // Initialize all slots
var slotGroup = slots[groupName];
var group = this[groupName] = []; // Initialize Slot group (Common, Hardpoints, Internal)
for(var i = 0; i < slotGroup.length; i++){
group.push({id: null, c: null, enabled: true, incCost: true, maxClass: slotGroup[i]});
}
}.bind(this));
}
}
/**
* Reset the ship to the original 'manufacturer' defaults.
*/
Ship.prototype.clear = function() {
this.buildWith(DB.ships[this.id].defaultComponents);
};
/**
* Reset the current build to the previously used default
*/
Ship.prototype.reset = function() {
this.buildWith(this.defaults);
};
/**
* Builds/Updates the ship instance with the components[comps] passed in.
* @param {object} comps Collection of components used to build the ship
@@ -50,98 +33,37 @@ angular.module('shipyard').factory('ShipFactory', ['components', 'CalcShieldStre
var internal = this.internal;
var common = this.common;
var hps = this.hardpoints;
var availCommon = DB.components.common;
var availHardPoints = DB.components.hardpoints;
var availInternal = DB.components.internal;
var i,l;
this.bulkheads = { incCost: true, maxClass: 8, id: comps.bulkheads || 0, c: DB.components.bulkheads[this.id][comps.bulkheads || 0] };
this.bulkheads.id = comps.bulkheads || 0;
this.bulkheads.c = Components.bulkheads(this.id, this.bulkheads.id);
for(i = 0, l = comps.common.length; i < l; i++) {
common[i].id = comps.common[i];
common[i].c = availCommon[i][comps.common[i]];
common[i].c = Components.common(i, comps.common[i]);
}
for(i = 0, l = comps.hardpoints.length; i < l; i++) {
if(comps.hardpoints[i] !== 0) {
if (comps.hardpoints[i] !== 0) {
hps[i].id = comps.hardpoints[i];
hps[i].c = availHardPoints[comps.hardpoints[i]];
hps[i].c = Components.hardpoints(comps.hardpoints[i]);
} else {
hps[i].c = hps[i].id = null;
}
}
for(i = 0, l = comps.internal.length; i < l; i++) {
if(comps.internal[i] !== 0) {
if (comps.internal[i] !== 0) {
internal[i].id = comps.internal[i];
internal[i].c = Components.findInternal(comps.internal[i]);
if(internal[i].c.group == 'sg') {
internal[i].c = Components.internal(comps.internal[i]);
if (internal[i].c.group == 'sg') {
this.sgSI = i;
}
}
}
this.code = this.toCode();
this.updateTotals();
};
/**
* Serializes the selected components for all slots to a URL friendly string.
* @return {string} Encoded string of components
*/
Ship.prototype.toCode = function() {
var data = [
this.bulkheads.id,
_.map(this.common, idToStr),
_.map(this.hardpoints, idToStr),
_.map(this.internal, idToStr),
];
return _.flatten(data).join('');
};
/**
* Utility function to retrieve a safe string for selected component for a slot.
* Used for serialization to code only.
*
* @private
* @param {object} slot The slot object.
* @return {string} The id of the selected component or '-' if none selected
*/
function idToStr(slot) {
return (slot.id === null)? '-' : slot.id;
}
/**
* Updates the current ship instance's slots with components determined by the
* code.
*
* @param {string} code [description]
*/
Ship.prototype.buildFromCode = function (code) {
var commonCount = this.common.length;
var hpCount = commonCount + this.hardpoints.length;
var comps = {
bulkheads: code.charAt(0) * 1,
common: new Array(this.common.length),
hardpoints: new Array(this.hardpoints.length),
internal: new Array(this.internal.length)
};
// TODO: improve...
for (var i = 1, c = 0, l = code.length; i < l; i++) {
var isNull = code.charAt(i) == '-';
if (c < commonCount) {
comps.common[c] = isNull? 0 : code.substring(i, i + 2);
} else if (c < hpCount) {
comps.hardpoints[c - commonCount] = isNull? 0 : code.substring(i, i + 2);
} else {
comps.internal[c - hpCount] = isNull? 0 : code.substring(i, i + 2);
internal[i].id = internal[i].c = null;
}
if (!isNull) {
i++;
}
c++;
}
this.defaults = comps;
this.buildWith(comps);
this.updateTotals();
};
/**
@@ -171,7 +93,6 @@ angular.module('shipyard').factory('ShipFactory', ['components', 'CalcShieldStre
// TODO: shield recharge rate
// TODO: armor bonus / damage reduction for bulkheads
// TODO: thermal load and weapon recharge rate
this.code = this.toCode();
};
/**
@@ -195,6 +116,10 @@ angular.module('shipyard').factory('ShipFactory', ['components', 'CalcShieldStre
return sum;
}
function findInternal(slots, group) {
}
Ship.prototype.useBulkhead = function(index) {
this.bulkheads.id = index;
this.bulkheads.c = DB.components.bulkheads[this.id][index];
@@ -238,21 +163,5 @@ angular.module('shipyard').factory('ShipFactory', ['components', 'CalcShieldStre
}
};
/**
* Ship Factory function. Created a new instance of a ship based on the ship type.
*
* @param {string} id Id/Key for the Ship type
* @param {object} shipData [description]
* @param {string} code [optional] Code to build the ship with
* @return {Ship} A new Ship instance
*/
return function (id, shipData, code) {
var s = new Ship(id, shipData);
if (code) {
s.buildFromCode(code);
} else {
s.clear();
}
return s;
};
return Ship;
}]);

View File

@@ -1,3 +1,9 @@
/**
* This module contains all of the logic and models corresponding to
* information or behavoir in Elite Dangerous.
*
* This file contains values and functions that can be reused across the app.
*/
angular.module('shipyard', [])
.value('commonArray', [
'Power Plant',
@@ -13,14 +19,33 @@ angular.module('shipyard', [])
sc:'Scanners',
am:'Auto Field-Maintenance Unit',
cr:'Cargo Racks',
fi:'Frame Shift Drive Interdictor',
hb:'Hatch Breaker Limpet Controller',
fi:'FSD Interdictor',
hb:'Hatch Breaker Limpet Ctrl',
hr:'Hull Reinforcement Package',
rf:'Refinery',
sb:'Shield Cell Bank',
sg:'Shield Generator',
dc:'Docking Computer'
})
.value('hardpointsGroupMap', {
'bl': "Beam Laser",
'ul': "Burst Laser",
'c': "Cannon",
'cs': "Cargo Scanner",
'cm': "Countermeasure",
'fc': "Fragment Cannon",
'fs': "Frame Shift Wake Scanner",
'kw': "Kill Warrant Scanner",
'nl': "Mine Launcher",
'ml': "Mining Laser",
'mr': "Missile Rack",
'pa': "Plasma Accelerator",
'mc': "Multi-cannon",
'pl': "Pulse Laser",
'rg': "Rail Gun",
'sb': "Shield Booster",
'tp': "Torpedo Pylon"
})
.value('shipPurpose', {
mp: 'Multi Purpose',
fr: 'Freighter',
@@ -35,13 +60,6 @@ angular.module('shipyard', [])
'Large',
'Capital',
])
.factory('commonMap', ['commonArray', function (commonArray) {
var commonMap = {};
for(var i = 0; i < commonArray.length; i++) {
commonMap[commonArray[i]] = i;
}
return commonMap;
}])
.value('hardPointClass', [
'Utility',
'Small',
@@ -49,53 +67,7 @@ angular.module('shipyard', [])
'Large',
'Huge'
])
.factory('hardpointGroup', function () {
function groupToLabel (grp) {
var a = grp.toLowerCase().split('');
var l = [];
switch(a[0]) {
case 's':
l.push('Small');
break;
case 'm':
l.push('Medium');
break;
case 'l':
l.push('Large');
break;
case 'h':
l.push('Huge');
break;
case 'u':
l.push('Utility');
break;
}
switch(a[1]) {
case 'o':
l.push('Other');
break;
case 'k':
l.push('Kinetic');
break;
case 't':
l.push('Thermal');
break;
case 's':
l.push('Scanner');
break;
case 'b':
l.push('Booster');
break;
case 'm':
l.push('Mount');
break;
}
return l.join(' ');
}
return groupToLabel;
})
.factory('CalcJumpRange', function() {
.factory('calcJumpRange', function() {
/**
* Calculate the maximum single jump range based on mass and a specific FSD
* @param {number} mass Mass of a ship: laden, unlanden, partially laden, etc
@@ -107,7 +79,7 @@ angular.module('shipyard', [])
return Math.pow(Math.min(fuel || Infinity, fsd.maxfuel) / fsd.fuelmul, 1 / fsd.fuelpower ) * fsd.optmass / mass;
};
})
.factory('CalcShieldStrength', function() {
.factory('calcShieldStrength', function() {
/**
* Calculate the a ships shield strength based on mass, shield generator and shield boosters used.
*
@@ -119,6 +91,9 @@ angular.module('shipyard', [])
* @return {number} Approximate shield strengh in MJ
*/
return function (mass, shields, sg, multiplier) {
if (!sg) {
return 0;
}
if (mass <= sg.minmass) {
return shields * multiplier * sg.minmul;
}

View File

@@ -0,0 +1,35 @@
angular.module('shipyard').service('Components', ['lodash', 'ComponentSet', function (_, ComponentSet) {
var C = DB.components;
this.cargoScoop = function() {
return { name: 'Cargo Scoop', class: 1, rating: 'H', power: 0.6};
}
this.common = function (typeIndex, componentId) {
return C.common[typeIndex][componentId];
};
this.hardpoints = function(id) {
var c = _.find(C.hardpoints, function(o) {
return o[id];
})
return c[id];
};
this.internal = function(id) {
var c = _.find(C.internal, function(o) {
return o[id];
})
return c[id];
};
this.bulkheads = function(shipId, bulkheadsId) {
return C.bulkheads[shipId][bulkheadsId];
};
this.forShip = function (shipId) {
var ship = DB.ships[shipId];
return new ComponentSet(C, ship.properties.mass, ship.slots.common, ship.slots.internal[0], ship.slots.hardpoints[0]);
};
}]);

View File

@@ -7,6 +7,7 @@
@import 'list';
@import 'slot';
@import 'ship';
@import 'select';
@import 'charts';
@import 'meters';
@@ -32,10 +33,10 @@ body {
height: 100%;
z-index: -1;
opacity: 0.3;
//background-image: url(images/docking-bay.jpg);
//background-repeat: no-repeat;
//background-position: center;
//background-size: cover;
background-image: url(images/docking-bay.jpg);
background-repeat: no-repeat;
background-position: center;
background-size: cover;
}
#main {

84
app/less/select.less Normal file
View File

@@ -0,0 +1,84 @@
.select {
color: @primary-disabled;
position: absolute;
left: -1px;
padding: 5px 0;
width: 100%;
margin: 0;
max-height: 300px;
overflow-y: scroll;
background-color: @bg;
border: 1px solid @primary;
white-space: nowrap;
.select-group {
clear: both;
margin: 5px 0;
padding-left: 5px;
border-top: 1px solid @primary-disabled;
border-bottom: 1px solid @primary-disabled;
}
.empty-c, .c, .lc {
cursor: pointer;
color: @primary-disabled;
&:hover {
color: @warning;
}
}
@optionSpacing: 1.8em;
.lc {
padding-left: 5px;
line-height:@optionSpacing;
}
.empty-c {
line-height:@optionSpacing;
text-align: center;
}
&.hardpoint {
.c {
width: 4em;
&:nth-child(3n + 1) {
clear: left;
}
&:nth-child(5n +1) {
clear: none;
}
}
}
.c {
border:1px solid @primary-disabled;
display: block;
float:left;
padding: 0;
margin: 0.5em;
width: 2em;
line-height: @optionSpacing;
text-align: center;
&:hover {
border:1px solid @warning;
}
&:nth-child(5n +1) {
clear: left;
}
}
ul {
margin: 0;
margin-left: 20px;
padding: 0;
list-style: none;
overflow: hidden;
}
}

View File

@@ -88,77 +88,3 @@
}
}
}
.select {
color: @primary-disabled;
position: absolute;
left: -1px;
padding: 5px 0;
width: 100%;
margin: 0;
max-height: 300px;
overflow-y: scroll;
background-color: @bg;
border: 1px solid @primary;
.select-group {
clear: both;
margin: 5px 0;
padding-left: 5px;
border-top: 1px solid @primary-disabled;
border-bottom: 1px solid @primary-disabled;
}
.empty-c, .c, .lc {
cursor: pointer;
color: @primary-disabled;
&:hover {
color: @warning;
}
}
@optionSpacing: 1.8em;
.lc {
padding-left: 5px;
line-height:@optionSpacing;
}
.empty-c {
line-height:@optionSpacing;
text-align: center;
}
.c {
border:1px solid @primary-disabled;
display: block;
float:left;
padding: 0;
margin: 0.5em;
width: 2em;
//height: 1.5em;
line-height: @optionSpacing;
text-align: center;
&:hover {
border:1px solid @warning;
}
&:nth-child(5n +1) {
clear: left;
}
}
ul {
margin: 0;
margin-left: 20px;
padding: 0;
list-style: none;
overflow: hidden;
}
}

View File

@@ -1,3 +0,0 @@
<ul>
<li ng-class="{c: !o.name, lc: !!o.name}" ng-repeat="(id,o) in opts" ng-click="use(id,o)">{{o.class}}{{o.rating}}{{' ' + o.name || ''}}</li>
</ul>

View File

@@ -1,12 +1,15 @@
<header>
<div class="left">
<a href="/" class="logo shipyard"></a>
<a ui-sref="shipyard" class="logo shipyard"></a>
<a href="/something/bad" class="">Something bad</a>
<a href="/outfit/" class="">Outfit</a>
<a href="/outfit/bad" class="">Bad Ship</a>
</div>
<div class="right">
<a class="logo github" href="https://github.com/cmmcleod/ed-shipyard" target="_blank" title="Shipyard Github Project"></a>
<a class="logo reddit" href="https://github.com/cmmcleod/ed-shipyard" target="_blank" title="Reddit Thread"></a>
<a class="logo elite-dangerous" href="https://github.com/cmmcleod/ed-shipyard" target="_blank" title="Elite Dangerous Forum Thread"></a>
<a class="logo reddit" href="#" target="_blank" title="Reddit Thread"></a>
</div>
</header>

12
app/views/page-error.html Normal file
View File

@@ -0,0 +1,12 @@
<div>
<h1>Error {{type}}</h1>
<h2 ng-bind="message"></h2>
<p ng-if="path" ng-bind="path"></p>
</div>
<!-- TODO: formatting /-->
<!-- TODO: add awesome relevant SVG based on code /-->
<!-- TODO: Add github issue link /-->

View File

@@ -2,8 +2,14 @@
<div id="hardpoints" class="slot-group">
<h1>HardPoints</h1>
<div class="slot" ng-repeat="h in ship.hardpoints" ng-click="selectSlot($event, h)" ng-class="{selected: selectedSlot==h}">
<div class="details" hardpoint hp="h" size="HPC[h.maxClass]"></div>
<div component-select class="select" slot="h" sc="selectComponent(s,id,c)" opts="availCS.getHps(h.maxClass)" ng-show="selectedSlot==h" ng-click="$event.stopPropagation()"></div>
<div slot-hardpoint class="details" hp="h" size="HPC[h.maxClass]" lbl="hgMap[h.c.grp]"></div>
<div class="select" ng-class="{hardpoint: h.maxClass > 0}" ng-if="selectedSlot==h" ng-click="select('h',h,$event)">
<div class="empty-c" id="empty" ng-click="select(null, h, $event)">EMPTY</div>
<div ng-repeat="(grp, data) in availCS.getHps(h.maxClass)">
<div class="select-group">{{grp}}</div>
<div component-select opts="data"></div>
</div>
</div>
</div>
</div>
@@ -16,17 +22,17 @@
<div class="cl l">{{ship.bulkheads.c.name}}</div>
<div class="r cr">{{ship.bulkheads.c.mass}} T</div>
</div>
<div class="select" ng-show="selectedSlot==ship.bulkheads" ng-click="$event.stopPropagation()"><ul>
<li class="lc" ng-click="ship.useBulkhead(0);hideMenus();">Lightweight Alloy</li>
<li class="lc" ng-click="ship.useBulkhead(1);hideMenus();">Reinforced Alloy</li>
<li class="lc" ng-click="ship.useBulkhead(2);hideMenus();">Military Grade Composite</li>
<li class="lc" ng-click="ship.useBulkhead(3);hideMenus();">Mirrored Surface Composite</li>
<li class="lc" ng-click="ship.useBulkhead(4);hideMenus();">Reactive Surface Composite</li>
<div class="select" ng-if="selectedSlot==ship.bulkheads" ng-click="select('b',ship.bulkheads,$event)"><ul>
<li class="lc" id="0">Lightweight Alloy</li>
<li class="lc" id="1">Reinforced Alloy</li>
<li class="lc" id="2">Military Grade Composite</li>
<li class="lc" id="3">Mirrored Surface Composite</li>
<li class="lc" id="4">Reactive Surface Composite</li>
</ul></div>
</div>
<div class="slot" ng-click="selectSlot($event, pp)" ng-class="{selected: selectedSlot==pp}">
<div class="details">
<div class="sz">{{pp.maxClass}}</div>
<div class="sz">{{::pp.maxClass}}</div>
<div class="l">Power Plant</div>
<div class="r">{{pp.id}}</div>
<div class="cb"></div>
@@ -34,11 +40,11 @@
<div class="l">Power: {{pp.c.pGen}} MW</div>
<div class="r">{{pp.c.mass}} T</div>
</div>
<div component-select class="select" slot="pp" sc="selectComponent(s,id,c)" opts="availCS.common[0]" ng-show="selectedSlot==pp" ng-click="$event.stopPropagation()"></div>
<div component-select class="select" opts="availCS.common[0]" ng-if="selectedSlot==pp" ng-click="select('c',pp,$event)"></div>
</div>
<div class="slot" ng-click="selectSlot($event, th)" ng-class="{selected: selectedSlot==th}">
<div class="details">
<div class="sz">{{th.maxClass}}</div>
<div class="sz">{{::th.maxClass}}</div>
<div class="l">Thrusters</div>
<div class="r">{{th.id}}</div>
<div class="cb"></div>
@@ -46,11 +52,11 @@
<div class="l">Max: {{th.c.optmass}} T</div>
<div class="r">{{th.c.mass}} T</div>
</div>
<div component-select class="select" slot="th" sc="selectComponent(s,id,c)" opts="availCS.common[1]" ng-show="selectedSlot==th" ng-click="$event.stopPropagation()"></div>
<div component-select class="select" 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">
<div class="sz">{{fsd.maxClass}}</div>
<div class="sz">{{::fsd.maxClass}}</div>
<div class="l">Frame Shift Drive</div>
<div class="r">{{fsd.id}}</div>
<div class="cb"></div>
@@ -58,66 +64,75 @@
<div class="l">Max Fuel: {{fsd.c.maxfuel}} T</div>
<div class="r cr">{{fsd.c.mass}} T</div>
</div>
<div component-select class="select" slot="fsd" sc="selectComponent(s,id,c)" opts="availCS.common[2]" ng-show="selectedSlot==fsd" ng-click="$event.stopPropagation()"></div>
<div component-select class="select" opts="availCS.common[2]" ng-if="selectedSlot==fsd" ng-click="select('c',fsd,$event)"></div>
</div>
<div class="slot" ng-click="selectSlot($event, ls)" ng-class="{selected: selectedSlot==ls}">
<div class="details">
<div class="sz">{{ls.maxClass}}</div>
<div class="sz">{{::ls.maxClass}}</div>
<div class="l">Life Support</div>
<div class="r">{{ls.id}}</div>
<div class="cb"></div>
<div class="l">Time: {{fTime(ls.c.time)}}</div>
<div class="r cr">{{ls.c.mass}} T</div>
</div>
<div component-select class="select" slot="ls" sc="selectComponent(s,id,c)" opts="availCS.common[3]" ng-show="selectedSlot==ls" ng-click="$event.stopPropagation()"></div>
<div component-select class="select" opts="availCS.common[3]" ng-if="selectedSlot==ls" ng-click="select('c',ls,$event)"></div>
</div>
<div class="slot" ng-click="selectSlot($event, pd)" ng-class="{selected: selectedSlot==pd}">
<div class="details">
<div class="sz">{{pd.maxClass}}</div>
<div class="sz">{{::pd.maxClass}}</div>
<div class="l">Power Distributor</div>
<div class="r">{{pd.id}}</div>
<div class="cb"></div>
<!-- TODO: add power distributor stuff /-->
<div class="r cr">{{pd.c.mass}} T</div>
</div>
<div component-select class="select" slot="pd" sc="selectComponent(s,id,c)" opts="availCS.common[4]" ng-show="selectedSlot==pd" ng-click="$event.stopPropagation()"></div>
<div component-select class="select" opts="availCS.common[4]" ng-if="selectedSlot==pd" ng-click="select('c',pd,$event)"></div>
</div>
<div class="slot" ng-click="selectSlot($event, ss)" ng-class="{selected: selectedSlot==ss}">
<div class="details">
<div class="sz">{{ss.maxClass}}</div>
<div class="sz">{{::ss.maxClass}}</div>
<div class="l">Sensors</div>
<div class="r">{{ss.id}}</div>
<div class="cb"></div>
<div class="l">{{ss.c.range}} KM</div>
<div class="r cr">{{ss.c.mass}} T</div>
</div>
<div component-select class="select" slot="ss" sc="selectComponent(s,id,c)" opts="availCS.common[5]" ng-show="selectedSlot==ss" ng-click="$event.stopPropagation()"></div>
<div component-select class="select" opts="availCS.common[5]" ng-if="selectedSlot==ss" ng-click="select('c',ss,$event)"></div>
</div>
<div class="slot" ng-click="selectSlot($event, ft)" ng-class="{selected: selectedSlot==ft}">
<div class="details" lbl="CArr[0]">
<div class="sz">{{ft.maxClass}}</div>
<div class="details">
<div class="sz">{{::ft.maxClass}}</div>
<div class="l">Fuel Tank</div>
<div class="r">{{ft.id}}</div>
<div class="r cr">{{ft.c.capacity}} T</div>
</div>
<div component-select class="select" slot="ft" sc="selectComponent(s,id,c)" opts="availCS.common[6]" ng-show="selectedSlot==ft" ng-click="$event.stopPropagation()"></div>
<div component-select class="select" opts="availCS.common[6]" ng-if="selectedSlot==ft" ng-click="select('c',ft,$event)"></div>
</div>
</div>
<div id="internal" class="slot-group">
<h1>Internal Compartments</h1>
<div class="slot" ng-repeat="i in ship.internal" ng-click="selectSlot($event, i)" ng-class="{selected: selectedSlot==i}">
<div class="details" slot-details c="i" lbl="igMap[i.c.group]"></div>
<div class="select" ng-show="selectedSlot==i" ng-click="$event.stopPropagation()">
<div class="empty-c" ng-click="selectComponent(i, null,null)">EMPTY</div>
<div slot-internal class="details" slot="i" lbl="igMap[i.c.group]"></div>
<div class="select" ng-if="selectedSlot==i" ng-click="select('i',i,$event)">
<div class="empty-c" id="empty" ng-click="select(null, i, $event)">EMPTY</div>
<div ng-repeat="(grp, data) in availCS.getInts(i.maxClass)">
<div class="select-group">{{grp}}</div>
<div component-select slot="i" sc="selectComponent(s,id,c)" opts="data"></div>
<div component-select opts="data"></div>
</div>
</div>
</div>
</div>
<div id="build">
<h1 ng-bind="ship.name"></h1>
<input ng-model="buildName" placeholder="Build Name" />
<button ng-click="saveBuild()" ng-disabled="code == lastSaveCode">Save</button>
<button ng-click="reloadBuild()" ng-disabled="!lastSaveCode || code == lastSaveCode">Reload</button>
<button ui-sref="outfit({shipId: ship.id,code:null})" ng-disabled="!code">Clear</button>
<button ng-click="deleteBuild()" ng-disabled="!lastSaveCode">Delete</button>
</div>
<div id="summary">
<div class="list">
<div class="header">Maneuverability</div>

View File

@@ -0,0 +1,9 @@
<a ui-sref="outfit({shipId:id})" class="ship" ng-repeat="(id,s) in ships">
<h2 ng-bind="s.properties.name"></h2>
<small ng-bind="s.properties.manufacturer"></small>
<div class="subtitle">
<div class="purpose" ng-bind="SP[s.properties.group]"></div>
</div>
{{fCrd(s.properties.cost)}} CR
</a>

View File

@@ -1,9 +0,0 @@
<a ng-href="{{id}}" class="ship" ng-repeat="(id,s) in ships">
<h2>{{s.name}}</h2>
<small>{{s.manufacturer}}</small>
<div class="subtitle">
<div class="purpose">{{SP[s.group]}}</div>
</div>
{{fCrd(s.cost)}} CR
</a>

View File

@@ -1,7 +1,7 @@
<div class="sz">{{['U','S','M','L','H'][hp.maxClass]}}</div>
<div class="sz">{{::['U','S','M','L','H'][hp.maxClass]}}</div>
<div class="empty" ng-if="!hp.c">EMPTY</div>
<div ng-if="hp.c">
<div class="l">{{hp.c.name}}</div><div class="r">{{hp.c.class}}{{hp.c.rating}}<span ng-if="hp.c.mode">/{{hp.c.mode}}{{hp.c.missile}}</span></div>
<div class="l">{{hp.c.name || lbl}}</div><div class="r">{{hp.c.class}}{{hp.c.rating}}<span ng-if="hp.c.mode">/{{hp.c.mode}}{{hp.c.missile}}</span></div>
<div class="cb">
<div class="cb" ng-if="hp.c.damage" >
<div class="l" meter max="10" obj="hp.c" labels="['dps','dmg']" keys="['dps','damage']" style="width: 75px;height: 30px;"></div>

View File

@@ -1,4 +1,4 @@
<div class="sz">{{c.maxClass}}</div>
<div class="sz" ng-bind="c.maxClass"></div>
<div class="empty" ng-if="!c.c">EMPTY</div>
<div ng-if="c.c">
<div class="l">{{c.c.name || lbl}}</div>
@@ -8,8 +8,8 @@
<div class="l" ng-if="c.c.maxmass">Max: {{c.c.optmass}} T</div>
<div class="l" ng-if="c.c.bins">{{c.c.bins}} Bins</div>
<div class="l" ng-if="c.c.range">{{c.c.range}} KM</div>
<div class="r cr">{{c.c.mass || '0'}} T</div>
<!-- Armour add /-->
<!-- Capacity add /-->
<div class="l" ng-if="c.c.armouradd">+{{c.c.armouradd}} Armour</div>
<div class="r cr">{{c.c.mass || c.c.capacity || '0'}} T</div>
<!-- Rate add /-->
</div>

View File

@@ -25,14 +25,7 @@
"dependencies": {
"d3": "~3.5.5",
"ng-lodash": "~0.2.0",
"angular-route": "~1.3.15",
"n3-line-chart": "~1.1.6"
"angular-ui-router": "0.2.14"
},
"overrides": {
"nvd3": {
"main": [
"build/nv.d3.js"
]
}
}
"overrides": {}
}

View File

@@ -1,3 +0,0 @@
Explain WTF is going on here....

View File

@@ -1,4 +1,213 @@
{
"2A": {
"class": 2,
"rating": "A",
"cost": 160224,
"mass": 2.5,
"power": 0.3,
"optmass": 90,
"maxfuel": 0.9,
"fuelmul": 0.012,
"fuelpower": 2
},
"2B": {
"class": 2,
"rating": "B",
"cost": 53408,
"mass": 4,
"power": 0.25,
"optmass": 75,
"maxfuel": 0.8,
"fuelmul": 0.01,
"fuelpower": 2
},
"2C": {
"class": 2,
"rating": "C",
"cost": 17803,
"mass": 2.5,
"power": 0.2,
"optmass": 60,
"maxfuel": 0.6,
"fuelmul": 0.008,
"fuelpower": 2
},
"2D": {
"class": 2,
"rating": "D",
"cost": 5934,
"mass": 1,
"power": 0.18,
"optmass": 54,
"maxfuel": 0.6,
"fuelmul": 0.01,
"fuelpower": 2
},
"2E": {
"class": 2,
"rating": "E",
"cost": 1978,
"mass": 2.5,
"power": 0.16,
"optmass": 48,
"maxfuel": 0.6,
"fuelmul": 0.011,
"fuelpower": 2
},
"3A": {
"class": 3,
"rating": "A",
"cost": 507912,
"mass": 5,
"power": 0.45,
"optmass": 150,
"maxfuel": 1.8,
"fuelmul": 0.012,
"fuelpower": 2.15
},
"3B": {
"class": 3,
"rating": "B",
"cost": 169304,
"mass": 8,
"power": 0.38,
"optmass": 125,
"maxfuel": 1.5,
"fuelmul": 0.01,
"fuelpower": 2.15
},
"3C": {
"class": 3,
"rating": "C",
"cost": 56435,
"mass": 5,
"power": 0.3,
"optmass": 100,
"maxfuel": 1.2,
"fuelmul": 0.008,
"fuelpower": 2.15
},
"3D": {
"class": 3,
"rating": "D",
"cost": 18812,
"mass": 2,
"power": 0.27,
"optmass": 90,
"maxfuel": 1.2,
"fuelmul": 0.01,
"fuelpower": 2.15
},
"3E": {
"class": 3,
"rating": "E",
"cost": 6271,
"mass": 5,
"power": 0.24,
"optmass": 80,
"maxfuel": 1.2,
"fuelmul": 0.011,
"fuelpower": 2.15
},
"4A": {
"class": 4,
"rating": "A",
"cost": 1610080,
"mass": 10,
"power": 0.45,
"optmass": 525,
"maxfuel": 3,
"fuelmul": 0.012,
"fuelpower": 2.3
},
"4B": {
"class": 4,
"rating": "B",
"cost": 536693,
"mass": 16,
"power": 0.38,
"optmass": 438,
"maxfuel": 2.5,
"fuelmul": 0.01,
"fuelpower": 2.3
},
"4C": {
"class": 4,
"rating": "C",
"cost": 178898,
"mass": 10,
"power": 0.3,
"optmass": 350,
"maxfuel": 2,
"fuelmul": 0.008,
"fuelpower": 2.3
},
"4D": {
"class": 4,
"rating": "D",
"cost": 59633,
"mass": 4,
"power": 0.27,
"optmass": 315,
"maxfuel": 2,
"fuelmul": 0.01,
"fuelpower": 2.3
},
"4E": {
"class": 4,
"rating": "E",
"cost": 19878,
"mass": 10,
"power": 0.24,
"optmass": 280,
"maxfuel": 2,
"fuelmul": 0.011,
"fuelpower": 2.3
},
"5B": {
"class": 5,
"rating": "B",
"cost": 1701318,
"mass": 32,
"power": 0.5,
"optmass": 875,
"maxfuel": 4.1,
"fuelmul": 0.01,
"fuelpower": 2.45
},
"5C": {
"class": 5,
"rating": "C",
"cost": 567106,
"mass": 20,
"power": 0.4,
"optmass": 700,
"maxfuel": 3.3,
"fuelmul": 0.008,
"fuelpower": 2.45
},
"5D": {
"class": 5,
"rating": "D",
"cost": 189036,
"mass": 8,
"power": 0.36,
"optmass": 630,
"maxfuel": 3.3,
"fuelmul": 0.01,
"fuelpower": 2.45
},
"5E": {
"class": 5,
"rating": "E",
"cost": 63013,
"mass": 20,
"power": 0.32,
"optmass": 560,
"maxfuel": 3.3,
"fuelmul": 0.011,
"fuelpower": 2.45
},
"6A": {
"class": 6,
"rating": "A",
@@ -64,214 +273,5 @@
"maxfuel": 5,
"fuelmul": 0.012,
"fuelpower": 2.45
},
"5B": {
"class": 5,
"rating": "B",
"cost": 1701318,
"mass": 32,
"power": 0.5,
"optmass": 875,
"maxfuel": 4.1,
"fuelmul": 0.01,
"fuelpower": 2.45
},
"5C": {
"class": 5,
"rating": "C",
"cost": 567106,
"mass": 20,
"power": 0.4,
"optmass": 700,
"maxfuel": 3.3,
"fuelmul": 0.008,
"fuelpower": 2.45
},
"5D": {
"class": 5,
"rating": "D",
"cost": 189036,
"mass": 8,
"power": 0.36,
"optmass": 630,
"maxfuel": 3.3,
"fuelmul": 0.01,
"fuelpower": 2.45
},
"5E": {
"class": 5,
"rating": "E",
"cost": 63013,
"mass": 20,
"power": 0.32,
"optmass": 560,
"maxfuel": 3.3,
"fuelmul": 0.011,
"fuelpower": 2.45
},
"4A": {
"class": 4,
"rating": "A",
"cost": 1610080,
"mass": 10,
"power": 0.45,
"optmass": 525,
"maxfuel": 3,
"fuelmul": 0.012,
"fuelpower": 2.3
},
"4B": {
"class": 4,
"rating": "B",
"cost": 536693,
"mass": 16,
"power": 0.38,
"optmass": 438,
"maxfuel": 2.5,
"fuelmul": 0.01,
"fuelpower": 2.3
},
"4C": {
"class": 4,
"rating": "C",
"cost": 178898,
"mass": 10,
"power": 0.3,
"optmass": 350,
"maxfuel": 2,
"fuelmul": 0.008,
"fuelpower": 2.3
},
"4D": {
"class": 4,
"rating": "D",
"cost": 59633,
"mass": 4,
"power": 0.27,
"optmass": 315,
"maxfuel": 2,
"fuelmul": 0.01,
"fuelpower": 2.3
},
"4E": {
"class": 4,
"rating": "E",
"cost": 19878,
"mass": 10,
"power": 0.24,
"optmass": 280,
"maxfuel": 2,
"fuelmul": 0.011,
"fuelpower": 2.3
},
"3A": {
"class": 3,
"rating": "A",
"cost": 507912,
"mass": 5,
"power": 0.45,
"optmass": 150,
"maxfuel": 1.8,
"fuelmul": 0.012,
"fuelpower": 2.15
},
"3B": {
"class": 3,
"rating": "B",
"cost": 169304,
"mass": 8,
"power": 0.38,
"optmass": 125,
"maxfuel": 1.5,
"fuelmul": 0.01,
"fuelpower": 2.15
},
"3C": {
"class": 3,
"rating": "C",
"cost": 56435,
"mass": 5,
"power": 0.3,
"optmass": 100,
"maxfuel": 1.2,
"fuelmul": 0.008,
"fuelpower": 2.15
},
"3D": {
"class": 3,
"rating": "D",
"cost": 18812,
"mass": 2,
"power": 0.27,
"optmass": 90,
"maxfuel": 1.2,
"fuelmul": 0.01,
"fuelpower": 2.15
},
"3E": {
"class": 3,
"rating": "E",
"cost": 6271,
"mass": 5,
"power": 0.24,
"optmass": 80,
"maxfuel": 1.2,
"fuelmul": 0.011,
"fuelpower": 2.15
},
"2A": {
"class": 2,
"rating": "A",
"cost": 160224,
"mass": 2.5,
"power": 0.3,
"optmass": 90,
"maxfuel": 0.9,
"fuelmul": 0.012,
"fuelpower": 2
},
"2B": {
"class": 2,
"rating": "B",
"cost": 53408,
"mass": 4,
"power": 0.25,
"optmass": 75,
"maxfuel": 0.8,
"fuelmul": 0.01,
"fuelpower": 2
},
"2C": {
"class": 2,
"rating": "C",
"cost": 17803,
"mass": 2.5,
"power": 0.2,
"optmass": 60,
"maxfuel": 0.6,
"fuelmul": 0.008,
"fuelpower": 2
},
"2D": {
"class": 2,
"rating": "D",
"cost": 5934,
"mass": 1,
"power": 0.18,
"optmass": 54,
"maxfuel": 0.6,
"fuelmul": 0.01,
"fuelpower": 2
},
"2E": {
"class": 2,
"rating": "E",
"cost": 1978,
"mass": 2.5,
"power": 0.16,
"optmass": 48,
"maxfuel": 0.6,
"fuelmul": 0.011,
"fuelpower": 2
}
}

View File

@@ -1,27 +1,9 @@
{
"6C": {
"class": 6,
"1C": {
"class": 1,
"rating": "C",
"cost": 341577,
"capacity": 64
},
"5C": {
"class": 5,
"rating": "C",
"cost": 97754,
"capacity": 32
},
"4C": {
"class": 4,
"rating": "C",
"cost": 24734,
"capacity": 16
},
"3C": {
"class": 3,
"rating": "C",
"cost": 7063,
"capacity": 8
"cost": 1000,
"capacity": 2
},
"2C": {
"class": 2,
@@ -29,11 +11,28 @@
"cost": 3750,
"capacity": 4
},
"1C": {
"class": 1,
"3C": {
"class": 3,
"rating": "C",
"cost": 1000,
"capacity": 2
"cost": 7063,
"capacity": 8
},
"4C": {
"class": 4,
"rating": "C",
"cost": 24734,
"capacity": 16
},
"5C": {
"class": 5,
"rating": "C",
"cost": 97754,
"capacity": 32
},
"6C": {
"class": 6,
"rating": "C",
"cost": 341577,
"capacity": 64
}
}

View File

@@ -1,202 +1,42 @@
{
"8A": {
"class": 8,
"2A": {
"class": 2,
"rating": "A",
"cost": 162586486,
"mass": 80,
"pGen": 36,
"cost": 160224,
"mass": 1.3,
"pGen": 9.6,
"eff": "B"
},
"8B": {
"class": 8,
"2B": {
"class": 2,
"rating": "B",
"cost": 54195495,
"mass": 128,
"pGen": 33,
"cost": 53408,
"mass": 2,
"pGen": 8.8,
"eff": "C"
},
"8C": {
"class": 8,
"2C": {
"class": 2,
"rating": "C",
"cost": 18065165,
"mass": 80,
"pGen": 30,
"cost": 17803,
"mass": 1.3,
"pGen": 8,
"eff": "C"
},
"8D": {
"class": 8,
"2D": {
"class": 2,
"rating": "D",
"cost": 6021722,
"mass": 64,
"pGen": 27,
"cost": 5934,
"mass": 1,
"pGen": 7.2,
"eff": "D"
},
"8E": {
"class": 8,
"2E": {
"class": 2,
"rating": "E",
"cost": 2007241,
"mass": 160,
"pGen": 24,
"eff": "F"
},
"7A": {
"class": 7,
"rating": "A",
"cost": 51289112,
"mass": 40,
"pGen": 30,
"eff": "B"
},
"7B": {
"class": 7,
"rating": "B",
"cost": 17096371,
"mass": 64,
"pGen": 27.5,
"eff": "C"
},
"7C": {
"class": 7,
"rating": "C",
"cost": 5698790,
"mass": 40,
"pGen": 25,
"eff": "C"
},
"7D": {
"class": 7,
"rating": "D",
"cost": 1899597,
"mass": 32,
"pGen": 22.5,
"eff": "D"
},
"7E": {
"class": 7,
"rating": "E",
"cost": 633199,
"mass": 80,
"pGen": 20,
"eff": "F"
},
"6A": {
"class": 6,
"rating": "A",
"cost": 16179531,
"mass": 20,
"pGen": 25.2,
"eff": "B"
},
"6B": {
"class": 6,
"rating": "B",
"cost": 5393177,
"mass": 32,
"pGen": 23.1,
"eff": "C"
},
"6C": {
"class": 6,
"rating": "C",
"cost": 1797726,
"mass": 20,
"pGen": 21,
"eff": "C"
},
"6D": {
"class": 6,
"rating": "D",
"cost": 599242,
"mass": 16,
"pGen": 18.9,
"eff": "D"
},
"6E": {
"class": 6,
"rating": "E",
"cost": 199747,
"mass": 40,
"pGen": 16.8,
"eff": "F"
},
"5A": {
"class": 5,
"rating": "A",
"cost": 5103953,
"mass": 10,
"pGen": 20.4,
"eff": "B"
},
"5B": {
"class": 5,
"rating": "B",
"cost": 1701318,
"mass": 16,
"pGen": 18.7,
"eff": "C"
},
"5C": {
"class": 5,
"rating": "C",
"cost": 567106,
"mass": 10,
"pGen": 17,
"eff": "C"
},
"5D": {
"class": 5,
"rating": "D",
"cost": 189035,
"mass": 8,
"pGen": 15.3,
"eff": "D"
},
"5E": {
"class": 5,
"rating": "E",
"cost": 63012,
"mass": 20,
"pGen": 13.6,
"eff": "F"
},
"4A": {
"class": 4,
"rating": "A",
"cost": 1610080,
"mass": 5,
"pGen": 15.6,
"eff": "B"
},
"4B": {
"class": 4,
"rating": "B",
"cost": 536693,
"mass": 8,
"pGen": 14.3,
"eff": "C"
},
"4C": {
"class": 4,
"rating": "C",
"cost": 178898,
"mass": 5,
"pGen": 13,
"eff": "C"
},
"4D": {
"class": 4,
"rating": "D",
"cost": 59633,
"mass": 4,
"pGen": 11.7,
"eff": "D"
},
"4E": {
"class": 4,
"rating": "E",
"cost": 19878,
"mass": 10,
"pGen": 10.4,
"cost": 1978,
"mass": 2.5,
"pGen": 6.4,
"eff": "F"
},
"3A": {
@@ -239,44 +79,204 @@
"pGen": 8,
"eff": "F"
},
"2A": {
"class": 2,
"4A": {
"class": 4,
"rating": "A",
"cost": 160224,
"mass": 1.3,
"pGen": 9.6,
"cost": 1610080,
"mass": 5,
"pGen": 15.6,
"eff": "B"
},
"2B": {
"class": 2,
"4B": {
"class": 4,
"rating": "B",
"cost": 53408,
"mass": 2,
"pGen": 8.8,
"cost": 536693,
"mass": 8,
"pGen": 14.3,
"eff": "C"
},
"2C": {
"class": 2,
"4C": {
"class": 4,
"rating": "C",
"cost": 17803,
"mass": 1.3,
"pGen": 8,
"cost": 178898,
"mass": 5,
"pGen": 13,
"eff": "C"
},
"2D": {
"class": 2,
"4D": {
"class": 4,
"rating": "D",
"cost": 5934,
"mass": 1,
"pGen": 7.2,
"cost": 59633,
"mass": 4,
"pGen": 11.7,
"eff": "D"
},
"2E": {
"class": 2,
"4E": {
"class": 4,
"rating": "E",
"cost": 1978,
"mass": 2.5,
"pGen": 6.4,
"cost": 19878,
"mass": 10,
"pGen": 10.4,
"eff": "F"
},
"5A": {
"class": 5,
"rating": "A",
"cost": 5103953,
"mass": 10,
"pGen": 20.4,
"eff": "B"
},
"5B": {
"class": 5,
"rating": "B",
"cost": 1701318,
"mass": 16,
"pGen": 18.7,
"eff": "C"
},
"5C": {
"class": 5,
"rating": "C",
"cost": 567106,
"mass": 10,
"pGen": 17,
"eff": "C"
},
"5D": {
"class": 5,
"rating": "D",
"cost": 189035,
"mass": 8,
"pGen": 15.3,
"eff": "D"
},
"5E": {
"class": 5,
"rating": "E",
"cost": 63012,
"mass": 20,
"pGen": 13.6,
"eff": "F"
},
"6A": {
"class": 6,
"rating": "A",
"cost": 16179531,
"mass": 20,
"pGen": 25.2,
"eff": "B"
},
"6B": {
"class": 6,
"rating": "B",
"cost": 5393177,
"mass": 32,
"pGen": 23.1,
"eff": "C"
},
"6C": {
"class": 6,
"rating": "C",
"cost": 1797726,
"mass": 20,
"pGen": 21,
"eff": "C"
},
"6D": {
"class": 6,
"rating": "D",
"cost": 599242,
"mass": 16,
"pGen": 18.9,
"eff": "D"
},
"6E": {
"class": 6,
"rating": "E",
"cost": 199747,
"mass": 40,
"pGen": 16.8,
"eff": "F"
},
"7A": {
"class": 7,
"rating": "A",
"cost": 51289112,
"mass": 40,
"pGen": 30,
"eff": "B"
},
"7B": {
"class": 7,
"rating": "B",
"cost": 17096371,
"mass": 64,
"pGen": 27.5,
"eff": "C"
},
"7C": {
"class": 7,
"rating": "C",
"cost": 5698790,
"mass": 40,
"pGen": 25,
"eff": "C"
},
"7D": {
"class": 7,
"rating": "D",
"cost": 1899597,
"mass": 32,
"pGen": 22.5,
"eff": "D"
},
"7E": {
"class": 7,
"rating": "E",
"cost": 633199,
"mass": 80,
"pGen": 20,
"eff": "F"
},
"8A": {
"class": 8,
"rating": "A",
"cost": 162586486,
"mass": 80,
"pGen": 36,
"eff": "B"
},
"8B": {
"class": 8,
"rating": "B",
"cost": 54195495,
"mass": 128,
"pGen": 33,
"eff": "C"
},
"8C": {
"class": 8,
"rating": "C",
"cost": 18065165,
"mass": 80,
"pGen": 30,
"eff": "C"
},
"8D": {
"class": 8,
"rating": "D",
"cost": 6021722,
"mass": 64,
"pGen": 27,
"eff": "D"
},
"8E": {
"class": 8,
"rating": "E",
"cost": 2007241,
"mass": 160,
"pGen": 24,
"eff": "F"
}
}

View File

@@ -1,146 +1,139 @@
{
"10": {
"group": "lt",
"name": "Beam Laser",
"class": 3,
"rating": "D",
"cost": 19399600,
"mass": 8,
"power": 1.68,
"mode": "T",
"type": "T",
"damage": 5,
"armourpen": "A",
"rof": null,
"dps": 4,
"thermload": 4
},
"0o": {
"group": "st",
"name": "Beam Laser",
"class": 1,
"rating": "E",
"cost": 37430,
"mass": 2,
"power": 0.69,
"mode": "F",
"type": "T",
"damage": 4,
"armourpen": "A",
"rof": null,
"dps": 3,
"thermload": 3
},
"0p": {
"group": "st",
"name": "Beam Laser",
"class": 1,
"rating": "E",
"cost": 74650,
"mass": 2,
"power": 0.67,
"mode": "G",
"type": "T",
"damage": 4,
"armourpen": "A",
"rof": null,
"dps": 3,
"thermload": 3
},
"0q": {
"group": "st",
"name": "Beam Laser",
"class": 1,
"rating": "F",
"cost": 500000,
"mass": 2,
"power": 0.63,
"mode": "T",
"type": "T",
"damage": 3,
"armourpen": "A",
"rof": null,
"dps": 3,
"thermload": 2
},
"0r": {
"group": "mt",
"name": "Beam Laser",
"class": 2,
"rating": "D",
"cost": 299520,
"mass": 4,
"power": 1.12,
"mode": "F",
"type": "T",
"damage": 5,
"armourpen": "A",
"rof": null,
"dps": 4,
"thermload": 4
},
"0s": {
"group": "mt",
"name": "Beam Laser",
"class": 2,
"rating": "D",
"cost": 500600,
"mass": 4,
"power": 1.1,
"mode": "G",
"type": "T",
"damage": 5,
"armourpen": "A",
"rof": null,
"dps": 4,
"thermload": 4
},
"0t": {
"group": "mt",
"name": "Beam Laser",
"class": 2,
"rating": "E",
"cost": 2099900,
"mass": 4,
"power": 1.03,
"mode": "T",
"type": "T",
"damage": 4,
"armourpen": "A",
"rof": null,
"dps": 3,
"thermload": 3
},
"0u": {
"group": "lt",
"name": "Beam Laser",
"class": 3,
"rating": "C",
"cost": 1177600,
"mass": 8,
"power": 1.8,
"mode": "F",
"type": "T",
"damage": 6,
"armourpen": "A",
"rof": null,
"dps": 5,
"thermload": 5
},
"0v": {
"group": "lt",
"name": "Beam Laser",
"class": 3,
"rating": "C",
"cost": 2396160,
"mass": 8,
"power": 1.78,
"mode": "G",
"type": "T",
"damage": 6,
"armourpen": "A",
"rof": null,
"dps": 4,
"thermload": 6
"Beam Lasers" : {
"10": {
"grp": "bl",
"class": 1,
"rating": "E",
"cost": 37430,
"mass": 2,
"power": 0.69,
"mode": "F",
"type": "T",
"damage": 4,
"armourpen": "A",
"rof": null,
"dps": 3,
"thermload": 3
},
"0p": {
"grp": "bl",
"class": 1,
"rating": "E",
"cost": 74650,
"mass": 2,
"power": 0.67,
"mode": "G",
"type": "T",
"damage": 4,
"armourpen": "A",
"rof": null,
"dps": 3,
"thermload": 3
},
"0q": {
"grp": "bl",
"class": 1,
"rating": "F",
"cost": 500000,
"mass": 2,
"power": 0.63,
"mode": "T",
"type": "T",
"damage": 3,
"armourpen": "A",
"rof": null,
"dps": 3,
"thermload": 2
},
"0r": {
"grp": "bl",
"class": 2,
"rating": "D",
"cost": 299520,
"mass": 4,
"power": 1.12,
"mode": "F",
"type": "T",
"damage": 5,
"armourpen": "A",
"rof": null,
"dps": 4,
"thermload": 4
},
"0s": {
"grp": "bl",
"class": 2,
"rating": "D",
"cost": 500600,
"mass": 4,
"power": 1.1,
"mode": "G",
"type": "T",
"damage": 5,
"armourpen": "A",
"rof": null,
"dps": 4,
"thermload": 4
},
"0t": {
"grp": "bl",
"class": 2,
"rating": "E",
"cost": 2099900,
"mass": 4,
"power": 1.03,
"mode": "T",
"type": "T",
"damage": 4,
"armourpen": "A",
"rof": null,
"dps": 3,
"thermload": 3
},
"0u": {
"grp": "bl",
"class": 3,
"rating": "C",
"cost": 1177600,
"mass": 8,
"power": 1.8,
"mode": "F",
"type": "T",
"damage": 6,
"armourpen": "A",
"rof": null,
"dps": 5,
"thermload": 5
},
"0v": {
"grp": "bl",
"class": 3,
"rating": "C",
"cost": 2396160,
"mass": 8,
"power": 1.78,
"mode": "G",
"type": "T",
"damage": 6,
"armourpen": "A",
"rof": null,
"dps": 4,
"thermload": 6
},
"0o": {
"grp": "bl",
"class": 3,
"rating": "D",
"cost": 19399600,
"mass": 8,
"power": 1.68,
"mode": "T",
"type": "T",
"damage": 5,
"armourpen": "A",
"rof": null,
"dps": 4,
"thermload": 4
}
}
}

View File

@@ -1,98 +1,94 @@
{
"11": {
"group": "st",
"name": "Burst Laser",
"class": 1,
"rating": "F",
"cost": 4400,
"mass": 2,
"power": 0.65,
"mode": "F",
"type": "T",
"damage": 2,
"armourpen": "A",
"rof": 1.6,
"dps": 3,
"thermload": 1
},
"12": {
"group": "st",
"name": "Burst Laser",
"class": 1,
"rating": "G",
"cost": 8600,
"mass": 2,
"power": 0.64,
"mode": "G",
"type": "T",
"damage": 2,
"armourpen": "A",
"rof": 1.7,
"dps": 3,
"thermload": 1
},
"13": {
"group": "st",
"name": "Burst Laser",
"class": 1,
"rating": "G",
"cost": 52800,
"mass": 2,
"power": 0.6,
"mode": "T",
"type": "T",
"damage": 1,
"armourpen": "B",
"rof": 1.3,
"dps": 2,
"thermload": 1
},
"14": {
"group": "lt",
"name": "Burst Laser",
"class": 3,
"rating": "D",
"cost": 140400,
"mass": 8,
"power": 1.66,
"mode": "F",
"type": "T",
"damage": 4,
"armourpen": "B",
"rof": 1,
"dps": 4,
"thermload": 1
},
"15": {
"group": "lt",
"name": "Burst Laser",
"class": 3,
"rating": "E",
"cost": 281600,
"mass": 8,
"power": 1.65,
"mode": "G",
"type": "T",
"damage": 3,
"armourpen": "A",
"rof": 1.2,
"dps": 4,
"thermload": 1
},
"16": {
"group": "lt",
"name": "Burst Laser",
"class": 3,
"rating": "E",
"cost": 800400,
"mass": 8,
"power": 1.57,
"mode": "T",
"type": "T",
"damage": 3,
"armourpen": "A",
"rof": 0.9,
"dps": 4,
"thermload": 1
"Burst Lasers": {
"11": {
"grp": "ul",
"class": 1,
"rating": "F",
"cost": 4400,
"mass": 2,
"power": 0.65,
"mode": "F",
"type": "T",
"damage": 2,
"armourpen": "A",
"rof": 1.6,
"dps": 3,
"thermload": 1
},
"12": {
"grp": "ul",
"class": 1,
"rating": "G",
"cost": 8600,
"mass": 2,
"power": 0.64,
"mode": "G",
"type": "T",
"damage": 2,
"armourpen": "A",
"rof": 1.7,
"dps": 3,
"thermload": 1
},
"13": {
"grp": "ul",
"class": 1,
"rating": "G",
"cost": 52800,
"mass": 2,
"power": 0.6,
"mode": "T",
"type": "T",
"damage": 1,
"armourpen": "B",
"rof": 1.3,
"dps": 2,
"thermload": 1
},
"14": {
"grp": "ul",
"class": 3,
"rating": "D",
"cost": 140400,
"mass": 8,
"power": 1.66,
"mode": "F",
"type": "T",
"damage": 4,
"armourpen": "B",
"rof": 1,
"dps": 4,
"thermload": 1
},
"15": {
"grp": "ul",
"class": 3,
"rating": "E",
"cost": 281600,
"mass": 8,
"power": 1.65,
"mode": "G",
"type": "T",
"damage": 3,
"armourpen": "A",
"rof": 1.2,
"dps": 4,
"thermload": 1
},
"16": {
"grp": "ul",
"class": 3,
"rating": "E",
"cost": 800400,
"mass": 8,
"power": 1.57,
"mode": "T",
"type": "T",
"damage": 3,
"armourpen": "A",
"rof": 0.9,
"dps": 4,
"thermload": 1
}
}
}

View File

@@ -1,200 +1,202 @@
{
"1h": {
"group": "sk",
"name": "Cannon",
"class": 1,
"rating": "D",
"cost": 21100,
"mass": 2,
"power": 0.34,
"mode": "F",
"type": "K",
"damage": 5,
"armourpen": "A",
"rof": 0.5,
"dps": 3,
"thermload": 1,
"clip": 5,
"ammo": 100
},
"1i": {
"group": "sk",
"name": "Cannon",
"class": 1,
"rating": "E",
"cost": 42200,
"mass": 2,
"power": 0.38,
"mode": "G",
"type": "K",
"damage": 5,
"armourpen": "A",
"rof": 0.5,
"dps": 3,
"thermload": 1,
"clip": 5,
"ammo": 100
},
"1j": {
"group": "sk",
"name": "Cannon",
"class": 1,
"rating": "F",
"cost": 506400,
"mass": 2,
"power": 0.32,
"mode": "T",
"type": "K",
"damage": 4,
"armourpen": "A",
"rof": 0.4,
"dps": 3,
"thermload": 1,
"clip": 5,
"ammo": 100
},
"1k": {
"group": "mk",
"name": "Cannon",
"class": 2,
"rating": "D",
"cost": 168430,
"mass": 4,
"power": 0.49,
"mode": "F",
"type": "K",
"damage": 6,
"armourpen": "A",
"rof": 0.5,
"dps": 4,
"thermload": 1,
"clip": 5,
"ammo": 100
},
"1l": {
"group": "mk",
"name": "Cannon",
"class": 2,
"rating": "D",
"cost": 337600,
"mass": 4,
"power": 0.54,
"mode": "G",
"type": "K",
"damage": 6,
"armourpen": "A",
"rof": 0.5,
"dps": 3,
"thermload": 1,
"clip": 5,
"ammo": 100
},
"1m": {
"group": "mk",
"name": "Cannon",
"class": 2,
"rating": "E",
"cost": 4051200,
"mass": 4,
"power": 0.45,
"mode": "T",
"type": "K",
"damage": 5,
"armourpen": "A",
"rof": 0.3,
"dps": 3,
"thermload": 1,
"clip": 5,
"ammo": 100
},
"1n": {
"group": "lk",
"name": "Cannon",
"class": 3,
"rating": "C",
"cost": 675200,
"mass": 8,
"power": 0.67,
"mode": "F",
"type": "K",
"damage": 7,
"armourpen": "A",
"rof": 0.4,
"dps": 4,
"thermload": 2,
"clip": 5,
"ammo": 100
},
"1o": {
"group": "lk",
"name": "Cannon",
"class": 3,
"rating": "C",
"cost": 1350400,
"mass": 8,
"power": 0.75,
"mode": "G",
"type": "K",
"damage": 7,
"armourpen": "A",
"rof": 0.4,
"dps": 4,
"thermload": 1,
"clip": 5,
"ammo": 100
},
"1p": {
"group": "lk",
"name": "Cannon",
"class": 3,
"rating": "D",
"cost": 16204800,
"mass": 8,
"power": 0.64,
"mode": "T",
"type": "K",
"damage": 6,
"armourpen": "A",
"rof": 0.3,
"dps": 4,
"thermload": 1,
"clip": 5,
"ammo": 100
},
"1q": {
"group": "hk",
"name": "Cannon",
"class": 4,
"rating": "B",
"cost": 2700800,
"mass": 16,
"power": 0.92,
"mode": "F",
"type": "K",
"damage": 9,
"armourpen": "A",
"rof": 0.4,
"dps": 5,
"thermload": 2,
"clip": 5,
"ammo": 100
},
"1r": {
"group": "hk",
"name": "Cannon",
"class": 4,
"rating": "B",
"cost": 5401600,
"mass": 16,
"power": 1.03,
"mode": "G",
"type": "K",
"damage": 8,
"armourpen": "A",
"rof": 0.4,
"dps": 4,
"thermload": 2,
"clip": 5,
"ammo": 100
"Cannons": {
"1h": {
"grp": "c",
"class": 1,
"rating": "D",
"cost": 21100,
"mass": 2,
"power": 0.34,
"mode": "F",
"type": "K",
"damage": 5,
"armourpen": "A",
"rof": 0.5,
"dps": 3,
"thermload": 1,
"grp": "c",
"clip": 5,
"ammo": 100
},
"1i": {
"grp": "c",
"class": 1,
"rating": "E",
"cost": 42200,
"mass": 2,
"power": 0.38,
"mode": "G",
"type": "K",
"damage": 5,
"armourpen": "A",
"rof": 0.5,
"dps": 3,
"thermload": 1,
"grp": "c",
"clip": 5,
"ammo": 100
},
"1j": {
"grp": "c",
"class": 1,
"rating": "F",
"cost": 506400,
"mass": 2,
"power": 0.32,
"mode": "T",
"type": "K",
"damage": 4,
"armourpen": "A",
"rof": 0.4,
"dps": 3,
"thermload": 1,
"grp": "c",
"clip": 5,
"ammo": 100
},
"1k": {
"grp": "c",
"class": 2,
"rating": "D",
"cost": 168430,
"mass": 4,
"power": 0.49,
"mode": "F",
"type": "K",
"damage": 6,
"armourpen": "A",
"rof": 0.5,
"dps": 4,
"thermload": 1,
"grp": "c",
"clip": 5,
"ammo": 100
},
"1l": {
"grp": "c",
"class": 2,
"rating": "D",
"cost": 337600,
"mass": 4,
"power": 0.54,
"mode": "G",
"type": "K",
"damage": 6,
"armourpen": "A",
"rof": 0.5,
"dps": 3,
"thermload": 1,
"grp": "c",
"clip": 5,
"ammo": 100
},
"1m": {
"grp": "c",
"class": 2,
"rating": "E",
"cost": 4051200,
"mass": 4,
"power": 0.45,
"mode": "T",
"type": "K",
"damage": 5,
"armourpen": "A",
"rof": 0.3,
"dps": 3,
"thermload": 1,
"grp": "c",
"clip": 5,
"ammo": 100
},
"1n": {
"grp": "c",
"class": 3,
"rating": "C",
"cost": 675200,
"mass": 8,
"power": 0.67,
"mode": "F",
"type": "K",
"damage": 7,
"armourpen": "A",
"rof": 0.4,
"dps": 4,
"thermload": 2,
"grp": "c",
"clip": 5,
"ammo": 100
},
"1o": {
"grp": "c",
"class": 3,
"rating": "C",
"cost": 1350400,
"mass": 8,
"power": 0.75,
"mode": "G",
"type": "K",
"damage": 7,
"armourpen": "A",
"rof": 0.4,
"dps": 4,
"thermload": 1,
"grp": "c",
"clip": 5,
"ammo": 100
},
"1p": {
"grp": "c",
"class": 3,
"rating": "D",
"cost": 16204800,
"mass": 8,
"power": 0.64,
"mode": "T",
"type": "K",
"damage": 6,
"armourpen": "A",
"rof": 0.3,
"dps": 4,
"thermload": 1,
"grp": "c",
"clip": 5,
"ammo": 100
},
"1q": {
"grp": "c",
"class": 4,
"rating": "B",
"cost": 2700800,
"mass": 16,
"power": 0.92,
"mode": "F",
"type": "K",
"damage": 9,
"armourpen": "A",
"rof": 0.4,
"dps": 5,
"thermload": 2,
"grp": "c",
"clip": 5,
"ammo": 100
},
"1r": {
"grp": "c",
"class": 4,
"rating": "B",
"cost": 5401600,
"mass": 16,
"power": 1.03,
"mode": "G",
"type": "K",
"damage": 8,
"armourpen": "A",
"rof": 0.4,
"dps": 4,
"thermload": 2,
"grp": "c",
"clip": 5,
"ammo": 100
}
}
}

View File

@@ -1,57 +1,54 @@
{
"09": {
"group": "us",
"name": "Cargo Scanner",
"class": 0,
"rating": "A",
"cost": 1097095,
"mass": 1.3,
"power": 3.2,
"range": 4,
"time": 10
},
"0a": {
"group": "us",
"name": "Cargo Scanner",
"class": 0,
"rating": "B",
"cost": 365698,
"mass": 1.3,
"power": 1.6,
"range": 3.5,
"time": 10
},
"0b": {
"group": "us",
"name": "Cargo Scanner",
"class": 0,
"rating": "C",
"cost": 121899,
"mass": 1.3,
"power": 0.8,
"range": 3,
"time": 10
},
"0c": {
"group": "us",
"name": "Cargo Scanner",
"class": 0,
"rating": "D",
"cost": 40633,
"mass": 1.3,
"power": 0.4,
"range": 2.5,
"time": 10
},
"0d": {
"group": "us",
"name": "Cargo Scanner",
"class": 0,
"rating": "E",
"cost": 13544,
"mass": 1.3,
"power": 0.2,
"range": 2,
"time": 10
"Cargo Scanners": {
"09": {
"grp": "cs",
"class": 0,
"rating": "A",
"cost": 1097095,
"mass": 1.3,
"power": 3.2,
"range": 4,
"time": 10
},
"0a": {
"grp": "cs",
"class": 0,
"rating": "B",
"cost": 365698,
"mass": 1.3,
"power": 1.6,
"range": 3.5,
"time": 10
},
"0b": {
"grp": "cs",
"class": 0,
"rating": "C",
"cost": 121899,
"mass": 1.3,
"power": 0.8,
"range": 3,
"time": 10
},
"0c": {
"grp": "cs",
"class": 0,
"rating": "D",
"cost": 40633,
"mass": 1.3,
"power": 0.4,
"range": 2.5,
"time": 10
},
"0d": {
"grp": "cs",
"class": 0,
"rating": "E",
"cost": 13544,
"mass": 1.3,
"power": 0.2,
"range": 2,
"time": 10
}
}
}

View File

@@ -1,16 +0,0 @@
{
"00": {
"group": "um",
"name": "Chaff Launcher",
"class": 0,
"rating": "I",
"cost": 8500,
"mass": 1.3,
"power": 0.2,
"passive": 1,
"armourpen": "F",
"thermload": 2,
"clip": 1,
"ammo": 10
}
}

View File

@@ -0,0 +1,55 @@
{
"Countermeasures": {
"00": {
"name": "Chaff Launcher",
"class": 0,
"rating": "I",
"cost": 8500,
"mass": 1.3,
"power": 0.2,
"passive": 1,
"armourpen": "F",
"thermload": 2,
"clip": 1,
"ammo": 10
},
"01": {
"name": "Electronic Countermeasure",
"class": 0,
"rating": "F",
"cost": 12500,
"mass": 1.3,
"power": 0.2,
"range": 3,
"chargeup": 4,
"activepower": 4,
"cooldown": 10
},
"02": {
"name": "Heat Sink Launcher",
"class": 0,
"rating": "I",
"cost": 3500,
"mass": 1.3,
"power": 0.2,
"passive": 1,
"armourpen": "F",
"thermload": 0,
"clip": 1,
"ammo": 3
},
"03": {
"name": "Point Defence",
"class": 0,
"rating": "I",
"cost": 18546,
"mass": 0.5,
"power": 0.2,
"passive": 1,
"armourpen": "F",
"thermload": 1,
"clip": 50,
"ammo": 10000
}
}
}

View File

@@ -1,15 +0,0 @@
{
"01": {
"group": "um",
"name": "Electronic Countermeasure",
"class": 0,
"rating": "F",
"cost": 12500,
"mass": 1.3,
"power": 0.2,
"range": 3,
"chargeup": 4,
"activepower": 4,
"cooldown": 10
}
}

View File

@@ -1,128 +1,130 @@
{
"20": {
"group": "lk",
"name": "Fragment Cannon",
"class": 3,
"rating": "C",
"cost": 1167360,
"mass": 8,
"power": 1.02,
"mode": "F",
"type": "K",
"damage": 3,
"armourpen": "A",
"rof": 4.5,
"dps": 10,
"thermload": 1,
"clip": 3,
"ammo": 30
},
"21": {
"group": "lk",
"name": "Fragment Cannon",
"class": 3,
"rating": "C",
"cost": 1751040,
"mass": 8,
"power": 1.55,
"mode": "G",
"type": "K",
"damage": 3,
"armourpen": "A",
"rof": 4.8,
"dps": 10,
"thermload": 1,
"clip": 3,
"ammo": 30
},
"22": {
"group": "lk",
"name": "Fragment Cannon",
"class": 3,
"rating": "C",
"cost": 5836800,
"mass": 8,
"power": 1.29,
"mode": "T",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 3.3,
"dps": 9,
"thermload": 1,
"clip": 3,
"ammo": 30
},
"1s": {
"group": "sk",
"name": "Fragment Cannon",
"class": 1,
"rating": "E",
"cost": 36000,
"mass": 2,
"power": 0.45,
"mode": "F",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 5.5,
"dps": 8,
"thermload": 1,
"clip": 3,
"ammo": 30
},
"1t": {
"group": "sk",
"name": "Fragment Cannon",
"class": 1,
"rating": "E",
"cost": 54720,
"mass": 2,
"power": 0.59,
"mode": "G",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 5.8,
"dps": 7,
"thermload": 1,
"clip": 3,
"ammo": 30
},
"1u": {
"group": "sk",
"name": "Fragment Cannon",
"class": 1,
"rating": "E",
"cost": 182400,
"mass": 2,
"power": 0.42,
"mode": "T",
"type": "K",
"damage": 1,
"armourpen": "A",
"rof": 4,
"dps": 6,
"thermload": 1,
"clip": 3,
"ammo": 30
},
"1v": {
"group": "mk",
"name": "Fragment Cannon",
"class": 2,
"rating": "A",
"cost": 291840,
"mass": 4,
"power": 0.74,
"mode": "F",
"type": "K",
"damage": 3,
"armourpen": "A",
"rof": 5,
"dps": 9,
"thermload": 1,
"clip": 3,
"ammo": 30
"Fragment Cannons": {
"20": {
"grp": "fc",
"class": 1,
"rating": "E",
"cost": 36000,
"mass": 2,
"power": 0.45,
"mode": "F",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 5.5,
"dps": 8,
"thermload": 1,
"grp": "fc",
"clip": 3,
"ammo": 30
},
"21": {
"grp": "fc",
"class": 1,
"rating": "E",
"cost": 54720,
"mass": 2,
"power": 0.59,
"mode": "G",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 5.8,
"dps": 7,
"thermload": 1,
"grp": "fc",
"clip": 3,
"ammo": 30
},
"22": {
"grp": "fc",
"class": 1,
"rating": "E",
"cost": 182400,
"mass": 2,
"power": 0.42,
"mode": "T",
"type": "K",
"damage": 1,
"armourpen": "A",
"rof": 4,
"dps": 6,
"thermload": 1,
"grp": "fc",
"clip": 3,
"ammo": 30
},
"1s": {
"grp": "fc",
"class": 2,
"rating": "A",
"cost": 291840,
"mass": 4,
"power": 0.74,
"mode": "F",
"type": "K",
"damage": 3,
"armourpen": "A",
"rof": 5,
"dps": 9,
"thermload": 1,
"grp": "fc",
"clip": 3,
"ammo": 30
},
"1t": {
"grp": "fc",
"class": 3,
"rating": "C",
"cost": 1167360,
"mass": 8,
"power": 1.02,
"mode": "F",
"type": "K",
"damage": 3,
"armourpen": "A",
"rof": 4.5,
"dps": 10,
"thermload": 1,
"grp": "fc",
"clip": 3,
"ammo": 30
},
"1u": {
"grp": "fc",
"class": 3,
"rating": "C",
"cost": 1751040,
"mass": 8,
"power": 1.55,
"mode": "G",
"type": "K",
"damage": 3,
"armourpen": "A",
"rof": 4.8,
"dps": 10,
"thermload": 1,
"grp": "fc",
"clip": 3,
"ammo": 30
},
"1v": {
"grp": "fc",
"class": 3,
"rating": "C",
"cost": 5836800,
"mass": 8,
"power": 1.29,
"mode": "T",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 3.3,
"dps": 9,
"thermload": 1,
"grp": "fc",
"clip": 3,
"ammo": 30
}
}
}

View File

@@ -1,57 +1,54 @@
{
"0e": {
"group": "us",
"name": "Frame Shift Wake Scanner",
"class": 0,
"rating": "A",
"cost": 1097095,
"mass": 1.3,
"power": 3.2,
"range": 4,
"time": 10
},
"0f": {
"group": "us",
"name": "Frame Shift Wake Scanner",
"class": 0,
"rating": "B",
"cost": 365698,
"mass": 1.3,
"power": 1.6,
"range": 3.5,
"time": 10
},
"0g": {
"group": "us",
"name": "Frame Shift Wake Scanner",
"class": 0,
"rating": "C",
"cost": 121899,
"mass": 1.3,
"power": 0.8,
"range": 3,
"time": 10
},
"0h": {
"group": "us",
"name": "Frame Shift Wake Scanner",
"class": 0,
"rating": "D",
"cost": 40633,
"mass": 1.3,
"power": 0.4,
"range": 2.5,
"time": 10
},
"0i": {
"group": "us",
"name": "Frame Shift Wake Scanner",
"class": 0,
"rating": "E",
"cost": 13544,
"mass": 1.3,
"power": 0.2,
"range": 2,
"time": 10
"Frame Shift Wake Scanners": {
"0e": {
"grp": "fs",
"class": 0,
"rating": "A",
"cost": 1097095,
"mass": 1.3,
"power": 3.2,
"range": 4,
"time": 10
},
"0f": {
"grp": "fs",
"class": 0,
"rating": "B",
"cost": 365698,
"mass": 1.3,
"power": 1.6,
"range": 3.5,
"time": 10
},
"0g": {
"grp": "fs",
"class": 0,
"rating": "C",
"cost": 121899,
"mass": 1.3,
"power": 0.8,
"range": 3,
"time": 10
},
"0h": {
"grp": "fs",
"class": 0,
"rating": "D",
"cost": 40633,
"mass": 1.3,
"power": 0.4,
"range": 2.5,
"time": 10
},
"0i": {
"grp": "fs",
"class": 0,
"rating": "E",
"cost": 13544,
"mass": 1.3,
"power": 0.2,
"range": 2,
"time": 10
}
}
}

View File

@@ -1,16 +0,0 @@
{
"02": {
"group": "um",
"name": "Heat Sink Launcher",
"class": 0,
"rating": "I",
"cost": 3500,
"mass": 1.3,
"power": 0.2,
"passive": 1,
"armourpen": "F",
"thermload": 0,
"clip": 1,
"ammo": 3
}
}

View File

@@ -1,57 +1,54 @@
{
"0j": {
"group": "us",
"name": "Kill Warrant Scanner",
"class": 0,
"rating": "A",
"cost": 1097095,
"mass": 1.3,
"power": 3.2,
"range": 4,
"time": 10
},
"0k": {
"group": "us",
"name": "Kill Warrant Scanner",
"class": 0,
"rating": "B",
"cost": 365698,
"mass": 1.3,
"power": 1.6,
"range": 3.5,
"time": 10
},
"0l": {
"group": "us",
"name": "Kill Warrant Scanner",
"class": 0,
"rating": "C",
"cost": 121899,
"mass": 1.3,
"power": 0.8,
"range": 3,
"time": 10
},
"0m": {
"group": "us",
"name": "Kill Warrant Scanner",
"class": 0,
"rating": "D",
"cost": 40633,
"mass": 1.3,
"power": 0.4,
"range": 2.5,
"time": 10
},
"0n": {
"group": "us",
"name": "Kill Warrant Scanner",
"class": 0,
"rating": "E",
"cost": 13544,
"mass": 1.3,
"power": 0.2,
"range": 2,
"time": 10
"Kill Warrant Scanners": {
"0j": {
"grp": "kw",
"class": 0,
"rating": "A",
"cost": 1097095,
"mass": 1.3,
"power": 3.2,
"range": 4,
"time": 10
},
"0k": {
"grp": "kw",
"class": 0,
"rating": "B",
"cost": 365698,
"mass": 1.3,
"power": 1.6,
"range": 3.5,
"time": 10
},
"0l": {
"grp": "kw",
"class": 0,
"rating": "C",
"cost": 121899,
"mass": 1.3,
"power": 0.8,
"range": 3,
"time": 10
},
"0m": {
"grp": "kw",
"class": 0,
"rating": "D",
"cost": 40633,
"mass": 1.3,
"power": 0.4,
"range": 2.5,
"time": 10
},
"0n": {
"grp": "kw",
"class": 0,
"rating": "E",
"cost": 13544,
"mass": 1.3,
"power": 0.2,
"range": 2,
"time": 10
}
}
}

View File

@@ -1,32 +1,32 @@
{
"2j": {
"group": "so",
"name": "Mine Launcher",
"class": 1,
"rating": "I",
"cost": 24260,
"mass": 2,
"power": 0.4,
"mode": "F",
"type": "T",
"armourpen": "C",
"thermload": 2,
"clip": 1,
"ammo": 24
},
"2k": {
"group": "mo",
"name": "Mine Launcher",
"class": 2,
"rating": "I",
"cost": 294080,
"mass": 4,
"power": 0.4,
"mode": "F",
"type": "T",
"armourpen": "C",
"thermload": 3,
"clip": 3,
"ammo": 24
"Mine Launchers": {
"2j": {
"grp": "nl",
"class": 1,
"rating": "I",
"cost": 24260,
"mass": 2,
"power": 0.4,
"mode": "F",
"type": "T",
"armourpen": "C",
"thermload": 2,
"clip": 1,
"ammo": 24
},
"2k": {
"grp": "nl",
"class": 2,
"rating": "I",
"cost": 294080,
"mass": 4,
"power": 0.4,
"mode": "F",
"type": "T",
"armourpen": "C",
"thermload": 3,
"clip": 3,
"ammo": 24
}
}
}

View File

@@ -1,30 +1,32 @@
{
"2l": {
"group": "so",
"name": "Mining Laser",
"class": 1,
"rating": "D",
"cost": 6800,
"mass": 2,
"power": 0.5,
"mode": "F",
"armourpen": "D",
"thermload": 3,
"clip": 1,
"ammo": 1
},
"2m": {
"group": "mo",
"name": "Mining Laser",
"class": 2,
"rating": "D",
"cost": 22576,
"mass": 2,
"power": 0.75,
"mode": "F",
"armourpen": "D",
"thermload": 5,
"clip": 1,
"ammo": 1
"Mining Lasers": {
"2l": {
"grp": "ml",
"class": 1,
"rating": "D",
"cost": 6800,
"mass": 2,
"power": 0.5,
"mode": "F",
"armourpen": "D",
"thermload": 3,
"grp": "ml",
"clip": 1,
"ammo": 1
},
"2m": {
"grp": "ml",
"class": 2,
"rating": "D",
"cost": 22576,
"mass": 2,
"power": 0.75,
"mode": "F",
"armourpen": "D",
"thermload": 5,
"grp": "ml",
"clip": 1,
"ammo": 1
}
}
}

View File

@@ -1,78 +1,80 @@
{
"2d": {
"group": "so",
"name": "Missile Rack",
"class": 1,
"rating": "B",
"cost": 32175,
"mass": 2,
"power": 0.4,
"mode": "F",
"type": "E",
"damage": 7,
"armourpen": "F",
"rof": 2.5,
"dps": 8,
"thermload": 3,
"clip": 8,
"ammo": 16,
"missile": "D"
},
"2e": {
"group": "so",
"name": "Missile Rack",
"class": 1,
"rating": "B",
"cost": 72600,
"mass": 2,
"power": 0.6,
"mode": "F",
"type": "E",
"damage": 6,
"armourpen": "F",
"rof": 0.3,
"dps": 3,
"thermload": 3,
"clip": 6,
"ammo": 6,
"missile": "S"
},
"2f": {
"group": "mo",
"name": "Missile Rack",
"class": 2,
"rating": "B",
"cost": 240400,
"mass": 4,
"power": 1.2,
"mode": "F",
"type": "E",
"damage": 7,
"armourpen": "F",
"rof": 2.5,
"dps": 8,
"thermload": 3,
"clip": 12,
"ammo": 24,
"missile": "D"
},
"2g": {
"group": "mo",
"name": "Missile Rack",
"class": 2,
"rating": "B",
"cost": 512400,
"mass": 4,
"power": 1.2,
"mode": "F",
"type": "E",
"damage": 6,
"armourpen": "F",
"rof": 0.3,
"dps": 3,
"thermload": 3,
"clip": 6,
"ammo": 18,
"missile": "S"
"Missile Racks": {
"2d": {
"grp": "mr",
"class": 1,
"rating": "B",
"cost": 32175,
"mass": 2,
"power": 0.4,
"mode": "F",
"type": "E",
"damage": 7,
"armourpen": "F",
"rof": 2.5,
"dps": 8,
"thermload": 3,
"grp": "mr",
"clip": 8,
"ammo": 16,
"missile": "D"
},
"2e": {
"grp": "mr",
"class": 1,
"rating": "B",
"cost": 72600,
"mass": 2,
"power": 0.6,
"mode": "F",
"type": "E",
"damage": 6,
"armourpen": "F",
"rof": 0.3,
"dps": 3,
"thermload": 3,
"grp": "mr",
"clip": 6,
"ammo": 6,
"missile": "S"
},
"2f": {
"grp": "mr",
"class": 2,
"rating": "B",
"cost": 240400,
"mass": 4,
"power": 1.2,
"mode": "F",
"type": "E",
"damage": 7,
"armourpen": "F",
"rof": 2.5,
"dps": 8,
"thermload": 3,
"grp": "mr",
"clip": 12,
"ammo": 24,
"missile": "D"
},
"2g": {
"grp": "mr",
"class": 2,
"rating": "B",
"cost": 512400,
"mass": 4,
"power": 1.2,
"mode": "F",
"type": "E",
"damage": 6,
"armourpen": "F",
"rof": 0.3,
"dps": 3,
"thermload": 3,
"grp": "mr",
"clip": 6,
"ammo": 18,
"missile": "S"
}
}
}

View File

@@ -1,110 +1,112 @@
{
"23": {
"group": "sk",
"name": "Multi-cannon",
"class": 1,
"rating": "F",
"cost": 9500,
"mass": 2,
"power": 0.28,
"mode": "F",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 8,
"dps": 3,
"thermload": 1,
"clip": 90,
"ammo": 2100
},
"24": {
"group": "sk",
"name": "Multi-cannon",
"class": 1,
"rating": "G",
"cost": 14250,
"mass": 2,
"power": 0.37,
"mode": "G",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 8.5,
"dps": 3,
"thermload": 1,
"clip": 90,
"ammo": 2100
},
"25": {
"group": "sk",
"name": "Multi-cannon",
"class": 1,
"rating": "G",
"cost": 81600,
"mass": 2,
"power": 0.26,
"mode": "T",
"type": "K",
"damage": 0,
"armourpen": "A",
"rof": 6,
"dps": 2,
"thermload": 1,
"clip": 90,
"ammo": 2100
},
"26": {
"group": "mk",
"name": "Multi-cannon",
"class": 2,
"rating": "E",
"cost": 38000,
"mass": 4,
"power": 0.46,
"mode": "F",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 7,
"dps": 4,
"thermload": 1,
"clip": 90,
"ammo": 2100
},
"27": {
"group": "mk",
"name": "Multi-cannon",
"class": 2,
"rating": "F",
"cost": 57000,
"mass": 4,
"power": 0.64,
"mode": "G",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 7.5,
"dps": 4,
"thermload": 1,
"clip": 90,
"ammo": 2100
},
"28": {
"group": "mk",
"name": "Multi-cannon",
"class": 2,
"rating": "F",
"cost": 1292800,
"mass": 4,
"power": 0.5,
"mode": "T",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 5.3,
"dps": 3,
"thermload": 1,
"clip": 90,
"ammo": 2100
"Multi-cannons": {
"23": {
"grp": "mc",
"class": 1,
"rating": "F",
"cost": 9500,
"mass": 2,
"power": 0.28,
"mode": "F",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 8,
"dps": 3,
"thermload": 1,
"grp": "mc",
"clip": 90,
"ammo": 2100
},
"24": {
"grp": "mc",
"class": 1,
"rating": "G",
"cost": 14250,
"mass": 2,
"power": 0.37,
"mode": "G",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 8.5,
"dps": 3,
"thermload": 1,
"grp": "mc",
"clip": 90,
"ammo": 2100
},
"25": {
"grp": "mc",
"class": 1,
"rating": "G",
"cost": 81600,
"mass": 2,
"power": 0.26,
"mode": "T",
"type": "K",
"damage": 0,
"armourpen": "A",
"rof": 6,
"dps": 2,
"thermload": 1,
"grp": "mc",
"clip": 90,
"ammo": 2100
},
"26": {
"grp": "mc",
"class": 2,
"rating": "E",
"cost": 38000,
"mass": 4,
"power": 0.46,
"mode": "F",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 7,
"dps": 4,
"thermload": 1,
"grp": "mc",
"clip": 90,
"ammo": 2100
},
"27": {
"grp": "mc",
"class": 2,
"rating": "F",
"cost": 57000,
"mass": 4,
"power": 0.64,
"mode": "G",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 7.5,
"dps": 4,
"thermload": 1,
"grp": "mc",
"clip": 90,
"ammo": 2100
},
"28": {
"grp": "mc",
"class": 2,
"rating": "F",
"cost": 1292800,
"mass": 4,
"power": 0.5,
"mode": "T",
"type": "K",
"damage": 2,
"armourpen": "A",
"rof": 5.3,
"dps": 3,
"thermload": 1,
"grp": "mc",
"clip": 90,
"ammo": 2100
}
}
}

View File

@@ -1,56 +1,58 @@
{
"1g": {
"group": "mt",
"name": "Plasma Accelerator",
"class": 2,
"rating": "C",
"cost": 834200,
"mass": 4,
"power": 1.43,
"mode": "F",
"type": "T",
"damage": 7,
"armourpen": "A",
"rof": 0.3,
"dps": 4,
"thermload": 10,
"clip": 5,
"ammo": 100
},
"2b": {
"group": "lo",
"name": "Plasma Accelerator",
"class": 3,
"rating": "B",
"cost": 3051200,
"mass": 8,
"power": 1.97,
"mode": "F",
"type": "TK",
"damage": 9,
"armourpen": "A",
"rof": 0.3,
"dps": 4,
"thermload": 8,
"clip": 5,
"ammo": 100
},
"2c": {
"group": "ho",
"name": "Plasma Accelerator",
"class": 4,
"rating": "A",
"cost": 13793600,
"mass": 16,
"power": 2.63,
"mode": "F",
"type": "TK",
"damage": 10,
"armourpen": "A",
"rof": 0.3,
"dps": 5,
"thermload": 10,
"clip": 5,
"ammo": 100
"Plasma Accelerators": {
"1g": {
"grp": "pa",
"class": 2,
"rating": "C",
"cost": 834200,
"mass": 4,
"power": 1.43,
"mode": "F",
"type": "T",
"damage": 7,
"armourpen": "A",
"rof": 0.3,
"dps": 4,
"thermload": 10,
"grp": "pa",
"clip": 5,
"ammo": 100
},
"2b": {
"grp": "pa",
"class": 3,
"rating": "B",
"cost": 3051200,
"mass": 8,
"power": 1.97,
"mode": "F",
"type": "TK",
"damage": 9,
"armourpen": "A",
"rof": 0.3,
"dps": 4,
"thermload": 8,
"grp": "pa",
"clip": 5,
"ammo": 100
},
"2c": {
"grp": "pa",
"class": 4,
"rating": "A",
"cost": 13793600,
"mass": 16,
"power": 2.63,
"mode": "F",
"type": "TK",
"damage": 10,
"armourpen": "A",
"rof": 0.3,
"dps": 5,
"thermload": 10,
"grp": "pa",
"clip": 5,
"ammo": 100
}
}
}

View File

@@ -1,16 +0,0 @@
{
"03": {
"group": "um",
"name": "Point Defence",
"class": 0,
"rating": "I",
"cost": 18546,
"mass": 0.5,
"power": 0.2,
"passive": 1,
"armourpen": "F",
"thermload": 1,
"clip": 50,
"ammo": 10000
}
}

View File

@@ -1,146 +1,139 @@
{
"17": {
"group": "st",
"name": "Pulse Laser",
"class": 1,
"rating": "F",
"cost": 2200,
"mass": 2,
"power": 0.39,
"mode": "F",
"type": "T",
"damage": 2,
"armourpen": "A",
"rof": 3.8,
"dps": 3,
"thermload": 1
},
"18": {
"group": "st",
"name": "Pulse Laser",
"class": 1,
"rating": "F",
"cost": 6600,
"mass": 2,
"power": 0.39,
"mode": "G",
"type": "T",
"damage": 2,
"armourpen": "A",
"rof": 4,
"dps": 3,
"thermload": 1
},
"19": {
"group": "st",
"name": "Pulse Laser",
"class": 1,
"rating": "G",
"cost": 26000,
"mass": 2,
"power": 0.38,
"mode": "T",
"type": "T",
"damage": 2,
"armourpen": "A",
"rof": 2.8,
"dps": 2,
"thermload": 1
},
"1a": {
"group": "mt",
"name": "Pulse Laser",
"class": 2,
"rating": "E",
"cost": 17600,
"mass": 4,
"power": 0.6,
"mode": "F",
"type": "T",
"damage": 3,
"armourpen": "A",
"rof": 3.4,
"dps": 3,
"thermload": 1
},
"1b": {
"group": "mt",
"name": "Pulse Laser",
"class": 2,
"rating": "F",
"cost": 35400,
"mass": 4,
"power": 0.6,
"mode": "G",
"type": "T",
"damage": 3,
"armourpen": "A",
"rof": 3.6,
"dps": 3,
"thermload": 1
},
"1c": {
"group": "mt",
"name": "Pulse Laser",
"class": 2,
"rating": "F",
"cost": 132800,
"mass": 4,
"power": 0.58,
"mode": "T",
"type": "T",
"damage": 2,
"armourpen": "A",
"rof": 2.5,
"dps": 3,
"thermload": 1
},
"1d": {
"group": "lt",
"name": "Pulse Laser",
"class": 3,
"rating": "D",
"cost": 70400,
"mass": 8,
"power": 0.9,
"mode": "F",
"type": "T",
"damage": 4,
"armourpen": "A",
"rof": 3,
"dps": 4,
"thermload": 1
},
"1e": {
"group": "lt",
"name": "Pulse Laser",
"class": 3,
"rating": "E",
"cost": 140600,
"mass": 8,
"power": 0.92,
"mode": "G",
"type": "T",
"damage": 3,
"armourpen": "A",
"rof": 3.2,
"dps": 4,
"thermload": 1
},
"1f": {
"group": "lt",
"name": "Pulse Laser",
"class": 3,
"rating": "F",
"cost": 400400,
"mass": 8,
"power": 0.89,
"mode": "T",
"type": "T",
"damage": 3,
"armourpen": "A",
"rof": 2.3,
"dps": 3,
"thermload": 1
"Pulse Lasers": {
"17": {
"grp": "pl",
"class": 1,
"rating": "F",
"cost": 2200,
"mass": 2,
"power": 0.39,
"mode": "F",
"type": "T",
"damage": 2,
"armourpen": "A",
"rof": 3.8,
"dps": 3,
"thermload": 1
},
"18": {
"grp": "pl",
"class": 1,
"rating": "F",
"cost": 6600,
"mass": 2,
"power": 0.39,
"mode": "G",
"type": "T",
"damage": 2,
"armourpen": "A",
"rof": 4,
"dps": 3,
"thermload": 1
},
"19": {
"grp": "pl",
"class": 1,
"rating": "G",
"cost": 26000,
"mass": 2,
"power": 0.38,
"mode": "T",
"type": "T",
"damage": 2,
"armourpen": "A",
"rof": 2.8,
"dps": 2,
"thermload": 1
},
"1a": {
"grp": "pl",
"class": 2,
"rating": "E",
"cost": 17600,
"mass": 4,
"power": 0.6,
"mode": "F",
"type": "T",
"damage": 3,
"armourpen": "A",
"rof": 3.4,
"dps": 3,
"thermload": 1
},
"1b": {
"grp": "pl",
"class": 2,
"rating": "F",
"cost": 35400,
"mass": 4,
"power": 0.6,
"mode": "G",
"type": "T",
"damage": 3,
"armourpen": "A",
"rof": 3.6,
"dps": 3,
"thermload": 1
},
"1c": {
"grp": "pl",
"class": 2,
"rating": "F",
"cost": 132800,
"mass": 4,
"power": 0.58,
"mode": "T",
"type": "T",
"damage": 2,
"armourpen": "A",
"rof": 2.5,
"dps": 3,
"thermload": 1
},
"1d": {
"grp": "pl",
"class": 3,
"rating": "D",
"cost": 70400,
"mass": 8,
"power": 0.9,
"mode": "F",
"type": "T",
"damage": 4,
"armourpen": "A",
"rof": 3,
"dps": 4,
"thermload": 1
},
"1e": {
"grp": "pl",
"class": 3,
"rating": "E",
"cost": 140600,
"mass": 8,
"power": 0.92,
"mode": "G",
"type": "T",
"damage": 3,
"armourpen": "A",
"rof": 3.2,
"dps": 4,
"thermload": 1
},
"1f": {
"grp": "pl",
"class": 3,
"rating": "F",
"cost": 400400,
"mass": 8,
"power": 0.89,
"mode": "T",
"type": "T",
"damage": 3,
"armourpen": "A",
"rof": 2.3,
"dps": 3,
"thermload": 1
}
}
}

View File

@@ -1,38 +1,40 @@
{
"29": {
"group": "so",
"name": "Rail Gun",
"class": 1,
"rating": "D",
"cost": 51600,
"mass": 2,
"power": 1.15,
"mode": "F",
"type": "TK",
"damage": 6,
"armourpen": "A",
"rof": 0.6,
"dps": 4,
"thermload": 7,
"clip": 1,
"ammo": 30
},
"2a": {
"group": "mo",
"name": "Rail Gun",
"class": 2,
"rating": "B",
"cost": 412800,
"mass": 4,
"power": 1.63,
"mode": "F",
"type": "TK",
"damage": 7,
"armourpen": "A",
"rof": 0.5,
"dps": 4,
"thermload": 10,
"clip": 1,
"ammo": 30
"Rail Guns": {
"29": {
"grp": "rg",
"class": 1,
"rating": "D",
"cost": 51600,
"mass": 2,
"power": 1.15,
"mode": "F",
"type": "TK",
"damage": 6,
"armourpen": "A",
"rof": 0.6,
"dps": 4,
"thermload": 7,
"grp": "rg",
"clip": 1,
"ammo": 30
},
"2a": {
"grp": "rg",
"class": 2,
"rating": "B",
"cost": 412800,
"mass": 4,
"power": 1.63,
"mode": "F",
"type": "TK",
"damage": 7,
"armourpen": "A",
"rof": 0.5,
"dps": 4,
"thermload": 10,
"grp": "rg",
"clip": 1,
"ammo": 30
}
}
}

View File

@@ -1,57 +1,54 @@
{
"04": {
"group": "ub",
"name": "Shield Booster",
"class": 0,
"rating": "A",
"cost": 281000,
"mass": 3.5,
"power": 1.2,
"passive": 1,
"shieldmul": 0.2
},
"05": {
"group": "ub",
"name": "Shield Booster",
"class": 0,
"rating": "B",
"cost": 122000,
"mass": 3,
"power": 1,
"passive": 1,
"shieldmul": 0.16
},
"06": {
"group": "ub",
"name": "Shield Booster",
"class": 0,
"rating": "C",
"cost": 53000,
"mass": 2,
"power": 0.7,
"passive": 1,
"shieldmul": 0.12
},
"07": {
"group": "ub",
"name": "Shield Booster",
"class": 0,
"rating": "D",
"cost": 23000,
"mass": 1,
"power": 0.5,
"passive": 1,
"shieldmul": 0.08
},
"08": {
"group": "ub",
"name": "Shield Booster",
"class": 0,
"rating": "E",
"cost": 10000,
"mass": 0.5,
"power": 0.2,
"passive": 1,
"shieldmul": 0.04
"Shield Boosters": {
"04": {
"grp": "sb",
"class": 0,
"rating": "A",
"cost": 281000,
"mass": 3.5,
"power": 1.2,
"passive": 1,
"shieldmul": 0.2
},
"05": {
"grp": "sb",
"class": 0,
"rating": "B",
"cost": 122000,
"mass": 3,
"power": 1,
"passive": 1,
"shieldmul": 0.16
},
"06": {
"grp": "sb",
"class": 0,
"rating": "C",
"cost": 53000,
"mass": 2,
"power": 0.7,
"passive": 1,
"shieldmul": 0.12
},
"07": {
"grp": "sb",
"class": 0,
"rating": "D",
"cost": 23000,
"mass": 1,
"power": 0.5,
"passive": 1,
"shieldmul": 0.08
},
"08": {
"grp": "sb",
"class": 0,
"rating": "E",
"cost": 10000,
"mass": 0.5,
"power": 0.2,
"passive": 1,
"shieldmul": 0.04
}
}
}

View File

@@ -1,32 +1,34 @@
{
"2h": {
"group": "so",
"name": "Torpedo Pylon",
"class": 1,
"rating": "I",
"cost": 11200,
"mass": 2,
"power": 0.4,
"mode": "F",
"armourpen": "C",
"thermload": 10,
"clip": 1,
"ammo": 1,
"missile": "S"
},
"2i": {
"group": "mo",
"name": "Torpedo Pylon",
"class": 2,
"rating": "I",
"cost": 44800,
"mass": 4,
"power": 0.4,
"mode": "F",
"armourpen": "C",
"thermload": 10,
"clip": 2,
"ammo": 1,
"missile": "S"
"Torpedo Pylons": {
"2h": {
"grp": "tp",
"class": 1,
"rating": "I",
"cost": 11200,
"mass": 2,
"power": 0.4,
"mode": "F",
"armourpen": "C",
"thermload": 10,
"grp": "tp",
"clip": 1,
"ammo": 1,
"missile": "S"
},
"2i": {
"grp": "tp",
"class": 2,
"rating": "I",
"cost": 44800,
"mass": 4,
"power": 0.4,
"mode": "F",
"armourpen": "C",
"thermload": 10,
"grp": "tp",
"clip": 2,
"ammo": 1,
"missile": "S"
}
}
}

View File

@@ -1,5 +1,5 @@
{
"Auto Field-Maintenance Unit": {
"Auto Field-Maintenance Units": {
"10": {
"group": "am",
"class": 5,

View File

@@ -1,5 +1,5 @@
{
"Cargo Rack": {
"Cargo Racks": {
"00": {
"group": "cr",
"name": "Cargo Rack (Capacity: 2)",

View File

@@ -1,5 +1,5 @@
{
"Docking Computer": {
"Docking Computers": {
"24": {
"group": "dc",
"name": "Standard Docking Computer",

View File

@@ -1,5 +1,5 @@
{
"Frame Shift Drive Interdictor": {
"FSD Interdictors": {
"66": {
"group": "fi",
"class": 1,
@@ -7,7 +7,7 @@
"cost": 972000,
"mass": 1.3,
"power": 0.32,
"range": "C"
"rangeRating": "C"
},
"67": {
"group": "fi",
@@ -16,7 +16,7 @@
"cost": 324000,
"mass": 2,
"power": 0.28,
"range": "D"
"rangeRating": "D"
},
"68": {
"group": "fi",
@@ -25,7 +25,7 @@
"cost": 108000,
"mass": 1.3,
"power": 0.23,
"range": "D"
"rangeRating": "D"
},
"69": {
"group": "fi",
@@ -34,7 +34,7 @@
"cost": 36000,
"mass": 0.5,
"power": 0.18,
"range": "D"
"rangeRating": "D"
},
"6a": {
"group": "fi",
@@ -43,7 +43,7 @@
"cost": 12000,
"mass": 1.3,
"power": 0.14,
"range": "E"
"rangeRating": "E"
},
"6b": {
"group": "fi",
@@ -52,7 +52,7 @@
"cost": 2721600,
"mass": 2.5,
"power": 0.39,
"range": "B"
"rangeRating": "B"
},
"6c": {
"group": "fi",
@@ -61,7 +61,7 @@
"cost": 907200,
"mass": 4,
"power": 0.34,
"range": "C"
"rangeRating": "C"
},
"6d": {
"group": "fi",
@@ -70,7 +70,7 @@
"cost": 302400,
"mass": 2.5,
"power": 0.28,
"range": "C"
"rangeRating": "C"
},
"6e": {
"group": "fi",
@@ -79,7 +79,7 @@
"cost": 100800,
"mass": 1,
"power": 0.22,
"range": "C"
"rangeRating": "C"
},
"6f": {
"group": "fi",
@@ -88,7 +88,7 @@
"cost": 33600,
"mass": 2.5,
"power": 0.17,
"range": "D"
"rangeRating": "D"
},
"6g": {
"group": "fi",
@@ -97,7 +97,7 @@
"cost": 7620480,
"mass": 5,
"power": 0.48,
"range": "A"
"rangeRating": "A"
},
"6h": {
"group": "fi",
@@ -106,7 +106,7 @@
"cost": 2540160,
"mass": 8,
"power": 0.41,
"range": "B"
"rangeRating": "B"
},
"6i": {
"group": "fi",
@@ -115,7 +115,7 @@
"cost": 846720,
"mass": 5,
"power": 0.34,
"range": "B"
"rangeRating": "B"
},
"6j": {
"group": "fi",
@@ -124,7 +124,7 @@
"cost": 282240,
"mass": 2,
"power": 0.27,
"range": "B"
"rangeRating": "B"
},
"6k": {
"group": "fi",
@@ -133,7 +133,7 @@
"cost": 94080,
"mass": 5,
"power": 0.2,
"range": "C"
"rangeRating": "C"
},
"6l": {
"group": "fi",
@@ -142,7 +142,7 @@
"cost": 21337344,
"mass": 10,
"power": 0.57,
"range": "A"
"rangeRating": "A"
},
"6m": {
"group": "fi",
@@ -151,7 +151,7 @@
"cost": 7112448,
"mass": 16,
"power": 0.49,
"range": "A"
"rangeRating": "A"
},
"6n": {
"group": "fi",
@@ -160,7 +160,7 @@
"cost": 2370816,
"mass": 10,
"power": 0.41,
"range": "A"
"rangeRating": "A"
},
"6o": {
"group": "fi",
@@ -169,7 +169,7 @@
"cost": 790272,
"mass": 4,
"power": 0.33,
"range": "A"
"rangeRating": "A"
},
"6p": {
"group": "fi",
@@ -178,7 +178,7 @@
"cost": 263424,
"mass": 10,
"power": 0.25,
"range": "B"
"rangeRating": "B"
}
}
}

View File

@@ -1,5 +1,5 @@
{
"Hatch Breaker Limpet Controller": {
"Hatch Breaker Limpet Controllers": {
"70": {
"group": "hb",
"class": 3,

View File

@@ -1,5 +1,5 @@
{
"Hull Reinforcement Package": {
"Hull Reinforcement Packages": {
"25": {
"group": "hr",
"class": 1,

View File

@@ -1,5 +1,5 @@
{
"Refinery": {
"Refineries": {
"20": {
"group": "rf",
"class": 4,

View File

@@ -1,5 +1,5 @@
{
"Shield Cell Bank": {
"Shield Cell Banks": {
"50": {
"group": "sb",
"class": 1,

View File

@@ -1,5 +1,5 @@
{
"Shield Generator": {
"Shield Generators": {
"40": {
"group": "sg",
"class": 3,

View File

@@ -1,17 +1,20 @@
{
"adder": {
"group": "ex",
"name": "Adder",
"manufacturer": "Zorgon Peterson",
"class": 1,
"cost": 39993,
"speed": 220,
"boost": 320,
"agility": 8,
"shields": 60,
"armour": 90,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "ex",
"name": "Adder",
"manufacturer": "Zorgon Peterson",
"class": 1,
"cost": 39993,
"speed": 220,
"boost": 320,
"agility": 8,
"shields": 60,
"armour": 90,
"fuelcost": 50,
"mass": 35
},
"slots": {
"common": [
3,
3,
@@ -36,7 +39,7 @@
1
]
},
"defaultComponents": {
"defaults": {
"common": [
"3E",
"3E",
@@ -60,7 +63,6 @@
0,
"2h"
]
},
"mass": 35
}
}
}

View File

@@ -1,17 +1,20 @@
{
"anaconda": {
"group": "mp",
"name": "Anaconda",
"manufacturer": "Faulcon DeLacy",
"class": 3,
"cost": 141889932,
"speed": 180,
"boost": 240,
"agility": 2,
"shields": 350,
"armour": 525,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "mp",
"name": "Anaconda",
"manufacturer": "Faulcon DeLacy",
"class": 3,
"cost": 141889932,
"speed": 180,
"boost": 240,
"agility": 2,
"shields": 350,
"armour": 525,
"fuelcost": 50,
"mass": 400
},
"slots": {
"common": [
8,
7,
@@ -53,7 +56,7 @@
2
]
},
"defaultComponents": {
"defaults": {
"common": [
"8E",
"7E",
@@ -94,7 +97,6 @@
"2h",
"00"
]
},
"mass": 400
}
}
}

View File

@@ -1,17 +1,20 @@
{
"asp": {
"group": "ex",
"name": "Asp",
"manufacturer": "Lakon",
"class": 2,
"cost": 6135658,
"speed": 250,
"boost": 340,
"agility": 6,
"shields": 140,
"armour": 210,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "ex",
"name": "Asp",
"manufacturer": "Lakon",
"class": 2,
"cost": 6135658,
"speed": 250,
"boost": 340,
"agility": 6,
"shields": 140,
"armour": 210,
"fuelcost": 50,
"mass": 280
},
"slots": {
"common": [
5,
5,
@@ -43,7 +46,7 @@
2
]
},
"defaultComponents": {
"defaults": {
"common": [
"5E",
"5E",
@@ -74,7 +77,6 @@
"00",
"2h"
]
},
"mass": 280
}
}
}

View File

@@ -1,17 +1,20 @@
{
"cobra_mk_iii": {
"group": "mp",
"name": "Cobra Mk III",
"manufacturer": "Faulcon DeLacy",
"class": 1,
"cost": 235787,
"speed": 280,
"boost": 400,
"agility": 6,
"shields": 80,
"armour": 120,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "mp",
"name": "Cobra Mk III",
"manufacturer": "Faulcon DeLacy",
"class": 1,
"cost": 235787,
"speed": 280,
"boost": 400,
"agility": 6,
"shields": 80,
"armour": 120,
"fuelcost": 50,
"mass": 180
},
"slots": {
"common": [
4,
4,
@@ -38,7 +41,7 @@
2
]
},
"defaultComponents": {
"defaults": {
"common": [
"4E",
"4E",
@@ -64,7 +67,6 @@
0,
"2h"
]
},
"mass": 180
}
}
}

View File

@@ -1,17 +1,20 @@
{
"eagle": {
"group": "co",
"name": "Eagle",
"manufacturer": "Core Dynamics",
"class": 1,
"cost": 10446,
"speed": 240,
"boost": 350,
"agility": 10,
"shields": 60,
"armour": 40,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "co",
"name": "Eagle",
"manufacturer": "Core Dynamics",
"class": 1,
"cost": 10446,
"speed": 240,
"boost": 350,
"agility": 10,
"shields": 60,
"armour": 40,
"fuelcost": 50,
"mass": 50
},
"slots": {
"common": [
2,
3,
@@ -33,7 +36,7 @@
1
]
},
"defaultComponents": {
"defaults": {
"common": [
"2E",
"3E",
@@ -54,7 +57,6 @@
"00",
"2h"
]
},
"mass": 50
}
}
}

View File

@@ -1,17 +1,20 @@
{
"federal_dropship": {
"group": "mp",
"name": "Federal Dropship",
"manufacturer": "Core Dynamics",
"class": 2,
"cost": 18969990,
"speed": 180,
"boost": 300,
"agility": 0,
"shields": 200,
"armour": 300,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "mp",
"name": "Federal Dropship",
"manufacturer": "Core Dynamics",
"class": 2,
"cost": 18969990,
"speed": 180,
"boost": 300,
"agility": 0,
"shields": 200,
"armour": 300,
"fuelcost": 50,
"mass": 580
},
"slots": {
"common": [
6,
6,
@@ -42,7 +45,7 @@
2
]
},
"defaultComponents": {
"defaults": {
"common": [
"6E",
"6E",
@@ -72,7 +75,6 @@
0,
"2h"
]
},
"mass": 580
}
}
}

View File

@@ -1,17 +1,20 @@
{
"fer_de_lance": {
"group": "co",
"name": "Fer-de-Lance",
"manufacturer": "Zorgon Peterson",
"class": 2,
"cost": 51232230,
"speed": 260,
"boost": 350,
"agility": 6,
"shields": 300,
"armour": 225,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "co",
"name": "Fer-de-Lance",
"manufacturer": "Zorgon Peterson",
"class": 2,
"cost": 51232230,
"speed": 260,
"boost": 350,
"agility": 6,
"shields": 300,
"armour": 225,
"fuelcost": 50,
"mass": 250
},
"slots": {
"common": [
5,
5,
@@ -42,7 +45,7 @@
1
]
},
"defaultComponents": {
"defaults": {
"common": [
"5E",
"5E",
@@ -72,7 +75,6 @@
0,
"2h"
]
},
"mass": 250
}
}
}

View File

@@ -1,17 +1,20 @@
{
"hauler": {
"group": "fr",
"name": "Hauler",
"manufacturer": "Zorgon Peterson",
"class": 1,
"cost": 29807,
"speed": 200,
"boost": 300,
"agility": 6,
"shields": 50,
"armour": 50,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "fr",
"name": "Hauler",
"manufacturer": "Zorgon Peterson",
"class": 1,
"cost": 29807,
"speed": 200,
"boost": 300,
"agility": 6,
"shields": 50,
"armour": 50,
"fuelcost": 50,
"mass": 14
},
"slots": {
"common": [
2,
2,
@@ -33,7 +36,7 @@
1
]
},
"defaultComponents": {
"defaults": {
"common": [
"2E",
"2E",
@@ -54,7 +57,6 @@
"3v",
"2h"
]
},
"mass": 14
}
}
}

View File

@@ -1,17 +1,20 @@
{
"imperial_clipper": {
"group": "mp",
"name": "Imperial Clipper",
"manufacturer": "Gutamaya",
"class": 3,
"cost": 21077784,
"speed": 300,
"boost": 380,
"agility": 2,
"shields": 180,
"armour": 270,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "mp",
"name": "Imperial Clipper",
"manufacturer": "Gutamaya",
"class": 3,
"cost": 21077784,
"speed": 300,
"boost": 380,
"agility": 2,
"shields": 180,
"armour": 270,
"fuelcost": 50,
"mass": 400
},
"slots": {
"common": [
6,
6,
@@ -42,7 +45,7 @@
2
]
},
"defaultComponents": {
"defaults": {
"common": [
"6E",
"6E",
@@ -72,7 +75,6 @@
"00",
"2h"
]
},
"mass": 400
}
}
}

View File

@@ -1,17 +1,20 @@
{
"orca": {
"group": "pa",
"name": "Orca",
"manufacturer": "Saud Kruger",
"class": 3,
"cost": 47798079,
"speed": 300,
"boost": 380,
"agility": 2,
"shields": 220,
"armour": 220,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "pa",
"name": "Orca",
"manufacturer": "Saud Kruger",
"class": 3,
"cost": 47798079,
"speed": 300,
"boost": 380,
"agility": 2,
"shields": 220,
"armour": 220,
"fuelcost": 50,
"mass": 580
},
"slots": {
"common": [
5,
6,
@@ -41,7 +44,7 @@
2
]
},
"defaultComponents": {
"defaults": {
"common": [
"5E",
"6E",
@@ -70,7 +73,6 @@
0,
"2h"
]
},
"mass": 580
}
}
}

View File

@@ -1,17 +1,20 @@
{
"python": {
"group": "mp",
"name": "Python",
"manufacturer": "Faulcon DeLacy",
"class": 2,
"cost": 55171395,
"speed": 230,
"boost": 280,
"agility": 6,
"shields": 260,
"armour": 260,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "mp",
"name": "Python",
"manufacturer": "Faulcon DeLacy",
"class": 2,
"cost": 55171395,
"speed": 230,
"boost": 280,
"agility": 6,
"shields": 260,
"armour": 260,
"fuelcost": 50,
"mass": 350
},
"slots": {
"common": [
7,
6,
@@ -44,7 +47,7 @@
2
]
},
"defaultComponents": {
"defaults": {
"common": [
"7E",
"6E",
@@ -76,7 +79,6 @@
"00",
"2h"
]
},
"mass": 350
}
}
}

View File

@@ -1,17 +1,20 @@
{
"sidewinder": {
"group": "mp",
"name": "Sidewinder",
"manufacturer": "Faulcon DeLacy",
"class": 1,
"cost": 12887,
"speed": 220,
"boost": 320,
"agility": 8,
"shields": 40,
"armour": 60,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "mp",
"name": "Sidewinder",
"manufacturer": "Faulcon DeLacy",
"class": 1,
"cost": 12887,
"speed": 220,
"boost": 320,
"agility": 8,
"shields": 40,
"armour": 60,
"fuelcost": 50,
"mass": 25
},
"slots": {
"common": [
2,
2,
@@ -33,7 +36,7 @@
1
]
},
"defaultComponents": {
"defaults": {
"common": [
"2E",
"2E",
@@ -54,7 +57,6 @@
"01",
"2h"
]
},
"mass": 25
}
}
}

View File

@@ -1,17 +1,20 @@
{
"type_6_transporter": {
"group": "fr",
"name": "Type-6 Transporter",
"manufacturer": "Lakon",
"class": 2,
"cost": 865782,
"speed": 220,
"boost": 350,
"agility": 3,
"shields": 90,
"armour": 90,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "fr",
"name": "Type-6 Transporter",
"manufacturer": "Lakon",
"class": 2,
"cost": 865782,
"speed": 220,
"boost": 350,
"agility": 3,
"shields": 90,
"armour": 90,
"fuelcost": 50,
"mass": 155
},
"slots": {
"common": [
3,
4,
@@ -38,7 +41,7 @@
2
]
},
"defaultComponents": {
"defaults": {
"common": [
"3E",
"4E",
@@ -64,7 +67,6 @@
"00",
"2h"
]
},
"mass": 155
}
}
}

View File

@@ -1,17 +1,20 @@
{
"type_7_transport": {
"group": "fr",
"name": "Type-7 Transport",
"manufacturer": "Lakon",
"class": 3,
"cost": 16881511,
"speed": 180,
"boost": 300,
"agility": 2,
"shields": 120,
"armour": 120,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "fr",
"name": "Type-7 Transport",
"manufacturer": "Lakon",
"class": 3,
"cost": 16881511,
"speed": 180,
"boost": 300,
"agility": 2,
"shields": 120,
"armour": 120,
"fuelcost": 50,
"mass": 420
},
"slots": {
"common": [
4,
5,
@@ -42,7 +45,7 @@
2
]
},
"defaultComponents": {
"defaults": {
"common": [
"4E",
"5E",
@@ -72,7 +75,6 @@
0,
"2h"
]
},
"mass": 420
}
}
}

View File

@@ -1,17 +1,20 @@
{
"type_9_heavy": {
"group": "fr",
"name": "Type-9 Heavy",
"manufacturer": "Lakon",
"class": 3,
"cost": 73255168,
"speed": 130,
"boost": 200,
"agility": 0,
"shields": 240,
"armour": 240,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "fr",
"name": "Type-9 Heavy",
"manufacturer": "Lakon",
"class": 3,
"cost": 73255168,
"speed": 130,
"boost": 200,
"agility": 0,
"shields": 240,
"armour": 240,
"fuelcost": 50,
"mass": 1000
},
"slots": {
"common": [
6,
7,
@@ -44,7 +47,7 @@
2
]
},
"defaultComponents": {
"defaults": {
"common": [
"6E",
"7E",
@@ -76,7 +79,6 @@
0,
"2h"
]
},
"mass": 1000
}
}
}

View File

@@ -1,17 +1,20 @@
{
"viper": {
"group": "co",
"name": "Viper",
"manufacturer": "Faulcon DeLacy",
"class": 1,
"cost": 95893,
"speed": 320,
"boost": 400,
"agility": 6,
"shields": 105,
"armour": 70,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "co",
"name": "Viper",
"manufacturer": "Faulcon DeLacy",
"class": 1,
"cost": 95893,
"speed": 320,
"boost": 400,
"agility": 6,
"shields": 105,
"armour": 70,
"fuelcost": 50,
"mass": 60
},
"slots": {
"common": [
3,
3,
@@ -36,7 +39,7 @@
1
]
},
"defaultComponents": {
"defaults": {
"common": [
"3E",
"3E",
@@ -60,7 +63,6 @@
0,
"2h"
]
},
"mass": 60
}
}
}

View File

@@ -1,17 +1,20 @@
{
"vulture": {
"group": "co",
"name": "Vulture",
"manufacturer": "Core Dynamics",
"class": 1,
"cost": 4689629,
"speed": 210,
"boost": 340,
"agility": 9,
"shields": 240,
"armour": 160,
"fuelcost": 50,
"slotCap": {
"properties": {
"group": "co",
"name": "Vulture",
"manufacturer": "Core Dynamics",
"class": 1,
"cost": 4689629,
"speed": 210,
"boost": 340,
"agility": 9,
"shields": 240,
"armour": 160,
"fuelcost": 50,
"mass": 230
},
"slots": {
"common": [
4,
5,
@@ -37,7 +40,7 @@
1
]
},
"defaultComponents": {
"defaults": {
"common": [
"4E",
"5E",
@@ -62,7 +65,6 @@
0,
"2h"
]
},
"mass": 230
}
}
}