Compare commits

..

9 Commits

Author SHA1 Message Date
Cmdr McDonald
ee52a4b716 Merge branch 'release/2.2.13' 2017-02-02 23:05:46 +00:00
Cmdr McDonald
a14974fef4 Bump package 2017-02-02 23:03:35 +00:00
Cmdr McDonald
2c0959d68b Merge branch 'feature/fixed' into develop 2017-02-02 23:01:08 +00:00
Cmdr McDonald
0221d05b04 Tweak recalculation of mass 2017-02-01 08:57:56 +00:00
Cmdr McDonald
975432b45a Lint 2017-02-01 08:33:16 +00:00
Cmdr McDonald
e78551f5d9 Ensure that ship mass is recalculated when appropriate - #67 2017-02-01 08:24:50 +00:00
Cmdr McDonald
b1daf6f799 Fix issue with auto loader not showing - #66 2017-02-01 07:45:44 +00:00
Cmdr McDonald
df03102c35 Added time to drain calculation and display 2017-01-30 21:31:55 +00:00
Cmdr McDonald
e7d1a0df63 Merge branch 'release/2.2.12' into develop 2017-01-29 08:27:28 +00:00
8 changed files with 123 additions and 46 deletions

View File

@@ -1,3 +1,12 @@
#2.2.13
* Add 'time to drain' summary value. This is the time to drain the WEP capacitor if firing all enabled weapons
* Do not include utility slot DPS/EPS/HPS in summary information
* Ensure that auto loader special shows in the tooltip
* Ensure that ship mass is recalculated when appropriate
* Use coriolis-data 2.2.13:
* Add plasma slug special effect for plasma accelerator
* Tweak hull costs of ships
#2.2.12 #2.2.12
* Tidy up old references to coriolis.io * Tidy up old references to coriolis.io
* Add ability to add and remove special effects to weapon modifications * Add ability to add and remove special effects to weapon modifications

View File

@@ -269,20 +269,19 @@
"topSpeed": 187.01, "topSpeed": 187.01,
"totalCost": 882362058, "totalCost": 882362058,
"totalDpe": 142.68, "totalDpe": 142.68,
"totalDps": 103.8, "totalDps": 101.13,
"totalEps": 22.71, "totalEps": 18.71,
"totalHps": 677.29,
"totalExplDpe": 0, "totalExplDpe": 0,
"totalExplDps": 0, "totalExplDps": 0,
"totalExplSDps": 0, "totalExplSDps": 0,
"totalAbsDpe": 3.57, "totalAbsDpe": 3.57,
"totalAbsDps": 18.78, "totalAbsDps": 18.78,
"totalAbsSDps": 14.45, "totalAbsSDps": 14.45,
"totalHps": 33.62, "totalHps": 28.28,
"totalKinDpe": 117.48, "totalKinDpe": 117.48,
"totalKinDps": 24.94, "totalKinDps": 22.27,
"totalKinSDps": 18.76, "totalKinSDps": 16.91,
"totalSDps": 91.84, "totalSDps": 89.99,
"totalThermDpe": 21.63, "totalThermDpe": 21.63,
"totalThermDps": 60.08, "totalThermDps": 60.08,
"totalThermSDps": 58.64, "totalThermSDps": 58.64,
@@ -320,6 +319,7 @@
"shieldCells": 1840, "shieldCells": 1840,
"shieldExplRes": 0.5, "shieldExplRes": 0.5,
"shieldKinRes": 0.4, "shieldKinRes": 0.4,
"shieldThermRes": -0.2 "shieldThermRes": -0.2,
"timeToDrain": 7.04
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "coriolis_shipyard", "name": "coriolis_shipyard",
"version": "2.2.12", "version": "2.2.13",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/EDCD/coriolis" "url": "https://github.com/EDCD/coriolis"

View File

@@ -142,7 +142,7 @@ export default class DamageDealt extends TranslatedComponent {
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;
if (m.blueprint.special && m.blueprint.special.id) { if (m.blueprint.special && m.blueprint.special.id >= 0) {
engineering += ', ' + translate(m.blueprint.special.name); engineering += ', ' + translate(m.blueprint.special.name);
} }
} }

