Простые вещи (Нотация SP)
Постановка задачи
Вывести систему правил, в рамках которых возможно полностью описать Шахматы и подобные игры типа “фигуры ходят по клеткам”. Из частей этих правил предполагается создавать новые фигуры и игры путём комбинирования. Нотация используется для облегчения конструирования и объяснения правил, представляя собой логико-подобные конструкции.
За основу взята нотация Парлетта. Часть нововведений перенесена обратно. Нотации не полностью синхронизированы, но зная SP, можно понять запись Парлетта. Парлетт подходит для описания небольших шахматных модов. Нотация SP более подробная, используется больше символов, поэтому подходит для сложных продуктов.
Запись ходов в похожем формате:
- Условия доступности
- Тип действия
- Распространение
- Расстояние
- Условия цели
Возможности
Обобщённо, фигуры могут что-то делать с другими, включая себя саму: передвигать, снимать с доски, накладывать или снимать свойства. У действий есть условия применения и цели.
Фигура меняет положение на доске некоторым способом. По-умолчанию может устанавливаться на пустое место либо на клетку, занятую соперником (произойдёт Снятие). Остальное уже описывается через условия и свойства. Движение может затрагивать другие фигуры через типы хода Обмен и Притягивание.
В играх описываемого типа обычно превосходство над соперником достигается путём снятия его фигур с доски. Снятие может происходить:
- Замещением: установкой своей фигуры вместо чужой.
- Перешагиванием “как в шашках”.
- Зажатием: установкой своих фигур с двух и более сторон “как в Хнефтафл”.
- Без перехода на атакуемую клетку “типа выстрел”.
Снятие через установку можно рассматривать как частный случай движения с разрешением занятой соперником клетки в качестве цели.
Тип действия
Действие определяет значение дальнейших символов за ним.
- Только движение -
m
- Движение только перепрыгиванием -
mh
- Обмен местами с целью -
ms
- Притягивание цели к себе -
ma
. Для корректной работы притягивание применяется по прямой. Обозначается двумя расстояниями:magt;n/m
- цепляет с расстояния до n клеток и тащит на m. - Отталкивает от себя -
mp
. Запись аналогично притягиванию. - Превращение
a
- превращает фигуру в другую, обычно идёт с условиями и списком фигур. - Снятие замещением -
c
- Снятие выстрелом -
cr
- Снятие в области -
ca
. Предполагается взятие всех фигур на атакуемых клетках, подходящих под условие. - Снятие перепрыгиванием -
ch
- Снятие зажатием -
cg
. Если с противоположной стороны уже стоит фигура с возможностью действияcg
.
Можно притягивать не цель, а саму фигуру к цели. Это выражается через движение с окончанием в зоне влияния фигуры с тегом th
: m+namp;th0
.
Пример превращения в Ферзя по достижению восьмой линии: L8aQ
. Для обозначения последней, сколько бы ни было линии, можно взять Ln
, тогда “превращение на действительно последней линии” в старшие фигуры будет Lna(RNBQ)
.
У одного хода может быть несколько типов действия для сокращения записи. Пишутся в любом порядке. Путаницы ma
с am
не возникнет, т.к. один тип хода не может содержать движение и превращение. Движение с превращением в конце будет записано как mgt;1amp;L8aQ
. Большинство ходов фигур из классических шахмат имеют типы действий mc
- движение со взятием замещением.
Тип хода по-умолчанию можно внести в глобальные свойства игры и не приписывать к каждому ходу. Если в игре все ходы доступны одновременно для движения и взятия замещением, то можно это прописать, а записи вида mgt;1,сgt;1
(или mcgt;1
) сразу сокращать до gt;1
. И прописывать только исключения из глобальных свойств. Например, если это игра наподобие Хнефтафл, то ход типа cg
доступен всегда для всех фигур.
Распространение
Все действия имеют какие-то цели или направления применения. Могут быть описаны в виде:
- Вектор - Клетки вдоль пути по прямым (rook-like), клетки вдоль пути по диагоналям (bishop-like).
- Координаты -
~n/m
. Клетка по смещению координат n/m. Частный случай: Г-образное смещение (knight-like). - Радиус -
rn
. Клетки в радиусе n.
У вектора есть несколько обозначений, в зависимости от направления:
- По всем восьми направлениям -
*
- По прямой вперёд -
gt;
- По прямой назад -
lt;
- По прямой в бока -
=
- По прямым -
+
- По всем диагоналям -
x
- По диагоналям вперёд -
xgt;
- По диагоналям назад -
xlt;
Для избежания путаницы, если у хода комбинированный тип распространения, значки выставляются в таком порядке. Тогда xgt;
(по диагоналям вперёд) не смешается с gt;x
(вперёд и по диагоналям).
Движения “только направо” и “только налево” не заданы, можно использовать gt;gt;
и lt;lt;
при необходимости.
Расстояние
- На указанное число клеток -
1
(2
,3
…) - На любое количество клеток в заданном направлении -
n
- Диапазон расстояний -
m-n
, доступно для радиусов тоже.
Группировка движений
- Повторяющиеся движения в одном направлении, прерывается при взятии -
1-9
. Группировка ходов для повтора -()
- Несколько ходов один за другим, прерывается при взятии -
.
- Несколько ходов один за другим, не прерывается при взятии -
;
- Несколько ходов один за другим с обязательством совершить всю цепочку -
amp;
. Весь ход недействителен, если нельзя выполнить его часть. - Несколько возможных ходов, можно выбрать один -
,
Предполагается, что при повторе ходов используется выбранное направление: если использован повторяющийся ход конём 3(~2.1)
, и начат ход вверх-влево, то второй и третий ходы тоже должны быть сделаны вверх-влево. Аналогично, ход n(2-2)
обозначает движение пунктиром через одну клетку в одном направлении.
Для ходов с возможностью изменения направлений применяется .
, тогда ~2/1.~2/1.~2/1
как раз даст коня, который может менять направление каждый ход. Совместим: 2(~2/1).~2/1
- ход конём два раза в одном направлении, и на третий можно направление изменить.
Сложный ход без смены направления обозначается удвоением символа склейки. Под сменой направления подразумевается отклонение на 90 градусов и более. Ход +1..xn
означает перемещение по прямой на одну клетку, потом по диагонали, но если сделан ход вперёд, то нельзя ходить по задним диагоналям. x1..+n
- перемещение по диагонали на одну клетку, потом по прямой, но если был ход по диагонали вверх-вправо, то по прямой можно ходить только вверх или вправо. Для ходов со смещением сверяется вектор движения: ~2/1..xn
- если сделан ход на две клетки вперёд и одну влево, то вектор движения вверх-влево и для перемещения недоступны диагонали вниз и вправо, т.е. остаётся только продолжить ход по верхней левой диагонали.
Для распространения типа “координаты” за начало отсчёта берётся сама фигура. Если один ход состоит из нескольких частей, то за отсчёт берётся конец прошлой части. Ход “на самого себя” обозначается 0
. Ход c0
означает самоуничтожение, используется для одноразовых фигур.
Например, ракета: движется по прямым на любое расстояние со взятием, потом взятие всех фигур в радиусе 1: cgt;namp;car1
. Это означает, что делается движение со взятием по прямой вперёд, замещая фигуру в конце; от этой точки отсчитывается радиус 1 и убираются все фигуры на этих клетках. amp;
означает обязательность второй части хода - нельзя ограничиться первым взятием и “не взрываться”. Логично, что ракета при этом сама уничтожается, поэтому полный ход будет выглядеть cgt;namp;car1amp;c0
.
У похожих фигур могут быть очень разные способы записи. Например, обычный конь описывается как ~2/1
, а скользящий таким же уголком уже как +2amp;+1
. Способ движения у первого - координаты, у второго - составной ход из двух векторов. Полный непрыгающий конь будет записан как (+2amp;+1,+1amp;+2)
, иначе возможны ходы только сначала на 2, потом на 1, но не наоборот.
Условия
Обычно движение фигуры безусловно, т.е. одинаково при любых относительных сочетаниях, но даже ход классической Пешки вида cxgt;,imgt;2,mgt;1
использует условия “без взятия”, “только со взятием”, “только первым ходом”. Все условия могут идти с отрицанием !
. Условия, которые могут быть перепутаны при совместной записи, группируются скобками.
Доступность хода
- Только первым ходом фигуры -
i
- Если было взятие первой частью хода -
lc
- Взятие на проходе выполняющего первый ход через атакуемую клетку -
ci
- Находится на линии -
Ln
- В союзном (своём) секторе -
rA
- В секторе соперника -
rE
- На белой клетке -
rW
- На чёрной клетке -
rB
Здесь r
означает тип условия “Регион”.
Тонкий момент обозначения хода, который не начинается в секторе соперника, а должен закончиться в секторе соперника. Можно выразить его так: mgt;2amp;rE0
- ходит со взятием на две клетки вперёд, потом обязан пропустить ход находясь в секторе соперника. Если ход не оканчивается на требуемой территории, то вторую часть хода выполнить невозможно и ход недействительный.
Условие первого хода сложно для отслеживания. Обычно используется для фигур, которые уже не могут вернуться на стартовую линию и на самом деле означает “ход со стартовой линии”. Если у фигуры есть возможность возврата на стартовую линию, то его можно повторить. Для достаточно уникальных фигур можно считать за i
нахождение на стартовой клетке, даже если есть возможность для возврата на неё. Обычно в этом нет проблемы и зацикливание “начальных” ходов сложно и бессмысленно, что исключает их само по себе. Эту особенность стоит заложить в дизайн и баланс правил конструируемой игры.
Тип фигуры
Фигуры имеют встроенные относительные теги:
- Сам -
ts
- Союзник -
ta
- Соперник -
te
- Белая -
tw
- Чёрная -
tb
- Фигура определённого типа -
P
,B
и т.д.
Наличие тега может быть условием доступности хода и требованием типа цели. Например, взятие по прямым на две клетки, применимое только к белым можно обозначить как c+2tw
. Взятие по прямым на две клетки для белой фигуры: twc+2
.
Влияние
В нотации Парлетта рассматривалось влияние фигуры определённого типа на другую. В SP эта часть переработана. В свойствах фигуры прописывается оказываемое ей влияние с указанием условий. Как и действие, описывается направлением и расстоянием, может иметь условия доступности и целей. Для лучшего прочтения, можно группировать скобками.
Сначала пишутся условия, потом p
, дальше список раздаваемых свойств, направление, расстояние.
Тогда чтоб воспроизвести старую механику “пешка может получить возможность взятия вперёд на одну клетку, если рядом стоит Сержант”, нужно:
- Прописать Сержанту влияние на союзную Пешку:
ptf=1taP
- добавляет тегtf
влево-вправо на одну клетку своим Пешкам. - Пешке прописать ход
tfcgt;1
- если есть тегtf
, то доступно взятие вперёд на одну клетку.
Сержант подходит сбоку к Пешке, раздаёт ей тег tf
, а Пешка, имея тег tf
получает новый ход.
По-умолчанию все фигуры распространяют встроенное влияние своего типа на все соседние клетки. Например, у Ферзя будет встроенное влияние pQ
. Чтоб сделать фигуру ходящую по прямым только когда у неё нет соседей, нужно выписать исключение влияний всех возможных фигур: !p(PNBRQK)+n
.
Свойства
Модификаторы, которые могут применяться к самой фигуре или раздаваться через влияние, в т.ч. во время хода соперника. По-умолчанию свойства без влияний применяются к себе. Записываются отдельно от ходов через пробел.
- Не может взят выстрелом -
dr
- Не может взят замещением -
dc
- Не может взят зажатием -
dg
- Обездвиживает -
nm
. Так же отнимает типы взятия, связанные с перемещением. - Отнимает атаку -
nс
- Отнимает выстрел -
nr
- Отнимает принимаемое влияние -
nP
- Отнимает исходящее влияние -
np
- Уничтожает взявшую фигуру -
ec
- Уничтожает фигуру ответным выстрелом -
er
- Не может перемещаться по атакуемым полям (как Король под шах) -
nmc
- Не может перемещаться по простреливаемым полям -
nmr
- Может перемещаться только по атакуемым полям -
mc
- Не может действовать, если под атакой -
nac
- Может действовать только под атакой -
ac
- Копирует способ движения прошлого хода соперника -
jm
- Копирует способ взятия прошлого хода соперника -
jc
- Любой другой тег -
tX
Для описания исключения свойства используется знак !
, т.е. pnmgt;1
обездвиживает фигуру перед собой, а p!nmgt;1
исключения обездвиживание.
Можно вводить любые свойства фигуры для применения их в качестве условий, например задать фигурам теги t1
, t2
, t3
, прописав в условия взятия свойства t3 gt; t2 gt; t1 gt; t3
, получится Камень-Ножницы-Бумага.
Используя эту нотацию, можно выразить рокировку через tri|=ntr
для Короля, задав Королю и Ладье тег tr
. Тогда первым ходом эти фигуры могут обменяться местами, т.к. в условии и хода и цели обмена стоит наличие тега tr
, которое есть у обоих. Достаточно наличие хода обмена только у одной фигуры.
Некоторые логичные свойства не выписаны т.к. могут быть получены комбинациями имеющихся свойств и влияний. Сложные правила всё равно придётся задавать словесным алгоритмом - на всё значков не хватит.
Попробуем описать фигуру Щита: нельзя взять выстрелом, защищает от выстрела союзников в двух клетках за собой, ходит только вперёд - mgt;1 dr(pdrlt;2ta)
. Защита от выстрела обеспечивается раздачей свойства dr
на две клетки назад.
Чтобы сделать фигуру, снимающую защищённые от снятия, можно добавить влияние, отнимающее защитное свойство: mc*8 p!dr*8te
- отнимает свойство dr
у противников во все стороны и атакует эти же цели. Но такая метка делает фигуру разрешённой для снятия всеми, а не только наложившим метку. Понятие “наложенной уязвимостью может воспользоваться только эта же фигура” нарушает логику тегов и слишком частный случай для расширения нотации. Лучше описать словесно в правилах.
Заключение
В рамках этих правил возможно описать такие игры как Шахматы, Сёги и другие виды шахмат, Шашки, Хнефтафл, Thud! и многое другое. Тонкие правила разновидностей придётся дописывать словами, но на 95-100% правила любого шахматоида могут быть составлены из этих вариантов. Применяя сложные условия, редкие свойства и кастомные теги можно конструировать игры только отдалённо похожие на шахматы.
Важные нововедения нотации SP:
- Теги - дополнительный слой классификации фигур кроме их “буквенной” формы. Можно группировать фигуры, наделяя их общими правилами, изменять положение через комбинацию тега+влияния, делая фигуры более мобильными, уязвимыми, какими требуется для механики.
- Механика влияний сделана намного более универсальной, теперь можно описывать сложные взаимодействия фигур.
- Составной ход с обязательным выполнением всех частей - даёт возможности устанавливать условия завершения хода, действия по завершению хода.
В своих продуктах используется ещё старый Парлетт, задача полностью актуализировать нотацию во всех статьях не стояла. Документ не стабильный и будет ещё множество правок. Будет использован в новых разработках после условной версии 1.0.