From 6009426f045e8986dd4b7c0e0157d5d86f20e6ff Mon Sep 17 00:00:00 2001 From: willyb321 Date: Sun, 1 Jul 2018 12:06:12 +1000 Subject: [PATCH] add logic to handle guardian fsd boosters --- src/app/components/AvailableModulesMenu.jsx | 5 +++-- src/app/components/FSDProfile.jsx | 4 ++-- src/app/components/InternalSlot.jsx | 2 ++ src/app/components/JumpRange.jsx | 2 +- src/app/components/ShipSummaryTable.jsx | 10 +++++----- src/app/i18n/en.json | 2 ++ src/app/shipyard/Calculations.js | 18 ++++++++++++++---- src/app/shipyard/Constants.js | 1 + src/app/shipyard/Module.js | 8 ++++++++ src/app/shipyard/Ship.js | 4 ++-- 10 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/app/components/AvailableModulesMenu.jsx b/src/app/components/AvailableModulesMenu.jsx index eac11b58..251c0712 100644 --- a/src/app/components/AvailableModulesMenu.jsx +++ b/src/app/components/AvailableModulesMenu.jsx @@ -62,7 +62,8 @@ const GRPCAT = { 'gpp': 'guardian', 'gpc': 'guardian', 'gsrp': 'guardian', - 'ggc': 'guardian' + 'ggc': 'guardian', + 'gfsb': 'guardian' }; // Order here is the order in which items will be shown in the modules menu const CATEGORIES = { @@ -91,7 +92,7 @@ const CATEGORIES = { 'experimental': ['axmc', 'axmr', 'rfl', 'xs', 'sfn', 'rcpl'], // Guardian - 'guardian': ['gpp', 'gpd', 'gpc', 'ggc', 'gsrp'] + 'guardian': ['gpp', 'gpd', 'gpc', 'ggc', 'gsrp', 'gfsb'] }; /** diff --git a/src/app/components/FSDProfile.jsx b/src/app/components/FSDProfile.jsx index 4a4f2094..bd12fc10 100644 --- a/src/app/components/FSDProfile.jsx +++ b/src/app/components/FSDProfile.jsx @@ -57,7 +57,7 @@ export default class FSDProfile extends TranslatedComponent { */ _calcMaxRange(ship, fuel, mass) { // Obtain the maximum range - return Calc.jumpRange(mass, ship.standard[2].m, Math.min(fuel, ship.standard[2].m.getMaxFuelPerJump())); + return Calc.jumpRange(mass, ship.standard[2].m, Math.min(fuel, ship.standard[2].m.getMaxFuelPerJump()), ship); } /** @@ -77,7 +77,7 @@ export default class FSDProfile extends TranslatedComponent { const maxMass = thrusters.getMaxMass(); const mass = ship.unladenMass + fuel + cargo; const minRange = 0; - const maxRange = Calc.jumpRange(minMass + fsd.getMaxFuelPerJump(), fsd, fsd.getMaxFuelPerJump()); + const maxRange = Calc.jumpRange(minMass + fsd.getMaxFuelPerJump(), fsd, fsd.getMaxFuelPerJump(), ship); // Add a mark at our current mass const mark = Math.min(mass, maxMass); diff --git a/src/app/components/InternalSlot.jsx b/src/app/components/InternalSlot.jsx index db3d9c81..952f69c9 100644 --- a/src/app/components/InternalSlot.jsx +++ b/src/app/components/InternalSlot.jsx @@ -64,6 +64,8 @@ export default class InternalSlot extends Slot { { m.getDuration() ?
{translate('duration')}: {formats.f1(m.getDuration())}{u.s}
: null } { m.grp === 'scb' ?
{translate('cells')}: {formats.int(m.getAmmo() + 1)}
: null } { m.grp === 'gsrp' ?
{translate('shield addition')}: {formats.int(m.getShieldAddition())}{u.MJ}
: null } + { m.grp === 'gfsb' ?
{translate('jump addition')}: {formats.int(m.getJumpBoost())}{u.LY}
: null } + { m.grp === 'gs' ?
{translate('shield addition')}: {formats.int(m.getShieldAddition())}{u.MJ}
: null } { m.getShieldReinforcement() ?
{translate('shieldreinforcement')}: {formats.f1(m.getDuration() * m.getShieldReinforcement())}{u.MJ}
: null } { m.getShieldReinforcement() ?
{translate('total')}: {formats.int((m.getAmmo() + 1) * (m.getDuration() * m.getShieldReinforcement()))}{u.MJ}
: null } { m.repair ?
{translate('repair')}: {m.repair}
: null } diff --git a/src/app/components/JumpRange.jsx b/src/app/components/JumpRange.jsx index 2b8f5196..ceba5bc2 100644 --- a/src/app/components/JumpRange.jsx +++ b/src/app/components/JumpRange.jsx @@ -61,7 +61,7 @@ export default class JumpRange extends TranslatedComponent { const fuel = this.state.fuelLevel * ship.fuelCapacity; // Obtain the jump range - return Calc.jumpRange(ship.unladenMass + fuel + cargo, fsd, fuel); + return Calc.jumpRange(ship.unladenMass + fuel + cargo, fsd, fuel, ship); } /** diff --git a/src/app/components/ShipSummaryTable.jsx b/src/app/components/ShipSummaryTable.jsx index 22c6d9b3..34f45cda 100644 --- a/src/app/components/ShipSummaryTable.jsx +++ b/src/app/components/ShipSummaryTable.jsx @@ -99,11 +99,11 @@ export default class ShipSummaryTable extends TranslatedComponent { { canThrust ? {int(ship.calcSpeed(4, ship.fuelCapacity, 0, false))}{u['m/s']} : 0 } { canBoost ? {int(ship.calcSpeed(4, ship.fuelCapacity, 0, true))}{u['m/s']} : 0 } - {f2(Calc.jumpRange(ship.unladenMass + ship.standard[2].m.getMaxFuelPerJump(), ship.standard[2].m, ship.standard[2].m.getMaxFuelPerJump()))}{u.LY} - {f2(Calc.jumpRange(ship.unladenMass + ship.fuelCapacity, ship.standard[2].m, ship.fuelCapacity))}{u.LY} - {f2(Calc.jumpRange(ship.unladenMass + ship.fuelCapacity + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity))}{u.LY} - {f2(Calc.totalJumpRange(ship.unladenMass + ship.fuelCapacity, ship.standard[2].m, ship.fuelCapacity))}{u.LY} - {f2(Calc.totalJumpRange(ship.unladenMass + ship.fuelCapacity + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity))}{u.LY} + {f2(Calc.jumpRange(ship.unladenMass + ship.standard[2].m.getMaxFuelPerJump(), ship.standard[2].m, ship.standard[2].m.getMaxFuelPerJump()), ship)}{u.LY} + {f2(Calc.jumpRange(ship.unladenMass + ship.fuelCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY} + {f2(Calc.jumpRange(ship.unladenMass + ship.fuelCapacity + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY} + {f2(Calc.totalJumpRange(ship.unladenMass + ship.fuelCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY} + {f2(Calc.totalJumpRange(ship.unladenMass + ship.fuelCapacity + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY} {int(ship.shield)}{u.MJ} {int(ship.armour)} {f1(ship.totalDps)} diff --git a/src/app/i18n/en.json b/src/app/i18n/en.json index 2bc67723..9bc1866f 100644 --- a/src/app/i18n/en.json +++ b/src/app/i18n/en.json @@ -125,6 +125,7 @@ "gpc": "Guardian Plasma Charger", "ggc": "Guardian Gauss Cannon", "gsrp": "Guardian Shield Reinforcement Package", + "gfsb": "Guardian Frame Shift Drive Booster", "psg": "Prismatic Shield Generator", "pv": "Planetary Vehicle Hangar", "rf": "Refinery", @@ -259,6 +260,7 @@ "boosters": "Boosters", "cells": "Cells", "shield addition": "Shield Addition", + "jump addition": "Jump Addition", "bulkheads": "Bulkheads", "reinforcement": "Reinforcement", "power and costs": "power and costs", diff --git a/src/app/shipyard/Calculations.js b/src/app/shipyard/Calculations.js index e7e85f98..84c84647 100644 --- a/src/app/shipyard/Calculations.js +++ b/src/app/shipyard/Calculations.js @@ -7,11 +7,20 @@ import Module from './Module'; * @param {object} fsd The FDS object/component with maxfuel, fuelmul, fuelpower, optmass * @param {number} fuel Optional - The fuel consumed during the jump * @return {number} Distance in Light Years + * @param {object} ship Ship instance */ -export function jumpRange(mass, fsd, fuel) { +export function jumpRange(mass, fsd, fuel, ship) { const fsdMaxFuelPerJump = fsd instanceof Module ? fsd.getMaxFuelPerJump() : fsd.maxfuel; const fsdOptimalMass = fsd instanceof Module ? fsd.getOptMass() : fsd.optmass; - return Math.pow(Math.min(fuel === undefined ? fsdMaxFuelPerJump : fuel, fsdMaxFuelPerJump) / fsd.fuelmul, 1 / fsd.fuelpower) * fsdOptimalMass / mass; + let jumpAddition = 0; + if (ship) { + for (const module of ship.internal) { + if (module && module.m && module.m.grp === 'gfsb') { + jumpAddition += module.m.getJumpBoost(); + } + } + } + return (Math.pow(Math.min(fuel === undefined ? fsdMaxFuelPerJump : fuel, fsdMaxFuelPerJump) / fsd.fuelmul, 1 / fsd.fuelpower) * fsdOptimalMass / mass) + jumpAddition; } /** @@ -21,8 +30,9 @@ export function jumpRange(mass, fsd, fuel) { * @param {object} fsd The FDS object/component with maxfuel, fuelmul, fuelpower, optmass * @param {number} fuel The total fuel available * @return {number} Distance in Light Years + * @param {object} ship Ship instance */ -export function totalJumpRange(mass, fsd, fuel) { +export function totalJumpRange(mass, fsd, fuel, ship) { const fsdMaxFuelPerJump = fsd instanceof Module ? fsd.getMaxFuelPerJump() : fsd.maxfuel; const fsdOptimalMass = fsd instanceof Module ? fsd.getOptMass() : fsd.optmass; @@ -30,7 +40,7 @@ export function totalJumpRange(mass, fsd, fuel) { let totalRange = 0; while (fuelRemaining > 0) { const fuelForThisJump = Math.min(fuelRemaining, fsdMaxFuelPerJump); - totalRange += this.jumpRange(mass, fsd, fuelForThisJump); + totalRange += this.jumpRange(mass, fsd, fuelForThisJump, ship); // Mass is reduced mass -= fuelForThisJump; fuelRemaining -= fuelForThisJump; diff --git a/src/app/shipyard/Constants.js b/src/app/shipyard/Constants.js index 2b3ebd8b..ce3788bb 100755 --- a/src/app/shipyard/Constants.js +++ b/src/app/shipyard/Constants.js @@ -53,6 +53,7 @@ export const ModuleGroupToName = { cc: 'Collector Limpet Controller', ss: 'Surface Scanner', gsrp: 'Guardian Shield Reinforcement Packages', + gfsb: 'Guardian Frame Shift Drive Booster', // Hard Points bl: 'Beam Laser', diff --git a/src/app/shipyard/Module.js b/src/app/shipyard/Module.js index 285a9ef4..888d8e27 100755 --- a/src/app/shipyard/Module.js +++ b/src/app/shipyard/Module.js @@ -657,6 +657,14 @@ export default class Module { return this._getModifiedValue('shieldaddition'); } + /** + * Get the jump range boost for this module, taking in to account modifications + * @return {Number} the jump range boost for this module + */ + getJumpBoost() { + return this._getModifiedValue('jumpboost'); + } + /** * Get the piercing for this module, taking in to account modifications * @return {Number} the piercing for this module diff --git a/src/app/shipyard/Ship.js b/src/app/shipyard/Ship.js index 5e21836a..13593187 100755 --- a/src/app/shipyard/Ship.js +++ b/src/app/shipyard/Ship.js @@ -151,7 +151,7 @@ export default class Ship { * @return {Number} Jump range in Light Years */ calcLadenRange(massDelta, fuel, fsd) { - return Calc.jumpRange(this.ladenMass + (massDelta || 0), fsd || this.standard[2].m, fuel); + return Calc.jumpRange(this.ladenMass + (massDelta || 0), fsd || this.standard[2].m, fuel, this); } /** @@ -164,7 +164,7 @@ export default class Ship { calcUnladenRange(massDelta, fuel, fsd) { fsd = fsd || this.standard[2].m; let fsdMaxFuelPerJump = fsd instanceof Module ? fsd.getMaxFuelPerJump() : fsd.maxfuel; - return Calc.jumpRange(this.unladenMass + (massDelta || 0) + Math.min(fsdMaxFuelPerJump, fuel || this.fuelCapacity), fsd || this.standard[2].m, fuel); + return Calc.jumpRange(this.unladenMass + (massDelta || 0) + Math.min(fsdMaxFuelPerJump, fuel || this.fuelCapacity), fsd || this.standard[2].m, fuel, this); } /**