diff --git a/src/app/Router.js b/src/app/Router.js
index 37bd2305..1bac3386 100644
--- a/src/app/Router.js
+++ b/src/app/Router.js
@@ -1,7 +1,5 @@
import Persist from './stores/Persist';
-import ReactGA from 'react-ga';
-ReactGA.initialize('UA-55840909-18');
let standalone = undefined;
/**
@@ -259,16 +257,6 @@ Route.prototype.match = function(path, params) {
* @param {string} path Path to track
*/
function gaTrack(path) {
- const match = path.match(/\/outfit\/(.*)(\?code=.*)/);
- if (match) {
- if (match[1]) {
- ReactGA.ga('set', 'contentGroup1', match[1]);
- }
- if (match[2]) {
- ReactGA.ga('set', 'contentGroup2', match[2]);
- }
- }
- ReactGA.pageview(path);
const _paq = window._paq || [];
_paq.push(['trackPageView']);
}
diff --git a/src/app/components/AvailableModulesMenu.jsx b/src/app/components/AvailableModulesMenu.jsx
index b3fda06f..94cd0e23 100644
--- a/src/app/components/AvailableModulesMenu.jsx
+++ b/src/app/components/AvailableModulesMenu.jsx
@@ -126,7 +126,7 @@ export default class AvailableModulesMenu extends TranslatedComponent {
onSelect: PropTypes.func.isRequired,
diffDetails: PropTypes.func,
m: PropTypes.object,
- shipMass: PropTypes.number,
+ ship: PropTypes.object.isRequired,
warning: PropTypes.func,
firstSlotId: PropTypes.string,
lastSlotId: PropTypes.string,
@@ -134,10 +134,6 @@ export default class AvailableModulesMenu extends TranslatedComponent {
slotDiv: PropTypes.object
};
- static defaultProps = {
- shipMass: 0
- };
-
/**
* Constructor
* @param {Object} props React Component properties
@@ -159,15 +155,15 @@ export default class AvailableModulesMenu extends TranslatedComponent {
*/
_initState(props, context) {
let translate = context.language.translate;
- let { m, warning, shipMass, onSelect, modules, firstSlotId, lastSlotId } = props;
+ let { m, warning, onSelect, modules, ship } = props;
let list, currentGroup;
let buildGroup = this._buildGroup.bind(
this,
+ ship,
translate,
m,
warning,
- shipMass - (m && m.mass ? m.mass : 0),
(m, event) => {
this._hideDiff(event);
onSelect(m);
@@ -255,18 +251,16 @@ export default class AvailableModulesMenu extends TranslatedComponent {
/**
* Generate React Components for Module Group
+ * @param {Ship} ship Ship the selection is for
* @param {Function} translate Translate function
* @param {Object} mountedModule Mounted Module
* @param {Function} warningFunc Warning function
- * @param {number} mass Mass
* @param {function} onSelect Select/Mount callback
* @param {string} grp Group name
* @param {Array} modules Available modules
- * @param {string} firstSlotId id of first slot item
- * @param {string} lastSlotId id of last slot item
* @return {React.Component} Available Module Group contents
*/
- _buildGroup(translate, mountedModule, warningFunc, mass, onSelect, grp, modules, firstSlotId, lastSlotId) {
+ _buildGroup(ship, translate, mountedModule, warningFunc, onSelect, grp, modules) {
let prevClass = null, prevRating = null, prevName;
let elems = [];
@@ -287,10 +281,11 @@ export default class AvailableModulesMenu extends TranslatedComponent {
prevName = m.name;
if (ModuleUtils.isShieldGenerator(m.grp)) {
// Shield generators care about maximum hull mass
- disabled = mass > m.maxmass;
- } else if (m.maxmass) {
- // Thrusters care about total mass
- disabled = mass + m.mass > m.maxmass;
+ disabled = ship.hullMass > m.maxmass;
+ // If the mounted module is experimental as well, we can replace it so
+ // the maximum does not apply
+ } else if (m.experimental && (!mountedModule || !mountedModule.experimental)) {
+ disabled = 4 <= ship.hardpoints.filter(o => o.m && o.m.experimental).length;
}
let active = mountedModule && mountedModule.id === m.id;
let classes = cn(m.name ? 'lc' : 'c', {
diff --git a/src/app/components/HardpointSlot.jsx b/src/app/components/HardpointSlot.jsx
index 856b01a8..1833d7d4 100644
--- a/src/app/components/HardpointSlot.jsx
+++ b/src/app/components/HardpointSlot.jsx
@@ -104,10 +104,10 @@ export default class HardpointSlot extends Slot {
onMouseOut={tooltip.bind(null, null)}>{translate('shotdmg')}: {formats.round1(m.getDamage())} : null}
{m.getEps() ?
{translate('EPS')}: {formats.round1(m.getEps())}{u.MW} {m.getClip() ?
- ({formats.round1((m.getClip() * m.getEps() / m.getRoF()) / ((m.getClip() / m.getRoF()) + m.getReload()))}{u.MW}) : null}
: null}
+ ({formats.round1(m.getEps() / m.getDps() * m.getSDps())}{u.MW}) : null} : null}
{m.getHps() ? {translate('HPS')}: {formats.round1(m.getHps())} {m.getClip() ?
- ({formats.round1((m.getClip() * m.getHps() / m.getRoF()) / ((m.getClip() / m.getRoF()) + m.getReload()))}) : null}
: null}
+ ({formats.round1(m.getHps() / m.getDps() * m.getSDps())}) : null} : null}
{m.getDps() && m.getEps() ? {translate('DPE')}: {formats.f1(m.getDps() / m.getEps())}
: null}
{m.getRoF() ?
this.sectionRefArr['nl-F'] = smRef}>{translate('nl')}
-
{translate('ggc')}
-
- - this.sectionRefArr['ggc-F'] = smRef}>{translate('ggc')}
-
{translate('rfl')}
- this.sectionRefArr['rfl-F'] = smRef}>
diff --git a/src/app/components/Modification.jsx b/src/app/components/Modification.jsx
index b5abd6f7..28421a86 100644
--- a/src/app/components/Modification.jsx
+++ b/src/app/components/Modification.jsx
@@ -3,7 +3,8 @@ import PropTypes from 'prop-types';
import TranslatedComponent from './TranslatedComponent';
import cn from 'classnames';
import NumberEditor from 'react-number-editor';
-import { isValueBeneficial } from '../utils/BlueprintFunctions';
+import { isChangeValueBeneficial } from '../utils/BlueprintFunctions';
+import { Modifications } from 'coriolis-data/dist';
/**
* Modification
@@ -79,6 +80,7 @@ export default class Modification extends TranslatedComponent {
let { translate, formats, units } = this.context.language;
let { m, name } = this.props;
let modValue = m.getChange(name);
+ let isOverwrite = Modifications.modifications[name].method === 'overwrite';
if (name === 'damagedist') {
// We don't show damage distribution
@@ -117,10 +119,10 @@ export default class Modification extends TranslatedComponent {
- {formats.f2(modValue / 100) || 0}%
+ {formats.f2(modValue / 100) || 0}{isOverwrite ? '' : '%'}
|
diff --git a/src/app/components/ShipSummaryTable.jsx b/src/app/components/ShipSummaryTable.jsx
index 176fc12e..ea6e9f1b 100644
--- a/src/app/components/ShipSummaryTable.jsx
+++ b/src/app/components/ShipSummaryTable.jsx
@@ -50,6 +50,7 @@ export default class ShipSummaryTable extends TranslatedComponent {
const speedTooltip = canThrust ? 'TT_SUMMARY_SPEED' : 'TT_SUMMARY_SPEED_NONFUNCTIONAL';
const canBoost = ship.canBoost(cargo, ship.fuelCapacity);
const boostTooltip = canBoost ? 'TT_SUMMARY_BOOST' : canThrust ? 'TT_SUMMARY_BOOST_NONFUNCTIONAL' : 'TT_SUMMARY_SPEED_NONFUNCTIONAL';
+ const canJump = ship.getSlotStatus(ship.standard[2]) == 3;
const sgMetrics = Calc.shieldMetrics(ship, pips.sys);
const shipBoost = canBoost ? Calc.calcBoost(ship) : 'No Boost';
const restingHeat = Math.sqrt(((ship.standard[0].m.pgen * ship.standard[0].m.eff) / ship.heatCapacity) / 0.2);
@@ -71,7 +72,7 @@ export default class ShipSummaryTable extends TranslatedComponent {
| {translate('speed')} |
{translate('boost')} |
- {translate('jump range')} |
+ {translate('jump range')} |
{translate('shield')} |
{translate('integrity')} |
{translate('DPS')} |
@@ -89,11 +90,11 @@ export default class ShipSummaryTable extends TranslatedComponent {
{translate('resting heat (Beta)')} |
- | {translate('max')} |
- {translate('unladen')} |
- {translate('laden')} |
- {translate('total unladen')} |
- {translate('total laden')} |
+ {translate('max')} |
+ {translate('unladen')} |
+ {translate('laden')} |
+ {translate('total unladen')} |
+ {translate('total laden')} |
{translate('hull')} |
{translate('unladen')} |
{translate('laden')} |
@@ -103,11 +104,11 @@ export default class ShipSummaryTable extends TranslatedComponent {
| { canThrust ? {int(ship.calcSpeed(4, ship.fuelCapacity, 0, false))}{u['m/s']} : 0 } |
{ canBoost ? {int(ship.calcSpeed(4, ship.fuelCapacity, 0, true))}{u['m/s']} : 0 } |
- {f2(Calc.jumpRange(ship.unladenMass + ship.standard[2].m.getMaxFuelPerJump(), ship.standard[2].m, ship.standard[2].m.getMaxFuelPerJump(), ship))}{u.LY} |
- {f2(Calc.jumpRange(ship.unladenMass + ship.fuelCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY} |
- {f2(Calc.jumpRange(ship.unladenMass + ship.fuelCapacity + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY} |
- {f2(Calc.totalJumpRange(ship.unladenMass + ship.fuelCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY} |
- {f2(Calc.totalJumpRange(ship.unladenMass + ship.fuelCapacity + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY} |
+ { canJump ? { f2(Calc.jumpRange(ship.unladenMass + ship.standard[2].m.getMaxFuelPerJump(), ship.standard[2].m, ship.standard[2].m.getMaxFuelPerJump(), ship))}{u.LY} : 0 } |
+ { canJump ? {f2(Calc.jumpRange(ship.unladenMass + ship.fuelCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY} : 0 } |
+ { canJump ? {f2(Calc.jumpRange(ship.unladenMass + ship.fuelCapacity + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY} : 0 } |
+ { canJump ? {f2(Calc.totalJumpRange(ship.unladenMass + ship.fuelCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY} : 0 } |
+ { canJump ? {f2(Calc.totalJumpRange(ship.unladenMass + ship.fuelCapacity + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY} : 0 } |
{int(ship.shield)}{u.MJ} |
{int(ship.armour)} |
{f1(ship.totalDps)} |
diff --git a/src/app/components/Slot.jsx b/src/app/components/Slot.jsx
index 8bd080ec..8c04dbab 100644
--- a/src/app/components/Slot.jsx
+++ b/src/app/components/Slot.jsx
@@ -127,8 +127,8 @@ export default class Slot extends TranslatedComponent {
menu = s.m && s.m.experimental).length;
+ // Remove the module on the last slot if we now exceed the number of
+ // experimentals allowed
+ if (m.experimental && 4 < experimentalNum) {
+ this.props.ship.updateStats(originSlot, null, originSlot.m);
+ originSlot.m = null; // Empty the slot
+ originSlot.discountedCost = 0;
+ }
// Copy power info
targetSlot.enabled = originSlot.enabled;
targetSlot.priority = originSlot.priority;
diff --git a/src/app/components/StandardSlot.jsx b/src/app/components/StandardSlot.jsx
index 54ce4733..1e810982 100644
--- a/src/app/components/StandardSlot.jsx
+++ b/src/app/components/StandardSlot.jsx
@@ -109,8 +109,8 @@ export default class StandardSlot extends TranslatedComponent {
menu = 0;
+ } else {
+ return value < 0;
+ }
+}
+
/**
* Get a blueprint with a given name and an optional module
* @param {string} name The name of the blueprint
diff --git a/src/index.ejs b/src/index.ejs
index 37381f38..ddaada89 100644
--- a/src/index.ejs
+++ b/src/index.ejs
@@ -32,15 +32,6 @@
window.CORIOLIS_DATE = '<%- htmlWebpackPlugin.options.date.toISOString().slice(0, 10) %>';
window.BUGSNAG_VERSION = '<%- htmlWebpackPlugin.options.version + '-' + htmlWebpackPlugin.options.date.toISOString() %>';
- <% if (htmlWebpackPlugin.options.uaTracking) { %>
-
-
- <% } %>
-