diff --git a/hwe/compare/monthly_event_trace.php b/hwe/compare/monthly_event_trace.php index 216511b2..11f2a016 100644 --- a/hwe/compare/monthly_event_trace.php +++ b/hwe/compare/monthly_event_trace.php @@ -114,12 +114,19 @@ function comparisonMonthlyDetails(array $observe, int $worldHistoryAfterId): arr 'term' => 'term', 'dead' => 'dead', 'population' => 'pop', + 'populationMax' => 'pop_max', 'agriculture' => 'agri', + 'agricultureMax' => 'agri_max', 'commerce' => 'comm', + 'commerceMax' => 'comm_max', 'security' => 'secu', + 'securityMax' => 'secu_max', 'trust' => 'trust', + 'trade' => 'trade', 'defence' => 'def', + 'defenceMax' => 'def_max', 'wall' => 'wall', + 'wallMax' => 'wall_max', 'conflict' => 'conflict', ], ['conflict'], @@ -198,6 +205,8 @@ function comparisonMonthlyEventTraceMain(): void 'RaiseInvader', 'AutoDeleteInvader', 'InvaderEnding', + 'ChangeCity', + 'ProvideNPCTroopLeader', ]; if (!in_array($actionName, $supportedActions, true)) { throw new \InvalidArgumentException('unsupported monthly action'); @@ -313,7 +322,7 @@ function comparisonMonthlyEventTraceMain(): void throw new \InvalidArgumentException('setup.gameEnvironment must be an object'); } $gameStorage = KVStorage::getStorage(DB::db(), 'game_env'); - foreach (['isunited', 'refreshLimit', 'block_change_scout'] as $key) { + foreach (['isunited', 'refreshLimit', 'block_change_scout', 'lastNPCTroopLeaderID'] as $key) { if (array_key_exists($key, $gameEnvironmentPatch)) { $gameStorage->setValue($key, $gameEnvironmentPatch[$key]); } @@ -370,7 +379,7 @@ function comparisonMonthlyEventTraceMain(): void throw new \InvalidArgumentException('ProcessSemiAnnual requires resource'); } $action = new $actionClass($resource); - } elseif (in_array($actionName, ['CreateManyNPC', 'RegNPC', 'RegNeutralNPC', 'RaiseInvader', 'AutoDeleteInvader'], true)) { + } elseif (in_array($actionName, ['CreateManyNPC', 'RegNPC', 'RegNeutralNPC', 'RaiseInvader', 'AutoDeleteInvader', 'ChangeCity'], true)) { $args = $request['args'] ?? []; if (!is_array($args)) { throw new \InvalidArgumentException("{$actionName} args must be an array"); @@ -381,6 +390,9 @@ function comparisonMonthlyEventTraceMain(): void if ($actionName === 'RaiseInvader' && count($args) > 4) { throw new \InvalidArgumentException('RaiseInvader args must have at most four entries'); } + if ($actionName === 'ChangeCity' && count($args) !== 2) { + throw new \InvalidArgumentException('ChangeCity args must have exactly two entries'); + } $action = new $actionClass(...$args); } else { $action = new $actionClass(); @@ -405,7 +417,7 @@ function comparisonMonthlyEventTraceMain(): void $actionEnvironment['killturn'] = $killturn; $actionEnvironment['turnterm'] = $turnterm; } - if (in_array($actionName, ['CreateManyNPC', 'RegNPC', 'RegNeutralNPC', 'RaiseNPCNation', 'RaiseInvader'], true)) { + if (in_array($actionName, ['CreateManyNPC', 'RegNPC', 'RegNeutralNPC', 'RaiseNPCNation', 'RaiseInvader', 'ProvideNPCTroopLeader'], true)) { $turnterm = $environment['turnterm'] ?? null; $turntime = $environment['turntime'] ?? null; $showImgLevel = $environment['show_img_level'] ?? 3; @@ -437,7 +449,7 @@ function comparisonMonthlyEventTraceMain(): void $after = comparisonTurnStateSnapshot($snapshotRequest); $afterDetails = comparisonMonthlyDetails($snapshotRequest['observe'], $worldHistoryAfterId); $createdGenerals = []; - if (in_array($actionName, ['CreateManyNPC', 'RegNPC', 'RegNeutralNPC', 'RaiseNPCNation', 'RaiseInvader'], true)) { + if (in_array($actionName, ['CreateManyNPC', 'RegNPC', 'RegNeutralNPC', 'RaiseNPCNation', 'RaiseInvader', 'ProvideNPCTroopLeader'], true)) { foreach ($db->query('SELECT * FROM general WHERE no > %i ORDER BY no', $generalIdBeforeAction) as $row) { $generalId = (int)$row['no']; $turnRows = $db->query( @@ -494,6 +506,10 @@ function comparisonMonthlyEventTraceMain(): void 'SELECT count(*) FROM rank_data WHERE general_id = %i AND value != 0', $generalId, ), + 'troop' => $db->queryFirstRow( + 'SELECT troop_leader AS id, nation AS nationId, name FROM troop WHERE troop_leader = %i', + $generalId, + ) ?: null, ]; } } @@ -552,6 +568,12 @@ function comparisonMonthlyEventTraceMain(): void $response['createdGenerals'] = $createdGenerals; $response['createdNations'] = $createdNations; } + if ($actionName === 'ProvideNPCTroopLeader') { + $response['createdGenerals'] = $createdGenerals; + $response['gameEnvironment'] = KVStorage::getStorage(DB::db(), 'game_env')->getValues([ + 'lastNPCTroopLeaderID', + ]); + } if ($actionName === 'RaiseInvader') { $response['createdEvents'] = array_map( static fn(array $row): array => comparisonPickRow(