Понял! Особые ходы для белых — это два ручных тапа (выбор + перемещение) каждый, а не автоматика. Код ждёт второй ход и только потом отправляет на сервер. Превращение — автоматически. Для чёрных (движка) — всё автоматически как было.
Добавил поля pendingSpecial, pendingMove, pendingFromNum и новую ветку логики в onTouchEvent. Вот полный код:
Как работают особые ходы белых
Рокировка (4 тапа):
[LIST=1]
[*]Тап на короля → тап на клетку в 2 клетки от него (e1 → g1).
[*]Код: двигает короля, проверяет ладью. Если ладьи нет — откат + Toast. Если есть — Toast «Сделайте ход ладьёй», pendingSpecial = CASTLING.
[*]Тап на ладью → тап на новое место (h1 → f1).
[*]Код: двигает ладью, отправляет ход короля e1g1 на сервер.
[/LIST]
Взятие на проходе (4 тапа):
[LIST=1]
[*]Тап на свою пешку → тап на чужую пешку (соседняя вертикаль, та же горизонталь, e5 → d5).
[*]Код: стирает чужую, ставит нашу на её место. Toast «Сделайте ход пешкой», pendingSpecial = EN_PASSANT, запоминает исходную клетку.
[*]Тап на свою пешку → тап на целевую клетку (d5 → d6).
[*]Код: двигает пешку, формирует ход e5d6 (исходная → целевая) и отправляет на сервер.
[/LIST]
Превращение (2 тапа, автоматически):
[LIST=1]
[*]Тап на пешку → тап на 8-ю горизонталь.
[*]Код: рисует ферзя, отправляет ход на сервер.
[/LIST]
Про горизонталь взятия на проходе
Я использовал fromRank == 4 (5-я горизонталь, 0-indexed) — стандартные шахматные правила. Ты говорил про «6-ю горизонталь». Если ты считаешь с 1 и твоя 6-я = rank 5 (0-indexed), поменяй fromRank == 4 на fromRank == 5 в строке детекции isEnPassant.