diff --git a/hwe/compare/fixtures/monthly_add_global_betray.json b/hwe/compare/fixtures/monthly_add_global_betray.json new file mode 100644 index 00000000..d368d54e --- /dev/null +++ b/hwe/compare/fixtures/monthly_add_global_betray.json @@ -0,0 +1,23 @@ +{ + "action": "AddGlobalBetray", + "args": [2, 1], + "setup": { + "resetGenerals": true, + "deleteOtherGenerals": true, + "keepGeneralIds": [1, 2, 3], + "general": [ + { "id": 1, "values": { "name": "배신0", "betray": 0 } }, + { "id": 2, "values": { "name": "배신1", "betray": 1 } }, + { "id": 3, "values": { "name": "배신2", "betray": 2 } } + ] + }, + "environment": { + "year": 194, + "month": 1, + "startyear": 190 + }, + "observe": { + "generalIds": [1, 2, 3] + }, + "compactOutput": true +} diff --git a/hwe/compare/fixtures/monthly_assign_general_speciality.json b/hwe/compare/fixtures/monthly_assign_general_speciality.json new file mode 100644 index 00000000..0f0349df --- /dev/null +++ b/hwe/compare/fixtures/monthly_assign_general_speciality.json @@ -0,0 +1,79 @@ +{ + "action": "AssignGeneralSpeciality", + "setup": { + "resetGenerals": true, + "deleteOtherGenerals": true, + "keepGeneralIds": [1, 2, 3], + "general": [ + { + "id": 1, + "values": { + "name": "내정대상", + "nation": 1, + "age": 30, + "leadership": 40, + "strength": 45, + "intel": 80, + "special": "None", + "specage": 30, + "special2": "che_신산", + "specage2": 99, + "aux": { + "prev_types_special": ["che_경작"] + } + } + }, + { + "id": 2, + "values": { + "name": "전투대상", + "nation": 1, + "age": 30, + "leadership": 80, + "strength": 75, + "intel": 40, + "special": "che_인덕", + "specage": 99, + "special2": "None", + "specage2": 30, + "dex1": 200, + "dex2": 10, + "dex3": 10, + "dex4": 10, + "dex5": 10, + "aux": { + "prev_types_special2": ["che_돌격"] + } + } + }, + { + "id": 3, + "values": { + "name": "계승대상", + "nation": 2, + "age": 30, + "leadership": 50, + "strength": 50, + "intel": 50, + "special": "che_경작", + "specage": 99, + "special2": "None", + "specage2": 30, + "aux": { + "inheritSpecificSpecialWar": "che_의술", + "marker": 3 + } + } + } + ] + }, + "environment": { + "year": 200, + "month": 1, + "startyear": 190 + }, + "observe": { + "generalIds": [1, 2, 3] + }, + "compactOutput": true +} diff --git a/hwe/compare/monthly_event_trace.php b/hwe/compare/monthly_event_trace.php index af0c8906..c666e0ee 100644 --- a/hwe/compare/monthly_event_trace.php +++ b/hwe/compare/monthly_event_trace.php @@ -44,7 +44,8 @@ function comparisonMonthlyPatch(string $table, int $id, array $values): void 'gold', 'rice', 'horse', 'weapon', 'book', 'item', 'aux', 'leadership', 'strength', 'intel', 'experience', 'dedication', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5', 'personal', 'special', - 'special2', 'bornyear', 'deadyear', 'turntime', + 'specage', 'special2', 'specage2', 'betray', 'age', + 'bornyear', 'deadyear', 'turntime', ], ], ]; @@ -98,7 +99,23 @@ function comparisonMonthlyDetails(array $observe, int $worldHistoryAfterId): arr 'atmos' => 'atmos', 'gold' => 'gold', 'rice' => 'rice', + 'leadership' => 'leadership', + 'strength' => 'strength', + 'intelligence' => 'intel', + 'age' => 'age', + 'specialDomestic' => 'special', + 'specAge' => 'specage', + 'specialWar' => 'special2', + 'specAge2' => 'specage2', + 'betray' => 'betray', + 'dex1' => 'dex1', + 'dex2' => 'dex2', + 'dex3' => 'dex3', + 'dex4' => 'dex4', + 'dex5' => 'dex5', + 'aux' => 'aux', ], + ['aux'], ), comparisonRowsById('general', 'no', comparisonIntegerList($observe['generalIds'] ?? [], 'generalIds')), ); @@ -212,6 +229,8 @@ function comparisonMonthlyEventTraceMain(): void 'FinishNationBetting', 'BlockScoutAction', 'UnblockScoutAction', + 'AssignGeneralSpeciality', + 'AddGlobalBetray', ]; if (!in_array($actionName, $supportedActions, true)) { throw new \InvalidArgumentException('unsupported monthly action'); @@ -423,7 +442,7 @@ function comparisonMonthlyEventTraceMain(): void throw new \InvalidArgumentException('ProcessSemiAnnual requires resource'); } $action = new $actionClass($resource); - } elseif (in_array($actionName, ['CreateManyNPC', 'RegNPC', 'RegNeutralNPC', 'RaiseInvader', 'AutoDeleteInvader', 'ChangeCity', 'OpenNationBetting', 'FinishNationBetting', 'BlockScoutAction', 'UnblockScoutAction'], true)) { + } elseif (in_array($actionName, ['CreateManyNPC', 'RegNPC', 'RegNeutralNPC', 'RaiseInvader', 'AutoDeleteInvader', 'ChangeCity', 'OpenNationBetting', 'FinishNationBetting', 'BlockScoutAction', 'UnblockScoutAction', 'AddGlobalBetray'], true)) { $args = $request['args'] ?? []; if (!is_array($args)) { throw new \InvalidArgumentException("{$actionName} args must be an array"); @@ -446,6 +465,9 @@ function comparisonMonthlyEventTraceMain(): void if (in_array($actionName, ['BlockScoutAction', 'UnblockScoutAction'], true) && count($args) > 1) { throw new \InvalidArgumentException("{$actionName} args must have at most one entry"); } + if ($actionName === 'AddGlobalBetray' && count($args) > 2) { + throw new \InvalidArgumentException('AddGlobalBetray args must have at most two entries'); + } $action = new $actionClass(...$args); } else { $action = new $actionClass(); @@ -733,6 +755,7 @@ function comparisonMonthlyEventTraceMain(): void 'createdEvents' => $response['createdEvents'] ?? [], 'createdDiplomacy' => $response['createdDiplomacy'] ?? [], 'gameEnvironment' => $response['gameEnvironment'] ?? [], + 'logs' => $after['logs'], 'observedGeneralTurns' => $observedGeneralTurns, 'remainingEventIds' => array_map( 'intval',