152 lines
3.2 KiB
TypeScript
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,
|
|
};
|
|
};
|