Dagaz: Ошибки

imageДело помощи утопающим —  
дело рук самих утопающих.

И.Ильф и Е.Петров.


 
 
Ошибки ошибкам рознь. Работая над проектом, я веду свой личный рейтинг ошибок. Что-то исправляется совсем легко, при первом запуске, что-то намертво прибито гвоздями к архитектуре и потому отравляет жизнь годами. Некоторые ошибки просто вымораживают. Когда их исправляешь — чувствуешь, что живешь. Я люблю такие ошибки.
Всё время писать одинаковые игры было бы не интересно. К счастью, игры разные. Некоторые игры более разные чем другие. Честно говоря, я и берусь то за них, в основном, из за уникальности их игровых механик. Для меня такие игры — своего рода вызов.

eqd5ywsfv9aewsdcsfkr8g3nip0.png

Hanga Roa
Эта игра ломает стереотипы и рвёт шаблоны. Не обманывайтесь поверхностным сходством с Шахматами. На Шахматы она совершенно не похожа. Цель игры — провести своего «Короля» (Moai) к противоположному краю доски. Вот только, сам по себе, Moai ходить по доске не умеет. Эта фигура ходит только «по камушкам» (строго своего цвета), перемещаясь на одну соседнюю клетку в любом из восьми направлений (использованный камень с доски убирается). Шаги можно повторять, пока есть такая возможность.

MataToa (на доске она похожа на пешку) также перемещается на один шаг, в любом из восьми направлений и может разрушать вражеские «дороги», забирая камни чужого цвета (по пустым полям она, разумеется, также перемещаться может). В остальном, «шахматное взятие» в игре не используется, фигуры с доски убираются совсем по другому. Для снятия с доски фигуры, её необходимо окружить своими камнями таким образом, чтобы она не могла двигаться (очевидно, что поймать MataToa, таким образом, невозможно). Если удалось окружить Moai — игра на этом и заканчивается. С Ariki, последней оставшейся фигурой, дело обстоит по другому.

Ariki — фигура строитель (на доске изображена как ладья), которая бросает те самые «камушки» на доску. Ход выполняется следующим образом: фигура перемещается на любое расстояние по любому из восьми направлений (как шахматный ферзь, только без боя), после чего, производит два «выстрела». Камни также летят на любое расстояние, в любом из восьми направлений. Если удаётся завалить камнями вражескую Ariki, она снимается с доски, но не навсегда. Игрок, которому она принадлежит, может поставить её на доску снова, в один из последующих ходов, но только на первую горизонталь. Пожалуй, это самая удивительная шахматная механика, из тех что я видел.


Всё дело в этих самых «стреляющих» фигурах. Сам по себе «выстрел» кодируется довольно просто, но для того, чтобы появилась возможность «стрелять» два раза подряд, пришлось залезть в ядро. Дело в том, что ещё со времён с Zillions, такая последовательность действий трактуется как составной ход, то есть последовательность частичных ходов, выполняемых одной фигурой, а «выстрел» — это, по сути, перемещение той же фигуры на другую позицию. Не на ту, с которой должен выполняться следующий частичный ход (второй «выстрел»). С этим пришлось повозиться.

Поскольку я пока не придумал, как реализовать бота для этой игры, то сделал её в режиме «интеллектуальной доски», контролирующей соблюдение правил, но без игрового AI. Это сыграло со мной злую шутку. Ошибка совершенно никак не проявлялась при ручном управлении фигурами, но стала очевидна, как только я начал делать бота для «Амазонок».

Строго говоря есть ещё одна игра с похожей механикой
-fgzcw_nk0bw0iwstzpzaryq2kg.png

Но для неё я бота тоже не делал. Думаю, вы понимаете почему.


В случае с «Амазонками» я нашёл обходной путь и не стал лазать в ядро, но для Hanga Roa такое решение не подходило. Поскольку бота для игры всё равно не было, я забросил это дело в долгий ящик (и оно продолжало грызть меня изнутри). Так бы и продолжалось, если бы, работая над «Квантовым Моррисом», я не наткнулся на такое вот паскудство:

wylqj-7e3uc4ucfjpagbqrc5-ac.png

Проблема усугублялась тем, что ошибка, по всей видимости, проявлялась в зависимости от фаз Луны. Это (а также ряд других случаев) наглядно показало, что пришло время для переписывания кода анимации перемещения фигур, с которого проект практически начинался. Поймите меня правильно, я не ринулся переписывать view сразу. Я убеждал себя в том, что это необходимо, ещё около месяца. И в конце концов, убедил. Код стал проще и понятнее. Попутно, стали более очевидны и другие ошибки, мучившие меня долгое время.

lvavfkeuk7bqtlmfleyjz6ge6yg.png

Картинка кликабельна. Полюбуйтесь, как чёрный шарик, завершив ход, превращается в белый (хотя и совсем не должен этого делать). Со старым view он оставался чёрным и ошибка была не так очевидна. На view фигура оставалась чёрной, но управлять ей игрок более не мог (поскольку, в model то она была белой) и это бесило. Строго говоря, это ошибка модели, но к ней (как и к утилите конвертации ZRF-кода в JavaScript) уже и так накопилось много вопросов.

По хорошему, там всё надо переписывать, но я к этому пока морально не готов. Поэтому, я сделал очередной «быстрый фикс» и в Фанорону, теперь, можно играть нормально, без сопутствующих чудес. В «Русские шашки», кстати, тоже. Там был баг, связанный с реализацией правила «турецкого удара», неожиданно легко исправленная этим простым фиксом. Так я работаю над ошибками. Так я делаю проект лучше.

© Habrahabr.ru