mirror of
https://github.com/EDCD/coriolis.git
synced 2025-12-09 22:55:35 +00:00
Merge Coriolis beta to live - beta.coriolis.io content to deploy on coriolis.io (#14)
* Update pt.json - Brazilian Portuguese translations (#752) * Update pt.json Update Brazilian Portuguese translations: - Updated Modules - Engineering & Experimental Effect - Corrections * Update Portuguese Brazilian Fixed Tab/Spaces indentation * Updated PT-BR translation with Planetary Approach Suite * Adds valid module checking to all types of modules on import * Adds the Advanced MC's, AX MC's, AX MR's and Nanite Torpedo * Changes as per comments on the PR * Fix changed files issue (#3) * Copied de.js contents to new file de-fix.js * Copied de.js contents back from de-fix.js * Copied contents of ko.js to ko-fix.js * Copied ko.js contents back from ko-fix.js * Copied contents from BlueprintFunctions.js to BlueprintFunctions-fix.js * Copied contents back from BlueprintFunctions-fix.js to BlueprintFunctions.js * Copied contents of LineChart.jsx to LineChart-fix.jsx * Copied contents back from LineChart-fix.jsx to LineChart.jsx * Copied contents of PieChart.jsx to PieChart-fix.jsx * Copied contents back from PieChart-fix.jsx to PieChart.jsx * Copied contents from Slider.jsx to Slider-fix.jsx * Copied contents back from Slider-fix.jsx to Slider.jsx * Copied contents from VerticalBarChart.jsx to VerticalBarChart-fix.jsx * Copied contents back from VerticalBarChart-fix.jsx to VerticalBarChart.jsx * Deleting 'fix' files * Adding workflow for autodeploy * Improving workflow * Changed deployment ordering * Changing to clone single branch for deployment, not the whole repo * Adds the Advanced MC's, AX MC's, AX MR's and Nanite Torpedo (#4) * Issue 754 imports need to be more graceful (#5) * Adds valid module checking to all types of modules on import * Changes as per comments on the PR * Added 'special' field to certain modules to allow for clearer appearance in search results that they are the special type of module. Updated English descriptions of Advanced Modules and Special Modules * Update PT-BR translations Added translated strings for coriolis-data PRs 106 & 107 * Fixed 'Missing Module' category showing up in Optional Selection drop-down and fixed 'Missing Power Plant', 'Missing Power Distributor' and 'Missing Frameshift Drive' showing up in the Selection drop-downs for those module slots. * Fixing bug introduced by the previous PR for ISSUE_764. The previous fix introduced a bug which caused Armour Selection to error, due to Armour modules being completely different to other modules of any other type * Modified export to EDOMH/EDEngineer page to be less 'bodged', allow EDOMH button to be clickable without checking for EDEngineer API (If they have EDOMH, they probably don't have EDEngineer...) and added a workaround for Coriolis sending bogus data for bulkheads. * Fixed autodeploy to do latest coriolis-data dist. Fixed sendToEDOMH function to only send the blueprint at the selected grade, not each grade up to that grade. * Issue 703 edomh integration (#7) * Adds valid module checking to all types of modules on import * Adds the Advanced MC's, AX MC's, AX MR's and Nanite Torpedo * Changes as per comments on the PR * Modified export to EDOMH/EDEngineer page to be less 'bodged', allow EDOMH button to be clickable without checking for EDEngineer API (If they have EDOMH, they probably don't have EDEngineer...) and added a workaround for Coriolis sending bogus data for bulkheads. --------- Co-authored-by: David Sangrey <davidsangrey@gmail.com> Co-authored-by: Felix Linker <linkerfelix@gmail.com> * Fixed miscalculation of mats and got rid of unhelpful 'rolls' table, as the mats are calculated for the whole build and some blueprints may not be all the way up to g5. * Removed console.log lines which were only needed for testing. * Adding in buildname to EDOMH Export * Issue 703 edomh integration (#8) * Adds valid module checking to all types of modules on import * Adds the Advanced MC's, AX MC's, AX MR's and Nanite Torpedo * Changes as per comments on the PR * Modified export to EDOMH/EDEngineer page to be less 'bodged', allow EDOMH button to be clickable without checking for EDEngineer API (If they have EDOMH, they probably don't have EDEngineer...) and added a workaround for Coriolis sending bogus data for bulkheads. * Fixed autodeploy to do latest coriolis-data dist. Fixed sendToEDOMH function to only send the blueprint at the selected grade, not each grade up to that grade. --------- Co-authored-by: David Sangrey <davidsangrey@gmail.com> Co-authored-by: Felix Linker <linkerfelix@gmail.com> * Issue 703 edomh integration (#9) * Adds valid module checking to all types of modules on import * Adds the Advanced MC's, AX MC's, AX MR's and Nanite Torpedo * Changes as per comments on the PR * Modified export to EDOMH/EDEngineer page to be less 'bodged', allow EDOMH button to be clickable without checking for EDEngineer API (If they have EDOMH, they probably don't have EDEngineer...) and added a workaround for Coriolis sending bogus data for bulkheads. * Fixed autodeploy to do latest coriolis-data dist. Fixed sendToEDOMH function to only send the blueprint at the selected grade, not each grade up to that grade. * Fixed miscalculation of mats and got rid of unhelpful 'rolls' table, as the mats are calculated for the whole build and some blueprints may not be all the way up to g5. --------- Co-authored-by: David Sangrey <davidsangrey@gmail.com> Co-authored-by: Felix Linker <linkerfelix@gmail.com> * Issue 703 edomh integration (#10) * Adds valid module checking to all types of modules on import * Adds the Advanced MC's, AX MC's, AX MR's and Nanite Torpedo * Changes as per comments on the PR * Modified export to EDOMH/EDEngineer page to be less 'bodged', allow EDOMH button to be clickable without checking for EDEngineer API (If they have EDOMH, they probably don't have EDEngineer...) and added a workaround for Coriolis sending bogus data for bulkheads. * Fixed autodeploy to do latest coriolis-data dist. Fixed sendToEDOMH function to only send the blueprint at the selected grade, not each grade up to that grade. * Fixed miscalculation of mats and got rid of unhelpful 'rolls' table, as the mats are calculated for the whole build and some blueprints may not be all the way up to g5. * Removed console.log lines which were only needed for testing. --------- Co-authored-by: David Sangrey <davidsangrey@gmail.com> Co-authored-by: Felix Linker <linkerfelix@gmail.com> * Issue 764 unknown modules are selectable (#11) * Adds valid module checking to all types of modules on import * Adds the Advanced MC's, AX MC's, AX MR's and Nanite Torpedo * Changes as per comments on the PR * Fixed 'Missing Module' category showing up in Optional Selection drop-down and fixed 'Missing Power Plant', 'Missing Power Distributor' and 'Missing Frameshift Drive' showing up in the Selection drop-downs for those module slots. --------- Co-authored-by: David Sangrey <davidsangrey@gmail.com> Co-authored-by: Felix Linker <linkerfelix@gmail.com> * Adding tag to manual dispatch of workflow * Adding fix for broken Armour Module Selection * Fixed issue with special blueprint item not being correctly jsonified for export to EDOMH * Removing Autodeploy from this branch, it was merged in by github * Removing debugging console.log entries that are no longer needed for EDOMH fix * Adding autodeploy for new 'beta' branch * Fixing directory for beta deployment * Updating beta autodeploy with nvm info --------- Co-authored-by: leonardofelin <33718368+leonardofelin@users.noreply.github.com> Co-authored-by: David Sangrey <davidsangrey@gmail.com> Co-authored-by: Felix Linker <linkerfelix@gmail.com>
This commit is contained in:
1
.github/workflows/autodeploy.yml
vendored
1
.github/workflows/autodeploy.yml
vendored
@@ -1,5 +1,6 @@
|
||||
# This is a basic deployment workflow triggered by pushes to the alpha branch.
|
||||
|
||||
|
||||
name: Auto-Deploy 'live' Branch to coliolis.io
|
||||
|
||||
# Controls when the action will run. Workflow runs when the alpha branch receives a push event
|
||||
|
||||
@@ -39,13 +39,18 @@ const GRPCAT = {
|
||||
'ml': 'lasers',
|
||||
'c': 'projectiles',
|
||||
'mc': 'projectiles',
|
||||
'advmc': 'projectiles',
|
||||
'axmc': 'experimental',
|
||||
'axmce': 'experimental',
|
||||
'ntp': 'experimental',
|
||||
'fc': 'projectiles',
|
||||
'rfl': 'experimental',
|
||||
'pa': 'projectiles',
|
||||
'rg': 'projectiles',
|
||||
'mr': 'ordnance',
|
||||
'amr': 'ordnance',
|
||||
'axmr': 'experimental',
|
||||
'axmre': 'experimental',
|
||||
'rcpl': 'experimental',
|
||||
'dtl': 'experimental',
|
||||
'tbsc': 'experimental',
|
||||
@@ -104,8 +109,8 @@ const CATEGORIES = {
|
||||
|
||||
// Hardpoints
|
||||
'lasers': ['pl', 'ul', 'bl'],
|
||||
'projectiles': ['mc', 'c', 'fc', 'pa', 'rg'],
|
||||
'ordnance': ['mr', 'tp', 'nl'],
|
||||
'projectiles': ['mc', 'advmc', 'c', 'fc', 'pa', 'rg'],
|
||||
'ordnance': ['mr', 'amr', 'tp', 'nl'],
|
||||
// Utilities
|
||||
'sb': ['sb'],
|
||||
'hs': ['hs'],
|
||||
@@ -113,7 +118,7 @@ const CATEGORIES = {
|
||||
'defence': ['ch', 'po', 'ec'],
|
||||
'scanners': ['sc', 'ss', 'cs', 'kw', 'ws'], // Overloaded with internal scanners
|
||||
// Experimental
|
||||
'experimental': ['axmc', 'axmr', 'rfl', 'tbrfl', 'tbsc', 'tbem', 'xs', 'sfn', 'rcpl', 'dtl', 'rsl', 'mahr',],
|
||||
'experimental': ['axmc', 'axmce', 'axmr', 'axmre', 'ntp','rfl', 'tbrfl', 'tbsc', 'tbem', 'xs', 'sfn', 'rcpl', 'dtl', 'rsl', 'mahr',],
|
||||
'weapon stabilizers': ['ews'],
|
||||
// Guardian
|
||||
'guardian': ['gpp', 'gpd', 'gpc', 'ggc', 'gsrp', 'gfsb', 'ghrp', 'gmrp', 'gsc'],
|
||||
@@ -213,16 +218,30 @@ export default class AvailableModulesMenu extends TranslatedComponent {
|
||||
if (categories.length === 1) {
|
||||
// Show category header instead of group header
|
||||
if (m && grp == m.grp) {
|
||||
list.push(<div ref={(elem) => this.groupElem = elem} key={category}
|
||||
// If this is a missing module/weapon, skip it
|
||||
if (m.grp == "mh" || m.grp == "mm"){
|
||||
continue;
|
||||
} else {
|
||||
list.push(<div ref={(elem) => this.groupElem = elem} key={category}
|
||||
className={'select-category upp'}>{translate(category)}</div>);
|
||||
}
|
||||
} else {
|
||||
list.push(<div key={category} className={'select-category upp'}>{translate(category)}</div>);
|
||||
if (category == "mh" || category == "mm"){
|
||||
continue;
|
||||
} else {
|
||||
list.push(<div key={category} className={'select-category upp'}>{translate(category)}</div>);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Show category header as well as group header
|
||||
if (!categoryHeader) {
|
||||
list.push(<div key={category} className={'select-category upp'}>{translate(category)}</div>);
|
||||
categoryHeader = true;
|
||||
if (category == "mh" || category == "mm"){
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
list.push(<div key={category} className={'select-category upp'}>{translate(category)}</div>);
|
||||
categoryHeader = true;
|
||||
}
|
||||
}
|
||||
if (m && grp == m.grp) {
|
||||
list.push(<div ref={(elem) => this.groupElem = elem} key={grp}
|
||||
@@ -241,7 +260,11 @@ export default class AvailableModulesMenu extends TranslatedComponent {
|
||||
} else if (i.mount === 'T') {
|
||||
mount = 'Turreted';
|
||||
}
|
||||
const fuzz = { grp, m: i, name: `${i.class}${i.rating}${mount ? ' ' + mount : ''} ${translate(grp)}` };
|
||||
let special = '';
|
||||
if (typeof(i.special) !== 'undefined') {
|
||||
special = `(${translate(i.special)})`;
|
||||
}
|
||||
const fuzz = { grp, m: i, name: `${i.class}${i.rating}${mount ? ' ' + mount : ''} ${translate(grp)} ${translate(special)}` };
|
||||
fuzzy.push(fuzz);
|
||||
}
|
||||
}
|
||||
@@ -298,6 +321,11 @@ export default class AvailableModulesMenu extends TranslatedComponent {
|
||||
let itemsOnThisRow = 0;
|
||||
for (let i = 0; i < sortedModules.length; i++) {
|
||||
let m = sortedModules[i];
|
||||
// If m.grp is mh or mm, or m.symbol contains 'Missing' skip it
|
||||
if (m.grp == 'mh' || m.grp == 'mm' || (typeof(m.symbol) !== 'undefined' && m.symbol.includes("Missing"))) {
|
||||
// If this is a missing module, skip it
|
||||
continue;
|
||||
}
|
||||
let mount = null;
|
||||
let disabled = false;
|
||||
prevName = m.name;
|
||||
|
||||
@@ -136,6 +136,7 @@ export default class HardpointSlot extends Slot {
|
||||
{showModuleResistances && m.getThermalResistance() ? <div
|
||||
className='l'>{translate('thermres')}: {formats.pct(m.getThermalResistance())}</div> : null}
|
||||
{m.getIntegrity() ? <div className='l'>{translate('integrity')}: {formats.int(m.getIntegrity())}</div> : null}
|
||||
{m.getInfo() ? <div className='l'>{translate(m.getInfo())}</div> : null}
|
||||
{m && validMods.length > 0 ? <div className='r' tabIndex="0" ref={modButton => this.modButton = modButton}>
|
||||
<button tabIndex="-1" onClick={this._toggleModifications.bind(this)} onContextMenu={stopCtxPropagation}
|
||||
onMouseOver={termtip.bind(null, 'modifications')} onMouseOut={tooltip.bind(null, null)}>
|
||||
|
||||
@@ -88,6 +88,7 @@ export default class InternalSlot extends Slot {
|
||||
{ m.getHullReinforcement() ? <div className='l'>{translate('armour')}: {formats.int(m.getHullReinforcement() + ship.baseArmour * m.getModValue('hullboost') / 10000)}</div> : null }
|
||||
{ m.getProtection() ? <div className='l'>{translate('protection')}: {formats.rPct(m.getProtection())}</div> : null }
|
||||
{ m.getIntegrity() ? <div className='l'>{translate('integrity')}: {formats.int(m.getIntegrity())}</div> : null }
|
||||
{ m.getInfo() ? <div className='l'>{translate(m.getInfo())}</div> : null }
|
||||
{ m && validMods.length > 0 ? <div className='r' tabIndex="0" ref={ modButton => this.modButton = modButton }><button tabIndex="-1" onClick={this._toggleModifications.bind(this)} onContextMenu={stopCtxPropagation} onMouseOver={termtip.bind(null, 'modifications')} onMouseOut={tooltip.bind(null, null)}><ListModifications /></button></div> : null }
|
||||
</div>
|
||||
</div>;
|
||||
|
||||
@@ -12,7 +12,8 @@ const base64url = require('base64url');
|
||||
export default class ModalShoppingList extends TranslatedComponent {
|
||||
|
||||
static propTypes = {
|
||||
ship: PropTypes.object.isRequired
|
||||
ship: PropTypes.object.isRequired,
|
||||
buildName: PropTypes.string
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -90,8 +91,10 @@ export default class ModalShoppingList extends TranslatedComponent {
|
||||
request
|
||||
.get('http://localhost:44405/commanders')
|
||||
.end((err, res) => {
|
||||
this.display = 'block';
|
||||
if (err) {
|
||||
console.log(err);
|
||||
this.display = 'none';
|
||||
return this.setState({ failed: true });
|
||||
}
|
||||
const cmdrs = JSON.parse(res.text);
|
||||
@@ -147,6 +150,34 @@ export default class ModalShoppingList extends TranslatedComponent {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fix issues with the item name for bulkheads when sending to EDOMH
|
||||
* @param {*} ship Ship object
|
||||
* @param {*} item Item name
|
||||
* @returns updated item name
|
||||
*/
|
||||
fixArmourItemNameForEDOMH(ship, item) {
|
||||
// The module blueprint fdname contains "Armour_" it's a bulkhead and we need to pre-populate the item field with the correct name from the ship object
|
||||
switch (ship.bulkheads.m.name){
|
||||
case "Lightweight Alloy":
|
||||
item = ship.id + "_Armour_Grade1";
|
||||
break;
|
||||
case "Reinforced Alloy":
|
||||
item = ship.id + "_Armour_Grade2";
|
||||
break;
|
||||
case "Military Grade Composite":
|
||||
item = ship.id + "_Armour_Grade3";
|
||||
break;
|
||||
case "Mirrored Surface Composite":
|
||||
item = ship.id + "_Armour_Mirrored";
|
||||
break;
|
||||
case "Reactive Surface Composite":
|
||||
item = ship.id + "_Armour_Reactive";
|
||||
break;
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send all blueprints to EDOMH. This is a modified copy of registerBPs because this.state.blueprints was empty when I tried to modify sendToEDEng and I couldn't figure out why
|
||||
* @param {Event} event React event
|
||||
@@ -154,6 +185,7 @@ export default class ModalShoppingList extends TranslatedComponent {
|
||||
sendToEDOMH(event) {
|
||||
event.preventDefault();
|
||||
const ship = this.props.ship;
|
||||
const buildName = this.props.buildName;
|
||||
let blueprints = [];
|
||||
|
||||
//create the json
|
||||
@@ -166,20 +198,38 @@ export default class ModalShoppingList extends TranslatedComponent {
|
||||
continue;
|
||||
}
|
||||
if (module.m.blueprint.special) {
|
||||
let item = "";
|
||||
// If the module blueprint fdname contains "Armour_" it's a bulkhead and we need to pre-populate the item field with the correct name from the ship object
|
||||
if (module.m.blueprint.fdname.includes("Armour_")) {
|
||||
item = this.fixArmourItemNameForEDOMH(ship, item)
|
||||
}
|
||||
else {
|
||||
item = module.m.symbol;
|
||||
}
|
||||
|
||||
blueprints.push({
|
||||
"item": module.m.symbol,
|
||||
"item": item,
|
||||
"blueprint": module.m.blueprint.special.edname
|
||||
});
|
||||
}
|
||||
for (const g in module.m.blueprint.grades) {
|
||||
for (let g in module.m.blueprint.grades) {
|
||||
if (!module.m.blueprint.grades.hasOwnProperty(g)) {
|
||||
continue;
|
||||
}
|
||||
if (g < module.m.blueprint.grade) {
|
||||
// We only want the grade that the module is currently at, not every grade up to that point
|
||||
if (Number(g) !== module.m.blueprint.grade) {
|
||||
continue;
|
||||
}
|
||||
let item = "";
|
||||
// If the module blueprint fdname contains "Armour_" it's a bulkhead and we need to pre-populate the item field with the correct name from the ship object
|
||||
if (module.m.blueprint.fdname.includes("Armour_")) {
|
||||
item = this.fixArmourItemNameForEDOMH(ship, item)
|
||||
}
|
||||
else {
|
||||
item = module.m.symbol;
|
||||
}
|
||||
blueprints.push({
|
||||
"item": module.m.symbol,
|
||||
"item": item,
|
||||
"blueprint": module.m.blueprint.fdname,
|
||||
"grade": module.m.blueprint.grade,
|
||||
"highestGradePercentage":1.0
|
||||
@@ -188,10 +238,12 @@ export default class ModalShoppingList extends TranslatedComponent {
|
||||
}
|
||||
}
|
||||
|
||||
let shipName = buildName + " - " + ship.name;
|
||||
|
||||
//create JSON to encode
|
||||
let baseJson = {
|
||||
"version":1,
|
||||
"name":ship.name, // TO-DO: Import build name and put that here correctly
|
||||
"name": shipName, // TO-DO: Import build name and put that here correctly
|
||||
"items": blueprints
|
||||
}
|
||||
|
||||
@@ -219,14 +271,15 @@ export default class ModalShoppingList extends TranslatedComponent {
|
||||
if (!module.m.blueprint.grade || !module.m.blueprint.grades) {
|
||||
continue;
|
||||
}
|
||||
for (const g in module.m.blueprint.grades) {
|
||||
for (let g in module.m.blueprint.grades) {
|
||||
if (!module.m.blueprint.grades.hasOwnProperty(g)) {
|
||||
continue;
|
||||
}
|
||||
if (g > module.m.blueprint.grade) {
|
||||
// Ignore grades higher than the grade selected
|
||||
if (Number(g) > module.m.blueprint.grade) {
|
||||
continue;
|
||||
}
|
||||
for (const i in module.m.blueprint.grades[g].components) {
|
||||
for (let i in module.m.blueprint.grades[g].components) {
|
||||
if (!module.m.blueprint.grades[g].components.hasOwnProperty(i)) {
|
||||
continue;
|
||||
}
|
||||
@@ -236,16 +289,16 @@ export default class ModalShoppingList extends TranslatedComponent {
|
||||
mats[i] = module.m.blueprint.grades[g].components[i] * this.state.matsPerGrade[g];
|
||||
}
|
||||
}
|
||||
if (module.m.blueprint.special) {
|
||||
for (const j in module.m.blueprint.special.components) {
|
||||
if (!module.m.blueprint.special.components.hasOwnProperty(j)) {
|
||||
continue;
|
||||
}
|
||||
if (mats[j]) {
|
||||
mats[j] += module.m.blueprint.special.components[j];
|
||||
} else {
|
||||
mats[j] = module.m.blueprint.special.components[j];
|
||||
}
|
||||
}
|
||||
if (module.m.blueprint.special) {
|
||||
for (const j in module.m.blueprint.special.components) {
|
||||
if (!module.m.blueprint.special.components.hasOwnProperty(j)) {
|
||||
continue;
|
||||
}
|
||||
if (mats[j]) {
|
||||
mats[j] += module.m.blueprint.special.components[j];
|
||||
} else {
|
||||
mats[j] = module.m.blueprint.special.components[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -303,7 +356,8 @@ export default class ModalShoppingList extends TranslatedComponent {
|
||||
this.sendToEDOMH = this.sendToEDOMH.bind(this);
|
||||
return <div className='modal' onClick={ (e) => e.stopPropagation() }>
|
||||
<h2>{translate('PHRASE_SHOPPING_MATS')}</h2>
|
||||
<label>{translate('Grade 1 rolls ')}</label>
|
||||
<p>{translate('PHRASE_DIFFERENT_ROLLS')}</p>
|
||||
{/* <label>{translate('Grade 1 rolls ')}</label>
|
||||
<input id={1} type={'number'} min={0} defaultValue={this.state.matsPerGrade[1]} onChange={this.changeHandler} />
|
||||
<br/>
|
||||
<label>{translate('Grade 2 rolls ')}</label>
|
||||
@@ -316,20 +370,26 @@ export default class ModalShoppingList extends TranslatedComponent {
|
||||
<input id={4} type={'number'} min={0} value={this.state.matsPerGrade[4]} onChange={this.changeHandler} />
|
||||
<br/>
|
||||
<label>{translate('Grade 5 rolls ')}</label>
|
||||
<input id={5} type={'number'} min={0} value={this.state.matsPerGrade[5]} onChange={this.changeHandler} />
|
||||
<input id={5} type={'number'} min={0} value={this.state.matsPerGrade[5]} onChange={this.changeHandler} /> */}
|
||||
<div>
|
||||
<textarea className='cb json' readOnly value={this.state.matsList} />
|
||||
</div>
|
||||
<label hidden={!compatible} className={'l cap'}>{translate('CMDR Name')}</label>
|
||||
<br/>
|
||||
<select hidden={!compatible} className={'cmdr-select l cap'} onChange={this.cmdrChangeHandler} defaultValue={this.state.cmdrName}>
|
||||
{this.state.cmdrs.map(e => <option key={e}>{e}</option>)}
|
||||
</select>
|
||||
<br/>
|
||||
<p hidden={!this.state.failed} id={'failed'} className={'l'}>{translate('PHRASE_FAIL_EDENGINEER')}</p>
|
||||
<p hidden={compatible} id={'browserbad'} className={'l'}>{translate('PHRASE_FIREFOX_EDENGINEER')}</p>
|
||||
<button className={'l cb dismiss cap'} disabled={!!this.state.failed || !compatible} onClick={this.sendToEDEng}>{translate('Send to EDEngineer')}</button>
|
||||
<button style={{marginTop: 5}} className={'l cb dismiss cap'} disabled={!!this.state.failed} onClick={this.sendToEDOMH}>{translate('Send to EDOMH')}</button>
|
||||
<p hidden={!this.state.failed} id={'failed'} className={'l'}>{translate('PHRASE_FAILED_TO_FIND_EDENGINEER')}</p>
|
||||
<div id='edengineer' display={this.display} hidden={!!this.state.failed && !compatible}>
|
||||
<label hidden={!compatible || !!this.state.failed} className={'l cap'}>{translate('CMDR Name')}</label>
|
||||
<br/>
|
||||
<select hidden={!compatible || !!this.state.failed} className={'cmdr-select l cap'} onChange={this.cmdrChangeHandler} defaultValue={this.state.cmdrName}>
|
||||
{this.state.cmdrs.map(e => <option key={e}>{e}</option>)}
|
||||
</select>
|
||||
<br/>
|
||||
<button className={'l cb dismiss cap'} hidden={!this.state.failed} disabled={!!this.state.failed || !compatible} onClick={this.sendToEDEng}>{translate('Send to EDEngineer')}</button>
|
||||
</div>
|
||||
<div id='edomh'>
|
||||
<p>{translate('PHRASE_ENSURE_EDOMH')}</p>
|
||||
<button style={{marginTop: 5}} className={'l cb dismiss cap'} onClick={this.sendToEDOMH}>{translate('Send to EDOMH')}</button>
|
||||
</div>
|
||||
|
||||
<button className={'r dismiss cap'} onClick={this.context.hideModal}>{translate('close')}</button>
|
||||
</div>;
|
||||
}
|
||||
|
||||
@@ -99,6 +99,7 @@ export default class Slot extends TranslatedComponent {
|
||||
let translate = language.translate;
|
||||
let { ship, m, enabled, dropClass, dragOver, onOpen, onChange, selected, eligible, onSelect, warning, availableModules } = this.props;
|
||||
let slotDetails, modificationsMarker, menu;
|
||||
let missing = false;
|
||||
|
||||
if (!selected) {
|
||||
// If not selected then sure that modifications flag is unset
|
||||
@@ -108,6 +109,11 @@ export default class Slot extends TranslatedComponent {
|
||||
if (m) {
|
||||
slotDetails = this._getSlotDetails(m, enabled, translate, language.formats, language.units); // Must be implemented by sub classes
|
||||
modificationsMarker = JSON.stringify(m);
|
||||
if(typeof m.grp !== 'undefined' || m.grp !== null) {
|
||||
if(m.grp == "mh" || m.grp == "mm") {
|
||||
missing = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
slotDetails = <div className={'empty'}>{translate(eligible ? 'emptyrestricted' : 'empty')}</div>;
|
||||
modificationsMarker = '';
|
||||
@@ -141,10 +147,13 @@ export default class Slot extends TranslatedComponent {
|
||||
|
||||
return (
|
||||
<div className={cn('slot', dropClass, { selected })} onClick={onOpen} onKeyDown={this._keyDown} onContextMenu={this._contextMenu} onDragOver={dragOver} tabIndex="0" ref={slotDiv => this.slotDiv = slotDiv}>
|
||||
<div className='details-container'>
|
||||
{
|
||||
// If missing module/hardpoint, set the div container to warning status.
|
||||
}
|
||||
<div className={ missing === true ? 'details-container warning' : 'details-container'}>
|
||||
<div className='sz'>{this._getMaxClassLabel(translate)}</div>
|
||||
{slotDetails}
|
||||
</div>
|
||||
</div>
|
||||
{menu}
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -93,6 +93,11 @@ export default class StandardSlot extends TranslatedComponent {
|
||||
this._modificationsSelected = false;
|
||||
}
|
||||
|
||||
// If this is a missing module, therefore has the 'info' field, set the warning value on the module to be true when loaded.
|
||||
if (m.info) {
|
||||
warning = () => true;
|
||||
}
|
||||
|
||||
const modificationsMarker = JSON.stringify(m);
|
||||
|
||||
if (selected) {
|
||||
@@ -124,7 +129,7 @@ export default class StandardSlot extends TranslatedComponent {
|
||||
<div className={cn('details-container', { warning: warning && warning(slot.m), disabled: m.grp !== 'bh' && !slot.enabled })}>
|
||||
<div className={'sz'}>{m.grp == 'bh' ? m.name.charAt(0) : slot.maxClass}</div>
|
||||
<div>
|
||||
<div className={'l'}>{classRating} {translate(m.name || m.grp)}{m.mods && Object.keys(m.mods).length > 0 ? <span className='r' onMouseOver={termtip.bind(null, modTT)} onMouseOut={tooltip.bind(null, null)}><Modified /></span> : null }</div>
|
||||
<div className={'l'}>{classRating} {m.getInfo() ? translate(m.ukName) : translate(m.name || m.grp)}{m.mods && Object.keys(m.mods).length > 0 ? <span className='r' onMouseOver={termtip.bind(null, modTT)} onMouseOut={tooltip.bind(null, null)}><Modified /></span> : null }</div>
|
||||
<div className={'r'}>{formats.round(mass)}{units.T}</div>
|
||||
<div/>
|
||||
<div className={'cb'}>
|
||||
@@ -144,7 +149,8 @@ export default class StandardSlot extends TranslatedComponent {
|
||||
{ showModuleResistances && m.getKineticResistance() ? <div className='l'>{translate('kinres')}: {formats.pct(m.getKineticResistance())}</div> : null }
|
||||
{ showModuleResistances && m.getThermalResistance() ? <div className='l'>{translate('thermres')}: {formats.pct(m.getThermalResistance())}</div> : null }
|
||||
{ m.getIntegrity() ? <div className='l'>{translate('integrity')}: {formats.int(m.getIntegrity())}</div> : null }
|
||||
{ validMods.length > 0 ? <div className='r' tabIndex="0" ref={ modButton => this.modButton = modButton }><button tabIndex="-1" onClick={this._toggleModifications.bind(this)} onContextMenu={stopCtxPropagation} onMouseOver={termtip.bind(null, 'modifications')} onMouseOut={tooltip.bind(null, null)}><ListModifications /></button></div> : null }
|
||||
{ m.getInfo() ? <div className='l'>{translate(m.getInfo())}</div> : null }
|
||||
{ m.getInfo() ? <div className='r'></div> : validMods.length > 0 ? <div className='r' tabIndex="0" ref={ modButton => this.modButton = modButton }><button tabIndex="-1" onClick={this._toggleModifications.bind(this)} onContextMenu={stopCtxPropagation} onMouseOver={termtip.bind(null, 'modifications')} onMouseOut={tooltip.bind(null, null)}><ListModifications /></button></div> : null }
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
"PHRASE_NO_SPECIAL": "No experimental effect",
|
||||
"PHRASE_SHOPPING_LIST": "Stations that sell this build",
|
||||
"PHRASE_SHOPPING_MATS": "Materials needed for this build",
|
||||
"PHRASE_DIFFERENT_ROLLS": "NOTE: ED Engineer and/or EDOMH likely have their own 'rolls' configuration, so material requirements may differ!",
|
||||
"PHRASE_REFIT_SHOPPING_LIST": "Stations that sell required modules",
|
||||
"PHRASE_TOTAL_EFFECTIVE_SHIELD": "Total amount of damage that can be taken from each damage type, if using all shield cells",
|
||||
"PHRASE_TIME_TO_LOSE_SHIELDS": "Shields will hold for",
|
||||
@@ -81,8 +82,11 @@
|
||||
"TT_SUMMARY_UNLADEN_TOTAL_JUMP": "Farthest possible range with no cargo, a full fuel tank, and jumping as far as possible each time",
|
||||
"TT_SUMMARY_LADEN_TOTAL_JUMP": "Farthest possible range with full cargo, a full fuel tank, and jumping as far as possible each time",
|
||||
"HELP_MODIFICATIONS_MENU": "Click on a number to enter a new value, or drag along the bar for small changes",
|
||||
"PHRASE_FAIL_EDENGINEER": "Failed to send to EDEngineer (Launch EDEngineer and make sure the API is started then refresh the page.)",
|
||||
"PHRASE_FIREFOX_EDENGINEER": "Sending to EDEngineer is not compatible with Firefox's security settings. Please try again with Chrome.",
|
||||
"PHRASE_FAIL_EDENGINEER": "Failed to send to EDEngineer (Launch EDEngineer and make sure the API is started then refresh the page.)",
|
||||
"PHRASE_ENSURE_EDOMH": "Ensure EDO Material Helper is installed and registered to handle edomh:// urls, else this button will do nothing!",
|
||||
"PHRASE_FIREFOX_EDENGINEER": "Sending to EDEngineer is not compatible with Firefox's security settings. Please try again with Chrome.",
|
||||
"PHRASE_FAILED_TO_FIND_EDENGINEER": "Failed to find ED Engineer API. Please ensure it is running and try again.",
|
||||
"MISSING_MODULES": "Missing Modules",
|
||||
"am": "Auto Field-Maintenance Unit",
|
||||
"bh": "Bulkheads",
|
||||
"bl": "Beam Laser",
|
||||
@@ -109,11 +113,17 @@
|
||||
"kw": "Kill Warrant Scanner",
|
||||
"ls": "Life Support",
|
||||
"mc": "Multi-cannon",
|
||||
"mh": "Missing Weapon/Utility",
|
||||
"mm": "Missing Module",
|
||||
"advmc": "Multi-cannon (Advanced)",
|
||||
"axmc": "AX Multi-cannon",
|
||||
"axmce": "AX Multi-cannon (Enhanced)",
|
||||
"ml": "Mining Laser",
|
||||
"mlc": "Multi Limpet Controller",
|
||||
"mr": "Missile Rack",
|
||||
"amr": "Missile Rack (Advanced)",
|
||||
"axmr": "AX Missile Rack",
|
||||
"axmre": "AX Missile Rack (Enhanced)",
|
||||
"ews": "Experimental Weapon Stabilizer",
|
||||
"mrp": "Module Reinforcement Package",
|
||||
"nl": "Mine Launcher",
|
||||
@@ -159,6 +169,7 @@
|
||||
"sua": "Supercruise Assist",
|
||||
"t": "thrusters",
|
||||
"tp": "Torpedo Pylon",
|
||||
"ntp": "Nanite Torpedo Pylon",
|
||||
"ul": "Burst Laser",
|
||||
"Send To EDEngineer": "Send To EDEngineer",
|
||||
"Send To EDOMH": "Send To EDOMH",
|
||||
@@ -212,6 +223,7 @@
|
||||
"boost interval": "Boost interval",
|
||||
"total": "Total",
|
||||
"ammo": "Ammunition maximum",
|
||||
"info": "Info",
|
||||
"boot": "Boot time",
|
||||
"hacktime": "Hack time",
|
||||
"brokenregen": "Broken regeneration rate",
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -45,6 +45,9 @@ export default class ErrorDetails extends React.Component {
|
||||
return <div className='error'>
|
||||
<h1>Jameson, we have a problem..</h1>
|
||||
<h1><small>{error.message}</small></h1>
|
||||
Import Error handling has been improved, but still isn't perfect. <br/>MOST Import failures are a result of missing modules in Coriolis, <br />OR incorrect import strings generated by third party apps. If you're seeing this page, we may have failed to handle the errors in your import correctly. Please see the data output below, specifically the 'scriptUrl:' section if it's there and then if you feel confident enough, please check the github issues page linked below and see if there is a similar issue already logged. If not, please create a new issue with the data below. If you're not confident, please ask for help on the Coriolis Channel of the EDCD Discord server.
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
{importerror ? <div>If you are attempting to import a ship from EDDI or EDMC and are seeing a 'Z_BUF_ERROR' it means that the URL has not been provided correctly. This is a common problem when using Microsoft Internet Explorer or Microsoft Edge, and you should use another browser instead.</div> : null }
|
||||
<br/>
|
||||
|
||||
@@ -700,7 +700,9 @@ export default class OutfittingPage extends Page {
|
||||
* Generates the shopping list
|
||||
*/
|
||||
_genShoppingList() {
|
||||
this.context.showModal(<ModalShoppingList ship={this.state.ship} />);
|
||||
this.context.showModal(<ModalShoppingList
|
||||
ship={this.state.ship}
|
||||
buildName={this.state.buildName} />);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -439,6 +439,15 @@ export default class Module {
|
||||
return this.get('integrity', modified);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the info of this module
|
||||
* @param {Boolean} [modified=false] Whether to take modifications into account
|
||||
* @return {String} the info of this module
|
||||
*/
|
||||
getInfo(modified = false) {
|
||||
return (modified && this.getModValue('info')) || this.info;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the mass of this module
|
||||
* @param {Boolean} [modified=true] Whether to take modifications into account
|
||||
|
||||
@@ -6,6 +6,22 @@ import { Modules } from 'coriolis-data/dist';
|
||||
import { Modifications } from 'coriolis-data/dist';
|
||||
import { getBlueprint, setQualityCB } from './BlueprintFunctions';
|
||||
|
||||
/**
|
||||
* Check if an imported module is valid
|
||||
* @param {Object} module the module to check
|
||||
* @param {Object} moduleType the type of module to check
|
||||
* @return {boolean} true if the module is valid
|
||||
*/
|
||||
function _isValidImportedModule(module, moduleType) {
|
||||
// First of all, has the _moduleFromFdName function returned 'null'?
|
||||
if (!module){
|
||||
return false
|
||||
}
|
||||
else {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtain a module given its FD Name
|
||||
* @param {string} fdname the FD Name of the module
|
||||
@@ -98,49 +114,90 @@ export function shipFromLoadoutJSON(json) {
|
||||
if (module.Engineering) _addModifications(ship.bulkheads.m, module.Engineering.Modifiers, module.Engineering.Quality, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect);
|
||||
break;
|
||||
case 'powerplant':
|
||||
const powerplant = _moduleFromFdName(module.Item);
|
||||
let powerplant = _moduleFromFdName(module.Item);
|
||||
// Check the powerplant returned is valid
|
||||
if (!_isValidImportedModule(powerplant, 'powerplant'))
|
||||
{
|
||||
powerplant = _moduleFromFdName('Int_Missing_Powerplant');
|
||||
module.Engineering = null;
|
||||
}
|
||||
ship.use(ship.standard[0], powerplant, true);
|
||||
ship.standard[0].enabled = module.On;
|
||||
ship.standard[0].priority = module.Priority;
|
||||
if (module.Engineering) _addModifications(powerplant, module.Engineering.Modifiers, module.Engineering.Quality, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect);
|
||||
break;
|
||||
case 'mainengines':
|
||||
const thrusters = _moduleFromFdName(module.Item);
|
||||
let thrusters = _moduleFromFdName(module.Item);
|
||||
// Check the thrusters returned is valid
|
||||
if (!_isValidImportedModule(thrusters, 'thrusters'))
|
||||
{
|
||||
thrusters = _moduleFromFdName('Int_Missing_Engine');
|
||||
module.Engineering = null;
|
||||
}
|
||||
ship.use(ship.standard[1], thrusters, true);
|
||||
ship.standard[1].enabled = module.On;
|
||||
ship.standard[1].priority = module.Priority;
|
||||
if (module.Engineering) _addModifications(thrusters, module.Engineering.Modifiers, module.Engineering.Quality, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect);
|
||||
break;
|
||||
case 'frameshiftdrive':
|
||||
const frameshiftdrive = _moduleFromFdName(module.Item);
|
||||
let frameshiftdrive = _moduleFromFdName(module.Item);
|
||||
// Check the frameshiftdrive returned is valid
|
||||
if (!_isValidImportedModule(frameshiftdrive, 'frameshiftdrive'))
|
||||
{
|
||||
frameshiftdrive = _moduleFromFdName('Int_Missing_Hyperdrive');
|
||||
module.Engineering = null;
|
||||
}
|
||||
ship.use(ship.standard[2], frameshiftdrive, true);
|
||||
ship.standard[2].enabled = module.On;
|
||||
ship.standard[2].priority = module.Priority;
|
||||
if (module.Engineering) _addModifications(frameshiftdrive, module.Engineering.Modifiers, module.Engineering.Quality, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect);
|
||||
break;
|
||||
case 'lifesupport':
|
||||
const lifesupport = _moduleFromFdName(module.Item);
|
||||
let lifesupport = _moduleFromFdName(module.Item);
|
||||
// Check the lifesupport returned is valid
|
||||
if (!_isValidImportedModule(lifesupport, 'lifesupport'))
|
||||
{
|
||||
lifesupport = _moduleFromFdName('Int_Missing_LifeSupport');
|
||||
module.Engineering = null;
|
||||
}
|
||||
ship.use(ship.standard[3], lifesupport, true);
|
||||
ship.standard[3].enabled = module.On === true;
|
||||
ship.standard[3].priority = module.Priority;
|
||||
if (module.Engineering) _addModifications(lifesupport, module.Engineering.Modifiers, module.Engineering.Quality, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect);
|
||||
break;
|
||||
case 'powerdistributor':
|
||||
const powerdistributor = _moduleFromFdName(module.Item);
|
||||
let powerdistributor = _moduleFromFdName(module.Item);
|
||||
// Check the powerdistributor returned is valid
|
||||
if (!_isValidImportedModule(powerdistributor, 'powerdistributor'))
|
||||
{
|
||||
powerdistributor = _moduleFromFdName('Int_Missing_PowerDistributor');
|
||||
module.Engineering = null;
|
||||
}
|
||||
ship.use(ship.standard[4], powerdistributor, true);
|
||||
ship.standard[4].enabled = module.On;
|
||||
ship.standard[4].priority = module.Priority;
|
||||
if (module.Engineering) _addModifications(powerdistributor, module.Engineering.Modifiers, module.Engineering.Quality, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect);
|
||||
break;
|
||||
case 'radar':
|
||||
const sensors = _moduleFromFdName(module.Item);
|
||||
let sensors = _moduleFromFdName(module.Item);
|
||||
// Check the sensors returned is valid
|
||||
if (!_isValidImportedModule(sensors, 'sensors'))
|
||||
{
|
||||
sensors = _moduleFromFdName('Int_Missing_Sensors');
|
||||
module.Engineering = null;
|
||||
}
|
||||
ship.use(ship.standard[5], sensors, true);
|
||||
ship.standard[5].enabled = module.On;
|
||||
ship.standard[5].priority = module.Priority;
|
||||
if (module.Engineering) _addModifications(sensors, module.Engineering.Modifiers, module.Engineering.Quality, module.Engineering.BlueprintName, module.Engineering.Level, module.Engineering.ExperimentalEffect);
|
||||
break;
|
||||
case 'fueltank':
|
||||
const fueltank = _moduleFromFdName(module.Item);
|
||||
let fueltank = _moduleFromFdName(module.Item);
|
||||
// Check the fueltank returned is valid
|
||||
if (!_isValidImportedModule(fueltank, 'fueltank'))
|
||||
{
|
||||
fueltank = _moduleFromFdName('Int_Missing_FuelTank');
|
||||
}
|
||||
ship.use(ship.standard[6], fueltank, true);
|
||||
ship.standard[6].enabled = true;
|
||||
ship.standard[6].priority = 0;
|
||||
@@ -170,10 +227,27 @@ export function shipFromLoadoutJSON(json) {
|
||||
// This can happen with old imports that don't contain new hardpoints
|
||||
} else {
|
||||
hardpoint = _moduleFromFdName(hardpointSlot.Item);
|
||||
ship.use(ship.hardpoints[hardpointArrayNum], hardpoint, true);
|
||||
ship.hardpoints[hardpointArrayNum].enabled = hardpointSlot.On;
|
||||
ship.hardpoints[hardpointArrayNum].priority = hardpointSlot.Priority;
|
||||
modsToAdd.push({ coriolisMod: hardpoint, json: hardpointSlot });
|
||||
// Check the hardpoint module returned is valid
|
||||
if (!_isValidImportedModule(hardpoint, 'hardpoint')){
|
||||
// Check if it's a Utility or Hardpoint
|
||||
if (hardpointSlot.Slot.toLowerCase().search(/tiny/))
|
||||
{
|
||||
// Use the missing_hardpoint module 'Missing Hardpoint' which will inform the user that the module is missing
|
||||
hardpoint = _moduleFromFdName('Hpt_Missing_Hardpoint');
|
||||
}
|
||||
else {
|
||||
// Use the missing_hardpoint module 'Missing Utility' which will inform the user that the module is missing
|
||||
hardpoint = _moduleFromFdName('Hpt_Missing_Utility');
|
||||
}
|
||||
ship.use(ship.hardpoints[hardpointArrayNum], hardpoint, true);
|
||||
ship.hardpoints[hardpointArrayNum].enabled = hardpointSlot.On;
|
||||
ship.hardpoints[hardpointArrayNum].priority = hardpointSlot.Priority;
|
||||
} else {
|
||||
ship.use(ship.hardpoints[hardpointArrayNum], hardpoint, true);
|
||||
ship.hardpoints[hardpointArrayNum].enabled = hardpointSlot.On;
|
||||
ship.hardpoints[hardpointArrayNum].priority = hardpointSlot.Priority;
|
||||
modsToAdd.push({ coriolisMod: hardpoint, json: hardpointSlot });
|
||||
}
|
||||
}
|
||||
hardpointArrayNum++;
|
||||
}
|
||||
@@ -187,13 +261,17 @@ export function shipFromLoadoutJSON(json) {
|
||||
continue;
|
||||
}
|
||||
const isMilitary = isNaN(shipTemplate.slots.internal[i]) ? shipTemplate.slots.internal[i].name == 'Military' : false;
|
||||
const isPlanetary = isNaN(shipTemplate.slots.internal[i]) ? shipTemplate.slots.internal[i].name == 'PlanetaryApproachSuite' : 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, or a planetary slot. Military and Planetary slots have a different naming system
|
||||
let internalSlot = null;
|
||||
if (isMilitary) {
|
||||
const internalName = 'Military0' + militarySlotNum;
|
||||
internalSlot = json.Modules.find(elem => elem.Slot.toLowerCase() === internalName.toLowerCase());
|
||||
militarySlotNum++;
|
||||
} else if (isPlanetary) {
|
||||
const internalName = 'PlanetaryApproachSuite';
|
||||
internalSlot = json.Modules.find(elem => elem.Slot.toLowerCase() === internalName.toLowerCase());
|
||||
} else {
|
||||
// Slot numbers are not contiguous so handle skips.
|
||||
for (; internalSlot === null && internalSlotNum < 99; internalSlotNum++) {
|
||||
@@ -212,11 +290,22 @@ export function shipFromLoadoutJSON(json) {
|
||||
// This can happen with old imports that don't contain new slots
|
||||
} else {
|
||||
const internalJson = internalSlot;
|
||||
const internal = _moduleFromFdName(internalJson.Item);
|
||||
ship.use(ship.internal[i], internal, true);
|
||||
ship.internal[i].enabled = internalJson.On === true;
|
||||
ship.internal[i].priority = internalJson.Priority;
|
||||
modsToAdd.push({ coriolisMod: internal, json: internalSlot });
|
||||
let internal = _moduleFromFdName(internalJson.Item);
|
||||
// Check the internal module returned is valid
|
||||
if (!_isValidImportedModule(internal, 'internal'))
|
||||
{
|
||||
internal = _moduleFromFdName('Int_Missing_Module');
|
||||
ship.use(ship.internal[i], internal, true);
|
||||
ship.internal[i].enabled = internalJson.On === true;
|
||||
ship.internal[i].priority = internalJson.Priority;
|
||||
//throw 'Unknown internal module: "' + module.Item + '"';
|
||||
}
|
||||
else {
|
||||
ship.use(ship.internal[i], internal, true);
|
||||
ship.internal[i].enabled = internalJson.On === true;
|
||||
ship.internal[i].priority = internalJson.Priority;
|
||||
modsToAdd.push({ coriolisMod: internal, json: internalSlot });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -41,6 +41,15 @@
|
||||
h2 {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
p {
|
||||
clear: left;
|
||||
padding: 30, 0, 0, 0;
|
||||
}
|
||||
|
||||
button {
|
||||
margin: 100px, 0;
|
||||
}
|
||||
}
|
||||
|
||||
textarea {
|
||||
|
||||
Reference in New Issue
Block a user