View File

@@ -48,7 +48,7 @@ export default class HardpointSlot extends Slot {
let modTT = translate('modified'); let modTT = translate('modified');
if (m && m.blueprint && m.blueprint.name) { if (m && m.blueprint && m.blueprint.name) {
modTT = translate(m.blueprint.name) + ' ' + translate('grade') + ' ' + m.blueprint.grade; modTT = translate(m.blueprint.name) + ' ' + translate('grade') + ' ' + m.blueprint.grade;
if (m.blueprint.special && m.blueprint.special.id) { if (m.blueprint.special && m.blueprint.special.id >= 0) {
modTT += ', ' + translate(m.blueprint.special.name); modTT += ', ' + translate(m.blueprint.special.name);
} }
} }

View File

@@ -42,10 +42,11 @@ export default class ShipSummaryTable extends TranslatedComponent {
<th rowSpan={2} className={ cn({ 'bg-warning-disabled': !ship.canBoost() }) }>{translate('boost')}</th> <th rowSpan={2} className={ cn({ 'bg-warning-disabled': !ship.canBoost() }) }>{translate('boost')}</th>
<th onMouseEnter={termtip.bind(null, 'damage per second')} onMouseLeave={hide} rowSpan={2}>{translate('DPS')}</th> <th onMouseEnter={termtip.bind(null, 'damage per second')} onMouseLeave={hide} rowSpan={2}>{translate('DPS')}</th>
<th onMouseEnter={termtip.bind(null, 'energy per second')} onMouseLeave={hide} rowSpan={2}>{translate('EPS')}</th> <th onMouseEnter={termtip.bind(null, 'energy per second')} onMouseLeave={hide} rowSpan={2}>{translate('EPS')}</th>
<th onMouseEnter={termtip.bind(null, 'time to drain WEP capacitor')} onMouseLeave={hide} rowSpan={2}>{translate('TTD')}</th>
<th onMouseEnter={termtip.bind(null, 'heat per second')} onMouseLeave={hide} rowSpan={2}>{translate('HPS')}</th> <th onMouseEnter={termtip.bind(null, 'heat per second')} onMouseLeave={hide} rowSpan={2}>{translate('HPS')}</th>
<th rowSpan={2}>{translate('hardness')}</th> <th onMouseEnter={termtip.bind(null, 'hull hardness')} onMouseLeave={hide} rowSpan={2}>{translate('hrd')}</th>
<th rowSpan={2}>{translate('armour')}</th> <th onMouseEnter={termtip.bind(null, 'armour')} onMouseLeave={hide} rowSpan={2}>{translate('arm')}</th>
<th rowSpan={2}>{translate('shields')}</th> <th onMouseEnter={termtip.bind(null, 'shields')} onMouseLeave={hide} rowSpan={2}>{translate('shld')}</th>
<th colSpan={3}>{translate('mass')}</th> <th colSpan={3}>{translate('mass')}</th>
<th rowSpan={2}>{translate('cargo')}</th> <th rowSpan={2}>{translate('cargo')}</th>
<th rowSpan={2}>{translate('fuel')}</th> <th rowSpan={2}>{translate('fuel')}</th>
@@ -71,6 +72,7 @@ export default class ShipSummaryTable extends TranslatedComponent {
<td>{ ship.canBoost() ? <span>{int(ship.topBoost)} {u['m/s']}</span> : <span className='warning'>0 <Warning/></span> }</td> <td>{ ship.canBoost() ? <span>{int(ship.topBoost)} {u['m/s']}</span> : <span className='warning'>0 <Warning/></span> }</td>
<td>{f1(ship.totalDps)}</td> <td>{f1(ship.totalDps)}</td>
<td>{f1(ship.totalEps)}</td> <td>{f1(ship.totalEps)}</td>
<td>{ship.timeToDrain === Infinity ? '∞' : time(ship.timeToDrain)}</td>
<td>{f1(ship.totalHps)}</td> <td>{f1(ship.totalHps)}</td>
<td>{int(ship.hardness)}</td> <td>{int(ship.hardness)}</td>
<td>{int(ship.armour)}</td> <td>{int(ship.armour)}</td>

View File

@@ -215,6 +215,8 @@ Along the top of the screen are some of the key values for your build. This is
Here, along with most places in Coriolis, acronyms will have tooltips explaining what they mean. Hover over the acronym to obtain more detail, or look in the glossary at the end of this help.</p> Here, along with most places in Coriolis, acronyms will have tooltips explaining what they mean. Hover over the acronym to obtain more detail, or look in the glossary at the end of this help.</p>
All values are the highest possible, assuming that you have maximum pips in the relevant capacitor (ENG for speed, WEP for time to drain, etc.).</p>
<h2>Modules</h2> <h2>Modules</h2>
The next set of panels laid out horizontally across the screen contain the modules you have put in your build. From left to right these are the core modules, the internal modules, the hardpoints and the utility mounts. These represent the available slots in your ship and cannot be altered. Each slot has a class, or size, and in general any module up to a given size can fit in a given slot (exceptions being bulkheads, life support and sensors in core modules and restricted internal slots, which can only take a subset of module depending on their restrictions). </p> The next set of panels laid out horizontally across the screen contain the modules you have put in your build. From left to right these are the core modules, the internal modules, the hardpoints and the utility mounts. These represent the available slots in your ship and cannot be altered. Each slot has a class, or size, and in general any module up to a given size can fit in a given slot (exceptions being bulkheads, life support and sensors in core modules and restricted internal slots, which can only take a subset of module depending on their restrictions). </p>

View File

@@ -419,6 +419,7 @@ export default class Ship {
m.mods = {}; m.mods = {};
this.updatePowerGenerated() this.updatePowerGenerated()
.updatePowerUsed() .updatePowerUsed()
.recalculateMass()
.updateJumpStats() .updateJumpStats()
.recalculateShield() .recalculateShield()
.recalculateShieldCells() .recalculateShieldCells()
@@ -426,6 +427,7 @@ export default class Ship {
.recalculateDps() .recalculateDps()
.recalculateEps() .recalculateEps()
.recalculateHps() .recalculateHps()
.recalculateTtd()
.updateMovement(); .updateMovement();
} }
@@ -461,11 +463,8 @@ export default class Ship {
this.updatePowerUsed(); this.updatePowerUsed();
} else if (name === 'mass') { } else if (name === 'mass') {
// Mass // Mass
let oldMass = m.getMass();
m.setModValue(name, value, sentfromui); m.setModValue(name, value, sentfromui);
let newMass = m.getMass(); this.recalculateMass();
this.unladenMass = this.unladenMass - oldMass + newMass;
this.ladenMass = this.ladenMass - oldMass + newMass;
this.updateMovement(); this.updateMovement();
this.updateJumpStats(); this.updateJumpStats();
} else if (name === 'maxfuel') { } else if (name === 'maxfuel') {
@@ -497,11 +496,15 @@ export default class Ship {
this.recalculateDps(); this.recalculateDps();
this.recalculateHps(); this.recalculateHps();
this.recalculateEps(); this.recalculateEps();
this.recalculateTtd();
} else if (name === 'explres' || name === 'kinres' || name === 'thermres') { } else if (name === 'explres' || name === 'kinres' || name === 'thermres') {
m.setModValue(name, value, sentfromui); m.setModValue(name, value, sentfromui);
// Could be for shields or armour // Could be for shields or armour
this.recalculateArmour(); this.recalculateArmour();
this.recalculateShield(); this.recalculateShield();
} else if (name === 'wepcap' || name === 'weprate') {
m.setModValue(name, value, sentfromui);
this.recalculateTtd();
} else { } else {
// Generic // Generic
m.setModValue(name, value, sentfromui); m.setModValue(name, value, sentfromui);
@@ -627,6 +630,7 @@ export default class Ship {
if (comps) { if (comps) {
this.updatePowerGenerated() this.updatePowerGenerated()
.updatePowerUsed() .updatePowerUsed()
.recalculateMass()
.updateJumpStats() .updateJumpStats()
.recalculateShield() .recalculateShield()
.recalculateShieldCells() .recalculateShieldCells()
@@ -634,6 +638,7 @@ export default class Ship {
.recalculateDps() .recalculateDps()
.recalculateEps() .recalculateEps()
.recalculateHps() .recalculateHps()
.recalculateTtd()
.updateMovement(); .updateMovement();
} }
@@ -815,6 +820,7 @@ export default class Ship {
if (slot.m.getEps()) { if (slot.m.getEps()) {
this.recalculateEps(); this.recalculateEps();
this.recalculateTtd();
} }
} }
} }
@@ -851,6 +857,7 @@ export default class Ship {
*/ */
updateStats(slot, n, old, preventUpdate) { updateStats(slot, n, old, preventUpdate) {
let powerGeneratedChange = slot == this.standard[0]; let powerGeneratedChange = slot == this.standard[0];
let powerDistributorChange = slot == this.standard[4];
let powerUsedChange = false; let powerUsedChange = false;
let dpsChanged = n && n.getDps() || old && old.getDps(); let dpsChanged = n && n.getDps() || old && old.getDps();
let epsChanged = n && n.getEps() || old && old.getEps(); let epsChanged = n && n.getEps() || old && old.getEps();
@@ -863,15 +870,6 @@ export default class Ship {
let shieldCellsChange = (n && n.grp === 'scb') || (old && old.grp === 'scb'); let shieldCellsChange = (n && n.grp === 'scb') || (old && old.grp === 'scb');
if (old) { // Old modul now being removed if (old) { // Old modul now being removed
switch (old.grp) {
case 'ft':
this.fuelCapacity -= old.fuel;
break;
case 'cr':
this.cargoCapacity -= old.cargo;
break;
}
if (slot.incCost && old.cost) { if (slot.incCost && old.cost) {
this.totalCost -= old.cost * this.moduleCostMultiplier; this.totalCost -= old.cost * this.moduleCostMultiplier;
} }
@@ -879,20 +877,9 @@ export default class Ship {
if (old.getPowerUsage() > 0 && slot.enabled) { if (old.getPowerUsage() > 0 && slot.enabled) {
powerUsedChange = true; powerUsedChange = true;
} }
this.unladenMass -= old.getMass() || 0;
} }
if (n) { if (n) {
switch (n.grp) {
case 'ft':
this.fuelCapacity += n.fuel;
break;
case 'cr':
this.cargoCapacity += n.cargo;
break;
}
if (slot.incCost && n.cost) { if (slot.incCost && n.cost) {
this.totalCost += n.cost * this.moduleCostMultiplier; this.totalCost += n.cost * this.moduleCostMultiplier;
} }
@@ -900,13 +887,11 @@ export default class Ship {
if (n.power && slot.enabled) { if (n.power && slot.enabled) {
powerUsedChange = true; powerUsedChange = true;
} }
this.unladenMass += n.getMass() || 0;
} }
this.ladenMass = this.unladenMass + this.cargoCapacity + this.fuelCapacity;
if (!preventUpdate) { if (!preventUpdate) {
// Must recalculate mass first, as movement, jump etc. relies on it
this.recalculateMass();
if (dpsChanged) { if (dpsChanged) {
this.recalculateDps(); this.recalculateDps();
} }
@@ -919,6 +904,9 @@ export default class Ship {
if (powerGeneratedChange) { if (powerGeneratedChange) {
this.updatePowerGenerated(); this.updatePowerGenerated();
} }
if (powerDistributorChange) {
this.recalculateTtd();
}
if (powerUsedChange) { if (powerUsedChange) {
this.updatePowerUsed(); this.updatePowerUsed();
} }
@@ -957,7 +945,34 @@ export default class Ship {
} }
/** /**
* Calculate damage per second for weapons * Calculate time to drain WEP capacitor
* @return {this} The ship instance (for chaining operations)
*/
recalculateTtd() {
let totalSEps = 0;
for (let slotNum in this.hardpoints) {
const slot = this.hardpoints[slotNum];
if (slot.m && slot.enabled && slot.type === 'WEP' && slot.m.getDps()) {
totalSEps += slot.m.getClip() ? (slot.m.getClip() * slot.m.getEps() / slot.m.getRoF()) / ((slot.m.getClip() / slot.m.getRoF()) + slot.m.getReload()) : slot.m.getEps();
}
}
// Calculate the drain time
const drainPerSecond = totalSEps - this.standard[4].m.getWeaponsRechargeRate();
if (drainPerSecond <= 0) {
// Can fire forever
this.timeToDrain = Infinity;
} else {
const initialCharge = this.standard[4].m.getWeaponsCapacity();
this.timeToDrain = initialCharge / drainPerSecond;
}
return this;
}
/**
* Calculate damage per second and related items for weapons
* @return {this} The ship instance (for chaining operations) * @return {this} The ship instance (for chaining operations)
*/ */
recalculateDps() { recalculateDps() {
@@ -979,7 +994,7 @@ export default class Ship {
for (let slotNum in this.hardpoints) { for (let slotNum in this.hardpoints) {
const slot = this.hardpoints[slotNum]; const slot = this.hardpoints[slotNum];
if (slot.m && slot.enabled && slot.m.getDps()) { if (slot.m && slot.enabled && slot.type === 'WEP' && slot.m.getDps()) {
const dpe = slot.m.getEps() === 0 ? 0 : slot.m.getDps() / slot.m.getEps(); const dpe = slot.m.getEps() === 0 ? 0 : slot.m.getDps() / slot.m.getEps();
const dps = slot.m.getDps(); const dps = slot.m.getDps();
const sdps = slot.m.getClip() ? (slot.m.getClip() * slot.m.getDps() / slot.m.getRoF()) / ((slot.m.getClip() / slot.m.getRoF()) + slot.m.getReload()) : dps; const sdps = slot.m.getClip() ? (slot.m.getClip() * slot.m.getDps() / slot.m.getRoF()) / ((slot.m.getClip() / slot.m.getRoF()) + slot.m.getReload()) : dps;
@@ -1040,7 +1055,7 @@ export default class Ship {
for (let slotNum in this.hardpoints) { for (let slotNum in this.hardpoints) {
const slot = this.hardpoints[slotNum]; const slot = this.hardpoints[slotNum];
if (slot.m && slot.enabled && slot.m.getHps()) { if (slot.m && slot.enabled && slot.type === 'WEP' && slot.m.getHps()) {
totalHps += slot.m.getHps(); totalHps += slot.m.getHps();
} }
} }
@@ -1058,7 +1073,7 @@ export default class Ship {
for (let slotNum in this.hardpoints) { for (let slotNum in this.hardpoints) {
const slot = this.hardpoints[slotNum]; const slot = this.hardpoints[slotNum];
if (slot.m && slot.enabled && slot.m.getEps()) { if (slot.m && slot.enabled && slot.m.getEps() && slot.type === 'WEP') {
totalEps += slot.m.getEps(); totalEps += slot.m.getEps();
} }
} }
@@ -1130,6 +1145,55 @@ export default class Ship {
return this; return this;
} }
/**
* Eecalculate mass
* @return {this} The ship instance (for chaining operations)
*/
recalculateMass() {
let unladenMass = this.hullMass;
let cargoCapacity = 0;
let fuelCapacity = 0;
unladenMass += this.bulkheads.m.getMass();
for (let slotNum in this.standard) {
const slot = this.standard[slotNum];
if (slot.m) {
unladenMass += slot.m.getMass();
if (slot.m.grp === 'ft') {
fuelCapacity += slot.m.fuel;
}
}
}
for (let slotNum in this.internal) {
const slot = this.internal[slotNum];
if (slot.m) {
unladenMass += slot.m.getMass();
if (slot.m.grp === 'ft') {
fuelCapacity += slot.m.fuel;
} else if (slot.m.grp === 'cr') {
cargoCapacity += slot.m.cargo;
}
}
}
for (let slotNum in this.hardpoints) {
const slot = this.hardpoints[slotNum];
if (slot.m) {
unladenMass += slot.m.getMass();
}
}
// Update global stats
this.unladenMass = unladenMass;
this.cargoCapacity = cargoCapacity;
this.fuelCapacity = fuelCapacity;
this.ladenMass = unladenMass + fuelCapacity + cargoCapacity;
return this;
}
/** /**
* Update movement values * Update movement values
* @return {this} The ship instance (for chaining operations) * @return {this} The ship instance (for chaining operations)