fix(game): resolve battles ship by ship, matching the combat rules #76

Merged
developer merged 1 commits from feature/game-combat-correctness into development 2026-05-30 22:06:44 +00:00
Owner

Что

Этап 1 сверки Правил и движка: разрешение боя приведено в соответствие с документированной моделью (game/rules.txt, раздел «Сражения»).

Исправлены три дефекта:

  • Инвертированный бросок уничтоженияrand >= p уничтожал цель с вероятностью 1-p; почти верное попадание почти всегда промахивалось. Теперь rand < p.
  • Группа стреляла как один корабль — группа делала Armament выстрелов за раунд независимо от числа кораблей, и размер флота не влиял на атаку. SingleBattle теперь по-корабельный: каждый живой корабль стреляет раз в раунд в случайном порядке по всем группам, каждое орудие — по случайному вражескому кораблю (с весом по числу кораблей группы).
  • Масса группы вместо корабля в защите — вероятность делила щиты на полную массу всей группы вместо одного корабля-цели, ослабляя сгруппированные корабли в ~Number^(1/3). FilterBattleOpponents теперь считает массу по одному кораблю.

Заодно исправлена инициализация карты противников в ProduceBattles, из-за которой у атакующего оставался только последний противник.

Документация

Без изменений: раздел «Сражения» уже описывает эту модель; форма BattleReport не менялась.

Тесты

go test ./game/... зелёный. Новые: TestDestructionRollDirection, TestSingleBattleOneSidedWipe; обновлено ожидание массы-по-кораблю в TestFilterBattleOpponents.

## Что Этап 1 сверки Правил и движка: разрешение боя приведено в соответствие с документированной моделью (`game/rules.txt`, раздел «Сражения»). Исправлены три дефекта: - **Инвертированный бросок уничтожения** — `rand >= p` уничтожал цель с вероятностью `1-p`; почти верное попадание почти всегда промахивалось. Теперь `rand < p`. - **Группа стреляла как один корабль** — группа делала `Armament` выстрелов за раунд независимо от числа кораблей, и размер флота не влиял на атаку. `SingleBattle` теперь по-корабельный: каждый живой корабль стреляет раз в раунд в случайном порядке по всем группам, каждое орудие — по случайному вражескому кораблю (с весом по числу кораблей группы). - **Масса группы вместо корабля в защите** — вероятность делила щиты на полную массу всей группы вместо одного корабля-цели, ослабляя сгруппированные корабли в ~`Number^(1/3)`. `FilterBattleOpponents` теперь считает массу по одному кораблю. Заодно исправлена инициализация карты противников в `ProduceBattles`, из-за которой у атакующего оставался только последний противник. ## Документация Без изменений: раздел «Сражения» уже описывает эту модель; форма `BattleReport` не менялась. ## Тесты `go test ./game/...` зелёный. Новые: `TestDestructionRollDirection`, `TestSingleBattleOneSidedWipe`; обновлено ожидание массы-по-кораблю в `TestFilterBattleOpponents`.
developer added 1 commit 2026-05-30 22:00:21 +00:00
fix(game): resolve battles ship by ship, matching the combat rules
Tests · Go / test (push) Successful in 2m2s
Tests · Integration / integration (pull_request) Successful in 1m48s
Tests · Go / test (pull_request) Successful in 2m0s
cc67364113
The battle engine diverged from the documented combat model
(game/rules.txt "Сражения") in three ways:

- the destruction roll was inverted (rand >= p), so a near-certain hit
  destroyed its target only ~(1-p) of the time;
- a whole group fired as a single ship (Armament shots per round)
  regardless of its ship count, so fleet size never affected offence;
- the defending mass used the whole group's full mass instead of one
  target ship's, weakening grouped ships' shields by ~Number^(1/3).

SingleBattle now resolves ship by ship: every living ship fires once per
round in random order across all groups, each gun targets a random enemy
ship (weighted by group size), and the destruction roll matches the
documented probability. FilterBattleOpponents evaluates per-ship mass.

Also fixes opponent-map initialisation in ProduceBattles that kept only
an attacker's last opponent.

The rules already describe this model, so no documentation change is
needed. Tests: per-ship one-sided wipe, destruction-roll direction, and
the updated per-ship-mass probability expectation.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
owner approved these changes 2026-05-30 22:05:44 +00:00
developer merged commit 5e86ca9999 into development 2026-05-30 22:06:44 +00:00
developer deleted branch feature/game-combat-correctness 2026-05-30 22:06:44 +00:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: developer/galaxy-game#76