Compare commits

...

155 Commits

Author SHA1 Message Date
Colin McLeod
c98a73c6a8 Bumping version to 1.4.1 2015-08-15 16:35:30 -07:00
Colin McLeod
0116523c63 Merge pull request #75 from sf302/master
Additional refinement to "Optimize Mass" preset
2015-08-14 22:36:17 -07:00
Kevin Chang
c1afa7c385 Additional refinement to "Optimize Mass" preset 2015-08-14 19:16:49 -07:00
Colin McLeod
6630ff8fee Adding another E:D import test case 2015-08-14 11:41:53 -07:00
Colin McLeod
14f303c581 Merge pull request #74 from sf302/master
Adding powerplant capacity warnings
2015-08-14 00:42:50 -07:00
Colin McLeod
0728af14dd Support import of E:D shipyard text exports 2015-08-13 23:22:13 -07:00
Colin McLeod
1edacf3eba Corrected thurster selection and warnings 2015-08-13 23:21:40 -07:00
Colin McLeod
3d6d210563 updating linting params 2015-08-13 23:18:35 -07:00
Colin McLeod
df09da4b0a Remove redundant statements 2015-08-13 23:14:48 -07:00
Colin McLeod
b02de43b50 Updating dependencies 2015-08-13 23:14:33 -07:00
Kevin Chang
1b3ca2f697 Fix lint error 2015-08-13 22:22:46 -07:00
Colin McLeod
886614527f Improved low weight build logic 2015-08-10 15:12:59 -07:00
Colin McLeod
5f05bf0dc5 Lint fix 2015-08-10 15:12:18 -07:00
Colin McLeod
59710ce2cf Adding button for class A oufit 2015-08-10 10:50:46 -07:00
Colin McLeod
b533191bc9 Adding loader for later use 2015-08-10 10:50:16 -07:00
Kevin Chang
4fa1115e8f Extend PD Boost warning to PP Retracted power (TODO: extend to two-stage warning for DEP/RET) 2015-08-06 20:58:11 -07:00
Colin McLeod
be5a069b23 Merge pull request #71 from sf302/master
Add build preset button and correct/improve SCB info
2015-07-30 20:48:17 -07:00
Kevin Chang
80da41c866 Another fix to lint errors 2015-07-30 20:18:33 -07:00
Kevin Chang
d278a7c1fd Correcting CI errors 2015-07-30 20:14:46 -07:00
Kevin Chang
69de209aba A-rated uses largest eligible shield slot; dirty hacks rewritten 2015-07-30 19:50:08 -07:00
Kevin Chang
15616d112f Add per-slot total SCB capacity in MJ 2015-07-30 19:04:52 -07:00
Kevin Chang
95adca5cde Incremented all shield cell bank counts -- "Munitions" tab shows actual cell counts 2015-07-30 18:54:57 -07:00
kchang
82c5460936 Shortcut to A-rated common components and shield generator 2015-07-28 23:21:46 -07:00
Colin McLeod
b850695715 Bumping version to 1.3.1 2015-07-26 22:42:06 -07:00
Colin McLeod
d5af972272 Add 8A pristmatic shield generator 2015-07-26 22:39:13 -07:00
Colin McLeod
8946f9b97c Add component group filtering for Orca special case internal slots 2015-07-21 12:34:35 -07:00
Colin McLeod
348339520d Improve comparison import validation 2015-07-21 12:34:07 -07:00
Colin McLeod
f0bdcd5557 Bumping version to 1.3.0 2015-07-20 13:42:38 -07:00
Colin McLeod
b1ee0e44f3 Linting fixes, update unit test 2015-07-20 13:42:21 -07:00
Colin McLeod
c96e6afbd7 Power Distributor required for Boost. Resolves #17 2015-07-20 13:37:03 -07:00
Colin McLeod
77334341ea Armour value improved by bulkhead 2015-07-20 00:55:51 -07:00
Colin McLeod
5f22743778 Bumping to version 1.2.0 2015-07-19 22:30:30 -07:00
Colin McLeod
03986cb88a Massive refactor for 3rd party import 2015-07-19 21:32:14 -07:00
Colin McLeod
c796adf40d Add Persist.getAll for backup purposes 2015-07-18 16:50:50 -07:00
Colin McLeod
2890ff5537 Add description to export modal 2015-07-18 16:50:03 -07:00
Colin McLeod
a6ba61a2bf Change loadout schema slightly 2015-07-18 14:46:22 -07:00
Colin McLeod
db5e080992 Change meta description 2015-07-18 14:45:36 -07:00
Colin McLeod
63d7f98e2c Fix total jump range calculation bug 2015-07-18 14:45:08 -07:00
Colin McLeod
7997ff6ae9 Correct Beta insurance rate 2015-07-17 09:07:16 -07:00
Colin McLeod
b3126cf6b6 Renaming data test for consistency 2015-07-15 21:11:23 -07:00
Colin McLeod
ab1ea53ce3 Implement export for 3rd Party sites 2015-07-15 16:13:17 -07:00
Colin McLeod
82a87cb653 Adjust select menu size for smaller windows 2015-07-15 15:31:40 -07:00
Colin McLeod
d2fc526039 Don't cachebust JSON files.. 2015-07-14 21:58:27 -07:00
Colin McLeod
88587c6487 Bumping version to 1.1.0 2015-07-14 21:48:11 -07:00
Colin McLeod
4578dbf906 Refactor many variable names, adding detailed json dump and schema 2015-07-14 21:44:12 -07:00
Colin McLeod
cd48ef6f86 Removing ship purpose 2015-07-13 12:33:40 -07:00
Colin McLeod
0f0e67ec9c Adding mass lock factor 2015-07-13 11:08:49 -07:00
Colin McLeod
bbb2a223af Updating price for mining lance 2015-07-13 10:58:05 -07:00
Colin McLeod
5278e52e2f Updating price for Pack-hound 2015-07-13 10:57:52 -07:00
Colin McLeod
e6290abef7 Correcting prices 2015-07-11 00:17:21 -07:00
Colin McLeod
346fee1208 Improve readbility of power distributor and thruster data 2015-07-07 18:29:25 -07:00
Colin McLeod
1b9f5f870e Change component select hover color 2015-07-07 18:29:07 -07:00
Colin McLeod
26b624d1dd Use default right-click action when SHIFT key is held 2015-07-07 15:34:28 -07:00
Colin McLeod
7cbd9732b7 List Utility mounts in alphabetical order 2015-07-07 14:51:23 -07:00
Colin McLeod
44152116b4 Linting fix 2015-07-07 11:30:38 -07:00
Colin McLeod
3ad35992fc Use full names for limpet controllers 2015-07-07 11:20:48 -07:00
Colin McLeod
e963eb24a0 Adding Imperial Hammer rail gun 2015-07-07 11:20:26 -07:00
Colin McLeod
827e2b403c Adding Distrupoter pulse laser 2015-07-07 11:20:07 -07:00
Colin McLeod
0fd4712021 Adding Advanced Plasma Accelerator 2015-07-07 11:19:49 -07:00
Colin McLeod
ae0af05e78 Adding Enforcer Multi-cannon 2015-07-07 11:19:31 -07:00
Colin McLeod
dd00f283e6 Adding Pack-Hound missle rack 2015-07-07 11:19:12 -07:00
Colin McLeod
eddf968629 Adding Mining Lance laser 2015-07-07 11:18:50 -07:00
Colin McLeod
7fdd83ba84 Adding Pacifier frag cannon 2015-07-07 11:18:28 -07:00
Colin McLeod
1bb4f6850e Clean up cannon data 2015-07-07 11:18:05 -07:00
Colin McLeod
f47b931380 Adding Cryptoscrambler burst laser 2015-07-07 11:17:45 -07:00
Colin McLeod
d9f686f0d6 Adding Retributor beam laser 2015-07-07 11:17:25 -07:00
Colin McLeod
73cef20073 Format for readability 2015-07-07 11:17:05 -07:00
Colin McLeod
fd68565d8e Adding prismatic Shield Generators 2015-07-07 11:16:40 -07:00
Colin McLeod
a45d165d33 UI Tweaks 2015-07-06 15:45:56 -07:00
Colin McLeod
904f828d83 Change cargo rack order, remove long name 2015-07-06 11:20:34 -07:00
Colin McLeod
f00420c92f UI Tweaks 2015-07-06 11:20:08 -07:00
Colin McLeod
457705014c Bumping version to 1.0.4 2015-07-03 18:25:54 -07:00
Colin McLeod
6faf3765e0 Fix to scroll to top on iOS 2015-07-03 18:23:19 -07:00
Colin McLeod
4abdce2b70 Fix button wrapping issue on small screens 2015-07-03 15:42:08 -07:00
Colin McLeod
3b44f5fe27 Bumping version 1.0.3 2015-07-03 15:33:47 -07:00
Colin McLeod
7332dc69ed Linting issues 2015-07-03 15:31:52 -07:00
Colin McLeod
381387c04f UI Tweaks, persist cost tab open, revert outfitting order to original 2015-07-03 15:30:49 -07:00
Colin McLeod
e0db9fdfb0 Fix scrolling on iOS 2015-07-03 12:15:35 -07:00
Colin McLeod
a8d66b22af Bumping version to 1.0.2 2015-07-02 20:43:13 -07:00
Colin McLeod
bdc1e622f9 UI Tweaks, scrolling fixes and improvements 2015-07-02 20:42:46 -07:00
Colin McLeod
ad8130ae9b Add missing class 7 & 8 internal fuel tanks 2015-07-02 19:24:52 -07:00
Colin McLeod
394a3bb9f1 Revert to ui-router-extras 0.0.13 due to bug introduced in 0.0.14 2015-07-02 10:41:24 -07:00
Colin McLeod
54907b462c Tweak select look and feel on firefox, safari 2015-07-01 23:41:32 -07:00
Colin McLeod
1350de1910 Empty retrofitting table color fix 2015-06-30 21:55:38 -07:00
Colin McLeod
89d3fd69e1 UI tweaks for mobile 2015-06-30 21:46:05 -07:00
Colin McLeod
7325081ec9 Version 1.0.0 :D 2015-06-30 21:09:19 -07:00
Colin McLeod
680872a302 Retrofitting costs added to outfit page 2015-06-30 21:06:12 -07:00
Colin McLeod
a3c65d6c69 Code comments 2015-06-30 19:25:57 -07:00
Colin McLeod
a189265326 Fix svg click bug in Chrome 2015-06-30 19:25:36 -07:00
Colin McLeod
b447e913ff no need to abbreviate shield details 2015-06-29 16:28:41 -07:00
Colin McLeod
b5a249fb4b Change latest version date format 2015-06-29 16:27:56 -07:00
Colin McLeod
ae081c147e Fix negative power for limpet controllers 2015-06-29 15:42:35 -07:00
Colin McLeod
3ce0d0bdd8 Add dps to outfit page 2015-06-29 15:03:04 -07:00
Colin McLeod
a71abd9fe3 Bumping version to 0.14.1 2015-06-29 14:59:30 -07:00
Colin McLeod
f1d804e3a1 Adding total DPS to outfit page and comparisons 2015-06-29 11:57:29 -07:00
Colin McLeod
aa7479d111 Updating Federal Dropship agility 2015-06-29 10:36:49 -07:00
Colin McLeod
7c23fb3884 Bumping version to 0.14.0 2015-06-26 11:00:46 -07:00
Colin McLeod
b707015d9c Fix power plant toggle power bug 2015-06-26 11:00:11 -07:00
Colin McLeod
10d5611dcd Seperate discounts for ship and components, added discounts for 5,10,15,20,25 percent off 2015-06-25 20:26:22 -07:00
Colin McLeod
9009a2a434 Bumping to 0.13.4, fixing courier bulkhead mass 2015-06-24 13:17:23 -07:00
Colin McLeod
8b98a98faf lint fix 2015-06-23 23:47:27 -07:00
Colin McLeod
44de3e4bbc Minor CSS refactor, outfit page tweak 2015-06-23 23:45:30 -07:00
Colin McLeod
ba2e9a12b0 Tweak chart axis labels 2015-06-23 11:47:23 -07:00
Colin McLeod
57304f55c1 Merge pull request #62 from Maverick-JM/master
Fixes for Windows phone and IE
2015-06-23 11:47:09 -07:00
Maverick
1eea358c35 Typo in the comments :). 2015-06-23 23:10:04 +10:00
Maverick
f671b7c34f Fix for the top menu not working in IE 11 (and probably older IE too). 2015-06-23 23:04:07 +10:00
Maverick
211028d80d Fix for the whole app not working on Windows phones as a Windows phone, this was somewhat vexing :)). 2015-06-23 22:27:24 +10:00
Justin Murtagh
c79359ea2f Merge pull request #6 from cmmcleod/master
Update my fork.
2015-06-23 22:04:34 +10:00
Colin McLeod
93f92da1df Adding line chart, adding speed function 2015-06-19 19:04:45 -07:00
Colin McLeod
25020293ec Fix unique internal component regression bug, add tests, bump to 0.13.3 2015-06-19 10:29:26 -07:00
Colin McLeod
4e7f1d3e8b Updating README and disclaimer text 2015-06-18 16:32:45 -07:00
Colin McLeod
e6ba0a14e8 Minor tweak to slot size position 2015-06-18 15:51:58 -07:00
Colin McLeod
b285a433b2 Bumping version to 0.13.2 2015-06-18 09:52:48 -07:00
Colin McLeod
f19c786f64 Update ship armour stats 2015-06-18 09:52:18 -07:00
Colin McLeod
806e545361 Fix charts in comparison page 2015-06-17 23:32:56 -07:00
Colin McLeod
ae62781d53 Bump version to 0.13.0 2015-06-17 23:17:15 -07:00
Colin McLeod
3abfcf7c95 Tweak chart axis UI 2015-06-17 23:12:27 -07:00
Colin McLeod
dc8b829d8a fix: total range calculation bug 2015-06-17 20:41:54 -07:00
Colin McLeod
353396398b Linting fix 2015-06-17 20:41:11 -07:00
Colin McLeod
bf99b34596 Tweak outfit page charts responsiveness 2015-06-16 15:28:06 -07:00
Colin McLeod
f3af0f3a99 Toggling shield and boosters updates shield strength 2015-06-16 15:27:41 -07:00
Colin McLeod
0fd4a8395e Tweak area chart tooltip 2015-06-16 15:26:47 -07:00
Colin McLeod
cb664003a5 Tweak slider 2015-06-16 15:26:22 -07:00
Colin McLeod
4686f17d18 Strip build should reset bulkheads 2015-06-16 15:26:05 -07:00
Colin McLeod
45c96dc136 Icon tweaks, added feather icon 2015-06-16 15:25:25 -07:00
Colin McLeod
389fdc8dfa Removing unused svg icon 2015-06-15 23:25:42 -07:00
Colin McLeod
b94e6126cd Chart performance tweaks, UI tweaks 2015-06-15 21:46:55 -07:00
Colin McLeod
bee4f7e6bc Fix strip build bug, and update state 2015-06-15 18:18:27 -07:00
Colin McLeod
345b7f5ffe Removing codeship, adding travis build status to readme 2015-06-15 18:08:41 -07:00
Colin McLeod
f1b40eb38c Adding gulp back to package.json 2015-06-15 18:06:09 -07:00
Colin McLeod
f459c26bd7 Locking down npm dependencies, add caching to travis 2015-06-15 18:03:02 -07:00
Colin McLeod
825b678fb0 Total Range chart feature added 2015-06-15 17:43:28 -07:00
Colin McLeod
ce3818f99a Use Travis CI instead of Codeship 2015-06-15 17:32:18 -07:00
Colin McLeod
94e2b60cd1 Changing version link 2015-06-15 17:31:27 -07:00
Colin McLeod
3bbef71a5e Merge pull request #58 from shearn89/strip-ship
Adding in 'Strip Ship' functionality.
2015-06-15 16:26:01 -07:00
Alex Shearn
ca280673d1 Fixing indentation 2015-06-15 22:09:18 +01:00
Alex Shearn
ff477c035a Moving button as per comments 2015-06-15 20:28:15 +01:00
Alex Shearn
1c0b76a8c2 Adding in 'Strip Ship' functionality.
This commit adds a simple button next to the save/reload icons that strips the ship to maximum class, D-rated modules, and no optional modules. Still needs a custom icon! May try to add in future things like 'all cargo' or 'fill empty with...' options.
2015-06-15 20:07:13 +01:00
Colin McLeod
bef741332d Bumping version to 0.12.1 2015-06-15 10:11:34 -07:00
Colin McLeod
f54620ee24 Imperial Courier shield correction 2015-06-15 10:11:12 -07:00
Colin McLeod
7d28e69b1c Bumping version to 0.12.0 2015-06-15 09:32:59 -07:00
Colin McLeod
abfe1b4a68 Updating base shield strength for Diamondback ships 2015-06-15 09:31:33 -07:00
Colin McLeod
59e400d7b8 Detailed suface scanner power management special case 2015-06-14 18:58:27 -07:00
Colin McLeod
4b3bb3bcde License readme tweak 2015-06-14 18:58:05 -07:00
Colin McLeod
a4a562bd40 Linting fixes 2015-06-14 17:47:16 -07:00
Colin McLeod
a1506d4f37 Selectable power bands, with right click to clear feature 2015-06-14 17:26:21 -07:00
Colin McLeod
8b0f58cb69 Right-click to clear slots feature 2015-06-14 17:26:04 -07:00
Colin McLeod
1a14674352 Updating License details to comply with Frontier terms and conditions 2015-06-14 17:25:28 -07:00
Colin McLeod
a2c32dd908 Bumping version to 0.11.1 2015-06-13 00:56:08 -07:00
Colin McLeod
eb7383b31e Lint fix 2015-06-13 00:44:15 -07:00
Colin McLeod
2106ec0e93 Ship building edge case, plus unit test to cover change 2015-06-13 00:43:10 -07:00
Colin McLeod
5649dc9079 Adding founders world discount 2015-06-12 23:40:32 -07:00
Colin McLeod
0d09607d30 Ship build, reset bug 2015-06-12 23:38:33 -07:00
Colin McLeod
d7415ea44a Updating hull prices for diamondback scout+exp, imperial courier 2015-06-12 20:14:56 -07:00
Justin Murtagh
6fb2247dd7 Merge pull request #5 from cmmcleod/master
Merge back post-responsive priority stuff.
2015-06-12 07:12:13 +10:00
116 changed files with 7293 additions and 3084 deletions

19
.travis.yml Normal file
View File

@@ -0,0 +1,19 @@
language: node_js
notifications:
email: false
sudo: false
node_js:
- "0.12"
cache:
directories:
- node_modules
- bower_components
before_script:
- npm install -g gulp
- npm install -g bower
- bower install
script:
- gulp lint
- gulp build-prod
- gulp test

View File

