fix: 불가침 제의 기한을 20년으로 제한

This commit is contained in:
2026-08-30 07:24:33 +00:00
parent d68209879b
commit 24e57ee94c
13 changed files with 174 additions and 14 deletions
@@ -19,6 +19,7 @@ import type { NationTurnCommandSpec } from './index.js';
import { z } from 'zod';
import { parseArgsWithSchema } from '../parseArgs.js';
import { resolveDiplomacyMessageValidMinutes } from '../../../diplomacy/messageValidity.js';
import { NON_AGGRESSION_MIN_TERM_MONTHS, resolveNonAggressionMaxEndYear } from '../../../diplomacy/treatyTerm.js';
import { resolveMessageTargetIcon } from '@sammo-ts/logic/messages/message.js';
const ARGS_SCHEMA = z.object({
@@ -38,12 +39,11 @@ interface NonAggressionProposalContext<
}
const ACTION_NAME = '불가침 제의';
const MIN_TERM_MONTHS = 6;
const resolveMonthIndex = (year: number, month: number): number => year * 12 + month - 1;
const reqMinimumTreatyTerm = (minMonths: number): Constraint => ({
name: 'reqMinimumTreatyTerm',
const reqTreatyTermRange = (minMonths: number): Constraint => ({
name: 'reqTreatyTermRange',
requires: () => [
{ kind: 'arg', key: 'year' },
{ kind: 'arg', key: 'month' },
@@ -100,6 +100,13 @@ const reqMinimumTreatyTerm = (minMonths: number): Constraint => ({
reason: `기한은 ${minMonths}개월 이상이어야 합니다.`,
};
}
const maxEndYear = resolveNonAggressionMaxEndYear(envYearValue);
if (yearValue > maxEndYear) {
return {
kind: 'deny',
reason: `기한은 ${maxEndYear}년 이하여야 합니다.`,
};
}
return allow();
},
});
@@ -120,7 +127,7 @@ export class ActionDefinition<
}
buildPermissionConstraints(_ctx: ConstraintContext, _args: NonAggressionProposalArgs): Constraint[] {
return [reqMinimumTreatyTerm(MIN_TERM_MONTHS)];
return [reqTreatyTermRange(NON_AGGRESSION_MIN_TERM_MONTHS)];
}
buildMinConstraints(_ctx: ConstraintContext, _args: NonAggressionProposalArgs): Constraint[] {
@@ -133,7 +140,7 @@ export class ActionDefinition<
notBeNeutral(),
existsDestNation(),
differentDestNation(),
reqMinimumTreatyTerm(MIN_TERM_MONTHS),
reqTreatyTermRange(NON_AGGRESSION_MIN_TERM_MONTHS),
disallowDiplomacyBetweenStatus({
0: '아국과 이미 교전중입니다.',
1: '아국과 이미 선포중입니다.',
+1
View File
@@ -149,3 +149,4 @@ export const processDiplomacyMonth = (
export * from './frontState.js';
export * from './instantResponse.js';
export * from './messageValidity.js';
export * from './treatyTerm.js';
@@ -0,0 +1,5 @@
export const NON_AGGRESSION_MIN_TERM_MONTHS = 6;
export const NON_AGGRESSION_MAX_END_YEAR_OFFSET = 20;
export const resolveNonAggressionMaxEndYear = (currentYear: number): number =>
currentYear + NON_AGGRESSION_MAX_END_YEAR_OFFSET;
@@ -146,7 +146,7 @@ describe('legacy reservation permission constraints', () => {
).toEqual({ kind: 'allow' });
});
it('checks only the six-month minimum when reserving a non-aggression proposal', () => {
it('keeps non-aggression proposals between the six-month minimum and Ref twenty-year limit', () => {
const definition = new NonAggressionProposalAction();
const shortArgs = { destNationId: 2, year: 190, month: 6 };
expect(
@@ -162,5 +162,23 @@ describe('legacy reservation permission constraints', () => {
).toEqual({
kind: 'allow',
});
const maxTermArgs = { destNationId: 2, year: 210, month: 12 };
expect(
evaluatePermission(definition.buildPermissionConstraints(permissionContext, maxTermArgs), maxTermArgs)
).toEqual({
kind: 'allow',
});
const excessiveTermArgs = { destNationId: 2, year: 211, month: 1 };
expect(
evaluatePermission(
definition.buildPermissionConstraints(permissionContext, excessiveTermArgs),
excessiveTermArgs
)
).toMatchObject({
kind: 'deny',
reason: '기한은 210년 이하여야 합니다.',
});
});
});