mirror of
https://github.com/EDCD/coriolis.git
synced 2025-12-09 06:43:24 +00:00
Compare commits
3 Commits
v2.9.13
...
feature/re
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e520208ec6 | ||
|
|
29020e64f2 | ||
|
|
16fe3ba9f5 |
@@ -1,21 +0,0 @@
|
|||||||
root = true
|
|
||||||
|
|
||||||
|
|
||||||
[*]
|
|
||||||
|
|
||||||
# change these settings to your own preference
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
||||||
|
|
||||||
# we recommend you to keep these unchanged
|
|
||||||
end_of_line = lf
|
|
||||||
charset = utf-8
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
insert_final_newline = true
|
|
||||||
|
|
||||||
[*.md]
|
|
||||||
trim_trailing_whitespace = false
|
|
||||||
|
|
||||||
[{package,bower}.json]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
||||||
1
devServer.js
Executable file → Normal file
1
devServer.js
Executable file → Normal file
@@ -5,7 +5,6 @@ var config = require('./webpack.config.dev');
|
|||||||
new WebpackDevServer(webpack(config), {
|
new WebpackDevServer(webpack(config), {
|
||||||
publicPath: config.output.publicPath,
|
publicPath: config.output.publicPath,
|
||||||
hot: true,
|
hot: true,
|
||||||
disableHostCheck: true,
|
|
||||||
headers: { "Access-Control-Allow-Origin": "*" },
|
headers: { "Access-Control-Allow-Origin": "*" },
|
||||||
historyApiFallback: {
|
historyApiFallback: {
|
||||||
rewrites: [
|
rewrites: [
|
||||||
|
|||||||
5175
package-lock.json
generated
5175
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
10
package.json
10
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "coriolis_shipyard",
|
"name": "coriolis_shipyard",
|
||||||
"version": "2.9.13",
|
"version": "2.5.1",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/EDCD/coriolis"
|
"url": "https://github.com/EDCD/coriolis"
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
"test": "jest",
|
"test": "jest",
|
||||||
"prod-serve": "nginx -p $(pwd) -c nginx.conf",
|
"prod-serve": "nginx -p $(pwd) -c nginx.conf",
|
||||||
"prod-stop": "kill -QUIT $(cat nginx.pid)",
|
"prod-stop": "kill -QUIT $(cat nginx.pid)",
|
||||||
"build": "npm run clean && cross-env NODE_ENV=production webpack -p --config webpack.config.prod.js",
|
"build": "npm run clean && NODE_ENV=production webpack -p --config webpack.config.prod.js",
|
||||||
"rsync": "rsync -ae \"ssh -i $CORIOLIS_PEM\" --delete build/ $CORIOLIS_USER@$CORIOLIS_HOST:~/wwws",
|
"rsync": "rsync -ae \"ssh -i $CORIOLIS_PEM\" --delete build/ $CORIOLIS_USER@$CORIOLIS_HOST:~/wwws",
|
||||||
"deploy": "npm run lint && npm test && npm run build && npm run rsync"
|
"deploy": "npm run lint && npm test && npm run build && npm run rsync"
|
||||||
},
|
},
|
||||||
@@ -66,7 +66,6 @@
|
|||||||
"babel-preset-stage-0": "*",
|
"babel-preset-stage-0": "*",
|
||||||
"create-react-class": "^15.6.2",
|
"create-react-class": "^15.6.2",
|
||||||
"css-loader": "^0.28.0",
|
"css-loader": "^0.28.0",
|
||||||
"cross-env": "^5.1.4",
|
|
||||||
"d3-selection": "1",
|
"d3-selection": "1",
|
||||||
"eslint": "3.19.0",
|
"eslint": "3.19.0",
|
||||||
"eslint-plugin-react": "^6.10.3",
|
"eslint-plugin-react": "^6.10.3",
|
||||||
@@ -88,14 +87,13 @@
|
|||||||
"rollup": "0.41",
|
"rollup": "0.41",
|
||||||
"rollup-plugin-node-resolve": "3",
|
"rollup-plugin-node-resolve": "3",
|
||||||
"style-loader": "^0.16.1",
|
"style-loader": "^0.16.1",
|
||||||
"uglify-js": "^2.4.11",
|
|
||||||
"url-loader": "^0.5.8",
|
"url-loader": "^0.5.8",
|
||||||
"webpack": "^2.4.1",
|
"webpack": "^2.4.1",
|
||||||
"webpack-dev-server": "^2.4.4",
|
"webpack-dev-server": "^2.4.4",
|
||||||
"webpack-notifier": "^1.6.0",
|
"uglify-js": "^2.4.11"
|
||||||
"webpack-bugsnag-plugins": "^1.1.1"
|
|
||||||
},
|
},
|
||||||
"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",
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ import ModalHelp from './components/ModalHelp';
|
|||||||
import ModalImport from './components/ModalImport';
|
import ModalImport from './components/ModalImport';
|
||||||
import ModalPermalink from './components/ModalPermalink';
|
import ModalPermalink from './components/ModalPermalink';
|
||||||
import * as CompanionApiUtils from './utils/CompanionApiUtils';
|
import * as CompanionApiUtils from './utils/CompanionApiUtils';
|
||||||
import * as JournalUtils from './utils/JournalUtils';
|
|
||||||
|
|
||||||
import AboutPage from './pages/AboutPage';
|
import AboutPage from './pages/AboutPage';
|
||||||
import NotFoundPage from './pages/NotFoundPage';
|
import NotFoundPage from './pages/NotFoundPage';
|
||||||
@@ -93,14 +92,7 @@ export default class Coriolis extends React.Component {
|
|||||||
// Need to decode and gunzip the data, then build the ship
|
// Need to decode and gunzip the data, then build the ship
|
||||||
const data = zlib.inflate(new Buffer(r.params.data, 'base64'), { to: 'string' });
|
const data = zlib.inflate(new Buffer(r.params.data, 'base64'), { to: 'string' });
|
||||||
const json = JSON.parse(data);
|
const json = JSON.parse(data);
|
||||||
console.log('Ship import data: ');
|
const ship = CompanionApiUtils.shipFromJson(json);
|
||||||
console.log(json);
|
|
||||||
let ship;
|
|
||||||
if (json && json.modules) {
|
|
||||||
ship = CompanionApiUtils.shipFromJson(json);
|
|
||||||
} else if (json && json.Modules) {
|
|
||||||
ship = JournalUtils.shipFromLoadoutJSON(json);
|
|
||||||
}
|
|
||||||
r.params.ship = ship.id;
|
r.params.ship = ship.id;
|
||||||
r.params.code = ship.toString();
|
r.params.code = ship.toString();
|
||||||
this._setPage(OutfittingPage, r);
|
this._setPage(OutfittingPage, r);
|
||||||
@@ -134,9 +126,9 @@ export default class Coriolis extends React.Component {
|
|||||||
console && console.error && console.error(arguments); // eslint-disable-line no-console
|
console && console.error && console.error(arguments); // eslint-disable-line no-console
|
||||||
if (errObj) {
|
if (errObj) {
|
||||||
if (errObj instanceof Error) {
|
if (errObj instanceof Error) {
|
||||||
bugsnagClient.notify(errObj) // eslint-disable-line
|
Bugsnag.notifyException(errObj) // eslint-disable-line
|
||||||
} else if (errObj instanceof String) {
|
} else if (errObj instanceof String) {
|
||||||
bugsnagClient.notify(msg, errObj) // eslint-disable-line
|
Bugsnag.notify(msg, errObj) // eslint-disable-line
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.setState({
|
this.setState({
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ const GRPCAT = {
|
|||||||
'rg': 'projectiles',
|
'rg': 'projectiles',
|
||||||
'mr': 'ordnance',
|
'mr': 'ordnance',
|
||||||
'axmr': 'experimental',
|
'axmr': 'experimental',
|
||||||
'rcpl': 'experimental',
|
|
||||||
'tp': 'ordnance',
|
'tp': 'ordnance',
|
||||||
'nl': 'ordnance',
|
'nl': 'ordnance',
|
||||||
'sc': 'scanners',
|
'sc': 'scanners',
|
||||||
@@ -57,11 +56,7 @@ const GRPCAT = {
|
|||||||
'ch': 'defence',
|
'ch': 'defence',
|
||||||
'po': 'defence',
|
'po': 'defence',
|
||||||
'ec': 'defence',
|
'ec': 'defence',
|
||||||
'sfn': 'defence',
|
'sfn': 'defence'
|
||||||
// Standard
|
|
||||||
'gpp': 'guardian',
|
|
||||||
'gpc': 'guardian',
|
|
||||||
'ggc': 'guardian'
|
|
||||||
};
|
};
|
||||||
// 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 = {
|
||||||
@@ -87,10 +82,7 @@ const CATEGORIES = {
|
|||||||
'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
|
||||||
'experimental': ['axmc', 'axmr', 'rfl', 'xs', 'sfn', 'rcpl'],
|
'experimental': ['axmc', 'axmr', 'rfl', 'xs', 'sfn']
|
||||||
|
|
||||||
// Guardian
|
|
||||||
'guardian': ['gpp', 'gpc', 'ggc']
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -207,8 +199,8 @@ export default class AvailableModulesMenu extends TranslatedComponent {
|
|||||||
/**
|
/**
|
||||||
* Generate React Components for Module Group
|
* Generate React Components for Module Group
|
||||||
* @param {Function} translate Translate function
|
* @param {Function} translate Translate function
|
||||||
* @param {Object} mountedModule Mounted Module
|
* @param {Objecy} mountedModule Mounted Module
|
||||||
* @param {Function} warningFunc Warning function
|
* @param {Funciton} warningFunc Warning function
|
||||||
* @param {number} mass Mass
|
* @param {number} mass Mass
|
||||||
* @param {function} onSelect Select/Mount callback
|
* @param {function} onSelect Select/Mount callback
|
||||||
* @param {string} grp Group name
|
* @param {string} grp Group name
|
||||||
@@ -216,7 +208,7 @@ export default class AvailableModulesMenu extends TranslatedComponent {
|
|||||||
* @return {React.Component} Available Module Group contents
|
* @return {React.Component} Available Module Group contents
|
||||||
*/
|
*/
|
||||||
_buildGroup(translate, mountedModule, warningFunc, mass, onSelect, grp, modules) {
|
_buildGroup(translate, mountedModule, warningFunc, mass, onSelect, grp, modules) {
|
||||||
let prevClass = null, prevRating = null, prevName;
|
let prevClass = null, prevRating = null;
|
||||||
let elems = [];
|
let elems = [];
|
||||||
|
|
||||||
const sortedModules = modules.sort(this._moduleOrder);
|
const sortedModules = modules.sort(this._moduleOrder);
|
||||||
@@ -231,7 +223,6 @@ export default class AvailableModulesMenu extends TranslatedComponent {
|
|||||||
let m = sortedModules[i];
|
let m = sortedModules[i];
|
||||||
let mount = null;
|
let mount = null;
|
||||||
let disabled = false;
|
let disabled = false;
|
||||||
prevName = m.name
|
|
||||||
if (ModuleUtils.isShieldGenerator(m.grp)) {
|
if (ModuleUtils.isShieldGenerator(m.grp)) {
|
||||||
// Shield generators care about maximum hull mass
|
// Shield generators care about maximum hull mass
|
||||||
disabled = mass > m.maxmass;
|
disabled = mass > m.maxmass;
|
||||||
@@ -267,10 +258,7 @@ export default class AvailableModulesMenu extends TranslatedComponent {
|
|||||||
case 'G': mount = <MountGimballed className={'lg'}/>; break;
|
case 'G': mount = <MountGimballed className={'lg'}/>; break;
|
||||||
case 'T': mount = <MountTurret className={'lg'}/>; break;
|
case 'T': mount = <MountTurret className={'lg'}/>; break;
|
||||||
}
|
}
|
||||||
if (m.name && m.name === prevName) {
|
|
||||||
// elems.push(<br key={'b' + m.grp + i} />);
|
|
||||||
itemsOnThisRow = 0;
|
|
||||||
}
|
|
||||||
if (itemsOnThisRow == 6 || i > 0 && sortedModules.length > 3 && itemsPerClass > 2 && m.class != prevClass && (m.rating != prevRating || m.mount)) {
|
if (itemsOnThisRow == 6 || i > 0 && sortedModules.length > 3 && itemsPerClass > 2 && m.class != prevClass && (m.rating != prevRating || m.mount)) {
|
||||||
elems.push(<br key={'b' + m.grp + i} />);
|
elems.push(<br key={'b' + m.grp + i} />);
|
||||||
itemsOnThisRow = 0;
|
itemsOnThisRow = 0;
|
||||||
@@ -285,7 +273,6 @@ export default class AvailableModulesMenu extends TranslatedComponent {
|
|||||||
itemsOnThisRow++;
|
itemsOnThisRow++;
|
||||||
prevClass = m.class;
|
prevClass = m.class;
|
||||||
prevRating = m.rating;
|
prevRating = m.rating;
|
||||||
prevName = m.name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return <ul key={'modules' + grp} >{elems}</ul>;
|
return <ul key={'modules' + grp} >{elems}</ul>;
|
||||||
|
|||||||
@@ -33,9 +33,6 @@ export default class InternalSlot extends Slot {
|
|||||||
let modTT = translate('modified');
|
let modTT = translate('modified');
|
||||||
if (m && m.blueprint && m.blueprint.name) {
|
if (m && m.blueprint && m.blueprint.name) {
|
||||||
modTT = translate(m.blueprint.name) + ' ' + translate('grade') + ' ' + m.blueprint.grade;
|
modTT = translate(m.blueprint.name) + ' ' + translate('grade') + ' ' + m.blueprint.grade;
|
||||||
if (m.blueprint.special && m.blueprint.special.id >= 0) {
|
|
||||||
modTT += ', ' + translate(m.blueprint.special.name);
|
|
||||||
}
|
|
||||||
modTT = (
|
modTT = (
|
||||||
<div>
|
<div>
|
||||||
<div>{modTT}</div>
|
<div>{modTT}</div>
|
||||||
@@ -70,7 +67,6 @@ export default class InternalSlot extends Slot {
|
|||||||
{ m.getRange() ? <div className={'l'}>{translate('range')} {formats.f2(m.getRange())}{u.km}</div> : null }
|
{ m.getRange() ? <div className={'l'}>{translate('range')} {formats.f2(m.getRange())}{u.km}</div> : null }
|
||||||
{ m.getRangeT() ? <div className={'l'}>{translate('ranget')} {formats.f1(m.getRangeT())}{u.s}</div> : null }
|
{ m.getRangeT() ? <div className={'l'}>{translate('ranget')} {formats.f1(m.getRangeT())}{u.s}</div> : null }
|
||||||
{ m.getTime() ? <div className={'l'}>{translate('time')}: {formats.time(m.getTime())}</div> : null }
|
{ m.getTime() ? <div className={'l'}>{translate('time')}: {formats.time(m.getTime())}</div> : null }
|
||||||
{ m.getHackTime() ? <div className={'l'}>{translate('hacktime')}: {formats.time(m.getHackTime())}</div> : null }
|
|
||||||
{ m.maximum ? <div className={'l'}>{translate('max')}: {(m.maximum)}</div> : null }
|
{ m.maximum ? <div className={'l'}>{translate('max')}: {(m.maximum)}</div> : null }
|
||||||
{ m.rangeLS ? <div className={'l'}>{translate('range')}: {m.rangeLS}{u.Ls}</div> : null }
|
{ m.rangeLS ? <div className={'l'}>{translate('range')}: {m.rangeLS}{u.Ls}</div> : null }
|
||||||
{ m.rangeLS === null ? <div className={'l'}>∞{u.Ls}</div> : null }
|
{ m.rangeLS === null ? <div className={'l'}>∞{u.Ls}</div> : null }
|
||||||
|
|||||||
@@ -6,14 +6,7 @@ import { isEmpty, stopCtxPropagation } from '../utils/UtilityFunctions';
|
|||||||
import cn from 'classnames';
|
import cn from 'classnames';
|
||||||
import { Modifications } from 'coriolis-data/dist';
|
import { Modifications } from 'coriolis-data/dist';
|
||||||
import Modification from './Modification';
|
import Modification from './Modification';
|
||||||
import {
|
import { getBlueprint, blueprintTooltip, setWorst, setBest, setExtreme, setRandom } from '../utils/BlueprintFunctions';
|
||||||
getBlueprint,
|
|
||||||
blueprintTooltip,
|
|
||||||
setPercent,
|
|
||||||
getPercent,
|
|
||||||
setRandom,
|
|
||||||
specialToolTip
|
|
||||||
} from '../utils/BlueprintFunctions'
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Modifications menu
|
* Modifications menu
|
||||||
@@ -37,14 +30,14 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
|
|
||||||
this._toggleBlueprintsMenu = this._toggleBlueprintsMenu.bind(this);
|
this._toggleBlueprintsMenu = this._toggleBlueprintsMenu.bind(this);
|
||||||
this._toggleSpecialsMenu = this._toggleSpecialsMenu.bind(this);
|
this._toggleSpecialsMenu = this._toggleSpecialsMenu.bind(this);
|
||||||
this._rollFifty = this._rollFifty.bind(this);
|
this._rollWorst = this._rollWorst.bind(this);
|
||||||
this._rollRandom = this._rollRandom.bind(this);
|
this._rollRandom = this._rollRandom.bind(this);
|
||||||
this._rollBest = this._rollBest.bind(this);
|
this._rollBest = this._rollBest.bind(this);
|
||||||
this._rollWorst = this._rollWorst.bind(this);
|
this._rollExtreme = this._rollExtreme.bind(this);
|
||||||
this._reset = this._reset.bind(this);
|
this._reset = this._reset.bind(this);
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
blueprintMenuOpened: !(props.m.blueprint && props.m.blueprint.name),
|
blueprintMenuOpened: false,
|
||||||
specialMenuOpened: false
|
specialMenuOpened: false
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -93,33 +86,15 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
const { m } = props;
|
const { m } = props;
|
||||||
const { language, tooltip, termtip } = context;
|
const { language, tooltip, termtip } = context;
|
||||||
const translate = language.translate;
|
const translate = language.translate;
|
||||||
|
|
||||||
const specials = [];
|
const specials = [];
|
||||||
const specialsId = m.missile && Modifications.modules[m.grp]['specials_' + m.missile] ? 'specials_' + m.missile : 'specials';
|
const specialsId = m.missile && Modifications.modules[m.grp]['specials_' + m.missile] ? 'specials_' + m.missile : 'specials';
|
||||||
if (Modifications.modules[m.grp][specialsId] && Modifications.modules[m.grp][specialsId].length > 0) {
|
if (Modifications.modules[m.grp][specialsId] && Modifications.modules[m.grp][specialsId].length > 0) {
|
||||||
const close = this._specialSelected.bind(this, null);
|
const close = this._specialSelected.bind(this, null);
|
||||||
specials.push(<div style={{ cursor: 'pointer', fontWeight: 'bold' }} className={ 'button-inline-menu warning' } key={ 'none' } onClick={ close }>{translate('PHRASE_NO_SPECIAL')}</div>);
|
specials.push(<div style={{ cursor: 'pointer' }} key={ 'none' } onClick={ close }>{translate('PHRASE_NO_SPECIAL')}</div>);
|
||||||
for (const specialName of Modifications.modules[m.grp][specialsId]) {
|
for (const specialName of Modifications.modules[m.grp][specialsId]) {
|
||||||
if (Modifications.specials[specialName].name.search('Legacy') >= 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const classes = cn('button-inline-menu', {
|
|
||||||
active: m.blueprint && m.blueprint.special && m.blueprint.special.edname == specialName
|
|
||||||
});
|
|
||||||
const close = this._specialSelected.bind(this, specialName);
|
const close = this._specialSelected.bind(this, specialName);
|
||||||
if (m.blueprint && m.blueprint.name) {
|
specials.push(<div style={{ cursor: 'pointer' }} key={ specialName } onClick={ close }>{translate(Modifications.specials[specialName].name)}</div>);
|
||||||
let tmp = {};
|
|
||||||
if (m.blueprint.special) {
|
|
||||||
tmp = m.blueprint.special;
|
|
||||||
} else {
|
|
||||||
tmp = undefined;
|
|
||||||
}
|
|
||||||
m.blueprint.special = Modifications.specials[specialName];
|
|
||||||
let specialTt = specialToolTip(translate, m.blueprint.grades[m.blueprint.grade], m.grp, m, specialName);
|
|
||||||
m.blueprint.special = tmp;
|
|
||||||
specials.push(<div style={{ cursor: 'pointer' }} className={classes} key={ specialName } onMouseOver={termtip.bind(null, specialTt)} onMouseOut={tooltip.bind(null, null)} onClick={ close }>{translate(Modifications.specials[specialName].name)}</div>);
|
|
||||||
} else {
|
|
||||||
specials.push(<div style={{ cursor: 'pointer' }} className={classes} key={ specialName } onClick={ close }>{translate(Modifications.specials[specialName].name)}</div>);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return specials;
|
return specials;
|
||||||
@@ -161,9 +136,8 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
const blueprint = getBlueprint(fdname, m);
|
const blueprint = getBlueprint(fdname, m);
|
||||||
blueprint.grade = grade;
|
blueprint.grade = grade;
|
||||||
ship.setModuleBlueprint(m, blueprint);
|
ship.setModuleBlueprint(m, blueprint);
|
||||||
setPercent(ship, m, 100);
|
|
||||||
|
|
||||||
this.setState({ blueprintMenuOpened: false, specialMenuOpened: true });
|
this.setState({ blueprintMenuOpened: false });
|
||||||
this.props.onChange();
|
this.props.onChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,11 +168,11 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provide a '50%' roll within the information we have
|
* Provide a 'worst' roll within the information we have
|
||||||
*/
|
*/
|
||||||
_rollFifty() {
|
_rollWorst() {
|
||||||
const { m, ship } = this.props;
|
const { m, ship } = this.props;
|
||||||
setPercent(ship, m, 50);
|
setWorst(ship, m);
|
||||||
this.props.onChange();
|
this.props.onChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,16 +190,16 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
*/
|
*/
|
||||||
_rollBest() {
|
_rollBest() {
|
||||||
const { m, ship } = this.props;
|
const { m, ship } = this.props;
|
||||||
setPercent(ship, m, 100);
|
setBest(ship, m);
|
||||||
this.props.onChange();
|
this.props.onChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provide a 'worst' roll within the information we have
|
* Provide an 'extreme' roll within the information we have
|
||||||
*/
|
*/
|
||||||
_rollWorst() {
|
_rollExtreme() {
|
||||||
const { m, ship } = this.props;
|
const { m, ship } = this.props;
|
||||||
setPercent(ship, m, 0);
|
setExtreme(ship, m);
|
||||||
this.props.onChange();
|
this.props.onChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,28 +226,24 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
|
|
||||||
const _toggleBlueprintsMenu = this._toggleBlueprintsMenu;
|
const _toggleBlueprintsMenu = this._toggleBlueprintsMenu;
|
||||||
const _toggleSpecialsMenu = this._toggleSpecialsMenu;
|
const _toggleSpecialsMenu = this._toggleSpecialsMenu;
|
||||||
const _rollFull = this._rollBest;
|
const _rollBest = this._rollBest;
|
||||||
|
const _rollExtreme = this._rollExtreme;
|
||||||
const _rollWorst = this._rollWorst;
|
const _rollWorst = this._rollWorst;
|
||||||
const _rollFifty = this._rollFifty;
|
|
||||||
const _rollRandom = this._rollRandom;
|
const _rollRandom = this._rollRandom;
|
||||||
const _reset = this._reset;
|
const _reset = this._reset;
|
||||||
|
|
||||||
let blueprintLabel;
|
let blueprintLabel;
|
||||||
let haveBlueprint = false;
|
let haveBlueprint = false;
|
||||||
let blueprintTt;
|
let blueprintTt;
|
||||||
let blueprintCv;
|
if (m.blueprint && m.blueprint.name) {
|
||||||
if (m.blueprint && m.blueprint.name && Modifications.modules[m.grp].blueprints[m.blueprint.fdname].grades[m.blueprint.grade]) {
|
|
||||||
blueprintLabel = translate(m.blueprint.name) + ' ' + translate('grade') + ' ' + m.blueprint.grade;
|
blueprintLabel = translate(m.blueprint.name) + ' ' + translate('grade') + ' ' + m.blueprint.grade;
|
||||||
haveBlueprint = true;
|
haveBlueprint = true;
|
||||||
blueprintTt = blueprintTooltip(translate, m.blueprint.grades[m.blueprint.grade], Modifications.modules[m.grp].blueprints[m.blueprint.fdname].grades[m.blueprint.grade].engineers, m.grp);
|
blueprintTt = blueprintTooltip(translate, m.blueprint.grades[m.blueprint.grade], Modifications.modules[m.grp].blueprints[m.blueprint.fdname].grades[m.blueprint.grade].engineers, m.grp);
|
||||||
blueprintCv = getPercent(m);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let specialLabel;
|
let specialLabel;
|
||||||
let specialTt;
|
|
||||||
if (m.blueprint && m.blueprint.special) {
|
if (m.blueprint && m.blueprint.special) {
|
||||||
specialLabel = m.blueprint.special.name;
|
specialLabel = m.blueprint.special.name;
|
||||||
specialTt = specialToolTip(translate, m.blueprint.grades[m.blueprint.grade], m.grp, m, m.blueprint.special.edname);
|
|
||||||
} else {
|
} else {
|
||||||
specialLabel = translate('PHRASE_SELECT_SPECIAL');
|
specialLabel = translate('PHRASE_SELECT_SPECIAL');
|
||||||
}
|
}
|
||||||
@@ -284,8 +254,8 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
const showSpecial = haveBlueprint && specials.length && !blueprintMenuOpened;
|
const showSpecial = haveBlueprint && specials.length && !blueprintMenuOpened;
|
||||||
const showSpecialsMenu = specialMenuOpened;
|
const showSpecialsMenu = specialMenuOpened;
|
||||||
const showRolls = haveBlueprint && !blueprintMenuOpened && !specialMenuOpened;
|
const showRolls = haveBlueprint && !blueprintMenuOpened && !specialMenuOpened;
|
||||||
const showReset = !blueprintMenuOpened && !specialMenuOpened && haveBlueprint;
|
const showReset = !blueprintMenuOpened && !specialMenuOpened;
|
||||||
const showMods = !blueprintMenuOpened && !specialMenuOpened && haveBlueprint;
|
const showMods = !blueprintMenuOpened && !specialMenuOpened;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
@@ -293,28 +263,29 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
onClick={(e) => e.stopPropagation() }
|
onClick={(e) => e.stopPropagation() }
|
||||||
onContextMenu={stopCtxPropagation}
|
onContextMenu={stopCtxPropagation}
|
||||||
>
|
>
|
||||||
{ showBlueprintsMenu | showSpecialsMenu ? '' : haveBlueprint ?
|
{ showBlueprintsMenu ? '' : haveBlueprint ?
|
||||||
<div className={ cn('section-menu button-inline-menu', { selected: blueprintMenuOpened })} style={{ cursor: 'pointer' }} onMouseOver={termtip.bind(null, blueprintTt)} onMouseOut={tooltip.bind(null, null)} onClick={_toggleBlueprintsMenu}>{blueprintLabel}</div> :
|
<div className={ cn('section-menu', { selected: blueprintMenuOpened })} style={{ cursor: 'pointer' }} onMouseOver={termtip.bind(null, blueprintTt)} onMouseOut={tooltip.bind(null, null)} onClick={_toggleBlueprintsMenu}>{blueprintLabel}</div> :
|
||||||
<div className={ cn('section-menu button-inline-menu', { selected: blueprintMenuOpened })} style={{ cursor: 'pointer' }} onClick={_toggleBlueprintsMenu}>{translate('PHRASE_SELECT_BLUEPRINT')}</div> }
|
<div className={ cn('section-menu', { selected: blueprintMenuOpened })} style={{ cursor: 'pointer' }} onClick={_toggleBlueprintsMenu}>{translate('PHRASE_SELECT_BLUEPRINT')}</div> }
|
||||||
{ showBlueprintsMenu ? this._renderBlueprints(this.props, this.context) : null }
|
{ showBlueprintsMenu ? this._renderBlueprints(this.props, this.context) : null }
|
||||||
{ showSpecial & !showSpecialsMenu ? <div className={ cn('section-menu button-inline-menu', { selected: specialMenuOpened })} style={{ cursor: 'pointer' }} onMouseOver={specialTt ? termtip.bind(null, specialTt) : null} onMouseOut={specialTt ? tooltip.bind(null, null) : null} onClick={_toggleSpecialsMenu}>{specialLabel}</div> : null }
|
{ showSpecial ? <div className={ cn('section-menu', { selected: specialMenuOpened })} style={{ cursor: 'pointer' }} onClick={_toggleSpecialsMenu}>{specialLabel}</div> : null }
|
||||||
{ showSpecialsMenu ? specials : null }
|
{ showSpecialsMenu ? specials : null }
|
||||||
{ showReset ? <div className={'section-menu button-inline-menu warning'} style={{ cursor: 'pointer' }} onClick={_reset} onMouseOver={termtip.bind(null, 'PHRASE_BLUEPRINT_RESET')} onMouseOut={tooltip.bind(null, null)}> { translate('reset') } </div> : null }
|
{ showRolls || showReset ?
|
||||||
{ showRolls ?
|
|
||||||
|
|
||||||
<table style={{ width: '100%', backgroundColor: 'transparent' }}>
|
<table style={{ width: '100%', backgroundColor: 'transparent' }}>
|
||||||
<tbody>
|
<tbody>
|
||||||
{ showRolls ?
|
{ showRolls ?
|
||||||
<tr>
|
<tr>
|
||||||
<td className={ cn('section-menu button-inline-menu', {active: false})}> { translate('roll') }: </td>
|
<td> { translate('roll') }: </td>
|
||||||
<td className={ cn('section-menu button-inline-menu', { active: blueprintCv === 0 })} style={{ cursor: 'pointer' }} onClick={_rollWorst} onMouseOver={termtip.bind(null, 'PHRASE_BLUEPRINT_WORST')} onMouseOut={tooltip.bind(null, null)}> { translate('0%') } </td>
|
<td style={{ cursor: 'pointer' }} onClick={_rollWorst} onMouseOver={termtip.bind(null, 'PHRASE_BLUEPRINT_WORST')} onMouseOut={tooltip.bind(null, null)}> { translate('worst') } </td>
|
||||||
<td className={ cn('section-menu button-inline-menu', { active: blueprintCv === 50 })} style={{ cursor: 'pointer' }} onClick={_rollFifty} onMouseOver={termtip.bind(null, 'PHRASE_BLUEPRINT_FIFTY')} onMouseOut={tooltip.bind(null, null)}> { translate('50%') } </td>
|
<td style={{ cursor: 'pointer' }} onClick={_rollBest}onMouseOver={termtip.bind(null, 'PHRASE_BLUEPRINT_BEST')} onMouseOut={tooltip.bind(null, null)}> { translate('best') } </td>
|
||||||
<td className={ cn('section-menu button-inline-menu', { active: blueprintCv === 100 })} style={{ cursor: 'pointer' }} onClick={_rollFull} onMouseOver={termtip.bind(null, 'PHRASE_BLUEPRINT_BEST')} onMouseOut={tooltip.bind(null, null)}> { translate('100%') } </td>
|
<td style={{ cursor: 'pointer' }} onClick={_rollExtreme}onMouseOver={termtip.bind(null, 'PHRASE_BLUEPRINT_EXTREME')} onMouseOut={tooltip.bind(null, null)}> { translate('extreme') } </td>
|
||||||
<td className={ cn('section-menu button-inline-menu', { active: blueprintCv === null || blueprintCv % 50 != 0 })} style={{ cursor: 'pointer' }} onClick={_rollRandom} onMouseOver={termtip.bind(null, 'PHRASE_BLUEPRINT_RANDOM')} onMouseOut={tooltip.bind(null, null)}> { translate('random') } </td>
|
<td style={{ cursor: 'pointer' }} onClick={_rollRandom} onMouseOver={termtip.bind(null, 'PHRASE_BLUEPRINT_RANDOM')} onMouseOut={tooltip.bind(null, null)}> { translate('random') } </td>
|
||||||
|
</tr> : null }
|
||||||
|
{ showReset ?
|
||||||
|
<tr>
|
||||||
|
<td colSpan={'5'} style={{ cursor: 'pointer' }} onClick={_reset}onMouseOver={termtip.bind(null, 'PHRASE_BLUEPRINT_RESET')} onMouseOut={tooltip.bind(null, null)}> { translate('reset') } </td>
|
||||||
</tr> : null }
|
</tr> : null }
|
||||||
</tbody>
|
</tbody>
|
||||||
</table> : null }
|
</table> : null }
|
||||||
{ showMods ? <hr /> : null }
|
|
||||||
{ showMods ?
|
{ showMods ?
|
||||||
<span onMouseOver={termtip.bind(null, 'HELP_MODIFICATIONS_MENU')} onMouseOut={tooltip.bind(null, null)} >
|
<span onMouseOver={termtip.bind(null, 'HELP_MODIFICATIONS_MENU')} onMouseOut={tooltip.bind(null, null)} >
|
||||||
{ this._renderModifications(this.props) }
|
{ this._renderModifications(this.props) }
|
||||||
|
|||||||
@@ -15,30 +15,22 @@ export default class ShipSummaryTable extends TranslatedComponent {
|
|||||||
cargo: PropTypes.number.isRequired,
|
cargo: PropTypes.number.isRequired,
|
||||||
fuel: PropTypes.number.isRequired,
|
fuel: PropTypes.number.isRequired,
|
||||||
marker: PropTypes.string.isRequired,
|
marker: PropTypes.string.isRequired,
|
||||||
pips: PropTypes.object.isRequired
|
|
||||||
};
|
};
|
||||||
|
|
||||||
constructor(props) {
|
|
||||||
super(props)
|
|
||||||
this.didContextChange = this.didContextChange.bind(this);
|
|
||||||
this.state = {
|
|
||||||
shieldColour: 'blue'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Render the table
|
* Render the table
|
||||||
* @return {React.Component} Summary table
|
* @return {React.Component} Summary table
|
||||||
*/
|
*/
|
||||||
render() {
|
render() {
|
||||||
const { ship, cargo, fuel, pips } = this.props;
|
const { ship, cargo, fuel } = this.props;
|
||||||
let { language, tooltip, termtip } = this.context;
|
let { language, tooltip, termtip } = this.context;
|
||||||
let translate = language.translate;
|
let translate = language.translate;
|
||||||
let u = language.units;
|
let u = language.units;
|
||||||
let formats = language.formats;
|
let formats = language.formats;
|
||||||
let { time, int, round, f1, f2 } = formats;
|
let { time, int, round, f1, f2 } = formats;
|
||||||
let hide = tooltip.bind(null, null);
|
let hide = tooltip.bind(null, null);
|
||||||
const shieldGenerator = ship.findInternalByGroup('sg') || ship.findInternalByGroup('psg');
|
|
||||||
|
const shieldGenerator = ship.findInternalByGroup('sg');
|
||||||
const sgClassNames = cn({ warning: shieldGenerator && !ship.shield, muted: !shieldGenerator });
|
const sgClassNames = cn({ warning: shieldGenerator && !ship.shield, muted: !shieldGenerator });
|
||||||
const sgTooltip = shieldGenerator ? 'TT_SUMMARY_SHIELDS' : 'TT_SUMMARY_SHIELDS_NONFUNCTIONAL';
|
const sgTooltip = shieldGenerator ? 'TT_SUMMARY_SHIELDS' : 'TT_SUMMARY_SHIELDS_NONFUNCTIONAL';
|
||||||
const timeToDrain = Calc.timeToDrainWep(ship, 4);
|
const timeToDrain = Calc.timeToDrainWep(ship, 4);
|
||||||
@@ -46,19 +38,9 @@ export default class ShipSummaryTable extends TranslatedComponent {
|
|||||||
const speedTooltip = canThrust ? 'TT_SUMMARY_SPEED' : 'TT_SUMMARY_SPEED_NONFUNCTIONAL';
|
const speedTooltip = canThrust ? 'TT_SUMMARY_SPEED' : 'TT_SUMMARY_SPEED_NONFUNCTIONAL';
|
||||||
const canBoost = ship.canBoost(cargo, ship.fuelCapacity);
|
const canBoost = ship.canBoost(cargo, ship.fuelCapacity);
|
||||||
const boostTooltip = canBoost ? 'TT_SUMMARY_BOOST' : canThrust ? 'TT_SUMMARY_BOOST_NONFUNCTIONAL' : 'TT_SUMMARY_SPEED_NONFUNCTIONAL';
|
const boostTooltip = canBoost ? 'TT_SUMMARY_BOOST' : canThrust ? 'TT_SUMMARY_BOOST_NONFUNCTIONAL' : 'TT_SUMMARY_SPEED_NONFUNCTIONAL';
|
||||||
const sgMetrics = Calc.shieldMetrics(ship, pips.sys || 2);
|
|
||||||
const armourMetrics = Calc.armourMetrics(ship);
|
|
||||||
let shieldColour = 'blue';
|
|
||||||
if (shieldGenerator && shieldGenerator.m.grp === 'psg') {
|
|
||||||
shieldColour = 'green';
|
|
||||||
} else if (shieldGenerator && shieldGenerator.m.grp === 'bsg') {
|
|
||||||
shieldColour = 'purple';
|
|
||||||
}
|
|
||||||
this.state = {
|
|
||||||
shieldColour
|
|
||||||
}
|
|
||||||
return <div id='summary'>
|
return <div id='summary'>
|
||||||
<table className={'summaryTable'}>
|
<table id='summaryTable'>
|
||||||
<thead>
|
<thead>
|
||||||
<tr className='main'>
|
<tr className='main'>
|
||||||
<th rowSpan={2} className={ cn({ 'bg-warning-disabled': !canThrust }) }>{translate('speed')}</th>
|
<th rowSpan={2} className={ cn({ 'bg-warning-disabled': !canThrust }) }>{translate('speed')}</th>
|
||||||
@@ -71,7 +53,6 @@ export default class ShipSummaryTable extends TranslatedComponent {
|
|||||||
<th rowSpan={2}>{translate('TTD')}</th>
|
<th rowSpan={2}>{translate('TTD')}</th>
|
||||||
{/* <th onMouseEnter={termtip.bind(null, 'heat per second')} onMouseLeave={hide} rowSpan={2}>{translate('HPS')}</th> */}
|
{/* <th onMouseEnter={termtip.bind(null, 'heat per second')} onMouseLeave={hide} rowSpan={2}>{translate('HPS')}</th> */}
|
||||||
<th rowSpan={2}>{translate('cargo')}</th>
|
<th rowSpan={2}>{translate('cargo')}</th>
|
||||||
<th rowSpan={2}>{translate('pax')}</th>
|
|
||||||
<th rowSpan={2}>{translate('fuel')}</th>
|
<th rowSpan={2}>{translate('fuel')}</th>
|
||||||
<th colSpan={3}>{translate('mass')}</th>
|
<th colSpan={3}>{translate('mass')}</th>
|
||||||
<th onMouseEnter={termtip.bind(null, 'hull hardness', { cap: 0 })} onMouseLeave={hide} rowSpan={2}>{translate('hrd')}</th>
|
<th onMouseEnter={termtip.bind(null, 'hull hardness', { cap: 0 })} onMouseLeave={hide} rowSpan={2}>{translate('hrd')}</th>
|
||||||
@@ -105,7 +86,6 @@ export default class ShipSummaryTable extends TranslatedComponent {
|
|||||||
<td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_TTD', { cap: 0 })} onMouseLeave={hide}>{timeToDrain === Infinity ? '∞' : time(timeToDrain)}</td>
|
<td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_TTD', { cap: 0 })} onMouseLeave={hide}>{timeToDrain === Infinity ? '∞' : time(timeToDrain)}</td>
|
||||||
{/* <td>{f1(ship.totalHps)}</td> */}
|
{/* <td>{f1(ship.totalHps)}</td> */}
|
||||||
<td>{round(ship.cargoCapacity)}{u.T}</td>
|
<td>{round(ship.cargoCapacity)}{u.T}</td>
|
||||||
<td>{ship.passengerCapacity}</td>
|
|
||||||
<td>{round(ship.fuelCapacity)}{u.T}</td>
|
<td>{round(ship.fuelCapacity)}{u.T}</td>
|
||||||
<td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_HULL_MASS', { cap: 0 })} onMouseLeave={hide}>{ship.hullMass}{u.T}</td>
|
<td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_HULL_MASS', { cap: 0 })} onMouseLeave={hide}>{ship.hullMass}{u.T}</td>
|
||||||
<td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_UNLADEN_MASS', { cap: 0 })} onMouseLeave={hide}>{int(ship.unladenMass)}{u.T}</td>
|
<td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_UNLADEN_MASS', { cap: 0 })} onMouseLeave={hide}>{int(ship.unladenMass)}{u.T}</td>
|
||||||
@@ -116,66 +96,6 @@ export default class ShipSummaryTable extends TranslatedComponent {
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<table className={'summaryTable'}>
|
|
||||||
<thead className={this.state.shieldColour}>
|
|
||||||
<tr>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'shield ', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('explres')}</th>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'shield ', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('kinres')}</th>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'shield ', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('thermres')}</th>
|
|
||||||
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'shield ', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('absolute') + ' ' + translate('HP')}</th>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'shield ', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('explosive') + ' ' + translate('HP')}</th>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'shield ', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('kinetic') + ' ' + translate('HP')}</th>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'shield ', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('thermal') + ' ' + translate('HP')}</th>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'PHRASE_SG_RECOVER', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('recovery')}</th>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'PHRASE_SG_RECHARGE', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('recharge')}</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr >
|
|
||||||
<td>{int(ship.shieldExplRes * 100) + '%'}</td>
|
|
||||||
<td>{int(ship.shieldThermRes * 100) + '%'}</td>
|
|
||||||
<td>{int(ship.shieldKinRes * 100) + '%'}</td>
|
|
||||||
<td>{int(sgMetrics && sgMetrics.generator ? sgMetrics.total / sgMetrics.absolute.total : 0)}</td>
|
|
||||||
<td>{int(sgMetrics && sgMetrics.generator ? sgMetrics.total / sgMetrics.explosive.total : 0)}</td>
|
|
||||||
<td>{int(sgMetrics && sgMetrics.generator ? sgMetrics.total / sgMetrics.kinetic.total : 0 )}</td>
|
|
||||||
<td>{int(sgMetrics && sgMetrics.generator ? sgMetrics.total / sgMetrics.thermal.total : 0 )}</td>
|
|
||||||
<td>{sgMetrics && sgMetrics.recover ? formats.time(sgMetrics.recover) : 0}</td>
|
|
||||||
<td>{sgMetrics && sgMetrics.recharge ? formats.time(sgMetrics.recharge) : 0}</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'armour', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('explres')}</th>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'armour', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('kinres')}</th>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'armour', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('thermres')}</th>
|
|
||||||
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'armour', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('absolute') + ' ' + translate('HP')}</th>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'armour', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('explosive') + ' ' + translate('HP')}</th>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'armour', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('kinetic') + ' ' + translate('HP')}</th>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'armour', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('thermal') + ' ' + translate('HP')}</th>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'armour', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('raw module armour')}</th>
|
|
||||||
<th onMouseEnter={termtip.bind(null, 'armour', { cap: 0 })} onMouseLeave={hide} className='lft'>{translate('internal protection')}</th>
|
|
||||||
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>{int(ship.hullExplRes * 100) + '%'}</td>
|
|
||||||
<td>{int(ship.hullThermRes * 100) + '%'}</td>
|
|
||||||
<td>{int(ship.hullKinRes * 100) + '%'}</td>
|
|
||||||
<td>{int(armourMetrics.total / armourMetrics.absolute.total)}</td>
|
|
||||||
<td>{int(armourMetrics.total / armourMetrics.explosive.total)}</td>
|
|
||||||
<td>{int(armourMetrics.total / armourMetrics.kinetic.total)}</td>
|
|
||||||
<td>{int(armourMetrics.total / armourMetrics.thermal.total)}</td>
|
|
||||||
<td>{int(armourMetrics.modulearmour)}</td>
|
|
||||||
<td>{int(armourMetrics.moduleprotection * 100) + '%'}</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</div>;
|
</div>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ export default class StandardSlot extends TranslatedComponent {
|
|||||||
let m = slot.m;
|
let m = slot.m;
|
||||||
let classRating = m.class + m.rating;
|
let classRating = m.class + m.rating;
|
||||||
let menu;
|
let menu;
|
||||||
let validMods = m == null || !Modifications.modules[m.grp] ? [] : (Modifications.modules[m.grp].modifications || []);
|
let validMods = m == null ? [] : (Modifications.modules[m.grp].modifications || []);
|
||||||
let showModuleResistances = Persist.showModuleResistances();
|
let showModuleResistances = Persist.showModuleResistances();
|
||||||
let mass = m.getMass() || m.cargo || m.fuel || 0;
|
let mass = m.getMass() || m.cargo || m.fuel || 0;
|
||||||
|
|
||||||
@@ -56,9 +56,6 @@ export default class StandardSlot extends TranslatedComponent {
|
|||||||
let modTT = translate('modified');
|
let modTT = translate('modified');
|
||||||
if (m && m.blueprint && m.blueprint.name) {
|
if (m && m.blueprint && m.blueprint.name) {
|
||||||
modTT = translate(m.blueprint.name) + ' ' + translate('grade') + ' ' + m.blueprint.grade;
|
modTT = translate(m.blueprint.name) + ' ' + translate('grade') + ' ' + m.blueprint.grade;
|
||||||
if (m.blueprint.special && m.blueprint.special.id >= 0) {
|
|
||||||
modTT += ', ' + translate(m.blueprint.special.name);
|
|
||||||
}
|
|
||||||
modTT = (
|
modTT = (
|
||||||
<div>
|
<div>
|
||||||
<div>{modTT}</div>
|
<div>{modTT}</div>
|
||||||
@@ -99,7 +96,7 @@ export default class StandardSlot extends TranslatedComponent {
|
|||||||
return (
|
return (
|
||||||
<div className={cn('slot', { selected: this.props.selected })} onClick={this.props.onOpen} onContextMenu={stopCtxPropagation}>
|
<div className={cn('slot', { selected: this.props.selected })} onClick={this.props.onOpen} onContextMenu={stopCtxPropagation}>
|
||||||
<div className={cn('details-container', { warning: warning && warning(slot.m), disabled: m.grp !== 'bh' && !slot.enabled })}>
|
<div className={cn('details-container', { warning: warning && warning(slot.m), disabled: m.grp !== 'bh' && !slot.enabled })}>
|
||||||
<div className={'sz'}>{m.grp == 'bh' ? m.name.charAt(0) : slot.maxClass}</div>
|
<div className={'sz'}>{slot.maxClass}</div>
|
||||||
<div>
|
<div>
|
||||||
<div className={'l'}>{classRating} {translate(m.name || m.grp)}{m.mods && Object.keys(m.mods).length > 0 ? <span className='r' onMouseOver={termtip.bind(null, modTT)} onMouseOut={tooltip.bind(null, null)}><Modified /></span> : null }</div>
|
<div className={'l'}>{classRating} {translate(m.name || m.grp)}{m.mods && Object.keys(m.mods).length > 0 ? <span className='r' onMouseOver={termtip.bind(null, modTT)} onMouseOut={tooltip.bind(null, null)}><Modified /></span> : null }</div>
|
||||||
<div className={'r'}>{formats.round(mass)}{units.T}</div>
|
<div className={'r'}>{formats.round(mass)}{units.T}</div>
|
||||||
|
|||||||
@@ -235,10 +235,12 @@ export default class StandardSlotSection extends SlotSection {
|
|||||||
<ul>
|
<ul>
|
||||||
<li className='lc' onClick={this._multiPurpose.bind(this, false, 0)}>{translate('Multi-purpose')}</li>
|
<li className='lc' onClick={this._multiPurpose.bind(this, false, 0)}>{translate('Multi-purpose')}</li>
|
||||||
<li className='lc' onClick={this._multiPurpose.bind(this, true, 2)}>{translate('Combat')}</li>
|
<li className='lc' onClick={this._multiPurpose.bind(this, true, 2)}>{translate('Combat')}</li>
|
||||||
<li className='lc' onClick={this._optimizeCargo.bind(this, true)}>{translate('Trader')}</li>
|
<li className='lc' onClick={this._optimizeCargo.bind(this, false)}>{translate('Trader')}</li>
|
||||||
|
<li className='lc' onClick={this._optimizeCargo.bind(this, true)}>{translate('Shielded Trader')}</li>
|
||||||
<li className='lc' onClick={this._optimizeExplorer.bind(this, false)}>{translate('Explorer')}</li>
|
<li className='lc' onClick={this._optimizeExplorer.bind(this, false)}>{translate('Explorer')}</li>
|
||||||
<li className={cn('lc', { disabled: planetaryDisabled })} onClick={!planetaryDisabled && this._optimizeExplorer.bind(this, true)}>{translate('Planetary Explorer')}</li>
|
<li className={cn('lc', { disabled: planetaryDisabled })} onClick={!planetaryDisabled && this._optimizeExplorer.bind(this, true)}>{translate('Planetary Explorer')}</li>
|
||||||
<li className='lc' onClick={this._optimizeMiner.bind(this, true)}>{translate('Miner')}</li>
|
<li className='lc' onClick={this._optimizeMiner.bind(this, false)}>{translate('Miner')}</li>
|
||||||
|
<li className='lc' onClick={this._optimizeMiner.bind(this, true)}>{translate('Shielded Miner')}</li>
|
||||||
<li className='lc' onClick={this._optimizeRacer.bind(this)}>{translate('Racer')}</li>
|
<li className='lc' onClick={this._optimizeRacer.bind(this)}>{translate('Racer')}</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>;
|
</div>;
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import * as FR from './fr';
|
|||||||
import * as IT from './it';
|
import * as IT from './it';
|
||||||
import * as RU from './ru';
|
import * as RU from './ru';
|
||||||
import * as PL from './pl';
|
import * as PL from './pl';
|
||||||
import * as PT from './pt';
|
|
||||||
import * as d3 from 'd3';
|
import * as d3 from 'd3';
|
||||||
|
|
||||||
let fallbackTerms = EN.terms;
|
let fallbackTerms = EN.terms;
|
||||||
@@ -26,7 +25,6 @@ export function getLanguage(langCode) {
|
|||||||
case 'it': lang = IT; break;
|
case 'it': lang = IT; break;
|
||||||
case 'ru': lang = RU; break;
|
case 'ru': lang = RU; break;
|
||||||
case 'pl': lang = PL; break;
|
case 'pl': lang = PL; break;
|
||||||
case 'pt': lang = PT; break;
|
|
||||||
default:
|
default:
|
||||||
lang = EN;
|
lang = EN;
|
||||||
}
|
}
|
||||||
@@ -90,6 +88,5 @@ export const Languages = {
|
|||||||
es: 'Español',
|
es: 'Español',
|
||||||
fr: 'Français',
|
fr: 'Français',
|
||||||
ru: 'ру́сский',
|
ru: 'ру́сский',
|
||||||
pl: 'polski',
|
pl: 'polski'
|
||||||
pt: 'português'
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -16,8 +16,6 @@
|
|||||||
"PHRASE_ENGAGEMENT_RANGE": "The distance between your ship and its target",
|
"PHRASE_ENGAGEMENT_RANGE": "The distance between your ship and its target",
|
||||||
"PHRASE_SELECT_BLUEPRINT": "Click to select a blueprint",
|
"PHRASE_SELECT_BLUEPRINT": "Click to select a blueprint",
|
||||||
"PHRASE_BLUEPRINT_WORST": "Worst primary values for this blueprint",
|
"PHRASE_BLUEPRINT_WORST": "Worst primary values for this blueprint",
|
||||||
"PHRASE_BLUEPRINT_FIFTY": "50% of full values for this blueprint",
|
|
||||||
"PHRASE_BLUEPRINT_SEVEN_FIVE": "75% of full values for this blueprint",
|
|
||||||
"PHRASE_BLUEPRINT_RANDOM": "Random selection between worst and best primary values for this blueprint",
|
"PHRASE_BLUEPRINT_RANDOM": "Random selection between worst and best primary values for this blueprint",
|
||||||
"PHRASE_BLUEPRINT_BEST": "Best primary values for this blueprint",
|
"PHRASE_BLUEPRINT_BEST": "Best primary values for this blueprint",
|
||||||
"PHRASE_BLUEPRINT_EXTREME": "Best beneficial and worst detrimental primary values for this blueprint",
|
"PHRASE_BLUEPRINT_EXTREME": "Best beneficial and worst detrimental primary values for this blueprint",
|
||||||
@@ -117,10 +115,6 @@
|
|||||||
"pl": "Pulse Laser",
|
"pl": "Pulse Laser",
|
||||||
"po": "Point Defence",
|
"po": "Point Defence",
|
||||||
"pp": "Power Plant",
|
"pp": "Power Plant",
|
||||||
"gpp": "Guardian Hybrid Power Plant",
|
|
||||||
"gpd": "Guardian Hybrid Power Distributor",
|
|
||||||
"gpc": "Guardian Plasma Charger",
|
|
||||||
"ggc": "Guardian Gauss Cannon",
|
|
||||||
"psg": "Prismatic Shield Generator",
|
"psg": "Prismatic Shield Generator",
|
||||||
"pv": "Planetary Vehicle Hangar",
|
"pv": "Planetary Vehicle Hangar",
|
||||||
"rf": "Refinery",
|
"rf": "Refinery",
|
||||||
@@ -138,7 +132,6 @@
|
|||||||
"ul": "Burst Laser",
|
"ul": "Burst Laser",
|
||||||
"ws": "Frame Shift Wake Scanner",
|
"ws": "Frame Shift Wake Scanner",
|
||||||
"rpl": "Repair Limpet Controller",
|
"rpl": "Repair Limpet Controller",
|
||||||
"rcpl": "Recon Limpet Controller",
|
|
||||||
"xs": "Xeno Scanner",
|
"xs": "Xeno Scanner",
|
||||||
"emptyrestricted": "empty (restricted)",
|
"emptyrestricted": "empty (restricted)",
|
||||||
"damage dealt to": "Damage dealt to",
|
"damage dealt to": "Damage dealt to",
|
||||||
@@ -180,7 +173,6 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"ammo": "Ammunition maximum",
|
"ammo": "Ammunition maximum",
|
||||||
"boot": "Boot time",
|
"boot": "Boot time",
|
||||||
"hacktime": "Hack time",
|
|
||||||
"brokenregen": "Broken regeneration rate",
|
"brokenregen": "Broken regeneration rate",
|
||||||
"burst": "Burst",
|
"burst": "Burst",
|
||||||
"burstrof": "Burst rate of fire",
|
"burstrof": "Burst rate of fire",
|
||||||
@@ -215,7 +207,6 @@
|
|||||||
"scanrate": "Scan rate",
|
"scanrate": "Scan rate",
|
||||||
"scantime": "Scan time",
|
"scantime": "Scan time",
|
||||||
"shield": "Shield",
|
"shield": "Shield",
|
||||||
"armour": "Armour",
|
|
||||||
"shieldboost": "Shield boost",
|
"shieldboost": "Shield boost",
|
||||||
"shieldreinforcement": "Shield reinforcement",
|
"shieldreinforcement": "Shield reinforcement",
|
||||||
"shotspeed": "Shot speed",
|
"shotspeed": "Shot speed",
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
export const formats = {
|
|
||||||
decimal: ',',
|
|
||||||
thousands: '.',
|
|
||||||
grouping: [3],
|
|
||||||
currency: ['', ' €'],
|
|
||||||
dateTime: '%A, %e de %B de %Y, %X',
|
|
||||||
date: '%d/%m/%Y',
|
|
||||||
time: '%H:%M:%S',
|
|
||||||
periods: ['AM', 'PM'],
|
|
||||||
days: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],
|
|
||||||
shortDays: ['dom', 'lun', 'mar', 'mié', 'jue', 'vie', 'sáb'],
|
|
||||||
months: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],
|
|
||||||
shortMonths: ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic']
|
|
||||||
};
|
|
||||||
|
|
||||||
export { default as terms } from './pt.json';
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -41,9 +41,6 @@ export default class AboutPage extends Page {
|
|||||||
|
|
||||||
<h3>Chat</h3>
|
<h3>Chat</h3>
|
||||||
<p>You can chat to us on our <a href='https://discord.gg/0uwCh6R62aPRjk9w' target='_blank'>EDCD Discord server</a>.</p>
|
<p>You can chat to us on our <a href='https://discord.gg/0uwCh6R62aPRjk9w' target='_blank'>EDCD Discord server</a>.</p>
|
||||||
|
|
||||||
<h3>Supporting Coriolis</h3>
|
|
||||||
<p>Coriolis is an open source project, and I work on it in my free time. I have set up a patreon at <a href='https://www.patreon.com/coriolis_elite'>patreon.com/coriolis_elite</a>, which will be used to keep Coriolis up to date and the servers running.</p>
|
|
||||||
</div>;
|
</div>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,21 +70,70 @@ 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 data = Ships[shipId]; // Retrieve the basic ship properties, slots and defaults
|
|
||||||
let savedCode = Persist.getBuild(shipId, buildName);
|
let shipId = SHIP_FD_NAME_TO_CORIOLIS_NAME[remote.Ship];
|
||||||
|
let data = Ships[shipId];
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
return { error: { message: 'Ship not found: ' + shipId } };
|
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 savedCode = Persist.getBuild(shipId, buildName);
|
||||||
|
let code = params.code;
|
||||||
|
let buildName = params.bn;
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return { error: { message: 'Ship not found: ' + shipId } };
|
||||||
|
}
|
||||||
|
|
||||||
let ship = new Ship(shipId, data.properties, data.slots); // Create a new Ship instance
|
let ship = new Ship(shipId, data.properties, data.slots); // Create a new Ship instance
|
||||||
|
|
||||||
if (code) {
|
if (code) {
|
||||||
ship.buildFrom(code); // Populate modules from serialized 'code' URL param
|
ship.buildFrom(code); // Populate modules from serialized 'code' URL param
|
||||||
} 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
|
||||||
@@ -111,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
|
||||||
@@ -602,7 +654,7 @@ export default class OutfittingPage extends Page {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Main tables */}
|
{/* Main tables */}
|
||||||
<ShipSummaryTable ship={ship} fuel={fuel} cargo={cargo} marker={shipSummaryMarker} pips={{sys: this.state.sys, wep: this.state.wep, eng: this.state.eng}} />
|
<ShipSummaryTable ship={ship} fuel={fuel} cargo={cargo} marker={shipSummaryMarker} />
|
||||||
<StandardSlotSection ship={ship} fuel={fuel} cargo={cargo} code={standardSlotMarker} onChange={shipUpdated} onCargoChange={this._cargoUpdated} onFuelChange={this._fuelUpdated} currentMenu={menu} />
|
<StandardSlotSection ship={ship} fuel={fuel} cargo={cargo} code={standardSlotMarker} onChange={shipUpdated} onCargoChange={this._cargoUpdated} onFuelChange={this._fuelUpdated} currentMenu={menu} />
|
||||||
<InternalSlotSection ship={ship} code={internalSlotMarker} onChange={shipUpdated} onCargoChange={this._cargoUpdated} onFuelChange={this._fuelUpdated} currentMenu={menu} />
|
<InternalSlotSection ship={ship} code={internalSlotMarker} onChange={shipUpdated} onCargoChange={this._cargoUpdated} onFuelChange={this._fuelUpdated} currentMenu={menu} />
|
||||||
<HardpointSlotSection ship={ship} code={hardpointsSlotMarker} onChange={shipUpdated} onCargoChange={this._cargoUpdated} onFuelChange={this._fuelUpdated} currentMenu={menu} />
|
<HardpointSlotSection ship={ship} code={hardpointsSlotMarker} onChange={shipUpdated} onCargoChange={this._cargoUpdated} onFuelChange={this._fuelUpdated} currentMenu={menu} />
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ function countInt(slot) {
|
|||||||
passSlotType = 'pcq';
|
passSlotType = 'pcq';
|
||||||
passSlotRating = 'B';
|
passSlotRating = 'B';
|
||||||
}
|
}
|
||||||
let passengerBay = passSlotType ? ModuleUtils.findMaxInternal(passSlotType, slot.maxClass, passSlotRating) : null;
|
let passengerBay = passSlotType ? ModuleUtils.findInternal(passSlotType, slot.maxClass, passSlotRating) : null;
|
||||||
this.maxPassengers += passengerBay ? passengerBay.passengers : 0;
|
this.maxPassengers += passengerBay ? passengerBay.passengers : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,7 +194,6 @@ export default class ShipyardPage extends Page {
|
|||||||
<td className='cn'>{s.standard[3]}</td>
|
<td className='cn'>{s.standard[3]}</td>
|
||||||
<td className='cn'>{s.standard[4]}</td>
|
<td className='cn'>{s.standard[4]}</td>
|
||||||
<td className='cn'>{s.standard[5]}</td>
|
<td className='cn'>{s.standard[5]}</td>
|
||||||
<td className='cn'>{s.standard[6]}</td>
|
|
||||||
<td className={cn({ disabled: !s.hp[1] })}>{s.hp[1]}</td>
|
<td className={cn({ disabled: !s.hp[1] })}>{s.hp[1]}</td>
|
||||||
<td className={cn({ disabled: !s.hp[2] })}>{s.hp[2]}</td>
|
<td className={cn({ disabled: !s.hp[2] })}>{s.hp[2]}</td>
|
||||||
<td className={cn({ disabled: !s.hp[3] })}>{s.hp[3]}</td>
|
<td className={cn({ disabled: !s.hp[3] })}>{s.hp[3]}</td>
|
||||||
@@ -330,7 +329,7 @@ export default class ShipyardPage extends Page {
|
|||||||
<th> </th>
|
<th> </th>
|
||||||
<th colSpan={4}>{translate('base')}</th>
|
<th colSpan={4}>{translate('base')}</th>
|
||||||
<th colSpan={5}>{translate('max')}</th>
|
<th colSpan={5}>{translate('max')}</th>
|
||||||
<th className='lft' colSpan={7}></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>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -346,9 +345,9 @@ 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('pax')}</th>
|
<th className='sortable' onClick={sortShips('maxPassengers')}>{translate('passengers')}</th>
|
||||||
|
|
||||||
<th className='lft' colSpan={7}>{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>
|
||||||
<th colSpan={8} className='sortable lft' onClick={sortShips('intCount')}>{translate('internal compartments')}</th>
|
<th colSpan={8} className='sortable lft' onClick={sortShips('intCount')}>{translate('internal compartments')}</th>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -370,7 +369,7 @@ export default class ShipyardPage extends Page {
|
|||||||
<th className='sortable' onMouseEnter={termtip.bind(null, 'life support')} onMouseLeave={hide} onClick={sortShips('standard', 3)}>{'ls'}</th>
|
<th className='sortable' onMouseEnter={termtip.bind(null, 'life support')} onMouseLeave={hide} onClick={sortShips('standard', 3)}>{'ls'}</th>
|
||||||
<th className='sortable' onMouseEnter={termtip.bind(null, 'power distriubtor')} onMouseLeave={hide} onClick={sortShips('standard', 4)}>{'pd'}</th>
|
<th className='sortable' onMouseEnter={termtip.bind(null, 'power distriubtor')} onMouseLeave={hide} onClick={sortShips('standard', 4)}>{'pd'}</th>
|
||||||
<th className='sortable' onMouseEnter={termtip.bind(null, 'sensors')} onMouseLeave={hide} onClick={sortShips('standard', 5)}>{'s'}</th>
|
<th className='sortable' onMouseEnter={termtip.bind(null, 'sensors')} onMouseLeave={hide} onClick={sortShips('standard', 5)}>{'s'}</th>
|
||||||
<th className='sortable' onMouseEnter={termtip.bind(null, 'fuel tank')} onMouseLeave={hide} onClick={sortShips('standard', 6)}>{'ft'}</th>
|
|
||||||
<th className='sortable lft' onClick={sortShips('hp',1)}>{translate('S')}</th>
|
<th className='sortable lft' onClick={sortShips('hp',1)}>{translate('S')}</th>
|
||||||
<th className='sortable' onClick={sortShips('hp', 2)}>{translate('M')}</th>
|
<th className='sortable' onClick={sortShips('hp', 2)}>{translate('M')}</th>
|
||||||
<th className='sortable' onClick={sortShips('hp', 3)}>{translate('L')}</th>
|
<th className='sortable' onClick={sortShips('hp', 3)}>{translate('L')}</th>
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ export function totalJumpRange(mass, fsd, fuel) {
|
|||||||
* @param {number} multiplier Shield multiplier for ship (1 + shield boosters if any)
|
* @param {number} multiplier Shield multiplier for ship (1 + shield boosters if any)
|
||||||
* @return {number} Approximate shield strengh in MJ
|
* @return {number} Approximate shield strengh in MJ
|
||||||
*/
|
*/
|
||||||
export function shieldStrength(mass, baseShield, sg, multiplier, ship) {
|
export function shieldStrength(mass, baseShield, sg, multiplier) {
|
||||||
// sg might be a module or a template; handle either here
|
// sg might be a module or a template; handle either here
|
||||||
let minMass = sg instanceof Module ? sg.getMinMass() : sg.minmass;
|
let minMass = sg instanceof Module ? sg.getMinMass() : sg.minmass;
|
||||||
let optMass = sg instanceof Module ? sg.getOptMass() : sg.optmass;
|
let optMass = sg instanceof Module ? sg.getOptMass() : sg.optmass;
|
||||||
@@ -55,17 +55,7 @@ export function shieldStrength(mass, baseShield, sg, multiplier, ship) {
|
|||||||
let minMul = sg instanceof Module ? sg.getMinMul() : sg.minmul;
|
let minMul = sg instanceof Module ? sg.getMinMul() : sg.minmul;
|
||||||
let optMul = sg instanceof Module ? sg.getOptMul() : sg.optmul;
|
let optMul = sg instanceof Module ? sg.getOptMul() : sg.optmul;
|
||||||
let maxMul = sg instanceof Module ? sg.getMaxMul() : sg.maxmul;
|
let maxMul = sg instanceof Module ? sg.getMaxMul() : sg.maxmul;
|
||||||
if (ship) {
|
|
||||||
for (const i of ship.hardpoints) {
|
|
||||||
if (!i.maxClass) {
|
|
||||||
if (i.grp === 'sb' || (i.m && i.m.grp === 'sb')) {
|
|
||||||
if (!isNaN(i.m.getModValue('optmul'))) {
|
|
||||||
optMul += i.m.getModValue('optmul') / 10000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let xnorm = Math.min(1, (maxMass - mass) / (maxMass - minMass));
|
let xnorm = Math.min(1, (maxMass - mass) / (maxMass - minMass));
|
||||||
let exponent = Math.log((optMul - minMul) / (maxMul - minMul)) / Math.log(Math.min(1, (maxMass - optMass) / (maxMass - minMass)));
|
let exponent = Math.log((optMul - minMul) / (maxMul - minMul)) / Math.log(Math.min(1, (maxMass - optMass) / (maxMass - minMass)));
|
||||||
let ynorm = Math.pow(xnorm, exponent);
|
let ynorm = Math.pow(xnorm, exponent);
|
||||||
@@ -361,7 +351,7 @@ export function shieldMetrics(ship, sys) {
|
|||||||
boosterKinDmg = boosterKinDmg > 0.7 ? boosterKinDmg : 0.7 - (0.7 - boosterKinDmg) / 2;
|
boosterKinDmg = boosterKinDmg > 0.7 ? boosterKinDmg : 0.7 - (0.7 - boosterKinDmg) / 2;
|
||||||
boosterThermDmg = boosterThermDmg > 0.7 ? boosterThermDmg : 0.7 - (0.7 - boosterThermDmg) / 2;
|
boosterThermDmg = boosterThermDmg > 0.7 ? boosterThermDmg : 0.7 - (0.7 - boosterThermDmg) / 2;
|
||||||
|
|
||||||
const generatorStrength = this.shieldStrength(ship.hullMass, ship.baseShieldStrength, shieldGenerator, 1, ship);
|
const generatorStrength = this.shieldStrength(ship.hullMass, ship.baseShieldStrength, shieldGenerator, 1);
|
||||||
const boostersStrength = generatorStrength * boost;
|
const boostersStrength = generatorStrength * boost;
|
||||||
|
|
||||||
// Recover time is the time taken to go from 0 to 50%. It includes a 16-second wait before shields start to recover
|
// Recover time is the time taken to go from 0 to 50%. It includes a 16-second wait before shields start to recover
|
||||||
|
|||||||
@@ -9,16 +9,12 @@ export const StandardArray = [
|
|||||||
'pd', // Power Distributor
|
'pd', // Power Distributor
|
||||||
's', // Sensors
|
's', // Sensors
|
||||||
'ft', // Fuel Tank
|
'ft', // Fuel Tank
|
||||||
'gpp', // Guardian Hybrid Power Plant
|
|
||||||
'gpd' // Guardian Hybrid Power Distributor
|
|
||||||
];
|
];
|
||||||
|
|
||||||
// Map to lookup group labels/names for component grp, used for JSON Serialization
|
// Map to lookup group labels/names for component grp, used for JSON Serialization
|
||||||
export const ModuleGroupToName = {
|
export const ModuleGroupToName = {
|
||||||
// Standard
|
// Standard
|
||||||
pp: 'Power Plant',
|
pp: 'Power Plant',
|
||||||
gpp: 'Guardian Hybrid Power Plant',
|
|
||||||
gpd: 'Guardian Hybrid Power Distributor',
|
|
||||||
t: 'Thrusters',
|
t: 'Thrusters',
|
||||||
fsd: 'Frame Shift Drive',
|
fsd: 'Frame Shift Drive',
|
||||||
ls: 'Life Support',
|
ls: 'Life Support',
|
||||||
@@ -79,10 +75,7 @@ export const ModuleGroupToName = {
|
|||||||
sb: 'Shield Booster',
|
sb: 'Shield Booster',
|
||||||
tp: 'Torpedo Pylon',
|
tp: 'Torpedo Pylon',
|
||||||
sfn: 'Shutdown Field Neutraliser',
|
sfn: 'Shutdown Field Neutraliser',
|
||||||
xs: 'Xeno Scanner',
|
xs: 'Xeno Scanner'
|
||||||
rcpl: 'Recon Limpet Controller',
|
|
||||||
gpc: 'Guardian Plasma Charger',
|
|
||||||
ggc: 'Guardian Gauss Cannon',
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let GrpNameToCodeMap = {};
|
let GrpNameToCodeMap = {};
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ export default class Module {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sanitise the resultant value to 4dp equivalent
|
// Sanitise the resultant value to 4dp equivalent
|
||||||
return isNaN(result) ? result : Math.round(result);
|
return isNaN(result) ? result : Math.round(result);
|
||||||
}
|
}
|
||||||
@@ -78,9 +79,6 @@ export default class Module {
|
|||||||
if (!this.mods) {
|
if (!this.mods) {
|
||||||
this.mods = {};
|
this.mods = {};
|
||||||
}
|
}
|
||||||
if (!this.origVals) {
|
|
||||||
this.origVals = {};
|
|
||||||
}
|
|
||||||
if (valueiswithspecial && this.blueprint && this.blueprint.special) {
|
if (valueiswithspecial && this.blueprint && this.blueprint.special) {
|
||||||
// This module has a special effect, see if we need to alter the stored value
|
// This module has a special effect, see if we need to alter the stored value
|
||||||
const modifierActions = Modifications.modifierActions[this.blueprint.special.edname];
|
const modifierActions = Modifications.modifierActions[this.blueprint.special.edname];
|
||||||
@@ -119,6 +117,7 @@ export default class Module {
|
|||||||
_getModifiedValue(name) {
|
_getModifiedValue(name) {
|
||||||
const modification = Modifications.modifications[name];
|
const modification = Modifications.modifications[name];
|
||||||
let result = this[name];
|
let result = this[name];
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
if (modification && modification.method === 'additive') {
|
if (modification && modification.method === 'additive') {
|
||||||
// Additive modifications start at 0 rather than NULL
|
// Additive modifications start at 0 rather than NULL
|
||||||
@@ -722,13 +721,4 @@ export default class Module {
|
|||||||
getTime() {
|
getTime() {
|
||||||
return this._getModifiedValue('time');
|
return this._getModifiedValue('time');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the hack time for this module, taking in to account modifications
|
|
||||||
* @return {string} the time for this module
|
|
||||||
*/
|
|
||||||
getHackTime() {
|
|
||||||
return this._getModifiedValue('hacktime');
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ export function standard(type, id) {
|
|||||||
if (!isNaN(type)) {
|
if (!isNaN(type)) {
|
||||||
type = StandardArray[type];
|
type = StandardArray[type];
|
||||||
}
|
}
|
||||||
|
|
||||||
let s = Modules.standard[type].find(e => e.id == id || (e.class == id.charAt(0) && e.rating == id.charAt(1)));
|
let s = Modules.standard[type].find(e => e.id == id || (e.class == id.charAt(0) && e.rating == id.charAt(1)));
|
||||||
if (s) {
|
if (s) {
|
||||||
s = new Module({ template: s });
|
s = new Module({ template: s });
|
||||||
@@ -195,29 +196,6 @@ export function findInternal(groupName, clss, rating, name) {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Finds an internal module based on Class, Rating, Group and/or name.
|
|
||||||
* At least one of Group name or unique module name must be provided.
|
|
||||||
* will start searching at specified class and proceed lower until a
|
|
||||||
* module is found or 0 is hit
|
|
||||||
* Uses findInternal internally
|
|
||||||
*
|
|
||||||
* @param {String} groupName [Optional] Full name or abbreviated name for module group
|
|
||||||
* @param {integer} clss module Class
|
|
||||||
* @param {String} rating module Rating
|
|
||||||
* @param {String} name [Optional] Long/unique name for module -e.g. 'Advanced Discover Scanner'
|
|
||||||
* @return {Object} The module if found, null if not found
|
|
||||||
*/
|
|
||||||
export function findMaxInternal(groupName, clss, rating, name) {
|
|
||||||
let foundModule = null;
|
|
||||||
let currentClss = clss;
|
|
||||||
while (currentClss > 0 && foundModule == null) {
|
|
||||||
foundModule = findInternal(groupName, currentClss, rating, name);
|
|
||||||
currentClss = currentClss - 1;
|
|
||||||
}
|
|
||||||
return foundModule;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds an internal Module ID based on Class, Rating, Group and/or name.
|
* Finds an internal Module ID based on Class, Rating, Group and/or name.
|
||||||
* At least one ofGroup name or unique module name must be provided
|
* At least one ofGroup name or unique module name must be provided
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ export default class Ship {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO Not accurate if the ship has modified shield boosters
|
// TODO Not accurate if the ship has modified shield boosters
|
||||||
return Calc.shieldStrength(this.hullMass, this.baseShieldStrength, sg, 1 + (multiplierDelta || 0), this);
|
return Calc.shieldStrength(this.hullMass, this.baseShieldStrength, sg, 1 + (multiplierDelta || 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -464,17 +464,7 @@ export default class Ship {
|
|||||||
if (m.blueprint) {
|
if (m.blueprint) {
|
||||||
m.blueprint.special = special;
|
m.blueprint.special = special;
|
||||||
}
|
}
|
||||||
this.updatePowerGenerated()
|
this.recalculateDps().recalculateHps().recalculateEps();
|
||||||
.updatePowerUsed()
|
|
||||||
.recalculateMass()
|
|
||||||
.updateJumpStats()
|
|
||||||
.recalculateShield()
|
|
||||||
.recalculateShieldCells()
|
|
||||||
.recalculateArmour()
|
|
||||||
.recalculateDps()
|
|
||||||
.recalculateEps()
|
|
||||||
.recalculateHps()
|
|
||||||
.updateMovement();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -500,6 +490,7 @@ export default class Ship {
|
|||||||
// Value passed is invalid; reset it to 0
|
// Value passed is invalid; reset it to 0
|
||||||
value = 0;
|
value = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle special cases
|
// Handle special cases
|
||||||
if (name === 'pgen') {
|
if (name === 'pgen') {
|
||||||
// Power generation
|
// Power generation
|
||||||
@@ -578,7 +569,6 @@ export default class Ship {
|
|||||||
// Reset Cumulative stats
|
// Reset Cumulative stats
|
||||||
this.fuelCapacity = 0;
|
this.fuelCapacity = 0;
|
||||||
this.cargoCapacity = 0;
|
this.cargoCapacity = 0;
|
||||||
this.passengerCapacity = 0;
|
|
||||||
this.ladenMass = 0;
|
this.ladenMass = 0;
|
||||||
this.armour = this.baseArmour;
|
this.armour = this.baseArmour;
|
||||||
this.shield = this.baseShieldStrength;
|
this.shield = this.baseShieldStrength;
|
||||||
@@ -626,7 +616,7 @@ export default class Ship {
|
|||||||
standard[i].cat = 0;
|
standard[i].cat = 0;
|
||||||
standard[i].priority = priorities && priorities[i + 1] ? priorities[i + 1] * 1 : 0;
|
standard[i].priority = priorities && priorities[i + 1] ? priorities[i + 1] * 1 : 0;
|
||||||
standard[i].type = 'SYS';
|
standard[i].type = 'SYS';
|
||||||
standard[i].m = null; // Resetting 'old' module if there was one
|
standard[i].m = null; // Resetting 'old' modul if there was one
|
||||||
standard[i].discountedCost = 0;
|
standard[i].discountedCost = 0;
|
||||||
if (comps) {
|
if (comps) {
|
||||||
let module = ModuleUtils.standard(i, comps.standard[i]);
|
let module = ModuleUtils.standard(i, comps.standard[i]);
|
||||||
@@ -795,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
|
||||||
@@ -1198,7 +1196,6 @@ export default class Ship {
|
|||||||
let unladenMass = this.hullMass;
|
let unladenMass = this.hullMass;
|
||||||
let cargoCapacity = 0;
|
let cargoCapacity = 0;
|
||||||
let fuelCapacity = 0;
|
let fuelCapacity = 0;
|
||||||
let passengerCapacity = 0;
|
|
||||||
|
|
||||||
unladenMass += this.bulkheads.m.getMass();
|
unladenMass += this.bulkheads.m.getMass();
|
||||||
|
|
||||||
@@ -1220,10 +1217,6 @@ export default class Ship {
|
|||||||
fuelCapacity += slot.m.fuel;
|
fuelCapacity += slot.m.fuel;
|
||||||
} else if (slot.m.grp === 'cr') {
|
} else if (slot.m.grp === 'cr') {
|
||||||
cargoCapacity += slot.m.cargo;
|
cargoCapacity += slot.m.cargo;
|
||||||
} else if (slot.m.grp.slice(0,2) === 'pc') {
|
|
||||||
if (slot.m.passengers) {
|
|
||||||
passengerCapacity += slot.m.passengers;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1239,7 +1232,6 @@ export default class Ship {
|
|||||||
this.unladenMass = unladenMass;
|
this.unladenMass = unladenMass;
|
||||||
this.cargoCapacity = cargoCapacity;
|
this.cargoCapacity = cargoCapacity;
|
||||||
this.fuelCapacity = fuelCapacity;
|
this.fuelCapacity = fuelCapacity;
|
||||||
this.passengerCapacity = passengerCapacity;
|
|
||||||
this.ladenMass = unladenMass + fuelCapacity + cargoCapacity;
|
this.ladenMass = unladenMass + fuelCapacity + cargoCapacity;
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import * as ModuleUtils from './ModuleUtils'
|
import * as ModuleUtils from './ModuleUtils';
|
||||||
import { canMount } from '../utils/SlotFunctions'
|
import { canMount } from '../utils/SlotFunctions';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Standard / typical role for multi-purpose or combat (if shielded with better bulkheads)
|
* Standard / typical role for multi-purpose or combat (if shielded with better bulkheads)
|
||||||
@@ -11,16 +11,16 @@ export function multiPurpose (ship, shielded, bulkheadIndex) {
|
|||||||
ship.useStandard('A')
|
ship.useStandard('A')
|
||||||
.use(ship.standard[3], ModuleUtils.standard(3, ship.standard[3].maxClass + 'D')) // D Life Support
|
.use(ship.standard[3], ModuleUtils.standard(3, ship.standard[3].maxClass + 'D')) // D Life Support
|
||||||
.use(ship.standard[5], ModuleUtils.standard(5, ship.standard[5].maxClass + 'D')) // D Sensors
|
.use(ship.standard[5], ModuleUtils.standard(5, ship.standard[5].maxClass + 'D')) // D Sensors
|
||||||
.useBulkhead(bulkheadIndex)
|
.useBulkhead(bulkheadIndex);
|
||||||
|
|
||||||
if (shielded) {
|
if (shielded) {
|
||||||
ship.internal.some(function(slot) {
|
ship.internal.some(function(slot) {
|
||||||
if (canMount(ship, slot, 'sg')) { // Assuming largest slot can hold an eligible shield
|
if (canMount(ship, slot, 'sg')) { // Assuming largest slot can hold an eligible shield
|
||||||
ship.use(slot, ModuleUtils.findInternal('sg', slot.maxClass, 'A'))
|
ship.use(slot, ModuleUtils.findInternal('sg', slot.maxClass, 'A'));
|
||||||
ship.setSlotEnabled(slot, true)
|
ship.setSlotEnabled(slot, true);
|
||||||
return true
|
return true;
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,53 +31,39 @@ export function multiPurpose (ship, shielded, bulkheadIndex) {
|
|||||||
* @param {Object} standardOpts [Optional] Standard module optional overrides
|
* @param {Object} standardOpts [Optional] Standard module optional overrides
|
||||||
*/
|
*/
|
||||||
export function trader(ship, shielded, standardOpts) {
|
export function trader(ship, shielded, standardOpts) {
|
||||||
let usedSlots = []
|
let usedSlots = [],
|
||||||
let bstCount = 2
|
sg = ship.getAvailableModules().lightestShieldGenerator(ship.hullMass);
|
||||||
let sg = ship.getAvailableModules().lightestShieldGenerator(ship.hullMass)
|
|
||||||
ship.useStandard('A')
|
|
||||||
.use(ship.standard[3], ModuleUtils.standard(3, ship.standard[3].maxClass + 'D')) // D Life Support
|
|
||||||
.use(ship.standard[1], ModuleUtils.standard(1, ship.standard[1].maxClass + 'D')) // D Life Support
|
|
||||||
.use(ship.standard[4], ModuleUtils.standard(4, ship.standard[4].maxClass + 'D')) // D Life Support
|
|
||||||
.use(ship.standard[5], ModuleUtils.standard(5, ship.standard[5].maxClass + 'D')) // D Sensors
|
|
||||||
|
|
||||||
const shieldOrder = [1, 2, 3, 4, 5, 6, 7, 8]
|
// Shield generator if required
|
||||||
|
if (shielded) {
|
||||||
|
const shieldOrder = [1, 2, 3, 4, 5, 6, 7, 8];
|
||||||
const shieldInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
const shieldInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||||
.filter(a => (!a.eligible) || a.eligible.sg)
|
.filter(a => (!a.eligible) || a.eligible.sg)
|
||||||
.filter(a => a.maxClass >= sg.class)
|
.filter(a => a.maxClass >= sg.class)
|
||||||
.sort((a, b) => shieldOrder.indexOf(a.maxClass) - shieldOrder.indexOf(b.maxClass))
|
.sort((a,b) => shieldOrder.indexOf(a.maxClass) - shieldOrder.indexOf(b.maxClass));
|
||||||
shieldInternals.some(function (slot) {
|
for (let i = 0; i < shieldInternals.length; i++) {
|
||||||
if (canMount(ship, slot, 'sg')) { // Assuming largest slot can hold an eligible shield
|
if (canMount(ship, shieldInternals[i], 'sg')) {
|
||||||
const shield = ModuleUtils.findInternal('sg', slot.maxClass, 'A')
|
ship.use(shieldInternals[i], sg);
|
||||||
if (shield && shield.maxmass > ship.hullMass) {
|
usedSlots.push(shieldInternals[i]);
|
||||||
ship.use(slot, shield)
|
break;
|
||||||
ship.setSlotEnabled(slot, true)
|
}
|
||||||
usedSlots.push(slot)
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
|
||||||
|
|
||||||
// Fill the empty internals with cargo racks
|
// Fill the empty internals with cargo racks
|
||||||
for (let i = ship.internal.length; i--;) {
|
for (let i = ship.internal.length; i--;) {
|
||||||
let slot = ship.internal[i]
|
let slot = ship.internal[i];
|
||||||
if (usedSlots.indexOf(slot) == -1 && canMount(ship, slot, 'cr')) {
|
if (usedSlots.indexOf(slot) == -1 && canMount(ship, slot, 'cr')) {
|
||||||
ship.use(slot, ModuleUtils.findInternal('cr', slot.maxClass, 'E'))
|
ship.use(slot, ModuleUtils.findInternal('cr', slot.maxClass, 'E'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Empty the hardpoints
|
// Empty the hardpoints
|
||||||
for (let s of ship.hardpoints) {
|
for (let s of ship.hardpoints) {
|
||||||
ship.use(s, null)
|
ship.use(s, null);
|
||||||
}
|
}
|
||||||
for (let s of ship.hardpoints) {
|
|
||||||
if (s.maxClass == 0 && bstCount) { // Mount up to 2 boosters
|
ship.useLightestStandard(standardOpts);
|
||||||
ship.use(s, ModuleUtils.hardpoints('04'))
|
|
||||||
bstCount--
|
|
||||||
} else {
|
|
||||||
ship.use(s, null)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// ship.useLightestStandard(standardOpts);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -91,121 +77,121 @@ export function explorer (ship, planetary) {
|
|||||||
usedSlots = [],
|
usedSlots = [],
|
||||||
sgSlot,
|
sgSlot,
|
||||||
fuelScoopSlot,
|
fuelScoopSlot,
|
||||||
sg = ship.getAvailableModules().lightestShieldGenerator(ship.hullMass)
|
sg = ship.getAvailableModules().lightestShieldGenerator(ship.hullMass);
|
||||||
|
|
||||||
if (!planetary) { // Non-planetary explorers don't really need to boost
|
if (!planetary) { // Non-planetary explorers don't really need to boost
|
||||||
standardOpts.pd = '1D'
|
standardOpts.pd = '1D';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cargo hatch can be disabled
|
// Cargo hatch can be disabled
|
||||||
ship.setSlotEnabled(ship.cargoHatch, false)
|
ship.setSlotEnabled(ship.cargoHatch, false);
|
||||||
|
|
||||||
// Advanced Discovery Scanner - class 1 or higher
|
// Advanced Discovery Scanner - class 1 or higher
|
||||||
const adsOrder = [1, 2, 3, 4, 5, 6, 7, 8]
|
const adsOrder = [1, 2, 3, 4, 5, 6, 7, 8];
|
||||||
const adsInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
const adsInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||||
.filter(a => (!a.eligible) || a.eligible.sc)
|
.filter(a => (!a.eligible) || a.eligible.sc)
|
||||||
.sort((a, b) => adsOrder.indexOf(a.maxClass) - adsOrder.indexOf(b.maxClass))
|
.sort((a,b) => adsOrder.indexOf(a.maxClass) - adsOrder.indexOf(b.maxClass));
|
||||||
for (let i = 0; i < adsInternals.length; i++) {
|
for (let i = 0; i < adsInternals.length; i++) {
|
||||||
if (canMount(ship, adsInternals[i], 'sc')) {
|
if (canMount(ship, adsInternals[i], 'sc')) {
|
||||||
ship.use(adsInternals[i], ModuleUtils.internal('2f'))
|
ship.use(adsInternals[i], ModuleUtils.internal('2f'));
|
||||||
usedSlots.push(adsInternals[i])
|
usedSlots.push(adsInternals[i]);
|
||||||
break
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (planetary) {
|
if (planetary) {
|
||||||
// Planetary Vehicle Hangar - class 2 or higher
|
// Planetary Vehicle Hangar - class 2 or higher
|
||||||
const pvhOrder = [2, 3, 4, 5, 6, 7, 8, 1]
|
const pvhOrder = [2, 3, 4, 5, 6, 7, 8, 1];
|
||||||
const pvhInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
const pvhInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||||
.filter(a => (!a.eligible) || a.eligible.pv)
|
.filter(a => (!a.eligible) || a.eligible.pv)
|
||||||
.sort((a, b) => pvhOrder.indexOf(a.maxClass) - pvhOrder.indexOf(b.maxClass))
|
.sort((a,b) => pvhOrder.indexOf(a.maxClass) - pvhOrder.indexOf(b.maxClass));
|
||||||
for (let i = 0; i < pvhInternals.length; i++) {
|
for (let i = 0; i < pvhInternals.length; i++) {
|
||||||
if (canMount(ship, pvhInternals[i], 'pv')) {
|
if (canMount(ship, pvhInternals[i], 'pv')) {
|
||||||
// Planetary Vehical Hangar only has even classes
|
// Planetary Vehical Hangar only has even classes
|
||||||
const pvhClass = pvhInternals[i].maxClass % 2 === 1 ? pvhInternals[i].maxClass - 1 : pvhInternals[i].maxClass
|
const pvhClass = pvhInternals[i].maxClass % 2 === 1 ? pvhInternals[i].maxClass - 1 : pvhInternals[i].maxClass;
|
||||||
ship.use(pvhInternals[i], ModuleUtils.findInternal('pv', pvhClass, 'G')) // G is lower mass
|
ship.use(pvhInternals[i], ModuleUtils.findInternal('pv', pvhClass, 'G')); // G is lower mass
|
||||||
ship.setSlotEnabled(pvhInternals[i], false) // Disable power for Planetary Vehical Hangar
|
ship.setSlotEnabled(pvhInternals[i], false); // Disable power for Planetary Vehical Hangar
|
||||||
usedSlots.push(pvhInternals[i])
|
usedSlots.push(pvhInternals[i]);
|
||||||
break
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shield generator
|
// Shield generator
|
||||||
const shieldOrder = [1, 2, 3, 4, 5, 6, 7, 8]
|
const shieldOrder = [1, 2, 3, 4, 5, 6, 7, 8];
|
||||||
const shieldInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
const shieldInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||||
.filter(a => (!a.eligible) || a.eligible.sg)
|
.filter(a => (!a.eligible) || a.eligible.sg)
|
||||||
.filter(a => a.maxClass >= sg.class)
|
.filter(a => a.maxClass >= sg.class)
|
||||||
.sort((a, b) => shieldOrder.indexOf(a.maxClass) - shieldOrder.indexOf(b.maxClass))
|
.sort((a,b) => shieldOrder.indexOf(a.maxClass) - shieldOrder.indexOf(b.maxClass));
|
||||||
for (let i = 0; i < shieldInternals.length; i++) {
|
for (let i = 0; i < shieldInternals.length; i++) {
|
||||||
if (canMount(ship, shieldInternals[i], 'sg')) {
|
if (canMount(ship, shieldInternals[i], 'sg')) {
|
||||||
ship.use(shieldInternals[i], sg)
|
ship.use(shieldInternals[i], sg);
|
||||||
usedSlots.push(shieldInternals[i])
|
usedSlots.push(shieldInternals[i]);
|
||||||
sgSlot = shieldInternals[i]
|
sgSlot = shieldInternals[i];
|
||||||
break
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Detailed Surface Scanner
|
// Detailed Surface Scanner
|
||||||
const dssOrder = [1, 2, 3, 4, 5, 6, 7, 8]
|
const dssOrder = [1, 2, 3, 4, 5, 6, 7, 8];
|
||||||
const dssInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
const dssInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||||
.filter(a => (!a.eligible) || a.eligible.sc)
|
.filter(a => (!a.eligible) || a.eligible.sc)
|
||||||
.sort((a, b) => dssOrder.indexOf(a.maxClass) - dssOrder.indexOf(b.maxClass))
|
.sort((a,b) => dssOrder.indexOf(a.maxClass) - dssOrder.indexOf(b.maxClass));
|
||||||
for (let i = 0; i < dssInternals.length; i++) {
|
for (let i = 0; i < dssInternals.length; i++) {
|
||||||
if (canMount(ship, dssInternals[i], 'sc')) {
|
if (canMount(ship, dssInternals[i], 'sc')) {
|
||||||
ship.use(dssInternals[i], ModuleUtils.internal('2i'))
|
ship.use(dssInternals[i], ModuleUtils.internal('2i'));
|
||||||
usedSlots.push(dssInternals[i])
|
usedSlots.push(dssInternals[i]);
|
||||||
break
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fuel scoop - best possible
|
// Fuel scoop - best possible
|
||||||
const fuelScoopOrder = [8, 7, 6, 5, 4, 3, 2, 1]
|
const fuelScoopOrder = [8, 7, 6, 5, 4, 3, 2, 1];
|
||||||
const fuelScoopInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
const fuelScoopInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||||
.filter(a => (!a.eligible) || a.eligible.fs)
|
.filter(a => (!a.eligible) || a.eligible.fs)
|
||||||
.sort((a, b) => fuelScoopOrder.indexOf(a.maxClass) - fuelScoopOrder.indexOf(b.maxClass))
|
.sort((a,b) => fuelScoopOrder.indexOf(a.maxClass) - fuelScoopOrder.indexOf(b.maxClass));
|
||||||
for (let i = 0; i < fuelScoopInternals.length; i++) {
|
for (let i = 0; i < fuelScoopInternals.length; i++) {
|
||||||
if (canMount(ship, fuelScoopInternals[i], 'fs')) {
|
if (canMount(ship, fuelScoopInternals[i], 'fs')) {
|
||||||
ship.use(fuelScoopInternals[i], ModuleUtils.findInternal('fs', fuelScoopInternals[i].maxClass, 'A'))
|
ship.use(fuelScoopInternals[i], ModuleUtils.findInternal('fs', fuelScoopInternals[i].maxClass, 'A'));
|
||||||
usedSlots.push(fuelScoopInternals[i])
|
usedSlots.push(fuelScoopInternals[i]);
|
||||||
fuelScoopSlot = fuelScoopInternals[i]
|
fuelScoopSlot = fuelScoopInternals[i];
|
||||||
break
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// AFMUs - fill as they are 0-weight
|
// AFMUs - fill as they are 0-weight
|
||||||
const afmuOrder = [8, 7, 6, 5, 4, 3, 2, 1]
|
const afmuOrder = [8, 7, 6, 5, 4, 3, 2, 1];
|
||||||
const afmuInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
const afmuInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||||
.filter(a => (!a.eligible) || a.eligible.pc)
|
.filter(a => (!a.eligible) || a.eligible.pc)
|
||||||
.sort((a, b) => afmuOrder.indexOf(a.maxClass) - afmuOrder.indexOf(b.maxClass))
|
.sort((a,b) => afmuOrder.indexOf(a.maxClass) - afmuOrder.indexOf(b.maxClass));
|
||||||
for (let i = 0; i < afmuInternals.length; i++) {
|
for (let i = 0; i < afmuInternals.length; i++) {
|
||||||
if (canMount(ship, afmuInternals[i], 'am')) {
|
if (canMount(ship, afmuInternals[i], 'am')) {
|
||||||
ship.use(afmuInternals[i], ModuleUtils.findInternal('am', afmuInternals[i].maxClass, 'A'))
|
ship.use(afmuInternals[i], ModuleUtils.findInternal('am', afmuInternals[i].maxClass, 'A'));
|
||||||
usedSlots.push(afmuInternals[i])
|
usedSlots.push(afmuInternals[i]);
|
||||||
ship.setSlotEnabled(afmuInternals[i], false) // Disable power for AFM Unit
|
ship.setSlotEnabled(afmuInternals[i], false); // Disable power for AFM Unit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let s of ship.hardpoints) {
|
for (let s of ship.hardpoints) {
|
||||||
if (s.maxClass == 0 && heatSinkCount) { // Mount up to 2 heatsinks
|
if (s.maxClass == 0 && heatSinkCount) { // Mount up to 2 heatsinks
|
||||||
ship.use(s, ModuleUtils.hardpoints('02'))
|
ship.use(s, ModuleUtils.hardpoints('02'));
|
||||||
ship.setSlotEnabled(s, heatSinkCount == 2) // Only enable a single Heatsink
|
ship.setSlotEnabled(s, heatSinkCount == 2); // Only enable a single Heatsink
|
||||||
heatSinkCount--
|
heatSinkCount--;
|
||||||
} else {
|
} else {
|
||||||
ship.use(s, null)
|
ship.use(s, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sgSlot && fuelScoopSlot) {
|
if (sgSlot && fuelScoopSlot) {
|
||||||
// The SG and Fuel scoop to not need to be powered at the same time
|
// The SG and Fuel scoop to not need to be powered at the same time
|
||||||
if (sgSlot.m.getPowerUsage() > fuelScoopSlot.m.getPowerUsage()) { // The Shield generator uses the most power
|
if (sgSlot.m.getPowerUsage() > fuelScoopSlot.m.getPowerUsage()) { // The Shield generator uses the most power
|
||||||
ship.setSlotEnabled(fuelScoopSlot, false)
|
ship.setSlotEnabled(fuelScoopSlot, false);
|
||||||
} else { // The Fuel scoop uses the most power
|
} else { // The Fuel scoop uses the most power
|
||||||
ship.setSlotEnabled(sgSlot, false)
|
ship.setSlotEnabled(sgSlot, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ship.useLightestStandard(standardOpts)
|
ship.useLightestStandard(standardOpts);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -214,100 +200,99 @@ export function explorer (ship, planetary) {
|
|||||||
* @param {Boolean} shielded True if shield generator should be included
|
* @param {Boolean} shielded True if shield generator should be included
|
||||||
*/
|
*/
|
||||||
export function miner(ship, shielded) {
|
export function miner(ship, shielded) {
|
||||||
shielded = true
|
|
||||||
let standardOpts = { ppRating: 'A' },
|
let standardOpts = { ppRating: 'A' },
|
||||||
miningLaserCount = 2,
|
miningLaserCount = 2,
|
||||||
usedSlots = [],
|
usedSlots = [],
|
||||||
sg = ship.getAvailableModules().lightestShieldGenerator(ship.hullMass)
|
sg = ship.getAvailableModules().lightestShieldGenerator(ship.hullMass);
|
||||||
|
|
||||||
// Cargo hatch should be enabled
|
// Cargo hatch should be enabled
|
||||||
ship.setSlotEnabled(ship.cargoHatch, true)
|
ship.setSlotEnabled(ship.cargoHatch, true);
|
||||||
|
|
||||||
// Largest possible refinery
|
// Largest possible refinery
|
||||||
const refineryOrder = [4, 5, 6, 7, 8, 3, 2, 1]
|
const refineryOrder = [4, 5, 6, 7, 8, 3, 2, 1];
|
||||||
const refineryInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
const refineryInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||||
.filter(a => (!a.eligible) || a.eligible.rf)
|
.filter(a => (!a.eligible) || a.eligible.rf)
|
||||||
.sort((a, b) => refineryOrder.indexOf(a.maxClass) - refineryOrder.indexOf(b.maxClass))
|
.sort((a,b) => refineryOrder.indexOf(a.maxClass) - refineryOrder.indexOf(b.maxClass));
|
||||||
for (let i = 0; i < refineryInternals.length; i++) {
|
for (let i = 0; i < refineryInternals.length; i++) {
|
||||||
if (canMount(ship, refineryInternals[i], 'rf')) {
|
if (canMount(ship, refineryInternals[i], 'rf')) {
|
||||||
ship.use(refineryInternals[i], ModuleUtils.findInternal('rf', Math.min(refineryInternals[i].maxClass, 4), 'A'))
|
ship.use(refineryInternals[i], ModuleUtils.findInternal('rf', Math.min(refineryInternals[i].maxClass, 4), 'A'));
|
||||||
usedSlots.push(refineryInternals[i])
|
usedSlots.push(refineryInternals[i]);
|
||||||
break
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prospector limpet controller - 3A if possible
|
// Prospector limpet controller - 3A if possible
|
||||||
const prospectorOrder = [3, 4, 5, 6, 7, 8, 2, 1]
|
const prospectorOrder = [3, 4, 5, 6, 7, 8, 2, 1];
|
||||||
const prospectorInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
const prospectorInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||||
.filter(a => (!a.eligible) || a.eligible.pc)
|
.filter(a => (!a.eligible) || a.eligible.pc)
|
||||||
.sort((a, b) => prospectorOrder.indexOf(a.maxClass) - prospectorOrder.indexOf(b.maxClass))
|
.sort((a,b) => prospectorOrder.indexOf(a.maxClass) - prospectorOrder.indexOf(b.maxClass));
|
||||||
for (let i = 0; i < prospectorInternals.length; i++) {
|
for (let i = 0; i < prospectorInternals.length; i++) {
|
||||||
if (canMount(ship, prospectorInternals[i], 'pc')) {
|
if (canMount(ship, prospectorInternals[i], 'pc')) {
|
||||||
// Prospector only has odd classes
|
// Prospector only has odd classes
|
||||||
const prospectorClass = prospectorInternals[i].maxClass % 2 === 0 ? prospectorInternals[i].maxClass - 1 : prospectorInternals[i].maxClass
|
const prospectorClass = prospectorInternals[i].maxClass % 2 === 0 ? prospectorInternals[i].maxClass - 1 : prospectorInternals[i].maxClass;
|
||||||
ship.use(prospectorInternals[i], ModuleUtils.findInternal('pc', prospectorClass, 'A'))
|
ship.use(prospectorInternals[i], ModuleUtils.findInternal('pc', prospectorClass, 'A'));
|
||||||
usedSlots.push(prospectorInternals[i])
|
usedSlots.push(prospectorInternals[i]);
|
||||||
break
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shield generator if required
|
// Shield generator if required
|
||||||
if (shielded) {
|
if (shielded) {
|
||||||
const shieldOrder = [1, 2, 3, 4, 5, 6, 7, 8]
|
const shieldOrder = [1, 2, 3, 4, 5, 6, 7, 8];
|
||||||
const shieldInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
const shieldInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||||
.filter(a => (!a.eligible) || a.eligible.sg)
|
.filter(a => (!a.eligible) || a.eligible.sg)
|
||||||
.filter(a => a.maxClass >= sg.class)
|
.filter(a => a.maxClass >= sg.class)
|
||||||
.sort((a, b) => shieldOrder.indexOf(a.maxClass) - shieldOrder.indexOf(b.maxClass))
|
.sort((a,b) => shieldOrder.indexOf(a.maxClass) - shieldOrder.indexOf(b.maxClass));
|
||||||
for (let i = 0; i < shieldInternals.length; i++) {
|
for (let i = 0; i < shieldInternals.length; i++) {
|
||||||
if (canMount(ship, shieldInternals[i], 'sg')) {
|
if (canMount(ship, shieldInternals[i], 'sg')) {
|
||||||
ship.use(shieldInternals[i], sg)
|
ship.use(shieldInternals[i], sg);
|
||||||
usedSlots.push(shieldInternals[i])
|
usedSlots.push(shieldInternals[i]);
|
||||||
break
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dual mining lasers of highest possible class; remove anything else
|
// Dual mining lasers of highest possible class; remove anything else
|
||||||
const miningLaserOrder = [2, 3, 4, 1, 0]
|
const miningLaserOrder = [2, 3, 4, 1, 0];
|
||||||
const miningLaserHardpoints = ship.hardpoints.concat().sort(function(a,b) {
|
const miningLaserHardpoints = ship.hardpoints.concat().sort(function(a,b) {
|
||||||
return miningLaserOrder.indexOf(a.maxClass) - miningLaserOrder.indexOf(b.maxClass)
|
return miningLaserOrder.indexOf(a.maxClass) - miningLaserOrder.indexOf(b.maxClass);
|
||||||
})
|
});
|
||||||
for (let s of miningLaserHardpoints) {
|
for (let s of miningLaserHardpoints) {
|
||||||
if (s.maxClass >= 1 && miningLaserCount) {
|
if (s.maxClass >= 1 && miningLaserCount) {
|
||||||
ship.use(s, ModuleUtils.hardpoints(s.maxClass >= 2 ? '2m' : '2l'))
|
ship.use(s, ModuleUtils.hardpoints(s.maxClass >= 2 ? '2m' : '2l'));
|
||||||
miningLaserCount--
|
miningLaserCount--;
|
||||||
} else {
|
} else {
|
||||||
ship.use(s, null)
|
ship.use(s, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Number of collector limpets required to be active is a function of the size of the ship and the power of the lasers
|
// Number of collector limpets required to be active is a function of the size of the ship and the power of the lasers
|
||||||
const miningLaserDps = ship.hardpoints.filter(h => h.m != null)
|
const miningLaserDps = ship.hardpoints.filter(h => h.m != null)
|
||||||
.reduce(function(a, b) {
|
.reduce(function(a, b) {
|
||||||
return a + b.m.getDps()
|
return a + b.m.getDps();
|
||||||
}, 0)
|
}, 0);
|
||||||
// Find out how many internal slots we have, and their potential cargo size
|
// Find out how many internal slots we have, and their potential cargo size
|
||||||
const potentialCargo = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
const potentialCargo = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||||
.filter(a => (!a.eligible) || a.eligible.cr)
|
.filter(a => (!a.eligible) || a.eligible.cr)
|
||||||
.map(b => Math.pow(2, b.maxClass))
|
.map(b => Math.pow(2, b.maxClass));
|
||||||
// One collector for each 1.25 DPS, multiply by 1.25 for medium ships and 1.5 for large ships as they have further to travel
|
// One collector for each 1.25 DPS, multiply by 1.25 for medium ships and 1.5 for large ships as they have further to travel
|
||||||
// 0 if we only have 1 cargo slot, otherwise minium of 1 and maximum of 6 (excluding size modifier)
|
// 0 if we only have 1 cargo slot, otherwise minium of 1 and maximum of 6 (excluding size modifier)
|
||||||
const sizeModifier = ship.class == 2 ? 1.2 : ship.class == 3 ? 1.5 : 1
|
const sizeModifier = ship.class == 2 ? 1.2 : ship.class == 3 ? 1.5 : 1;
|
||||||
let collectorLimpetsRequired = potentialCargo.length == 1 ? 0 : Math.ceil(sizeModifier * Math.min(6, Math.floor(miningLaserDps / 1.25)))
|
let collectorLimpetsRequired = potentialCargo.length == 1 ? 0 : Math.ceil(sizeModifier * Math.min(6, Math.floor(miningLaserDps / 1.25)));
|
||||||
|
|
||||||
if (collectorLimpetsRequired > 0) {
|
if (collectorLimpetsRequired > 0) {
|
||||||
const collectorOrder = [1, 2, 3, 4, 5, 6, 7, 8]
|
const collectorOrder = [1, 2, 3, 4, 5, 6, 7, 8];
|
||||||
const collectorInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
const collectorInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||||
.filter(a => (!a.eligible) || a.eligible.cc)
|
.filter(a => (!a.eligible) || a.eligible.cc)
|
||||||
.sort((a, b) => collectorOrder.indexOf(a.maxClass) - collectorOrder.indexOf(b.maxClass))
|
.sort((a,b) => collectorOrder.indexOf(a.maxClass) - collectorOrder.indexOf(b.maxClass));
|
||||||
// Always keep at least 2 slots free for cargo racks (1 for shielded)
|
// Always keep at least 2 slots free for cargo racks (1 for shielded)
|
||||||
for (let i = 0; i < collectorInternals.length - (shielded ? 1 : 2) && collectorLimpetsRequired > 0; i++) {
|
for (let i = 0; i < collectorInternals.length - (shielded ? 1 : 2) && collectorLimpetsRequired > 0; i++) {
|
||||||
if (canMount(ship, collectorInternals[i], 'cc')) {
|
if (canMount(ship, collectorInternals[i], 'cc')) {
|
||||||
// Collector only has odd classes
|
// Collector only has odd classes
|
||||||
const collectorClass = collectorInternals[i].maxClass % 2 === 0 ? collectorInternals[i].maxClass - 1 : collectorInternals[i].maxClass
|
const collectorClass = collectorInternals[i].maxClass % 2 === 0 ? collectorInternals[i].maxClass - 1 : collectorInternals[i].maxClass;
|
||||||
ship.use(collectorInternals[i], ModuleUtils.findInternal('cc', collectorClass, 'D'))
|
ship.use(collectorInternals[i], ModuleUtils.findInternal('cc', collectorClass, 'D'));
|
||||||
usedSlots.push(collectorInternals[i])
|
usedSlots.push(collectorInternals[i]);
|
||||||
collectorLimpetsRequired -= collectorInternals[i].m.maximum
|
collectorLimpetsRequired -= collectorInternals[i].m.maximum;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -315,19 +300,19 @@ export function miner (ship, shielded) {
|
|||||||
// Power distributor to power the mining lasers indefinitely
|
// Power distributor to power the mining lasers indefinitely
|
||||||
const wepRateRequired = ship.hardpoints.filter(h => h.m != null)
|
const wepRateRequired = ship.hardpoints.filter(h => h.m != null)
|
||||||
.reduce(function(a, b) {
|
.reduce(function(a, b) {
|
||||||
return a + b.m.getEps()
|
return a + b.m.getEps();
|
||||||
}, 0)
|
}, 0);
|
||||||
standardOpts.pd = ship.getAvailableModules().matchingPowerDist({weprate: wepRateRequired}).id
|
standardOpts.pd = ship.getAvailableModules().matchingPowerDist({ weprate: wepRateRequired }).id;
|
||||||
|
|
||||||
// Fill the empty internals with cargo racks
|
// Fill the empty internals with cargo racks
|
||||||
for (let i = ship.internal.length; i--;) {
|
for (let i = ship.internal.length; i--;) {
|
||||||
let slot = ship.internal[i]
|
let slot = ship.internal[i];
|
||||||
if (usedSlots.indexOf(slot) == -1 && canMount(ship, slot, 'cr')) {
|
if (usedSlots.indexOf(slot) == -1 && canMount(ship, slot, 'cr')) {
|
||||||
ship.use(slot, ModuleUtils.findInternal('cr', slot.maxClass, 'E'))
|
ship.use(slot, ModuleUtils.findInternal('cr', slot.maxClass, 'E'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ship.useLightestStandard(standardOpts)
|
ship.useLightestStandard(standardOpts);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -338,63 +323,63 @@ export function racer (ship) {
|
|||||||
let standardOpts = {},
|
let standardOpts = {},
|
||||||
usedSlots = [],
|
usedSlots = [],
|
||||||
sgSlot,
|
sgSlot,
|
||||||
sg = ship.getAvailableModules().lightestShieldGenerator(ship.hullMass)
|
sg = ship.getAvailableModules().lightestShieldGenerator(ship.hullMass);
|
||||||
|
|
||||||
// Cargo hatch can be disabled
|
// Cargo hatch can be disabled
|
||||||
ship.setSlotEnabled(ship.cargoHatch, false)
|
ship.setSlotEnabled(ship.cargoHatch, false);
|
||||||
|
|
||||||
// Shield generator
|
// Shield generator
|
||||||
const shieldOrder = [1, 2, 3, 4, 5, 6, 7, 8]
|
const shieldOrder = [1, 2, 3, 4, 5, 6, 7, 8];
|
||||||
const shieldInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
const shieldInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||||
.filter(a => (!a.eligible) || a.eligible.sg)
|
.filter(a => (!a.eligible) || a.eligible.sg)
|
||||||
.filter(a => a.maxClass >= sg.class)
|
.filter(a => a.maxClass >= sg.class)
|
||||||
.sort((a, b) => shieldOrder.indexOf(a.maxClass) - shieldOrder.indexOf(b.maxClass))
|
.sort((a,b) => shieldOrder.indexOf(a.maxClass) - shieldOrder.indexOf(b.maxClass));
|
||||||
for (let i = 0; i < shieldInternals.length; i++) {
|
for (let i = 0; i < shieldInternals.length; i++) {
|
||||||
if (canMount(ship, shieldInternals[i], 'sg')) {
|
if (canMount(ship, shieldInternals[i], 'sg')) {
|
||||||
ship.use(shieldInternals[i], sg)
|
ship.use(shieldInternals[i], sg);
|
||||||
usedSlots.push(shieldInternals[i])
|
usedSlots.push(shieldInternals[i]);
|
||||||
sgSlot = shieldInternals[i]
|
sgSlot = shieldInternals[i];
|
||||||
break
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Empty the hardpoints
|
// Empty the hardpoints
|
||||||
for (let s of ship.hardpoints) {
|
for (let s of ship.hardpoints) {
|
||||||
ship.use(s, null)
|
ship.use(s, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Empty the internals
|
// Empty the internals
|
||||||
for (let i = ship.internal.length; i--;) {
|
for (let i = ship.internal.length; i--;) {
|
||||||
let slot = ship.internal[i]
|
let slot = ship.internal[i];
|
||||||
if (usedSlots.indexOf(slot) == -1) {
|
if (usedSlots.indexOf(slot) == -1) {
|
||||||
ship.use(slot, null)
|
ship.use(slot, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Best thrusters
|
// Best thrusters
|
||||||
if (ship.standard[1].maxClass === 3) {
|
if (ship.standard[1].maxClass === 3) {
|
||||||
standardOpts.th = 'tz'
|
standardOpts.th = 'tz';
|
||||||
} else if (ship.standard[1].maxClass === 2) {
|
} else if (ship.standard[1].maxClass === 2) {
|
||||||
standardOpts.th = 'u0'
|
standardOpts.th = 'u0';
|
||||||
} else {
|
} else {
|
||||||
standardOpts.th = ship.standard[1].maxClass + 'A'
|
standardOpts.th = ship.standard[1].maxClass + 'A';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Best power distributor for more boosting
|
// Best power distributor for more boosting
|
||||||
standardOpts.pd = ship.standard[4].maxClass + 'A'
|
standardOpts.pd = ship.standard[4].maxClass + 'A';
|
||||||
|
|
||||||
// Smallest possible FSD drive
|
// Smallest possible FSD drive
|
||||||
standardOpts.fsd = '2D'
|
standardOpts.fsd = '2D';
|
||||||
// Minimal fuel tank
|
// Minimal fuel tank
|
||||||
standardOpts.ft = '1C'
|
standardOpts.ft = '1C';
|
||||||
|
|
||||||
// Disable nearly everything
|
// Disable nearly everything
|
||||||
standardOpts.fsdDisabled = true
|
standardOpts.fsdDisabled = true;
|
||||||
standardOpts.sDisabled = true
|
standardOpts.sDisabled = true;
|
||||||
standardOpts.pdDisabled = true
|
standardOpts.pdDisabled = true;
|
||||||
standardOpts.lsDisabled = true
|
standardOpts.lsDisabled = true;
|
||||||
|
|
||||||
ship.useLightestStandard(standardOpts)
|
ship.useLightestStandard(standardOpts);
|
||||||
|
|
||||||
// Apply engineering to each module
|
// Apply engineering to each module
|
||||||
// ship.standard[1].m.blueprint = getBlueprint('Engine_Dirty', ship.standard[0]);
|
// ship.standard[1].m.blueprint = getBlueprint('Engine_Dirty', ship.standard[0]);
|
||||||
@@ -413,3 +398,4 @@ export function racer (ship) {
|
|||||||
// ship.standard[5].m.blueprint.grade = 5;
|
// ship.standard[5].m.blueprint.grade = 5;
|
||||||
// setBest(ship, ship.standard[5].m);
|
// setBest(ship, ship.standard[5].m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,67 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Modifications } from 'coriolis-data/dist';
|
import { Modifications } from 'coriolis-data/dist';
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate a tooltip with details of a blueprint's specials
|
|
||||||
* @param {Object} translate The translate object
|
|
||||||
* @param {Object} blueprint The blueprint at the required grade
|
|
||||||
* @param {string} grp The group of the module
|
|
||||||
* @param {Object} m The module to compare with
|
|
||||||
* @param specialName
|
|
||||||
* @returns {Object} The react components
|
|
||||||
*/
|
|
||||||
export function specialToolTip(translate, blueprint, grp, m, specialName) {
|
|
||||||
const effects = [];
|
|
||||||
if (!blueprint || !blueprint.features) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
if (m) {
|
|
||||||
// We also add in any benefits from specials that aren't covered above
|
|
||||||
if (m.blueprint) {
|
|
||||||
for (const feature in Modifications.modifierActions[specialName]) {
|
|
||||||
// if (!blueprint.features[feature] && !m.mods.feature) {
|
|
||||||
const featureDef = Modifications.modifications[feature];
|
|
||||||
if (featureDef && !featureDef.hidden) {
|
|
||||||
let symbol = '';
|
|
||||||
if (feature === 'jitter') {
|
|
||||||
symbol = '°';
|
|
||||||
} else if (featureDef.type === 'percentage') {
|
|
||||||
symbol = '%';
|
|
||||||
}
|
|
||||||
let current = m.getModValue(feature) - m.getModValue(feature, true);
|
|
||||||
if (featureDef.type === 'percentage') {
|
|
||||||
current = Math.round(current / 10) / 10;
|
|
||||||
} else if (featureDef.type === 'numeric') {
|
|
||||||
current /= 100;
|
|
||||||
}
|
|
||||||
const currentIsBeneficial = isValueBeneficial(feature, current);
|
|
||||||
|
|
||||||
effects.push(
|
|
||||||
<tr key={feature + '_specialTT'}>
|
|
||||||
<td style={{textAlign: 'left'}}>{translate(feature, grp)}</td>
|
|
||||||
<td> </td>
|
|
||||||
<td className={current === 0 ? '' : currentIsBeneficial ? 'secondary' : 'warning'}
|
|
||||||
style={{textAlign: 'right'}}>{current}{symbol}</td>
|
|
||||||
<td> </td>
|
|
||||||
</tr>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<table width='100%'>
|
|
||||||
<tbody>
|
|
||||||
{effects}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate a tooltip with details of a blueprint's effects
|
* Generate a tooltip with details of a blueprint's effects
|
||||||
* @param {Object} translate The translate object
|
* @param {Object} translate The translate object
|
||||||
@@ -73,9 +12,6 @@ export function specialToolTip(translate, blueprint, grp, m, specialName) {
|
|||||||
*/
|
*/
|
||||||
export function blueprintTooltip(translate, blueprint, engineers, grp, m) {
|
export function blueprintTooltip(translate, blueprint, engineers, grp, m) {
|
||||||
const effects = [];
|
const effects = [];
|
||||||
if (!blueprint || !blueprint.features) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
for (const feature in blueprint.features) {
|
for (const feature in blueprint.features) {
|
||||||
const featureIsBeneficial = isBeneficial(feature, blueprint.features[feature]);
|
const featureIsBeneficial = isBeneficial(feature, blueprint.features[feature]);
|
||||||
const featureDef = Modifications.modifications[feature];
|
const featureDef = Modifications.modifications[feature];
|
||||||
@@ -289,13 +225,27 @@ export function isValueBeneficial(feature, value) {
|
|||||||
*/
|
*/
|
||||||
export function getBlueprint(name, module) {
|
export function getBlueprint(name, module) {
|
||||||
// Start with a copy of the blueprint
|
// Start with a copy of the blueprint
|
||||||
const findMod = val => Object.keys(Modifications.blueprints).find(elem => elem.toString().toLowerCase().search(val.toString().toLowerCase().replace(/(OutfittingFieldType_|persecond)/igm, '')) >= 0)
|
const blueprint = JSON.parse(JSON.stringify(Modifications.blueprints[name]));
|
||||||
const found = Modifications.blueprints[findMod(name)];
|
|
||||||
if (!found || !found.fdname) {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
const blueprint = JSON.parse(JSON.stringify(found));
|
|
||||||
if (module) {
|
if (module) {
|
||||||
|
if (module.grp === 'bh' || module.grp === 'hr' || module.grp === 'sg' || module.grp === 'psg' || module.grp === 'bsg') {
|
||||||
|
// Bulkheads, hull reinforcements and shield generators need to have their resistances altered by the base values
|
||||||
|
for (const grade in blueprint.grades) {
|
||||||
|
for (const feature in blueprint.grades[grade].features) {
|
||||||
|
if (feature === 'explres') {
|
||||||
|
blueprint.grades[grade].features[feature][0] *= (1 - module.explres);
|
||||||
|
blueprint.grades[grade].features[feature][1] *= (1 - module.explres);
|
||||||
|
}
|
||||||
|
if (feature === 'kinres') {
|
||||||
|
blueprint.grades[grade].features[feature][0] *= (1 - module.kinres);
|
||||||
|
blueprint.grades[grade].features[feature][1] *= (1 - module.kinres);
|
||||||
|
}
|
||||||
|
if (feature === 'thermres') {
|
||||||
|
blueprint.grades[grade].features[feature][0] *= (1 - module.thermres);
|
||||||
|
blueprint.grades[grade].features[feature][1] *= (1 - module.thermres);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (module.grp === 'sb') {
|
if (module.grp === 'sb') {
|
||||||
// Shield boosters are treated internally as straight modifiers, so rather than (for example)
|
// Shield boosters are treated internally as straight modifiers, so rather than (for example)
|
||||||
// being a 4% boost they are a 104% multiplier. We need to fix the values here so that they look
|
// being a 4% boost they are a 104% multiplier. We need to fix the values here so that they look
|
||||||
@@ -314,15 +264,72 @@ export function getBlueprint(name, module) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provide 'percent' primary modifications
|
* Provide 'worst' primary modifications
|
||||||
* @param {Object} ship The ship for which to perform the modifications
|
* @param {Object} ship The ship for which to perform the modifications
|
||||||
* @param {Object} m The module for which to perform the modifications
|
* @param {Object} m The module for which to perform the modifications
|
||||||
* @param {Number} percent The percent to set values to of full.
|
|
||||||
*/
|
*/
|
||||||
export function setPercent(ship, m, percent) {
|
export function setWorst(ship, m) {
|
||||||
ship.clearModifications(m);
|
ship.clearModifications(m);
|
||||||
// Pick given value as multiplier
|
const features = m.blueprint.grades[m.blueprint.grade].features;
|
||||||
const mult = percent / 100;
|
for (const featureName in features) {
|
||||||
|
const value = features[featureName][0];
|
||||||
|
_setValue(ship, m, featureName, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provide 'best' primary modifications
|
||||||
|
* @param {Object} ship The ship for which to perform the modifications
|
||||||
|
* @param {Object} m The module for which to perform the modifications
|
||||||
|
*/
|
||||||
|
export function setBest(ship, m) {
|
||||||
|
ship.clearModifications(m);
|
||||||
|
const features = m.blueprint.grades[m.blueprint.grade].features;
|
||||||
|
for (const featureName in features) {
|
||||||
|
const value = features[featureName][1];
|
||||||
|
_setValue(ship, m, featureName, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provide 'extreme' primary modifications
|
||||||
|
* @param {Object} ship The ship for which to perform the modifications
|
||||||
|
* @param {Object} m The module for which to perform the modifications
|
||||||
|
*/
|
||||||
|
export function setExtreme(ship, m) {
|
||||||
|
ship.clearModifications(m);
|
||||||
|
const features = m.blueprint.grades[m.blueprint.grade].features;
|
||||||
|
for (const featureName in features) {
|
||||||
|
let value;
|
||||||
|
if (Modifications.modifications[featureName].higherbetter) {
|
||||||
|
// Higher is better, but is this making it better or worse?
|
||||||
|
if (features[featureName][0] < 0 || (features[featureName][0] === 0 && features[featureName][1] < 0)) {
|
||||||
|
value = features[featureName][0];
|
||||||
|
} else {
|
||||||
|
value = features[featureName][1];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Higher is worse, but is this making it better or worse?
|
||||||
|
if (features[featureName][0] < 0 || (features[featureName][0] === 0 && features[featureName][1] < 0)) {
|
||||||
|
value = features[featureName][1];
|
||||||
|
} else {
|
||||||
|
value = features[featureName][0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_setValue(ship, m, featureName, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provide 'random' primary modifications
|
||||||
|
* @param {Object} ship The ship for which to perform the modifications
|
||||||
|
* @param {Object} m The module for which to perform the modifications
|
||||||
|
*/
|
||||||
|
export function setRandom(ship, m) {
|
||||||
|
ship.clearModifications(m);
|
||||||
|
// Pick a single value for our randomness
|
||||||
|
const mult = Math.random();
|
||||||
const features = m.blueprint.grades[m.blueprint.grade].features;
|
const features = m.blueprint.grades[m.blueprint.grade].features;
|
||||||
for (const featureName in features) {
|
for (const featureName in features) {
|
||||||
let value;
|
let value;
|
||||||
@@ -346,16 +353,6 @@ export function setPercent(ship, m, percent) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Provide 'random' primary modifications
|
|
||||||
* @param {Object} ship The ship for which to perform the modifications
|
|
||||||
* @param {Object} m The module for which to perform the modifications
|
|
||||||
*/
|
|
||||||
export function setRandom(ship, m) {
|
|
||||||
// Pick a single value for our randomness
|
|
||||||
setPercent(ship, m, Math.random() * 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a modification feature value
|
* Set a modification feature value
|
||||||
* @param {Object} ship The ship for which to perform the modifications
|
* @param {Object} ship The ship for which to perform the modifications
|
||||||
@@ -372,60 +369,3 @@ function _setValue(ship, m, featureName, value) {
|
|||||||
ship.setModification(m, featureName, value);
|
ship.setModification(m, featureName, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Provide 'percent' primary query
|
|
||||||
* @param {Object} m The module for which to perform the query
|
|
||||||
* @returns {Number} percent The percentage indicator of current applied values.
|
|
||||||
*/
|
|
||||||
export function getPercent(m) {
|
|
||||||
let result = null;
|
|
||||||
const features = m.blueprint.grades[m.blueprint.grade].features;
|
|
||||||
for (const featureName in features) {
|
|
||||||
|
|
||||||
if (features[featureName][0] === features[featureName][1]) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let value = _getValue(m, featureName);
|
|
||||||
let mult;
|
|
||||||
if (Modifications.modifications[featureName].higherbetter) {
|
|
||||||
// Higher is better, but is this making it better or worse?
|
|
||||||
if (features[featureName][0] < 0 || (features[featureName][0] === 0 && features[featureName][1] < 0)) {
|
|
||||||
mult = Math.round((value - features[featureName][1]) / (features[featureName][0] - features[featureName][1]) * 100);
|
|
||||||
} else {
|
|
||||||
mult = Math.round((value - features[featureName][0]) / (features[featureName][1] - features[featureName][0]) * 100);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Higher is worse, but is this making it better or worse?
|
|
||||||
if (features[featureName][0] < 0 || (features[featureName][0] === 0 && features[featureName][1] < 0)) {
|
|
||||||
mult = Math.round((value - features[featureName][0]) / (features[featureName][1] - features[featureName][0]) * 100);
|
|
||||||
} else {
|
|
||||||
mult = Math.round((value - features[featureName][1]) / (features[featureName][0] - features[featureName][1]) * 100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result && result != mult) {
|
|
||||||
return null;
|
|
||||||
} else if (result != mult) {
|
|
||||||
result = mult;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Query a feature value
|
|
||||||
* @param {Object} m The module for which to perform the query
|
|
||||||
* @param {string} featureName The feature being queried
|
|
||||||
*/
|
|
||||||
function _getValue(m, featureName) {
|
|
||||||
if (Modifications.modifications[featureName].type == 'percentage') {
|
|
||||||
return m.getModValue(featureName, true) / 10000;
|
|
||||||
} else if (Modifications.modifications[featureName].type == 'numeric') {
|
|
||||||
return m.getModValue(featureName, true) / 100;
|
|
||||||
} else {
|
|
||||||
return m.getModValue(featureName, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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',
|
||||||
@@ -43,7 +43,7 @@ const SHIP_FD_NAME_TO_CORIOLIS_NAME = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Mapping from hardpoint class to name in companion API
|
// Mapping from hardpoint class to name in companion API
|
||||||
export const HARDPOINT_NUM_TO_CLASS = {
|
const HARDPOINT_NUM_TO_CLASS = {
|
||||||
0: 'Tiny',
|
0: 'Tiny',
|
||||||
1: 'Small',
|
1: 'Small',
|
||||||
2: 'Medium',
|
2: 'Medium',
|
||||||
@@ -51,7 +51,6 @@ export 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
|
||||||
@@ -106,7 +105,7 @@ function _moduleFromEdId(edId) {
|
|||||||
* @return {string} the Coriolis model of the ship
|
* @return {string} the Coriolis model of the ship
|
||||||
*/
|
*/
|
||||||
function _shipModelFromEDName(edName) {
|
function _shipModelFromEDName(edName) {
|
||||||
return SHIP_FD_NAME_TO_CORIOLIS_NAME[Object.keys(SHIP_FD_NAME_TO_CORIOLIS_NAME).find(elem => elem.toLowerCase() === edName.toLowerCase())];
|
return SHIP_FD_NAME_TO_CORIOLIS_NAME[edName];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -115,7 +114,7 @@ function _shipModelFromEDName(edName) {
|
|||||||
* @return {string} the Coriolis model of the ship
|
* @return {string} the Coriolis model of the ship
|
||||||
*/
|
*/
|
||||||
export function shipModelFromJson(json) {
|
export function shipModelFromJson(json) {
|
||||||
return _shipModelFromEDName(json.name || json.Ship);
|
return _shipModelFromEDName(json.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -148,15 +147,15 @@ export function shipFromJson(json) {
|
|||||||
|
|
||||||
// Add the bulkheads
|
// Add the bulkheads
|
||||||
const armourJson = json.modules.Armour.module;
|
const armourJson = json.modules.Armour.module;
|
||||||
if (armourJson.name.toLowerCase().endsWith('_armour_grade1')) {
|
if (armourJson.name.endsWith('_Armour_Grade1')) {
|
||||||
ship.useBulkhead(0, true);
|
ship.useBulkhead(0, true);
|
||||||
} else if (armourJson.name.toLowerCase().endsWith('_armour_grade2')) {
|
} else if (armourJson.name.endsWith('_Armour_Grade2')) {
|
||||||
ship.useBulkhead(1, true);
|
ship.useBulkhead(1, true);
|
||||||
} else if (armourJson.name.toLowerCase().endsWith('_armour_grade3')) {
|
} else if (armourJson.name.endsWith('_Armour_Grade3')) {
|
||||||
ship.useBulkhead(2, true);
|
ship.useBulkhead(2, true);
|
||||||
} else if (armourJson.name.toLowerCase().endsWith('_armour_mirrored')) {
|
} else if (armourJson.name.endsWith('_Armour_Mirrored')) {
|
||||||
ship.useBulkhead(3, true);
|
ship.useBulkhead(3, true);
|
||||||
} else if (armourJson.name.toLowerCase().endsWith('_armour_reactive')) {
|
} else if (armourJson.name.endsWith('_Armour_Reactive')) {
|
||||||
ship.useBulkhead(4, true);
|
ship.useBulkhead(4, true);
|
||||||
} else {
|
} else {
|
||||||
throw 'Unknown bulkheads "' + armourJson.name + '"';
|
throw 'Unknown bulkheads "' + armourJson.name + '"';
|
||||||
|
|||||||
@@ -1,292 +0,0 @@
|
|||||||
import Ship from '../shipyard/Ship'
|
|
||||||
import { HARDPOINT_NUM_TO_CLASS, shipModelFromJson } from './CompanionApiUtils'
|
|
||||||
import { Ships } from 'coriolis-data/dist'
|
|
||||||
import Module from '../shipyard/Module'
|
|
||||||
import { Modules } from 'coriolis-data/dist'
|
|
||||||
import { Modifications } from 'coriolis-data/dist'
|
|
||||||
import { getBlueprint } from './BlueprintFunctions'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Obtain a module given its FD Name
|
|
||||||
* @param {string} fdname the FD Name of the module
|
|
||||||
* @return {Module} the module
|
|
||||||
*/
|
|
||||||
function _moduleFromFdName (fdname) {
|
|
||||||
if (!fdname) return null
|
|
||||||
fdname = fdname.toLowerCase()
|
|
||||||
// Check standard modules
|
|
||||||
for (const grp in Modules.standard) {
|
|
||||||
if (Modules.standard.hasOwnProperty(grp)) {
|
|
||||||
for (const i in Modules.standard[grp]) {
|
|
||||||
if (Modules.standard[grp][i].symbol && Modules.standard[grp][i].symbol.toLowerCase() === fdname) {
|
|
||||||
// Found it
|
|
||||||
return new Module({template: Modules.standard[grp][i]})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check hardpoint modules
|
|
||||||
for (const grp in Modules.hardpoints) {
|
|
||||||
if (Modules.hardpoints.hasOwnProperty(grp)) {
|
|
||||||
for (const i in Modules.hardpoints[grp]) {
|
|
||||||
if (Modules.hardpoints[grp][i].symbol && Modules.hardpoints[grp][i].symbol.toLowerCase() === fdname) {
|
|
||||||
// Found it
|
|
||||||
return new Module({template: Modules.hardpoints[grp][i]})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check internal modules
|
|
||||||
for (const grp in Modules.internal) {
|
|
||||||
if (Modules.internal.hasOwnProperty(grp)) {
|
|
||||||
for (const i in Modules.internal[grp]) {
|
|
||||||
if (Modules.internal[grp][i].symbol && Modules.internal[grp][i].symbol.toLowerCase() === fdname) {
|
|
||||||
// Found it
|
|
||||||
return new Module({template: Modules.internal[grp][i]})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Not found
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Build a ship from the journal Loadout event JSON
|
|
||||||
* @param {object} json the Loadout event JSON
|
|
||||||
* @return {Ship} the built ship
|
|
||||||
*/
|
|
||||||
export function shipFromLoadoutJSON (json) {
|
|
||||||
// Start off building a basic ship
|
|
||||||
const shipModel = shipModelFromJson(json)
|
|
||||||
if (!shipModel) {
|
|
||||||
throw 'No such ship found: "' + json.Ship + '"'
|
|
||||||
}
|
|
||||||
const shipTemplate = Ships[shipModel]
|
|
||||||
|
|
||||||
let ship = new Ship(shipModel, shipTemplate.properties, shipTemplate.slots)
|
|
||||||
ship.buildWith(null)
|
|
||||||
// Initial Ship building, don't do engineering yet.
|
|
||||||
let opts = [];
|
|
||||||
|
|
||||||
for (const module of json.Modules) {
|
|
||||||
switch (module.Slot.toLowerCase()) {
|
|
||||||
// Cargo Hatch.
|
|
||||||
case 'cargohatch':
|
|
||||||
ship.cargoHatch.enabled = module.On
|
|
||||||
ship.cargoHatch.priority = module.Priority
|
|
||||||
break
|
|
||||||
// Add the bulkheads
|
|
||||||
case 'armour':
|
|
||||||
if (module.Item.toLowerCase().endsWith('_armour_grade1')) {
|
|
||||||
ship.useBulkhead(0, true)
|
|
||||||
} else if (module.Item.toLowerCase().endsWith('_armour_grade2')) {
|
|
||||||
ship.useBulkhead(1, true)
|
|
||||||
} else if (module.Item.toLowerCase().endsWith('_armour_grade3')) {
|
|
||||||
ship.useBulkhead(2, true)
|
|
||||||
} else if (module.Item.toLowerCase().endsWith('_armour_mirrored')) {
|
|
||||||
ship.useBulkhead(3, true)
|
|
||||||
} else if (module.Item.toLowerCase().endsWith('_armour_reactive')) {
|
|
||||||
ship.useBulkhead(4, true)
|
|
||||||
} else {
|
|
||||||
throw 'Unknown bulkheads "' + module.Item + '"'
|
|
||||||
}
|
|
||||||
ship.bulkheads.enabled = true
|
|
||||||
if (module.Engineering) _addModifications(ship.bulkheads.m, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level)
|
|
||||||
break
|
|
||||||
case 'powerplant':
|
|
||||||
const powerplant = _moduleFromFdName(module.Item)
|
|
||||||
ship.use(ship.standard[0], powerplant, true)
|
|
||||||
ship.standard[0].enabled = module.On
|
|
||||||
ship.standard[0].priority = module.Priority
|
|
||||||
if (module.Engineering) _addModifications(powerplant, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level)
|
|
||||||
break
|
|
||||||
case 'mainengines':
|
|
||||||
const thrusters = _moduleFromFdName(module.Item)
|
|
||||||
ship.use(ship.standard[1], thrusters, true)
|
|
||||||
ship.standard[1].enabled = module.On
|
|
||||||
ship.standard[1].priority = module.Priority
|
|
||||||
if (module.Engineering) _addModifications(thrusters, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level)
|
|
||||||
break
|
|
||||||
case 'frameshiftdrive':
|
|
||||||
const frameshiftdrive = _moduleFromFdName(module.Item)
|
|
||||||
ship.use(ship.standard[2], frameshiftdrive, true)
|
|
||||||
ship.standard[2].enabled = module.On
|
|
||||||
ship.standard[2].priority = module.Priority
|
|
||||||
if (module.Engineering) _addModifications(frameshiftdrive, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level)
|
|
||||||
break
|
|
||||||
case 'lifesupport':
|
|
||||||
const lifesupport = _moduleFromFdName(module.Item)
|
|
||||||
ship.use(ship.standard[3], lifesupport, true)
|
|
||||||
ship.standard[3].enabled = module.On === true
|
|
||||||
ship.standard[3].priority = module.Priority
|
|
||||||
if (module.Engineering) _addModifications(lifesupport, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level)
|
|
||||||
break
|
|
||||||
case 'powerdistributor':
|
|
||||||
const powerdistributor = _moduleFromFdName(module.Item)
|
|
||||||
ship.use(ship.standard[4], powerdistributor, true)
|
|
||||||
ship.standard[4].enabled = module.On
|
|
||||||
ship.standard[4].priority = module.Priority
|
|
||||||
if (module.Engineering) _addModifications(powerdistributor, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level)
|
|
||||||
break
|
|
||||||
case 'radar':
|
|
||||||
const sensors = _moduleFromFdName(module.Item)
|
|
||||||
ship.use(ship.standard[5], sensors, true)
|
|
||||||
ship.standard[5].enabled = module.On
|
|
||||||
ship.standard[5].priority = module.Priority
|
|
||||||
if (module.Engineering) _addModifications(sensors, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level)
|
|
||||||
break
|
|
||||||
case 'fueltank':
|
|
||||||
const fueltank = _moduleFromFdName(module.Item)
|
|
||||||
ship.use(ship.standard[6], fueltank, true)
|
|
||||||
ship.standard[6].enabled = true
|
|
||||||
ship.standard[6].priority = 0
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
for (const module of json.Modules) {
|
|
||||||
if (module.Slot.toLowerCase().search(/hardpoint/) !== -1) {
|
|
||||||
// Add hardpoints
|
|
||||||
let hardpoint;
|
|
||||||
let hardpointClassNum = -1
|
|
||||||
let hardpointSlotNum = -1
|
|
||||||
let hardpointArrayNum = 0
|
|
||||||
for (let i in shipTemplate.slots.hardpoints) {
|
|
||||||
if (shipTemplate.slots.hardpoints[i] === hardpointClassNum) {
|
|
||||||
// Another slot of the same class
|
|
||||||
hardpointSlotNum++
|
|
||||||
} else {
|
|
||||||
// The first slot of a new class
|
|
||||||
hardpointClassNum = shipTemplate.slots.hardpoints[i]
|
|
||||||
hardpointSlotNum = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now that we know what we're looking for, find it
|
|
||||||
const hardpointName = HARDPOINT_NUM_TO_CLASS[hardpointClassNum] + 'Hardpoint' + hardpointSlotNum
|
|
||||||
const hardpointSlot = json.Modules.find(elem => elem.Slot.toLowerCase() === hardpointName.toLowerCase())
|
|
||||||
if (!hardpointSlot) {
|
|
||||||
// This can happen with old imports that don't contain new hardpoints
|
|
||||||
} else if (!hardpointSlot) {
|
|
||||||
// No module
|
|
||||||
} else {
|
|
||||||
hardpoint = _moduleFromFdName(hardpointSlot.Item)
|
|
||||||
ship.use(ship.hardpoints[hardpointArrayNum], hardpoint, true)
|
|
||||||
ship.hardpoints[hardpointArrayNum].enabled = hardpointSlot.On
|
|
||||||
ship.hardpoints[hardpointArrayNum].priority = hardpointSlot.Priority
|
|
||||||
opts.push({coriolisMod: hardpoint, json: hardpointSlot});
|
|
||||||
}
|
|
||||||
hardpointArrayNum++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (module.Slot.toLowerCase().search(/slot\d/) !== -1) {
|
|
||||||
let internalSlotNum = 1
|
|
||||||
let militarySlotNum = 1
|
|
||||||
for (let i in shipTemplate.slots.internal) {
|
|
||||||
const isMilitary = isNaN(shipTemplate.slots.internal[i]) ? shipTemplate.slots.internal[i].name = 'military' : false
|
|
||||||
|
|
||||||
// The internal slot might be a standard or a military slot. Military slots have a different naming system
|
|
||||||
let internalSlot = null
|
|
||||||
if (isMilitary) {
|
|
||||||
const internalName = 'Military0' + militarySlotNum
|
|
||||||
internalSlot = json.Modules.find(elem => elem.Slot.toLowerCase() === internalName.toLowerCase())
|
|
||||||
militarySlotNum++
|
|
||||||
} else {
|
|
||||||
// Slot numbers are not contiguous so handle skips.
|
|
||||||
while (internalSlot === null && internalSlotNum < 99) {
|
|
||||||
// Slot sizes have no relationship to the actual size, either, so check all possibilities
|
|
||||||
for (let slotsize = 0; slotsize < 9; slotsize++) {
|
|
||||||
const internalName = 'Slot' + (internalSlotNum <= 9 ? '0' : '') + internalSlotNum + '_Size' + slotsize
|
|
||||||
if (json.Modules.find(elem => elem.Slot.toLowerCase() === internalName.toLowerCase())) {
|
|
||||||
internalSlot = json.Modules.find(elem => elem.Slot.toLowerCase() === internalName.toLowerCase());
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
internalSlotNum++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!internalSlot) {
|
|
||||||
// This can happen with old imports that don't contain new slots
|
|
||||||
} else if (!internalSlot) {
|
|
||||||
// No module
|
|
||||||
} else {
|
|
||||||
const internalJson = internalSlot
|
|
||||||
const internal = _moduleFromFdName(internalJson.Item)
|
|
||||||
ship.use(ship.internal[i], internal, true)
|
|
||||||
ship.internal[i].enabled = internalJson.On === true
|
|
||||||
ship.internal[i].priority = internalJson.Priority
|
|
||||||
opts.push({coriolisMod: internal, json: internalSlot});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const i of opts) {
|
|
||||||
if (i.json.Engineering) _addModifications(i.coriolisMod, i.json.Engineering.Modifiers, i.json.Engineering.BlueprintName, i.json.Engineering.Level, i.json.Engineering.ExperimentalEffect)
|
|
||||||
}
|
|
||||||
// We don't have any information on it so guess it's priority 5 and disabled
|
|
||||||
if (!ship.cargoHatch) {
|
|
||||||
ship.cargoHatch.enabled = false
|
|
||||||
ship.cargoHatch.priority = 4
|
|
||||||
}
|
|
||||||
console.log(ship)
|
|
||||||
|
|
||||||
// Now update the ship's codes before returning it
|
|
||||||
return ship.updatePowerPrioritesString().updatePowerEnabledString().updateModificationsString()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add the modifications for a module
|
|
||||||
* @param {Module} module the module
|
|
||||||
* @param {Object} modifiers the modifiers
|
|
||||||
* @param {Object} blueprint the blueprint of the modification
|
|
||||||
* @param {Object} grade the grade of the modification
|
|
||||||
* @param {Object} specialModifications special modification
|
|
||||||
*/
|
|
||||||
function _addModifications (module, modifiers, blueprint, grade, specialModifications) {
|
|
||||||
if (!modifiers) return
|
|
||||||
let special
|
|
||||||
if (specialModifications) {
|
|
||||||
special = Modifications.specials[specialModifications]
|
|
||||||
}
|
|
||||||
for (const i in modifiers) {
|
|
||||||
// Some special modifications
|
|
||||||
// Look up the modifiers to find what we need to do
|
|
||||||
const findMod = val => Object.keys(Modifications.modifierActions).find(elem => elem.toString().toLowerCase().replace(/(outfittingfieldtype_|persecond)/igm, '') === val.toString().toLowerCase().replace(/(outfittingfieldtype_|persecond)/igm, ''))
|
|
||||||
const modifierActions = Modifications.modifierActions[findMod(modifiers[i].Label)]
|
|
||||||
//TODO: Figure out how to scale this value.
|
|
||||||
if (!!modifiers[i].LessIsGood) {
|
|
||||||
|
|
||||||
}
|
|
||||||
let value = (modifiers[i].Value / modifiers[i].OriginalValue * 100 - 100) * 100;
|
|
||||||
if (value === Infinity) {
|
|
||||||
value = modifiers[i].Value * 100;
|
|
||||||
}
|
|
||||||
if (modifiers[i].Label.search('Resistance') >= 0) {
|
|
||||||
value = (modifiers[i].Value * 100) - (modifiers[i].OriginalValue * 100)
|
|
||||||
}
|
|
||||||
// Carry out the required changes
|
|
||||||
for (const action in modifierActions) {
|
|
||||||
if (isNaN(modifierActions[action])) {
|
|
||||||
module.setModValue(action, modifierActions[action])
|
|
||||||
} else {
|
|
||||||
module.setModValue(action, value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the blueprint definition, grade and special
|
|
||||||
if (blueprint) {
|
|
||||||
module.blueprint = getBlueprint(blueprint, module)
|
|
||||||
if (grade) {
|
|
||||||
module.blueprint.grade = Number(grade)
|
|
||||||
}
|
|
||||||
if (special) {
|
|
||||||
module.blueprint.special = special
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -55,12 +55,10 @@
|
|||||||
<!-- End Piwik Code -->
|
<!-- End Piwik Code -->
|
||||||
|
|
||||||
<!-- Bugsnag -->
|
<!-- Bugsnag -->
|
||||||
<script src="//d2wy8f7a9ursnm.cloudfront.net/v4/bugsnag.min.js"></script>
|
<script
|
||||||
<script src="//d2wy8f7a9ursnm.cloudfront.net/bugsnag-plugins/v1/bugsnag-react.min.js"></script>
|
src="//d2wy8f7a9ursnm.cloudfront.net/bugsnag-3.min.js"
|
||||||
<script>
|
data-apikey="2382691c622937f28f8fa82a1bfd797a"></script>
|
||||||
window.bugsnagClient = bugsnag('ba9fae819372850fb660755341fa6ef5', {appVersion: window.CORIOLIS_VERSION || undefined})
|
|
||||||
window.Bugsnag = window.bugsnagClient
|
|
||||||
</script>
|
|
||||||
</head>
|
</head>
|
||||||
<body style="background-color:#000;">
|
<body style="background-color:#000;">
|
||||||
<section id="coriolis"></section>
|
<section id="coriolis"></section>
|
||||||
|
|||||||
@@ -31,50 +31,6 @@ button {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.button-inline-menu {
|
|
||||||
white-space: nowrap;
|
|
||||||
line-height: 1.5em;
|
|
||||||
text-align: center;
|
|
||||||
margin: 0.5em 0;
|
|
||||||
padding-left: 5px;
|
|
||||||
border-top: 1px solid @primary-disabled;
|
|
||||||
border-bottom: 1px solid @primary-disabled;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
background: @primary-bg;
|
|
||||||
|
|
||||||
&.warning {
|
|
||||||
border-color: @warning-disabled;
|
|
||||||
color: @warning-disabled;
|
|
||||||
stroke: @warning-disabled;
|
|
||||||
|
|
||||||
.no-touch &:hover {
|
|
||||||
border-color: @warning;
|
|
||||||
color: @warning;
|
|
||||||
stroke: @warning;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.disabled, &.disabled:hover {
|
|
||||||
cursor: not-allowed;
|
|
||||||
border-color: @disabled;
|
|
||||||
color: @disabled;
|
|
||||||
stroke: @disabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
border-color: @secondary;
|
|
||||||
color: @secondary;
|
|
||||||
stroke: @secondary;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
border-color: @primary;
|
|
||||||
color: @primary;
|
|
||||||
stroke: @primary;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.button-lbl {
|
.button-lbl {
|
||||||
margin-left: 0.5em;
|
margin-left: 0.5em;
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,6 @@
|
|||||||
@secondary: #1FB0FF; // Light blue
|
@secondary: #1FB0FF; // Light blue
|
||||||
@warning: #FF3B00; // Dark Orange
|
@warning: #FF3B00; // Dark Orange
|
||||||
@disabled: #555; // Light grey
|
@disabled: #555; // Light grey
|
||||||
@success: #71a052; // Green
|
|
||||||
@purple: #800080; // Purple
|
|
||||||
@primary-disabled: darken(@primary, @disabledDarken);
|
@primary-disabled: darken(@primary, @disabledDarken);
|
||||||
@secondary-disabled: darken(@secondary, @disabledDarken);
|
@secondary-disabled: darken(@secondary, @disabledDarken);
|
||||||
@warning-disabled: darken(@warning, @disabledDarken);
|
@warning-disabled: darken(@warning, @disabledDarken);
|
||||||
|
|||||||
@@ -54,7 +54,6 @@ textarea {
|
|||||||
width:100%;
|
width:100%;
|
||||||
min-height: 10em;
|
min-height: 10em;
|
||||||
resize: vertical;
|
resize: vertical;
|
||||||
user-select: auto;
|
|
||||||
margin:2em 0;
|
margin:2em 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,29 +70,10 @@
|
|||||||
padding: 0.5em 0.2em;
|
padding: 0.5em 0.2em;
|
||||||
font-size: 0.9em;
|
font-size: 0.9em;
|
||||||
|
|
||||||
.summaryTable {
|
#summaryTable {
|
||||||
.user-select-none();
|
.user-select-none();
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
|
|
||||||
& > thead.blue {
|
|
||||||
background-color: @secondary;
|
|
||||||
border-left: 1px solid @primary-bg;
|
|
||||||
color: @primary-bg;
|
|
||||||
}
|
|
||||||
|
|
||||||
& > thead.green {
|
|
||||||
background-color: @success;
|
|
||||||
border-left: 1px solid @primary-bg;
|
|
||||||
color: @primary-bg;
|
|
||||||
}
|
|
||||||
|
|
||||||
& > thead.purple {
|
|
||||||
background-color: @purple;
|
|
||||||
border-left: 1px solid @primary-bg;
|
|
||||||
color: @primary-bg;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,30 +1,28 @@
|
|||||||
const path = require('path')
|
var path = require('path');
|
||||||
const exec = require('child_process').exec
|
var exec = require('child_process').exec;
|
||||||
const webpack = require('webpack')
|
var webpack = require('webpack');
|
||||||
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
var pkgJson = require('./package');
|
||||||
const ExtractTextPlugin = require('extract-text-webpack-plugin')
|
var HtmlWebpackPlugin = require("html-webpack-plugin");
|
||||||
const WebpackNotifierPlugin = require('webpack-notifier')
|
var ExtractTextPlugin = require("extract-text-webpack-plugin");
|
||||||
const pkgJson = require('./package')
|
|
||||||
|
|
||||||
function CopyDirPlugin(source, destination) {
|
function CopyDirPlugin(source, destination) {
|
||||||
this.source = source
|
this.source = source;
|
||||||
this.destination = destination
|
this.destination = destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyDirPlugin.prototype.apply = function(compiler) {
|
CopyDirPlugin.prototype.apply = function(compiler) {
|
||||||
compiler.plugin('done', () => {
|
compiler.plugin('done', function() {
|
||||||
console.log(compiler.outputPath, this.destination)
|
console.log(compiler.outputPath, this.destination);
|
||||||
exec('cp -r ' + this.source + ' ' + path.join(compiler.outputPath, this.destination))
|
exec('cp -r ' + this.source + ' ' + path.join(compiler.outputPath, this.destination));
|
||||||
})
|
}.bind(this));
|
||||||
}
|
};
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
devtool: 'source-map',
|
devtool: 'eval',
|
||||||
devServer: {
|
devServer: {
|
||||||
headers: {'Access-Control-Allow-Origin': '*'}
|
headers: { "Access-Control-Allow-Origin": "*" }
|
||||||
},
|
},
|
||||||
entry: {
|
entry: {
|
||||||
app: ['webpack-dev-server/client?http://0.0.0.0:3300', 'webpack/hot/only-dev-server', path.join(__dirname, 'src/app/index.js')],
|
app: [ 'webpack-dev-server/client?http://0.0.0.0:3300', 'webpack/hot/only-dev-server', path.join(__dirname, "src/app/index.js") ],
|
||||||
lib: ['d3', 'react', 'react-dom', 'classnames', 'fbemitter', 'lz-string']
|
lib: ['d3', 'react', 'react-dom', 'classnames', 'fbemitter', 'lz-string']
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
@@ -44,16 +42,15 @@ module.exports = {
|
|||||||
}),
|
}),
|
||||||
new HtmlWebpackPlugin({
|
new HtmlWebpackPlugin({
|
||||||
inject: false,
|
inject: false,
|
||||||
template: path.join(__dirname, 'src/index.ejs'),
|
template: path.join(__dirname, "src/index.ejs"),
|
||||||
version: pkgJson.version,
|
version: pkgJson.version,
|
||||||
gapiKey: process.env.CORIOLIS_GAPI_KEY || ''
|
gapiKey: process.env.CORIOLIS_GAPI_KEY || '',
|
||||||
}),
|
}),
|
||||||
new ExtractTextPlugin({
|
new ExtractTextPlugin({
|
||||||
filename: 'app.css',
|
filename: 'app.css',
|
||||||
disable: false,
|
disable: false,
|
||||||
allChunks: true
|
allChunks: true
|
||||||
}),
|
}),
|
||||||
new WebpackNotifierPlugin({alwaysNotify: true}),
|
|
||||||
new webpack.HotModuleReplacementPlugin(),
|
new webpack.HotModuleReplacementPlugin(),
|
||||||
new webpack.NoEmitOnErrorsPlugin()
|
new webpack.NoEmitOnErrorsPlugin()
|
||||||
],
|
],
|
||||||
@@ -69,4 +66,4 @@ module.exports = {
|
|||||||
{ test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=image/svg+xml' }
|
{ test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=image/svg+xml' }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|||||||
@@ -1,27 +1,24 @@
|
|||||||
const path = require('path')
|
var path = require('path');
|
||||||
const exec = require('child_process').exec
|
var exec = require('child_process').exec;
|
||||||
const webpack = require('webpack')
|
var webpack = require('webpack');
|
||||||
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
var pkgJson = require('./package');
|
||||||
const ExtractTextPlugin = require('extract-text-webpack-plugin')
|
var HtmlWebpackPlugin = require("html-webpack-plugin");
|
||||||
const AppCachePlugin = require('appcache-webpack-plugin')
|
var ExtractTextPlugin = require("extract-text-webpack-plugin");
|
||||||
const {BugsnagSourceMapUploaderPlugin} = require('webpack-bugsnag-plugins')
|
var AppCachePlugin = require('appcache-webpack-plugin');
|
||||||
const pkgJson = require('./package')
|
|
||||||
|
|
||||||
function CopyDirPlugin(source, destination) {
|
function CopyDirPlugin(source, destination) {
|
||||||
this.source = source
|
this.source = source;
|
||||||
this.destination = destination
|
this.destination = destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyDirPlugin.prototype.apply = function(compiler) {
|
CopyDirPlugin.prototype.apply = function(compiler) {
|
||||||
compiler.plugin('done', () => {
|
compiler.plugin('done', function() {
|
||||||
console.log(compiler.outputPath, this.destination)
|
console.log(compiler.outputPath, this.destination);
|
||||||
exec('cp -r ' + this.source + ' ' + path.join(compiler.outputPath, this.destination))
|
exec('cp -r ' + this.source + ' ' + path.join(compiler.outputPath, this.destination));
|
||||||
})
|
}.bind(this));
|
||||||
}
|
};
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
cache: true,
|
cache: true,
|
||||||
devtool: 'source-map',
|
|
||||||
entry: {
|
entry: {
|
||||||
app: ['babel-polyfill', path.resolve(__dirname, 'src/app/index')],
|
app: ['babel-polyfill', path.resolve(__dirname, 'src/app/index')],
|
||||||
lib: ['d3', 'react', 'react-dom', 'classnames', 'fbemitter', 'lz-string']
|
lib: ['d3', 'react', 'react-dom', 'classnames', 'fbemitter', 'lz-string']
|
||||||
@@ -37,8 +34,7 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
new webpack.optimize.UglifyJsPlugin({
|
new webpack.optimize.UglifyJsPlugin({
|
||||||
'screw-ie8': true,
|
'screw-ie8': true
|
||||||
sourceMap: true
|
|
||||||
}),
|
}),
|
||||||
//new webpack.optimize.CommonsChunkPlugin({
|
//new webpack.optimize.CommonsChunkPlugin({
|
||||||
// name: 'lib',
|
// name: 'lib',
|
||||||
@@ -57,7 +53,7 @@ module.exports = {
|
|||||||
removeScriptTypeAttributes: true,
|
removeScriptTypeAttributes: true,
|
||||||
removeStyleLinkTypeAttributes: true
|
removeStyleLinkTypeAttributes: true
|
||||||
},
|
},
|
||||||
template: path.join(__dirname, 'src/index.ejs'),
|
template: path.join(__dirname, "src/index.ejs"),
|
||||||
uaTracking: process.env.CORIOLIS_UA_TRACKING || '',
|
uaTracking: process.env.CORIOLIS_UA_TRACKING || '',
|
||||||
gapiKey: process.env.CORIOLIS_GAPI_KEY || '',
|
gapiKey: process.env.CORIOLIS_GAPI_KEY || '',
|
||||||
version: pkgJson.version
|
version: pkgJson.version
|
||||||
@@ -67,10 +63,6 @@ module.exports = {
|
|||||||
disable: false,
|
disable: false,
|
||||||
allChunks: true
|
allChunks: true
|
||||||
}),
|
}),
|
||||||
new BugsnagSourceMapUploaderPlugin({
|
|
||||||
apiKey: 'ba9fae819372850fb660755341fa6ef5',
|
|
||||||
appVersion: pkgJson.version
|
|
||||||
}),
|
|
||||||
new CopyDirPlugin(path.join(__dirname, 'src/schemas'), 'schemas'),
|
new CopyDirPlugin(path.join(__dirname, 'src/schemas'), 'schemas'),
|
||||||
new CopyDirPlugin(path.join(__dirname, 'src/images/logo/*'), ''),
|
new CopyDirPlugin(path.join(__dirname, 'src/images/logo/*'), ''),
|
||||||
new CopyDirPlugin(path.join(__dirname, 'src/.htaccess'), ''),
|
new CopyDirPlugin(path.join(__dirname, 'src/.htaccess'), ''),
|
||||||
@@ -93,4 +85,4 @@ module.exports = {
|
|||||||
{ test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=image/svg+xml' }
|
{ test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=image/svg+xml' }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user