mirror of
https://github.com/EDCD/coriolis.git
synced 2025-12-09 14:45:35 +00:00
Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
97f3bece33 | ||
|
|
be02444487 | ||
|
|
fc012fe68a | ||
|
|
7ac16d6d22 | ||
|
|
d82128690b | ||
|
|
9e57eb4262 | ||
|
|
6e0d45f419 | ||
|
|
645e86714e | ||
|
|
00afd1cd6a | ||
|
|
77ae126a51 | ||
|
|
9c82c7caed | ||
|
|
d9a92e7a78 | ||
|
|
d8a87029a6 | ||
|
|
f407d0f92a | ||
|
|
4ac42e62e6 | ||
|
|
748c63fa0b | ||
|
|
78ca756cef | ||
|
|
a8554b51c2 | ||
|
|
e54e4da289 | ||
|
|
f97cb5f5a7 | ||
|
|
318e8077d0 | ||
|
|
c8355a532d | ||
|
|
3686ccd4ed | ||
|
|
f02db0120a | ||
|
|
d9ad93d3cd | ||
|
|
77018cc1ad | ||
|
|
30a8a29ce3 | ||
|
|
7b1aa646ac | ||
|
|
49e4409862 |
@@ -3,7 +3,7 @@ notifications:
|
||||
email: false
|
||||
sudo: false
|
||||
node_js:
|
||||
- "4.2.6"
|
||||
- "4.8.1"
|
||||
cache:
|
||||
directories:
|
||||
- node_modules
|
||||
@@ -12,4 +12,4 @@ before_script:
|
||||
|
||||
script:
|
||||
- npm run lint
|
||||
- npm test
|
||||
- npm test
|
||||
|
||||
17
ChangeLog.md
17
ChangeLog.md
@@ -1,3 +1,20 @@
|
||||
#2.3.7
|
||||
* Fixed Travis test issues
|
||||
* Bumped NodeJS version to provide better compatability and support
|
||||
* Added updated German Translation
|
||||
* Fixed issues with Safari
|
||||
* Use coriolis-data 2.3.7
|
||||
* Fixed Orca mass-lock
|
||||
|
||||
#2.3.6
|
||||
* Update miner role to provide better defaults
|
||||
* Fix issue where torpedo special effects were not showing
|
||||
* Fix typo causing long range blueprint to not modify shot speed in some circumstances
|
||||
* Fix for Spanish translation of Chaff Launcher (thanks to DamonFstr)
|
||||
* Update for Russian translation (thanks to LeeNTien)
|
||||
* Use coriolis-data 2.3.6:
|
||||
* Add shotspeed modifier to cannon/multi-cannon/fragment cannon
|
||||
|
||||
#2.3.5
|
||||
* Ensure that hidden blueprint effects are applied when a blueprint is selected
|
||||
* Handle display when summary values show thrusters disabled but current mass keeps them enabled
|
||||
|
||||
@@ -169,7 +169,7 @@ describe('Import Modal', function() {
|
||||
expect(modal.state.singleBuild).toBe(true);
|
||||
clickProceed();
|
||||
expect(MockRouter.go.mock.calls.length).toBe(1);
|
||||
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/anaconda?code=A4putkFklkdzsuf52c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04---0303326b.AwRj4zNLaA%3D%3D.CwBhCYzBGW9qCTSqq5xA.H4sIAAAAAAAAA2MUe8HMwPD%2FPwMcAABTINwTEgAAAA%3D%3D&bn=Test%20My%20Ship');
|
||||
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/anaconda?code=A4putkFklkdzsuf52c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04---0303326b.AwRj4zNLaA%3D%3D.CwBhCYzBGW9qCTSqq5xA.H4sIAAAAAAAAA2MUe8HMwPD%2FPwMAAGvB0AkAAAA%3D&bn=Test%20My%20Ship');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -186,7 +186,7 @@ describe('Import Modal', function() {
|
||||
expect(modal.state.singleBuild).toBe(true);
|
||||
clickProceed();
|
||||
expect(MockRouter.go.mock.calls.length).toBe(1);
|
||||
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/asp?code=A0pftiFflfddsnf5------020202033c044002v62f2i.AwRj4yvI.CwRgDBldHnJA.H4sIAAAAAAAAA2P858DAwPCXEUhwHPvx%2F78YG5AltB7I%2F8%2F0TwImJboDSPJ%2F%2B%2Ff%2Fv%2FKlX%2F%2F%2Fi3AwMTBIfARK%2FGf%2BJwVSxArStVAYqOjvz%2F%2F%2FJVo5GRhE2IBc4SKQSSz%2FDGEmCa398P8%2F%2F2%2BgTf%2F%2FAwDFxwtofAAAAA%3D%3D&bn=Multi-purpose%20Asp%20Explorer');
|
||||
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/asp?code=A0pftiFflfddsnf5------020202033c044002v62f2i.AwRj4yvI.CwRgDBldHnJA.H4sIAAAAAAAAA2P858DAwPCXEUhwHPvx%2F78YG5AltB7I%2F8%2F0TwImJboDSPJ%2F%2B%2Ff%2Fv%2FKlX%2F%2F%2Fi3AwMTBIfARK%2FGf%2BJwVSxArStVAYqOjvz%2F%2F%2FJVo5GRhE2IBc4SKQSSz%2FDGEmCa398P8%2F%2F2%2BgTf%2F%2FA7kMAExxqlSAAAAA&bn=Multi-purpose%20Asp%20Explorer');
|
||||
});
|
||||
|
||||
it('imports a valid v4 build with modifications', function() {
|
||||
@@ -198,7 +198,7 @@ describe('Import Modal', function() {
|
||||
expect(modal.state.singleBuild).toBe(true);
|
||||
clickProceed();
|
||||
expect(MockRouter.go.mock.calls.length).toBe(1);
|
||||
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/imperial_courier?code=A0patzF5l0das8f31a1a270202000e402t0101-2f.AwRj4zKA.CwRgDBldLiQ%3D.H4sIAAAAAAAAA12OP0tCYRjFj9fuVbvF1du9ekkT8s%2FkIg4NElyIBBd321yaGvwUQTS3N7UFfYygIT9EoyQUJA36ns47XJCWA%2B%2Fz%2Bz3Pe3ImBbDNKaqNPSBoGrL4ngfomKpFGiJ%2BLgHteR1IPjxJT5pF11uSeXNsJVcRfgdC92syWUuK0iMdKZqrjJ%2F0aoA71lJ5oKf38knWcCiptCPdhJIerdS00vlK0qktlqoj983UmqqHjQ33VsW8eazFmaTyULP2hQ4lX8LBme6g%2F6v0TTdbxJ2KhdEIaCw15MF%2FNB0L%2BS2hwEwyFM8KgP%2BqEpWWA3Qu9Z3z9kPWHzakt7Dt%2BAeD7ghSTgEAAA%3D%3D&bn=Multi-purpose%20Imperial%20Courier');
|
||||
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/imperial_courier?code=A0patzF5l0das8f31a1a270202000e402t0101-2f.AwRj4zKA.CwRgDBldLiQ%3D.H4sIAAAAAAAAA12OPUvDYBSFT1OTfkRJjUkbbC3Yj8mlODgUISAtdOlety5ODv0Vgji7O7kJ%2FgzBQX%2BEY7Gg0NKhfY%2FnHQLFDBdynufe9%2BRMCmCb06g29oCgacjiRx6gY6oWKUT8UgLaszqQfHmSnpVFN1uSeXNsJVcj%2FA2EHlZkspIUpUc6UjTXGT85qwHuSEuVc%2F16r99kDQeSSjvSbSjpyUpNK10uJJ3aYqk6smwm1lQ9bOxw71TMm8VanEqq9JW1r3Qo%2BREOLnQHvbWmb7rZIu5VLIyGQGOukPv%2F0WQk5LeEAjPOUDwtAP6bShy2HKAz0HPO%2B5KsP25I79O2I7LvD%2Bz4Il1XAQAA&bn=Multi-purpose%20Imperial%20Courier');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -240,7 +240,7 @@ describe('Import Modal', function() {
|
||||
expect(modal.state.singleBuild).toBe(true);
|
||||
clickProceed();
|
||||
expect(MockRouter.go.mock.calls.length).toBe(1);
|
||||
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/federal_corvette?code=A2putsFklndzsxf50x0x7l28281919040404040402020l06p05sf63c5ifr--v66g2f.AwRj4zNaqA%3D%3D.CwRgDBldUExuBiIlUA%3D%3D.H4sIAAAAAAAAA02SPy9DURjG3%2F65vW1v47TXVbeqqF7EQtIIBomRJswsYmISH8BgkFhqFZ9AwlALMYitkXQyEF2k4SMYJNK0dV7PK7nc5ck55%2Fm9z%2FnznpBeJqLvECQbM4hUjZnjO5hyWGfFikAGGjGiku0QuddhQCNdZmdWM9snsDmih4REOdlnNvz9DrPrJIicPdSwoZf8pAnTIpq8x7DYADS%2Bi5DERY85%2BYqpmkc6x%2FWGf6beKCR3YBIZFZCxCgrtczjuOmo4qTf94F4KYuxhz5jjEhXmUJNexFrpIUo02ALN1j9u1JMgD%2FMga1GfbMNRd9iHUwGy%2BpspZF3IBSGvMFJluS%2FuR24FJ2KlV%2Fxju6sQq4lhRsQTUVUJTgegLtS6EUjEE1HPAmUC0KdAjwKJeCKqD8zoURx72gHyDW9nvQhJGHkyUscS1x%2BAZnAlqwU%2FI%2BKJKEvextXrf93eQrR1KUlS5HWwGC61mfOn0oN3IM4OHoBzuuIHj33hS5jT8KeamIYa0sjhgH%2BLfplP4kcwD5Xl3xR1wfeHtqWzBHHX8I9SH9Je%2FgGvXxeungIAAA%3D%3D&bn=Imported%20Federal%20Corvette');
|
||||
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/federal_corvette?code=A2putsFklndzsxf50x0x7l28281919040404040402020l06p05sf63c5ifr--v66g2f.AwRj4zNaqA%3D%3D.CwRgDBldUExuBiIlUA%3D%3D.H4sIAAAAAAAAA12STy8DURTFb1szU53Ga8dg2qqqDmJDIoKFxJImumYjVrVqfAALC4lNbcUnkLCoDbEQu0bSlQVhI8JHsJBIQ73rXMkwMYuT9%2Bb87nl%2F7ovoRSL6ikD6TYNINZg5XsWUo7pfrBikr2USlRyXyDuLAhr6ZHanNLOzD5tjOiskysk5dOBvfTB7bjeRW0MNG3ohSBq1bKKxKwyLLUAjmwjpPu4wJx4xVbNI57heDfbUKUAy2xaRUQZpllHoHMHxKqjhhF4LgjtJiFHDmqbrEeVnUJOax7%2FSdRfRwBNotv9wo5kAuZMD2egKyDYcdYl1OBki6z%2BZQjaFnBPyFCM1LefF%2BcgrY0es9FKwbW8ZYj9gmBbxRVRdglMh6BNqnwsk4ouoO4HSIehNoBuBRHwR1QOmsBvHmk6IfMbd2fdCEka%2BjNSexPWGoEkcyX6CnxbxRZQtd%2BPpym%2B31xFtn0iSFPkf%2BBkttZlzB9KDFyBuFRfAGV0Ogoff8SSsCfjjD5hGWtLIwZB%2FgX5Zt%2BLHMI9My7sp6nzgZzekswTxVvCOkq%2FSXqb%2F3zfLxh6HrwIAAA%3D%3D&bn=Imported%20Federal%20Corvette');
|
||||
});
|
||||
|
||||
it('imports a valid companion API build', function() {
|
||||
@@ -252,7 +252,7 @@ describe('Import Modal', function() {
|
||||
expect(modal.state.singleBuild).toBe(true);
|
||||
clickProceed();
|
||||
expect(MockRouter.go.mock.calls.length).toBe(1);
|
||||
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/beluga?code=A0pktsFplCdpsnf70t0t2727270004040404043c4fmimlmm04mc0iv62i2f.AwRj4yukg%3D%3D%3D.CwRgDBldHi8IUA%3D%3D.H4sIAAAAAAAAA2P8Z8%2FAwPCXEUiIKTMxMPCv%2F%2Ff%2FP8cFIPGf6Z8YTEr0GjMDg%2FJWICERBOTzn%2Fn7%2F7%2FIO5Ai5n9SIEWsQEIoSxAolfbt%2F3%2BJPk4GBhE7YQYGYVmgcuVnf4Aq%2FwMAIrEcGGsAAAA%3D&bn=Imported%20Beluga%20Liner');
|
||||
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/beluga?code=A0pktsFplCdpsnf70t0t2727270004040404043c4fmimlmm04mc0iv62i2f.AwRj4yukg%3D%3D%3D.CwRgDBldHi8IUA%3D%3D.H4sIAAAAAAAAA2P8Z8%2FAwPCXEUiIKTMxMPCv%2F%2Ff%2FP8cFIPGf6Z8YTEr0GjMDg%2FJWICERBOTzn%2Fn7%2F7%2FIO5Ai5n9SIEWsQEIoSxAolfbt%2F3%2BJPk4GBhE7YQYGYVmgcuVnf4Aq%2FwOVAAAyiFctbgAAAA%3D%3D&bn=Imported%20Beluga%20Liner');
|
||||
});
|
||||
|
||||
it('imports a valid companion API build', function() {
|
||||
@@ -276,7 +276,7 @@ describe('Import Modal', function() {
|
||||
expect(modal.state.singleBuild).toBe(true);
|
||||
clickProceed();
|
||||
expect(MockRouter.go.mock.calls.length).toBe(1);
|
||||
expect(MockRouter.go.mock.calls[0][0]).toBe('outfit/cobra_mk_iii?code=A0p0tdFaldd3sdf4------34---2f2i.AwRj4yKA.CwRgDMYExre1Rcg%3D..EweloBhBGA2EoFMCGBzANokMK6A%3D');
|
||||
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/cobra_mk_iii?code=A0p0tdFaldd3sdf4------34---2f2i.AwRj4yKA.CwRgDMYExrezBUg%3D.&bn=Imported%20Cobra%20Mk%20III');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "coriolis_shipyard",
|
||||
"version": "2.3.5",
|
||||
"version": "2.3.7",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/EDCD/coriolis"
|
||||
@@ -8,7 +8,7 @@
|
||||
"homepage": "https://coriolis.edcd.io",
|
||||
"bugs": "https://github.com/EDCD/coriolis/issues",
|
||||
"private": true,
|
||||
"engine": "node >= 4.0.0",
|
||||
"engine": "node >= 4.8.1",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"prepublish": "rollup -c && uglifyjs d3.js -c -m -o d3.min.js",
|
||||
@@ -84,7 +84,8 @@
|
||||
"style-loader": "^0.16.1",
|
||||
"url-loader": "^0.5.8",
|
||||
"webpack": "^2.4.1",
|
||||
"webpack-dev-server": "^2.4.4"
|
||||
"webpack-dev-server": "^2.4.4",
|
||||
"uglify-js": "^2.4.11"
|
||||
},
|
||||
"dependencies": {
|
||||
"babel-polyfill": "*",
|
||||
|
||||
@@ -62,7 +62,7 @@ export default class HardpointSlot extends Slot {
|
||||
);
|
||||
}
|
||||
|
||||
const className = cn('details', enabled ? '' : 'disabled')
|
||||
const className = cn('details', enabled ? '' : 'disabled');
|
||||
return <div className={className} draggable='true' onDragStart={drag} onDragEnd={drop}>
|
||||
<div className={'cb'}>
|
||||
<div className={'l'}>
|
||||
|
||||
@@ -43,7 +43,7 @@ export default class InternalSlot extends Slot {
|
||||
|
||||
let mass = m.getMass() || m.cargo || m.fuel || 0;
|
||||
|
||||
const className = cn('details', enabled ? '' : 'disabled')
|
||||
const className = cn('details', enabled ? '' : 'disabled');
|
||||
return <div className={className} draggable='true' onDragStart={drag} onDragEnd={drop}>
|
||||
<div className={'cb'}>
|
||||
<div className={'l'}>{classRating} {translate(m.name || m.grp)}{m.mods && Object.keys(m.mods).length > 0 ? <span onMouseOver={termtip.bind(null, modTT)} onMouseOut={tooltip.bind(null, null)}><Modified /></span> : ''}</div>
|
||||
|
||||
@@ -216,7 +216,6 @@ export default class InternalSlotSection extends SlotSection {
|
||||
onChange={this.props.onChange}
|
||||
onSelect={this._selectModule.bind(this, s)}
|
||||
selected={currentMenu == s}
|
||||
enabled={s.enabled}
|
||||
eligible={s.eligible}
|
||||
m={s.m}
|
||||
drag={this._drag.bind(this, s)}
|
||||
|
||||
@@ -88,7 +88,7 @@ export default class ModificationsMenu extends TranslatedComponent {
|
||||
const translate = language.translate;
|
||||
|
||||
const specials = [];
|
||||
const specialsId = m.missile ? 'specials_' + m.missile : 'specials';
|
||||
const specialsId = m.missile && Modifications.modules[m.grp]['specials_' + m.missile] ? 'specials_' + m.missile : 'specials';
|
||||
if (Modifications.modules[m.grp][specialsId] && Modifications.modules[m.grp][specialsId].length > 0) {
|
||||
const close = this._specialSelected.bind(this, null);
|
||||
specials.push(<div style={{ cursor: 'pointer' }} key={ 'none' } onClick={ close }>{translate('PHRASE_NO_SPECIAL')}</div>);
|
||||
|
||||
@@ -23,11 +23,11 @@ export default class ShipPicker extends TranslatedComponent {
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param {Object} props React Component properties
|
||||
* @param {Object} context React Component context
|
||||
* constructor
|
||||
* @param {object} props Properties react
|
||||
* @param {object} context react context
|
||||
*/
|
||||
constructor(props, context) {
|
||||
constructor(props, context) { // eslint-disable-line
|
||||
super(props);
|
||||
|
||||
this.shipOrder = Object.keys(Ships).sort();
|
||||
@@ -39,8 +39,8 @@ export default class ShipPicker extends TranslatedComponent {
|
||||
|
||||
/**
|
||||
* Update ship
|
||||
* @param {object} ship the ship
|
||||
* @param {string} build the build, if present
|
||||
* @param {object} ship the ship
|
||||
* @param {string} build the build, if present
|
||||
*/
|
||||
_shipChange(ship, build) {
|
||||
this._closeMenu();
|
||||
|
||||
@@ -15,6 +15,8 @@ export default class SlotSection extends TranslatedComponent {
|
||||
static propTypes = {
|
||||
ship: PropTypes.object.isRequired,
|
||||
onChange: PropTypes.func.isRequired,
|
||||
onCargoChange: PropTypes.func.isRequired,
|
||||
onFuelChange: PropTypes.func.isRequired,
|
||||
code: PropTypes.string.isRequired,
|
||||
togglePwr: PropTypes.func
|
||||
};
|
||||
@@ -129,44 +131,46 @@ export default class SlotSection extends TranslatedComponent {
|
||||
let { originSlot, targetSlot, copy } = this.state;
|
||||
let m = originSlot.m;
|
||||
|
||||
if (copy) {
|
||||
// We want to copy the module in to the target slot
|
||||
if (targetSlot && canMount(this.props.ship, targetSlot, m.grp, m.class)) {
|
||||
const mCopy = m.clone();
|
||||
this.props.ship.use(targetSlot, mCopy, false);
|
||||
// Copy power info
|
||||
targetSlot.enabled = originSlot.enabled;
|
||||
targetSlot.priority = originSlot.priority;
|
||||
this.props.onChange();
|
||||
}
|
||||
} else {
|
||||
// Store power info
|
||||
const originEnabled = targetSlot.enabled;
|
||||
const originPriority = targetSlot.priority;
|
||||
const targetEnabled = originSlot.enabled;
|
||||
const targetPriority = originSlot.priority;
|
||||
// We want to move the module in to the target slot, and swap back any module that was originally in the target slot
|
||||
if (targetSlot && m && canMount(this.props.ship, targetSlot, m.grp, m.class)) {
|
||||
// Swap modules if possible
|
||||
if (targetSlot.m && canMount(this.props.ship, originSlot, targetSlot.m.grp, targetSlot.m.class)) {
|
||||
this.props.ship.use(originSlot, targetSlot.m, true);
|
||||
this.props.ship.use(targetSlot, m);
|
||||
// Swap power
|
||||
originSlot.enabled = originEnabled;
|
||||
originSlot.priority = originPriority;
|
||||
targetSlot.enabled = targetEnabled;
|
||||
targetSlot.priority = targetPriority;
|
||||
} else { // Otherwise empty the origin slot
|
||||
// Store power
|
||||
const targetEnabled = originSlot.enabled;
|
||||
this.props.ship.use(originSlot, null, true); // Empty but prevent summary update
|
||||
this.props.ship.use(targetSlot, m);
|
||||
originSlot.enabled = 0;
|
||||
originSlot.priority = 0;
|
||||
targetSlot.enabled = targetEnabled;
|
||||
targetSlot.priority = targetPriority;
|
||||
if (targetSlot && originSlot != targetSlot) {
|
||||
if (copy) {
|
||||
// We want to copy the module in to the target slot
|
||||
if (targetSlot && canMount(this.props.ship, targetSlot, m.grp, m.class)) {
|
||||
const mCopy = m.clone();
|
||||
this.props.ship.use(targetSlot, mCopy, false);
|
||||
// Copy power info
|
||||
targetSlot.enabled = originSlot.enabled;
|
||||
targetSlot.priority = originSlot.priority;
|
||||
this.props.onChange();
|
||||
}
|
||||
} else {
|
||||
// Store power info
|
||||
const originEnabled = targetSlot.enabled;
|
||||
const originPriority = targetSlot.priority;
|
||||
const targetEnabled = originSlot.enabled;
|
||||
const targetPriority = originSlot.priority;
|
||||
// We want to move the module in to the target slot, and swap back any module that was originally in the target slot
|
||||
if (targetSlot && m && canMount(this.props.ship, targetSlot, m.grp, m.class)) {
|
||||
// Swap modules if possible
|
||||
if (targetSlot.m && canMount(this.props.ship, originSlot, targetSlot.m.grp, targetSlot.m.class)) {
|
||||
this.props.ship.use(originSlot, targetSlot.m, true);
|
||||
this.props.ship.use(targetSlot, m);
|
||||
// Swap power
|
||||
originSlot.enabled = originEnabled;
|
||||
originSlot.priority = originPriority;
|
||||
targetSlot.enabled = targetEnabled;
|
||||
targetSlot.priority = targetPriority;
|
||||
} else { // Otherwise empty the origin slot
|
||||
// Store power
|
||||
const targetEnabled = originSlot.enabled;
|
||||
this.props.ship.use(originSlot, null, true); // Empty but prevent summary update
|
||||
this.props.ship.use(targetSlot, m);
|
||||
originSlot.enabled = 0;
|
||||
originSlot.priority = 0;
|
||||
targetSlot.enabled = targetEnabled;
|
||||
targetSlot.priority = targetPriority;
|
||||
}
|
||||
this.props.onChange();
|
||||
}
|
||||
this.props.onChange();
|
||||
}
|
||||
}
|
||||
this.setState({ originSlot: null, targetSlot: null, copy: null });
|
||||
|
||||
@@ -28,6 +28,8 @@ export default class StandardSlotSection extends SlotSection {
|
||||
_optimizeStandard() {
|
||||
this.props.ship.useLightestStandard();
|
||||
this.props.onChange();
|
||||
this.props.onCargoChange(this.props.ship.cargoCapacity);
|
||||
this.props.onFuelChange(this.props.ship.fuelCapacity);
|
||||
this._close();
|
||||
}
|
||||
|
||||
@@ -39,6 +41,8 @@ export default class StandardSlotSection extends SlotSection {
|
||||
_multiPurpose(shielded, bulkheadIndex) {
|
||||
ShipRoles.multiPurpose(this.props.ship, shielded, bulkheadIndex);
|
||||
this.props.onChange();
|
||||
this.props.onCargoChange(this.props.ship.cargoCapacity);
|
||||
this.props.onFuelChange(this.props.ship.fuelCapacity);
|
||||
this._close();
|
||||
}
|
||||
|
||||
@@ -49,6 +53,8 @@ export default class StandardSlotSection extends SlotSection {
|
||||
_optimizeCargo(shielded) {
|
||||
ShipRoles.trader(this.props.ship, shielded);
|
||||
this.props.onChange();
|
||||
this.props.onCargoChange(this.props.ship.cargoCapacity);
|
||||
this.props.onFuelChange(this.props.ship.fuelCapacity);
|
||||
this._close();
|
||||
}
|
||||
|
||||
@@ -59,6 +65,8 @@ export default class StandardSlotSection extends SlotSection {
|
||||
_optimizeMiner(shielded) {
|
||||
ShipRoles.miner(this.props.ship, shielded);
|
||||
this.props.onChange();
|
||||
this.props.onCargoChange(this.props.ship.cargoCapacity);
|
||||
this.props.onFuelChange(this.props.ship.fuelCapacity);
|
||||
this._close();
|
||||
}
|
||||
|
||||
@@ -69,6 +77,8 @@ export default class StandardSlotSection extends SlotSection {
|
||||
_optimizeExplorer(planetary) {
|
||||
ShipRoles.explorer(this.props.ship, planetary);
|
||||
this.props.onChange();
|
||||
this.props.onCargoChange(this.props.ship.cargoCapacity);
|
||||
this.props.onFuelChange(this.props.ship.fuelCapacity);
|
||||
this._close();
|
||||
}
|
||||
|
||||
@@ -78,6 +88,8 @@ export default class StandardSlotSection extends SlotSection {
|
||||
_optimizeRacer() {
|
||||
ShipRoles.racer(this.props.ship);
|
||||
this.props.onChange();
|
||||
this.props.onCargoChange(this.props.ship.cargoCapacity);
|
||||
this.props.onFuelChange(this.props.ship.fuelCapacity);
|
||||
this._close();
|
||||
}
|
||||
|
||||
|
||||
@@ -74,7 +74,6 @@ export default class UtilitySlotSection extends SlotSection {
|
||||
dragOver={this._dragOverSlot.bind(this, h)}
|
||||
drop={this._drop}
|
||||
dropClass={this._dropClass(h, originSlot, targetSlot)}
|
||||
enabled={h.enabled}
|
||||
ship={ship}
|
||||
m={h.m}
|
||||
enabled={h.enabled ? true : false}
|
||||
|
||||
1089
src/app/i18n/de.js
1089
src/app/i18n/de.js
File diff suppressed because it is too large
Load Diff
@@ -46,7 +46,7 @@ export const terms = {
|
||||
'cr': 'Compartimento de carga',
|
||||
'cs': 'Esc\u00e1ner de carga',
|
||||
'cells': 'celdas',
|
||||
'Chaff Launcher': 'Lanzador de birutas',
|
||||
'Chaff Launcher': 'Lanzador de virutas',
|
||||
'close': 'Cerrar',
|
||||
'cc': 'Controlador de Drones de Recogida',
|
||||
'compare': 'Comparar',
|
||||
|
||||
@@ -14,20 +14,315 @@ export const formats = {
|
||||
};
|
||||
|
||||
export const terms = {
|
||||
// Phrases
|
||||
PHRASE_BACKUP_DESC: 'Сохраните все данные перед переносом в другой браузер или устройство', // Backup of all Coriolis data to save or transfer to another browser/device
|
||||
PHRASE_CONFIRMATION: 'Вы уверены?', // Are You Sure?
|
||||
PHRASE_EXPORT_DESC: 'Детальный JSON-экспорт вашей сборки для использования в других местах и инструментах', // A detailed JSON export of your build for use in other sites and tools
|
||||
PHRASE_FASTEST_RANGE: 'Последовательные прыжки максимальной дальности', // Consecutive max range jumps
|
||||
PHRASE_IMPORT: 'Для импорта вставьте код в эту форму', // Paste JSON or import here
|
||||
PHRASE_LADEN: 'Масса корабля с учётом топлива и грузов', // Ship Mass + Fuel + Cargo
|
||||
PHRASE_NO_BUILDS: 'Нечего сравнивать', // No builds added to comparison!
|
||||
PHRASE_NO_RETROCH: 'нет ранних версий сборки\\конфигурации', // No Retrofitting changes
|
||||
PHRASE_SELECT_BUILDS: 'Выберите конфигурацию для сравнения', // Select Builds to Compare
|
||||
PHRASE_SG_RECHARGE: 'восстановление с 60% до 100% объема щита', // Time from 50% to 100% Charge
|
||||
PHRASE_SG_RECOVER: 'восстановление [до 60%] после снятия щита', // Recovery (to 50%) after collapse
|
||||
PHRASE_UNLADEN: 'Масса корабля без учета топлива и грузов', // Ship Mass excluding Fuel and Cargo
|
||||
PHRASE_UPDATE_RDY: 'Доступно обновление. Нажмите для обновления.', // Update Available! Click to Refresh
|
||||
PHRASE_ALT_ALL: 'Alt + Нажатие для заполнения всех слотов',
|
||||
PHRASE_BACKUP_DESC: 'Сохраните все данные перед переносом в другой браузер или устройство',
|
||||
PHRASE_CONFIRMATION: 'Вы уверены?',
|
||||
PHRASE_EXPORT_DESC: 'Детальный JSON-экспорт вашей сборки для использования в других местах и инструментах',
|
||||
PHRASE_FASTEST_RANGE: 'Последовательные прыжки максимальной дальности',
|
||||
PHRASE_IMPORT: 'Для импорта вставьте код в эту форму',
|
||||
PHRASE_LADEN: 'Масса корабля с учётом топлива и грузов',
|
||||
PHRASE_NO_BUILDS: 'Нечего сравнивать',
|
||||
PHRASE_NO_RETROCH: 'Нет ранних версий сборки',
|
||||
PHRASE_SELECT_BUILDS: 'Выберите конфигурацию для сравнения',
|
||||
PHRASE_SG_RECHARGE: 'Восстановление с 50% до 100% объема щита, учитывая полный аккумулятор СИС в начале',
|
||||
PHRASE_SG_RECOVER: 'Восстановление с 0% до 50% объема щита, учитывая полный аккумулятор СИС в начале',
|
||||
PHRASE_UNLADEN: 'Масса корабля без учета топлива и грузов',
|
||||
PHRASE_UPDATE_RDY: 'Доступна новая версия. Нажмите для обновления.',
|
||||
PHRASE_ENGAGEMENT_RANGE: 'Дистанция между кораблём и целью',
|
||||
PHRASE_SELECT_BLUEPRINT: 'Нажмите чтобы выбрать чертёж',
|
||||
PHRASE_BLUEPRINT_WORST: 'Худшие основные значения для чертежа',
|
||||
PHRASE_BLUEPRINT_RANDOM: 'Случайный выбор между худшими и лучшими значениями для этого чертежа',
|
||||
PHRASE_BLUEPRINT_BEST: 'Лучшие основные значения для чертежа',
|
||||
PHRASE_BLUEPRINT_EXTREME: 'Лучшие положительные и худшие отрицательные основные значения для чертежа',
|
||||
PHRASE_BLUEPRINT_RESET: 'Убрать все изменения и чертёж',
|
||||
PHRASE_SELECT_SPECIAL: 'Нажмите чтобы выбрать экспериментальный эффект',
|
||||
PHRASE_NO_SPECIAL: 'Без экспериментального эффекта',
|
||||
PHRASE_SHOPPING_LIST: 'Станции что продают эту сборку',
|
||||
PHRASE_REFIT_SHOPPING_LIST: 'Станции что продают необходимые модули',
|
||||
PHRASE_TOTAL_EFFECTIVE_SHIELD: 'Общий урон что может быть нанесён в каждым типе, если используются все щитонакопители',
|
||||
PHRASE_TIME_TO_LOSE_SHIELDS: 'Щиты продержатся',
|
||||
PHRASE_TIME_TO_RECOVER_SHIELDS: 'Щиты восстановятся за',
|
||||
PHRASE_TIME_TO_RECHARGE_SHIELDS: 'Щиты будут заряжены за',
|
||||
PHRASE_SHIELD_SOURCES: 'Подробности энергии щита',
|
||||
PHRASE_EFFECTIVE_SHIELD: 'Эффективная сила щита против разных типов урона',
|
||||
PHRASE_ARMOUR_SOURCES: 'Подробности состава брони',
|
||||
PHRASE_EFFECTIVE_ARMOUR: 'Эффективная сила брони против разных типов урона',
|
||||
PHRASE_DAMAGE_TAKEN: '% общих повреждений полученных в разных типах урона',
|
||||
PHRASE_TIME_TO_LOSE_ARMOUR: 'Броня продержится',
|
||||
PHRASE_MODULE_PROTECTION_EXTERNAL: 'Защита гнёзд',
|
||||
PHRASE_MODULE_PROTECTION_INTERNAL: 'Защита всех остальных модулей',
|
||||
PHRASE_SHIELD_DAMAGE: 'Подробности источников поддерживаемого ДПС против щитов',
|
||||
PHRASE_ARMOUR_DAMAGE: 'Подробности источников поддерживаемого ДПС против брони',
|
||||
|
||||
PHRASE_TIME_TO_REMOVE_SHIELDS: 'Снимет щиты за',
|
||||
TT_TIME_TO_REMOVE_SHIELDS: 'Непрерывным огнём из всех орудий',
|
||||
PHRASE_TIME_TO_REMOVE_ARMOUR: 'Снимет броню за',
|
||||
TT_TIME_TO_REMOVE_ARMOUR: 'Непрерывным огнём из всех орудий',
|
||||
PHRASE_TIME_TO_DRAIN_WEP: 'Опустошит ОРУЖ за',
|
||||
TT_TIME_TO_DRAIN_WEP: 'Время за которое опустошится аккумулятор ОРУЖ при стрельбе из всех орудий',
|
||||
TT_TIME_TO_LOSE_SHIELDS: 'Против поддерживаемой стрельбы из всех орудий противника',
|
||||
TT_TIME_TO_LOSE_ARMOUR: 'Против поддерживаемой стрельбы из всех орудий противника',
|
||||
TT_MODULE_ARMOUR: 'Броня защищаюшае модули от урона',
|
||||
TT_MODULE_PROTECTION_EXTERNAL: 'Процент урона перенаправленного от гнёзд на наборы для усиления модулей',
|
||||
TT_MODULE_PROTECTION_INTERNAL: 'Процент урона перенаправленного от модулей вне гнёзд на наборы для усиления модулей',
|
||||
|
||||
TT_EFFECTIVE_SDPS_SHIELDS: 'Реальный поддерживаемый ДПС пока аккумулятор ОРУЖ не пуст',
|
||||
TT_EFFECTIVENESS_SHIELDS: 'Эффективность в сравнении с попаданием по цели с 0-сопротивляемостью без пунктов в СИС на 0 метрах',
|
||||
TT_EFFECTIVE_SDPS_ARMOUR: 'Реальный поддерживаемый ДПС пока аккумулятор ОРУЖ не пуст',
|
||||
TT_EFFECTIVENESS_ARMOUR: 'Эффективность в сравнении с попаданием по цели с 0-сопротивляемостью на 0 метрах',
|
||||
|
||||
PHRASE_EFFECTIVE_SDPS_SHIELDS: 'ПДПС против щитов',
|
||||
PHRASE_EFFECTIVE_SDPS_ARMOUR: 'ПДПС против брони',
|
||||
|
||||
TT_SUMMARY_SPEED: 'С полным топливным баком и 4 пунктами в ДВИ',
|
||||
TT_SUMMARY_SPEED_NONFUNCTIONAL: 'маневровые двигатели выключены или превышена максимальная масса с топливом и грузом',
|
||||
TT_SUMMARY_BOOST: 'С полным топливным баком и 4 пунктами в ДВИ',
|
||||
TT_SUMMARY_BOOST_NONFUNCTIONAL: 'Распределитель питания не может обеспечить достаточно энергии для форсажа',
|
||||
TT_SUMMARY_SHIELDS: 'Чистая сила щита, включая усилители',
|
||||
TT_SUMMARY_SHIELDS_NONFUNCTIONAL: 'Шитогенератор отсутствует или выключен',
|
||||
TT_SUMMARY_INTEGRITY: 'Целостность корабля, включая переборки и наборы для усиления корпуса',
|
||||
TT_SUMMARY_HULL_MASS: 'Масса корпуса без каких-либо модулей',
|
||||
TT_SUMMARY_UNLADEN_MASS: 'Масса корпуса и модулей без топлива и груза',
|
||||
TT_SUMMARY_LADEN_MASS: 'Масса корпуса и модулей с топливом и грузом',
|
||||
TT_SUMMARY_DPS: 'Урон в секунду при стрельбе из всех орудий',
|
||||
TT_SUMMARY_EPS: 'Расход аккумулятора ОРУЖ в секунду при стрельбе из всех орудий',
|
||||
TT_SUMMARY_TTD: 'Время расхода аккумулятора ОРУЖ при стрельбе из всех орудий и с 4 пунктами в ОРУЖ',
|
||||
TT_SUMMARY_MAX_SINGLE_JUMP: 'Самый дальний возможный прыжок без груза и с топливом достаточным только на сам прыжок',
|
||||
TT_SUMMARY_UNLADEN_SINGLE_JUMP: 'Самый дальний возможный прыжок без груза и с полным топливным баком',
|
||||
TT_SUMMARY_LADEN_SINGLE_JUMP: 'Самый дальний возможный прыжок с полным грузовым отсеком и с полным топливным баком',
|
||||
TT_SUMMARY_UNLADEN_TOTAL_JUMP: 'Самая дальняя общая дистанция без груза, с полным топливным баком и при прыжках на максимальное расстояние',
|
||||
TT_SUMMARY_LADEN_TOTAL_JUMP: 'Самая дальняя общая дистанция с полным грузовым отсеком, с полным топливным баком и при прыжках на максимальное расстояние',
|
||||
|
||||
HELP_MODIFICATIONS_MENU: 'Ткните на номер чтобы ввести новое значение, или потяните вдоль полосы для малых изменений',
|
||||
|
||||
// Other languages fallback to these values
|
||||
// Only Translate to other languages if the name is different in-game
|
||||
am: 'Блок Автом. Полевого Ремонта',
|
||||
bh: 'Переборки',
|
||||
bl: 'Пучковый Лазер',
|
||||
bsg: 'Двухпоточный Щитогенератор',
|
||||
c: 'Орудие',
|
||||
cc: 'Контроллер магнитного снаряда для сбора',
|
||||
ch: 'Разбрасыватель дипольных отражателей',
|
||||
cr: 'Грузовой стеллаж',
|
||||
cs: 'Сканер содержимого',
|
||||
dc: 'Стыковочный компьютер',
|
||||
ec: 'Электр. противодействие',
|
||||
fc: 'Залповое орудие',
|
||||
fh: 'Ангар для истребителя',
|
||||
fi: 'FSD-перехватчик',
|
||||
fs: 'Топливозаборник',
|
||||
fsd: 'Рамочно Сместительный двигатель',
|
||||
ft: 'Топливный бак',
|
||||
fx: 'Контроллер магнитного снаряда для топлива',
|
||||
hb: 'Контроллер магнитного снаряда для взлома трюма',
|
||||
hr: 'Набор для усиления корпуса',
|
||||
hs: 'Теплоотводная катапульта',
|
||||
kw: 'Сканер преступников',
|
||||
ls: 'Система жизнеобеспечения',
|
||||
mc: 'Многоствольное орудие',
|
||||
ml: 'Проходочный лазер',
|
||||
mr: 'Ракетный лоток',
|
||||
mrp: 'Набор для усиления модуля',
|
||||
nl: 'Мины',
|
||||
pa: 'Ускоритель плазмы',
|
||||
pas: 'Комплект для сближения с планетой',
|
||||
pc: 'Контроллер магнитного снаряда для геологоразведки',
|
||||
pce: 'Каюта пассажира эконом-класса',
|
||||
pci: 'Каюта пассажира бизнес-класса',
|
||||
pcm: 'Каюта пассажира первого класса',
|
||||
pcq: 'Каюта пассажира класса люкс',
|
||||
pd: 'Распределитель питания',
|
||||
pl: 'Ипмульсный лазер',
|
||||
po: 'Точечная оборона',
|
||||
pp: 'Силовая установка',
|
||||
psg: 'Призматический щитогенератор',
|
||||
pv: 'Гараж для планетарного транспорта',
|
||||
rf: 'Устройство переработки',
|
||||
rg: 'Электромагнитная пушка',
|
||||
s: 'Сенсоры',
|
||||
sb: 'Усилитель щита',
|
||||
sc: 'Сканер обнаружения',
|
||||
scb: 'Щитонакопитель',
|
||||
sg: 'Щитогенератор',
|
||||
ss: 'Сканер Поверхностей',
|
||||
t: 'Маневровые двигатели',
|
||||
tp: 'Торпедная стойка',
|
||||
ul: 'Пульсирующие лазеры',
|
||||
ws: 'Сканер следа FSD',
|
||||
|
||||
// Items on the outfitting page
|
||||
// Notification of restricted slot
|
||||
emptyrestricted: 'пусто (ограниченно)',
|
||||
'damage dealt to': 'Урон нанесён',
|
||||
'damage received from': 'Урон получен от',
|
||||
'against shields': 'Против шитов',
|
||||
'against hull': 'Против корпуса',
|
||||
'total effective shield': 'Общие эффективные щиты',
|
||||
|
||||
// 'ammo' was overloaded for outfitting page and modul info, so changed to ammunition for outfitting page
|
||||
ammunition: 'Припасы',
|
||||
|
||||
// Unit for seconds
|
||||
secs: 'с',
|
||||
|
||||
rebuildsperbay: 'Построек за полосу',
|
||||
|
||||
// Blueprint rolls
|
||||
worst: 'Худшее',
|
||||
average: 'Среднее',
|
||||
random: 'Случайное',
|
||||
best: 'Лучшее',
|
||||
extreme: 'Экстремальное',
|
||||
reset: 'Обнулить',
|
||||
|
||||
// Weapon, offence, defence and movement
|
||||
dpe: 'Урон на МДж энергии',
|
||||
dps: 'Урон в Секунду',
|
||||
sdps: 'Поддерживаемый урон в секунду',
|
||||
dpssdps: 'Урон в секунду (поддерживаемый урон в секунду)',
|
||||
eps: 'Энергия в секунду',
|
||||
epsseps: 'Энергия в секунду (поддерживаемая энергия в секунду)',
|
||||
hps: 'Нагрев в секунду',
|
||||
hpsshps: 'Heat per second (sustained heat per second)',
|
||||
'damage by': 'Урон',
|
||||
'damage from': 'Урон от',
|
||||
'shield cells': 'Щитонакопители',
|
||||
'recovery': 'Восстановление',
|
||||
'recharge': 'Перезарядка',
|
||||
'engine pips': 'Пункты в двигателе',
|
||||
'4b': '4 пункта и Форсаж',
|
||||
'speed': 'Скорость',
|
||||
'pitch': 'Тангаж',
|
||||
'roll': 'Крен',
|
||||
'yaw': 'Рыскание',
|
||||
'internal protection': 'Внутренняя защита',
|
||||
'external protection': 'Внешняя защита',
|
||||
'engagement range': 'Боевое расстояние',
|
||||
'total': 'Общее',
|
||||
|
||||
// Modifications
|
||||
ammo: 'Макс. боекомплект',
|
||||
boot: 'Время загрузки',
|
||||
brokenregen: 'Скорость восстановления при пробое',
|
||||
burst: 'Длина очереди',
|
||||
burstrof: 'Скорострельность очереди',
|
||||
clip: 'Боекомплект',
|
||||
damage: 'Урон',
|
||||
distdraw: 'Тяга распределителя',
|
||||
duration: 'Продолжительность',
|
||||
eff: 'Эффективность',
|
||||
engcap: 'Ресурс двигателей',
|
||||
engrate: 'Перезарядка двигателей',
|
||||
explres: 'Сопротивление взрывам',
|
||||
facinglimit: 'Ограничение по направлению',
|
||||
hullboost: 'Увеличение корпуса',
|
||||
hullreinforcement: 'Укрепление корпуса',
|
||||
integrity: 'Целостность',
|
||||
jitter: 'Дрожание',
|
||||
kinres: 'Сопротивление китетическому урону',
|
||||
maxfuel: 'Макс. топлива на прыжок',
|
||||
mass: 'Масса',
|
||||
optmass: 'Оптимизированная масса',
|
||||
optmul: 'Оптимальный усилитель',
|
||||
pgen: 'Мощность',
|
||||
piercing: 'Бронебойность',
|
||||
power: 'Энергопотребление',
|
||||
protection: 'Защита от повреждений',
|
||||
range: 'Дальность',
|
||||
ranget: 'Дальность', // Range in time (for FSD interdictor)
|
||||
regen: 'Скорость восстановления',
|
||||
reload: 'Время перезарядки',
|
||||
rof: 'Скорострельность',
|
||||
angle: 'Угол сканера',
|
||||
scanrate: 'Скорость сканера',
|
||||
scantime: 'Время сканирования',
|
||||
shield: 'Щит',
|
||||
shieldboost: 'Усиление щитов',
|
||||
shieldreinforcement: 'Усилитель щита',
|
||||
shotspeed: 'Скорость выстрела',
|
||||
spinup: 'Время раскрутки',
|
||||
syscap: 'Ресурс систем',
|
||||
sysrate: 'Перезарядка систем',
|
||||
thermload: 'Тепловая нагрузка',
|
||||
thermres: 'Сопротивление термическому урону',
|
||||
wepcap: 'Орудийный ресурс',
|
||||
weprate: 'Перезарядка оружия',
|
||||
|
||||
// Shield generators use a different terminology
|
||||
minmass_sg: 'Мин. масса корпуса',
|
||||
optmass_sg: 'Опт. масса корпуса',
|
||||
maxmass_sg: 'Макс. масса корпуса',
|
||||
minmul_sg: 'Минимальная прочность',
|
||||
optmul_sg: 'Оптимальная прочность',
|
||||
maxmul_sg: 'Максимальная прочность',
|
||||
minmass_psg: 'Мин. масса корпуса',
|
||||
optmass_psg: 'Опт. масса корпуса',
|
||||
maxmass_psg: 'Макс. масса корпуса',
|
||||
minmul_psg: 'Минимальная прочность',
|
||||
optmul_psg: 'Оптимальная прочность',
|
||||
maxmul_psg: 'Максимальная прочность',
|
||||
minmass_bsg: 'Мин. масса корпуса',
|
||||
optmass_bsg: 'Опт. масса корпуса',
|
||||
maxmass_bsg: 'Макс. масса корпуса',
|
||||
minmul_bsg: 'Минимальная прочность',
|
||||
optmul_bsg: 'Оптимальная прочность',
|
||||
maxmul_bsg: 'Максимальная прочность',
|
||||
|
||||
range_s: 'Типовой диапозон выброса',
|
||||
|
||||
// Damage types
|
||||
absolute: 'Общий',
|
||||
explosive: 'Взрывч.',
|
||||
kinetic: 'Механич.',
|
||||
thermal: 'Тепл.',
|
||||
|
||||
// Shield sources
|
||||
generator: 'Генератор',
|
||||
boosters: 'Усилители',
|
||||
cells: 'Накопители',
|
||||
|
||||
// Armour sources
|
||||
bulkheads: 'Переборки',
|
||||
reinforcement: 'Усилители',
|
||||
|
||||
// Panel headings and subheadings
|
||||
'power and costs': 'Энергия и стоимость',
|
||||
'costs': 'Цены',
|
||||
'retrofit costs': 'Стоимость модификации',
|
||||
'reload costs': 'Стоимость перезарядки',
|
||||
'profiles': 'Графики',
|
||||
'engine profile': 'Двигатели',
|
||||
'fsd profile': 'FSD',
|
||||
'movement profile': 'Движение',
|
||||
'damage to opponent\'s shields': 'Урон щиту противника',
|
||||
'damage to opponent\'s hull': 'Урон корпусу противника',
|
||||
'offence': 'Нападение',
|
||||
'defence': 'Оборона',
|
||||
'shield metrics': 'Данные щита',
|
||||
'raw shield strength': 'Чистая мощность щита',
|
||||
'shield sources': 'Ресурсы щита',
|
||||
'damage taken': 'Полученный урон',
|
||||
'effective shield': 'Эффективный щит',
|
||||
'armour metrics': 'Данные брони',
|
||||
'raw armour strength': 'Чистая мощность брони',
|
||||
'armour sources': 'Ресурсы брони',
|
||||
'raw module armour': 'Чистая броня модулей',
|
||||
'effective armour': 'Эффективная броня',
|
||||
'offence metrics': 'Данные нападения',
|
||||
'defence metrics': 'Данные обороны',
|
||||
// Misc items
|
||||
'fuel carried': 'Топливо на борту',
|
||||
'cargo carried': 'Груз на борту',
|
||||
'ship control': 'Управление кораблём',
|
||||
'opponent': 'Противник',
|
||||
'opponent\'s shields': 'Щит противника',
|
||||
'opponent\'s armour': 'Броня противника',
|
||||
'shield damage sources': 'источники урона по щиту',
|
||||
'armour damage sources': 'источники урона по броне',
|
||||
'never': 'Никогда',
|
||||
'stock': 'базовый',
|
||||
'boost': 'Форсаж',
|
||||
|
||||
// Units / Metrics
|
||||
'/s': '/с', // Per second
|
||||
@@ -105,7 +400,7 @@ export const terms = {
|
||||
DPS: 'УВС', // Damage per second abbreviation
|
||||
efficiency: 'Эффективность', // Power Plant efficiency
|
||||
empty: 'пусто',
|
||||
ENG: 'ДВГ', // Abbreviation - Engine recharge rate for power distributor
|
||||
ENG: 'ДВИ', // Abbreviation - Engine recharge rate for power distributor
|
||||
export: 'Экспорт',
|
||||
forum: 'Форум',
|
||||
fuel: 'Топливо',
|
||||
@@ -153,12 +448,12 @@ export const terms = {
|
||||
speed: 'скорость',
|
||||
standard: 'Стандартный', // Standard / Common modules (FSD, power plant, life support, etc)
|
||||
Stock: 'Стандартная комплектация', // Thermal-load abbreviation
|
||||
SYS: 'СИСТЕМЫ', // Abbreviation - System recharge rate for power distributor
|
||||
SYS: 'СИС', // Abbreviation - System recharge rate for power distributor
|
||||
time: 'Время', // time it takes to complete something
|
||||
total: 'Всего',
|
||||
type: 'Тип',
|
||||
unladen: 'Пустой', // No cargo or fuel
|
||||
URL: 'Ссылка', // Link, Uniform Resource Locator
|
||||
WEP: 'ОРУДИЯ', // Abbreviation - Weapon recharge rate for power distributor
|
||||
WEP: 'ОРУЖ', // Abbreviation - Weapon recharge rate for power distributor
|
||||
yes: 'Да'
|
||||
};
|
||||
|
||||
@@ -446,7 +446,10 @@ export default class OutfittingPage extends Page {
|
||||
fuel = ship.fuelCapacity;
|
||||
}
|
||||
const code = this._fullCode(ship, fuel, cargo);
|
||||
this.setState({ code, cargo, fuel }, () => this._updateRoute(shipId, buildName, code));
|
||||
// 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));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -551,7 +554,7 @@ export default class OutfittingPage extends Page {
|
||||
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}${ship.cargo}${ship.fuel}`;
|
||||
const shipSummaryMarker = `${ship.name}${_sStr}${_iStr}${_hStr}${_pStr}${_mStr}${ship.ladenMass}${cargo}${fuel}`;
|
||||
|
||||
return (
|
||||
<div id='outfit' className={'page'} style={{ fontSize: (sizeRatio * 0.9) + 'em' }}>
|
||||
@@ -588,10 +591,10 @@ export default class OutfittingPage extends Page {
|
||||
|
||||
{/* Main tables */}
|
||||
<ShipSummaryTable ship={ship} fuel={fuel} cargo={cargo} marker={shipSummaryMarker} />
|
||||
<StandardSlotSection ship={ship} fuel={fuel} cargo={cargo} code={standardSlotMarker} onChange={shipUpdated} currentMenu={menu} />
|
||||
<InternalSlotSection ship={ship} code={internalSlotMarker} onChange={shipUpdated} currentMenu={menu} />
|
||||
<HardpointSlotSection ship={ship} code={hardpointsSlotMarker} onChange={shipUpdated} currentMenu={menu} />
|
||||
<UtilitySlotSection ship={ship} code={hardpointsSlotMarker} onChange={shipUpdated} currentMenu={menu} />
|
||||
<StandardSlotSection ship={ship} fuel={fuel} cargo={cargo} code={standardSlotMarker} onChange={shipUpdated} onCargoChange={this._cargoUpdated} onFuelChange={this._fuelUpdated} currentMenu={menu} />
|
||||
<InternalSlotSection ship={ship} code={internalSlotMarker} onChange={shipUpdated} onCargoChange={this._cargoUpdated} onFuelChange={this._fuelUpdated} currentMenu={menu} />
|
||||
<HardpointSlotSection ship={ship} code={hardpointsSlotMarker} onChange={shipUpdated} onCargoChange={this._cargoUpdated} onFuelChange={this._fuelUpdated} currentMenu={menu} />
|
||||
<UtilitySlotSection ship={ship} code={hardpointsSlotMarker} onChange={shipUpdated} onCargoChange={this._cargoUpdated} onFuelChange={this._fuelUpdated} currentMenu={menu} />
|
||||
|
||||
{/* Control of ship and opponent */}
|
||||
<div className='group quarter'>
|
||||
|
||||
@@ -693,7 +693,7 @@ export default class Module {
|
||||
* @return {string} the shot speed for this module
|
||||
*/
|
||||
getShotSpeed() {
|
||||
if (this.blueprint && (this.blueprint.name === 'Focused' || this.blueprintname === 'Long Range')) {
|
||||
if (this.blueprint && (this.blueprint.name === 'Focused' || this.blueprint.name === 'Long range')) {
|
||||
// If the modification is focused or long range then the shot speed
|
||||
// uses the range modifier
|
||||
const rangemod = this.getModValue('range') / 10000;
|
||||
|
||||
@@ -132,6 +132,20 @@ export default class ModuleSet {
|
||||
return new Module({ template: pd });
|
||||
};
|
||||
|
||||
/** Find the power distributor that matches the requirements
|
||||
* @param {Object} requirements The requirements to be met (currently only support 'weprate')
|
||||
* @return {Object} Power distributor
|
||||
*/
|
||||
matchingPowerDist(requirements) {
|
||||
let pd = this.standard[4][0];
|
||||
for (let p of this.standard[4]) {
|
||||
if (p.weprate >= requirements.weprate || p.weprate >= pd.weprate) {
|
||||
pd = p;
|
||||
}
|
||||
}
|
||||
return new Module({ template: pd });
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the lightest Thruster that can handle the specified tonnage
|
||||
* @param {number} ladenMass Ship laden mass (mass + cargo + fuel)
|
||||
|
||||
@@ -252,24 +252,6 @@ export function miner(ship, shielded) {
|
||||
}
|
||||
}
|
||||
|
||||
// Collector limpet controller if there are enough internals left
|
||||
let collectorLimpetsRequired = Math.max(ship.internal.filter(a => (!a.eligible) || a.eligible.cr).length - 6, 0);
|
||||
if (collectorLimpetsRequired > 0) {
|
||||
const collectorOrder = [1, 2, 3, 4, 5, 6, 7, 8];
|
||||
const collectorInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||
.filter(a => (!a.eligible) || a.eligible.cc)
|
||||
.sort((a,b) => collectorOrder.indexOf(a.maxClass) - collectorOrder.indexOf(b.maxClass));
|
||||
for (let i = 0; i < collectorInternals.length && collectorLimpetsRequired > 0; i++) {
|
||||
if (canMount(ship, collectorInternals[i], 'cc')) {
|
||||
// Collector only has odd classes
|
||||
const collectorClass = collectorInternals[i].maxClass % 2 === 0 ? collectorInternals[i].maxClass - 1 : collectorInternals[i].maxClass;
|
||||
ship.use(collectorInternals[i], ModuleUtils.findInternal('cc', collectorClass, 'A'));
|
||||
usedSlots.push(collectorInternals[i]);
|
||||
collectorLimpetsRequired -= collectorInternals[i].m.maximum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Dual mining lasers of highest possible class; remove anything else
|
||||
const miningLaserOrder = [2, 3, 4, 1, 0];
|
||||
const miningLaserHardpoints = ship.hardpoints.concat().sort(function(a,b) {
|
||||
@@ -284,6 +266,44 @@ export function miner(ship, shielded) {
|
||||
}
|
||||
}
|
||||
|
||||
// Number of collector limpets required to be active is a function of the size of the ship and the power of the lasers
|
||||
const miningLaserDps = ship.hardpoints.filter(h => h.m != null)
|
||||
.reduce(function(a, b) {
|
||||
return a + b.m.getDps();
|
||||
}, 0);
|
||||
// Find out how many internal slots we have, and their potential cargo size
|
||||
const potentialCargo = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||
.filter(a => (!a.eligible) || a.eligible.cr)
|
||||
.map(b => Math.pow(2, b.maxClass));
|
||||
// One collector for each 1.25 DPS, multiply by 1.25 for medium ships and 1.5 for large ships as they have further to travel
|
||||
// 0 if we only have 1 cargo slot, otherwise minium of 1 and maximum of 6 (excluding size modifier)
|
||||
const sizeModifier = ship.class == 2 ? 1.2 : ship.class == 3 ? 1.5 : 1;
|
||||
let collectorLimpetsRequired = potentialCargo.length == 1 ? 0 : Math.ceil(sizeModifier * Math.min(6, Math.floor(miningLaserDps / 1.25)));
|
||||
|
||||
if (collectorLimpetsRequired > 0) {
|
||||
const collectorOrder = [1, 2, 3, 4, 5, 6, 7, 8];
|
||||
const collectorInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
|
||||
.filter(a => (!a.eligible) || a.eligible.cc)
|
||||
.sort((a,b) => collectorOrder.indexOf(a.maxClass) - collectorOrder.indexOf(b.maxClass));
|
||||
// Always keep at least 2 slots free for cargo racks (1 for shielded)
|
||||
for (let i = 0; i < collectorInternals.length - (shielded ? 1 : 2) && collectorLimpetsRequired > 0; i++) {
|
||||
if (canMount(ship, collectorInternals[i], 'cc')) {
|
||||
// Collector only has odd classes
|
||||
const collectorClass = collectorInternals[i].maxClass % 2 === 0 ? collectorInternals[i].maxClass - 1 : collectorInternals[i].maxClass;
|
||||
ship.use(collectorInternals[i], ModuleUtils.findInternal('cc', collectorClass, 'D'));
|
||||
usedSlots.push(collectorInternals[i]);
|
||||
collectorLimpetsRequired -= collectorInternals[i].m.maximum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Power distributor to power the mining lasers indefinitely
|
||||
const wepRateRequired = ship.hardpoints.filter(h => h.m != null)
|
||||
.reduce(function(a, b) {
|
||||
return a + b.m.getEps();
|
||||
}, 0);
|
||||
standardOpts.pd = ship.getAvailableModules().matchingPowerDist({ weprate: wepRateRequired }).id;
|
||||
|
||||
// Fill the empty internals with cargo racks
|
||||
for (let i = ship.internal.length; i--;) {
|
||||
let slot = ship.internal[i];
|
||||
|
||||
@@ -36,6 +36,23 @@
|
||||
</script>
|
||||
<script async src='https://www.google-analytics.com/analytics.js'></script>
|
||||
<% } %>
|
||||
|
||||
<!-- Piwik -->
|
||||
<script type="text/javascript">
|
||||
var _paq = _paq || [];
|
||||
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
|
||||
_paq.push(["setCookieDomain", "*.coriolis.edcd.io"]);
|
||||
_paq.push(['trackPageView']);
|
||||
_paq.push(['enableLinkTracking']);
|
||||
(function() {
|
||||
var u="//stats.isadankme.me/";
|
||||
_paq.push(['setTrackerUrl', u+'piwik.php']);
|
||||
_paq.push(['setSiteId', '4']);
|
||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
|
||||
})();
|
||||
</script>
|
||||
<!-- End Piwik Code -->
|
||||
</head>
|
||||
<body style="background-color:#000;">
|
||||
<section id="coriolis"></section>
|
||||
|
||||
@@ -60,6 +60,9 @@
|
||||
|
||||
.summary {
|
||||
stroke: @fg;
|
||||
stroke-width: 10;
|
||||
fill: @fg;
|
||||
|
||||
svg {
|
||||
stroke-width: 10;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,7 +88,6 @@ select {
|
||||
cursor: pointer;
|
||||
line-height:@optionSpacing;
|
||||
color: @primary-disabled;
|
||||
stroke-width: 0.5em;
|
||||
stroke: @primary-disabled;
|
||||
|
||||
.no-touch &:hover {
|
||||
@@ -96,6 +95,10 @@ select {
|
||||
color: @primary;
|
||||
stroke: @primary;
|
||||
}
|
||||
|
||||
svg {
|
||||
stroke-width: 0.5em;
|
||||
}
|
||||
}
|
||||
|
||||
.lc, .c {
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
border: 1px solid @primary-disabled;
|
||||
color: @fg;
|
||||
stroke: @fg;
|
||||
stroke-width: 20;
|
||||
fill: @fg;
|
||||
|
||||
.details-container {
|
||||
@@ -57,11 +56,13 @@
|
||||
width: 1.2em;
|
||||
color: @primary-disabled;
|
||||
stroke: @primary-disabled;
|
||||
stroke-width: 20;
|
||||
border-right: 1px solid @primary-disabled;
|
||||
box-sizing: border-box;
|
||||
padding-top: 0.2em;
|
||||
padding-left: 0.05em;
|
||||
svg {
|
||||
stroke-width: 20;
|
||||
}
|
||||
}
|
||||
|
||||
.empty {
|
||||
@@ -69,16 +70,17 @@
|
||||
font-size: 1.3em;
|
||||
color: lighten(@primary-bg, 12%);
|
||||
stroke: lighten(@primary-bg, 12%);
|
||||
stroke-width: 20;
|
||||
text-align: center;
|
||||
letter-spacing: 0.1em;
|
||||
line-height: 1.7em;
|
||||
svg {
|
||||
stroke-width: 20;
|
||||
}
|
||||
}
|
||||
|
||||
&.selected {
|
||||
color: @primary-bg;
|
||||
stroke: @primary-bg;
|
||||
stroke-width: 20;
|
||||
fill: @primary-bg;
|
||||
background-color: @primary;
|
||||
border: 1px solid @primary;
|
||||
@@ -86,13 +88,18 @@
|
||||
.sz {
|
||||
color: @primary;
|
||||
stroke: @primary;
|
||||
stroke-width: 20;
|
||||
background-color: @primary-bg;
|
||||
border-right: 1px solid @primary;
|
||||
svg {
|
||||
stroke-width: 20;
|
||||
}
|
||||
}
|
||||
.details {
|
||||
background-color: transparent;
|
||||
}
|
||||
svg {
|
||||
stroke-width: 20;
|
||||
}
|
||||
}
|
||||
|
||||
&.eligible {
|
||||
@@ -144,4 +151,8 @@
|
||||
background-color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
svg {
|
||||
stroke-width: 20;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user