- seeded OPORD generator (grid, azimuth, H-HOUR, phase lines, codewords, callsign, frequency) in pure lib src/lib/opord-recall.ts with per-tier memo windows (25/18/12s) and quiz sizes (4/6/8) - server action submitOpordRecallResult validates input, recomputes score server-side, persists to Profiles progression.minigames.opordRecall, broadcasts XP, emits minigame:opord-recall event - UI at /opord: briefing countdown, one-at-a-time quiz, debrief metres, tier radio group, SSE presence, REST leaderboard per tier - profiles migration 20260908_152021 (7 additive columns) + XP hook wiring - nav entries in command palette and NavUser Exercises submenu - e2e spec plays a full round and asserts debrief + leaderboard row
5980 lines
No EOL
156 KiB
TypeScript
5980 lines
No EOL
156 KiB
TypeScript
/* tslint:disable */
|
|
/* eslint-disable */
|
|
/**
|
|
* This file was automatically generated by Payload.
|
|
* DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config,
|
|
* and re-run `payload generate:types` to regenerate this file.
|
|
*/
|
|
|
|
/**
|
|
* Supported timezones in IANA format.
|
|
*
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "supportedTimezones".
|
|
*/
|
|
export type SupportedTimezones =
|
|
| 'Pacific/Midway'
|
|
| 'Pacific/Niue'
|
|
| 'Pacific/Honolulu'
|
|
| 'Pacific/Rarotonga'
|
|
| 'America/Anchorage'
|
|
| 'Pacific/Gambier'
|
|
| 'America/Los_Angeles'
|
|
| 'America/Tijuana'
|
|
| 'America/Denver'
|
|
| 'America/Phoenix'
|
|
| 'America/Chicago'
|
|
| 'America/Guatemala'
|
|
| 'America/New_York'
|
|
| 'America/Bogota'
|
|
| 'America/Caracas'
|
|
| 'America/Santiago'
|
|
| 'America/Buenos_Aires'
|
|
| 'America/Sao_Paulo'
|
|
| 'Atlantic/South_Georgia'
|
|
| 'Atlantic/Azores'
|
|
| 'Atlantic/Cape_Verde'
|
|
| 'Europe/London'
|
|
| 'Europe/Berlin'
|
|
| 'Africa/Lagos'
|
|
| 'Europe/Athens'
|
|
| 'Africa/Cairo'
|
|
| 'Europe/Moscow'
|
|
| 'Asia/Riyadh'
|
|
| 'Asia/Dubai'
|
|
| 'Asia/Baku'
|
|
| 'Asia/Karachi'
|
|
| 'Asia/Tashkent'
|
|
| 'Asia/Calcutta'
|
|
| 'Asia/Dhaka'
|
|
| 'Asia/Almaty'
|
|
| 'Asia/Jakarta'
|
|
| 'Asia/Bangkok'
|
|
| 'Asia/Shanghai'
|
|
| 'Asia/Singapore'
|
|
| 'Asia/Tokyo'
|
|
| 'Asia/Seoul'
|
|
| 'Australia/Brisbane'
|
|
| 'Australia/Sydney'
|
|
| 'Pacific/Guam'
|
|
| 'Pacific/Noumea'
|
|
| 'Pacific/Auckland'
|
|
| 'Pacific/Fiji';
|
|
|
|
export interface Config {
|
|
auth: {
|
|
users: UserAuthOperations;
|
|
'payload-mcp-api-keys': PayloadMcpApiKeyAuthOperations;
|
|
};
|
|
blocks: {};
|
|
collections: {
|
|
media: Media;
|
|
'game-hard-resources': GameHardResource;
|
|
'game-structures': GameStructure;
|
|
'game-vehicles': GameVehicle;
|
|
'game-npcs': GameNpc;
|
|
'npc-staffing': NpcStaffing;
|
|
'labor-classifications': LaborClassification;
|
|
'game-event-logs': GameEventLog;
|
|
users: User;
|
|
roles: Role;
|
|
ranks: Rank;
|
|
profiles: Profile;
|
|
awards: Award;
|
|
qualifications: Qualification;
|
|
assignments: Assignment;
|
|
'assignment-transfers': AssignmentTransfer;
|
|
experience: Experience;
|
|
'user-notifications': UserNotification;
|
|
evaluations: Evaluation;
|
|
missions: Mission;
|
|
'mission-attendances': MissionAttendance;
|
|
campaigns: Campaign;
|
|
factions: Faction;
|
|
technologies: Technology;
|
|
assets: Asset;
|
|
resources: Resource;
|
|
vehicles: Vehicle;
|
|
structures: Structure;
|
|
shipments: Shipment;
|
|
'bank-accounts': BankAccount;
|
|
'bank-transactions': BankTransaction;
|
|
'ledger-entries': LedgerEntry;
|
|
'locker-storages': LockerStorage;
|
|
loadouts: Loadout;
|
|
'market-listings': MarketListing;
|
|
'market-negotiations': MarketNegotiation;
|
|
'market-state': MarketState;
|
|
'voice-scripts': VoiceScript;
|
|
'voice-submissions': VoiceSubmission;
|
|
tickets: Ticket;
|
|
'ticket-votes': TicketVote;
|
|
'wiki-pages': WikiPage;
|
|
'wiki-revisions': WikiRevision;
|
|
'wiki-templates': WikiTemplate;
|
|
projects: Project;
|
|
sprints: Sprint;
|
|
releases: Release;
|
|
labels: Label;
|
|
maps: Map;
|
|
'narrative-events': NarrativeEvent;
|
|
'story-beats': StoryBeat;
|
|
'story-beat-states': StoryBeatState;
|
|
'mission-files': MissionFile;
|
|
'mod-lists': ModList;
|
|
'game-servers': GameServer;
|
|
'arma-sync-events': ArmaSyncEvent;
|
|
'arma-commands': ArmaCommand;
|
|
'plugin-ai-instructions': PluginAiInstruction;
|
|
'payload-mcp-api-keys': PayloadMcpApiKey;
|
|
'payload-kv': PayloadKv;
|
|
'payload-locked-documents': PayloadLockedDocument;
|
|
'payload-preferences': PayloadPreference;
|
|
'payload-migrations': PayloadMigration;
|
|
};
|
|
collectionsJoins: {
|
|
assignments: {
|
|
commandElement: 'assignments';
|
|
};
|
|
vehicles: {
|
|
requiredStructure: 'structures';
|
|
};
|
|
};
|
|
collectionsSelect: {
|
|
media: MediaSelect<false> | MediaSelect<true>;
|
|
'game-hard-resources': GameHardResourcesSelect<false> | GameHardResourcesSelect<true>;
|
|
'game-structures': GameStructuresSelect<false> | GameStructuresSelect<true>;
|
|
'game-vehicles': GameVehiclesSelect<false> | GameVehiclesSelect<true>;
|
|
'game-npcs': GameNpcsSelect<false> | GameNpcsSelect<true>;
|
|
'npc-staffing': NpcStaffingSelect<false> | NpcStaffingSelect<true>;
|
|
'labor-classifications': LaborClassificationsSelect<false> | LaborClassificationsSelect<true>;
|
|
'game-event-logs': GameEventLogsSelect<false> | GameEventLogsSelect<true>;
|
|
users: UsersSelect<false> | UsersSelect<true>;
|
|
roles: RolesSelect<false> | RolesSelect<true>;
|
|
ranks: RanksSelect<false> | RanksSelect<true>;
|
|
profiles: ProfilesSelect<false> | ProfilesSelect<true>;
|
|
awards: AwardsSelect<false> | AwardsSelect<true>;
|
|
qualifications: QualificationsSelect<false> | QualificationsSelect<true>;
|
|
assignments: AssignmentsSelect<false> | AssignmentsSelect<true>;
|
|
'assignment-transfers': AssignmentTransfersSelect<false> | AssignmentTransfersSelect<true>;
|
|
experience: ExperienceSelect<false> | ExperienceSelect<true>;
|
|
'user-notifications': UserNotificationsSelect<false> | UserNotificationsSelect<true>;
|
|
evaluations: EvaluationsSelect<false> | EvaluationsSelect<true>;
|
|
missions: MissionsSelect<false> | MissionsSelect<true>;
|
|
'mission-attendances': MissionAttendancesSelect<false> | MissionAttendancesSelect<true>;
|
|
campaigns: CampaignsSelect<false> | CampaignsSelect<true>;
|
|
factions: FactionsSelect<false> | FactionsSelect<true>;
|
|
technologies: TechnologiesSelect<false> | TechnologiesSelect<true>;
|
|
assets: AssetsSelect<false> | AssetsSelect<true>;
|
|
resources: ResourcesSelect<false> | ResourcesSelect<true>;
|
|
vehicles: VehiclesSelect<false> | VehiclesSelect<true>;
|
|
structures: StructuresSelect<false> | StructuresSelect<true>;
|
|
shipments: ShipmentsSelect<false> | ShipmentsSelect<true>;
|
|
'bank-accounts': BankAccountsSelect<false> | BankAccountsSelect<true>;
|
|
'bank-transactions': BankTransactionsSelect<false> | BankTransactionsSelect<true>;
|
|
'ledger-entries': LedgerEntriesSelect<false> | LedgerEntriesSelect<true>;
|
|
'locker-storages': LockerStoragesSelect<false> | LockerStoragesSelect<true>;
|
|
loadouts: LoadoutsSelect<false> | LoadoutsSelect<true>;
|
|
'market-listings': MarketListingsSelect<false> | MarketListingsSelect<true>;
|
|
'market-negotiations': MarketNegotiationsSelect<false> | MarketNegotiationsSelect<true>;
|
|
'market-state': MarketStateSelect<false> | MarketStateSelect<true>;
|
|
'voice-scripts': VoiceScriptsSelect<false> | VoiceScriptsSelect<true>;
|
|
'voice-submissions': VoiceSubmissionsSelect<false> | VoiceSubmissionsSelect<true>;
|
|
tickets: TicketsSelect<false> | TicketsSelect<true>;
|
|
'ticket-votes': TicketVotesSelect<false> | TicketVotesSelect<true>;
|
|
'wiki-pages': WikiPagesSelect<false> | WikiPagesSelect<true>;
|
|
'wiki-revisions': WikiRevisionsSelect<false> | WikiRevisionsSelect<true>;
|
|
'wiki-templates': WikiTemplatesSelect<false> | WikiTemplatesSelect<true>;
|
|
projects: ProjectsSelect<false> | ProjectsSelect<true>;
|
|
sprints: SprintsSelect<false> | SprintsSelect<true>;
|
|
releases: ReleasesSelect<false> | ReleasesSelect<true>;
|
|
labels: LabelsSelect<false> | LabelsSelect<true>;
|
|
maps: MapsSelect<false> | MapsSelect<true>;
|
|
'narrative-events': NarrativeEventsSelect<false> | NarrativeEventsSelect<true>;
|
|
'story-beats': StoryBeatsSelect<false> | StoryBeatsSelect<true>;
|
|
'story-beat-states': StoryBeatStatesSelect<false> | StoryBeatStatesSelect<true>;
|
|
'mission-files': MissionFilesSelect<false> | MissionFilesSelect<true>;
|
|
'mod-lists': ModListsSelect<false> | ModListsSelect<true>;
|
|
'game-servers': GameServersSelect<false> | GameServersSelect<true>;
|
|
'arma-sync-events': ArmaSyncEventsSelect<false> | ArmaSyncEventsSelect<true>;
|
|
'arma-commands': ArmaCommandsSelect<false> | ArmaCommandsSelect<true>;
|
|
'plugin-ai-instructions': PluginAiInstructionsSelect<false> | PluginAiInstructionsSelect<true>;
|
|
'payload-mcp-api-keys': PayloadMcpApiKeysSelect<false> | PayloadMcpApiKeysSelect<true>;
|
|
'payload-kv': PayloadKvSelect<false> | PayloadKvSelect<true>;
|
|
'payload-locked-documents': PayloadLockedDocumentsSelect<false> | PayloadLockedDocumentsSelect<true>;
|
|
'payload-preferences': PayloadPreferencesSelect<false> | PayloadPreferencesSelect<true>;
|
|
'payload-migrations': PayloadMigrationsSelect<false> | PayloadMigrationsSelect<true>;
|
|
};
|
|
db: {
|
|
defaultIDType: number;
|
|
};
|
|
fallbackLocale: null;
|
|
globals: {
|
|
'game-rules': GameRule;
|
|
shims: Shim;
|
|
};
|
|
globalsSelect: {
|
|
'game-rules': GameRulesSelect<false> | GameRulesSelect<true>;
|
|
shims: ShimsSelect<false> | ShimsSelect<true>;
|
|
};
|
|
locale: null;
|
|
widgets: {
|
|
collections: CollectionsWidget;
|
|
};
|
|
user: User | PayloadMcpApiKey;
|
|
jobs: {
|
|
tasks: unknown;
|
|
workflows: unknown;
|
|
};
|
|
}
|
|
export interface UserAuthOperations {
|
|
forgotPassword: {
|
|
username: string;
|
|
};
|
|
login: {
|
|
password: string;
|
|
username: string;
|
|
};
|
|
registerFirstUser: {
|
|
password: string;
|
|
username: string;
|
|
};
|
|
unlock: {
|
|
username: string;
|
|
};
|
|
}
|
|
export interface PayloadMcpApiKeyAuthOperations {
|
|
forgotPassword: {
|
|
email: string;
|
|
password: string;
|
|
};
|
|
login: {
|
|
email: string;
|
|
password: string;
|
|
};
|
|
registerFirstUser: {
|
|
email: string;
|
|
password: string;
|
|
};
|
|
unlock: {
|
|
email: string;
|
|
password: string;
|
|
};
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "media".
|
|
*/
|
|
export interface Media {
|
|
id: number;
|
|
alt?: string | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
url?: string | null;
|
|
thumbnailURL?: string | null;
|
|
filename?: string | null;
|
|
mimeType?: string | null;
|
|
filesize?: number | null;
|
|
width?: number | null;
|
|
height?: number | null;
|
|
focalX?: number | null;
|
|
focalY?: number | null;
|
|
}
|
|
/**
|
|
* "Hard Resources" represent the hard-coded, integral resource types used to power the game. It includes things like Intelligence Points, Command Points, and other non-physical resources that are essential for gameplay mechanics. Unlike regular ("soft") resources, hard resources are not calculated by transactions and are instead stored as numeric amounts that are updated by the backend. Soft resources are designed by the players, are defined in the Resources category under Logistics, and are calculated by transactions (ledgers) to ensure their accuracy.
|
|
*
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "game-hard-resources".
|
|
*/
|
|
export interface GameHardResource {
|
|
id: number;
|
|
name: string;
|
|
amount: number;
|
|
description: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
};
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "game-structures".
|
|
*/
|
|
export interface GameStructure {
|
|
id: number;
|
|
/**
|
|
* The name of the structure as displayed in-game and on the frontend.
|
|
*/
|
|
name: string;
|
|
/**
|
|
* The type of structure this is.
|
|
*/
|
|
type: number | Structure;
|
|
/**
|
|
* The faction that owns this structure.
|
|
*/
|
|
faction?: (number | null) | Faction;
|
|
/**
|
|
* Funds charged per base tick for structure upkeep, separate from staff salaries.
|
|
*/
|
|
maintenanceCost?: number | null;
|
|
/**
|
|
* Which labor classifications this structure needs. Empty = no labor crews can be assigned here.
|
|
*/
|
|
laborRequirements?:
|
|
| {
|
|
classification: number | LaborClassification;
|
|
/**
|
|
* Informational staffing target shown to logistics officers.
|
|
*/
|
|
requiredHeadcount: number;
|
|
/**
|
|
* Hard cap for this classification. Zero or empty means it cannot be hired here.
|
|
*/
|
|
maxHeadcount?: number | null;
|
|
/**
|
|
* When set, workers of this classification are always paid this wage; hirers cannot change it.
|
|
*/
|
|
enforcedSalary?: number | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* Which named staff position types this structure accepts. Empty = no named staff can be assigned here.
|
|
*/
|
|
staffPositions?:
|
|
| {
|
|
positionType: 'administrative' | 'technical' | 'other';
|
|
/**
|
|
* Maximum simultaneous named staff of this type. Empty means unlimited.
|
|
*/
|
|
max?: number | null;
|
|
/**
|
|
* When set, named staff of this type are always paid this salary.
|
|
*/
|
|
enforcedSalary?: number | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* @minItems 2
|
|
* @maxItems 2
|
|
*/
|
|
coordinates?: [number, number] | null;
|
|
storedResources?:
|
|
| {
|
|
resource: number | Resource;
|
|
amount: number;
|
|
/**
|
|
* Column position in the inventory grid (0-indexed).
|
|
*/
|
|
gridX: number;
|
|
/**
|
|
* Row position in the inventory grid (0-indexed).
|
|
*/
|
|
gridY: number;
|
|
/**
|
|
* Whether this item is rotated 90 degrees (swaps width and height).
|
|
*/
|
|
rotated?: boolean | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* Items that no longer fit in the grid after a resize, stored here until retrieved.
|
|
*/
|
|
voidStorage?:
|
|
| {
|
|
resource: number | Resource;
|
|
amount: number;
|
|
gridX: number;
|
|
gridY: number;
|
|
rotated?: boolean | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "structures".
|
|
*/
|
|
export interface Structure {
|
|
id: number;
|
|
/**
|
|
* The display name (e.g., "Forward Operating Base").
|
|
*/
|
|
name: string;
|
|
/**
|
|
* Internal ID for scripts (e.g., "fob_alpha_tier1").
|
|
*/
|
|
codeName: string;
|
|
/**
|
|
* Mark whether this structure is ready for developer approval and implementation into the live environment.
|
|
*/
|
|
approvalStatus: 'in_progress' | 'ready_for_review' | 'approved' | 'rejected' | 'revision_requested';
|
|
/**
|
|
* A detailed description of the structure, including details like tactical advantages, resource production, and/or world lore regarding this structure.
|
|
*/
|
|
description: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
};
|
|
/**
|
|
* An image depicting the structure. While not required, it is highly recommended as the existence of an image will affect the layout of the structure's page on the front-end.
|
|
*/
|
|
image?: (number | null) | Media;
|
|
category: 'logistics' | 'military' | 'civilian';
|
|
materials: {
|
|
resource: number | Resource;
|
|
amount?: number | null;
|
|
id?: string | null;
|
|
}[];
|
|
constructionTime: number;
|
|
/**
|
|
* What research must be done before this can be built.
|
|
*/
|
|
requiredTech?: (number | Technology)[] | null;
|
|
/**
|
|
* If true, this structure can only be constructed as the result of an upgrade to an existing structure. If false, this structure can be constructed independently of any other structure's upgrade tree, even if another structure can upgrade into this one.
|
|
*/
|
|
requiresUpgrade?: boolean | null;
|
|
/**
|
|
* When this structure is upgraded, it becomes this type of structure. Note that the costs of the new structure apply - if this field is set, the new structure's build costs will still be consumed when this building is upgraded. To make it cheaper to upgrade, lower the "Upgrade Cost Multiplier".
|
|
*/
|
|
upgradesInto?: (number | null) | Structure;
|
|
/**
|
|
* The multiplier applied to the base build cost of the structure being upgraded into. A value of one (1) means the cost will exactly equal the structure's normal build cost, while a value of zero (0) would make the upgrade entirely free, only taking up construction time instead.
|
|
*/
|
|
upgradeCostMultiplier?: number | null;
|
|
terrainType: 'land' | 'water';
|
|
/**
|
|
* What resources, if any, must be within a certain distance of this structure on placement.
|
|
*/
|
|
resourcesInRange?:
|
|
| {
|
|
resource?: (number | null) | Resource;
|
|
range?: number | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* What structures, if any, must be within a certain distance of this structure on placement.
|
|
*/
|
|
structuresInRange?:
|
|
| {
|
|
structure?: (number | null) | Structure;
|
|
range?: number | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* Recurring costs to keep this structure online.
|
|
*/
|
|
upkeep?:
|
|
| {
|
|
resource?: (number | null) | Resource;
|
|
/**
|
|
* How much of this resource is consumed per "game tick" (every hour.)
|
|
*/
|
|
amount?: number | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* A base price that this structure could sell for when fully operational. Leaving this empty will make this structure unsellable.
|
|
*/
|
|
sellPrice?: number | null;
|
|
/**
|
|
* Default funds charged per base tick for structure upkeep. Copied into newly created game-structures of this type.
|
|
*/
|
|
maintenanceCost?: number | null;
|
|
/**
|
|
* Default labor classifications copied into newly created game-structures of this type. Empty = no labor crews by default.
|
|
*/
|
|
laborRequirements?:
|
|
| {
|
|
classification: number | LaborClassification;
|
|
/**
|
|
* Informational staffing target shown to logistics officers.
|
|
*/
|
|
requiredHeadcount: number;
|
|
/**
|
|
* Hard cap for this classification. Zero or empty means it cannot be hired here.
|
|
*/
|
|
maxHeadcount?: number | null;
|
|
/**
|
|
* When set, workers of this classification are always paid this wage; hirers cannot change it.
|
|
*/
|
|
enforcedSalary?: number | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* Default named staff position types copied into newly created game-structures of this type. Empty = no named staff by default.
|
|
*/
|
|
staffPositions?:
|
|
| {
|
|
positionType: 'administrative' | 'technical' | 'other';
|
|
/**
|
|
* Maximum simultaneous named staff of this type. Empty means unlimited.
|
|
*/
|
|
max?: number | null;
|
|
/**
|
|
* When set, named staff of this type are always paid this salary.
|
|
*/
|
|
enforcedSalary?: number | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* The app will use this type to determine what processes should run for this structure type.
|
|
*/
|
|
functionType?: ('producer' | 'storage' | 'sensor' | 'converter' | 'defense' | 'miscellaneous') | null;
|
|
canProduce?:
|
|
| (
|
|
| {
|
|
relationTo: 'assets';
|
|
value: number | Asset;
|
|
}
|
|
| {
|
|
relationTo: 'vehicles';
|
|
value: number | Vehicle;
|
|
}
|
|
| {
|
|
relationTo: 'resources';
|
|
value: number | Resource;
|
|
}
|
|
)[]
|
|
| null;
|
|
autoGeneratedResources?:
|
|
| {
|
|
resource: number | Resource;
|
|
/**
|
|
* The minimum amount of this resource produced each production cycle.
|
|
*/
|
|
minAmount: number;
|
|
/**
|
|
* The maximum amount of this resource produced each production cycle. If this field is left empty, will produce a static amount equal to the minimum value.
|
|
*/
|
|
maxAmount?: number | null;
|
|
/**
|
|
* The minimum number of ticks it takes to produce this resource (e.g., '5' would produce this resource, at minimum, every 5 ticks).
|
|
*/
|
|
minFrequency: string;
|
|
/**
|
|
* The maximum number of ticks it takes to produce this resource (e.g., '5' would produce this resource, at maximum, every 5 ticks, ignoring production chance).
|
|
*/
|
|
maxFrequency?: string | null;
|
|
/**
|
|
* The chance (1-100) that this resource will be produced each production cycle.
|
|
*/
|
|
produceChance?: number | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* The maximum storage capacity of this structure as mass (retrieved from the mass defined for every asset stored here.)
|
|
*/
|
|
maxCapacityMass?: number | null;
|
|
/**
|
|
* When enabled, ONLY the items listed in Allowed Storage can be stored here. Everything else is rejected. When disabled, the Allowed Storage list still enforces per-item quantity caps, but other items are permitted up to the mass capacity.
|
|
*/
|
|
restrictToAllowed?: boolean | null;
|
|
xSize?: number | null;
|
|
ySize?: number | null;
|
|
allowedStorage?:
|
|
| {
|
|
item?:
|
|
| ({
|
|
relationTo: 'assets';
|
|
value: number | Asset;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'vehicles';
|
|
value: number | Vehicle;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'resources';
|
|
value: number | Resource;
|
|
} | null);
|
|
/**
|
|
* How many of this asset, vehicle, or resource can be stored here.
|
|
*/
|
|
amount?: number | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* Any items from this list can never be stored here, even if they meet all other criteria.
|
|
*/
|
|
prohibitedStorage?:
|
|
| {
|
|
item?:
|
|
| ({
|
|
relationTo: 'assets';
|
|
value: number | Asset;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'vehicles';
|
|
value: number | Vehicle;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'resources';
|
|
value: number | Resource;
|
|
} | null);
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
maxHealth: number;
|
|
/**
|
|
* So long as the structure meets its operational requirements, this is the amount of health restored to the structure every game tick.
|
|
*/
|
|
repairSpeed?: number | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "resources".
|
|
*/
|
|
export interface Resource {
|
|
id: number;
|
|
showWarning?: boolean | null;
|
|
/**
|
|
* Human-readable name for resources (e.g., "Fuel").
|
|
*/
|
|
name: string;
|
|
/**
|
|
* Internal ID for scripts (e.g., "res_fuel").
|
|
*/
|
|
codeName: string;
|
|
/**
|
|
* Mark whether this resource is ready for developer approval and implementation into the live environment.
|
|
*/
|
|
approvalStatus: 'in_progress' | 'ready_for_review' | 'approved' | 'rejected' | 'revision_requested';
|
|
type: 'physical' | 'fluid' | 'energy' | 'abstract';
|
|
/**
|
|
* A description of the resource, including where it comes from, how it is used, and any lore-related details.
|
|
*/
|
|
description?: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
} | null;
|
|
/**
|
|
* While not required, an icon is absolutely recommended and will affect the way this resource is displayed in the application UI.
|
|
*/
|
|
icon?: (number | null) | Media;
|
|
/**
|
|
* A HEX color code used by this resource in the application UI (e.g., progress bars, text highlighting, etc.)
|
|
*/
|
|
color?: string | null;
|
|
/**
|
|
* The inherent "gold standard" value of one (1) unit of this resource. Used for calculating exchange rates and total asset worth.
|
|
*/
|
|
baseValue: number;
|
|
/**
|
|
* Can this be bought and/or sold on the market?
|
|
*/
|
|
tradeable?: boolean | null;
|
|
rarity: 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary' | 'exotic' | 'unique';
|
|
/**
|
|
* Baseline world supply and demand used by the market economy simulation (economy tick).
|
|
*/
|
|
economy?: {
|
|
/**
|
|
* Whether the economy simulation tracks this resource. Disabled items keep their resting price.
|
|
*/
|
|
enabled?: boolean | null;
|
|
/**
|
|
* GM-set resting world supply. Used as the starting point of this resource's market-state ledger.
|
|
*/
|
|
baselineSupply?: number | null;
|
|
/**
|
|
* GM-set resting demand (NPC faction pressure). Used as the starting point of this resource's market-state ledger.
|
|
*/
|
|
baselineDemand?: number | null;
|
|
/**
|
|
* Price band, as a fraction of the base value (e.g. 0.5 = price can move ±50%). Leave empty to use the global default band from Game Rules.
|
|
*/
|
|
maxModifier?: number | null;
|
|
};
|
|
/**
|
|
* The unit of measure for this resource in singular form (no plurals, e.g., liter, kg, point, unit, megawatt, person, etc.)
|
|
*/
|
|
unitOfMeasure: string;
|
|
/**
|
|
* The weight of one (1) unit (can be "0" for abstract resources like "Intel", "Labor", etc.) Critical for logistics transport calculations.
|
|
*/
|
|
massPerUnit: number;
|
|
/**
|
|
* Maximum amount that fits in a single standard cargo slot (if applicable.)
|
|
*/
|
|
stackSize?: number | null;
|
|
/**
|
|
* Width of this resource in grid cells.
|
|
*/
|
|
gridWidth: number;
|
|
/**
|
|
* Height of this resource in grid cells.
|
|
*/
|
|
gridHeight: number;
|
|
/**
|
|
* Can multiple units of this resource stack in a single grid cell? If checked, the amount displayed on the grid reflects the stack count.
|
|
*/
|
|
stackable?: boolean | null;
|
|
/**
|
|
* Maximum number of units that can exist in a single grid stack. Leave empty for unlimited. Only applies if stackable is checked.
|
|
*/
|
|
maxStackSize?: number | null;
|
|
/**
|
|
* Can this resource be rotated 90 degrees in the grid? When rotated, width and height are swapped.
|
|
*/
|
|
rotatable?: boolean | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "technologies".
|
|
*/
|
|
export interface Technology {
|
|
id: number;
|
|
name: string;
|
|
/**
|
|
* Mark whether this technology is ready for developer approval and implementation into the live environment.
|
|
*/
|
|
approvalStatus: 'in_progress' | 'ready_for_review' | 'approved' | 'rejected' | 'revision_requested';
|
|
/**
|
|
* An "Asset" technology will unlock a new item, vehicle, gear piece, structure, etc. An "Upgrade" technology will unlock an improvement to an Asset, like faster build speed, more storage capacity, etc.
|
|
*/
|
|
type: 'asset' | 'upgrade';
|
|
summary: string;
|
|
description?: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
} | null;
|
|
requirements?: {
|
|
prerequisiteTechnologies?:
|
|
| {
|
|
/**
|
|
* ALL of these technologies MUST be unlocked before this one can be.
|
|
*/
|
|
requiresAnd?: {
|
|
technology?: (number | Technology)[] | null;
|
|
};
|
|
/**
|
|
* One or more of these technologies MUST be unlocked before this one can be.
|
|
*/
|
|
requiresOr?: {
|
|
technology?: (number | Technology)[] | null;
|
|
};
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
};
|
|
researchCosts: {
|
|
resources?:
|
|
| {
|
|
resource: number | Resource;
|
|
amount: number;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
minimumResearchDuration: number;
|
|
maximumResearchDuration?: number | null;
|
|
};
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "labor-classifications".
|
|
*/
|
|
export interface LaborClassification {
|
|
id: number;
|
|
/**
|
|
* Display label for this labor trade (e.g. Mechanic).
|
|
*/
|
|
name: string;
|
|
/**
|
|
* Stable slug used to identify this classification (e.g. mechanic).
|
|
*/
|
|
key: string;
|
|
/**
|
|
* Prefills the wage-per-worker input in the hire dialog.
|
|
*/
|
|
defaultUnitSalary?: number | null;
|
|
description?: string | null;
|
|
/**
|
|
* How many workers of this classification are currently available to hire across the unit. Hiring consumes from this pool; releasing staff returns them.
|
|
*/
|
|
availableHeadcount?: number | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "assets".
|
|
*/
|
|
export interface Asset {
|
|
id: number;
|
|
name: string;
|
|
/**
|
|
* Mark whether this asset is ready for developer approval and implementation into the live environment.
|
|
*/
|
|
approvalStatus: 'in_progress' | 'ready_for_review' | 'approved' | 'rejected' | 'revision_requested';
|
|
className: string;
|
|
assetType:
|
|
| 'weapon'
|
|
| 'magazine'
|
|
| 'optic'
|
|
| 'muzzle'
|
|
| 'bipod'
|
|
| 'uniform'
|
|
| 'vest'
|
|
| 'backpack'
|
|
| 'helmet'
|
|
| 'facewear'
|
|
| 'nvg'
|
|
| 'radio'
|
|
| 'medical'
|
|
| 'tool'
|
|
| 'explosive'
|
|
| 'skin'
|
|
| 'miscellaneous';
|
|
'Weapon Configuration'?: {
|
|
slotType?: ('primary' | 'secondary' | 'launcher') | null;
|
|
compatibleMagazines?: (number | Asset)[] | null;
|
|
compatibleAttachments?: (number | Asset)[] | null;
|
|
};
|
|
'Nightvision Configuration'?: {
|
|
nvgGeneration?: ('gen1' | 'gen2' | 'gen3') | null;
|
|
/**
|
|
* Whether or not these night-vision goggles possess a thermal vision mode.
|
|
*/
|
|
nvgHasThermals?: boolean | null;
|
|
};
|
|
'Container Configuration'?: {
|
|
capacityKg?: number | null;
|
|
weightKg?: number | null;
|
|
};
|
|
'Skin Configuration'?: {
|
|
/**
|
|
* Which equipment types this skin can be applied to. Leave empty to allow on any equipment.
|
|
*/
|
|
appliesToAssetTypes?: ('weapon' | 'uniform' | 'vest' | 'backpack' | 'helmet')[] | null;
|
|
};
|
|
'Magazine Configuration'?: {
|
|
roundCapacity?: number | null;
|
|
ammoType?: string | null;
|
|
/**
|
|
* Whether or not this magazine is compatible with the GreenMag mod.
|
|
*/
|
|
greenmagCompatible?: boolean | null;
|
|
};
|
|
'Asset Metadata'?: {
|
|
mod?: string | null;
|
|
thumbnail?: (number | null) | Media;
|
|
gameDescription?: string | null;
|
|
};
|
|
/**
|
|
* Whether or not this asset can be traded on the market. If unchecked, the asset can never be bought or sold, only crafted or collected.
|
|
*/
|
|
tradeable?: boolean | null;
|
|
marketTrading?: {
|
|
/**
|
|
* The rarity of this item in the world of the active campaign. Rarity will be accounted for in market valuation and trading calculations.
|
|
*/
|
|
Rarity?: ('basic' | 'common' | 'uncommon' | 'rare' | 'veryRare' | 'epic' | 'legendary' | 'unique') | null;
|
|
/**
|
|
* The asset's "perceived value" when considered in market and trading calculations. Note that the "base" values are the "resting" valuations. Later calculations will increase and decrease the valuation based on this resting valuation, ultimately tending to remain within some percentage margin of this base price. Always and only considers the primary campaign currency in regard to price.
|
|
*/
|
|
perceivedValue?: {
|
|
baseBuyPrice?: number | null;
|
|
baseSellPrice?: number | null;
|
|
};
|
|
};
|
|
/**
|
|
* Baseline world supply and demand used by the market economy simulation (economy tick).
|
|
*/
|
|
economy?: {
|
|
/**
|
|
* Whether the economy simulation tracks this asset. Disabled items keep their resting price.
|
|
*/
|
|
enabled?: boolean | null;
|
|
/**
|
|
* GM-set resting world supply. Used as the starting point of this asset's market-state ledger.
|
|
*/
|
|
baselineSupply?: number | null;
|
|
/**
|
|
* GM-set resting demand (NPC faction pressure). Used as the starting point of this asset's market-state ledger.
|
|
*/
|
|
baselineDemand?: number | null;
|
|
/**
|
|
* Price band, as a fraction of the base price (e.g. 0.5 = price can move ±50%). Leave empty to use the global default band from Game Rules.
|
|
*/
|
|
maxModifier?: number | null;
|
|
};
|
|
crafting: {
|
|
craftable?: boolean | null;
|
|
/**
|
|
* This asset requires a blueprint to be crafted, otherwise it can only be obtained from scavenging and/or trading.
|
|
*/
|
|
blueprintRequired?: boolean | null;
|
|
/**
|
|
* One or more technologies required before this weapon can be crafted.
|
|
*/
|
|
technologyRequired?: (number | Technology)[] | null;
|
|
/**
|
|
* If checked, this asset requires the above technologies or else cannot be used at all.
|
|
*/
|
|
technologyRequiredToUse?: boolean | null;
|
|
craftingData: {
|
|
inputs?:
|
|
| {
|
|
resource: (number | Resource)[];
|
|
quantity?: number | null;
|
|
/**
|
|
* If checked, this resource is "lended" to the crafting of this asset. Upon the crafting's completion, this resource is refunded to the unit.
|
|
*/
|
|
lended?: boolean | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
requiresStructure?: (number | Structure)[] | null;
|
|
craftingTimePerUnit: number;
|
|
/**
|
|
* Byproducts of the crafting process. For each unit crafted of this Asset, these byproducts are also created and added to the unit's resources.
|
|
*/
|
|
byproducts?:
|
|
| {
|
|
resource: (number | Resource)[];
|
|
quantity?: number | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* An optional batch size. If provided, this number of this asset will be created upon crafting completion.
|
|
*/
|
|
batchSize: number;
|
|
};
|
|
};
|
|
/**
|
|
* How this asset occupies space in member lockers and container grids.
|
|
*/
|
|
storageDimensions: {
|
|
/**
|
|
* Width of this asset in grid cells.
|
|
*/
|
|
gridWidth: number;
|
|
/**
|
|
* Height of this asset in grid cells.
|
|
*/
|
|
gridHeight: number;
|
|
/**
|
|
* Can multiple units of this asset stack in a single grid cell? If checked, the amount displayed reflects the stack count.
|
|
*/
|
|
stackable?: boolean | null;
|
|
/**
|
|
* Maximum number of units that can exist in a single grid stack. Leave empty for unlimited. Only applies if stackable is checked.
|
|
*/
|
|
maxStackSize?: number | null;
|
|
/**
|
|
* Can this asset be rotated 90 degrees in the grid? When rotated, width and height are swapped.
|
|
*/
|
|
rotatable?: boolean | null;
|
|
};
|
|
/**
|
|
* Suggested complements to this asset (for example, if the asset was a Bandage, some related assets could include an IV, blood bag, epinephrine, etc.)
|
|
*/
|
|
relatedAssets?: (number | Asset)[] | null;
|
|
/**
|
|
* If checked, this item is approved and considered "live" (i.e. it will be considered in calculations and made available in-game.)
|
|
*/
|
|
isLive?: boolean | null;
|
|
notes?: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
} | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "vehicles".
|
|
*/
|
|
export interface Vehicle {
|
|
id: number;
|
|
name: string;
|
|
/**
|
|
* If not provided, this vehicle will ONLY be available as a virtual asset (i.e., cannot be used in Arma.)
|
|
*/
|
|
classname?: string | null;
|
|
/**
|
|
* Mark whether this vehicle is ready for developer approval and implementation into the live environment.
|
|
*/
|
|
approvalStatus: 'in_progress' | 'ready_for_review' | 'approved' | 'rejected' | 'revision_requested';
|
|
/**
|
|
* A detailed description of the vehicle, including details like tactical usage, mechanical details, and/or world lore regarding this vehicle.
|
|
*/
|
|
description?: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
} | null;
|
|
image?: (number | null) | Media;
|
|
category?: ('civilian' | 'utility' | 'transport' | 'weaponized' | 'military')[] | null;
|
|
/**
|
|
* Fuel configuration for this vehicle. Defines what fuel type it uses, how much it can hold, and how fast it consumes fuel.
|
|
*/
|
|
fuel: {
|
|
/**
|
|
* The type of fuel this vehicle consumes (e.g., gasoline, diesel, jet fuel).
|
|
*/
|
|
fuelType: number | Resource;
|
|
/**
|
|
* Maximum fuel units this vehicle's tank can hold.
|
|
*/
|
|
fuelCapacity: number;
|
|
/**
|
|
* Fuel consumed per unit of distance traveled.
|
|
*/
|
|
fuelConsumptionRate: number;
|
|
};
|
|
materials?:
|
|
| {
|
|
resource: number | Resource;
|
|
amount?: number | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* The number of ticks it takes to complete construction of this vehicle.
|
|
*/
|
|
constructionTime?: number | null;
|
|
/**
|
|
* What research must be done before this can be built.
|
|
*/
|
|
requiredTech?: (number | Technology)[] | null;
|
|
requiredStructure?: {
|
|
docs?: (number | Structure)[];
|
|
hasNextPage?: boolean;
|
|
totalDocs?: number;
|
|
};
|
|
scrapReturns?:
|
|
| {
|
|
resource: number | Resource;
|
|
amount?: number | null;
|
|
/**
|
|
* An optional percent (%) chance to recover this specific resource (between 0 and 100).
|
|
*/
|
|
chance?: number | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* Recurring costs to keep this vehicle operational.
|
|
*/
|
|
upkeepCosts?:
|
|
| {
|
|
resource: number | Resource;
|
|
/**
|
|
* How much of this resource is consumed per tick.
|
|
*/
|
|
amount?: number | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
width?: number | null;
|
|
height?: number | null;
|
|
maxMass?: number | null;
|
|
/**
|
|
* The number of ACE cargo slots this vehicle has by default.
|
|
*/
|
|
aceCargoSlots?: number | null;
|
|
/**
|
|
* The cargo this vehicle is permitted to carry if used virtually (e.g., during deliveries, moving troops, etc.)
|
|
*/
|
|
allowedVirtualCargo?:
|
|
| {
|
|
item:
|
|
| {
|
|
relationTo: 'assets';
|
|
value: number | Asset;
|
|
}
|
|
| {
|
|
relationTo: 'vehicles';
|
|
value: number | Vehicle;
|
|
}
|
|
| {
|
|
relationTo: 'resources';
|
|
value: number | Resource;
|
|
};
|
|
amount?: number | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
maxHealth?: number | null;
|
|
armorRating?: ('none' | 'light' | 'medium' | 'heavy' | 'composite') | null;
|
|
maxSpeedOnRoad?: number | null;
|
|
maxSpeedOffRoad?: number | null;
|
|
maxAirspeed?: number | null;
|
|
maxKnots?: number | null;
|
|
pylons?:
|
|
| {
|
|
pylonName: string;
|
|
pylonType: 'mountedWeapon' | 'pylon';
|
|
amount?: number | null;
|
|
ammoType?: (number | null) | Asset;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "factions".
|
|
*/
|
|
export interface Faction {
|
|
id: number;
|
|
name: string;
|
|
/**
|
|
* Player Faction = the faction our unit is currently playing as. Only one faction can carry this type at a time.
|
|
*/
|
|
type: 'playerFaction' | 'majorFaction' | 'minorFaction' | 'corporation' | 'special';
|
|
description?: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
} | null;
|
|
/**
|
|
* This faction's standing in the world, from -100 (reviled) to 100 (revered). 0 is neutral. Adjusted manually by admins/GMs as campaign events unfold.
|
|
*/
|
|
reputation?: number | null;
|
|
/**
|
|
* Pairwise standing between this faction and another faction, from -100 (hostile) to 100 (allied). 0 is neutral. One entry per counterpart faction.
|
|
*/
|
|
relationships?:
|
|
| {
|
|
/**
|
|
* The other faction in this pairwise relationship.
|
|
*/
|
|
targetFaction: number | Faction;
|
|
/**
|
|
* Standing from -100 (hostile) to 100 (allied). 0 is neutral.
|
|
*/
|
|
value: number;
|
|
/**
|
|
* Optional context for why this relationship stands where it does.
|
|
*/
|
|
notes?: string | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* Whether or not this faction is playable. Some factions may be specifically intended to be unplayable based on narrative requirements.
|
|
*/
|
|
playableFaction?: boolean | null;
|
|
/**
|
|
* Whether or not this faction is/was available as a starting faction at the beginning of the campaign.
|
|
*/
|
|
startingFaction?: boolean | null;
|
|
associatedCampaigns?: (number | Campaign)[] | null;
|
|
/**
|
|
* Background image for the faction detail page hero. Renders translucent with a top-to-bottom fade to black. Recommended aspect ratio: 16:9 or wider.
|
|
*/
|
|
coverImage?: (number | null) | Media;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "campaigns".
|
|
*/
|
|
export interface Campaign {
|
|
id: number;
|
|
name: string;
|
|
summary: string;
|
|
status: 'concept' | 'inProgress' | 'completed';
|
|
/**
|
|
* Only developers can designate a campaign as official or custom.
|
|
*/
|
|
campaignMode: 'official' | 'custom';
|
|
description?: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
} | null;
|
|
startDate?: string | null;
|
|
endDate?: string | null;
|
|
/**
|
|
* Background image for the campaign selector card on the campaigns page. Renders translucent with hover effects. Recommended aspect ratio: 16:9 or square.
|
|
*/
|
|
coverImage?: (number | null) | Media;
|
|
/**
|
|
* User who created this campaign. Set automatically on create.
|
|
*/
|
|
owner?: (number | null) | User;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "users".
|
|
*/
|
|
export interface User {
|
|
id: number;
|
|
discordUsername: string;
|
|
discordId?: string | null;
|
|
displayName: string;
|
|
payloadDisplayName?: string | null;
|
|
steamId: string;
|
|
/**
|
|
* Legacy role enum, being replaced by the dynamic RBAC system (see 'Role Assignments' below).
|
|
*/
|
|
roles?: ('guest' | 'user' | 'trusted' | 'admin' | 'developer')[] | null;
|
|
/**
|
|
* Dynamic RBAC role assignments. These determine the user's permissions via the roles collection.
|
|
*/
|
|
roleDocs?: (number | Role)[] | null;
|
|
preferences?: {
|
|
notifications?: {
|
|
mutedAll?: boolean | null;
|
|
mutedTypes?:
|
|
| (
|
|
| 'market:offer'
|
|
| 'market:counter'
|
|
| 'market:accept'
|
|
| 'market:reject'
|
|
| 'market:withdrawn'
|
|
| 'market:closed'
|
|
| 'market:sold'
|
|
| 'market:expired'
|
|
| 'award:granted'
|
|
| 'account:discord-request'
|
|
| 'finance:deposit'
|
|
| 'finance:withdraw'
|
|
| 'finance:transfer'
|
|
| 'shipment:completed'
|
|
| 'ticket:created'
|
|
| 'ticket:assigned'
|
|
| 'ticket:reply'
|
|
| 'ticket:status'
|
|
)[]
|
|
| null;
|
|
};
|
|
display?: {
|
|
showCallsign?: boolean | null;
|
|
leadOrActual?: ('lead' | 'actual') | null;
|
|
showVersionOverlay?: boolean | null;
|
|
xpDisplayMini?: boolean | null;
|
|
showBackgroundTexture?: boolean | null;
|
|
};
|
|
discord?: {
|
|
enabled?: boolean | null;
|
|
mutedTypes?:
|
|
| (
|
|
| 'market:offer'
|
|
| 'market:counter'
|
|
| 'market:accept'
|
|
| 'market:reject'
|
|
| 'market:withdrawn'
|
|
| 'market:closed'
|
|
| 'market:sold'
|
|
| 'market:expired'
|
|
| 'award:granted'
|
|
| 'account:discord-request'
|
|
| 'finance:deposit'
|
|
| 'finance:withdraw'
|
|
| 'finance:transfer'
|
|
| 'shipment:completed'
|
|
| 'ticket:created'
|
|
| 'ticket:assigned'
|
|
| 'ticket:reply'
|
|
| 'ticket:status'
|
|
)[]
|
|
| null;
|
|
};
|
|
};
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
email?: string | null;
|
|
username: string;
|
|
resetPasswordToken?: string | null;
|
|
resetPasswordExpiration?: string | null;
|
|
salt?: string | null;
|
|
hash?: string | null;
|
|
loginAttempts?: number | null;
|
|
lockUntil?: string | null;
|
|
sessions?:
|
|
| {
|
|
id: string;
|
|
createdAt?: string | null;
|
|
expiresAt: string;
|
|
}[]
|
|
| null;
|
|
password?: string | null;
|
|
collection: 'users';
|
|
}
|
|
/**
|
|
* Dynamic roles for the RBAC permission system. Assign permissions to roles, then assign roles to users.
|
|
*
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "roles".
|
|
*/
|
|
export interface Role {
|
|
id: number;
|
|
/**
|
|
* Display name for this role, e.g. 'Logistics Officer'.
|
|
*/
|
|
name: string;
|
|
/**
|
|
* Machine-readable key. Built-in roles: 'guest', 'user', 'admin', 'developer'. Used by seed scripts and the Discord bot to look up roles by key.
|
|
*/
|
|
slug: string;
|
|
/**
|
|
* Optional notes about what this role is for.
|
|
*/
|
|
description?: string | null;
|
|
/**
|
|
* Permissions granted by this role. The full list is defined in src/permissions/index.ts.
|
|
*/
|
|
permissions?:
|
|
| (
|
|
| 'system:admin-access'
|
|
| 'media:create'
|
|
| 'media:read'
|
|
| 'media:update'
|
|
| 'media:delete'
|
|
| 'admin:media:manage'
|
|
| 'users:create'
|
|
| 'users:read'
|
|
| 'users:update'
|
|
| 'users:delete'
|
|
| 'users:unlock'
|
|
| 'users:assign-roles'
|
|
| 'admin:users:manage'
|
|
| 'roles:create'
|
|
| 'roles:read'
|
|
| 'roles:update'
|
|
| 'roles:delete'
|
|
| 'admin:roles:manage'
|
|
| 'ranks:create'
|
|
| 'ranks:read'
|
|
| 'ranks:update'
|
|
| 'ranks:delete'
|
|
| 'admin:ranks:manage'
|
|
| 'profiles:create'
|
|
| 'profiles:read'
|
|
| 'profiles:update'
|
|
| 'profiles:delete'
|
|
| 'admin:profiles:manage'
|
|
| 'awards:create'
|
|
| 'awards:read'
|
|
| 'awards:update'
|
|
| 'awards:delete'
|
|
| 'admin:awards:manage'
|
|
| 'qualifications:create'
|
|
| 'qualifications:read'
|
|
| 'qualifications:update'
|
|
| 'qualifications:delete'
|
|
| 'admin:qualifications:manage'
|
|
| 'assignments:create'
|
|
| 'assignments:read'
|
|
| 'assignments:update'
|
|
| 'assignments:delete'
|
|
| 'admin:assignments:manage'
|
|
| 'assignment-transfers:create'
|
|
| 'assignment-transfers:read'
|
|
| 'assignment-transfers:update'
|
|
| 'assignment-transfers:delete'
|
|
| 'admin:assignment-transfers:manage'
|
|
| 'experience:create'
|
|
| 'experience:read'
|
|
| 'experience:update'
|
|
| 'experience:delete'
|
|
| 'admin:experience:manage'
|
|
| 'user-notifications:create'
|
|
| 'user-notifications:read'
|
|
| 'user-notifications:update'
|
|
| 'user-notifications:delete'
|
|
| 'admin:user-notifications:manage'
|
|
| 'evaluations:create'
|
|
| 'evaluations:read'
|
|
| 'evaluations:update'
|
|
| 'evaluations:delete'
|
|
| 'admin:evaluations:manage'
|
|
| 'missions:create'
|
|
| 'missions:read'
|
|
| 'missions:update'
|
|
| 'missions:delete'
|
|
| 'missions:read-sensitive'
|
|
| 'admin:missions:manage'
|
|
| 'mission-attendances:create'
|
|
| 'mission-attendances:read'
|
|
| 'mission-attendances:update'
|
|
| 'mission-attendances:delete'
|
|
| 'admin:mission-attendances:manage'
|
|
| 'campaigns:create'
|
|
| 'campaigns:read'
|
|
| 'campaigns:update'
|
|
| 'campaigns:delete'
|
|
| 'admin:campaigns:manage'
|
|
| 'campaigns:manage'
|
|
| 'factions:create'
|
|
| 'factions:read'
|
|
| 'factions:update'
|
|
| 'factions:delete'
|
|
| 'admin:factions:manage'
|
|
| 'technologies:create'
|
|
| 'technologies:read'
|
|
| 'technologies:update'
|
|
| 'technologies:delete'
|
|
| 'admin:technologies:manage'
|
|
| 'assets:create'
|
|
| 'assets:read'
|
|
| 'assets:update'
|
|
| 'assets:delete'
|
|
| 'admin:assets:manage'
|
|
| 'resources:create'
|
|
| 'resources:read'
|
|
| 'resources:update'
|
|
| 'resources:delete'
|
|
| 'admin:resources:manage'
|
|
| 'vehicles:create'
|
|
| 'vehicles:read'
|
|
| 'vehicles:update'
|
|
| 'vehicles:delete'
|
|
| 'admin:vehicles:manage'
|
|
| 'structures:create'
|
|
| 'structures:read'
|
|
| 'structures:update'
|
|
| 'structures:delete'
|
|
| 'admin:structures:manage'
|
|
| 'shipments:create'
|
|
| 'shipments:read'
|
|
| 'shipments:update'
|
|
| 'shipments:delete'
|
|
| 'admin:shipments:manage'
|
|
| 'bank-accounts:create'
|
|
| 'bank-accounts:read'
|
|
| 'bank-accounts:update'
|
|
| 'bank-accounts:delete'
|
|
| 'admin:bank-accounts:manage'
|
|
| 'bank-transactions:create'
|
|
| 'bank-transactions:read'
|
|
| 'bank-transactions:update'
|
|
| 'bank-transactions:delete'
|
|
| 'admin:bank-transactions:manage'
|
|
| 'ledger-entries:create'
|
|
| 'ledger-entries:read'
|
|
| 'ledger-entries:update'
|
|
| 'ledger-entries:delete'
|
|
| 'admin:ledger-entries:manage'
|
|
| 'locker-storages:create'
|
|
| 'locker-storages:read'
|
|
| 'locker-storages:update'
|
|
| 'locker-storages:delete'
|
|
| 'admin:locker-storages:manage'
|
|
| 'loadouts:create'
|
|
| 'loadouts:read'
|
|
| 'loadouts:update'
|
|
| 'loadouts:delete'
|
|
| 'admin:loadouts:manage'
|
|
| 'market-listings:create'
|
|
| 'market-listings:read'
|
|
| 'market-listings:update'
|
|
| 'market-listings:delete'
|
|
| 'admin:market-listings:manage'
|
|
| 'market-negotiations:create'
|
|
| 'market-negotiations:read'
|
|
| 'market-negotiations:update'
|
|
| 'market-negotiations:delete'
|
|
| 'admin:market-negotiations:manage'
|
|
| 'market-state:create'
|
|
| 'market-state:read'
|
|
| 'market-state:update'
|
|
| 'market-state:delete'
|
|
| 'admin:market-state:manage'
|
|
| 'projects:create'
|
|
| 'projects:read'
|
|
| 'projects:update'
|
|
| 'projects:delete'
|
|
| 'admin:projects:manage'
|
|
| 'labels:create'
|
|
| 'labels:read'
|
|
| 'labels:update'
|
|
| 'labels:delete'
|
|
| 'admin:labels:manage'
|
|
| 'sprints:create'
|
|
| 'sprints:read'
|
|
| 'sprints:update'
|
|
| 'sprints:delete'
|
|
| 'admin:sprints:manage'
|
|
| 'releases:create'
|
|
| 'releases:read'
|
|
| 'releases:update'
|
|
| 'releases:delete'
|
|
| 'admin:releases:manage'
|
|
| 'tickets:create'
|
|
| 'tickets:read'
|
|
| 'tickets:update'
|
|
| 'tickets:delete'
|
|
| 'admin:tickets:manage'
|
|
| 'ticket-votes:create'
|
|
| 'ticket-votes:read'
|
|
| 'ticket-votes:update'
|
|
| 'ticket-votes:delete'
|
|
| 'admin:ticket-votes:manage'
|
|
| 'game-structures:create'
|
|
| 'game-structures:read'
|
|
| 'game-structures:update'
|
|
| 'game-structures:delete'
|
|
| 'admin:game-structures:manage'
|
|
| 'game-vehicles:create'
|
|
| 'game-vehicles:read'
|
|
| 'game-vehicles:update'
|
|
| 'game-vehicles:delete'
|
|
| 'admin:game-vehicles:manage'
|
|
| 'game-npcs:create'
|
|
| 'game-npcs:read'
|
|
| 'game-npcs:update'
|
|
| 'game-npcs:delete'
|
|
| 'admin:game-npcs:manage'
|
|
| 'game-hard-resources:create'
|
|
| 'game-hard-resources:read'
|
|
| 'game-hard-resources:update'
|
|
| 'game-hard-resources:delete'
|
|
| 'admin:game-hard-resources:manage'
|
|
| 'game-event-logs:create'
|
|
| 'game-event-logs:read'
|
|
| 'game-event-logs:update'
|
|
| 'game-event-logs:delete'
|
|
| 'admin:game-event-logs:manage'
|
|
| 'maps:create'
|
|
| 'maps:read'
|
|
| 'maps:update'
|
|
| 'maps:delete'
|
|
| 'admin:maps:manage'
|
|
| 'narrative-events:create'
|
|
| 'narrative-events:read'
|
|
| 'narrative-events:update'
|
|
| 'narrative-events:delete'
|
|
| 'admin:narrative-events:manage'
|
|
| 'mission-files:create'
|
|
| 'mission-files:read'
|
|
| 'mission-files:update'
|
|
| 'mission-files:delete'
|
|
| 'admin:mission-files:manage'
|
|
| 'mod-lists:create'
|
|
| 'mod-lists:read'
|
|
| 'mod-lists:update'
|
|
| 'mod-lists:delete'
|
|
| 'admin:mod-lists:manage'
|
|
| 'game-servers:create'
|
|
| 'game-servers:read'
|
|
| 'game-servers:update'
|
|
| 'game-servers:delete'
|
|
| 'admin:game-servers:manage'
|
|
| 'arma-sync-events:create'
|
|
| 'arma-sync-events:read'
|
|
| 'arma-sync-events:update'
|
|
| 'arma-sync-events:delete'
|
|
| 'admin:arma-sync-events:manage'
|
|
| 'arma-commands:create'
|
|
| 'arma-commands:read'
|
|
| 'arma-commands:update'
|
|
| 'arma-commands:delete'
|
|
| 'admin:arma-commands:manage'
|
|
| 'game-rules:read'
|
|
| 'game-rules:update'
|
|
| 'shims:read'
|
|
| 'shims:update'
|
|
| 'logistics:manage'
|
|
| 'intelligence:manage'
|
|
| 'profiles:intel_excerpt:update'
|
|
| 'banking:manage'
|
|
| 'tickets:staff'
|
|
| 'discord:staff'
|
|
| 'discord:announce'
|
|
)[]
|
|
| null;
|
|
/**
|
|
* Parent roles to inherit permissions and settings from. Inheriting from a superuser role makes this role a superuser. Restricted to developers.
|
|
*/
|
|
parentRoles?: (number | Role)[] | null;
|
|
/**
|
|
* System roles are built-in and cannot be deleted. They can still be edited (e.g. to change their permissions).
|
|
*/
|
|
isSystem?: boolean | null;
|
|
/**
|
|
* Superuser roles bypass ALL permission checks. Use with extreme caution: this grants unrestricted access.
|
|
*/
|
|
isSuperuser?: boolean | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "game-vehicles".
|
|
*/
|
|
export interface GameVehicle {
|
|
id: number;
|
|
/**
|
|
* Display name or callsign for this vehicle instance.
|
|
*/
|
|
name: string;
|
|
/**
|
|
* The vehicle type/template this instance is based on.
|
|
*/
|
|
type: number | Vehicle;
|
|
/**
|
|
* The structure where this vehicle is currently stationed. Null if in transit.
|
|
*/
|
|
deployedAt?: (number | null) | GameStructure;
|
|
/**
|
|
* The faction that owns this vehicle.
|
|
*/
|
|
faction?: (number | null) | Faction;
|
|
status: 'idle' | 'assigned' | 'in_transit' | 'damaged' | 'destroyed';
|
|
/**
|
|
* Current fuel level. Must be between 0 and the vehicle type's fuel capacity.
|
|
*/
|
|
currentFuel: number;
|
|
/**
|
|
* Current health. Must be between 0 and the vehicle type's max health.
|
|
*/
|
|
currentHealth: number;
|
|
storedResources?:
|
|
| {
|
|
resource: number | Resource;
|
|
amount: number;
|
|
gridX: number;
|
|
gridY: number;
|
|
rotated?: boolean | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* Items displaced by grid resizing.
|
|
*/
|
|
voidStorage?:
|
|
| {
|
|
resource: number | Resource;
|
|
amount: number;
|
|
gridX: number;
|
|
gridY: number;
|
|
rotated?: boolean | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "game-npcs".
|
|
*/
|
|
export interface GameNpc {
|
|
id: number;
|
|
/**
|
|
* The NPC's name as shown in-game and on the frontend.
|
|
*/
|
|
name: string;
|
|
/**
|
|
* What this NPC does (e.g. 'Weapons Dealer', 'Field Medic').
|
|
*/
|
|
occupation?: string | null;
|
|
/**
|
|
* Where this NPC is stationed in-game.
|
|
*/
|
|
location?: (number | null) | GameStructure;
|
|
/**
|
|
* The faction this NPC belongs to, if any.
|
|
*/
|
|
faction?: (number | null) | Faction;
|
|
/**
|
|
* A short background/profile for this NPC.
|
|
*/
|
|
bio?: string | null;
|
|
/**
|
|
* True for NPCs auto-created by the market tick to cover unstocked goods. They are placeholders until included in the game.
|
|
*/
|
|
isGenerated?: boolean | null;
|
|
/**
|
|
* Whether this NPC is officially part of the game. Generated NPCs start off; flip this on to include them.
|
|
*/
|
|
isInGame?: boolean | null;
|
|
vendor?: {
|
|
/**
|
|
* Whether this NPC runs a market stall. Auto-generated vendor stock is attributed to them.
|
|
*/
|
|
enabled?: boolean | null;
|
|
/**
|
|
* Multiplies the auto-generated price for this NPC's stock (1 = base market price).
|
|
*/
|
|
priceModifier?: number | null;
|
|
/**
|
|
* The goods this NPC sells. The market tick prefers these NPCs when stocking those assets.
|
|
*/
|
|
sells?: (number | Asset)[] | null;
|
|
};
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "npc-staffing".
|
|
*/
|
|
export interface NpcStaffing {
|
|
id: number;
|
|
npc?: (number | null) | GameNpc;
|
|
structure: number | GameStructure;
|
|
positionType: 'labor' | 'administrative' | 'technical' | 'other';
|
|
positionTitle: string;
|
|
/**
|
|
* Workers in this block; always 1 for named staff
|
|
*/
|
|
headcount?: number | null;
|
|
laborClassification?: (number | null) | LaborClassification;
|
|
salary?: number | null;
|
|
status?: ('active' | 'terminated') | null;
|
|
hiredAt?: string | null;
|
|
terminatedAt?: string | null;
|
|
notes?: string | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "game-event-logs".
|
|
*/
|
|
export interface GameEventLog {
|
|
id: number;
|
|
/**
|
|
* System-generated events are created automatically. Uncheck for manual/GM narrative entries.
|
|
*/
|
|
system?: boolean | null;
|
|
timestamp: string;
|
|
type: string;
|
|
message: string;
|
|
actor?: (number | null) | User;
|
|
structure?: (number | null) | GameStructure;
|
|
/**
|
|
* Which collection the event primarily relates to.
|
|
*/
|
|
targetCollection?:
|
|
| (
|
|
| 'game-structures'
|
|
| 'game-vehicles'
|
|
| 'game-npcs'
|
|
| 'npc-staffing'
|
|
| 'structures'
|
|
| 'resources'
|
|
| 'assets'
|
|
| 'vehicles'
|
|
| 'factions'
|
|
| 'missions'
|
|
| 'campaigns'
|
|
| 'users'
|
|
| 'technologies'
|
|
| 'maps'
|
|
| 'shipments'
|
|
| 'bank-accounts'
|
|
| 'bank-transactions'
|
|
| 'ledger-entries'
|
|
| 'locker-storages'
|
|
| 'loadouts'
|
|
| 'market-listings'
|
|
| 'market-negotiations'
|
|
| 'market-state'
|
|
| 'evaluations'
|
|
| 'tickets'
|
|
| 'wiki-pages'
|
|
| 'wiki-revisions'
|
|
| 'wiki-templates'
|
|
| 'game-servers'
|
|
| 'assignment-transfers'
|
|
| 'voice-scripts'
|
|
| 'voice-submissions'
|
|
| 'story-beats'
|
|
| 'story-beat-states'
|
|
)
|
|
| null;
|
|
targetId?: number | null;
|
|
data?:
|
|
| {
|
|
[k: string]: unknown;
|
|
}
|
|
| unknown[]
|
|
| string
|
|
| number
|
|
| boolean
|
|
| null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "ranks".
|
|
*/
|
|
export interface Rank {
|
|
id: number;
|
|
_order?: string | null;
|
|
name: string;
|
|
abbreviation: string;
|
|
description: string;
|
|
insignia?: (number | null) | Media;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "profiles".
|
|
*/
|
|
export interface Profile {
|
|
id: number;
|
|
user: number | User;
|
|
rank: number | Rank;
|
|
profileTitle?: string | null;
|
|
dossier: {
|
|
enlistmentDate: string;
|
|
personalExcerpt?: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
} | null;
|
|
intelExcerpt?: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
} | null;
|
|
};
|
|
progression?: {
|
|
xp?: number | null;
|
|
awards?:
|
|
| {
|
|
award: number | Award;
|
|
/**
|
|
* Who issued the award. If no one, the award will be attributed as "on behalf of the unit."
|
|
*/
|
|
awardedBy?: (number | null) | Profile;
|
|
/**
|
|
* The issuing date of the award.
|
|
*/
|
|
awardedAt: string;
|
|
/**
|
|
* An optional reason for the award.
|
|
*/
|
|
awardReason?: string | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
qualifications?: (number | Qualification)[] | null;
|
|
scoreboard?: {
|
|
infantryKills?: number | null;
|
|
vehicleKills?: number | null;
|
|
armorKills?: number | null;
|
|
airKills?: number | null;
|
|
deaths?: number | null;
|
|
};
|
|
minigames?: {
|
|
flappyBird?: {
|
|
gamesPlayed?: number | null;
|
|
totalPasses?: number | null;
|
|
bestScore?: number | null;
|
|
xpEarned?: number | null;
|
|
};
|
|
eodMinesweeper?: {
|
|
gamesPlayed?: number | null;
|
|
wins?: number | null;
|
|
losses?: number | null;
|
|
bestScore?: number | null;
|
|
xpEarned?: number | null;
|
|
bestTrainingTime?: number | null;
|
|
bestPerimeterTime?: number | null;
|
|
bestSupplyRoadTime?: number | null;
|
|
bestTrainingFlags?: number | null;
|
|
bestPerimeterFlags?: number | null;
|
|
bestSupplyRoadFlags?: number | null;
|
|
};
|
|
radioTraffic?: {
|
|
gamesPlayed?: number | null;
|
|
totalMessages?: number | null;
|
|
incorrectMessages?: number | null;
|
|
bestScore?: number | null;
|
|
bestAccuracy?: number | null;
|
|
bestSprintTimeMs?: number | null;
|
|
sprintGamesPlayed?: number | null;
|
|
sprintTotalMessages?: number | null;
|
|
sprintIncorrectMessages?: number | null;
|
|
sprintBestScore?: number | null;
|
|
sprintBestAccuracy?: number | null;
|
|
watchGamesPlayed?: number | null;
|
|
watchTotalMessages?: number | null;
|
|
watchIncorrectMessages?: number | null;
|
|
watchBestScore?: number | null;
|
|
watchBestAccuracy?: number | null;
|
|
xpEarned?: number | null;
|
|
};
|
|
aimTrainer?: {
|
|
gamesPlayed?: number | null;
|
|
bestScore?: number | null;
|
|
recruitBestScore?: number | null;
|
|
veteranBestScore?: number | null;
|
|
eliteBestScore?: number | null;
|
|
recruitBestAccuracy?: number | null;
|
|
veteranBestAccuracy?: number | null;
|
|
eliteBestAccuracy?: number | null;
|
|
xpEarned?: number | null;
|
|
};
|
|
opordRecall?: {
|
|
gamesPlayed?: number | null;
|
|
bestScore?: number | null;
|
|
bestAccuracy?: number | null;
|
|
recruitBestScore?: number | null;
|
|
veteranBestScore?: number | null;
|
|
eliteBestScore?: number | null;
|
|
xpEarned?: number | null;
|
|
};
|
|
};
|
|
voiceover?: {
|
|
xpEarned?: number | null;
|
|
};
|
|
};
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "awards".
|
|
*/
|
|
export interface Award {
|
|
id: number;
|
|
name: string;
|
|
description: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
};
|
|
type?: ('commendation' | 'ribbon' | 'medal') | null;
|
|
commendationColor?: string | null;
|
|
image?: (number | null) | Media;
|
|
experiencePoints?: number | null;
|
|
ribbonDesign?:
|
|
| {
|
|
[k: string]: unknown;
|
|
}
|
|
| unknown[]
|
|
| string
|
|
| number
|
|
| boolean
|
|
| null;
|
|
/**
|
|
* A background image for the award card. Displayed as a faded backdrop behind the card content.
|
|
*/
|
|
backgroundImage?: (number | null) | Media;
|
|
medalDesign?:
|
|
| {
|
|
[k: string]: unknown;
|
|
}
|
|
| unknown[]
|
|
| string
|
|
| number
|
|
| boolean
|
|
| null;
|
|
/**
|
|
* Configure who can grant this award and to whom. Only applies to ribbons and commendations.
|
|
*/
|
|
grantConfig?: {
|
|
/**
|
|
* Leaders of these assignment types can grant this award. Leave empty for admin/developer only.
|
|
*/
|
|
allowedGrantorAssignmentTypes?: ('division' | 'squad' | 'team' | 'special')[] | null;
|
|
/**
|
|
* Maximum times each grantor can issue this award. Empty = unlimited.
|
|
*/
|
|
maxGrantsPerGrantor?: number | null;
|
|
recipientScope?: ('same_command' | 'whitelist' | 'anyone') | null;
|
|
/**
|
|
* Only members of these assignments can receive this award.
|
|
*/
|
|
eligibleRecipientAssignments?: (number | Assignment)[] | null;
|
|
};
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "assignments".
|
|
*/
|
|
export interface Assignment {
|
|
id: number;
|
|
name: string;
|
|
type: 'division' | 'squad' | 'team' | 'special';
|
|
callsign?: string | null;
|
|
description?: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
} | null;
|
|
/**
|
|
* The leader represents the individual responsible for this assignment and its members. The leader automatically counts as a member when this assignment is queried.
|
|
*/
|
|
leader?: (number | null) | User;
|
|
commandElement?: {
|
|
docs?: (number | Assignment)[];
|
|
hasNextPage?: boolean;
|
|
totalDocs?: number;
|
|
};
|
|
/**
|
|
* Add other teams as members of this team/assignment.
|
|
*/
|
|
subAssignments?: (number | Assignment)[] | null;
|
|
/**
|
|
* Add individuals as members of this team/assignment.
|
|
*/
|
|
members?: (number | User)[] | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "qualifications".
|
|
*/
|
|
export interface Qualification {
|
|
id: number;
|
|
name: string;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "assignment-transfers".
|
|
*/
|
|
export interface AssignmentTransfer {
|
|
id: number;
|
|
/**
|
|
* The user requesting the transfer.
|
|
*/
|
|
requester: number | User;
|
|
/**
|
|
* The assignment the requester currently belongs to.
|
|
*/
|
|
fromAssignment: number | Assignment;
|
|
/**
|
|
* The assignment the requester wants to join.
|
|
*/
|
|
toAssignment: number | Assignment;
|
|
status: 'pending' | 'rejected' | 'awaiting_superuser' | 'completed' | 'cancelled' | 'denied';
|
|
/**
|
|
* Only set when status is awaiting_superuser. no_leaders: neither side had a leader at creation; appeal: requester appealed a rejection; leader_changed: leadership changed mid-pending.
|
|
*/
|
|
escalationReason?: ('no_leaders' | 'appeal' | 'leader_changed') | null;
|
|
/**
|
|
* The source assignment leader's decision. not_required is stamped at creation when the source has no leader.
|
|
*/
|
|
fromLeaderDecision: 'pending' | 'approved' | 'rejected' | 'not_required';
|
|
/**
|
|
* The destination assignment leader's decision. not_required is stamped at creation when the destination has no leader.
|
|
*/
|
|
toLeaderDecision: 'pending' | 'approved' | 'rejected' | 'not_required';
|
|
/**
|
|
* The user who recorded the source-side decision (audit).
|
|
*/
|
|
fromDecisionBy?: (number | null) | User;
|
|
/**
|
|
* The user who recorded the destination-side decision (audit).
|
|
*/
|
|
toDecisionBy?: (number | null) | User;
|
|
/**
|
|
* When the source-side decision was recorded.
|
|
*/
|
|
fromDecidedAt?: string | null;
|
|
/**
|
|
* When the destination-side decision was recorded.
|
|
*/
|
|
toDecidedAt?: string | null;
|
|
/**
|
|
* The source assignment's leader at creation time (audit snapshot; may be null).
|
|
*/
|
|
fromLeaderSnapshot?: (number | null) | User;
|
|
/**
|
|
* The destination assignment's leader at creation time (audit snapshot; may be null).
|
|
*/
|
|
toLeaderSnapshot?: (number | null) | User;
|
|
/**
|
|
* Required when a side rejects the request.
|
|
*/
|
|
rejectionReason?: string | null;
|
|
/**
|
|
* Optional note from the requester explaining the transfer.
|
|
*/
|
|
requestNote?: string | null;
|
|
/**
|
|
* Optional note from the requester when appealing a rejection.
|
|
*/
|
|
appealNote?: string | null;
|
|
/**
|
|
* The admin/developer who resolved an escalated request (audit).
|
|
*/
|
|
resolvedBy?: (number | null) | User;
|
|
/**
|
|
* Optional note from the resolver.
|
|
*/
|
|
resolutionNote?: string | null;
|
|
/**
|
|
* When the escalated request was resolved.
|
|
*/
|
|
resolvedAt?: string | null;
|
|
/**
|
|
* Discord message id of the notification sent to the source leader (Phase 2).
|
|
*/
|
|
discordFromLeaderMessageId?: string | null;
|
|
/**
|
|
* Discord message id of the notification sent to the destination leader (Phase 2).
|
|
*/
|
|
discordToLeaderMessageId?: string | null;
|
|
/**
|
|
* Discord message id of the notification sent to the requester (Phase 2).
|
|
*/
|
|
discordRequesterMessageId?: string | null;
|
|
/**
|
|
* The user actually notified on the source side (the leader at notification time; may differ from the snapshot).
|
|
*/
|
|
sourceNotifiedToUserId?: (number | null) | User;
|
|
/**
|
|
* The user actually notified on the destination side (the leader at notification time; may differ from the snapshot).
|
|
*/
|
|
destinationNotifiedToUserId?: (number | null) | User;
|
|
/**
|
|
* Delivery keys already sent to Discord, used by the Phase 2 bot service for idempotent delivery.
|
|
*/
|
|
discordDeliveredKeys?:
|
|
| {
|
|
[k: string]: unknown;
|
|
}
|
|
| unknown[]
|
|
| string
|
|
| number
|
|
| boolean
|
|
| null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "experience".
|
|
*/
|
|
export interface Experience {
|
|
id: number;
|
|
name: string;
|
|
requiredPoints: number;
|
|
description: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
};
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "user-notifications".
|
|
*/
|
|
export interface UserNotification {
|
|
id: number;
|
|
user: number | User;
|
|
/**
|
|
* Machine-readable notification type, e.g. `market:offer`.
|
|
*/
|
|
type?: string | null;
|
|
title: string;
|
|
message?: string | null;
|
|
/**
|
|
* Optional internal path to navigate to when clicked.
|
|
*/
|
|
link?: string | null;
|
|
read?: boolean | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "evaluations".
|
|
*/
|
|
export interface Evaluation {
|
|
id: number;
|
|
/**
|
|
* Who submitted this evaluation. Private, only visible to users with evaluations:read.
|
|
*/
|
|
rater: number | User;
|
|
ratee: number | User;
|
|
mission: number | Mission;
|
|
kind: 'leader-direct' | 'leader-indirect' | 'subordinate';
|
|
level: 'exceptional' | 'excellent' | 'proficient' | 'adequate' | 'moderate' | 'under-review';
|
|
/**
|
|
* Private free-text note. Never shown to normal users; managers only.
|
|
*/
|
|
comment?: string | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "missions".
|
|
*/
|
|
export interface Mission {
|
|
id: number;
|
|
name: string;
|
|
/**
|
|
* A "code name" provides a unique way to reference this mission beyond just the mission's name. For example, a mission called "Operation Dragon Break" could be codenamed "OP:DRGBRK".
|
|
*/
|
|
codeName: string;
|
|
/**
|
|
* A summary of the mission. This is not the same as a briefing; instead, it describes the mission's theme and concept to the unit as a whole.
|
|
*/
|
|
summary: string;
|
|
operationType: 'main' | 'side' | 'external';
|
|
/**
|
|
* ID of the attendance embed message in Discord (managed by the bot).
|
|
*/
|
|
discordMessageId?: string | null;
|
|
/**
|
|
* Hash of the last attendance state rendered to Discord (managed by the bot).
|
|
*/
|
|
discordAttendanceHash?: string | null;
|
|
/**
|
|
* When the attendance roll-call was first posted to Discord (managed by the bot).
|
|
*/
|
|
discordAttendanceSentAt?: string | null;
|
|
/**
|
|
* Fingerprint of the attached modlist last announced to Discord (managed by the bot).
|
|
*/
|
|
discordModlistHash?: string | null;
|
|
/**
|
|
* When evaluation reminder DMs were sent for this mission (managed by the bot, one-shot).
|
|
*/
|
|
evaluationRemindersSentAt?: string | null;
|
|
/**
|
|
* Server-local day the last web 'not Ready' reminder notification was sent to the op creator (managed by the mission tick, once per day).
|
|
*/
|
|
readyReminderWebSentAt?: string | null;
|
|
/**
|
|
* Server-local day the last 'not Ready' reminder DM was sent to the op creator (managed by the Discord bot, once per day).
|
|
*/
|
|
readyReminderDmSentAt?: string | null;
|
|
/**
|
|
* Player who scheduled this mission via the Friday Ops calendar (ownership + scheduling-cap tracking). Set automatically; leave empty for staff-created missions.
|
|
*/
|
|
createdBy?: (number | null) | User;
|
|
/**
|
|
* Background image for the mission page hero header. Renders translucent with a top-to-bottom fade to black. Recommended aspect ratio: 16:9 or wider.
|
|
*/
|
|
coverImage?: (number | null) | Media;
|
|
classification: {
|
|
map: number | Map;
|
|
missionType: 'Zeus' | 'PvE' | 'PvP' | 'PvPvE' | 'Training' | 'Special';
|
|
campaign?: (number | null) | Campaign;
|
|
/**
|
|
* This mission contains custom SQF scripts.
|
|
*/
|
|
customScripts?: boolean | null;
|
|
startDateTime: string;
|
|
estimatedDuration: number;
|
|
};
|
|
ownershipAndStatus: {
|
|
authors: (number | User)[];
|
|
zeus?: (number | User)[] | null;
|
|
status: 'Concept' | 'Planning' | 'Ready' | 'Scheduled' | 'Active' | 'Completed' | 'Cancelled';
|
|
visibility: 'unit' | 'leadership' | 'intel' | 'private';
|
|
/**
|
|
* When the mission transitioned to Completed. Set automatically by the lifecycle (auto-complete tick or manual status change); managed here, not editable in the form.
|
|
*/
|
|
completedAt?: string | null;
|
|
};
|
|
missionRoles: {
|
|
maxPlayers: number;
|
|
providedRoles?:
|
|
| {
|
|
roleName: string;
|
|
/**
|
|
* If true, this mission cannot be executed without someone fulfilling this role.
|
|
*/
|
|
missionCritical?: boolean | null;
|
|
/**
|
|
* This role can only be fulfilled by someone possessing these qualifications.
|
|
*/
|
|
requiredMos?: (number | Qualification)[] | null;
|
|
/**
|
|
* This role can only be fulfilled by someone of this rank or higher.
|
|
*/
|
|
minimumRank?: (number | null) | Rank;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
notes?: string | null;
|
|
};
|
|
briefing?:
|
|
| {
|
|
sectionName: string;
|
|
details: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
};
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
missionObjectives?:
|
|
| {
|
|
title: string;
|
|
description?: string | null;
|
|
/**
|
|
* If true, this mission will be considered a failure if this objective is failed.
|
|
*/
|
|
missionCritical?: boolean | null;
|
|
successOrFailConditions?: string | null;
|
|
/**
|
|
* If true, this objective will be hidden from players until revealed.
|
|
*/
|
|
redacted?: boolean | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
civilianPresence?: ('None' | 'Low' | 'Medium' | 'High') | null;
|
|
factionsInvolved?:
|
|
| {
|
|
faction: number | Faction;
|
|
threatLevel: 'ally' | 'friendly' | 'neutral' | 'hostile';
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
gameDetails: {
|
|
serverDetails: {
|
|
serverIp: string;
|
|
serverPort: number;
|
|
serverPassword?: string | null;
|
|
};
|
|
gameSetup?: {
|
|
missionFile?: (number | null) | MissionFile;
|
|
/**
|
|
* This field is not required only because you may be running a vanilla gamemode. If you have any mods at all in your mission, you MUST include a mod list.
|
|
*/
|
|
requiredMods?: (number | null) | ModList;
|
|
};
|
|
};
|
|
/**
|
|
* Mission requirements and conditions surrounding the deployment and use of logistics and support assets during the mission's runtime.
|
|
*/
|
|
logisticsAndSupport?: {
|
|
insertion?: ('helicopter' | 'aircraft' | 'paradrop' | 'boat' | 'car' | 'onFoot')[] | null;
|
|
extraction?: ('helicopter' | 'aircraft' | 'paradrop' | 'boat' | 'car' | 'onFoot')[] | null;
|
|
assetsAvailable?:
|
|
| {
|
|
/**
|
|
* The name or type of the asset provided (e.g. "Artillery", "M1A1 Tank", "Fuel Truck", "Close Air Support", etc.)
|
|
*/
|
|
assetType: string;
|
|
/**
|
|
* If applicable, the number of this asset that will be available at the start of the mission.
|
|
*/
|
|
assetCount?: string | null;
|
|
/**
|
|
* Whether or not this asset respawns during the mission, either automatically or manually via Zeus.
|
|
*/
|
|
doesRespawn?: boolean | null;
|
|
/**
|
|
* If applicable, the callsign of this asset (such as an aicraft providing close air support.)
|
|
*/
|
|
assetCallsign?: string | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
};
|
|
/**
|
|
* Communications and Standard Operating Procedures specific to this mission.
|
|
*/
|
|
commsAndDocs?: {
|
|
/**
|
|
* A detailed description of how radios will be used during this operation, including signals, contingency plans, and other relevant details.
|
|
*/
|
|
radioPlan?: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
} | null;
|
|
/**
|
|
* A list and description of each of the radio frequencies used for this mission.
|
|
*/
|
|
frequencies?:
|
|
| {
|
|
frequency: number;
|
|
/**
|
|
* Must be provided if the frequency used requires a separate radio channel.
|
|
*/
|
|
channel?: number | null;
|
|
/**
|
|
* The name assigned to this frequency (+ channel.) Examples of names include "COMNET", "PLTNET", "CASNET", etc.
|
|
*/
|
|
netName: string;
|
|
/**
|
|
* An explanation of the expected usage and purpose of this radio net.
|
|
*/
|
|
freqUsage: string;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
};
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "maps".
|
|
*/
|
|
export interface Map {
|
|
id: number;
|
|
name: string;
|
|
fileName?: string | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "mission-files".
|
|
*/
|
|
export interface MissionFile {
|
|
id: number;
|
|
missionFileName: string;
|
|
author: number | User;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
url?: string | null;
|
|
thumbnailURL?: string | null;
|
|
filename?: string | null;
|
|
mimeType?: string | null;
|
|
filesize?: number | null;
|
|
width?: number | null;
|
|
height?: number | null;
|
|
focalX?: number | null;
|
|
focalY?: number | null;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "mod-lists".
|
|
*/
|
|
export interface ModList {
|
|
id: number;
|
|
/**
|
|
* A friendly name for the mod list.
|
|
*/
|
|
modlistName: string;
|
|
author: number | User;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
url?: string | null;
|
|
thumbnailURL?: string | null;
|
|
filename?: string | null;
|
|
mimeType?: string | null;
|
|
filesize?: number | null;
|
|
width?: number | null;
|
|
height?: number | null;
|
|
focalX?: number | null;
|
|
focalY?: number | null;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "mission-attendances".
|
|
*/
|
|
export interface MissionAttendance {
|
|
id: number;
|
|
mission: number | Mission;
|
|
user: number | User;
|
|
response: 'yes' | 'no' | 'tentative';
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "shipments".
|
|
*/
|
|
export interface Shipment {
|
|
id: number;
|
|
/**
|
|
* Shipment label. Auto-generated if left empty.
|
|
*/
|
|
name?: string | null;
|
|
origin: number | GameStructure;
|
|
destination: number | GameStructure;
|
|
/**
|
|
* The vehicle instance transporting this shipment.
|
|
*/
|
|
transportVehicle: number | GameVehicle;
|
|
/**
|
|
* Euclidean distance between origin and destination.
|
|
*/
|
|
distance: number;
|
|
cargo: {
|
|
item:
|
|
| {
|
|
relationTo: 'resources';
|
|
value: number | Resource;
|
|
}
|
|
| {
|
|
relationTo: 'assets';
|
|
value: number | Asset;
|
|
}
|
|
| {
|
|
relationTo: 'vehicles';
|
|
value: number | Vehicle;
|
|
};
|
|
amount: number;
|
|
id?: string | null;
|
|
}[];
|
|
/**
|
|
* Total fuel required for the entire trip.
|
|
*/
|
|
fuelCost: number;
|
|
/**
|
|
* Fuel consumed so far during transit.
|
|
*/
|
|
fuelConsumed?: number | null;
|
|
status: 'pending' | 'dispatched' | 'in_transit' | 'arrived' | 'completed' | 'cancelled' | 'failed' | 'stranded';
|
|
dispatchedAt?: string | null;
|
|
estimatedArrival?: string | null;
|
|
completedAt?: string | null;
|
|
/**
|
|
* If true, the vehicle will automatically return to its origin after completing this shipment.
|
|
*/
|
|
autoReturn?: boolean | null;
|
|
createdBy?: (number | null) | User;
|
|
/**
|
|
* Reason for failure or stranding.
|
|
*/
|
|
failureReason?: string | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "bank-accounts".
|
|
*/
|
|
export interface BankAccount {
|
|
id: number;
|
|
/**
|
|
* Display name for the account (e.g., "Unit Treasury", "Red Faction Reserve").
|
|
*/
|
|
name: string;
|
|
/**
|
|
* Treasury = unit-level central funds. Faction = a specific faction's funds. Personal = an individual operator's wallet.
|
|
*/
|
|
accountType: 'treasury' | 'faction' | 'personal';
|
|
/**
|
|
* The faction that owns this account.
|
|
*/
|
|
ownerFaction?: (number | null) | Faction;
|
|
/**
|
|
* The operator who owns this personal account.
|
|
*/
|
|
ownerUser?: (number | null) | User;
|
|
/**
|
|
* The currency this account is denominated in (normally the main currency set in Game Rules).
|
|
*/
|
|
currency: number | Resource;
|
|
/**
|
|
* Current account balance. Maintained automatically by banking transactions.
|
|
*/
|
|
balance?: number | null;
|
|
status: 'open' | 'frozen' | 'closed';
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "bank-transactions".
|
|
*/
|
|
export interface BankTransaction {
|
|
id: number;
|
|
/**
|
|
* Auto-generated reference number.
|
|
*/
|
|
transactionNumber: string;
|
|
type: 'deposit' | 'withdrawal' | 'transfer' | 'payment' | 'fee' | 'salary' | 'adjustment';
|
|
/**
|
|
* Source account (empty for external deposits / incoming funds).
|
|
*/
|
|
fromAccount?: (number | null) | BankAccount;
|
|
/**
|
|
* Destination account (empty for external withdrawals / outgoing payments).
|
|
*/
|
|
toAccount?: (number | null) | BankAccount;
|
|
/**
|
|
* Gross amount moved. Withdrawals may be split as amount + fee.
|
|
*/
|
|
amount: number;
|
|
/**
|
|
* Transaction fee debited from the source in addition to the amount.
|
|
*/
|
|
fee?: number | null;
|
|
/**
|
|
* Human-readable note attached to the transaction.
|
|
*/
|
|
memo?: string | null;
|
|
/**
|
|
* User who initiated the transaction.
|
|
*/
|
|
actor?: (number | null) | User;
|
|
status: 'completed' | 'reversed';
|
|
/**
|
|
* Original transaction, when this one is a reversal.
|
|
*/
|
|
reference?: (number | null) | BankTransaction;
|
|
timestamp: string;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "ledger-entries".
|
|
*/
|
|
export interface LedgerEntry {
|
|
id: number;
|
|
/**
|
|
* The account this ledger entry applies to.
|
|
*/
|
|
account: number | BankAccount;
|
|
/**
|
|
* The originating bank transaction.
|
|
*/
|
|
transaction: number | BankTransaction;
|
|
type: 'deposit' | 'withdrawal' | 'transfer' | 'payment' | 'fee' | 'salary' | 'adjustment';
|
|
/**
|
|
* Signed amount: positive = credit into the account, negative = debit out.
|
|
*/
|
|
amount: number;
|
|
/**
|
|
* Account balance immediately after this entry was applied.
|
|
*/
|
|
balanceAfter?: number | null;
|
|
memo?: string | null;
|
|
timestamp: string;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "locker-storages".
|
|
*/
|
|
export interface LockerStorage {
|
|
id: number;
|
|
/**
|
|
* Display name for this locker.
|
|
*/
|
|
name: string;
|
|
/**
|
|
* The operator who owns this locker.
|
|
*/
|
|
ownerUser: number | User;
|
|
/**
|
|
* Items stored in the locker grid. Position and rotation are managed from the member locker UI.
|
|
*/
|
|
items?:
|
|
| {
|
|
asset: number | Asset;
|
|
quantity: number;
|
|
/**
|
|
* Column position in the locker grid (0-indexed).
|
|
*/
|
|
gridX: number;
|
|
/**
|
|
* Row position in the locker grid (0-indexed).
|
|
*/
|
|
gridY: number;
|
|
/**
|
|
* Whether this item is rotated 90 degrees (swaps width and height).
|
|
*/
|
|
rotated?: boolean | null;
|
|
/**
|
|
* Per-instance customization for this item: installed attachments, applied skin, and a custom name. Managed from the member locker UI.
|
|
*/
|
|
equipment?: {
|
|
/**
|
|
* Attachments installed on this item (e.g. optics, muzzles, bipods on a weapon). Installing consumes the attachment from the locker grid.
|
|
*/
|
|
attachments?:
|
|
| {
|
|
asset: number | Asset;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* Skin applied to this item. Applying consumes the skin from the locker grid.
|
|
*/
|
|
skin?: (number | null) | Asset;
|
|
/**
|
|
* Optional custom name for this item (e.g. "Frank's Karma").
|
|
*/
|
|
customName?: string | null;
|
|
};
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* Total number of distinct entries currently in this locker.
|
|
*/
|
|
itemCount?: number | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "loadouts".
|
|
*/
|
|
export interface Loadout {
|
|
id: number;
|
|
/**
|
|
* Loadout name (e.g., "CQB", "Overwatch", "Resupply").
|
|
*/
|
|
name: string;
|
|
/**
|
|
* Optional notes about this loadout.
|
|
*/
|
|
description?: string | null;
|
|
/**
|
|
* The operator this loadout belongs to.
|
|
*/
|
|
ownerUser: number | User;
|
|
/**
|
|
* Whether this is the member's currently equipped loadout. Only one loadout per member can be equipped; the wardrobe reflects the equipped loadout.
|
|
*/
|
|
equipped?: boolean | null;
|
|
/**
|
|
* Assign assets from your locker to each equipment slot.
|
|
*/
|
|
slots?: {
|
|
/**
|
|
* Primary weapon
|
|
*/
|
|
primary?: (number | null) | Asset;
|
|
/**
|
|
* Secondary weapon
|
|
*/
|
|
secondary?: (number | null) | Asset;
|
|
/**
|
|
* Launcher / heavy weapon
|
|
*/
|
|
launcher?: (number | null) | Asset;
|
|
/**
|
|
* Uniform
|
|
*/
|
|
uniform?: (number | null) | Asset;
|
|
/**
|
|
* Carrier / plate carrier
|
|
*/
|
|
vest?: (number | null) | Asset;
|
|
/**
|
|
* Backpack / rucksack
|
|
*/
|
|
backpack?: (number | null) | Asset;
|
|
/**
|
|
* Helmet
|
|
*/
|
|
helmet?: (number | null) | Asset;
|
|
/**
|
|
* Facewear / eyewear
|
|
*/
|
|
facewear?: (number | null) | Asset;
|
|
/**
|
|
* Night vision device
|
|
*/
|
|
nvg?: (number | null) | Asset;
|
|
/**
|
|
* Radio / comms
|
|
*/
|
|
radio?: (number | null) | Asset;
|
|
/**
|
|
* Optic attachment
|
|
*/
|
|
optic?: (number | null) | Asset;
|
|
/**
|
|
* Muzzle attachment
|
|
*/
|
|
muzzle?: (number | null) | Asset;
|
|
/**
|
|
* Bipod attachment
|
|
*/
|
|
bipod?: (number | null) | Asset;
|
|
};
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "market-listings".
|
|
*/
|
|
export interface MarketListing {
|
|
id: number;
|
|
/**
|
|
* The asset being offered for sale.
|
|
*/
|
|
asset: number | Asset;
|
|
/**
|
|
* The user who listed this item. Null for auto-generated market entries (NPC stock).
|
|
*/
|
|
seller?: (number | null) | User;
|
|
/**
|
|
* The NPC stocking this entry. Auto-generated market entries are attributed to an NPC instead of a user.
|
|
*/
|
|
npc?: (number | null) | GameNpc;
|
|
quantity: number;
|
|
/**
|
|
* Price per single unit, in the market currency.
|
|
*/
|
|
price: number;
|
|
/**
|
|
* The seller's target price during negotiations. Defaults to the asking price.
|
|
*/
|
|
desiredPrice?: number | null;
|
|
/**
|
|
* The lowest per-unit price the seller will accept. When set below the asking price, the listing is negotiable.
|
|
*/
|
|
minPrice?: number | null;
|
|
/**
|
|
* The currency this listing is priced in. Defaults to the main campaign currency.
|
|
*/
|
|
currency?: (number | null) | Resource;
|
|
status: 'active' | 'sold' | 'cancelled' | 'expired';
|
|
/**
|
|
* True for system-generated NPC entries. Auto-generated entries have no seller; proceeds go to the unit treasury.
|
|
*/
|
|
isAutoGenerated?: boolean | null;
|
|
listedAt: string;
|
|
/**
|
|
* When this listing expires. Expired user listings have their stock returned to the seller; auto-generated entries simply close.
|
|
*/
|
|
expiresAt?: string | null;
|
|
soldAt?: string | null;
|
|
/**
|
|
* The user who purchased this listing.
|
|
*/
|
|
buyer?: (number | null) | User;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "market-negotiations".
|
|
*/
|
|
export interface MarketNegotiation {
|
|
id: number;
|
|
/**
|
|
* The market listing this negotiation thread belongs to.
|
|
*/
|
|
listing: number | MarketListing;
|
|
/**
|
|
* The player interested in buying the listing.
|
|
*/
|
|
buyer: number | User;
|
|
status: 'open' | 'accepted' | 'rejected' | 'closed' | 'cancelled' | 'expired';
|
|
/**
|
|
* NPC vendor patience (0-100). Rises each bargaining round and sharply for lowball offers; at 100 the negotiation closes and the buyer can only buy at the asking price.
|
|
*/
|
|
patience?: number | null;
|
|
/**
|
|
* How many units the buyer wants from the listing.
|
|
*/
|
|
quantity?: number | null;
|
|
/**
|
|
* The per-unit price currently on the table. Proposed by the buyer or the seller depending on the proposal.
|
|
*/
|
|
amount: number;
|
|
proposedBy: 'buyer' | 'seller';
|
|
/**
|
|
* The per-unit price agreed when the negotiation is accepted.
|
|
*/
|
|
acceptedPrice?: number | null;
|
|
history?:
|
|
| {
|
|
amount: number;
|
|
from: 'buyer' | 'seller';
|
|
note?: string | null;
|
|
at: string;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* Supply/demand ledger per item, maintained by the economy tick. Baselines are copied from the item's Supply & Demand fields on first creation.
|
|
*
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "market-state".
|
|
*/
|
|
export interface MarketState {
|
|
id: number;
|
|
/**
|
|
* Which collection this ledger entry tracks.
|
|
*/
|
|
itemType: 'resource' | 'asset';
|
|
/**
|
|
* ID of the tracked resource or asset document.
|
|
*/
|
|
itemId: number;
|
|
/**
|
|
* GM-set resting supply. Copied from the item's Supply & Demand baseline when this entry is first created.
|
|
*/
|
|
gmBaselineSupply: number;
|
|
/**
|
|
* GM-set resting demand. Copied from the item's Supply & Demand baseline when this entry is first created.
|
|
*/
|
|
gmBaselineDemand: number;
|
|
/**
|
|
* Living abstract supply. Decremented by unit purchases from NPC listings, incremented by production/sales (later phases).
|
|
*/
|
|
currentSupply: number;
|
|
/**
|
|
* NPC faction demand pressure. Slow-drifting random walk bounded around the GM baseline, updated per economy tick.
|
|
*/
|
|
artificialDemand: number;
|
|
/**
|
|
* Decaying rolling aggregate of completed unit purchases (quantity-weighted). Decayed each tick by the Game Rules decay factor.
|
|
*/
|
|
realDemand: number;
|
|
/**
|
|
* Computed price multiplier applied to the item's base price when generating NEW NPC listings only (1 = resting price). Existing listings and open negotiations are never repriced.
|
|
*/
|
|
priceModifier: number;
|
|
/**
|
|
* When the economy tick last recomputed this entry.
|
|
*/
|
|
lastComputedAt?: string | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "voice-scripts".
|
|
*/
|
|
export interface VoiceScript {
|
|
id: number;
|
|
title: string;
|
|
/**
|
|
* Optional context for readers: who is speaking, where this line happens, and anything else they should know before recording.
|
|
*/
|
|
description?: string | null;
|
|
/**
|
|
* Voice talent reads this verbatim. Inline emotion tags like [calm] are stored as written.
|
|
*/
|
|
script: string;
|
|
/**
|
|
* XP awarded per accepted submission of this script.
|
|
*/
|
|
xpAmount: number;
|
|
/**
|
|
* Warns readers on the frontend that this script may include, infer, or expose campaign spoilers.
|
|
*/
|
|
spoiler?: boolean | null;
|
|
/**
|
|
* Closed scripts reject new submissions
|
|
*/
|
|
status: 'open' | 'closed';
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "voice-submissions".
|
|
*/
|
|
export interface VoiceSubmission {
|
|
id: number;
|
|
script: number | VoiceScript;
|
|
/**
|
|
* Submitter
|
|
*/
|
|
user: number | User;
|
|
/**
|
|
* Optional short note from the submitter about this take.
|
|
*/
|
|
description?: string | null;
|
|
status: 'pending' | 'accepted' | 'rejected';
|
|
/**
|
|
* Optional reviewer feedback. Shown to the submitter alongside their take.
|
|
*/
|
|
reviewNote?: string | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
url?: string | null;
|
|
thumbnailURL?: string | null;
|
|
filename?: string | null;
|
|
mimeType?: string | null;
|
|
filesize?: number | null;
|
|
width?: number | null;
|
|
height?: number | null;
|
|
focalX?: number | null;
|
|
focalY?: number | null;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "tickets".
|
|
*/
|
|
export interface Ticket {
|
|
id: number;
|
|
/**
|
|
* Short, descriptive summary of the issue or request.
|
|
*/
|
|
title: string;
|
|
/**
|
|
* Full details of the issue or request.
|
|
*/
|
|
description: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
};
|
|
category: 'bug_report' | 'feature_request' | 'support_request' | 'other';
|
|
priority: 'low' | 'medium' | 'high' | 'critical';
|
|
status:
|
|
| 'open'
|
|
| 'in_review'
|
|
| 'planning'
|
|
| 'in_progress'
|
|
| 'waiting_on_reporter'
|
|
| 'in_testing'
|
|
| 'resolved'
|
|
| 'canceled'
|
|
| 'closed';
|
|
/**
|
|
* The user who submitted this ticket.
|
|
*/
|
|
reporter: number | User;
|
|
/**
|
|
* Staff member responsible for this ticket.
|
|
*/
|
|
assignee?: (number | null) | User;
|
|
/**
|
|
* Append-only activity timeline. Messages between the reporter and staff plus system events.
|
|
*/
|
|
activity?:
|
|
| {
|
|
type: 'system' | 'agent_message' | 'client_message';
|
|
content: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
};
|
|
/**
|
|
* Who wrote this entry. Omitted for system events.
|
|
*/
|
|
author?: (number | null) | User;
|
|
created_at?: string | null;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* Immutable before/after snapshots captured when the author edits a ticket.
|
|
*/
|
|
editHistory?:
|
|
| {
|
|
before:
|
|
| {
|
|
[k: string]: unknown;
|
|
}
|
|
| unknown[]
|
|
| string
|
|
| number
|
|
| boolean
|
|
| null;
|
|
after:
|
|
| {
|
|
[k: string]: unknown;
|
|
}
|
|
| unknown[]
|
|
| string
|
|
| number
|
|
| boolean
|
|
| null;
|
|
editedBy: number | User;
|
|
editedAt: string;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
/**
|
|
* Set automatically when the ticket reaches a closing status.
|
|
*/
|
|
closedAt?: string | null;
|
|
/**
|
|
* Project this ticket belongs to. Null = standalone/backlog.
|
|
*/
|
|
project?: (number | null) | Project;
|
|
/**
|
|
* Sprint this ticket is assigned to.
|
|
*/
|
|
sprint?: (number | null) | Sprint;
|
|
/**
|
|
* Release this ticket targets.
|
|
*/
|
|
release?: (number | null) | Release;
|
|
/**
|
|
* Parent ticket (for subtasks / epic children).
|
|
*/
|
|
parentTicket?: (number | null) | Ticket;
|
|
/**
|
|
* Labels for filtering and organization.
|
|
*/
|
|
labels?: (number | Label)[] | null;
|
|
/**
|
|
* Issue type.
|
|
*/
|
|
type?: ('task' | 'bug' | 'story' | 'epic' | 'improvement') | null;
|
|
/**
|
|
* Fibonacci story point estimate.
|
|
*/
|
|
storyPoints?: number | null;
|
|
/**
|
|
* Time estimate in hours.
|
|
*/
|
|
estimate?: number | null;
|
|
/**
|
|
* When work starts (for Gantt).
|
|
*/
|
|
startDate?: string | null;
|
|
/**
|
|
* When work is due (for Gantt).
|
|
*/
|
|
dueDate?: string | null;
|
|
/**
|
|
* How the ticket was resolved.
|
|
*/
|
|
resolution?: ('fixed' | 'wontfix' | 'duplicate' | 'invalid') | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "projects".
|
|
*/
|
|
export interface Project {
|
|
id: number;
|
|
name: string;
|
|
/**
|
|
* Short project key (e.g. PTF). Max 10 uppercase alphanumeric characters.
|
|
*/
|
|
key: string;
|
|
description?: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
} | null;
|
|
lead?: (number | null) | User;
|
|
status?: ('active' | 'archived') | null;
|
|
/**
|
|
* Default assignee for new tickets in this project.
|
|
*/
|
|
defaultAssignee?: (number | null) | User;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "sprints".
|
|
*/
|
|
export interface Sprint {
|
|
id: number;
|
|
name: string;
|
|
project: number | Project;
|
|
goal?: string | null;
|
|
startDate?: string | null;
|
|
endDate?: string | null;
|
|
status?: ('planning' | 'active' | 'completed') | null;
|
|
/**
|
|
* Story point capacity for this sprint.
|
|
*/
|
|
capacity?: number | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "releases".
|
|
*/
|
|
export interface Release {
|
|
id: number;
|
|
name: string;
|
|
project: number | Project;
|
|
description?: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
} | null;
|
|
status?: ('draft' | 'in_progress' | 'released') | null;
|
|
releaseDate?: string | null;
|
|
/**
|
|
* Semver string, e.g. 2.3.0
|
|
*/
|
|
targetVersion?: string | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "labels".
|
|
*/
|
|
export interface Label {
|
|
id: number;
|
|
name: string;
|
|
/**
|
|
* Hex color code.
|
|
*/
|
|
color?: string | null;
|
|
/**
|
|
* Null for global labels.
|
|
*/
|
|
project?: (number | null) | Project;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "ticket-votes".
|
|
*/
|
|
export interface TicketVote {
|
|
id: number;
|
|
ticket: number | Ticket;
|
|
user: number | User;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "wiki-pages".
|
|
*/
|
|
export interface WikiPage {
|
|
id: number;
|
|
title: string;
|
|
/**
|
|
* URL slug. Generated by the service layer from the title.
|
|
*/
|
|
slug: string;
|
|
category: 'Campaign' | 'World' | 'Lore' | 'Characters' | 'Plot' | 'Media' | 'Guides' | 'Meta';
|
|
tags?: string[] | null;
|
|
/**
|
|
* Markdown source. Rendered by the frontend.
|
|
*/
|
|
body: string;
|
|
lockdown?: boolean | null;
|
|
lockedBy?: (number | null) | User;
|
|
lockedAt?: string | null;
|
|
lastEditor?: (number | null) | User;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "wiki-revisions".
|
|
*/
|
|
export interface WikiRevision {
|
|
id: number;
|
|
page: number | WikiPage;
|
|
revisionNumber: number;
|
|
titleSnapshot: string;
|
|
contentSnapshot: string;
|
|
editor?: (number | null) | User;
|
|
summary?: string | null;
|
|
type: 'create' | 'edit' | 'restore';
|
|
restoredFromRevision?: number | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "wiki-templates".
|
|
*/
|
|
export interface WikiTemplate {
|
|
id: number;
|
|
name: string;
|
|
/**
|
|
* Snippet text with {{param}}-style placeholders as plain markdown.
|
|
*/
|
|
body: string;
|
|
description?: string | null;
|
|
/**
|
|
* Optional CSS injected on wiki pages while this template exists. Write plain selectors, which are automatically prefixed with a hash-based scope class (e.g. .ptf-tpl-3afb1c .my-class) so templates never collide with each other or the app shell.
|
|
*/
|
|
css?: string | null;
|
|
/**
|
|
* Developer-only. Raw HTML rendered verbatim (sanitized) when this template is transcluded, replacing the markdown body.
|
|
*/
|
|
html?: string | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "narrative-events".
|
|
*/
|
|
export interface NarrativeEvent {
|
|
id: number;
|
|
/**
|
|
* The title of this narrative event chain.
|
|
*/
|
|
name: string;
|
|
/**
|
|
* A brief summary of what this event is about.
|
|
*/
|
|
summary: string;
|
|
flowData:
|
|
| {
|
|
[k: string]: unknown;
|
|
}
|
|
| unknown[]
|
|
| string
|
|
| number
|
|
| boolean
|
|
| null;
|
|
triggers?: {
|
|
type?: ('manual' | 'mission_complete' | 'timer' | 'condition') | null;
|
|
/**
|
|
* Optional JSON conditions for when this event can fire.
|
|
*/
|
|
condition?:
|
|
| {
|
|
[k: string]: unknown;
|
|
}
|
|
| unknown[]
|
|
| string
|
|
| number
|
|
| boolean
|
|
| null;
|
|
};
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* Chronicle story beats. Drafts are visible to staff only; published beats are readable by any logged-in user on /story.
|
|
*
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "story-beats".
|
|
*/
|
|
export interface StoryBeat {
|
|
id: number;
|
|
title: string;
|
|
/**
|
|
* In-story timestamp used to order the chronicle.
|
|
*/
|
|
occurredAt?: string | null;
|
|
/**
|
|
* Tie-breaker for beats that share the same timestamp.
|
|
*/
|
|
order?: number | null;
|
|
status: 'draft' | 'published';
|
|
/**
|
|
* Rich text body of the beat, rendered on /story with the Lexical renderer.
|
|
*/
|
|
body: {
|
|
root: {
|
|
type: string;
|
|
children: {
|
|
type: any;
|
|
version: number;
|
|
[k: string]: unknown;
|
|
}[];
|
|
direction: ('ltr' | 'rtl') | null;
|
|
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
|
|
indent: number;
|
|
version: number;
|
|
};
|
|
[k: string]: unknown;
|
|
};
|
|
/**
|
|
* Optional mission this beat is tied to. Beats may stand alone.
|
|
*/
|
|
mission?: (number | null) | Mission;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* Per-user read markers and reactions for story beats.
|
|
*
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "story-beat-states".
|
|
*/
|
|
export interface StoryBeatState {
|
|
id: number;
|
|
user: number | User;
|
|
beat: number | StoryBeat;
|
|
/**
|
|
* When the user first read the beat.
|
|
*/
|
|
readAt?: string | null;
|
|
/**
|
|
* The user's current reaction to the beat, if any.
|
|
*/
|
|
reaction?: ('like' | 'heart' | 'salute') | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "game-servers".
|
|
*/
|
|
export interface GameServer {
|
|
id: number;
|
|
serverId: string;
|
|
name: string;
|
|
status: 'online' | 'offline';
|
|
lastSeenAt?: string | null;
|
|
metadata?:
|
|
| {
|
|
[k: string]: unknown;
|
|
}
|
|
| unknown[]
|
|
| string
|
|
| number
|
|
| boolean
|
|
| null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "arma-sync-events".
|
|
*/
|
|
export interface ArmaSyncEvent {
|
|
id: number;
|
|
eventId: string;
|
|
server: number | GameServer;
|
|
type: string;
|
|
occurredAt: string;
|
|
payload:
|
|
| {
|
|
[k: string]: unknown;
|
|
}
|
|
| unknown[]
|
|
| string
|
|
| number
|
|
| boolean
|
|
| null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "arma-commands".
|
|
*/
|
|
export interface ArmaCommand {
|
|
id: number;
|
|
commandId: string;
|
|
server: number | GameServer;
|
|
type: string;
|
|
payload:
|
|
| {
|
|
[k: string]: unknown;
|
|
}
|
|
| unknown[]
|
|
| string
|
|
| number
|
|
| boolean
|
|
| null;
|
|
status: 'queued' | 'delivered' | 'succeeded' | 'failed';
|
|
result?:
|
|
| {
|
|
[k: string]: unknown;
|
|
}
|
|
| unknown[]
|
|
| string
|
|
| number
|
|
| boolean
|
|
| null;
|
|
error?: string | null;
|
|
deliveredAt?: string | null;
|
|
completedAt?: string | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "plugin-ai-instructions".
|
|
*/
|
|
export interface PluginAiInstruction {
|
|
id: number;
|
|
/**
|
|
* Please don't change this unless you're sure of what you're doing
|
|
*/
|
|
'schema-path'?: string | null;
|
|
/**
|
|
* Please don't change this unless you're sure of what you're doing
|
|
*/
|
|
'field-type'?: ('text' | 'textarea' | 'upload' | 'richText') | null;
|
|
'relation-to'?: string | null;
|
|
'model-id'?: 'unsloth-text' | null;
|
|
/**
|
|
* Please reload your collection after applying the changes
|
|
*/
|
|
disabled?: boolean | null;
|
|
/**
|
|
* Click 'Compose' to run this custom prompt and generate content
|
|
*/
|
|
prompt?: string | null;
|
|
images?:
|
|
| {
|
|
/**
|
|
* Please make sure the image is publicly accessible.
|
|
*/
|
|
image?: (number | null) | Media;
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
system?: string | null;
|
|
layout?: string | null;
|
|
'unsloth-text-settings'?: {
|
|
model?: string | null;
|
|
};
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* API keys control which collections, resources, tools, and prompts MCP clients can access
|
|
*
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "payload-mcp-api-keys".
|
|
*/
|
|
export interface PayloadMcpApiKey {
|
|
id: number;
|
|
/**
|
|
* The user that the API key is associated with.
|
|
*/
|
|
user: number | User;
|
|
/**
|
|
* A useful label for the API key.
|
|
*/
|
|
label?: string | null;
|
|
/**
|
|
* The purpose of the API key.
|
|
*/
|
|
description?: string | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
enableAPIKey?: boolean | null;
|
|
apiKey?: string | null;
|
|
apiKeyIndex?: string | null;
|
|
collection: 'payload-mcp-api-keys';
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "payload-kv".
|
|
*/
|
|
export interface PayloadKv {
|
|
id: number;
|
|
key: string;
|
|
data:
|
|
| {
|
|
[k: string]: unknown;
|
|
}
|
|
| unknown[]
|
|
| string
|
|
| number
|
|
| boolean
|
|
| null;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "payload-locked-documents".
|
|
*/
|
|
export interface PayloadLockedDocument {
|
|
id: number;
|
|
document?:
|
|
| ({
|
|
relationTo: 'media';
|
|
value: number | Media;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'game-hard-resources';
|
|
value: number | GameHardResource;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'game-structures';
|
|
value: number | GameStructure;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'game-vehicles';
|
|
value: number | GameVehicle;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'game-npcs';
|
|
value: number | GameNpc;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'npc-staffing';
|
|
value: number | NpcStaffing;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'labor-classifications';
|
|
value: number | LaborClassification;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'game-event-logs';
|
|
value: number | GameEventLog;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'users';
|
|
value: number | User;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'roles';
|
|
value: number | Role;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'ranks';
|
|
value: number | Rank;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'profiles';
|
|
value: number | Profile;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'awards';
|
|
value: number | Award;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'qualifications';
|
|
value: number | Qualification;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'assignments';
|
|
value: number | Assignment;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'assignment-transfers';
|
|
value: number | AssignmentTransfer;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'experience';
|
|
value: number | Experience;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'user-notifications';
|
|
value: number | UserNotification;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'evaluations';
|
|
value: number | Evaluation;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'missions';
|
|
value: number | Mission;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'mission-attendances';
|
|
value: number | MissionAttendance;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'campaigns';
|
|
value: number | Campaign;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'factions';
|
|
value: number | Faction;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'technologies';
|
|
value: number | Technology;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'assets';
|
|
value: number | Asset;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'resources';
|
|
value: number | Resource;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'vehicles';
|
|
value: number | Vehicle;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'structures';
|
|
value: number | Structure;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'shipments';
|
|
value: number | Shipment;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'bank-accounts';
|
|
value: number | BankAccount;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'bank-transactions';
|
|
value: number | BankTransaction;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'ledger-entries';
|
|
value: number | LedgerEntry;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'locker-storages';
|
|
value: number | LockerStorage;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'loadouts';
|
|
value: number | Loadout;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'market-listings';
|
|
value: number | MarketListing;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'market-negotiations';
|
|
value: number | MarketNegotiation;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'market-state';
|
|
value: number | MarketState;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'voice-scripts';
|
|
value: number | VoiceScript;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'voice-submissions';
|
|
value: number | VoiceSubmission;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'tickets';
|
|
value: number | Ticket;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'ticket-votes';
|
|
value: number | TicketVote;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'wiki-pages';
|
|
value: number | WikiPage;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'wiki-revisions';
|
|
value: number | WikiRevision;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'wiki-templates';
|
|
value: number | WikiTemplate;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'projects';
|
|
value: number | Project;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'sprints';
|
|
value: number | Sprint;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'releases';
|
|
value: number | Release;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'labels';
|
|
value: number | Label;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'maps';
|
|
value: number | Map;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'narrative-events';
|
|
value: number | NarrativeEvent;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'story-beats';
|
|
value: number | StoryBeat;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'story-beat-states';
|
|
value: number | StoryBeatState;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'mission-files';
|
|
value: number | MissionFile;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'mod-lists';
|
|
value: number | ModList;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'game-servers';
|
|
value: number | GameServer;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'arma-sync-events';
|
|
value: number | ArmaSyncEvent;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'arma-commands';
|
|
value: number | ArmaCommand;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'plugin-ai-instructions';
|
|
value: number | PluginAiInstruction;
|
|
} | null)
|
|
| ({
|
|
relationTo: 'payload-mcp-api-keys';
|
|
value: number | PayloadMcpApiKey;
|
|
} | null);
|
|
globalSlug?: string | null;
|
|
user:
|
|
| {
|
|
relationTo: 'users';
|
|
value: number | User;
|
|
}
|
|
| {
|
|
relationTo: 'payload-mcp-api-keys';
|
|
value: number | PayloadMcpApiKey;
|
|
};
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "payload-preferences".
|
|
*/
|
|
export interface PayloadPreference {
|
|
id: number;
|
|
user:
|
|
| {
|
|
relationTo: 'users';
|
|
value: number | User;
|
|
}
|
|
| {
|
|
relationTo: 'payload-mcp-api-keys';
|
|
value: number | PayloadMcpApiKey;
|
|
};
|
|
key?: string | null;
|
|
value?:
|
|
| {
|
|
[k: string]: unknown;
|
|
}
|
|
| unknown[]
|
|
| string
|
|
| number
|
|
| boolean
|
|
| null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "payload-migrations".
|
|
*/
|
|
export interface PayloadMigration {
|
|
id: number;
|
|
name?: string | null;
|
|
batch?: number | null;
|
|
updatedAt: string;
|
|
createdAt: string;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "media_select".
|
|
*/
|
|
export interface MediaSelect<T extends boolean = true> {
|
|
alt?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
url?: T;
|
|
thumbnailURL?: T;
|
|
filename?: T;
|
|
mimeType?: T;
|
|
filesize?: T;
|
|
width?: T;
|
|
height?: T;
|
|
focalX?: T;
|
|
focalY?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "game-hard-resources_select".
|
|
*/
|
|
export interface GameHardResourcesSelect<T extends boolean = true> {
|
|
name?: T;
|
|
amount?: T;
|
|
description?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "game-structures_select".
|
|
*/
|
|
export interface GameStructuresSelect<T extends boolean = true> {
|
|
name?: T;
|
|
type?: T;
|
|
faction?: T;
|
|
maintenanceCost?: T;
|
|
laborRequirements?:
|
|
| T
|
|
| {
|
|
classification?: T;
|
|
requiredHeadcount?: T;
|
|
maxHeadcount?: T;
|
|
enforcedSalary?: T;
|
|
id?: T;
|
|
};
|
|
staffPositions?:
|
|
| T
|
|
| {
|
|
positionType?: T;
|
|
max?: T;
|
|
enforcedSalary?: T;
|
|
id?: T;
|
|
};
|
|
coordinates?: T;
|
|
storedResources?:
|
|
| T
|
|
| {
|
|
resource?: T;
|
|
amount?: T;
|
|
gridX?: T;
|
|
gridY?: T;
|
|
rotated?: T;
|
|
id?: T;
|
|
};
|
|
voidStorage?:
|
|
| T
|
|
| {
|
|
resource?: T;
|
|
amount?: T;
|
|
gridX?: T;
|
|
gridY?: T;
|
|
rotated?: T;
|
|
id?: T;
|
|
};
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "game-vehicles_select".
|
|
*/
|
|
export interface GameVehiclesSelect<T extends boolean = true> {
|
|
name?: T;
|
|
type?: T;
|
|
deployedAt?: T;
|
|
faction?: T;
|
|
status?: T;
|
|
currentFuel?: T;
|
|
currentHealth?: T;
|
|
storedResources?:
|
|
| T
|
|
| {
|
|
resource?: T;
|
|
amount?: T;
|
|
gridX?: T;
|
|
gridY?: T;
|
|
rotated?: T;
|
|
id?: T;
|
|
};
|
|
voidStorage?:
|
|
| T
|
|
| {
|
|
resource?: T;
|
|
amount?: T;
|
|
gridX?: T;
|
|
gridY?: T;
|
|
rotated?: T;
|
|
id?: T;
|
|
};
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "game-npcs_select".
|
|
*/
|
|
export interface GameNpcsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
occupation?: T;
|
|
location?: T;
|
|
faction?: T;
|
|
bio?: T;
|
|
isGenerated?: T;
|
|
isInGame?: T;
|
|
vendor?:
|
|
| T
|
|
| {
|
|
enabled?: T;
|
|
priceModifier?: T;
|
|
sells?: T;
|
|
};
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "npc-staffing_select".
|
|
*/
|
|
export interface NpcStaffingSelect<T extends boolean = true> {
|
|
npc?: T;
|
|
structure?: T;
|
|
positionType?: T;
|
|
positionTitle?: T;
|
|
headcount?: T;
|
|
laborClassification?: T;
|
|
salary?: T;
|
|
status?: T;
|
|
hiredAt?: T;
|
|
terminatedAt?: T;
|
|
notes?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "labor-classifications_select".
|
|
*/
|
|
export interface LaborClassificationsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
key?: T;
|
|
defaultUnitSalary?: T;
|
|
description?: T;
|
|
availableHeadcount?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "game-event-logs_select".
|
|
*/
|
|
export interface GameEventLogsSelect<T extends boolean = true> {
|
|
system?: T;
|
|
timestamp?: T;
|
|
type?: T;
|
|
message?: T;
|
|
actor?: T;
|
|
structure?: T;
|
|
targetCollection?: T;
|
|
targetId?: T;
|
|
data?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "users_select".
|
|
*/
|
|
export interface UsersSelect<T extends boolean = true> {
|
|
discordUsername?: T;
|
|
discordId?: T;
|
|
displayName?: T;
|
|
payloadDisplayName?: T;
|
|
steamId?: T;
|
|
roles?: T;
|
|
roleDocs?: T;
|
|
preferences?:
|
|
| T
|
|
| {
|
|
notifications?:
|
|
| T
|
|
| {
|
|
mutedAll?: T;
|
|
mutedTypes?: T;
|
|
};
|
|
display?:
|
|
| T
|
|
| {
|
|
showCallsign?: T;
|
|
leadOrActual?: T;
|
|
showVersionOverlay?: T;
|
|
xpDisplayMini?: T;
|
|
showBackgroundTexture?: T;
|
|
};
|
|
discord?:
|
|
| T
|
|
| {
|
|
enabled?: T;
|
|
mutedTypes?: T;
|
|
};
|
|
};
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
email?: T;
|
|
username?: T;
|
|
resetPasswordToken?: T;
|
|
resetPasswordExpiration?: T;
|
|
salt?: T;
|
|
hash?: T;
|
|
loginAttempts?: T;
|
|
lockUntil?: T;
|
|
sessions?:
|
|
| T
|
|
| {
|
|
id?: T;
|
|
createdAt?: T;
|
|
expiresAt?: T;
|
|
};
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "roles_select".
|
|
*/
|
|
export interface RolesSelect<T extends boolean = true> {
|
|
name?: T;
|
|
slug?: T;
|
|
description?: T;
|
|
permissions?: T;
|
|
parentRoles?: T;
|
|
isSystem?: T;
|
|
isSuperuser?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "ranks_select".
|
|
*/
|
|
export interface RanksSelect<T extends boolean = true> {
|
|
_order?: T;
|
|
name?: T;
|
|
abbreviation?: T;
|
|
description?: T;
|
|
insignia?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "profiles_select".
|
|
*/
|
|
export interface ProfilesSelect<T extends boolean = true> {
|
|
user?: T;
|
|
rank?: T;
|
|
profileTitle?: T;
|
|
dossier?:
|
|
| T
|
|
| {
|
|
enlistmentDate?: T;
|
|
personalExcerpt?: T;
|
|
intelExcerpt?: T;
|
|
};
|
|
progression?:
|
|
| T
|
|
| {
|
|
xp?: T;
|
|
awards?:
|
|
| T
|
|
| {
|
|
award?: T;
|
|
awardedBy?: T;
|
|
awardedAt?: T;
|
|
awardReason?: T;
|
|
id?: T;
|
|
};
|
|
qualifications?: T;
|
|
scoreboard?:
|
|
| T
|
|
| {
|
|
infantryKills?: T;
|
|
vehicleKills?: T;
|
|
armorKills?: T;
|
|
airKills?: T;
|
|
deaths?: T;
|
|
};
|
|
minigames?:
|
|
| T
|
|
| {
|
|
flappyBird?:
|
|
| T
|
|
| {
|
|
gamesPlayed?: T;
|
|
totalPasses?: T;
|
|
bestScore?: T;
|
|
xpEarned?: T;
|
|
};
|
|
eodMinesweeper?:
|
|
| T
|
|
| {
|
|
gamesPlayed?: T;
|
|
wins?: T;
|
|
losses?: T;
|
|
bestScore?: T;
|
|
xpEarned?: T;
|
|
bestTrainingTime?: T;
|
|
bestPerimeterTime?: T;
|
|
bestSupplyRoadTime?: T;
|
|
bestTrainingFlags?: T;
|
|
bestPerimeterFlags?: T;
|
|
bestSupplyRoadFlags?: T;
|
|
};
|
|
radioTraffic?:
|
|
| T
|
|
| {
|
|
gamesPlayed?: T;
|
|
totalMessages?: T;
|
|
incorrectMessages?: T;
|
|
bestScore?: T;
|
|
bestAccuracy?: T;
|
|
bestSprintTimeMs?: T;
|
|
sprintGamesPlayed?: T;
|
|
sprintTotalMessages?: T;
|
|
sprintIncorrectMessages?: T;
|
|
sprintBestScore?: T;
|
|
sprintBestAccuracy?: T;
|
|
watchGamesPlayed?: T;
|
|
watchTotalMessages?: T;
|
|
watchIncorrectMessages?: T;
|
|
watchBestScore?: T;
|
|
watchBestAccuracy?: T;
|
|
xpEarned?: T;
|
|
};
|
|
aimTrainer?:
|
|
| T
|
|
| {
|
|
gamesPlayed?: T;
|
|
bestScore?: T;
|
|
recruitBestScore?: T;
|
|
veteranBestScore?: T;
|
|
eliteBestScore?: T;
|
|
recruitBestAccuracy?: T;
|
|
veteranBestAccuracy?: T;
|
|
eliteBestAccuracy?: T;
|
|
xpEarned?: T;
|
|
};
|
|
opordRecall?:
|
|
| T
|
|
| {
|
|
gamesPlayed?: T;
|
|
bestScore?: T;
|
|
bestAccuracy?: T;
|
|
recruitBestScore?: T;
|
|
veteranBestScore?: T;
|
|
eliteBestScore?: T;
|
|
xpEarned?: T;
|
|
};
|
|
};
|
|
voiceover?:
|
|
| T
|
|
| {
|
|
xpEarned?: T;
|
|
};
|
|
};
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "awards_select".
|
|
*/
|
|
export interface AwardsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
description?: T;
|
|
type?: T;
|
|
commendationColor?: T;
|
|
image?: T;
|
|
experiencePoints?: T;
|
|
ribbonDesign?: T;
|
|
backgroundImage?: T;
|
|
medalDesign?: T;
|
|
grantConfig?:
|
|
| T
|
|
| {
|
|
allowedGrantorAssignmentTypes?: T;
|
|
maxGrantsPerGrantor?: T;
|
|
recipientScope?: T;
|
|
eligibleRecipientAssignments?: T;
|
|
};
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "qualifications_select".
|
|
*/
|
|
export interface QualificationsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "assignments_select".
|
|
*/
|
|
export interface AssignmentsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
type?: T;
|
|
callsign?: T;
|
|
description?: T;
|
|
leader?: T;
|
|
commandElement?: T;
|
|
subAssignments?: T;
|
|
members?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "assignment-transfers_select".
|
|
*/
|
|
export interface AssignmentTransfersSelect<T extends boolean = true> {
|
|
requester?: T;
|
|
fromAssignment?: T;
|
|
toAssignment?: T;
|
|
status?: T;
|
|
escalationReason?: T;
|
|
fromLeaderDecision?: T;
|
|
toLeaderDecision?: T;
|
|
fromDecisionBy?: T;
|
|
toDecisionBy?: T;
|
|
fromDecidedAt?: T;
|
|
toDecidedAt?: T;
|
|
fromLeaderSnapshot?: T;
|
|
toLeaderSnapshot?: T;
|
|
rejectionReason?: T;
|
|
requestNote?: T;
|
|
appealNote?: T;
|
|
resolvedBy?: T;
|
|
resolutionNote?: T;
|
|
resolvedAt?: T;
|
|
discordFromLeaderMessageId?: T;
|
|
discordToLeaderMessageId?: T;
|
|
discordRequesterMessageId?: T;
|
|
sourceNotifiedToUserId?: T;
|
|
destinationNotifiedToUserId?: T;
|
|
discordDeliveredKeys?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "experience_select".
|
|
*/
|
|
export interface ExperienceSelect<T extends boolean = true> {
|
|
name?: T;
|
|
requiredPoints?: T;
|
|
description?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "user-notifications_select".
|
|
*/
|
|
export interface UserNotificationsSelect<T extends boolean = true> {
|
|
user?: T;
|
|
type?: T;
|
|
title?: T;
|
|
message?: T;
|
|
link?: T;
|
|
read?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "evaluations_select".
|
|
*/
|
|
export interface EvaluationsSelect<T extends boolean = true> {
|
|
rater?: T;
|
|
ratee?: T;
|
|
mission?: T;
|
|
kind?: T;
|
|
level?: T;
|
|
comment?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "missions_select".
|
|
*/
|
|
export interface MissionsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
codeName?: T;
|
|
summary?: T;
|
|
operationType?: T;
|
|
discordMessageId?: T;
|
|
discordAttendanceHash?: T;
|
|
discordAttendanceSentAt?: T;
|
|
discordModlistHash?: T;
|
|
evaluationRemindersSentAt?: T;
|
|
readyReminderWebSentAt?: T;
|
|
readyReminderDmSentAt?: T;
|
|
createdBy?: T;
|
|
coverImage?: T;
|
|
classification?:
|
|
| T
|
|
| {
|
|
map?: T;
|
|
missionType?: T;
|
|
campaign?: T;
|
|
customScripts?: T;
|
|
startDateTime?: T;
|
|
estimatedDuration?: T;
|
|
};
|
|
ownershipAndStatus?:
|
|
| T
|
|
| {
|
|
authors?: T;
|
|
zeus?: T;
|
|
status?: T;
|
|
visibility?: T;
|
|
completedAt?: T;
|
|
};
|
|
missionRoles?:
|
|
| T
|
|
| {
|
|
maxPlayers?: T;
|
|
providedRoles?:
|
|
| T
|
|
| {
|
|
roleName?: T;
|
|
missionCritical?: T;
|
|
requiredMos?: T;
|
|
minimumRank?: T;
|
|
id?: T;
|
|
};
|
|
notes?: T;
|
|
};
|
|
briefing?:
|
|
| T
|
|
| {
|
|
sectionName?: T;
|
|
details?: T;
|
|
id?: T;
|
|
};
|
|
missionObjectives?:
|
|
| T
|
|
| {
|
|
title?: T;
|
|
description?: T;
|
|
missionCritical?: T;
|
|
successOrFailConditions?: T;
|
|
redacted?: T;
|
|
id?: T;
|
|
};
|
|
civilianPresence?: T;
|
|
factionsInvolved?:
|
|
| T
|
|
| {
|
|
faction?: T;
|
|
threatLevel?: T;
|
|
id?: T;
|
|
};
|
|
gameDetails?:
|
|
| T
|
|
| {
|
|
serverDetails?:
|
|
| T
|
|
| {
|
|
serverIp?: T;
|
|
serverPort?: T;
|
|
serverPassword?: T;
|
|
};
|
|
gameSetup?:
|
|
| T
|
|
| {
|
|
missionFile?: T;
|
|
requiredMods?: T;
|
|
};
|
|
};
|
|
logisticsAndSupport?:
|
|
| T
|
|
| {
|
|
insertion?: T;
|
|
extraction?: T;
|
|
assetsAvailable?:
|
|
| T
|
|
| {
|
|
assetType?: T;
|
|
assetCount?: T;
|
|
doesRespawn?: T;
|
|
assetCallsign?: T;
|
|
id?: T;
|
|
};
|
|
};
|
|
commsAndDocs?:
|
|
| T
|
|
| {
|
|
radioPlan?: T;
|
|
frequencies?:
|
|
| T
|
|
| {
|
|
frequency?: T;
|
|
channel?: T;
|
|
netName?: T;
|
|
freqUsage?: T;
|
|
id?: T;
|
|
};
|
|
};
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "mission-attendances_select".
|
|
*/
|
|
export interface MissionAttendancesSelect<T extends boolean = true> {
|
|
mission?: T;
|
|
user?: T;
|
|
response?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "campaigns_select".
|
|
*/
|
|
export interface CampaignsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
summary?: T;
|
|
status?: T;
|
|
campaignMode?: T;
|
|
description?: T;
|
|
startDate?: T;
|
|
endDate?: T;
|
|
coverImage?: T;
|
|
owner?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "factions_select".
|
|
*/
|
|
export interface FactionsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
type?: T;
|
|
description?: T;
|
|
reputation?: T;
|
|
relationships?:
|
|
| T
|
|
| {
|
|
targetFaction?: T;
|
|
value?: T;
|
|
notes?: T;
|
|
id?: T;
|
|
};
|
|
playableFaction?: T;
|
|
startingFaction?: T;
|
|
associatedCampaigns?: T;
|
|
coverImage?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "technologies_select".
|
|
*/
|
|
export interface TechnologiesSelect<T extends boolean = true> {
|
|
name?: T;
|
|
approvalStatus?: T;
|
|
type?: T;
|
|
summary?: T;
|
|
description?: T;
|
|
requirements?:
|
|
| T
|
|
| {
|
|
prerequisiteTechnologies?:
|
|
| T
|
|
| {
|
|
requiresAnd?:
|
|
| T
|
|
| {
|
|
technology?: T;
|
|
};
|
|
requiresOr?:
|
|
| T
|
|
| {
|
|
technology?: T;
|
|
};
|
|
id?: T;
|
|
};
|
|
};
|
|
researchCosts?:
|
|
| T
|
|
| {
|
|
resources?:
|
|
| T
|
|
| {
|
|
resource?: T;
|
|
amount?: T;
|
|
id?: T;
|
|
};
|
|
minimumResearchDuration?: T;
|
|
maximumResearchDuration?: T;
|
|
};
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "assets_select".
|
|
*/
|
|
export interface AssetsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
approvalStatus?: T;
|
|
className?: T;
|
|
assetType?: T;
|
|
'Weapon Configuration'?:
|
|
| T
|
|
| {
|
|
slotType?: T;
|
|
compatibleMagazines?: T;
|
|
compatibleAttachments?: T;
|
|
};
|
|
'Nightvision Configuration'?:
|
|
| T
|
|
| {
|
|
nvgGeneration?: T;
|
|
nvgHasThermals?: T;
|
|
};
|
|
'Container Configuration'?:
|
|
| T
|
|
| {
|
|
capacityKg?: T;
|
|
weightKg?: T;
|
|
};
|
|
'Skin Configuration'?:
|
|
| T
|
|
| {
|
|
appliesToAssetTypes?: T;
|
|
};
|
|
'Magazine Configuration'?:
|
|
| T
|
|
| {
|
|
roundCapacity?: T;
|
|
ammoType?: T;
|
|
greenmagCompatible?: T;
|
|
};
|
|
'Asset Metadata'?:
|
|
| T
|
|
| {
|
|
mod?: T;
|
|
thumbnail?: T;
|
|
gameDescription?: T;
|
|
};
|
|
tradeable?: T;
|
|
marketTrading?:
|
|
| T
|
|
| {
|
|
Rarity?: T;
|
|
perceivedValue?:
|
|
| T
|
|
| {
|
|
baseBuyPrice?: T;
|
|
baseSellPrice?: T;
|
|
};
|
|
};
|
|
economy?:
|
|
| T
|
|
| {
|
|
enabled?: T;
|
|
baselineSupply?: T;
|
|
baselineDemand?: T;
|
|
maxModifier?: T;
|
|
};
|
|
crafting?:
|
|
| T
|
|
| {
|
|
craftable?: T;
|
|
blueprintRequired?: T;
|
|
technologyRequired?: T;
|
|
technologyRequiredToUse?: T;
|
|
craftingData?:
|
|
| T
|
|
| {
|
|
inputs?:
|
|
| T
|
|
| {
|
|
resource?: T;
|
|
quantity?: T;
|
|
lended?: T;
|
|
id?: T;
|
|
};
|
|
requiresStructure?: T;
|
|
craftingTimePerUnit?: T;
|
|
byproducts?:
|
|
| T
|
|
| {
|
|
resource?: T;
|
|
quantity?: T;
|
|
id?: T;
|
|
};
|
|
batchSize?: T;
|
|
};
|
|
};
|
|
storageDimensions?:
|
|
| T
|
|
| {
|
|
gridWidth?: T;
|
|
gridHeight?: T;
|
|
stackable?: T;
|
|
maxStackSize?: T;
|
|
rotatable?: T;
|
|
};
|
|
relatedAssets?: T;
|
|
isLive?: T;
|
|
notes?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "resources_select".
|
|
*/
|
|
export interface ResourcesSelect<T extends boolean = true> {
|
|
showWarning?: T;
|
|
name?: T;
|
|
codeName?: T;
|
|
approvalStatus?: T;
|
|
type?: T;
|
|
description?: T;
|
|
icon?: T;
|
|
color?: T;
|
|
baseValue?: T;
|
|
tradeable?: T;
|
|
rarity?: T;
|
|
economy?:
|
|
| T
|
|
| {
|
|
enabled?: T;
|
|
baselineSupply?: T;
|
|
baselineDemand?: T;
|
|
maxModifier?: T;
|
|
};
|
|
unitOfMeasure?: T;
|
|
massPerUnit?: T;
|
|
stackSize?: T;
|
|
gridWidth?: T;
|
|
gridHeight?: T;
|
|
stackable?: T;
|
|
maxStackSize?: T;
|
|
rotatable?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "vehicles_select".
|
|
*/
|
|
export interface VehiclesSelect<T extends boolean = true> {
|
|
name?: T;
|
|
classname?: T;
|
|
approvalStatus?: T;
|
|
description?: T;
|
|
image?: T;
|
|
category?: T;
|
|
fuel?:
|
|
| T
|
|
| {
|
|
fuelType?: T;
|
|
fuelCapacity?: T;
|
|
fuelConsumptionRate?: T;
|
|
};
|
|
materials?:
|
|
| T
|
|
| {
|
|
resource?: T;
|
|
amount?: T;
|
|
id?: T;
|
|
};
|
|
constructionTime?: T;
|
|
requiredTech?: T;
|
|
requiredStructure?: T;
|
|
scrapReturns?:
|
|
| T
|
|
| {
|
|
resource?: T;
|
|
amount?: T;
|
|
chance?: T;
|
|
id?: T;
|
|
};
|
|
upkeepCosts?:
|
|
| T
|
|
| {
|
|
resource?: T;
|
|
amount?: T;
|
|
id?: T;
|
|
};
|
|
width?: T;
|
|
height?: T;
|
|
maxMass?: T;
|
|
aceCargoSlots?: T;
|
|
allowedVirtualCargo?:
|
|
| T
|
|
| {
|
|
item?: T;
|
|
amount?: T;
|
|
id?: T;
|
|
};
|
|
maxHealth?: T;
|
|
armorRating?: T;
|
|
maxSpeedOnRoad?: T;
|
|
maxSpeedOffRoad?: T;
|
|
maxAirspeed?: T;
|
|
maxKnots?: T;
|
|
pylons?:
|
|
| T
|
|
| {
|
|
pylonName?: T;
|
|
pylonType?: T;
|
|
amount?: T;
|
|
ammoType?: T;
|
|
id?: T;
|
|
};
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "structures_select".
|
|
*/
|
|
export interface StructuresSelect<T extends boolean = true> {
|
|
name?: T;
|
|
codeName?: T;
|
|
approvalStatus?: T;
|
|
description?: T;
|
|
image?: T;
|
|
category?: T;
|
|
materials?:
|
|
| T
|
|
| {
|
|
resource?: T;
|
|
amount?: T;
|
|
id?: T;
|
|
};
|
|
constructionTime?: T;
|
|
requiredTech?: T;
|
|
requiresUpgrade?: T;
|
|
upgradesInto?: T;
|
|
upgradeCostMultiplier?: T;
|
|
terrainType?: T;
|
|
resourcesInRange?:
|
|
| T
|
|
| {
|
|
resource?: T;
|
|
range?: T;
|
|
id?: T;
|
|
};
|
|
structuresInRange?:
|
|
| T
|
|
| {
|
|
structure?: T;
|
|
range?: T;
|
|
id?: T;
|
|
};
|
|
upkeep?:
|
|
| T
|
|
| {
|
|
resource?: T;
|
|
amount?: T;
|
|
id?: T;
|
|
};
|
|
sellPrice?: T;
|
|
maintenanceCost?: T;
|
|
laborRequirements?:
|
|
| T
|
|
| {
|
|
classification?: T;
|
|
requiredHeadcount?: T;
|
|
maxHeadcount?: T;
|
|
enforcedSalary?: T;
|
|
id?: T;
|
|
};
|
|
staffPositions?:
|
|
| T
|
|
| {
|
|
positionType?: T;
|
|
max?: T;
|
|
enforcedSalary?: T;
|
|
id?: T;
|
|
};
|
|
functionType?: T;
|
|
canProduce?: T;
|
|
autoGeneratedResources?:
|
|
| T
|
|
| {
|
|
resource?: T;
|
|
minAmount?: T;
|
|
maxAmount?: T;
|
|
minFrequency?: T;
|
|
maxFrequency?: T;
|
|
produceChance?: T;
|
|
id?: T;
|
|
};
|
|
maxCapacityMass?: T;
|
|
restrictToAllowed?: T;
|
|
xSize?: T;
|
|
ySize?: T;
|
|
allowedStorage?:
|
|
| T
|
|
| {
|
|
item?: T;
|
|
amount?: T;
|
|
id?: T;
|
|
};
|
|
prohibitedStorage?:
|
|
| T
|
|
| {
|
|
item?: T;
|
|
id?: T;
|
|
};
|
|
maxHealth?: T;
|
|
repairSpeed?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "shipments_select".
|
|
*/
|
|
export interface ShipmentsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
origin?: T;
|
|
destination?: T;
|
|
transportVehicle?: T;
|
|
distance?: T;
|
|
cargo?:
|
|
| T
|
|
| {
|
|
item?: T;
|
|
amount?: T;
|
|
id?: T;
|
|
};
|
|
fuelCost?: T;
|
|
fuelConsumed?: T;
|
|
status?: T;
|
|
dispatchedAt?: T;
|
|
estimatedArrival?: T;
|
|
completedAt?: T;
|
|
autoReturn?: T;
|
|
createdBy?: T;
|
|
failureReason?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "bank-accounts_select".
|
|
*/
|
|
export interface BankAccountsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
accountType?: T;
|
|
ownerFaction?: T;
|
|
ownerUser?: T;
|
|
currency?: T;
|
|
balance?: T;
|
|
status?: T;
|
|
createdAt?: T;
|
|
updatedAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "bank-transactions_select".
|
|
*/
|
|
export interface BankTransactionsSelect<T extends boolean = true> {
|
|
transactionNumber?: T;
|
|
type?: T;
|
|
fromAccount?: T;
|
|
toAccount?: T;
|
|
amount?: T;
|
|
fee?: T;
|
|
memo?: T;
|
|
actor?: T;
|
|
status?: T;
|
|
reference?: T;
|
|
timestamp?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "ledger-entries_select".
|
|
*/
|
|
export interface LedgerEntriesSelect<T extends boolean = true> {
|
|
account?: T;
|
|
transaction?: T;
|
|
type?: T;
|
|
amount?: T;
|
|
balanceAfter?: T;
|
|
memo?: T;
|
|
timestamp?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "locker-storages_select".
|
|
*/
|
|
export interface LockerStoragesSelect<T extends boolean = true> {
|
|
name?: T;
|
|
ownerUser?: T;
|
|
items?:
|
|
| T
|
|
| {
|
|
asset?: T;
|
|
quantity?: T;
|
|
gridX?: T;
|
|
gridY?: T;
|
|
rotated?: T;
|
|
equipment?:
|
|
| T
|
|
| {
|
|
attachments?:
|
|
| T
|
|
| {
|
|
asset?: T;
|
|
id?: T;
|
|
};
|
|
skin?: T;
|
|
customName?: T;
|
|
};
|
|
id?: T;
|
|
};
|
|
itemCount?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "loadouts_select".
|
|
*/
|
|
export interface LoadoutsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
description?: T;
|
|
ownerUser?: T;
|
|
equipped?: T;
|
|
slots?:
|
|
| T
|
|
| {
|
|
primary?: T;
|
|
secondary?: T;
|
|
launcher?: T;
|
|
uniform?: T;
|
|
vest?: T;
|
|
backpack?: T;
|
|
helmet?: T;
|
|
facewear?: T;
|
|
nvg?: T;
|
|
radio?: T;
|
|
optic?: T;
|
|
muzzle?: T;
|
|
bipod?: T;
|
|
};
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "market-listings_select".
|
|
*/
|
|
export interface MarketListingsSelect<T extends boolean = true> {
|
|
asset?: T;
|
|
seller?: T;
|
|
npc?: T;
|
|
quantity?: T;
|
|
price?: T;
|
|
desiredPrice?: T;
|
|
minPrice?: T;
|
|
currency?: T;
|
|
status?: T;
|
|
isAutoGenerated?: T;
|
|
listedAt?: T;
|
|
expiresAt?: T;
|
|
soldAt?: T;
|
|
buyer?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "market-negotiations_select".
|
|
*/
|
|
export interface MarketNegotiationsSelect<T extends boolean = true> {
|
|
listing?: T;
|
|
buyer?: T;
|
|
status?: T;
|
|
patience?: T;
|
|
quantity?: T;
|
|
amount?: T;
|
|
proposedBy?: T;
|
|
acceptedPrice?: T;
|
|
history?:
|
|
| T
|
|
| {
|
|
amount?: T;
|
|
from?: T;
|
|
note?: T;
|
|
at?: T;
|
|
id?: T;
|
|
};
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "market-state_select".
|
|
*/
|
|
export interface MarketStateSelect<T extends boolean = true> {
|
|
itemType?: T;
|
|
itemId?: T;
|
|
gmBaselineSupply?: T;
|
|
gmBaselineDemand?: T;
|
|
currentSupply?: T;
|
|
artificialDemand?: T;
|
|
realDemand?: T;
|
|
priceModifier?: T;
|
|
lastComputedAt?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "voice-scripts_select".
|
|
*/
|
|
export interface VoiceScriptsSelect<T extends boolean = true> {
|
|
title?: T;
|
|
description?: T;
|
|
script?: T;
|
|
xpAmount?: T;
|
|
spoiler?: T;
|
|
status?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "voice-submissions_select".
|
|
*/
|
|
export interface VoiceSubmissionsSelect<T extends boolean = true> {
|
|
script?: T;
|
|
user?: T;
|
|
description?: T;
|
|
status?: T;
|
|
reviewNote?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
url?: T;
|
|
thumbnailURL?: T;
|
|
filename?: T;
|
|
mimeType?: T;
|
|
filesize?: T;
|
|
width?: T;
|
|
height?: T;
|
|
focalX?: T;
|
|
focalY?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "tickets_select".
|
|
*/
|
|
export interface TicketsSelect<T extends boolean = true> {
|
|
title?: T;
|
|
description?: T;
|
|
category?: T;
|
|
priority?: T;
|
|
status?: T;
|
|
reporter?: T;
|
|
assignee?: T;
|
|
activity?:
|
|
| T
|
|
| {
|
|
type?: T;
|
|
content?: T;
|
|
author?: T;
|
|
created_at?: T;
|
|
id?: T;
|
|
};
|
|
editHistory?:
|
|
| T
|
|
| {
|
|
before?: T;
|
|
after?: T;
|
|
editedBy?: T;
|
|
editedAt?: T;
|
|
id?: T;
|
|
};
|
|
closedAt?: T;
|
|
project?: T;
|
|
sprint?: T;
|
|
release?: T;
|
|
parentTicket?: T;
|
|
labels?: T;
|
|
type?: T;
|
|
storyPoints?: T;
|
|
estimate?: T;
|
|
startDate?: T;
|
|
dueDate?: T;
|
|
resolution?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "ticket-votes_select".
|
|
*/
|
|
export interface TicketVotesSelect<T extends boolean = true> {
|
|
ticket?: T;
|
|
user?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "wiki-pages_select".
|
|
*/
|
|
export interface WikiPagesSelect<T extends boolean = true> {
|
|
title?: T;
|
|
slug?: T;
|
|
category?: T;
|
|
tags?: T;
|
|
body?: T;
|
|
lockdown?: T;
|
|
lockedBy?: T;
|
|
lockedAt?: T;
|
|
lastEditor?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "wiki-revisions_select".
|
|
*/
|
|
export interface WikiRevisionsSelect<T extends boolean = true> {
|
|
page?: T;
|
|
revisionNumber?: T;
|
|
titleSnapshot?: T;
|
|
contentSnapshot?: T;
|
|
editor?: T;
|
|
summary?: T;
|
|
type?: T;
|
|
restoredFromRevision?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "wiki-templates_select".
|
|
*/
|
|
export interface WikiTemplatesSelect<T extends boolean = true> {
|
|
name?: T;
|
|
body?: T;
|
|
description?: T;
|
|
css?: T;
|
|
html?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "projects_select".
|
|
*/
|
|
export interface ProjectsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
key?: T;
|
|
description?: T;
|
|
lead?: T;
|
|
status?: T;
|
|
defaultAssignee?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "sprints_select".
|
|
*/
|
|
export interface SprintsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
project?: T;
|
|
goal?: T;
|
|
startDate?: T;
|
|
endDate?: T;
|
|
status?: T;
|
|
capacity?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "releases_select".
|
|
*/
|
|
export interface ReleasesSelect<T extends boolean = true> {
|
|
name?: T;
|
|
project?: T;
|
|
description?: T;
|
|
status?: T;
|
|
releaseDate?: T;
|
|
targetVersion?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "labels_select".
|
|
*/
|
|
export interface LabelsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
color?: T;
|
|
project?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "maps_select".
|
|
*/
|
|
export interface MapsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
fileName?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "narrative-events_select".
|
|
*/
|
|
export interface NarrativeEventsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
summary?: T;
|
|
flowData?: T;
|
|
triggers?:
|
|
| T
|
|
| {
|
|
type?: T;
|
|
condition?: T;
|
|
};
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "story-beats_select".
|
|
*/
|
|
export interface StoryBeatsSelect<T extends boolean = true> {
|
|
title?: T;
|
|
occurredAt?: T;
|
|
order?: T;
|
|
status?: T;
|
|
body?: T;
|
|
mission?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "story-beat-states_select".
|
|
*/
|
|
export interface StoryBeatStatesSelect<T extends boolean = true> {
|
|
user?: T;
|
|
beat?: T;
|
|
readAt?: T;
|
|
reaction?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "mission-files_select".
|
|
*/
|
|
export interface MissionFilesSelect<T extends boolean = true> {
|
|
missionFileName?: T;
|
|
author?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
url?: T;
|
|
thumbnailURL?: T;
|
|
filename?: T;
|
|
mimeType?: T;
|
|
filesize?: T;
|
|
width?: T;
|
|
height?: T;
|
|
focalX?: T;
|
|
focalY?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "mod-lists_select".
|
|
*/
|
|
export interface ModListsSelect<T extends boolean = true> {
|
|
modlistName?: T;
|
|
author?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
url?: T;
|
|
thumbnailURL?: T;
|
|
filename?: T;
|
|
mimeType?: T;
|
|
filesize?: T;
|
|
width?: T;
|
|
height?: T;
|
|
focalX?: T;
|
|
focalY?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "game-servers_select".
|
|
*/
|
|
export interface GameServersSelect<T extends boolean = true> {
|
|
serverId?: T;
|
|
name?: T;
|
|
status?: T;
|
|
lastSeenAt?: T;
|
|
metadata?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "arma-sync-events_select".
|
|
*/
|
|
export interface ArmaSyncEventsSelect<T extends boolean = true> {
|
|
eventId?: T;
|
|
server?: T;
|
|
type?: T;
|
|
occurredAt?: T;
|
|
payload?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "arma-commands_select".
|
|
*/
|
|
export interface ArmaCommandsSelect<T extends boolean = true> {
|
|
commandId?: T;
|
|
server?: T;
|
|
type?: T;
|
|
payload?: T;
|
|
status?: T;
|
|
result?: T;
|
|
error?: T;
|
|
deliveredAt?: T;
|
|
completedAt?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "plugin-ai-instructions_select".
|
|
*/
|
|
export interface PluginAiInstructionsSelect<T extends boolean = true> {
|
|
'schema-path'?: T;
|
|
'field-type'?: T;
|
|
'relation-to'?: T;
|
|
'model-id'?: T;
|
|
disabled?: T;
|
|
prompt?: T;
|
|
images?:
|
|
| T
|
|
| {
|
|
image?: T;
|
|
id?: T;
|
|
};
|
|
system?: T;
|
|
layout?: T;
|
|
'unsloth-text-settings'?:
|
|
| T
|
|
| {
|
|
model?: T;
|
|
};
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "payload-mcp-api-keys_select".
|
|
*/
|
|
export interface PayloadMcpApiKeysSelect<T extends boolean = true> {
|
|
user?: T;
|
|
label?: T;
|
|
description?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
enableAPIKey?: T;
|
|
apiKey?: T;
|
|
apiKeyIndex?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "payload-kv_select".
|
|
*/
|
|
export interface PayloadKvSelect<T extends boolean = true> {
|
|
key?: T;
|
|
data?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "payload-locked-documents_select".
|
|
*/
|
|
export interface PayloadLockedDocumentsSelect<T extends boolean = true> {
|
|
document?: T;
|
|
globalSlug?: T;
|
|
user?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "payload-preferences_select".
|
|
*/
|
|
export interface PayloadPreferencesSelect<T extends boolean = true> {
|
|
user?: T;
|
|
key?: T;
|
|
value?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "payload-migrations_select".
|
|
*/
|
|
export interface PayloadMigrationsSelect<T extends boolean = true> {
|
|
name?: T;
|
|
batch?: T;
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "game-rules".
|
|
*/
|
|
export interface GameRule {
|
|
id: number;
|
|
/**
|
|
* The base currency ("gold standard") used by all factions to pay for goods and services.
|
|
*/
|
|
mainCurrency: number | Resource;
|
|
/**
|
|
* General display name for the currency, e.g. "credit". Used when singular or plural names are not set.
|
|
*/
|
|
currencyName?: string | null;
|
|
/**
|
|
* Optional symbol prefixed to amounts, e.g. "¢" or "$".
|
|
*/
|
|
currencySymbol?: string | null;
|
|
/**
|
|
* Singular amount label, e.g. "credit".
|
|
*/
|
|
currencySingular?: string | null;
|
|
/**
|
|
* Plural amount label, e.g. "credits".
|
|
*/
|
|
currencyPlural?: string | null;
|
|
/**
|
|
* Optional subunit name for future fractional displays, e.g. "cent". This does not affect stored values.
|
|
*/
|
|
currencyDenomination?: string | null;
|
|
/**
|
|
* Assignment(s) considered unit command. Members and leaders of these assignments get elevated access to draft missions and other restricted content.
|
|
*/
|
|
commandAssignments?: (number | Assignment)[] | null;
|
|
/**
|
|
* Assignment(s) considered the intelligence division. Members and leaders of these assignments get elevated access to draft missions and intelligence content.
|
|
*/
|
|
intelAssignments?: (number | Assignment)[] | null;
|
|
/**
|
|
* Distance threshold for instant transfers. Structures within this distance can transfer resources instantly. Beyond this, shipments are required.
|
|
*/
|
|
proximityThreshold?: number | null;
|
|
/**
|
|
* How often the game tick runs, in minutes. This processes shipment movement, fuel consumption, and arrivals.
|
|
*/
|
|
gameTickIntervalMinutes?: number | null;
|
|
/**
|
|
* Width of each member's personal locker grid, in cells. Applies to newly provisioned lockers.
|
|
*/
|
|
lockerGridWidth?: number | null;
|
|
/**
|
|
* Height of each member's personal locker grid, in cells. Applies to newly provisioned lockers.
|
|
*/
|
|
lockerGridHeight?: number | null;
|
|
/**
|
|
* When off, logistics officers cannot hire staff anywhere (both labor crews and named NPC staff).
|
|
*/
|
|
staffHiringEnabled?: boolean | null;
|
|
/**
|
|
* Message shown to logistics officers when hiring is disabled, e.g. explaining the in-universe reason.
|
|
*/
|
|
staffHiringDisabledMessage?: string | null;
|
|
/**
|
|
* Global knobs for the supply-and-demand market simulation run by the economy tick (docs/economy/supply-demand-design.md).
|
|
*/
|
|
economy?: {
|
|
/**
|
|
* Master gate for the market economy simulation. When off, the economy tick leaves all prices at their resting values.
|
|
*/
|
|
enabled?: boolean | null;
|
|
/**
|
|
* Default price band as a fraction of base price (e.g. 0.5 = price can move ±50%). Used when an item does not set its own band.
|
|
*/
|
|
defaultPriceBand?: number | null;
|
|
/**
|
|
* How many economy ticks of completed-purchase history feed the real-demand signal.
|
|
*/
|
|
realDemandWindowTicks?: number | null;
|
|
/**
|
|
* Fraction of accumulated real demand that survives each tick (0.5 halves it every tick).
|
|
*/
|
|
realDemandDecay?: number | null;
|
|
/**
|
|
* How far the NPC (artificial) demand random walk may move per tick, as a fraction of the GM baseline.
|
|
*/
|
|
artificialDemandDrift?: number | null;
|
|
/**
|
|
* Completed purchases needed before an item's price starts moving. Until then items stay at their resting price (modifier 1).
|
|
*/
|
|
coldStartObservations?: number | null;
|
|
/**
|
|
* Suggested economy tick cadence in minutes, for cron documentation only. The tick itself is triggered externally.
|
|
*/
|
|
tickIntervalHintMinutes?: number | null;
|
|
};
|
|
updatedAt?: string | null;
|
|
createdAt?: string | null;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "shims".
|
|
*/
|
|
export interface Shim {
|
|
id: number;
|
|
shims?:
|
|
| {
|
|
/**
|
|
* Unique identifier for this shim. Used internally for stable hashing.
|
|
*/
|
|
name: string;
|
|
/**
|
|
* Brief description of what this shim does (for admin reference).
|
|
*/
|
|
summary?: string | null;
|
|
/**
|
|
* Disabled shims are never injected, regardless of targeting rules.
|
|
*/
|
|
enabled?: boolean | null;
|
|
type: 'css' | 'js';
|
|
/**
|
|
* CSS or JS code to inject. CSS is added as a <style> tag; JS is added as an inline <script>.
|
|
*/
|
|
content: string;
|
|
/**
|
|
* Who should this shim be applied to?
|
|
*/
|
|
targeting: {
|
|
audience: 'all' | 'percentage' | 'users' | 'roles';
|
|
/**
|
|
* Percentage of users (0-100) who receive this shim. Assignment is deterministic per user.
|
|
*/
|
|
percentage?: number | null;
|
|
/**
|
|
* Only these specific users will receive this shim.
|
|
*/
|
|
users?: (number | User)[] | null;
|
|
/**
|
|
* Users with any of these roles will receive this shim.
|
|
*/
|
|
roles?: ('guest' | 'user' | 'trusted' | 'admin' | 'developer')[] | null;
|
|
};
|
|
/**
|
|
* Which pages should this shim be active on?
|
|
*/
|
|
paths: {
|
|
matchType: 'all' | 'include' | 'exclude';
|
|
/**
|
|
* URL path prefixes to match. E.g. '/logistics' matches /logistics and /logistics/market. Leading slash required.
|
|
*/
|
|
paths?: string[] | null;
|
|
};
|
|
id?: string | null;
|
|
}[]
|
|
| null;
|
|
updatedAt?: string | null;
|
|
createdAt?: string | null;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "game-rules_select".
|
|
*/
|
|
export interface GameRulesSelect<T extends boolean = true> {
|
|
mainCurrency?: T;
|
|
currencyName?: T;
|
|
currencySymbol?: T;
|
|
currencySingular?: T;
|
|
currencyPlural?: T;
|
|
currencyDenomination?: T;
|
|
commandAssignments?: T;
|
|
intelAssignments?: T;
|
|
proximityThreshold?: T;
|
|
gameTickIntervalMinutes?: T;
|
|
lockerGridWidth?: T;
|
|
lockerGridHeight?: T;
|
|
staffHiringEnabled?: T;
|
|
staffHiringDisabledMessage?: T;
|
|
economy?:
|
|
| T
|
|
| {
|
|
enabled?: T;
|
|
defaultPriceBand?: T;
|
|
realDemandWindowTicks?: T;
|
|
realDemandDecay?: T;
|
|
artificialDemandDrift?: T;
|
|
coldStartObservations?: T;
|
|
tickIntervalHintMinutes?: T;
|
|
};
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
globalType?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "shims_select".
|
|
*/
|
|
export interface ShimsSelect<T extends boolean = true> {
|
|
shims?:
|
|
| T
|
|
| {
|
|
name?: T;
|
|
summary?: T;
|
|
enabled?: T;
|
|
type?: T;
|
|
content?: T;
|
|
targeting?:
|
|
| T
|
|
| {
|
|
audience?: T;
|
|
percentage?: T;
|
|
users?: T;
|
|
roles?: T;
|
|
};
|
|
paths?:
|
|
| T
|
|
| {
|
|
matchType?: T;
|
|
paths?: T;
|
|
};
|
|
id?: T;
|
|
};
|
|
updatedAt?: T;
|
|
createdAt?: T;
|
|
globalType?: T;
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "collections_widget".
|
|
*/
|
|
export interface CollectionsWidget {
|
|
data?: {
|
|
[k: string]: unknown;
|
|
};
|
|
width: 'full';
|
|
}
|
|
/**
|
|
* This interface was referenced by `Config`'s JSON-Schema
|
|
* via the `definition` "auth".
|
|
*/
|
|
export interface Auth {
|
|
[k: string]: unknown;
|
|
}
|
|
|
|
|
|
declare module 'payload' {
|
|
export interface GeneratedTypes extends Config {}
|
|
} |