Дело помощи утопающим —
дело рук самих утопающих.
И.Ильф и Е.Петров.
Ошибки ошибкам рознь. Работая над проектом, я веду свой личный рейтинг ошибок. Что-то исправляется совсем легко, при первом запуске, что-то намертво прибито гвоздями к архитектуре и потому отравляет жизнь годами. Некоторые ошибки просто вымораживают. Когда их исправляешь — чувствуешь, что живешь. Я люблю такие ошибки.
Всё время писать одинаковые игры было бы не интересно. К счастью, игры разные. Некоторые игры более разные чем другие. Честно говоря, я и берусь то за них, в основном, из за уникальности их игровых механик. Для меня такие игры — своего рода вызов.
MataToa (на доске она похожа на пешку) также перемещается на один шаг, в любом из восьми направлений и может разрушать вражеские «дороги», забирая камни чужого цвета (по пустым полям она, разумеется, также перемещаться может). В остальном, «шахматное взятие» в игре не используется, фигуры с доски убираются совсем по другому. Для снятия с доски фигуры, её необходимо окружить своими камнями таким образом, чтобы она не могла двигаться (очевидно, что поймать MataToa, таким образом, невозможно). Если удалось окружить Moai — игра на этом и заканчивается. С Ariki, последней оставшейся фигурой, дело обстоит по другому.
Ariki — фигура строитель (на доске изображена как ладья), которая бросает те самые «камушки» на доску. Ход выполняется следующим образом: фигура перемещается на любое расстояние по любому из восьми направлений (как шахматный ферзь, только без боя), после чего, производит два «выстрела». Камни также летят на любое расстояние, в любом из восьми направлений. Если удаётся завалить камнями вражескую Ariki, она снимается с доски, но не навсегда. Игрок, которому она принадлежит, может поставить её на доску снова, в один из последующих ходов, но только на первую горизонталь. Пожалуй, это самая удивительная шахматная механика, из тех что я видел.
Всё дело в этих самых «стреляющих» фигурах. Сам по себе «выстрел» кодируется довольно просто, но для того, чтобы появилась возможность «стрелять» два раза подряд, пришлось залезть в ядро. Дело в том, что ещё со времён с Zillions, такая последовательность действий трактуется как составной ход, то есть последовательность частичных ходов, выполняемых одной фигурой, а «выстрел» — это, по сути, перемещение той же фигуры на другую позицию. Не на ту, с которой должен выполняться следующий частичный ход (второй «выстрел»). С этим пришлось повозиться.
Поскольку я пока не придумал, как реализовать бота для этой игры, то сделал её в режиме «интеллектуальной доски», контролирующей соблюдение правил, но без игрового AI. Это сыграло со мной злую шутку. Ошибка совершенно никак не проявлялась при ручном управлении фигурами, но стала очевидна, как только я начал делать бота для "Амазонок".
В случае с «Амазонками» я нашёл обходной путь и не стал лазать в ядро, но для Hanga Roa такое решение не подходило. Поскольку бота для игры всё равно не было, я забросил это дело в долгий ящик (и оно продолжало грызть меня изнутри). Так бы и продолжалось, если бы, работая над "Квантовым Моррисом", я не наткнулся на такое вот паскудство:
Проблема усугублялась тем, что ошибка, по всей видимости, проявлялась в зависимости от фаз Луны. Это (а также ряд других случаев) наглядно показало, что пришло время для переписывания кода анимации перемещения фигур, с которого проект практически начинался. Поймите меня правильно, я не ринулся переписывать view сразу. Я убеждал себя в том, что это необходимо, ещё около месяца. И в конце концов, убедил. Код стал проще и понятнее. Попутно, стали более очевидны и другие ошибки, мучившие меня долгое время.
Картинка кликабельна. Полюбуйтесь, как чёрный шарик, завершив ход, превращается в белый (хотя и совсем не должен этого делать). Со старым view он оставался чёрным и ошибка была не так очевидна. На view фигура оставалась чёрной, но управлять ей игрок более не мог (поскольку, в model то она была белой) и это бесило. Строго говоря, это ошибка модели, но к ней (как и к утилите конвертации ZRF-кода в JavaScript) уже и так накопилось много вопросов.
По хорошему, там всё надо переписывать, но я к этому пока морально не готов. Поэтому, я сделал очередной "быстрый фикс" и в Фанорону, теперь, можно играть нормально, без сопутствующих чудес. В "Русские шашки", кстати, тоже. Там был баг, связанный с реализацией правила "турецкого удара", неожиданно легко исправленная этим простым фиксом. Так я работаю над ошибками. Так я делаю проект лучше.
Автор: GlukKazan