mirror of
https://github.com/EDCD/coriolis.git
synced 2025-12-09 14:45:35 +00:00
Fix approximately a lot of lint issues
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
"jsx": true,
|
"jsx": true,
|
||||||
"classes": true,
|
"classes": true,
|
||||||
"modules": true
|
"modules": true
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
"env": {
|
"env": {
|
||||||
"browser": true,
|
"browser": true,
|
||||||
@@ -33,7 +33,6 @@
|
|||||||
"ClassDeclaration": true
|
"ClassDeclaration": true
|
||||||
}
|
}
|
||||||
}],
|
}],
|
||||||
"no-console": 2,
|
|
||||||
"brace-style": [2, "1tbs", { "allowSingleLine": true }],
|
"brace-style": [2, "1tbs", { "allowSingleLine": true }],
|
||||||
"comma-style": [2, "last"],
|
"comma-style": [2, "last"],
|
||||||
"indent": [2, 2, { "SwitchCase": 1, "VariableDeclarator": 2 }],
|
"indent": [2, 2, { "SwitchCase": 1, "VariableDeclarator": 2 }],
|
||||||
|
|||||||
@@ -93,8 +93,8 @@ 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: ');
|
console.info('Ship import data: ');
|
||||||
console.log(json);
|
console.info(json);
|
||||||
let ship;
|
let ship;
|
||||||
if (json && json.modules) {
|
if (json && json.modules) {
|
||||||
ship = CompanionApiUtils.shipFromJson(json);
|
ship = CompanionApiUtils.shipFromJson(json);
|
||||||
@@ -356,7 +356,7 @@ export default class Coriolis extends React.Component {
|
|||||||
<div className="right cap">
|
<div className="right cap">
|
||||||
<a href="https://github.com/EDCD/coriolis" target="_blank" title="Coriolis Github Project">{window.CORIOLIS_VERSION} - {window.CORIOLIS_DATE}</a>
|
<a href="https://github.com/EDCD/coriolis" target="_blank" title="Coriolis Github Project">{window.CORIOLIS_VERSION} - {window.CORIOLIS_DATE}</a>
|
||||||
<br/>
|
<br/>
|
||||||
<a href={"https://github.com/EDCD/coriolis/compare/edcd:develop@{" + window.CORIOLIS_DATE + "}...edcd:develop"} target="_blank" title={"Coriolis Commits since" + window.CORIOLIS_DATE}>Commits since last release ({window.CORIOLIS_DATE})</a>
|
<a href={'https://github.com/EDCD/coriolis/compare/edcd:develop@{' + window.CORIOLIS_DATE + '}...edcd:develop'} target="_blank" title={'Coriolis Commits since' + window.CORIOLIS_DATE}>Commits since last release ({window.CORIOLIS_DATE})</a>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
</div>;
|
</div>;
|
||||||
|
|||||||
@@ -222,7 +222,9 @@ export default class AvailableModulesMenu extends TranslatedComponent {
|
|||||||
* @param {function} onSelect Select/Mount callback
|
* @param {function} onSelect Select/Mount callback
|
||||||
* @param {string} grp Group name
|
* @param {string} grp Group name
|
||||||
* @param {Array} modules Available modules
|
* @param {Array} modules Available modules
|
||||||
* @return {React.Component} Available Module Group contents
|
* @return {*} Available Module Group contents
|
||||||
|
* @param {*} firstSlotId ID of the first slot
|
||||||
|
* @param {*} lastSlotId ID of the last slot
|
||||||
*/
|
*/
|
||||||
_buildGroup(translate, mountedModule, warningFunc, mass, onSelect, grp, modules, firstSlotId, lastSlotId) {
|
_buildGroup(translate, mountedModule, warningFunc, mass, onSelect, grp, modules, firstSlotId, lastSlotId) {
|
||||||
let prevClass = null, prevRating = null, prevName;
|
let prevClass = null, prevRating = null, prevName;
|
||||||
@@ -240,7 +242,7 @@ 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
|
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;
|
||||||
@@ -367,14 +369,13 @@ export default class AvailableModulesMenu extends TranslatedComponent {
|
|||||||
* @param {Function} select Select module callback
|
* @param {Function} select Select module callback
|
||||||
* @param {SyntheticEvent} event Event
|
* @param {SyntheticEvent} event Event
|
||||||
*/
|
*/
|
||||||
|
|
||||||
_keyDown(select, event) {
|
_keyDown(select, event) {
|
||||||
var className = event.currentTarget.attributes['class'].value;
|
let className = event.currentTarget.attributes['class'].value;
|
||||||
if (event.key == 'Enter' && className.indexOf('disabled') < 0 && className.indexOf('active') < 0) {
|
if (event.key == 'Enter' && className.indexOf('disabled') < 0 && className.indexOf('active') < 0) {
|
||||||
select();
|
select();
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
var elemId = event.currentTarget.attributes['data-id'].value;
|
let elemId = event.currentTarget.attributes['data-id'].value;
|
||||||
if (className.indexOf('disabled') < 0 && event.key == 'Tab') {
|
if (className.indexOf('disabled') < 0 && event.key == 'Tab') {
|
||||||
if (event.shiftKey && elemId == this.firstSlotId) {
|
if (event.shiftKey && elemId == this.firstSlotId) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
@@ -391,7 +392,8 @@ export default class AvailableModulesMenu extends TranslatedComponent {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Key Up
|
* Key Up
|
||||||
*
|
* @param {Function} select Select function
|
||||||
|
* @param {SyntheticEvent} event Event
|
||||||
*/
|
*/
|
||||||
_keyUp(select,event) {
|
_keyUp(select,event) {
|
||||||
// nothing here yet
|
// nothing here yet
|
||||||
@@ -463,11 +465,10 @@ export default class AvailableModulesMenu extends TranslatedComponent {
|
|||||||
this.slotItems[this.firstSlotId].focus();
|
this.slotItems[this.firstSlotId].focus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount() {
|
|
||||||
/**
|
/**
|
||||||
* Set focus to slot element ref (if we have one) after modules component unmounts
|
* Set focus to slot element ref (if we have one) after modules component unmounts
|
||||||
*/
|
*/
|
||||||
|
componentWillUnmount() {
|
||||||
if(this.props.slotDiv) {
|
if(this.props.slotDiv) {
|
||||||
this.props.slotDiv.focus();
|
this.props.slotDiv.focus();
|
||||||
}
|
}
|
||||||
@@ -487,7 +488,7 @@ export default class AvailableModulesMenu extends TranslatedComponent {
|
|||||||
* @return {React.Component} List
|
* @return {React.Component} List
|
||||||
*/
|
*/
|
||||||
render() {
|
render() {
|
||||||
console.log("Tracking focus? " + this.state.trackingFocus);
|
console.log('Tracking focus? ' + this.state.trackingFocus);
|
||||||
return (
|
return (
|
||||||
<div ref={node => this.node = node}
|
<div ref={node => this.node = node}
|
||||||
className={cn('select', this.props.className)}
|
className={cn('select', this.props.className)}
|
||||||
|
|||||||
@@ -505,8 +505,8 @@ export default class Header extends TranslatedComponent {
|
|||||||
return (
|
return (
|
||||||
<header>
|
<header>
|
||||||
{this.props.appCacheUpdate && <div id="app-update" onClick={() => window.location.reload() }>{translate('PHRASE_UPDATE_RDY')}</div>}
|
{this.props.appCacheUpdate && <div id="app-update" onClick={() => window.location.reload() }>{translate('PHRASE_UPDATE_RDY')}</div>}
|
||||||
{this.props.appCache ? <a className={"view-changes"} href={"https://github.com/EDCD/coriolis/compare/edcd:develop@{" + window.CORIOLIS_DATE + "}...edcd:develop"} target="_blank">
|
{this.props.appCache ? <a className={'view-changes'} href={'https://github.com/EDCD/coriolis/compare/edcd:develop@{' + window.CORIOLIS_DATE + '}...edcd:develop'} target="_blank">
|
||||||
{"View Release Changes"}
|
{'View Release Changes'}
|
||||||
</a> : null}
|
</a> : null}
|
||||||
<Link className='l' href='/' style={{ marginRight: '1em' }} title='Home'><CoriolisLogo className='icon xl' /></Link>
|
<Link className='l' href='/' style={{ marginRight: '1em' }} title='Home'><CoriolisLogo className='icon xl' /></Link>
|
||||||
|
|
||||||
|
|||||||
@@ -21,8 +21,6 @@ export default class InternalSlot extends Slot {
|
|||||||
* @param {Object} u Localized Units Map
|
* @param {Object} u Localized Units Map
|
||||||
* @return {React.Component} Slot contents
|
* @return {React.Component} Slot contents
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
_getSlotDetails(m, enabled, translate, formats, u) {
|
_getSlotDetails(m, enabled, translate, formats, u) {
|
||||||
if (m) {
|
if (m) {
|
||||||
let classRating = m.class + m.rating;
|
let classRating = m.class + m.rating;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import {
|
|||||||
getPercent,
|
getPercent,
|
||||||
setRandom,
|
setRandom,
|
||||||
specialToolTip
|
specialToolTip
|
||||||
} from '../utils/BlueprintFunctions'
|
} from '../utils/BlueprintFunctions';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Modifications menu
|
* Modifications menu
|
||||||
@@ -100,14 +100,11 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Key down - select module on Enter key, move to next/previous module on Tab/Shift-Tab, close on Esc
|
* Key down - select module on Enter key, move to next/previous module on Tab/Shift-Tab, close on Esc
|
||||||
* @param {Function} select Select module callback
|
* @param {Function} event Select module callback
|
||||||
* @param {SyntheticEvent} event Event
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
_keyDown(event) {
|
_keyDown(event) {
|
||||||
var className = null;
|
let className = null;
|
||||||
var elemId = null;
|
let elemId = null;
|
||||||
if (event.currentTarget.attributes['class']) className = event.currentTarget.attributes['class'].value;
|
if (event.currentTarget.attributes['class']) className = event.currentTarget.attributes['class'].value;
|
||||||
if (event.currentTarget.attributes['data-id']) elemId = event.currentTarget.attributes['data-id'].value;
|
if (event.currentTarget.attributes['data-id']) elemId = event.currentTarget.attributes['data-id'].value;
|
||||||
|
|
||||||
@@ -116,10 +113,9 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
if (elemId != null) {
|
if (elemId != null) {
|
||||||
this.modItems[elemId].click();
|
this.modItems[elemId].click();
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
event.currentTarget.click();
|
event.currentTarget.click();
|
||||||
}
|
}
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
if (event.key == 'Tab') {
|
if (event.key == 'Tab') {
|
||||||
// Shift-Tab
|
// Shift-Tab
|
||||||
@@ -129,12 +125,12 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
this.modItems[this.lastModId].focus();
|
this.modItems[this.lastModId].focus();
|
||||||
return;
|
return;
|
||||||
} else if (event.currentTarget.className.indexOf("button-inline-menu") >= 0 && event.currentTarget.previousElementSibling == null && this.lastNeId != null && this.modItems[this.lastNeId] != null) {
|
} else if (event.currentTarget.className.indexOf('button-inline-menu') >= 0 && event.currentTarget.previousElementSibling == null && this.lastNeId != null && this.modItems[this.lastNeId] != null) {
|
||||||
// shift-tab on first element in modifications menu. set focus to last number editor field if open
|
// shift-tab on first element in modifications menu. set focus to last number editor field if open
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
this.modItems[this.lastNeId].lastChild.focus();
|
this.modItems[this.lastNeId].lastChild.focus();
|
||||||
return;
|
return;
|
||||||
} else if (event.currentTarget.className.indexOf("button-inline-menu") >= 0 && event.currentTarget.previousElementSibling == null) {
|
} else if (event.currentTarget.className.indexOf('button-inline-menu') >= 0 && event.currentTarget.previousElementSibling == null) {
|
||||||
// shift-tab on button-inline-menu with no number editor
|
// shift-tab on button-inline-menu with no number editor
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.currentTarget.parentElement.lastElementChild.focus();
|
event.currentTarget.parentElement.lastElementChild.focus();
|
||||||
@@ -145,7 +141,7 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
this.modItems[this.firstModId].focus();
|
this.modItems[this.firstModId].focus();
|
||||||
return;
|
return;
|
||||||
} else if (event.currentTarget.className.indexOf("button-inline-menu") >= 0 && event.currentTarget.nextSibling == null && event.currentTarget.nodeName != "TD") {
|
} else if (event.currentTarget.className.indexOf('button-inline-menu') >= 0 && event.currentTarget.nextSibling == null && event.currentTarget.nodeName != 'TD') {
|
||||||
// Experimental menu
|
// Experimental menu
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.currentTarget.parentElement.firstElementChild.focus();
|
event.currentTarget.parentElement.firstElementChild.focus();
|
||||||
@@ -154,7 +150,6 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
this.modItems[this.firstBPLabel].focus();
|
this.modItems[this.firstBPLabel].focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -167,7 +162,6 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
* @return {Object} list: Array of React Components
|
* @return {Object} list: Array of React Components
|
||||||
*/
|
*/
|
||||||
_renderSpecials(props, context) {
|
_renderSpecials(props, context) {
|
||||||
|
|
||||||
const { m } = props;
|
const { m } = props;
|
||||||
const { language, tooltip, termtip } = context;
|
const { language, tooltip, termtip } = context;
|
||||||
const translate = language.translate;
|
const translate = language.translate;
|
||||||
@@ -200,7 +194,7 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log("_renderSpecials. specials: %O", specials);
|
console.log('_renderSpecials. specials: %O', specials);
|
||||||
return specials;
|
return specials;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,7 +213,7 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
modifications.push(<Modification key={ key } ship={ ship } m={ m } name={ modName } value={ m.getModValue(modName) / 100 || 0 } onChange={ onChange } onKeyDown={ this._keyDown } modItems={ this.modItems } handleModChange = {this._handleModChange} />);
|
modifications.push(<Modification key={ key } ship={ ship } m={ m } name={ modName } value={ m.getModValue(modName) / 100 || 0 } onChange={ onChange } onKeyDown={ this._keyDown } modItems={ this.modItems } handleModChange = {this._handleModChange} />);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log("_renderModifications. modItems: %O", this.modItems);
|
console.log('_renderModifications. modItems: %O', this.modItems);
|
||||||
return modifications;
|
return modifications;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -324,8 +318,6 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
this._handleModChange(true);
|
this._handleModChange(true);
|
||||||
|
|
||||||
this.props.onChange();
|
this.props.onChange();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -340,16 +332,16 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* set mod did change boolean
|
* set mod did change boolean
|
||||||
|
* @param {Boolean} b Did the mod value change?
|
||||||
*/
|
*/
|
||||||
_handleModChange(b) {
|
_handleModChange(b) {
|
||||||
this.modValDidChange = b;
|
this.modValDidChange = b;
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
/**
|
/**
|
||||||
* Set focus on first element in modifications menu
|
* Set focus on first element in modifications menu
|
||||||
* after it first mounts
|
* after it first mounts
|
||||||
*/
|
*/
|
||||||
|
componentDidMount() {
|
||||||
let firstEleCn = this.modItems['modMainDiv'].children.length > 0 ? this.modItems['modMainDiv'].children[0].className : null;
|
let firstEleCn = this.modItems['modMainDiv'].children.length > 0 ? this.modItems['modMainDiv'].children[0].className : null;
|
||||||
if (firstEleCn.indexOf('select-group cap') >= 0) {
|
if (firstEleCn.indexOf('select-group cap') >= 0) {
|
||||||
this.modItems['modMainDiv'].children[1].firstElementChild.focus();
|
this.modItems['modMainDiv'].children[1].firstElementChild.focus();
|
||||||
@@ -357,13 +349,12 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
this.modItems['modMainDiv'].firstElementChild.focus();
|
this.modItems['modMainDiv'].firstElementChild.focus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate() {
|
|
||||||
/**
|
/**
|
||||||
* Set focus on first element in modifications menu
|
* Set focus on first element in modifications menu
|
||||||
* if component updates, unless update is due to value change
|
* if component updates, unless update is due to value change
|
||||||
* in a modification
|
* in a modification
|
||||||
*/
|
*/
|
||||||
|
componentDidUpdate() {
|
||||||
if (!this.modValDidChange) {
|
if (!this.modValDidChange) {
|
||||||
if (this.modItems['modMainDiv'].children.length > 0) {
|
if (this.modItems['modMainDiv'].children.length > 0) {
|
||||||
let firstEleCn = this.modItems['modMainDiv'].children[0].className;
|
let firstEleCn = this.modItems['modMainDiv'].children[0].className;
|
||||||
@@ -376,9 +367,11 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
} else {
|
} else {
|
||||||
this._handleModChange(false);// Need to reset if component update due to value change
|
this._handleModChange(false);// Need to reset if component update due to value change
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set focus to the modification menu icon
|
||||||
|
*/
|
||||||
componentWillUnmount() {
|
componentWillUnmount() {
|
||||||
if (this.props.modButton) {
|
if (this.props.modButton) {
|
||||||
this.props.modButton.focus();// set focus to the modification menu icon after mod menu is unmounted.
|
this.props.modButton.focus();// set focus to the modification menu icon after mod menu is unmounted.
|
||||||
@@ -440,7 +433,7 @@ export default class ModificationsMenu extends TranslatedComponent {
|
|||||||
const showReset = !blueprintMenuOpened && (!specialMenuOpened || !specials.length) && haveBlueprint;
|
const showReset = !blueprintMenuOpened && (!specialMenuOpened || !specials.length) && haveBlueprint;
|
||||||
const showMods = !blueprintMenuOpened && (!specialMenuOpened || !specials.length) && haveBlueprint;
|
const showMods = !blueprintMenuOpened && (!specialMenuOpened || !specials.length) && haveBlueprint;
|
||||||
if (haveBlueprint) {
|
if (haveBlueprint) {
|
||||||
this.firstBPLabel = blueprintLabel
|
this.firstBPLabel = blueprintLabel;
|
||||||
} else {
|
} else {
|
||||||
this.firstBPLabel = 'selectBP';
|
this.firstBPLabel = 'selectBP';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,12 +18,16 @@ export default class ShipSummaryTable extends TranslatedComponent {
|
|||||||
pips: PropTypes.object.isRequired
|
pips: PropTypes.object.isRequired
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ShipSummaryTable constructor
|
||||||
|
* @param {Object} props The props
|
||||||
|
*/
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props)
|
super(props);
|
||||||
this.didContextChange = this.didContextChange.bind(this);
|
this.didContextChange = this.didContextChange.bind(this);
|
||||||
this.state = {
|
this.state = {
|
||||||
shieldColour: 'blue'
|
shieldColour: 'blue'
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -56,7 +60,7 @@ export default class ShipSummaryTable extends TranslatedComponent {
|
|||||||
}
|
}
|
||||||
this.state = {
|
this.state = {
|
||||||
shieldColour
|
shieldColour
|
||||||
}
|
};
|
||||||
return <div id='summary'>
|
return <div id='summary'>
|
||||||
<table className={'summaryTable'}>
|
<table className={'summaryTable'}>
|
||||||
<thead>
|
<thead>
|
||||||
|
|||||||
@@ -51,7 +51,6 @@ export default class Slider extends React.Component {
|
|||||||
* @param {SyntheticEvent} event Event
|
* @param {SyntheticEvent} event Event
|
||||||
*/
|
*/
|
||||||
_down(event) {
|
_down(event) {
|
||||||
|
|
||||||
let rect = event.currentTarget.getBoundingClientRect();
|
let rect = event.currentTarget.getBoundingClientRect();
|
||||||
this.left = rect.left;
|
this.left = rect.left;
|
||||||
this.width = rect.width;
|
this.width = rect.width;
|
||||||
@@ -100,22 +99,21 @@ export default class Slider extends React.Component {
|
|||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Key down handler
|
* Key down handler
|
||||||
* increment slider position by +/- 1 when right/left arrow key is pressed or held
|
* increment slider position by +/- 1 when right/left arrow key is pressed or held
|
||||||
* @param {Event} event
|
* @param {Event} event The key down event.
|
||||||
*/
|
*/
|
||||||
_keydown(event) {
|
_keydown(event) {
|
||||||
|
let newVal;
|
||||||
switch (event.key) {
|
switch (event.key) {
|
||||||
case 'ArrowRight':
|
case 'ArrowRight':
|
||||||
var newVal = this.props.percent*this.props.max + 1;
|
newVal = this.props.percent * this.props.max + 1;
|
||||||
if (newVal <= this.props.max) this.props.onChange(newVal / this.props.max);
|
if (newVal <= this.props.max) this.props.onChange(newVal / this.props.max);
|
||||||
return;
|
return;
|
||||||
case 'ArrowLeft':
|
case 'ArrowLeft':
|
||||||
var newVal = this.props.percent*this.props.max - 1;
|
newVal = this.props.percent * this.props.max - 1;
|
||||||
if (newVal >= 0) this.props.onChange(newVal / this.props.max);
|
if (newVal >= 0) this.props.onChange(newVal / this.props.max);
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
@@ -132,6 +130,10 @@ export default class Slider extends React.Component {
|
|||||||
this.touchStartTimer = setTimeout(() => this.sliderInputBox._setDisplay('block'), 1500);
|
this.touchStartTimer = setTimeout(() => this.sliderInputBox._setDisplay('block'), 1500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Touch end handler
|
||||||
|
* @param {Event} event DOM Event
|
||||||
|
*/
|
||||||
_touchend(event) {
|
_touchend(event) {
|
||||||
this.sliderInputBox.sliderVal.focus();
|
this.sliderInputBox.sliderVal.focus();
|
||||||
clearTimeout(this.touchStartTimer);
|
clearTimeout(this.touchStartTimer);
|
||||||
@@ -181,7 +183,6 @@ export default class Slider extends React.Component {
|
|||||||
*/
|
*/
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this._updateDimensions();
|
this._updateDimensions();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -250,6 +251,11 @@ export default class Slider extends React.Component {
|
|||||||
percent: PropTypes.number.isRequired,// value of slider
|
percent: PropTypes.number.isRequired,// value of slider
|
||||||
scale: PropTypes.number
|
scale: PropTypes.number
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for TextInputBox
|
||||||
|
* @param {Object} props The props
|
||||||
|
*/
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
this._handleFocus = this._handleFocus.bind(this);
|
this._handleFocus = this._handleFocus.bind(this);
|
||||||
@@ -260,18 +266,28 @@ export default class Slider extends React.Component {
|
|||||||
this.state = this._getInitialState();
|
this.state = this._getInitialState();
|
||||||
this.percent = this.props.percent;
|
this.percent = this.props.percent;
|
||||||
this.max = this.props.max;
|
this.max = this.props.max;
|
||||||
this.state.inputValue = this.percent * this.max;
|
this.setState({ inputValue: this.percent * this.max });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Slider willrecieveprops
|
||||||
|
* @param {Object} nextProps The next props
|
||||||
|
* @param {Object} nextState The next state
|
||||||
|
*/
|
||||||
componentWillReceiveProps(nextProps, nextState) {
|
componentWillReceiveProps(nextProps, nextState) {
|
||||||
var nextValue = nextProps.percent * nextProps.max;
|
let nextValue = nextProps.percent * nextProps.max;
|
||||||
// See https://stackoverflow.com/questions/32414308/updating-state-on-props-change-in-react-form
|
// See https://stackoverflow.com/questions/32414308/updating-state-on-props-change-in-react-form
|
||||||
if (nextValue !== this.state.inputValue && nextValue <= nextProps.max) {
|
if (nextValue !== this.state.inputValue && nextValue <= nextProps.max) {
|
||||||
this.setState({ inputValue: nextValue });
|
this.setState({ inputValue: nextValue });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
componentDidUpdate(prevProps, prevState) {
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Slider Component did update
|
||||||
|
* @param {Object} prevProps The prev props
|
||||||
|
* @param {Object} prevState The prev state
|
||||||
|
*/
|
||||||
|
componentDidUpdate(prevProps, prevState) {
|
||||||
if (prevState.divStyle.display == 'none' && this.state.divStyle.display == 'block') {
|
if (prevState.divStyle.display == 'none' && this.state.divStyle.display == 'block') {
|
||||||
this.enterTimer = setTimeout(() => this.sliderVal.focus(), 10);
|
this.enterTimer = setTimeout(() => this.sliderVal.focus(), 10);
|
||||||
}
|
}
|
||||||
@@ -284,9 +300,13 @@ export default class Slider extends React.Component {
|
|||||||
if (this.state.inputValue != prevState.inputValue && prevProps.max == this.props.max) {
|
if (this.state.inputValue != prevState.inputValue && prevProps.max == this.props.max) {
|
||||||
this.props.onChange(this.state.inputValue / this.props.max);
|
this.props.onChange(this.state.inputValue / this.props.max);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the initial state.
|
||||||
|
* @returns {{divStyle: {display: string}, inputStyle: {width: string}, labelStyle: {marginLeft: string}, maxLength: number, size: number, min: number, tabIndex: number, type: string, readOnly: boolean}} Initial state.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
_getInitialState() {
|
_getInitialState() {
|
||||||
return {
|
return {
|
||||||
divStyle: { display:'none' },
|
divStyle: { display:'none' },
|
||||||
@@ -298,35 +318,56 @@ export default class Slider extends React.Component {
|
|||||||
tabIndex:-1,
|
tabIndex:-1,
|
||||||
type:'number',
|
type:'number',
|
||||||
readOnly: true
|
readOnly: true
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set display style
|
||||||
|
* @param {string} val The display CSS code.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
_setDisplay(val) {
|
_setDisplay(val) {
|
||||||
this.setState({
|
this.setState({
|
||||||
divStyle: { display:val }
|
divStyle: { display:val }
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Focus handler
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
_handleFocus() {
|
_handleFocus() {
|
||||||
this.setState({
|
this.setState({
|
||||||
inputValue:this._getValue()
|
inputValue:this._getValue()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles blurring
|
||||||
|
*/
|
||||||
_handleBlur() {
|
_handleBlur() {
|
||||||
this._setDisplay('none');
|
this._setDisplay('none');
|
||||||
if (this.state.inputValue !== '') {
|
if (this.state.inputValue !== '') {
|
||||||
this.props.onChange(this.state.inputValue / this.props.max);
|
this.props.onChange(this.state.inputValue / this.props.max);
|
||||||
} else {
|
} else {
|
||||||
this.state.inputValue = this.props.percent * this.props.max;
|
this.setState({ inputValue: this.props.percent * this.props.max });
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get inputValue
|
||||||
|
* @returns {number|Number|*} inputValue
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
_getValue() {
|
_getValue() {
|
||||||
return this.state.inputValue;
|
return this.state.inputValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle changes
|
||||||
|
* @param {Event} event DOM Event
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
_handleChange(event) {
|
_handleChange(event) {
|
||||||
if (event.target.value < 0) {
|
if (event.target.value < 0) {
|
||||||
this.setState({ inputValue: 0 });
|
this.setState({ inputValue: 0 });
|
||||||
@@ -350,12 +391,15 @@ export default class Slider extends React.Component {
|
|||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JSX Render handler
|
||||||
|
* @returns {*} Slider
|
||||||
|
*/
|
||||||
render() {
|
render() {
|
||||||
let { axisUnit, onChange, percent, scale } = this.props;
|
let { axisUnit, onChange, percent, scale } = this.props;
|
||||||
return <div style={this.state.divStyle}><input style={this.state.inputStyle} value={this._getValue()} min={this.state.min} max={this.props.max} onChange={this._handleChange} onKeyUp={this._keyup} tabIndex={this.state.tabIndex} maxLength={this.state.maxLength} size={this.state.size} onBlur={() => {this._handleBlur()}} onFocus={() => {this._handleFocus()}} type={this.state.type} ref={(ip) => this.sliderVal = ip}/><text className="primary upp" style={this.state.labelStyle}>{this.props.axisUnit}</text></div>;
|
return <div style={this.state.divStyle}><input style={this.state.inputStyle} value={this._getValue()} min={this.state.min} max={this.props.max} onChange={this._handleChange} onKeyUp={this._keyup} tabIndex={this.state.tabIndex} maxLength={this.state.maxLength} size={this.state.size} onBlur={() => {this._handleBlur();}} onFocus={() => {this._handleFocus();}} type={this.state.type} ref={(ip) => this.sliderVal = ip}/><text className="primary upp" style={this.state.labelStyle}>{this.props.axisUnit}</text></div>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -86,10 +86,10 @@ export default class Slot extends TranslatedComponent {
|
|||||||
_keyDown(event) {
|
_keyDown(event) {
|
||||||
if (event.key == 'Enter') {
|
if (event.key == 'Enter') {
|
||||||
if(event.target.className == 'r') {
|
if(event.target.className == 'r') {
|
||||||
console.log("Slot: Enter key pressed on mod icon");
|
console.log('Slot: Enter key pressed on mod icon');
|
||||||
this._toggleModifications();
|
this._toggleModifications();
|
||||||
} else {
|
} else {
|
||||||
console.log("Slot: Enter key pressed on: %O", event.target);
|
console.log('Slot: Enter key pressed on: %O', event.target);
|
||||||
}
|
}
|
||||||
this.props.onOpen(event);
|
this.props.onOpen(event);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,11 @@ export default class StandardSlot extends TranslatedComponent {
|
|||||||
this.slotDiv = null;
|
this.slotDiv = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fired on key down
|
||||||
|
* @param {KeyboardEvent} event The keydown event
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
_keyDown(event) {
|
_keyDown(event) {
|
||||||
if (event.key == 'Enter') {
|
if (event.key == 'Enter') {
|
||||||
if(event.target.className == 'r') {
|
if(event.target.className == 'r') {
|
||||||
@@ -151,7 +156,6 @@ export default class StandardSlot extends TranslatedComponent {
|
|||||||
* Toggle the modifications flag when selecting the modifications icon
|
* Toggle the modifications flag when selecting the modifications icon
|
||||||
*/
|
*/
|
||||||
_toggleModifications() {
|
_toggleModifications() {
|
||||||
|
|
||||||
this._modificationsSelected = !this._modificationsSelected;
|
this._modificationsSelected = !this._modificationsSelected;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -554,10 +554,16 @@ export default class OutfittingPage extends Page {
|
|||||||
const shipSummaryMarker = `${ship.name}${_sStr}${_iStr}${_hStr}${_pStr}${_mStr}${ship.ladenMass}${cargo}${fuel}`;
|
const shipSummaryMarker = `${ship.name}${_sStr}${_iStr}${_hStr}${_pStr}${_mStr}${ship.ladenMass}${cargo}${fuel}`;
|
||||||
|
|
||||||
const requirements = Ships[ship.id].requirements;
|
const requirements = Ships[ship.id].requirements;
|
||||||
var requirementElements = [];
|
let requirementElements = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render the requirements for a ship / etc
|
||||||
|
* @param {string} className Class names
|
||||||
|
* @param {string} textKey The key for translating
|
||||||
|
* @param {String} tooltipTextKey Tooltip key
|
||||||
|
*/
|
||||||
function renderRequirement(className, textKey, tooltipTextKey) {
|
function renderRequirement(className, textKey, tooltipTextKey) {
|
||||||
requirementElements.push(<div key={textKey} className={className} onMouseEnter={termtip.bind(null, tooltipTextKey)} onMouseLeave={hide}><a href={textKey.startsWith("empire") ? 'http://elite-dangerous.wikia.com/wiki/Empire/Ranks' : 'http://elite-dangerous.wikia.com/wiki/Federation/Ranks'} target="_blank" rel="noopener">{translate(textKey)}</a></div>);
|
requirementElements.push(<div key={textKey} className={className} onMouseEnter={termtip.bind(null, tooltipTextKey)} onMouseLeave={hide}><a href={textKey.startsWith('empire') ? 'http://elite-dangerous.wikia.com/wiki/Empire/Ranks' : 'http://elite-dangerous.wikia.com/wiki/Federation/Ranks'} target="_blank" rel="noopener">{translate(textKey)}</a></div>);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (requirements) {
|
if (requirements) {
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ export function totalJumpRange(mass, fsd, fuel) {
|
|||||||
* @param {number} baseShield Base Shield strength MJ for ship
|
* @param {number} baseShield Base Shield strength MJ for ship
|
||||||
* @param {object} sg The shield generator used
|
* @param {object} sg The shield generator used
|
||||||
* @param {number} multiplier Shield multiplier for ship (1 + shield boosters if any)
|
* @param {number} multiplier Shield multiplier for ship (1 + shield boosters if any)
|
||||||
|
* @param {Object} ship The ship object
|
||||||
* @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, ship) {
|
||||||
|
|||||||
@@ -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,50 +31,50 @@ 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
|
let bstCount = 2;
|
||||||
let sg = ship.getAvailableModules().lightestShieldGenerator(ship.hullMass)
|
let sg = ship.getAvailableModules().lightestShieldGenerator(ship.hullMass);
|
||||||
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[1], ModuleUtils.standard(1, ship.standard[1].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[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
|
.use(ship.standard[5], ModuleUtils.standard(5, ship.standard[5].maxClass + 'D')); // D Sensors
|
||||||
|
|
||||||
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));
|
||||||
shieldInternals.some(function(slot) {
|
shieldInternals.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
|
||||||
const shield = ModuleUtils.findInternal('sg', slot.maxClass, 'A')
|
const shield = ModuleUtils.findInternal('sg', slot.maxClass, 'A');
|
||||||
if (shield && shield.maxmass > ship.hullMass) {
|
if (shield && shield.maxmass > ship.hullMass) {
|
||||||
ship.use(slot, shield)
|
ship.use(slot, shield);
|
||||||
ship.setSlotEnabled(slot, true)
|
ship.setSlotEnabled(slot, true);
|
||||||
usedSlots.push(slot)
|
usedSlots.push(slot);
|
||||||
return true
|
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) {
|
for (let s of ship.hardpoints) {
|
||||||
if (s.maxClass == 0 && bstCount) { // Mount up to 2 boosters
|
if (s.maxClass == 0 && bstCount) { // Mount up to 2 boosters
|
||||||
ship.use(s, ModuleUtils.hardpoints('04'))
|
ship.use(s, ModuleUtils.hardpoints('04'));
|
||||||
bstCount--
|
bstCount--;
|
||||||
} else {
|
} else {
|
||||||
ship.use(s, null)
|
ship.use(s, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ship.useLightestStandard(standardOpts);
|
// ship.useLightestStandard(standardOpts);
|
||||||
@@ -91,121 +91,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 +214,100 @@ 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
|
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 +315,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 +338,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]);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import { Modifications } from 'coriolis-data/dist';
|
|||||||
* @param {Object} blueprint The blueprint at the required grade
|
* @param {Object} blueprint The blueprint at the required grade
|
||||||
* @param {string} grp The group of the module
|
* @param {string} grp The group of the module
|
||||||
* @param {Object} m The module to compare with
|
* @param {Object} m The module to compare with
|
||||||
* @param specialName
|
* @param {string} specialName The name of the special
|
||||||
* @returns {Object} The react components
|
* @returns {Object} The react components
|
||||||
*/
|
*/
|
||||||
export function specialToolTip(translate, blueprint, grp, m, specialName) {
|
export function specialToolTip(translate, blueprint, grp, m, specialName) {
|
||||||
@@ -47,7 +47,6 @@ export function specialToolTip(translate, blueprint, grp, m, specialName) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,7 +288,7 @@ 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 findMod = val => Object.keys(Modifications.blueprints).find(elem => elem.toString().toLowerCase().search(val.toString().toLowerCase().replace(/(OutfittingFieldType_|persecond)/igm, '')) >= 0);
|
||||||
const found = Modifications.blueprints[findMod(name)];
|
const found = Modifications.blueprints[findMod(name)];
|
||||||
if (!found || !found.fdname) {
|
if (!found || !found.fdname) {
|
||||||
return {};
|
return {};
|
||||||
@@ -382,7 +381,6 @@ export function getPercent(m) {
|
|||||||
let result = null;
|
let result = null;
|
||||||
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) {
|
||||||
|
|
||||||
if (features[featureName][0] === features[featureName][1]) {
|
if (features[featureName][0] === features[featureName][1]) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -419,6 +417,7 @@ export function getPercent(m) {
|
|||||||
* Query a feature value
|
* Query a feature value
|
||||||
* @param {Object} m The module for which to perform the query
|
* @param {Object} m The module for which to perform the query
|
||||||
* @param {string} featureName The feature being queried
|
* @param {string} featureName The feature being queried
|
||||||
|
* @returns {number} The value of the modification as a %
|
||||||
*/
|
*/
|
||||||
function _getValue(m, featureName) {
|
function _getValue(m, featureName) {
|
||||||
if (Modifications.modifications[featureName].type == 'percentage') {
|
if (Modifications.modifications[featureName].type == 'percentage') {
|
||||||
|
|||||||
@@ -318,7 +318,7 @@ function _addModifications(module, modifiers, blueprint, grade, specialModificat
|
|||||||
if (!modifiers) return;
|
if (!modifiers) return;
|
||||||
let special;
|
let special;
|
||||||
if (specialModifications) {
|
if (specialModifications) {
|
||||||
special = Modifications.specials[Object.keys(specialModifications)[0]]
|
special = Modifications.specials[Object.keys(specialModifications)[0]];
|
||||||
}
|
}
|
||||||
for (const i in modifiers) {
|
for (const i in modifiers) {
|
||||||
// Some special modifications
|
// Some special modifications
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import Ship from '../shipyard/Ship'
|
import Ship from '../shipyard/Ship';
|
||||||
import { HARDPOINT_NUM_TO_CLASS, shipModelFromJson } from './CompanionApiUtils'
|
import { HARDPOINT_NUM_TO_CLASS, shipModelFromJson } from './CompanionApiUtils';
|
||||||
import { Ships } from 'coriolis-data/dist'
|
import { Ships } from 'coriolis-data/dist';
|
||||||
import Module from '../shipyard/Module'
|
import Module from '../shipyard/Module';
|
||||||
import { Modules } from 'coriolis-data/dist'
|
import { Modules } from 'coriolis-data/dist';
|
||||||
import { Modifications } from 'coriolis-data/dist'
|
import { Modifications } from 'coriolis-data/dist';
|
||||||
import { getBlueprint } from './BlueprintFunctions'
|
import { getBlueprint } from './BlueprintFunctions';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Obtain a module given its FD Name
|
* Obtain a module given its FD Name
|
||||||
@@ -12,15 +12,15 @@ import { getBlueprint } from './BlueprintFunctions'
|
|||||||
* @return {Module} the module
|
* @return {Module} the module
|
||||||
*/
|
*/
|
||||||
function _moduleFromFdName(fdname) {
|
function _moduleFromFdName(fdname) {
|
||||||
if (!fdname) return null
|
if (!fdname) return null;
|
||||||
fdname = fdname.toLowerCase()
|
fdname = fdname.toLowerCase();
|
||||||
// Check standard modules
|
// Check standard modules
|
||||||
for (const grp in Modules.standard) {
|
for (const grp in Modules.standard) {
|
||||||
if (Modules.standard.hasOwnProperty(grp)) {
|
if (Modules.standard.hasOwnProperty(grp)) {
|
||||||
for (const i in Modules.standard[grp]) {
|
for (const i in Modules.standard[grp]) {
|
||||||
if (Modules.standard[grp][i].symbol && Modules.standard[grp][i].symbol.toLowerCase() === fdname) {
|
if (Modules.standard[grp][i].symbol && Modules.standard[grp][i].symbol.toLowerCase() === fdname) {
|
||||||
// Found it
|
// Found it
|
||||||
return new Module({template: Modules.standard[grp][i]})
|
return new Module({ template: Modules.standard[grp][i] });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -32,7 +32,7 @@ function _moduleFromFdName (fdname) {
|
|||||||
for (const i in Modules.hardpoints[grp]) {
|
for (const i in Modules.hardpoints[grp]) {
|
||||||
if (Modules.hardpoints[grp][i].symbol && Modules.hardpoints[grp][i].symbol.toLowerCase() === fdname) {
|
if (Modules.hardpoints[grp][i].symbol && Modules.hardpoints[grp][i].symbol.toLowerCase() === fdname) {
|
||||||
// Found it
|
// Found it
|
||||||
return new Module({template: Modules.hardpoints[grp][i]})
|
return new Module({ template: Modules.hardpoints[grp][i] });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -44,14 +44,14 @@ function _moduleFromFdName (fdname) {
|
|||||||
for (const i in Modules.internal[grp]) {
|
for (const i in Modules.internal[grp]) {
|
||||||
if (Modules.internal[grp][i].symbol && Modules.internal[grp][i].symbol.toLowerCase() === fdname) {
|
if (Modules.internal[grp][i].symbol && Modules.internal[grp][i].symbol.toLowerCase() === fdname) {
|
||||||
// Found it
|
// Found it
|
||||||
return new Module({template: Modules.internal[grp][i]})
|
return new Module({ template: Modules.internal[grp][i] });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Not found
|
// Not found
|
||||||
return null
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -61,14 +61,14 @@ function _moduleFromFdName (fdname) {
|
|||||||
*/
|
*/
|
||||||
export function shipFromLoadoutJSON(json) {
|
export function shipFromLoadoutJSON(json) {
|
||||||
// Start off building a basic ship
|
// Start off building a basic ship
|
||||||
const shipModel = shipModelFromJson(json)
|
const shipModel = shipModelFromJson(json);
|
||||||
if (!shipModel) {
|
if (!shipModel) {
|
||||||
throw 'No such ship found: "' + json.Ship + '"'
|
throw 'No such ship found: "' + json.Ship + '"';
|
||||||
}
|
}
|
||||||
const shipTemplate = Ships[shipModel]
|
const shipTemplate = Ships[shipModel];
|
||||||
|
|
||||||
let ship = new Ship(shipModel, shipTemplate.properties, shipTemplate.slots)
|
let ship = new Ship(shipModel, shipTemplate.properties, shipTemplate.slots);
|
||||||
ship.buildWith(null)
|
ship.buildWith(null);
|
||||||
// Initial Ship building, don't do engineering yet.
|
// Initial Ship building, don't do engineering yet.
|
||||||
let opts = [];
|
let opts = [];
|
||||||
|
|
||||||
@@ -76,135 +76,135 @@ export function shipFromLoadoutJSON (json) {
|
|||||||
switch (module.Slot.toLowerCase()) {
|
switch (module.Slot.toLowerCase()) {
|
||||||
// Cargo Hatch.
|
// Cargo Hatch.
|
||||||
case 'cargohatch':
|
case 'cargohatch':
|
||||||
ship.cargoHatch.enabled = module.On
|
ship.cargoHatch.enabled = module.On;
|
||||||
ship.cargoHatch.priority = module.Priority
|
ship.cargoHatch.priority = module.Priority;
|
||||||
break
|
break;
|
||||||
// Add the bulkheads
|
// Add the bulkheads
|
||||||
case 'armour':
|
case 'armour':
|
||||||
if (module.Item.toLowerCase().endsWith('_armour_grade1')) {
|
if (module.Item.toLowerCase().endsWith('_armour_grade1')) {
|
||||||
ship.useBulkhead(0, true)
|
ship.useBulkhead(0, true);
|
||||||
} else if (module.Item.toLowerCase().endsWith('_armour_grade2')) {
|
} else if (module.Item.toLowerCase().endsWith('_armour_grade2')) {
|
||||||
ship.useBulkhead(1, true)
|
ship.useBulkhead(1, true);
|
||||||
} else if (module.Item.toLowerCase().endsWith('_armour_grade3')) {
|
} else if (module.Item.toLowerCase().endsWith('_armour_grade3')) {
|
||||||
ship.useBulkhead(2, true)
|
ship.useBulkhead(2, true);
|
||||||
} else if (module.Item.toLowerCase().endsWith('_armour_mirrored')) {
|
} else if (module.Item.toLowerCase().endsWith('_armour_mirrored')) {
|
||||||
ship.useBulkhead(3, true)
|
ship.useBulkhead(3, true);
|
||||||
} else if (module.Item.toLowerCase().endsWith('_armour_reactive')) {
|
} else if (module.Item.toLowerCase().endsWith('_armour_reactive')) {
|
||||||
ship.useBulkhead(4, true)
|
ship.useBulkhead(4, true);
|
||||||
} else {
|
} else {
|
||||||
throw 'Unknown bulkheads "' + module.Item + '"'
|
throw 'Unknown bulkheads "' + module.Item + '"';
|
||||||
}
|
}
|
||||||
ship.bulkheads.enabled = true
|
ship.bulkheads.enabled = true;
|
||||||
if (module.Engineering) _addModifications(ship.bulkheads.m, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect)
|
if (module.Engineering) _addModifications(ship.bulkheads.m, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect);
|
||||||
break
|
break;
|
||||||
case 'powerplant':
|
case 'powerplant':
|
||||||
const powerplant = _moduleFromFdName(module.Item)
|
const powerplant = _moduleFromFdName(module.Item);
|
||||||
ship.use(ship.standard[0], powerplant, true)
|
ship.use(ship.standard[0], powerplant, true);
|
||||||
ship.standard[0].enabled = module.On
|
ship.standard[0].enabled = module.On;
|
||||||
ship.standard[0].priority = module.Priority
|
ship.standard[0].priority = module.Priority;
|
||||||
if (module.Engineering) _addModifications(powerplant, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect)
|
if (module.Engineering) _addModifications(powerplant, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect);
|
||||||
break
|
break;
|
||||||
case 'mainengines':
|
case 'mainengines':
|
||||||
const thrusters = _moduleFromFdName(module.Item)
|
const thrusters = _moduleFromFdName(module.Item);
|
||||||
ship.use(ship.standard[1], thrusters, true)
|
ship.use(ship.standard[1], thrusters, true);
|
||||||
ship.standard[1].enabled = module.On
|
ship.standard[1].enabled = module.On;
|
||||||
ship.standard[1].priority = module.Priority
|
ship.standard[1].priority = module.Priority;
|
||||||
if (module.Engineering) _addModifications(thrusters, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect)
|
if (module.Engineering) _addModifications(thrusters, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect);
|
||||||
break
|
break;
|
||||||
case 'frameshiftdrive':
|
case 'frameshiftdrive':
|
||||||
const frameshiftdrive = _moduleFromFdName(module.Item)
|
const frameshiftdrive = _moduleFromFdName(module.Item);
|
||||||
ship.use(ship.standard[2], frameshiftdrive, true)
|
ship.use(ship.standard[2], frameshiftdrive, true);
|
||||||
ship.standard[2].enabled = module.On
|
ship.standard[2].enabled = module.On;
|
||||||
ship.standard[2].priority = module.Priority
|
ship.standard[2].priority = module.Priority;
|
||||||
if (module.Engineering) _addModifications(frameshiftdrive, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect)
|
if (module.Engineering) _addModifications(frameshiftdrive, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect);
|
||||||
break
|
break;
|
||||||
case 'lifesupport':
|
case 'lifesupport':
|
||||||
const lifesupport = _moduleFromFdName(module.Item)
|
const lifesupport = _moduleFromFdName(module.Item);
|
||||||
ship.use(ship.standard[3], lifesupport, true)
|
ship.use(ship.standard[3], lifesupport, true);
|
||||||
ship.standard[3].enabled = module.On === true
|
ship.standard[3].enabled = module.On === true;
|
||||||
ship.standard[3].priority = module.Priority
|
ship.standard[3].priority = module.Priority;
|
||||||
if (module.Engineering) _addModifications(lifesupport, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect)
|
if (module.Engineering) _addModifications(lifesupport, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect);
|
||||||
break
|
break;
|
||||||
case 'powerdistributor':
|
case 'powerdistributor':
|
||||||
const powerdistributor = _moduleFromFdName(module.Item)
|
const powerdistributor = _moduleFromFdName(module.Item);
|
||||||
ship.use(ship.standard[4], powerdistributor, true)
|
ship.use(ship.standard[4], powerdistributor, true);
|
||||||
ship.standard[4].enabled = module.On
|
ship.standard[4].enabled = module.On;
|
||||||
ship.standard[4].priority = module.Priority
|
ship.standard[4].priority = module.Priority;
|
||||||
if (module.Engineering) _addModifications(powerdistributor, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect)
|
if (module.Engineering) _addModifications(powerdistributor, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect);
|
||||||
break
|
break;
|
||||||
case 'radar':
|
case 'radar':
|
||||||
const sensors = _moduleFromFdName(module.Item)
|
const sensors = _moduleFromFdName(module.Item);
|
||||||
ship.use(ship.standard[5], sensors, true)
|
ship.use(ship.standard[5], sensors, true);
|
||||||
ship.standard[5].enabled = module.On
|
ship.standard[5].enabled = module.On;
|
||||||
ship.standard[5].priority = module.Priority
|
ship.standard[5].priority = module.Priority;
|
||||||
if (module.Engineering) _addModifications(sensors, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect)
|
if (module.Engineering) _addModifications(sensors, module.Engineering.Modifiers, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect);
|
||||||
break
|
break;
|
||||||
case 'fueltank':
|
case 'fueltank':
|
||||||
const fueltank = _moduleFromFdName(module.Item)
|
const fueltank = _moduleFromFdName(module.Item);
|
||||||
ship.use(ship.standard[6], fueltank, true)
|
ship.use(ship.standard[6], fueltank, true);
|
||||||
ship.standard[6].enabled = true
|
ship.standard[6].enabled = true;
|
||||||
ship.standard[6].priority = 0
|
ship.standard[6].priority = 0;
|
||||||
break
|
break;
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
for (const module of json.Modules) {
|
for (const module of json.Modules) {
|
||||||
if (module.Slot.toLowerCase().search(/hardpoint/) !== -1) {
|
if (module.Slot.toLowerCase().search(/hardpoint/) !== -1) {
|
||||||
// Add hardpoints
|
// Add hardpoints
|
||||||
let hardpoint;
|
let hardpoint;
|
||||||
let hardpointClassNum = -1
|
let hardpointClassNum = -1;
|
||||||
let hardpointSlotNum = -1
|
let hardpointSlotNum = -1;
|
||||||
let hardpointArrayNum = 0
|
let hardpointArrayNum = 0;
|
||||||
for (let i in shipTemplate.slots.hardpoints) {
|
for (let i in shipTemplate.slots.hardpoints) {
|
||||||
if (shipTemplate.slots.hardpoints[i] === hardpointClassNum) {
|
if (shipTemplate.slots.hardpoints[i] === hardpointClassNum) {
|
||||||
// Another slot of the same class
|
// Another slot of the same class
|
||||||
hardpointSlotNum++
|
hardpointSlotNum++;
|
||||||
} else {
|
} else {
|
||||||
// The first slot of a new class
|
// The first slot of a new class
|
||||||
hardpointClassNum = shipTemplate.slots.hardpoints[i]
|
hardpointClassNum = shipTemplate.slots.hardpoints[i];
|
||||||
hardpointSlotNum = 1
|
hardpointSlotNum = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now that we know what we're looking for, find it
|
// Now that we know what we're looking for, find it
|
||||||
const hardpointName = HARDPOINT_NUM_TO_CLASS[hardpointClassNum] + 'Hardpoint' + hardpointSlotNum
|
const hardpointName = HARDPOINT_NUM_TO_CLASS[hardpointClassNum] + 'Hardpoint' + hardpointSlotNum;
|
||||||
const hardpointSlot = json.Modules.find(elem => elem.Slot.toLowerCase() === hardpointName.toLowerCase())
|
const hardpointSlot = json.Modules.find(elem => elem.Slot.toLowerCase() === hardpointName.toLowerCase());
|
||||||
if (!hardpointSlot) {
|
if (!hardpointSlot) {
|
||||||
// This can happen with old imports that don't contain new hardpoints
|
// This can happen with old imports that don't contain new hardpoints
|
||||||
} else if (!hardpointSlot) {
|
} else if (!hardpointSlot) {
|
||||||
// No module
|
// No module
|
||||||
} else {
|
} else {
|
||||||
hardpoint = _moduleFromFdName(hardpointSlot.Item)
|
hardpoint = _moduleFromFdName(hardpointSlot.Item);
|
||||||
ship.use(ship.hardpoints[hardpointArrayNum], hardpoint, true)
|
ship.use(ship.hardpoints[hardpointArrayNum], hardpoint, true);
|
||||||
ship.hardpoints[hardpointArrayNum].enabled = hardpointSlot.On
|
ship.hardpoints[hardpointArrayNum].enabled = hardpointSlot.On;
|
||||||
ship.hardpoints[hardpointArrayNum].priority = hardpointSlot.Priority
|
ship.hardpoints[hardpointArrayNum].priority = hardpointSlot.Priority;
|
||||||
opts.push({ coriolisMod: hardpoint, json: hardpointSlot });
|
opts.push({ coriolisMod: hardpoint, json: hardpointSlot });
|
||||||
}
|
}
|
||||||
hardpointArrayNum++
|
hardpointArrayNum++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (module.Slot.toLowerCase().search(/slot\d/) !== -1) {
|
if (module.Slot.toLowerCase().search(/slot\d/) !== -1) {
|
||||||
let internalSlotNum = 1
|
let internalSlotNum = 1;
|
||||||
let militarySlotNum = 1
|
let militarySlotNum = 1;
|
||||||
for (let i in shipTemplate.slots.internal) {
|
for (let i in shipTemplate.slots.internal) {
|
||||||
const isMilitary = isNaN(shipTemplate.slots.internal[i]) ? shipTemplate.slots.internal[i].name = 'military' : false
|
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
|
// The internal slot might be a standard or a military slot. Military slots have a different naming system
|
||||||
let internalSlot = null
|
let internalSlot = null;
|
||||||
if (isMilitary) {
|
if (isMilitary) {
|
||||||
const internalName = 'Military0' + militarySlotNum
|
const internalName = 'Military0' + militarySlotNum;
|
||||||
internalSlot = json.Modules.find(elem => elem.Slot.toLowerCase() === internalName.toLowerCase())
|
internalSlot = json.Modules.find(elem => elem.Slot.toLowerCase() === internalName.toLowerCase());
|
||||||
militarySlotNum++
|
militarySlotNum++;
|
||||||
} else {
|
} else {
|
||||||
// Slot numbers are not contiguous so handle skips.
|
// Slot numbers are not contiguous so handle skips.
|
||||||
while (internalSlot === null && internalSlotNum < 99) {
|
while (internalSlot === null && internalSlotNum < 99) {
|
||||||
// Slot sizes have no relationship to the actual size, either, so check all possibilities
|
// Slot sizes have no relationship to the actual size, either, so check all possibilities
|
||||||
for (let slotsize = 0; slotsize < 9; slotsize++) {
|
for (let slotsize = 0; slotsize < 9; slotsize++) {
|
||||||
const internalName = 'Slot' + (internalSlotNum <= 9 ? '0' : '') + internalSlotNum + '_Size' + slotsize
|
const internalName = 'Slot' + (internalSlotNum <= 9 ? '0' : '') + internalSlotNum + '_Size' + slotsize;
|
||||||
if (json.Modules.find(elem => elem.Slot.toLowerCase() === internalName.toLowerCase())) {
|
if (json.Modules.find(elem => elem.Slot.toLowerCase() === internalName.toLowerCase())) {
|
||||||
internalSlot = json.Modules.find(elem => elem.Slot.toLowerCase() === internalName.toLowerCase());
|
internalSlot = json.Modules.find(elem => elem.Slot.toLowerCase() === internalName.toLowerCase());
|
||||||
break
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
internalSlotNum++
|
internalSlotNum++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,11 +213,11 @@ export function shipFromLoadoutJSON (json) {
|
|||||||
} else if (!internalSlot) {
|
} else if (!internalSlot) {
|
||||||
// No module
|
// No module
|
||||||
} else {
|
} else {
|
||||||
const internalJson = internalSlot
|
const internalJson = internalSlot;
|
||||||
const internal = _moduleFromFdName(internalJson.Item)
|
const internal = _moduleFromFdName(internalJson.Item);
|
||||||
ship.use(ship.internal[i], internal, true)
|
ship.use(ship.internal[i], internal, true);
|
||||||
ship.internal[i].enabled = internalJson.On === true
|
ship.internal[i].enabled = internalJson.On === true;
|
||||||
ship.internal[i].priority = internalJson.Priority
|
ship.internal[i].priority = internalJson.Priority;
|
||||||
opts.push({ coriolisMod: internal, json: internalSlot });
|
opts.push({ coriolisMod: internal, json: internalSlot });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -226,17 +226,16 @@ export function shipFromLoadoutJSON (json) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (const i of opts) {
|
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)
|
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
|
// We don't have any information on it so guess it's priority 5 and disabled
|
||||||
if (!ship.cargoHatch) {
|
if (!ship.cargoHatch) {
|
||||||
ship.cargoHatch.enabled = false
|
ship.cargoHatch.enabled = false;
|
||||||
ship.cargoHatch.priority = 4
|
ship.cargoHatch.priority = 4;
|
||||||
}
|
}
|
||||||
console.log(ship)
|
|
||||||
|
|
||||||
// Now update the ship's codes before returning it
|
// Now update the ship's codes before returning it
|
||||||
return ship.updatePowerPrioritesString().updatePowerEnabledString().updateModificationsString()
|
return ship.updatePowerPrioritesString().updatePowerEnabledString().updateModificationsString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -248,16 +247,16 @@ export function shipFromLoadoutJSON (json) {
|
|||||||
* @param {Object} specialModifications special modification
|
* @param {Object} specialModifications special modification
|
||||||
*/
|
*/
|
||||||
function _addModifications(module, modifiers, blueprint, grade, specialModifications) {
|
function _addModifications(module, modifiers, blueprint, grade, specialModifications) {
|
||||||
if (!modifiers) return
|
if (!modifiers) return;
|
||||||
let special
|
let special;
|
||||||
if (specialModifications) {
|
if (specialModifications) {
|
||||||
special = Modifications.specials[specialModifications]
|
special = Modifications.specials[specialModifications];
|
||||||
}
|
}
|
||||||
for (const i in modifiers) {
|
for (const i in modifiers) {
|
||||||
// Some special modifications
|
// Some special modifications
|
||||||
// Look up the modifiers to find what we need to do
|
// 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 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)]
|
const modifierActions = Modifications.modifierActions[findMod(modifiers[i].Label)];
|
||||||
// TODO: Figure out how to scale this value.
|
// TODO: Figure out how to scale this value.
|
||||||
if (!!modifiers[i].LessIsGood) {
|
if (!!modifiers[i].LessIsGood) {
|
||||||
|
|
||||||
@@ -267,26 +266,26 @@ function _addModifications (module, modifiers, blueprint, grade, specialModifica
|
|||||||
value = modifiers[i].Value * 100;
|
value = modifiers[i].Value * 100;
|
||||||
}
|
}
|
||||||
if (modifiers[i].Label.search('Resistance') >= 0) {
|
if (modifiers[i].Label.search('Resistance') >= 0) {
|
||||||
value = (modifiers[i].Value * 100) - (modifiers[i].OriginalValue * 100)
|
value = (modifiers[i].Value * 100) - (modifiers[i].OriginalValue * 100);
|
||||||
}
|
}
|
||||||
// Carry out the required changes
|
// Carry out the required changes
|
||||||
for (const action in modifierActions) {
|
for (const action in modifierActions) {
|
||||||
if (isNaN(modifierActions[action])) {
|
if (isNaN(modifierActions[action])) {
|
||||||
module.setModValue(action, modifierActions[action])
|
module.setModValue(action, modifierActions[action]);
|
||||||
} else {
|
} else {
|
||||||
module.setModValue(action, value)
|
module.setModValue(action, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the blueprint definition, grade and special
|
// Add the blueprint definition, grade and special
|
||||||
if (blueprint) {
|
if (blueprint) {
|
||||||
module.blueprint = getBlueprint(blueprint, module)
|
module.blueprint = getBlueprint(blueprint, module);
|
||||||
if (grade) {
|
if (grade) {
|
||||||
module.blueprint.grade = Number(grade)
|
module.blueprint.grade = Number(grade);
|
||||||
}
|
}
|
||||||
if (special) {
|
if (special) {
|
||||||
module.blueprint.special = special
|
module.blueprint.special = special;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user