test(compare): trace monthly nation statistics
This commit is contained in:
@@ -166,6 +166,9 @@ function comparisonMonthlyDetails(array $observe, int $worldHistoryAfterId): arr
|
||||
'rice' => 'rice',
|
||||
'rate' => 'rate_tmp',
|
||||
'baseRate' => 'rate',
|
||||
'power' => 'power',
|
||||
'generalCount' => 'gennum',
|
||||
'tech' => 'tech',
|
||||
'typeCode' => 'type',
|
||||
'scout' => 'scout',
|
||||
'strategicCommandLimit' => 'strategic_cmd_limit',
|
||||
@@ -229,6 +232,22 @@ function comparisonMonthlyDetails(array $observe, int $worldHistoryAfterId): arr
|
||||
$accessGeneralIds,
|
||||
));
|
||||
}
|
||||
$nationEnvironment = [];
|
||||
$nationEnvironmentKeys = $observe['nationEnvironmentKeys'] ?? [];
|
||||
if (
|
||||
!is_array($nationEnvironmentKeys)
|
||||
|| array_filter($nationEnvironmentKeys, static fn($key): bool => !is_string($key))
|
||||
) {
|
||||
throw new \InvalidArgumentException('nationEnvironmentKeys must be an array of strings');
|
||||
}
|
||||
foreach (comparisonIntegerList($observe['nationIds'] ?? [], 'nationIds') as $nationId) {
|
||||
$entry = ['nationId' => $nationId];
|
||||
$storage = KVStorage::getStorage($db, $nationId, 'nation_env');
|
||||
foreach ($nationEnvironmentKeys as $key) {
|
||||
$entry[$key] = $storage->getValue($key);
|
||||
}
|
||||
$nationEnvironment[] = $entry;
|
||||
}
|
||||
return [
|
||||
'generals' => $generals,
|
||||
'cities' => $cities,
|
||||
@@ -237,6 +256,7 @@ function comparisonMonthlyDetails(array $observe, int $worldHistoryAfterId): arr
|
||||
'inheritancePoints' => $inheritancePoints,
|
||||
'rankData' => $rankData,
|
||||
'generalAccessLogs' => $generalAccessLogs,
|
||||
'nationEnvironment' => $nationEnvironment,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -273,6 +293,7 @@ function comparisonMonthlyEventTraceMain(): void
|
||||
'LostUniqueItem',
|
||||
'MergeInheritPointRank',
|
||||
'PreUpdateMonthly',
|
||||
'PostUpdateMonthly',
|
||||
];
|
||||
if (!in_array($actionName, $supportedActions, true)) {
|
||||
throw new \InvalidArgumentException('unsupported monthly action');
|
||||
@@ -440,6 +461,20 @@ function comparisonMonthlyEventTraceMain(): void
|
||||
'refresh_score_total' => $row['refreshScoreTotal'],
|
||||
]);
|
||||
}
|
||||
foreach ($setup['nationEnvironment'] ?? [] as $row) {
|
||||
if (
|
||||
!is_array($row)
|
||||
|| !is_int($row['nationId'] ?? null)
|
||||
|| !is_string($row['key'] ?? null)
|
||||
|| !array_key_exists('value', $row)
|
||||
) {
|
||||
throw new \InvalidArgumentException('invalid setup.nationEnvironment row');
|
||||
}
|
||||
KVStorage::getStorage(DB::db(), $row['nationId'], 'nation_env')->setValue(
|
||||
$row['key'],
|
||||
$row['value'],
|
||||
);
|
||||
}
|
||||
if (($setup['resetDiplomacy'] ?? false) === true) {
|
||||
DB::db()->query('DELETE FROM diplomacy');
|
||||
}
|
||||
@@ -479,6 +514,16 @@ function comparisonMonthlyEventTraceMain(): void
|
||||
throw new \InvalidArgumentException('setup.gameEnvironment must be an object');
|
||||
}
|
||||
$gameStorage = KVStorage::getStorage(DB::db(), 'game_env');
|
||||
$worldPatch = $setup['world'] ?? [];
|
||||
if (!is_array($worldPatch)) {
|
||||
throw new \InvalidArgumentException('setup.world must be an object');
|
||||
}
|
||||
if (array_key_exists('hiddenSeed', $worldPatch)) {
|
||||
if (!is_string($worldPatch['hiddenSeed']) || $worldPatch['hiddenSeed'] === '') {
|
||||
throw new \InvalidArgumentException('setup.world.hiddenSeed must be a non-empty string');
|
||||
}
|
||||
UniqueConst::$hiddenSeed = $worldPatch['hiddenSeed'];
|
||||
}
|
||||
foreach (['isunited', 'refreshLimit', 'block_change_scout', 'lastNPCTroopLeaderID'] as $key) {
|
||||
if (array_key_exists($key, $gameEnvironmentPatch)) {
|
||||
$gameStorage->setValue($key, $gameEnvironmentPatch[$key]);
|
||||
@@ -530,7 +575,7 @@ function comparisonMonthlyEventTraceMain(): void
|
||||
}
|
||||
|
||||
$actionClass = "\\sammo\\Event\\Action\\{$actionName}";
|
||||
if ($actionName === 'PreUpdateMonthly') {
|
||||
if (in_array($actionName, ['PreUpdateMonthly', 'PostUpdateMonthly'], true)) {
|
||||
$action = null;
|
||||
} elseif ($actionName === 'ProcessSemiAnnual') {
|
||||
$resource = $request['resource'] ?? null;
|
||||
@@ -620,6 +665,18 @@ function comparisonMonthlyEventTraceMain(): void
|
||||
if (!preUpdateMonthly()) {
|
||||
throw new \RuntimeException('preUpdateMonthly failed');
|
||||
}
|
||||
} elseif ($actionName === 'PostUpdateMonthly') {
|
||||
$seedYear = $environment['seedYear'] ?? null;
|
||||
$seedMonth = $environment['seedMonth'] ?? null;
|
||||
if (!is_int($seedYear) || !is_int($seedMonth)) {
|
||||
throw new \InvalidArgumentException('PostUpdateMonthly requires seedYear and seedMonth');
|
||||
}
|
||||
postUpdateMonthly(new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
||||
UniqueConst::$hiddenSeed,
|
||||
'monthly',
|
||||
$seedYear,
|
||||
$seedMonth,
|
||||
))));
|
||||
} else {
|
||||
$action->run($actionEnvironment);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user