diff --git a/hwe/compare/turn_command_trace.php b/hwe/compare/turn_command_trace.php index 6e37cd69..0cc9eb39 100644 --- a/hwe/compare/turn_command_trace.php +++ b/hwe/compare/turn_command_trace.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace sammo; +use sammo\Enums\RankColumn; + if (PHP_SAPI !== 'cli') { http_response_code(404); exit; @@ -358,6 +360,30 @@ function comparisonApplyTurnFixtureSetup(mixed $setup): void $db->update('general', $patch, 'no = %i', $row['id']); } } + foreach ($setup['rankData'] ?? [] as $row) { + if ( + !is_array($row) + || !is_int($row['generalId'] ?? null) + || !is_string($row['type'] ?? null) + || RankColumn::tryFrom($row['type']) === null + || !is_int($row['value'] ?? null) + ) { + throw new \InvalidArgumentException('invalid setup.rankData row'); + } + $nationId = (int)($db->queryFirstField( + 'SELECT nation FROM general WHERE no = %i', + $row['generalId'], + ) ?? 0); + $db->insertUpdate('rank_data', [ + 'general_id' => $row['generalId'], + 'nation_id' => $nationId, + 'type' => $row['type'], + 'value' => $row['value'], + ], [ + 'nation_id' => $nationId, + 'value' => $row['value'], + ]); + } if (($setup['isolateWorld'] ?? false) === true && ($setup['generals'] ?? []) !== []) { $maxGeneralId = max(array_map( static fn(array $row): int => (int)$row['id'], diff --git a/hwe/compare/turn_state_snapshot.php b/hwe/compare/turn_state_snapshot.php index fcd9fc29..5f758eb9 100644 --- a/hwe/compare/turn_state_snapshot.php +++ b/hwe/compare/turn_state_snapshot.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace sammo; +use sammo\Enums\RankColumn; + if (PHP_SAPI !== 'cli') { http_response_code(404); exit; @@ -229,6 +231,19 @@ function comparisonTurnStateSnapshot(array $request): array }, comparisonRowsById('general', 'no', $generalIds), ); + $rankTypes = array_map( + static fn(RankColumn $column): string => $column->value, + RankColumn::cases(), + ); + $rankData = $generalIds === [] + ? [] + : iterator_to_array($db->query( + 'SELECT general_id AS generalId, nation_id AS nationId, `type`, `value`' + . ' FROM rank_data WHERE general_id IN %li AND `type` IN %ls' + . ' ORDER BY general_id, `type`', + $generalIds, + $rankTypes, + )); $cities = array_map( static fn(array $row): array => comparisonPickRow( @@ -412,6 +427,7 @@ function comparisonTurnStateSnapshot(array $request): array 'generalCooldowns' => $generalCooldowns, ], 'generals' => $generals, + 'rankData' => $rankData, 'cities' => $cities, 'nations' => $nations, 'diplomacy' => $diplomacy,