diff --git a/packages/logic/src/items/base.ts b/packages/logic/src/items/base.ts
index fcb42bc..6837c67 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 676fb75..6fed42e 100644
--- a/packages/logic/src/triggers/general-action.ts
+++ b/packages/logic/src/triggers/general-action.ts
@@ -3,6 +3,7 @@ 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 931f272..f7f7a36 100644
--- a/packages/logic/src/triggers/special/types.ts
+++ b/packages/logic/src/triggers/special/types.ts
@@ -1,6 +1,8 @@
import type { GeneralTriggerState } from '@sammo-ts/logic/domain/entities.js';
import type { GeneralActionModule } from '@sammo-ts/logic/triggers/general-action.js';
-import type { WarActionModule } from '@sammo-ts/logic/war/actions.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';
export type TraitKind = 'domestic' | 'war' | 'personality';
@@ -11,8 +13,42 @@ export interface TraitSpec {
kind: TraitKind;
}
-import type { TraitOnCalcStat, TraitOnCalcOpposeStat, OnCalcStatParams } from '../types.js';
-export type { TraitOnCalcStat, TraitOnCalcOpposeStat, OnCalcStatParams };
+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'];
+}
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 14d5e5d..a434492 100644
--- a/packages/logic/src/triggers/special/war/che_무쌍.ts
+++ b/packages/logic/src/triggers/special/war/che_무쌍.ts
@@ -1,5 +1,7 @@
-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 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 { getMetaNumber } from '@sammo-ts/logic/war/utils.js';
import { WarUnit } from '@sammo-ts/logic/war/units.js';
@@ -9,20 +11,19 @@ type WarUnitWithGeneral = WarUnit & { getGeneral: () => { meta: Record
'getGeneral' in unit && typeof (unit as { getGeneral?: unknown }).getGeneral === 'function';
-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'];
+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;
}
- return value as WarStatBundleMap[T]['return'];
-};
+ return value;
+}) as unknown as TraitOnCalcStat;
export const traitModule: TraitModule = {
key: 'che_무쌍',
diff --git a/packages/logic/src/triggers/types.ts b/packages/logic/src/triggers/types.ts
index a2aa0cd..088d365 100644
--- a/packages/logic/src/triggers/types.ts
+++ b/packages/logic/src/triggers/types.ts
@@ -1,6 +1,7 @@
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 = '판매' | '구매';
@@ -55,11 +56,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;
@@ -67,29 +68,34 @@ export type WarStatBundleMap = {
export type WarStatName = WarStatBundle['statName'];
-export type OnCalcStatParams = {
- [T in WarStatName]: [
- context: T extends GeneralStatName
- ? GeneralActionContext | WarActionContext
- : WarActionContext,
+export interface TraitOnCalcStat {
+ (
+ context: GeneralActionContext,
statName: T,
- value: WarStatBundleMap[T]['value'],
- aux: WarStatBundleMap[T]['aux'],
- ];
-}[WarStatName];
-
-export type TraitOnCalcStat = {
+ value: GeneralStatBundleMap[T]['value'],
+ aux?: GeneralStatBundleMap[T]['aux']
+ ): GeneralStatBundleMap[T]['return'];
(
- context: T extends GeneralStatName
- ? GeneralActionContext | WarActionContext
- : WarActionContext,
+ context: WarActionContext,
statName: T,
value: WarStatBundleMap[T]['value'],
- aux: WarStatBundleMap[T]['aux'],
+ aux?: WarStatBundleMap[T]['aux']
): WarStatBundleMap[T]['return'];
-};
+}
-export type TraitOnCalcOpposeStat =
- TraitOnCalcStat;
+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'];
+}
export type TriggerActionType = '장비매매';