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 About
License
Development Development
@@ -9,9 +9,21 @@ Development
#Ship and Component Database #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. 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> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<base href="/"> <base href="/">
<title>Coriolis Shipyard</title> <title ng-bind="title">Coriolis</title>
<link rel="stylesheet" href="app.css"> <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="76x76" href="images/logo/apple-touch-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="images/logo/apple-touch-icon-114x114.png"> <link rel="apple-touch-icon" sizes="114x114" href="images/logo/apple-touch-icon-114x114.png">
@@ -24,7 +24,7 @@
<body> <body>
<div id="bg"></div> <div id="bg"></div>
<shipyard-menu></shipyard-menu> <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> <footer>
<div class="right">Version <%= version %> - <%= date %></div> <div class="right">Version <%= version %> - <%= date %></div>

View File

@@ -1,25 +1,45 @@
angular.module('app', ['ngRoute', 'shipyard', 'ngLodash', 'n3-line-chart', 'app.templates']) angular.module('app', ['ui.router', 'shipyard', 'ngLodash', 'app.templates'])
.config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) { .config(['$stateProvider', '$urlRouterProvider', '$locationProvider', function($stateProvider, $urlRouterProvider, $locationProvider) {
$locationProvider.html5Mode(true); $locationProvider.html5Mode(true);
$routeProvider $stateProvider
.when('/:ship', { templateUrl: 'views/ship.html', controller: 'ShipController' }) .state('outfit', {
.when('/:ship/:code', { templateUrl: 'views/ship.html', controller: 'ShipController' }) url: '/outfit/:shipId/:code?bn',
.when('/', { templateUrl: 'views/ships.html', controller: 'ShipyardController' }); 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) { .config(['$provide',function($provide) {
// Allow URL changes without reloading controllers/view // Global Error Handler, redirects uncaught errors to the error page
var original = $loc.path; $provide.decorator('$exceptionHandler', ['$delegate', '$injector', function ($delegate, $injector) {
$loc.path = function (path, reload) { return function(exception, cause) {
if (reload === false) { $injector.get('$state').go('error', { details: exception }, {location:false, reload:true}); // Go to error state, reload the controller, keep the current URL
var lastRoute = $route.current; $delegate(exception, cause);
var un = $rootScope.$on('$locationChangeSuccess', function () { };
$route.current = lastRoute; }]);
un(); }])
}); .run(['$rootScope','$document','$state','commonArray','shipPurpose','shipSize','hardPointClass','internalGroupMap','hardpointsGroupMap', function ($rootScope, $doc, $state, CArr, shipPurpose, sz, hpc, igMap, hgMap) {
}
return original.apply($loc, [path]); // 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 // Global Reference variables
$rootScope.CArr = CArr; $rootScope.CArr = CArr;
@@ -27,7 +47,9 @@ angular.module('app', ['ngRoute', 'shipyard', 'ngLodash', 'n3-line-chart', 'app.
$rootScope.SZ = sz; $rootScope.SZ = sz;
$rootScope.HPC = hpc; $rootScope.HPC = hpc;
$rootScope.igMap = igMap; $rootScope.igMap = igMap;
window.hgmap = $rootScope.hgMap = hgMap;
$rootScope.ships = DB.ships; $rootScope.ships = DB.ships;
$rootScope.title = 'Coriolis';
// Formatters // Formatters
$rootScope.fCrd = d3.format(',.0f'); $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') 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 { return {
restrict: 'A', restrict: 'A',
scope:{ scope:{
opts: '=', // Component Options object opts: '=', // Component Options object
slot: '=', // Slot Object
selectComponent: '&sc' // Select Component function
}, },
templateUrl: 'views/component_select.html', link: function(scope, element) {
link: function (scope) { var list = [], o, id;
scope.use = function(id, component) { var opts = scope.opts;
scope.selectComponent({s: scope.slot, id: id, c: component}); //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 { return {
restrict: 'A', 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 { return {
restrict: 'A', restrict: 'A',
scope:{ scope:{
hp: '=', hp: '=',
size: '=', size: '=',
opts: '=' lbl: '=',
}, },
templateUrl: 'views/hardpoint.html', templateUrl: 'views/slot-hardpoint.html',
link: function (scope) { link: function (scope) {
scope.$r = $r; 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 { return {
restrict: 'A', restrict: 'A',
scope:{ scope:{
c: '=', c: '=slot',
lbl: '=', lbl: '=',
opts: '=' opts: '='
}, },
templateUrl: 'views/slot.html', templateUrl: 'views/slot-internal.html',
link: function(scope) { link: function(scope) {
scope.$r = $r; 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 (_) { angular.module('shipyard').factory('ComponentSet', ['lodash', function (_) {
var C = DB.components;
function ComponentSet(shipId) { function ComponentSet(components, mass, maxCommonArr, maxInternal, maxHardPoint) {
var ship = DB.ships[shipId]; this.mass = mass;
var maxInternal = ship.slotCap.internal[0];
this.mass = ship.mass;
this.common = {}; this.common = {};
this.internal = {}; this.internal = {};
this.hardpoints = filter(C.hardpoints, ship.slotCap.hardpoints[0], 0, ship.mass); this.hardpoints = {};
this.bulkheads = C.bulkheads[shipId];
this.hpClass = {}; this.hpClass = {};
this.intClass = {}; this.intClass = {};
for (var i = 0; i < C.common.length; i ++) { for (var i = 0; i < components.common.length; i ++) {
var max = ship.slotCap.common[i]; var max = maxCommonArr[i];
switch (i) { switch (i) {
// Slots where component class must be equal to slot class // Slots where component class must be equal to slot class
case 3: // Life Support case 3: // Life Support
case 5: // Sensors 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; break;
// Other slots can have a component of class lower than the slot class // Other slots can have a component of class lower than the slot class
default: 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) { for(var h in components.hardpoints) {
this.internal[g] = filter(C.internal[g], maxInternal, 0, ship.mass); 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) { ComponentSet.prototype.getHps = function(c) {
if(!this.hpClass[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]; return this.hpClass[c];
}; };
@@ -44,7 +49,7 @@ angular.module('shipyard').factory('components', ['lodash', function (_) {
var o = this.intClass[c] = {}; var o = this.intClass[c] = {};
for(var key in this.internal) { for(var key in this.internal) {
var data = filter(this.internal[key], c, 0, this.mass); 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; o[key] = data;
} }
} }
@@ -62,16 +67,6 @@ angular.module('shipyard').factory('components', ['lodash', function (_) {
return set; return set;
} }
return { return ComponentSet;
forShip: function (shipId) {
return new ComponentSet(shipId);
},
findInternal: function(id) {
var c = _.find(C.internal, function(o) {
return o[id];
})
return c[id];
}
};
}]); }]);

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. * Ship model used to track all ship components and properties.
* *
* @param {string} id Unique ship Id / Key * @param {string} id Unique ship Id / Key
* @param {object} shipData Data/defaults from the Ship database. * @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.id = id;
this.defaults = shipData.defaultComponents;
this.incCost = true; this.incCost = true;
this.cargoScoop = { enabled: true, c: { name: 'Cargo Scoop', class: 1, rating: 'H', power: 0.6} }; this.cargoScoop = { enabled: true, c: Components.cargoScoop() };
this.sgSI = null; // Shield Generator Slot Index this.bulkheads = { incCost: true, maxClass: 8 };
this.sgSI = null; // Shield Generator Index
// Copy all base properties from shipData for (p in properties) { this[p] = properties[p]; } // Copy all base properties from shipData
angular.forEach(shipData,function(o,k){
if(typeof o != 'object') {
this[k] = o;
}
}.bind(this));
angular.forEach(shipData.slotCap, function (slots, slotGroup) { // Initialize all slots for (groupName in slots) { // Initialize all slots
this[slotGroup] = []; // Initialize Slot group (Common, Hardpoints, Internal) var slotGroup = slots[groupName];
for(var i = 0; i < slots.length; i++){ var group = this[groupName] = []; // Initialize Slot group (Common, Hardpoints, Internal)
this[slotGroup].push({id: null, c: null, enabled: true, incCost: true, maxClass: slots[i]}); 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. * Builds/Updates the ship instance with the components[comps] passed in.
* @param {object} comps Collection of components used to build the ship * @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 internal = this.internal;
var common = this.common; var common = this.common;
var hps = this.hardpoints; var hps = this.hardpoints;
var availCommon = DB.components.common;
var availHardPoints = DB.components.hardpoints;
var availInternal = DB.components.internal;
var i,l; 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++) { for(i = 0, l = comps.common.length; i < l; i++) {
common[i].id = comps.common[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++) { 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].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++) { 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].id = comps.internal[i];
internal[i].c = Components.findInternal(comps.internal[i]); internal[i].c = Components.internal(comps.internal[i]);
if(internal[i].c.group == 'sg') { if (internal[i].c.group == 'sg') {
this.sgSI = i; 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 { } 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.updateTotals();
this.buildWith(comps);
}; };
/** /**
@@ -171,7 +93,6 @@ angular.module('shipyard').factory('ShipFactory', ['components', 'CalcShieldStre
// TODO: shield recharge rate // TODO: shield recharge rate
// TODO: armor bonus / damage reduction for bulkheads // TODO: armor bonus / damage reduction for bulkheads
// TODO: thermal load and weapon recharge rate // TODO: thermal load and weapon recharge rate
this.code = this.toCode();
}; };
/** /**
@@ -195,6 +116,10 @@ angular.module('shipyard').factory('ShipFactory', ['components', 'CalcShieldStre
return sum; return sum;
} }
function findInternal(slots, group) {
}
Ship.prototype.useBulkhead = function(index) { Ship.prototype.useBulkhead = function(index) {
this.bulkheads.id = index; this.bulkheads.id = index;
this.bulkheads.c = DB.components.bulkheads[this.id][index]; this.bulkheads.c = DB.components.bulkheads[this.id][index];
@@ -238,21 +163,5 @@ angular.module('shipyard').factory('ShipFactory', ['components', 'CalcShieldStre
} }
}; };
/** return Ship;
* 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;
};
}]); }]);

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', []) angular.module('shipyard', [])
.value('commonArray', [ .value('commonArray', [
'Power Plant', 'Power Plant',
@@ -13,14 +19,33 @@ angular.module('shipyard', [])
sc:'Scanners', sc:'Scanners',
am:'Auto Field-Maintenance Unit', am:'Auto Field-Maintenance Unit',
cr:'Cargo Racks', cr:'Cargo Racks',
fi:'Frame Shift Drive Interdictor', fi:'FSD Interdictor',
hb:'Hatch Breaker Limpet Controller', hb:'Hatch Breaker Limpet Ctrl',
hr:'Hull Reinforcement Package', hr:'Hull Reinforcement Package',
rf:'Refinery', rf:'Refinery',
sb:'Shield Cell Bank', sb:'Shield Cell Bank',
sg:'Shield Generator', sg:'Shield Generator',
dc:'Docking Computer' 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', { .value('shipPurpose', {
mp: 'Multi Purpose', mp: 'Multi Purpose',
fr: 'Freighter', fr: 'Freighter',
@@ -35,13 +60,6 @@ angular.module('shipyard', [])
'Large', 'Large',
'Capital', 'Capital',
]) ])
.factory('commonMap', ['commonArray', function (commonArray) {
var commonMap = {};
for(var i = 0; i < commonArray.length; i++) {
commonMap[commonArray[i]] = i;
}
return commonMap;
}])
.value('hardPointClass', [ .value('hardPointClass', [
'Utility', 'Utility',
'Small', 'Small',
@@ -49,53 +67,7 @@ angular.module('shipyard', [])
'Large', 'Large',
'Huge' 'Huge'
]) ])
.factory('hardpointGroup', function () { .factory('calcJumpRange', 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() {
/** /**
* Calculate the maximum single jump range based on mass and a specific FSD * 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 * @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; 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. * 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 {number} Approximate shield strengh in MJ
*/ */
return function (mass, shields, sg, multiplier) { return function (mass, shields, sg, multiplier) {
if (!sg) {
return 0;
}
if (mass <= sg.minmass) { if (mass <= sg.minmass) {
return shields * multiplier * sg.minmul; 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 'list';
@import 'slot'; @import 'slot';
@import 'ship'; @import 'ship';
@import 'select';
@import 'charts'; @import 'charts';
@import 'meters'; @import 'meters';
@@ -32,10 +33,10 @@ body {
height: 100%; height: 100%;
z-index: -1; z-index: -1;
opacity: 0.3; opacity: 0.3;
//background-image: url(images/docking-bay.jpg); background-image: url(images/docking-bay.jpg);
//background-repeat: no-repeat; background-repeat: no-repeat;
//background-position: center; background-position: center;
//background-size: cover; background-size: cover;
} }
#main { #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> <header>
<div class="left"> <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>
<div class="right"> <div class="right">
<a class="logo github" href="https://github.com/cmmcleod/ed-shipyard" target="_blank" title="Shipyard Github Project"></a> <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 reddit" href="#" 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>
</div> </div>
</header> </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"> <div id="hardpoints" class="slot-group">
<h1>HardPoints</h1> <h1>HardPoints</h1>
<div class="slot" ng-repeat="h in ship.hardpoints" ng-click="selectSlot($event, h)" ng-class="{selected: selectedSlot==h}"> <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 slot-hardpoint class="details" hp="h" size="HPC[h.maxClass]" lbl="hgMap[h.c.grp]"></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 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>
</div> </div>
@@ -16,17 +22,17 @@
<div class="cl l">{{ship.bulkheads.c.name}}</div> <div class="cl l">{{ship.bulkheads.c.name}}</div>
<div class="r cr">{{ship.bulkheads.c.mass}} T</div> <div class="r cr">{{ship.bulkheads.c.mass}} T</div>
</div> </div>
<div class="select" ng-show="selectedSlot==ship.bulkheads" ng-click="$event.stopPropagation()"><ul> <div class="select" ng-if="selectedSlot==ship.bulkheads" ng-click="select('b',ship.bulkheads,$event)"><ul>
<li class="lc" ng-click="ship.useBulkhead(0);hideMenus();">Lightweight Alloy</li> <li class="lc" id="0">Lightweight Alloy</li>
<li class="lc" ng-click="ship.useBulkhead(1);hideMenus();">Reinforced Alloy</li> <li class="lc" id="1">Reinforced Alloy</li>
<li class="lc" ng-click="ship.useBulkhead(2);hideMenus();">Military Grade Composite</li> <li class="lc" id="2">Military Grade Composite</li>
<li class="lc" ng-click="ship.useBulkhead(3);hideMenus();">Mirrored Surface Composite</li> <li class="lc" id="3">Mirrored Surface Composite</li>
<li class="lc" ng-click="ship.useBulkhead(4);hideMenus();">Reactive Surface Composite</li> <li class="lc" id="4">Reactive Surface Composite</li>
</ul></div> </ul></div>
</div> </div>
<div class="slot" ng-click="selectSlot($event, pp)" ng-class="{selected: selectedSlot==pp}"> <div class="slot" ng-click="selectSlot($event, pp)" ng-class="{selected: selectedSlot==pp}">
<div class="details"> <div class="details">
<div class="sz">{{pp.maxClass}}</div> <div class="sz">{{::pp.maxClass}}</div>
<div class="l">Power Plant</div> <div class="l">Power Plant</div>
<div class="r">{{pp.id}}</div> <div class="r">{{pp.id}}</div>
<div class="cb"></div> <div class="cb"></div>
@@ -34,11 +40,11 @@
<div class="l">Power: {{pp.c.pGen}} MW</div> <div class="l">Power: {{pp.c.pGen}} MW</div>
<div class="r">{{pp.c.mass}} T</div> <div class="r">{{pp.c.mass}} T</div>
</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>
<div class="slot" ng-click="selectSlot($event, th)" ng-class="{selected: selectedSlot==th}"> <div class="slot" ng-click="selectSlot($event, th)" ng-class="{selected: selectedSlot==th}">
<div class="details"> <div class="details">
<div class="sz">{{th.maxClass}}</div> <div class="sz">{{::th.maxClass}}</div>
<div class="l">Thrusters</div> <div class="l">Thrusters</div>
<div class="r">{{th.id}}</div> <div class="r">{{th.id}}</div>
<div class="cb"></div> <div class="cb"></div>
@@ -46,11 +52,11 @@
<div class="l">Max: {{th.c.optmass}} T</div> <div class="l">Max: {{th.c.optmass}} T</div>
<div class="r">{{th.c.mass}} T</div> <div class="r">{{th.c.mass}} T</div>
</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>
<div class="slot" ng-click="selectSlot($event, fsd)" ng-class="{selected: selectedSlot==fsd}"> <div class="slot" ng-click="selectSlot($event, fsd)" ng-class="{selected: selectedSlot==fsd}">
<div class="details"> <div class="details">
<div class="sz">{{fsd.maxClass}}</div> <div class="sz">{{::fsd.maxClass}}</div>
<div class="l">Frame Shift Drive</div> <div class="l">Frame Shift Drive</div>
<div class="r">{{fsd.id}}</div> <div class="r">{{fsd.id}}</div>
<div class="cb"></div> <div class="cb"></div>
@@ -58,66 +64,75 @@
<div class="l">Max Fuel: {{fsd.c.maxfuel}} T</div> <div class="l">Max Fuel: {{fsd.c.maxfuel}} T</div>
<div class="r cr">{{fsd.c.mass}} T</div> <div class="r cr">{{fsd.c.mass}} T</div>
</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>
<div class="slot" ng-click="selectSlot($event, ls)" ng-class="{selected: selectedSlot==ls}"> <div class="slot" ng-click="selectSlot($event, ls)" ng-class="{selected: selectedSlot==ls}">
<div class="details"> <div class="details">
<div class="sz">{{ls.maxClass}}</div> <div class="sz">{{::ls.maxClass}}</div>
<div class="l">Life Support</div> <div class="l">Life Support</div>
<div class="r">{{ls.id}}</div> <div class="r">{{ls.id}}</div>
<div class="cb"></div> <div class="cb"></div>
<div class="l">Time: {{fTime(ls.c.time)}}</div> <div class="l">Time: {{fTime(ls.c.time)}}</div>
<div class="r cr">{{ls.c.mass}} T</div> <div class="r cr">{{ls.c.mass}} T</div>
</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>
<div class="slot" ng-click="selectSlot($event, pd)" ng-class="{selected: selectedSlot==pd}"> <div class="slot" ng-click="selectSlot($event, pd)" ng-class="{selected: selectedSlot==pd}">
<div class="details"> <div class="details">
<div class="sz">{{pd.maxClass}}</div> <div class="sz">{{::pd.maxClass}}</div>
<div class="l">Power Distributor</div> <div class="l">Power Distributor</div>
<div class="r">{{pd.id}}</div> <div class="r">{{pd.id}}</div>
<div class="cb"></div> <div class="cb"></div>
<!-- TODO: add power distributor stuff /--> <!-- TODO: add power distributor stuff /-->
<div class="r cr">{{pd.c.mass}} T</div> <div class="r cr">{{pd.c.mass}} T</div>
</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>
<div class="slot" ng-click="selectSlot($event, ss)" ng-class="{selected: selectedSlot==ss}"> <div class="slot" ng-click="selectSlot($event, ss)" ng-class="{selected: selectedSlot==ss}">
<div class="details"> <div class="details">
<div class="sz">{{ss.maxClass}}</div> <div class="sz">{{::ss.maxClass}}</div>
<div class="l">Sensors</div> <div class="l">Sensors</div>
<div class="r">{{ss.id}}</div> <div class="r">{{ss.id}}</div>
<div class="cb"></div> <div class="cb"></div>
<div class="l">{{ss.c.range}} KM</div> <div class="l">{{ss.c.range}} KM</div>
<div class="r cr">{{ss.c.mass}} T</div> <div class="r cr">{{ss.c.mass}} T</div>
</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>
<div class="slot" ng-click="selectSlot($event, ft)" ng-class="{selected: selectedSlot==ft}"> <div class="slot" ng-click="selectSlot($event, ft)" ng-class="{selected: selectedSlot==ft}">
<div class="details" lbl="CArr[0]"> <div class="details">
<div class="sz">{{ft.maxClass}}</div> <div class="sz">{{::ft.maxClass}}</div>
<div class="l">Fuel Tank</div> <div class="l">Fuel Tank</div>
<div class="r">{{ft.id}}</div> <div class="r">{{ft.id}}</div>
<div class="r cr">{{ft.c.capacity}} T</div> <div class="r cr">{{ft.c.capacity}} T</div>
</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> </div>
<div id="internal" class="slot-group"> <div id="internal" class="slot-group">
<h1>Internal Compartments</h1> <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="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 slot-internal class="details" slot="i" lbl="igMap[i.c.group]"></div>
<div class="select" ng-show="selectedSlot==i" ng-click="$event.stopPropagation()"> <div class="select" ng-if="selectedSlot==i" ng-click="select('i',i,$event)">
<div class="empty-c" ng-click="selectComponent(i, null,null)">EMPTY</div> <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 ng-repeat="(grp, data) in availCS.getInts(i.maxClass)">
<div class="select-group">{{grp}}</div> <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> </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 id="summary">
<div class="list"> <div class="list">
<div class="header">Maneuverability</div> <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 class="empty" ng-if="!hp.c">EMPTY</div>
<div ng-if="hp.c"> <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">
<div class="cb" ng-if="hp.c.damage" > <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> <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 class="empty" ng-if="!c.c">EMPTY</div>
<div ng-if="c.c"> <div ng-if="c.c">
<div class="l">{{c.c.name || lbl}}</div> <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.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.bins">{{c.c.bins}} Bins</div>
<div class="l" ng-if="c.c.range">{{c.c.range}} KM</div> <div class="l" ng-if="c.c.range">{{c.c.range}} KM</div>
<div class="r cr">{{c.c.mass || '0'}} T</div> <div class="l" ng-if="c.c.armouradd">+{{c.c.armouradd}} Armour</div>
<!-- Armour add /--> <div class="r cr">{{c.c.mass || c.c.capacity || '0'}} T</div>
<!-- Capacity add /-->
<!-- Rate add /--> <!-- Rate add /-->
</div> </div>

View File

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

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": { "6A": {
"class": 6, "class": 6,
"rating": "A", "rating": "A",
@@ -64,214 +273,5 @@
"maxfuel": 5, "maxfuel": 5,
"fuelmul": 0.012, "fuelmul": 0.012,
"fuelpower": 2.45 "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": { "1C": {
"class": 6, "class": 1,
"rating": "C", "rating": "C",
"cost": 341577, "cost": 1000,
"capacity": 64 "capacity": 2
},
"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
}, },
"2C": { "2C": {
"class": 2, "class": 2,
@@ -29,11 +11,28 @@
"cost": 3750, "cost": 3750,
"capacity": 4 "capacity": 4
}, },
"1C": { "3C": {
"class": 1, "class": 3,
"rating": "C", "rating": "C",
"cost": 1000, "cost": 7063,
"capacity": 2 "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": { "2A": {
"class": 8, "class": 2,
"rating": "A", "rating": "A",
"cost": 162586486, "cost": 160224,
"mass": 80, "mass": 1.3,
"pGen": 36, "pGen": 9.6,
"eff": "B" "eff": "B"
}, },
"8B": { "2B": {
"class": 8, "class": 2,
"rating": "B", "rating": "B",
"cost": 54195495, "cost": 53408,
"mass": 128, "mass": 2,
"pGen": 33, "pGen": 8.8,
"eff": "C" "eff": "C"
}, },
"8C": { "2C": {
"class": 8, "class": 2,
"rating": "C", "rating": "C",
"cost": 18065165, "cost": 17803,
"mass": 80, "mass": 1.3,
"pGen": 30, "pGen": 8,
"eff": "C" "eff": "C"
}, },
"8D": { "2D": {
"class": 8, "class": 2,
"rating": "D", "rating": "D",
"cost": 6021722, "cost": 5934,
"mass": 64, "mass": 1,
"pGen": 27, "pGen": 7.2,
"eff": "D" "eff": "D"
}, },
"8E": { "2E": {
"class": 8, "class": 2,
"rating": "E", "rating": "E",
"cost": 2007241, "cost": 1978,
"mass": 160, "mass": 2.5,
"pGen": 24, "pGen": 6.4,
"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,
"eff": "F" "eff": "F"
}, },
"3A": { "3A": {
@@ -239,44 +79,204 @@
"pGen": 8, "pGen": 8,
"eff": "F" "eff": "F"
}, },
"2A": { "4A": {
"class": 2, "class": 4,
"rating": "A", "rating": "A",
"cost": 160224, "cost": 1610080,
"mass": 1.3, "mass": 5,
"pGen": 9.6, "pGen": 15.6,
"eff": "B" "eff": "B"
}, },
"2B": { "4B": {
"class": 2, "class": 4,
"rating": "B", "rating": "B",
"cost": 53408, "cost": 536693,
"mass": 2, "mass": 8,
"pGen": 8.8, "pGen": 14.3,
"eff": "C" "eff": "C"
}, },
"2C": { "4C": {
"class": 2, "class": 4,
"rating": "C", "rating": "C",
"cost": 17803, "cost": 178898,
"mass": 1.3, "mass": 5,
"pGen": 8, "pGen": 13,
"eff": "C" "eff": "C"
}, },
"2D": { "4D": {
"class": 2, "class": 4,
"rating": "D", "rating": "D",
"cost": 5934, "cost": 59633,
"mass": 1, "mass": 4,
"pGen": 7.2, "pGen": 11.7,
"eff": "D" "eff": "D"
}, },
"2E": { "4E": {
"class": 2, "class": 4,
"rating": "E", "rating": "E",
"cost": 1978, "cost": 19878,
"mass": 2.5, "mass": 10,
"pGen": 6.4, "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" "eff": "F"
} }
} }

View File

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

View File

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

View File

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

View File

@@ -1,57 +1,54 @@
{ {
"09": { "Cargo Scanners": {
"group": "us", "09": {
"name": "Cargo Scanner", "grp": "cs",
"class": 0, "class": 0,
"rating": "A", "rating": "A",
"cost": 1097095, "cost": 1097095,
"mass": 1.3, "mass": 1.3,
"power": 3.2, "power": 3.2,
"range": 4, "range": 4,
"time": 10 "time": 10
}, },
"0a": { "0a": {
"group": "us", "grp": "cs",
"name": "Cargo Scanner", "class": 0,
"class": 0, "rating": "B",
"rating": "B", "cost": 365698,
"cost": 365698, "mass": 1.3,
"mass": 1.3, "power": 1.6,
"power": 1.6, "range": 3.5,
"range": 3.5, "time": 10
"time": 10 },
}, "0b": {
"0b": { "grp": "cs",
"group": "us", "class": 0,
"name": "Cargo Scanner", "rating": "C",
"class": 0, "cost": 121899,
"rating": "C", "mass": 1.3,
"cost": 121899, "power": 0.8,
"mass": 1.3, "range": 3,
"power": 0.8, "time": 10
"range": 3, },
"time": 10 "0c": {
}, "grp": "cs",
"0c": { "class": 0,
"group": "us", "rating": "D",
"name": "Cargo Scanner", "cost": 40633,
"class": 0, "mass": 1.3,
"rating": "D", "power": 0.4,
"cost": 40633, "range": 2.5,
"mass": 1.3, "time": 10
"power": 0.4, },
"range": 2.5, "0d": {
"time": 10 "grp": "cs",
}, "class": 0,
"0d": { "rating": "E",
"group": "us", "cost": 13544,
"name": "Cargo Scanner", "mass": 1.3,
"class": 0, "power": 0.2,
"rating": "E", "range": 2,
"cost": 13544, "time": 10
"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": { "Fragment Cannons": {
"group": "lk", "20": {
"name": "Fragment Cannon", "grp": "fc",
"class": 3, "class": 1,
"rating": "C", "rating": "E",
"cost": 1167360, "cost": 36000,
"mass": 8, "mass": 2,
"power": 1.02, "power": 0.45,
"mode": "F", "mode": "F",
"type": "K", "type": "K",
"damage": 3, "damage": 2,
"armourpen": "A", "armourpen": "A",
"rof": 4.5, "rof": 5.5,
"dps": 10, "dps": 8,
"thermload": 1, "thermload": 1,
"clip": 3, "grp": "fc",
"ammo": 30 "clip": 3,
}, "ammo": 30
"21": { },
"group": "lk", "21": {
"name": "Fragment Cannon", "grp": "fc",
"class": 3, "class": 1,
"rating": "C", "rating": "E",
"cost": 1751040, "cost": 54720,
"mass": 8, "mass": 2,
"power": 1.55, "power": 0.59,
"mode": "G", "mode": "G",
"type": "K", "type": "K",
"damage": 3, "damage": 2,
"armourpen": "A", "armourpen": "A",
"rof": 4.8, "rof": 5.8,
"dps": 10, "dps": 7,
"thermload": 1, "thermload": 1,
"clip": 3, "grp": "fc",
"ammo": 30 "clip": 3,
}, "ammo": 30
"22": { },
"group": "lk", "22": {
"name": "Fragment Cannon", "grp": "fc",
"class": 3, "class": 1,
"rating": "C", "rating": "E",
"cost": 5836800, "cost": 182400,
"mass": 8, "mass": 2,
"power": 1.29, "power": 0.42,
"mode": "T", "mode": "T",
"type": "K", "type": "K",
"damage": 2, "damage": 1,
"armourpen": "A", "armourpen": "A",
"rof": 3.3, "rof": 4,
"dps": 9, "dps": 6,
"thermload": 1, "thermload": 1,
"clip": 3, "grp": "fc",
"ammo": 30 "clip": 3,
}, "ammo": 30
"1s": { },
"group": "sk", "1s": {
"name": "Fragment Cannon", "grp": "fc",
"class": 1, "class": 2,
"rating": "E", "rating": "A",
"cost": 36000, "cost": 291840,
"mass": 2, "mass": 4,
"power": 0.45, "power": 0.74,
"mode": "F", "mode": "F",
"type": "K", "type": "K",
"damage": 2, "damage": 3,
"armourpen": "A", "armourpen": "A",
"rof": 5.5, "rof": 5,
"dps": 8, "dps": 9,
"thermload": 1, "thermload": 1,
"clip": 3, "grp": "fc",
"ammo": 30 "clip": 3,
}, "ammo": 30
"1t": { },
"group": "sk", "1t": {
"name": "Fragment Cannon", "grp": "fc",
"class": 1, "class": 3,
"rating": "E", "rating": "C",
"cost": 54720, "cost": 1167360,
"mass": 2, "mass": 8,
"power": 0.59, "power": 1.02,
"mode": "G", "mode": "F",
"type": "K", "type": "K",
"damage": 2, "damage": 3,
"armourpen": "A", "armourpen": "A",
"rof": 5.8, "rof": 4.5,
"dps": 7, "dps": 10,
"thermload": 1, "thermload": 1,
"clip": 3, "grp": "fc",
"ammo": 30 "clip": 3,
}, "ammo": 30
"1u": { },
"group": "sk", "1u": {
"name": "Fragment Cannon", "grp": "fc",
"class": 1, "class": 3,
"rating": "E", "rating": "C",
"cost": 182400, "cost": 1751040,
"mass": 2, "mass": 8,
"power": 0.42, "power": 1.55,
"mode": "T", "mode": "G",
"type": "K", "type": "K",
"damage": 1, "damage": 3,
"armourpen": "A", "armourpen": "A",
"rof": 4, "rof": 4.8,
"dps": 6, "dps": 10,
"thermload": 1, "thermload": 1,
"clip": 3, "grp": "fc",
"ammo": 30 "clip": 3,
}, "ammo": 30
"1v": { },
"group": "mk", "1v": {
"name": "Fragment Cannon", "grp": "fc",
"class": 2, "class": 3,
"rating": "A", "rating": "C",
"cost": 291840, "cost": 5836800,
"mass": 4, "mass": 8,
"power": 0.74, "power": 1.29,
"mode": "F", "mode": "T",
"type": "K", "type": "K",
"damage": 3, "damage": 2,
"armourpen": "A", "armourpen": "A",
"rof": 5, "rof": 3.3,
"dps": 9, "dps": 9,
"thermload": 1, "thermload": 1,
"clip": 3, "grp": "fc",
"ammo": 30 "clip": 3,
"ammo": 30
}
} }
} }

View File

@@ -1,57 +1,54 @@
{ {
"0e": { "Frame Shift Wake Scanners": {
"group": "us", "0e": {
"name": "Frame Shift Wake Scanner", "grp": "fs",
"class": 0, "class": 0,
"rating": "A", "rating": "A",
"cost": 1097095, "cost": 1097095,
"mass": 1.3, "mass": 1.3,
"power": 3.2, "power": 3.2,
"range": 4, "range": 4,
"time": 10 "time": 10
}, },
"0f": { "0f": {
"group": "us", "grp": "fs",
"name": "Frame Shift Wake Scanner", "class": 0,
"class": 0, "rating": "B",
"rating": "B", "cost": 365698,
"cost": 365698, "mass": 1.3,
"mass": 1.3, "power": 1.6,
"power": 1.6, "range": 3.5,
"range": 3.5, "time": 10
"time": 10 },
}, "0g": {
"0g": { "grp": "fs",
"group": "us", "class": 0,
"name": "Frame Shift Wake Scanner", "rating": "C",
"class": 0, "cost": 121899,
"rating": "C", "mass": 1.3,
"cost": 121899, "power": 0.8,
"mass": 1.3, "range": 3,
"power": 0.8, "time": 10
"range": 3, },
"time": 10 "0h": {
}, "grp": "fs",
"0h": { "class": 0,
"group": "us", "rating": "D",
"name": "Frame Shift Wake Scanner", "cost": 40633,
"class": 0, "mass": 1.3,
"rating": "D", "power": 0.4,
"cost": 40633, "range": 2.5,
"mass": 1.3, "time": 10
"power": 0.4, },
"range": 2.5, "0i": {
"time": 10 "grp": "fs",
}, "class": 0,
"0i": { "rating": "E",
"group": "us", "cost": 13544,
"name": "Frame Shift Wake Scanner", "mass": 1.3,
"class": 0, "power": 0.2,
"rating": "E", "range": 2,
"cost": 13544, "time": 10
"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": { "Kill Warrant Scanners": {
"group": "us", "0j": {
"name": "Kill Warrant Scanner", "grp": "kw",
"class": 0, "class": 0,
"rating": "A", "rating": "A",
"cost": 1097095, "cost": 1097095,
"mass": 1.3, "mass": 1.3,
"power": 3.2, "power": 3.2,
"range": 4, "range": 4,
"time": 10 "time": 10
}, },
"0k": { "0k": {
"group": "us", "grp": "kw",
"name": "Kill Warrant Scanner", "class": 0,
"class": 0, "rating": "B",
"rating": "B", "cost": 365698,
"cost": 365698, "mass": 1.3,
"mass": 1.3, "power": 1.6,
"power": 1.6, "range": 3.5,
"range": 3.5, "time": 10
"time": 10 },
}, "0l": {
"0l": { "grp": "kw",
"group": "us", "class": 0,
"name": "Kill Warrant Scanner", "rating": "C",
"class": 0, "cost": 121899,
"rating": "C", "mass": 1.3,
"cost": 121899, "power": 0.8,
"mass": 1.3, "range": 3,
"power": 0.8, "time": 10
"range": 3, },
"time": 10 "0m": {
}, "grp": "kw",
"0m": { "class": 0,
"group": "us", "rating": "D",
"name": "Kill Warrant Scanner", "cost": 40633,
"class": 0, "mass": 1.3,
"rating": "D", "power": 0.4,
"cost": 40633, "range": 2.5,
"mass": 1.3, "time": 10
"power": 0.4, },
"range": 2.5, "0n": {
"time": 10 "grp": "kw",
}, "class": 0,
"0n": { "rating": "E",
"group": "us", "cost": 13544,
"name": "Kill Warrant Scanner", "mass": 1.3,
"class": 0, "power": 0.2,
"rating": "E", "range": 2,
"cost": 13544, "time": 10
"mass": 1.3, }
"power": 0.2,
"range": 2,
"time": 10
} }
} }

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,56 +1,58 @@
{ {
"1g": { "Plasma Accelerators": {
"group": "mt", "1g": {
"name": "Plasma Accelerator", "grp": "pa",
"class": 2, "class": 2,
"rating": "C", "rating": "C",
"cost": 834200, "cost": 834200,
"mass": 4, "mass": 4,
"power": 1.43, "power": 1.43,
"mode": "F", "mode": "F",
"type": "T", "type": "T",
"damage": 7, "damage": 7,
"armourpen": "A", "armourpen": "A",
"rof": 0.3, "rof": 0.3,
"dps": 4, "dps": 4,
"thermload": 10, "thermload": 10,
"clip": 5, "grp": "pa",
"ammo": 100 "clip": 5,
}, "ammo": 100
"2b": { },
"group": "lo", "2b": {
"name": "Plasma Accelerator", "grp": "pa",
"class": 3, "class": 3,
"rating": "B", "rating": "B",
"cost": 3051200, "cost": 3051200,
"mass": 8, "mass": 8,
"power": 1.97, "power": 1.97,
"mode": "F", "mode": "F",
"type": "TK", "type": "TK",
"damage": 9, "damage": 9,
"armourpen": "A", "armourpen": "A",
"rof": 0.3, "rof": 0.3,
"dps": 4, "dps": 4,
"thermload": 8, "thermload": 8,
"clip": 5, "grp": "pa",
"ammo": 100 "clip": 5,
}, "ammo": 100
"2c": { },
"group": "ho", "2c": {
"name": "Plasma Accelerator", "grp": "pa",
"class": 4, "class": 4,
"rating": "A", "rating": "A",
"cost": 13793600, "cost": 13793600,
"mass": 16, "mass": 16,
"power": 2.63, "power": 2.63,
"mode": "F", "mode": "F",
"type": "TK", "type": "TK",
"damage": 10, "damage": 10,
"armourpen": "A", "armourpen": "A",
"rof": 0.3, "rof": 0.3,
"dps": 5, "dps": 5,
"thermload": 10, "thermload": 10,
"clip": 5, "grp": "pa",
"ammo": 100 "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": { "Pulse Lasers": {
"group": "st", "17": {
"name": "Pulse Laser", "grp": "pl",
"class": 1, "class": 1,
"rating": "F", "rating": "F",
"cost": 2200, "cost": 2200,
"mass": 2, "mass": 2,
"power": 0.39, "power": 0.39,
"mode": "F", "mode": "F",
"type": "T", "type": "T",
"damage": 2, "damage": 2,
"armourpen": "A", "armourpen": "A",
"rof": 3.8, "rof": 3.8,
"dps": 3, "dps": 3,
"thermload": 1 "thermload": 1
}, },
"18": { "18": {
"group": "st", "grp": "pl",
"name": "Pulse Laser", "class": 1,
"class": 1, "rating": "F",
"rating": "F", "cost": 6600,
"cost": 6600, "mass": 2,
"mass": 2, "power": 0.39,
"power": 0.39, "mode": "G",
"mode": "G", "type": "T",
"type": "T", "damage": 2,
"damage": 2, "armourpen": "A",
"armourpen": "A", "rof": 4,
"rof": 4, "dps": 3,
"dps": 3, "thermload": 1
"thermload": 1 },
}, "19": {
"19": { "grp": "pl",
"group": "st", "class": 1,
"name": "Pulse Laser", "rating": "G",
"class": 1, "cost": 26000,
"rating": "G", "mass": 2,
"cost": 26000, "power": 0.38,
"mass": 2, "mode": "T",
"power": 0.38, "type": "T",
"mode": "T", "damage": 2,
"type": "T", "armourpen": "A",
"damage": 2, "rof": 2.8,
"armourpen": "A", "dps": 2,
"rof": 2.8, "thermload": 1
"dps": 2, },
"thermload": 1 "1a": {
}, "grp": "pl",
"1a": { "class": 2,
"group": "mt", "rating": "E",
"name": "Pulse Laser", "cost": 17600,
"class": 2, "mass": 4,
"rating": "E", "power": 0.6,
"cost": 17600, "mode": "F",
"mass": 4, "type": "T",
"power": 0.6, "damage": 3,
"mode": "F", "armourpen": "A",
"type": "T", "rof": 3.4,
"damage": 3, "dps": 3,
"armourpen": "A", "thermload": 1
"rof": 3.4, },
"dps": 3, "1b": {
"thermload": 1 "grp": "pl",
}, "class": 2,
"1b": { "rating": "F",
"group": "mt", "cost": 35400,
"name": "Pulse Laser", "mass": 4,
"class": 2, "power": 0.6,
"rating": "F", "mode": "G",
"cost": 35400, "type": "T",
"mass": 4, "damage": 3,
"power": 0.6, "armourpen": "A",
"mode": "G", "rof": 3.6,
"type": "T", "dps": 3,
"damage": 3, "thermload": 1
"armourpen": "A", },
"rof": 3.6, "1c": {
"dps": 3, "grp": "pl",
"thermload": 1 "class": 2,
}, "rating": "F",
"1c": { "cost": 132800,
"group": "mt", "mass": 4,
"name": "Pulse Laser", "power": 0.58,
"class": 2, "mode": "T",
"rating": "F", "type": "T",
"cost": 132800, "damage": 2,
"mass": 4, "armourpen": "A",
"power": 0.58, "rof": 2.5,
"mode": "T", "dps": 3,
"type": "T", "thermload": 1
"damage": 2, },
"armourpen": "A", "1d": {
"rof": 2.5, "grp": "pl",
"dps": 3, "class": 3,
"thermload": 1 "rating": "D",
}, "cost": 70400,
"1d": { "mass": 8,
"group": "lt", "power": 0.9,
"name": "Pulse Laser", "mode": "F",
"class": 3, "type": "T",
"rating": "D", "damage": 4,
"cost": 70400, "armourpen": "A",
"mass": 8, "rof": 3,
"power": 0.9, "dps": 4,
"mode": "F", "thermload": 1
"type": "T", },
"damage": 4, "1e": {
"armourpen": "A", "grp": "pl",
"rof": 3, "class": 3,
"dps": 4, "rating": "E",
"thermload": 1 "cost": 140600,
}, "mass": 8,
"1e": { "power": 0.92,
"group": "lt", "mode": "G",
"name": "Pulse Laser", "type": "T",
"class": 3, "damage": 3,
"rating": "E", "armourpen": "A",
"cost": 140600, "rof": 3.2,
"mass": 8, "dps": 4,
"power": 0.92, "thermload": 1
"mode": "G", },
"type": "T", "1f": {
"damage": 3, "grp": "pl",
"armourpen": "A", "class": 3,
"rof": 3.2, "rating": "F",
"dps": 4, "cost": 400400,
"thermload": 1 "mass": 8,
}, "power": 0.89,
"1f": { "mode": "T",
"group": "lt", "type": "T",
"name": "Pulse Laser", "damage": 3,
"class": 3, "armourpen": "A",
"rating": "F", "rof": 2.3,
"cost": 400400, "dps": 3,
"mass": 8, "thermload": 1
"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": { "Rail Guns": {
"group": "so", "29": {
"name": "Rail Gun", "grp": "rg",
"class": 1, "class": 1,
"rating": "D", "rating": "D",
"cost": 51600, "cost": 51600,
"mass": 2, "mass": 2,
"power": 1.15, "power": 1.15,
"mode": "F", "mode": "F",
"type": "TK", "type": "TK",
"damage": 6, "damage": 6,
"armourpen": "A", "armourpen": "A",
"rof": 0.6, "rof": 0.6,
"dps": 4, "dps": 4,
"thermload": 7, "thermload": 7,
"clip": 1, "grp": "rg",
"ammo": 30 "clip": 1,
}, "ammo": 30
"2a": { },
"group": "mo", "2a": {
"name": "Rail Gun", "grp": "rg",
"class": 2, "class": 2,
"rating": "B", "rating": "B",
"cost": 412800, "cost": 412800,
"mass": 4, "mass": 4,
"power": 1.63, "power": 1.63,
"mode": "F", "mode": "F",
"type": "TK", "type": "TK",
"damage": 7, "damage": 7,
"armourpen": "A", "armourpen": "A",
"rof": 0.5, "rof": 0.5,
"dps": 4, "dps": 4,
"thermload": 10, "thermload": 10,
"clip": 1, "grp": "rg",
"ammo": 30 "clip": 1,
"ammo": 30
}
} }
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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