diff --git a/src/payload-types.ts b/src/payload-types.ts index cb8842a..f362fed 100644 --- a/src/payload-types.ts +++ b/src/payload-types.ts @@ -73,6 +73,8 @@ export interface Config { 'game-structures': GameStructure; 'game-vehicles': GameVehicle; 'game-npcs': GameNpc; + 'npc-staffing': NpcStaffing; + 'labor-classifications': LaborClassification; 'game-event-logs': GameEventLog; users: User; roles: Role; @@ -139,6 +141,8 @@ export interface Config { 'game-structures': GameStructuresSelect | GameStructuresSelect; 'game-vehicles': GameVehiclesSelect | GameVehiclesSelect; 'game-npcs': GameNpcsSelect | GameNpcsSelect; + 'npc-staffing': NpcStaffingSelect | NpcStaffingSelect; + 'labor-classifications': LaborClassificationsSelect | LaborClassificationsSelect; 'game-event-logs': GameEventLogsSelect | GameEventLogsSelect; users: UsersSelect | UsersSelect; roles: RolesSelect | RolesSelect; @@ -312,6 +316,48 @@ export interface GameStructure { * 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 @@ -453,6 +499,48 @@ export interface Structure { * 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. */ @@ -714,6 +802,32 @@ export interface Technology { 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". @@ -1640,6 +1754,29 @@ export interface GameNpc { 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". @@ -1663,6 +1800,7 @@ export interface GameEventLog { | 'game-structures' | 'game-vehicles' | 'game-npcs' + | 'npc-staffing' | 'structures' | 'resources' | 'assets' @@ -2161,6 +2299,10 @@ export interface Mission { * When the attendance roll-call was first posted to Discord (managed by the bot). */ discordAttendanceSentAt?: string | null; + /** + * When evaluation reminder DMs were sent for this mission (managed by the bot, one-shot). + */ + evaluationRemindersSentAt?: string | null; /** * 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. */ @@ -3377,6 +3519,14 @@ export interface PayloadLockedDocument { 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; @@ -3654,6 +3804,24 @@ export interface GameStructuresSelect { 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 @@ -3735,6 +3903,38 @@ export interface GameNpcsSelect { updatedAt?: T; createdAt?: T; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "npc-staffing_select". + */ +export interface NpcStaffingSelect { + 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 { + 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". @@ -4072,6 +4272,7 @@ export interface MissionsSelect { discordMessageId?: T; discordAttendanceHash?: T; discordAttendanceSentAt?: T; + evaluationRemindersSentAt?: T; coverImage?: T; classification?: | T @@ -4527,6 +4728,24 @@ export interface StructuresSelect { 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?: @@ -5101,6 +5320,26 @@ export interface GameRule { * 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. */ @@ -5125,6 +5364,14 @@ export interface GameRule { * 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; updatedAt?: string | null; createdAt?: string | null; } @@ -5193,12 +5440,19 @@ export interface Shim { */ export interface GameRulesSelect { 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; updatedAt?: T; createdAt?: T; globalType?: T;