mirror of
https://github.com/EDCD/coriolis.git
synced 2025-12-09 14:45:35 +00:00
Fixes
This commit is contained in:
@@ -7,7 +7,7 @@ import { CollapseSection, ExpandSection, MountFixed, MountGimballed, MountTurret
|
|||||||
import LineChart from '../components/LineChart';
|
import LineChart from '../components/LineChart';
|
||||||
import Slider from '../components/Slider';
|
import Slider from '../components/Slider';
|
||||||
|
|
||||||
const DAMAGE_DEALT_COLORS = ['#0088d2', '#ff8c0d', '#D26D00', '#c06400'];
|
const DAMAGE_DEALT_COLORS = ['#FFFFFF', '#FF0000', '#00FF00', '#0000FF', '#FFFF00', '#FF00FF', '#00FFFF', '#777777'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates an internationalization friendly weapon comparator that will
|
* Generates an internationalization friendly weapon comparator that will
|
||||||
@@ -60,7 +60,7 @@ export default class DamageDealt extends TranslatedComponent {
|
|||||||
* Constructor
|
* Constructor
|
||||||
* @param {Object} props React Component properties
|
* @param {Object} props React Component properties
|
||||||
*/
|
*/
|
||||||
constructor(props) {
|
constructor(props, context) {
|
||||||
super(props);
|
super(props);
|
||||||
|
|
||||||
this._sort = this._sort.bind(this);
|
this._sort = this._sort.bind(this);
|
||||||
@@ -72,7 +72,7 @@ export default class DamageDealt extends TranslatedComponent {
|
|||||||
const range = 0.1667;
|
const range = 0.1667;
|
||||||
const maxRange = 6000;
|
const maxRange = 6000;
|
||||||
const maxDps = this._calcMaxDps(ship, against)
|
const maxDps = this._calcMaxDps(ship, against)
|
||||||
const weaponNames = this._weaponNames(ship);
|
const weaponNames = this._weaponNames(ship, context);
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
predicate: 'n',
|
predicate: 'n',
|
||||||
@@ -83,7 +83,7 @@ export default class DamageDealt extends TranslatedComponent {
|
|||||||
maxRange,
|
maxRange,
|
||||||
maxDps,
|
maxDps,
|
||||||
weaponNames,
|
weaponNames,
|
||||||
calcDpsFunc: this._calcDps.bind(this, ship, against)
|
calcDpsFunc: this._calcDps.bind(this, context, ship, weaponNames, against)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,7 +91,7 @@ export default class DamageDealt extends TranslatedComponent {
|
|||||||
* Set the initial weapons state
|
* Set the initial weapons state
|
||||||
*/
|
*/
|
||||||
componentWillMount() {
|
componentWillMount() {
|
||||||
const data = this._calcWeapons(this.props.ship, this.state.against, this.state.range * this.state.maxRange);
|
const data = this._calcWeaponsDps(this.props.ship, this.state.against, this.state.range * this.state.maxRange);
|
||||||
this.setState({ weapons: data.weapons, totals: data.totals });
|
this.setState({ weapons: data.weapons, totals: data.totals });
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,12 +103,12 @@ export default class DamageDealt extends TranslatedComponent {
|
|||||||
*/
|
*/
|
||||||
componentWillReceiveProps(nextProps, nextContext) {
|
componentWillReceiveProps(nextProps, nextContext) {
|
||||||
if (nextProps.code != this.props.code) {
|
if (nextProps.code != this.props.code) {
|
||||||
const data = this._calcWeapons(nextProps.ship, this.state.against, this.state.range * this.state.maxRange);
|
const data = this._calcWeaponsDps(nextProps.ship, this.state.against, this.state.range * this.state.maxRange);
|
||||||
const weaponNames = this._weaponNames(nextProps.ship);
|
const weaponNames = this._weaponNames(nextProps.ship, nextContext);
|
||||||
this.setState({ weapons: data.weapons,
|
this.setState({ weapons: data.weapons,
|
||||||
totals: data.totals,
|
totals: data.totals,
|
||||||
weaponNames,
|
weaponNames,
|
||||||
calcDpsFunc: this._calcDps.bind(this, nextProps.ship, this.state.against) });
|
calcDpsFunc: this._calcDps.bind(this, nextContext, nextProps.ship, this.state.weaponNames, this.state.against) });
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -140,13 +140,13 @@ export default class DamageDealt extends TranslatedComponent {
|
|||||||
* @param {Object} range The engagement range
|
* @param {Object} range The engagement range
|
||||||
* @return {array} The array of weapon DPS
|
* @return {array} The array of weapon DPS
|
||||||
*/
|
*/
|
||||||
_calcDps(ship, against, range) {
|
_calcDps(context, ship, weaponNames, against, range) {
|
||||||
let results = {}
|
let results = {}
|
||||||
for (let i =0; i < ship.hardpoints.length; i++) {
|
let weaponNum = 0;
|
||||||
|
for (let i = 0; i < ship.hardpoints.length; i++) {
|
||||||
if (ship.hardpoints[i].m && ship.hardpoints[i].enabled) {
|
if (ship.hardpoints[i].m && ship.hardpoints[i].enabled) {
|
||||||
const m = ship.hardpoints[i].m;
|
const m = ship.hardpoints[i].m;
|
||||||
const thisDps = m.getDps() * (m.getPiercing() >= against.properties.hardness ? 1 : m.getPiercing() / against.properties.hardness);
|
results[weaponNames[weaponNum++]] = this._calcWeaponDps(context, m, against, range);
|
||||||
results[i] = thisDps;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return results;
|
return results;
|
||||||
@@ -157,13 +157,14 @@ export default class DamageDealt extends TranslatedComponent {
|
|||||||
* @param {Object} ship The ship
|
* @param {Object} ship The ship
|
||||||
* @return {array} The weapon names
|
* @return {array} The weapon names
|
||||||
*/
|
*/
|
||||||
_weaponNames(ship) {
|
_weaponNames(ship, context) {
|
||||||
|
const translate = context.language.translate
|
||||||
let names = [];
|
let names = [];
|
||||||
|
let num = 1;
|
||||||
for (let i =0; i < ship.hardpoints.length; i++) {
|
for (let i =0; i < ship.hardpoints.length; i++) {
|
||||||
if (ship.hardpoints[i].m && ship.hardpoints[i].enabled) {
|
if (ship.hardpoints[i].m && ship.hardpoints[i].enabled) {
|
||||||
const m = ship.hardpoints[i].m;
|
const m = ship.hardpoints[i].m;
|
||||||
// TODO translate
|
let name = '' + num++ + ': ' + m.class + m.rating + (m.missile ? '/' + m.missile : '') + ' ' + translate(m.name || m.grp);
|
||||||
let name = m.class + m.rating + (m.missile ? '/' + m.missile : '') + ' ' + (m.name || m.grp);
|
|
||||||
let engineering;
|
let engineering;
|
||||||
if (m.blueprint && m.blueprint.name) {
|
if (m.blueprint && m.blueprint.name) {
|
||||||
engineering = translate(m.blueprint.name) + ' ' + translate('grade') + ' ' + m.blueprint.grade;
|
engineering = translate(m.blueprint.name) + ' ' + translate('grade') + ' ' + m.blueprint.grade;
|
||||||
@@ -181,6 +182,41 @@ export default class DamageDealt extends TranslatedComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_calcWeaponDps(context, m, against, range) {
|
||||||
|
const translate = context.language.translate
|
||||||
|
let dropoff = 1;
|
||||||
|
if (m.getFalloff()) {
|
||||||
|
// Calculate the dropoff % due to range
|
||||||
|
if (range > m.getRange()) {
|
||||||
|
// Weapon is out of range
|
||||||
|
dropoff = 0;
|
||||||
|
} else {
|
||||||
|
const falloff = m.getFalloff();
|
||||||
|
if (range > falloff) {
|
||||||
|
const dropoffRange = m.getRange() - falloff;
|
||||||
|
// Assuming straight-line falloff
|
||||||
|
dropoff = 1 - (range - falloff) / dropoffRange;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const classRating = `${m.class}${m.rating}${m.missile ? '/' + m.missile : ''}`;
|
||||||
|
let engineering;
|
||||||
|
if (m.blueprint && m.blueprint.name) {
|
||||||
|
engineering = translate(m.blueprint.name) + ' ' + translate('grade') + ' ' + m.blueprint.grade;
|
||||||
|
if (m.blueprint.special && m.blueprint.special.id) {
|
||||||
|
engineering += ', ' + translate(m.blueprint.special.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const effectivenessShields = dropoff;
|
||||||
|
const effectiveDpsShields = m.getDps() * effectivenessShields;
|
||||||
|
const effectiveSDpsShields = (m.getClip() ? (m.getClip() * m.getDps() / m.getRoF()) / ((m.getClip() / m.getRoF()) + m.getReload()) * effectivenessShields : effectiveDpsShields);
|
||||||
|
const effectivenessHull = (m.getPiercing() >= against.properties.hardness ? 1 : m.getPiercing() / against.properties.hardness) * dropoff;
|
||||||
|
const effectiveDpsHull = m.getDps() * effectivenessHull;
|
||||||
|
const effectiveSDpsHull = (m.getClip() ? (m.getClip() * m.getDps() / m.getRoF()) / ((m.getClip() / m.getRoF()) + m.getReload()) * effectivenessHull : effectiveDpsHull);
|
||||||
|
|
||||||
|
return effectiveSDpsHull;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate the damage dealt by a ship
|
* Calculate the damage dealt by a ship
|
||||||
* @param {Object} ship The ship which will deal the damage
|
* @param {Object} ship The ship which will deal the damage
|
||||||
@@ -188,7 +224,7 @@ export default class DamageDealt extends TranslatedComponent {
|
|||||||
* @param {Object} range The engagement range
|
* @param {Object} range The engagement range
|
||||||
* @return {boolean} Returns the per-weapon damage
|
* @return {boolean} Returns the per-weapon damage
|
||||||
*/
|
*/
|
||||||
_calcWeapons(ship, against, range) {
|
_calcWeaponsDps(ship, against, range) {
|
||||||
const translate = this.context.language.translate;
|
const translate = this.context.language.translate;
|
||||||
|
|
||||||
// Tidy up the range so that it's to 4 decimal places
|
// Tidy up the range so that it's to 4 decimal places
|
||||||
@@ -244,7 +280,6 @@ export default class DamageDealt extends TranslatedComponent {
|
|||||||
totals.effectiveSDpsHull += effectiveSDpsHull;
|
totals.effectiveSDpsHull += effectiveSDpsHull;
|
||||||
totalDps += m.getDps();
|
totalDps += m.getDps();
|
||||||
|
|
||||||
|
|
||||||
weapons.push({ id: i,
|
weapons.push({ id: i,
|
||||||
mount: m.mount,
|
mount: m.mount,
|
||||||
name: m.name || m.grp,
|
name: m.name || m.grp,
|
||||||
@@ -278,13 +313,13 @@ export default class DamageDealt extends TranslatedComponent {
|
|||||||
*/
|
*/
|
||||||
_onShipChange(s) {
|
_onShipChange(s) {
|
||||||
const against = Ships[s];
|
const against = Ships[s];
|
||||||
const data = this._calcWeapons(this.props.ship, against, this.state.range * this.state.maxRange);
|
const data = this._calcWeaponsDps(this.props.ship, against, this.state.range * this.state.maxRange);
|
||||||
const maxDps = this._calcMaxDps(this.props.ship, against)
|
const maxDps = this._calcMaxDps(this.props.ship, against)
|
||||||
this.setState({ against,
|
this.setState({ against,
|
||||||
weapons: data.weapons,
|
weapons: data.weapons,
|
||||||
totals: data.totals,
|
totals: data.totals,
|
||||||
maxDps,
|
maxDps,
|
||||||
calcDpsFunc: this.props.ship.calcDps.bind(this, this.props.ship, against) });
|
calcDpsFunc: this._calcDps.bind(this, this.context, this.props.ship, this.state.weaponNames, against) });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -368,11 +403,11 @@ export default class DamageDealt extends TranslatedComponent {
|
|||||||
* @param {number} range Range 0-1
|
* @param {number} range Range 0-1
|
||||||
*/
|
*/
|
||||||
_rangeChange(range) {
|
_rangeChange(range) {
|
||||||
const data = this._calcWeapons(this.props.ship, this.state.against, this.state.range * this.state.maxRange);
|
const data = this._calcWeaponsDps(this.props.ship, this.state.against, this.state.range * this.state.maxRange);
|
||||||
this.setState({ range,
|
this.setState({ range,
|
||||||
weapons: data.weapons,
|
weapons: data.weapons,
|
||||||
totals: data.totals,
|
totals: data.totals,
|
||||||
calcDpsFunc: this.props.ship.calcDps.bind(this, this.props.ship, against) });
|
calcDpsFunc: this.props.ship.calcDps.bind(this, this.props.ship, this.state.weaponNames, against) });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -446,7 +481,22 @@ export default class DamageDealt extends TranslatedComponent {
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div className='group half'>
|
<div className='group half'>
|
||||||
<h1>{translate('damage')}</h1>
|
<h1>{translate('damage against shields')}</h1>
|
||||||
|
<LineChart
|
||||||
|
width={this.props.chartWidth}
|
||||||
|
xMax={6000}
|
||||||
|
yMax={this.state.maxDps}
|
||||||
|
xLabel={translate('distance')}
|
||||||
|
xUnit={translate('m')}
|
||||||
|
yLabel={translate('damage')}
|
||||||
|
yUnit={translate('ps')}
|
||||||
|
series={this.state.weaponNames}
|
||||||
|
colors={DAMAGE_DEALT_COLORS}
|
||||||
|
func={this.state.calcDpsFunc}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className='group half'>
|
||||||
|
<h1>{translate('damage against hull')}</h1>
|
||||||
<LineChart
|
<LineChart
|
||||||
width={this.props.chartWidth}
|
width={this.props.chartWidth}
|
||||||
xMax={6000}
|
xMax={6000}
|
||||||
|
|||||||
@@ -239,7 +239,8 @@ export default class OutfittingPage extends Page {
|
|||||||
|
|
||||||
if (elem) {
|
if (elem) {
|
||||||
this.setState({
|
this.setState({
|
||||||
chartWidth: findDOMNode(this.refs.chartThird).offsetWidth
|
thirdChartWidth: findDOMNode(this.refs.chartThird).offsetWidth,
|
||||||
|
halfChartWidth: findDOMNode(this.refs.chartHalf).offsetWidth
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -322,7 +323,7 @@ export default class OutfittingPage extends Page {
|
|||||||
let state = this.state,
|
let state = this.state,
|
||||||
{ language, termtip, tooltip, sizeRatio, onWindowResize } = this.context,
|
{ language, termtip, tooltip, sizeRatio, onWindowResize } = this.context,
|
||||||
{ translate, units, formats } = language,
|
{ translate, units, formats } = language,
|
||||||
{ ship, code, savedCode, buildName, newBuildName, chartWidth, fuelCapacity, fuelLevel } = state,
|
{ ship, code, savedCode, buildName, newBuildName, halfChartWidth, thirdChartWidth, fuelCapacity, fuelLevel } = state,
|
||||||
hide = tooltip.bind(null, null),
|
hide = tooltip.bind(null, null),
|
||||||
menu = this.props.currentMenu,
|
menu = this.props.currentMenu,
|
||||||
shipUpdated = this._shipUpdated,
|
shipUpdated = this._shipUpdated,
|
||||||
@@ -385,10 +386,13 @@ export default class OutfittingPage extends Page {
|
|||||||
<MovementSummary ship={ship} code={code}/>
|
<MovementSummary ship={ship} code={code}/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div ref='chartHalf' className='group half' />
|
||||||
|
<div className='group half' />
|
||||||
|
|
||||||
<div ref='chartThird' className='group third'>
|
<div ref='chartThird' className='group third'>
|
||||||
<h1>{translate('jump range')}</h1>
|
<h1>{translate('jump range')}</h1>
|
||||||
<LineChart
|
<LineChart
|
||||||
width={chartWidth}
|
width={thirdChartWidth}
|
||||||
xMax={ship.cargoCapacity}
|
xMax={ship.cargoCapacity}
|
||||||
yMax={ship.unladenRange}
|
yMax={ship.unladenRange}
|
||||||
xUnit={translate('T')}
|
xUnit={translate('T')}
|
||||||
@@ -423,7 +427,7 @@ export default class OutfittingPage extends Page {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<DamageDealt ship={ship} code={code} chartWidth={chartWidth} currentMenu={menu}/>
|
<DamageDealt ship={ship} code={code} chartWidth={halfChartWidth} currentMenu={menu}/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
Reference in New Issue
Block a user