docs(site): publish game rules (RU) and migrate off game/rules.txt #85

Merged
developer merged 7 commits from feature/site-rules-ru into development 2026-05-31 15:45:06 +00:00
18 changed files with 56 additions and 1511 deletions
Showing only changes of commit 140ee8e0ee - Show all commits
+6
View File
@@ -16,6 +16,12 @@ This repository hosts the Galaxy Game project.
mirrored into `docs/FUNCTIONAL_ru.md` in the same patch (translate mirrored into `docs/FUNCTIONAL_ru.md` in the same patch (translate
the changed paragraphs only, do not re-translate the whole file). the changed paragraphs only, do not re-translate the whole file).
A full re-translation only happens on explicit owner request. A full re-translation only happens on explicit owner request.
- `site/ru/rules.md` — the player-facing game rules (ported from the
former `game/rules.txt`). **Russian is authoritative here**, inverting
the usual English-first rule: the game's rules and lore are
Russian-native, so `site/ru/rules.md` leads and the English
`site/rules.md` is its mirror. Mirror point edits the same way as
`docs/FUNCTIONAL.md`, but RU → EN.
- `docs/TESTING.md` — testing layers (unit / integration), the - `docs/TESTING.md` — testing layers (unit / integration), the
integration runbook, and the principles every test must follow integration runbook, and the principles every test must follow
(no-op observability for testcontainers, `t.Fatal` on (no-op observability for testcontainers, `t.Fatal` on
-1462
View File
File diff suppressed because it is too large Load Diff
+5
View File
@@ -20,6 +20,11 @@ under `/game/` (see `tools/dev-deploy/Caddyfile.dev`).
- Add a page as Markdown and register it in the `sidebar` of each locale - Add a page as Markdown and register it in the `sidebar` of each locale
in `.vitepress/config.ts`. in `.vitepress/config.ts`.
- Localised content mirrors the English tree under `ru/`. - Localised content mirrors the English tree under `ru/`.
- **Game rules** (`ru/rules.md`) are the one exception to English-first:
the Russian page is the authoritative source (ported from the former
`game/rules.txt`), and the English `rules.md` is its mirror/translation.
Keep the two in sync as with `FUNCTIONAL.md`/`FUNCTIONAL_ru.md`, but with
Russian leading.
- Math uses LaTeX: inline `$E = mc^2$`, block `$$ … $$`. - Math uses LaTeX: inline `$E = mc^2$`, block `$$ … $$`.
- Link to the game with the root-relative `/game/` path so the build - Link to the game with the root-relative `/game/` path so the build
stays domain-agnostic (no hard-coded host). stays domain-agnostic (no hard-coded host).
+8 -2
View File
@@ -1,5 +1,11 @@
# Galaxy # Galaxy
Пошаговая космическая стратегия. Пошаговая многопользовательская стратегия о борьбе за галактику.
[Играть →](/game/){target="_self"} Вы — лидер расы среди звёзд. Развивайте планеты, исследуйте технологии, проектируйте и стройте собственные корабли, осваивайте новые миры. С кем воевать, а с кем дружить — решаете только вы, и победа достаётся не одной лишь силой оружия: голоса, союзы и дипломатия значат не меньше пушек.
Каждый ход сервер просчитывает приказы всех игроков разом, и галактика живёт своей жизнью: колонизируются планеты, вспыхивают сражения, между расами течёт поток дипломатической почты. Игроки анонимны — поэтому за каждой расой может стоять придуманный характер, и здесь принято не только считать ресурсы, но и отыгрывать свою роль.
Чтобы играть, достаточно отправлять несколько строк приказов за ход. А вот простора для стратегии хватит надолго.
[Играть →](/game/){target="_self"} · [Правила игры →](/ru/rules)
+18 -27
View File
@@ -2,15 +2,9 @@
Руководство игрока. Руководство игрока.
## Популярно про Galaxy {#about-galaxy}
Galaxy - это многопользовательская стратегическая фантастическая сетевая компьютерная игра. Каждый из игроков - предводитель расы в Галактике. Цель игры - управляя своей расой, распространить свою власть на всю Галактику. В Galaxy играют с давних пор. Многие люди находят ее настолько увлекательной и интересной, что проводят играя долгие часы. Хотя вся игра может быть сведена к отсылке нескольких строк с командами на Galaxy-сервер, эти команды настолько важны для игроков, что над их содержанием игроки проводят большую часть времени. Кроме того в Galaxy есть возможность общаться с остальными игроками. А поскольку, настоящие адреса игроков хранятся в тайне, и никто без желания самих игроков не сможет узнать их настоящий адрес, возникает возможность ролевого общения, когда каждый из участников действует и говорит от лица вымышленного им персонажа. Персонажа, имеющего свои черты, свой характер свои взгляды на жизнь, которые могут не совпадать со взглядами самого игрока.
Словом, Galaxy - это свой мир, настоящая виртуальная реальность. В Galaxy бурлит настоящая жизнь. То здесь то там слышны слова дружбы и вражды, проклятий и благодарности, злорадства и мольбы о помощи. На космических верфях строятся звездные суда самых разнообразных и неимовернейших характеристик. Развиваются новые планеты, разрабатываются технологии, осваиваются новые месторождения полезных ископаемых, заключаются союзы и объявляются войны. На каждом ходу в каждой Галактике совершается несчетное множество событий. Космические лайнеры совершают перелеты от планеты к планете, доставляя все необходимое. Рождаются и умирают расы. Нескончаемый поток писем течет через сервер. Здесь и команды лидеров рас, и личная переписка игроков, и отчеты, которые генерирует неутомимый сервер, и статьи, присланные специально для помещения в Галактическую газету. Здесь слезы и смех, надежды и отчаяния, честность и подлость, коварство и благородство, беззаветная дружба и расчетливое предательство. Здесь жизнь и смерть. Здесь почта от разбойников и рыцарей, прекрасных дам и безобразных мутантов, драконов и насекомых, великанов и карликов, людей и нет. Это Галактика и здесь есть все! Если вы решили попробовать свои силы в Galaxy, то приготовьтесь вступить в настоящий мир. Мир, который создан для того, чтобы люди получили возможность общения на новом, необычном для них уровне. Мир, где вы, как и в реальной жизни, должны будете отвечать за свои поступки. Мир, где вы сможете приобрести друзей и врагов. Мир, который может стать для вас второй жизнью.
## Процесс игры {#turn-cycle} ## Процесс игры {#turn-cycle}
Весь процесс игры разделен на ходы, которые в свою очередь можно разделить на два чередующихся процесса: "производство хода" и "ожидание производства нового хода". Считается, что "производство хода" процесс не требующий времени и условно происходящий мгновенно. В этот момент совершается само действие, т.е. выполняется процесс производства на планетах, происходят сражения флотов враждующих рас и передвижение кораблей от планеты к планете (подробнее см. "Последовательность действий"). Весь процесс игры разделен на ходы, которые в свою очередь можно разделить на два чередующихся процесса: "производство хода" и "ожидание производства нового хода". Считается, что "производство хода" процесс не требующий времени и условно происходящий мгновенно. В этот момент совершается само действие, т.е. выполняется процесс производства на планетах, происходят [сражения](#combat) флотов враждующих рас и [передвижение кораблей](#movement) от планеты к планете — полный порядок этих шагов описан в разделе [«Последовательность действий»](#turn-sequence).
Существует также понятие "состояние игры", которое соответствует текущему положению дел (в том числе, у кого сколько чего есть, кто что делает, какие корабли куда летят и т.п.). Состояние игры соответствует отчёту, который получает игрок сразу после производства очередного хода. Существует также понятие "состояние игры", которое соответствует текущему положению дел (в том числе, у кого сколько чего есть, кто что делает, какие корабли куда летят и т.п.). Состояние игры соответствует отчёту, который получает игрок сразу после производства очередного хода.
@@ -48,7 +42,7 @@ Galaxy - это многопользовательская стратегиче
Числа, используемые в командах и отчетах, представляются с точностью до трёх десятичных знаков после запятой. Сервер хранит числа и производит вычисления с большей точностью, округляя результаты лишь для представления игрокам в отчётах. Например, если в отчете стоит число 2.000, это может означать, что на самом деле число может колебаться от 1.9995 до 2.0004. Числа, используемые в командах и отчетах, представляются с точностью до трёх десятичных знаков после запятой. Сервер хранит числа и производит вычисления с большей точностью, округляя результаты лишь для представления игрокам в отчётах. Например, если в отчете стоит число 2.000, это может означать, что на самом деле число может колебаться от 1.9995 до 2.0004.
Исключение составляют технологические уровни кораблей (см. "Технолгии"). Исключение составляют технологические уровни кораблей — в отчётах они приводятся без такого округления (см. [«Технологии»](#tech)).
## Наименования {#names} ## Наименования {#names}
@@ -85,7 +79,7 @@ Galaxy - это многопользовательская стратегиче
## Население {#population} ## Население {#population}
Каждая планета имеет атрибут "Размер". Он характеризует не только физический размер планеты, но также обуславливает наличие гор, пустынь и океанов, климат и т. п. Население планеты не может превышать её размер, но может быть меньше. Ваша первая планета имеет размер и население равными 1000. Население планеты увеличивается на 8% на каждом ходу. Часть населения планеты, превышающая ее размер, превращается в колонистов. Следует помнить, что количество населения планеты ограничивает рост промышленности (см. ниже), поскольку количество единиц промышленности не может превышать количество единиц населения. Каждая планета имеет атрибут "Размер". Он характеризует не только физический размер планеты, но также обуславливает наличие гор, пустынь и океанов, климат и т. п. Население планеты не может превышать её размер, но может быть меньше. Ваша первая планета имеет размер и население равными 1000. Население планеты увеличивается на 8% на каждом ходу. Часть населения планеты, превышающая её размер, превращается в [колонистов](#colonists). Следует помнить, что население планеты ограничивает рост [промышленности](#industry): количество единиц промышленности не может превышать количество единиц населения.
## Колонисты {#colonists} ## Колонисты {#colonists}
@@ -109,7 +103,7 @@ $$\text{Производственный потенциал} = \text{промы
## Технологии {#tech} ## Технологии {#tech}
Вы начинаете с технологическим уровнем 1 в следующих областях: Двигатели (Drive), Оружие (Weapons), Защита (Shields) и Грузоперевозки (Cargo). Эти уровни могут быть повышены переключением производства планет на исследования. Чтобы увеличить технологический уровень на единицу, необходимо затратить 5000 производственных единиц. Дробные показатели затрат на исследования технологий непременно будут полезными. Так, если вы затратили 500 единиц на исследования в области Оружия, Ваш технологический уровень в этой области возрастет на одну десятую и это даст немедленный эффект при постройке кораблей, нет необходимости ждать, пока уровень возрастет на целую единицу. В момент постройки корабля, он получает такие уровни технологий, какие Вы имели на момент начала производства хода (см. "Последовательность действий"). Уровни технологий уже построенных кораблей в дальнейшем можно обновить с помощью команды модернизации. Вы начинаете с технологическим уровнем 1 в следующих областях: Двигатели (Drive), Оружие (Weapons), Защита (Shields) и Грузоперевозки (Cargo). Эти уровни могут быть повышены переключением производства планет на исследования. Чтобы увеличить технологический уровень на единицу, необходимо затратить 5000 производственных единиц. Дробные показатели затрат на исследования технологий непременно будут полезными. Так, если вы затратили 500 единиц на исследования в области Оружия, Ваш технологический уровень в этой области возрастет на одну десятую и это даст немедленный эффект при постройке кораблей, нет необходимости ждать, пока уровень возрастет на целую единицу. В момент постройки корабля он получает те уровни технологий, какие были у Вас на момент начала производства хода (см. [«Последовательность действий»](#turn-sequence)). Уровни технологий уже построенных кораблей в дальнейшем можно обновить с помощью команды модернизации.
В целях избежания неточностей в расчетах, технологические уровни кораблей округляются до третьего знака после запятой в момент постройки или модернизации. Поэтому в отчетах у кораблей всегда указываются действительные, а не округлённые уровни технологий. В целях избежания неточностей в расчетах, технологические уровни кораблей округляются до третьего знака после запятой в момент постройки или модернизации. Поэтому в отчетах у кораблей всегда указываются действительные, а не округлённые уровни технологий.
@@ -125,7 +119,7 @@ $$\text{Производственный потенциал} = \text{промы
Производство чего-либо, кроме технологий, требует затрат сырья так же, как и производственных затрат. Сырье соответствует таким материалам, как листовая сталь, медная проволока, древесина и нефть и т.п., необходимые для производства. Каждая планета может иметь запас произведённого или привезённого сырья, которое можно использовать при производстве кораблей. Если такой запас отсутствует, часть производственных единиц может быть ориентирована на выпуск сырья. Производство чего-либо, кроме технологий, требует затрат сырья так же, как и производственных затрат. Сырье соответствует таким материалам, как листовая сталь, медная проволока, древесина и нефть и т.п., необходимые для производства. Каждая планета может иметь запас произведённого или привезённого сырья, которое можно использовать при производстве кораблей. Если такой запас отсутствует, часть производственных единиц может быть ориентирована на выпуск сырья.
Как известно, каждая планета имеет неизменную характеристику - Природные Ресурсы, которая показывает, насколько планета богата запасами металлов, угля, нефти и т.п. Планеты с высоким показателем Ресурсов требуют меньших затрат на производство сырья. Показатель зависит от типа планеты (см. таблицу выше): у обитаемых планет он строго больше нуля и доходит до 25 у редких богато одарённых планет, и лишь у астероидов равен нулю. Ваши первые планеты имеют показатели ресурсов 10, что означает, что каждая производственная единица может произвести 10 единиц сырья. Планета с показателем сырья 0.1 может произвести только 0.1 единиц сырья на каждую производственную единицу. Произведённое сырьё складируется и может быть транспортировано на другие планеты с помощью грузовых кораблей. Как известно, каждая планета имеет неизменную характеристику - Природные Ресурсы, которая показывает, насколько планета богата запасами металлов, угля, нефти и т.п. Планеты с высоким показателем Ресурсов требуют меньших затрат на производство сырья. Показатель зависит от [типа планеты](#planets): у обитаемых планет он строго больше нуля и доходит до 25 у редких богато одарённых планет, и лишь у астероидов равен нулю. Ваши первые планеты имеют показатели ресурсов 10, что означает, что каждая производственная единица может произвести 10 единиц сырья. Планета с показателем сырья 0.1 может произвести только 0.1 единиц сырья на каждую производственную единицу. Произведённое сырьё складируется и может быть транспортировано на другие планеты с помощью грузовых кораблей.
Когда Вы колонизируете планеты с низким показателем природных ресурсов, Вам стоит производить сырье на планетах с высоким показателем и затем перевозить их на другие планеты, чтобы большое количество производственных единиц не тратилось на добычу сырья. Количество сырья на планете можно увеличить и путем демонтажа кораблей, находящихся на планете. В этом случае каждая единица массы демонтируемых кораблей превращается в единицу сырья. Когда Вы колонизируете планеты с низким показателем природных ресурсов, Вам стоит производить сырье на планетах с высоким показателем и затем перевозить их на другие планеты, чтобы большое количество производственных единиц не тратилось на добычу сырья. Количество сырья на планете можно увеличить и путем демонтажа кораблей, находящихся на планете. В этом случае каждая единица массы демонтируемых кораблей превращается в единицу сырья.
@@ -135,9 +129,9 @@ $$\text{Производственный потенциал} = \text{промы
## Производство промышленности {#industry-production} ## Производство промышленности {#industry-production}
При развитии планет количество промышленности может быть повышено путём переключения производства планеты на промышленность. Производство одной единицы промышленности требует занятости 5 производственных единиц и одной единицы сырья. При развитии планет количество промышленности можно повышать, переключив производство планеты на промышленность. Одна единица промышленности требует 5 производственных единиц и одной единицы [сырья](#material); если запаса сырья нет, недостающее добывается автоматически из тех же производственных единиц (как и при [постройке кораблей](#ship-building)) по «курсу» природных ресурсов планеты — поэтому на бедных ресурсами планетах промышленность растёт медленнее.
Когда на планете установлено производство промышленности и производственный потенциал планеты ниже уровня населения, то производственный потенциал увеличивается. В противном случае промышленность накапливается и может быть транспортирована на другие планеты. При перевозке промышленности на планеты, где производственный потенциал ниже уровня населения, она будет добавлена к производственному потенциалу планеты и он возрастет. Таким образом происходит интенсивное развитие колонизируемых планет. Уровень промышленности не может превышать население планеты. Пока промышленность ниже населения, произведённая промышленность сразу повышает [производственный потенциал](#production-capacity). Когда же промышленность достигает населения, излишек не теряется, а откладывается в запас промышленности (в отчёте — «запасы промышленности», `$`). Этот запас можно перевозить между планетами; и как только промышленность планеты снова окажется ниже её населения — потому ли что подросло само население, потому ли что запас привезли в молодую колонию — он автоматически превращается в промышленность и поднимает её уровень. Так быстро развиваются колонизируемые планеты.
## Конструирование кораблей {#ship-design} ## Конструирование кораблей {#ship-design}
@@ -153,7 +147,7 @@ $$\text{Производственный потенциал} = \text{промы
Выбранные Вами характеристики корабля могут быть либо равными 0, либо быть не менее 1. Разумеется, все характеристики корабля не могут быть нулевыми одновременно. "Вооруженность" и "Оружие" должны быть оба либо нулевыми либо оба ненулевыми. "Вооруженность" задаётся целым числом, все остальные могут быть дробными. Например, корабль может иметь "Защиту" 1.5, но не может 0.5. Выбранные Вами характеристики корабля могут быть либо равными 0, либо быть не менее 1. Разумеется, все характеристики корабля не могут быть нулевыми одновременно. "Вооруженность" и "Оружие" должны быть оба либо нулевыми либо оба ненулевыми. "Вооруженность" задаётся целым числом, все остальные могут быть дробными. Например, корабль может иметь "Защиту" 1.5, но не может 0.5.
Конструирование классов кораблей не занимает времени или ресурсов, новый класс корабля становится доступным сразу после отдачи соответствующей команды. Для определения эффекта от характеристик корабля смотрите разделы "Перемещение", "Грузы" и "Сражения". Конструирование классов кораблей не занимает времени или ресурсов, новый класс корабля становится доступным сразу после отдачи соответствующей команды. Как именно характеристики корабля сказываются на игре, описано в разделах [«Движение»](#movement), [«Грузоподъёмность»](#cargo) и [«Сражения»](#combat).
Приведём несколько примеров классов кораблей. Несмотря на то, что такие классы могут встречаться в галактике у различных рас, Вы не обязаны конструировать корабли с точно такими характеристиками, гораздо важнее исходить их тех задач, которые Ваши корабли будут решать. Приведём несколько примеров классов кораблей. Несмотря на то, что такие классы могут встречаться в галактике у различных рас, Вы не обязаны конструировать корабли с точно такими характеристиками, гораздо важнее исходить их тех задач, которые Ваши корабли будут решать.
@@ -210,9 +204,9 @@ $$\text{Производственный потенциал} = \text{промы
## Модернизация кораблей {#ship-upgrade} ## Модернизация кораблей {#ship-upgrade}
В процессе развития технологических уровней расы, ранее построенные корабли могут устареть и перестать соответствовать текущим возможностям расы. Такие корабли можно модернизировать до необходимых уровенй технологий. В процессе развития технологических уровней расы, ранее построенные корабли могут устареть и перестать соответствовать текущим возможностям расы. Такие корабли можно модернизировать до необходимых уровней технологий.
Важно помнить, что процесс модернизации технологических уровней кораблей завершается лишь к окончанию хода, поэтому те корабли, которым была отдана команда модернизации, сперва примут участие в сражениях, если на одной с ними орбите окажутся вражеские корабли. Важно помнить, что процесс модернизации технологических уровней кораблей завершается лишь к окончанию хода, поэтому те корабли, которым была отдана команда модернизации, сперва примут участие в [сражениях](#combat), если на одной с ними орбите окажутся вражеские корабли.
Для проведения процесса модернизации группа кораблей должна находиться на одной из принадлежащих Вам планет. Корабли из этой группы будут модернизироваться в соответствии с Вашими текущими технологиями (если они уже имеют Ваши последние технологические уровни, то ничего не произойдет). Но можно и ограничить уровень технологий, до которого происходит модернизация, задав конечный уровень модернизации технологий. Для проведения процесса модернизации группа кораблей должна находиться на одной из принадлежащих Вам планет. Корабли из этой группы будут модернизироваться в соответствии с Вашими текущими технологиями (если они уже имеют Ваши последние технологические уровни, то ничего не произойдет). Но можно и ограничить уровень технологий, до которого происходит модернизация, задав конечный уровень модернизации технологий.
@@ -294,11 +288,9 @@ $$\text{Тех.ур. Грузоперевозок} \times \left(\text{Разме
При технологии Грузоперевозок 2.0 эти показатели удваиваются и т.д. Заметим, что большие транспорты могут нести очень большое количество груза, но если они будут полностью загружены, то они будут очень медленно передвигаться (например, полностью загруженный Megafreighter при технологии двигателей 1 будет иметь скорость лишь 1.97 световых года за один ход). При технологии Грузоперевозок 2.0 эти показатели удваиваются и т.д. Заметим, что большие транспорты могут нести очень большое количество груза, но если они будут полностью загружены, то они будут очень медленно передвигаться (например, полностью загруженный Megafreighter при технологии двигателей 1 будет иметь скорость лишь 1.97 световых года за один ход).
Маленькая скорость тяжело груженых кораблей, вообще говоря, может быть компенсирована более высокой технологией Грузоперевозок. При технологическом уровне 2.0, масса любого груза на борту корабля будет считаться как половина от нормальной массы, используемой для вычислений скорости корабля и мощности защитного поля (см. "Сражения"). При тех. уровне 3.0, масса груза при вычислениях будет делиться на 3 и т.д. Например, корабль типа Freighter при тех. уровне Грузоперевозок 1 может нести 15 единиц груза. При тех. уровне 2.0 количество груза возрастет до 30 единиц, однако они будут замедлять корабль точно также, как 15 единиц груза при технологическом уровне Грузоперевозок 1.0. Таким образом при тех. уровне 2.0 и загруженных 30 единицах груза Freighter будет двигаться также быстро (учитывая тех. уровень Двигателей) как Freighter загруженный 15 ед. груза при технологии Грузоперевозок 1.0. Маленькая скорость тяжело груженых кораблей, вообще говоря, может быть компенсирована более высокой технологией Грузоперевозок. При технологическом уровне 2.0, масса любого груза на борту корабля будет считаться как половина от нормальной массы, используемой для вычислений скорости корабля и мощности защитного поля (см. [«Сражения»](#combat)). При тех. уровне 3.0, масса груза при вычислениях будет делиться на 3 и т.д. Например, корабль типа Freighter при тех. уровне Грузоперевозок 1 может нести 15 единиц груза. При тех. уровне 2.0 количество груза возрастет до 30 единиц, однако они будут замедлять корабль точно также, как 15 единиц груза при технологическом уровне Грузоперевозок 1.0. Таким образом при тех. уровне 2.0 и загруженных 30 единицах груза Freighter будет двигаться также быстро (учитывая тех. уровень Двигателей) как Freighter загруженный 15 ед. груза при технологии Грузоперевозок 1.0.
> TODO: WTF? Может, это какой-то другой лор? Надо подумать. Иными словами, технология Грузоперевозок определяет, насколько компактно груз размещается на борту. «Масса перевозимого груза» равна количеству груза, делённому на технологический уровень Грузоперевозок, — поэтому чем выше эта технология, тем меньше один и тот же груз весит при расчётах, тем меньше он замедляет корабль и тем слабее снижает эффективность его защиты в [сражении](#combat).
>
> Иными словами, технология Грузоперевозок есть ни что иное как технология размещения контейнеров с грузом. Следовательно, при увеличении грузоподъемности корабля путем повышения технологии Грузоперевозок этого корабля, его объем не изменяется, а значит не изменяется его скорость (она сильно зависит от площади поверхности корабля), равно как и его защита (см. "Сражения"). Словом, развивая данную технологию Вы находите новые способы рационального размещения контейнеров с грузами в грузовых отсеках.
Корабль может нести только один тип груза одновременно. Возможные типы груза - это колонисты, сырье и промышленность. Груз может быть доставлен на борт корабля с Вашей или не занятой планеты, на которой он имеется. Промышленность и Сырье могут быть выгружены на любой планете. Колонисты могут быть высажены только на планеты, принадлежащие Вам или на необитаемые планеты. Корабль может нести только один тип груза одновременно. Возможные типы груза - это колонисты, сырье и промышленность. Груз может быть доставлен на борт корабля с Вашей или не занятой планеты, на которой он имеется. Промышленность и Сырье могут быть выгружены на любой планете. Колонисты могут быть высажены только на планеты, принадлежащие Вам или на необитаемые планеты.
@@ -312,11 +304,11 @@ $$\text{Тех.ур. Грузоперевозок} \times \left(\text{Разме
На особом положении находятся корабли входящие в состав какого-либо флота. Подразумевается, что эти корабли предназначены для выполнения некой специальной миссии и на них не распространяется обязанность следовать установленным грузовым маршрутам. На особом положении находятся корабли входящие в состав какого-либо флота. Подразумевается, что эти корабли предназначены для выполнения некой специальной миссии и на них не распространяется обязанность следовать установленным грузовым маршрутам.
Грузовой маршрут может быть установлен лишь на планету, которая находится в зоне полета кораблей (см. "Движение"). Грузовой маршрут может быть установлен лишь на планету, которая находится в [зоне свободного перелёта](#movement) кораблей.
## Сражения {#combat} ## Сражения {#combat}
Когда на планете встречаются вооруженные корабли враждующих рас, происходит сражение. В случае агрессии одной из сторон, другая сторона, даже если она находится с агрессором в состоянии мира, также вступит в сражение. Это вовсе не означает, что у нападающих есть право первого выстрела, все сражающиеся стороны находятся в абсолютно равных условиях ведения сражения, и первым выстрелит тот, кто более удачлив. Корабли, которым отдан приказ на отлёт, а также корабли, отправляемые по установленным грузовым маршрутам, к началу хода ещё находятся на планете отправления и принимают участие в сражении у этой планеты — в гиперпространство уходят лишь уцелевшие в нём корабли. Корабль, уже находящийся в гиперпространстве, в сражениях не участвует вплоть до прибытия на планету назначения (см. "Последовательность действий"). Когда на планете встречаются вооруженные корабли враждующих рас, происходит сражение. В случае агрессии одной из сторон, другая сторона, даже если она находится с агрессором в состоянии мира, также вступит в сражение. Это вовсе не означает, что у нападающих есть право первого выстрела, все сражающиеся стороны находятся в абсолютно равных условиях ведения сражения, и первым выстрелит тот, кто более удачлив. Корабли, которым отдан приказ на отлёт, а также корабли, отправляемые по установленным грузовым маршрутам, к началу хода ещё находятся на планете отправления и принимают участие в сражении у этой планеты — в гиперпространство уходят лишь уцелевшие в нём корабли. Корабль, уже находящийся в гиперпространстве, в сражениях не участвует вплоть до прибытия на планету назначения (подробный порядок — в разделе [«Последовательность действий»](#turn-sequence)).
В каждом раунде сражения все корабли получают шанс выстрелить по противнику, разумеется, если в этом же раунде его противники не были более удачливы и не успели своими выстрелами уничтожить корабль, ожидающий своей очереди атаковать. В каждом раунде сражения все корабли получают шанс выстрелить по противнику, разумеется, если в этом же раунде его противники не были более удачливы и не успели своими выстрелами уничтожить корабль, ожидающий своей очереди атаковать.
@@ -336,7 +328,7 @@ $$\frac{\log_4\!\left(\dfrac{\text{Оружие} \cdot \text{Т.У.Оружия}
Параметры подобраны так, что корабль D=10 A=1 W=10 S=10 C=0, стреляя по такому же кораблю, уничтожит цель с вероятностью 50%. Если посчитать, то очевидно, что защита такого корабля равна ~3.21. Для того, чтобы уравнять вероятности атаки и защиты, защита нормируется - умножается на число ~3.11, таким образом, достигается ситуация, когда единица защиты обеспечивает единицу защищенности. Если эффективность атаки в 4 раза выше, чем у нормированной защиты - цель всегда уничтожается. Если эффективность нормированной защиты в 4 раза выше - атака всегда безуспешна. Параметры подобраны так, что корабль D=10 A=1 W=10 S=10 C=0, стреляя по такому же кораблю, уничтожит цель с вероятностью 50%. Если посчитать, то очевидно, что защита такого корабля равна ~3.21. Для того, чтобы уравнять вероятности атаки и защиты, защита нормируется - умножается на число ~3.11, таким образом, достигается ситуация, когда единица защиты обеспечивает единицу защищенности. Если эффективность атаки в 4 раза выше, чем у нормированной защиты - цель всегда уничтожается. Если эффективность нормированной защиты в 4 раза выше - атака всегда безуспешна.
Заметим, что любое количество груза на борту корабля увеличивает его "полную массу" (---ссылка---) при расчетах мощности защиты корабля, а генератор защитного поля должен защищать груз также хорошо, как и сам корабль. Иначе говоря, для транспорта, загруженного известным количеством груза, эффективность защиты будет тем слабее, чем ниже уровень технолгии Грузоперевозок. Заметим, что любое количество груза на борту корабля увеличивает его [полную массу](#movement) при расчётах мощности защиты корабля, а генератор защитного поля должен защищать груз так же хорошо, как и сам корабль. Иначе говоря, для транспорта, загруженного известным количеством груза, эффективность защиты будет тем слабее, чем ниже уровень технологии [Грузоперевозок](#cargo). И если такой корабль будет уничтожен в бою, везомый им груз гибнет вместе с ним: с каждым потерянным кораблём груз группы уменьшается пропорционально числу уцелевших.
Если вооруженный корабль остался на вражеской планете после завершения сражения, он начинает бомбить планету, уничтожая на ней население и промышленность в зависимости от мощности его орудий. Если вооруженный корабль остался на вражеской планете после завершения сражения, он начинает бомбить планету, уничтожая на ней население и промышленность в зависимости от мощности его орудий.
@@ -366,7 +358,7 @@ $$\left(\frac{\sqrt{\text{Оружие} \cdot \text{Тех.Ур.Оружия}}}{
- Наибольшее количество населения расы; - Наибольшее количество населения расы;
- Случайный выбор претендента на колонизацию. - Случайный выбор претендента на колонизацию.
Разумеется, если раса, колонизирующая планету, не смогла получить планету во владение, тогда все последующие команды, рассчитанные на то, что именно Ваши колонисты были выгружены на планету, могут быть отменены в процессе производства хода. Если Вы не уверены, что планета будет колонизирована именно Вами, имеет смысл вступать в дипломатическую переписку, заключать договоры, продавать право колонизации за материальные блага и т.п. Колонисты рас, не получивших планету, при этом не пропадают: выгружается только победитель, а колонисты остальных претендентов остаются в трюмах своих кораблей, и их можно направить на другую планету. Разумеется, если раса, колонизирующая планету, не смогла получить планету во владение, тогда все последующие команды, рассчитанные на то, что именно Ваши колонисты были выгружены на планету, могут быть отменены в процессе производства хода. Если Вы не уверены, что планета будет колонизирована именно Вами, имеет смысл вступать в дипломатическую переписку, заключать договоры, продавать право колонизации за материальные блага и т.п.
Следует помнить, что флоты не подчиняются грузовым маршрутам, следовательно, колонисты на кораблях флотов не участвуют в подсчёте общечего числа колонистов для приоритетной высадки в конце маршрутов. Следует помнить, что флоты не подчиняются грузовым маршрутам, следовательно, колонисты на кораблях флотов не участвуют в подсчёте общечего числа колонистов для приоритетной высадки в конце маршрутов.
@@ -510,7 +502,7 @@ $$\left(\frac{\sqrt{\text{Оружие} \cdot \text{Тех.Ур.Оружия}}}{
- Сражения. - Сражения.
Это описание всех сражений, в которых Вы участвовали либо были их свидетелями на этом ходу. Для каждого сражения указан список групп, присутствовавших на месте сражения к началу битвы, за которым следует описание обмена ударами. Дополнительно указываются: Это описание всех [сражений](#combat), в которых Вы участвовали либо были их свидетелями на этом ходу. Для каждого сражения указан список групп, присутствовавших на месте сражения к началу битвы, за которым следует описание обмена ударами. Дополнительно указываются:
- Количество кораблей группы, не уничтоженных в процессе сражения; - Количество кораблей группы, не уничтоженных в процессе сражения;
@@ -565,7 +557,6 @@ $$\left(\frac{\sqrt{\text{Оружие} \cdot \text{Тех.Ур.Оружия}}}{
| M | Запасы сырья | | M | Запасы сырья |
| C | Количество колонистов | | C | Количество колонистов |
| L | Свободный производственный потенциал | | L | Свободный производственный потенциал |
| (пусто) | TODO: добавить ЗАНЯТЫЙ производственный потенциал |
Параметр (L) используется для определения реального промышленного потенциала на данный ход. Параметр (L) используется для определения реального промышленного потенциала на данный ход.
@@ -640,7 +631,7 @@ $$\left(\frac{\sqrt{\text{Оружие} \cdot \text{Тех.Ур.Оружия}}}{
На более поздних стадиях игры, вполне вероятно, что одна из рас достигнет большего развития нежели остальные и займет доминирующую позицию в Галактике. С этого момента для остальных игроков жизненно важно немедленно отбросить в сторону все разногласия между собой и совместно атаковать эту расу. Ибо, если дать возможность этой расе захватывать расы одну за другой, она получит превосходный шанс победить в этой игре. На более поздних стадиях игры, вполне вероятно, что одна из рас достигнет большего развития нежели остальные и займет доминирующую позицию в Галактике. С этого момента для остальных игроков жизненно важно немедленно отбросить в сторону все разногласия между собой и совместно атаковать эту расу. Ибо, если дать возможность этой расе захватывать расы одну за другой, она получит превосходный шанс победить в этой игре.
В силу специфики работы алгоритма ведения сражений (см. "Сражения"), обычно флот разделяется на три дополняющих друг друга части: В силу специфики работы [алгоритма ведения сражений](#combat), обычно флот разделяется на три дополняющих друг друга части:
- много маленьких защитных кораблей прикрытия, для отвлечения пушек противника; - много маленьких защитных кораблей прикрытия, для отвлечения пушек противника;
+1 -1
View File
@@ -175,7 +175,7 @@ schema breaks the tool's compilation before the change ships.
When extending: When extending:
1. Identify the legacy section in `tools/local-dev/reports/dg/*.REP` 1. Identify the legacy section in `tools/local-dev/reports/dg/*.REP`
(and `gplus/*.REP`) that carries the field, using `game/rules.txt` (and `gplus/*.REP`) that carries the field, using `site/ru/rules.md`
section "Отчет о результатах хода" as the column-layout reference. section "Отчет о результатах хода" as the column-layout reference.
2. Add a section to the state machine in `parser.go` 2. Add a section to the state machine in `parser.go`
(`classifySection`, the `section` constants, the `parse*` methods). (`classifySection`, the `section` constants, the `parse*` methods).
+5 -5
View File
@@ -1982,7 +1982,7 @@ Artifacts (Pass B — feature):
preserves camera centre + zoom across route-driven remounts preserves camera centre + zoom across route-driven remounts
inside the same game id. inside the same game id.
- Topic doc `ui/docs/cargo-routes-ux.md` quotes - Topic doc `ui/docs/cargo-routes-ux.md` quotes
[`rules.txt`](../game/rules.txt) (lines 808843) and maps [`site/ru/rules.md`](../site/ru/rules.md) (lines 808843) and maps
semantics to UI; `ui/docs/renderer.md` documents the pick-mode semantics to UI; `ui/docs/renderer.md` documents the pick-mode
contract; `ui/docs/calc-bridge.md` records the Phase 16 reach contract; `ui/docs/calc-bridge.md` records the Phase 16 reach
waiver (inline TS rather than a calc bridge for one waiver (inline TS rather than a calc bridge for one
@@ -2075,7 +2075,7 @@ Artifacts:
rewritten from the Phase 10 stub: empty form for the Create flow rewritten from the Phase 10 stub: empty form for the Create flow
(name plus the five fields Drive, Armament, Weapons, Shields, (name plus the five fields Drive, Armament, Weapons, Shields,
Cargo) and read-only view + Delete affordance for an existing Cargo) and read-only view + Delete affordance for an existing
class. Validation rules from [`rules.txt`](../game/rules.txt) live class. Validation rules from [`site/ru/rules.md`](../site/ru/rules.md) live
in `lib/util/ship-class-validation.ts` (TS port of in `lib/util/ship-class-validation.ts` (TS port of
`pkg/calc/validator.go.ValidateShipTypeValues`): each of drive / `pkg/calc/validator.go.ValidateShipTypeValues`): each of drive /
weapons / shields / cargo is 0 or ≥ 1; armament is a non-negative weapons / shields / cargo is 0 or ≥ 1; armament is a non-negative
@@ -2098,7 +2098,7 @@ Dependencies: Phase 14.
Acceptance criteria: Acceptance criteria:
- the user can create, list, view, and delete ship classes; - the user can create, list, view, and delete ship classes;
- field validation matches [`rules.txt`](../game/rules.txt) - field validation matches [`site/ru/rules.md`](../site/ru/rules.md)
constraints with disabled Submit + tooltip when invalid; constraints with disabled Submit + tooltip when invalid;
- double-tapping a row in the ship-classes table opens its - double-tapping a row in the ship-classes table opens its
designer (read-only view of the existing class); designer (read-only view of the existing class);
@@ -2463,7 +2463,7 @@ Acceptance criteria:
- the planet production picker (Phase 15) lists the user's sciences - the planet production picker (Phase 15) lists the user's sciences
in the Research sub-row and lets the user select one for research in the Research sub-row and lets the user select one for research
production; production;
- name validation matches [`rules.txt`](../game/rules.txt) - name validation matches [`site/ru/rules.md`](../site/ru/rules.md)
constraints (length, allowed characters, special characters not constraints (length, allowed characters, special characters not
at start/end, no triple repeats). at start/end, no triple repeats).
@@ -2563,7 +2563,7 @@ Targeted tests:
Status: done (local-ci run 2). Status: done (local-ci run 2).
Goal: present every section of the current turn's report as readable Goal: present every section of the current turn's report as readable
panels, mirroring the structure documented in [`rules.txt`](../game/rules.txt) and panels, mirroring the structure documented in [`site/ru/rules.md`](../site/ru/rules.md) and
`docs/FUNCTIONAL.md` §6.4. `docs/FUNCTIONAL.md` §6.4.
Artifacts: Artifacts:
+1 -1
View File
@@ -136,7 +136,7 @@ new one); Create is disabled while the name is invalid or duplicate
(reusing `lib/util/ship-class-validation.ts`). Create reuses the existing (reusing `lib/util/ship-class-validation.ts`). Create reuses the existing
`createShipClass` order-draft flow, so the optimistic overlay reflects `createShipClass` order-draft flow, so the optimistic overlay reflects
the change immediately. Ship classes are immutable after creation (per the change immediately. Ship classes are immutable after creation (per
`game/rules.txt`), so there is no edit — only Create-new. Delete-class `site/ru/rules.md`), so there is no edit — only Create-new. Delete-class
lives in the ship-classes table (`lib/active-view/table-ship-classes.svelte`), lives in the ship-classes table (`lib/active-view/table-ship-classes.svelte`),
not the calculator. not the calculator.
+1 -2
View File
@@ -5,8 +5,7 @@ subsection (a single-row dropdown + contextual actions after
F8-05), the map-driven destination pick, and the optimistic F8-05), the map-driven destination pick, and the optimistic
overlay that keeps the inspector and the map in lock-step with overlay that keeps the inspector and the map in lock-step with
the local order draft. The engine semantics are quoted from the local order draft. The engine semantics are quoted from
[`game/rules.txt`](../../game/rules.txt) section "Грузовые маршруты" [`site/ru/rules.md`](../../site/ru/rules.md#routes) section "Грузовые маршруты"; this file is the source of truth for how the UI
(lines 808843); this file is the source of truth for how the UI
surfaces those rules. surfaces those rules.
## Engine semantics in one paragraph ## Engine semantics in one paragraph
+2 -2
View File
@@ -29,8 +29,8 @@ sequence.
The designer presents the four proportions as percentages The designer presents the four proportions as percentages
(`step="0.1"`, range `[0, 100]`) so the player can type and reason (`step="0.1"`, range `[0, 100]`) so the player can type and reason
about whole-number splits — closer to how `game/rules.txt` describes about whole-number splits — closer to how `site/ru/rules.md` describes
sciences (`game/rules.txt:345-362`: "10 parts Drive, 5 parts sciences (`site/ru/rules.md` #sciences: "10 parts Drive, 5 parts
Weapons, 30 parts Shields, 0 parts Cargo, …"). The wire shape is Weapons, 30 parts Shields, 0 parts Cargo, …"). The wire shape is
still fractions; conversion happens inside `validateScience` only on still fractions; conversion happens inside `validateScience` only on
Save (`value / 100` for each of the four). Save (`value / 100` for each of the four).
+2 -2
View File
@@ -268,7 +268,7 @@ export interface ReportLocalFleet {
* table uses. * table uses.
* *
* `relation` reflects the local player's stance TOWARD this race, * `relation` reflects the local player's stance TOWARD this race,
* not the other way around (`rules.txt` line 1162). Per the engine * not the other way around (`site/ru/rules.md` #report). Per the engine
* (`controller/race.go.UpdateRelation`) the relation is stored * (`controller/race.go.UpdateRelation`) the relation is stored
* unilaterally — race A can be at war with race B while race B is * unilaterally — race A can be at war with race B while race B is
* at peace with race A. * at peace with race A.
@@ -508,7 +508,7 @@ export interface GameReport {
/** /**
* myVotes is the local player's total vote weight in the current * myVotes is the local player's total vote weight in the current
* report, read from `Report.votes` (the engine assigns one vote * report, read from `Report.votes` (the engine assigns one vote
* per 1000 population, see `rules.txt:1060`). Zero when the * per 1000 population, see `site/ru/rules.md` #victory). Zero when the
* report has not been produced yet. * report has not been produced yet.
*/ */
myVotes: number; myVotes: number;
@@ -8,7 +8,7 @@ immediately and the auto-sync pipeline drives the server in the
background. background.
The alliance graph and the 2/3 victory check are NOT computed The alliance graph and the 2/3 victory check are NOT computed
here: `rules.txt` keeps each race's outgoing vote target private here: `site/ru/rules.md` keeps each race's outgoing vote target private
(only the votes a race RECEIVED in the last tally and the local (only the votes a race RECEIVED in the last tally and the local
player's own pick are observable), and the acceptance criterion player's own pick are observable), and the acceptance criterion
"vote counts match server state byte-for-byte" rules out "vote counts match server state byte-for-byte" rules out
@@ -10,7 +10,7 @@
// `OrderCommand` payload always carries the canonical `[0, 1]` // `OrderCommand` payload always carries the canonical `[0, 1]`
// summing to `1.0` shape the FBS encoder ships on the wire. // summing to `1.0` shape the FBS encoder ships on the wire.
// //
// Engine rules (from `pkg/calc/validator.go` and `game/rules.txt`): // Engine rules (from `pkg/calc/validator.go` and `site/ru/rules.md`):
// //
// - drive, weapons, shields, cargo: float in `[0, 1]`; // - drive, weapons, shields, cargo: float in `[0, 1]`;
// - the four values sum to `1.0` (the engine accepts a small // - the four values sum to `1.0` (the engine accepts a small
@@ -6,7 +6,7 @@
// to gate auto-sync, so the local invariants match the engine's // to gate auto-sync, so the local invariants match the engine's
// (`game/internal/controller/ship_class.go.ShipClassCreate`). // (`game/internal/controller/ship_class.go.ShipClassCreate`).
// //
// Engine rules (from `pkg/calc/validator.go` and `game/rules.txt`): // Engine rules (from `pkg/calc/validator.go` and `site/ru/rules.md`):
// //
// - drive, weapons, shields, cargo: float, equal to 0 or >= 1; // - drive, weapons, shields, cargo: float, equal to 0 or >= 1;
// - armament: integer, >= 0; // - armament: integer, >= 0;
+1 -1
View File
@@ -330,7 +330,7 @@ export class OrderDraftStore {
* tracks a single war/peace stance per opponent, so a newer * tracks a single war/peace stance per opponent, so a newer
* entry supersedes any prior `setDiplomaticStance` for the * entry supersedes any prior `setDiplomaticStance` for the
* same other race. * same other race.
* - `setVoteRecipient` collapses singleton: per `rules.txt` * - `setVoteRecipient` collapses singleton: per `site/ru/rules.md`
* each race controls a single vote slot, so a newer entry * each race controls a single vote slot, so a newer entry
* supersedes any prior `setVoteRecipient` regardless of the * supersedes any prior `setVoteRecipient` regardless of the
* acceptor. * acceptor.
+1 -1
View File
@@ -463,7 +463,7 @@ export interface SetDiplomaticStanceCommand {
* to a race. Mirrors the engine `CommandRaceVote` * to a race. Mirrors the engine `CommandRaceVote`
* (`pkg/schema/fbs/order.fbs`, * (`pkg/schema/fbs/order.fbs`,
* `game/internal/controller/command.go.RaceVote`). The engine * `game/internal/controller/command.go.RaceVote`). The engine
* tallies votes at turn cutoff (`rules.txt` "Процесс голосования"); * tallies votes at turn cutoff (`site/ru/rules.md` "Процесс голосования");
* between turns the player can change their pick freely. The * between turns the player can change their pick freely. The
* acceptor may be the local race itself — the engine treats * acceptor may be the local race itself — the engine treats
* self-vote as the neutral default and re-applies it whenever a * self-vote as the neutral default and re-applies it whenever a
+1 -1
View File
@@ -112,7 +112,7 @@ describe("validateScience", () => {
expect(result.reason).toBe("sum_not_hundred"); expect(result.reason).toBe("sum_not_hundred");
}); });
test("accepts the canonical First Step fixture from rules.txt", () => { test("accepts the canonical First Step fixture from site/ru/rules.md", () => {
// 10 Drive + 5 Weapons + 30 Shields + 0 Cargo, normalised: // 10 Drive + 5 Weapons + 30 Shields + 0 Cargo, normalised:
// 10/45 ≈ 22.222… %, 5/45 ≈ 11.111… %, 30/45 ≈ 66.666… %, // 10/45 ≈ 22.222… %, 5/45 ≈ 11.111… %, 30/45 ≈ 66.666… %,
// 0/45 = 0 %. Snapped to one decimal at input time: // 0/45 = 0 %. Snapped to one decimal at input time:
@@ -138,7 +138,7 @@ describe("validateShipClass", () => {
expect(result.reason).toBe("all_zero"); expect(result.reason).toBe("all_zero");
}); });
test("accepts the canonical Cruiser fixture from rules.txt", () => { test("accepts the canonical Cruiser fixture from site/ru/rules.md", () => {
const result = validateShipClass( const result = validateShipClass(
draft({ draft({
name: "Cruiser", name: "Cruiser",