Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Warp frequency #1500

Merged
merged 7 commits into from
Mar 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion modules/browser/src/panel/blades.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
TextApi,
TextBladeParams,
} from 'tweakpane';
import { BladeController, View } from '@tweakpane/core';
import { BladeController, ButtonParams, View } from '@tweakpane/core';
import { Destructor, RTuple2 } from '@starwards/core';

import { RingInputParams } from '@tweakpane/plugin-camerakit/dist/types/util';
Expand Down Expand Up @@ -140,6 +140,18 @@ export function addCameraRingBlade(
addInputBlade(guiFolder, model, { series: 0, ...params, view: 'cameraring' }, cleanup);
}

export function addButtonBlade(
guiFolder: FolderApi,
onClick: () => unknown,
params: { label: string } & ButtonParams,
cleanup: (d: Destructor) => void
) {
const button = guiFolder.addButton({ ...params }).on('click', onClick);
cleanup(() => {
button.dispose();
});
}

export type InputBladeParams = { label: string } & Partial<InputParams>;

export function addInputBlade<T>(
Expand Down
31 changes: 28 additions & 3 deletions modules/browser/src/widgets/warp.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Destructors, ShipDriver } from '@starwards/core';
import { Destructors, ShipDriver, WarpFrequency } from '@starwards/core';
import { addSliderBlade, addTextBlade } from '../panel';
import { readNumberProp, readProp } from '../property-wrappers';

Expand All @@ -19,13 +19,19 @@ export function warpWidget(shipDriver: ShipDriver): DashboardWidget {
defaultProps: {},
};
}

