fix: 불가침 제의 기한을 20년으로 제한
This commit is contained in:
@@ -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: '아국과 이미 선포중입니다.',
|
||||
|
||||
@@ -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년 이하여야 합니다.',
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user