Files
core2026/app/game-api/src/context.ts
T

152 lines
3.2 KiB
TypeScript

import type { GameSessionTokenPayload } from '@sammo-ts/common';
import type { DatabaseClient as InfraDatabaseClient, RedisConnector } from '@sammo-ts/infra';
import type { TurnDaemonTransport } from './daemon/transport.js';
import type { BattleSimTransport } from './battleSim/transport.js';
export interface GameProfile {
id: string;
scenario: string;
name: string;
}
export interface WorldStateRow {
scenarioCode: string;
currentYear: number;
currentMonth: number;
tickSeconds: number;
config: unknown;
meta: unknown;
updatedAt: Date;
}
export interface GeneralRow {
id: number;
userId: number | null;
name: string;
nationId: number;
cityId: number;
troopId: number;
leadership: number;
strength: number;
intel: number;
experience: number;
dedication: number;
officerLevel: number;
personalCode: string;
specialCode: string;
special2Code: string;
horseCode: string;
weaponCode: string;
bookCode: string;
itemCode: string;
injury: number;
gold: number;
rice: number;
crew: number;
crewTypeId: number;
train: number;
atmos: number;
age: number;
npcState: number;
meta: unknown;
}
export interface GeneralTurnRow {
id: number;
generalId: number;
turnIdx: number;
actionCode: string;
arg: unknown;
}
export interface NationTurnRow {
id: number;
nationId: number;
officerLevel: number;
turnIdx: number;
actionCode: string;
arg: unknown;
}
export interface CityRow {
id: number;
name: string;
nationId: number;
level: number;
population: number;
populationMax: number;
agriculture: number;
agricultureMax: number;
commerce: number;
commerceMax: number;
security: number;
securityMax: number;
trust: number;
trade: number;
supplyState: number;
frontState: number;
defence: number;
defenceMax: number;
wall: number;
wallMax: number;
region: number;
meta: unknown;
}
export interface NationRow {
id: number;
name: string;
color: string;
capitalCityId: number | null;
gold: number;
rice: number;
tech: number;
level: number;
typeCode: string;
meta: unknown;
}
export interface TroopRow {
troopLeaderId: number;
nationId: number;
name: string;
}
export type DatabaseClient = InfraDatabaseClient<
WorldStateRow,
GeneralRow,
CityRow,
NationRow,
GeneralTurnRow,
NationTurnRow,
TroopRow
>;
export interface GameApiContext {
db: DatabaseClient;
redis: RedisConnector['client'];
turnDaemon: TurnDaemonTransport;
battleSim: BattleSimTransport;
profile: GameProfile;
auth: GameSessionTokenPayload | null;
}
export const createGameApiContext = (options: {
db: DatabaseClient;
redis: RedisConnector['client'];
turnDaemon: TurnDaemonTransport;
battleSim: BattleSimTransport;
profile: GameProfile;
auth: GameSessionTokenPayload | null;
}): GameApiContext => {
return {
db: options.db,
redis: options.redis,
turnDaemon: options.turnDaemon,
battleSim: options.battleSim,
profile: options.profile,
auth: options.auth,
};
};