fix(game): fight before departure and reorder the turn sequence
Tests · Go / test (push) Successful in 1m58s
Tests · Integration / integration (pull_request) Successful in 1m50s
Tests · Go / test (pull_request) Successful in 2m5s

Per the documented turn order (game/rules.txt "Последовательность
действий"), no ship should dodge the pre-departure battle by slipping
into hyperspace. MakeTurn now runs merge -> battle -> load+launch routed
groups -> fly -> merge -> battle, so:

- ships ordered to depart (Launched) and ships being upgraded now take
  part in the pre-departure battle at their planet (CollectPlanetGroups /
  FilterBattleGroups); only survivors then enter hyperspace;
- routed transports are loaded and launched AFTER that battle, so they
  fight empty and cannot escape it.

A just-launched group has no stored hyperspace position, so moveShipGroup
starts its first leg from the origin planet; the previous code read the
nil launch coordinate and would panic.

Because upgrading groups can now lose ships in the battle, the pending
upgrade cost is recomputed from the group's current ship count instead of
the value stored when the order was validated.

Rules: reordered "Последовательность действий" and rewrote the combat
note that ordered/routed ships skip the battle.

Tests: launched-group move from origin, launched/upgrade groups taking
part in battle, upgrade cost tracking ship losses.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ilia Denisov
2026-05-31 00:25:46 +02:00
parent 5e86ca9999
commit b4abf90ec5
11 changed files with 198 additions and 53 deletions
+30 -27
View File
@@ -849,9 +849,12 @@ Freighter загруженный 15 ед. груза при технологии
находится с агрессором в состоянии мира, также вступит в сражение. Это вовсе
не означает, что у нападающих есть право первого выстрела, все сражающиеся
стороны находятся в абсолютно равных условиях ведения сражения, и первым
выстрелит тот, кто более удачлив. Отосланные с планеты вручную или по
маршруту корабли уже вошли в гиперпространство и участия в сражениях не
принимают (см. "Последовательность действий").
выстрелит тот, кто более удачлив. Корабли, которым отдан приказ на отлёт, а
также корабли, отправляемые по установленным грузовым маршрутам, к началу хода
ещё находятся на планете отправления и принимают участие в сражении у этой
планеты — в гиперпространство уходят лишь уцелевшие в нём корабли. Корабль,
уже находящийся в гиперпространстве, в сражениях не участвует вплоть до
прибытия на планету назначения (см. "Последовательность действий").
В каждом раунде сражения все корабли получают шанс выстрелить по противнику,
разумеется, если в этом же раунде его противники не были более удачливы и не
@@ -1080,57 +1083,57 @@ Freighter загруженный 15 ед. груза при технологии
Последовательность действий
~~~~~~~~~~~~~~~~~~~~~~~~~~~
После того, как получены приказы от всех рас, определено
производство, загружены товары, корабли вошли в гиперпространство и
т.д. происходит сам ход, т.е. следующая последовательность действий:
После того, как получены приказы от всех рас, происходит сам ход, т.е.
следующая последовательность действий:
- Корабли передаются новым владельцам.
- Корабли передаются новым владельцам.
- Расы, покинувшие игру, освобождаются от своего имущества.
- ------------------------------------ \
} "Выполнение отданных приказов (всех?)"
- Корабли разгружаются согласно отданным приказам. /
- Выполняются все отданные расами приказы. В частности, корабли разгружаются
согласно приказам, а кораблям может быть отдан приказ на отлёт: такие корабли
получают готовность к отлёту, но физически остаются на планете отправления.
- Корабли, где это возможно, объединяются в группы.
- Товары загружаются на корабли, находящиеся в начале грузовых
маршрутов.
- Враждующие корабли вступают в схватку у планет отправления. Корабли, которым
отдан приказ на отлёт, ещё стоят на планете и участвуют в этой схватке; в
гиперпространство уходят только уцелевшие.
- Корабли входят в гиперпространство.
- Товары загружаются на корабли, находящиеся в начале грузовых маршрутов
(после схватки — маршрутные транспорты сражаются незагруженными).
- Враждующие корабли вступают в схватку.
- Корабли пролетают сквозь гиперпространство.
- Корабли (готовые к отлёту и снаряжённые по маршрутам) входят в
гиперпространство и пролетают сквозь него.
- Корабли, где это возможно, объединяются в группы.
- Враждующие корабли вступают в схватку (после выхода из гиперпространства).
- Враждующие корабли вступают в схватку (после выхода из гиперпространства,
у планет назначения).
- Корабли бомбят вражеские планеты.
+ На планетах модернизируются корабли.
- На планетах модернизируются корабли.
- На планетах строятся корабли (с учётом производственного потенциала,
оставшегося от модернизации кораблей).
+ Корабли, где это возможно, объединяются в группы.
- Корабли, где это возможно, объединяются в группы.
- На планетах производится промышленность, добывается сырье,
разрабатываются новые технологии.
- На планетах производится промышленность, добывается сырьё, разрабатываются
новые технологии.
- Увеличивается население планет.
- Корабли разгружаются в конце грузовых маршрутов.
+ Выгруженные колонисты увеличивают население планеты (если население
планеты ниже её размера).
- Выгруженные колонисты увеличивают население планеты (если население планеты
ниже её размера).
- Накопленная и выгруженная промышленность увеличивает
производственный уровень планеты (если производственный уровень
планеты ниже уровня населения).
- Накопленная и выгруженная промышленность увеличивает производственный уровень
планеты (если производственный уровень планеты ниже уровня населения).
- Происходит отмена маршрутов, выходящих за зону полета кораблей.
- Происходит отмена маршрутов, выходящих за зону полёта кораблей.
- Происходит голосование.