mirror of
https://github.com/EDCD/coriolis.git
synced 2025-12-09 14:45:35 +00:00
Compare commits
55 Commits
2.4.1
...
feature/re
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e520208ec6 | ||
|
|
29020e64f2 | ||
|
|
16fe3ba9f5 | ||
|
|
f6f057689c | ||
|
|
4378f0020e | ||
|
|
b7b8ee5580 | ||
|
|
c630dbbed0 | ||
|
|
fa6703a3b8 | ||
|
|
bdcb64c9d1 | ||
|
|
a1afc869a7 | ||
|
|
d8ce26c7cf | ||
|
|
95c474dc05 | ||
|
|
56ca73b4ad | ||
|
|
d82cd6a89e | ||
|
|
bf20d32364 | ||
|
|
e968e62fca | ||
|
|
b9c9ca9fa1 | ||
|
|
6e965e2e98 | ||
|
|
7d569f9036 | ||
|
|
df5a77199d | ||
|
|
3c8dfebfdc | ||
|
|
3cc422596f | ||
|
|
4ed167de22 | ||
|
|
b420647501 | ||
|
|
0c318b5e68 | ||
|
|
1c627297b8 | ||
|
|
f41e2d0552 | ||
|
|
1a1d539c60 | ||
|
|
ba2e46f88f | ||
|
|
c2f1fa81af | ||
|
|
752e03fa0f | ||
|
|
1da69664d7 | ||
|
|
9aa986a133 | ||
|
|
bdbfb28c4a | ||
|
|
162156bb2b | ||
|
|
64c5d542e9 | ||
|
|
31dc789f6e | ||
|
|
b0e2cfd7db | ||
|
|
54ddb0d014 | ||
|
|
e19688e96f | ||
|
|
4f53d75999 | ||
|
|
7277460060 | ||
|
|
93c4f6f3c0 | ||
|
|
c6919a7518 | ||
|
|
ca428e67dc | ||
|
|
c6726cf020 | ||
|
|
56ae1378da | ||
|
|
e982ab1a3b | ||
|
|
0d6aa87e89 | ||
|
|
94d06e4025 | ||
|
|
cee5b297ac | ||
|
|
c549213ce0 | ||
|
|
f3f9112767 | ||
|
|
fb325ea3e2 | ||
|
|
3773f6f7ec |
2
.babelrc
2
.babelrc
@@ -1,3 +1,3 @@
|
|||||||
{
|
{
|
||||||
"presets": ["es2015", "react", "stage-0"]
|
"presets": ["env", "react", "stage-0"]
|
||||||
}
|
}
|
||||||
18
ChangeLog.md
18
ChangeLog.md
@@ -1,3 +1,21 @@
|
|||||||
|
#2.5.1
|
||||||
|
* Passenger count on main page
|
||||||
|
* AX Modules
|
||||||
|
* Engineering fixes
|
||||||
|
* Use coriolis-data 2.5.1
|
||||||
|
|
||||||
|
#2.5.0
|
||||||
|
* willyb321 and myself have conquered engineering. Mainly him though...
|
||||||
|
* Use coriolis-data 2.5.0
|
||||||
|
|
||||||
|
#2.4.2
|
||||||
|
Lots of kind people have helped out for this release! Check out the PR history!
|
||||||
|
* Uses coriolis-data update:
|
||||||
|
* Fixes issues with repair limpets
|
||||||
|
* Adds requirement data
|
||||||
|
* Adds requirements panel
|
||||||
|
* Adds comma formatting to tooltip numbers
|
||||||
|
|
||||||
#2.4.1
|
#2.4.1
|
||||||
* Small patches and changes
|
* Small patches and changes
|
||||||
|
|
||||||
|
|||||||
878
d3.js
vendored
878
d3.js
vendored
@@ -1340,6 +1340,12 @@ Selection.prototype = selection.prototype = {
|
|||||||
dispatch: selection_dispatch
|
dispatch: selection_dispatch
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var select = function(selector) {
|
||||||
|
return typeof selector === "string"
|
||||||
|
? new Selection([[document.querySelector(selector)]], [document.documentElement])
|
||||||
|
: new Selection([[selector]], root);
|
||||||
|
};
|
||||||
|
|
||||||
var define = function(constructor, factory, prototype) {
|
var define = function(constructor, factory, prototype) {
|
||||||
constructor.prototype = factory.prototype = prototype;
|
constructor.prototype = factory.prototype = prototype;
|
||||||
prototype.constructor = constructor;
|
prototype.constructor = constructor;
|
||||||
@@ -6947,861 +6953,7 @@ var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
|
|||||||
|
|
||||||
var rainbow = cubehelix();
|
var rainbow = cubehelix();
|
||||||
|
|
||||||
var xhtml$1 = "http://www.w3.org/1999/xhtml";
|
|
||||||
|
|
||||||
var namespaces$1 = {
|
|
||||||
svg: "http://www.w3.org/2000/svg",
|
|
||||||
xhtml: xhtml$1,
|
|
||||||
xlink: "http://www.w3.org/1999/xlink",
|
|
||||||
xml: "http://www.w3.org/XML/1998/namespace",
|
|
||||||
xmlns: "http://www.w3.org/2000/xmlns/"
|
|
||||||
};
|
|
||||||
|
|
||||||
var namespace$1 = function(name) {
|
|
||||||
var prefix = name += "", i = prefix.indexOf(":");
|
|
||||||
if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
|
|
||||||
return namespaces$1.hasOwnProperty(prefix) ? {space: namespaces$1[prefix], local: name} : name;
|
|
||||||
};
|
|
||||||
|
|
||||||
function creatorInherit$1(name) {
|
|
||||||
return function() {
|
|
||||||
var document = this.ownerDocument,
|
|
||||||
uri = this.namespaceURI;
|
|
||||||
return uri === xhtml$1 && document.documentElement.namespaceURI === xhtml$1
|
|
||||||
? document.createElement(name)
|
|
||||||
: document.createElementNS(uri, name);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function creatorFixed$1(fullname) {
|
|
||||||
return function() {
|
|
||||||
return this.ownerDocument.createElementNS(fullname.space, fullname.local);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var creator$1 = function(name) {
|
|
||||||
var fullname = namespace$1(name);
|
|
||||||
return (fullname.local
|
|
||||||
? creatorFixed$1
|
|
||||||
: creatorInherit$1)(fullname);
|
|
||||||
};
|
|
||||||
|
|
||||||
var matcher$2 = function(selector) {
|
|
||||||
return function() {
|
|
||||||
return this.matches(selector);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
if (typeof document !== "undefined") {
|
|
||||||
var element$2 = document.documentElement;
|
|
||||||
if (!element$2.matches) {
|
|
||||||
var vendorMatches$1 = element$2.webkitMatchesSelector
|
|
||||||
|| element$2.msMatchesSelector
|
|
||||||
|| element$2.mozMatchesSelector
|
|
||||||
|| element$2.oMatchesSelector;
|
|
||||||
matcher$2 = function(selector) {
|
|
||||||
return function() {
|
|
||||||
return vendorMatches$1.call(this, selector);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var matcher$3 = matcher$2;
|
|
||||||
|
|
||||||
var filterEvents$1 = {};
|
|
||||||
|
|
||||||
var event$1 = null;
|
|
||||||
|
|
||||||
if (typeof document !== "undefined") {
|
|
||||||
var element$3 = document.documentElement;
|
|
||||||
if (!("onmouseenter" in element$3)) {
|
|
||||||
filterEvents$1 = {mouseenter: "mouseover", mouseleave: "mouseout"};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function filterContextListener$1(listener, index, group) {
|
|
||||||
listener = contextListener$1(listener, index, group);
|
|
||||||
return function(event) {
|
|
||||||
var related = event.relatedTarget;
|
|
||||||
if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
|
|
||||||
listener.call(this, event);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function contextListener$1(listener, index, group) {
|
|
||||||
return function(event1) {
|
|
||||||
var event0 = event$1; // Events can be reentrant (e.g., focus).
|
|
||||||
event$1 = event1;
|
|
||||||
try {
|
|
||||||
listener.call(this, this.__data__, index, group);
|
|
||||||
} finally {
|
|
||||||
event$1 = event0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function parseTypenames$2(typenames) {
|
|
||||||
return typenames.trim().split(/^|\s+/).map(function(t) {
|
|
||||||
var name = "", i = t.indexOf(".");
|
|
||||||
if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
|
|
||||||
return {type: t, name: name};
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function onRemove$1(typename) {
|
|
||||||
return function() {
|
|
||||||
var on = this.__on;
|
|
||||||
if (!on) return;
|
|
||||||
for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
|
|
||||||
if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
|
|
||||||
this.removeEventListener(o.type, o.listener, o.capture);
|
|
||||||
} else {
|
|
||||||
on[++i] = o;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (++i) on.length = i;
|
|
||||||
else delete this.__on;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function onAdd$1(typename, value, capture) {
|
|
||||||
var wrap = filterEvents$1.hasOwnProperty(typename.type) ? filterContextListener$1 : contextListener$1;
|
|
||||||
return function(d, i, group) {
|
|
||||||
var on = this.__on, o, listener = wrap(value, i, group);
|
|
||||||
if (on) for (var j = 0, m = on.length; j < m; ++j) {
|
|
||||||
if ((o = on[j]).type === typename.type && o.name === typename.name) {
|
|
||||||
this.removeEventListener(o.type, o.listener, o.capture);
|
|
||||||
this.addEventListener(o.type, o.listener = listener, o.capture = capture);
|
|
||||||
o.value = value;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.addEventListener(typename.type, listener, capture);
|
|
||||||
o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
|
|
||||||
if (!on) this.__on = [o];
|
|
||||||
else on.push(o);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var selection_on$1 = function(typename, value, capture) {
|
|
||||||
var typenames = parseTypenames$2(typename + ""), i, n = typenames.length, t;
|
|
||||||
|
|
||||||
if (arguments.length < 2) {
|
|
||||||
var on = this.node().__on;
|
|
||||||
if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
|
|
||||||
for (i = 0, o = on[j]; i < n; ++i) {
|
|
||||||
if ((t = typenames[i]).type === o.type && t.name === o.name) {
|
|
||||||
return o.value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
on = value ? onAdd$1 : onRemove$1;
|
|
||||||
if (capture == null) capture = false;
|
|
||||||
for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
function none$1() {}
|
|
||||||
|
|
||||||
var selector$1 = function(selector) {
|
|
||||||
return selector == null ? none$1 : function() {
|
|
||||||
return this.querySelector(selector);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
var selection_select$1 = function(select) {
|
|
||||||
if (typeof select !== "function") select = selector$1(select);
|
|
||||||
|
|
||||||
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
|
|
||||||
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
|
|
||||||
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
|
|
||||||
if ("__data__" in node) subnode.__data__ = node.__data__;
|
|
||||||
subgroup[i] = subnode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Selection$2(subgroups, this._parents);
|
|
||||||
};
|
|
||||||
|
|
||||||
function empty$2() {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
var selectorAll$1 = function(selector) {
|
|
||||||
return selector == null ? empty$2 : function() {
|
|
||||||
return this.querySelectorAll(selector);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
var selection_selectAll$1 = function(select) {
|
|
||||||
if (typeof select !== "function") select = selectorAll$1(select);
|
|
||||||
|
|
||||||
for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
|
|
||||||
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
|
|
||||||
if (node = group[i]) {
|
|
||||||
subgroups.push(select.call(node, node.__data__, i, group));
|
|
||||||
parents.push(node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Selection$2(subgroups, parents);
|
|
||||||
};
|
|
||||||
|
|
||||||
var selection_filter$1 = function(match) {
|
|
||||||
if (typeof match !== "function") match = matcher$3(match);
|
|
||||||
|
|
||||||
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
|
|
||||||
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
|
|
||||||
if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
|
|
||||||
subgroup.push(node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Selection$2(subgroups, this._parents);
|
|
||||||
};
|
|
||||||
|
|
||||||
var sparse$1 = function(update) {
|
|
||||||
return new Array(update.length);
|
|
||||||
};
|
|
||||||
|
|
||||||
var selection_enter$1 = function() {
|
|
||||||
return new Selection$2(this._enter || this._groups.map(sparse$1), this._parents);
|
|
||||||
};
|
|
||||||
|
|
||||||
function EnterNode$1(parent, datum) {
|
|
||||||
this.ownerDocument = parent.ownerDocument;
|
|
||||||
this.namespaceURI = parent.namespaceURI;
|
|
||||||
this._next = null;
|
|
||||||
this._parent = parent;
|
|
||||||
this.__data__ = datum;
|
|
||||||
}
|
|
||||||
|
|
||||||
EnterNode$1.prototype = {
|
|
||||||
constructor: EnterNode$1,
|
|
||||||
appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
|
|
||||||
insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
|
|
||||||
querySelector: function(selector) { return this._parent.querySelector(selector); },
|
|
||||||
querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
|
|
||||||
};
|
|
||||||
|
|
||||||
var constant$10 = function(x) {
|
var constant$10 = function(x) {
|
||||||
return function() {
|
|
||||||
return x;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
var keyPrefix$2 = "$"; // Protect against keys like “__proto__”.
|
|
||||||
|
|
||||||
function bindIndex$1(parent, group, enter, update, exit, data) {
|
|
||||||
var i = 0,
|
|
||||||
node,
|
|
||||||
groupLength = group.length,
|
|
||||||
dataLength = data.length;
|
|
||||||
|
|
||||||
// Put any non-null nodes that fit into update.
|
|
||||||
// Put any null nodes into enter.
|
|
||||||
// Put any remaining data into enter.
|
|
||||||
for (; i < dataLength; ++i) {
|
|
||||||
if (node = group[i]) {
|
|
||||||
node.__data__ = data[i];
|
|
||||||
update[i] = node;
|
|
||||||
} else {
|
|
||||||
enter[i] = new EnterNode$1(parent, data[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Put any non-null nodes that don’t fit into exit.
|
|
||||||
for (; i < groupLength; ++i) {
|
|
||||||
if (node = group[i]) {
|
|
||||||
exit[i] = node;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function bindKey$1(parent, group, enter, update, exit, data, key) {
|
|
||||||
var i,
|
|
||||||
node,
|
|
||||||
nodeByKeyValue = {},
|
|
||||||
groupLength = group.length,
|
|
||||||
dataLength = data.length,
|
|
||||||
keyValues = new Array(groupLength),
|
|
||||||
keyValue;
|
|
||||||
|
|
||||||
// Compute the key for each node.
|
|
||||||
// If multiple nodes have the same key, the duplicates are added to exit.
|
|
||||||
for (i = 0; i < groupLength; ++i) {
|
|
||||||
if (node = group[i]) {
|
|
||||||
keyValues[i] = keyValue = keyPrefix$2 + key.call(node, node.__data__, i, group);
|
|
||||||
if (keyValue in nodeByKeyValue) {
|
|
||||||
exit[i] = node;
|
|
||||||
} else {
|
|
||||||
nodeByKeyValue[keyValue] = node;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compute the key for each datum.
|
|
||||||
// If there a node associated with this key, join and add it to update.
|
|
||||||
// If there is not (or the key is a duplicate), add it to enter.
|
|
||||||
for (i = 0; i < dataLength; ++i) {
|
|
||||||
keyValue = keyPrefix$2 + key.call(parent, data[i], i, data);
|
|
||||||
if (node = nodeByKeyValue[keyValue]) {
|
|
||||||
update[i] = node;
|
|
||||||
node.__data__ = data[i];
|
|
||||||
nodeByKeyValue[keyValue] = null;
|
|
||||||
} else {
|
|
||||||
enter[i] = new EnterNode$1(parent, data[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add any remaining nodes that were not bound to data to exit.
|
|
||||||
for (i = 0; i < groupLength; ++i) {
|
|
||||||
if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
|
|
||||||
exit[i] = node;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var selection_data$1 = function(value, key) {
|
|
||||||
if (!value) {
|
|
||||||
data = new Array(this.size()), j = -1;
|
|
||||||
this.each(function(d) { data[++j] = d; });
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
var bind = key ? bindKey$1 : bindIndex$1,
|
|
||||||
parents = this._parents,
|
|
||||||
groups = this._groups;
|
|
||||||
|
|
||||||
if (typeof value !== "function") value = constant$10(value);
|
|
||||||
|
|
||||||
for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
|
|
||||||
var parent = parents[j],
|
|
||||||
group = groups[j],
|
|
||||||
groupLength = group.length,
|
|
||||||
data = value.call(parent, parent && parent.__data__, j, parents),
|
|
||||||
dataLength = data.length,
|
|
||||||
enterGroup = enter[j] = new Array(dataLength),
|
|
||||||
updateGroup = update[j] = new Array(dataLength),
|
|
||||||
exitGroup = exit[j] = new Array(groupLength);
|
|
||||||
|
|
||||||
bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
|
|
||||||
|
|
||||||
// Now connect the enter nodes to their following update node, such that
|
|
||||||
// appendChild can insert the materialized enter node before this node,
|
|
||||||
// rather than at the end of the parent node.
|
|
||||||
for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
|
|
||||||
if (previous = enterGroup[i0]) {
|
|
||||||
if (i0 >= i1) i1 = i0 + 1;
|
|
||||||
while (!(next = updateGroup[i1]) && ++i1 < dataLength);
|
|
||||||
previous._next = next || null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
update = new Selection$2(update, parents);
|
|
||||||
update._enter = enter;
|
|
||||||
update._exit = exit;
|
|
||||||
return update;
|
|
||||||
};
|
|
||||||
|
|
||||||
var selection_exit$1 = function() {
|
|
||||||
return new Selection$2(this._exit || this._groups.map(sparse$1), this._parents);
|
|
||||||
};
|
|
||||||
|
|
||||||
var selection_merge$1 = function(selection) {
|
|
||||||
|
|
||||||
for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
|
|
||||||
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
|
|
||||||
if (node = group0[i] || group1[i]) {
|
|
||||||
merge[i] = node;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (; j < m0; ++j) {
|
|
||||||
merges[j] = groups0[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Selection$2(merges, this._parents);
|
|
||||||
};
|
|
||||||
|
|
||||||
var selection_order$1 = function() {
|
|
||||||
|
|
||||||
for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
|
|
||||||
for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
|
|
||||||
if (node = group[i]) {
|
|
||||||
if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
|
|
||||||
next = node;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
var selection_sort$1 = function(compare) {
|
|
||||||
if (!compare) compare = ascending$2;
|
|
||||||
|
|
||||||
function compareNode(a, b) {
|
|
||||||
return a && b ? compare(a.__data__, b.__data__) : !a - !b;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
|
|
||||||
for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
|
|
||||||
if (node = group[i]) {
|
|
||||||
sortgroup[i] = node;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sortgroup.sort(compareNode);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Selection$2(sortgroups, this._parents).order();
|
|
||||||
};
|
|
||||||
|
|
||||||
function ascending$2(a, b) {
|
|
||||||
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
|
|
||||||
}
|
|
||||||
|
|
||||||
var selection_call$1 = function() {
|
|
||||||
var callback = arguments[0];
|
|
||||||
arguments[0] = this;
|
|
||||||
callback.apply(null, arguments);
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
var selection_nodes$1 = function() {
|
|
||||||
var nodes = new Array(this.size()), i = -1;
|
|
||||||
this.each(function() { nodes[++i] = this; });
|
|
||||||
return nodes;
|
|
||||||
};
|
|
||||||
|
|
||||||
var selection_node$1 = function() {
|
|
||||||
|
|
||||||
for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
|
|
||||||
for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
|
|
||||||
var node = group[i];
|
|
||||||
if (node) return node;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
var selection_size$1 = function() {
|
|
||||||
var size = 0;
|
|
||||||
this.each(function() { ++size; });
|
|
||||||
return size;
|
|
||||||
};
|
|
||||||
|
|
||||||
var selection_empty$1 = function() {
|
|
||||||
return !this.node();
|
|
||||||
};
|
|
||||||
|
|
||||||
var selection_each$1 = function(callback) {
|
|
||||||
|
|
||||||
for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
|
|
||||||
for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
|
|
||||||
if (node = group[i]) callback.call(node, node.__data__, i, group);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
function attrRemove$2(name) {
|
|
||||||
return function() {
|
|
||||||
this.removeAttribute(name);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function attrRemoveNS$2(fullname) {
|
|
||||||
return function() {
|
|
||||||
this.removeAttributeNS(fullname.space, fullname.local);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function attrConstant$2(name, value) {
|
|
||||||
return function() {
|
|
||||||
this.setAttribute(name, value);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function attrConstantNS$2(fullname, value) {
|
|
||||||
return function() {
|
|
||||||
this.setAttributeNS(fullname.space, fullname.local, value);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function attrFunction$2(name, value) {
|
|
||||||
return function() {
|
|
||||||
var v = value.apply(this, arguments);
|
|
||||||
if (v == null) this.removeAttribute(name);
|
|
||||||
else this.setAttribute(name, v);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function attrFunctionNS$2(fullname, value) {
|
|
||||||
return function() {
|
|
||||||
var v = value.apply(this, arguments);
|
|
||||||
if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
|
|
||||||
else this.setAttributeNS(fullname.space, fullname.local, v);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var selection_attr$1 = function(name, value) {
|
|
||||||
var fullname = namespace$1(name);
|
|
||||||
|
|
||||||
if (arguments.length < 2) {
|
|
||||||
var node = this.node();
|
|
||||||
return fullname.local
|
|
||||||
? node.getAttributeNS(fullname.space, fullname.local)
|
|
||||||
: node.getAttribute(fullname);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.each((value == null
|
|
||||||
? (fullname.local ? attrRemoveNS$2 : attrRemove$2) : (typeof value === "function"
|
|
||||||
? (fullname.local ? attrFunctionNS$2 : attrFunction$2)
|
|
||||||
: (fullname.local ? attrConstantNS$2 : attrConstant$2)))(fullname, value));
|
|
||||||
};
|
|
||||||
|
|
||||||
var defaultView = function(node) {
|
|
||||||
return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
|
|
||||||
|| (node.document && node) // node is a Window
|
|
||||||
|| node.defaultView; // node is a Document
|
|
||||||
};
|
|
||||||
|
|
||||||
function styleRemove$2(name) {
|
|
||||||
return function() {
|
|
||||||
this.style.removeProperty(name);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function styleConstant$2(name, value, priority) {
|
|
||||||
return function() {
|
|
||||||
this.style.setProperty(name, value, priority);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function styleFunction$2(name, value, priority) {
|
|
||||||
return function() {
|
|
||||||
var v = value.apply(this, arguments);
|
|
||||||
if (v == null) this.style.removeProperty(name);
|
|
||||||
else this.style.setProperty(name, v, priority);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var selection_style$1 = function(name, value, priority) {
|
|
||||||
var node;
|
|
||||||
return arguments.length > 1
|
|
||||||
? this.each((value == null
|
|
||||||
? styleRemove$2 : typeof value === "function"
|
|
||||||
? styleFunction$2
|
|
||||||
: styleConstant$2)(name, value, priority == null ? "" : priority))
|
|
||||||
: defaultView(node = this.node())
|
|
||||||
.getComputedStyle(node, null)
|
|
||||||
.getPropertyValue(name);
|
|
||||||
};
|
|
||||||
|
|
||||||
function propertyRemove$1(name) {
|
|
||||||
return function() {
|
|
||||||
delete this[name];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function propertyConstant$1(name, value) {
|
|
||||||
return function() {
|
|
||||||
this[name] = value;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function propertyFunction$1(name, value) {
|
|
||||||
return function() {
|
|
||||||
var v = value.apply(this, arguments);
|
|
||||||
if (v == null) delete this[name];
|
|
||||||
else this[name] = v;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var selection_property$1 = function(name, value) {
|
|
||||||
return arguments.length > 1
|
|
||||||
? this.each((value == null
|
|
||||||
? propertyRemove$1 : typeof value === "function"
|
|
||||||
? propertyFunction$1
|
|
||||||
: propertyConstant$1)(name, value))
|
|
||||||
: this.node()[name];
|
|
||||||
};
|
|
||||||
|
|
||||||
function classArray$1(string) {
|
|
||||||
return string.trim().split(/^|\s+/);
|
|
||||||
}
|
|
||||||
|
|
||||||
function classList$1(node) {
|
|
||||||
return node.classList || new ClassList$1(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
function ClassList$1(node) {
|
|
||||||
this._node = node;
|
|
||||||
this._names = classArray$1(node.getAttribute("class") || "");
|
|
||||||
}
|
|
||||||
|
|
||||||
ClassList$1.prototype = {
|
|
||||||
add: function(name) {
|
|
||||||
var i = this._names.indexOf(name);
|
|
||||||
if (i < 0) {
|
|
||||||
this._names.push(name);
|
|
||||||
this._node.setAttribute("class", this._names.join(" "));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
remove: function(name) {
|
|
||||||
var i = this._names.indexOf(name);
|
|
||||||
if (i >= 0) {
|
|
||||||
this._names.splice(i, 1);
|
|
||||||
this._node.setAttribute("class", this._names.join(" "));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
contains: function(name) {
|
|
||||||
return this._names.indexOf(name) >= 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function classedAdd$1(node, names) {
|
|
||||||
var list = classList$1(node), i = -1, n = names.length;
|
|
||||||
while (++i < n) list.add(names[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function classedRemove$1(node, names) {
|
|
||||||
var list = classList$1(node), i = -1, n = names.length;
|
|
||||||
while (++i < n) list.remove(names[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function classedTrue$1(names) {
|
|
||||||
return function() {
|
|
||||||
classedAdd$1(this, names);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function classedFalse$1(names) {
|
|
||||||
return function() {
|
|
||||||
classedRemove$1(this, names);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function classedFunction$1(names, value) {
|
|
||||||
return function() {
|
|
||||||
(value.apply(this, arguments) ? classedAdd$1 : classedRemove$1)(this, names);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var selection_classed$1 = function(name, value) {
|
|
||||||
var names = classArray$1(name + "");
|
|
||||||
|
|
||||||
if (arguments.length < 2) {
|
|
||||||
var list = classList$1(this.node()), i = -1, n = names.length;
|
|
||||||
while (++i < n) if (!list.contains(names[i])) return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.each((typeof value === "function"
|
|
||||||
? classedFunction$1 : value
|
|
||||||
? classedTrue$1
|
|
||||||
: classedFalse$1)(names, value));
|
|
||||||
};
|
|
||||||
|
|
||||||
function textRemove$1() {
|
|
||||||
this.textContent = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
function textConstant$2(value) {
|
|
||||||
return function() {
|
|
||||||
this.textContent = value;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function textFunction$2(value) {
|
|
||||||
return function() {
|
|
||||||
var v = value.apply(this, arguments);
|
|
||||||
this.textContent = v == null ? "" : v;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var selection_text$1 = function(value) {
|
|
||||||
return arguments.length
|
|
||||||
? this.each(value == null
|
|
||||||
? textRemove$1 : (typeof value === "function"
|
|
||||||
? textFunction$2
|
|
||||||
: textConstant$2)(value))
|
|
||||||
: this.node().textContent;
|
|
||||||
};
|
|
||||||
|
|
||||||
function htmlRemove$1() {
|
|
||||||
this.innerHTML = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
function htmlConstant$1(value) {
|
|
||||||
return function() {
|
|
||||||
this.innerHTML = value;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function htmlFunction$1(value) {
|
|
||||||
return function() {
|
|
||||||
var v = value.apply(this, arguments);
|
|
||||||
this.innerHTML = v == null ? "" : v;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var selection_html$1 = function(value) {
|
|
||||||
return arguments.length
|
|
||||||
? this.each(value == null
|
|
||||||
? htmlRemove$1 : (typeof value === "function"
|
|
||||||
? htmlFunction$1
|
|
||||||
: htmlConstant$1)(value))
|
|
||||||
: this.node().innerHTML;
|
|
||||||
};
|
|
||||||
|
|
||||||
function raise$2() {
|
|
||||||
if (this.nextSibling) this.parentNode.appendChild(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
var selection_raise$1 = function() {
|
|
||||||
return this.each(raise$2);
|
|
||||||
};
|
|
||||||
|
|
||||||
function lower$1() {
|
|
||||||
if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
|
|
||||||
}
|
|
||||||
|
|
||||||
var selection_lower$1 = function() {
|
|
||||||
return this.each(lower$1);
|
|
||||||
};
|
|
||||||
|
|
||||||
var selection_append$1 = function(name) {
|
|
||||||
var create = typeof name === "function" ? name : creator$1(name);
|
|
||||||
return this.select(function() {
|
|
||||||
return this.appendChild(create.apply(this, arguments));
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
function constantNull$1() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var selection_insert$1 = function(name, before) {
|
|
||||||
var create = typeof name === "function" ? name : creator$1(name),
|
|
||||||
select = before == null ? constantNull$1 : typeof before === "function" ? before : selector$1(before);
|
|
||||||
return this.select(function() {
|
|
||||||
return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
function remove$1() {
|
|
||||||
var parent = this.parentNode;
|
|
||||||
if (parent) parent.removeChild(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
var selection_remove$1 = function() {
|
|
||||||
return this.each(remove$1);
|
|
||||||
};
|
|
||||||
|
|
||||||
var selection_datum$1 = function(value) {
|
|
||||||
return arguments.length
|
|
||||||
? this.property("__data__", value)
|
|
||||||
: this.node().__data__;
|
|
||||||
};
|
|
||||||
|
|
||||||
function dispatchEvent$1(node, type, params) {
|
|
||||||
var window = defaultView(node),
|
|
||||||
event = window.CustomEvent;
|
|
||||||
|
|
||||||
if (event) {
|
|
||||||
event = new event(type, params);
|
|
||||||
} else {
|
|
||||||
event = window.document.createEvent("Event");
|
|
||||||
if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
|
|
||||||
else event.initEvent(type, false, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
node.dispatchEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
function dispatchConstant$1(type, params) {
|
|
||||||
return function() {
|
|
||||||
return dispatchEvent$1(this, type, params);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function dispatchFunction$1(type, params) {
|
|
||||||
return function() {
|
|
||||||
return dispatchEvent$1(this, type, params.apply(this, arguments));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var selection_dispatch$1 = function(type, params) {
|
|
||||||
return this.each((typeof params === "function"
|
|
||||||
? dispatchFunction$1
|
|
||||||
: dispatchConstant$1)(type, params));
|
|
||||||
};
|
|
||||||
|
|
||||||
var root$2 = [null];
|
|
||||||
|
|
||||||
function Selection$2(groups, parents) {
|
|
||||||
this._groups = groups;
|
|
||||||
this._parents = parents;
|
|
||||||
}
|
|
||||||
|
|
||||||
function selection$2() {
|
|
||||||
return new Selection$2([[document.documentElement]], root$2);
|
|
||||||
}
|
|
||||||
|
|
||||||
Selection$2.prototype = selection$2.prototype = {
|
|
||||||
constructor: Selection$2,
|
|
||||||
select: selection_select$1,
|
|
||||||
selectAll: selection_selectAll$1,
|
|
||||||
filter: selection_filter$1,
|
|
||||||
data: selection_data$1,
|
|
||||||
enter: selection_enter$1,
|
|
||||||
exit: selection_exit$1,
|
|
||||||
merge: selection_merge$1,
|
|
||||||
order: selection_order$1,
|
|
||||||
sort: selection_sort$1,
|
|
||||||
call: selection_call$1,
|
|
||||||
nodes: selection_nodes$1,
|
|
||||||
node: selection_node$1,
|
|
||||||
size: selection_size$1,
|
|
||||||
empty: selection_empty$1,
|
|
||||||
each: selection_each$1,
|
|
||||||
attr: selection_attr$1,
|
|
||||||
style: selection_style$1,
|
|
||||||
property: selection_property$1,
|
|
||||||
classed: selection_classed$1,
|
|
||||||
text: selection_text$1,
|
|
||||||
html: selection_html$1,
|
|
||||||
raise: selection_raise$1,
|
|
||||||
lower: selection_lower$1,
|
|
||||||
append: selection_append$1,
|
|
||||||
insert: selection_insert$1,
|
|
||||||
remove: selection_remove$1,
|
|
||||||
datum: selection_datum$1,
|
|
||||||
on: selection_on$1,
|
|
||||||
dispatch: selection_dispatch$1
|
|
||||||
};
|
|
||||||
|
|
||||||
var select$1 = function(selector) {
|
|
||||||
return typeof selector === "string"
|
|
||||||
? new Selection$2([[document.querySelector(selector)]], [document.documentElement])
|
|
||||||
: new Selection$2([[selector]], root$2);
|
|
||||||
};
|
|
||||||
|
|
||||||
var constant$11 = function(x) {
|
|
||||||
return function constant() {
|
return function constant() {
|
||||||
return x;
|
return x;
|
||||||
};
|
};
|
||||||
@@ -7850,7 +7002,7 @@ function y$3(p) {
|
|||||||
var line = function() {
|
var line = function() {
|
||||||
var x$$1 = x$3,
|
var x$$1 = x$3,
|
||||||
y$$1 = y$3,
|
y$$1 = y$3,
|
||||||
defined = constant$11(true),
|
defined = constant$10(true),
|
||||||
context = null,
|
context = null,
|
||||||
curve = curveLinear,
|
curve = curveLinear,
|
||||||
output = null;
|
output = null;
|
||||||
@@ -7876,15 +7028,15 @@ var line = function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
line.x = function(_) {
|
line.x = function(_) {
|
||||||
return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$11(+_), line) : x$$1;
|
return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$10(+_), line) : x$$1;
|
||||||
};
|
};
|
||||||
|
|
||||||
line.y = function(_) {
|
line.y = function(_) {
|
||||||
return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$11(+_), line) : y$$1;
|
return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$10(+_), line) : y$$1;
|
||||||
};
|
};
|
||||||
|
|
||||||
line.defined = function(_) {
|
line.defined = function(_) {
|
||||||
return arguments.length ? (defined = typeof _ === "function" ? _ : constant$11(!!_), line) : defined;
|
return arguments.length ? (defined = typeof _ === "function" ? _ : constant$10(!!_), line) : defined;
|
||||||
};
|
};
|
||||||
|
|
||||||
line.curve = function(_) {
|
line.curve = function(_) {
|
||||||
@@ -7924,7 +7076,7 @@ function slope2(that, t) {
|
|||||||
// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
|
// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
|
||||||
// "you can express cubic Hermite interpolation in terms of cubic Bézier curves
|
// "you can express cubic Hermite interpolation in terms of cubic Bézier curves
|
||||||
// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
|
// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
|
||||||
function point$6(that, t0, t1) {
|
function point$5(that, t0, t1) {
|
||||||
var x0 = that._x0,
|
var x0 = that._x0,
|
||||||
y0 = that._y0,
|
y0 = that._y0,
|
||||||
x1 = that._x1,
|
x1 = that._x1,
|
||||||
@@ -7953,7 +7105,7 @@ MonotoneX.prototype = {
|
|||||||
lineEnd: function() {
|
lineEnd: function() {
|
||||||
switch (this._point) {
|
switch (this._point) {
|
||||||
case 2: this._context.lineTo(this._x1, this._y1); break;
|
case 2: this._context.lineTo(this._x1, this._y1); break;
|
||||||
case 3: point$6(this, this._t0, slope2(this, this._t0)); break;
|
case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
|
||||||
}
|
}
|
||||||
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
|
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
|
||||||
this._line = 1 - this._line;
|
this._line = 1 - this._line;
|
||||||
@@ -7966,8 +7118,8 @@ MonotoneX.prototype = {
|
|||||||
switch (this._point) {
|
switch (this._point) {
|
||||||
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
|
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
|
||||||
case 1: this._point = 2; break;
|
case 1: this._point = 2; break;
|
||||||
case 2: this._point = 3; point$6(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
|
case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
|
||||||
default: point$6(this, this._t0, t1 = slope3(this, x, y)); break;
|
default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._x0 = this._x1, this._x1 = x;
|
this._x0 = this._x1, this._x1 = x;
|
||||||
@@ -8153,7 +7305,7 @@ exports.line = line;
|
|||||||
exports.scaleBand = band;
|
exports.scaleBand = band;
|
||||||
exports.scaleLinear = linear$2;
|
exports.scaleLinear = linear$2;
|
||||||
exports.scaleOrdinal = ordinal;
|
exports.scaleOrdinal = ordinal;
|
||||||
exports.select = select$1;
|
exports.select = select;
|
||||||
|
|
||||||
Object.defineProperty(exports, '__esModule', { value: true });
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||||||
|
|
||||||
|
|||||||
12218
package-lock.json
generated
Normal file
12218
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
16
package.json
16
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "coriolis_shipyard",
|
"name": "coriolis_shipyard",
|
||||||
"version": "2.4.1",
|
"version": "2.5.1",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/EDCD/coriolis"
|
"url": "https://github.com/EDCD/coriolis"
|
||||||
@@ -24,7 +24,9 @@
|
|||||||
"deploy": "npm run lint && npm test && npm run build && npm run rsync"
|
"deploy": "npm run lint && npm test && npm run build && npm run rsync"
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
"transform": {".*": "<rootDir>/node_modules/babel-jest"},
|
"transform": {
|
||||||
|
".*": "<rootDir>/node_modules/babel-jest"
|
||||||
|
},
|
||||||
"testRegex": "(/__tests__/test-.*|\\.(test|spec))\\.js$",
|
"testRegex": "(/__tests__/test-.*|\\.(test|spec))\\.js$",
|
||||||
"moduleFileExtensions": [
|
"moduleFileExtensions": [
|
||||||
"js",
|
"js",
|
||||||
@@ -37,6 +39,7 @@
|
|||||||
"<rootDir>/node_modules/lodash",
|
"<rootDir>/node_modules/lodash",
|
||||||
"<rootDir>/node_modules/react",
|
"<rootDir>/node_modules/react",
|
||||||
"<rootDir>/node_modules/react-dom",
|
"<rootDir>/node_modules/react-dom",
|
||||||
|
"<rootDir>/node_modules/react-transition-group",
|
||||||
"<rootDir>/node_modules/react-testutils-additions",
|
"<rootDir>/node_modules/react-testutils-additions",
|
||||||
"<rootDir>/node_modules/fbjs",
|
"<rootDir>/node_modules/fbjs",
|
||||||
"<rootDir>/node_modules/fbemitter",
|
"<rootDir>/node_modules/fbemitter",
|
||||||
@@ -58,9 +61,10 @@
|
|||||||
"babel-eslint": "*",
|
"babel-eslint": "*",
|
||||||
"babel-jest": "*",
|
"babel-jest": "*",
|
||||||
"babel-loader": "*",
|
"babel-loader": "*",
|
||||||
"babel-preset-es2015": "*",
|
"babel-preset-env": "*",
|
||||||
"babel-preset-react": "*",
|
"babel-preset-react": "*",
|
||||||
"babel-preset-stage-0": "*",
|
"babel-preset-stage-0": "*",
|
||||||
|
"create-react-class": "^15.6.2",
|
||||||
"css-loader": "^0.28.0",
|
"css-loader": "^0.28.0",
|
||||||
"d3-selection": "1",
|
"d3-selection": "1",
|
||||||
"eslint": "3.19.0",
|
"eslint": "3.19.0",
|
||||||
@@ -70,7 +74,7 @@
|
|||||||
"extract-text-webpack-plugin": "2.1.0",
|
"extract-text-webpack-plugin": "2.1.0",
|
||||||
"file-loader": "^0.11.1",
|
"file-loader": "^0.11.1",
|
||||||
"html-webpack-plugin": "^2.28.0",
|
"html-webpack-plugin": "^2.28.0",
|
||||||
"jest-cli": "^19.0.2",
|
"jest-cli": "^21.2.1",
|
||||||
"jsen": "^0.6.4",
|
"jsen": "^0.6.4",
|
||||||
"json-loader": "^0.5.4",
|
"json-loader": "^0.5.4",
|
||||||
"less": "^2.7.2",
|
"less": "^2.7.2",
|
||||||
@@ -78,6 +82,7 @@
|
|||||||
"react-addons-perf": "^15.4.2",
|
"react-addons-perf": "^15.4.2",
|
||||||
"react-measure": "^1.4.7",
|
"react-measure": "^1.4.7",
|
||||||
"react-testutils-additions": "^15.2.0",
|
"react-testutils-additions": "^15.2.0",
|
||||||
|
"react-transition-group": "^1.1.2",
|
||||||
"rimraf": "^2.6.1",
|
"rimraf": "^2.6.1",
|
||||||
"rollup": "0.41",
|
"rollup": "0.41",
|
||||||
"rollup-plugin-node-resolve": "3",
|
"rollup-plugin-node-resolve": "3",
|
||||||
@@ -88,10 +93,11 @@
|
|||||||
"uglify-js": "^2.4.11"
|
"uglify-js": "^2.4.11"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"axios": "^0.17.1",
|
||||||
"babel-polyfill": "*",
|
"babel-polyfill": "*",
|
||||||
"browserify-zlib-next": "^1.0.1",
|
"browserify-zlib-next": "^1.0.1",
|
||||||
"classnames": "^2.2.5",
|
"classnames": "^2.2.5",
|
||||||
"coriolis-data": "EDCD/coriolis-data",
|
"coriolis-data": "../coriolis-data",
|
||||||
"d3": "4.8.0",
|
"d3": "4.8.0",
|
||||||
"detect-browser": "^1.7.0",
|
"detect-browser": "^1.7.0",
|
||||||
"fbemitter": "^2.1.1",
|
"fbemitter": "^2.1.1",
|
||||||
|
|||||||
@@ -37,10 +37,13 @@ const GRPCAT = {
|
|||||||
'ml': 'lasers',
|
'ml': 'lasers',
|
||||||
'c': 'projectiles',
|
'c': 'projectiles',
|
||||||
'mc': 'projectiles',
|
'mc': 'projectiles',
|
||||||
|
'axmc': 'experimental',
|
||||||
'fc': 'projectiles',
|
'fc': 'projectiles',
|
||||||
|
'rfl': 'experimental',
|
||||||
'pa': 'projectiles',
|
'pa': 'projectiles',
|
||||||
'rg': 'projectiles',
|
'rg': 'projectiles',
|
||||||
'mr': 'ordnance',
|
'mr': 'ordnance',
|
||||||
|
'axmr': 'experimental',
|
||||||
'tp': 'ordnance',
|
'tp': 'ordnance',
|
||||||
'nl': 'ordnance',
|
'nl': 'ordnance',
|
||||||
'sc': 'scanners',
|
'sc': 'scanners',
|
||||||
@@ -49,9 +52,11 @@ const GRPCAT = {
|
|||||||
'cs': 'scanners',
|
'cs': 'scanners',
|
||||||
'kw': 'scanners',
|
'kw': 'scanners',
|
||||||
'ws': 'scanners',
|
'ws': 'scanners',
|
||||||
|
'xs': 'scanners',
|
||||||
'ch': 'defence',
|
'ch': 'defence',
|
||||||
'po': 'defence',
|
'po': 'defence',
|
||||||
'ec': 'defence',
|
'ec': 'defence',
|
||||||
|
'sfn': 'defence'
|
||||||
};
|
};
|
||||||
// Order here is the order in which items will be shown in the modules menu
|
// Order here is the order in which items will be shown in the modules menu
|
||||||
const CATEGORIES = {
|
const CATEGORIES = {
|
||||||
@@ -76,6 +81,8 @@ const CATEGORIES = {
|
|||||||
'hs': ['hs'],
|
'hs': ['hs'],
|
||||||
'defence': ['ch', 'po', 'ec'],
|
'defence': ['ch', 'po', 'ec'],
|
||||||
'scanners': ['sc', 'ss', 'cs', 'kw', 'ws'], // Overloaded with internal scanners
|
'scanners': ['sc', 'ss', 'cs', 'kw', 'ws'], // Overloaded with internal scanners
|
||||||
|
// Experimental
|
||||||
|
'experimental': ['axmc', 'axmr', 'rfl', 'xs', 'sfn']
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ export default class EngagementRange extends TranslatedComponent {
|
|||||||
|
|
||||||
const { ship } = props;
|
const { ship } = props;
|
||||||
|
|
||||||
const maxRange = this._calcMaxRange(ship);
|
const maxRange = Math.round(this._calcMaxRange(ship));
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
maxRange
|
maxRange
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -4,11 +4,13 @@ import { Ships } from 'coriolis-data/dist';
|
|||||||
import cn from 'classnames';
|
import cn from 'classnames';
|
||||||
import Page from './Page';
|
import Page from './Page';
|
||||||
import Router from '../Router';
|
import Router from '../Router';
|
||||||
|
import Axios from 'axios';
|
||||||
import Persist from '../stores/Persist';
|
import Persist from '../stores/Persist';
|
||||||
import * as Utils from '../utils/UtilityFunctions';
|
import * as Utils from '../utils/UtilityFunctions';
|
||||||
import Ship from '../shipyard/Ship';
|
import Ship from '../shipyard/Ship';
|
||||||
import { toDetailedBuild } from '../shipyard/Serializer';
|
import { toDetailedBuild } from '../shipyard/Serializer';
|
||||||
import { outfitURL } from '../utils/UrlGenerators';
|
import { outfitURL } from '../utils/UrlGenerators';
|
||||||
|
import { SHIP_FD_NAME_TO_CORIOLIS_NAME } from '../utils/CompanionApiUtils';
|
||||||
import { FloppyDisk, Bin, Switch, Download, Reload, LinkIcon, ShoppingIcon } from '../components/SvgIcons';
|
import { FloppyDisk, Bin, Switch, Download, Reload, LinkIcon, ShoppingIcon } from '../components/SvgIcons';
|
||||||
import LZString from 'lz-string';
|
import LZString from 'lz-string';
|
||||||
import ShipSummaryTable from '../components/ShipSummaryTable';
|
import ShipSummaryTable from '../components/ShipSummaryTable';
|
||||||
@@ -68,11 +70,58 @@ export default class OutfittingPage extends Page {
|
|||||||
*/
|
*/
|
||||||
_initState(props, context) {
|
_initState(props, context) {
|
||||||
let params = context.route.params;
|
let params = context.route.params;
|
||||||
let shipId = params.ship;
|
let remoteID = params.remote;
|
||||||
let code = params.code;
|
|
||||||
|
if (remoteID) { // Remote instance, fetch data.
|
||||||
|
Axios.get('http://127.0.0.1:8081/api/ships/' + remoteID + '/fdev')
|
||||||
|
.then((response) => {
|
||||||
|
let remote = response.data;
|
||||||
let buildName = params.bn;
|
let buildName = params.bn;
|
||||||
|
|
||||||
|
let shipId = SHIP_FD_NAME_TO_CORIOLIS_NAME[remote.Ship];
|
||||||
|
let data = Ships[shipId];
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return { error: { message: 'Ship not found: ' + shipId } };
|
||||||
|
}
|
||||||
|
|
||||||
|
let ship = new Ship(shipId, data.properties, data.slots);
|
||||||
|
ship.buildFromLoadout(remote.Modules);
|
||||||
|
|
||||||
|
this._getTitle = getTitle.bind(this, data.properties.name);
|
||||||
|
|
||||||
|
const { sys, eng, wep, boost, fuel, cargo, opponent, opponentBuild, opponentSys, opponentEng, opponentWep, engagementRange } = this._obtainControlFromCode(ship);
|
||||||
|
return {
|
||||||
|
error: null,
|
||||||
|
title: this._getTitle(buildName),
|
||||||
|
costTab: Persist.getCostTab() || 'costs',
|
||||||
|
buildName,
|
||||||
|
newBuildName: buildName,
|
||||||
|
shipId,
|
||||||
|
ship,
|
||||||
|
sys,
|
||||||
|
eng,
|
||||||
|
wep,
|
||||||
|
boost,
|
||||||
|
fuel,
|
||||||
|
cargo,
|
||||||
|
opponent,
|
||||||
|
opponentBuild,
|
||||||
|
opponentSys,
|
||||||
|
opponentEng,
|
||||||
|
opponentWep,
|
||||||
|
engagementRange
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
this.state = { error: { message: 'Issue communicating with remote server'}};
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
let shipId = params.ship;
|
||||||
let data = Ships[shipId]; // Retrieve the basic ship properties, slots and defaults
|
let data = Ships[shipId]; // Retrieve the basic ship properties, slots and defaults
|
||||||
let savedCode = Persist.getBuild(shipId, buildName);
|
let savedCode = Persist.getBuild(shipId, buildName);
|
||||||
|
let code = params.code;
|
||||||
|
let buildName = params.bn;
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
return { error: { message: 'Ship not found: ' + shipId } };
|
return { error: { message: 'Ship not found: ' + shipId } };
|
||||||
@@ -85,7 +134,6 @@ export default class OutfittingPage extends Page {
|
|||||||
} else {
|
} else {
|
||||||
ship.buildWith(data.defaults); // Populate with default components
|
ship.buildWith(data.defaults); // Populate with default components
|
||||||
}
|
}
|
||||||
|
|
||||||
this._getTitle = getTitle.bind(this, data.properties.name);
|
this._getTitle = getTitle.bind(this, data.properties.name);
|
||||||
|
|
||||||
// Obtain ship control from code
|
// Obtain ship control from code
|
||||||
@@ -114,6 +162,7 @@ export default class OutfittingPage extends Page {
|
|||||||
engagementRange
|
engagementRange
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle build name change and update state
|
* Handle build name change and update state
|
||||||
@@ -556,10 +605,25 @@ export default class OutfittingPage extends Page {
|
|||||||
const boostMarker = `${ship.canBoost(cargo, fuel)}`;
|
const boostMarker = `${ship.canBoost(cargo, fuel)}`;
|
||||||
const shipSummaryMarker = `${ship.name}${_sStr}${_iStr}${_hStr}${_pStr}${_mStr}${ship.ladenMass}${cargo}${fuel}`;
|
const shipSummaryMarker = `${ship.name}${_sStr}${_iStr}${_hStr}${_pStr}${_mStr}${ship.ladenMass}${cargo}${fuel}`;
|
||||||
|
|
||||||
|
const requirements = Ships[ship.id].requirements;
|
||||||
|
var requirementElements = [];
|
||||||
|
|
||||||
|
function renderRequirement(className, textKey, tooltipTextKey) {
|
||||||
|
requirementElements.push(<div key={textKey} className={className} onMouseEnter={termtip.bind(null, tooltipTextKey)} onMouseLeave={hide}>{translate(textKey)}</div>);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requirements) {
|
||||||
|
requirements.federationRank && renderRequirement('federation', 'federation rank ' + requirements.federationRank, 'federation rank required');
|
||||||
|
requirements.empireRank && renderRequirement('empire', 'empire rank ' + requirements.empireRank, 'empire rank required');
|
||||||
|
requirements.horizons && renderRequirement('horizons', 'horizons', 'horizons required');
|
||||||
|
requirements.horizonsEarlyAdoption && renderRequirement('horizons', 'horizons early adoption', 'horizons early adoption required');
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div id='outfit' className={'page'} style={{ fontSize: (sizeRatio * 0.9) + 'em' }}>
|
<div id='outfit' className={'page'} style={{ fontSize: (sizeRatio * 0.9) + 'em' }}>
|
||||||
<div id='overview'>
|
<div id='overview'>
|
||||||
<h1>{ship.name}</h1>
|
<h1>{ship.name}</h1>
|
||||||
|
<div id='requirements'>{requirementElements}</div>
|
||||||
<div id='build'>
|
<div id='build'>
|
||||||
<input value={newBuildName || ''} onChange={this._buildNameChange} placeholder={translate('Enter Name')} maxLength={50} />
|
<input value={newBuildName || ''} onChange={this._buildNameChange} placeholder={translate('Enter Name')} maxLength={50} />
|
||||||
<button onClick={canSave && this._saveBuild} disabled={!canSave} onMouseOver={termtip.bind(null, 'save')} onMouseOut={hide}>
|
<button onClick={canSave && this._saveBuild} disabled={!canSave} onMouseOver={termtip.bind(null, 'save')} onMouseOut={hide}>
|
||||||
|
|||||||
@@ -25,6 +25,25 @@ function countInt(slot) {
|
|||||||
this.int[slot.maxClass - 1]++; // Subtract 1 since there is no Class 0 Internal compartment
|
this.int[slot.maxClass - 1]++; // Subtract 1 since there is no Class 0 Internal compartment
|
||||||
this.intCount++;
|
this.intCount++;
|
||||||
this.maxCargo += crEligible ? ModuleUtils.findInternal('cr', slot.maxClass, 'E').cargo : 0;
|
this.maxCargo += crEligible ? ModuleUtils.findInternal('cr', slot.maxClass, 'E').cargo : 0;
|
||||||
|
|
||||||
|
// if no eligiblity, then assume pce
|
||||||
|
let passSlotType = null;
|
||||||
|
let passSlotRating = null;
|
||||||
|
if (!slot.eligible || slot.eligible.pce) {
|
||||||
|
passSlotType = 'pce';
|
||||||
|
passSlotRating = 'E';
|
||||||
|
} else if (slot.eligible.pci) {
|
||||||
|
passSlotType = 'pci';
|
||||||
|
passSlotRating = 'D';
|
||||||
|
} else if (slot.eligible.pcm) {
|
||||||
|
passSlotType = 'pcm';
|
||||||
|
passSlotRating = 'C';
|
||||||
|
} else if (slot.eligible.pcq) {
|
||||||
|
passSlotType = 'pcq';
|
||||||
|
passSlotRating = 'B';
|
||||||
|
}
|
||||||
|
let passengerBay = passSlotType ? ModuleUtils.findInternal(passSlotType, slot.maxClass, passSlotRating) : null;
|
||||||
|
this.maxPassengers += passengerBay ? passengerBay.passengers : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -39,6 +58,7 @@ function shipSummary(shipId, shipData) {
|
|||||||
hpCount: 0,
|
hpCount: 0,
|
||||||
intCount: 0,
|
intCount: 0,
|
||||||
maxCargo: 0,
|
maxCargo: 0,
|
||||||
|
maxPassengers: 0,
|
||||||
hp: [0, 0, 0, 0, 0], // Utility, Small, Medium, Large, Huge
|
hp: [0, 0, 0, 0, 0], // Utility, Small, Medium, Large, Huge
|
||||||
int: [0, 0, 0, 0, 0, 0, 0, 0], // Sizes 1 - 8
|
int: [0, 0, 0, 0, 0, 0, 0, 0], // Sizes 1 - 8
|
||||||
standard: shipData.slots.standard,
|
standard: shipData.slots.standard,
|
||||||
@@ -139,15 +159,16 @@ export default class ShipyardPage extends Page {
|
|||||||
* @param {Object} u Localized unit map
|
* @param {Object} u Localized unit map
|
||||||
* @param {Function} fInt Localized integer formatter
|
* @param {Function} fInt Localized integer formatter
|
||||||
* @param {Function} fRound Localized round formatter
|
* @param {Function} fRound Localized round formatter
|
||||||
|
* @param {Boolean} highlight Should this row be highlighted
|
||||||
* @return {React.Component} Table Row
|
* @return {React.Component} Table Row
|
||||||
*/
|
*/
|
||||||
_shipRowElement(s, translate, u, fInt, fRound) {
|
_shipRowElement(s, translate, u, fInt, fRound, highlight) {
|
||||||
let noTouch = this.context.noTouch;
|
let noTouch = this.context.noTouch;
|
||||||
|
|
||||||
return <tr
|
return <tr
|
||||||
key={s.id}
|
key={s.id}
|
||||||
style={{ height: '1.5em' }}
|
style={{ height: '1.5em' }}
|
||||||
className={cn({ highlighted: noTouch && this.state.shipId === s.id })}
|
className={cn({ highlighted: noTouch && this.state.shipId === s.id, alt: highlight })}
|
||||||
onMouseEnter={noTouch && this._highlightShip.bind(this, s.id)}
|
onMouseEnter={noTouch && this._highlightShip.bind(this, s.id)}
|
||||||
>
|
>
|
||||||
<td className='ri'>{s.manufacturer}</td>
|
<td className='ri'>{s.manufacturer}</td>
|
||||||
@@ -166,6 +187,7 @@ export default class ShipyardPage extends Page {
|
|||||||
<td className='ri'>{fInt(s.topBoost)}</td>
|
<td className='ri'>{fInt(s.topBoost)}</td>
|
||||||
<td className='ri'>{fRound(s.maxJumpRange)}</td>
|
<td className='ri'>{fRound(s.maxJumpRange)}</td>
|
||||||
<td className='ri'>{fInt(s.maxCargo)}</td>
|
<td className='ri'>{fInt(s.maxCargo)}</td>
|
||||||
|
<td className='ri'>{fInt(s.maxPassengers)}</td>
|
||||||
<td className='cn'>{s.standard[0]}</td>
|
<td className='cn'>{s.standard[0]}</td>
|
||||||
<td className='cn'>{s.standard[1]}</td>
|
<td className='cn'>{s.standard[1]}</td>
|
||||||
<td className='cn'>{s.standard[2]}</td>
|
<td className='cn'>{s.standard[2]}</td>
|
||||||
@@ -246,13 +268,26 @@ export default class ShipyardPage extends Page {
|
|||||||
let shipRows = new Array(shipSummaries.length);
|
let shipRows = new Array(shipSummaries.length);
|
||||||
let detailRows = new Array(shipSummaries.length);
|
let detailRows = new Array(shipSummaries.length);
|
||||||
|
|
||||||
|
let lastShipSortValue = null;
|
||||||
|
let backgroundHighlight = false;
|
||||||
|
|
||||||
for (let s of shipSummaries) {
|
for (let s of shipSummaries) {
|
||||||
detailRows[i] = this._shipRowElement(s, translate, units, fInt, formats.f1);
|
let shipSortValue = s[shipPredicate];
|
||||||
|
if( shipPredicateIndex != undefined ) {
|
||||||
|
shipSortValue = shipSortValue[shipPredicateIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
if( shipSortValue != lastShipSortValue ) {
|
||||||
|
backgroundHighlight = !backgroundHighlight;
|
||||||
|
lastShipSortValue = shipSortValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
detailRows[i] = this._shipRowElement(s, translate, units, fInt, formats.f1, backgroundHighlight);
|
||||||
shipRows[i] = (
|
shipRows[i] = (
|
||||||
<tr
|
<tr
|
||||||
key={i}
|
key={i}
|
||||||
style={{ height: '1.5em' }}
|
style={{ height: '1.5em' }}
|
||||||
className={cn({ highlighted: noTouch && this.state.shipId === s.id })}
|
className={cn({ highlighted: noTouch && this.state.shipId === s.id, alt: backgroundHighlight })}
|
||||||
onMouseEnter={noTouch && this._highlightShip.bind(this, s.id)}
|
onMouseEnter={noTouch && this._highlightShip.bind(this, s.id)}
|
||||||
>
|
>
|
||||||
<td className='le'><Link href={'/outfit/' + s.id}>{s.name}</Link></td>
|
<td className='le'><Link href={'/outfit/' + s.id}>{s.name}</Link></td>
|
||||||
@@ -293,7 +328,7 @@ export default class ShipyardPage extends Page {
|
|||||||
<th rowSpan={3} className='sortable' onMouseEnter={termtip.bind(null, 'hardness')} onMouseLeave={hide} onClick={sortShips('hardness')}>{translate('hrd')}</th>
|
<th rowSpan={3} className='sortable' onMouseEnter={termtip.bind(null, 'hardness')} onMouseLeave={hide} onClick={sortShips('hardness')}>{translate('hrd')}</th>
|
||||||
<th> </th>
|
<th> </th>
|
||||||
<th colSpan={4}>{translate('base')}</th>
|
<th colSpan={4}>{translate('base')}</th>
|
||||||
<th colSpan={4}>{translate('max')}</th>
|
<th colSpan={5}>{translate('max')}</th>
|
||||||
<th className='lft' colSpan={6}></th>
|
<th className='lft' colSpan={6}></th>
|
||||||
<th className='lft' colSpan={5}></th>
|
<th className='lft' colSpan={5}></th>
|
||||||
<th className='lft' colSpan={8}></th>
|
<th className='lft' colSpan={8}></th>
|
||||||
@@ -310,6 +345,7 @@ export default class ShipyardPage extends Page {
|
|||||||
<th className='sortable' onClick={sortShips('topBoost')}>{translate('boost')}</th>
|
<th className='sortable' onClick={sortShips('topBoost')}>{translate('boost')}</th>
|
||||||
<th className='sortable' onClick={sortShips('maxJumpRange')}>{translate('jump')}</th>
|
<th className='sortable' onClick={sortShips('maxJumpRange')}>{translate('jump')}</th>
|
||||||
<th className='sortable' onClick={sortShips('maxCargo')}>{translate('cargo')}</th>
|
<th className='sortable' onClick={sortShips('maxCargo')}>{translate('cargo')}</th>
|
||||||
|
<th className='sortable' onClick={sortShips('maxPassengers')}>{translate('passengers')}</th>
|
||||||
|
|
||||||
<th className='lft' colSpan={6}>{translate('core module classes')}</th>
|
<th className='lft' colSpan={6}>{translate('core module classes')}</th>
|
||||||
<th colSpan={5} className='sortable lft' onClick={sortShips('hpCount')}>{translate('hardpoints')}</th>
|
<th colSpan={5} className='sortable lft' onClick={sortShips('hpCount')}>{translate('hardpoints')}</th>
|
||||||
@@ -326,6 +362,7 @@ export default class ShipyardPage extends Page {
|
|||||||
<th className='sortable' onClick={sortShips('topBoost')}>{units['m/s']}</th>
|
<th className='sortable' onClick={sortShips('topBoost')}>{units['m/s']}</th>
|
||||||
<th className='sortable' onClick={sortShips('maxJumpRange')}>{units.LY}</th>
|
<th className='sortable' onClick={sortShips('maxJumpRange')}>{units.LY}</th>
|
||||||
<th className='sortable' onClick={sortShips('maxCargo')}>{units.T}</th>
|
<th className='sortable' onClick={sortShips('maxCargo')}>{units.T}</th>
|
||||||
|
<th> </th>
|
||||||
<th className='sortable lft' onMouseEnter={termtip.bind(null, 'power plant')} onMouseLeave={hide} onClick={sortShips('standard', 0)}>{'pp'}</th>
|
<th className='sortable lft' onMouseEnter={termtip.bind(null, 'power plant')} onMouseLeave={hide} onClick={sortShips('standard', 0)}>{'pp'}</th>
|
||||||
<th className='sortable' onMouseEnter={termtip.bind(null, 'thrusters')} onMouseLeave={hide} onClick={sortShips('standard', 1)}>{'th'}</th>
|
<th className='sortable' onMouseEnter={termtip.bind(null, 'thrusters')} onMouseLeave={hide} onClick={sortShips('standard', 1)}>{'th'}</th>
|
||||||
<th className='sortable' onMouseEnter={termtip.bind(null, 'frame shift drive')} onMouseLeave={hide} onClick={sortShips('standard', 2)}>{'fsd'}</th>
|
<th className='sortable' onMouseEnter={termtip.bind(null, 'frame shift drive')} onMouseLeave={hide} onClick={sortShips('standard', 2)}>{'fsd'}</th>
|
||||||
|
|||||||
@@ -58,19 +58,24 @@ export const ModuleGroupToName = {
|
|||||||
cm: 'Countermeasure',
|
cm: 'Countermeasure',
|
||||||
ec: 'Electronic Countermeasure',
|
ec: 'Electronic Countermeasure',
|
||||||
fc: 'Fragment Cannon',
|
fc: 'Fragment Cannon',
|
||||||
|
rfl: 'Remote Release Flak Launcher',
|
||||||
hs: 'Heat Sink Launcher',
|
hs: 'Heat Sink Launcher',
|
||||||
ws: 'Frame Shift Wake Scanner',
|
ws: 'Frame Shift Wake Scanner',
|
||||||
kw: 'Kill Warrant Scanner',
|
kw: 'Kill Warrant Scanner',
|
||||||
nl: 'Mine Launcher',
|
nl: 'Mine Launcher',
|
||||||
ml: 'Mining Laser',
|
ml: 'Mining Laser',
|
||||||
mr: 'Missile Rack',
|
mr: 'Missile Rack',
|
||||||
|
axmr: 'AX Missile Rack',
|
||||||
pa: 'Plasma Accelerator',
|
pa: 'Plasma Accelerator',
|
||||||
po: 'Point Defence',
|
po: 'Point Defence',
|
||||||
mc: 'Multi-cannon',
|
mc: 'Multi-cannon',
|
||||||
|
axmc: 'AX Multi-cannon',
|
||||||
pl: 'Pulse Laser',
|
pl: 'Pulse Laser',
|
||||||
rg: 'Rail Gun',
|
rg: 'Rail Gun',
|
||||||
sb: 'Shield Booster',
|
sb: 'Shield Booster',
|
||||||
tp: 'Torpedo Pylon'
|
tp: 'Torpedo Pylon',
|
||||||
|
sfn: 'Shutdown Field Neutraliser',
|
||||||
|
xs: 'Xeno Scanner'
|
||||||
};
|
};
|
||||||
|
|
||||||
let GrpNameToCodeMap = {};
|
let GrpNameToCodeMap = {};
|
||||||
|
|||||||
@@ -785,6 +785,14 @@ export default class Ship {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
buildFromLoadout(Modules) {
|
||||||
|
let internal = this.internal,
|
||||||
|
standard = this.standard,
|
||||||
|
hps = this.hardpoints,
|
||||||
|
cl = standard.length,
|
||||||
|
i, l;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Empties all hardpoints and utility slots
|
* Empties all hardpoints and utility slots
|
||||||
* @return {this} The current ship instance for chaining
|
* @return {this} The current ship instance for chaining
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { getBlueprint } from '../utils/BlueprintFunctions';
|
|||||||
import * as ModuleUtils from '../shipyard/ModuleUtils';
|
import * as ModuleUtils from '../shipyard/ModuleUtils';
|
||||||
|
|
||||||
// mapping from fd's ship model names to coriolis'
|
// mapping from fd's ship model names to coriolis'
|
||||||
const SHIP_FD_NAME_TO_CORIOLIS_NAME = {
|
export const SHIP_FD_NAME_TO_CORIOLIS_NAME = {
|
||||||
'Adder': 'adder',
|
'Adder': 'adder',
|
||||||
'Anaconda': 'anaconda',
|
'Anaconda': 'anaconda',
|
||||||
'Asp': 'asp',
|
'Asp': 'asp',
|
||||||
@@ -35,6 +35,8 @@ const SHIP_FD_NAME_TO_CORIOLIS_NAME = {
|
|||||||
'Type6': 'type_6_transporter',
|
'Type6': 'type_6_transporter',
|
||||||
'Type7': 'type_7_transport',
|
'Type7': 'type_7_transport',
|
||||||
'Type9': 'type_9_heavy',
|
'Type9': 'type_9_heavy',
|
||||||
|
'Type9_Military': 'type_10_defender',
|
||||||
|
'TypeX': 'alliance_chieftain',
|
||||||
'Viper': 'viper',
|
'Viper': 'viper',
|
||||||
'Viper_MkIV': 'viper_mk_iv',
|
'Viper_MkIV': 'viper_mk_iv',
|
||||||
'Vulture': 'vulture'
|
'Vulture': 'vulture'
|
||||||
@@ -49,7 +51,6 @@ const HARDPOINT_NUM_TO_CLASS = {
|
|||||||
4: 'Huge'
|
4: 'Huge'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Obtain a module given its ED ID
|
* Obtain a module given its ED ID
|
||||||
* @param {Integer} edId the Elite ID of the module
|
* @param {Integer} edId the Elite ID of the module
|
||||||
@@ -142,6 +143,8 @@ export function shipFromJson(json) {
|
|||||||
ship.cargoHatch.priority = 4;
|
ship.cargoHatch.priority = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let rootModule;
|
||||||
|
|
||||||
// Add the bulkheads
|
// Add the bulkheads
|
||||||
const armourJson = json.modules.Armour.module;
|
const armourJson = json.modules.Armour.module;
|
||||||
if (armourJson.name.endsWith('_Armour_Grade1')) {
|
if (armourJson.name.endsWith('_Armour_Grade1')) {
|
||||||
@@ -158,13 +161,15 @@ export function shipFromJson(json) {
|
|||||||
throw 'Unknown bulkheads "' + armourJson.name + '"';
|
throw 'Unknown bulkheads "' + armourJson.name + '"';
|
||||||
}
|
}
|
||||||
ship.bulkheads.enabled = true;
|
ship.bulkheads.enabled = true;
|
||||||
if (armourJson.modifiers) _addModifications(ship.bulkheads.m, armourJson.modifiers, armourJson.recipeName, armourJson.recipeLevel);
|
rootModule = json.modules.Armour;
|
||||||
|
if (rootModule.WorkInProgress_modifications) _addModifications(ship.bulkheads.m, rootModule.WorkInProgress_modifications, rootModule.engineer.recipeName, rootModule.engineer.recipeLevel);
|
||||||
|
|
||||||
// Add the standard modules
|
// Add the standard modules
|
||||||
// Power plant
|
// Power plant
|
||||||
const powerplantJson = json.modules.PowerPlant.module;
|
const powerplantJson = json.modules.PowerPlant.module;
|
||||||
const powerplant = _moduleFromEdId(powerplantJson.id);
|
const powerplant = _moduleFromEdId(powerplantJson.id);
|
||||||
if (powerplantJson.modifiers) _addModifications(powerplant, powerplantJson.modifiers, powerplantJson.recipeName, powerplantJson.recipeLevel);
|
rootModule = json.modules.PowerPlant;
|
||||||
|
if (rootModule.WorkInProgress_modifications) _addModifications(powerplant, rootModule.WorkInProgress_modifications, rootModule.engineer.recipeName, rootModule.engineer.recipeLevel);
|
||||||
ship.use(ship.standard[0], powerplant, true);
|
ship.use(ship.standard[0], powerplant, true);
|
||||||
ship.standard[0].enabled = powerplantJson.on === true;
|
ship.standard[0].enabled = powerplantJson.on === true;
|
||||||
ship.standard[0].priority = powerplantJson.priority;
|
ship.standard[0].priority = powerplantJson.priority;
|
||||||
@@ -172,7 +177,8 @@ export function shipFromJson(json) {
|
|||||||
// Thrusters
|
// Thrusters
|
||||||
const thrustersJson = json.modules.MainEngines.module;
|
const thrustersJson = json.modules.MainEngines.module;
|
||||||
const thrusters = _moduleFromEdId(thrustersJson.id);
|
const thrusters = _moduleFromEdId(thrustersJson.id);
|
||||||
if (thrustersJson.modifiers) _addModifications(thrusters, thrustersJson.modifiers, thrustersJson.recipeName, thrustersJson.recipeLevel);
|
rootModule = json.modules.MainEngines;
|
||||||
|
if (rootModule.WorkInProgress_modifications) _addModifications(thrusters, rootModule.WorkInProgress_modifications, rootModule.engineer.recipeName, rootModule.engineer.recipeLevel);
|
||||||
ship.use(ship.standard[1], thrusters, true);
|
ship.use(ship.standard[1], thrusters, true);
|
||||||
ship.standard[1].enabled = thrustersJson.on === true;
|
ship.standard[1].enabled = thrustersJson.on === true;
|
||||||
ship.standard[1].priority = thrustersJson.priority;
|
ship.standard[1].priority = thrustersJson.priority;
|
||||||
@@ -180,7 +186,8 @@ export function shipFromJson(json) {
|
|||||||
// FSD
|
// FSD
|
||||||
const frameshiftdriveJson = json.modules.FrameShiftDrive.module;
|
const frameshiftdriveJson = json.modules.FrameShiftDrive.module;
|
||||||
const frameshiftdrive = _moduleFromEdId(frameshiftdriveJson.id);
|
const frameshiftdrive = _moduleFromEdId(frameshiftdriveJson.id);
|
||||||
if (frameshiftdriveJson.modifiers) _addModifications(frameshiftdrive, frameshiftdriveJson.modifiers, frameshiftdriveJson.recipeName, frameshiftdriveJson.recipeLevel);
|
rootModule = json.modules.FrameShiftDrive;
|
||||||
|
if (rootModule.WorkInProgress_modifications) _addModifications(frameshiftdrive, rootModule.WorkInProgress_modifications, rootModule.engineer.recipeName, rootModule.engineer.recipeLevel);
|
||||||
ship.use(ship.standard[2], frameshiftdrive, true);
|
ship.use(ship.standard[2], frameshiftdrive, true);
|
||||||
ship.standard[2].enabled = frameshiftdriveJson.on === true;
|
ship.standard[2].enabled = frameshiftdriveJson.on === true;
|
||||||
ship.standard[2].priority = frameshiftdriveJson.priority;
|
ship.standard[2].priority = frameshiftdriveJson.priority;
|
||||||
@@ -188,7 +195,8 @@ export function shipFromJson(json) {
|
|||||||
// Life support
|
// Life support
|
||||||
const lifesupportJson = json.modules.LifeSupport.module;
|
const lifesupportJson = json.modules.LifeSupport.module;
|
||||||
const lifesupport = _moduleFromEdId(lifesupportJson.id);
|
const lifesupport = _moduleFromEdId(lifesupportJson.id);
|
||||||
if (lifesupportJson.modifiers)_addModifications(lifesupport, lifesupportJson.modifiers, lifesupportJson.recipeName, lifesupportJson.recipeLevel);
|
rootModule = json.modules.LifeSupport;
|
||||||
|
if (rootModule.WorkInProgress_modifications) _addModifications(lifesupport, rootModule.WorkInProgress_modifications, rootModule.engineer.recipeName, rootModule.engineer.recipeLevel);
|
||||||
ship.use(ship.standard[3], lifesupport, true);
|
ship.use(ship.standard[3], lifesupport, true);
|
||||||
ship.standard[3].enabled = lifesupportJson.on === true;
|
ship.standard[3].enabled = lifesupportJson.on === true;
|
||||||
ship.standard[3].priority = lifesupportJson.priority;
|
ship.standard[3].priority = lifesupportJson.priority;
|
||||||
@@ -196,7 +204,8 @@ export function shipFromJson(json) {
|
|||||||
// Power distributor
|
// Power distributor
|
||||||
const powerdistributorJson = json.modules.PowerDistributor.module;
|
const powerdistributorJson = json.modules.PowerDistributor.module;
|
||||||
const powerdistributor = _moduleFromEdId(powerdistributorJson.id);
|
const powerdistributor = _moduleFromEdId(powerdistributorJson.id);
|
||||||
if (powerdistributorJson.modifiers) _addModifications(powerdistributor, powerdistributorJson.modifiers, powerdistributorJson.recipeName, powerdistributorJson.recipeLevel);
|
rootModule = json.modules.PowerDistributor;
|
||||||
|
if (rootModule.WorkInProgress_modifications) _addModifications(powerdistributor, rootModule.WorkInProgress_modifications, rootModule.engineer.recipeName, rootModule.engineer.recipeLevel);
|
||||||
ship.use(ship.standard[4], powerdistributor, true);
|
ship.use(ship.standard[4], powerdistributor, true);
|
||||||
ship.standard[4].enabled = powerdistributorJson.on === true;
|
ship.standard[4].enabled = powerdistributorJson.on === true;
|
||||||
ship.standard[4].priority = powerdistributorJson.priority;
|
ship.standard[4].priority = powerdistributorJson.priority;
|
||||||
@@ -204,7 +213,8 @@ export function shipFromJson(json) {
|
|||||||
// Sensors
|
// Sensors
|
||||||
const sensorsJson = json.modules.Radar.module;
|
const sensorsJson = json.modules.Radar.module;
|
||||||
const sensors = _moduleFromEdId(sensorsJson.id);
|
const sensors = _moduleFromEdId(sensorsJson.id);
|
||||||
if (sensorsJson.modifiers) _addModifications(sensors, sensorsJson.modifiers, sensorsJson.recipeName, sensorsJson.recipeLevel);
|
rootModule = json.modules.Radar;
|
||||||
|
if (rootModule.WorkInProgress_modifications) _addModifications(sensors, rootModule.WorkInProgress_modifications, rootModule.engineer.recipeName, rootModule.engineer.recipeLevel);
|
||||||
ship.use(ship.standard[5], sensors, true);
|
ship.use(ship.standard[5], sensors, true);
|
||||||
ship.standard[5].enabled = sensorsJson.on === true;
|
ship.standard[5].enabled = sensorsJson.on === true;
|
||||||
ship.standard[5].priority = sensorsJson.priority;
|
ship.standard[5].priority = sensorsJson.priority;
|
||||||
@@ -240,7 +250,8 @@ export function shipFromJson(json) {
|
|||||||
} else {
|
} else {
|
||||||
const hardpointJson = hardpointSlot.module;
|
const hardpointJson = hardpointSlot.module;
|
||||||
const hardpoint = _moduleFromEdId(hardpointJson.id);
|
const hardpoint = _moduleFromEdId(hardpointJson.id);
|
||||||
if (hardpointJson.modifiers) _addModifications(hardpoint, hardpointJson.modifiers, hardpointJson.recipeName, hardpointJson.recipeLevel);
|
rootModule = hardpointSlot;
|
||||||
|
if (rootModule.WorkInProgress_modifications) _addModifications(hardpoint, rootModule.WorkInProgress_modifications, rootModule.engineer.recipeName, rootModule.engineer.recipeLevel, rootModule.specialModifications);
|
||||||
ship.use(ship.hardpoints[hardpointArrayNum], hardpoint, true);
|
ship.use(ship.hardpoints[hardpointArrayNum], hardpoint, true);
|
||||||
ship.hardpoints[hardpointArrayNum].enabled = hardpointJson.on === true;
|
ship.hardpoints[hardpointArrayNum].enabled = hardpointJson.on === true;
|
||||||
ship.hardpoints[hardpointArrayNum].priority = hardpointJson.priority;
|
ship.hardpoints[hardpointArrayNum].priority = hardpointJson.priority;
|
||||||
@@ -282,7 +293,8 @@ export function shipFromJson(json) {
|
|||||||
} else {
|
} else {
|
||||||
const internalJson = internalSlot.module;
|
const internalJson = internalSlot.module;
|
||||||
const internal = _moduleFromEdId(internalJson.id);
|
const internal = _moduleFromEdId(internalJson.id);
|
||||||
if (internalJson.modifiers) _addModifications(internal, internalJson.modifiers, internalJson.recipeName, internalJson.recipeLevel);
|
rootModule = internalSlot;
|
||||||
|
if (rootModule.WorkInProgress_modifications) _addModifications(internal, rootModule.WorkInProgress_modifications, rootModule.engineer.recipeName, rootModule.engineer.recipeLevel);
|
||||||
ship.use(ship.internal[i], internal, true);
|
ship.use(ship.internal[i], internal, true);
|
||||||
ship.internal[i].enabled = internalJson.on === true;
|
ship.internal[i].enabled = internalJson.on === true;
|
||||||
ship.internal[i].priority = internalJson.priority;
|
ship.internal[i].priority = internalJson.priority;
|
||||||
@@ -299,35 +311,48 @@ export function shipFromJson(json) {
|
|||||||
* @param {Object} modifiers the modifiers
|
* @param {Object} modifiers the modifiers
|
||||||
* @param {Object} blueprint the blueprint of the modification
|
* @param {Object} blueprint the blueprint of the modification
|
||||||
* @param {Object} grade the grade of the modification
|
* @param {Object} grade the grade of the modification
|
||||||
|
* @param {Object} specialModifications special modification
|
||||||
*/
|
*/
|
||||||
function _addModifications(module, modifiers, blueprint, grade) {
|
function _addModifications(module, modifiers, blueprint, grade, specialModifications) {
|
||||||
if (!modifiers || !modifiers.modifiers) return;
|
if (!modifiers) return;
|
||||||
|
|
||||||
let special;
|
let special;
|
||||||
for (const i in modifiers.modifiers) {
|
if (specialModifications) {
|
||||||
|
special = Modifications.specials[Object.keys(specialModifications)[0]]
|
||||||
|
}
|
||||||
|
for (const i in modifiers) {
|
||||||
// Some special modifications
|
// Some special modifications
|
||||||
if (modifiers.modifiers[i].name === 'mod_weapon_clip_size_override') {
|
if (modifiers[i].name === 'mod_weapon_clip_size_override') {
|
||||||
// This is a numeric addition to the clip size, but we need to work it out in terms of being a percentage so
|
// This is a numeric addition to the clip size, but we need to work it out in terms of being a percentage so
|
||||||
// that it works the same as other modifications
|
// that it works the same as other modifications
|
||||||
const origClip = module.clip || 1;
|
const origClip = module.clip || 1;
|
||||||
module.setModValue('clip', ((modifiers.modifiers[i].value - origClip) / origClip) * 10000);
|
module.setModValue('clip', ((modifiers[i].value - origClip) / origClip) * 10000);
|
||||||
} else if (modifiers.modifiers[i].name === 'mod_weapon_burst_size') {
|
} else if (modifiers[i].name === 'mod_weapon_burst_size') {
|
||||||
// This is an absolute number that acts as an override
|
// This is an absolute number that acts as an override
|
||||||
module.setModValue('burst', modifiers.modifiers[i].value * 100);
|
module.setModValue('burst', modifiers[i].value * 100);
|
||||||
} else if (modifiers.modifiers[i].name === 'mod_weapon_burst_rof') {
|
} else if (modifiers[i].name === 'mod_weapon_burst_rof') {
|
||||||
// This is an absolute number that acts as an override
|
// This is an absolute number that acts as an override
|
||||||
module.setModValue('burstrof', modifiers.modifiers[i].value * 100);
|
module.setModValue('burstrof', modifiers[i].value * 100);
|
||||||
} else if (modifiers.modifiers[i].name === 'mod_weapon_falloffrange_from_range') {
|
} else if (modifiers[i].name === 'mod_weapon_falloffrange_from_range') {
|
||||||
// Obtain the falloff value directly from the range
|
// Obtain the falloff value directly from the range
|
||||||
module.setModValue('fallofffromrange', 1);
|
module.setModValue('fallofffromrange', 1);
|
||||||
} else if (modifiers.modifiers[i].name && modifiers.modifiers[i].name.startsWith('special_')) {
|
} else if (modifiers[i].name && modifiers[i].name.startsWith('special_')) {
|
||||||
// We don't add special effects directly, but keep a note of them so they can be added when fetching values
|
// We don't add special effects directly, but keep a note of them so they can be added when fetching values
|
||||||
special = Modifications.specials[modifiers.modifiers[i].name];
|
special = Modifications.specials[modifiers[i].name];
|
||||||
} else {
|
} else {
|
||||||
// Look up the modifiers to find what we need to do
|
// Look up the modifiers to find what we need to do
|
||||||
const modifierActions = Modifications.modifierActions[modifiers.modifiers[i].name];
|
const modifierActions = Modifications.modifierActions[i];
|
||||||
const value = modifiers.modifiers[i].value;
|
let value;
|
||||||
|
if (i === 'OutfittingFieldType_DefenceModifierShieldMultiplier') {
|
||||||
|
value = modifiers[i].value - 1;
|
||||||
|
} else if (i === 'OutfittingFieldType_DefenceModifierHealthMultiplier' && blueprint.startsWith('Armour_')) {
|
||||||
|
value = (modifiers[i].value - module.hullboost) / module.hullboost;
|
||||||
|
} else if (i === 'OutfittingFieldType_DefenceModifierHealthMultiplier') {
|
||||||
|
value = modifiers[i].value / module.hullboost;
|
||||||
|
} else if (i === 'OutfittingFieldType_RateOfFire') {
|
||||||
|
value = (1 / Math.abs(modifiers[i].value));
|
||||||
|
} else {
|
||||||
|
value = modifiers[i].value - 1;
|
||||||
|
}
|
||||||
// Carry out the required changes
|
// Carry out the required changes
|
||||||
for (const action in modifierActions) {
|
for (const action in modifierActions) {
|
||||||
if (isNaN(modifierActions[action])) {
|
if (isNaN(modifierActions[action])) {
|
||||||
@@ -423,7 +448,7 @@ function _addModifications(module, modifiers, blueprint, grade) {
|
|||||||
// Bulkhead boost is based off the inherent boost of the module
|
// Bulkhead boost is based off the inherent boost of the module
|
||||||
if (module.grp == 'bh') {
|
if (module.grp == 'bh') {
|
||||||
const alteredBoost = (1 + module.hullboost) * (1 + module.getModValue('hullboost') / 10000) - 1;
|
const alteredBoost = (1 + module.hullboost) * (1 + module.getModValue('hullboost') / 10000) - 1;
|
||||||
module.setModValue('hullboost', (alteredBoost / module.hullboost - 1) * 10000);
|
module.setModValue('hullboost', (alteredBoost / module.hullboost - 1) * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Jitter is an absolute number, so we need to divide it by 100
|
// Jitter is an absolute number, so we need to divide it by 100
|
||||||
@@ -431,11 +456,6 @@ function _addModifications(module, modifiers, blueprint, grade) {
|
|||||||
module.setModValue('jitter', module.getModValue('jitter') / 100);
|
module.setModValue('jitter', module.getModValue('jitter') / 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FD uses interval between bursts internally, so we need to translate this to a real rate of fire
|
|
||||||
if (module.getModValue('rof')) {
|
|
||||||
module.setModValue('rof', ((1 / (1 + module.getModValue('rof') / 10000)) - 1) * 10000);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clip size is rounded up so that the result is a whole number
|
// Clip size is rounded up so that the result is a whole number
|
||||||
if (module.getModValue('clip')) {
|
if (module.getModValue('clip')) {
|
||||||
const individual = 1 / (module.clip || 1);
|
const individual = 1 / (module.clip || 1);
|
||||||
|
|||||||
@@ -220,7 +220,7 @@ export function diffDetails(language, m, mm) {
|
|||||||
|
|
||||||
let mCost = m.cost || 0;
|
let mCost = m.cost || 0;
|
||||||
let mmCost = mm ? mm.cost : 0;
|
let mmCost = mm ? mm.cost : 0;
|
||||||
if (mCost != mmCost) propDiffs.push(<div key='cost'>{translate('cost')}: <span className={diffClass(mCost, mmCost, true) }>{mCost ? Math.round(mCost * (1 - Persist.getModuleDiscount())) : 0}{units.CR}</span></div>);
|
if (mCost != mmCost) propDiffs.push(<div key='cost'>{translate('cost')}: <span className={diffClass(mCost, mmCost, true) }>{formats.int(mCost ? Math.round(mCost * (1 - Persist.getModuleDiscount())) : 0)}{units.CR}</span></div>);
|
||||||
|
|
||||||
let mMass = m.mass || 0;
|
let mMass = m.mass || 0;
|
||||||
let mmMass = mm ? mm.getMass() : 0;
|
let mmMass = mm ? mm.getMass() : 0;
|
||||||
|
|||||||
6
src/images/Empire.svg
Normal file
6
src/images/Empire.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg width="1718.2px" height="999.8px" viewBox="0 0 1718.2 999.8" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<defs/>
|
||||||
|
<g>
|
||||||
|
<path stroke="none" fill="#FF8C0D" d="M1717.55 -0.05 L1717.65 -0.25 1718.2 -0.1 1718.6 0.35 1719.2 1.55 1719.3 2.25 1718.95 2.85 1709.75 11.35 1010.8 687.7 1008.05 690.5 1005.45 693.4 1003 696.35 1000.75 699.45 998.65 702.65 996.7 705.95 994.9 709.4 993.25 713.05 934.9 850.7 876.4 988.25 871.55 998.95 871.3 999.3 870.9 999.5 870.6 999.55 870 999.4 869.5 999.05 868.3 997.95 867.35 996.7 866.6 995.25 864.7 989.85 762.3 730.55 754.8 711.85 751.1 702.45 746.6 690.65 745.5 688.4 744.25 686.3 742.9 684.35 741.4 682.45 739.75 680.6 737.95 678.85 736 677.15 8.1 61.2 5.75 59.15 3.65 57.1 1.6 54.6 1.1 53.7 1.1 53.25 1.25 52.9 1.5 52.65 1.8 52.45 2.15 52.4 2.55 52.5 9.75 55.7 713.05 398.5 780.95 431.7 848.75 464.95 851.7 466.25 854.4 467.15 856.95 467.6 859.45 467.65 861.9 467.25 864.4 466.45 866.95 465.2 869.6 463.5 1416.95 79.15 1419.7 77.35 1422.45 75.7 1425.25 74.2 1428.1 72.85 1431 71.6 1434 70.5 1437.05 69.55 1440.2 68.7 1574.85 35.15 1709.5 1.5 1713.75 0.6 1717.55 -0.05 M903.9 129.8 L904 129.65 930.9 129.75 934.3 129.85 937.55 130.15 940.65 130.65 943.6 131.35 946.4 132.2 949.2 133.3 951.95 134.6 954.55 136.05 957 137.7 959.35 139.5 961.6 141.5 963.75 143.65 965.8 145.95 967.75 148.4 969.6 151 971.35 153.8 974.25 159 976.8 164.3 979.05 169.7 981 175.2 982.7 180.8 984.2 186.45 985.55 192.15 986.75 197.9 987.85 203.75 988.8 209.65 990.4 221.45 991.6 233.25 992.55 245.1 995 280.65 996 292.5 996.2 295.1 996.25 297.55 996.15 299.85 995.9 302 995.5 304.1 994.95 306.1 994.25 308 993.45 309.7 992.4 311.5 991.25 313.15 989.95 314.75 988.45 316.3 986.8 317.8 985 319.25 980.85 322.15 946.35 344.45 912.05 367.15 843.7 413.05 841.45 414.45 839.25 415.55 836.9 416.35 834.85 416.75 832.6 416.85 830.15 416.5 827.75 415.8 825.25 414.7 812.45 408.55 799.4 402.55 773.35 390.75 773 390.5 772.8 390.15 772.75 389.75 772.85 389.35 794.5 343.45 801.35 328.15 811 305.8 820.45 283.4 839 238.45 841 233 842.7 227.35 844.1 221.65 845.25 215.95 845.7 213.05 845.8 210.65 845.55 208.55 845.3 207.75 844.9 206.9 843.85 205.55 842.3 204.4 840.2 203.4 837.55 202.55 830.2 200.55 822.85 198.85 819.15 198.15 815.5 197.6 811.85 197.2 808.2 196.95 804.55 196.9 800.9 197.05 797.25 197.4 793.6 198 789.9 198.9 786.25 200.05 782.6 201.55 778.55 203.5 777 203.65 776.65 203.6 776.1 203.15 775.95 202.8 775.5 200.55 775.25 197.65 775.3 194.75 775.65 191.9 776.25 189.05 777.05 186.3 778 183.6 779.05 180.9 780.5 177.65 782.1 174.5 783.8 171.5 785.65 168.6 787.6 165.85 789.7 163.2 791.9 160.7 794.25 158.3 796.7 156 799.3 153.85 802 151.8 804.8 149.9 807.7 148.1 810.75 146.4 813.9 144.85 817.15 143.4 824.4 140.6 831.75 138.2 839.15 136.15 846.65 134.45 854.2 133.05 861.8 131.95 869.45 131.1 877.1 130.5 883.8 130.15 890.5 129.95 903.9 129.8"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.8 KiB |
6
src/images/Federation.svg
Normal file
6
src/images/Federation.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 30 KiB |
71
src/images/surface_port_pm.svg
Normal file
71
src/images/surface_port_pm.svg
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<!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" x="0px" y="0px"
|
||||||
|
width="631.072px" height="713.591px" viewBox="0 0 631.072 713.591" enable-background="new 0 0 631.072 713.591"
|
||||||
|
xml:space="preserve">
|
||||||
|
<g id="Layer_2">
|
||||||
|
<g>
|
||||||
|
|
||||||
|
<rect x="460.344" y="668.509" transform="matrix(0.7399 0.6727 -0.6727 0.7399 586.8318 -155.8918)" fill="#FF8C0D" width="69.376" height="24.999"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
|
||||||
|
<rect x="499.816" y="630.511" transform="matrix(0.8742 0.4856 -0.4856 0.8742 379.9255 -180.1477)" fill="#FF8C0D" width="75.501" height="24.999"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
|
||||||
|
<rect x="537.078" y="590.363" transform="matrix(0.9477 0.319 -0.319 0.9477 222.2531 -151.1744)" fill="#FF8C0D" width="71.047" height="25"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
|
||||||
|
<rect x="561.364" y="544.916" transform="matrix(0.9741 0.2263 -0.2263 0.9741 141.5892 -120.2454)" fill="#FF8C0D" width="67.758" height="25"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
|
||||||
|
<rect x="113.454" y="633.977" transform="matrix(0.6727 0.7399 -0.7399 0.6727 536.0002 125.674)" fill="#FF8C0D" width="24.999" height="69.375"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
|
||||||
|
<rect x="72.787" y="594.581" transform="matrix(0.4857 0.8741 -0.8741 0.4857 596.6155 250.6765)" fill="#FF8C0D" width="25" height="75.501"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
|
||||||
|
<rect x="43.454" y="554.475" transform="matrix(0.319 0.9477 -0.9477 0.319 597.2715 348.7429)" fill="#FF8C0D" width="25" height="71.046"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
|
||||||
|
<rect x="23.329" y="507.12" transform="matrix(0.2263 0.9741 -0.9741 0.2263 554.6862 383.6775)" fill="#FF8C0D" width="25" height="67.758"/>
|
||||||
|
</g>
|
||||||
|
<path fill="#FF8C0D" d="M556.439,425.748c-13.466-24.188-32.583-45.79-56.821-64.205c-30.562-23.22-67.327-39.855-107.331-48.986
|
||||||
|
v25.737c93.31,23.32,160.681,90.053,160.681,168.752c0,98.096-104.668,177.619-233.785,177.619
|
||||||
|
c-129.115,0-233.784-79.523-233.784-177.619c0-75.918,62.696-140.699,150.889-166.118v-25.964
|
||||||
|
c-36.209,9.508-69.489,25.266-97.539,46.578c-24.238,18.415-43.355,40.017-56.821,64.205
|
||||||
|
c-14.286,25.66-21.529,53.014-21.529,81.299c0,28.284,7.243,55.637,21.529,81.298c13.465,24.188,32.583,45.789,56.821,64.204
|
||||||
|
c48.479,36.832,112.559,57.117,180.435,57.117c67.876,0,131.956-20.285,180.436-57.117c24.238-18.415,43.355-40.017,56.821-64.204
|
||||||
|
c14.285-25.661,21.528-53.014,21.528-81.298C577.968,478.761,570.725,451.408,556.439,425.748z"/>
|
||||||
|
<path fill="#FF8C0D" d="M473.97,427.082c-8.958-16.091-21.621-30.42-37.64-42.591c-13.129-9.975-27.996-18.079-44.043-24.152
|
||||||
|
v27.053c42.591,19.056,71.178,54.248,71.178,94.519c0,60.541-64.597,109.619-144.282,109.619
|
||||||
|
c-79.684,0-144.281-49.078-144.281-109.619c0-37.101,24.263-69.892,61.386-89.727v-27.819c-12.323,5.48-23.835,12.212-34.25,20.125
|
||||||
|
c-16.019,12.171-28.683,26.5-37.64,42.591c-9.618,17.276-14.495,35.724-14.495,54.829c0,19.104,4.877,37.552,14.495,54.829
|
||||||
|
c8.958,16.091,21.622,30.42,37.64,42.59c31.574,23.989,73.178,37.2,117.146,37.2c43.969,0,85.572-13.211,117.147-37.2
|
||||||
|
c16.019-12.17,28.682-26.499,37.64-42.59c9.618-17.277,14.495-35.725,14.495-54.829
|
||||||
|
C488.465,462.805,483.588,444.358,473.97,427.082z"/>
|
||||||
|
</g>
|
||||||
|
<g id="Layer_3">
|
||||||
|
<path fill="#FF8C0D" d="M253.551,232.333c-0.157-0.981-0.264-1.978-0.264-3c0-10.844,9.173-19.667,20.448-19.667
|
||||||
|
s20.448,8.822,20.448,19.667c0,1.022-0.106,2.019-0.264,3h25.15c0.067-0.993,0.113-1.991,0.113-3
|
||||||
|
c0-24.668-20.348-44.667-45.448-44.667s-45.448,19.998-45.448,44.667c0,1.009,0.046,2.007,0.113,3H253.551z"/>
|
||||||
|
<path fill="#FF8C0D" d="M302.831,48c-0.136-0.669-0.21-1.337-0.21-2c0-9.913,15.539-21,36.333-21s36.333,11.087,36.333,21
|
||||||
|
c0,0.663-0.074,1.331-0.21,2h25.143c0.038-0.664,0.067-1.329,0.067-2c0-25.405-27.46-46-61.333-46
|
||||||
|
c-33.874,0-61.333,20.595-61.333,46c0,0.671,0.03,1.336,0.067,2H302.831z"/>
|
||||||
|
<ellipse fill="#FF8C0D" cx="338.954" cy="68.499" rx="36.333" ry="6.75"/>
|
||||||
|
<path fill="#FF8C0D" d="M375.287,46c0,2.208-16.267,3.999-36.333,3.999S302.621,48.208,302.621,46h-25v158.499h25v-136h72.667
|
||||||
|
V473.51c-4.165,3.092-16.463,8.535-36.333,8.535c-7.763,0-14.353-0.836-19.771-2.033l-10.749,23.051
|
||||||
|
c8.99,2.529,19.405,3.982,30.52,3.982c33.873,0,61.333-13.432,61.333-30V46H375.287z"/>
|
||||||
|
<ellipse fill="#FF8C0D" cx="273.735" cy="253.132" rx="20.448" ry="3.916"/>
|
||||||
|
<path fill="#FF8C0D" d="M294.184,229.333c0,1.151-9.155,2.084-20.448,2.084s-20.448-0.933-20.448-2.084h-25v257.666h0.128
|
||||||
|
c1.667,14.529,21.313,26,45.32,26s43.653-11.471,45.32-26h0.128V229.333H294.184z M294.184,254.333v228.201
|
||||||
|
c-2.473,2.008-9.464,5.465-20.448,5.465s-17.975-3.456-20.448-5.465V253.132h40.896V254.333z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.6 KiB |
@@ -18,6 +18,7 @@
|
|||||||
@bg: rgba(30,30,30,1);
|
@bg: rgba(30,30,30,1);
|
||||||
@bgBlack: #000;
|
@bgBlack: #000;
|
||||||
@primary-bg: fadeout(darken(@primary, 47%), 15%);
|
@primary-bg: fadeout(darken(@primary, 47%), 15%);
|
||||||
|
@alt-primary-bg: fadeout(darken(@primary, 42%), 15%); // Lighter brown background
|
||||||
@secondary-bg: fadeout(darken(@secondary, @bgDarken), @bgTransparency); // Brown background
|
@secondary-bg: fadeout(darken(@secondary, @bgDarken), @bgTransparency); // Brown background
|
||||||
@warning-bg: fadeout(darken(@warning, @bgDarken), @bgTransparency); // Dark Red
|
@warning-bg: fadeout(darken(@warning, @bgDarken), @bgTransparency); // Dark Red
|
||||||
|
|
||||||
|
|||||||
@@ -21,13 +21,47 @@
|
|||||||
|
|
||||||
#overview {
|
#overview {
|
||||||
h1 {
|
h1 {
|
||||||
margin: 0;
|
margin: 0 1em 0.2em 0;
|
||||||
float: left;
|
float: left;
|
||||||
}
|
}
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
margin: 0.5em;
|
margin: 0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#requirements {
|
||||||
|
margin: 0;
|
||||||
|
float: left;
|
||||||
|
text-align: left;
|
||||||
|
|
||||||
|
div {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0 1em 0.5em 0;
|
||||||
|
height: 1.6em;
|
||||||
|
line-height: 1.6em;
|
||||||
|
text-align: left;
|
||||||
|
vertical-align: middle;
|
||||||
|
cursor: default;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: left center;
|
||||||
|
background-size: contain;
|
||||||
|
}
|
||||||
|
|
||||||
|
.federation {
|
||||||
|
background-image: url('../images/Federation.svg');
|
||||||
|
padding-left: 1.985em + 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.empire {
|
||||||
|
background-image: url('../images/Empire.svg');
|
||||||
|
padding-left: 2.750em + 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.horizons {
|
||||||
|
background-image: url('../images/surface_port_pm.svg');
|
||||||
|
padding-left: 1.415em + 0.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#summary {
|
#summary {
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
-webkit-overflow-scrolling: touch;
|
-webkit-overflow-scrolling: touch;
|
||||||
|
|||||||
@@ -54,6 +54,10 @@ tbody tr {
|
|||||||
.no-touch &.highlight:hover, .no-touch &.highlighted {
|
.no-touch &.highlight:hover, .no-touch &.highlighted {
|
||||||
background-color: @warning-bg;
|
background-color: @warning-bg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.alt {
|
||||||
|
background-color: @alt-primary-bg;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
td {
|
td {
|
||||||
|
|||||||
Reference in New Issue
Block a user