GameLogger
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
import type { LogType } from "@/defs.js";
|
||||
|
||||
export interface IGeneralRecord {
|
||||
_id: string;
|
||||
|
||||
generalID: string;
|
||||
|
||||
logType: LogType;
|
||||
|
||||
year: number;
|
||||
month: number;
|
||||
|
||||
text: string;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
export interface IGlobalRecord {
|
||||
_id: string;
|
||||
type: 'history' | 'action';
|
||||
year: number;
|
||||
month: number;
|
||||
text: string;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
import type { NationID } from "@/defs.js";
|
||||
|
||||
export interface INationRecord {
|
||||
_id: string;
|
||||
nationID: NationID;
|
||||
year: number;
|
||||
month: number;
|
||||
text: string;
|
||||
}
|
||||
@@ -0,0 +1,182 @@
|
||||
import type { IResourceController } from "./IResourceController.js";
|
||||
import type { GeneralID, IntMonth, IntYear, LogType, NationID } from "./defs.js";
|
||||
|
||||
type LoggerStack = {
|
||||
symbol: Symbol;
|
||||
year: IntYear;
|
||||
month: IntMonth;
|
||||
|
||||
global: {
|
||||
action: string[];
|
||||
history: string[];
|
||||
}
|
||||
nation: {
|
||||
nationID: NationID;
|
||||
history: string[];
|
||||
}
|
||||
general: {
|
||||
[key in LogType]: string[];
|
||||
} & {
|
||||
generalID: GeneralID;
|
||||
}
|
||||
}
|
||||
|
||||
export class GameLoggerEngine {
|
||||
private static instance: GameLoggerEngine;
|
||||
|
||||
private constructor(
|
||||
private rsc: IResourceController
|
||||
) {
|
||||
}
|
||||
|
||||
public static initInstance(rsc: IResourceController) {
|
||||
GameLoggerEngine.instance = new GameLoggerEngine(rsc);
|
||||
}
|
||||
|
||||
public static getInstance(): GameLoggerEngine {
|
||||
if (!GameLoggerEngine.instance) {
|
||||
throw new Error("GameLogger is not initialized");
|
||||
}
|
||||
|
||||
return GameLoggerEngine.instance;
|
||||
}
|
||||
|
||||
private logStack = new Map<Symbol, LoggerStack>();
|
||||
|
||||
public addStack(stack: LoggerStack) {
|
||||
this.logStack.set(stack.symbol, stack);
|
||||
return stack;
|
||||
}
|
||||
|
||||
public getGameLogger(year: IntYear, month: IntMonth): GameLogger {
|
||||
return new GameLogger(year, month, this);
|
||||
}
|
||||
|
||||
public getNationLogger(year: IntYear, month: IntMonth, nationID: NationID): NationLogger {
|
||||
return new NationLogger(year, month, nationID, this);
|
||||
}
|
||||
|
||||
public getGeneralLogger(year: IntYear, month: IntMonth, nationID: NationID, generalID: GeneralID): GeneralLogger {
|
||||
return new GeneralLogger(year, month, nationID, generalID, this);
|
||||
}
|
||||
|
||||
flushAll() {
|
||||
//rsc?
|
||||
throw new Error("Not yet implemented");
|
||||
}
|
||||
}
|
||||
|
||||
export class GameLogger {
|
||||
protected stack: LoggerStack;
|
||||
|
||||
public constructor(
|
||||
year: IntYear,
|
||||
month: IntMonth,
|
||||
protected readonly engine: GameLoggerEngine,
|
||||
) {
|
||||
this.stack = {
|
||||
symbol: Symbol(),
|
||||
year,
|
||||
month,
|
||||
global: {
|
||||
action: [],
|
||||
history: []
|
||||
},
|
||||
nation: {
|
||||
nationID: 0,
|
||||
history: []
|
||||
},
|
||||
general: {
|
||||
action: [],
|
||||
battle: [],
|
||||
battleBrief: [],
|
||||
history: [],
|
||||
generalID: 0
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
pushGlobalActionLog(text: string) {
|
||||
this.stack.global.action.push(text);
|
||||
}
|
||||
|
||||
pushGlobalHistoryLog(text: string) {
|
||||
this.stack.global.history.push(text);
|
||||
}
|
||||
|
||||
reset() {
|
||||
const { year, month } = this.stack;
|
||||
const nationID = this.stack.nation.nationID;
|
||||
const generalID = this.stack.general.generalID;
|
||||
this.stack = {
|
||||
symbol: Symbol(),
|
||||
year,
|
||||
month,
|
||||
global: {
|
||||
action: [],
|
||||
history: []
|
||||
},
|
||||
nation: {
|
||||
nationID,
|
||||
history: []
|
||||
},
|
||||
general: {
|
||||
action: [],
|
||||
battle: [],
|
||||
battleBrief: [],
|
||||
history: [],
|
||||
generalID
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
commit() {
|
||||
this.engine.addStack(this.stack);
|
||||
this.reset();
|
||||
}
|
||||
}
|
||||
|
||||
export class NationLogger extends GameLogger {
|
||||
public constructor(
|
||||
year: IntYear,
|
||||
month: IntMonth,
|
||||
private readonly nationID: NationID,
|
||||
engine: GameLoggerEngine
|
||||
) {
|
||||
super(year, month, engine);
|
||||
this.stack.nation.nationID = nationID;
|
||||
}
|
||||
|
||||
pushNationLog(text: string) {
|
||||
this.stack.nation.history.push(text);
|
||||
}
|
||||
}
|
||||
|
||||
export class GeneralLogger extends NationLogger {
|
||||
public constructor(
|
||||
year: IntYear,
|
||||
month: IntMonth,
|
||||
nationID: NationID,
|
||||
private readonly generalID: GeneralID,
|
||||
engine: GameLoggerEngine
|
||||
) {
|
||||
super(year, month, nationID, engine);
|
||||
this.stack.general.generalID = generalID;
|
||||
}
|
||||
|
||||
pushGeneralActionLog(text: string) {
|
||||
this.stack.general.action.push(text);
|
||||
}
|
||||
|
||||
pushGeneralBattleLog(text: string) {
|
||||
this.stack.general.battle.push(text);
|
||||
}
|
||||
|
||||
pushGeneralBattleBriefLog(text: string) {
|
||||
this.stack.general.battleBrief.push(text);
|
||||
}
|
||||
|
||||
pushGeneralHistoryLog(text: string) {
|
||||
this.stack.general.history.push(text);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user