Something went wrong. Try again.
Starship Simulator Controls thoriumsim.com
Something went wrong. Try again.
1.7 kB · 53 lines
TypeScript
at develop
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354import { applyDamage } from "@thorium/utils/.server/ship/collisionDamage";import { type Entity, System } from "@thorium/utils/ecs";import { getAggregateDamage } from "@thorium/utils/flags/damageTypes";import { Vector3 } from "three";
export class DamageCheckSystem extends System { static flightMode = ["nova"];
test(entity: Entity) { return Boolean(entity.components.damage); }
update(entity: Entity, elapsed: number) { const damageComponent = entity.components.damage;
// If a component is online, check if it should be taken offline if (damageComponent) { const aggregateDamage = getAggregateDamage(entity); if (damageComponent.offline) { if (damageComponent.onlineDamage < aggregateDamage) { return; } // Bring the system back online damageComponent.offline = false; } else { if (damageComponent.offlineDamage > aggregateDamage) { return; } damageComponent.offline = true;
this.checkIfCascadeOccurs(entity, elapsed); } } }
// Check if a cascade event occurs when a system goes offline; if so, apply damage to a random system checkIfCascadeOccurs(entity: Entity, elapsed: number) { const damageComponent = entity.components.damage; if (damageComponent) { const cascadeRisk = damageComponent.cascadeRisk || 0; // Cascade risk is expressed as a percentage if (cascadeRisk > 0) { const randomRoll = this.ecs.rng.next() * 100; if (randomRoll < cascadeRisk * elapsed) { // Damage a random system const randomVector = new Vector3(); const damageAmount = damageComponent.offlineDamage; applyDamage(entity, damageAmount, randomVector, undefined, false); } } } }}