Add racer role

This commit is contained in:
Cmdr McDonald
2017-04-21 10:43:39 +01:00
parent e9cbe0d952
commit 8f944bc4c8
7 changed files with 214 additions and 63 deletions

View File

@@ -1,6 +1,7 @@
#2.3.4 #2.3.4
* Fix crash when removing the special effect from a module * Fix crash when removing the special effect from a module
* Ensure comparisons with saved stock ships work correctly * Ensure comparisons with saved stock ships work correctly
* Add 'Racer' role
#2.3.3 #2.3.3
* Remove unused blueprint when hitting reset * Remove unused blueprint when hitting reset

View File

@@ -5,7 +5,7 @@ import { isEmpty, stopCtxPropagation } from '../utils/UtilityFunctions';
import cn from 'classnames'; import cn from 'classnames';
import { Modifications } from 'coriolis-data/dist'; import { Modifications } from 'coriolis-data/dist';
import Modification from './Modification'; import Modification from './Modification';
import { getBlueprint, blueprintTooltip } from '../utils/BlueprintFunctions'; import { getBlueprint, blueprintTooltip, setWorst, setBest, setExtreme, setRandom } from '../utils/BlueprintFunctions';
/** /**
* Modifications menu * Modifications menu
@@ -165,35 +165,12 @@ export default class ModificationsMenu extends TranslatedComponent {
this.props.onChange(); this.props.onChange();
} }
/**
* Set the result of a roll
* @param {object} ship The ship to which the roll applies
* @param {object} m The module to which the roll applies
* @param {string} featureName The modification feature to which the roll applies
* @param {number} value The value of the roll
*/
_setRollResult(ship, m, featureName, value) {
if (Modifications.modifications[featureName].type == 'percentage') {
ship.setModification(m, featureName, value * 10000);
} else if (Modifications.modifications[featureName].type == 'numeric') {
ship.setModification(m, featureName, value * 100);
} else {
ship.setModification(m, featureName, value);
}
}
/** /**
* Provide a 'worst' roll within the information we have * Provide a 'worst' roll within the information we have
*/ */
_rollWorst() { _rollWorst() {
const { m, ship } = this.props; const { m, ship } = this.props;
ship.clearModifications(m); setWorst(ship, m);
const features = m.blueprint.grades[m.blueprint.grade].features;
for (const featureName in features) {
let value = features[featureName][0];
this._setRollResult(ship, m, featureName, value);
}
this.props.onChange(); this.props.onChange();
} }
@@ -202,13 +179,7 @@ export default class ModificationsMenu extends TranslatedComponent {
*/ */
_rollRandom() { _rollRandom() {
const { m, ship } = this.props; const { m, ship } = this.props;
ship.clearModifications(m); setRandom(ship, m);
const features = m.blueprint.grades[m.blueprint.grade].features;
for (const featureName in features) {
let value = features[featureName][0] + (Math.random() * (features[featureName][1] - features[featureName][0]));
this._setRollResult(ship, m, featureName, value);
}
this.props.onChange(); this.props.onChange();
} }
@@ -217,12 +188,7 @@ export default class ModificationsMenu extends TranslatedComponent {
*/ */
_rollBest() { _rollBest() {
const { m, ship } = this.props; const { m, ship } = this.props;
const features = m.blueprint.grades[m.blueprint.grade].features; setBest(ship, m);
for (const featureName in features) {
let value = features[featureName][1];
this._setRollResult(ship, m, featureName, value);
}
this.props.onChange(); this.props.onChange();
} }
@@ -231,29 +197,7 @@ export default class ModificationsMenu extends TranslatedComponent {
*/ */
_rollExtreme() { _rollExtreme() {
const { m, ship } = this.props; const { m, ship } = this.props;
ship.clearModifications(m); setExtreme(ship, m);
const features = m.blueprint.grades[m.blueprint.grade].features;
for (const featureName in features) {
let value;
if (Modifications.modifications[featureName].higherbetter) {
// Higher is better, but is this making it better or worse?
if (features[featureName][0] < 0 || (features[featureName][0] === 0 && features[featureName][1] < 0)) {
value = features[featureName][0];
} else {
value = features[featureName][1];
}
} else {
// Higher is worse, but is this making it better or worse?
if (features[featureName][0] < 0 || (features[featureName][0] === 0 && features[featureName][1] < 0)) {
value = features[featureName][1];
} else {
value = features[featureName][0];
}
}
this._setRollResult(ship, m, featureName, value);
}
this.props.onChange(); this.props.onChange();
} }

View File

@@ -72,6 +72,15 @@ export default class StandardSlotSection extends SlotSection {
this._close(); this._close();
} }
/**
* Racer role
*/
_optimizeRacer() {
ShipRoles.racer(this.props.ship);
this.props.onChange();
this._close();
}
/** /**
* Use the specified bulkhead * Use the specified bulkhead
* @param {Object} bulkhead Bulkhead module details * @param {Object} bulkhead Bulkhead module details
@@ -220,6 +229,7 @@ export default class StandardSlotSection extends SlotSection {
<li className={cn('lc', { disabled: planetaryDisabled })} onClick={!planetaryDisabled && this._optimizeExplorer.bind(this, true)}>{translate('Planetary Explorer')}</li> <li className={cn('lc', { disabled: planetaryDisabled })} onClick={!planetaryDisabled && this._optimizeExplorer.bind(this, true)}>{translate('Planetary Explorer')}</li>
<li className='lc' onClick={this._optimizeMiner.bind(this, false)}>{translate('Miner')}</li> <li className='lc' onClick={this._optimizeMiner.bind(this, false)}>{translate('Miner')}</li>
<li className='lc' onClick={this._optimizeMiner.bind(this, true)}>{translate('Shielded Miner')}</li> <li className='lc' onClick={this._optimizeMiner.bind(this, true)}>{translate('Shielded Miner')}</li>
<li className='lc' onClick={this._optimizeRacer.bind(this)}>{translate('Racer')}</li>
</ul> </ul>
</div>; </div>;
} }

View File

@@ -119,12 +119,11 @@ export default class ModuleSet {
/** /**
* Find the lightest Power Distributor that provides sufficient * Find the lightest Power Distributor that provides sufficient
* energy to boost. * energy to boost.
* @param {number} boostEnergy [description] * @param {number} boostEnergy The energy that is required to boost
* @return {Object} Power Distributor * @return {Object} Power Distributor
*/ */
lightestPowerDist(boostEnergy) { lightestPowerDist(boostEnergy) {
let pd = this.standard[4][0]; let pd = this.standard[4][0];
for (let p of this.standard[4]) { for (let p of this.standard[4]) {
if (p.mass < pd.mass && p.engcap > boostEnergy) { if (p.mass < pd.mass && p.engcap > boostEnergy) {
pd = p; pd = p;

View File

@@ -1718,6 +1718,11 @@ export default class Ship {
.use(standard[4], pd) // Power Distributor .use(standard[4], pd) // Power Distributor
.use(standard[6], ft); // Fuel Tank .use(standard[6], ft); // Fuel Tank
// Turn off nearly everything
if (m.fsdDisabled) this.setSlotEnabled(this.standard[2], false);
if (m.pdDisabled) this.setSlotEnabled(this.standard[4], false);
if (m.sDisabled) this.setSlotEnabled(this.standard[5], false);
// Thrusters and Powerplant must be determined after all other ModuleUtils are mounted // Thrusters and Powerplant must be determined after all other ModuleUtils are mounted
// Loop at least once to determine absolute lightest PD and TH // Loop at least once to determine absolute lightest PD and TH
do { do {

View File

@@ -294,3 +294,88 @@ export function miner(ship, shielded) {
ship.useLightestStandard(standardOpts); ship.useLightestStandard(standardOpts);
} }
/**
* Racer Role
* @param {Ship} ship Ship instance
*/
export function racer(ship) {
let standardOpts = {},
usedSlots = [],
sgSlot,
sg = ship.getAvailableModules().lightestShieldGenerator(ship.hullMass);
// Cargo hatch can be disabled
ship.setSlotEnabled(ship.cargoHatch, false);
// Shield generator
const shieldOrder = [1, 2, 3, 4, 5, 6, 7, 8];
const shieldInternals = ship.internal.filter(a => usedSlots.indexOf(a) == -1)
.filter(a => (!a.eligible) || a.eligible.sg)
.filter(a => a.maxClass >= sg.class)
.sort((a,b) => shieldOrder.indexOf(a.maxClass) - shieldOrder.indexOf(b.maxClass));
for (let i = 0; i < shieldInternals.length; i++) {
if (canMount(ship, shieldInternals[i], 'sg')) {
ship.use(shieldInternals[i], sg);
usedSlots.push(shieldInternals[i]);
sgSlot = shieldInternals[i];
break;
}
}
// Empty the hardpoints
for (let s of ship.hardpoints) {
ship.use(s, null);
}
// Empty the internals
for (let i = ship.internal.length; i--;) {
let slot = ship.internal[i];
if (usedSlots.indexOf(slot) == -1) {
ship.use(slot, null);
}
}
// Best thrusters
if (ship.standard[1].maxClass === 3) {
standardOpts.th = 'tz';
} else if (ship.standard[1].maxClass === 2) {
standardOpts.th = 'u0';
} else {
standardOpts.th = ship.standard[1].maxClass + 'A';
}
// Best power distributor for more boosting
standardOpts.pd = ship.standard[4].maxClass + 'A';
// Smallest possible FSD drive
standardOpts.fsd = '2D';
// Minimal fuel tank
standardOpts.ft = '1C';
// Disable nearly everything
standardOpts.fsdDisabled = true;
standardOpts.sDisabled = true;
standardOpts.pdDisabled = true;
standardOpts.lsDisabled = true;
ship.useLightestStandard(standardOpts);
// Apply engineering to each module
// ship.standard[1].m.blueprint = getBlueprint('Engine_Dirty', ship.standard[0]);
// ship.standard[1].m.blueprint.grade = 5;
// setBest(ship, ship.standard[1].m);
// ship.standard[3].m.blueprint = getBlueprint('LifeSupport_LightWeight', ship.standard[3]);
// ship.standard[3].m.blueprint.grade = 4;
// setBest(ship, ship.standard[3].m);
// ship.standard[4].m.blueprint = getBlueprint('PowerDistributor_PriorityEngines', ship.standard[4]);
// ship.standard[4].m.blueprint.grade = 3;
// setBest(ship, ship.standard[4].m);
// ship.standard[5].m.blueprint = getBlueprint('Sensor_Sensor_LightWeight', ship.standard[5]);
// ship.standard[5].m.blueprint.grade = 5;
// setBest(ship, ship.standard[5].m);
}

View File

@@ -227,3 +227,110 @@ export function getBlueprint(name, module) {
} }
return blueprint; return blueprint;
} }
/**
* Provide 'worst' primary modifications
* @param {Object} ship The ship for which to perform the modifications
* @param {Object} m The module for which to perform the modifications
*/
export function setWorst(ship, m) {
ship.clearModifications(m);
const features = m.blueprint.grades[m.blueprint.grade].features;
for (const featureName in features) {
const value = features[featureName][0];
_setValue(ship, m, featureName, value);
}
}
/**
* Provide 'best' primary modifications
* @param {Object} ship The ship for which to perform the modifications
* @param {Object} m The module for which to perform the modifications
*/
export function setBest(ship, m) {
ship.clearModifications(m);
const features = m.blueprint.grades[m.blueprint.grade].features;
for (const featureName in features) {
const value = features[featureName][1];
_setValue(ship, m, featureName, value);
}
}
/**
* Provide 'extreme' primary modifications
* @param {Object} ship The ship for which to perform the modifications
* @param {Object} m The module for which to perform the modifications
*/
export function setExtreme(ship, m) {
ship.clearModifications(m);
const features = m.blueprint.grades[m.blueprint.grade].features;
for (const featureName in features) {
let value;
if (Modifications.modifications[featureName].higherbetter) {
// Higher is better, but is this making it better or worse?
if (features[featureName][0] < 0 || (features[featureName][0] === 0 && features[featureName][1] < 0)) {
value = features[featureName][0];
} else {
value = features[featureName][1];
}
} else {
// Higher is worse, but is this making it better or worse?
if (features[featureName][0] < 0 || (features[featureName][0] === 0 && features[featureName][1] < 0)) {
value = features[featureName][1];
} else {
value = features[featureName][0];
}
}
_setValue(ship, m, featureName, value);
}
}
/**
* Provide 'random' primary modifications
* @param {Object} ship The ship for which to perform the modifications
* @param {Object} m The module for which to perform the modifications
*/
export function setRandom(ship, m) {
ship.clearModifications(m);
// Pick a single value for our randomness
const mult = Math.random();
const features = m.blueprint.grades[m.blueprint.grade].features;
for (const featureName in features) {
let value;
if (Modifications.modifications[featureName].higherbetter) {
// Higher is better, but is this making it better or worse?
if (features[featureName][0] < 0 || (features[featureName][0] === 0 && features[featureName][1] < 0)) {
value = features[featureName][1] + ((features[featureName][0] - features[featureName][1]) * mult);
} else {
value = features[featureName][0] + ((features[featureName][1] - features[featureName][0]) * mult);
}
} else {
// Higher is worse, but is this making it better or worse?
if (features[featureName][0] < 0 || (features[featureName][0] === 0 && features[featureName][1] < 0)) {
value = features[featureName][0] + ((features[featureName][1] - features[featureName][0]) * mult);
} else {
value = features[featureName][1] + ((features[featureName][0] - features[featureName][1]) * mult);
}
}
_setValue(ship, m, featureName, value);
}
}
/**
* Set a modification feature value
* @param {Object} ship The ship for which to perform the modifications
* @param {Object} m The module for which to perform the modifications
* @param {string} featureName The feature being set
* @param {number} value The value being set for the feature
*/
function _setValue(ship, m, featureName, value) {
if (Modifications.modifications[featureName].type == 'percentage') {
ship.setModification(m, featureName, value * 10000);
} else if (Modifications.modifications[featureName].type == 'numeric') {
ship.setModification(m, featureName, value * 100);
} else {
ship.setModification(m, featureName, value);
}
}