Something went wrong. Try again.
Starship Simulator Controls thoriumsim.com
Something went wrong. Try again.
4.1 kB · 116 lines
TypeScript
at develop
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117import { pubsub } from "@thorium/.server/init/pubsub";import { t } from "@thorium/.server/init/t";import { getMaxSpeedIndex } from "@thorium/cards/Legacy/EngineControl/getMaxSpeedIndex";import { getShipSystem } from "@thorium/utils/.server/ship/getShipSystem";import { shipPubsubFilter } from "@thorium/utils/.server/shipPubsubFilter";import z from "zod";
export const engineControl = t.router({ get: t.procedure .input(z.object({ shipId: z.number() })) .filter(shipPubsubFilter) .autoPublish( ["isWarpEngines", "isImpulseEngines"], (entity) => entity.components.isShipSystem && { shipId: entity.components.isShipSystem?.shipId, }, ) .request(({ ctx, input }) => { const warpEngines = getShipSystem(ctx.ecs, { systemType: "warpEngines", shipId: input.shipId, }); const impulseEngines = getShipSystem(ctx.ecs, { systemType: "impulseEngines", shipId: input.shipId, }); return { warpEngines: warpEngines?.components.isWarpEngines ? { id: warpEngines.id, name: warpEngines.components.identity?.name || "Warp Engines", currentWarpFactor: warpEngines.components.isWarpEngines.currentWarpFactor, speeds: warpEngines.components.isWarpEngines.speeds, nominalHeat: warpEngines.components.heat?.nominalHeat, maxHeat: warpEngines.components.heat?.maxHeat, } : null, impulseEngines: impulseEngines?.components.isImpulseEngines ? { id: impulseEngines.id, name: impulseEngines.components.identity?.name || "Impulse Engines", speeds: impulseEngines.components.isImpulseEngines.speeds, currentSpeed: impulseEngines.components.isImpulseEngines.targetSpeed, cruisingSpeed: impulseEngines.components.isImpulseEngines.cruisingSpeed, nominalHeat: impulseEngines.components.heat?.nominalHeat, maxHeat: impulseEngines.components.heat?.maxHeat, } : null, }; }), setSpeed: t.procedure .input( z.object({ shipId: z.number(), impulseSpeedIndex: z.number().optional(), warpSpeedIndex: z.number().optional(), }), ) .send(({ ctx, input }) => { const warpEngine = getShipSystem(ctx.ecs, { shipId: input.shipId, systemType: "warpEngines", }); const impulseEngine = getShipSystem(ctx.ecs, { shipId: input.shipId, systemType: "impulseEngines", }); if (typeof input.impulseSpeedIndex === "number") { warpEngine?.updateComponent("isWarpEngines", { currentWarpFactor: 0, }); const speedCount = impulseEngine.components.isImpulseEngines?.speeds.length || 2; const power = impulseEngine.components.power; const currentPower = power?.currentPower || 0; const maxIndex = getMaxSpeedIndex(power?.powerLevels || [], currentPower); if (maxIndex < 0) { impulseEngine?.updateComponent("isImpulseEngines", { targetSpeed: 0, }); } else { const speedIncrement = (impulseEngine.components.isImpulseEngines?.cruisingSpeed || 0) / (speedCount - 1);
const speedIndex = Math.min(maxIndex * speedCount, input.impulseSpeedIndex + 1); const speed = speedIncrement * speedIndex; impulseEngine?.updateComponent("isImpulseEngines", { targetSpeed: speed, }); } } else if (typeof input.warpSpeedIndex === "number") { const power = warpEngine.components.power; const currentPower = power?.currentPower || 0; const speedCount = warpEngine.components.isWarpEngines?.speeds.length || 0; const maxIndex = getMaxSpeedIndex(power?.powerLevels || [], currentPower); warpEngine?.updateComponent("isWarpEngines", { currentWarpFactor: Math.trunc( Math.min(Math.max(0, maxIndex * speedCount), input.warpSpeedIndex), ), }); impulseEngine?.updateComponent("isImpulseEngines", { targetSpeed: 0, }); } else { // Full Stop warpEngine?.updateComponent("isWarpEngines", { currentWarpFactor: 0, }); impulseEngine?.updateComponent("isImpulseEngines", { targetSpeed: 0, }); }
pubsub.publish.legacy.engineControl.get({ shipId: input.shipId }); }),});