From d888140cf37a1090b686bfd48972cd011dec720e Mon Sep 17 00:00:00 2001 From: Hide_D Date: Sat, 7 Feb 2026 05:14:33 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=97=AC=EB=9F=AC=20=EC=A0=9C=EC=95=BD?= =?UTF-8?q?=20=EC=A1=B0=EA=B1=B4=20=EA=B0=9C=EC=84=A0=20=EB=B0=8F=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/actions/turn/general/che_건국.ts | 3 ++- .../logic/test/scenarios/blankStart.test.ts | 2 +- .../scenarios/general/che_NPC능동.test.ts | 19 +++++++++++++----- .../scenarios/general/che_등용수락.test.ts | 20 +++---------------- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/packages/logic/src/actions/turn/general/che_건국.ts b/packages/logic/src/actions/turn/general/che_건국.ts index fd9d063..8b9ef3d 100644 --- a/packages/logic/src/actions/turn/general/che_건국.ts +++ b/packages/logic/src/actions/turn/general/che_건국.ts @@ -4,6 +4,7 @@ import { beLord, wanderingNation, reqNationValue, + reqNationGeneralCount, checkNationNameDuplicate, beOpeningPart, constructableCity, @@ -89,7 +90,7 @@ export class ActionDefinition< beOpeningPart(), beLord(), wanderingNation(), - reqNationValue('gennum', '수하 장수', '>=', 2), + reqNationGeneralCount(2), checkNationNameDuplicate(args.nationName), allowJoinAction(), constructableCity(), diff --git a/packages/logic/test/scenarios/blankStart.test.ts b/packages/logic/test/scenarios/blankStart.test.ts index 794d24e..cd22920 100644 --- a/packages/logic/test/scenarios/blankStart.test.ts +++ b/packages/logic/test/scenarios/blankStart.test.ts @@ -314,7 +314,7 @@ describe('Blank Start Scenario', () => { const resLevel = evaluateActionConstraints(foundNationDef, ctx, view, FOUNDING_ARGS); expect(resLevel.kind).toBe('deny'); if (resLevel.kind === 'deny') { - expect(resLevel.constraintName).toBe('reqCityLevel'); + expect(resLevel.constraintName).toBe('constructableCity'); } }); diff --git a/packages/logic/test/scenarios/general/che_NPC능동.test.ts b/packages/logic/test/scenarios/general/che_NPC능동.test.ts index 18b5239..47aa7f1 100644 --- a/packages/logic/test/scenarios/general/che_NPC능동.test.ts +++ b/packages/logic/test/scenarios/general/che_NPC능동.test.ts @@ -159,7 +159,7 @@ describe('che_NPC능동', () => { expect(updated?.cityId).toBe(destCityId); }); - it('should deny non-NPC general', async () => { + it('should reject non-NPC general at resolve stage', async () => { const bootstrapResult = buildScenarioBootstrap({ scenario: MOCK_SCENARIO_BASE, map: MINIMAL_MAP, @@ -209,10 +209,19 @@ describe('che_NPC능동', () => { const result = evaluateActionConstraints(def, ctx, view, args); - expect(result.kind).toBe('deny'); - if (result.kind === 'deny') { - expect(result.constraintName).toBe('mustBeNPC'); - } + expect(result.kind).toBe('allow'); + + const runner = new TestGameRunner(world, 200, 1); + await expect( + runner.runTurn([ + { + generalId: general.id, + commandKey: 'che_NPC능동', + resolver: def, + args, + }, + ]) + ).rejects.toThrow('NPC가 아닙니다.'); }); it('should fail if args are invalid', async () => { diff --git a/packages/logic/test/scenarios/general/che_등용수락.test.ts b/packages/logic/test/scenarios/general/che_등용수락.test.ts index 6e3da2f..3484864 100644 --- a/packages/logic/test/scenarios/general/che_등용수락.test.ts +++ b/packages/logic/test/scenarios/general/che_등용수락.test.ts @@ -385,7 +385,7 @@ describe('che_등용수락', () => { const monarch: General = { id: 1, name: 'Monarch', - nationId: 1, + nationId: 0, cityId: 101, troopId: 0, stats: { leadership: 50, strength: 50, intelligence: 50 }, @@ -410,19 +410,6 @@ describe('che_등용수락', () => { triggerState: { flags: {}, counters: {}, modifiers: {}, meta: {} }, meta: { killturn: 24 }, }; - const nation1: Nation = { - id: 1, - name: 'Nation1', - color: '#000', - capitalCityId: 101, - chiefGeneralId: 1, - gold: 0, - rice: 0, - power: 0, - level: 1, - typeCode: 'che_def', - meta: { killturn: 24 }, - }; const recruiterGen: General = { id: 2, name: 'Recruiter', @@ -462,7 +449,6 @@ describe('che_등용수락', () => { world.snapshot.generals.push(monarch); world.snapshot.generals.push(recruiterGen); - world.snapshot.nations.push(nation1); world.snapshot.nations.push(nation2); const { commandSpec } = await import('../../../src/actions/turn/general/che_등용수락.js'); @@ -475,7 +461,7 @@ describe('che_등용수락', () => { const result = evaluateActionConstraints(def, ctx, view, args); expect(result.kind).toBe('deny'); if (result.kind === 'deny') { - expect(result.constraintName).toMatch(/NotLord/i); + expect(result.constraintName).toBe('reqGeneralValue'); } }); @@ -565,7 +551,7 @@ describe('che_등용수락', () => { const result = evaluateActionConstraints(def, ctx, view, args); expect(result.kind).toBe('deny'); if (result.kind === 'deny') { - expect(result.constraintName).toMatch(/notSameDestNation/i); + expect(result.constraintName).toBe('beNeutral'); } }); });