트리거 시스템 및 랜덤 생성기 인터페이스 추가: 기본 구조 정의

This commit is contained in:
2025-12-27 04:36:38 +00:00
parent b42d87a51b
commit 206aa64c64
6 changed files with 343 additions and 0 deletions
+80
View File
@@ -0,0 +1,80 @@
import type { General, GeneralTriggerState } from '../domain/entities';
import type { RandomGenerator } from '../ports/rng';
import type { WorldStateRepository } from '../ports/world';
import { TriggerCaller, type Trigger } from './core';
export interface GeneralActionLogSink {
push(message: string): void;
}
export interface GeneralSkillActivation {
has(key: string): boolean;
activate(...keys: string[]): void;
}
export const createGeneralSkillActivation = <
TriggerState extends GeneralTriggerState
>(
general: General<TriggerState>
): GeneralSkillActivation => ({
has: (key: string) => Boolean(general.triggerState.flags[key]),
activate: (...keys: string[]) => {
for (const key of keys) {
general.triggerState.flags[key] = true;
}
},
});
export interface GeneralActionContext<TriggerState extends GeneralTriggerState = GeneralTriggerState> {
general: General<TriggerState>;
world?: WorldStateRepository;
log?: GeneralActionLogSink;
rng?: RandomGenerator;
}
export interface GeneralTriggerContext<TriggerState extends GeneralTriggerState = GeneralTriggerState>
extends GeneralActionContext<TriggerState> {
rng: RandomGenerator;
skill: GeneralSkillActivation;
}
export const createGeneralTriggerContext = <
TriggerState extends GeneralTriggerState
>(
context: GeneralActionContext<TriggerState> & { rng: RandomGenerator }
): GeneralTriggerContext<TriggerState> => ({
...context,
skill: createGeneralSkillActivation(context.general),
});
export type GeneralTrigger<
TriggerState extends GeneralTriggerState = GeneralTriggerState,
Env extends Record<string, unknown> = Record<string, unknown>,
Arg = unknown
> = Trigger<GeneralTriggerContext<TriggerState>, Env, Arg>;
export class GeneralTriggerCaller<
TriggerState extends GeneralTriggerState = GeneralTriggerState,
Env extends Record<string, unknown> = Record<string, unknown>,
Arg = unknown
> extends TriggerCaller<GeneralTriggerContext<TriggerState>, Env, Arg> {}
export abstract class BaseGeneralTrigger<
TriggerState extends GeneralTriggerState = GeneralTriggerState,
Env extends Record<string, unknown> = Record<string, unknown>,
Arg = unknown
> implements GeneralTrigger<TriggerState, Env, Arg> {
public abstract readonly priority: number;
protected constructor(protected readonly general: General<TriggerState>) {}
get uniqueId(): string {
return `${this.priority}_${this.constructor.name}_${this.general.id}`;
}
abstract action(
context: GeneralTriggerContext<TriggerState>,
env: Env,
arg?: Arg
): Env;
}