mirror of
https://github.com/EDCD/coriolis.git
synced 2025-12-08 22:33:24 +00:00
Add racer role
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user