ui/phase-22: races table with stance toggle and vote slot
Adds the Races View in the in-game shell. The table lists every non-extinct other race with tech levels (percent), totals, planets, votes received, and a per-row WAR | PEACE segmented control. A single vote-recipient slot above the table queues a `CommandRaceVote`; per-row buttons queue `CommandRaceRelation`. Both commands flow through the existing order draft store with collapse-by-acceptor (stance) and singleton (vote) rules. `GameReport` widens with `races`, `myVotes`, `myVoteFor`; the decoder walks `report.player[]` once for the richer projection. The optimistic overlay flips stance and vote target immediately; `votesReceived`, `myVotes`, and the alliance summary stay server-authoritative — alliance grouping and the 2/3 victory check are tallied on the server at turn cutoff and explicitly not surfaced client-side (`rules.txt` keeps foreign races' outgoing vote targets private). Includes Vitest component coverage of stance and vote collapse rules + a Playwright e2e that drives both commands through the dispatcher route and verifies the gateway saw the expected `CommandRaceRelation` / `CommandRaceVote` payloads. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -205,6 +205,8 @@ const ru: Record<keyof typeof en, string> = {
|
||||
"game.sidebar.order.label.ship_group_dismantle": "разобрать группу {group}",
|
||||
"game.sidebar.order.label.ship_group_transfer": "передать группу {group} → {acceptor}",
|
||||
"game.sidebar.order.label.ship_group_join_fleet": "включить группу {group} → флот {fleet}",
|
||||
"game.sidebar.order.label.race_relation": "объявить {relation} расе {acceptor}",
|
||||
"game.sidebar.order.label.race_vote": "отдать голоса расе {acceptor}",
|
||||
"game.table.ship_classes.title": "классы кораблей",
|
||||
"game.table.ship_classes.column.name": "название",
|
||||
"game.table.ship_classes.column.drive": "двигатель",
|
||||
@@ -298,6 +300,27 @@ const ru: Record<keyof typeof en, string> = {
|
||||
"game.designer.science.invalid.cargo_value": "трюм % должен быть в [0, 100]",
|
||||
"game.designer.science.invalid.sum_not_hundred": "сумма четырёх процентов должна быть ровно 100",
|
||||
|
||||
"game.table.races.title": "расы",
|
||||
"game.table.races.loading": "загрузка рас…",
|
||||
"game.table.races.empty": "других рас пока не видно",
|
||||
"game.table.races.filter.placeholder": "фильтр по имени",
|
||||
"game.table.races.column.name": "имя",
|
||||
"game.table.races.column.drive": "двигатель %",
|
||||
"game.table.races.column.weapons": "оружие %",
|
||||
"game.table.races.column.shields": "защита %",
|
||||
"game.table.races.column.cargo": "трюм %",
|
||||
"game.table.races.column.population": "население",
|
||||
"game.table.races.column.industry": "производство",
|
||||
"game.table.races.column.planets": "планет",
|
||||
"game.table.races.column.votes": "получено голосов",
|
||||
"game.table.races.column.relation": "отношение",
|
||||
"game.table.races.action.war": "ВОЙНА",
|
||||
"game.table.races.action.peace": "МИР",
|
||||
"game.table.races.votes.mine": "мои голоса",
|
||||
"game.table.races.votes.target": "голосую за",
|
||||
"game.table.races.votes.target_placeholder": "— выберите расу —",
|
||||
"game.table.races.note.alliance_server_side": "альянсы и победу 2/3 подсчитывает сервер при просчёте хода; в этой таблице видно лишь мой исходящий голос и количество голосов, полученных каждой расой в прошлой раздаче",
|
||||
|
||||
"game.inspector.ship_group.kind.local": "ваша группа",
|
||||
"game.inspector.ship_group.kind.other": "группа другой расы",
|
||||
"game.inspector.ship_group.kind.incoming": "входящая группа",
|
||||
|
||||
Reference in New Issue
Block a user