fix reserved turn permission constraints

This commit is contained in:
2026-07-26 18:57:27 +00:00
parent 7a18bb48f2
commit d1e9d5fc75
13 changed files with 482 additions and 18 deletions
+3 -1
View File
@@ -7,10 +7,12 @@ export interface GeneralActionDefinition<
Args = unknown,
Context extends GeneralActionResolveContext<TriggerState> = GeneralActionResolveContext<TriggerState>,
> {
// TODO: legacy permissionConstraints(예약 권한) 모델링 필요.
key: string;
name: string;
parseArgs(raw: unknown): Args | null;
// 레거시 testPermissionToReserve()와 같은 예약 입력 전용 제약이다.
// 정의하지 않은 명령은 레거시처럼 인자 검증 외 상태 제약 없이 예약한다.
buildPermissionConstraints?(ctx: ConstraintContext, args: Args): Constraint[];
// 커맨드 입력 단계에서 최소 조건만 평가할 때 사용한다.
buildMinConstraints?(ctx: ConstraintContext, args: Args): Constraint[];
buildConstraints(ctx: ConstraintContext, args: Args): Constraint[];
@@ -15,6 +15,7 @@ import type { TurnCommandEnv } from '@sammo-ts/logic/actions/turn/commandEnv.js'
import type { GeneralTurnCommandSpec } from './index.js';
import type { MapDefinition } from '@sammo-ts/logic/world/types.js';
import { parseArgsWithSchema } from '../parseArgs.js';
import { mustBeNPC } from '@sammo-ts/logic/constraints/presets.js';
export type NPCSelfResolveContext<TriggerState extends GeneralTriggerState = GeneralTriggerState> =
GeneralActionResolveContext<TriggerState> & {
@@ -99,6 +100,10 @@ export class ActionDefinition<
return parseArgsWithSchema(ARGS_SCHEMA, raw);
}
buildPermissionConstraints(_ctx: ConstraintContext, _args: NPCSelfArgs): Constraint[] {
return [mustBeNPC()];
}
buildConstraints(_ctx: ConstraintContext, args: NPCSelfArgs): Constraint[] {
void _ctx;
void args;
@@ -161,6 +161,10 @@ export class ActionDefinition<
return parseArgsWithSchema(ARGS_SCHEMA, raw);
}
buildPermissionConstraints(_ctx: ConstraintContext, _args: EmployArgs): Constraint[] {
return [reqEnvValue('join_mode', '!=', 'onlyRandom', '랜덤 임관만 가능합니다')];
}
buildMinConstraints(_ctx: ConstraintContext, _args: EmployArgs): Constraint[] {
return [
reqEnvValue('join_mode', '!=', 'onlyRandom', '랜덤 임관만 가능합니다'),
@@ -9,6 +9,7 @@ import {
reqGeneralValue,
reqEnvValue,
readMetaNumberFromUnknown,
alwaysFail,
} from '@sammo-ts/logic/constraints/presets.js';
import type { GeneralActionDefinition } from '@sammo-ts/logic/actions/definition.js';
import type {
@@ -313,6 +314,10 @@ export class ActionDefinition<
return parseArgsWithSchema(ARGS_SCHEMA, raw);
}
buildPermissionConstraints(_ctx: ConstraintContext, _args: AcceptScoutArgs): Constraint[] {
return [alwaysFail('예약 불가능 커맨드')];
}
buildConstraints(_ctx: ConstraintContext, _args: AcceptScoutArgs): Constraint[] {
const env = _ctx.env;
const year = typeof env.year === 'number' ? env.year : 0;
@@ -53,6 +53,10 @@ export class ActionDefinition<
return parseArgsWithSchema(ARGS_SCHEMA, raw);
}
buildPermissionConstraints(_ctx: ConstraintContext, _args: AppointmentArgs): Constraint[] {
return [reqEnvValue('join_mode', '!=', 'onlyRandom', '랜덤 임관만 가능합니다')];
}
buildMinConstraints(_ctx: ConstraintContext, _args: AppointmentArgs): Constraint[] {
return [
reqEnvValue('join_mode', '!=', 'onlyRandom', '랜덤 임관만 가능합니다'),
@@ -138,6 +138,10 @@ export class ActionDefinition<
return parseArgsWithSchema(ARGS_SCHEMA, raw);
}
buildPermissionConstraints(_ctx: ConstraintContext, _args: FollowAppointmentArgs): Constraint[] {
return [reqEnvValue('join_mode', '!=', 'onlyRandom', '랜덤 임관만 가능합니다')];
}
buildMinConstraints(_ctx: ConstraintContext, _args: FollowAppointmentArgs): Constraint[] {
return [reqEnvValue('join_mode', '!=', 'onlyRandom', '랜덤 임관만 가능합니다'), beNeutral(), allowJoinAction()];
}
@@ -116,6 +116,10 @@ export class ActionDefinition<
return parseArgsWithSchema(ARGS_SCHEMA, raw);
}
buildPermissionConstraints(_ctx: ConstraintContext, _args: NonAggressionProposalArgs): Constraint[] {
return [reqMinimumTreatyTerm(MIN_TERM_MONTHS)];
}
buildMinConstraints(_ctx: ConstraintContext, _args: NonAggressionProposalArgs): Constraint[] {
return [beChief(), notBeNeutral()];
}