mirror of
https://github.com/EDCD/coriolis.git
synced 2025-12-08 22:33:24 +00:00
129 lines
5.0 KiB
JavaScript
129 lines
5.0 KiB
JavaScript
import * as ModuleUtils from './ModuleUtils';
|
|
import { canMount } from '../utils/SlotFunctions';
|
|
|
|
/**
|
|
* Standard / typical role for multi-purpose or combat (if shielded with better bulkheads)
|
|
* @param {Ship} ship Ship instance
|
|
* @param {Boolean} shielded True if shield generator should be included
|
|
* @param {integer} bulkheadIndex Bulkhead to use see Constants.BulkheadNames
|
|
*/
|
|
export function multiPurpose(ship, shielded, bulkheadIndex) {
|
|
ship.useStandard('A')
|
|
.use(ship.standard[3], ModuleUtils.standard(3, ship.standard[3].maxClass + 'D')) // D Life Support
|
|
.use(ship.standard[5], ModuleUtils.standard(5, ship.standard[5].maxClass + 'D')) // D Sensors
|
|
.useBulkhead(bulkheadIndex);
|
|
|
|
if (shielded) {
|
|
ship.internal.some(function(slot) {
|
|
if (canMount(ship, slot, 'sg')) { // Assuming largest slot can hold an eligible shield
|
|
ship.use(slot, ModuleUtils.findInternal('sg', slot.maxClass, 'A'));
|
|
ship.setSlotEnabled(slot, true);
|
|
return true;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Trader Role
|
|
* @param {Ship} ship Ship instance
|
|
* @param {Boolean} shielded True if shield generator should be included
|
|
* @param {Object} standardOpts [Optional] Standard module optional overrides
|
|
*/
|
|
export function trader(ship, shielded, standardOpts) {
|
|
let sg = shielded ? ship.getAvailableModules().lightestShieldGenerator(ship.hullMass) : null;
|
|
|
|
for (let i = ship.internal.length; i--;) {
|
|
let slot = ship.internal[i];
|
|
if (sg && canMount(ship, slot, 'sg', sg.class)) {
|
|
ship.use(slot, sg);
|
|
sg = null;
|
|
} else {
|
|
if (canMount(ship, slot, 'cr')) {
|
|
ship.use(slot, ModuleUtils.findInternal('cr', slot.maxClass, 'E'));
|
|
}
|
|
}
|
|
}
|
|
|
|
ship.useLightestStandard(standardOpts);
|
|
}
|
|
|
|
/**
|
|
* Explorer Role
|
|
* @param {Ship} ship Ship instance
|
|
* @param {Boolean} planetary True if Planetary Vehicle Hangar (PVH) should be included
|
|
*/
|
|
export function explorer(ship, planetary) {
|
|
let standardOpts = { ppRating: 'A' },
|
|
intLength = ship.internal.length,
|
|
heatSinkCount = 2, // Fit 2 heat sinks if possible
|
|
afmUnitCount = 2, // Fit 2 AFM Units if possible
|
|
shieldNext = planetary,
|
|
sgSlot,
|
|
fuelScoopSlot,
|
|
pvhSlot,
|
|
sg = ship.getAvailableModules().lightestShieldGenerator(ship.hullMass);
|
|
|
|
if (!planetary) { // Non-planetary explorers don't really need to boost
|
|
standardOpts.pd = '1D';
|
|
}
|
|
|
|
ship.setSlotEnabled(ship.cargoHatch, false)
|
|
.use(ship.internal[--intLength], ModuleUtils.internal('2f')); // Advanced Discovery Scanner
|
|
|
|
if (!planetary || intLength > 3) { // Don't mount a DDS on planetary explorer ships too small for both a PVH and DDS
|
|
ship.use(ship.internal[--intLength], ModuleUtils.internal('2i')); // Detailed Surface Scanner
|
|
}
|
|
|
|
for (let i = 0; i < intLength; i++) {
|
|
let slot = ship.internal[i];
|
|
let nextSlot = (i + 1) < intLength ? ship.internal[i + 1] : null;
|
|
// Fit best possible Fuel Scoop
|
|
if (!fuelScoopSlot && canMount(ship, slot, 'fs')) {
|
|
fuelScoopSlot = slot;
|
|
ship.use(slot, ModuleUtils.findInternal('fs', slot.maxClass, 'A'));
|
|
ship.setSlotEnabled(slot, true);
|
|
// Mount a Shield generator if possible AND an AFM Unit has been mounted already (Guarantees at least 1 AFM Unit)
|
|
} else if (!sgSlot && shieldNext && canMount(ship, slot, 'sg', sg.class) && !canMount(ship, nextSlot, 'sg', sg.class)) {
|
|
sgSlot = slot;
|
|
shieldNext = false;
|
|
ship.use(slot, sg);
|
|
ship.setSlotEnabled(slot, true);
|
|
// if planetary explorer and the next slot cannot mount a PVH or the next modul to mount is a SG
|
|
} else if (planetary && !pvhSlot && canMount(ship, slot, 'pv') && (shieldNext || !canMount(ship, nextSlot, 'pv', 2))) {
|
|
pvhSlot = slot;
|
|
ship.use(slot, ModuleUtils.findInternal('pv', Math.min(Math.floor(pvhSlot.maxClass / 2) * 2, 6), 'G'));
|
|
ship.setSlotEnabled(slot, false); // Disabled power for PVH
|
|
shieldNext = !sgSlot;
|
|
} else if (afmUnitCount > 0 && canMount(ship, slot, 'am')) {
|
|
afmUnitCount--;
|
|
ship.use(slot, ModuleUtils.findInternal('am', slot.maxClass, 'A'));
|
|
ship.setSlotEnabled(slot, false); // Disabled power for AFM Unit
|
|
shieldNext = !sgSlot;
|
|
} else {
|
|
ship.use(slot, null);
|
|
}
|
|
}
|
|
|
|
for (let s of ship.hardpoints) {
|
|
if (s.maxClass == 0 && heatSinkCount) { // Mount up to 2 heatsinks
|
|
ship.use(s, ModuleUtils.hardpoints('02'));
|
|
ship.setSlotEnabled(s, heatSinkCount == 2); // Only enable a single Heatsink
|
|
heatSinkCount--;
|
|
} else {
|
|
ship.use(s, null);
|
|
}
|
|
}
|
|
|
|
if (sgSlot) {
|
|
// The SG and Fuel scoop to not need to be powered at the same time
|
|
if (sgSlot.m.getPowerUsage() > fuelScoopSlot.m.getPowerUsage()) { // The Shield generator uses the most power
|
|
ship.setSlotEnabled(fuelScoopSlot, false);
|
|
} else { // The Fuel scoop uses the most power
|
|
ship.setSlotEnabled(sgSlot, false);
|
|
}
|
|
}
|
|
|
|
ship.useLightestStandard(standardOpts);
|
|
}
|