export function drawWarpStatus(container: WidgetContainer, shipDriver: ShipDriver) {
const panelCleanup = new Destructors();
const pane = new Pane({ title: 'Warp', container: container.getElement().get(0) });
panelCleanup.add(() => pane.dispose());
container.on('destroy', panelCleanup.destroy);
addSliderBlade(pane, readNumberProp(shipDriver, '/warp/currentLevel'), { label: 'Actual' }, panelCleanup.add);
addSliderBlade(pane, readNumberProp(shipDriver, '/warp/desiredLevel'), { label: 'Designated' }, panelCleanup.add);
addSliderBlade(pane, readNumberProp(shipDriver, '/warp/currentLevel'), { label: 'Actual LVL' }, panelCleanup.add);
addSliderBlade(
pane,
readNumberProp(shipDriver, '/warp/desiredLevel'),
{ label: 'Designated LVL' },
panelCleanup.add
);
const jammedProp = readProp(shipDriver, '/warp/jammed');
const jamBlade = addTextBlade(
pane,
Expand All @@ -37,4 +43,23 @@ export function drawWarpStatus(container: WidgetContainer, shipDriver: ShipDrive
const applyThemeToJammed = () => (jamBlade.element.dataset.status = shipDriver.state.warp.jammed ? 'WARN' : ''); // this will change tweakpane theme for this folder, see tweakpane.css
panelCleanup.add(jammedProp.onChange(applyThemeToJammed));
applyThemeToJammed();

addTextBlade(
pane,
readProp<WarpFrequency>(shipDriver, '/warp/currentFrequency'),
{ format: (p: WarpFrequency) => WarpFrequency[p], label: 'Actual FRQ' },
panelCleanup.add
);
addTextBlade(
pane,
readProp<WarpFrequency>(shipDriver, '/warp/desiredFrequency'),
{ format: (p: WarpFrequency) => WarpFrequency[p], label: 'Designated FRQ' },
panelCleanup.add
);
addSliderBlade(
pane,
readNumberProp(shipDriver, '/warp/frequencyChange'),
{ label: 'Calibration' },
panelCleanup.add
);
}
2 changes: 1 addition & 1 deletion modules/core/src/configurations/dragonfly-sf-22.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ export const dragonflyThruster = {
capacity: 150,
energyCost: 0.07,
afterBurnerCapacity: 300,
afterBurnerEffectFactor: 1,
damage50: 15,
};
export const dragonflyRadar = {
Expand Down Expand Up @@ -84,6 +83,7 @@ export const dragonflyWarp = {
energyCostPerLevel: 2,
damagePerPhysicalSpeed: 20,
baseDamagePerWarpSpeedPerSecond: 0.1,
secondsToChangeFrequency: 10,
};
export const dragonflyDocking = {
damage50: 20,
Expand Down
11 changes: 8 additions & 3 deletions modules/core/src/ship/chain-gun-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ export class ChainGunManager {
chainGun.projectile = ammoTypes.elementAfter(chainGun.projectile);
}
}
if (chainGun.broken) {
if (!chainGun.effectiveness) {
chainGun.isFiring = false;
}
if (!chainGun.isFiring) {
Expand All @@ -126,7 +126,7 @@ export class ChainGunManager {
chainGun.design.bulletsPerSecond * chainGun.rateOfFireFactor * chainGun.effectiveness * deltaSeconds;
const loadingEnergy =
chainGun.design.bulletsPerSecond * chainGun.effectiveness * deltaSeconds * chainGun.design.energyCost;
if (!chainGun.broken && loadingDelta > 0) {
if (loadingDelta > 0) {
// const loadAction = this.calcLoadAction();
if (
chainGun.loadedProjectile !== 'None' &&
Expand Down Expand Up @@ -162,7 +162,12 @@ export class ChainGunManager {

private fireChainGun() {
const chainGun = this.chainGun;
if (!chainGun.broken && chainGun.isFiring && chainGun.loading >= 1 && chainGun.loadedProjectile !== 'None') {
if (
chainGun.effectiveness > 0 &&
chainGun.isFiring &&
chainGun.loading >= 1 &&
chainGun.loadedProjectile !== 'None'
) {
const projectile = new Projectile(chainGun.loadedProjectile);
chainGun.loading = 0;
chainGun.loadedProjectile = 'None';
Expand Down
87 changes: 38 additions & 49 deletions modules/core/src/ship/damage-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import { Die, FRONT_ARC, REAR_ARC, ShipSystem } from '.';

import { DeepReadonly } from 'ts-essentials';
import { Docking } from './docking';
import { DockingManager } from './docking-manager';
import { Magazine } from './magazine';
import { Maneuvering } from './maneuvering';
import NormalDistribution from 'normal-distribution';
Expand Down Expand Up @@ -82,75 +81,67 @@ export class DamageManager {
} else if (Warp.isInstance(system)) {
this.damageWarp(system, damageObject.id);
} else if (Docking.isInstance(system)) {
DockingManager.damageDocking(system);
this.damageDocking(system);
} else if (Maneuvering.isInstance(system)) {
this.damageManeuvering(system, damageObject.id);
}
}
}

damageDocking(docking: Docking) {
if (docking.broken) {
return;
}
docking.rangesFactor -= 0.05;
}

private damageManeuvering(maneuvering: Maneuvering, damageId: string) {
if (!maneuvering.broken) {
if (this.die.getSuccess('damageManeuvering' + damageId, 0.5)) {
maneuvering.efficiency -= 0.05;
} else {
maneuvering.afterBurnerFuel *= 0.9;
}
if (this.die.getSuccess('damageManeuvering' + damageId, 0.5)) {
maneuvering.efficiency -= 0.05;
} else {
maneuvering.afterBurnerFuel *= 0.9;
}
}

private damageWarp(warp: Warp, damageId: string) {
if (!warp.broken) {
if (this.die.getSuccess('damageWarp' + damageId, 0.5)) {
warp.damageFactor += 0.05;
} else {
warp.velocityFactor *= 0.9;
}
if (this.die.getSuccess('damageWarp' + damageId, 0.5)) {
warp.damageFactor += 0.05;
} else {
warp.velocityFactor *= 0.9;
}
}

private damageMagazine(magazine: Magazine, damageId: string) {
if (!magazine.broken) {
if (this.die.getSuccess('damageMagazine' + damageId, 0.5)) {
// todo convert to a defectible property that accumulates damage
const idx = this.die.getRollInRange('magazineostAmmo' + damageId, 0, projectileModels.length);
const projectileKey = projectileModels[idx];
magazine[`count_${projectileKey}`] = Math.round(
magazine[`count_${projectileKey}`] * (1 - magazine.design.capacityDamageFactor)
);
} else {
magazine.capacity *= 1 - magazine.design.capacityDamageFactor;
}
if (this.die.getSuccess('damageMagazine' + damageId, 0.5)) {
// todo convert to a defectible property that accumulates damage
const idx = this.die.getRollInRange('magazineostAmmo' + damageId, 0, projectileModels.length);
const projectileKey = projectileModels[idx];
magazine[`count_${projectileKey}`] = Math.round(
magazine[`count_${projectileKey}`] * (1 - magazine.design.capacityDamageFactor)
);
} else {
magazine.capacity *= 1 - magazine.design.capacityDamageFactor;
}
}

private damageReactor(reactor: Reactor, damageId: string) {
if (!reactor.broken) {
if (this.die.getSuccess('damageReactor' + damageId, 0.5)) {
// todo convert to a defectible property that accumulates damage
reactor.energy *= 0.9;
} else {
reactor.effeciencyFactor -= 0.05;
}
if (this.die.getSuccess('damageReactor' + damageId, 0.5)) {
// todo convert to a defectible property that accumulates damage
reactor.energy *= 0.9;
} else {
reactor.effeciencyFactor -= 0.05;
}
}

private damageSmartPilot(smartPilot: SmartPilot) {
if (!smartPilot.broken) {
smartPilot.offsetFactor += 0.01;
}
smartPilot.offsetFactor += 0.01;
}

private damageRadar(radar: Radar) {
if (!radar.broken) {
radar.malfunctionRangeFactor += 0.05;
}
radar.malfunctionRangeFactor += 0.05;
}

private damageThruster(thruster: Thruster, damageId: string) {
if (thruster.broken) {
return;
}
if (this.die.getSuccess('damageThruster' + damageId, 0.5)) {
thruster.angleError +=
limitPercision(this.die.getRollInRange('thrusterAngleOffset' + damageId, 1, 3)) *
Expand All @@ -164,14 +155,12 @@ export class DamageManager {
}

private damageChainGun(chainGun: ChainGun, damageId: string) {
if (!chainGun.broken) {
if (this.die.getSuccess('damageChaingun' + damageId, 0.5)) {
chainGun.angleOffset +=
limitPercision(this.die.getRollInRange('chainGunAngleOffset' + damageId, 1, 2)) *
(this.die.getSuccess('chainGunAngleSign' + damageId, 0.5) ? 1 : -1);
} else {
chainGun.rateOfFireFactor *= 0.9;
}
if (this.die.getSuccess('damageChaingun' + damageId, 0.5)) {
chainGun.angleOffset +=
limitPercision(this.die.getRollInRange('chainGunAngleOffset' + damageId, 1, 2)) *
(this.die.getSuccess('chainGunAngleSign' + damageId, 0.5) ? 1 : -1);
} else {
chainGun.rateOfFireFactor *= 0.9;
}
}

Expand Down
14 changes: 5 additions & 9 deletions modules/core/src/ship/docking-manager.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { Docking, DockingMode } from './docking';
import { SpaceManager, XY, getClosestDockingTarget, isInRange, toDegreesDelta } from '../logic';
import { cleanupBot, docker } from '../logic/bot';

import { DamageManager } from './damage-manager';
import { DeepReadonly } from 'ts-essentials';
import { DockingMode } from './docking';
import { ShipManager } from '..';
import { ShipState } from './ship-state';
import { Spaceship } from '../space';
Expand All @@ -15,17 +16,12 @@ const toggleTransition = {
};

export class DockingManager {
static damageDocking(docking: Docking) {
if (!docking.broken) {
docking.rangesFactor -= 0.05;
}
}

constructor(
private spaceObject: DeepReadonly<Spaceship>,
private state: ShipState,
private spaceManager: SpaceManager,
private shipManager: ShipManager
private shipManager: ShipManager,
private damageManager: DamageManager
) {}

update() {
Expand Down Expand Up @@ -82,7 +78,7 @@ export class DockingManager {
if (this.state.docking.mode === DockingMode.DOCKED) {
this.spaceManager.attach(this.state.id, this.state.docking.targetId);
if (!isDockedPosition) {
DockingManager.damageDocking(this.state.docking);
this.damageManager.damageDocking(this.state.docking);
this.state.docking.mode = DockingMode.DOCKING;
}
} else if (this.state.docking.mode === DockingMode.DOCKING) {
Expand Down
1 change: 1 addition & 0 deletions modules/core/src/ship/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ export * from './reactor';
export * from './make-ship-state';
export * from './thruster';
export * from './docking';
export * from './warp';
export * from './system';
Loading