diff --git a/packages/logic/src/items/base.ts b/packages/logic/src/items/base.ts
index 6837c67..fcb42bc 100644
--- a/packages/logic/src/items/base.ts
+++ b/packages/logic/src/items/base.ts
@@ -34,10 +34,10 @@ export const createStatItemModule = (options: StatItemOptions): ItemModule => {
const name = `${options.rawName}(+${options.statValue})`;
const baseInfo = `${statLabel} +${options.statValue}`;
const info = options.extraInfo ? `${baseInfo}
${options.extraInfo}` : baseInfo;
- const onCalcStat = (
+ const onCalcStat = ((
_context: GeneralActionContext | WarActionContext,
statName: GeneralStatName | WarStatName,
- value: number | [number, number]
+ value: number | [number, number],
): number | [number, number] => {
if (statName !== options.statName) {
return value;
@@ -46,7 +46,7 @@ export const createStatItemModule = (options: StatItemOptions): ItemModule => {
return value + options.statValue;
}
return value;
- };
+ }) as ItemModule['onCalcStat'];
return {
key: options.key,
@@ -59,6 +59,6 @@ export const createStatItemModule = (options: StatItemOptions): ItemModule => {
consumable: false,
reqSecu: options.reqSecu,
unique: options.unique ?? false,
- onCalcStat,
+ onCalcStat: onCalcStat!,
};
};
diff --git a/packages/logic/src/triggers/general-action.ts b/packages/logic/src/triggers/general-action.ts
index 6fed42e..676fb75 100644
--- a/packages/logic/src/triggers/general-action.ts
+++ b/packages/logic/src/triggers/general-action.ts
@@ -3,7 +3,6 @@ import { type GeneralActionContext, GeneralTriggerCaller } from './general.js';
import type {
GeneralStatBundleMap,
GeneralStatName,
- WarStatBundleMap,
TriggerActionPhase,
TriggerActionType,
TriggerDomesticActionType,
diff --git a/packages/logic/src/triggers/special/types.ts b/packages/logic/src/triggers/special/types.ts
index f7f7a36..931f272 100644
--- a/packages/logic/src/triggers/special/types.ts
+++ b/packages/logic/src/triggers/special/types.ts
@@ -1,8 +1,6 @@
import type { GeneralTriggerState } from '@sammo-ts/logic/domain/entities.js';
import type { GeneralActionModule } from '@sammo-ts/logic/triggers/general-action.js';
-import type { WarActionModule, WarActionContext } from '@sammo-ts/logic/war/actions.js';
-import type { GeneralActionContext } from '@sammo-ts/logic/triggers/general.js';
-import type { GeneralStatName, WarStatName } from '@sammo-ts/logic/triggers/types.js';
+import type { WarActionModule } from '@sammo-ts/logic/war/actions.js';
export type TraitKind = 'domestic' | 'war' | 'personality';
@@ -13,42 +11,8 @@ export interface TraitSpec {
kind: TraitKind;
}
-import type {
- GeneralStatName,
- GeneralStatBundleMap,
- WarStatName,
- WarStatBundleMap,
-} from '../types.js';
-
-export interface TraitOnCalcStat {
- (
- context: GeneralActionContext,
- statName: T,
- value: GeneralStatBundleMap[T]['value'],
- aux?: GeneralStatBundleMap[T]['aux']
- ): GeneralStatBundleMap[T]['return'];
- (
- context: WarActionContext,
- statName: T,
- value: WarStatBundleMap[T]['value'],
- aux?: WarStatBundleMap[T]['aux']
- ): WarStatBundleMap[T]['return'];
-}
-
-export interface TraitOnCalcOpposeStat {
- (
- context: GeneralActionContext,
- statName: T,
- value: GeneralStatBundleMap[T]['value'],
- aux?: GeneralStatBundleMap[T]['aux']
- ): GeneralStatBundleMap[T]['return'];
- (
- context: WarActionContext,
- statName: T,
- value: WarStatBundleMap[T]['value'],
- aux?: WarStatBundleMap[T]['aux']
- ): WarStatBundleMap[T]['return'];
-}
+import type { TraitOnCalcStat, TraitOnCalcOpposeStat, OnCalcStatParams } from '../types.js';
+export type { TraitOnCalcStat, TraitOnCalcOpposeStat, OnCalcStatParams };
export type TraitModule = TraitSpec &
Omit, 'onCalcStat' | 'onCalcOpposeStat'> &
diff --git a/packages/logic/src/triggers/special/war/che_무쌍.ts b/packages/logic/src/triggers/special/war/che_무쌍.ts
index a434492..14d5e5d 100644
--- a/packages/logic/src/triggers/special/war/che_무쌍.ts
+++ b/packages/logic/src/triggers/special/war/che_무쌍.ts
@@ -1,7 +1,5 @@
-import type { TraitOnCalcStat, TraitModule } from '@sammo-ts/logic/triggers/special/types.js';
-import type { GeneralActionContext } from '@sammo-ts/logic/triggers/general.js';
-import type { WarActionContext } from '@sammo-ts/logic/war/actions.js';
-import type { GeneralStatName, WarStatName } from '@sammo-ts/logic/triggers/types.js';
+import type { TraitOnCalcStat, TraitModule, OnCalcStatParams } from '@sammo-ts/logic/triggers/special/types.js';
+import type { WarStatName, WarStatBundleMap } from '@sammo-ts/logic/triggers/types.js';
import { getMetaNumber } from '@sammo-ts/logic/war/utils.js';
import { WarUnit } from '@sammo-ts/logic/war/units.js';
@@ -11,19 +9,20 @@ type WarUnitWithGeneral = WarUnit & { getGeneral: () => { meta: Record
'getGeneral' in unit && typeof (unit as { getGeneral?: unknown }).getGeneral === 'function';
-const onCalcStat = ((
- _context: GeneralActionContext | WarActionContext,
- statName: GeneralStatName | WarStatName,
- value: number | [number, number],
- aux?: unknown
-): number | [number, number] => {
- const isAttacker = typeof aux === 'object' && aux !== null && (aux as { isAttacker?: unknown }).isAttacker === true;
-
- if (statName === 'warCriticalRatio' && isAttacker && typeof value === 'number') {
- return value + 0.1;
+const onCalcStat: TraitOnCalcStat = (
+ ...args: [
+ context: any,
+ statName: T,
+ value: WarStatBundleMap[T]['value'],
+ aux: WarStatBundleMap[T]['aux'],
+ ]
+) => {
+ const [_context, statName, value, aux] = args as OnCalcStatParams;
+ if (statName === 'warCriticalRatio' && aux.isAttacker) {
+ return (value + 0.1) as WarStatBundleMap[T]['return'];
}
- return value;
-}) as unknown as TraitOnCalcStat;
+ return value as WarStatBundleMap[T]['return'];
+};
export const traitModule: TraitModule = {
key: 'che_무쌍',
diff --git a/packages/logic/src/triggers/types.ts b/packages/logic/src/triggers/types.ts
index 088d365..a2aa0cd 100644
--- a/packages/logic/src/triggers/types.ts
+++ b/packages/logic/src/triggers/types.ts
@@ -1,7 +1,6 @@
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 = '판매' | '구매';
@@ -56,11 +55,11 @@ export type WarStatBundle =
| { 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;
- };
+ statName: `dex${number}`;
+ value: number;
+ aux: { isAttacker: boolean; opposeType: { armType: number } | null };
+ return: number;
+ };
export type WarStatBundleMap = {
[T in WarStatBundle as T['statName']]: T;
@@ -68,34 +67,29 @@ export type WarStatBundleMap = {
export type WarStatName = WarStatBundle['statName'];
-export interface TraitOnCalcStat {
- (
- context: GeneralActionContext,
- statName: T,
- value: GeneralStatBundleMap[T]['value'],
- aux?: GeneralStatBundleMap[T]['aux']
- ): GeneralStatBundleMap[T]['return'];
- (
- context: WarActionContext,
+export type OnCalcStatParams = {
+ [T in WarStatName]: [
+ context: T extends GeneralStatName
+ ? GeneralActionContext | WarActionContext
+ : WarActionContext,
statName: T,
value: WarStatBundleMap[T]['value'],
- aux?: WarStatBundleMap[T]['aux']
- ): WarStatBundleMap[T]['return'];
-}
+ aux: WarStatBundleMap[T]['aux'],
+ ];
+}[WarStatName];
-export interface TraitOnCalcOpposeStat {
- (
- context: GeneralActionContext,
- statName: T,
- value: GeneralStatBundleMap[T]['value'],
- aux?: GeneralStatBundleMap[T]['aux']
- ): GeneralStatBundleMap[T]['return'];
+export type TraitOnCalcStat = {
(
- context: WarActionContext,
+ context: T extends GeneralStatName
+ ? GeneralActionContext | WarActionContext
+ : WarActionContext,
statName: T,
value: WarStatBundleMap[T]['value'],
- aux?: WarStatBundleMap[T]['aux']
+ aux: WarStatBundleMap[T]['aux'],
): WarStatBundleMap[T]['return'];
-}
+};
+
+export type TraitOnCalcOpposeStat =
+ TraitOnCalcStat;
export type TriggerActionType = '장비매매';