1688 lines
No EOL
93 KiB
Go
1688 lines
No EOL
93 KiB
Go
package main
|
||
|
||
// Каждая игра хранит правила в двух вариантах (RU/EN) и отдаёт
|
||
// нужный через функцию-геттер в зависимости от текущего языка
|
||
// (CurrentLang) — используется и в TUI-экране "Правила", и при
|
||
// выводе через --help.
|
||
|
||
// --- 1000 (Тысяча) ---------------------------------------------
|
||
|
||
const thousandRulesRU = `1000 (ТЫСЯЧА) — правила (строго на троих игроков)
|
||
|
||
У "Тысячи" огромное количество договорённостей и вариантов (бочка,
|
||
золотой кон, самосвал, тузовый марьяж, игра втёмную, "расписать
|
||
игру" и т.д.). Реализован базовый, самый распространённый вариант
|
||
ИМЕННО НА ТРОИХ игроков — у игры вдвоём/вчетвером заметно другая
|
||
механика прикупа и сдающего, она не реализована.
|
||
|
||
КОЛОДА И СТАРШИНСТВО
|
||
24 карты: 9, В, Д, К, 10, Т в каждой масти. Старшинство карт:
|
||
9 < В < Д < К < 10 < Т — да, десятка сильнее короля, но слабее
|
||
туза, это особенность именно этой игры.
|
||
|
||
ОЧКИ КАРТ
|
||
Туз - 11, десятка - 10, король - 4, дама - 3, валет - 2,
|
||
девятка - 0.
|
||
|
||
РАЗДАЧА И ТОРГИ
|
||
Каждому раздаётся по 7 карт, 3 карты уходят в прикуп. Игрок слева
|
||
от сдающего обязан назвать ставку не менее 100 (это то количество
|
||
очков, которое он берётся набрать за раздачу). Далее по кругу
|
||
каждый либо поднимает ставку минимум на 5, либо пасует —
|
||
спасовавший больше не участвует в этих торгах. Максимальная
|
||
ставка — 120, либо 120 плюс стоимость марьяжа, если он есть на
|
||
руке. Торги заканчиваются, когда остаётся один игрок — он берёт
|
||
прикуп и становится объявившим торг ("играющим").
|
||
|
||
СНОС
|
||
Объявивший торг берёт прикуп (10 карт на руке) и отдаёт по одной
|
||
карте каждому из двух соперников — после этого у всех троих
|
||
становится по 8 карт. Играющий ходит первым.
|
||
|
||
ВЗЯТКИ
|
||
Обязательно ходить в масть; если её нет на руке — козырем (если
|
||
он уже объявлен в этой раздаче); если и козыря нет — любой картой.
|
||
Взятку забирает старшая карта хода, либо старший козырь, если он
|
||
был подложен.
|
||
|
||
МАРЬЯЖ
|
||
Если у игрока, который сейчас ходит первым в новой взятке (кроме
|
||
самой первой взятки раздачи), есть на руке король и дама одной
|
||
масти — он может объявить марьяж, походив одной из этих карт.
|
||
Эта масть становится (или меняется на) козырь до конца раздачи, а
|
||
стоимость марьяжа сразу добавляется к очкам игрока за раздачу.
|
||
Стоимость: пики 40, трефы 60, бубны 80, червы 100.
|
||
|
||
ПОДСЧЁТ ОЧКОВ
|
||
Если объявивший торг набрал (взятками и марьяжами) не меньше
|
||
своей ставки — ему засчитывается ставка целиком. Если меньше —
|
||
ставка вычитается из его счёта. Остальные добавляют себе ровно
|
||
то, что заработали, без штрафов.
|
||
|
||
ОКОНЧАНИЕ ПАРТИИ
|
||
Игра идёт до 1000 очков — первый, кто их наберёт, побеждает.
|
||
|
||
УПРАВЛЕНИЕ В ЭТОЙ ВЕРСИИ
|
||
В торгах:
|
||
↑→/kl или ↓←/hj изменить предлагаемую ставку на ±5
|
||
enter назвать текущую ставку
|
||
p пасовать
|
||
При сносе и в розыгрыше взяток:
|
||
←→/hl выбор карты в руке
|
||
enter сыграть/отдать выбранную карту (король/дама одной масти
|
||
при своём первом ходе взятки = объявить марьяж)
|
||
В любой момент:
|
||
q выход в меню
|
||
После завершения раздачи:
|
||
n новая раздача (если партия ещё не окончена)
|
||
q выход в меню
|
||
`
|
||
|
||
const thousandRulesEN = `1000 (THOUSAND) — rules (strictly 3 players)
|
||
|
||
"Thousand" has a huge number of house rules and variants (barrel,
|
||
golden hand, reset at ±555, ace marriage, blind play, "writing off"
|
||
a hand, etc). A basic, most common ruleset is implemented STRICTLY
|
||
FOR 3 PLAYERS — the 2-player/4-player versions have noticeably
|
||
different kitty/dealer mechanics and are not implemented.
|
||
|
||
DECK AND RANK ORDER
|
||
24 cards: 9, J, Q, K, 10, A in each suit. Rank order:
|
||
9 < J < Q < K < 10 < A — yes, the 10 outranks the King but is
|
||
weaker than the Ace; that's a quirk specific to this game.
|
||
|
||
CARD POINTS
|
||
Ace - 11, ten - 10, king - 4, queen - 3, jack - 2, nine - 0.
|
||
|
||
DEAL AND BIDDING
|
||
Each player is dealt 7 cards, 3 cards go to the kitty. The player
|
||
left of the dealer must bid at least 100 (the number of points
|
||
they commit to scoring this hand). Going around the table, each
|
||
player either raises the bid by at least 5 or passes — once you
|
||
pass you're out of this auction. The maximum bid is 120, or 120
|
||
plus the value of a marriage if you hold one. Bidding ends when
|
||
only one player remains — they take the kitty and become the
|
||
"declarer".
|
||
|
||
DISCARD
|
||
The declarer takes the kitty (10 cards in hand) and gives one
|
||
card to each of the two opponents — after that everyone has 8
|
||
cards. The declarer leads first.
|
||
|
||
TRICKS
|
||
You must follow suit; if you can't — play trump (if a trump has
|
||
been declared this hand); if you have neither — play anything.
|
||
The trick is taken by the highest card of the suit led, or the
|
||
highest trump if one was played.
|
||
|
||
MARRIAGE
|
||
If the player leading a NEW trick (except the very first trick of
|
||
the hand) holds a King and Queen of the same suit, they may
|
||
declare a marriage by leading one of those two cards. That suit
|
||
becomes (or changes to) trump for the rest of the hand, and the
|
||
marriage's value is immediately added to that player's score for
|
||
the hand. Values: spades 40, clubs 60, diamonds 80, hearts 100.
|
||
|
||
SCORING
|
||
If the declarer's tricks and marriages reach at least their bid,
|
||
they score the full bid. If not, the bid is subtracted from their
|
||
score. Everyone else simply adds whatever they actually earned,
|
||
with no penalty.
|
||
|
||
MATCH END
|
||
Play continues to 1000 points — first to reach it wins.
|
||
|
||
CONTROLS IN THIS VERSION
|
||
During bidding:
|
||
↑→/kl or ↓←/hj change the proposed bid by ±5
|
||
enter place the current bid
|
||
p pass
|
||
During discard and trick play:
|
||
←→/hl select a card in hand
|
||
enter play/give the selected card (King/Queen of one suit as
|
||
your first card of a trick = declare a marriage)
|
||
At any time:
|
||
q quit to menu
|
||
After a hand ends:
|
||
n new hand (if the match isn't over yet)
|
||
q quit to menu
|
||
`
|
||
|
||
func thousandRules() string {
|
||
if CurrentLang() == LangEN {
|
||
return thousandRulesEN
|
||
}
|
||
return thousandRulesRU
|
||
}
|
||
|
||
// --- Косынка (Klondike) ------------------------------------------
|
||
|
||
const klondikeRulesRU = `КОСЫНКА (KLONDIKE) — классический пасьянс на одного игрока
|
||
|
||
Реализован классический "Клондайк" с добором по одной карте за раз
|
||
и неограниченным числом пересдач колоды из отбоя.
|
||
|
||
ЦЕЛЬ
|
||
Собрать все 52 карты на четырёх фундаментах — по одному на
|
||
масть, от туза до короля по возрастанию.
|
||
|
||
ПОЛЕ
|
||
7 колонн (по 1-7 карт, в каждой открыта только самая нижняя из
|
||
выложенных карт), колода добора и отбой, 4 фундамента (по одному
|
||
на масть).
|
||
|
||
ХОДЫ
|
||
- В колонну можно положить открытую карту на 1 меньше по рангу и
|
||
противоположного цвета масти (чёрная на красную или наоборот).
|
||
В пустую колонну можно положить только короля.
|
||
- На фундамент можно положить только следующую по рангу карту той
|
||
же масти, начиная с туза.
|
||
- Можно перекладывать между колоннами целиком собранную (по
|
||
убыванию, с чередованием цвета) последовательность карт — не
|
||
только одну карту сверху. "Разрезать" такую цепочку и взять
|
||
только часть нельзя.
|
||
- Когда карта под перемещённой цепочкой открывается — она
|
||
автоматически переворачивается лицом вверх.
|
||
- Из колоды добора карты берутся по одной в отбой; когда колода
|
||
добора заканчивается — весь отбой переворачивается обратно в
|
||
колоду для новой пересдачи (без ограничения числа пересдач).
|
||
- Возврат карт с фундамента обратно в игру не реализован.
|
||
|
||
УПРАВЛЕНИЕ В ЭТОЙ ВЕРСИИ
|
||
Ход состоит из двух шагов: сначала выбор источника, потом — куда
|
||
переложить.
|
||
1-7 выбрать колонну (или переложить выбранное в неё)
|
||
0 выбрать отбой (только как источник)
|
||
f переложить выбранную карту на фундамент
|
||
esc отменить текущий выбор
|
||
d взять карту из колоды добора (пересдаст, если она пуста)
|
||
u отменить последний ход
|
||
n новая партия (перетасовать заново)
|
||
q выход в меню
|
||
`
|
||
|
||
const klondikeRulesEN = `KLONDIKE SOLITAIRE — classic single-player game
|
||
|
||
The classic "Klondike" is implemented with single-card draw and an
|
||
unlimited number of stock redeals from the waste pile.
|
||
|
||
GOAL
|
||
Move all 52 cards onto the four foundations — one per suit, from
|
||
Ace up to King.
|
||
|
||
LAYOUT
|
||
7 tableau columns (1-7 cards each, only the bottommost dealt card
|
||
is face up), a draw stock and a waste pile, 4 foundations (one
|
||
per suit).
|
||
|
||
MOVES
|
||
- You can place a face-up card onto a tableau column if it's one
|
||
rank lower and the opposite color (black on red or vice versa).
|
||
Only a King can be placed on an empty column.
|
||
- You can place a card on a foundation only if it's the next rank
|
||
up in that suit, starting from the Ace.
|
||
- You can move a properly built (descending, alternating color)
|
||
sequence of cards between columns as a whole — not just the top
|
||
card. You cannot "cut" such a run and take only part of it.
|
||
- When a card underneath a moved run is uncovered, it
|
||
automatically flips face up.
|
||
- Cards are drawn one at a time from the stock into the waste;
|
||
once the stock is empty, the entire waste is flipped back into
|
||
the stock for a fresh redeal (no limit on redeals).
|
||
- Moving cards back off a foundation is not implemented.
|
||
|
||
CONTROLS IN THIS VERSION
|
||
A move is two steps: pick a source, then pick where to place it.
|
||
1-7 select a column (or move the selection into it)
|
||
0 select the waste pile (source only)
|
||
f move the selected card to its foundation
|
||
esc cancel the current selection
|
||
d draw a card from the stock (redeals if it's empty)
|
||
u undo the last move
|
||
n new game (reshuffle)
|
||
q quit to menu
|
||
`
|
||
|
||
func klondikeRules() string {
|
||
if CurrentLang() == LangEN {
|
||
return klondikeRulesEN
|
||
}
|
||
return klondikeRulesRU
|
||
}
|
||
|
||
// --- Шашки (Checkers) --------------------------------------------
|
||
|
||
const checkersRulesRU = `ШАШКИ (RUSSIAN CHECKERS) — против бота
|
||
|
||
Реализованы русские шашки (не международные и не английские) на
|
||
доске 8х8. Вы всегда играете белыми и ходите первым; бот играет
|
||
чёрными (минимакс с альфа-бета отсечением). Перед началом партии
|
||
можно выбрать уровень сложности — "Простой" или "Сильный" (разница
|
||
только в глубине просчёта ходов бота).
|
||
|
||
ЦЕЛЬ
|
||
Взять все шашки соперника либо оставить его без единого
|
||
возможного хода.
|
||
|
||
ХОДЫ
|
||
Простая шашка ходит по диагонали на одну клетку только вперёд.
|
||
Дамка (шашка, дошедшая до последней горизонтали) ходит по
|
||
диагонали на любое расстояние в любом из четырёх направлений.
|
||
|
||
ВЗЯТИЕ
|
||
Простая шашка бьёт через одну соседнюю клетку в ЛЮБОМ из четырёх
|
||
диагональных направлений, включая назад — не только вперёд. Дамка
|
||
бьёт "летающим" ходом: может перепрыгнуть через вражескую шашку с
|
||
любого расстояния (если путь до неё свободен) и приземлиться на
|
||
любую свободную клетку сразу за ней (тоже с выбором расстояния).
|
||
|
||
Взятие ОБЯЗАТЕЛЬНО: если у вас есть хоть одно доступное взятие
|
||
где-либо на доске, простой ход запрещён. В отличие от
|
||
международных шашек, правило "бить максимально возможное число
|
||
шашек" не действует — подходит любое доступное взятие. Если после
|
||
взятия та же шашка может продолжить бить — она обязана продолжить
|
||
(ход не переходит сопернику, пока серия взятий не закончится).
|
||
Шашка, ставшая дамкой в середине серии взятий (дойдя до последней
|
||
горизонтали при ударе), продолжает эту же серию уже как дамка.
|
||
|
||
ОКОНЧАНИЕ ПАРТИИ
|
||
Побеждает тот, у кого остались ходы, когда у соперника их не
|
||
осталось (нет шашек или все заблокированы). Если долго (60
|
||
полуходов) не происходит ни одного взятия — партия принудительно
|
||
объявляется ничьей (упрощение официальных правил ничьей).
|
||
|
||
УПРАВЛЕНИЕ
|
||
↑↓←→ / hjkl передвижение курсора по доске
|
||
enter/space выбрать шашку (или переместить выбранную в клетку
|
||
под курсором)
|
||
esc отменить текущий выбор
|
||
q выход в меню
|
||
После завершения партии:
|
||
n новая партия
|
||
q выход в меню
|
||
`
|
||
|
||
const checkersRulesEN = `CHECKERS (RUSSIAN RULES) — against a bot
|
||
|
||
Russian checkers rules are implemented (not international, not
|
||
English draughts) on an 8x8 board. You always play white and move
|
||
first; the bot plays black (minimax with alpha-beta pruning). Before
|
||
the game starts you can pick a difficulty — "Easy" or "Strong" (the
|
||
only difference is the bot's search depth).
|
||
|
||
GOAL
|
||
Capture all of the opponent's pieces, or leave them with no legal
|
||
move at all.
|
||
|
||
MOVES
|
||
A regular man moves diagonally one square, forward only. A king
|
||
(a man that reached the last row) moves diagonally any distance in
|
||
any of the four directions.
|
||
|
||
CAPTURING
|
||
A regular man captures by jumping over an adjacent piece in ANY of
|
||
the four diagonal directions, including backward — not just
|
||
forward. A king captures with a "flying" jump: it may leap over an
|
||
enemy piece from any distance (if the path to it is clear) and
|
||
land on any empty square right after it (also any distance).
|
||
|
||
Capturing is MANDATORY: if you have any capture available anywhere
|
||
on the board, a non-capturing move is illegal. Unlike international
|
||
draughts, there is no "must capture the most pieces" rule — any
|
||
available capture is fine. If the same piece can capture again
|
||
after a capture, it must continue (the turn doesn't pass until the
|
||
capture chain ends). A piece that becomes a king mid-chain (by
|
||
reaching the last row on a capture) continues that same chain as a
|
||
king.
|
||
|
||
MATCH END
|
||
Whoever still has a legal move when the opponent has none (no
|
||
pieces left, or all blocked) wins. If no capture happens for a
|
||
long time (60 half-moves), the game is forced to a draw (a
|
||
simplification of the official draw rules).
|
||
|
||
CONTROLS
|
||
↑↓←→ / hjkl move the cursor around the board
|
||
enter/space select a piece (or move the selected piece to the
|
||
square under the cursor)
|
||
esc cancel the current selection
|
||
q quit to menu
|
||
After the game ends:
|
||
n new game
|
||
q quit to menu
|
||
`
|
||
|
||
func checkersRules() string {
|
||
if CurrentLang() == LangEN {
|
||
return checkersRulesEN
|
||
}
|
||
return checkersRulesRU
|
||
}
|
||
|
||
// --- Шахматы (Chess) ----------------------------------------------
|
||
|
||
const chessRulesRU = `ШАХМАТЫ (CHESS) — против бота
|
||
|
||
Реализованы полные правила шахмат, включая рокировку в обе стороны
|
||
и взятие на проходе. Вы всегда играете белыми и ходите первым; бот
|
||
играет чёрными (минимакс с альфа-бета отсечением). Перед началом
|
||
партии можно выбрать уровень сложности — "Простой" или "Сильный"
|
||
(разница только в глубине просчёта ходов бота).
|
||
|
||
ЦЕЛЬ
|
||
Поставить мат королю соперника — либо получить ничью (пат,
|
||
недостаточность материала или слишком долгая игра без взятий и
|
||
ходов пешками).
|
||
|
||
ХОДЫ ФИГУР
|
||
Пешка ходит вперёд на одну клетку (на две — с начальной позиции),
|
||
бьёт по диагонали на одну клетку вперёд. Конь ходит буквой "Г".
|
||
Слон — по диагонали на любое расстояние. Ладья — по горизонтали
|
||
или вертикали на любое расстояние. Ферзь совмещает ходы ладьи и
|
||
слона. Король — на одну клетку в любом направлении.
|
||
|
||
РОКИРОВКА
|
||
Король и соответствующая ладья рокируются, если ни один из них ещё
|
||
не ходил, все клетки между ними свободны, король не находится под
|
||
шахом и не проходит через атакованное поле (включая клетку, на
|
||
которую он встаёт). При короткой рокировке король идёт на 2 клетки
|
||
к ладье h, ладья становится рядом с ним; при длинной — то же самое
|
||
в сторону ладьи a.
|
||
|
||
ВЗЯТИЕ НА ПРОХОДЕ
|
||
Если пешка соперника только что пошла с начальной позиции сразу на
|
||
две клетки и оказалась рядом с вашей пешкой по горизонтали — вы
|
||
можете взять её так, как будто она пошла всего на одну клетку.
|
||
Это можно сделать только немедленно следующим ходом.
|
||
|
||
ПРЕВРАЩЕНИЕ ПЕШКИ
|
||
Дойдя до последней горизонтали, пешка автоматически превращается в
|
||
ферзя — упрощение: выбор фигуры превращения (ладья/слон/конь) не
|
||
реализован, так как подавляющее большинство реальных превращений и
|
||
так выбирают именно ферзя.
|
||
|
||
ШАХ, МАТ И НИЧЬЯ
|
||
Нельзя делать ход, после которого собственный король остаётся под
|
||
шахом (в том числе связанной фигурой нельзя открывать шах). Если у
|
||
игрока под шахом нет ни одного легального хода — это мат, партия
|
||
окончена. Если ходов нет, но короля под шахом не держат — это пат,
|
||
ничья. Также реализованы: ничья при недостаточности материала для
|
||
мата (например, король против короля) и принудительная ничья при
|
||
слишком долгой игре без взятий и ходов пешками (упрощённый аналог
|
||
официального правила 75 ходов). Троекратное повторение позиции
|
||
НЕ реализовано.
|
||
|
||
УПРАВЛЕНИЕ
|
||
↑↓←→ / hjkl передвижение курсора по доске
|
||
enter/space выбрать фигуру (или переместить выбранную в клетку
|
||
под курсором — для рокировки просто выберите короля
|
||
и укажите клетку в двух шагах от него)
|
||
esc отменить текущий выбор
|
||
q выход в меню
|
||
После завершения партии:
|
||
n новая партия
|
||
q выход в меню
|
||
`
|
||
|
||
const chessRulesEN = `CHESS — against a bot
|
||
|
||
Full chess rules are implemented, including castling both ways and
|
||
en passant captures. You always play white and move first; the bot
|
||
plays black (minimax with alpha-beta pruning). Before the game
|
||
starts you can pick a difficulty — "Easy" or "Strong" (the only
|
||
difference is the bot's search depth).
|
||
|
||
GOAL
|
||
Checkmate the opponent's king — or reach a draw (stalemate,
|
||
insufficient material, or too long a game without captures or pawn
|
||
moves).
|
||
|
||
PIECE MOVES
|
||
A pawn moves one square forward (two from its starting square) and
|
||
captures one square diagonally forward. A knight moves in an
|
||
"L" shape. A bishop moves diagonally any distance. A rook moves
|
||
horizontally or vertically any distance. A queen combines rook and
|
||
bishop moves. A king moves one square in any direction.
|
||
|
||
CASTLING
|
||
The king and the relevant rook may castle if neither has moved yet,
|
||
all squares between them are empty, the king isn't in check, and it
|
||
doesn't pass through an attacked square (including the square it
|
||
lands on). In kingside castling the king moves 2 squares toward the
|
||
h-rook, which then stands right next to it; queenside castling
|
||
works the same way toward the a-rook.
|
||
|
||
EN PASSANT
|
||
If an enemy pawn has just moved two squares from its starting
|
||
position and ended up next to your pawn, you may capture it as if
|
||
it had only moved one square. This is only possible on your very
|
||
next move.
|
||
|
||
PAWN PROMOTION
|
||
A pawn reaching the last row automatically promotes to a queen —
|
||
a simplification: choosing a different piece (rook/bishop/knight)
|
||
isn't implemented, since the vast majority of real promotions pick
|
||
a queen anyway.
|
||
|
||
CHECK, CHECKMATE AND DRAWS
|
||
You may not make a move that leaves your own king in check
|
||
(including moving a pinned piece so it would expose the king).
|
||
If a player in check has no legal move, that's checkmate and the
|
||
game ends. If there's no legal move but the king isn't in check,
|
||
that's stalemate — a draw. Also implemented: a draw for
|
||
insufficient mating material (e.g., king vs king), and a forced
|
||
draw if the game goes on too long without captures or pawn moves
|
||
(a simplified version of the official 75-move rule). Threefold
|
||
repetition is NOT implemented.
|
||
|
||
CONTROLS
|
||
↑↓←→ / hjkl move the cursor around the board
|
||
enter/space select a piece (or move the selected piece to the
|
||
square under the cursor — for castling, just select
|
||
the king and point two squares away from it)
|
||
esc cancel the current selection
|
||
q quit to menu
|
||
After the game ends:
|
||
n new game
|
||
q quit to menu
|
||
`
|
||
|
||
func chessRules() string {
|
||
if CurrentLang() == LangEN {
|
||
return chessRulesEN
|
||
}
|
||
return chessRulesRU
|
||
}
|
||
|
||
// --- Блэкджек (Blackjack) -----------------------------------------
|
||
|
||
const blackjackRulesRU = `БЛЭКДЖЕК — правила для 1-6 игроков
|
||
|
||
Каждый игрок играет только против дилера — не друг против друга.
|
||
Можно играть даже в одиночку: тогда за столом только вы и дилер.
|
||
|
||
ЦЕЛЬ
|
||
Набрать сумму очков ближе к 21, чем у дилера, не превысив 21.
|
||
|
||
ОЧКИ КАРТ
|
||
Туз — 11 или 1 (автоматически считается как 1, если 11 привело бы
|
||
к перебору). Картинки (валет/дама/король) — 10. Остальные — по
|
||
номиналу.
|
||
|
||
ПОДГОТОВКА И СТАВКА
|
||
В начале раунда каждый игрок делает фиксированную ставку. Игрокам
|
||
и дилеру раздаётся по 2 карты; у дилера одна карта открыта, вторая
|
||
скрыта до конца раунда. Блэкджек с раздачи — это туз и карта на 10
|
||
очков в первых двух картах (сумма 21 ровно двумя картами).
|
||
|
||
ХОД ИГРОКА
|
||
Каждый игрок по очереди решает:
|
||
- взять карту (hit) — можно повторять, пока не остановитесь или
|
||
не переберёте (сумма больше 21 — мгновенный проигрыш ставки);
|
||
- остановиться (stand) — зафиксировать текущую сумму;
|
||
- удвоить ставку (double down) — доступно только на первых двух
|
||
картах: ставка удваивается, берётся ровно одна карта, и ход
|
||
сразу заканчивается (переберёте вы или нет).
|
||
Сплиты (разделение пары карт на две руки) не поддерживаются.
|
||
|
||
ХОД ДИЛЕРА
|
||
После того как все игроки закончили ходы, дилер открывает вторую
|
||
карту и берёт карты, пока сумма меньше 17. Дилер останавливается на
|
||
любых 17 и больше, включая "мягкие" 17 с тузом — так проще и
|
||
предсказуемее для игры через терминал.
|
||
|
||
ВЫПЛАТЫ
|
||
- Блэкджек с раздачи (и у дилера его нет) — выигрыш 3:2.
|
||
- Блэкджек и у игрока, и у дилера — ничья, ставка возвращается.
|
||
- Перебор у игрока — проигрыш ставки, независимо от того, что
|
||
случится дальше у дилера.
|
||
- Дилер перебрал, а игрок нет — выигрыш 1:1.
|
||
- Сумма игрока больше суммы дилера (оба не перебрали) — выигрыш 1:1.
|
||
- Суммы равны — ничья, ставка возвращается.
|
||
- Сумма дилера больше — проигрыш ставки.
|
||
|
||
УПРАВЛЕНИЕ В ЭТОЙ ВЕРСИИ
|
||
h взять карту
|
||
s остановиться
|
||
d удвоить ставку (только на первых двух картах)
|
||
q выход в меню
|
||
После завершения раунда:
|
||
n новый раунд с тем же капиталом и ставкой
|
||
q выход в меню
|
||
`
|
||
|
||
const blackjackRulesEN = `BLACKJACK — rules for 1-6 players
|
||
|
||
Each player plays only against the dealer — not against each other.
|
||
You can even play solo: then it's just you and the dealer.
|
||
|
||
GOAL
|
||
Get a hand total closer to 21 than the dealer's, without going
|
||
over 21.
|
||
|
||
CARD VALUES
|
||
Ace — 11 or 1 (automatically counted as 1 if 11 would bust).
|
||
Face cards (J/Q/K) — 10. Everything else — face value.
|
||
|
||
SETUP AND BETTING
|
||
At the start of a round every player places a fixed bet. Players
|
||
and the dealer are each dealt 2 cards; one of the dealer's cards
|
||
is face up, the other hidden until the round ends. A blackjack on
|
||
the deal is an Ace plus a 10-value card in the first two cards
|
||
(a total of exactly 21 with two cards).
|
||
|
||
PLAYER'S TURN
|
||
Each player in turn decides to:
|
||
- hit — take a card, can repeat until you stand or bust (over 21
|
||
is an instant loss of the bet);
|
||
- stand — lock in your current total;
|
||
- double down — only on your first two cards: the bet is
|
||
doubled, you take exactly one more card, and your turn ends
|
||
immediately whether you bust or not.
|
||
Splitting a pair into two hands is not supported.
|
||
|
||
DEALER'S TURN
|
||
Once every player has finished, the dealer reveals the hidden card
|
||
and hits while their total is under 17. The dealer stands on any
|
||
17 or higher, including a "soft" 17 with an ace — simpler and more
|
||
predictable for a terminal game.
|
||
|
||
PAYOUTS
|
||
- Blackjack on the deal (and the dealer doesn't have one) — pays
|
||
3:2.
|
||
- Both player and dealer have blackjack — push, bet returned.
|
||
- Player busts — loses the bet, regardless of what the dealer does
|
||
afterward.
|
||
- Dealer busts, player doesn't — pays 1:1.
|
||
- Player's total beats the dealer's (neither busted) — pays 1:1.
|
||
- Totals are equal — push, bet returned.
|
||
- Dealer's total is higher — loses the bet.
|
||
|
||
CONTROLS IN THIS VERSION
|
||
h hit
|
||
s stand
|
||
d double down (first two cards only)
|
||
q quit to menu
|
||
After a round ends:
|
||
n new round with the same bankroll and bet
|
||
q quit to menu
|
||
`
|
||
|
||
func blackjackRules() string {
|
||
if CurrentLang() == LangEN {
|
||
return blackjackRulesEN
|
||
}
|
||
return blackjackRulesRU
|
||
}
|
||
|
||
// --- 101 -----------------------------------------------------------
|
||
|
||
const oneOhOneRulesRU = `101 — правила для 2-6 игроков
|
||
|
||
У игры "101" существует много вариантов, расходящихся в деталях.
|
||
Реализован следующий, наиболее часто встречающийся набор правил.
|
||
|
||
ЦЕЛЬ
|
||
Как можно быстрее избавиться от всех карт на руке. Тот, кто первым
|
||
это сделал — выигрывает раунд; остальные получают штрафные очки за
|
||
карты, оставшиеся на руках. Партия идёт до тех пор, пока не
|
||
останется один игрок — набравшие 101 очко и более выбывают.
|
||
|
||
ПОДГОТОВКА
|
||
Колода 36 карт (от шестёрки до туза), как и в Дураке. Сдающий
|
||
раздаёт по 5 карт каждому игроку, кроме себя — себе оставляет 4, а
|
||
пятую (лишнюю) кладёт в центр стола лицом вверх — это стартовая
|
||
карта сброса. Первым ходит игрок слева от сдающего.
|
||
|
||
ХОД
|
||
Нужно положить карту той же масти или того же ранга, что и верхняя
|
||
карта сброса. Если подходящей карты нет — нужно брать карты из
|
||
колоды добора по одной, пока не найдётся подходящая (тогда она
|
||
сразу же играется) либо пока колода не закончится (тогда ход
|
||
просто переходит дальше).
|
||
|
||
СПЕЦИАЛЬНЫЕ КАРТЫ
|
||
Туз — пропускает ход следующего игрока.
|
||
Шестёрка — следующий игрок берёт 1 карту и пропускает ход.
|
||
Семёрка — следующий игрок берёт 2 карты и пропускает ход.
|
||
Пиковый король — следующий игрок берёт 4 карты и пропускает ход.
|
||
Остальные короли и карты — обычные, без эффекта.
|
||
|
||
ОЧКИ КАРТ (штраф за карты, оставшиеся на руках)
|
||
Туз - 11, десятка - 10, девятка - 0, восьмёрка - 8, семёрка - 7,
|
||
шестёрка - 6, король - 4, дама - 3, валет - 2.
|
||
|
||
ОКОНЧАНИЕ РАУНДА
|
||
Победитель раунда получает 0 штрафных очков — а если его последней
|
||
сыгранной картой была дама, то бонус -20 очков (-40, если дама
|
||
червовая) вместо обычных 0. Остальные складывают очковую стоимость
|
||
карт, оставшихся у них на руках, и добавляют этот раунд к своему
|
||
общему счёту.
|
||
|
||
ВЫБЫВАНИЕ И ОКОНЧАНИЕ ПАРТИИ
|
||
Набравший 101 очко и более выбывает из партии — если только это не
|
||
ровно 101, тогда счёт обнуляется (можно отыграться). Сдающим
|
||
следующего раунда становится победитель предыдущего. Партия
|
||
продолжается, пока не останется один игрок — он побеждает.
|
||
|
||
УПРАВЛЕНИЕ В ЭТОЙ ВЕРСИИ
|
||
←→ / hl выбор карты в руке
|
||
enter сыграть выбранную карту
|
||
d взять карту из колоды (доступно только если нет подходящей)
|
||
q выход в меню
|
||
После завершения раунда:
|
||
n новый раунд (если партия ещё не окончена)
|
||
q выход в меню
|
||
`
|
||
|
||
const oneOhOneRulesEN = `101 — rules for 2-6 players
|
||
|
||
There are many variants of "101" that differ in the details. The
|
||
following, most commonly seen ruleset is implemented here.
|
||
|
||
GOAL
|
||
Empty your hand as fast as possible. Whoever does it first wins
|
||
the round; everyone else gets penalty points for the cards left in
|
||
hand. The match continues until only one player remains — reaching
|
||
101 points or more eliminates you.
|
||
|
||
SETUP
|
||
36-card deck (six through ace), same as Durak. The dealer deals 5
|
||
cards to every player except themself — they keep 4, and the
|
||
leftover 5th card is placed face up in the middle as the starting
|
||
discard. The player to the dealer's left goes first.
|
||
|
||
TURN
|
||
Play a card of the same suit or the same rank as the top of the
|
||
discard pile. If you have no matching card, draw from the stock
|
||
one at a time until you draw one that matches (it's played
|
||
immediately) or until the stock runs out (then your turn simply
|
||
passes).
|
||
|
||
SPECIAL CARDS
|
||
Ace — skips the next player's turn.
|
||
Six — the next player draws 1 card and is skipped.
|
||
Seven — the next player draws 2 cards and is skipped.
|
||
King of spades — the next player draws 4 cards and is skipped.
|
||
All other kings and cards — normal, no effect.
|
||
|
||
CARD POINTS (penalty for cards left in hand)
|
||
Ace - 11, ten - 10, nine - 0, eight - 8, seven - 7, six - 6,
|
||
king - 4, queen - 3, jack - 2.
|
||
|
||
END OF A ROUND
|
||
The round's winner scores 0 penalty points — and if their last
|
||
played card was a queen, they get a -20 point bonus instead (-40
|
||
for the queen of hearts). Everyone else adds up the point value of
|
||
the cards left in their hand and adds it to their running score.
|
||
|
||
ELIMINATION AND MATCH END
|
||
Reaching 101 points or more eliminates you from the match — unless
|
||
it's exactly 101, in which case your score resets to 0 (a second
|
||
chance). The winner of a round deals the next one. The match
|
||
continues until only one player is left — they win.
|
||
|
||
CONTROLS IN THIS VERSION
|
||
←→ / hl select a card in hand
|
||
enter play the selected card
|
||
d draw from the stock (only available if you have no match)
|
||
q quit to menu
|
||
After a round ends:
|
||
n new round (if the match isn't over yet)
|
||
q quit to menu
|
||
`
|
||
|
||
func oneOhOneRules() string {
|
||
if CurrentLang() == LangEN {
|
||
return oneOhOneRulesEN
|
||
}
|
||
return oneOhOneRulesRU
|
||
}
|
||
|
||
// --- Дурак (Durak) --------------------------------------------------
|
||
|
||
const durakRulesRU = `ДУРАК — правила для 2-6 игроков
|
||
|
||
Реализован классический "подкидной" Дурак в полном виде: подкидывать
|
||
дополнительные карты в раунде может любой игрок за столом, кроме
|
||
самого защищающегося — не только тот, кто открыл раунд. Отбивается
|
||
всегда только защищающийся, забрать стол может тоже только он.
|
||
|
||
ПОДГОТОВКА
|
||
Колода 36 карт (от шестёрки до туза, без карт 2-5). Каждому
|
||
раздаётся по 6 карт. При 6 игроках колода не делится ровно — кому-
|
||
то может достаться на одну карту меньше, это нормально и по
|
||
правилам. Последняя карта колоды вскрывается — это козырь; она
|
||
остаётся в самом низу колоды добора и берётся последней.
|
||
Первым ходит игрок с самым младшим козырем на руке.
|
||
|
||
ХОД
|
||
Атакующий обязательно открывает раунд, подкинув одну карту.
|
||
Защищающийся должен отбить её картой той же масти старше по рангу,
|
||
либо любым козырем (козырь бьёт некозырную карту любого ранга, но
|
||
козырь козырю нужно бить только старшим козырем).
|
||
|
||
Как только очередная карта отбита, право подкинуть ещё одну карту
|
||
(того же ранга, что уже есть среди карт на столе) по очереди
|
||
получает каждый из остальных игроков, кроме защищающегося — начиная
|
||
с атакующего и по кругу. Каждый в свою очередь либо подкидывает
|
||
подходящую карту (тогда защищающийся должен снова отбиться или
|
||
забрать стол), либо пасует. Как только все подряд отказались
|
||
подкидывать — или лимит атаки исчерпан (не больше 6 карт на столе и
|
||
не больше числа карт на руке защищающегося на начало раунда) —
|
||
объявляется "бито": все карты со стола уходят в отбой навсегда.
|
||
|
||
Если защищающийся не может (или не хочет) отбить карту — он
|
||
забирает весь стол себе в руку. Это не проигрыш, а обычный игровой
|
||
момент.
|
||
|
||
СМЕНА РОЛЕЙ
|
||
После "бито" атакующим становится следующий по кругу после
|
||
защищающегося. После взятия стола атакующим становится следующий
|
||
по кругу после того, кто как раз забрал карты (он на этот раз
|
||
пропускает роль атакующего).
|
||
|
||
ДОБОР КАРТ
|
||
После каждого раунда игроки добирают карты из колоды до 6 (если в
|
||
колоде столько есть), начиная с атакующего того раунда и по кругу,
|
||
защищающийся добирает последним. Если стол забрали — забравший
|
||
вообще не добирает в этот раз (у него и так теперь много карт).
|
||
|
||
ОКОНЧАНИЕ ПАРТИИ
|
||
Как только у игрока не осталось карт на руке и в колоде добора
|
||
тоже пусто — он выходит из игры "в безопасности". Игра продолжается
|
||
для остальных. Последний, у кого остались карты на руках, когда все
|
||
остальные уже вышли — "дурак", он проигрывает. Если сразу несколько
|
||
игроков одновременно избавляются от последних карт — считается
|
||
ничья, дурака нет.
|
||
|
||
УПРАВЛЕНИЕ В ЭТОЙ ВЕРСИИ
|
||
Когда вы открываете раунд (обязательный первый ход):
|
||
←→ / hl выбор карты в руке
|
||
enter подкинуть выбранную карту
|
||
Когда вы защищающийся:
|
||
←→ / hl выбор карты в руке
|
||
enter отбить выбранной картой последнюю неотбитую карту
|
||
t забрать весь стол себе в руку
|
||
Когда очередь подкидывать дошла до вас (стол уже отбит):
|
||
←→ / hl выбор карты в руке
|
||
enter подкинуть ещё одну карту
|
||
p пасовать (отказаться подкидывать)
|
||
В любой момент:
|
||
q выход в меню
|
||
После завершения партии:
|
||
n новая партия с тем же числом игроков
|
||
q выход в меню
|
||
`
|
||
|
||
const durakRulesEN = `DURAK (RUSSIAN FOOL) — rules for 2-6 players
|
||
|
||
A full-featured classic "throw-in" Durak is implemented: any player
|
||
at the table except the defender — not just the one who opened the
|
||
round — may throw in extra cards. Only the defender ever defends, and
|
||
only the defender can take the table.
|
||
|
||
SETUP
|
||
36-card deck (six through ace, no 2-5). Everyone is dealt 6 cards.
|
||
With 6 players the deck doesn't split evenly — someone may end up
|
||
with one fewer card, which is normal and by the rules. The last
|
||
card of the deck is revealed as the trump; it stays at the very
|
||
bottom of the draw pile and is drawn last. Whoever holds the
|
||
lowest trump goes first.
|
||
|
||
TURN
|
||
The attacker must open the round by throwing in one card. The
|
||
defender must beat it with a higher card of the same suit, or any
|
||
trump (a trump beats a non-trump card of any rank, but a trump can
|
||
only be beaten by a higher trump).
|
||
|
||
As soon as a card is beaten, the right to throw in another card
|
||
(of a rank already present on the table) passes in turn to each of
|
||
the other players except the defender — starting with the attacker
|
||
and going around. Each player in turn either throws in a matching
|
||
card (forcing the defender to beat it again or take the table) or
|
||
passes. Once everyone in a row has declined — or the attack limit
|
||
is reached (no more than 6 cards on the table, and no more than the
|
||
defender's hand size at the start of the round) — it's called
|
||
"beaten": all cards on the table are discarded from play for good.
|
||
|
||
If the defender can't (or doesn't want to) beat a card, they take
|
||
the whole table into their hand. That's not a loss, just a normal
|
||
part of play.
|
||
|
||
ROLE ROTATION
|
||
After a "beaten" table, the next player after the defender becomes
|
||
the new attacker. After a table is taken, the next player after
|
||
whoever just took it becomes the new attacker (they skip being
|
||
attacker this time).
|
||
|
||
DRAWING CARDS
|
||
After each round, players draw back up to 6 cards (if the deck has
|
||
enough), starting with that round's attacker and going around, with
|
||
the defender drawing last. If the table was taken, the player who
|
||
took it doesn't draw this time (they already have plenty of cards).
|
||
|
||
MATCH END
|
||
As soon as a player has no cards in hand and the draw pile is also
|
||
empty, they're "safe" and out of play. The game continues for the
|
||
rest. The last player left holding cards once everyone else is safe
|
||
is the "fool" and loses. If several players empty their hands at
|
||
the exact same moment, it's a draw — no fool.
|
||
|
||
CONTROLS IN THIS VERSION
|
||
When you're opening the round (the mandatory first move):
|
||
←→ / hl select a card in hand
|
||
enter throw in the selected card
|
||
When you're the defender:
|
||
←→ / hl select a card in hand
|
||
enter beat the last unbeaten card with the selected card
|
||
t take the whole table into your hand
|
||
When it's your turn to throw in (table already beaten):
|
||
←→ / hl select a card in hand
|
||
enter throw in another card
|
||
p pass (decline to throw in)
|
||
At any time:
|
||
q quit to menu
|
||
After the match ends:
|
||
n new match with the same number of players
|
||
q quit to menu
|
||
`
|
||
|
||
func durakRules() string {
|
||
if CurrentLang() == LangEN {
|
||
return durakRulesEN
|
||
}
|
||
return durakRulesRU
|
||
}
|
||
|
||
// --- Тонк (Tonk) ------------------------------------------------------
|
||
|
||
const tonkRulesRU = `ТОНК (TONK) — правила для 3-4 игроков
|
||
|
||
ПОДГОТОВКА
|
||
Колода 52 карты без джокеров. Каждому раздаётся по 5 карт.
|
||
Оставшиеся карты — колода добора. Верхняя карта сразу вскрывается
|
||
рубашкой вниз рядом — так начинается стопка сброса.
|
||
|
||
ХОД ИГРОКА
|
||
1. Взять карту — либо верхнюю из колоды добора, либо верхнюю
|
||
из стопки сброса.
|
||
2. Можно выложить на стол готовые комбинации:
|
||
- сет: 3+ карты одного ранга, разных мастей
|
||
- сиквенс: 3+ карты одной масти подряд по рангу
|
||
Туз может быть как младшей картой (A-2-3), так и старшей
|
||
(Q-K-A), но не одновременно ("закольцевать" через край нельзя).
|
||
3. Можно подкладывать карты к уже выложенным комбинациям —
|
||
своим или чужим.
|
||
4. В конце хода нужно сбросить одну карту (кроме случая, когда
|
||
последняя карта руки ушла в комбинацию — тогда раунд
|
||
заканчивается победой без отдельного сброса).
|
||
|
||
ОЧКИ КАРТ
|
||
Туз = 1, валет/дама/король = 10, остальные — по номиналу.
|
||
|
||
ОБЪЯВЛЕНИЕ "ТОНК"
|
||
В любой момент сразу после взятия карты (до выкладывания
|
||
комбинаций) игрок может объявить Тонк, если сумма очков карт на
|
||
руке не превышает порог (по умолчанию 5). Раунд немедленно
|
||
заканчивается победой объявившего — денежные детали см. в разделе
|
||
"ДЕНЬГИ" ниже.
|
||
|
||
ДРОП — рискованная альтернатива Тонку
|
||
В самом начале своего хода, ДО взятия карты, игрок может
|
||
объявить дроп: заявить, что у него, по его мнению, самая низкая
|
||
сумма очков на руках за столом. В отличие от Тонка, никакого
|
||
порога веса руки не требуется — можно дропнуть с любой рукой,
|
||
это чистая ставка на свою интуицию.
|
||
- Если дроп верен (рука объявившего строго ниже, чем у всех
|
||
остальных) — он забирает банк раунда целиком, как за обычную
|
||
победу (без множителя).
|
||
- Если дроп неверен (у кого-то сумма равна или ниже) — дроп
|
||
"не удался": банк достаётся тому, у кого реально самая
|
||
низкая сумма (при нескольких таких игроках — делится
|
||
поровну между ними), а объявивший вдобавок платит им штраф
|
||
в размере ещё одной ставки (анте) сверху.
|
||
Боты тоже иногда идут на дроп, но осторожно: они ориентируются
|
||
только на свою руку (не подглядывают в чужие карты) и рискуют,
|
||
только если их собственная сумма уже очень мала.
|
||
|
||
ЗАВЕРШЕНИЕ РАУНДА
|
||
- Игрок избавился от всех карт -> он забирает банк раунда целиком.
|
||
- Объявлен Тонк -> объявивший забирает банк, умноженный на
|
||
множитель Тонка (см. ниже); недостающую разницу сверх банка
|
||
поровну доплачивают остальные игроки.
|
||
- Колода добора и стопка сброса исчерпаны, и никто не может ни
|
||
выиграть, ни объявить Тонк -> раунд "мёртвый", банк возвращается
|
||
игрокам поровну (каждому — его ставка назад).
|
||
|
||
ДЕНЬГИ: СТАВКА И БАНК
|
||
В начале каждого раунда каждый игрок вносит фиксированную ставку
|
||
(анте) в общий банк. Обычная победа (опустошением руки) забирает
|
||
банк как есть. Победа через объявление Тонка забирает банк,
|
||
умноженный на 2: недостающую сумму сверх банка поровну доплачивают
|
||
остальные игроки — то есть Тонк выгоднее для победителя, но дороже
|
||
обходится проигравшим, чем обычное поражение. При "мёртвом" раунде
|
||
деньги никто не выигрывает и не теряет — ставки просто возвращаются.
|
||
Капитал каждого игрока переносится из раунда в раунд, пока идёт
|
||
партия; в этой версии капитал может уйти в минус, если ставки
|
||
превышают остаток средств — отдельного правила банкротства пока нет.
|
||
|
||
УПРАВЛЕНИЕ В ЭТОЙ ВЕРСИИ
|
||
Фаза взятия карты:
|
||
d взять из колоды добора
|
||
p взять из сброса
|
||
k рискнуть дропом (см. раздел "ДРОП" выше)
|
||
Фаза действия (после взятия карты):
|
||
←→ / hl выбор карты в руке
|
||
space отметить/снять отметку карты для новой комбинации
|
||
m выложить отмеченные карты как комбинацию (сет/сиквенс)
|
||
1-9 подложить выбранную карту к комбинации №N на столе
|
||
t объявить Тонк (доступно, если вес руки не выше порога)
|
||
enter сбросить выбранную карту и завершить ход
|
||
В любой момент:
|
||
q выход
|
||
После завершения раунда:
|
||
n новый раунд (счёт сохраняется)
|
||
q выход
|
||
`
|
||
|
||
const tonkRulesEN = `TONK — rules for 3-4 players
|
||
|
||
SETUP
|
||
A 52-card deck, no jokers. Everyone is dealt 5 cards. The rest form
|
||
the draw pile. The top card is immediately flipped face up next to
|
||
it — that's the start of the discard pile.
|
||
|
||
PLAYER'S TURN
|
||
1. Draw a card — either the top of the draw pile or the top of the
|
||
discard pile.
|
||
2. You may lay down completed melds on the table:
|
||
- a set: 3+ cards of the same rank, different suits
|
||
- a sequence: 3+ consecutive cards of the same suit
|
||
An ace can be the low card (A-2-3) or the high card (Q-K-A), but
|
||
not both at once (you can't "wrap around" the ends).
|
||
3. You may add cards to melds already on the table — yours or
|
||
anyone else's.
|
||
4. You must discard one card to end your turn (unless your very
|
||
last card went into a meld — then the round ends in a win
|
||
without a separate discard).
|
||
|
||
CARD POINTS
|
||
Ace = 1, jack/queen/king = 10, everything else at face value.
|
||
|
||
DECLARING "TONK"
|
||
At any point right after drawing (before laying down any melds), a
|
||
player may declare Tonk if their hand's point total is at or below
|
||
a threshold (5 by default). The round ends immediately in the
|
||
declarer's favor — see "MONEY" below for the payout details.
|
||
|
||
DROP — a riskier alternative to Tonk
|
||
At the very start of your turn, BEFORE drawing, you may declare a
|
||
drop: a claim that you believe you hold the lowest point total at
|
||
the table. Unlike Tonk, there's no hand-weight threshold required —
|
||
you can drop with any hand at all; it's a pure gamble on your own
|
||
read of the table.
|
||
- If the drop is correct (your hand is strictly lower than
|
||
everyone else's) you take the whole pot, same as an ordinary
|
||
win (no multiplier).
|
||
- If the drop is wrong (someone ties or beats you) the drop
|
||
"fails": the pot goes to whoever is actually lowest (split
|
||
evenly if there's a tie), and on top of that the dropper pays
|
||
them a penalty equal to one more ante.
|
||
Bots sometimes drop too, but cautiously: they only look at their
|
||
own hand (they never peek at anyone else's cards) and only risk it
|
||
when their own total is already very low.
|
||
|
||
END OF A ROUND
|
||
- A player empties their hand -> they take the whole pot.
|
||
- Tonk is declared -> the declarer takes the pot multiplied by the
|
||
Tonk multiplier (see below); everyone else pays their share of
|
||
the difference on top of the pot.
|
||
- The draw pile and discard pile are both exhausted, and no one can
|
||
win or declare Tonk -> the round is "dead", the pot is returned
|
||
to everyone (each gets their ante back).
|
||
|
||
MONEY: THE ANTE AND THE POT
|
||
At the start of every round, each player puts a fixed ante into the
|
||
shared pot. A normal win (emptying your hand) takes the pot as is.
|
||
A win by declaring Tonk takes the pot doubled: everyone else
|
||
splits paying the extra amount above the pot — so Tonk is more
|
||
rewarding for the winner, but costs the losers more than an
|
||
ordinary loss. In a "dead" round nobody wins or loses money — the
|
||
antes are simply returned. Each player's bankroll carries over from
|
||
round to round while the match continues; in this version a
|
||
balance can go negative if the antes exceed what's left — there's
|
||
no bankruptcy rule yet.
|
||
|
||
CONTROLS IN THIS VERSION
|
||
Draw phase:
|
||
d draw from the stock
|
||
p draw from the discard pile
|
||
k risk a drop (see "DROP" above)
|
||
Action phase (after drawing):
|
||
←→ / hl select a card in hand
|
||
space mark/unmark a card for a new meld
|
||
m lay down the marked cards as a meld (set/sequence)
|
||
1-9 add the selected card to table meld #N
|
||
t declare Tonk (available if your hand is at or below the
|
||
threshold)
|
||
enter discard the selected card and end your turn
|
||
At any time:
|
||
q quit
|
||
After a round ends:
|
||
n new round (bankroll carries over)
|
||
q quit
|
||
`
|
||
|
||
func tonkRules() string {
|
||
if CurrentLang() == LangEN {
|
||
return tonkRulesEN
|
||
}
|
||
return tonkRulesRU
|
||
}
|
||
|
||
// --- Трупные батончики (Corpse-Starch Box) ------------------------
|
||
|
||
const corpseStarchRulesRU = `ТРУПНЫЕ БАТОНЧИКИ (CORPSE-STARCH BOX)
|
||
|
||
Инкрементальная (кликер/idle) игра в духе Candy Box 2 — в антураже
|
||
мрачного далёкого будущего. Никаких ботов и соперников: вы просто
|
||
копите трупный крахмал и постепенно открываете новые механики по
|
||
мере накопления ресурса.
|
||
|
||
СОХРАНЕНИЕ
|
||
В отличие от остальных игр коллекции, эта партия сохраняется на
|
||
диск: автоматически каждые 15 секунд и при выходе в меню (клавиша
|
||
q). При следующем запуске партия загрузится с того же места, а
|
||
сервиторы честно "домолотят" трупный крахмал за всё время, пока
|
||
вы отсутствовали, — как будто вы всё это время не отходили от
|
||
экрана. Чтобы начать заново, достаточно удалить файл сохранения
|
||
(обычно ~/.config/go-games-collection/corpsestarch_save.json).
|
||
|
||
ЦЕЛЬ
|
||
Формальной цели или условия победы нет — это чистый инкрементальный
|
||
опыт: копите ресурс, открывайте разделы, экспериментируйте.
|
||
|
||
ОСНОВНОЙ РЕСУРС
|
||
Трупный крахмал добывается вручную (реквизиция) и, после открытия
|
||
раздела, ещё и пассивно — в реальном времени, пока партия открыта
|
||
на экране (даже если вы ничего не нажимаете).
|
||
|
||
РАЗДЕЛЫ, ОТКРЫВАЮЩИЕСЯ ПО МЕРЕ НАКОПЛЕНИЯ
|
||
- Сервиторы — покупка юнитов пассивного дохода (сервочерепа,
|
||
сервитора-подёнщика, когитаторного комплекса); каждая следующая
|
||
покупка одного тира дороже предыдущей.
|
||
- Муниторум — заточка цепного меча повышает доход от ручной
|
||
реквизиции.
|
||
- Отстойник — можно окунуть в него цепной меч: случайный исход
|
||
(бонус крахмала, временное благословение духа машины,
|
||
ничего, либо скверна с потерей части запаса).
|
||
- Зачистки — отправить отряд на одну из миссий на реальное время
|
||
(от 20 секунд до нескольких минут); по завершении можно забрать
|
||
награду.
|
||
|
||
СКВЕРНА И ВАРП-ВЫБРОС
|
||
Каждое неудачное окунание меча в отстойник добавляет единицу
|
||
Скверны. При достижении 3 она прорывается варп-выбросом: половина
|
||
текущего запаса крахмала и половина каждого тира сервиторов
|
||
теряется, Скверна сбрасывается в 0, и начинается вторжение
|
||
культистов Хаоса на целый час реального времени. Пока оно идёт,
|
||
сервиторы дают вдвое меньше дохода — часть сил станции отвлечена на
|
||
оборону. Появляется отдельное действие "отбиваться от культистов" —
|
||
каждое нажатие засчитывается; если за время вторжения накопится
|
||
достаточно активных защит, по его окончании начисляется бонус
|
||
крахмала в благодарность за стойкость станции. Цикл может
|
||
повториться — Скверна снова начинает копиться с нуля.
|
||
|
||
УПРАВЛЕНИЕ
|
||
1-9 выбрать пронумерованное действие (список меняется по мере
|
||
открытия новых разделов — номера могут "переезжать")
|
||
N начать заново (с подтверждением — весь текущий прогресс
|
||
будет безвозвратно потерян)
|
||
q сохранить партию и выйти в меню
|
||
`
|
||
|
||
const corpseStarchRulesEN = `CORPSE-STARCH BOX
|
||
|
||
An incremental (clicker/idle) game in the spirit of Candy Box 2 —
|
||
set in a grim, dark far future. No bots or opponents: you simply
|
||
gather corpse starch and gradually unlock new mechanics as your
|
||
stockpile grows.
|
||
|
||
SAVING
|
||
Unlike the other games in this collection, this game saves to
|
||
disk: automatically every 15 seconds and whenever you quit to the
|
||
menu (the q key). Next time you start it, your game picks up right
|
||
where you left off, and your servitors will honestly "catch up" on
|
||
the corpse starch they gathered while you were away — as if you'd
|
||
never left the screen. To start fresh, just delete the save file
|
||
(usually ~/.config/go-games-collection/corpsestarch_save.json).
|
||
|
||
GOAL
|
||
There's no formal goal or win condition — it's a pure incremental
|
||
experience: gather resources, unlock sections, experiment.
|
||
|
||
MAIN RESOURCE
|
||
Corpse starch is gathered manually (requisition) and, once that
|
||
section unlocks, also passively in real time while the game screen
|
||
is open (even if you press nothing).
|
||
|
||
SECTIONS THAT UNLOCK AS YOU GATHER MORE
|
||
- Servitors — buy passive-income units (servo-skull, menial
|
||
servitor, cogitator array); each further purchase of a tier
|
||
costs more than the last.
|
||
- Munitorum — sharpening your chainsword raises your manual
|
||
requisition yield.
|
||
- The Sump — dip your chainsword into it for a random outcome
|
||
(a starch bonus, a temporary machine-spirit blessing, nothing at
|
||
all, or taint that costs you part of your stockpile).
|
||
- Purges — send a squad on one of several missions that take real
|
||
time (from 20 seconds to a few minutes); collect the reward once
|
||
it's done.
|
||
|
||
CORRUPTION AND WARP BREACH
|
||
Every unlucky chainsword dip adds one point of Corruption. Once it
|
||
reaches 3, it erupts in a warp breach: half your current starch
|
||
stockpile and half of every servitor tier are lost, Corruption
|
||
resets to 0, and a Chaos cultist incursion begins for a full hour
|
||
of real time. While it's ongoing, servitors yield only half their
|
||
usual income — part of the station's strength is diverted to
|
||
defense. A separate "fight off the cultists" action appears — each
|
||
press counts toward your defense; if you rack up enough active
|
||
defenses during the incursion, a bonus shipment of starch is
|
||
awarded once it ends, as thanks for the station's resolve. The
|
||
cycle can repeat — Corruption starts building up from zero again.
|
||
|
||
CONTROLS
|
||
1-9 choose a numbered action (the list grows as you unlock more
|
||
sections — numbers may shift around)
|
||
N start over (with confirmation — all current progress will
|
||
be permanently lost)
|
||
q save the game and quit to menu
|
||
`
|
||
|
||
func corpseStarchRules() string {
|
||
if CurrentLang() == LangEN {
|
||
return corpseStarchRulesEN
|
||
}
|
||
return corpseStarchRulesRU
|
||
}
|
||
|
||
// --- Го (Go) -------------------------------------------------------
|
||
|
||
const goRulesRU = `ГО (GO) — против бота
|
||
|
||
Реализованы базовые правила Го: свободы групп камней, взятие групп
|
||
без единой свободы, запрет самоубийственного хода (кроме случая,
|
||
когда сам ход берёт вражеские камни и получает свободу), простое
|
||
правило ко. Перед началом партии можно выбрать размер доски (9x9,
|
||
13x13 или 19x19) и уровень сложности бота. Вы всегда играете
|
||
чёрными и ходите первым; бот играет белыми.
|
||
|
||
О СИЛЕ БОТА: честная сильная игра в Го требует Monte-Carlo поиска
|
||
по дереву партии или нейросетевой оценки позиции (как в AlphaGo) —
|
||
минимакс здесь почти бесполезен из-за огромного ветвления. Все три
|
||
уровня сложности — эвристические, БЕЗ поиска вперёд по дереву
|
||
партии, и играют существенно слабее сильного человека даже на
|
||
"Сильном" уровне.
|
||
|
||
ЦЕЛЬ
|
||
Окружить своими камнями больше территории (пустых точек) и camней,
|
||
чем соперник, к концу партии.
|
||
|
||
ХОДЫ
|
||
Игроки по очереди ставят по одному камню на свободную точку
|
||
пересечения линий (не в клетку, как в шашках/шахматах). Можно
|
||
пасовать вместо хода.
|
||
|
||
СВОБОДЫ И ВЗЯТИЕ
|
||
У связной группы камней одного цвета есть "свободы" — пустые
|
||
точки, прилегающие к ней. Если после хода соперника у группы не
|
||
остаётся ни одной свободы, вся группа снимается с доски (берётся).
|
||
Нельзя ставить камень так, чтобы его собственная группа осталась
|
||
без единой свободы (самоубийственный ход) — ЕСЛИ только этот же
|
||
ход не берёт вражескую группу, тем самым освобождая точку.
|
||
|
||
ПРАВИЛО КО
|
||
Нельзя немедленно восстановить позицию, которая была на доске до
|
||
хода соперника, — это предотвращает бесконечный обмен взятием
|
||
одной и той же точки туда-обратно. Достаточно сходить в любое
|
||
другое место — на следующий ход взятие снова станет возможным.
|
||
Более сложное правило "тройного повторения позиции" (супер-ко) не
|
||
реализовано.
|
||
|
||
ОКОНЧАНИЕ ПАРТИИ И ПОДСЧЁТ ОЧКОВ
|
||
Два паса подряд заканчивают партию. Счёт считается по КИТАЙСКИМ
|
||
(площадным) правилам: очки = число своих камней на доске + число
|
||
пустых точек, граничащих ИСКЛЮЧИТЕЛЬНО с этим цветом (точки,
|
||
граничащие с обоими цветами, нейтральны и не достаются никому).
|
||
Белые получают коми (компенсацию за то, что чёрные ходят первыми)
|
||
— 7.5 очка при любом размере доски.
|
||
|
||
ВАЖНОЕ УПРОЩЕНИЕ: фаза "удаления мёртвых камней" перед подсчётом
|
||
не реализована — партия оценивается по камням, буквально
|
||
оставшимся на доске в момент второго паса. Если камень фактически
|
||
окружён, но не взят по-настоящему, он засчитывается как живой
|
||
своему цвету. Поэтому перед двумя пасами стоит реально взять все
|
||
безнадёжные камни соперника, а не полагаться на то, что они
|
||
"и так мертвы".
|
||
|
||
УПРАВЛЕНИЕ
|
||
↑↓←→ / hjkl передвижение курсора по доске
|
||
enter/space поставить камень в клетку под курсором
|
||
p пасовать
|
||
q выход в меню
|
||
После завершения партии:
|
||
n новая партия (тот же размер доски и сложность)
|
||
q выход в меню
|
||
`
|
||
|
||
const goRulesEN = `GO — against a bot
|
||
|
||
Basic Go rules are implemented: group liberties, capturing groups
|
||
with no liberties left, forbidding suicidal moves (unless the move
|
||
itself captures enemy stones and thereby gains a liberty), and the
|
||
simple ko rule. Before the game starts you can pick the board size
|
||
(9x9, 13x13, or 19x19) and the bot's difficulty. You always play
|
||
black and move first; the bot plays white.
|
||
|
||
ON BOT STRENGTH: genuinely strong Go play requires Monte Carlo tree
|
||
search or neural-network position evaluation (as in AlphaGo) —
|
||
minimax is nearly useless here because of the enormous branching
|
||
factor. All three difficulty levels are heuristic-based, WITHOUT any
|
||
lookahead search through the game tree, and play noticeably weaker
|
||
than a strong human even on "Strong" difficulty.
|
||
|
||
GOAL
|
||
Surround more territory (empty points) and stones with your color
|
||
than your opponent by the end of the game.
|
||
|
||
MOVES
|
||
Players take turns placing one stone on an empty line intersection
|
||
(not in a square, unlike checkers/chess). You may pass instead of
|
||
playing.
|
||
|
||
LIBERTIES AND CAPTURING
|
||
A connected group of same-colored stones has "liberties" — empty
|
||
points adjacent to it. If a group is left with zero liberties after
|
||
the opponent's move, the whole group is removed from the board
|
||
(captured). You may not place a stone so that its own group ends up
|
||
with zero liberties (a suicidal move) — UNLESS that same move
|
||
captures an enemy group, thereby freeing up a liberty.
|
||
|
||
THE KO RULE
|
||
You may not immediately recreate the board position that existed
|
||
before your opponent's last move — this prevents an endless back-
|
||
and-forth recapture of the same point. Playing anywhere else first
|
||
is enough; the point becomes capturable again on your next turn.
|
||
The more elaborate "positional superko" (triple repetition) rule is
|
||
NOT implemented.
|
||
|
||
GAME END AND SCORING
|
||
Two passes in a row end the game. Scoring uses CHINESE (area)
|
||
rules: score = number of your stones on the board + number of empty
|
||
points bordering ONLY your color (points touching both colors are
|
||
neutral and go to neither). White receives komi (compensation for
|
||
black moving first) — 7.5 points regardless of board size.
|
||
|
||
IMPORTANT SIMPLIFICATION: the "dead stone removal" phase before
|
||
scoring isn't implemented — the game is scored based on whatever is
|
||
literally still on the board at the second pass. If a stone is
|
||
effectively surrounded but never actually captured, it still counts
|
||
as alive for its color. So before passing twice, make sure to
|
||
actually capture any hopeless opposing stones rather than relying
|
||
on them being "obviously dead."
|
||
|
||
CONTROLS
|
||
↑↓←→ / hjkl move the cursor around the board
|
||
enter/space place a stone on the square under the cursor
|
||
p pass
|
||
q quit to menu
|
||
After the game ends:
|
||
n new game (same board size and difficulty)
|
||
q quit to menu
|
||
`
|
||
|
||
func goRules() string {
|
||
if CurrentLang() == LangEN {
|
||
return goRulesEN
|
||
}
|
||
return goRulesRU
|
||
}
|
||
|
||
// --- Сапёр (Minesweeper) --------------------------------------------
|
||
|
||
const minesweeperRulesRU = `САПЁР (MINESWEEPER)
|
||
|
||
Классический Сапёр без ботов и соперников. Перед началом партии
|
||
можно выбрать один из трёх классических пресетов размера поля.
|
||
|
||
ЦЕЛЬ
|
||
Открыть все клетки, под которыми нет мины, ни разу не открыв
|
||
клетку с миной.
|
||
|
||
ПРЕСЕТЫ ПОЛЯ
|
||
Новичок — 9x9, 10 мин
|
||
Любитель — 16x16, 40 мин
|
||
Эксперт — 30x16, 99 мин
|
||
|
||
ХОДЫ
|
||
Открытая клетка либо взрывается (если там мина — партия окончена
|
||
поражением), либо показывает число мин среди восьми соседних
|
||
клеток. Если соседних мин ноль — открытие автоматически
|
||
распространяется на все соседние клетки каскадом, и так далее,
|
||
пока не наткнётся на клетки с ненулевым числом.
|
||
|
||
Первый ход в партии ГАРАНТИРОВАННО безопасен: мины расставляются
|
||
только после него, и координаты первой открытой клетки (вместе со
|
||
всеми её соседями) исключаются из расстановки — это чуть щедрее
|
||
классического правила (там исключается только сама клетка), зато
|
||
первый ход почти всегда сразу открывает небольшую область.
|
||
|
||
Клетку можно пометить флагом (подозрение на мину) — это просто
|
||
визуальная пометка для себя, она не влияет на игру и не открывает
|
||
клетку; помеченную клетку сначала нужно снять с пометки, чтобы
|
||
открыть.
|
||
|
||
ХОРДА: если нажать на уже открытую клетку с числом, а рядом с ней
|
||
уже стоит ровно столько флагов, сколько показывает это число, все
|
||
остальные закрытые соседи откроются автоматически — это ускоряет
|
||
игру, знакомая опытным игрокам возможность. Если хотя бы один флаг
|
||
стоит неверно (не на настоящей мине), хорда может привести к
|
||
проигрышу — как и в оригинальной игре.
|
||
|
||
ПОБЕДА И ПОРАЖЕНИЕ
|
||
Победа наступает, когда открыты все клетки, кроме тех, где мины.
|
||
Поражение — как только открыта клетка с миной (при этом
|
||
раскрываются все мины на поле, чтобы было видно, где они были).
|
||
|
||
УПРАВЛЕНИЕ
|
||
↑↓←→ / hjkl передвижение курсора по полю
|
||
enter/space открыть клетку под курсором (или хорда, если она
|
||
уже открыта)
|
||
f поставить/снять флаг на клетке под курсором
|
||
q выход в меню
|
||
После завершения партии:
|
||
n новая партия (тот же размер поля)
|
||
q выход в меню
|
||
`
|
||
|
||
const minesweeperRulesEN = `MINESWEEPER
|
||
|
||
Classic Minesweeper, no bots or opponents. Before the game starts
|
||
you can pick one of three classic field size presets.
|
||
|
||
GOAL
|
||
Reveal every cell that isn't a mine, without ever revealing a
|
||
mined cell.
|
||
|
||
FIELD PRESETS
|
||
Beginner — 9x9, 10 mines
|
||
Intermediate — 16x16, 40 mines
|
||
Expert — 30x16, 99 mines
|
||
|
||
MOVES
|
||
Revealing a cell either blows up (if it's a mine — game over) or
|
||
shows how many of its eight neighbors are mines. If that count is
|
||
zero, the reveal automatically cascades to all neighboring cells,
|
||
and so on, until it reaches cells with a nonzero count.
|
||
|
||
Your very first move is GUARANTEED safe: mines are placed only
|
||
after it, and the coordinates of that first cell (along with all
|
||
its neighbors) are excluded from mine placement — a bit more
|
||
generous than the classic rule (which only excludes the cell
|
||
itself), so the first move almost always opens up a small area
|
||
right away.
|
||
|
||
You can flag a cell (mark it as a suspected mine) — this is purely
|
||
a visual note to yourself, it doesn't affect the game and doesn't
|
||
reveal the cell; a flagged cell must be unflagged first before it
|
||
can be revealed.
|
||
|
||
CHORDING: pressing an already-revealed numbered cell, when exactly
|
||
that many flags are already placed around it, automatically reveals
|
||
all of its remaining unflagged neighbors — a speed-up trick well
|
||
known to experienced players. If even one of those flags is wrong
|
||
(not actually on a mine), chording can cost you the game — just
|
||
like in the original.
|
||
|
||
WINNING AND LOSING
|
||
You win once every non-mine cell has been revealed. You lose the
|
||
instant a mined cell is revealed (all mines are then shown, so you
|
||
can see where they were).
|
||
|
||
CONTROLS
|
||
↑↓←→ / hjkl move the cursor around the field
|
||
enter/space reveal the cell under the cursor (or chord, if it's
|
||
already revealed)
|
||
f toggle a flag on the cell under the cursor
|
||
q quit to menu
|
||
After the game ends:
|
||
n new game (same field size)
|
||
q quit to menu
|
||
`
|
||
|
||
func minesweeperRules() string {
|
||
if CurrentLang() == LangEN {
|
||
return minesweeperRulesEN
|
||
}
|
||
return minesweeperRulesRU
|
||
}
|
||
|
||
// --- Странник (Wayfarer) --------------------------------------------
|
||
|
||
const wayfarerRulesRU = `СТРАННИК (WAYFARER)
|
||
|
||
Текстовая космоторговля, вдохновлённая классической Elite (David
|
||
Braben, Ian Bell), но не являющаяся её копией: собственный алгоритм
|
||
процедурной галактики, свои названия и тексты, свои квесты.
|
||
Настоящего 3D-полёта в реальном времени нет — это сознательное
|
||
решение (честный 3D-рендер в терминале потребовал бы отдельного
|
||
движка сопоставимой с самой игрой сложности); вместо этого перелёты,
|
||
опасные встречи и сюжетные квесты разрешаются текстом с выбором.
|
||
|
||
СОХРАНЕНИЕ
|
||
Как и "Трупные батончики", это открытая карьера без фиксированного
|
||
конца — партия сохраняется на диск автоматически при выходе в
|
||
меню. Гибель корабля БЕЗ спасательной капсулы необратимо удаляет
|
||
сохранение — карьера начинается с чистого листа (как перманентная
|
||
смерть в оригинальной Elite, только чуть смягчённая: капсула даёт
|
||
шанс выжить).
|
||
|
||
ГАЛАКТИКА
|
||
4 галактики по 128 систем в каждой — итого 512 звёздных систем,
|
||
сгенерированных детерминированно (одна и та же система при новой
|
||
карьере всегда одна и та же). У каждой системы своё правительство
|
||
(от анархии до корпоративного государства — влияет на опасность
|
||
перелётов и строгость досмотра груза), уровень технологий,
|
||
промышленность/сельское хозяйство и благосостояние — это определяет
|
||
цены на рынке.
|
||
|
||
ПАСХАЛКА: как и в оригинальной Elite, где галактику можно было
|
||
поменять, отредактировав числа генератора в коде игры, — здесь
|
||
можно получить совершенно другую галактику, не трогая код
|
||
коллекции. Создайте файл .env рядом с исполняемым файлом (или в
|
||
текущей рабочей директории) со строкой:
|
||
WAYFARER_GALAXY_SEED=12345
|
||
Любое целое число — и все 512 систем, их названия, правительства
|
||
и характеристики будут другими. Без файла .env используется
|
||
обычная (стандартная) галактика.
|
||
|
||
ТОРГОВЛЯ
|
||
10 видов товаров, включая два незаконных (контрабанда, оружие) —
|
||
их проверяют патрули в системах со строгим правительством. Цена
|
||
зависит от типа экономики системы: аграрные дешевле продают
|
||
продовольствие, промышленные — технику, и так далее. Цены
|
||
фиксируются в момент стыковки со станцией и не меняются, пока вы
|
||
там находитесь, — пересчитываются заново только при следующей
|
||
стыковке (после перелёта). Пока товар лежит в трюме, рынок
|
||
показывает среднюю цену, по которой он был куплен, — удобно
|
||
сравнить с текущей ценой перед продажей.
|
||
|
||
ПЕРЕЛЁТЫ И ОПАСНЫЕ ВСТРЕЧИ
|
||
Прыжок в пределах галактики тратит топливо пропорционально
|
||
расстоянию. Чем опаснее правительство системы назначения, тем выше
|
||
шанс случайной встречи: пиратская засада (пошаговый бой), досмотр
|
||
патруля (незаконный груз могут конфисковать), сигнал бедствия
|
||
(обычно — честная награда за помощь, изредка — ловушка) или
|
||
обломки корабля (случайная находка). Межгалактический прыжок в
|
||
следующую галактику требует почти полного бака и переносит в
|
||
случайную систему.
|
||
|
||
ПОШАГОВЫЙ БОЙ
|
||
Каждый раунд — один выбор: атаковать, попытаться сбежать или (если
|
||
противник вообще готов договариваться) попытаться откупиться
|
||
переговорами. Щит поглощает урон первым, затем корпус. Без
|
||
спасательной капсулы гибель корабля необратимо заканчивает карьеру.
|
||
|
||
КВЕСТЫ
|
||
8 полноценных сюжетных линий с ветвлениями и разными исходами —
|
||
от эвакуации колонистов перед вспышкой сверхновой до находки
|
||
артефакта предтеч. Задания не выбираются свободно из списка — они
|
||
сами предлагаются со случайной вероятностью при спокойном прибытии
|
||
в систему (если сейчас нет активного задания и остались
|
||
невыполненные). Можно согласиться или отказаться; отказ ничем не
|
||
грозит — то же (или другое) задание может предложиться снова
|
||
позже. Одновременно активно только одно задание; выбор в его ходе
|
||
влияет на награду, здоровье корабля и иногда — на груз.
|
||
|
||
СОБСТВЕННЫЕ КВЕСТЫ: помимо 8 встроенных, можно добавить свои,
|
||
не трогая код игры — положите .yaml файл в директорию "quests"
|
||
рядом с исполняемым файлом (или в директорию, откуда запускаете
|
||
игру), и перезапустите программу. Формат файла и подробные
|
||
комментарии — в example_quests/lost_satellite.yaml. Файлы с
|
||
ошибками (плохой синтаксис, неполный перевод, конфликт ключа с
|
||
уже существующим квестом) просто пропускаются с предупреждением
|
||
в stderr — никогда не ломают игру целиком.
|
||
|
||
СНАРЯЖЕНИЕ И РЕМОНТ
|
||
На верфи можно дозаправиться, починить корпус и один раз
|
||
приобрести каждый апгрейд: топливный скиммер, расширение трюма,
|
||
усиление щита, спасательную капсулу, улучшенный лазер.
|
||
|
||
УПРАВЛЕНИЕ
|
||
На станции (хаб):
|
||
1 рынок 2 верфь 3 перелёт 4 квесты
|
||
q сохранить карьеру и выйти в меню
|
||
N начать новую карьеру (с подтверждением — текущая карьера
|
||
будет безвозвратно потеряна)
|
||
Рынок/верфь/перелёт/квесты:
|
||
↑↓ / kj выбор пункта
|
||
b / s купить/продать 1 единицу (на рынке)
|
||
B / S купить максимум / продать всё (на рынке)
|
||
enter подтвердить выбор
|
||
q/esc назад в хаб
|
||
В бою:
|
||
1 атаковать 2 бежать 3 договориться (если доступно)
|
||
`
|
||
|
||
const wayfarerRulesEN = `WAYFARER
|
||
|
||
A text-based space trading game inspired by the classic Elite (David
|
||
Braben, Ian Bell), but not a copy of it: its own procedural galaxy
|
||
algorithm, its own names and text, its own quests. There's no real-
|
||
time 3D flight — that's a deliberate choice (an honest 3D renderer in
|
||
a terminal would need a separate engine about as complex as the game
|
||
itself); instead, travel, dangerous encounters, and story quests are
|
||
all resolved through text with choices.
|
||
|
||
SAVING
|
||
Like Corpse-Starch Box, this is an open-ended career with no fixed
|
||
end — the game saves to disk automatically when you quit to the
|
||
menu. Losing your ship WITHOUT an escape pod permanently deletes
|
||
the save — your career starts over from scratch (like permadeath in
|
||
the original Elite, just slightly softened: the pod gives you a
|
||
chance to survive).
|
||
|
||
THE GALAXY
|
||
4 galaxies of 128 systems each — 512 star systems in total,
|
||
generated deterministically (the same system is always the same
|
||
system on a new career). Each system has its own government (from
|
||
anarchy to corporate state — affects travel danger and how strict
|
||
cargo inspections are), tech level, industry/agriculture balance,
|
||
and wealth — these determine market prices.
|
||
|
||
EASTER EGG: just like the original Elite, where you could get a
|
||
whole new galaxy by editing the generator's seed numbers in the
|
||
game's source code — here you can get an entirely different galaxy
|
||
without touching the collection's code at all. Create a .env file
|
||
next to the executable (or in the current working directory) with
|
||
the line:
|
||
WAYFARER_GALAXY_SEED=12345
|
||
Any integer works — and all 512 systems, their names, governments,
|
||
and stats will come out different. Without a .env file, the
|
||
standard (default) galaxy is used.
|
||
|
||
TRADING
|
||
10 types of goods, including two illegal ones (contraband, firearms)
|
||
— patrols check for them in systems with strict governments. Prices
|
||
depend on the system's economy: agricultural systems sell food
|
||
cheaply, industrial ones sell machinery cheaply, and so on. Prices
|
||
are fixed the moment you dock at a station and don't change while
|
||
you're there — they're only rerolled the next time you dock (after
|
||
a jump). While a good is sitting in your hold, the market shows the
|
||
average price you paid for it — handy for comparing against the
|
||
current price before selling.
|
||
|
||
TRAVEL AND DANGEROUS ENCOUNTERS
|
||
A jump within the galaxy costs fuel proportional to distance. The
|
||
more dangerous the destination system's government, the higher the
|
||
chance of a random encounter: a pirate ambush (turn-based combat), a
|
||
patrol inspection (illegal cargo may be confiscated), a distress
|
||
signal (usually a fair reward for helping, occasionally a trap), or
|
||
a derelict ship (a random find). An intergalactic jump to the next
|
||
galaxy needs a nearly full tank and drops you into a random system.
|
||
|
||
TURN-BASED COMBAT
|
||
Each round is one choice: attack, try to flee, or (if the opponent
|
||
is willing to talk at all) try to negotiate your way out. Shields
|
||
absorb damage first, then the hull. Without an escape pod, losing
|
||
your ship permanently ends your career.
|
||
|
||
QUESTS
|
||
8 full story arcs with branching choices and different outcomes —
|
||
from evacuating colonists ahead of a supernova to uncovering a
|
||
precursor artifact. Quests aren't freely picked from a list — they
|
||
offer themselves at random when you arrive safely at a system (as
|
||
long as you have no active quest and some are still unfinished).
|
||
You can accept or decline; declining has no downside — the same
|
||
(or another) quest may be offered again later. Only one quest can
|
||
be active at a time; your choices along the way affect the reward,
|
||
your ship's health, and sometimes your cargo.
|
||
|
||
CUSTOM QUESTS: besides the 8 built-in ones, you can add your own
|
||
without touching the game's code — drop a .yaml file into a
|
||
"quests" directory next to the executable (or in the directory
|
||
you run the game from), then restart the program. The file format
|
||
and detailed comments are in example_quests/lost_satellite.yaml.
|
||
Files with errors (bad syntax, incomplete translation, a key that
|
||
collides with an existing quest) are simply skipped with a
|
||
warning in stderr — they never break the game as a whole.
|
||
|
||
EQUIPMENT AND REPAIRS
|
||
At the shipyard you can refuel, repair the hull, and buy each
|
||
upgrade once: a fuel scoop, a cargo bay expansion, a shield
|
||
booster, an escape pod, and an improved laser.
|
||
|
||
CONTROLS
|
||
At the station (hub):
|
||
1 market 2 shipyard 3 travel 4 quests
|
||
q save career and quit to menu
|
||
N start a new career (with confirmation — your current career
|
||
will be permanently lost)
|
||
Market/shipyard/travel/quests:
|
||
↑↓ / kj select an item
|
||
b / s buy/sell 1 unit (market)
|
||
B / S buy max / sell all (market)
|
||
enter confirm selection
|
||
q/esc back to hub
|
||
In combat:
|
||
1 attack 2 flee 3 negotiate (if available)
|
||
`
|
||
|
||
func wayfarerRules() string {
|
||
if CurrentLang() == LangEN {
|
||
return wayfarerRulesEN
|
||
}
|
||
return wayfarerRulesRU
|
||
} |