@@ -1,4 +1,4 @@
[ ![Codeship Status for cmmcleod/coriolis](https://codeship.com/projects/637858c0-f2a5-0132-7af7-5ed004d44c71/status?branch=master)](https://codeship.com/projects/85232) [![Tasks in Ready](https://badge.waffle.io/cmmcleod/coriolis.png?label=ready&title=Ready)](https://waffle.io/cmmcleod/coriolis) [![Tasks in Progress](https://badge.waffle.io/cmmcleod/coriolis.svg?label=in%20progress&title=In%20Progress)](http://waffle.io/cmmcleod/coriolis)
[![Build Status](https://travis-ci.org/cmmcleod/coriolis.svg?branch=master)](https://travis-ci.org/cmmcleod/coriolis) [![Tasks in Ready](https://badge.waffle.io/cmmcleod/coriolis.png?label=ready&title=Ready)](https://waffle.io/cmmcleod/coriolis) [![Tasks in Progress](https://badge.waffle.io/cmmcleod/coriolis.svg?label=in%20progress&title=In%20Progress)](http://waffle.io/cmmcleod/coriolis)
@@ -6,11 +6,11 @@
The Coriolis project was inspired by [E:D Shipyard](http://www.edshipyard.com/) and, of course, [Elite Dangerous](http://www.elitedangerous.com). The ultimate goal of Coriolis is to provide rich features to support in-game play and planning while engaging the E:D community to support its development.
Coriolis was created for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments.
Coriolis was created using assets and imagery from Elite: Dangerous, with the permission of Frontier Developments plc, for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments and no employee of Frontier Developments was involved in the making of it.
## Contributing
Please [submit issues](https://github.com/cmmcleod/coriolis/issues), or better yet [pull requests](http://www.elitedangerous.com) for any corrections or additions to the database or the code.
Please [submit issues](https://github.com/cmmcleod/coriolis/issues), or better yet [pull requests](https://github.com/cmmcleod/coriolis/pulls) for any corrections or additions to the database or the code.
### Feature Requests, Suggestions & Bugs
@@ -28,12 +28,15 @@ See [Data wiki](https://github.com/cmmcleod/coriolis/wiki/Database) for details
## License
The MIT License
All Data and [associated JSON](https://github.com/cmmcleod/coriolis/tree/master/data) files are intellectual property and copyright of Frontier Developments plc ('Frontier', 'Frontier Developments') and are subject to their
[terms and conditions](https://www.frontierstore.net/terms-and-conditions/).
The code (Javascript, CSS, HTML, and SVG files only) specificially for Coriolis.io is released under the MIT License.
Copyright (c) 2015 Coriolis.io, Colin McLeod
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
of this software (Javascript, CSS, HTML, and SVG files only), and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is

3
app/icons/a.svg Executable file
View File

@@ -0,0 +1,3 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M10.063 26l1.8-6h8.274l1.8 6h3.551l-6-20h-6.976l-6 20h3.551zM14.863 10h2.274l1.8 6h-5.874l1.8-6z"></path>
</svg>

After

Width:  |  Height:  |  Size: 265 B

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M16 0c-8.837 0-16 7.163-16 16s7.163 16 16 16 16-7.163 16-16-7.163-16-16-16zM16 29c-7.18 0-13-5.82-13-13s5.82-13 13-13 13 5.82 13 13-5.82 13-13 13z"></path>
<path d="M21 8l-5 5-5-5-3 3 5 5-5 5 3 3 5-5 5 5 3-3-5-5 5-5z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 554 B

3
app/icons/feather.svg Normal file
View File

@@ -0,0 +1,3 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="724" height="1024" viewBox="0 0 1024 1024">
<path d="M0 1024c128-384 463-1024 1024-1024-263 211-384 704-576 704s-192 0-192 0l-192 320h-64z"></path>
</svg>

After

Width:  |  Height:  |  Size: 218 B

View File

@@ -1,6 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="33" height="33" viewBox="0 0 33 33">
<path d="M32 12h-12l4.485-4.485c-2.267-2.266-5.28-3.515-8.485-3.515s-6.219 1.248-8.485 3.515c-2.266 2.267-3.515 5.28-3.515 8.485s1.248 6.219 3.515 8.485c2.267 2.266 5.28 3.515 8.485 3.515s6.219-1.248 8.485-3.515c0.189-0.189 0.371-0.384 0.546-0.583l3.010 2.634c-2.933 3.349-7.239 5.464-12.041 5.464-8.837 0-16-7.163-16-16s7.163-16 16-16c4.418 0 8.418 1.791 11.313 4.687l4.687-4.687v12z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 713 B

After

Width:  |  Height:  |  Size: 499 B

View File

@@ -1,6 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="33" height="33" viewBox="0 0 33 33">
<path d="M20 4.581v4.249c1.131 0.494 2.172 1.2 3.071 2.099 1.889 1.889 2.929 4.4 2.929 7.071s-1.040 5.182-2.929 7.071c-1.889 1.889-4.4 2.929-7.071 2.929s-5.182-1.040-7.071-2.929c-1.889-1.889-2.929-4.4-2.929-7.071s1.040-5.182 2.929-7.071c0.899-0.899 1.94-1.606 3.071-2.099v-4.249c-5.783 1.721-10 7.077-10 13.419 0 7.732 6.268 14 14 14s14-6.268 14-14c0-6.342-4.217-11.698-10-13.419zM14 0h4v16h-4z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 723 B

After

Width:  |  Height:  |  Size: 510 B

View File

@@ -5,9 +5,9 @@
<link rel="stylesheet" href="/app.css">
<!-- Standard headers -->
<meta name="description" content="A ship outfitting and comparison tool for Elite Dangerous">
<meta name="description" content="A ship builder, outfitting and comparison tool for Elite Dangerous">
<meta name="mobile-web-app-capable" content="yes">
<meta name="viewport" content="width = device-width, initial-scale = 1.0">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="manifest" href="/images/logo/manifest.json">
<link rel="icon" sizes="152x152 192x192" type="image/png" href="/images/logo/192x192.png">
<link rel="shortcut icon" href="/images/logo/favicon.ico">
@@ -63,10 +63,10 @@
<footer>
<div class="right">
<a href="https://github.com/cmmcleod/coriolis" target="_blank" title="Coriolis Github Project">Version <%= version %> - <%= date %></a>
<a href="https://github.com/cmmcleod/coriolis/releases/" target="_blank" title="Coriolis Github Project">Version <%= version %> - <%= date %></a>
</div>
<div style="max-width:50%" class="l">
Coriolis Shipyard was created for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments.
Coriolis was created using assets and imagery from Elite: Dangerous, with the permission of Frontier Developments plc, for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments and no employee of Frontier Developments was involved in the making of it.
</div>
</footer>

View File

@@ -1,8 +1,14 @@
angular.module('app', ['ui.router', 'ct.ui.router.extras.sticky', 'ui.sortable', 'shipyard', 'ngLodash', 'app.templates'])
.run(['$rootScope', '$location', '$window', '$document', '$state', 'commonArray', 'shipPurpose', 'shipSize', 'hardPointClass', 'GroupMap', 'Persist',
function($rootScope, $location, $window, $doc, $state, CArr, shipPurpose, sz, hpc, GroupMap, Persist) {
.run(['$rootScope', '$location', '$window', '$document', '$state', 'commonArray', 'shipSize', 'hardPointClass', 'GroupMap', 'Persist', 'Discounts',
function($rootScope, $location, $window, $doc, $state, CArr, sz, hpc, GroupMap, Persist, Discounts) {
// App is running as a standalone web app on tablet/mobile
var isStandAlone = $window.navigator.standalone || ($window.external && $window.external.msIsSiteMode && $window.external.msIsSiteMode());
var isStandAlone;
// This was causing issues on Windows phones ($window.external was causing Angular js to throw an exception). Backup is to try this and set isStandAlone to false if this fails.
try {
isStandAlone = $window.navigator.standalone || ($window.external && $window.external.msIsSiteMode && $window.external.msIsSiteMode());
} catch (ex) {
isStandAlone = false;
}
// Redirect any state transition errors to the error controller/state
$rootScope.$on('$stateChangeError', function(e, toState, toParams, fromState, fromParams, error) {
@@ -29,16 +35,22 @@ function($rootScope, $location, $window, $doc, $state, CArr, shipPurpose, sz, hp
// Global Reference variables
$rootScope.CArr = CArr;
$rootScope.SP = shipPurpose;
$rootScope.SZ = sz;
$rootScope.HPC = hpc;
$rootScope.GMAP = GroupMap;
$rootScope.insurance = { opts: [{ name: 'Standard', pct: 0.05 }, { name: 'Alpha', pct: 0.025 }, { name: 'Beta', pct: 0.0375 }] };
$rootScope. discounts = { opts: Discounts };
$rootScope.STATUS = ['', 'DISABLED', 'OFF', 'ON'];
$rootScope.STATUS_CLASS = ['', 'disabled', 'warning', 'secondary-disabled'];
$rootScope.title = 'Coriolis';
$rootScope.cName = function(c) {
return c.c ? c.c.name ? c.c.name : GroupMap[c.c.grp] : null;
/**
* Returns the name of the component mounted in the specified slot
* @param {Object} slot The slot object
* @return {String} The component name
*/
$rootScope.cName = function(slot) {
return slot.c ? slot.c.name ? slot.c.name : GroupMap[slot.c.grp] : null;
};
// Formatters

View File

@@ -46,7 +46,7 @@ angular.module('app').config(['$provide', '$stateProvider', '$urlRouterProvider'
// Modal States and views
.state('modal', { abstract: true, views: { 'modal': { templateUrl: 'views/_modal.html', controller: 'ModalController' } } })
.state('modal.about', { views: { 'modal-content': { templateUrl: 'views/modal-about.html' } } })
.state('modal.export', { params: { title: null, data: null, promise: null }, views: { 'modal-content': { templateUrl: 'views/modal-export.html', controller: 'ExportController' } } })
.state('modal.export', { params: { title: null, data: null, promise: null, description: null }, views: { 'modal-content': { templateUrl: 'views/modal-export.html', controller: 'ExportController' } } })
.state('modal.import', { params: { obj: null }, views: { 'modal-content': { templateUrl: 'views/modal-import.html', controller: 'ImportController' } } })
.state('modal.link', { params: { url: null }, views: { 'modal-content': { templateUrl: 'views/modal-link.html', controller: 'LinkController' } } })
.state('modal.delete', { views: { 'modal-content': { templateUrl: 'views/modal-delete.html', controller: 'DeleteController' } } });

View File

@@ -1,11 +1,12 @@
angular.module('app').controller('ExportController', ['$scope', '$stateParams', function($scope, $stateParams) {
$scope.title = $stateParams.title || 'Export';
$scope.description = $stateParams.description;
if ($stateParams.promise) {
$scope.export = 'Generating...';
$stateParams.promise.then(function(data) {
$scope.export = data;
$scope.export = (typeof data === 'object') ? angular.toJson(data, true) : data;
});
} else {
$scope.export = angular.toJson($stateParams.data, true);

View File

@@ -1,92 +1,303 @@
angular.module('app').controller('ImportController', ['$scope', '$stateParams', 'ShipsDB', 'Ship', 'Persist', 'Serializer', function($scope, $stateParams, Ships, Ship, Persist, Serializer) {
$scope.jsonValid = false;
$scope.importData = null;
angular.module('app').controller('ImportController', ['lodash', '$rootScope', '$scope', '$stateParams', 'ShipsDB', 'Ship', 'Components', 'GroupMap', 'Persist', 'Serializer', function(_, $rootScope, $scope, $stateParams, Ships, Ship, Components, GroupMap, Persist, Serializer) {
$scope.importValid = false;
$scope.importString = null;
$scope.errorMsg = null;
$scope.canEdit = true;
$scope.builds = $stateParams.obj || null;
$scope.ships = Ships;
$scope.validateJson = function() {
var importObj = null;
$scope.jsonValid = false;
$scope.errorMsg = null;
$scope.builds = null;
var textBuildRegex = new RegExp('^\\[([\\w \\-]+)\\]\n');
var lineRegex = new RegExp('^([\\dA-Z]{1,2}): (\\d)([A-I])[/]?([FGT])?([SD])? ([\\w\\- ]+)');
var mountMap = { 'H': 4, 'L': 3, 'M': 2, 'S': 1, 'U': 0 };
var commonMap = { 'RB': 0, 'TM': 1, 'FH': 2, 'EC': 3, 'PC': 4, 'SS': 5, 'FS': 6 };
var bhMap = { 'lightweight alloy': 0, 'reinforced alloy': 1, 'military grade composite': 2, 'mirrored surface composite': 3, 'reactive surface composite': 4 };
if (!$scope.importData) { return; }
function isEmptySlot(slot) {
return slot.maxClass == this && slot.c === null;
}
function equalsIgnoreCase(str) {
return str.toLowerCase() == this.toLowerCase();
}
function validateBuild(shipId, code, name) {
var shipData = Ships[shipId];
if (!shipData) {
throw '"' + shipId + '" is not a valid Ship Id!';
}
if (typeof name != 'string' || name.length < 3) {
throw shipData.properties.name + ' build "' + name + '" must be a string at least 3 characters long!';
}
if (typeof code != 'string' || code.length < 10) {
throw shipData.properties.name + ' build "' + name + '" is not valid!';
}
try {
Serializer.toShip(new Ship(shipId, shipData.properties, shipData.slots), code);
} catch (e) {
throw shipData.properties.name + ' build "' + name + '" is not valid!';
}
}
function detailedJsonToBuild(detailedBuild) {
var ship;
if (!detailedBuild.name) {
throw 'Build Name missing!';
}
try {
importObj = angular.fromJson($scope.importData);
ship = Serializer.fromDetailedBuild(detailedBuild);
} catch (e) {
$scope.errorMsg = 'Cannot Parse JSON!';
return;
throw detailedBuild.ship + ' Build "' + detailedBuild.name + '": Invalid data';
}
if (typeof importObj != 'object') {
$scope.errorMsg = 'Must be an object!';
return;
}
return { shipId: ship.id, name: detailedBuild.name, code: Serializer.fromShip(ship) };
}
if ((!importObj.builds || !Object.keys(importObj.builds).length)) {
$scope.errorMsg = 'No builds in data';
return;
function importBackup(importData) {
if (importData.builds && typeof importData.builds == 'object') {
for (var shipId in importData.builds) {
for (var buildName in importData.builds[shipId]) {
validateBuild(shipId, importData.builds[shipId][buildName], buildName);
}
}
$scope.builds = importData.builds;
} else {
throw 'builds must be an object!';
}
for (var shipId in importObj.builds) {
var shipData = Ships[shipId];
if (shipData) {
for (var buildName in importObj.builds[shipId]) {
if (typeof importObj.builds[shipId][buildName] != 'string') {
$scope.errorMsg = shipData.properties.name + ' build "' + buildName + '" must be a string!';
return;
}
try {
// Actually build the ship with the code to ensure it's valid
Serializer.toShip(new Ship(shipId, shipData.properties, shipData.slots), importObj.builds[shipId][buildName]);
} catch (e) {
$scope.errorMsg = shipData.properties.name + ' build "' + buildName + '" is not valid!';
return;
if (importData.comparisons) {
for (var compName in importData.comparisons) {
var comparison = importData.comparisons[compName];
for (var i = 0, l = comparison.builds.length; i < l; i++) {
var build = comparison.builds[i];
if (!importData.builds[build.shipId] || !importData.builds[build.shipId][build.buildName]) {
throw build.shipId + ' build "' + build.buildName + '" data is missing!';
}
}
} else {
$scope.errorMsg = '"' + shipId + '"" is not a valid Ship Id!';
return;
}
$scope.builds = importObj.builds;
$scope.comparisons = importData.comparisons;
}
if (importData.discounts instanceof Array && importData.discounts.length == 2) {
$scope.discounts = importData.discounts;
}
if (typeof importData.insurance == 'string' && importData.insurance.length > 3) {
$scope.insurance = importData.insurance;
}
}
function importDetailedArray(importArr) {
var builds = {};
for (var i = 0, l = importArr.length; i < l; i++) {
var build = detailedJsonToBuild(importArr[i]);
if (!builds[build.shipId]) {
builds[build.shipId] = {};
}
builds[build.shipId][build.name] = build.code;
}
$scope.builds = builds;
}
function importTextBuild(buildStr) {
var buildName = textBuildRegex.exec(buildStr)[1].trim();
var shipName = buildName.toLowerCase();
var shipId = null;
for (var sId in Ships) {
if (Ships[sId].properties.name.toLowerCase() == shipName) {
shipId = sId;
break;
}
}
$scope.jsonValid = true;
if (!shipId) { throw 'No such ship found: "' + buildName + '"'; }
var lines = buildStr.split('\n');
var ship = new Ship(shipId, Ships[shipId].properties, Ships[shipId].slots);
ship.buildWith(null);
for (var i = 1; i < lines.length; i++) {
var line = lines[i].trim();
if (!line) { continue; }
if (line.substring(0, 3) == '---') { break; }
var parts = lineRegex.exec(line);
if (!parts) { throw 'Error parsing: "' + line + '"'; }
var typeSize = parts[1];
var cl = parts[2];
var rating = parts[3];
var mount = parts[4];
var missile = parts[5];
var name = parts[6].trim();
var slot, group;
if (isNaN(typeSize)) { // Common or Hardpoint
if (typeSize.length == 1) { // Hardpoint
var slotClass = mountMap[typeSize];
if (cl > slotClass) { throw cl + rating + ' ' + name + ' exceeds slot size: "' + line + '"'; }
slot = _.find(ship.hardpoints, isEmptySlot, slotClass);
if (!slot) { throw 'No hardpoint slot available for: "' + line + '"'; }
group = _.find(GroupMap, equalsIgnoreCase, name);
var hpid = Components.findHardpointId(group, cl, rating, group ? null : name, mount, missile);
if (!hpid) { throw 'Unknown component: "' + line + '"'; }
ship.use(slot, hpid, Components.hardpoints(hpid), true);
} else if (typeSize == 'BH') {
var bhId = bhMap[name.toLowerCase()];
if (bhId === undefined) { throw 'Unknown bulkhead: "' + line + '"'; }
ship.useBulkhead(bhId, true);
} else if (commonMap[typeSize] != undefined) {
var commonIndex = commonMap[typeSize];
if (ship.common[commonIndex].maxClass < cl) { throw name + ' exceeds max class for the ' + ship.name; }
ship.use(ship.common[commonIndex], cl + rating, Components.common(commonIndex, cl + rating), true);
} else {
throw 'Unknown component: "' + line + '"';
}
} else {
if (cl > typeSize) { throw cl + rating + ' ' + name + ' exceeds slot size: "' + line + '"'; }
slot = _.find(ship.internal, isEmptySlot, typeSize);
if (!slot) { throw 'No internal slot available for: "' + line + '"'; }
group = _.find(GroupMap, equalsIgnoreCase, name);
var intId = Components.findInternalId(group, cl, rating, group ? null : name);
if (!intId) { throw 'Unknown component: "' + line + '"'; }
ship.use(slot, intId, Components.internal(intId));
}
}
var builds = {};
builds[shipId] = {};
builds[shipId]['Imported ' + buildName] = Serializer.fromShip(ship);
$scope.builds = builds;
}
$scope.validateImport = function() {
var importData = null;
var importString = $scope.importString.trim();
$scope.importValid = false;
$scope.errorMsg = null;
$scope.builds = $scope.discounts = $scope.comparisons = $scope.insurance = null;
if (!importString) { return; }
try {
if (textBuildRegex.test(importString)) { // E:D Shipyard build text
importTextBuild(importString);
} else { // JSON Build data
importData = angular.fromJson($scope.importString);
if (!importData || typeof importData != 'object') {
throw 'Must be an object or array!';
}
if (importData instanceof Array) { // Must be detailed export json
importDetailedArray(importData);
} else if (importData.ship && importData.name) { // Using JSON from a single ship build export
importDetailedArray([importData]); // Convert to array with singleobject
} else { // Using Backup JSON
importBackup(importData);
}
}
} catch (e) {
$scope.errorMsg = (typeof e == 'string') ? e : 'Cannot Parse the data!';
return;
}
$scope.importValid = true;
};
$scope.hasBuild = function(shipId, name) {
return Persist.getBuild(shipId, name) !== null;
};
$scope.hasComparison = function(name) {
return Persist.getComparison(name) !== null;
};
$scope.process = function() {
var builds = $scope.builds;
for (var shipId in builds) {
for (var buildName in builds[shipId]) {
var code = builds[shipId][buildName];
// Update builds object such that orginal name retained, but can be renamed
builds[shipId][buildName] = {
code: code,
useName: buildName
};
if ($scope.builds) {
var builds = $scope.builds;
for (var shipId in builds) {
for (var buildName in builds[shipId]) {
var code = builds[shipId][buildName];
// Update builds object such that orginal name retained, but can be renamed
builds[shipId][buildName] = {
code: code,
useName: buildName
};
}
}
}
if ($scope.comparisons) {
var comparisons = $scope.comparisons;
for (var name in comparisons) {
comparisons[name].useName = name;
}
}
$scope.processed = true;
};
$scope.import = function() {
var builds = $scope.builds;
for (var shipId in builds) {
for (var buildName in builds[shipId]) {
var build = builds[shipId][buildName];
var name = build.useName.trim();
if (name) {
Persist.saveBuild(shipId, name, build.code);
if ($scope.builds) {
var builds = $scope.builds;
for (var shipId in builds) {
for (var buildName in builds[shipId]) {
var build = builds[shipId][buildName];
var name = build.useName.trim();
if (name) {
Persist.saveBuild(shipId, name, build.code);
}
}
}
}
if ($scope.comparisons) {
var comparisons = $scope.comparisons;
for (var comp in comparisons) {
var comparison = comparisons[comp];
var useName = comparison.useName.trim();
if (useName) {
Persist.saveComparison(useName, comparison.builds, comparison.facets);
}
}
}
if ($scope.discounts) {
$rootScope.discounts.ship = $scope.discounts[0];
$rootScope.discounts.components = $scope.discounts[1];
$rootScope.$broadcast('discountChange');
Persist.setDiscount($scope.discounts);
}
if ($scope.insurance) {
$rootScope.insurance.current = $scope.insurance;
Persist.setInsurance($scope.insurance);
}
$scope.$parent.dismiss();
};

View File

@@ -1,7 +1,8 @@
angular.module('app').controller('OutfitController', ['$window', '$rootScope', '$scope', '$state', '$stateParams', 'ShipsDB', 'Ship', 'Components', 'Serializer', 'Persist', function($window, $rootScope, $scope, $state, $p, Ships, Ship, Components, Serializer, Persist) {
angular.module('app').controller('OutfitController', ['$window', '$rootScope', '$scope', '$state', '$stateParams', 'ShipsDB', 'Ship', 'Components', 'Serializer', 'Persist', 'calcTotalRange', 'calcSpeed', function($window, $rootScope, $scope, $state, $p, Ships, Ship, Components, Serializer, Persist, calcTotalRange, calcSpeed) {
var win = angular.element($window); // Angularized window object for event triggering
var data = Ships[$p.shipId]; // Retrieve the basic ship properties, slots and defaults
var ship = new Ship($p.shipId, data.properties, data.slots); // Create a new Ship instance
var win = angular.element($window); // Angularized window object for event triggering
var retrofitShip = new Ship($p.shipId, data.properties, data.slots); // Create a new Ship for retrofit comparison
// Update the ship instance with the code (if provided) or the 'factory' defaults.
if ($p.code) {
@@ -30,17 +31,32 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
$scope.selectedSlot = null;
$scope.savedCode = Persist.getBuild(ship.id, $scope.buildName);
$scope.canSave = Persist.isEnabled();
$scope.allBuilds = Persist.builds;
$scope.fuel = 0;
$scope.pwrDesc = false;
$scope.pwrPredicate = 'type';
$scope.retroDesc = false;
$scope.retroPredicate = 'netCost';
$scope.costDesc = true;
$scope.costPredicate = 'c.cost';
$scope.costTab = Persist.getCostTab() || 'costs';
if ($scope.savedCode) {
Serializer.toShip(retrofitShip, $scope.savedCode); // Populate components from last save
$scope.retrofitBuild = $scope.buildName;
} else {
retrofitShip.buildWith(data.defaults);
$scope.retrofitBuild = null;
}
ship.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
retrofitShip.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
updateRetrofitCosts();
$scope.jrSeries = {
xMin: 0,
xMax: ship.cargoCapacity,
// Slightly higher than actual based bacuse components are excluded
yMax: ship.jumpRangeWithMass(ship.unladenMass),
yMax: ship.unladenRange,
yMin: 0,
func: function(cargo) { // X Axis is Cargo
return ship.jumpRangeWithMass(ship.unladenMass + $scope.fuel + cargo, $scope.fuel);
@@ -56,8 +72,52 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
title: 'Jump Range',
unit: 'LY'
}
},
watch: $scope.fsd
}
};
$scope.trSeries = {
xMin: 0,
xMax: ship.cargoCapacity,
yMax: ship.unladenTotalRange,
yMin: 0,
func: function(cargo) { // X Axis is Cargo
return calcTotalRange(ship.unladenMass + cargo, $scope.fsd.c, $scope.fuel);
}
};
$scope.trChart = {
labels: {
xAxis: {
title: 'Cargo',
unit: 'T'
},
yAxis: {
title: 'Total Range',
unit: 'LY'
}
}
};
$scope.speedSeries = {
xMin: 0,
xMax: ship.cargoCapacity,
yMax: 500,
yMin: 0,
series: ['speed', 'boost'],
func: function(cargo) { // X Axis is Cargo
return calcSpeed(ship.unladenMass + $scope.fuel + cargo, ship.speed, ship.boost, $scope.th.c);
}
};
$scope.speedChart = {
labels: {
xAxis: {
title: 'Cargo',
unit: 'T'
},
yAxis: {
title: 'Speed',
unit: 'm/s'
}
}
};
/**
@@ -83,9 +143,16 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
* @param {[type]} slot The slot object belonging to the ship instance
* @param {[type]} e The event object
*/
$scope.select = function(type, slot, e) {
$scope.select = function(type, slot, e, id) {
e.stopPropagation();
var id = angular.element(e.target).attr('cpid'); // Get component ID
if (!id) { // Find component id if not passed
var elem = e.target;
while (elem && elem !== e.currentTarget && !elem.getAttribute('cpid')) {
elem = elem.parentElement;
}
id = elem.getAttribute('cpid');
}
if (id) {
if (id == 'empty') {
@@ -100,8 +167,7 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
ship.useBulkhead(id);
}
$scope.selectedSlot = null;
$scope.code = Serializer.fromShip(ship);
updateState();
updateState(Serializer.fromShip(ship));
}
};
@@ -111,11 +177,54 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
$scope.reloadBuild = function() {
if ($scope.buildName && $scope.savedCode) {
Serializer.toShip(ship, $scope.savedCode); // Repopulate with components from last save
$scope.code = $scope.savedCode;
updateState();
updateState($scope.savedCode);
}
};
/**
* Strip ship to A-class and biggest A-class shield generator with military bulkheads
*/
$scope.aRatedBuild = function() {
for (var i = 0, l = ship.common.length - 1; i < l; i++) { // All except Fuel Tank
var id = ship.common[i].maxClass + 'A';
ship.use(ship.common[i], id, Components.common(i, id));
}
ship.hardpoints.forEach(function(slot) { ship.use(slot, null, null); });
ship.internal.forEach(function(slot) { ship.use(slot, null, null); });
ship.internal.some(function(slot) {
if (typeof slot.eligible === 'undefined') { // Assuming largest slot can hold an eligible shield
id = Components.findInternalId('Shield Generator', slot.maxClass, 'A');
ship.use(slot, id, Components.internal(id));
return true;
}
});
ship.useBulkhead(2);
updateState(Serializer.fromShip(ship));
};
/**
* Optimize for the lower mass build that can still boost and power the ship
* without power management.
*/
$scope.optimizeMassBuild = function() {
var common = ship.common;
ship.hardpoints.forEach(function(slot) { ship.use(slot, null, null); });
ship.internal.forEach(function(slot) { ship.use(slot, null, null); });
ship.useBulkhead(0);
ship.use(common[2], common[2].maxClass + 'A', Components.common(2, common[2].maxClass + 'A')); // FSD
ship.use(common[3], common[3].maxClass + 'D', Components.common(3, common[3].maxClass + 'D')); // Life Support
ship.use(common[5], common[5].maxClass + 'D', Components.common(5, common[5].maxClass + 'D')); // Sensors
var pd = $scope.availCS.lightestPowerDist(ship.boostEnergy); // Find lightest Power Distributor that can still boost
ship.use(ship.common[4], pd, Components.common(4, pd));
var th = $scope.availCS.lightestThruster(ship.ladenMass); // Find lightest Thruster that still works for the ship at max mass
ship.use(ship.common[1], th, Components.common(1, th));
var pp = $scope.availCS.lightestPowerPlant(ship.powerRetracted); // Find lightest Power plant that can power the ship
ship.use(ship.common[0], pp, Components.common(0, pp));
updateState(Serializer.fromShip(ship));
};
/**
* Save the current build. Will replace the saved build if there is one
* for this ship & with the exact name.
@@ -132,7 +241,25 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
if ($scope.code != $scope.savedCode) {
Persist.saveBuild(ship.id, $scope.buildName, $scope.code);
$scope.savedCode = $scope.code;
updateState();
if ($scope.retrofitBuild === $scope.buildName) {
Serializer.toShip(retrofitShip, $scope.code);
}
updateState($scope.code);
}
};
/**
* Export the build to detailed JSON
*/
$scope.exportBuild = function(e) {
e.stopPropagation();
if ($scope.buildName) {
$state.go('modal.export', {
title: $scope.buildName + ' Export',
description: 'A detailed JSON export of your build for use in other sites and tools',
data: Serializer.toDetailedBuild($scope.buildName, ship, $scope.code || Serializer.fromShip(ship))
});
}
};
@@ -175,27 +302,29 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
$scope.pwrPredicate = key;
};
$scope.sortRetrofit = function(key) {
$scope.retroDesc = $scope.retroPredicate == key ? !$scope.retroDesc : $scope.retroDesc;
$scope.retroPredicate = key;
};
/**
* Toggle the power on/off for the selected component
* @param {object} item The component being toggled
*/
$scope.togglePwr = function(c) {
ship.setSlotEnabled(c, !c.enabled);
$scope.code = Serializer.fromShip(ship);
updateState();
updateState(Serializer.fromShip(ship));
};
$scope.incPriority = function(c) {
if (ship.changePriority(c, c.priority + 1)) {
$scope.code = Serializer.fromShip(ship);
updateState();
updateState(Serializer.fromShip(ship));
}
};
$scope.decPriority = function(c) {
if (ship.changePriority(c, c.priority - 1)) {
$scope.code = Serializer.fromShip(ship);
updateState();
updateState(Serializer.fromShip(ship));
}
};
@@ -212,19 +341,91 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
return ship.getSlotStatus(slot, true);
};
$scope.setRetrofitBase = function() {
if ($scope.retrofitBuild) {
Serializer.toShip(retrofitShip, Persist.getBuild(ship.id, $scope.retrofitBuild));
} else {
retrofitShip.buildWith(data.defaults);
}
updateRetrofitCosts();
};
// Utilify functions
function updateState() {
function updateState(code) {
$scope.code = code;
$state.go('outfit', { shipId: ship.id, code: $scope.code, bn: $scope.buildName }, { location: 'replace', notify: false });
$scope.jrSeries.xMax = ship.cargoCapacity;
$scope.jrSeries.yMax = ship.jumpRangeWithMass(ship.unladenMass);
$scope.jrSeries.mass = ship.unladenMass;
$scope.speedSeries.xMax = $scope.trSeries.xMax = $scope.jrSeries.xMax = ship.cargoCapacity;
$scope.jrSeries.yMax = ship.unladenRange;
$scope.trSeries.yMax = ship.unladenTotalRange;
updateRetrofitCosts();
win.triggerHandler('pwrchange');
}
function updateRetrofitCosts() {
var costs = $scope.retrofitList = [];
var cName = $rootScope.cName;
var total = 0, i, l, item;
if (ship.bulkheads.id != retrofitShip.bulkheads.id) {
item = {
buyClassRating: ship.bulkheads.c.class + ship.bulkheads.c.rating,
buyName: cName(ship.bulkheads),
sellClassRating: retrofitShip.bulkheads.c.class + retrofitShip.bulkheads.c.rating,
sellName: cName(retrofitShip.bulkheads),
netCost: ship.bulkheads.discountedCost - retrofitShip.bulkheads.discountedCost
};
costs.push(item);
total += item.netCost;
}
for (var g in { common: 1, internal: 1, hardpoints: 1 }) {
var retroSlotGroup = retrofitShip[g];
var slotGroup = ship[g];
for (i = 0, l = slotGroup.length; i < l; i++) {
if (slotGroup[i].id != retroSlotGroup[i].id) {
item = { netCost: 0 };
if (slotGroup[i].id) {
item.buyName = cName(slotGroup[i]);
item.buyClassRating = slotGroup[i].c.class + slotGroup[i].c.rating;
item.netCost = slotGroup[i].discountedCost;
}
if (retroSlotGroup[i].id) {
item.sellName = cName(retroSlotGroup[i]);
item.sellClassRating = retroSlotGroup[i].c.class + retroSlotGroup[i].c.rating;
item.netCost -= retroSlotGroup[i].discountedCost;
}
costs.push(item);
total += item.netCost;
}
}
}
$scope.retrofitTotal = total;
}
$scope.updateCostTab = function(tab) {
Persist.setCostTab(tab);
$scope.costTab = tab;
};
$scope.ppWarning = function(pp) {
return pp.pGen < ship.powerRetracted;
};
$scope.pdWarning = function(pd) {
return pd.enginecapacity < ship.boostEnergy;
};
// Hide any open menu/slot/etc if the background is clicked
$scope.$on('close', function() {
$scope.selectedSlot = null;
});
// Hide any open menu/slot/etc if the background is clicked
$scope.$on('discountChange', function() {
ship.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
retrofitShip.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
updateRetrofitCosts();
});
}]);

View File

@@ -19,7 +19,8 @@ angular.module('app').directive('areaChart', ['$window', function($window) {
xAxis = d3.svg.axis().outerTickSize(0).orient('bottom').tickFormat(d3.format('.2r')),
yAxis = d3.svg.axis().ticks(6).outerTickSize(0).orient('left').tickFormat(fmt),
x = d3.scale.linear(),
y = d3.scale.linear();
y = d3.scale.linear(),
data = [];
// Create chart
var svg = d3.select(element[0]).append('svg');
@@ -61,13 +62,35 @@ angular.module('app').directive('areaChart', ['$window', function($window) {
// Create and Add tooltip
var tip = vis.append('g').style('display', 'none');
tip.append('rect').attr('width', '4em').attr('height', '2em').attr('x', '0.5em').attr('y', '-1em').attr('class', 'tip');
tip.append('rect').attr('width', '4.5em').attr('height', '2em').attr('x', '0.5em').attr('y', '-1em').attr('class', 'tip');
tip.append('circle')
.attr('class', 'marker')
.attr('r', 4);
tip.append('text').attr('class', 'label x').attr('y', '-0.25em');
tip.append('text').attr('class', 'label y').attr('y', '0.85em');
vis.insert('path', ':first-child') // Area/Path to appear behind everything else
.data([data])
.attr('class', 'area')
.attr('fill', 'url(#gradient)')
.attr('d', area)
.on('mouseover', showTip)
.on('mouseout', hideTip)
.on('mousemove', moveTip)
.call(drag);
drag
.on('dragstart', function() {
dragging = true;
moveTip.call(this);
showTip();
})
.on('dragend', function() {
dragging = false;
hideTip();
})
.on('drag', moveTip);
/**
* Watch for changes in the series data (mass changes, etc)
*/
@@ -78,8 +101,9 @@ angular.module('app').directive('areaChart', ['$window', function($window) {
var width = element[0].parentElement.offsetWidth,
height = width * 0.5,
w = width - margin.left - margin.right,
h = height - margin.top - margin.bottom,
data = [];
h = height - margin.top - margin.bottom;
data.length = 0; // Reset Data array
if (series.xMax == series.xMin) {
var yVal = func(series.xMin);
@@ -95,7 +119,7 @@ angular.module('app').directive('areaChart', ['$window', function($window) {
// Update Chart Size
svg.attr('width', width).attr('height', height);
// Update domain and scale for axes;
// Update domain and scale for axes
x.range([0, w]).domain([series.xMin, series.xMax]).clamp(true);
xAxis.scale(x);
xLbl.attr('transform', 'translate(0,' + h + ')');
@@ -106,30 +130,9 @@ angular.module('app').directive('areaChart', ['$window', function($window) {
vis.selectAll('.y.axis').call(yAxis);
vis.selectAll('.x.axis').call(xAxis);
// Remove existing elements
vis.selectAll('path.area').remove();
vis.insert('path', ':first-child') // Area/Path to appear behind everything else
.datum(data)
.attr('class', 'area')
.attr('fill', 'url(#gradient)')
.attr('d', area)
.on('mouseover', showTip)
.on('mouseout', hideTip)
.on('mousemove', moveTip)
.call(drag);
drag
.on('dragstart', function() {
dragging = true;
moveTip.call(this);
showTip();
})
.on('dragend', function() {
dragging = false;
hideTip();
})
.on('drag', moveTip);
vis.selectAll('path.area') // Area/Path to appear behind everything else
.data([data])
.attr('d', area);
}
function showTip() {
@@ -143,10 +146,10 @@ angular.module('app').directive('areaChart', ['$window', function($window) {
}
function moveTip() {
var xPos = d3.mouse(this)[0], x0 = x.invert(xPos), y0 = func(x0), flip = (x0 / x.domain()[1] > 0.75);
var xPos = d3.mouse(this)[0], x0 = x.invert(xPos), y0 = func(x0), flip = (x0 / x.domain()[1] > 0.65);
tip.attr('transform', 'translate(' + x(x0) + ',' + y(y0) + ')');
tip.selectAll('rect').attr('x', flip ? '-4.5em' : '0.5em').style('text-anchor', flip ? 'end' : 'start');
tip.selectAll('text.label').attr('x', flip ? '-1em' : '1em').style('text-anchor', flip ? 'end' : 'start');
tip.selectAll('rect').attr('x', flip ? '-5.75em' : '0.5em').style('text-anchor', flip ? 'end' : 'start');
tip.selectAll('text.label').attr('x', flip ? '-2em' : '1em').style('text-anchor', flip ? 'end' : 'start');
tip.select('text.label.x').text(fmtLong(x0) + ' ' + labels.xAxis.unit);
tip.select('text.label.y').text(fmtLong(y0) + ' ' + labels.yAxis.unit);
}

View File

@@ -2,13 +2,13 @@ angular.module('app').directive('componentSelect', function() {
// Generting the HTML in this manner is MUCH faster than using an angular template.
function appendGroup(list, opts, cid, mass) {
function appendGroup(list, opts, cid, mass, checkWarning) {
var prevClass = null, prevRating = null;
for (var i = 0; i < opts.length; i++) {
var o = opts[i];
var id = o.id || (o.class + o.rating); // Common components' ID is their class and rating
if (i > 0 && opts.length > 3 && o.class != prevClass && (!o.grp || o.rating != prevRating || o.mode)) {
if (i > 0 && opts.length > 4 && o.class != prevClass && (o.rating != prevRating || o.mode)) {
list.push('<br/>');
}
@@ -18,13 +18,17 @@ angular.module('app').directive('componentSelect', function() {
list.push(' active');
}
list.push((o.maxmass && mass > o.maxmass) ? ' disabled"' : '" cpid="', id, '">');
if (o.mode) {
list.push('<svg cpid="', id, '" class="icon lg"><use xlink:href="#mount-', o.mode, '"></use></svg> ');
if (checkWarning && checkWarning(opts[i])) {
list.push(' warning');
}
list.push(o.class, o.rating);
list.push((o.maxmass && (mass + (o.mass ? o.mass : 0)) > o.maxmass) ? ' disabled"' : '" cpid="', id, '">');
if (o.mode) {
list.push('<svg class="icon lg"><use xlink:href="#mount-', o.mode, '"></use></svg> ');
}
list.push('<span>', o.class, o.rating);
if (o.missile) {
list.push('/' + o.missile);
@@ -35,7 +39,7 @@ angular.module('app').directive('componentSelect', function() {
list.push(' ' + o.name);
}
list.push('</li>');
list.push('</span></li>');
prevClass = o.class;
prevRating = o.rating;
}
@@ -46,8 +50,9 @@ angular.module('app').directive('componentSelect', function() {
scope: {
opts: '=', // Component Options object
groups: '=', // Groups of Component Options
mass: '=', // Current ship unladen mass
s: '=' // Current Slot
mass: '=', // Current ship mass
s: '=', // Current Slot
warning: '=' // Check warning function
},
link: function(scope, element) {
var list = [];
@@ -55,7 +60,7 @@ angular.module('app').directive('componentSelect', function() {
var component = scope.s.c; // Slot's Current Component (may be null/undefined)
var opts = scope.opts;
var groups = scope.groups;
var mass = scope.mass || 0;
var mass = (scope.mass ? scope.mass : 0) - (component && component.mass ? component.mass : 0); // Mass minus the currently selected component
if (groups) {
// At present time slots with grouped options (Hardpoints and Internal) can be empty
@@ -64,12 +69,12 @@ angular.module('app').directive('componentSelect', function() {
var grp = groups[g];
var grpCode = grp[Object.keys(grp)[0]].grp; // Nasty operation to get the grp property of the first/any single component
list.push('<div id="', grpCode, '" class="select-group">', g, '</div><ul>');
appendGroup(list, grp, cid, mass);
appendGroup(list, grp, cid, mass, scope.warning);
list.push('</ul>');
}
} else {
list.push('<ul>');
appendGroup(list, opts, cid, mass);
appendGroup(list, opts, cid, mass, scope.warning);
list.push('</ul>');
}

View File

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

View File

@@ -1,4 +1,4 @@
angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', 'Persist', 'ShipsDB', function(_, $rootScope, Persist, ships) {
angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', '$state', 'Persist', 'Serializer', 'ShipsDB', function(_, $rootScope, $state, Persist, Serializer, ships) {
return {
restrict: 'E',
@@ -12,28 +12,11 @@ angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', 'Pers
scope.allComparisons = Persist.comparisons;
scope.bs = Persist.state;
// Insurance options and management here for now.
$rootScope.insurance = {
opts: [
{ name: 'Standard', pct: 0.05 },
{ name: 'Alpha', pct: 0.025 },
{ name: 'Beta', pct: 0.035 }
]
};
var insIndex = _.findIndex($rootScope.insurance.opts, 'name', Persist.getInsurance());
var savedDiscounts = Persist.getDiscount() || [1, 1];
$rootScope.insurance.current = $rootScope.insurance.opts[insIndex != -1 ? insIndex : 0];
// Close menus if a navigation change event occurs
$rootScope.$on('$stateChangeStart', function() {
scope.openedMenu = null;
});
// Listen to close event to close opened menus or modals
$rootScope.$on('close', function() {
scope.openedMenu = null;
$rootScope.showAbout = false;
});
$rootScope.discounts.ship = savedDiscounts[0];
$rootScope.discounts.components = savedDiscounts[1];
/**
* Save selected insurance option
@@ -42,6 +25,36 @@ angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', 'Pers
Persist.setInsurance($rootScope.insurance.current.name);
};
/**
* Save selected discount option
*/
scope.updateDiscount = function() {
Persist.setDiscount([$rootScope.discounts.ship, $rootScope.discounts.components]);
$rootScope.$broadcast('discountChange');
};
scope.backup = function(e) {
e.preventDefault();
e.stopPropagation();
scope.openedMenu = null;
$state.go('modal.export', {
title: 'Backup',
data: Persist.getAll(),
description: 'Backup of all Coriolis data to save or transfer to another browser/device'
});
};
scope.detailedExport = function(e) {
e.preventDefault();
e.stopPropagation();
scope.openedMenu = null;
$state.go('modal.export', {
title: 'Detailed Export',
data: Serializer.toDetailedExport(scope.allBuilds),
description: 'Detailed export of all builds for use with other tools and sites'
});
};
scope.openMenu = function(e, menu) {
e.stopPropagation();
if (menu == scope.openedMenu) {
@@ -56,16 +69,15 @@ angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', 'Pers
scope.openedMenu = menu;
};
scope.about = function(e) {
e.preventDefault();
e.stopPropagation();
// Close menus if a navigation change event occurs
$rootScope.$on('$stateChangeStart', function() {
scope.openedMenu = null;
$rootScope.showAbout = true;
};
});
$rootScope.hideAbout = function() {
$rootScope.showAbout = false;
};
// Listen to close event to close opened menus or modals
$rootScope.$on('close', function() {
scope.openedMenu = null;
});
scope.$watchCollection('allBuilds', function() {
scope.buildsList = Object.keys(scope.allBuilds).sort();

View File

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

View File

@@ -0,0 +1,9 @@
angular.module('app').directive('loader', function() {
return {
restrict: 'A',
link: function(scope, element) {
element.addClass('loader');
element.html('<svg viewbox="0 0 40 40" width="100%" height="100%"><path d="m5,8l5,8l5,-8z" class="l1 d1" /><path d="m5,8l5,-8l5,8z" class="l1 d2" /><path d="m10,0l5,8l5,-8z" class="l1 d3" /><path d="m15,8l5,-8l5,8z" class="l1 d4" /><path d="m20,0l5,8l5,-8z" class="l1 d5" /><path d="m25,8l5,-8l5,8z" class="l1 d6" /><path d="m25,8l5,8l5,-8z" class="l1 d7" /><path d="m30,16l5,-8l5,8z" class="l1 d8" /><path d="m30,16l5,8l5,-8z" class="l1 d9" /><path d="m25,24l5,-8l5,8z" class="l1 d10" /><path d="m25,24l5,8l5,-8z" class="l1 d11" /><path d="m20,32l5,-8l5,8z" class="l1 d13" /><path d="m15,24l5,8l5,-8z" class="l1 d14" /><path d="m10,32l5,-8l5,8z" class="l1 d15" /><path d="m5,24l5,8l5,-8z" class="l1 d16" /><path d="m5,24l5,-8l5,8z" class="l1 d17" /><path d="m0,16l5,8l5,-8z" class="l1 d18" /><path d="m0,16l5,-8l5,8z" class="l1 d20" /><path d="m10,16l5,-8l5,8z" class="l2 d0" /><path d="m15,8l5,8l5,-8z" class="l2 d3" /><path d="m20,16l5,-8l5,8z" class="l2 d6" /><path d="m20,16l5,8l5,-8z" class="l2 d9" /><path d="m15,24l5,-8l5,8z" class="l2 d12" /><path d="m10,16l5,8l5,-8z" class="l2 d15" /></svg>');
}
};
});

View File

@@ -8,6 +8,7 @@ angular.module('app').directive('powerBands', ['$window', function($window) {
link: function(scope, element) {
var margin = { top: 20, right: 130, bottom: 20, left: 40 },
barHeight = 20,
bands = null,
innerHeight = (barHeight * 2) + 3,
height = innerHeight + margin.top + margin.bottom + 1,
wattScale = d3.scale.linear(),
@@ -19,8 +20,17 @@ angular.module('app').directive('powerBands', ['$window', function($window) {
// Create chart
svg = d3.select(element[0]).append('svg'),
vis = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'),
deployed = vis.append('g'),
retracted = vis.append('g');
deployed = vis.append('g').attr('class', 'power-band'),
retracted = vis.append('g').attr('class', 'power-band');
svg.on('contextmenu', function() {
d3.event.preventDefault();
for (var i = 0, l = bands.length; i < l; i++) {
bands[i].retSelected = false;
bands[i].depSelected = false;
}
render();
});
// Create Y Axis SVG Elements
vis.append('g').attr('class', 'watt axis');
@@ -36,12 +46,17 @@ angular.module('app').directive('powerBands', ['$window', function($window) {
angular.element($window).bind('orientationchange resize pwrchange', render);
function render() {
var bands = scope.bands,
available = scope.available,
bands = scope.bands;
var available = scope.available,
width = element[0].offsetWidth,
w = width - margin.left - margin.right,
maxBand = bands[bands.length - 1],
maxPwr = Math.max(available, maxBand.deployedSum);
deployedSum = 0,
retractedSum = 0,
retBandsSelected = false,
depBandsSelected = false,
maxPwr = Math.max(available, maxBand.retractedSum, maxBand.deployedSum);
// Update chart size
svg.attr('width', width).attr('height', height);
@@ -55,50 +70,80 @@ angular.module('app').directive('powerBands', ['$window', function($window) {
// Update X & Y Axis
wattScale.range([0, w]).domain([0, maxPwr]).clamp(true);
pctScale.range([0, w]).domain([0, maxPwr / available]).clamp(true);
vis.selectAll('.watt.axis').call(wattAxis);
vis.selectAll('.pct.axis').attr('transform', 'translate(0,' + innerHeight + ')').call(pctAxis);
retLbl
.attr('x', w + 5 )
.attr('class', maxBand.retractedSum > available ? 'warning' : 'primary')
.text(wattFmt(Math.max(0, maxBand.retractedSum)) + ' (' + pctFmt(Math.max(0, maxBand.retractedSum / available)) + ')');
for (var b = 0, l = bands.length; b < l; b++) {
if (bands[b].retSelected) {
retractedSum += bands[b].retracted + bands[b].retOnly;
retBandsSelected = true;
}
if (bands[b].depSelected) {
deployedSum += bands[b].deployed + bands[b].retracted;
depBandsSelected = true;
}
}
depLbl
.attr('x', w + 5 )
.attr('class', maxBand.deployedSum > available ? 'warning' : 'primary')
.text(wattFmt(Math.max(0, maxBand.deployedSum)) + ' (' + pctFmt(Math.max(0, maxBand.deployedSum / available)) + ')');
updateLabel(retLbl, w, retBandsSelected, retBandsSelected ? retractedSum : maxBand.retractedSum, available);
updateLabel(depLbl, w, depBandsSelected, depBandsSelected ? deployedSum : maxBand.deployedSum, available);
retracted.selectAll('rect').data(bands).enter().append('rect')
.attr('height', barHeight)
.attr('width', function(d) { return Math.max(wattScale(d.retracted) - 1, 0); })
.attr('x', function(d) { return wattScale(d.retractedSum) - wattScale(d.retracted); })
.attr('width', function(d) { return Math.max(wattScale(d.retracted + d.retOnly) - 1, 0); })
.attr('x', function(d) { return wattScale(d.retractedSum) - wattScale(d.retracted + d.retOnly); })
.attr('y', 1)
.attr('class', function(d) { return (d.retractedSum > available) ? 'warning' : 'primary'; });
.on('click', function(d) {
d.retSelected = !d.retSelected;
render();
})
.attr('class', function(d) { return getClass(d.retSelected, d.retractedSum, available); });
retracted.selectAll('text').data(bands).enter().append('text')
.attr('x', function(d) { return wattScale(d.retractedSum) - (wattScale(d.retracted) / 2); })
.attr('x', function(d) { return wattScale(d.retractedSum) - (wattScale(d.retracted + d.retOnly) / 2); })
.attr('y', 15)
.style('text-anchor', 'middle')
.attr('class', 'primary-bg')
.text(function(d, i) { return bandText(d.retracted, i); });
.on('click', function(d) {
d.retSelected = !d.retSelected;
render();
})
.text(function(d, i) { return bandText(d.retracted + d.retOnly, i); });
deployed.selectAll('rect').data(bands).enter().append('rect')
.attr('height', barHeight)
.attr('width', function(d) { return Math.max(wattScale(d.deployed + d.retracted) - 1, 0); })
.attr('x', function(d) { return wattScale(d.deployedSum) - wattScale(d.retracted) - wattScale(d.deployed); })
.attr('y', barHeight + 2)
.attr('class', function(d) { return (d.deployedSum > available) ? 'warning' : 'primary'; });
.on('click', function(d) {
d.depSelected = !d.depSelected;
render();
})
.attr('class', function(d) { return getClass(d.depSelected, d.deployedSum, available); });
deployed.selectAll('text').data(bands).enter().append('text')
.attr('x', function(d) { return wattScale(d.deployedSum) - ((wattScale(d.retracted) + wattScale(d.deployed)) / 2); })
.attr('y', barHeight + 17)
.style('text-anchor', 'middle')
.attr('class', 'primary-bg')
.on('click', function(d) {
d.depSelected = !d.depSelected;
render();
})
.text(function(d, i) { return bandText(d.deployed + d.retracted, i); });
}
function updateLabel(lbl, width, selected, sum, available) {
lbl
.attr('x', width + 5 )
.attr('class', getClass(selected, sum, available))
.text(wattFmt(Math.max(0, sum)) + ' (' + pctFmt(Math.max(0, sum / available)) + ')');
}
function getClass(selected, sum, available) {
return selected ? 'secondary' : (sum > available) ? 'warning' : 'primary';
}
function bandText(val, index) {
if (val > 0 && wattScale(val) > 13) {
return index + 1;

View File

@@ -8,7 +8,7 @@ angular.module('app').directive('slider', ['$window', function($window) {
change: '&onChange'
},
link: function(scope, element) {
var margin = { top: -10, right: 140, bottom: 0, left: 50 },
var margin = { top: -10, right: 145, bottom: 0, left: 50 },
height = 40, // Height is fixed
h = height - margin.top - margin.bottom,
fmt = d3.format('.2f'),

View File

@@ -4,6 +4,9 @@
angular.module('app').service('Persist', ['$window', 'lodash', function($window, _) {
var LS_KEY_BUILDS = 'builds';
var LS_KEY_COMPARISONS = 'comparisons';
var LS_KEY_COST_TAB = 'costTab';
var LS_KEY_INSURANCE = 'insurance';
var LS_KEY_DISCOUNTS = 'discounts';
var localStorage = $window.localStorage;
var buildJson = null;
var comparisonJson = null;
@@ -117,7 +120,7 @@ angular.module('app').service('Persist', ['$window', 'lodash', function($window,
}
this.comparisons[name] = {
facets: facets,
builds: _.map(builds, function(b) { return { shipId: b.id, buildName: b.buildName }; })
builds: _.map(builds, function(b) { return { shipId: b.id || b.shipId, buildName: b.buildName }; })
};
localStorage.setItem(LS_KEY_COMPARISONS, angular.toJson(this.comparisons));
this.state.hasComparisons = true;
@@ -162,13 +165,23 @@ angular.module('app').service('Persist', ['$window', 'lodash', function($window,
}
};
this.getAll = function() {
var data = {};
data[LS_KEY_BUILDS] = this.builds;
data[LS_KEY_COMPARISONS] = this.comparisons;
data[LS_KEY_INSURANCE] = this.getInsurance();
data[LS_KEY_DISCOUNTS] = this.getDiscount();
return data;
};
/**
* Get the saved insurance type
* @return {string} The name of the saved insurance type of null
*/
this.getInsurance = function() {
if (this.lsEnabled) {
return localStorage.getItem('insurance');
return localStorage.getItem(LS_KEY_INSURANCE);
}
return null;
};
@@ -179,10 +192,52 @@ angular.module('app').service('Persist', ['$window', 'lodash', function($window,
*/
this.setInsurance = function(name) {
if (this.lsEnabled) {
return localStorage.setItem('insurance', name);
return localStorage.setItem(LS_KEY_INSURANCE, name);
}
};
/**
* Persist selected discount
* @param {number} val Discount value/amount
*/
this.setDiscount = function(val) {
if (this.lsEnabled) {
return localStorage.setItem(LS_KEY_DISCOUNTS, angular.toJson(val));
}
};
/**
* Get the saved discount
* @return {number} val Discount value/amount
*/
this.getDiscount = function() {
if (this.lsEnabled) {
return angular.fromJson(localStorage.getItem(LS_KEY_DISCOUNTS));
}
return null;
};
/**
* Persist selected cost tab
* @param {number} val Discount value/amount
*/
this.setCostTab = function(tabName) {
if (this.lsEnabled) {
return localStorage.setItem(LS_KEY_COST_TAB, tabName);
}
};
/**
* Get the saved discount
* @return {number} val Discount value/amount
*/
this.getCostTab = function() {
if (this.lsEnabled) {
return localStorage.getItem(LS_KEY_COST_TAB);
}
return null;
};
/**
* Retrieve the last router state from local storage
* @param {object} state State object containing state name and params

View File

@@ -1,7 +1,7 @@
/**
* Service managing seralization and deserialization of models for use in URLs and persistene.
*/
angular.module('app').service('Serializer', ['lodash', function(_) {
angular.module('app').service('Serializer', ['lodash', 'GroupMap', 'MountMap', 'ShipsDB', 'Ship', 'Components', '$state', function(_, GroupMap, MountMap, ShipsDB, Ship, Components, $state) {
/**
* Serializes the ships selected components for all slots to a URL friendly string.
@@ -32,8 +32,8 @@ angular.module('app').service('Serializer', ['lodash', function(_) {
* Updates an existing ship instance's slots with components determined by the
* code.
*
* @param {Ship} ship The ship instance to be updated
* @param {string} code The string to deserialize
* @param {Ship} ship The ship instance to be updated
* @param {string} dataString The string to deserialize
*/
this.toShip = function(ship, dataString) {
var common = new Array(ship.common.length),
@@ -54,10 +54,6 @@ angular.module('app').service('Serializer', ['lodash', function(_) {
decodeToArray(code, internal, decodeToArray(code, hardpoints, decodeToArray(code, common, 1)));
// get the remaining substring / split into parts for
// - priorities
// - enabled/disabled
ship.buildWith(
{
bulkheads: code.charAt(0) * 1,
@@ -70,6 +66,103 @@ angular.module('app').service('Serializer', ['lodash', function(_) {
);
};
this.toDetailedBuild = function(buildName, ship, code) {
var standard = ship.common,
hardpoints = ship.hardpoints,
internal = ship.internal;
var data = {
$schema: 'http://cdn.coriolis.io/schemas/ship-loadout/1.json#',
name: buildName,
ship: ship.name,
references: [{
name: 'Coriolis.io',
url: $state.href('outfit', { shipId: ship.id, code: code, bn: buildName }, { absolute: true }),
code: code,
shipId: ship.id
}],
components: {
standard: {
bulkheads: ship.bulkheads.c.name,
powerPlant: { class: standard[0].c.class, rating: standard[0].c.rating },
thrusters: { class: standard[1].c.class, rating: standard[1].c.rating },
frameShiftDrive: { class: standard[2].c.class, rating: standard[2].c.rating },
lifeSupport: { class: standard[3].c.class, rating: standard[3].c.rating },
powerDistributor: { class: standard[4].c.class, rating: standard[4].c.rating },
sensors: { class: standard[5].c.class, rating: standard[5].c.rating },
fuelTank: { class: standard[6].c.class, rating: standard[6].c.rating }
},
hardpoints: _.map(_.filter(hardpoints, function(slot) { return slot.maxClass > 0; }), slotToSchema),
utility: _.map(_.filter(hardpoints, function(slot) { return slot.maxClass === 0; }), slotToSchema),
internal: _.map(internal, slotToSchema)
},
stats: {}
};
for (var stat in ship) {
if (!isNaN(ship[stat])) {
data.stats[stat] = Math.round(ship[stat] * 100) / 100;
}
}
return data;
};
this.fromDetailedBuild = function(detailedBuild) {
var shipId = _.findKey(ShipsDB, { properties: { name: detailedBuild.ship } });
if (!shipId) {
throw 'No such ship: ' + detailedBuild.ship;
}
var comps = detailedBuild.components;
var shipData = ShipsDB[shipId];
var ship = new Ship(shipId, shipData.properties, shipData.slots);
var bulkheads = Components.bulkheadIndex(comps.standard.bulkheads);
if (bulkheads < 0) {
throw 'Invalid bulkheads: ' + comps.standard.bulkheads;
}
var common = _.map(
['powerPlant', 'thrusters', 'frameShiftDrive', 'lifeSupport', 'powerDistributor', 'sensors', 'fuelTank'],
function(c) {
if (!comps.standard[c].class || !comps.standard[c].rating) {
throw 'Invalid value for ' + c;
}
return comps.standard[c].class + comps.standard[c].rating;
}
);
var internal = _.map(comps.internal, function(c) { return c ? Components.findInternalId(c.group, c.class, c.rating, c.name) : 0; });
var hardpoints = _.map(comps.hardpoints, function(c) {
return c ? Components.findHardpointId(c.group, c.class, c.rating, c.name, MountMap[c.mount], c.missile) : 0;
});
hardpoints = hardpoints.concat(_.map(comps.utility, function(c) {
return c ? Components.findHardpointId(c.group, c.class, c.rating, c.name, MountMap[c.mount]) : 0;
}));
ship.buildWith({ bulkheads: bulkheads, common: common, hardpoints: hardpoints, internal: internal });
return ship;
};
this.toDetailedExport = function(builds) {
var data = [];
for (var shipId in builds) {
for (var buildName in builds[shipId]) {
var code = builds[shipId][buildName];
var shipData = ShipsDB[shipId];
var ship = new Ship(shipId, shipData.properties, shipData.slots);
this.toShip(ship, code);
data.push(this.toDetailedBuild(buildName, ship, code));
}
}
return data;
};
this.fromComparison = function(name, builds, facets, predicate, desc) {
var shipBuilds = [];
@@ -118,4 +211,22 @@ angular.module('app').service('Serializer', ['lodash', function(_) {
return codePos;
}
function slotToSchema(slot) {
if (slot.c) {
var o = { class: slot.c.class, rating: slot.c.rating, group: GroupMap[slot.c.grp] };
if (slot.c.name) {
o.name = slot.c.name;
}
if (slot.c.mode) {
o.mount = MountMap[slot.c.mode];
}
if (slot.c.missile) {
o.missile = slot.c.missile;
}
return o;
}
return null;
}
}]);

View File

@@ -6,6 +6,13 @@ angular.module('shipyard').factory('ComponentSet', ['lodash', function(_) {
});
}
function getKey(maxClass, eligible) {
if (eligible) {
return maxClass + Object.keys(eligible).join('-');
}
return maxClass;
}
function ComponentSet(components, mass, maxCommonArr, maxInternal, maxHardPoint) {
this.mass = mass;
this.common = {};
@@ -14,53 +21,112 @@ angular.module('shipyard').factory('ComponentSet', ['lodash', function(_) {
this.hpClass = {};
this.intClass = {};
for (var i = 0; i < components.common.length; i++) {
var max = maxCommonArr[i];
switch (i) {
// Slots where component class must be equal to slot class
case 3: // Life Support
case 5: // Sensors
this.common[i] = filter(components.common[i], max, max, this.mass);
break;
// Other slots can have a component of class lower than the slot class
default:
this.common[i] = filter(components.common[i], max, 0, this.mass);
}
}
this.common[0] = filter(components.common[0], maxCommonArr[0], 0, mass); // Power Plant
this.common[2] = filter(components.common[2], maxCommonArr[2], 0, mass); // FSD
this.common[4] = filter(components.common[4], maxCommonArr[4], 0, mass); // Power Distributor
this.common[6] = filter(components.common[6], maxCommonArr[6], 0, mass); // Fuel Tank
// Thrusters, filter components by class only (to show full list of ratings for that class)
var minThrusterClass = _.reduce(components.common[1], function(minClass, thruster) {
return (thruster.maxmass >= mass && thruster.class < minClass) ? thruster.class : minClass;
}, maxCommonArr[1]);
this.common[1] = filter(components.common[1], maxCommonArr[1], minThrusterClass, 0); // Thrusters
// Slots where component class must be equal to slot class
this.common[3] = filter(components.common[3], maxCommonArr[3], maxCommonArr[3], 0); // Life Supprt
this.common[5] = filter(components.common[5], maxCommonArr[5], maxCommonArr[5], mass); // Sensors
for (var h in components.hardpoints) {
this.hardpoints[h] = filter(components.hardpoints[h], maxHardPoint, 0, this.mass);
this.hardpoints[h] = filter(components.hardpoints[h], maxHardPoint, 0, mass);
}
for (var g in components.internal) {
this.internal[g] = filter(components.internal[g], maxInternal, 0, this.mass);
this.internal[g] = filter(components.internal[g], maxInternal, 0, mass);
}
/**
* Create a memoized function for determining the components that are
* eligible for an internal slot
* @param {integer} c The max class component that can be mounted in the slot
* @param {Object} eligible) The map of eligible internal groups
* @return {object} A map of all eligible components by group
*/
this.getInts = _.memoize(
function(c, eligible) {
var o = {};
for (var key in this.internal) {
if (eligible && !eligible[key]) {
continue;
}
var data = filter(this.internal[key], c, 0, this.mass);
if (data.length) { // If group is not empty
o[key] = data;
}
}
return o;
},
getKey
);
/**
* Create a memoized function for determining the components that are
* eligible for an hardpoint slot
* @param {integer} c The max class component that can be mounted in the slot
* @param {Object} eligible) The map of eligible hardpoint groups
* @return {object} A map of all eligible components by group
*/
this.getHps = _.memoize(
function(c, eligible) {
var o = {};
for (var key in this.hardpoints) {
if (eligible && !eligible[key]) {
continue;
}
var data = filter(this.hardpoints[key], c, c ? 1 : 0, this.mass);
if (data.length) { // If group is not empty
o[key] = data;
}
}
return o;
},
getKey
);
}
ComponentSet.prototype.getHps = function(c) {
if (!this.hpClass[c]) {
var o = this.hpClass[c] = {};
for (var key in this.hardpoints) {
var data = filter(this.hardpoints[key], c, c ? 1 : 0, this.mass);
if (data.length) { // If group is not empty
o[key] = data;
}
ComponentSet.prototype.lightestPowerDist = function(boostEnergy) {
var pds = this.common[4];
var pd = pds[0];
for (var i = 1; i < pds.length; i++) {
if (pds[i].mass < pd.mass && pds[i].enginecapacity >= boostEnergy) {
pd = pds[i];
}
}
return this.hpClass[c];
return pd.class + pd.rating;
};
ComponentSet.prototype.getInts = function(c) {
if (!this.intClass[c]) {
var o = this.intClass[c] = {};
for (var key in this.internal) {
var data = filter(this.internal[key], c, 0, this.mass);
if (data.length) { // If group is not empty
o[key] = data;
}
ComponentSet.prototype.lightestThruster = function(ladenMass) {
var ths = this.common[1];
var th = ths[0];
for (var i = 1; i < ths.length; i++) {
if (ths[i].mass < th.mass && ths[i].maxmass >= ladenMass) {
th = ths[i];
}
}
return this.intClass[c];
return th.class + th.rating;
};
ComponentSet.prototype.lightestPowerPlant = function(powerUsed) {
var pps = this.common[0];
var pp = null;
for (var i = 0; i < pps.length; i++) {
if (pp == null || (pps[i].mass < pp.mass && pps[i].pGen >= powerUsed)) {
pp = pps[i];
}
}
return pp.class + (pp.rating != 'D' ? 'A' : 'D'); // Use A rated if C,E
};
return ComponentSet;

View File

@@ -1,4 +1,22 @@
angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength', 'calcJumpRange', 'lodash', function(Components, calcShieldStrength, calcJumpRange, _) {
angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength', 'calcJumpRange', 'calcTotalRange', 'lodash', 'ArmourMultiplier', function(Components, calcShieldStrength, calcJumpRange, calcTotalRange, _, ArmourMultiplier) {
/**
* Returns the power usage type of a slot and it's particular component
* @param {object} slot The Slot
* @param {object} component The component in the slot
* @return {string} The key for the power usage type
*/
function powerUsageType(slot, component) {
if (component) {
if (component.retractedOnly) {
return 'retOnly';
}
if (component.passive) {
return 'retracted';
}
}
return slot.cat != 1 ? 'retracted' : 'deployed';
}
/**
* Ship model used to track all ship components and properties.
@@ -18,10 +36,15 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
var slotGroup = slots[slotType];
var group = this[slotType] = []; // Initialize Slot group (Common, Hardpoints, Internal)
for (var i = 0; i < slotGroup.length; i++) {
group.push({ id: null, c: null, incCost: true, maxClass: slotGroup[i] });
if (typeof slotGroup[i] == 'object') {
group.push({ id: null, c: null, incCost: true, maxClass: slotGroup[i].class, eligible: slotGroup[i].eligible });
} else {
group.push({ id: null, c: null, incCost: true, maxClass: slotGroup[i] });
}
}
}
this.c = { incCost: true, c: { name: this.name, cost: this.cost } }; // Make a 'Ship' component similar to other components
// Make a Ship 'slot'/item similar to other slots
this.c = { incCost: true, type: 'SHIP', discountedCost: this.hullCost, c: { name: this.name, cost: this.hullCost } };
this.costList = _.union(this.internal, this.common, this.hardpoints);
this.costList.push(this.bulkheads); // Add The bulkheads
@@ -36,23 +59,16 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
this.powerList.unshift(this.common[2]); // Add FSD
this.powerList.unshift(this.common[0]); // Add Power Plant
this.priorityBands = [
{ deployed: 0, retracted: 0 },
{ deployed: 0, retracted: 0 },
{ deployed: 0, retracted: 0 },
{ deployed: 0, retracted: 0 },
{ deployed: 0, retracted: 0 }
];
this.shipCostMultiplier = 1;
this.componentCostMultiplier = 1;
// Cumulative and aggragate stats
this.fuelCapacity = 0;
this.cargoCapacity = 0;
this.ladenMass = 0;
this.armourAdded = 0;
this.shieldMultiplier = 1;
this.totalCost = this.cost;
this.unladenMass = this.mass;
this.armourTotal = this.armour;
this.priorityBands = [
{ deployed: 0, retracted: 0, retOnly: 0 },
{ deployed: 0, retracted: 0, retOnly: 0 },
{ deployed: 0, retracted: 0, retOnly: 0 },
{ deployed: 0, retracted: 0, retOnly: 0 },
{ deployed: 0, retracted: 0, retOnly: 0 }
];
}
/**
@@ -67,13 +83,26 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
cl = common.length,
i, l;
this.useBulkhead(comps.bulkheads || 0, true);
// Reset Cumulative stats
this.fuelCapacity = 0;
this.cargoCapacity = 0;
this.ladenMass = 0;
this.armourAdded = 0;
this.armourMultiplier = 1;
this.shieldMultiplier = 1;
this.totalCost = this.c.incCost ? this.c.discountedCost : 0;
this.unladenMass = this.hullMass;
this.totalDps = 0;
this.bulkheads.c = null;
this.useBulkhead(comps && comps.bulkheads ? comps.bulkheads : 0, true);
this.cargoScoop.priority = priorities ? priorities[0] * 1 : 0;
this.cargoScoop.enabled = enabled ? enabled[0] * 1 : true;
for (i = 0, l = this.priorityBands.length; i < l; i++) {
this.priorityBands[i].deployed = 0;
this.priorityBands[i].retracted = 0;
this.priorityBands[i].retOnly = 0;
}
if (this.cargoScoop.enabled) {
@@ -81,11 +110,16 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
}
for (i = 0; i < cl; i++) {
common[i].cat = 0;
common[i].enabled = enabled ? enabled[i + 1] * 1 : true;
common[i].priority = priorities ? priorities[i + 1] * 1 : 0;
common[i].type = 'SYS';
common[i].c = common[i].id = null; // Resetting 'old' component if there was one
this.use(common[i], comps.common[i], Components.common(i, comps.common[i]), true);
common[i].discountedCost = 0;
if (comps) {
this.use(common[i], comps.common[i], Components.common(i, comps.common[i]), true);
}
}
common[1].type = 'ENG'; // Thrusters
@@ -93,12 +127,14 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
cl++; // Increase accounts for Cargo Scoop
for (i = 0, l = hps.length; i < l; i++) {
hps[i].cat = 1;
hps[i].enabled = enabled ? enabled[cl + i] * 1 : true;
hps[i].priority = priorities ? priorities[cl + i] * 1 : 0;
hps[i].type = hps[i].maxClass ? 'WEP' : 'SYS';
hps[i].c = hps[i].id = null; // Resetting 'old' component if there was one
hps[i].discountedCost = 0;
if (comps.hardpoints[i] !== 0) {
if (comps && comps.hardpoints[i] !== 0) {
this.use(hps[i], comps.hardpoints[i], Components.hardpoints(comps.hardpoints[i]), true);
}
}
@@ -106,26 +142,32 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
cl += hps.length; // Increase accounts for hardpoints
for (i = 0, l = internal.length; i < l; i++) {
internal[i].cat = 2;
internal[i].enabled = enabled ? enabled[cl + i] * 1 : true;
internal[i].priority = priorities ? priorities[cl + i] * 1 : 0;
internal[i].type = 'SYS';
internal[i].id = internal[i].c = null; // Resetting 'old' component if there was one
internal[i].discountedCost = 0;
if (comps.internal[i] !== 0) {
if (comps && comps.internal[i] !== 0) {
this.use(internal[i], comps.internal[i], Components.internal(comps.internal[i]), true);
}
}
// Update aggragated stats
this.updatePower();
this.updateJumpStats();
this.updateShieldStrength();
if (comps) {
this.updatePower();
this.updateJumpStats();
this.updateShieldStrength();
}
};
Ship.prototype.useBulkhead = function(index, preventUpdate) {
var oldBulkhead = this.bulkheads.c;
this.bulkheads.id = index;
this.bulkheads.c = Components.bulkheads(this.id, index);
this.bulkheads.discountedCost = this.bulkheads.c.cost * this.componentCostMultiplier;
this.armourMultiplier = ArmourMultiplier[index];
this.updateStats(this.bulkheads, this.bulkheads.c, oldBulkhead, preventUpdate);
};
@@ -140,23 +182,21 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
*/
Ship.prototype.use = function(slot, id, component, preventUpdate) {
if (slot.id != id) { // Selecting a different component
var slotIndex = this.internal.indexOf(slot);
// Slot is an internal slot, is not being emptied, and the selected component group/type must be of unique
if (slotIndex != -1 && component && _.includes(['sg', 'rf', 'fs'], component.grp)) {
if (slot.cat == 2 && component && _.includes(['psg', 'sg', 'rf', 'fs'], component.grp)) {
// Find another internal slot that already has this type/group installed
var similarSlotIndex = this.findInternalByGroup(component.grp);
var similarSlot = this.findInternalByGroup(component.grp);
// If another slot has an installed component with of the same type
if (similarSlotIndex != -1 && similarSlotIndex != slotIndex) {
// Empty the slot
var similarSlot = this.internal[similarSlotIndex];
if (!preventUpdate && similarSlot && similarSlot !== slot) {
this.updateStats(similarSlot, null, similarSlot.c, true); // Update stats but don't trigger a global update
similarSlot.id = null;
similarSlot.c = null;
similarSlot.id = similarSlot.c = null; // Empty the slot
similarSlot.discountedCost = 0;
}
}
var oldComponent = slot.c;
slot.id = id;
slot.c = component;
slot.discountedCost = (component && component.cost) ? component.cost * this.componentCostMultiplier : 0;
this.updateStats(slot, component, oldComponent, preventUpdate);
}
};
@@ -180,9 +220,21 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
* @return {number} The index of the slot in ship.internal
*/
Ship.prototype.findInternalByGroup = function(group) {
return _.findIndex(this.internal, function(slot) {
return slot.c && slot.c.grp == group;
});
var index;
if (group == 'sg' || group == 'psg') {
index = _.findIndex(this.internal, function(slot) {
return slot.c && (slot.c.grp == 'sg' || slot.c.grp == 'psg');
});
} else {
index = _.findIndex(this.internal, function(slot) {
return slot.c && slot.c.grp == group;
});
}
if (index !== -1) {
return this.internal[index];
}
return null;
};
/**
@@ -197,7 +249,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
slot.priority = newPriority;
if (slot.enabled) { // Only update power if the slot is enabled
var usage = (slot.c.passive || this.hardpoints.indexOf(slot) == -1) ? 'retracted' : 'deployed';
var usage = powerUsageType(slot, slot.c);
this.priorityBands[oldPriority][usage] -= slot.c.power;
this.priorityBands[newPriority][usage] += slot.c.power;
this.updatePower();
@@ -209,18 +261,29 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
Ship.prototype.setCostIncluded = function(item, included) {
if (item.incCost != included && item.c) {
this.totalCost += included ? item.c.cost : -item.c.cost;
this.totalCost += included ? item.discountedCost : -item.discountedCost;
}
item.incCost = included;
};
Ship.prototype.setSlotEnabled = function(slot, enabled) {
if (slot.enabled != enabled && slot.c) { // Enabled state is changing
var usage = (slot.c.passive || this.hardpoints.indexOf(slot) == -1) ? 'retracted' : 'deployed';
this.priorityBands[slot.priority][usage] += enabled ? slot.c.power : -slot.c.power;
this.updatePower();
if (slot.enabled != enabled) { // Enabled state is changing
slot.enabled = enabled;
if (slot.c) {
this.priorityBands[slot.priority][powerUsageType(slot, slot.c)] += enabled ? slot.c.power : -slot.c.power;
if (slot.c.grp == 'sg' || slot.c.grp == 'psg') {
this.updateShieldStrength();
} else if (slot.c.grp == 'sb') {
this.shieldMultiplier += slot.c.shieldmul * (enabled ? 1 : -1);
this.updateShieldStrength();
} else if (slot.c.dps) {
this.totalDps += slot.c.dps * (enabled ? 1 : -1);
}
this.updatePower();
}
}
slot.enabled = enabled;
};
Ship.prototype.getSlotStatus = function(slot, deployed) {
@@ -228,9 +291,10 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
return 0; // No Status (Not possible)
} else if (!slot.enabled) {
return 1; // Disabled
} else if (deployed) {
} else if (deployed && !slot.c.retractedOnly) { // Certain component (e.g. Detaild Surface scanner) are power only while retracted
return this.priorityBands[slot.priority].deployedSum > this.powerAvailable ? 2 : 3; // Offline : Online
} else if (this.hardpoints.indexOf(slot) != -1 && !slot.c.passive) { // Active hardpoints have no retracted status
// Active hardpoints have no retracted status
} else if ((deployed && slot.c.retractedOnly) || (slot.cat === 1 && !slot.c.passive)) {
return 0; // No Status (Not possible)
}
return this.priorityBands[slot.priority].retractedSum > this.powerAvailable ? 2 : 3; // Offline : Online
@@ -240,7 +304,6 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
* Updates the ship's cumulative and aggregated stats based on the component change.
*/
Ship.prototype.updateStats = function(slot, n, old, preventUpdate) {
var isHardPoint = this.hardpoints.indexOf(slot) != -1;
var powerChange = slot == this.common[0];
if (old) { // Old component now being removed
@@ -255,17 +318,21 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
this.armourAdded -= old.armouradd;
break;
case 'sb':
this.shieldMultiplier -= old.shieldmul;
this.shieldMultiplier -= slot.enabled ? old.shieldmul : 0;
break;
}
if (slot.incCost && old.cost) {
this.totalCost -= old.cost;
this.totalCost -= old.cost * this.componentCostMultiplier;
}
if (old.power && slot.enabled) {
this.priorityBands[slot.priority][(isHardPoint && !old.passive) ? 'deployed' : 'retracted'] -= old.power;
this.priorityBands[slot.priority][powerUsageType(slot, old)] -= old.power;
powerChange = true;
if (old.dps) {
this.totalDps -= old.dps;
}
}
this.unladenMass -= old.mass || 0;
}
@@ -278,30 +345,31 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
case 'cr':
this.cargoCapacity += n.capacity;
break;
case 't':
this.maxMass = n.maxmass;
break;
case 'hr':
this.armourAdded += n.armouradd;
break;
case 'sb':
this.shieldMultiplier += n.shieldmul;
this.shieldMultiplier += slot.enabled ? n.shieldmul : 0;
break;
}
if (slot.incCost && n.cost) {
this.totalCost += n.cost;
this.totalCost += n.cost * this.componentCostMultiplier;
}
if (n.power && slot.enabled) {
this.priorityBands[slot.priority][(isHardPoint && !n.passive) ? 'deployed' : 'retracted'] += n.power;
this.priorityBands[slot.priority][powerUsageType(slot, n)] += n.power;
powerChange = true;
if (n.dps) {
this.totalDps += n.dps;
}
}
this.unladenMass += n.mass || 0;
}
this.ladenMass = this.unladenMass + this.cargoCapacity + this.fuelCapacity;
this.armourTotal = this.armourAdded + this.armour;
this.armour = this.armourAdded + Math.round(this.baseArmour * this.armourMultiplier);
if (!preventUpdate) {
if (powerChange) {
@@ -318,7 +386,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
for (var i = 0, l = bands.length; i < l; i++) {
var band = bands[i];
prevRetracted = band.retractedSum = prevRetracted + band.retracted;
prevRetracted = band.retractedSum = prevRetracted + band.retracted + band.retOnly;
prevDeployed = band.deployedSum = prevDeployed + band.deployed + band.retracted;
}
@@ -328,32 +396,44 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
};
Ship.prototype.updateShieldStrength = function() {
var sgSI = this.findInternalByGroup('sg'); // Find Shield Generator slot Index if any
this.shieldStrength = sgSI != -1 ? calcShieldStrength(this.mass, this.shields, this.internal[sgSI].c, this.shieldMultiplier) : 0;
var sgSlot = this.findInternalByGroup('sg'); // Find Shield Generator slot Index if any
this.shieldStrength = sgSlot && sgSlot.enabled ? calcShieldStrength(this.hullMass, this.baseShieldStrength, sgSlot.c, this.shieldMultiplier) : 0;
};
/**
* Jump Range and total range calculations
*/
Ship.prototype.updateJumpStats = function() {
var fsd = this.common[2].c; // Frame Shift Drive;
var fuelRemaining = this.fuelCapacity % fsd.maxfuel; // Fuel left after making N max jumps
var jumps = this.fuelCapacity / fsd.maxfuel;
var fsd = this.common[2].c; // Frame Shift Drive;
this.unladenRange = calcJumpRange(this.unladenMass + fsd.maxfuel, fsd, this.fuelCapacity); // Include fuel weight for jump
this.fullTankRange = calcJumpRange(this.unladenMass + this.fuelCapacity, fsd, this.fuelCapacity); // Full Tanke
this.ladenRange = calcJumpRange(this.ladenMass, fsd, this.fuelCapacity);
this.maxJumpCount = Math.ceil(jumps); // Number of full fuel jumps + final jump to empty tank
this.unladenTotalRange = calcTotalRange(this.unladenMass, fsd, this.fuelCapacity);
this.ladenTotalRange = calcTotalRange(this.unladenMass + this.cargoCapacity, fsd, this.fuelCapacity);
this.maxJumpCount = Math.ceil(this.fuelCapacity / fsd.maxfuel);
};
// Going backwards, start with the last jump using the remaining fuel
this.unladenTotalRange = fuelRemaining > 0 ? calcJumpRange(this.unladenMass + fuelRemaining, fsd, fuelRemaining) : 0;
this.ladenTotalRange = fuelRemaining > 0 ? calcJumpRange(this.unladenMass + this.cargoCapacity + fuelRemaining, fsd, fuelRemaining) : 0;
/**
* Recalculate all item costs and total based on discounts.
* @param {number} shipCostMultiplier Ship cost multiplier discount (e.g. 0.9 === 10% discount)
* @param {number} componentCostMultiplier Component cost multiplier discount (e.g. 0.75 === 25% discount)
*/
Ship.prototype.applyDiscounts = function(shipCostMultiplier, componentCostMultiplier) {
var total = 0;
var costList = this.costList;
// For each max fuel jump, calculate the max jump range based on fuel left in the tank
for (var j = 0, l = Math.floor(jumps); j < l; j++) {
fuelRemaining += fsd.maxfuel;
this.unladenTotalRange += calcJumpRange(this.unladenMass + fuelRemaining, fsd);
this.ladenTotalRange += calcJumpRange(this.unladenMass + this.cargoCapacity + fuelRemaining, fsd);
for (var i = 0, l = costList.length; i < l; i++) {
var item = costList[i];
if (item.c && item.c.cost) {
item.discountedCost = item.c.cost * (item.type == 'SHIP' ? shipCostMultiplier : componentCostMultiplier);
if (item.incCost) {
total += item.discountedCost;
}
}
}
this.shipCostMultiplier = shipCostMultiplier;
this.componentCostMultiplier = componentCostMultiplier;
this.totalCost = total;
};
return Ship;

View File

@@ -10,6 +10,13 @@ angular.module('shipyard', ['ngLodash'])
// Create 'angularized' references to DB.This will aid testing
.constant('ShipsDB', DB.ships)
.constant('ComponentsDB', DB.components)
.value('ArmourMultiplier', [
1, // Lightweight
1.4, // Reinforced
1.945, // Military
1.945, // Mirrored
1.945 // Reactive
])
.value('commonArray', [
'Power Plant',
'Thrusters',
@@ -32,19 +39,20 @@ angular.module('shipyard', ['ngLodash'])
// Internal
fs: 'Fuel Scoop',
sc: 'Scanners',
am: 'Auto Field-Maint. Unit',
cr: 'Cargo Racks',
sc: 'Scanner',
am: 'Auto Field-Maintenance Unit',
cr: 'Cargo Rack',
fi: 'FSD Interdictor',
hb: 'Hatch Breaker Limpet Ctrl',
hb: 'Hatch Breaker Limpet Controller',
hr: 'Hull Reinforcement Package',
rf: 'Refinery',
scb: 'Shield Cell Bank',
sg: 'Shield Generator',
psg: 'Prismatic Shield Generator',
dc: 'Docking Computer',
fx: 'Fuel Transfer Limpet Ctrl',
pc: 'Prospector Limpet Ctrl',
cc: 'Collector Limpet Ctrl',
fx: 'Fuel Transfer Limpet Controller',
pc: 'Prospector Limpet Controller',
cc: 'Collector Limpet Controller',
// Hard Points
bl: 'Beam Laser',
@@ -65,12 +73,13 @@ angular.module('shipyard', ['ngLodash'])
sb: 'Shield Booster',
tp: 'Torpedo Pylon'
})
.value('shipPurpose', {
mp: 'Multi Purpose',
fr: 'Freighter',
ex: 'Explorer',
co: 'Combat',
pa: 'Passenger Transport'
.value('MountMap', {
'F': 'Fixed',
'G': 'Gimballed',
'T': 'Turret',
'Fixed': 'F',
'Gimballed': 'G',
'Turret': 'T'
})
.value('shipSize', [
'N/A',
@@ -108,7 +117,7 @@ angular.module('shipyard', ['ngLodash'])
},
{ // 2
title: 'Armour',
props: ['armourTotal'],
props: ['armour'],
unit: '',
fmt: 'fCrd'
},
@@ -163,8 +172,28 @@ angular.module('shipyard', ['ngLodash'])
lbls: ['Unladen', 'Laden'],
unit: 'LY',
fmt: 'fRound'
},
{ // 11
title: 'DPS',
props: ['totalDps'],
lbls: ['Dps'],
unit: '',
fmt: 'fRound'
}
])
/**
* Set of all available / theoretical discounts
*
* @type {Object}
*/
.value('Discounts', {
'None': 1,
'5%': 0.95,
'10%': 0.90,
'15%': 0.85,
'20%': 0.80,
'25%': 0.75
})
/**
* Calculate the maximum single jump range based on mass and a specific FSD
*
@@ -175,6 +204,27 @@ angular.module('shipyard', ['ngLodash'])
*/
.value('calcJumpRange', function(mass, fsd, fuel) {
return Math.pow(Math.min(fuel === undefined ? fsd.maxfuel : fuel, fsd.maxfuel) / fsd.fuelmul, 1 / fsd.fuelpower ) * fsd.optmass / mass;
})
/**
* Calculate the total range based on mass and a specific FSD, and all fuel available
*
* @param {number} mass Mass of a ship: laden, unlanden, partially laden, etc
* @param {object} fsd The FDS object/component with maxfuel, fuelmul, fuelpower, optmass
* @param {number} fuel The total fuel available
* @return {number} Distance in Light Years
*/
.value('calcTotalRange', function(mass, fsd, fuel) {
var fuelRemaining = fuel % fsd.maxfuel; // Fuel left after making N max jumps
var jumps = Math.floor(fuel / fsd.maxfuel);
mass += fuelRemaining;
// Going backwards, start with the last jump using the remaining fuel
var totalRange = fuelRemaining > 0 ? Math.pow(fuelRemaining / fsd.fuelmul, 1 / fsd.fuelpower ) * fsd.optmass / mass : 0;
// For each max fuel jump, calculate the max jump range based on fuel mass left in the tank
for (var j = 0; j < jumps; j++) {
mass += fsd.maxfuel;
totalRange += Math.pow(fsd.maxfuel / fsd.fuelmul, 1 / fsd.fuelpower ) * fsd.optmass / mass;
}
return totalRange;
})
/**
* Calculate the a ships shield strength based on mass, shield generator and shield boosters used.
@@ -187,9 +237,6 @@ angular.module('shipyard', ['ngLodash'])
* @return {number} Approximate shield strengh in MJ
*/
.value('calcShieldStrength', function(mass, shields, sg, multiplier) {
if (!sg) {
return 0;
}
if (mass <= sg.minmass) {
return shields * multiplier * sg.minmul;
}
@@ -200,4 +247,20 @@ angular.module('shipyard', ['ngLodash'])
return shields * multiplier * (sg.optmul + (mass - sg.optmass) / (sg.maxmass - sg.optmass) * (sg.maxmul - sg.optmul));
}
return shields * multiplier * sg.maxmul;
})
/**
* Calculate the a ships speed based on mass, and thrusters. Currently Innacurate / Incomplete :(
*
* @private
* @param {number} mass Current mass of the ship
* @param {number} baseSpeed Base speed m/s for ship
* @param {number} baseBoost Base boost m/s for ship
* @param {object} thrusters The shield generator used
* @return {object} Approximate speed and boost speed in m/s
*/
.value('calcSpeed', function(mass, baseSpeed, baseBoost) { //, thrusters) {
//var speed = baseSpeed * (1 + ((thrusters.optmass / mass) * 0.1 ) ); // TODO: find thruser coefficient(s)
//var boost = baseBoost * (1 + ((thrusters.optmass / mass) * 0.1 ) );
return { boost: baseSpeed, speed: baseBoost };
});

View File

@@ -32,6 +32,61 @@ angular.module('shipyard').service('Components', ['lodash', 'ComponentsDB', 'Shi
return null;
};
this.findInternalId = function(groupName, clss, rating, name) {
var groups = {};
if (groupName) {
if (!C.internal[groupName]) {
throw 'Invalid internal group: ' + groupName;
}
groups[groupName] = C.internal[groupName];
} else if (name) {
groups = C.internal;
} else {
throw 'Invalid group or name not provided';
}
for (var g in groups) {
var group = groups[g];
for (var i = 0, l = group.length; i < l; i++) {
if (group[i].class == clss && group[i].rating == rating && ((!name && !group[i].name) || group[i].name == name)) {
return group[i].id;
}
}
}
return 0;
};
this.findHardpointId = function(groupName, clss, rating, name, mode, missile) {
var groups = {};
if (groupName) {
if (!C.hardpoints[groupName]) {
throw 'Invalid internal group: ' + groupName;
}
groups[groupName] = C.hardpoints[groupName];
} else if (name) {
groups = C.hardpoints;
} else {
throw 'Invalid group or name not provided';
}
for (var g in groups) {
var group = groups[g];
for (var i = 0, l = group.length; i < l; i++) {
if (group[i].class == clss && group[i].rating == rating && group[i].mode == mode
&& ((!name && !group[i].name) || group[i].name == name)
&& ((!missile && !group[i].missile) || group[i].missile == missile)
) {
return group[i].id;
}
}
}
return 0;
};
/**
* Looks up the bulkhead component for a specific ship and bulkhead
* @param {string} shipId Unique ship Id/Key
@@ -42,6 +97,10 @@ angular.module('shipyard').service('Components', ['lodash', 'ComponentsDB', 'Shi
return C.bulkheads[shipId][bulkheadsId];
};
this.bulkheadIndex = function(bulkheadName) {
return ['Lightweight Alloy', 'Reinforced Alloy', 'Military Grade Composite', 'Mirrored Surface Composite', 'Reactive Surface Composite'].indexOf(bulkheadName);
};
/**
* Creates a new ComponentSet that contains all available components
* that the specified ship is eligible to use.
@@ -51,7 +110,8 @@ angular.module('shipyard').service('Components', ['lodash', 'ComponentsDB', 'Shi
*/
this.forShip = function(shipId) {
var ship = Ships[shipId];
return new ComponentSet(C, ship.properties.mass + 5, ship.slots.common, ship.slots.internal[0], ship.slots.hardpoints[0]);
var maxInternal = isNaN(ship.slots.internal[0]) ? ship.slots.internal[0].class : ship.slots.internal[0];
return new ComponentSet(C, ship.minMassFilter || ship.properties.hullMass + 5, ship.slots.common, maxInternal, ship.slots.hardpoints[0]);
};
}]);

View File

@@ -19,9 +19,11 @@
@import 'buttons';
@import 'error';
@import 'sortable';
@import 'loader';
html, body {
height: 100%;
width: 100%;
text-rendering: optimizeLegibility;
}
@@ -32,6 +34,8 @@ body {
padding: 0;
font-family: @fStandard;
letter-spacing: 0.05em;
overflow-x: hidden;
-webkit-overflow-scrolling: touch;
}
div, a, li {
@@ -40,7 +44,9 @@ div, a, li {
#main {
margin: 0;
padding: 0.5em 0;
padding: 0.5em 0.5em;
width: 100%;
box-sizing: border-box;
min-height: 90%;
clear: both;
text-align: center;

View File

@@ -1,11 +1,9 @@
.chart {
.user-select-none();
display: inline-block;
margin: 0;
cursor: default;
overflow: hidden;
width: 33%;
box-sizing: border-box;
@@ -23,6 +21,7 @@
&[ng-click] {
cursor: pointer;
}
}
}
@@ -63,5 +62,3 @@ svg {
stroke-width: 1px;
}
}

View File

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

View File

@@ -39,6 +39,7 @@ header {
}
.smallTablet({
position: static;
position: initial;
});
}
@@ -83,6 +84,19 @@ header {
-webkit-overflow-scrolling: touch;
max-height: 500px;
&::-webkit-scrollbar {
width: 0.5em;
}
&::-webkit-scrollbar-track {
background-color: transparent;
}
&::-webkit-scrollbar-thumb {
background-color: @warning-disabled;
}
.smallTablet({
max-height: 400px;
left: 0;

37
app/less/loader.less Normal file
View File

@@ -0,0 +1,37 @@
@keyframes hideshow {
0% { opacity: 0; }
10% { opacity: 1; }
100% { opacity: 0; }
}
@keyframes inner {
0% { opacity: 0; }
10% { opacity: 1; }
100% { opacity: 0; }
}
@animationTime: 750ms;
@outerTriangles: 19;
@animationDelay: @animationTime / @outerTriangles;
.loader {
path {
stroke: #000;
stroke-width: 0;
opacity: 0;
}
}
.l1 { animation: hideshow @animationTime linear infinite; }
.l2 { animation: inner @animationTime linear infinite; }
.mixin-loop (@i) when (@i > 0) {
.d@{i} {
animation-delay: @i * @animationDelay;
}
.mixin-loop(@i - 1);
}
.mixin-loop(@outerTriangles);

View File

@@ -59,7 +59,7 @@
input {
background: none;
line-height: 1.3em;
width: 20em;
width: 15em;
font-size: 0.9em;
box-sizing: border-box;
display: inline-block;
@@ -71,16 +71,17 @@
color: @primary;
}
.largePhone({
width: 70%;
.smallTablet({
width: 60%;
});
.medPhone({
.largePhone({
width: 100%;
});
}
.largePhone({
.smallTablet({
float: left;
clear: left;
width: 100%;
@@ -99,6 +100,12 @@
text-overflow: ellipsis;
}
.optional-hide {
.largePhone({
display: none;
});
}
table.total {
width: 100%;
@@ -113,6 +120,26 @@ table.total {
}
}
.tabs {
width: 100%;
box-sizing: border-box;
margin-bottom: 1px;
&, th {
border-collapse: collapse;
color: @primary-disabled;
background-color: @primary-bg;
border: 1px solid @primary-disabled;
padding-top: 1px;
}
.active {
color: @primary-bg;
background-color: @primary-disabled;
}
}
.group {
width: 25%;
padding: 0.5em 0.2em;
@@ -122,11 +149,6 @@ table.total {
.user-select-none();
cursor: default;
[ng-click] {
cursor: pointer;
}
h1 {
font-family: @fStandard;
color: @bgBlack;
@@ -139,20 +161,21 @@ table.total {
font-weight: normal;
}
tbody tr:hover {
background-color: @warning-bg;
}
.smallTablet({
width: 50%;
.axis.x {
g.tick:nth-child(2n + 1) text {
display: none;
}
}
});
.largePhone({
width: 100%;
});
&.dbl {
&.half {
width: 50%;
.tablet({
@@ -162,16 +185,28 @@ table.total {
});
.smallTablet({
overflow-x: auto;
-webkit-overflow-scrolling: touch;
width: 100% !important;
});
}
&.third {
width: 33%;
.largePhone({
width: 100% !important;
});
}
}
.power-band {
text, rect {
cursor: pointer;
}
}
#componentPriority {
.tablet({
text.primary, text.warning, text.primary-bg {
text.primary, text.warning, text.primary-bg, text.secondary {
font-size: 0.8em;
}
@@ -213,9 +248,6 @@ table.total {
&:nth-child(3) {
display: none;
}
&:nth-child(2) {
font-size: 0.7em;
}
}
});

View File

@@ -1,3 +1,27 @@
select {
.border-radius(0);
cursor: pointer;
background: none;
color: @primary-disabled;
font-family: @fStandard;
font-size: 1em;
background-color: transparent;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
padding: 0.1em 0.5em;
outline:none;
border: 0;
&:focus {
outline:none;
}
&::-moz-focus-inner {
border: 0;
}
}
.select {
color: @primary-disabled;
position: absolute;
@@ -5,17 +29,34 @@
padding: 0.5em 0;
width: 100%;
margin: 0;
max-height: 300px;
max-height: 400px;
overflow-y: auto;
overflow-x: hidden;
z-index: 0;
-webkit-overflow-scrolling: touch;
background-color: @bg;
border: 1px solid @primary;
white-space: nowrap;
text-align: center;
.tablet({
max-height: 300px;
});
&::-webkit-scrollbar {
width: 0.5em;
}
&::-webkit-scrollbar-track {
background-color: transparent;
border-left: 1px solid @primary;
}
&::-webkit-scrollbar-thumb {
background-color: @primary-disabled;
}
.select-group {
white-space: nowrap;
line-height: 1.5em;
text-align: left;
margin: 0.5em 0;
@@ -24,66 +65,67 @@
border-bottom: 1px solid @primary-disabled;
}
.empty-c, .c, .lc {
cursor: pointer;
@optionSpacing: 2em;
.empty-c, .c, .lc {
white-space: nowrap;
text-align: center;
cursor: pointer;
line-height:@optionSpacing;
color: @primary-disabled;
stroke-width: 1em;
stroke-width: 0.5em;
stroke: @primary-disabled;
&:hover {
color: @warning;
stroke: @warning;
border-color: @primary;
color: @primary;
stroke: @primary;
}
}
.lc, .c {
border:1px solid @primary-disabled;
padding: 0.1em 0.2em;
margin: 0.3em;
&.warning {
border-color: @warning-disabled;
color: @warning-disabled;
stroke: @warning-disabled;
&:hover {
border-color: @warning;
color: @warning;
stroke: @warning;
}
}
&.disabled {
cursor: not-allowed;
border-color: @disabled;
color: @disabled;
stroke: @disabled;
}
&.active {
border-color: @secondary;
color: @secondary;
stroke: @secondary;
}
}
@optionSpacing: 2em;
.lc {
line-height:@optionSpacing;
text-align: left;
}
.empty-c {
line-height:@optionSpacing;
text-align: center;
}
.c {
border:1px solid @primary-disabled;
display: inline-block;
padding: 0.1em;
margin: 0.3em;
width: 2em;
line-height: @optionSpacing;
text-align: center;
}
&:hover {
border:1px solid @warning;
}
&.disabled {
border:1px solid @disabled;
}
&.active {
border:1px solid @secondary;
}
span {
vertical-align: middle;
}
ul {
display: inline-block;
text-align: left;
min-width: 15em;
min-width: 16em;
margin: 0 auto;
padding: 0;
list-style: none;
@@ -91,7 +133,7 @@
&.hardpoint {
.c {
width: 4.4em;
width: 4.5em;
padding: 0.1em 0.2em;
}
ul {

View File

@@ -24,6 +24,13 @@
text-transform: none;
}
.name {
overflow: hidden;
white-space: nowrap;
max-width: 80%;
text-overflow: ellipsis;
}
.cb {
overflow: hidden;
}
@@ -44,6 +51,7 @@
border-right: 1px solid @primary-disabled;
box-sizing: border-box;
padding-top: 0.2em;
padding-left: 0.1em;
}
.empty {

View File

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

View File

@@ -0,0 +1,281 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://cdn.coriolis.io/schemas/ship-loadout/1-draft.json#",
"title": "Ship Loadout",
"type": "object",
"description": "The details for a specific ship build/loadout",
"required": ["name", "ship", "components"],
"properties": {
"name": {
"description": "The name of the build/loadout",
"type": "string",
"minLength": 2
},
"ship": {
"description": "The full display name of the ship",
"type": "string",
"minimum": 3
},
"manufacturer": {
"description": "The ship manufacturer",
"type": "string"
},
"references" : {
"description": "3rd Party references and/or links to this build/loadout",
"type": "array",
"items": {
"type": "object",
"required": ["name","url"],
"additionalProperties": true,
"properties": {
"name": {
"description": "The name of the 3rd party, .e.g 'Coriolis.io' or 'E:D Shipyard'",
"type": "string"
},
"url": {
"description": "The link/url to the 3rd party referencing this build/loadout",
"type": "string"
}
}
}
},
"components": {
"description": "The components used by this build",
"type": "object",
"additionalProperties": false,
"required": ["standard", "internal", "hardpoints", "utility"],
"properties": {
"standard": {
"description": "The set of standard components across all ships",
"type": "object",
"additionalProperties": false,
"required": ["bulkheads", "powerPlant", "thrusters", "frameShiftDrive", "lifeSupport", "powerDistributor", "sensors", "fuelTank"],
"properties": {
"bulkheads": {
"enum": ["Lightweight Alloy", "Reinforced Alloy", "Military Grade Composite", "Mirrored Surface Composite", "Reactive Surface Composite"]
},
"powerPlant": {
"required": ["class", "rating"],
"properties": {
"class": { "type": "integer", "minimum": 2, "maximum": 8 },
"rating": { "$ref": "#/definitions/standardRatings" }
}
},
"thrusters": {
"required": ["class", "rating"],
"properties": {
"class": { "type": "integer", "minimum": 2, "maximum": 8 },
"rating": { "$ref": "#/definitions/standardRatings" }
}
},
"frameShiftDrive": {
"required": ["class", "rating"],
"properties": {
"class": { "type": "integer", "minimum": 2, "maximum": 8 },
"rating": { "$ref": "#/definitions/standardRatings" }
}
},
"lifeSupport": {
"required": ["class", "rating"],
"properties": {
"class": { "type": "integer", "minimum": 1, "maximum": 6 },
"rating": { "$ref": "#/definitions/standardRatings" }
}
},
"powerDistributor": {
"required": ["class", "rating"],
"properties": {
"class": { "type": "integer", "minimum": 1, "maximum": 8 },
"rating": { "$ref": "#/definitions/standardRatings" }
}
},
"sensors": {
"required": ["class", "rating"],
"properties": {
"class": { "type": "integer", "minimum": 1, "maximum": 8 },
"rating": { "$ref": "#/definitions/standardRatings" }
}
},
"fuelTank": {
"required": ["class", "rating"],
"properties": {
"class": { "type": "integer", "minimum": 1, "maximum": 6 },
"rating": { "$ref": "#/definitions/standardRatings" }
}
}
}
},
"internal": {
"type": "array",
"items": {
"type": ["object", "null"],
"required": ["class", "rating", "group"],
"properties" : {
"class": { "type": "integer", "minimum": 1, "maximum": 8 },
"rating": { "$ref": "#/definitions/standardRatings" },
"group": {
"description": "The group of the component, e.g. 'Shield Generator', or 'Cargo Rack'",
"type": "string"
},
"name": {
"description": "The name identifying the component (if applicable), e.g. 'Advance Discovery Scanner', or 'Detailed Surface Scanner'",
"type": "string"
}
}
},
"minItems": 3
},
"hardpoints": {
"type": "array",
"items": {
"type": ["object", "null"],
"required": ["class", "rating", "group", "mount"],
"properties" : {
"class": { "type": "integer", "minimum": 1, "maximum": 4 },
"rating": { "$ref": "#/definitions/allRatings" },
"mount": { "type": "string", "enum": ["Fixed", "Gimballed", "Turret"] },
"group": {
"description": "The group of the component, e.g. 'Beam Laser', or 'Missile Rack'",
"type": "string"
},
"name": {
"description": "The name identifing the component (if applicable), e.g. 'Retributor', or 'Mining Lance'",
"type": "string"
}
}
},
"minItems": 1
},
"utility": {
"type": "array",
"items": {
"type": ["object", "null"],
"required": ["class", "rating", "group"],
"properties" : {
"class": { "type": "integer", "minimum": 0, "maximum": 0 },
"rating": { "$ref": "#/definitions/allRatings" },
"group": {
"description": "The group of the component, e.g. 'Shield Booster', or 'Kill Warrant Scanner'",
"type": "string"
},
"name": {
"description": "The name identifing the component (if applicable), e.g. 'Point Defence', or 'Electronic Countermeasure'",
"type": "string"
}
}
},
"minItems": 1
}
}
},
"stats": {
"description": "Optional statistics from the build",
"type": "object",
"additionalProperties": true,
"properties": {
"agility": {
"type": "integer",
"minimum": 0
},
"armour": {
"description": "Sum of base armour + any hull reinforcements",
"type": "integer",
"minimum": 1
},
"armourAdded":{
"description": "Armour added through Hull reinforcement",
"type": "integer",
"minimum": 1
},
"baseShieldStrength": {
"type": "integer",
"minimum": 1
},
"baseArmour": {
"type": "integer",
"minimum": 1
},
"boost": {
"description": "Maximum boost speed of the ships (4 pips, straight-line)",
"type": "number",
"minimum": 1
},
"cargoCapacity": {
"type": "integer",
"minimum": 0
},
"class": {
"description": "Ship Class/Size [Small, Medium, Large]",
"enum": [1,2,3]
},
"dps": {
"description": "Cumulative DPS based on the in-game 1-10 statistic",
"type": "integer",
"minimum": 0
},
"hullCost": {
"description": "Cost of the ship's hull",
"type": "integer",
"minimum": 1
},
"hullMass": {
"description": "Mass of the Ship hull only",
"type": "number",
"minimum": 1
},
"fuelCapacity": {
"type": "integer",
"minimum": 1
},
"fullTankRange": {
"description": "Single Jump range with a full tank (unladenMass + fuel)",
"type": "number",
"minimum": 0
},
"ladenMass": {
"description": "Mass of the Ship + fuel + cargo (hull + all components + fuel tank + cargo capacity)",
"type": "number",
"minimum": 1
},
"ladenRange": {
"description": "Single Jump range with full cargo load, see ladenMass",
"type": "number",
"minimum": 0
},
"masslock": {
"description": "Mass Lock Factor of the Ship",
"type": "integer",
"minimum": 1
},
"shieldStrength": {
"description": "Shield strengh in Mega Joules (Mj)",
"type": "number",
"minimum": 0
},
"speed": {
"description": "Maximum speed of the ships (4 pips, straight-line)",
"type": "number",
"minimum": 1
},
"totalCost": {
"type": "integer",
"minimum": 1
},
"unladenRange": {
"description": "Single Jump range when unladen, see unladenMass",
"type": "number",
"minimum": 0
},
"unladenMass": {
"description": "Mass of the Ship (hull + all components)",
"type": "number",
"minimum": 1
}
}
}
},
"definitions": {
"standardRatings": { "enum": ["A", "B", "C", "D", "E"] },
"allRatings": { "enum": ["A", "B", "C", "D", "E", "F", "I" ] }
}
}

View File

@@ -51,11 +51,20 @@
<ul>
Insurance
<li><select ng-model="insurance.current" ng-options="ins.name for (i,ins) in insurance.opts" ng-change="updateInsurance()"></select></li>
</ul><br>
<ul>
Ship Discount
<li><select ng-model="discounts.ship" ng-options="i for (i,d) in discounts.opts" ng-change="updateDiscount()"></select></li>
</ul><br>
<ul>
Component Discount
<li><select ng-model="discounts.components" ng-options="i for (i,d) in discounts.opts" ng-change="updateDiscount()"></select></li>
</ul>
<hr />
<ul>
Builds & Comparisons
<li><a href="#" class="block" ui-sref="modal.export({data: {builds: allBuilds}})">Export</a></li>
<li><a href="#" class="block" ng-click="backup($event)">Backup</a></li>
<li><a href="#" class="block" ng-click="detailedExport($event)">Detailed Export</a></li>
<li><a href="#" class="block" ui-sref="modal.import">Import</a></li>
<li><a href="#" class="block" ui-sref="modal.delete">Delete All</a></li>
</ul>

View File

@@ -1,16 +1,16 @@
<div class="sz" ng-bind="c.maxClass"></div>
<div class="empty" ng-if="!c.c">EMPTY</div>
<div ng-if="c.c">
{{c.c.class}}{{c.c.rating}} {{c.c.name || lbl}}
<div class="l name">{{c.c.class}}{{c.c.rating}} {{c.c.name || lbl}}</div>
<div class="r">{{c.c.mass || c.c.capacity || '0'}} <u>T</u></div>
<div class="cb"></div>
<div class="l" ng-if="c.c.optmass">Opt: {{c.c.optmass}} <u>T</u></div>
<div class="l" ng-if="c.c.maxmass">Max: {{c.c.maxmass}} <u>T</u></div>
<div class="l" ng-if="c.c.optmass">Optimal Mass: {{c.c.optmass}} <u>T</u></div>
<div class="l" ng-if="c.c.maxmass">Max Mass: {{c.c.maxmass}} <u>T</u></div>
<div class="l" ng-if="c.c.bins">{{c.c.bins}} <u>Bins</u></div>
<div class="l" ng-if="c.c.rate">Rate: {{c.c.rate}} <u>Kg/s</u>&nbsp;&nbsp;&nbsp;Refuel Time: {{$r.fTime(fuel * 1000 / c.c.rate)}}</div>
<div class="l" ng-if="c.c.ammo">Ammo: {{c.c.ammo}}</div>
<div class="l" ng-if="c.c.cells">Cells: {{c.c.cells}}</div>
<div class="l" ng-if="c.c.recharge">Recharge: {{c.c.recharge}} <u>MJ</u></div>
<div class="l" ng-if="c.c.recharge">Recharge: {{c.c.recharge}} <u>MJ</u>&nbsp;&nbsp;&nbsp;Total: {{c.c.cells * c.c.recharge}} <u>MJ</u></div>
<div class="l" ng-if="c.c.repair">Repair: {{c.c.repair}}</div>
<div class="l" ng-if="c.c.range">Range {{c.c.range}} <u>km</u></div>
<div class="l" ng-if="c.c.time">Time: {{$r.fTime(c.c.time)}}</div>
@@ -19,4 +19,4 @@
<div class="l" ng-if="c.c.rangeLS === null"><svg class="icon"><use xlink:href="#infinite"></use></svg> <u>LS</u></div>
<div class="l" ng-if="c.c.rangeRating">Range: {{c.c.rangeRating}}</div>
<div class="l" ng-if="c.c.armouradd">+{{c.c.armouradd}} <u>Armour</u></div>
</div>
</div>

View File

@@ -1,4 +1,5 @@
<h2 ng-bind="title"></h2>
<div ng-if="description" ng-bind="description"></div>
<div>
<textarea class="cb json" ng-click="onTextClick($event)" ng-bind="export"></textarea>
</div>

View File

@@ -1,26 +1,40 @@
<h2>Import</h2>
<div ng-show="!processed">
<textarea class="cb json" ng-model="importData" ng-change="validateJson()" placeholder="Paste JSON Here"></textarea>
<button class="l" ng-click="process()" ng-disabled="!jsonValid">Proceed</button>
<textarea class="cb json" ng-model="importString" ng-change="validateImport()" placeholder="Paste JSON or Build text Here"></textarea>
<button class="l" ng-click="process()" ng-disabled="!importValid">Proceed</button>
<div class="l warning" style="margin-left:3em;">{{errorMsg}}</div>
</div>
<div ng-show="processed">
<table class="l" style="overflow:hidden;margin: 1em 0;">
<thead><tr><th>Ship</th><th>Build Name</th><th>Action</th></tr></thead>
<table class="l" style="overflow:hidden;margin: 1em 0; width: 100%;">
<thead><tr><th style="text-align:left">Ship</th><th style="text-align:left">Build Name</th><th>Action</th></tr></thead>
<tbody ng-repeat="(shipId,shipBuilds) in builds">
<tr class="cb" ng-repeat="(buildName, b) in shipBuilds">
<td>{{ships[shipId].properties.name}}</td>
<td><input type="text" ng-model="b.useName"/></td>
<td ng-class="{warning: hasBuild(shipId, b.useName) == true, disabled: b.useName == ''}">
<td style="text-align:center" ng-class="{warning: hasBuild(shipId, b.useName) == true, disabled: b.useName == ''}">
<span ng-show="b.useName">{{ hasBuild(shipId, b.useName)? 'Overwrite' : 'Create' }}</span>
<span ng-show="b.useName == ''">Skip</span>
</td>
</tr>
</tbody>
</table>
<table class="l" style="overflow:hidden;margin: 1em 0; width: 100%;" ng-if="comparisons">
<thead><tr><th style="text-align:left">Comparison</th><th>Action</th></tr></thead>
<tbody>
<tr class="cb" ng-repeat="(name, comparison) in comparisons">
<td><input type="text" ng-model="comparison.useName"/></td>
<td style="text-align:center" ng-class="{warning: hasComparison(comparison.useName) == true, disabled: comparison.useName == ''}">
<span ng-show="comparison.useName">{{ hasComparison(comparison.useName)? 'Overwrite' : 'Create' }}</span>
<span ng-show="comparison.useName == ''">Skip</span>
</td>
</tr>
</tbody>
</table>
<button class="cl l" ng-click="import()"><svg class="icon"><use xlink:href="#download"></use></svg> Import</button>
<button class="l" style="margin-left: 2em;" ng-click="processed = false" ng-show="canEdit">Edit JSON</button>
<button class="l" style="margin-left: 2em;" ng-click="processed = false" ng-show="canEdit">Edit Data</button>
</div>
<button class="r dismiss" ng-click="dismiss()">Cancel</button>

View File

@@ -16,6 +16,15 @@
<button ui-sref="outfit({shipId: ship.id,code:null, bn: buildName})" ng-disabled="!code">
<svg class="icon lg"><use xlink:href="#switch"></use></svg><span class="button-lbl">Reset</span>
</button>
<button ng-click="aRatedBuild()">
<svg class="icon lg"><use xlink:href="#a"></use></svg><span class="button-lbl">A-Rated</span>
</button>
<button ng-click="optimizeMassBuild()">
<svg class="icon lg"><use xlink:href="#feather"></use></svg><span class="button-lbl">Optimize Mass</span>
</button>
<button ng-click="exportBuild($event)" ng-disabled="!buildName">
<svg class="icon lg"><use xlink:href="#download"></use></svg><span class="button-lbl">Export</span>
</button>
</div>
</div>
@@ -25,18 +34,21 @@
<tr class="main">
<th rowspan="2">Size</th>
<th rowspan="2">Agility</th>
<th rowspan="2">Speed</th>
<th rowspan="2">Boost</th>
<th rowspan="2" ng-class="{'bg-warning-disabled': th.c.maxmass < ship.ladenMass}">Speed</th>
<th rowspan="2" ng-class="{'bg-warning-disabled': (pd.c.enginecapacity < ship.boostEnergy || th.c.maxmass < ship.ladenMass)}">Boost</th>
<th rowspan="2">DPS</th>
<th rowspan="2">Armour</th>
<th rowspan="2">Shields</th>
<th colspan="2">Mass</th>
<th colspan="3">Mass</th>
<th rowspan="2">Cargo</th>
<th rowspan="2">Fuel</th>
<th colspan="3">Jump Range</th>
<th colspan="3">Total Range</th>
<th rowspan="2">Lock<br>Factor</th>
</tr>
<tr>
<th class="lft">Unladen</th>
<th class="lft">Hull</th>
<th>Unladen</th>
<th>Laden</th>
<th class="lft">Max</th>
<th>Full Tank</th>
@@ -50,10 +62,24 @@
<tr>
<td ng-bind="SZ[ship.class]"></td>
<td>{{ship.agility}}/10</td>
<td>{{fRound(ship.speed)}} <u>m/s</u></td>
<td>{{fRound(ship.boost)}} <u>m/s</u></td>
<td>{{ship.armourTotal}} <span ng-if="ship.armourAdded">({{ship.armour}} + {{ship.armourAdded}})</span></td>
<td>{{fRound(ship.shieldStrength)}} <u>MJ</u> <span ng-if="ship.shieldMultiplier > 1">({{fRPct(ship.shieldMultiplier)}})</span></td>
<td>
<span ng-if="th.c.maxmass >= ship.ladenMass">{{fRound(ship.speed)}} <u>m/s</u></span>
<span class="warning" ng-if="th.c.maxmass < ship.ladenMass">0 <svg class="icon"><use xlink:href="#warning"></use></svg></span>
</td>
<td>
<span ng-if="pd.c.enginecapacity >= ship.boostEnergy && th.c.maxmass >= ship.ladenMass">{{fRound(ship.boost)}} <u>m/s</u></span>
<span class="warning" ng-if="pd.c.enginecapacity < ship.boostEnergy || th.c.maxmass < ship.ladenMass">0
<svg class="icon"><use xlink:href="#warning"></use></svg>
</span>
</td>
<td>{{fRound(ship.totalDps)}}</td>
<td>
{{ship.armour}}
<span ng-if="ship.armourAdded || ship.armourMultiplier > 1">(<span ng-if="ship.armourMultiplier > 1">{{fRPct(ship.armourMultiplier)}}</span>
<span ng-if="ship.armourAdded">+ {{ship.armourAdded}}</span>)</span>
</td>
<td>{{fRound(ship.shieldStrength)}} <u>MJ</u> <span ng-if="ship.shieldMultiplier > 1 && ship.shieldStrength > 0">({{fRPct(ship.shieldMultiplier)}})</span></td>
<td>{{ship.hullMass}} <u>T</u></td>
<td>{{fRound(ship.unladenMass)}} <u>T</u></td>
<td>{{fRound(ship.ladenMass)}} <u>T</u></td>
<td>{{fRound(ship.cargoCapacity)}} <u>T</u></td>
@@ -64,6 +90,7 @@
<td>{{fRound(ship.maxJumpCount)}}</td>
<td>{{fRound(ship.unladenTotalRange)}} <u>LY</u></td>
<td>{{fRound(ship.ladenTotalRange)}} <u>LY</u></td>
<td ng-bind="ship.masslock"></td>
</tr>
</tbody>
</table>
@@ -89,7 +116,7 @@
</div>
</div>
<div class="slot" ng-click="selectSlot($event, pp)" ng-class="{selected: selectedSlot==pp}">
<div class="details">
<div class="details" ng-class="{warning: pp.c.pGen < ship.powerRetracted}">
<div class="sz">{{::pp.maxClass}}</div>
<div class="l">{{pp.id}} Power Plant</div>
<div class="r">{{pp.c.mass}} <u>T</u></div>
@@ -97,10 +124,10 @@
<div class="l">Efficiency: {{pp.c.eff}}</div>
<div class="l">Power: {{pp.c.pGen}} <u>MW</u></div>
</div>
<div component-select class="select" s="pp" opts="availCS.common[0]" ng-if="selectedSlot==pp" ng-click="select('c',pp,$event)"></div>
<div component-select class="select" s="pp" warning="ppWarning" opts="availCS.common[0]" ng-if="selectedSlot==pp" ng-click="select('c',pp,$event)"></div>
</div>
<div class="slot" ng-click="selectSlot($event, th)" ng-class="{selected: selectedSlot==th}">
<div class="details">
<div class="details" ng-class="{'warning': th.c.maxmass < ship.ladenMass}">
<div class="sz">{{::th.maxClass}}</div>
<div class="l">{{th.id}} Thrusters</div>
<div class="r">{{th.c.mass}} <u>T</u></div>
@@ -108,7 +135,7 @@
<div class="l">Optimal Mass: {{th.c.optmass}} <u>T</u></div>
<div class="l">Max Mass: {{th.c.maxmass}} <u>T</u></div>
</div>
<div component-select class="select" s="th" mass="ship.unladenMass" opts="availCS.common[1]" ng-if="selectedSlot==th" ng-click="select('c',th,$event)"></div>
<div component-select class="select" s="th" mass="ship.ladenMass" opts="availCS.common[1]" ng-if="selectedSlot==th" ng-click="select('c',th,$event)"></div>
</div>
<div class="slot" ng-click="selectSlot($event, fsd)" ng-class="{selected: selectedSlot==fsd}">
<div class="details">
@@ -132,7 +159,7 @@
<div component-select class="select" s="ls" opts="availCS.common[3]" ng-if="selectedSlot==ls" ng-click="select('c',ls,$event)"></div>
</div>
<div class="slot" ng-click="selectSlot($event, pd)" ng-class="{selected: selectedSlot==pd}">
<div class="details">
<div class="details" ng-class="{warning: pd.c.enginecapacity < ship.boostEnergy}">
<div class="sz">{{::pd.maxClass}}</div>
<div class="l">{{pd.id}} Power Distributor</div>
<div class="r">{{pd.c.mass}} <u>T</u></div>
@@ -141,7 +168,7 @@
<div class="l">SYS: {{pd.c.systemcapacity}} <u>MJ</u> / {{pd.c.systemrecharge}} <u>MW</u></div>
<div class="l">ENG: {{pd.c.enginecapacity}} <u>MJ</u> / {{pd.c.enginerecharge}} <u>MW</u></div>
</div>
<div component-select class="select" s="pd" opts="availCS.common[4]" ng-if="selectedSlot==pd" ng-click="select('c',pd,$event)"></div>
<div component-select class="select" s="pd" warning="pdWarning" opts="availCS.common[4]" ng-if="selectedSlot==pd" ng-click="select('c',pd,$event)"></div>
</div>
<div class="slot" ng-click="selectSlot($event, ss)" ng-class="{selected: selectedSlot==ss}">
<div class="details">
@@ -165,17 +192,17 @@
<div id="internal" class="group">
<h1>Internal Compartments</h1>
<div class="slot" ng-repeat="i in ship.internal" ng-click="selectSlot($event, i)" ng-class="{selected: selectedSlot==i}">
<div class="slot" ng-repeat="i in ship.internal" ng-click="selectSlot($event, i)" context-menu="select('i', i, $event, 'empty')" ng-class="{selected: selectedSlot==i}">
<div slot-internal class="details" slot="i" lbl="GMAP[i.c.grp]" fuel="ship.fuelCapacity"></div>
<div class="select" ng-if="selectedSlot==i" ng-click="select('i',i,$event)">
<div component-select s="i" groups="availCS.getInts(i.maxClass)"></div>
<div component-select s="i" groups="availCS.getInts(i.maxClass, i.eligible)"></div>
</div>
</div>
</div>
<div id="hardpoints" class="group">
<h1>HardPoints</h1>
<div class="slot" ng-repeat="h in ship.hardpoints | filter:{maxClass: '!0'}" ng-click="selectSlot($event, h)" ng-class="{selected: selectedSlot==h}">
<div class="slot" ng-repeat="h in ship.hardpoints | filter:{maxClass: '!0'}" ng-click="selectSlot($event, h)" context-menu="select('h', h, $event, 'empty')" ng-class="{selected: selectedSlot==h}">
<div slot-hardpoint class="details" hp="h" size="HPC[h.maxClass]" lbl="GMAP[h.c.grp]"></div>
<div class="select" ng-class="{hardpoint: h.maxClass > 0}" ng-if="selectedSlot==h" ng-click="select('h',h,$event)">
<div component-select s="h" groups="availCS.getHps(h.maxClass)"></div>
@@ -185,7 +212,7 @@
<div id="utility" class="group">
<h1>Utility Mounts</h1>
<div class="slot" ng-repeat="h in ship.hardpoints | filter:{maxClass: '0'}" ng-click="selectSlot($event, h)" ng-class="{selected: selectedSlot==h}">
<div class="slot" ng-repeat="h in ship.hardpoints | filter:{maxClass: '0'}" ng-click="selectSlot($event, h)" context-menu="select('h', h, $event, 'empty')" ng-class="{selected: selectedSlot==h}">
<div slot-hardpoint class="details" hp="h" size="HPC[h.maxClass]" lbl="GMAP[h.c.grp]"></div>
<div class="select" ng-class="{hardpoint: h.maxClass > 0}" ng-if="selectedSlot==h" ng-click="select('h',h,$event)">
<div component-select s="h" groups="availCS.getHps(h.maxClass)"></div>
@@ -193,7 +220,7 @@
</div>
</div>
<div class="group dbl" id="componentPriority">
<div class="group half" id="componentPriority">
<table style="width:100%">
<thead>
<tr class="main">
@@ -207,7 +234,7 @@
</thead>
<tbody>
<tr>
<td ng-click="togglePwr(c)">{{pp.c.class}}{{pp.c.rating}}</td>
<td>{{pp.c.class}}{{pp.c.rating}}</td>
<td class="le shorten">Power Plant</td>
<td><u>SYS</u></td>
<td>1</td>
@@ -217,7 +244,7 @@
<td></td>
</tr>
<tr><td style="line-height:0;" colspan="8"><hr style="margin: 0 0 3px;background: #ff8c0d;border: 0;height: 1px;" /></td></tr>
<tr ng-repeat="c in powerList | orderBy:pwrPredicate:pwrDesc" ng-if="c.c.power" ng-class="{disabled:!c.enabled}">
<tr class="highlight" ng-repeat="c in powerList | orderBy:pwrPredicate:pwrDesc" ng-if="c.c.power" ng-class="{disabled:!c.enabled}">
<td style="width:1em;" ng-click="togglePwr(c)">{{c.c.class}}{{c.c.rating}}</td>
<td class="le shorten" ng-click="togglePwr(c)" ng-bind="cName(c)"></td>
<td ng-click="togglePwr(c)"><u ng-bind="c.type"></u></td>
@@ -233,23 +260,37 @@
<div style="margin-top: 1em" power-bands bands="priorityBands" available="ship.powerAvailable"></div>
</div>
<div class="group dbl">
<table style="width:100%">
<div class="group half">
<table class="tabs">
<thead>
<tr class="main">
<th colspan="2" class="sortable le" ng-click="sortCost(cName)">Component</th>
<th class="sortable le" ng-click="sortCost('c.cost')">Credits</th>
<tr>
<th style="width:50%" ng-class="{active: costTab == 'retrofit'}" ng-click="updateCostTab('retrofit')">Retrofit Costs</th>
<th style="width:50%" ng-class="{active: costTab == 'costs'}" ng-click="updateCostTab('costs')">Costs</th>
</tr>
</thead>
<tbody>
<tr class="toggleable" ng-repeat="c in costList | orderBy:costPredicate:costDesc" ng-if="c.c.cost > 0" ng-class="{disabled:!c.incCost}" ng-click="toggleCost(c)">
<td style="width:1em;">{{c.c.class}}{{c.c.rating}}</td>
<td class="le shorten" ng-bind="cName(c)"></td>
<td class="ri">{{fCrd(c.c.cost)}} <u>CR</u></td>
</tr>
</tbody>
</table>
<table class="total">
<div ng-if="costTab == 'costs'">
<table style="width:100%">
<thead>
<tr class="main">
<th colspan="2" class="sortable le" ng-click="sortCost(cName)">
Component
<u class="optional-hide" ng-if="discounts.ship < 1">[Ship {{fRPct(1 - discounts.ship)}} off]</u>
<u class="optional-hide" ng-if="discounts.components < 1">[Components {{fRPct(1 - discounts.components)}} off]</u>
</th>
<th class="sortable le" ng-click="sortCost('discountedCost')">Credits</th>
</tr>
</thead>
<tbody>
<tr class="highlight" ng-repeat="item in costList | orderBy:costPredicate:costDesc" ng-if="item.c.cost > 0" ng-class="{disabled:!item.incCost}">
<td class="toggleable" style="width:1em;" ng-click="toggleCost(item)">{{item.c.class}}{{item.c.rating}}</td>
<td class="le toggleable shorten" ng-click="toggleCost(item)">{{cName(item)}}</td>
<td class="ri toggleable" ng-click="toggleCost(item)">{{fCrd(item.discountedCost)}} <u>CR</u></td>
</tr>
</tbody>
</table>
<table class="total">
<tr class="ri">
<td class="lbl">Total</td>
<td>{{fCrd(ship.totalCost)}} <u>CR</u></td>
@@ -258,16 +299,74 @@
<td class="lbl">Insurance</td>
<td>{{fCrd(ship.totalCost * insurance.current.pct)}} <u>CR</u></td>
</tr>
</table>
</table>
</div>
<div ng-if="costTab == 'retrofit'">
<div class="scroll-x">
<table style="width:100%">
<thead>
<tr class="main">
<th colspan="2" class="sortable le" ng-click="sortRetrofit('sellName')">Sell</th>
<th colspan="2" class="sortable le" ng-click="sortRetrofit('buyName')">Buy</th>
<th class="sortable le" ng-click="sortRetrofit('netCost')">
Net Cost <u class="optional-hide" ng-if="discounts.components < 1">[{{fRPct(1 - discounts.components)}} off]</u>
</th>
</tr>
</thead>
<tbody>
<tr ng-if="!retrofitList || retrofitList.length == 0">
<td colspan="5" style="padding: 3em 0;">No Retrofitting changes</td>
</tr>
<tr class="highlight" ng-repeat="item in retrofitList | orderBy:retroPredicate:retroDesc">
<td style="width:1em;">{{item.sellClassRating}}</td>
<td class="le shorten">{{item.sellName}}</td>
<td style="width:1em;">{{item.buyClassRating}}</td>
<td class="le shorten">{{item.buyName}}</td>
<td class="ri" ng-class="item.netCost > 0 ? 'warning' : 'secondary-disabled'">{{ fCrd(item.netCost)}} <u>CR</u></td>
</tr>
</tbody>
</table>
</div>
<table class="total">
<tr class="ri">
<td class="lbl">Cost</td>
<td colspan="2" ng-class="retrofitTotal > 0 ? 'warning' : 'secondary-disabled'">{{fCrd(retrofitTotal)}} <u>CR</u></td>
</tr>
<tr class="ri">
<td class="lbl">Retrofit from</td>
<td class="cen" style="border-right:none;width: 1em;"><u class="primary-disabled">&#9662;</u></td>
<td style="border-left:none;padding:0;">
<select style="width: 100%;padding: 0" ng-model="$parent.retrofitBuild" ng-change="setRetrofitBase()" ng-options="name as name for (name, build) in allBuilds[ship.id]">
<option value="">Stock / Standard</option>
</select>
</td>
</tr>
</table>
</div>
</div>
<div class="group dbl">
<div class="group half">
<h1>Jump Range</h1>
<div class="cen">
<div area-chart config="jrChart" series="jrSeries"></div>
<div slider max="ship.fuelCapacity" unit="'T'" on-change="::fuelChange(val)" style="position:relative; margin: 0 auto;">
<div line-chart config="jrChart" series="jrSeries"></div>
</div>
<div class="group half">
<h1>Total Range</h1>
<div line-chart config="trChart" series="trSeries"></div>
</div>
<!-- TODO: Add back in once calcSpeed is dynamic and accurate
<div class="group third">
<h1>Thruster Speed</h1>
<div line-chart config="speedChart" series="speedSeries"></div>
</div>
-->
<div class="group half">
<div slider max="ship.fuelCapacity" unit="'T'" on-change="::fuelChange(val)" style="position:relative; margin: 0 auto;">
<svg class="icon xl primary-disabled" style="position:absolute;height: 100%;"><use xlink:href="#fuel"></use></svg>
</div>
</div>
</div>

View File

@@ -21,11 +21,11 @@
"dependencies": {
"d3": "~3.5.5",
"ng-lodash": "~0.2.0",
"ui-router-extras": "~0.0.13",
"ui-router-extras": "0.0.13",
"angular-ui-router": "^0.2.15",
"d3-tip": "~0.6.7",
"ng-sortable": "~1.2.1",
"lz-string": "~1.4.3",
"lz-string": "~1.4.4",
"angular": "~1.4.0"
},
"overrides": {

View File

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

View File

@@ -1,562 +1,42 @@
{
"8E": {
"grp": "pd",
"class": 8,
"rating": "E",
"cost": 697584,
"mass": 160,
"power": 0.64,
"weaponcapacity": 48,
"weaponrecharge": 4.8,
"enginecapacity": 32,
"enginerecharge": 3.2,
"systemcapacity": 32,
"systemrecharge": 3.2
},
"8D": {
"grp": "pd",
"class": 8,
"rating": "D",
"cost": 1743961,
"mass": 64,
"power": 0.72,
"weaponcapacity": 54,
"weaponrecharge": 5.4,
"enginecapacity": 36,
"enginerecharge": 3.6,
"systemcapacity": 36,
"systemrecharge": 3.6
},
"8C": {
"grp": "pd",
"class": 8,
"rating": "C",
"cost": 4359903,
"mass": 160,
"power": 0.8,
"weaponcapacity": 60,
"weaponrecharge": 6,
"enginecapacity": 40,
"enginerecharge": 4,
"systemcapacity": 40,
"systemrecharge": 4
},
"8B": {
"grp": "pd",
"class": 8,
"rating": "B",
"cost": 10899756,
"mass": 256,
"power": 0.88,
"weaponcapacity": 66,
"weaponrecharge": 6.6,
"enginecapacity": 44,
"enginerecharge": 4.4,
"systemcapacity": 44,
"systemrecharge": 4.4
},
"8A": {
"grp": "pd",
"class": 8,
"rating": "A",
"cost": 27249391,
"mass": 160,
"power": 0.96,
"weaponcapacity": 72,
"weaponrecharge": 7.2,
"enginecapacity": 48,
"enginerecharge": 4.8,
"systemcapacity": 48,
"systemrecharge": 4.8
},
"7E": {
"grp": "pd",
"class": 7,
"rating": "E",
"cost": 249137,
"mass": 80,
"power": 0.59,
"weaponcapacity": 41,
"weaponrecharge": 4.1,
"enginecapacity": 27,
"enginerecharge": 2.6,
"systemcapacity": 27,
"systemrecharge": 2.6
},
"7D": {
"grp": "pd",
"class": 7,
"rating": "D",
"cost": 622843,
"mass": 32,
"power": 0.67,
"weaponcapacity": 46,
"weaponrecharge": 4.6,
"enginecapacity": 31,
"enginerecharge": 3,
"systemcapacity": 31,
"systemrecharge": 3
},
"7C": {
"grp": "pd",
"class": 7,
"rating": "C",
"cost": 1557108,
"mass": 80,
"power": 0.74,
"weaponcapacity": 51,
"weaponrecharge": 5.1,
"enginecapacity": 34,
"enginerecharge": 3.3,
"systemcapacity": 34,
"systemrecharge": 3.3
},
"7B": {
"grp": "pd",
"class": 7,
"rating": "B",
"cost": 3892770,
"mass": 128,
"power": 0.81,
"weaponcapacity": 56,
"weaponrecharge": 5.6,
"enginecapacity": 37,
"enginerecharge": 3.6,
"systemcapacity": 37,
"systemrecharge": 3.6
},
"7A": {
"grp": "pd",
"class": 7,
"rating": "A",
"cost": 9731925,
"mass": 80,
"power": 0.89,
"weaponcapacity": 61,
"weaponrecharge": 6.1,
"enginecapacity": 41,
"enginerecharge": 4,
"systemcapacity": 41,
"systemrecharge": 4
},
"6E": {
"grp": "pd",
"class": 6,
"rating": "E",
"cost": 88978,
"mass": 40,
"power": 0.54,
"weaponcapacity": 34,
"weaponrecharge": 3.4,
"enginecapacity": 23,
"enginerecharge": 2.2,
"systemcapacity": 23,
"systemrecharge": 2.2
},
"6D": {
"grp": "pd",
"class": 6,
"rating": "D",
"cost": 222444,
"mass": 16,
"power": 0.61,
"weaponcapacity": 38,
"weaponrecharge": 3.9,
"enginecapacity": 26,
"enginerecharge": 2.4,
"systemcapacity": 26,
"systemrecharge": 2.4
},
"6C": {
"grp": "pd",
"class": 6,
"rating": "C",
"cost": 556110,
"mass": 40,
"power": 0.68,
"weaponcapacity": 42,
"weaponrecharge": 4.3,
"enginecapacity": 29,
"enginerecharge": 2.7,
"systemcapacity": 29,
"systemrecharge": 2.7
},
"6B": {
"grp": "pd",
"class": 6,
"rating": "B",
"cost": 1390275,
"mass": 64,
"power": 0.75,
"weaponcapacity": 46,
"weaponrecharge": 4.7,
"enginecapacity": 32,
"enginerecharge": 3,
"systemcapacity": 32,
"systemrecharge": 3
},
"6A": {
"grp": "pd",
"class": 6,
"rating": "A",
"cost": 3475688,
"mass": 40,
"power": 0.82,
"weaponcapacity": 50,
"weaponrecharge": 5.2,
"enginecapacity": 35,
"enginerecharge": 3.2,
"systemcapacity": 35,
"systemrecharge": 3.2
},
"5E": {
"grp": "pd",
"class": 5,
"rating": "E",
"cost": 31778,
"mass": 20,
"power": 0.5,
"weaponcapacity": 27,
"weaponrecharge": 2.9,
"enginecapacity": 19,
"enginerecharge": 1.7,
"systemcapacity": 19,
"systemrecharge": 1.7
},
"5D": {
"grp": "pd",
"class": 5,
"rating": "D",
"cost": 79444,
"mass": 8,
"power": 0.56,
"weaponcapacity": 31,
"weaponrecharge": 3.2,
"enginecapacity": 22,
"enginerecharge": 1.9,
"systemcapacity": 22,
"systemrecharge": 1.9
},
"5C": {
"grp": "pd",
"class": 5,
"rating": "C",
"cost": 198611,
"mass": 20,
"power": 0.62,
"weaponcapacity": 34,
"weaponrecharge": 3.6,
"enginecapacity": 24,
"enginerecharge": 2.1,
"systemcapacity": 24,
"systemrecharge": 2.1
},
"5B": {
"grp": "pd",
"class": 5,
"rating": "B",
"cost": 496527,
"mass": 32,
"power": 0.68,
"weaponcapacity": 37,
"weaponrecharge": 4,
"enginecapacity": 26,
"enginerecharge": 2.3,
"systemcapacity": 26,
"systemrecharge": 2.3
},
"5A": {
"grp": "pd",
"class": 5,
"rating": "A",
"cost": 1241317,
"mass": 20,
"power": 0.74,
"weaponcapacity": 41,
"weaponrecharge": 4.3,
"enginecapacity": 29,
"enginerecharge": 2.5,
"systemcapacity": 29,
"systemrecharge": 2.5
},
"4E": {
"grp": "pd",
"class": 4,
"rating": "E",
"cost": 11349,
"mass": 10,
"power": 0.45,
"weaponcapacity": 22,
"weaponrecharge": 2.3,
"enginecapacity": 15,
"enginerecharge": 1.3,
"systemcapacity": 15,
"systemrecharge": 1.3
},
"4D": {
"grp": "pd",
"class": 4,
"rating": "D",
"cost": 28373,
"mass": 4,
"power": 0.5,
"weaponcapacity": 24,
"weaponrecharge": 2.6,
"enginecapacity": 17,
"enginerecharge": 1.4,
"systemcapacity": 17,
"systemrecharge": 1.4
},
"4C": {
"grp": "pd",
"class": 4,
"rating": "C",
"cost": 70932,
"mass": 10,
"power": 0.56,
"weaponcapacity": 27,
"weaponrecharge": 2.9,
"enginecapacity": 19,
"enginerecharge": 1.6,
"systemcapacity": 19,
"systemrecharge": 1.6
},
"4B": {
"grp": "pd",
"class": 4,
"rating": "B",
"cost": 177331,
"mass": 16,
"power": 0.62,
"weaponcapacity": 30,
"weaponrecharge": 3.2,
"enginecapacity": 21,
"enginerecharge": 1.8,
"systemcapacity": 21,
"systemrecharge": 1.8
},
"4A": {
"grp": "pd",
"class": 4,
"rating": "A",
"cost": 443328,
"mass": 10,
"power": 0.67,
"weaponcapacity": 32,
"weaponrecharge": 3.5,
"enginecapacity": 23,
"enginerecharge": 1.9,
"systemcapacity": 23,
"systemrecharge": 1.9
},
"3E": {
"grp": "pd",
"class": 3,
"rating": "E",
"cost": 4053,
"mass": 5,
"power": 0.4,
"weaponcapacity": 16,
"weaponrecharge": 1.8,
"enginecapacity": 12,
"enginerecharge": 0.9,
"systemcapacity": 12,
"systemrecharge": 0.9
},
"3D": {
"grp": "pd",
"class": 3,
"rating": "D",
"cost": 10133,
"mass": 2,
"power": 0.45,
"weaponcapacity": 18,
"weaponrecharge": 2.1,
"enginecapacity": 14,
"enginerecharge": 1,
"systemcapacity": 14,
"systemrecharge": 1
},
"3C": {
"grp": "pd",
"class": 3,
"rating": "C",
"cost": 25333,
"mass": 5,
"power": 0.5,
"weaponcapacity": 20,
"weaponrecharge": 2.3,
"enginecapacity": 15,
"enginerecharge": 1.1,
"systemcapacity": 15,
"systemrecharge": 1.1
},
"3B": {
"grp": "pd",
"class": 3,
"rating": "B",
"cost": 63333,
"mass": 8,
"power": 0.55,
"weaponcapacity": 22,
"weaponrecharge": 2.5,
"enginecapacity": 17,
"enginerecharge": 1.2,
"systemcapacity": 17,
"systemrecharge": 1.2
},
"3A": {
"grp": "pd",
"class": 3,
"rating": "A",
"cost": 158331,
"mass": 5,
"power": 0.6,
"weaponcapacity": 24,
"weaponrecharge": 2.8,
"enginecapacity": 18,
"enginerecharge": 1.3,
"systemcapacity": 18,
"systemrecharge": 1.3
},
"2E": {
"grp": "pd",
"class": 2,
"rating": "E",
"cost": 1448,
"mass": 2.5,
"power": 0.36,
"weaponcapacity": 12,
"weaponrecharge": 1.4,
"enginecapacity": 10,
"enginerecharge": 0.6,
"systemcapacity": 10,
"systemrecharge": 0.6
},
"2D": {
"grp": "pd",
"class": 2,
"rating": "D",
"cost": 3619,
"mass": 1,
"power": 0.41,
"weaponcapacity": 14,
"weaponrecharge": 1.6,
"enginecapacity": 11,
"enginerecharge": 0.6,
"systemcapacity": 11,
"systemrecharge": 0.6
},
"2C": {
"grp": "pd",
"class": 2,
"rating": "C",
"cost": 9048,
"mass": 2.5,
"power": 0.45,
"weaponcapacity": 15,
"weaponrecharge": 1.8,
"enginecapacity": 12,
"enginerecharge": 0.7,
"systemcapacity": 12,
"systemrecharge": 0.7
},
"2B": {
"grp": "pd",
"class": 2,
"rating": "B",
"cost": 22619,
"mass": 4,
"power": 0.5,
"weaponcapacity": 17,
"weaponrecharge": 2,
"enginecapacity": 13,
"enginerecharge": 0.8,
"systemcapacity": 13,
"systemrecharge": 0.8
},
"2A": {
"grp": "pd",
"class": 2,
"rating": "A",
"cost": 56547,
"mass": 2.5,
"power": 0.54,
"weaponcapacity": 18,
"weaponrecharge": 2.2,
"enginecapacity": 14,
"enginerecharge": 0.8,
"systemcapacity": 14,
"systemrecharge": 0.8
},
"1E": {
"grp": "pd",
"class": 1,
"rating": "E",
"cost": 517,
"mass": 1.3,
"power": 0.32,
"weaponcapacity": 10,
"weaponrecharge": 1.2,
"enginecapacity": 8,
"enginerecharge": 0.4,
"systemcapacity": 8,
"systemrecharge": 0.4
},
"1D": {
"grp": "pd",
"class": 1,
"rating": "D",
"cost": 1293,
"mass": 0.5,
"power": 0.36,
"weaponcapacity": 11,
"weaponrecharge": 1.4,
"enginecapacity": 9,
"enginerecharge": 0.5,
"systemcapacity": 9,
"systemrecharge": 0.5
},
"1C": {
"grp": "pd",
"class": 1,
"rating": "C",
"cost": 3231,
"mass": 1.3,
"power": 0.4,
"weaponcapacity": 12,
"weaponrecharge": 1.5,
"enginecapacity": 10,
"enginerecharge": 0.5,
"systemcapacity": 10,
"systemrecharge": 0.5
},
"1B": {
"grp": "pd",
"class": 1,
"rating": "B",
"cost": 8078,
"mass": 2,
"power": 0.44,
"weaponcapacity": 13,
"weaponrecharge": 1.7,
"enginecapacity": 11,
"enginerecharge": 0.6,
"systemcapacity": 11,
"systemrecharge": 0.6
},
"1A": {
"grp": "pd",
"class": 1,
"rating": "A",
"cost": 20195,
"mass": 1.3,
"power": 0.48,
"weaponcapacity": 14,
"weaponrecharge": 1.8,
"enginecapacity": 12,
"enginerecharge": 0.6,
"systemcapacity": 12,
"systemrecharge": 0.6
}
"8E": { "grp": "pd", "class": 8, "rating": "E", "cost": 697584, "mass": 160, "power": 0.64, "weaponcapacity": 48, "weaponrecharge": 4.8, "enginecapacity": 32, "enginerecharge": 3.2, "systemcapacity": 32, "systemrecharge": 3.2 },
"8D": { "grp": "pd", "class": 8, "rating": "D", "cost": 1743961, "mass": 64, "power": 0.72, "weaponcapacity": 54, "weaponrecharge": 5.4, "enginecapacity": 36, "enginerecharge": 3.6, "systemcapacity": 36, "systemrecharge": 3.6 },
"8C": { "grp": "pd", "class": 8, "rating": "C", "cost": 4359903, "mass": 160, "power": 0.8, "weaponcapacity": 60, "weaponrecharge": 6, "enginecapacity": 40, "enginerecharge": 4, "systemcapacity": 40, "systemrecharge": 4 },
"8B": { "grp": "pd", "class": 8, "rating": "B", "cost": 10899756, "mass": 256, "power": 0.88, "weaponcapacity": 66, "weaponrecharge": 6.6, "enginecapacity": 44, "enginerecharge": 4.4, "systemcapacity": 44, "systemrecharge": 4.4 },
"8A": { "grp": "pd", "class": 8, "rating": "A", "cost": 27249391, "mass": 160, "power": 0.96, "weaponcapacity": 72, "weaponrecharge": 7.2, "enginecapacity": 48, "enginerecharge": 4.8, "systemcapacity": 48, "systemrecharge": 4.8 },
"7E": { "grp": "pd", "class": 7, "rating": "E", "cost": 249137, "mass": 80, "power": 0.59, "weaponcapacity": 41, "weaponrecharge": 4.1, "enginecapacity": 27, "enginerecharge": 2.6, "systemcapacity": 27, "systemrecharge": 2.6 },
"7D": { "grp": "pd", "class": 7, "rating": "D", "cost": 622843, "mass": 32, "power": 0.67, "weaponcapacity": 46, "weaponrecharge": 4.6, "enginecapacity": 31, "enginerecharge": 3, "systemcapacity": 31, "systemrecharge": 3 },
"7C": { "grp": "pd", "class": 7, "rating": "C", "cost": 1557108, "mass": 80, "power": 0.74, "weaponcapacity": 51, "weaponrecharge": 5.1, "enginecapacity": 34, "enginerecharge": 3.3, "systemcapacity": 34, "systemrecharge": 3.3 },
"7B": { "grp": "pd", "class": 7, "rating": "B", "cost": 3892770, "mass": 128, "power": 0.81, "weaponcapacity": 56, "weaponrecharge": 5.6, "enginecapacity": 37, "enginerecharge": 3.6, "systemcapacity": 37, "systemrecharge": 3.6 },
"7A": { "grp": "pd", "class": 7, "rating": "A", "cost": 9731925, "mass": 80, "power": 0.89, "weaponcapacity": 61, "weaponrecharge": 6.1, "enginecapacity": 41, "enginerecharge": 4, "systemcapacity": 41, "systemrecharge": 4 },
"6E": { "grp": "pd", "class": 6, "rating": "E", "cost": 88978, "mass": 40, "power": 0.54, "weaponcapacity": 34, "weaponrecharge": 3.4, "enginecapacity": 23, "enginerecharge": 2.2, "systemcapacity": 23, "systemrecharge": 2.2 },
"6D": { "grp": "pd", "class": 6, "rating": "D", "cost": 222444, "mass": 16, "power": 0.61, "weaponcapacity": 38, "weaponrecharge": 3.9, "enginecapacity": 26, "enginerecharge": 2.4, "systemcapacity": 26, "systemrecharge": 2.4 },
"6C": { "grp": "pd", "class": 6, "rating": "C", "cost": 556110, "mass": 40, "power": 0.68, "weaponcapacity": 42, "weaponrecharge": 4.3, "enginecapacity": 29, "enginerecharge": 2.7, "systemcapacity": 29, "systemrecharge": 2.7 },
"6B": { "grp": "pd", "class": 6, "rating": "B", "cost": 1390275, "mass": 64, "power": 0.75, "weaponcapacity": 46, "weaponrecharge": 4.7, "enginecapacity": 32, "enginerecharge": 3, "systemcapacity": 32, "systemrecharge": 3 },
"6A": { "grp": "pd", "class": 6, "rating": "A", "cost": 3475688, "mass": 40, "power": 0.82, "weaponcapacity": 50, "weaponrecharge": 5.2, "enginecapacity": 35, "enginerecharge": 3.2, "systemcapacity": 35, "systemrecharge": 3.2 },
"5E": { "grp": "pd", "class": 5, "rating": "E", "cost": 31778, "mass": 20, "power": 0.5, "weaponcapacity": 27, "weaponrecharge": 2.9, "enginecapacity": 19, "enginerecharge": 1.7, "systemcapacity": 19, "systemrecharge": 1.7 },
"5D": { "grp": "pd", "class": 5, "rating": "D", "cost": 79444, "mass": 8, "power": 0.56, "weaponcapacity": 31, "weaponrecharge": 3.2, "enginecapacity": 22, "enginerecharge": 1.9, "systemcapacity": 22, "systemrecharge": 1.9 },
"5C": { "grp": "pd", "class": 5, "rating": "C", "cost": 198611, "mass": 20, "power": 0.62, "weaponcapacity": 34, "weaponrecharge": 3.6, "enginecapacity": 24, "enginerecharge": 2.1, "systemcapacity": 24, "systemrecharge": 2.1 },
"5B": { "grp": "pd", "class": 5, "rating": "B", "cost": 496527, "mass": 32, "power": 0.68, "weaponcapacity": 37, "weaponrecharge": 4, "enginecapacity": 26, "enginerecharge": 2.3, "systemcapacity": 26, "systemrecharge": 2.3 },
"5A": { "grp": "pd", "class": 5, "rating": "A", "cost": 1241317, "mass": 20, "power": 0.74, "weaponcapacity": 41, "weaponrecharge": 4.3, "enginecapacity": 29, "enginerecharge": 2.5, "systemcapacity": 29, "systemrecharge": 2.5 },
"4E": { "grp": "pd", "class": 4, "rating": "E", "cost": 11349, "mass": 10, "power": 0.45, "weaponcapacity": 22, "weaponrecharge": 2.3, "enginecapacity": 15, "enginerecharge": 1.3, "systemcapacity": 15, "systemrecharge": 1.3 },
"4D": { "grp": "pd", "class": 4, "rating": "D", "cost": 28373, "mass": 4, "power": 0.5, "weaponcapacity": 24, "weaponrecharge": 2.6, "enginecapacity": 17, "enginerecharge": 1.4, "systemcapacity": 17, "systemrecharge": 1.4 },
"4C": { "grp": "pd", "class": 4, "rating": "C", "cost": 70932, "mass": 10, "power": 0.56, "weaponcapacity": 27, "weaponrecharge": 2.9, "enginecapacity": 19, "enginerecharge": 1.6, "systemcapacity": 19, "systemrecharge": 1.6 },
"4B": { "grp": "pd", "class": 4, "rating": "B", "cost": 177331, "mass": 16, "power": 0.62, "weaponcapacity": 30, "weaponrecharge": 3.2, "enginecapacity": 21, "enginerecharge": 1.8, "systemcapacity": 21, "systemrecharge": 1.8 },
"4A": { "grp": "pd", "class": 4, "rating": "A", "cost": 443328, "mass": 10, "power": 0.67, "weaponcapacity": 32, "weaponrecharge": 3.5, "enginecapacity": 23, "enginerecharge": 1.9, "systemcapacity": 23, "systemrecharge": 1.9 },
"3E": { "grp": "pd", "class": 3, "rating": "E", "cost": 4053, "mass": 5, "power": 0.4, "weaponcapacity": 16, "weaponrecharge": 1.8, "enginecapacity": 12, "enginerecharge": 0.9, "systemcapacity": 12, "systemrecharge": 0.9 },
"3D": { "grp": "pd", "class": 3, "rating": "D", "cost": 10133, "mass": 2, "power": 0.45, "weaponcapacity": 18, "weaponrecharge": 2.1, "enginecapacity": 14, "enginerecharge": 1, "systemcapacity": 14, "systemrecharge": 1 },
"3C": { "grp": "pd", "class": 3, "rating": "C", "cost": 25333, "mass": 5, "power": 0.5, "weaponcapacity": 20, "weaponrecharge": 2.3, "enginecapacity": 15, "enginerecharge": 1.1, "systemcapacity": 15, "systemrecharge": 1.1 },
"3B": { "grp": "pd", "class": 3, "rating": "B", "cost": 63333, "mass": 8, "power": 0.55, "weaponcapacity": 22, "weaponrecharge": 2.5, "enginecapacity": 17, "enginerecharge": 1.2, "systemcapacity": 17, "systemrecharge": 1.2 },
"3A": { "grp": "pd", "class": 3, "rating": "A", "cost": 158331, "mass": 5, "power": 0.6, "weaponcapacity": 24, "weaponrecharge": 2.8, "enginecapacity": 18, "enginerecharge": 1.3, "systemcapacity": 18, "systemrecharge": 1.3 },
"2E": { "grp": "pd", "class": 2, "rating": "E", "cost": 1448, "mass": 2.5, "power": 0.36, "weaponcapacity": 12, "weaponrecharge": 1.4, "enginecapacity": 10, "enginerecharge": 0.6, "systemcapacity": 10, "systemrecharge": 0.6 },
"2D": { "grp": "pd", "class": 2, "rating": "D", "cost": 3619, "mass": 1, "power": 0.41, "weaponcapacity": 14, "weaponrecharge": 1.6, "enginecapacity": 11, "enginerecharge": 0.6, "systemcapacity": 11, "systemrecharge": 0.6 },
"2C": { "grp": "pd", "class": 2, "rating": "C", "cost": 9048, "mass": 2.5, "power": 0.45, "weaponcapacity": 15, "weaponrecharge": 1.8, "enginecapacity": 12, "enginerecharge": 0.7, "systemcapacity": 12, "systemrecharge": 0.7 },
"2B": { "grp": "pd", "class": 2, "rating": "B", "cost": 22619, "mass": 4, "power": 0.5, "weaponcapacity": 17, "weaponrecharge": 2, "enginecapacity": 13, "enginerecharge": 0.8, "systemcapacity": 13, "systemrecharge": 0.8 },
"2A": { "grp": "pd", "class": 2, "rating": "A", "cost": 56547, "mass": 2.5, "power": 0.54, "weaponcapacity": 18, "weaponrecharge": 2.2, "enginecapacity": 14, "enginerecharge": 0.8, "systemcapacity": 14, "systemrecharge": 0.8 },
"1E": { "grp": "pd", "class": 1, "rating": "E", "cost": 517, "mass": 1.3, "power": 0.32, "weaponcapacity": 10, "weaponrecharge": 1.2, "enginecapacity": 8, "enginerecharge": 0.4, "systemcapacity": 8, "systemrecharge": 0.4 },
"1D": { "grp": "pd", "class": 1, "rating": "D", "cost": 1293, "mass": 0.5, "power": 0.36, "weaponcapacity": 11, "weaponrecharge": 1.4, "enginecapacity": 9, "enginerecharge": 0.5, "systemcapacity": 9, "systemrecharge": 0.5 },
"1C": { "grp": "pd", "class": 1, "rating": "C", "cost": 3231, "mass": 1.3, "power": 0.4, "weaponcapacity": 12, "weaponrecharge": 1.5, "enginecapacity": 10, "enginerecharge": 0.5, "systemcapacity": 10, "systemrecharge": 0.5 },
"1B": { "grp": "pd", "class": 1, "rating": "B", "cost": 8078, "mass": 2, "power": 0.44, "weaponcapacity": 13, "weaponrecharge": 1.7, "enginecapacity": 11, "enginerecharge": 0.6, "systemcapacity": 11, "systemrecharge": 0.6 },
"1A": { "grp": "pd", "class": 1, "rating": "A", "cost": 20195, "mass": 1.3, "power": 0.48, "weaponcapacity": 14, "weaponrecharge": 1.8, "enginecapacity": 12, "enginerecharge": 0.6, "systemcapacity": 12, "systemrecharge": 0.6 }
}

View File

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

View File

@@ -1,302 +1,32 @@
{
"7E": {
"grp": "t",
"class": 7,
"rating": "E",
"cost": 633199,
"mass": 80,
"power": 6.08,
"optmass": 1440,
"maxmass": 2160
},
"7D": {
"grp": "t",
"class": 7,
"rating": "D",
"cost": 1899597,
"mass": 32,
"power": 6.84,
"optmass": 1620,
"maxmass": 2430
},
"7C": {
"grp": "t",
"class": 7,
"rating": "C",
"cost": 5698790,
"mass": 80,
"power": 7.6,
"optmass": 1800,
"maxmass": 2700
},
"7B": {
"grp": "t",
"class": 7,
"rating": "B",
"cost": 17096371,
"mass": 128,
"power": 8.36,
"optmass": 1980,
"maxmass": 2970
},
"7A": {
"grp": "t",
"class": 7,
"rating": "A",
"cost": 51289112,
"mass": 80,
"power": 9.12,
"optmass": 2160,
"maxmass": 3240
},
"6E": {
"grp": "t",
"class": 6,
"rating": "E",
"cost": 199747,
"mass": 40,
"power": 5.04,
"optmass": 960,
"maxmass": 1440
},
"6D": {
"grp": "t",
"class": 6,
"rating": "D",
"cost": 599242,
"mass": 16,
"power": 5.67,
"optmass": 1080,
"maxmass": 1620
},
"6C": {
"grp": "t",
"class": 6,
"rating": "C",
"cost": 1797726,
"mass": 40,
"power": 6.3,
"optmass": 1200,
"maxmass": 1800
},
"6B": {
"grp": "t",
"class": 6,
"rating": "B",
"cost": 5393177,
"mass": 64,
"power": 6.93,
"optmass": 1320,
"maxmass": 1980
},
"6A": {
"grp": "t",
"class": 6,
"rating": "A",
"cost": 16179531,
"mass": 40,
"power": 7.56,
"optmass": 1440,
"maxmass": 2160
},
"5E": {
"grp": "t",
"class": 5,
"rating": "E",
"cost": 63012,
"mass": 20,
"power": 4.08,
"optmass": 560,
"maxmass": 840
},
"5D": {
"grp": "t",
"class": 5,
"rating": "D",
"cost": 189035,
"mass": 8,
"power": 4.59,
"optmass": 630,
"maxmass": 945
},
"5C": {
"grp": "t",
"class": 5,
"rating": "C",
"cost": 567106,
"mass": 20,
"power": 5.1,
"optmass": 700,
"maxmass": 1050
},
"5B": {
"grp": "t",
"class": 5,
"rating": "B",
"cost": 1701318,
"mass": 32,
"power": 5.61,
"optmass": 770,
"maxmass": 1155
},
"5A": {
"grp": "t",
"class": 5,
"rating": "A",
"cost": 5103953,
"mass": 20,
"power": 6.12,
"optmass": 840,
"maxmass": 1260
},
"4E": {
"grp": "t",
"class": 4,
"rating": "E",
"cost": 19878,
"mass": 10,
"power": 3.82,
"optmass": 280,
"maxmass": 420
},
"4D": {
"grp": "t",
"class": 4,
"rating": "D",
"cost": 59633,
"mass": 4,
"power": 3.69,
"optmass": 315,
"maxmass": 473
},
"4C": {
"grp": "t",
"class": 4,
"rating": "C",
"cost": 178898,
"mass": 10,
"power": 4.1,
"optmass": 350,
"maxmass": 525
},
"4B": {
"grp": "t",
"class": 4,
"rating": "B",
"cost": 536693,
"mass": 16,
"power": 4.51,
"optmass": 385,
"maxmass": 578
},
"4A": {
"grp": "t",
"class": 4,
"rating": "A",
"cost": 1610080,
"mass": 10,
"power": 4.92,
"optmass": 420,
"maxmass": 630
},
"3E": {
"grp": "t",
"class": 3,
"rating": "E",
"cost": 6271,
"mass": 5,
"power": 2.48,
"optmass": 80,
"maxmass": 120
},
"3D": {
"grp": "t",
"class": 3,
"rating": "D",
"cost": 18812,
"mass": 2,
"power": 2.79,
"optmass": 90,
"maxmass": 135
},
"3C": {
"grp": "t",
"class": 3,
"rating": "C",
"cost": 56435,
"mass": 5,
"power": 3.1,
"optmass": 100,
"maxmass": 150
},
"3B": {
"grp": "t",
"class": 3,
"rating": "B",
"cost": 169304,
"mass": 8,
"power": 3.41,
"optmass": 110,
"maxmass": 165
},
"3A": {
"grp": "t",
"class": 3,
"rating": "A",
"cost": 507912,
"mass": 5,
"power": 3.72,
"optmass": 120,
"maxmass": 180
},
"2E": {
"grp": "t",
"class": 2,
"rating": "E",
"cost": 1978,
"mass": 2.5,
"power": 2,
"optmass": 48,
"maxmass": 72
},
"2D": {
"grp": "t",
"class": 2,
"rating": "D",
"cost": 5934,
"mass": 1,
"power": 2.25,
"optmass": 54,
"maxmass": 81
},
"2C": {
"grp": "t",
"class": 2,
"rating": "C",
"cost": 17803,
"mass": 2.5,
"power": 2.5,
"optmass": 60,
"maxmass": 90
},
"2B": {
"grp": "t",
"class": 2,
"rating": "B",
"cost": 53408,
"mass": 4,
"power": 2.75,
"optmass": 66,
"maxmass": 99
},
"2A": {
"grp": "t",
"class": 2,
"rating": "A",
"cost": 160224,
"mass": 2.5,
"power": 3,
"optmass": 72,
"maxmass": 108
}
"7E": { "grp": "t", "class": 7, "rating": "E", "cost": 633199, "mass": 80, "power": 6.08, "optmass": 1440, "maxmass": 2160 },
"7D": { "grp": "t", "class": 7, "rating": "D", "cost": 1899597, "mass": 32, "power": 6.84, "optmass": 1620, "maxmass": 2430 },
"7C": { "grp": "t", "class": 7, "rating": "C", "cost": 5698790, "mass": 80, "power": 7.6, "optmass": 1800, "maxmass": 2700 },
"7B": { "grp": "t", "class": 7, "rating": "B", "cost": 17096371, "mass": 128, "power": 8.36, "optmass": 1980, "maxmass": 2970 },
"7A": { "grp": "t", "class": 7, "rating": "A", "cost": 51289112, "mass": 80, "power": 9.12, "optmass": 2160, "maxmass": 3240 },
"6E": { "grp": "t", "class": 6, "rating": "E", "cost": 199747, "mass": 40, "power": 5.04, "optmass": 960, "maxmass": 1440 },
"6D": { "grp": "t", "class": 6, "rating": "D", "cost": 599242, "mass": 16, "power": 5.67, "optmass": 1080, "maxmass": 1620 },
"6C": { "grp": "t", "class": 6, "rating": "C", "cost": 1797726, "mass": 40, "power": 6.3, "optmass": 1200, "maxmass": 1800 },
"6B": { "grp": "t", "class": 6, "rating": "B", "cost": 5393177, "mass": 64, "power": 6.93, "optmass": 1320, "maxmass": 1980 },
"6A": { "grp": "t", "class": 6, "rating": "A", "cost": 16179531, "mass": 40, "power": 7.56, "optmass": 1440, "maxmass": 2160 },
"5E": { "grp": "t", "class": 5, "rating": "E", "cost": 63012, "mass": 20, "power": 4.08, "optmass": 560, "maxmass": 840 },
"5D": { "grp": "t", "class": 5, "rating": "D", "cost": 189035, "mass": 8, "power": 4.59, "optmass": 630, "maxmass": 945 },
"5C": { "grp": "t", "class": 5, "rating": "C", "cost": 567106, "mass": 20, "power": 5.1, "optmass": 700, "maxmass": 1050 },
"5B": { "grp": "t", "class": 5, "rating": "B", "cost": 1701318, "mass": 32, "power": 5.61, "optmass": 770, "maxmass": 1155 },
"5A": { "grp": "t", "class": 5, "rating": "A", "cost": 5103953, "mass": 20, "power": 6.12, "optmass": 840, "maxmass": 1260 },
"4E": { "grp": "t", "class": 4, "rating": "E", "cost": 19878, "mass": 10, "power": 3.82, "optmass": 280, "maxmass": 420 },
"4D": { "grp": "t", "class": 4, "rating": "D", "cost": 59633, "mass": 4, "power": 3.69, "optmass": 315, "maxmass": 473 },
"4C": { "grp": "t", "class": 4, "rating": "C", "cost": 178898, "mass": 10, "power": 4.1, "optmass": 350, "maxmass": 525 },
"4B": { "grp": "t", "class": 4, "rating": "B", "cost": 536693, "mass": 16, "power": 4.51, "optmass": 385, "maxmass": 578 },
"4A": { "grp": "t", "class": 4, "rating": "A", "cost": 1610080, "mass": 10, "power": 4.92, "optmass": 420, "maxmass": 630 },
"3E": { "grp": "t", "class": 3, "rating": "E", "cost": 6271, "mass": 5, "power": 2.48, "optmass": 80, "maxmass": 120 },
"3D": { "grp": "t", "class": 3, "rating": "D", "cost": 18812, "mass": 2, "power": 2.79, "optmass": 90, "maxmass": 135 },
"3C": { "grp": "t", "class": 3, "rating": "C", "cost": 56435, "mass": 5, "power": 3.1, "optmass": 100, "maxmass": 150 },
"3B": { "grp": "t", "class": 3, "rating": "B", "cost": 169304, "mass": 8, "power": 3.41, "optmass": 110, "maxmass": 165 },
"3A": { "grp": "t", "class": 3, "rating": "A", "cost": 507912, "mass": 5, "power": 3.72, "optmass": 120, "maxmass": 180 },
"2E": { "grp": "t", "class": 2, "rating": "E", "cost": 1978, "mass": 2.5, "power": 2, "optmass": 48, "maxmass": 72 },
"2D": { "grp": "t", "class": 2, "rating": "D", "cost": 5934, "mass": 1, "power": 2.25, "optmass": 54, "maxmass": 81 },
"2C": { "grp": "t", "class": 2, "rating": "C", "cost": 17803, "mass": 2.5, "power": 2.5, "optmass": 60, "maxmass": 90 },
"2B": { "grp": "t", "class": 2, "rating": "B", "cost": 53408, "mass": 4, "power": 2.75, "optmass": 66, "maxmass": 99 },
"2A": { "grp": "t", "class": 2, "rating": "A", "cost": 160224, "mass": 2.5, "power": 3, "optmass": 72, "maxmass": 108 }
}

View File

@@ -1,5 +1,5 @@
{
"Beam Lasers" : [
"Beam Laser": [
{
"id": "0u",
"grp": "bl",
@@ -161,6 +161,23 @@
"mjdps" : 5.49,
"mjeps" : 1.29,
"thermload": 2
},
{
"id": "b0",
"grp": "bl",
"name": "Retributor",
"class": 1,
"rating": "E",
"cost": 56145,
"mass": 2,
"power": 0.69,
"mode": "F",
"type": "T",
"damage": 0,
"armourpen": "A",
"rof": null,
"dps": 3,
"thermload": 1
}
]
}

View File

@@ -1,5 +1,5 @@
{
"Burst Lasers": [
"Burst Laser": [
{
"id": "14",
"grp": "ul",
@@ -161,6 +161,23 @@
"mjeps" : 0.63,
"ssdam" : 2.24,
"thermload": 1
},
{
"id": "cy",
"grp": "ul",
"name": "Cytoscrambler",
"class": 1,
"rating": "F",
"cost": 8800,
"mass": 2,
"power": 0.65,
"mode": "F",
"type": "T",
"damage": 2,
"armourpen": "A",
"rof": 1.6,
"dps": 3,
"thermload": 1
}
]
}

View File

@@ -1,5 +1,5 @@
{
"Cannons": [
"Cannon": [
{
"id": "1q",
"grp": "c",
@@ -15,7 +15,6 @@
"rof": 0.4,
"dps": 5,
"thermload": 2,
"grp": "c",
"clip": 5,
"mjdps": 8.13,
"ssdam" : 37.13,
@@ -36,7 +35,6 @@
"rof": 0.4,
"dps": 4,
"thermload": 2,
"grp": "c",
"clip": 5,
"mjdps": 10.97,
"ssdam" : 30.94,
@@ -57,7 +55,6 @@
"rof": 0.4,
"dps": 4,
"thermload": 2,
"grp": "c",
"clip": 5,
"mjdps": 8.13,
"ssdam" : 22.28,
@@ -78,7 +75,6 @@
"rof": 0.4,
"dps": 4,
"thermload": 1,
"grp": "c",
"clip": 5,
"mjdps" : 7.95,
"ssdam" : 21.04,
@@ -99,7 +95,6 @@
"rof": 0.3,
"dps": 4,
"thermload": 1,
"grp": "c",
"clip": 5,
"mjdps" : 3.58,
"ssdam" : 12.38,
@@ -120,7 +115,6 @@
"rof": 0.5,
"dps": 4,
"thermload": 1,
"grp": "c",
"clip": 5,
"mjdps" : 6.00,
"ssdam" : 15.47,
@@ -141,7 +135,6 @@
"rof": 0.5,
"dps": 3,
"thermload": 1,
"grp": "c",
"clip": 5,
"mjdps" : 6.24,
"ssdam" : 15.47,
@@ -162,7 +155,6 @@
"rof": 0.3,
"dps": 3,
"thermload": 1,
"grp": "c",
"clip": 5,
"mjdps" : 2.41,
"ssdam" : 7.74,
@@ -183,7 +175,6 @@
"rof": 0.5,
"dps": 3,
"thermload": 1,
"grp": "c",
"clip": 5,
"mjdps" : 4.00,
"ssdam" : 9.59,
@@ -204,7 +195,6 @@
"rof": 0.5,
"dps": 3,
"thermload": 1,
"grp": "c",
"clip": 5,
"mjdps" : 3.80,
"ssdam" : 8.97,
@@ -225,7 +215,6 @@
"rof": 0.4,
"dps": 3,
"thermload": 1,
"grp": "c",
"clip": 5,
"mjdps" : 1.35,
"ssdam" : 4.13,

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
{
"Fragment Cannons": [
"Fragment Cannon": [
{
"id": "1t",
"grp": "fc",
@@ -15,7 +15,6 @@
"rof": 4.5,
"dps": 10,
"thermload": 1,
"grp": "fc",
"clip": 3,
"mjdps": 15.19,
"ssdam" : 28.36,
@@ -36,7 +35,6 @@
"rof": 4.8,
"dps": 10,
"thermload": 1,
"grp": "fc",
"clip": 3,
"mjdps" : 12.77,
"ssdam" : 23.21,
@@ -57,7 +55,6 @@
"rof": 3.3,
"dps": 9,
"thermload": 1,
"grp": "fc",
"clip": 3,
"mjdps" : 6.85,
"ssdam" : 12.89,
@@ -78,7 +75,6 @@
"rof": 5,
"dps": 9,
"thermload": 1,
"grp": "fc",
"clip": 3,
"mjdps" : 9.50,
"ssdam" : 18.05,
@@ -100,7 +96,6 @@
"rof": 5.3,
"dps": 9,
"thermload": 1,
"grp": "fc",
"clip": 3,
"ammo": 30
},
@@ -119,7 +114,6 @@
"rof": 3.7,
"dps": 9,
"thermload": 1,
"grp": "fc",
"clip": 3,
"ammo": 30
},
@@ -138,7 +132,6 @@
"rof": 5.5,
"dps": 8,
"thermload": 1,
"grp": "fc",
"clip": 3,
"mjdps" : 5.53,
"ssdam" : 10.31,
@@ -159,7 +152,6 @@
"rof": 5.8,
"dps": 7,
"thermload": 1,
"grp": "fc",
"clip": 3,
"mjdps" : 3.58,
"ssdam" : 6.45,
@@ -180,11 +172,29 @@
"rof": 4,
"dps": 6,
"thermload": 1,
"grp": "fc",
"clip": 3,
"mjdps" : 2.11,
"ssdam" : 3.87,
"ammo": 30
},
{
"id": "pa",
"grp": "fc",
"name": "Pacifier",
"class": 3,
"rating": "C",
"cost": 1400832,
"mass": 8,
"power": 1.02,
"mode": "F",
"type": "K",
"damage": 3,
"armourpen": "A",
"rof": 4.5,
"dps": 9,
"thermload": 1,
"clip": 3,
"ammo": 30
}
]
}

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
{
"Mining Lasers": [
"Mining Laser": [
{
"id": "2l",
"grp": "ml",
@@ -10,10 +10,7 @@
"power": 0.5,
"mode": "F",
"armourpen": "D",
"thermload": 3,
"grp": "ml",
"clip": 1,
"ammo": 1
"thermload": 3
},
{
"id": "2m",
@@ -25,10 +22,23 @@
"power": 0.75,
"mode": "F",
"armourpen": "D",
"thermload": 5,
"thermload": 5
},
{
"id": "ml",
"grp": "ml",
"clip": 1,
"ammo": 1
"name": "Mining Lance",
"class": 1,
"rating": "D",
"cost": 13600,
"mass": 2,
"power": 0.7,
"mode": "F",
"type": "T",
"damage": 3,
"dps": 3,
"armourpen": "D",
"thermload": 3
}
]
}

View File

@@ -1,5 +1,5 @@
{
"Missile Racks": [
"Missile Rack": [
{
"id": "2f",
"grp": "mr",
@@ -15,7 +15,6 @@
"rof": 2.5,
"dps": 8,
"thermload": 3,
"grp": "mr",
"clip": 12,
"ammo": 24,
"mjdps": 1.72,
@@ -37,7 +36,6 @@
"rof": 0.3,
"dps": 3,
"thermload": 3,
"grp": "mr",
"clip": 6,
"ammo": 18,
"mjdps": 0.57,
@@ -59,7 +57,6 @@
"rof": 2.5,
"dps": 8,
"thermload": 3,
"grp": "mr",
"clip": 8,
"ammo": 16,
"mjdps": 1.63,
@@ -81,12 +78,32 @@
"rof": 0.3,
"dps": 3,
"thermload": 3,
"grp": "mr",
"clip": 6,
"ammo": 6,
"mjdps": 0.57,
"ssdam" : 2.58,
"missile": "S"
},
{
"id": "Ph",
"grp": "mr",
"name": "Pack-Hound",
"class": 2,
"rating": "B",
"cost": 1000832,
"mass": 4,
"power": 1.2,
"mode": "F",
"type": "E",
"damage": 3,
"armourpen": "F",
"rof": 0.5,
"dps": 4,
"thermload": 3,
"grp": "mr",
"clip": 12,
"ammo": 120,
"missile": "S"
}
]
}

View File

@@ -1,5 +1,5 @@
{
"Multi-cannons": [
"Multi-cannon": [
{
"id": "26",
"grp": "mc",
@@ -15,7 +15,6 @@
"rof": 7,
"dps": 4,
"thermload": 1,
"grp": "mc",
"clip": 90,
"mjdps" : 6.02,
"ssdam" : 1.20,
@@ -36,7 +35,6 @@
"rof": 7.5,
"dps": 4,
"thermload": 1,
"grp": "mc",
"clip": 90,
"mjdps" : 5.59,
"ssdam" : 1.03,
@@ -57,7 +55,6 @@
"rof": 5.3,
"dps": 3,
"thermload": 1,
"grp": "mc",
"clip": 90,
"mjdps" : 2.15,
"ssdam" : 0.52,
@@ -78,7 +75,6 @@
"rof": 8,
"dps": 3,
"thermload": 1,
"grp": "mc",
"clip": 90,
"mjdps" : 3.75,
"ssdam" : 0.69,
@@ -99,7 +95,6 @@
"rof": 8.5,
"dps": 3,
"thermload": 1,
"grp": "mc",
"clip": 90,
"mjdps" : 2.03,
"ssdam" : 0.34,
@@ -120,11 +115,29 @@
"rof": 6,
"dps": 2,
"thermload": 1,
"grp": "mc",
"clip": 90,
"mjdps" : 1.54,
"ssdam" : 0.34,
"ammo": 2100
},
{
"id": "e0",
"grp": "mc",
"name": "Enforcer",
"class": 1,
"rating": "F",
"cost": 13984,
"mass": 2,
"power": 0.28,
"mode": "F",
"type": "K",
"damage": 4,
"armourpen": "A",
"rof": 4.3,
"dps": 4,
"thermload": 1,
"clip": 60,
"ammo": 1000
}
]
}

View File

@@ -1,5 +1,5 @@
{
"Plasma Accelerators": [
"Plasma Accelerator": [
{
"id": "1g",
"grp": "pa",
@@ -15,7 +15,6 @@
"rof": 0.3,
"dps": 4,
"thermload": 10,
"grp": "pa",
"clip": 5,
"mjdps" : 6.89,
"ssdam" : 27.85,
@@ -36,7 +35,6 @@
"rof": 0.3,
"dps": 4,
"thermload": 8,
"grp": "pa",
"clip": 5,
"mjdps" : 20.98,
"ssdam" : 92.82,
@@ -57,11 +55,29 @@
"rof": 0.3,
"dps": 5,
"thermload": 10,
"grp": "pa",
"clip": 5,
"mjdps" : 25.55,
"ssdam" : 123.76,
"ammo": 100
},
{
"id": "Ap",
"grp": "pa",
"name": "Advanced",
"class": 3,
"rating": "B",
"cost": 4119120,
"mass": 8,
"power": 1.97,
"mode": "F",
"type": "TK",
"damage": 8,
"armourpen": "A",
"rof": 0.6,
"dps": 4,
"thermload": 4,
"clip": 20,
"ammo": 300
}
]
}

View File

@@ -1,5 +1,5 @@
{
"Pulse Lasers": [
"Pulse Laser": [
{
"id": "1d",
"grp": "pl",
@@ -170,6 +170,23 @@
"mjeps" : 0.51,
"ssdam" : 1.07,
"thermload": 1
},
{
"id": "PL",
"grp": "pl",
"name": "Distruptor",
"class": 2,
"rating": "E",
"cost": 26400,
"mass": 4,
"power": 0.7,
"mode": "F",
"type": "T",
"damage": 2,
"armourpen": "A",
"rof": 1.6,
"dps": 2,
"thermload": 1
}
]
}

View File

@@ -1,5 +1,5 @@
{
"Rail Guns": [
"Rail Gun": [
{
"id": "29",
"grp": "rg",
@@ -15,7 +15,6 @@
"rof": 0.6,
"dps": 4,
"thermload": 7,
"grp": "rg",
"clip": 1,
"mjdps" : 13.75,
"ssdam" : 24.75,
@@ -36,11 +35,29 @@
"rof": 0.5,
"dps": 4,
"thermload": 10,
"grp": "rg",
"clip": 1,
"mjdps" : 21.66,
"ssdam" : 43.32,
"ammo": 30
},
{
"id": "ih",
"grp": "rg",
"name": "Imperial Hammer",
"class": 2,
"rating": "B",
"cost": 619200,
"mass": 4,
"power": 1.63,
"mode": "F",
"type": "TK",
"damage": 5,
"armourpen": "A",
"rof": 0.6,
"dps": 5,
"thermload": 3,
"clip": 3,
"ammo": 90
}
]
}

View File

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

View File

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

View File

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

View File

@@ -1,76 +1,12 @@
{
"Cargo Racks": [
{
"id": "07",
"grp": "cr",
"name": "Cargo Rack (256)",
"class": 8,
"rating": "E",
"cost": 3829866,
"capacity": 256
},
{
"id": "06",
"grp": "cr",
"name": "Cargo Rack (128)",
"class": 7,
"rating": "E",
"cost": 1178420,
"capacity": 128
},
{
"id": "05",
"grp": "cr",
"name": "Cargo Rack (64)",
"class": 6,
"rating": "E",
"cost": 362591,
"capacity": 64
},
{
"id": "04",
"grp": "cr",
"name": "Cargo Rack (32)",
"class": 5,
"rating": "E",
"cost": 111566,
"capacity": 32
},
{
"id": "03",
"grp": "cr",
"name": "Cargo Rack (16)",
"class": 4,
"rating": "E",
"cost": 34328,
"capacity": 16
},
{
"id": "02",
"grp": "cr",
"name": "Cargo Rack (8)",
"class": 3,
"rating": "E",
"cost": 10563,
"capacity": 8
},
{
"id": "01",
"grp": "cr",
"name": "Cargo Rack (4)",
"class": 2,
"rating": "E",
"cost": 3250,
"capacity": 4
},
{
"id": "00",
"grp": "cr",
"name": "Cargo Rack (2)",
"class": 1,
"rating": "E",
"cost": 1000,
"capacity": 2
}
"Cargo Rack": [
{ "id": "00", "grp": "cr", "class": 1, "rating": "E", "cost": 1000, "capacity": 2 },
{ "id": "01", "grp": "cr", "class": 2, "rating": "E", "cost": 3250, "capacity": 4 },
{ "id": "02", "grp": "cr", "class": 3, "rating": "E", "cost": 10563, "capacity": 8 },
{ "id": "03", "grp": "cr", "class": 4, "rating": "E", "cost": 34328, "capacity": 16 },
{ "id": "04", "grp": "cr", "class": 5, "rating": "E", "cost": 111566, "capacity": 32 },
{ "id": "05", "grp": "cr", "class": 6, "rating": "E", "cost": 362591, "capacity": 64 },
{ "id": "06", "grp": "cr", "class": 7, "rating": "E", "cost": 1178420, "capacity": 128 },
{ "id": "07", "grp": "cr", "class": 8, "rating": "E", "cost": 3829866, "capacity": 256 }
]
}

View File

@@ -1,5 +1,5 @@
{
"Collector Limpet Ctrl": [
"Collector Limpet Controller": [
{ "id": "Cf", "grp":"cc", "class":7, "rating":"E", "cost": 437400, "mass": 32.0, "power":0.41, "range":1.36, "maximum": 4, "time":300 },
{ "id": "Cg", "grp":"cc", "class":7, "rating":"D", "cost": 874800, "mass": 32.0, "power":0.55, "range":1.02, "maximum": 4, "time":600 },
{ "id": "Ch", "grp":"cc", "class":7, "rating":"C", "cost":1749600, "mass": 80.0, "power":0.69, "range":1.70, "maximum": 4, "time":510 },

View File

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

View File

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

View File

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

View File

@@ -1,27 +1,27 @@
{
"Fuel Transfer Limpet Ctrl": [
{ "id": "Ff", "grp":"fx", "class":7, "rating":"E", "cost": 437400, "mass": 80.0, "power":-0.55, "range":1.02, "maximum": 8 },
{ "id": "Fg", "grp":"fx", "class":7, "rating":"D", "cost": 874800, "mass": 32.0, "power":-0.41, "range":1.36, "maximum": 8 },
{ "id": "Fh", "grp":"fx", "class":7, "rating":"C", "cost":1749600, "mass": 80.0, "power":-0.69, "range":1.70, "maximum": 8 },
{ "id": "Fi", "grp":"fx", "class":7, "rating":"B", "cost":3499200, "mass":128.0, "power":-0.97, "range":2.04, "maximum": 8 },
{ "id": "Fj", "grp":"fx", "class":7, "rating":"A", "cost":6998400, "mass": 80.0, "power":-0.83, "range":2.38, "maximum": 8 },
"Fuel Transfer Limpet Controller": [
{ "id": "Ff", "grp":"fx", "class":7, "rating":"E", "cost": 437400, "mass": 80.0, "power":0.55, "range":1.02, "maximum": 8 },
{ "id": "Fg", "grp":"fx", "class":7, "rating":"D", "cost": 874800, "mass": 32.0, "power":0.41, "range":1.36, "maximum": 8 },
{ "id": "Fh", "grp":"fx", "class":7, "rating":"C", "cost":1749600, "mass": 80.0, "power":0.69, "range":1.70, "maximum": 8 },
{ "id": "Fi", "grp":"fx", "class":7, "rating":"B", "cost":3499200, "mass":128.0, "power":0.97, "range":2.04, "maximum": 8 },
{ "id": "Fj", "grp":"fx", "class":7, "rating":"A", "cost":6998400, "mass": 80.0, "power":0.83, "range":2.38, "maximum": 8 },
{ "id": "Fa", "grp":"fx", "class":5, "rating":"E", "cost": 48600, "mass": 20.0, "power":-0.40, "range":0.78, "maximum": 4 },
{ "id": "Fb", "grp":"fx", "class":5, "rating":"D", "cost": 97200, "mass": 8.0, "power":-0.30, "range":1.04, "maximum": 4 },
{ "id": "Fc", "grp":"fx", "class":5, "rating":"C", "cost": 194400, "mass": 20.0, "power":-0.50, "range":1.30, "maximum": 4 },
{ "id": "Fd", "grp":"fx", "class":5, "rating":"B", "cost": 388800, "mass": 32.0, "power":-0.97, "range":1.56, "maximum": 4 },
{ "id": "Fe", "grp":"fx", "class":5, "rating":"A", "cost": 777600, "mass": 20.0, "power":-0.60, "range":1.82, "maximum": 4 },
{ "id": "Fa", "grp":"fx", "class":5, "rating":"E", "cost": 48600, "mass": 20.0, "power":0.40, "range":0.78, "maximum": 4 },
{ "id": "Fb", "grp":"fx", "class":5, "rating":"D", "cost": 97200, "mass": 8.0, "power":0.30, "range":1.04, "maximum": 4 },
{ "id": "Fc", "grp":"fx", "class":5, "rating":"C", "cost": 194400, "mass": 20.0, "power":0.50, "range":1.30, "maximum": 4 },
{ "id": "Fd", "grp":"fx", "class":5, "rating":"B", "cost": 388800, "mass": 32.0, "power":0.97, "range":1.56, "maximum": 4 },
{ "id": "Fe", "grp":"fx", "class":5, "rating":"A", "cost": 777600, "mass": 20.0, "power":0.60, "range":1.82, "maximum": 4 },
{ "id": "F5", "grp":"fx", "class":3, "rating":"E", "cost": 5400, "mass": 5.0, "power":-0.27, "range":0.66, "maximum": 2 },
{ "id": "F6", "grp":"fx", "class":3, "rating":"D", "cost": 10800, "mass": 2.0, "power":-0.20, "range":0.88, "maximum": 2 },
{ "id": "F7", "grp":"fx", "class":3, "rating":"C", "cost": 21600, "mass": 5.0, "power":-0.34, "range":1.10, "maximum": 2 },
{ "id": "F8", "grp":"fx", "class":3, "rating":"B", "cost": 43200, "mass": 8.0, "power":-0.48, "range":1.32, "maximum": 2 },
{ "id": "F9", "grp":"fx", "class":3, "rating":"A", "cost": 86400, "mass": 5.0, "power":-0.41, "range":1.54, "maximum": 2 },
{ "id": "F5", "grp":"fx", "class":3, "rating":"E", "cost": 5400, "mass": 5.0, "power":0.27, "range":0.66, "maximum": 2 },
{ "id": "F6", "grp":"fx", "class":3, "rating":"D", "cost": 10800, "mass": 2.0, "power":0.20, "range":0.88, "maximum": 2 },
{ "id": "F7", "grp":"fx", "class":3, "rating":"C", "cost": 21600, "mass": 5.0, "power":0.34, "range":1.10, "maximum": 2 },
{ "id": "F8", "grp":"fx", "class":3, "rating":"B", "cost": 43200, "mass": 8.0, "power":0.48, "range":1.32, "maximum": 2 },
{ "id": "F9", "grp":"fx", "class":3, "rating":"A", "cost": 86400, "mass": 5.0, "power":0.41, "range":1.54, "maximum": 2 },
{ "id": "F0", "grp":"fx", "class":1, "rating":"E", "cost": 600, "mass": 1.3, "power":-0.18, "range":0.60, "maximum": 1 },
{ "id": "F1", "grp":"fx", "class":1, "rating":"D", "cost": 1200, "mass": 0.5, "power":-0.14, "range":0.80, "maximum": 1 },
{ "id": "F2", "grp":"fx", "class":1, "rating":"C", "cost": 2400, "mass": 1.3, "power":-0.23, "range":1.00, "maximum": 1 },
{ "id": "F3", "grp":"fx", "class":1, "rating":"B", "cost": 4800, "mass": 2.0, "power":-0.32, "range":1.20, "maximum": 1 },
{ "id": "F4", "grp":"fx", "class":1, "rating":"A", "cost": 9600, "mass": 1.3, "power":-0.28, "range":1.40, "maximum": 1 }
{ "id": "F0", "grp":"fx", "class":1, "rating":"E", "cost": 600, "mass": 1.3, "power":0.18, "range":0.60, "maximum": 1 },
{ "id": "F1", "grp":"fx", "class":1, "rating":"D", "cost": 1200, "mass": 0.5, "power":0.14, "range":0.80, "maximum": 1 },
{ "id": "F2", "grp":"fx", "class":1, "rating":"C", "cost": 2400, "mass": 1.3, "power":0.23, "range":1.00, "maximum": 1 },
{ "id": "F3", "grp":"fx", "class":1, "rating":"B", "cost": 4800, "mass": 2.0, "power":0.32, "range":1.20, "maximum": 1 },
{ "id": "F4", "grp":"fx", "class":1, "rating":"A", "cost": 9600, "mass": 1.3, "power":0.28, "range":1.40, "maximum": 1 }
]
}

View File

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

View File

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

View File

@@ -1,52 +1,12 @@
{
"Fuel Tank": [
{
"id": "f1",
"grp": "ft",
"class": 1,
"rating": "C",
"cost": 1000,
"capacity": 2
},
{
"id": "f2",
"grp": "ft",
"class": 2,
"rating": "C",
"cost": 3750,
"capacity": 4
},
{
"id": "f3",
"grp": "ft",
"class": 3,
"rating": "C",
"cost": 7063,
"capacity": 8
},
{
"id": "f4",
"grp": "ft",
"class": 4,
"rating": "C",
"cost": 24734,
"capacity": 16
},
{
"id": "f5",
"grp": "ft",
"class": 5,
"rating": "C",
"cost": 97754,
"capacity": 32
},
{
"id": "f6",
"grp": "ft",
"class": 6,
"rating": "C",
"cost": 341577,
"capacity": 64
}
{ "id": "f1", "grp": "ft", "class": 1, "rating": "C", "cost": 1000, "capacity": 2 },
{ "id": "f2", "grp": "ft", "class": 2, "rating": "C", "cost": 3750, "capacity": 4 },
{ "id": "f3", "grp": "ft", "class": 3, "rating": "C", "cost": 7063, "capacity": 8 },
{ "id": "f4", "grp": "ft", "class": 4, "rating": "C", "cost": 24734, "capacity": 16 },
{ "id": "f5", "grp": "ft", "class": 5, "rating": "C", "cost": 97754, "capacity": 32 },
{ "id": "f6", "grp": "ft", "class": 6, "rating": "C", "cost": 341577, "capacity": 64 },
{ "id": "f7", "grp": "ft", "class": 7, "rating": "C", "cost": 1780900, "capacity": 128 },
{ "id": "f8", "grp": "ft", "class": 8, "rating": "C", "cost": 5428400, "capacity": 256 }
]
}

View File

@@ -0,0 +1,12 @@
{
"Prismatic Shield Generator": [
{ "id": "p6", "grp": "psg", "class": 1, "rating": "A", "cost": 132195, "mass": 2.5, "power": 2.52, "minmass": 13, "optmass": 25, "maxmass": 63, "minmul": 2.04, "optmul": 1.44, "maxmul": 0.84 },
{ "id": "p5", "grp": "psg", "class": 2, "rating": "A", "cost": 240336, "mass": 5, "power": 3.15, "minmass": 23, "optmass": 55, "maxmass": 138, "minmul": 2.04, "optmul": 1.44, "maxmul": 0.84 },
{ "id": "p4", "grp": "psg", "class": 3, "rating": "A", "cost": 761868, "mass": 10, "power": 3.78, "minmass": 83, "optmass": 165, "maxmass": 413, "minmul": 2.04, "optmul": 1.44, "maxmul": 0.84 },
{ "id": "p3", "grp": "psg", "class": 4, "rating": "A", "cost": 2415120, "mass": 20, "power": 4.62, "minmass": 143, "optmass": 285, "maxmass": 713, "minmul": 2.04, "optmul": 1.44, "maxmul": 0.84 },
{ "id": "p2", "grp": "psg", "class": 5, "rating": "A", "cost": 7655930, "mass": 40, "power": 5.46, "minmass": 203, "optmass": 405, "maxmass": 1013, "minmul": 2.04, "optmul": 1.44, "maxmul": 0.84 },
{ "id": "p1", "grp": "psg", "class": 6, "rating": "A", "cost": 24269297, "mass": 80, "power": 6.51, "minmass": 270, "optmass": 540, "maxmass": 1350, "minmul": 2.04, "optmul": 1.44, "maxmul": 0.84 },
{ "id": "p0", "grp": "psg", "class": 7, "rating": "A", "cost": 76933668, "mass": 160, "power": 7.35, "minmass": 530, "optmass": 1060, "maxmass": 2650, "minmul": 2.04, "optmul": 1.44, "maxmul": 0.84 },
{ "id": "p7", "grp": "psg", "class": 8, "rating": "A", "cost": 243879729, "mass": 320, "power": 8.4, "minmass": 900, "optmass": 1800, "maxmass": 4500, "minmul": 2.04, "optmul": 1.44, "maxmul": 0.84 }
]
}

View File

@@ -1,27 +1,27 @@
{
"Prospector Limpet Ctrl": [
{ "id": "Pf", "grp":"pc", "class":7, "rating":"E", "cost": 437400, "mass": 80.0, "power":-0.55, "range": 5.10, "maximum": 8 },
{ "id": "Pg", "grp":"pc", "class":7, "rating":"D", "cost": 874800, "mass": 32.0, "power":-0.41, "range": 6.80, "maximum": 8 },
{ "id": "Ph", "grp":"pc", "class":7, "rating":"C", "cost":1749600, "mass": 80.0, "power":-0.69, "range": 8.50, "maximum": 8 },
{ "id": "Pi", "grp":"pc", "class":7, "rating":"B", "cost":3499200, "mass":128.0, "power":-0.97, "range":10.20, "maximum": 8 },
{ "id": "Pj", "grp":"pc", "class":7, "rating":"A", "cost":6998400, "mass": 80.0, "power":-0.83, "range":11.90, "maximum": 8 },
"Prospector Limpet Controller": [
{ "id": "Pf", "grp":"pc", "class":7, "rating":"E", "cost": 437400, "mass": 80.0, "power":0.55, "range": 5.10, "maximum": 8 },
{ "id": "Pg", "grp":"pc", "class":7, "rating":"D", "cost": 874800, "mass": 32.0, "power":0.41, "range": 6.80, "maximum": 8 },
{ "id": "Ph", "grp":"pc", "class":7, "rating":"C", "cost":1749600, "mass": 80.0, "power":0.69, "range": 8.50, "maximum": 8 },
{ "id": "Pi", "grp":"pc", "class":7, "rating":"B", "cost":3499200, "mass":128.0, "power":0.97, "range":10.20, "maximum": 8 },
{ "id": "Pj", "grp":"pc", "class":7, "rating":"A", "cost":6998400, "mass": 80.0, "power":0.83, "range":11.90, "maximum": 8 },
{ "id": "Pa", "grp":"pc", "class":5, "rating":"E", "cost": 48600, "mass": 20.0, "power":-0.40, "range": 3.90, "maximum": 4 },
{ "id": "Pb", "grp":"pc", "class":5, "rating":"D", "cost": 97200, "mass": 8.0, "power":-0.30, "range": 5.20, "maximum": 4 },
{ "id": "Pc", "grp":"pc", "class":5, "rating":"C", "cost": 194400, "mass": 20.0, "power":-0.50, "range": 6.50, "maximum": 4 },
{ "id": "Pd", "grp":"pc", "class":5, "rating":"B", "cost": 388800, "mass": 32.0, "power":-0.97, "range": 7.80, "maximum": 4 },
{ "id": "Pe", "grp":"pc", "class":5, "rating":"A", "cost": 777600, "mass": 20.0, "power":-0.60, "range": 9.10, "maximum": 4 },
{ "id": "Pa", "grp":"pc", "class":5, "rating":"E", "cost": 48600, "mass": 20.0, "power":0.40, "range": 3.90, "maximum": 4 },
{ "id": "Pb", "grp":"pc", "class":5, "rating":"D", "cost": 97200, "mass": 8.0, "power":0.30, "range": 5.20, "maximum": 4 },
{ "id": "Pc", "grp":"pc", "class":5, "rating":"C", "cost": 194400, "mass": 20.0, "power":0.50, "range": 6.50, "maximum": 4 },
{ "id": "Pd", "grp":"pc", "class":5, "rating":"B", "cost": 388800, "mass": 32.0, "power":0.97, "range": 7.80, "maximum": 4 },
{ "id": "Pe", "grp":"pc", "class":5, "rating":"A", "cost": 777600, "mass": 20.0, "power":0.60, "range": 9.10, "maximum": 4 },
{ "id": "P5", "grp":"pc", "class":3, "rating":"E", "cost": 5400, "mass": 5.0, "power":-0.27, "range": 3.30, "maximum": 2 },
{ "id": "P6", "grp":"pc", "class":3, "rating":"D", "cost": 10800, "mass": 2.0, "power":-0.20, "range": 4.40, "maximum": 2 },
{ "id": "P7", "grp":"pc", "class":3, "rating":"C", "cost": 21600, "mass": 5.0, "power":-0.34, "range": 5.50, "maximum": 2 },
{ "id": "P8", "grp":"pc", "class":3, "rating":"B", "cost": 43200, "mass": 8.0, "power":-0.48, "range": 6.60, "maximum": 2 },
{ "id": "P9", "grp":"pc", "class":3, "rating":"A", "cost": 86400, "mass": 5.0, "power":-0.41, "range": 7.70, "maximum": 2 },
{ "id": "P5", "grp":"pc", "class":3, "rating":"E", "cost": 5400, "mass": 5.0, "power":0.27, "range": 3.30, "maximum": 2 },
{ "id": "P6", "grp":"pc", "class":3, "rating":"D", "cost": 10800, "mass": 2.0, "power":0.20, "range": 4.40, "maximum": 2 },
{ "id": "P7", "grp":"pc", "class":3, "rating":"C", "cost": 21600, "mass": 5.0, "power":0.34, "range": 5.50, "maximum": 2 },
{ "id": "P8", "grp":"pc", "class":3, "rating":"B", "cost": 43200, "mass": 8.0, "power":0.48, "range": 6.60, "maximum": 2 },
{ "id": "P9", "grp":"pc", "class":3, "rating":"A", "cost": 86400, "mass": 5.0, "power":0.41, "range": 7.70, "maximum": 2 },
{ "id": "P0", "grp":"pc", "class":1, "rating":"E", "cost": 600, "mass": 1.3, "power":-0.18, "range": 3.00, "maximum": 1 },
{ "id": "P1", "grp":"pc", "class":1, "rating":"D", "cost": 1200, "mass": 0.5, "power":-0.14, "range": 4.00, "maximum": 1 },
{ "id": "P2", "grp":"pc", "class":1, "rating":"C", "cost": 2400, "mass": 1.3, "power":-0.23, "range": 5.00, "maximum": 1 },
{ "id": "P3", "grp":"pc", "class":1, "rating":"B", "cost": 4800, "mass": 2.0, "power":-0.32, "range": 6.00, "maximum": 1 },
{ "id": "P4", "grp":"pc", "class":1, "rating":"A", "cost": 9600, "mass": 1.3, "power":-0.28, "range": 7.00, "maximum": 1 }
{ "id": "P0", "grp":"pc", "class":1, "rating":"E", "cost": 600, "mass": 1.3, "power":0.18, "range": 3.00, "maximum": 1 },
{ "id": "P1", "grp":"pc", "class":1, "rating":"D", "cost": 1200, "mass": 0.5, "power":0.14, "range": 4.00, "maximum": 1 },
{ "id": "P2", "grp":"pc", "class":1, "rating":"C", "cost": 2400, "mass": 1.3, "power":0.23, "range": 5.00, "maximum": 1 },
{ "id": "P3", "grp":"pc", "class":1, "rating":"B", "cost": 4800, "mass": 2.0, "power":0.32, "range": 6.00, "maximum": 1 },
{ "id": "P4", "grp":"pc", "class":1, "rating":"A", "cost": 9600, "mass": 1.3, "power":0.28, "range": 7.00, "maximum": 1 }
]
}

View File

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

View File

@@ -1,9 +1,9 @@
{
"Scanners": [
"Scanner": [
{
"id": "2f",
"grp": "sc",
"name": "Adv. Discovery Scanner",
"name": "Advanced Discovery Scanner",
"class": 1,
"rating": "C",
"cost": 1545000,
@@ -14,7 +14,7 @@
{
"id": "2g",
"grp": "sc",
"name": "Inter. Discovery Scanner",
"name": "Intermediate Discovery Scanner",
"class": 1,
"rating": "D",
"cost": 505000,
@@ -38,6 +38,7 @@
"grp": "sc",
"name": "Detailed Surface Scanner",
"class": 1,
"retractedOnly": 1,
"rating": "C",
"cost": 250000,
"mass": 1.3,

View File

@@ -1,484 +1,44 @@
{
"Shield Cell Banks": [
{
"id": "65",
"grp": "scb",
"class": 8,
"rating": "E",
"cost": 697584,
"mass": 160,
"power": 1.44,
"cells": 5,
"rechargeRating": "C",
"recharge": 0
},
{
"id": "64",
"grp": "scb",
"class": 8,
"rating": "D",
"cost": 1743961,
"mass": 64,
"power": 1.92,
"cells": 3,
"rechargeRating": "C",
"recharge": 0
},
{
"id": "63",
"grp": "scb",
"class": 8,
"rating": "C",
"cost": 4359903,
"mass": 160,
"power": 2.4,
"cells": 4,
"rechargeRating": "B",
"recharge": 0
},
{
"id": "62",
"grp": "scb",
"class": 8,
"rating": "B",
"cost": 10899756,
"mass": 256,
"power": 2.88,
"cells": 5,
"rechargeRating": "A",
"recharge": 0
},
{
"id": "61",
"grp": "scb",
"class": 8,
"rating": "A",
"cost": 27249391,
"mass": 160,
"power": 3.36,
"cells": 4,
"rechargeRating": "A",
"recharge": 0
},
{
"id": "60",
"grp": "scb",
"class": 7,
"rating": "E",
"cost": 249137,
"mass": 80,
"power": 1.24,
"cells": 5,
"rechargeRating": "D",
"recharge": 97
},
{
"id": "5v",
"grp": "scb",
"class": 7,
"rating": "D",
"cost": 622843,
"mass": 32,
"power": 1.66,
"cells": 3,
"rechargeRating": "C",
"recharge": 130
},
{
"id": "5u",
"grp": "scb",
"class": 7,
"rating": "C",
"cost": 1557108,
"mass": 80,
"power": 2.07,
"cells": 4,
"rechargeRating": "B",
"recharge": 163
},
{
"id": "5t",
"grp": "scb",
"class": 7,
"rating": "B",
"cost": 3892770,
"mass": 128,
"power": 2.48,
"cells": 5,
"rechargeRating": "B",
"recharge": 197
},
{
"id": "5s",
"grp": "scb",
"class": 7,
"rating": "A",
"cost": 9731925,
"mass": 80,
"power": 2.9,
"cells": 4,
"rechargeRating": "A",
"recharge": 230
},
{
"id": "5r",
"grp": "scb",
"class": 6,
"rating": "E",
"cost": 88978,
"mass": 40,
"power": 1.06,
"cells": 5,
"rechargeRating": "D",
"recharge": 92
},
{
"id": "5q",
"grp": "scb",
"class": 6,
"rating": "D",
"cost": 222444,
"mass": 16,
"power": 1.42,
"cells": 3,
"rechargeRating": "C",
"recharge": 120
},
{
"id": "5p",
"grp": "scb",
"class": 6,
"rating": "C",
"cost": 556110,
"mass": 40,
"power": 1.77,
"cells": 4,
"rechargeRating": "C",
"recharge": 148
},
{
"id": "5o",
"grp": "scb",
"class": 6,
"rating": "B",
"cost": 1390275,
"mass": 64,
"power": 2.12,
"cells": 5,
"rechargeRating": "B",
"recharge": 176
},
{
"id": "5n",
"grp": "scb",
"class": 6,
"rating": "A",
"cost": 3475688,
"mass": 40,
"power": 2.48,
"cells": 4,
"rechargeRating": "A",
"recharge": 204
},
{
"id": "5m",
"grp": "scb",
"class": 5,
"rating": "E",
"cost": 31778,
"mass": 20,
"power": 0.9,
"cells": 4,
"rechargeRating": "D",
"recharge": 82
},
{
"id": "5l",
"grp": "scb",
"class": 5,
"rating": "D",
"cost": 79444,
"mass": 8,
"power": 1.2,
"cells": 2,
"rechargeRating": "C",
"recharge": 109
},
{
"id": "5k",
"grp": "scb",
"class": 5,
"rating": "C",
"cost": 198611,
"mass": 20,
"power": 1.5,
"cells": 3,
"rechargeRating": "C",
"recharge": 135
},
{
"id": "5j",
"grp": "scb",
"class": 5,
"rating": "B",
"cost": 496527,
"mass": 32,
"power": 1.8,
"cells": 4,
"rechargeRating": "B",
"recharge": 162
},
{
"id": "5i",
"grp": "scb",
"class": 5,
"rating": "A",
"cost": 1241317,
"mass": 20,
"power": 2.1,
"cells": 3,
"rechargeRating": "B",
"recharge": 189
},
{
"id": "5h",
"grp": "scb",
"class": 4,
"rating": "E",
"cost": 11349,
"mass": 10,
"power": 0.74,
"cells": 4,
"rechargeRating": "D",
"recharge": 72
},
{
"id": "5g",
"grp": "scb",
"class": 4,
"rating": "D",
"cost": 28373,
"mass": 4,
"power": 0.98,
"cells": 2,
"rechargeRating": "D",
"recharge": 94
},
{
"id": "5f",
"grp": "scb",
"class": 4,
"rating": "C",
"cost": 70932,
"mass": 10,
"power": 1.23,
"cells": 3,
"rechargeRating": "C",
"recharge": 117
},
{
"id": "5e",
"grp": "scb",
"class": 4,
"rating": "B",
"cost": 177331,
"mass": 16,
"power": 1.48,
"cells": 4,
"rechargeRating": "C",
"recharge": 140
},
{
"id": "5d",
"grp": "scb",
"class": 4,
"rating": "A",
"cost": 443328,
"mass": 10,
"power": 1.72,
"cells": 3,
"rechargeRating": "B",
"recharge": 163
},
{
"id": "5c",
"grp": "scb",
"class": 3,
"rating": "E",
"cost": 4053,
"mass": 5,
"power": 0.61,
"cells": 4,
"rechargeRating": "D",
"recharge": 61
},
{
"id": "5b",
"grp": "scb",
"class": 3,
"rating": "D",
"cost": 10133,
"mass": 2,
"power": 0.82,
"cells": 2,
"rechargeRating": "D",
"recharge": 80
},
{
"id": "5a",
"grp": "scb",
"class": 3,
"rating": "C",
"cost": 25333,
"mass": 5,
"power": 1.02,
"cells": 3,
"rechargeRating": "D",
"recharge": 100
},
{
"id": "59",
"grp": "scb",
"class": 3,
"rating": "B",
"cost": 63333,
"mass": 8,
"power": 1.22,
"cells": 4,
"rechargeRating": "C",
"recharge": 119
},
{
"id": "58",
"grp": "scb",
"class": 3,
"rating": "A",
"cost": 158331,
"mass": 5,
"power": 1.43,
"cells": 3,
"rechargeRating": "C",
"recharge": 138
},
{
"id": "57",
"grp": "scb",
"class": 2,
"rating": "E",
"cost": 1448,
"mass": 2.5,
"power": 0.5,
"cells": 4,
"rechargeRating": "E",
"recharge": 46
},
{
"id": "56",
"grp": "scb",
"class": 2,
"rating": "D",
"cost": 3619,
"mass": 1,
"power": 0.67,
"cells": 2,
"rechargeRating": "D",
"recharge": 61
},
{
"id": "55",
"grp": "scb",
"class": 2,
"rating": "C",
"cost": 9048,
"mass": 2.5,
"power": 0.84,
"cells": 3,
"rechargeRating": "D",
"recharge": 77
},
{
"id": "54",
"grp": "scb",
"class": 2,
"rating": "B",
"cost": 22619,
"mass": 4,
"power": 1.01,
"cells": 4,
"rechargeRating": "D",
"recharge": 92
},
{
"id": "53",
"grp": "scb",
"class": 2,
"rating": "A",
"cost": 56547,
"mass": 2.5,
"power": 1.18,
"cells": 3,
"rechargeRating": "C",
"recharge": 107
},
{
"id": "52",
"grp": "scb",
"class": 1,
"rating": "E",
"cost": 517,
"mass": 1.3,
"power": 0.41,
"cells": 3,
"rechargeRating": "E",
"recharge": 31
},
{
"id": "51",
"grp": "scb",
"class": 1,
"rating": "D",
"cost": 1293,
"mass": 0.5,
"power": 0.55,
"cells": 1,
"rechargeRating": "E",
"recharge": 41
},
{
"id": "50",
"grp": "scb",
"class": 1,
"rating": "C",
"cost": 3231,
"mass": 1.3,
"power": 0.69,
"cells": 2,
"rechargeRating": "D",
"recharge": 51
},
{
"id": "4v",
"grp": "scb",
"class": 1,
"rating": "B",
"cost": 8078,
"mass": 2,
"power": 0.83,
"cells": 3,
"rechargeRating": "D",
"recharge": 61
},
{
"id": "4u",
"grp": "scb",
"class": 1,
"rating": "A",
"cost": 20195,
"mass": 1.3,
"power": 0.97,
"cells": 2,
"rechargeRating": "D",
"recharge": 72
}
"Shield Cell Bank": [
{ "id": "65", "grp": "scb", "class": 8, "rating": "E", "cost": 697584, "mass": 160, "power": 1.44, "cells": 6, "rechargeRating": "C", "recharge": 0 },
{ "id": "64", "grp": "scb", "class": 8, "rating": "D", "cost": 1743961, "mass": 64, "power": 1.92, "cells": 4, "rechargeRating": "C", "recharge": 0 },
{ "id": "63", "grp": "scb", "class": 8, "rating": "C", "cost": 4359903, "mass": 160, "power": 2.4, "cells": 5, "rechargeRating": "B", "recharge": 0 },
{ "id": "62", "grp": "scb", "class": 8, "rating": "B", "cost": 10899756, "mass": 256, "power": 2.88, "cells": 6, "rechargeRating": "A", "recharge": 0 },
{ "id": "61", "grp": "scb", "class": 8, "rating": "A", "cost": 27249391, "mass": 160, "power": 3.36, "cells": 5, "rechargeRating": "A", "recharge": 0 },
{ "id": "60", "grp": "scb", "class": 7, "rating": "E", "cost": 249137, "mass": 80, "power": 1.24, "cells": 6, "rechargeRating": "D", "recharge": 97 },
{ "id": "5v", "grp": "scb", "class": 7, "rating": "D", "cost": 622843, "mass": 32, "power": 1.66, "cells": 4, "rechargeRating": "C", "recharge": 130 },
{ "id": "5u", "grp": "scb", "class": 7, "rating": "C", "cost": 1557108, "mass": 80, "power": 2.07, "cells": 5, "rechargeRating": "B", "recharge": 163 },
{ "id": "5t", "grp": "scb", "class": 7, "rating": "B", "cost": 3892770, "mass": 128, "power": 2.48, "cells": 6, "rechargeRating": "B", "recharge": 197 },
{ "id": "5s", "grp": "scb", "class": 7, "rating": "A", "cost": 9731925, "mass": 80, "power": 2.9, "cells": 5, "rechargeRating": "A", "recharge": 230 },
{ "id": "5r", "grp": "scb", "class": 6, "rating": "E", "cost": 88978, "mass": 40, "power": 1.06, "cells": 6, "rechargeRating": "D", "recharge": 92 },
{ "id": "5q", "grp": "scb", "class": 6, "rating": "D", "cost": 222444, "mass": 16, "power": 1.42, "cells": 4, "rechargeRating": "C", "recharge": 120 },
{ "id": "5p", "grp": "scb", "class": 6, "rating": "C", "cost": 556110, "mass": 40, "power": 1.77, "cells": 5, "rechargeRating": "C", "recharge": 148 },
{ "id": "5o", "grp": "scb", "class": 6, "rating": "B", "cost": 1390275, "mass": 64, "power": 2.12, "cells": 6, "rechargeRating": "B", "recharge": 176 },
{ "id": "5n", "grp": "scb", "class": 6, "rating": "A", "cost": 3475688, "mass": 40, "power": 2.48, "cells": 5, "rechargeRating": "A", "recharge": 204 },
{ "id": "5m", "grp": "scb", "class": 5, "rating": "E", "cost": 31778, "mass": 20, "power": 0.9, "cells": 5, "rechargeRating": "D", "recharge": 82 },
{ "id": "5l", "grp": "scb", "class": 5, "rating": "D", "cost": 79444, "mass": 8, "power": 1.2, "cells": 3, "rechargeRating": "C", "recharge": 109 },
{ "id": "5k", "grp": "scb", "class": 5, "rating": "C", "cost": 198611, "mass": 20, "power": 1.5, "cells": 4, "rechargeRating": "C", "recharge": 135 },
{ "id": "5j", "grp": "scb", "class": 5, "rating": "B", "cost": 496527, "mass": 32, "power": 1.8, "cells": 5, "rechargeRating": "B", "recharge": 162 },
{ "id": "5i", "grp": "scb", "class": 5, "rating": "A", "cost": 1241317, "mass": 20, "power": 2.1, "cells": 4, "rechargeRating": "B", "recharge": 189 },
{ "id": "5h", "grp": "scb", "class": 4, "rating": "E", "cost": 11349, "mass": 10, "power": 0.74, "cells": 5, "rechargeRating": "D", "recharge": 72 },
{ "id": "5g", "grp": "scb", "class": 4, "rating": "D", "cost": 28373, "mass": 4, "power": 0.98, "cells": 3, "rechargeRating": "D", "recharge": 94 },
{ "id": "5f", "grp": "scb", "class": 4, "rating": "C", "cost": 70932, "mass": 10, "power": 1.23, "cells": 4, "rechargeRating": "C", "recharge": 117 },
{ "id": "5e", "grp": "scb", "class": 4, "rating": "B", "cost": 177331, "mass": 16, "power": 1.48, "cells": 5, "rechargeRating": "C", "recharge": 140 },
{ "id": "5d", "grp": "scb", "class": 4, "rating": "A", "cost": 443328, "mass": 10, "power": 1.72, "cells": 4, "rechargeRating": "B", "recharge": 163 },
{ "id": "5c", "grp": "scb", "class": 3, "rating": "E", "cost": 4053, "mass": 5, "power": 0.61, "cells": 5, "rechargeRating": "D", "recharge": 61 },
{ "id": "5b", "grp": "scb", "class": 3, "rating": "D", "cost": 10133, "mass": 2, "power": 0.82, "cells": 3, "rechargeRating": "D", "recharge": 80 },
{ "id": "5a", "grp": "scb", "class": 3, "rating": "C", "cost": 25333, "mass": 5, "power": 1.02, "cells": 4, "rechargeRating": "D", "recharge": 100 },
{ "id": "59", "grp": "scb", "class": 3, "rating": "B", "cost": 63333, "mass": 8, "power": 1.22, "cells": 5, "rechargeRating": "C", "recharge": 119 },
{ "id": "58", "grp": "scb", "class": 3, "rating": "A", "cost": 158331, "mass": 5, "power": 1.43, "cells": 4, "rechargeRating": "C", "recharge": 138 },
{ "id": "57", "grp": "scb", "class": 2, "rating": "E", "cost": 1448, "mass": 2.5, "power": 0.5, "cells": 5, "rechargeRating": "E", "recharge": 46 },
{ "id": "56", "grp": "scb", "class": 2, "rating": "D", "cost": 3619, "mass": 1, "power": 0.67, "cells": 3, "rechargeRating": "D", "recharge": 61 },
{ "id": "55", "grp": "scb", "class": 2, "rating": "C", "cost": 9048, "mass": 2.5, "power": 0.84, "cells": 4, "rechargeRating": "D", "recharge": 77 },
{ "id": "54", "grp": "scb", "class": 2, "rating": "B", "cost": 22619, "mass": 4, "power": 1.01, "cells": 5, "rechargeRating": "D", "recharge": 92 },
{ "id": "53", "grp": "scb", "class": 2, "rating": "A", "cost": 56547, "mass": 2.5, "power": 1.18, "cells": 4, "rechargeRating": "C", "recharge": 107 },
{ "id": "52", "grp": "scb", "class": 1, "rating": "E", "cost": 517, "mass": 1.3, "power": 0.41, "cells": 4, "rechargeRating": "E", "recharge": 31 },
{ "id": "51", "grp": "scb", "class": 1, "rating": "D", "cost": 1293, "mass": 0.5, "power": 0.55, "cells": 2, "rechargeRating": "E", "recharge": 41 },
{ "id": "50", "grp": "scb", "class": 1, "rating": "C", "cost": 3231, "mass": 1.3, "power": 0.69, "cells": 3, "rechargeRating": "D", "recharge": 51 },
{ "id": "4v", "grp": "scb", "class": 1, "rating": "B", "cost": 8078, "mass": 2, "power": 0.83, "cells": 4, "rechargeRating": "D", "recharge": 61 },
{ "id": "4u", "grp": "scb", "class": 1, "rating": "A", "cost": 20195, "mass": 1.3, "power": 0.97, "cells": 3, "rechargeRating": "D", "recharge": 72 }
]
}
}

View File

@@ -1,529 +1,39 @@
{
"Shield Generators": [
{
"id": "4t",
"grp": "sg",
"class": 8,
"rating": "E",
"cost": 2007241,
"mass": 160,
"power": 2.4,
"minmass": 900,
"optmass": 1800,
"maxmass": 4500,
"minmul": 1.3,
"optmul": 0.8,
"maxmul": 0.3
},
{
"id": "4s",
"grp": "sg",
"class": 8,
"rating": "D",
"cost": 6021722,
"mass": 64,
"power": 3.2,
"minmass": 900,
"optmass": 1800,
"maxmass": 4500,
"minmul": 1.4,
"optmul": 0.9,
"maxmul": 0.4
},
{
"id": "4r",
"grp": "sg",
"class": 8,
"rating": "C",
"cost": 18065165,
"mass": 160,
"power": 4,
"minmass": 900,
"optmass": 1800,
"maxmass": 4500,
"minmul": 1.5,
"optmul": 1,
"maxmul": 0.5
},
{
"id": "4q",
"grp": "sg",
"class": 8,
"rating": "B",
"cost": 54195495,
"mass": 256,
"power": 4.8,
"minmass": 900,
"optmass": 1800,
"maxmass": 4500,
"minmul": 1.6,
"optmul": 1.1,
"maxmul": 0.6
},
{
"id": "4p",
"grp": "sg",
"class": 8,
"rating": "A",
"cost": 162586486,
"mass": 160,
"power": 5.6,
"minmass": 900,
"optmass": 1800,
"maxmass": 4500,
"minmul": 1.7,
"optmul": 1.2,
"maxmul": 0.7
},
{
"id": "4o",
"grp": "sg",
"class": 7,
"rating": "E",
"cost": 633199,
"mass": 80,
"power": 2.1,
"minmass": 530,
"optmass": 1060,
"maxmass": 2650,
"minmul": 1.3,
"optmul": 0.8,
"maxmul": 0.3
},
{
"id": "4n",
"grp": "sg",
"class": 7,
"rating": "D",
"cost": 1899597,
"mass": 32,
"power": 2.8,
"minmass": 530,
"optmass": 1060,
"maxmass": 2650,
"minmul": 1.4,
"optmul": 0.9,
"maxmul": 0.4
},
{
"id": "4m",
"grp": "sg",
"class": 7,
"rating": "C",
"cost": 5698790,
"mass": 80,
"power": 3.5,
"minmass": 530,
"optmass": 1060,
"maxmass": 2650,
"minmul": 1.5,
"optmul": 1,
"maxmul": 0.5
},
{
"id": "4l",
"grp": "sg",
"class": 7,
"rating": "B",
"cost": 17096371,
"mass": 128,
"power": 4.2,
"minmass": 530,
"optmass": 1060,
"maxmass": 2650,
"minmul": 1.6,
"optmul": 1.1,
"maxmul": 0.6
},
{
"id": "4k",
"grp": "sg",
"class": 7,
"rating": "A",
"cost": 51289112,
"mass": 80,
"power": 4.9,
"minmass": 530,
"optmass": 1060,
"maxmass": 2650,
"minmul": 1.7,
"optmul": 1.2,
"maxmul": 0.7
},
{
"id": "4j",
"grp": "sg",
"class": 6,
"rating": "E",
"cost": 199747,
"mass": 40,
"power": 1.86,
"minmass": 270,
"optmass": 540,
"maxmass": 1350,
"minmul": 1.3,
"optmul": 0.8,
"maxmul": 0.3
},
{
"id": "4i",
"grp": "sg",
"class": 6,
"rating": "D",
"cost": 599242,
"mass": 16,
"power": 2.48,
"minmass": 270,
"optmass": 540,
"maxmass": 1350,
"minmul": 1.4,
"optmul": 0.9,
"maxmul": 0.4
},
{
"id": "4h",
"grp": "sg",
"class": 6,
"rating": "C",
"cost": 1797726,
"mass": 40,
"power": 3.1,
"minmass": 270,
"optmass": 540,
"maxmass": 1350,
"minmul": 1.5,
"optmul": 1,
"maxmul": 0.5
},
{
"id": "4g",
"grp": "sg",
"class": 6,
"rating": "B",
"cost": 5393177,
"mass": 64,
"power": 3.72,
"minmass": 270,
"optmass": 540,
"maxmass": 1350,
"minmul": 1.6,
"optmul": 1.1,
"maxmul": 0.6
},
{
"id": "4f",
"grp": "sg",
"class": 6,
"rating": "A",
"cost": 16179531,
"mass": 40,
"power": 4.34,
"minmass": 270,
"optmass": 540,
"maxmass": 1350,
"minmul": 1.7,
"optmul": 1.2,
"maxmul": 0.7
},
{
"id": "4e",
"grp": "sg",
"class": 5,
"rating": "E",
"cost": 63012,
"mass": 20,
"power": 1.56,
"minmass": 203,
"optmass": 405,
"maxmass": 1013,
"minmul": 1.3,
"optmul": 0.8,
"maxmul": 0.3
},
{
"id": "4d",
"grp": "sg",
"class": 5,
"rating": "D",
"cost": 189035,
"mass": 8,
"power": 2.08,
"minmass": 203,
"optmass": 405,
"maxmass": 1013,
"minmul": 1.4,
"optmul": 0.9,
"maxmul": 0.4
},
{
"id": "4c",
"grp": "sg",
"class": 5,
"rating": "C",
"cost": 567106,
"mass": 20,
"power": 2.6,
"minmass": 203,
"optmass": 405,
"maxmass": 1013,
"minmul": 1.5,
"optmul": 1,
"maxmul": 0.5
},
{
"id": "4b",
"grp": "sg",
"class": 5,
"rating": "B",
"cost": 1701318,
"mass": 32,
"power": 3.12,
"minmass": 203,
"optmass": 405,
"maxmass": 1013,
"minmul": 1.6,
"optmul": 1.1,
"maxmul": 0.6
},
{
"id": "4a",
"grp": "sg",
"class": 5,
"rating": "A",
"cost": 5103953,
"mass": 20,
"power": 3.64,
"minmass": 203,
"optmass": 405,
"maxmass": 1013,
"minmul": 1.7,
"optmul": 1.2,
"maxmul": 0.7
},
{
"id": "49",
"grp": "sg",
"class": 4,
"rating": "E",
"cost": 19878,
"mass": 10,
"power": 1.32,
"minmass": 143,
"optmass": 285,
"maxmass": 713,
"minmul": 1.3,
"optmul": 0.8,
"maxmul": 0.3
},
{
"id": "48",
"grp": "sg",
"class": 4,
"rating": "D",
"cost": 59633,
"mass": 4,
"power": 1.76,
"minmass": 143,
"optmass": 285,
"maxmass": 713,
"minmul": 1.4,
"optmul": 0.9,
"maxmul": 0.4
},
{
"id": "47",
"grp": "sg",
"class": 4,
"rating": "C",
"cost": 178898,
"mass": 10,
"power": 2.2,
"minmass": 143,
"optmass": 285,
"maxmass": 713,
"minmul": 1.5,
"optmul": 1,
"maxmul": 0.5
},
{
"id": "46",
"grp": "sg",
"class": 4,
"rating": "B",
"cost": 536693,
"mass": 16,
"power": 2.64,
"minmass": 143,
"optmass": 285,
"maxmass": 713,
"minmul": 1.6,
"optmul": 1.1,
"maxmul": 0.6
},
{
"id": "45",
"grp": "sg",
"class": 4,
"rating": "A",
"cost": 1610080,
"mass": 10,
"power": 3.08,
"minmass": 143,
"optmass": 285,
"maxmass": 713,
"minmul": 1.7,
"optmul": 1.2,
"maxmul": 0.7
},
{
"id": "44",
"grp": "sg",
"class": 3,
"rating": "E",
"cost": 6271,
"mass": 5,
"power": 1.08,
"minmass": 83,
"optmass": 165,
"maxmass": 413,
"minmul": 1.3,
"optmul": 0.8,
"maxmul": 0.3
},
{
"id": "43",
"grp": "sg",
"class": 3,
"rating": "D",
"cost": 18812,
"mass": 2,
"power": 1.44,
"minmass": 83,
"optmass": 165,
"maxmass": 413,
"minmul": 1.4,
"optmul": 0.9,
"maxmul": 0.4
},
{
"id": "42",
"grp": "sg",
"class": 3,
"rating": "C",
"cost": 56435,
"mass": 5,
"power": 1.8,
"minmass": 83,
"optmass": 165,
"maxmass": 413,
"minmul": 1.5,
"optmul": 1,
"maxmul": 0.5
},
{
"id": "41",
"grp": "sg",
"class": 3,
"rating": "B",
"cost": 169304,
"mass": 8,
"power": 2.16,
"minmass": 83,
"optmass": 165,
"maxmass": 413,
"minmul": 1.6,
"optmul": 1.1,
"maxmul": 0.6
},
{
"id": "40",
"grp": "sg",
"class": 3,
"rating": "A",
"cost": 507912,
"mass": 5,
"power": 2.52,
"minmass": 83,
"optmass": 165,
"maxmass": 413,
"minmul": 1.7,
"optmul": 1.2,
"maxmul": 0.7
},
{
"id": "3v",
"grp": "sg",
"class": 2,
"rating": "E",
"cost": 1978,
"mass": 2.5,
"power": 0.9,
"minmass": 28,
"optmass": 55,
"maxmass": 138,
"minmul": 1.3,
"optmul": 0.8,
"maxmul": 0.3
},
{
"id": "3u",
"grp": "sg",
"class": 2,
"rating": "D",
"cost": 5934,
"mass": 1,
"power": 1.2,
"minmass": 28,
"optmass": 55,
"maxmass": 138,
"minmul": 1.4,
"optmul": 0.9,
"maxmul": 0.4
},
{
"id": "3t",
"grp": "sg",
"class": 2,
"rating": "C",
"cost": 17803,
"mass": 2.5,
"power": 1.5,
"minmass": 28,
"optmass": 55,
"maxmass": 138,
"minmul": 1.5,
"optmul": 1,
"maxmul": 0.5
},
{
"id": "3s",
"grp": "sg",
"class": 2,
"rating": "B",
"cost": 53408,
"mass": 4,
"power": 1.8,
"minmass": 28,
"optmass": 55,
"maxmass": 138,
"minmul": 1.6,
"optmul": 1.1,
"maxmul": 0.6
},
{
"id": "3r",
"grp": "sg",
"class": 2,
"rating": "A",
"cost": 160224,
"mass": 2.5,
"power": 2.1,
"minmass": 28,
"optmass": 55,
"maxmass": 138,
"minmul": 1.7,
"optmul": 1.2,
"maxmul": 0.7
}
"Shield Generator": [
{ "id": "4t", "grp": "sg", "class": 8, "rating": "E", "cost": 2007241, "mass": 160, "power": 2.4, "minmass": 900, "optmass": 1800, "maxmass": 4500, "minmul": 1.3, "optmul": 0.8, "maxmul": 0.3 },
{ "id": "4s", "grp": "sg", "class": 8, "rating": "D", "cost": 6021722, "mass": 64, "power": 3.2, "minmass": 900, "optmass": 1800, "maxmass": 4500, "minmul": 1.4, "optmul": 0.9, "maxmul": 0.4 },
{ "id": "4r", "grp": "sg", "class": 8, "rating": "C", "cost": 18065165, "mass": 160, "power": 4, "minmass": 900, "optmass": 1800, "maxmass": 4500, "minmul": 1.5, "optmul": 1, "maxmul": 0.5 },
{ "id": "4q", "grp": "sg", "class": 8, "rating": "B", "cost": 54195495, "mass": 256, "power": 4.8, "minmass": 900, "optmass": 1800, "maxmass": 4500, "minmul": 1.6, "optmul": 1.1, "maxmul": 0.6 },
{ "id": "4p", "grp": "sg", "class": 8, "rating": "A", "cost": 162586486, "mass": 160, "power": 5.6, "minmass": 900, "optmass": 1800, "maxmass": 4500, "minmul": 1.7, "optmul": 1.2, "maxmul": 0.7 },
{ "id": "4o", "grp": "sg", "class": 7, "rating": "E", "cost": 633199, "mass": 80, "power": 2.1, "minmass": 530, "optmass": 1060, "maxmass": 2650, "minmul": 1.3, "optmul": 0.8, "maxmul": 0.3 },
{ "id": "4n", "grp": "sg", "class": 7, "rating": "D", "cost": 1899597, "mass": 32, "power": 2.8, "minmass": 530, "optmass": 1060, "maxmass": 2650, "minmul": 1.4, "optmul": 0.9, "maxmul": 0.4 },
{ "id": "4m", "grp": "sg", "class": 7, "rating": "C", "cost": 5698790, "mass": 80, "power": 3.5, "minmass": 530, "optmass": 1060, "maxmass": 2650, "minmul": 1.5, "optmul": 1, "maxmul": 0.5 },
{ "id": "4l", "grp": "sg", "class": 7, "rating": "B", "cost": 17096371, "mass": 128, "power": 4.2, "minmass": 530, "optmass": 1060, "maxmass": 2650, "minmul": 1.6, "optmul": 1.1, "maxmul": 0.6 },
{ "id": "4k", "grp": "sg", "class": 7, "rating": "A", "cost": 51289112, "mass": 80, "power": 4.9, "minmass": 530, "optmass": 1060, "maxmass": 2650, "minmul": 1.7, "optmul": 1.2, "maxmul": 0.7 },
{ "id": "4j", "grp": "sg", "class": 6, "rating": "E", "cost": 199747, "mass": 40, "power": 1.86, "minmass": 270, "optmass": 540, "maxmass": 1350, "minmul": 1.3, "optmul": 0.8, "maxmul": 0.3 },
{ "id": "4i", "grp": "sg", "class": 6, "rating": "D", "cost": 599242, "mass": 16, "power": 2.48, "minmass": 270, "optmass": 540, "maxmass": 1350, "minmul": 1.4, "optmul": 0.9, "maxmul": 0.4 },
{ "id": "4h", "grp": "sg", "class": 6, "rating": "C", "cost": 1797726, "mass": 40, "power": 3.1, "minmass": 270, "optmass": 540, "maxmass": 1350, "minmul": 1.5, "optmul": 1, "maxmul": 0.5 },
{ "id": "4g", "grp": "sg", "class": 6, "rating": "B", "cost": 5393177, "mass": 64, "power": 3.72, "minmass": 270, "optmass": 540, "maxmass": 1350, "minmul": 1.6, "optmul": 1.1, "maxmul": 0.6 },
{ "id": "4f", "grp": "sg", "class": 6, "rating": "A", "cost": 16179531, "mass": 40, "power": 4.34, "minmass": 270, "optmass": 540, "maxmass": 1350, "minmul": 1.7, "optmul": 1.2, "maxmul": 0.7 },
{ "id": "4e", "grp": "sg", "class": 5, "rating": "E", "cost": 63012, "mass": 20, "power": 1.56, "minmass": 203, "optmass": 405, "maxmass": 1013, "minmul": 1.3, "optmul": 0.8, "maxmul": 0.3 },
{ "id": "4d", "grp": "sg", "class": 5, "rating": "D", "cost": 189035, "mass": 8, "power": 2.08, "minmass": 203, "optmass": 405, "maxmass": 1013, "minmul": 1.4, "optmul": 0.9, "maxmul": 0.4 },
{ "id": "4c", "grp": "sg", "class": 5, "rating": "C", "cost": 567106, "mass": 20, "power": 2.6, "minmass": 203, "optmass": 405, "maxmass": 1013, "minmul": 1.5, "optmul": 1, "maxmul": 0.5 },
{ "id": "4b", "grp": "sg", "class": 5, "rating": "B", "cost": 1701318, "mass": 32, "power": 3.12, "minmass": 203, "optmass": 405, "maxmass": 1013, "minmul": 1.6, "optmul": 1.1, "maxmul": 0.6 },
{ "id": "4a", "grp": "sg", "class": 5, "rating": "A", "cost": 5103953, "mass": 20, "power": 3.64, "minmass": 203, "optmass": 405, "maxmass": 1013, "minmul": 1.7, "optmul": 1.2, "maxmul": 0.7 },
{ "id": "49", "grp": "sg", "class": 4, "rating": "E", "cost": 19878, "mass": 10, "power": 1.32, "minmass": 143, "optmass": 285, "maxmass": 713, "minmul": 1.3, "optmul": 0.8, "maxmul": 0.3 },
{ "id": "48", "grp": "sg", "class": 4, "rating": "D", "cost": 59633, "mass": 4, "power": 1.76, "minmass": 143, "optmass": 285, "maxmass": 713, "minmul": 1.4, "optmul": 0.9, "maxmul": 0.4 },
{ "id": "47", "grp": "sg", "class": 4, "rating": "C", "cost": 178898, "mass": 10, "power": 2.2, "minmass": 143, "optmass": 285, "maxmass": 713, "minmul": 1.5, "optmul": 1, "maxmul": 0.5 },
{ "id": "46", "grp": "sg", "class": 4, "rating": "B", "cost": 536693, "mass": 16, "power": 2.64, "minmass": 143, "optmass": 285, "maxmass": 713, "minmul": 1.6, "optmul": 1.1, "maxmul": 0.6 },
{ "id": "45", "grp": "sg", "class": 4, "rating": "A", "cost": 1610080, "mass": 10, "power": 3.08, "minmass": 143, "optmass": 285, "maxmass": 713, "minmul": 1.7, "optmul": 1.2, "maxmul": 0.7 },
{ "id": "44", "grp": "sg", "class": 3, "rating": "E", "cost": 6271, "mass": 5, "power": 1.08, "minmass": 83, "optmass": 165, "maxmass": 413, "minmul": 1.3, "optmul": 0.8, "maxmul": 0.3 },
{ "id": "43", "grp": "sg", "class": 3, "rating": "D", "cost": 18812, "mass": 2, "power": 1.44, "minmass": 83, "optmass": 165, "maxmass": 413, "minmul": 1.4, "optmul": 0.9, "maxmul": 0.4 },
{ "id": "42", "grp": "sg", "class": 3, "rating": "C", "cost": 56435, "mass": 5, "power": 1.8, "minmass": 83, "optmass": 165, "maxmass": 413, "minmul": 1.5, "optmul": 1, "maxmul": 0.5 },
{ "id": "41", "grp": "sg", "class": 3, "rating": "B", "cost": 169304, "mass": 8, "power": 2.16, "minmass": 83, "optmass": 165, "maxmass": 413, "minmul": 1.6, "optmul": 1.1, "maxmul": 0.6 },
{ "id": "40", "grp": "sg", "class": 3, "rating": "A", "cost": 507912, "mass": 5, "power": 2.52, "minmass": 83, "optmass": 165, "maxmass": 413, "minmul": 1.7, "optmul": 1.2, "maxmul": 0.7 },
{ "id": "3v", "grp": "sg", "class": 2, "rating": "E", "cost": 1978, "mass": 2.5, "power": 0.9, "minmass": 28, "optmass": 55, "maxmass": 138, "minmul": 1.3, "optmul": 0.8, "maxmul": 0.3 },
{ "id": "3u", "grp": "sg", "class": 2, "rating": "D", "cost": 5934, "mass": 1, "power": 1.2, "minmass": 28, "optmass": 55, "maxmass": 138, "minmul": 1.4, "optmul": 0.9, "maxmul": 0.4 },
{ "id": "3t", "grp": "sg", "class": 2, "rating": "C", "cost": 17803, "mass": 2.5, "power": 1.5, "minmass": 28, "optmass": 55, "maxmass": 138, "minmul": 1.5, "optmul": 1, "maxmul": 0.5 },
{ "id": "3s", "grp": "sg", "class": 2, "rating": "B", "cost": 53408, "mass": 4, "power": 1.8, "minmass": 28, "optmass": 55, "maxmass": 138, "minmul": 1.6, "optmul": 1.1, "maxmul": 0.6 },
{ "id": "3r", "grp": "sg", "class": 2, "rating": "A", "cost": 160224, "mass": 2.5, "power": 2.1, "minmass": 28, "optmass": 55, "maxmass": 138, "minmul": 1.7, "optmul": 1.2, "maxmul": 0.7 }
]
}

View File

@@ -1,18 +1,18 @@
{
"adder": {
"properties": {
"grp": "ex",
"name": "Adder",
"manufacturer": "Zorgon Peterson",
"class": 1,
"cost": 39993,
"hullCost": 39993,
"speed": 220,
"boost": 320,
"boostEnergy": 9,
"agility": 8,
"shields": 60,
"armour": 90,
"fuelcost": 50,
"mass": 35
"baseShieldStrength": 60,
"baseArmour": 162,
"hullMass": 35,
"masslock": 7
},
"retailCost": 87808,
"slots": {

View File

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

View File

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

View File

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

View File

@@ -1,20 +1,21 @@
{
"diamondback": {
"properties": {
"grp": "ex",
"name": "Diamondback Scout",
"manufacturer": "Lakon",
"class": 1,
"cost": 461312,
"hullCost": 461341,
"speed": 283,
"boost": 384,
"boostEnergy": 11,
"agility": 8,
"shields": 93,
"armour": 216,
"fuelcost": 50,
"mass": 170
"baseShieldStrength": 118,
"baseArmour": 216,
"hullMass": 170,
"masslock": 8
},
"retailCost": 564300,
"retailCost": 564329,
"minMassFilter": 180.5,
"slots": {
"common": [
4,

View File

@@ -1,20 +1,20 @@
{
"diamondback_explorer": {
"properties": {
"grp": "ex",
"name": "Diamondback Explorer",
"manufacturer": "Lakon",
"class": 1,
"cost": 1740931,
"hullCost": 1635691,
"speed": 242,
"boost": 316,
"boostEnergy": 14,
"agility": 5,
"shields": 115,
"armour": 270,
"fuelcost": 50,
"mass": 298
"baseShieldStrength": 146,
"baseArmour": 270,
"hullMass": 298,
"masslock": 7
},
"retailCost": 2000000,
"retailCost": 1894760,
"slots": {
"common": [
4,

View File

@@ -1,18 +1,18 @@
{
"eagle": {
"properties": {
"grp": "co",
"name": "Eagle",
"manufacturer": "Core Dynamics",
"class": 1,
"cost": 10446,
"hullCost": 10446,
"speed": 240,
"boost": 350,
"boostEnergy": 9,
"agility": 10,
"shields": 60,
"armour": 40,
"fuelcost": 50,
"mass": 50
"baseShieldStrength": 60,
"baseArmour": 72,
"hullMass": 50,
"masslock": 6
},
"retailCost": 44800,
"slots": {

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,20 +1,20 @@
{
"imperial_courier": {
"properties": {
"grp": "mp",
"name": "Imperial Courier",
"manufacturer": "Gutamaya",
"class": 1,
"cost": 2481521,
"hullCost": 2481552,
"speed": 277,
"boost": 380,
"boostEnergy": 11,
"agility": 6,
"shields": 230,
"armour": 144,
"fuelcost": 50,
"mass": 35
"baseShieldStrength": 197,
"baseArmour": 144,
"hullMass": 35,
"masslock": 7
},
"retailCost": 2542900,
"retailCost": 2542931,
"slots": {
"common": [
4,

View File

@@ -1,18 +1,18 @@
{
"orca": {
"properties": {
"grp": "pa",
"name": "Orca",
"manufacturer": "Saud Kruger",
"class": 3,
"cost": 47798079,
"hullCost": 47798079,
"speed": 300,
"boost": 380,
"boostEnergy": 17,
"agility": 2,
"shields": 220,
"armour": 220,
"fuelcost": 50,
"mass": 580
"baseShieldStrength": 220,
"baseArmour": 396,
"hullMass": 580,
"masslock": 13
},
"retailCost": 48539887,
"slots": {
@@ -35,8 +35,8 @@
0
],
"internal": [
6,
5,
{ "class": 6, "eligible": { "Cargo Rack": 1, "Hull Reinforcement Package": 1 } },
{ "class": 5, "eligible": { "Cargo Rack": 1, "Hull Reinforcement Package": 1 } },
5,
5,
4,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,18 +1,18 @@
{
"vulture": {
"properties": {
"grp": "co",
"name": "Vulture",
"manufacturer": "Core Dynamics",
"class": 1,
"cost": 4689629,
"hullCost": 4689629,
"speed": 210,
"boost": 340,
"boostEnergy": 17,
"agility": 9,
"shields": 240,
"armour": 160,
"fuelcost": 50,
"mass": 230
"baseShieldStrength": 240,
"baseArmour": 288,
"hullMass": 230,
"masslock": 10
},
"retailCost": 4925615,
"slots": {

Some files were not shown because too many files have changed in this diff Show More