mirror of
https://github.com/EDCD/coriolis.git
synced 2025-12-08 14:33:22 +00:00
various bits
This commit is contained in:
@@ -402,12 +402,12 @@ export default class Coriolis extends React.Component {
|
||||
{this.state.tooltip}
|
||||
<footer>
|
||||
<div className="right cap">
|
||||
<a href="https://github.com/EDCD/coriolis" target="_blank"
|
||||
<a href="https://github.com/EDCD/coriolis" target="_blank" rel="noopener noreferrer"
|
||||
title="Coriolis Github Project">{window.CORIOLIS_VERSION} - {window.CORIOLIS_DATE}</a>
|
||||
<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
|
||||
target="_blank" rel="noopener noreferrer" title={'Coriolis Commits since' + window.CORIOLIS_DATE}>Commits since last release
|
||||
({window.CORIOLIS_DATE})</a>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
39
src/app/components/Ad.jsx
Normal file
39
src/app/components/Ad.jsx
Normal file
@@ -0,0 +1,39 @@
|
||||
import React, { Component, PropTypes } from 'react';
|
||||
|
||||
export default class Ad extends Component {
|
||||
static propTypes = {
|
||||
client: PropTypes.string,
|
||||
slot: PropTypes.string,
|
||||
format: PropTypes.string,
|
||||
wrapperDivStyle: PropTypes.object
|
||||
};
|
||||
constructor(props) {
|
||||
super(props);
|
||||
}
|
||||
// This code is ran when the component mounts
|
||||
componentDidMount() {
|
||||
try {
|
||||
(window.adsbygoogle = window.adsbygoogle || []).push({});
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
|
||||
// an outer div for styling purposes
|
||||
// changed class to ClassName
|
||||
// changed style from string to an object
|
||||
|
||||
render() {
|
||||
return (
|
||||
<div style={this.props.wrapperDivStyle}>
|
||||
<ins
|
||||
className="adsbygoogle"
|
||||
style={{ display: 'block' }}
|
||||
data-ad-client={this.props.client}
|
||||
data-ad-slot={this.props.slot}
|
||||
data-ad-format={this.props.format}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,12 @@
|
||||
import React from 'react';
|
||||
import Page from './Page';
|
||||
import { CoriolisLogo, GitHub } from '../components/SvgIcons';
|
||||
import Ad from '../components/Ad';
|
||||
|
||||
/**
|
||||
* About Page
|
||||
*/
|
||||
export default class AboutPage extends Page {
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param {Object} props React Component properties
|
||||
@@ -23,33 +23,121 @@ export default class AboutPage extends Page {
|
||||
* @return {React.Component} The page contents
|
||||
*/
|
||||
renderPage() {
|
||||
return <div className={'page'} style={{ textAlign: 'left', maxWidth: 800, margin: '0 auto' }}>
|
||||
<h1><CoriolisLogo style={{ marginRight: '0.4em' }} className='xl'/><span className='warning'>Coriolis EDCD Edition</span></h1>
|
||||
return (
|
||||
<div
|
||||
className={'page'}
|
||||
style={{ textAlign: 'left', maxWidth: 800, margin: '0 auto' }}
|
||||
>
|
||||
<h1>
|
||||
<CoriolisLogo style={{ marginRight: '0.4em' }} className="xl" />
|
||||
<span className="warning">Coriolis EDCD Edition</span>
|
||||
</h1>
|
||||
|
||||
<p>This is a clone of the Coriolis project, whose original author is currently unable to maintain it. This clone is maintained by the <a href="http://edcd.github.io/">EDCD community</a>.</p>
|
||||
<p>To recover your builds, go to <a href='https://coriolis.io/' target='_blank'>https://coriolis.io/</a>, backup your builds (Settings / Backup), copy the text, return here and import (Settings / Import).</p>
|
||||
<p>The Coriolis project was inspired by <a href='http://www.edshipyard.com/' target='_blank'>E:D Shipyard</a> and, of course, <a href='http://www.elitedangerous.com' target='_blank'>Elite Dangerous</a>. The ultimate goal of Coriolis is to provide rich features to support in-game play and planning while engaging the E:D community to support its development.</p>
|
||||
<p>Coriolis was created using assets and imagery from Elite: Dangerous, with the permission of Frontier Developments plc, for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments. A number of assets were sourced from <a href='http://edassets.org' target='_blank'>ED Assets</a></p>
|
||||
<p>
|
||||
This is a clone of the Coriolis project, whose original author is
|
||||
currently unable to maintain it. This clone is maintained by the{' '}
|
||||
<a href="http://edcd.github.io/">EDCD community</a>.
|
||||
</p>
|
||||
<p>
|
||||
To recover your builds, go to{' '}
|
||||
<a href="https://coriolis.io/" target="_blank">
|
||||
https://coriolis.io/
|
||||
</a>
|
||||
, backup your builds (Settings / Backup), copy the text, return here
|
||||
and import (Settings / Import).
|
||||
</p>
|
||||
<p>
|
||||
The Coriolis project was inspired by{' '}
|
||||
<a href="http://www.edshipyard.com/" target="_blank">
|
||||
E:D Shipyard
|
||||
</a>{' '}
|
||||
and, of course,{' '}
|
||||
<a href="http://www.elitedangerous.com" target="_blank">
|
||||
Elite Dangerous
|
||||
</a>
|
||||
. The ultimate goal of Coriolis is to provide rich features to support
|
||||
in-game play and planning while engaging the E:D community to support
|
||||
its development.
|
||||
</p>
|
||||
<p>
|
||||
Coriolis was created using assets and imagery from Elite: Dangerous,
|
||||
with the permission of Frontier Developments plc, for non-commercial
|
||||
purposes. It is not endorsed by nor reflects the views or opinions of
|
||||
Frontier Developments. A number of assets were sourced from{' '}
|
||||
<a href="http://edassets.org" target="_blank">
|
||||
ED Assets
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<a style={{ display: 'block', textDecoration: 'none' }} href='https://github.com/EDCD/coriolis' target='_blank' title='Coriolis Github Project'>
|
||||
<GitHub style={{ margin: '0.4em' }} className='l fg xl'/>
|
||||
<a
|
||||
style={{ display: 'block', textDecoration: 'none' }}
|
||||
href="https://github.com/EDCD/coriolis"
|
||||
target="_blank"
|
||||
title="Coriolis Github Project"
|
||||
>
|
||||
<GitHub style={{ margin: '0.4em' }} className="l fg xl" />
|
||||
<h2 style={{ margin: 0, textDecoration: 'none' }}>Github</h2>
|
||||
github.com/EDCD/coriolis
|
||||
</a>
|
||||
|
||||
<p>Coriolis is an open source project. Checkout the list of upcoming features and to-do list on github. Any and all contributions and feedback are welcome. If you encounter any bugs please report them and provide as much detail as possible.</p>
|
||||
<p>
|
||||
Coriolis is an open source project. Checkout the list of upcoming
|
||||
features and to-do list on github. Any and all contributions and
|
||||
feedback are welcome. If you encounter any bugs please report them and
|
||||
provide as much detail as possible.
|
||||
</p>
|
||||
|
||||
<h3>Chat</h3>
|
||||
<p>You can chat to us on our <a href='https://discord.gg/0uwCh6R62aPRjk9w' target='_blank'>EDCD Discord server</a>.</p>
|
||||
<p>
|
||||
You can chat to us on our{' '}
|
||||
<a href="https://discord.gg/0uwCh6R62aPRjk9w" target="_blank">
|
||||
EDCD Discord server
|
||||
</a>
|
||||
.
|
||||
</p>
|
||||
|
||||
<h3>Supporting Coriolis</h3>
|
||||
<p>Coriolis is an open source project, and I work on it in my free time. I have set up a patreon at <a href='https://www.patreon.com/coriolis_elite'>patreon.com/coriolis_elite</a>, which will be used to keep Coriolis up to date and the servers running.</p>
|
||||
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
|
||||
<p>
|
||||
Coriolis is an open source project, and I work on it in my free time.
|
||||
I have set up a patreon at{' '}
|
||||
<a href="https://www.patreon.com/coriolis_elite">
|
||||
patreon.com/coriolis_elite
|
||||
</a>
|
||||
, which will be used to keep Coriolis up to date and the servers
|
||||
running.
|
||||
</p>
|
||||
<form
|
||||
action="https://www.paypal.com/cgi-bin/webscr"
|
||||
method="post"
|
||||
target="_top"
|
||||
>
|
||||
<input type="hidden" name="cmd" value="_s-xclick" />
|
||||
<input type="hidden" name="hosted_button_id" value="SJBKT2SWEEU68" />
|
||||
<input type="image" src="https://www.paypalobjects.com/en_AU/i/btn/btn_donate_SM.gif" border="0" name="submit" alt="PayPal – The safer, easier way to pay online!" />
|
||||
<img alt="" border="0" src="https://www.paypalobjects.com/en_AU/i/scr/pixel.gif" width="1" height="1" />
|
||||
<input
|
||||
type="image"
|
||||
src="https://www.paypalobjects.com/en_AU/i/btn/btn_donate_SM.gif"
|
||||
border="0"
|
||||
name="submit"
|
||||
alt="PayPal – The safer, easier way to pay online!"
|
||||
/>
|
||||
<img
|
||||
alt=""
|
||||
border="0"
|
||||
src="https://www.paypalobjects.com/en_AU/i/scr/pixel.gif"
|
||||
width="1"
|
||||
height="1"
|
||||
/>
|
||||
</form>
|
||||
</div>;
|
||||
<Ad
|
||||
client="ca-pub-3709458261881414"
|
||||
slot="4156867783"
|
||||
format="auto"
|
||||
wrapperDivStyle={{
|
||||
marginTop: '15px',
|
||||
marginBottom: '20px'
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import React from 'react';
|
||||
import Page from './Page';
|
||||
|
||||
/**
|
||||
* 404 Page
|
||||
*/
|
||||
@@ -22,6 +21,7 @@ export default class NotFoundPage extends Page {
|
||||
* @return {React.Component} The page contents
|
||||
*/
|
||||
renderPage() {
|
||||
return <div className='page' style={{ marginTop: 30 }}>Page <small>{this.context.route.path}</small> Not Found</div>;
|
||||
return <div className='page' style={{ marginTop: 30 }}>Page <small>{this.context.route.path}</small> Not Found
|
||||
</div>;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import {
|
||||
} from '../components/SvgIcons';
|
||||
import LZString from 'lz-string';
|
||||
import ShipSummaryTable from '../components/ShipSummaryTable';
|
||||
import Ad from '../components/Ad';
|
||||
import StandardSlotSection from '../components/StandardSlotSection';
|
||||
import HardpointSlotSection from '../components/HardpointSlotSection';
|
||||
import InternalSlotSection from '../components/InternalSlotSection';
|
||||
@@ -53,7 +54,6 @@ function getTitle(shipName, buildName) {
|
||||
* The Outfitting Page
|
||||
*/
|
||||
export default class OutfittingPage extends Page {
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param {Object} props React Component properties
|
||||
@@ -100,7 +100,23 @@ export default class OutfittingPage extends Page {
|
||||
this._getTitle = getTitle.bind(this, data.properties.name);
|
||||
|
||||
// Obtain ship control from code
|
||||
const { sys, eng, wep, mcSys, mcEng, mcWep, boost, fuel, cargo, opponent, opponentBuild, opponentSys, opponentEng, opponentWep, engagementRange } = this._obtainControlFromCode(ship, code);
|
||||
const {
|
||||
sys,
|
||||
eng,
|
||||
wep,
|
||||
mcSys,
|
||||
mcEng,
|
||||
mcWep,
|
||||
boost,
|
||||
fuel,
|
||||
cargo,
|
||||
opponent,
|
||||
opponentBuild,
|
||||
opponentSys,
|
||||
opponentEng,
|
||||
opponentWep,
|
||||
engagementRange
|
||||
} = this._obtainControlFromCode(ship, code);
|
||||
return {
|
||||
error: null,
|
||||
title: this._getTitle(buildName),
|
||||
@@ -139,7 +155,10 @@ export default class OutfittingPage extends Page {
|
||||
};
|
||||
|
||||
if (Persist.hasBuild(this.state.shipId, stateChanges.newBuildName)) {
|
||||
stateChanges.savedCode = Persist.getBuild(this.state.shipId, stateChanges.newBuildName);
|
||||
stateChanges.savedCode = Persist.getBuild(
|
||||
this.state.shipId,
|
||||
stateChanges.newBuildName
|
||||
);
|
||||
} else {
|
||||
stateChanges.savedCode = null;
|
||||
}
|
||||
@@ -165,7 +184,9 @@ export default class OutfittingPage extends Page {
|
||||
* @returns {string} the code for this ship
|
||||
*/
|
||||
_fullCode(ship, fuel, cargo) {
|
||||
return `${ship.toString()}.${LZString.compressToBase64(this._controlCode(fuel, cargo))}`;
|
||||
return `${ship.toString()}.${LZString.compressToBase64(
|
||||
this._controlCode(fuel, cargo)
|
||||
)}`;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -185,7 +206,11 @@ export default class OutfittingPage extends Page {
|
||||
let boost = false;
|
||||
let fuel = ship.fuelCapacity;
|
||||
let cargo = ship.cargoCapacity;
|
||||
let opponent = new Ship('eagle', Ships['eagle'].properties, Ships['eagle'].slots).buildWith(Ships['eagle'].defaults);
|
||||
let opponent = new Ship(
|
||||
'eagle',
|
||||
Ships['eagle'].properties,
|
||||
Ships['eagle'].slots
|
||||
).buildWith(Ships['eagle'].defaults);
|
||||
let opponentSys = 2;
|
||||
let opponentEng = 2;
|
||||
let opponentWep = 2;
|
||||
@@ -197,7 +222,9 @@ export default class OutfittingPage extends Page {
|
||||
const parts = code.split('.');
|
||||
if (parts.length >= 5) {
|
||||
// We have control information in the code
|
||||
const control = LZString.decompressFromBase64(Utils.fromUrlSafe(parts[4])).split('/');
|
||||
const control = LZString.decompressFromBase64(
|
||||
Utils.fromUrlSafe(parts[4])
|
||||
).split('/');
|
||||
sys = parseFloat(control[0]) || sys;
|
||||
eng = parseFloat(control[1]) || eng;
|
||||
wep = parseFloat(control[2]) || wep;
|
||||
@@ -206,7 +233,11 @@ export default class OutfittingPage extends Page {
|
||||
cargo = parseInt(control[5]) || cargo;
|
||||
if (control[6]) {
|
||||
const shipId = control[6];
|
||||
opponent = new Ship(shipId, Ships[shipId].properties, Ships[shipId].slots);
|
||||
opponent = new Ship(
|
||||
shipId,
|
||||
Ships[shipId].properties,
|
||||
Ships[shipId].slots
|
||||
);
|
||||
if (control[7] && Persist.getBuild(shipId, control[7])) {
|
||||
// Ship is a particular build
|
||||
const opponentCode = Persist.getBuild(shipId, control[7]);
|
||||
@@ -216,7 +247,9 @@ export default class OutfittingPage extends Page {
|
||||
// Obtain opponent's sys/eng/wep pips from their code
|
||||
const opponentParts = opponentCode.split('.');
|
||||
if (opponentParts.length >= 5) {
|
||||
const opponentControl = LZString.decompressFromBase64(Utils.fromUrlSafe(opponentParts[4])).split('/');
|
||||
const opponentControl = LZString.decompressFromBase64(
|
||||
Utils.fromUrlSafe(opponentParts[4])
|
||||
).split('/');
|
||||
opponentSys = parseFloat(opponentControl[0]) || opponentSys;
|
||||
opponentEng = parseFloat(opponentControl[1]) || opponentEng;
|
||||
opponentWep = parseFloat(opponentControl[2]) || opponentWep;
|
||||
@@ -237,7 +270,23 @@ export default class OutfittingPage extends Page {
|
||||
}
|
||||
}
|
||||
|
||||
return { sys, eng, wep, mcSys, mcEng, mcWep, boost, fuel, cargo, opponent, opponentBuild, opponentSys, opponentEng, opponentWep, engagementRange };
|
||||
return {
|
||||
sys,
|
||||
eng,
|
||||
wep,
|
||||
mcSys,
|
||||
mcEng,
|
||||
mcWep,
|
||||
boost,
|
||||
fuel,
|
||||
cargo,
|
||||
opponent,
|
||||
opponentBuild,
|
||||
opponentSys,
|
||||
opponentEng,
|
||||
opponentWep,
|
||||
engagementRange
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -252,7 +301,9 @@ export default class OutfittingPage extends Page {
|
||||
* @param {number} mcWep WEP pips from multi-crew
|
||||
*/
|
||||
_pipsUpdated(sys, eng, wep, mcSys, mcEng, mcWep) {
|
||||
this.setState({ sys, eng, wep, mcSys, mcEng, mcWep }, () => this._updateRouteOnControlChange());
|
||||
this.setState({ sys, eng, wep, mcSys, mcEng, mcWep }, () =>
|
||||
this._updateRouteOnControlChange()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -284,7 +335,9 @@ export default class OutfittingPage extends Page {
|
||||
* @param {number} engagementRange the engagement range, in m
|
||||
*/
|
||||
_engagementRangeUpdated(engagementRange) {
|
||||
this.setState({ engagementRange }, () => this._updateRouteOnControlChange());
|
||||
this.setState({ engagementRange }, () =>
|
||||
this._updateRouteOnControlChange()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -293,7 +346,11 @@ export default class OutfittingPage extends Page {
|
||||
* @param {string} opponentBuild the name of the opponent's build
|
||||
*/
|
||||
_opponentUpdated(opponent, opponentBuild) {
|
||||
const opponentShip = new Ship(opponent, Ships[opponent].properties, Ships[opponent].slots);
|
||||
const opponentShip = new Ship(
|
||||
opponent,
|
||||
Ships[opponent].properties,
|
||||
Ships[opponent].slots
|
||||
);
|
||||
let opponentSys = this.state.opponentSys;
|
||||
let opponentEng = this.state.opponentEng;
|
||||
let opponentWep = this.state.opponentWep;
|
||||
@@ -301,9 +358,13 @@ export default class OutfittingPage extends Page {
|
||||
// Ship is a particular build
|
||||
opponentShip.buildFrom(Persist.getBuild(opponent, opponentBuild));
|
||||
// Set pips for opponent
|
||||
const opponentParts = Persist.getBuild(opponent, opponentBuild).split('.');
|
||||
const opponentParts = Persist.getBuild(opponent, opponentBuild).split(
|
||||
'.'
|
||||
);
|
||||
if (opponentParts.length >= 5) {
|
||||
const opponentControl = LZString.decompressFromBase64(Utils.fromUrlSafe(opponentParts[4])).split('/');
|
||||
const opponentControl = LZString.decompressFromBase64(
|
||||
Utils.fromUrlSafe(opponentParts[4])
|
||||
).split('/');
|
||||
opponentSys = parseFloat(opponentControl[0]);
|
||||
opponentEng = parseFloat(opponentControl[1]);
|
||||
opponentWep = parseFloat(opponentControl[2]);
|
||||
@@ -316,7 +377,16 @@ export default class OutfittingPage extends Page {
|
||||
opponentWep = 2;
|
||||
}
|
||||
|
||||
this.setState({ opponent: opponentShip, opponentBuild, opponentSys, opponentEng, opponentWep }, () => this._updateRouteOnControlChange());
|
||||
this.setState(
|
||||
{
|
||||
opponent: opponentShip,
|
||||
opponentBuild,
|
||||
opponentSys,
|
||||
opponentEng,
|
||||
opponentWep
|
||||
},
|
||||
() => this._updateRouteOnControlChange()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -326,8 +396,22 @@ export default class OutfittingPage extends Page {
|
||||
* @returns {string} The control code
|
||||
*/
|
||||
_controlCode(fuel, cargo) {
|
||||
const { sys, eng, wep, mcSys, mcEng, mcWep, boost, opponent, opponentBuild, engagementRange } = this.state;
|
||||
const code = `${sys}/${eng}/${wep}/${boost ? 1 : 0}/${fuel || this.state.fuel}/${cargo || this.state.cargo}/${opponent.id}/${opponentBuild ? opponentBuild : ''}/${engagementRange}/${mcSys}/${mcEng}/${mcWep}`;
|
||||
const {
|
||||
sys,
|
||||
eng,
|
||||
wep,
|
||||
mcSys,
|
||||
mcEng,
|
||||
mcWep,
|
||||
boost,
|
||||
opponent,
|
||||
opponentBuild,
|
||||
engagementRange
|
||||
} = this.state;
|
||||
const code = `${sys}/${eng}/${wep}/${boost ? 1 : 0}/${fuel ||
|
||||
this.state.fuel}/${cargo || this.state.cargo}/${opponent.id}/${
|
||||
opponentBuild ? opponentBuild : ''
|
||||
}/${engagementRange}/${mcSys}/${mcEng}/${mcWep}`;
|
||||
return code;
|
||||
}
|
||||
|
||||
@@ -344,10 +428,17 @@ export default class OutfittingPage extends Page {
|
||||
this._updateRoute(shipId, newBuildName, code);
|
||||
|
||||
let opponent, opponentBuild, opponentSys, opponentEng, opponentWep;
|
||||
if (shipId === this.state.opponent.id && buildName === this.state.opponentBuild) {
|
||||
if (
|
||||
shipId === this.state.opponent.id &&
|
||||
buildName === this.state.opponentBuild
|
||||
) {
|
||||
// This is a save of our current opponent build; update it
|
||||
opponentBuild = newBuildName;
|
||||
opponent = new Ship(shipId, Ships[shipId].properties, Ships[shipId].slots).buildFrom(code);
|
||||
opponent = new Ship(
|
||||
shipId,
|
||||
Ships[shipId].properties,
|
||||
Ships[shipId].slots
|
||||
).buildFrom(code);
|
||||
opponentSys = this.state.sys;
|
||||
opponentEng = this.state.eng;
|
||||
opponentWep = this.state.wep;
|
||||
@@ -358,7 +449,17 @@ export default class OutfittingPage extends Page {
|
||||
opponentEng = this.state.opponentEng;
|
||||
opponentWep = this.state.opponentWep;
|
||||
}
|
||||
this.setState({ buildName: newBuildName, code, savedCode: code, opponent, opponentBuild, opponentSys, opponentEng, opponentWep, title: this._getTitle(newBuildName) });
|
||||
this.setState({
|
||||
buildName: newBuildName,
|
||||
code,
|
||||
savedCode: code,
|
||||
opponent,
|
||||
opponentBuild,
|
||||
opponentSys,
|
||||
opponentEng,
|
||||
opponentWep,
|
||||
title: this._getTitle(newBuildName)
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -370,7 +471,12 @@ export default class OutfittingPage extends Page {
|
||||
Persist.deleteBuild(shipId, buildName);
|
||||
Persist.saveBuild(shipId, newBuildName, code);
|
||||
this._updateRoute(shipId, newBuildName, code);
|
||||
this.setState({ buildName: newBuildName, code, savedCode: code, opponentBuild: newBuildName });
|
||||
this.setState({
|
||||
buildName: newBuildName,
|
||||
code,
|
||||
savedCode: code,
|
||||
opponentBuild: newBuildName
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -390,9 +496,7 @@ export default class OutfittingPage extends Page {
|
||||
ship.buildWith(Ships[shipId].defaults);
|
||||
// Reset controls
|
||||
const code = ship.toString();
|
||||
const { sys, eng, wep, mcSys, mcEng, mcWep, boost, fuel, cargo, opponent, opponentBuild, engagementRange } = this._obtainControlFromCode(ship, code);
|
||||
// Update state, and refresh the ship
|
||||
this.setState({
|
||||
const {
|
||||
sys,
|
||||
eng,
|
||||
wep,
|
||||
@@ -405,7 +509,25 @@ export default class OutfittingPage extends Page {
|
||||
opponent,
|
||||
opponentBuild,
|
||||
engagementRange
|
||||
}, () => this._updateRoute(shipId, buildName, code));
|
||||
} = this._obtainControlFromCode(ship, code);
|
||||
// Update state, and refresh the ship
|
||||
this.setState(
|
||||
{
|
||||
sys,
|
||||
eng,
|
||||
wep,
|
||||
mcSys,
|
||||
mcEng,
|
||||
mcWep,
|
||||
boost,
|
||||
fuel,
|
||||
cargo,
|
||||
opponent,
|
||||
opponentBuild,
|
||||
engagementRange
|
||||
},
|
||||
() => this._updateRoute(shipId, buildName, code)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -416,7 +538,10 @@ export default class OutfittingPage extends Page {
|
||||
Persist.deleteBuild(shipId, buildName);
|
||||
|
||||
let opponentBuild;
|
||||
if (shipId === this.state.opponent.id && buildName === this.state.opponentBuild) {
|
||||
if (
|
||||
shipId === this.state.opponent.id &&
|
||||
buildName === this.state.opponentBuild
|
||||
) {
|
||||
// Our current opponent has been deleted; revert to stock
|
||||
opponentBuild = null;
|
||||
} else {
|
||||
@@ -433,11 +558,13 @@ export default class OutfittingPage extends Page {
|
||||
_exportBuild() {
|
||||
let translate = this.context.language.translate;
|
||||
let { buildName, ship } = this.state;
|
||||
this.context.showModal(<ModalExport
|
||||
this.context.showModal(
|
||||
<ModalExport
|
||||
title={(buildName || ship.name) + ' ' + translate('export')}
|
||||
description={translate('PHRASE_EXPORT_DESC')}
|
||||
data={toDetailedBuild(buildName, ship, ship.toString())}
|
||||
/>);
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -450,9 +577,7 @@ export default class OutfittingPage extends Page {
|
||||
this.state.ship.buildFrom(code);
|
||||
|
||||
// Obtain controls from the code
|
||||
const { sys, eng, wep, mcSys, mcEng, mcWep, boost, fuel, cargo, opponent, opponentBuild, engagementRange } = this._obtainControlFromCode(ship, code);
|
||||
// Update state, and refresh the route when complete
|
||||
this.setState({
|
||||
const {
|
||||
sys,
|
||||
eng,
|
||||
wep,
|
||||
@@ -465,7 +590,25 @@ export default class OutfittingPage extends Page {
|
||||
opponent,
|
||||
opponentBuild,
|
||||
engagementRange
|
||||
}, () => this._updateRoute(shipId, buildName, code));
|
||||
} = this._obtainControlFromCode(ship, code);
|
||||
// Update state, and refresh the route when complete
|
||||
this.setState(
|
||||
{
|
||||
sys,
|
||||
eng,
|
||||
wep,
|
||||
mcSys,
|
||||
mcEng,
|
||||
mcWep,
|
||||
boost,
|
||||
fuel,
|
||||
cargo,
|
||||
opponent,
|
||||
opponentBuild,
|
||||
engagementRange
|
||||
},
|
||||
() => this._updateRoute(shipId, buildName, code)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -481,8 +624,14 @@ export default class OutfittingPage extends Page {
|
||||
}
|
||||
const code = this._fullCode(ship, fuel, cargo);
|
||||
// Only update the state if this really has been updated
|
||||
if (this.state.code != code || this.state.cargo != cargo || this.state.fuel != fuel) {
|
||||
this.setState({ code, cargo, fuel }, () => this._updateRoute(shipId, buildName, code));
|
||||
if (
|
||||
this.state.code != code ||
|
||||
this.state.cargo != cargo ||
|
||||
this.state.fuel != fuel
|
||||
) {
|
||||
this.setState({ code, cargo, fuel }, () =>
|
||||
this._updateRoute(shipId, buildName, code)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -502,7 +651,8 @@ export default class OutfittingPage extends Page {
|
||||
* @param {Object} nextContext Incoming/Next conext
|
||||
*/
|
||||
componentWillReceiveProps(nextProps, nextContext) {
|
||||
if (this.context.route !== nextContext.route) { // Only reinit state if the route has changed
|
||||
if (this.context.route !== nextContext.route) {
|
||||
// Only reinit state if the route has changed
|
||||
this.setState(this._initState(nextProps, nextContext));
|
||||
}
|
||||
}
|
||||
@@ -553,10 +703,16 @@ export default class OutfittingPage extends Page {
|
||||
|
||||
const shipId = Ships[ship.id].eddbID;
|
||||
// Provide unique list of non-PP module EDDB IDs
|
||||
const modIds = ship.internal.concat(ship.bulkheads, ship.standard, ship.hardpoints).filter(slot => slot !== null && slot.m !== null && !slot.m.pp).map(slot => slot.m.eddbID).filter((v, i, a) => a.indexOf(v) === i);
|
||||
const modIds = ship.internal
|
||||
.concat(ship.bulkheads, ship.standard, ship.hardpoints)
|
||||
.filter(slot => slot !== null && slot.m !== null && !slot.m.pp)
|
||||
.map(slot => slot.m.eddbID)
|
||||
.filter((v, i, a) => a.indexOf(v) === i);
|
||||
|
||||
// Open up the relevant URL
|
||||
window.open('https://eddb.io/station?s=' + shipId + '&m=' + modIds.join(','));
|
||||
window.open(
|
||||
'https://eddb.io/station?s=' + shipId + '&m=' + modIds.join(',')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -574,7 +730,8 @@ export default class OutfittingPage extends Page {
|
||||
// .keyCode will eventually be replaced with .key
|
||||
switch (e.keyCode) {
|
||||
case 69: // 'e'
|
||||
if (e.ctrlKey || e.metaKey) { // CTRL/CMD + e
|
||||
if (e.ctrlKey || e.metaKey) {
|
||||
// CTRL/CMD + e
|
||||
e.preventDefault();
|
||||
this._exportBuild();
|
||||
}
|
||||
@@ -590,7 +747,28 @@ export default class OutfittingPage extends Page {
|
||||
let state = this.state,
|
||||
{ language, termtip, tooltip, sizeRatio, onWindowResize } = this.context,
|
||||
{ translate, units, formats } = language,
|
||||
{ ship, code, savedCode, buildName, newBuildName, sys, eng, wep, mcSys, mcEng, mcWep, boost, fuel, cargo, opponent, opponentBuild, opponentSys, opponentEng, opponentWep, engagementRange } = state,
|
||||
{
|
||||
ship,
|
||||
code,
|
||||
savedCode,
|
||||
buildName,
|
||||
newBuildName,
|
||||
sys,
|
||||
eng,
|
||||
wep,
|
||||
mcSys,
|
||||
mcEng,
|
||||
mcWep,
|
||||
boost,
|
||||
fuel,
|
||||
cargo,
|
||||
opponent,
|
||||
opponentBuild,
|
||||
opponentSys,
|
||||
opponentEng,
|
||||
opponentWep,
|
||||
engagementRange
|
||||
} = state,
|
||||
hide = tooltip.bind(null, null),
|
||||
menu = this.props.currentMenu,
|
||||
shipUpdated = this._shipUpdated,
|
||||
@@ -608,11 +786,15 @@ export default class OutfittingPage extends Page {
|
||||
const _pStr = `${ship.getPowerEnabledString()}${ship.getPowerPrioritiesString()}`;
|
||||
const _mStr = ship.getModificationsString();
|
||||
|
||||
const standardSlotMarker = `${ship.name}${_sStr}${_pStr}${_mStr}${ship.ladenMass}${cargo}${fuel}`;
|
||||
const standardSlotMarker = `${ship.name}${_sStr}${_pStr}${_mStr}${
|
||||
ship.ladenMass
|
||||
}${cargo}${fuel}`;
|
||||
const internalSlotMarker = `${ship.name}${_iStr}${_pStr}${_mStr}`;
|
||||
const hardpointsSlotMarker = `${ship.name}${_hStr}${_pStr}${_mStr}`;
|
||||
const boostMarker = `${ship.canBoost(cargo, fuel)}`;
|
||||
const shipSummaryMarker = `${ship.name}${_sStr}${_iStr}${_hStr}${_pStr}${_mStr}${ship.ladenMass}${cargo}${fuel}`;
|
||||
const shipSummaryMarker = `${
|
||||
ship.name
|
||||
}${_sStr}${_iStr}${_hStr}${_pStr}${_mStr}${ship.ladenMass}${cargo}${fuel}`;
|
||||
|
||||
const requirements = Ships[ship.id].requirements;
|
||||
let requirementElements = [];
|
||||
@@ -624,94 +806,275 @@ export default class OutfittingPage extends Page {
|
||||
*/
|
||||
function renderRequirement(className, textKey, tooltipTextKey) {
|
||||
if (textKey.startsWith('empire') || textKey.startsWith('federation')) {
|
||||
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>
|
||||
);
|
||||
} else {
|
||||
requirementElements.push(<div key={textKey} className={className} onMouseEnter={termtip.bind(null, tooltipTextKey)} onMouseLeave={hide}>{translate(textKey)}</div>);
|
||||
requirementElements.push(
|
||||
<div
|
||||
key={textKey}
|
||||
className={className}
|
||||
onMouseEnter={termtip.bind(null, tooltipTextKey)}
|
||||
onMouseLeave={hide}
|
||||
>
|
||||
{translate(textKey)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (requirements) {
|
||||
requirements.federationRank && renderRequirement('federation', 'federation rank ' + requirements.federationRank, 'federation rank required');
|
||||
requirements.empireRank && renderRequirement('empire', 'empire rank ' + requirements.empireRank, 'empire rank required');
|
||||
requirements.horizons && renderRequirement('horizons', 'horizons', 'horizons required');
|
||||
requirements.horizonsEarlyAdoption && renderRequirement('horizons', 'horizons early adoption', 'horizons early adoption required');
|
||||
requirements.federationRank &&
|
||||
renderRequirement(
|
||||
'federation',
|
||||
'federation rank ' + requirements.federationRank,
|
||||
'federation rank required'
|
||||
);
|
||||
requirements.empireRank &&
|
||||
renderRequirement(
|
||||
'empire',
|
||||
'empire rank ' + requirements.empireRank,
|
||||
'empire rank required'
|
||||
);
|
||||
requirements.horizons &&
|
||||
renderRequirement('horizons', 'horizons', 'horizons required');
|
||||
requirements.horizonsEarlyAdoption &&
|
||||
renderRequirement(
|
||||
'horizons',
|
||||
'horizons early adoption',
|
||||
'horizons early adoption required'
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div id='outfit' className={'page'} style={{ fontSize: (sizeRatio * 0.9) + 'em' }}>
|
||||
<div id='overview'>
|
||||
<div
|
||||
id="outfit"
|
||||
className={'page'}
|
||||
style={{ fontSize: sizeRatio * 0.9 + 'em' }}
|
||||
>
|
||||
<div id="overview">
|
||||
<h1>{ship.name}</h1>
|
||||
<div id='requirements'>{requirementElements}</div>
|
||||
<div id='build'>
|
||||
<input value={newBuildName || ''} onChange={this._buildNameChange} placeholder={translate('Enter Name')} maxLength={50} />
|
||||
<button onClick={canSave && this._saveBuild} disabled={!canSave} onMouseOver={termtip.bind(null, 'save')} onMouseOut={hide}>
|
||||
<FloppyDisk className='lg' />
|
||||
<div id="requirements">{requirementElements}</div>
|
||||
<div id="build">
|
||||
<input
|
||||
value={newBuildName || ''}
|
||||
onChange={this._buildNameChange}
|
||||
placeholder={translate('Enter Name')}
|
||||
maxLength={50}
|
||||
/>
|
||||
<button
|
||||
onClick={canSave && this._saveBuild}
|
||||
disabled={!canSave}
|
||||
onMouseOver={termtip.bind(null, 'save')}
|
||||
onMouseOut={hide}
|
||||
>
|
||||
<FloppyDisk className="lg" />
|
||||
</button>
|
||||
<button onClick={canRename && this._renameBuild} disabled={!canRename} onMouseOver={termtip.bind(null, 'rename')} onMouseOut={hide}>
|
||||
<span style={{ textTransform: 'none', fontSize: '1.8em' }}>a|</span>
|
||||
<button
|
||||
onClick={canRename && this._renameBuild}
|
||||
disabled={!canRename}
|
||||
onMouseOver={termtip.bind(null, 'rename')}
|
||||
onMouseOut={hide}
|
||||
>
|
||||
<span style={{ textTransform: 'none', fontSize: '1.8em' }}>
|
||||
a|
|
||||
</span>
|
||||
</button>
|
||||
<button onClick={canReload && this._reloadBuild} disabled={!canReload} onMouseOver={termtip.bind(null, 'reload')} onMouseOut={hide}>
|
||||
<Reload className='lg'/>
|
||||
<button
|
||||
onClick={canReload && this._reloadBuild}
|
||||
disabled={!canReload}
|
||||
onMouseOver={termtip.bind(null, 'reload')}
|
||||
onMouseOut={hide}
|
||||
>
|
||||
<Reload className="lg" />
|
||||
</button>
|
||||
<button className={'danger'} onClick={savedCode && this._deleteBuild} disabled={!savedCode} onMouseOver={termtip.bind(null, 'delete')} onMouseOut={hide}>
|
||||
<Bin className='lg'/>
|
||||
<button
|
||||
className={'danger'}
|
||||
onClick={savedCode && this._deleteBuild}
|
||||
disabled={!savedCode}
|
||||
onMouseOver={termtip.bind(null, 'delete')}
|
||||
onMouseOut={hide}
|
||||
>
|
||||
<Bin className="lg" />
|
||||
</button>
|
||||
<button onClick={code && this._resetBuild} disabled={!code} onMouseOver={termtip.bind(null, 'reset')} onMouseOut={hide}>
|
||||
<Switch className='lg'/>
|
||||
<button
|
||||
onClick={code && this._resetBuild}
|
||||
disabled={!code}
|
||||
onMouseOver={termtip.bind(null, 'reset')}
|
||||
onMouseOut={hide}
|
||||
>
|
||||
<Switch className="lg" />
|
||||
</button>
|
||||
<button onClick={buildName && this._exportBuild} disabled={!buildName} onMouseOver={termtip.bind(null, 'export')} onMouseOut={hide}>
|
||||
<Download className='lg'/>
|
||||
<button
|
||||
onClick={buildName && this._exportBuild}
|
||||
disabled={!buildName}
|
||||
onMouseOver={termtip.bind(null, 'export')}
|
||||
onMouseOut={hide}
|
||||
>
|
||||
<Download className="lg" />
|
||||
</button>
|
||||
<button onClick={this._eddbShoppingList} onMouseOver={termtip.bind(null, 'PHRASE_SHOPPING_LIST')} onMouseOut={hide}>
|
||||
<ShoppingIcon className='lg' />
|
||||
<button
|
||||
onClick={this._eddbShoppingList}
|
||||
onMouseOver={termtip.bind(null, 'PHRASE_SHOPPING_LIST')}
|
||||
onMouseOut={hide}
|
||||
>
|
||||
<ShoppingIcon className="lg" />
|
||||
</button>
|
||||
<button onClick={this._genShortlink} onMouseOver={termtip.bind(null, 'shortlink')} onMouseOut={hide}>
|
||||
<LinkIcon className='lg' />
|
||||
<button
|
||||
onClick={this._genShortlink}
|
||||
onMouseOver={termtip.bind(null, 'shortlink')}
|
||||
onMouseOut={hide}
|
||||
>
|
||||
<LinkIcon className="lg" />
|
||||
</button>
|
||||
<button onClick={this._genOrbis} onMouseOver={termtip.bind(null, 'PHASE_UPLOAD_ORBIS')} onMouseOut={hide}>
|
||||
<OrbisIcon className='lg' />
|
||||
<button
|
||||
onClick={this._genOrbis}
|
||||
onMouseOver={termtip.bind(null, 'PHASE_UPLOAD_ORBIS')}
|
||||
onMouseOut={hide}
|
||||
>
|
||||
<OrbisIcon className="lg" />
|
||||
</button>
|
||||
<button onClick={this._genShoppingList} onMouseOver={termtip.bind(null, 'PHRASE_SHOPPING_MATS')} onMouseOut={hide}>
|
||||
<MatIcon className='lg' />
|
||||
<button
|
||||
onClick={this._genShoppingList}
|
||||
onMouseOver={termtip.bind(null, 'PHRASE_SHOPPING_MATS')}
|
||||
onMouseOut={hide}
|
||||
>
|
||||
<MatIcon className="lg" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Main tables */}
|
||||
<ShipSummaryTable ship={ship} fuel={fuel} cargo={cargo} marker={shipSummaryMarker} pips={{ sys: this.state.sys, wep: this.state.wep, eng: this.state.eng }} />
|
||||
<StandardSlotSection ship={ship} fuel={fuel} cargo={cargo} code={standardSlotMarker} onChange={shipUpdated} onCargoChange={this._cargoUpdated} onFuelChange={this._fuelUpdated} currentMenu={menu} sectionMenuRefs={this._sectionMenuRefs}/>
|
||||
<InternalSlotSection ship={ship} code={internalSlotMarker} onChange={shipUpdated} onCargoChange={this._cargoUpdated} onFuelChange={this._fuelUpdated} currentMenu={menu} sectionMenuRefs={this._sectionMenuRefs}/>
|
||||
<HardpointSlotSection ship={ship} code={hardpointsSlotMarker} onChange={shipUpdated} onCargoChange={this._cargoUpdated} onFuelChange={this._fuelUpdated} currentMenu={menu} sectionMenuRefs={this._sectionMenuRefs}/>
|
||||
<UtilitySlotSection ship={ship} code={hardpointsSlotMarker} onChange={shipUpdated} onCargoChange={this._cargoUpdated} onFuelChange={this._fuelUpdated} currentMenu={menu} sectionMenuRefs={this._sectionMenuRefs}/>
|
||||
<ShipSummaryTable
|
||||
ship={ship}
|
||||
fuel={fuel}
|
||||
cargo={cargo}
|
||||
marker={shipSummaryMarker}
|
||||
pips={{
|
||||
sys: this.state.sys,
|
||||
wep: this.state.wep,
|
||||
eng: this.state.eng
|
||||
}}
|
||||
/>
|
||||
<StandardSlotSection
|
||||
ship={ship}
|
||||
fuel={fuel}
|
||||
cargo={cargo}
|
||||
code={standardSlotMarker}
|
||||
onChange={shipUpdated}
|
||||
onCargoChange={this._cargoUpdated}
|
||||
onFuelChange={this._fuelUpdated}
|
||||
currentMenu={menu}
|
||||
sectionMenuRefs={this._sectionMenuRefs}
|
||||
/>
|
||||
<InternalSlotSection
|
||||
ship={ship}
|
||||
code={internalSlotMarker}
|
||||
onChange={shipUpdated}
|
||||
onCargoChange={this._cargoUpdated}
|
||||
onFuelChange={this._fuelUpdated}
|
||||
currentMenu={menu}
|
||||
sectionMenuRefs={this._sectionMenuRefs}
|
||||
/>
|
||||
<HardpointSlotSection
|
||||
ship={ship}
|
||||
code={hardpointsSlotMarker}
|
||||
onChange={shipUpdated}
|
||||
onCargoChange={this._cargoUpdated}
|
||||
onFuelChange={this._fuelUpdated}
|
||||
currentMenu={menu}
|
||||
sectionMenuRefs={this._sectionMenuRefs}
|
||||
/>
|
||||
<UtilitySlotSection
|
||||
ship={ship}
|
||||
code={hardpointsSlotMarker}
|
||||
onChange={shipUpdated}
|
||||
onCargoChange={this._cargoUpdated}
|
||||
onFuelChange={this._fuelUpdated}
|
||||
currentMenu={menu}
|
||||
sectionMenuRefs={this._sectionMenuRefs}
|
||||
/>
|
||||
|
||||
{/* Control of ship and opponent */}
|
||||
<div className='group quarter'>
|
||||
<div className='group half'>
|
||||
<h2 style={{ verticalAlign: 'middle', textAlign: 'left' }}>{translate('ship control')}</h2>
|
||||
<div className="group quarter">
|
||||
<div className="group half">
|
||||
<h2 style={{ verticalAlign: 'middle', textAlign: 'left' }}>
|
||||
{translate('ship control')}
|
||||
</h2>
|
||||
</div>
|
||||
<div className='group half'>
|
||||
<Boost marker={boostMarker} ship={ship} boost={boost} onChange={this._boostUpdated} />
|
||||
<div className="group half">
|
||||
<Boost
|
||||
marker={boostMarker}
|
||||
ship={ship}
|
||||
boost={boost}
|
||||
onChange={this._boostUpdated}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className='group quarter'>
|
||||
<Pips sys={sys} eng={eng} wep={wep} mcSys={mcSys} mcEng={mcEng} mcWep={mcWep} onChange={this._pipsUpdated} />
|
||||
<div className="group quarter">
|
||||
<Pips
|
||||
sys={sys}
|
||||
eng={eng}
|
||||
wep={wep}
|
||||
mcSys={mcSys}
|
||||
mcEng={mcEng}
|
||||
mcWep={mcWep}
|
||||
onChange={this._pipsUpdated}
|
||||
/>
|
||||
</div>
|
||||
<div className='group quarter'>
|
||||
<Fuel fuelCapacity={ship.fuelCapacity} fuel={fuel} onChange={this._fuelUpdated}/>
|
||||
<div className="group quarter">
|
||||
<Fuel
|
||||
fuelCapacity={ship.fuelCapacity}
|
||||
fuel={fuel}
|
||||
onChange={this._fuelUpdated}
|
||||
/>
|
||||
</div>
|
||||
<div className='group quarter'>
|
||||
{ ship.cargoCapacity > 0 ? <Cargo cargoCapacity={ship.cargoCapacity} cargo={cargo} onChange={this._cargoUpdated}/> : null }
|
||||
<div className="group quarter">
|
||||
{ship.cargoCapacity > 0 ? (
|
||||
<Cargo
|
||||
cargoCapacity={ship.cargoCapacity}
|
||||
cargo={cargo}
|
||||
onChange={this._cargoUpdated}
|
||||
/>
|
||||
) : null}
|
||||
</div>
|
||||
<div className='group half'>
|
||||
<div className='group quarter'>
|
||||
<h2 style={{ verticalAlign: 'middle', textAlign: 'left' }}>{translate('opponent')}</h2>
|
||||
<div className="group half">
|
||||
<div className="group quarter">
|
||||
<h2 style={{ verticalAlign: 'middle', textAlign: 'left' }}>
|
||||
{translate('opponent')}
|
||||
</h2>
|
||||
</div>
|
||||
<div className='group threequarters'>
|
||||
<ShipPicker ship={opponent.id} build={opponentBuild} onChange={this._opponentUpdated}/>
|
||||
<div className="group threequarters">
|
||||
<ShipPicker
|
||||
ship={opponent.id}
|
||||
build={opponentBuild}
|
||||
onChange={this._opponentUpdated}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className='group half'>
|
||||
<EngagementRange ship={ship} engagementRange={engagementRange} onChange={this._engagementRangeUpdated}/>
|
||||
<div className="group half">
|
||||
<EngagementRange
|
||||
ship={ship}
|
||||
engagementRange={engagementRange}
|
||||
onChange={this._engagementRangeUpdated}
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Tabbed subpages */}
|
||||
@@ -733,6 +1096,15 @@ export default class OutfittingPage extends Page {
|
||||
opponentEng={opponentEng}
|
||||
opponentWep={opponentWep}
|
||||
/>
|
||||
<Ad
|
||||
client="ca-pub-3709458261881414"
|
||||
slot="4156867783"
|
||||
format="auto"
|
||||
wrapperDivStyle={{
|
||||
marginTop: '15px',
|
||||
marginBottom: '20px'
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import Ship from '../shipyard/Ship';
|
||||
import * as ModuleUtils from '../shipyard/ModuleUtils';
|
||||
import { SizeMap } from '../shipyard/Constants';
|
||||
import Link from '../components/Link';
|
||||
import Ad from '../components/Ad';
|
||||
|
||||
/**
|
||||
* Counts the hardpoints by class/size
|
||||
@@ -24,7 +25,9 @@ function countInt(slot) {
|
||||
let crEligible = !slot.eligible || slot.eligible.cr;
|
||||
this.int[slot.maxClass - 1]++; // Subtract 1 since there is no Class 0 Internal compartment
|
||||
this.intCount++;
|
||||
this.maxCargo += crEligible ? ModuleUtils.findInternal('cr', slot.maxClass, 'E').cargo : 0;
|
||||
this.maxCargo += crEligible ?
|
||||
ModuleUtils.findInternal('cr', slot.maxClass, 'E').cargo :
|
||||
0;
|
||||
|
||||
// if no eligiblity, then assume pce
|
||||
let passSlotType = null;
|
||||
@@ -42,7 +45,9 @@ function countInt(slot) {
|
||||
passSlotType = 'pcq';
|
||||
passSlotRating = 'B';
|
||||
}
|
||||
let passengerBay = passSlotType ? ModuleUtils.findMaxInternal(passSlotType, slot.maxClass, passSlotRating) : null;
|
||||
let passengerBay = passSlotType ?
|
||||
ModuleUtils.findMaxInternal(passSlotType, slot.maxClass, passSlotRating) :
|
||||
null;
|
||||
this.maxPassengers += passengerBay ? passengerBay.passengers : 0;
|
||||
}
|
||||
|
||||
@@ -62,7 +67,10 @@ function shipSummary(shipId, shipData) {
|
||||
hp: [0, 0, 0, 0, 0], // Utility, Small, Medium, Large, Huge
|
||||
int: [0, 0, 0, 0, 0, 0, 0, 0], // Sizes 1 - 8
|
||||
standard: shipData.slots.standard,
|
||||
agility: shipData.properties.pitch + shipData.properties.yaw + shipData.properties.roll
|
||||
agility:
|
||||
shipData.properties.pitch +
|
||||
shipData.properties.yaw +
|
||||
shipData.properties.roll
|
||||
};
|
||||
Object.assign(summary, shipData.properties);
|
||||
let ship = new Ship(shipId, shipData.properties, shipData.slots);
|
||||
@@ -97,7 +105,6 @@ function shipSummary(shipId, shipData) {
|
||||
* The Shipyard summary page
|
||||
*/
|
||||
export default class ShipyardPage extends Page {
|
||||
|
||||
static cachedShipSummaries = null;
|
||||
|
||||
/**
|
||||
@@ -145,12 +152,15 @@ export default class ShipyardPage extends Page {
|
||||
shipPredicateIndex = undefined;
|
||||
}
|
||||
|
||||
if (this.state.shipPredicate == shipPredicate && this.state.shipPredicateIndex == shipPredicateIndex) {
|
||||
if (
|
||||
this.state.shipPredicate == shipPredicate &&
|
||||
this.state.shipPredicateIndex == shipPredicateIndex
|
||||
) {
|
||||
shipDesc = !shipDesc;
|
||||
}
|
||||
|
||||
this.setState({ shipPredicate, shipDesc, shipPredicateIndex });
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the table row summary for the ship
|
||||
@@ -165,36 +175,40 @@ export default class ShipyardPage extends Page {
|
||||
_shipRowElement(s, translate, u, fInt, fRound, highlight) {
|
||||
let noTouch = this.context.noTouch;
|
||||
|
||||
return <tr
|
||||
return (
|
||||
<tr
|
||||
key={s.id}
|
||||
style={{ height: '1.5em' }}
|
||||
className={cn({ highlighted: noTouch && this.state.shipId === s.id, alt: highlight })}
|
||||
className={cn({
|
||||
highlighted: noTouch && this.state.shipId === s.id,
|
||||
alt: highlight
|
||||
})}
|
||||
onMouseEnter={noTouch && this._highlightShip.bind(this, s.id)}
|
||||
>
|
||||
<td className='ri'>{s.manufacturer}</td>
|
||||
<td className='ri'>{fInt(s.retailCost)}</td>
|
||||
<td className='ri cap'>{translate(SizeMap[s.class])}</td>
|
||||
<td className='ri'>{fInt(s.crew)}</td>
|
||||
<td className='ri'>{s.masslock}</td>
|
||||
<td className='ri'>{fInt(s.agility)}</td>
|
||||
<td className='ri'>{fInt(s.hardness)}</td>
|
||||
<td className='ri'>{fInt(s.hullMass)}</td>
|
||||
<td className='ri'>{fInt(s.speed)}</td>
|
||||
<td className='ri'>{fInt(s.boost)}</td>
|
||||
<td className='ri'>{fInt(s.baseArmour)}</td>
|
||||
<td className='ri'>{fInt(s.baseShieldStrength)}</td>
|
||||
<td className='ri'>{fInt(s.topSpeed)}</td>
|
||||
<td className='ri'>{fInt(s.topBoost)}</td>
|
||||
<td className='ri'>{fRound(s.maxJumpRange)}</td>
|
||||
<td className='ri'>{fInt(s.maxCargo)}</td>
|
||||
<td className='ri'>{fInt(s.maxPassengers)}</td>
|
||||
<td className='cn'>{s.standard[0]}</td>
|
||||
<td className='cn'>{s.standard[1]}</td>
|
||||
<td className='cn'>{s.standard[2]}</td>
|
||||
<td className='cn'>{s.standard[3]}</td>
|
||||
<td className='cn'>{s.standard[4]}</td>
|
||||
<td className='cn'>{s.standard[5]}</td>
|
||||
<td className='cn'>{s.standard[6]}</td>
|
||||
<td className="ri">{s.manufacturer}</td>
|
||||
<td className="ri">{fInt(s.retailCost)}</td>
|
||||
<td className="ri cap">{translate(SizeMap[s.class])}</td>
|
||||
<td className="ri">{fInt(s.crew)}</td>
|
||||
<td className="ri">{s.masslock}</td>
|
||||
<td className="ri">{fInt(s.agility)}</td>
|
||||
<td className="ri">{fInt(s.hardness)}</td>
|
||||
<td className="ri">{fInt(s.hullMass)}</td>
|
||||
<td className="ri">{fInt(s.speed)}</td>
|
||||
<td className="ri">{fInt(s.boost)}</td>
|
||||
<td className="ri">{fInt(s.baseArmour)}</td>
|
||||
<td className="ri">{fInt(s.baseShieldStrength)}</td>
|
||||
<td className="ri">{fInt(s.topSpeed)}</td>
|
||||
<td className="ri">{fInt(s.topBoost)}</td>
|
||||
<td className="ri">{fRound(s.maxJumpRange)}</td>
|
||||
<td className="ri">{fInt(s.maxCargo)}</td>
|
||||
<td className="ri">{fInt(s.maxPassengers)}</td>
|
||||
<td className="cn">{s.standard[0]}</td>
|
||||
<td className="cn">{s.standard[1]}</td>
|
||||
<td className="cn">{s.standard[2]}</td>
|
||||
<td className="cn">{s.standard[3]}</td>
|
||||
<td className="cn">{s.standard[4]}</td>
|
||||
<td className="cn">{s.standard[5]}</td>
|
||||
<td className="cn">{s.standard[6]}</td>
|
||||
<td className={cn({ disabled: !s.hp[1] })}>{s.hp[1]}</td>
|
||||
<td className={cn({ disabled: !s.hp[2] })}>{s.hp[2]}</td>
|
||||
<td className={cn({ disabled: !s.hp[3] })}>{s.hp[3]}</td>
|
||||
@@ -208,7 +222,8 @@ export default class ShipyardPage extends Page {
|
||||
<td className={cn({ disabled: !s.int[5] })}>{s.int[5]}</td>
|
||||
<td className={cn({ disabled: !s.int[6] })}>{s.int[6]}</td>
|
||||
<td className={cn({ disabled: !s.int[7] })}>{s.int[7]}</td>
|
||||
</tr>;
|
||||
</tr>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -222,7 +237,8 @@ export default class ShipyardPage extends Page {
|
||||
let fInt = formats.int;
|
||||
let fRound = formats.round;
|
||||
let { shipSummaries, shipPredicate, shipPredicateIndex } = this.state;
|
||||
let sortShips = (predicate, index) => this._sortShips.bind(this, predicate, index);
|
||||
let sortShips = (predicate, index) =>
|
||||
this._sortShips.bind(this, predicate, index);
|
||||
|
||||
let filters = {
|
||||
// 'class': { 1: 1, 2: 1}
|
||||
@@ -239,7 +255,8 @@ export default class ShipyardPage extends Page {
|
||||
|
||||
// Sort shipsOverview
|
||||
shipSummaries.sort((a, b) => {
|
||||
let valA = a[shipPredicate], valB = b[shipPredicate];
|
||||
let valA = a[shipPredicate],
|
||||
valB = b[shipPredicate];
|
||||
|
||||
if (shipPredicateIndex != undefined) {
|
||||
valA = valA[shipPredicateIndex];
|
||||
@@ -283,33 +300,56 @@ export default class ShipyardPage extends Page {
|
||||
lastShipSortValue = shipSortValue;
|
||||
}
|
||||
|
||||
detailRows[i] = this._shipRowElement(s, translate, units, fInt, formats.f1, backgroundHighlight);
|
||||
detailRows[i] = this._shipRowElement(
|
||||
s,
|
||||
translate,
|
||||
units,
|
||||
fInt,
|
||||
formats.f1,
|
||||
backgroundHighlight
|
||||
);
|
||||
shipRows[i] = (
|
||||
<tr
|
||||
key={i}
|
||||
style={{ height: '1.5em' }}
|
||||
className={cn({ highlighted: noTouch && this.state.shipId === s.id, alt: backgroundHighlight })}
|
||||
className={cn({
|
||||
highlighted: noTouch && this.state.shipId === s.id,
|
||||
alt: backgroundHighlight
|
||||
})}
|
||||
onMouseEnter={noTouch && this._highlightShip.bind(this, s.id)}
|
||||
>
|
||||
<td className='le'><Link href={'/outfit/' + s.id}>{s.name}</Link></td>
|
||||
<td className="le">
|
||||
<Link href={'/outfit/' + s.id}>{s.name}</Link>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
i++;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='page' style={{ fontSize: sizeRatio + 'em' }}>
|
||||
<div style={{ whiteSpace: 'nowrap', margin: '0 auto', fontSize: '0.8em', position: 'relative', display: 'inline-block', maxWidth: '100%' }}>
|
||||
<div className="page" style={{ fontSize: sizeRatio + 'em' }}>
|
||||
<div
|
||||
style={{
|
||||
whiteSpace: 'nowrap',
|
||||
margin: '0 auto',
|
||||
fontSize: '0.8em',
|
||||
position: 'relative',
|
||||
display: 'inline-block',
|
||||
maxWidth: '100%'
|
||||
}}
|
||||
>
|
||||
<table style={{ width: '12em', position: 'absolute', zIndex: 1 }}>
|
||||
<thead>
|
||||
<tr>
|
||||
<th className='le rgt'> </th>
|
||||
<th className="le rgt"> </th>
|
||||
</tr>
|
||||
<tr className='main'>
|
||||
<th className='sortable le rgt' onClick={sortShips('name')}>{translate('ship')}</th>
|
||||
<tr className="main">
|
||||
<th className="sortable le rgt" onClick={sortShips('name')}>
|
||||
{translate('ship')}
|
||||
</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th className='le rgt invisible'>{units['m/s']}</th>
|
||||
<th className="le rgt invisible">{units['m/s']}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody onMouseLeave={this._highlightShip.bind(this, null)}>
|
||||
@@ -319,78 +359,268 @@ export default class ShipyardPage extends Page {
|
||||
<div style={{ overflowX: 'scroll', maxWidth: '100%' }}>
|
||||
<table style={{ marginLeft: 'calc(12em - 1px)', zIndex: 0 }}>
|
||||
<thead>
|
||||
<tr className='main'>
|
||||
<th rowSpan={3} className='sortable' onClick={sortShips('manufacturer')}>{translate('manufacturer')}</th>
|
||||
<tr className="main">
|
||||
<th
|
||||
rowSpan={3}
|
||||
className="sortable"
|
||||
onClick={sortShips('manufacturer')}
|
||||
>
|
||||
{translate('manufacturer')}
|
||||
</th>
|
||||
<th> </th>
|
||||
<th rowSpan={3} className='sortable' onClick={sortShips('class')}>{translate('size')}</th>
|
||||
<th rowSpan={3} className='sortable' onClick={sortShips('crew')}>{translate('crew')}</th>
|
||||
<th rowSpan={3} className='sortable' onMouseEnter={termtip.bind(null, 'mass lock factor')} onMouseLeave={hide} onClick={sortShips('masslock')} >{translate('MLF')}</th>
|
||||
<th rowSpan={3} className='sortable' onClick={sortShips('agility')}>{translate('agility')}</th>
|
||||
<th rowSpan={3} className='sortable' onMouseEnter={termtip.bind(null, 'hardness')} onMouseLeave={hide} onClick={sortShips('hardness')}>{translate('hrd')}</th>
|
||||
<th
|
||||
rowSpan={3}
|
||||
className="sortable"
|
||||
onClick={sortShips('class')}
|
||||
>
|
||||
{translate('size')}
|
||||
</th>
|
||||
<th
|
||||
rowSpan={3}
|
||||
className="sortable"
|
||||
onClick={sortShips('crew')}
|
||||
>
|
||||
{translate('crew')}
|
||||
</th>
|
||||
<th
|
||||
rowSpan={3}
|
||||
className="sortable"
|
||||
onMouseEnter={termtip.bind(null, 'mass lock factor')}
|
||||
onMouseLeave={hide}
|
||||
onClick={sortShips('masslock')}
|
||||
>
|
||||
{translate('MLF')}
|
||||
</th>
|
||||
<th
|
||||
rowSpan={3}
|
||||
className="sortable"
|
||||
onClick={sortShips('agility')}
|
||||
>
|
||||
{translate('agility')}
|
||||
</th>
|
||||
<th
|
||||
rowSpan={3}
|
||||
className="sortable"
|
||||
onMouseEnter={termtip.bind(null, 'hardness')}
|
||||
onMouseLeave={hide}
|
||||
onClick={sortShips('hardness')}
|
||||
>
|
||||
{translate('hrd')}
|
||||
</th>
|
||||
<th> </th>
|
||||
<th colSpan={4}>{translate('base')}</th>
|
||||
<th colSpan={5}>{translate('max')}</th>
|
||||
<th className='lft' colSpan={7}></th>
|
||||
<th className='lft' colSpan={5}></th>
|
||||
<th className='lft' colSpan={8}></th>
|
||||
<th className="lft" colSpan={7} />
|
||||
<th className="lft" colSpan={5} />
|
||||
<th className="lft" colSpan={8} />
|
||||
</tr>
|
||||
<tr>
|
||||
<th className='sortable lft' onClick={sortShips('retailCost')}>{translate('cost')}</th>
|
||||
<th className='sortable lft' onClick={sortShips('hullMass')}>{translate('hull')}</th>
|
||||
<th className='sortable lft' onClick={sortShips('speed')}>{translate('speed')}</th>
|
||||
<th className='sortable' onClick={sortShips('boost')}>{translate('boost')}</th>
|
||||
<th className='sortable' onClick={sortShips('baseArmour')}>{translate('armour')}</th>
|
||||
<th className='sortable' onClick={sortShips('baseShieldStrength')}>{translate('shields')}</th>
|
||||
<th
|
||||
className="sortable lft"
|
||||
onClick={sortShips('retailCost')}
|
||||
>
|
||||
{translate('cost')}
|
||||
</th>
|
||||
<th className="sortable lft" onClick={sortShips('hullMass')}>
|
||||
{translate('hull')}
|
||||
</th>
|
||||
<th className="sortable lft" onClick={sortShips('speed')}>
|
||||
{translate('speed')}
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('boost')}>
|
||||
{translate('boost')}
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('baseArmour')}>
|
||||
{translate('armour')}
|
||||
</th>
|
||||
<th
|
||||
className="sortable"
|
||||
onClick={sortShips('baseShieldStrength')}
|
||||
>
|
||||
{translate('shields')}
|
||||
</th>
|
||||
|
||||
<th className='sortable lft' onClick={sortShips('topSpeed')}>{translate('speed')}</th>
|
||||
<th className='sortable' onClick={sortShips('topBoost')}>{translate('boost')}</th>
|
||||
<th className='sortable' onClick={sortShips('maxJumpRange')}>{translate('jump')}</th>
|
||||
<th className='sortable' onClick={sortShips('maxCargo')}>{translate('cargo')}</th>
|
||||
<th className='sortable' onClick={sortShips('maxPassengers')}>{translate('pax')}</th>
|
||||
<th className="sortable lft" onClick={sortShips('topSpeed')}>
|
||||
{translate('speed')}
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('topBoost')}>
|
||||
{translate('boost')}
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('maxJumpRange')}>
|
||||
{translate('jump')}
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('maxCargo')}>
|
||||
{translate('cargo')}
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('maxPassengers')}>
|
||||
{translate('pax')}
|
||||
</th>
|
||||
|
||||
<th className='lft' colSpan={7}>{translate('core module classes')}</th>
|
||||
<th colSpan={5} className='sortable lft' onClick={sortShips('hpCount')}>{translate('hardpoints')}</th>
|
||||
<th colSpan={8} className='sortable lft' onClick={sortShips('intCount')}>{translate('internal compartments')}</th>
|
||||
<th className="lft" colSpan={7}>
|
||||
{translate('core module classes')}
|
||||
</th>
|
||||
<th
|
||||
colSpan={5}
|
||||
className="sortable lft"
|
||||
onClick={sortShips('hpCount')}
|
||||
>
|
||||
{translate('hardpoints')}
|
||||
</th>
|
||||
<th
|
||||
colSpan={8}
|
||||
className="sortable lft"
|
||||
onClick={sortShips('intCount')}
|
||||
>
|
||||
{translate('internal compartments')}
|
||||
</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th className='sortable lft' onClick={sortShips('retailCost')}>{units.CR}</th>
|
||||
<th className='sortable lft' onClick={sortShips('hullMass')}>{units.T}</th>
|
||||
<th className='sortable lft' onClick={sortShips('speed')}>{units['m/s']}</th>
|
||||
<th className='sortable' onClick={sortShips('boost')}>{units['m/s']}</th>
|
||||
<th
|
||||
className="sortable lft"
|
||||
onClick={sortShips('retailCost')}
|
||||
>
|
||||
{units.CR}
|
||||
</th>
|
||||
<th className="sortable lft" onClick={sortShips('hullMass')}>
|
||||
{units.T}
|
||||
</th>
|
||||
<th className="sortable lft" onClick={sortShips('speed')}>
|
||||
{units['m/s']}
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('boost')}>
|
||||
{units['m/s']}
|
||||
</th>
|
||||
<th> </th>
|
||||
<th className='sortable' onClick={sortShips('baseShieldStrength')}>{units.MJ}</th>
|
||||
<th className='sortable lft' onClick={sortShips('topSpeed')}>{units['m/s']}</th>
|
||||
<th className='sortable' onClick={sortShips('topBoost')}>{units['m/s']}</th>
|
||||
<th className='sortable' onClick={sortShips('maxJumpRange')}>{units.LY}</th>
|
||||
<th className='sortable' onClick={sortShips('maxCargo')}>{units.T}</th>
|
||||
<th
|
||||
className="sortable"
|
||||
onClick={sortShips('baseShieldStrength')}
|
||||
>
|
||||
{units.MJ}
|
||||
</th>
|
||||
<th className="sortable lft" onClick={sortShips('topSpeed')}>
|
||||
{units['m/s']}
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('topBoost')}>
|
||||
{units['m/s']}
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('maxJumpRange')}>
|
||||
{units.LY}
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('maxCargo')}>
|
||||
{units.T}
|
||||
</th>
|
||||
<th> </th>
|
||||
<th className='sortable lft' onMouseEnter={termtip.bind(null, 'power plant')} onMouseLeave={hide} onClick={sortShips('standard', 0)}>{'pp'}</th>
|
||||
<th className='sortable' onMouseEnter={termtip.bind(null, 'thrusters')} onMouseLeave={hide} onClick={sortShips('standard', 1)}>{'th'}</th>
|
||||
<th className='sortable' onMouseEnter={termtip.bind(null, 'frame shift drive')} onMouseLeave={hide} onClick={sortShips('standard', 2)}>{'fsd'}</th>
|
||||
<th className='sortable' onMouseEnter={termtip.bind(null, 'life support')} onMouseLeave={hide} onClick={sortShips('standard', 3)}>{'ls'}</th>
|
||||
<th className='sortable' onMouseEnter={termtip.bind(null, 'power distriubtor')} onMouseLeave={hide} onClick={sortShips('standard', 4)}>{'pd'}</th>
|
||||
<th className='sortable' onMouseEnter={termtip.bind(null, 'sensors')} onMouseLeave={hide} onClick={sortShips('standard', 5)}>{'s'}</th>
|
||||
<th className='sortable' onMouseEnter={termtip.bind(null, 'fuel tank')} onMouseLeave={hide} onClick={sortShips('standard', 6)}>{'ft'}</th>
|
||||
<th className='sortable lft' onClick={sortShips('hp',1)}>{translate('S')}</th>
|
||||
<th className='sortable' onClick={sortShips('hp', 2)}>{translate('M')}</th>
|
||||
<th className='sortable' onClick={sortShips('hp', 3)}>{translate('L')}</th>
|
||||
<th className='sortable' onClick={sortShips('hp', 4)}>{translate('H')}</th>
|
||||
<th className='sortable' onClick={sortShips('hp', 0)}>{translate('U')}</th>
|
||||
<th
|
||||
className="sortable lft"
|
||||
onMouseEnter={termtip.bind(null, 'power plant')}
|
||||
onMouseLeave={hide}
|
||||
onClick={sortShips('standard', 0)}
|
||||
>
|
||||
{'pp'}
|
||||
</th>
|
||||
<th
|
||||
className="sortable"
|
||||
onMouseEnter={termtip.bind(null, 'thrusters')}
|
||||
onMouseLeave={hide}
|
||||
onClick={sortShips('standard', 1)}
|
||||
>
|
||||
{'th'}
|
||||
</th>
|
||||
<th
|
||||
className="sortable"
|
||||
onMouseEnter={termtip.bind(null, 'frame shift drive')}
|
||||
onMouseLeave={hide}
|
||||
onClick={sortShips('standard', 2)}
|
||||
>
|
||||
{'fsd'}
|
||||
</th>
|
||||
<th
|
||||
className="sortable"
|
||||
onMouseEnter={termtip.bind(null, 'life support')}
|
||||
onMouseLeave={hide}
|
||||
onClick={sortShips('standard', 3)}
|
||||
>
|
||||
{'ls'}
|
||||
</th>
|
||||
<th
|
||||
className="sortable"
|
||||
onMouseEnter={termtip.bind(null, 'power distriubtor')}
|
||||
onMouseLeave={hide}
|
||||
onClick={sortShips('standard', 4)}
|
||||
>
|
||||
{'pd'}
|
||||
</th>
|
||||
<th
|
||||
className="sortable"
|
||||
onMouseEnter={termtip.bind(null, 'sensors')}
|
||||
onMouseLeave={hide}
|
||||
onClick={sortShips('standard', 5)}
|
||||
>
|
||||
{'s'}
|
||||
</th>
|
||||
<th
|
||||
className="sortable"
|
||||
onMouseEnter={termtip.bind(null, 'fuel tank')}
|
||||
onMouseLeave={hide}
|
||||
onClick={sortShips('standard', 6)}
|
||||
>
|
||||
{'ft'}
|
||||
</th>
|
||||
<th className="sortable lft" onClick={sortShips('hp', 1)}>
|
||||
{translate('S')}
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('hp', 2)}>
|
||||
{translate('M')}
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('hp', 3)}>
|
||||
{translate('L')}
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('hp', 4)}>
|
||||
{translate('H')}
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('hp', 0)}>
|
||||
{translate('U')}
|
||||
</th>
|
||||
|
||||
<th className='sortable lft' onClick={sortShips('int', 0)} >1</th>
|
||||
<th className='sortable' onClick={sortShips('int', 1)} >2</th>
|
||||
<th className='sortable' onClick={sortShips('int', 2)} >3</th>
|
||||
<th className='sortable' onClick={sortShips('int', 3)} >4</th>
|
||||
<th className='sortable' onClick={sortShips('int', 4)} >5</th>
|
||||
<th className='sortable' onClick={sortShips('int', 5)} >6</th>
|
||||
<th className='sortable' onClick={sortShips('int', 6)} >7</th>
|
||||
<th className='sortable' onClick={sortShips('int', 7)} >8</th>
|
||||
<th className="sortable lft" onClick={sortShips('int', 0)}>
|
||||
1
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('int', 1)}>
|
||||
2
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('int', 2)}>
|
||||
3
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('int', 3)}>
|
||||
4
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('int', 4)}>
|
||||
5
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('int', 5)}>
|
||||
6
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('int', 6)}>
|
||||
7
|
||||
</th>
|
||||
<th className="sortable" onClick={sortShips('int', 7)}>
|
||||
8
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody onMouseLeave={this._highlightShip.bind(this, null)}>
|
||||
{detailRows}
|
||||
</tbody>
|
||||
</table>
|
||||
<Ad
|
||||
client="ca-pub-3709458261881414"
|
||||
slot="4156867783"
|
||||
format="auto"
|
||||
wrapperDivStyle={{
|
||||
marginTop: '15px',
|
||||
marginBottom: '20px'
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html manifest="/">
|
||||
<html>
|
||||
<head>
|
||||
<title>Coriolis EDCD Edition</title>
|
||||
<meta charset="UTF-8">
|
||||
@@ -31,10 +31,7 @@
|
||||
</script>
|
||||
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
|
||||
<script>
|
||||
(adsbygoogle = window.adsbygoogle || []).push({
|
||||
google_ad_client: "ca-pub-3709458261881414",
|
||||
enable_page_level_ads: true
|
||||
});
|
||||
(adsbygoogle = window.adsbygoogle || []).push({});
|
||||
</script>
|
||||
<% if (htmlWebpackPlugin.options.uaTracking) { %>
|
||||
<script>
|
||||
|
||||
Reference in New Issue
Block a user