message-schemas/schema-types.ts
2024-04-30 16:37:51 +02:00

74 lines
2.0 KiB
TypeScript

import { tags } from "typia";
/* messages ***************************************************************************************/
export type SimToCmMessage = {
message?: Message,
stressLevel?: Range<0, 1>,
};
export type Message = RequestApprovalToAttack | AcaFuelLow | MissileToOwnshipDetected | AcaDefect | AcaHeadingToBase;
export type BaseMessage<TKind extends string, TData extends object> = {
id: MessageId,
priority: Priority,
kind: TKind,
data: TData,
};
export type RequestApprovalToAttack = BaseMessage<"RequestApprovalToAttack", {
target: Target,
collateralDamage: "none" | "simple" | "complex",
detectedByAca?: Id,
attackWeapon: Weapon,
choiceWeight: Range<-1, 1>, // specifies which choice option to prefer, -1: deny, 1: approve
}>;
export type MissileToOwnshipDetected = BaseMessage<"MissileToOwnshipDetected", {
missileLocation: GeoPoint,
survivability: Range<0, 1>,
detectedByAca?: Id,
acaAttackWeapon?: Weapon,
choiceWeight: Range<-1, 1>, // specifies which choice option to prefer, -1: avoid, 1: intervene
}>;
export type AcaFuelLow = BaseMessage<"AcaFuelLow", {
acaId: Id,
fuelLevel: Range<0, 1>,
}>;
export type AcaDefect = BaseMessage<"AcaDefect", {
acaId: Id,
message: string,
}>;
export type AcaHeadingToBase = BaseMessage<"AcaHeadingToBase", {
acaId: Id,
reason?: "fuelLow" | "weaponsLow",
}>;
/* utility types **********************************************************************************/
export type Id = number & tags.Type<"uint64">;
export type MessageId = string & tags.Format<"uuid">;
export type Priority = number & tags.Type<"uint32"> & tags.Maximum<10>;
export type Range<From extends number, To extends number> = number & tags.Type<"float"> & tags.Minimum<From> & tags.Maximum<To>;
export type Target = {
location: GeoPoint,
threatLevel: Range<0, 1>,
type: string,
};
export type GeoPoint = {
lat: Range<-90, 90>,
lng: Range<-180, 180>,
};
export type Weapon = {
type: string,
load: Range<0, 1>,
};