From 66f79ca5d250af84168c8cd43ac167309d570153 Mon Sep 17 00:00:00 2001 From: hided62 Date: Sat, 25 Jul 2026 18:56:40 +0000 Subject: [PATCH] test: trace monthly NPC nation creation --- .../fixtures/monthly_raise_npc_nation.json | 77 +++++++++++++++++++ hwe/compare/monthly_event_trace.php | 61 ++++++++++++++- 2 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 hwe/compare/fixtures/monthly_raise_npc_nation.json diff --git a/hwe/compare/fixtures/monthly_raise_npc_nation.json b/hwe/compare/fixtures/monthly_raise_npc_nation.json new file mode 100644 index 00000000..44099280 --- /dev/null +++ b/hwe/compare/fixtures/monthly_raise_npc_nation.json @@ -0,0 +1,77 @@ +{ + "action": "RaiseNPCNation", + "setup": { + "resetCities": true, + "resetGenerals": true, + "resetNations": true, + "city": [ + { + "id": 1, + "values": { + "name": "점유도시", + "level": 5, + "nation": 1, + "pop": 10001, + "pop_max": 50001, + "agri": 1001, + "agri_max": 5001, + "comm": 2001, + "comm_max": 6001, + "secu": 3001, + "secu_max": 7001, + "def": 4001, + "def_max": 8001, + "wall": 5001, + "wall_max": 9001 + } + }, + { + "id": 48, + "values": { + "name": "건국도시", + "level": 5, + "nation": 0, + "pop": 10048, + "pop_max": 50048, + "agri": 1048, + "agri_max": 5048, + "comm": 2048, + "comm_max": 6048, + "secu": 3048, + "secu_max": 7048, + "def": 4048, + "def_max": 8048, + "wall": 5048, + "wall_max": 9048 + } + } + ], + "nation": [ + { + "id": 1, + "values": { + "name": "기준국", + "capital": 1, + "gennum": 1, + "tech": 120, + "level": 2, + "type": "che_유가" + } + } + ], + "syncEnvironment": true + }, + "environment": { + "year": 200, + "month": 1, + "startyear": 190, + "turnterm": 10, + "turntime": "0200-01-01 00:00:00", + "show_img_level": 3, + "fiction": [0] + }, + "observe": { + "cityIds": [1, 48], + "nationIds": [1] + } +} diff --git a/hwe/compare/monthly_event_trace.php b/hwe/compare/monthly_event_trace.php index bc37147e..6e19d40d 100644 --- a/hwe/compare/monthly_event_trace.php +++ b/hwe/compare/monthly_event_trace.php @@ -31,7 +31,10 @@ function comparisonMonthlyPatch(string $table, int $id, array $values): void ], 'nation' => [ 'idColumn' => 'nation', - 'allowed' => ['name', 'color', 'capital', 'gold', 'rice', 'level', 'type', 'rate_tmp', 'aux'], + 'allowed' => [ + 'name', 'color', 'capital', 'gennum', 'gold', 'rice', 'tech', + 'level', 'type', 'rate_tmp', 'aux', + ], ], 'general' => [ 'idColumn' => 'no', @@ -188,6 +191,7 @@ function comparisonMonthlyEventTraceMain(): void 'CreateManyNPC', 'RegNPC', 'RegNeutralNPC', + 'RaiseNPCNation', ]; if (!in_array($actionName, $supportedActions, true)) { throw new \InvalidArgumentException('unsupported monthly action'); @@ -226,6 +230,12 @@ function comparisonMonthlyEventTraceMain(): void comparisonMonthlyPatch('general', $row['id'], $row['values']); } } + if (($setup['resetNations'] ?? false) === true) { + DB::db()->query('UPDATE nation SET level = 0, gennum = 0, tech = 0'); + foreach ($setup['nation'] ?? [] as $row) { + comparisonMonthlyPatch('nation', $row['id'], $row['values']); + } + } if (($setup['resetUniqueOccupancy'] ?? false) === true) { DB::db()->delete('ng_auction', '`type` = %s AND finished = 0', 'uniqueItem'); DB::db()->query('DELETE FROM storage WHERE namespace LIKE %s', 'ut\\_%'); @@ -240,6 +250,8 @@ function comparisonMonthlyEventTraceMain(): void $db = DB::db(); $generalIdBeforeAction = (int)($db->queryFirstField('SELECT COALESCE(MAX(no), 0) FROM general') ?? 0); + $nationIdBeforeAction = + (int)($db->queryFirstField('SELECT COALESCE(MAX(nation), 0) FROM nation') ?? 0); $snapshotRequest = ['observe' => $request['observe'] ?? []]; $snapshotRequest['observe']['logAfterId'] = (int)($db->queryFirstField('SELECT COALESCE(MAX(id), 0) FROM general_record') ?? 0); @@ -304,7 +316,7 @@ function comparisonMonthlyEventTraceMain(): void $actionEnvironment['killturn'] = $killturn; $actionEnvironment['turnterm'] = $turnterm; } - if (in_array($actionName, ['CreateManyNPC', 'RegNPC', 'RegNeutralNPC'], true)) { + if (in_array($actionName, ['CreateManyNPC', 'RegNPC', 'RegNeutralNPC', 'RaiseNPCNation'], true)) { $turnterm = $environment['turnterm'] ?? null; $turntime = $environment['turntime'] ?? null; $showImgLevel = $environment['show_img_level'] ?? 3; @@ -336,7 +348,7 @@ function comparisonMonthlyEventTraceMain(): void $after = comparisonTurnStateSnapshot($snapshotRequest); $afterDetails = comparisonMonthlyDetails($snapshotRequest['observe'], $worldHistoryAfterId); $createdGenerals = []; - if (in_array($actionName, ['CreateManyNPC', 'RegNPC', 'RegNeutralNPC'], true)) { + if (in_array($actionName, ['CreateManyNPC', 'RegNPC', 'RegNeutralNPC', 'RaiseNPCNation'], true)) { foreach ($db->query('SELECT * FROM general WHERE no > %i ORDER BY no', $generalIdBeforeAction) as $row) { $generalId = (int)$row['no']; $turnRows = $db->query( @@ -391,6 +403,45 @@ function comparisonMonthlyEventTraceMain(): void ]; } } + $createdNations = []; + if ($actionName === 'RaiseNPCNation') { + foreach ($db->query('SELECT * FROM nation WHERE nation > %i ORDER BY nation', $nationIdBeforeAction) as $row) { + $nationId = (int)$row['nation']; + $createdNations[] = comparisonPickRow( + $row, + [ + 'id' => 'nation', + 'name' => 'name', + 'color' => 'color', + 'capitalCityId' => 'capital', + 'generalCount' => 'gennum', + 'gold' => 'gold', + 'rice' => 'rice', + 'tech' => 'tech', + 'level' => 'level', + 'typeCode' => 'type', + 'bill' => 'bill', + 'rate' => 'rate', + 'scout' => 'scout', + 'war' => 'war', + 'strategicCommandLimit' => 'strategic_cmd_limit', + 'surrenderLimit' => 'surlimit', + 'aux' => 'aux', + ], + ['aux'], + ) + [ + 'nationTurnCount' => (int)$db->queryFirstField( + 'SELECT count(*) FROM nation_turn WHERE nation_id = %i', + $nationId, + ), + 'diplomacyCount' => (int)$db->queryFirstField( + 'SELECT count(*) FROM diplomacy WHERE me = %i OR you = %i', + $nationId, + $nationId, + ), + ]; + } + } $response = [ 'schemaVersion' => 1, 'engine' => 'ref', @@ -403,6 +454,10 @@ function comparisonMonthlyEventTraceMain(): void if (in_array($actionName, ['CreateManyNPC', 'RegNPC', 'RegNeutralNPC'], true)) { $response['createdGenerals'] = $createdGenerals; } + if ($actionName === 'RaiseNPCNation') { + $response['createdGenerals'] = $createdGenerals; + $response['createdNations'] = $createdNations; + } echo json_encode( $response, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRESERVE_ZERO_FRACTION,