@@ -1,9 +1,7 @@
|
||||
import type { GeneralTriggerState } from '@sammo-ts/logic/domain/entities.js';
|
||||
import { type GeneralActionContext, GeneralTriggerCaller } from './general.js';
|
||||
import type {
|
||||
GeneralStatBundleMap,
|
||||
GeneralStatName,
|
||||
WarStatBundleMap,
|
||||
TriggerActionPhase,
|
||||
TriggerActionType,
|
||||
TriggerDomesticActionType,
|
||||
@@ -18,58 +16,58 @@ export interface GeneralActionModule<TriggerState extends GeneralTriggerState =
|
||||
getInfo?: (() => string) | undefined;
|
||||
|
||||
getPreTurnExecuteTriggerList?:
|
||||
| ((context: GeneralActionContext<TriggerState>) => GeneralTriggerCaller<TriggerState> | null)
|
||||
| undefined;
|
||||
| ((context: GeneralActionContext<TriggerState>) => GeneralTriggerCaller<TriggerState> | null)
|
||||
| undefined;
|
||||
|
||||
onCalcDomestic?:
|
||||
| ((
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
turnType: TriggerDomesticActionType,
|
||||
varType: TriggerDomesticVarType,
|
||||
value: number,
|
||||
aux?: unknown
|
||||
) => number)
|
||||
| undefined;
|
||||
| ((
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
turnType: TriggerDomesticActionType,
|
||||
varType: TriggerDomesticVarType,
|
||||
value: number,
|
||||
aux?: unknown
|
||||
) => number)
|
||||
| undefined;
|
||||
|
||||
onCalcStat?:
|
||||
| (<T extends GeneralStatName>(
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: GeneralStatBundleMap[T]['value'],
|
||||
aux?: GeneralStatBundleMap[T]['aux']
|
||||
) => GeneralStatBundleMap[T]['return'])
|
||||
| undefined;
|
||||
| ((
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
statName: GeneralStatName,
|
||||
value: number,
|
||||
aux?: unknown
|
||||
) => number)
|
||||
| undefined;
|
||||
|
||||
onCalcOpposeStat?:
|
||||
| (<T extends GeneralStatName>(
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: GeneralStatBundleMap[T]['value'],
|
||||
aux?: GeneralStatBundleMap[T]['aux']
|
||||
) => GeneralStatBundleMap[T]['return'])
|
||||
| undefined;
|
||||
| ((
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
statName: GeneralStatName,
|
||||
value: number,
|
||||
aux?: unknown
|
||||
) => number)
|
||||
| undefined;
|
||||
|
||||
onCalcStrategic?:
|
||||
| ((
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
turnType: TriggerStrategicActionType,
|
||||
varType: TriggerStrategicVarType,
|
||||
value: number
|
||||
) => number)
|
||||
| undefined;
|
||||
| ((
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
turnType: TriggerStrategicActionType,
|
||||
varType: TriggerStrategicVarType,
|
||||
value: number
|
||||
) => number)
|
||||
| undefined;
|
||||
|
||||
onCalcNationalIncome?:
|
||||
| ((context: GeneralActionContext<TriggerState>, type: TriggerNationalIncomeType, amount: number) => number)
|
||||
| undefined;
|
||||
| ((context: GeneralActionContext<TriggerState>, type: TriggerNationalIncomeType, amount: number) => number)
|
||||
| undefined;
|
||||
|
||||
onArbitraryAction?:
|
||||
| ((
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
actionType: TriggerActionType,
|
||||
phase?: TriggerActionPhase | null,
|
||||
aux?: Record<string, unknown> | null
|
||||
) => Record<string, unknown> | null)
|
||||
| undefined;
|
||||
| ((
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
actionType: TriggerActionType,
|
||||
phase?: TriggerActionPhase | null,
|
||||
aux?: Record<string, unknown> | null
|
||||
) => Record<string, unknown> | null)
|
||||
| undefined;
|
||||
}
|
||||
|
||||
export class GeneralActionPipeline<TriggerState extends GeneralTriggerState = GeneralTriggerState> {
|
||||
@@ -109,12 +107,12 @@ export class GeneralActionPipeline<TriggerState extends GeneralTriggerState = Ge
|
||||
return current;
|
||||
}
|
||||
|
||||
onCalcStat<T extends GeneralStatName>(
|
||||
onCalcStat(
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: GeneralStatBundleMap[T]['value'],
|
||||
aux?: GeneralStatBundleMap[T]['aux']
|
||||
): GeneralStatBundleMap[T]['return'] {
|
||||
statName: GeneralStatName,
|
||||
value: number,
|
||||
aux?: unknown
|
||||
): number {
|
||||
let current = value;
|
||||
for (const module of this.modules) {
|
||||
if (!module.onCalcStat) {
|
||||
@@ -125,12 +123,12 @@ export class GeneralActionPipeline<TriggerState extends GeneralTriggerState = Ge
|
||||
return current;
|
||||
}
|
||||
|
||||
onCalcOpposeStat<T extends GeneralStatName>(
|
||||
onCalcOpposeStat(
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: GeneralStatBundleMap[T]['value'],
|
||||
aux?: GeneralStatBundleMap[T]['aux']
|
||||
): GeneralStatBundleMap[T]['return'] {
|
||||
statName: GeneralStatName,
|
||||
value: number,
|
||||
aux?: unknown
|
||||
): number {
|
||||
let current = value;
|
||||
for (const module of this.modules) {
|
||||
if (!module.onCalcOpposeStat) {
|
||||
|
||||
@@ -2,7 +2,6 @@ import type { GeneralTriggerState } from '@sammo-ts/logic/domain/entities.js';
|
||||
import type { GeneralActionContext } from '@sammo-ts/logic/triggers/general.js';
|
||||
import type { GeneralActionModule } from '@sammo-ts/logic/triggers/general-action.js';
|
||||
import type {
|
||||
GeneralStatBundleMap,
|
||||
GeneralStatName,
|
||||
TriggerActionPhase,
|
||||
TriggerActionType,
|
||||
@@ -11,7 +10,6 @@ import type {
|
||||
TriggerNationalIncomeType,
|
||||
TriggerStrategicActionType,
|
||||
TriggerStrategicVarType,
|
||||
WarStatBundleMap,
|
||||
WarStatName,
|
||||
} from '@sammo-ts/logic/triggers/types.js';
|
||||
import type { WarActionContext, WarActionModule } from '@sammo-ts/logic/war/actions.js';
|
||||
@@ -66,7 +64,7 @@ export class TraitGeneralActionRouter<
|
||||
constructor(
|
||||
private readonly kind: TraitKind,
|
||||
private readonly registry: TraitModuleRegistry<TriggerState>
|
||||
) { }
|
||||
) {}
|
||||
|
||||
private getModule(context: GeneralActionContext<TriggerState>): TraitModule<TriggerState> | null {
|
||||
const key = resolveTraitKey(context, this.kind);
|
||||
@@ -89,32 +87,24 @@ export class TraitGeneralActionRouter<
|
||||
return module?.onCalcDomestic?.(context, turnType, varType, value, aux) ?? value;
|
||||
}
|
||||
|
||||
onCalcStat<T extends GeneralStatName>(
|
||||
onCalcStat(
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: GeneralStatBundleMap[T]['value'],
|
||||
aux?: GeneralStatBundleMap[T]['aux']
|
||||
): GeneralStatBundleMap[T]['return'] {
|
||||
statName: GeneralStatName,
|
||||
value: number,
|
||||
aux?: unknown
|
||||
): number {
|
||||
const module = this.getModule(context);
|
||||
const onCalcStat = module?.onCalcStat;
|
||||
if (onCalcStat) {
|
||||
return onCalcStat(context, statName, value as never, aux as never) as never;
|
||||
}
|
||||
return value;
|
||||
return module?.onCalcStat?.(context, statName, value, aux) ?? value;
|
||||
}
|
||||
|
||||
onCalcOpposeStat<T extends GeneralStatName>(
|
||||
onCalcOpposeStat(
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: GeneralStatBundleMap[T]['value'],
|
||||
aux?: GeneralStatBundleMap[T]['aux']
|
||||
): GeneralStatBundleMap[T]['return'] {
|
||||
statName: GeneralStatName,
|
||||
value: number,
|
||||
aux?: unknown
|
||||
): number {
|
||||
const module = this.getModule(context);
|
||||
const onCalcOpposeStat = module?.onCalcOpposeStat;
|
||||
if (onCalcOpposeStat) {
|
||||
return onCalcOpposeStat(context, statName, value as never, aux as never) as never;
|
||||
}
|
||||
return value;
|
||||
return module?.onCalcOpposeStat?.(context, statName, value, aux) ?? value;
|
||||
}
|
||||
|
||||
onCalcStrategic(
|
||||
@@ -155,7 +145,7 @@ export class TraitWarActionRouter<
|
||||
constructor(
|
||||
private readonly kind: TraitKind,
|
||||
private readonly registry: TraitModuleRegistry<TriggerState>
|
||||
) { }
|
||||
) {}
|
||||
|
||||
private getModule(context: WarActionContext<TriggerState>): TraitModule<TriggerState> | null {
|
||||
const key = resolveTraitKey(context, this.kind);
|
||||
@@ -172,32 +162,24 @@ export class TraitWarActionRouter<
|
||||
return module?.getBattlePhaseTriggerList?.(context) ?? null;
|
||||
}
|
||||
|
||||
onCalcStat<T extends WarStatName>(
|
||||
onCalcStat(
|
||||
context: WarActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: WarStatBundleMap[T]['value'],
|
||||
aux?: WarStatBundleMap[T]['aux']
|
||||
): WarStatBundleMap[T]['return'] {
|
||||
statName: WarStatName,
|
||||
value: number | [number, number],
|
||||
aux?: unknown
|
||||
): number | [number, number] {
|
||||
const module = this.getModule(context);
|
||||
const onCalcStat = module?.onCalcStat;
|
||||
if (onCalcStat) {
|
||||
return onCalcStat(context, statName, value as never, aux as never) as never;
|
||||
}
|
||||
return value;
|
||||
return module?.onCalcStat?.(context, statName, value, aux) ?? value;
|
||||
}
|
||||
|
||||
onCalcOpposeStat<T extends WarStatName>(
|
||||
onCalcOpposeStat(
|
||||
context: WarActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: WarStatBundleMap[T]['value'],
|
||||
aux?: WarStatBundleMap[T]['aux']
|
||||
): WarStatBundleMap[T]['return'] {
|
||||
statName: WarStatName,
|
||||
value: number | [number, number],
|
||||
aux?: unknown
|
||||
): number | [number, number] {
|
||||
const module = this.getModule(context);
|
||||
const onCalcOpposeStat = module?.onCalcOpposeStat;
|
||||
if (onCalcOpposeStat) {
|
||||
return onCalcOpposeStat(context, statName, value as never, aux as never) as never;
|
||||
}
|
||||
return value;
|
||||
return module?.onCalcOpposeStat?.(context, statName, value, aux) ?? value;
|
||||
}
|
||||
|
||||
getWarPowerMultiplier(
|
||||
|
||||
@@ -13,41 +13,24 @@ export interface TraitSpec {
|
||||
kind: TraitKind;
|
||||
}
|
||||
|
||||
import type {
|
||||
GeneralStatName,
|
||||
GeneralStatBundleMap,
|
||||
WarStatName,
|
||||
WarStatBundleMap,
|
||||
} from '../types.js';
|
||||
|
||||
export interface TraitOnCalcStat<TriggerState extends GeneralTriggerState = GeneralTriggerState> {
|
||||
<T extends GeneralStatName>(
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: GeneralStatBundleMap[T]['value'],
|
||||
aux?: GeneralStatBundleMap[T]['aux']
|
||||
): GeneralStatBundleMap[T]['return'];
|
||||
<T extends WarStatName>(
|
||||
(context: GeneralActionContext<TriggerState>, statName: GeneralStatName, value: number, aux?: unknown): number;
|
||||
(
|
||||
context: WarActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: WarStatBundleMap[T]['value'],
|
||||
aux?: WarStatBundleMap[T]['aux']
|
||||
): WarStatBundleMap[T]['return'];
|
||||
statName: WarStatName,
|
||||
value: number | [number, number],
|
||||
aux?: unknown
|
||||
): number | [number, number];
|
||||
}
|
||||
|
||||
export interface TraitOnCalcOpposeStat<TriggerState extends GeneralTriggerState = GeneralTriggerState> {
|
||||
<T extends GeneralStatName>(
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: GeneralStatBundleMap[T]['value'],
|
||||
aux?: GeneralStatBundleMap[T]['aux']
|
||||
): GeneralStatBundleMap[T]['return'];
|
||||
<T extends WarStatName>(
|
||||
(context: GeneralActionContext<TriggerState>, statName: GeneralStatName, value: number, aux?: unknown): number;
|
||||
(
|
||||
context: WarActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: WarStatBundleMap[T]['value'],
|
||||
aux?: WarStatBundleMap[T]['aux']
|
||||
): WarStatBundleMap[T]['return'];
|
||||
statName: WarStatName,
|
||||
value: number | [number, number],
|
||||
aux?: unknown
|
||||
): number | [number, number];
|
||||
}
|
||||
|
||||
export type TraitModule<TriggerState extends GeneralTriggerState = GeneralTriggerState> = TraitSpec &
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
import type { GeneralTriggerState } from '@sammo-ts/logic/domain/entities.js';
|
||||
import type { GeneralActionContext } from './general.js';
|
||||
import type { WarActionContext } from '../war/actions.js';
|
||||
export type TriggerActionType = '장비매매';
|
||||
|
||||
export type TriggerActionPhase = '판매' | '구매';
|
||||
@@ -31,71 +28,17 @@ export type TriggerNationalIncomeType = 'gold' | 'rice';
|
||||
|
||||
export type GeneralStatName = 'leadership' | 'strength' | 'intelligence' | 'experience' | 'dedication';
|
||||
|
||||
export type GeneralStatBundle =
|
||||
| { statName: 'leadership'; value: number; aux: undefined; return: number }
|
||||
| { statName: 'strength'; value: number; aux: undefined; return: number }
|
||||
| { statName: 'intelligence'; value: number; aux: undefined; return: number }
|
||||
| { statName: 'experience'; value: number; aux: undefined; return: number }
|
||||
| { statName: 'dedication'; value: number; aux: undefined; return: number };
|
||||
|
||||
export type GeneralStatBundleMap = {
|
||||
[T in GeneralStatBundle as T['statName']]: T;
|
||||
};
|
||||
|
||||
export type WarStatBundle =
|
||||
| GeneralStatBundle
|
||||
| { statName: 'cityBattleOrder'; value: number; aux: undefined; return: number }
|
||||
| { statName: 'initWarPhase'; value: number; aux: { isAttacker: boolean }; return: number }
|
||||
| { statName: 'bonusTrain'; value: number; aux: { isAttacker: boolean }; return: number }
|
||||
| { statName: 'bonusAtmos'; value: number; aux: { isAttacker: boolean }; return: number }
|
||||
| { statName: 'warCriticalRatio'; value: number; aux: { isAttacker: boolean }; return: number }
|
||||
| { statName: 'warAvoidRatio'; value: number; aux: { isAttacker: boolean }; return: number }
|
||||
| { statName: 'killRice'; value: number; aux: undefined; return: number }
|
||||
| { statName: 'criticalDamageRange'; value: [number, number]; aux: undefined; return: [number, number] }
|
||||
| { statName: 'warMagicSuccessDamage'; value: number; aux: undefined; return: number }
|
||||
| { statName: 'warMagicTrialProb'; value: number; aux: undefined; return: number }
|
||||
| { statName: 'warMagicSuccessProb'; value: number; aux: undefined; return: number }
|
||||
| {
|
||||
statName: `dex${number}`;
|
||||
value: number;
|
||||
aux: { isAttacker: boolean; opposeType: { armType: number } | null };
|
||||
return: number;
|
||||
};
|
||||
|
||||
export type WarStatBundleMap = {
|
||||
[T in WarStatBundle as T['statName']]: T;
|
||||
};
|
||||
|
||||
export type WarStatName = WarStatBundle['statName'];
|
||||
|
||||
export interface TraitOnCalcStat<TriggerState extends GeneralTriggerState = GeneralTriggerState> {
|
||||
<T extends GeneralStatName>(
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: GeneralStatBundleMap[T]['value'],
|
||||
aux?: GeneralStatBundleMap[T]['aux']
|
||||
): GeneralStatBundleMap[T]['return'];
|
||||
<T extends WarStatName>(
|
||||
context: WarActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: WarStatBundleMap[T]['value'],
|
||||
aux?: WarStatBundleMap[T]['aux']
|
||||
): WarStatBundleMap[T]['return'];
|
||||
}
|
||||
|
||||
export interface TraitOnCalcOpposeStat<TriggerState extends GeneralTriggerState = GeneralTriggerState> {
|
||||
<T extends GeneralStatName>(
|
||||
context: GeneralActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: GeneralStatBundleMap[T]['value'],
|
||||
aux?: GeneralStatBundleMap[T]['aux']
|
||||
): GeneralStatBundleMap[T]['return'];
|
||||
<T extends WarStatName>(
|
||||
context: WarActionContext<TriggerState>,
|
||||
statName: T,
|
||||
value: WarStatBundleMap[T]['value'],
|
||||
aux?: WarStatBundleMap[T]['aux']
|
||||
): WarStatBundleMap[T]['return'];
|
||||
}
|
||||
|
||||
export type TriggerActionType = '장비매매';
|
||||
export type WarStatName =
|
||||
| GeneralStatName
|
||||
| 'cityBattleOrder'
|
||||
| 'initWarPhase'
|
||||
| 'bonusTrain'
|
||||
| 'bonusAtmos'
|
||||
| 'warCriticalRatio'
|
||||
| 'warAvoidRatio'
|
||||
| 'killRice'
|
||||
| 'criticalDamageRange'
|
||||
| 'warMagicSuccessDamage'
|
||||
| 'warMagicTrialProb'
|
||||
| 'warMagicSuccessProb'
|
||||
| `dex${number}`;
|
||||
|
||||
Reference in New Issue
Block a user