Мой последний релиз. Напоминаю, что исходный код находится здесь:
https://github.com/infval/battlecity-md.
Исправления:
* Была проблема с модом ass killer, когда вторая пуля выпущена в другом направлении, пока первая в полёте.
* Танк застревал в воде, если у него сбивали способность плавать. Теперь танк уничтожается сразу.
* За убийство себя или другого игрока с модом "игрок убивает игрока" (pvp_kills) давали очки и отображался неправильный спрайт очков после убийства. Теперь очков не дают и спрайта нет.
* Теперь последний результат второго игрока показывается на главном экране, но в отличие от оригинала он не скрывается, если в последний раз игрок был один.
* Редактор уровней: была анимация танка (из-за неинициализированного объекта структуры _tank), мерцание танка не работало, обновление спрайта танка задерживалось.
Замечания по коду и проекту:
- Остались ещё баги и сам код написан плохо. Добавление модов запутало код ещё больше.
- При реорганизации кода были изменены положения графики (gfx.s), что видно на скриншотах (видеопамять до и после). Во втором ряду не используются тайлы: '!' (на NES рядом с BONUS при игре вдвоём), где стоят '?', какой-то мусор в виде клизмы после 'STAGE'.
Убраны gfx/bonus.bin, tiles.s так как дублировали бонусные тайлы, кроме "корабля" и рамки для танка, отображающей взятие бонуса "корабль". Эта рамка находится в конце gfx.s, но её можно переместить вместо "клизмы".
- Символы 0-9, A-Z, -, ., "пробел", [, _, ] расположены в видеопамяти по ASCII таблице, поэтому их не стоит трогать.
- kzzlogo.s не используется. В папке .vscode настройки для работы в Visual Studio Code. _make_clean_project.bat - очистить проект, нужно если изменения были сделаны в .h-файлах и в некоторых других случаях, _make_project.bat - компиляция проекта без очистки (это быстрее).
Что можно улучшить или добавить:
- При проверки столкновений использовать паттерн проектирования "Двойная буферизация" (
http://gameprogrammingpatterns.com/double-buffer.html). Сейчас проверка происходит в текущем кадре на основе текущего положения, которое зависит от порядка проверки.
Пример: танк игрока 1 едет, а за ним игрок 2 впритык. Так как сначала проверка у первого игрока, они едут без зазора, но если поменять танки местами, то игрок 1 будет отставать на одно смещение, потому что игрок 2 ещё не сдвинулся в этом кадре.
- Сжимать уровни. Сейчас каждый маленький блок (8x8 пикселей) кодируется одним байтом: 70 уровней * 26 ширина * 26 высота = 47320 байт (~46КБ). Если уровни строятся как в режиме конструктор (нужно проверить), то каждый блок (16x16) кодируется 4 битами: 70 уровней * 13 ширина * 13 высота / 2 = 5915 байт (~6КБ).
- Порядок появления и состав врагов в оригинале всегда одинаковый, в сети есть информация о составе. Здесь используются случайные танки.
- Бонусы (Power-Ups) дают только 3 раза на уровне. Здесь 5 раз. Видел упоминание, что бонусы располагают в 16 местах. Здесь по всей карте и могут попасть в воду или в сталь.
- В оригинале даётся 1000 бонуса игроку, который набрал больше очков при игре вдвоём.
- Более точное начальное расположение пули. Сейчас разница в один пиксель в зависимости от направления. Плюс там странный код, который смещает иногда ещё на один пиксель (функция GLog_shot). Наверно стоило убрать.
- Только 2 типа скоростей пуль, в оригинале 3.
- На NES вода не двигается во время паузы.
- На NES звук гусениц прерывается после убийства всех врагов.
Баги:
- Звук взрыва базы во время стартовой музыки отсутствует.
- Музыка пропадает на следующем уровне, если взять в конце уровня бонус. Также остаётся след от взятия бонуса.
- После первого выстрела, второй быстрее выпускается, чем последующие с зажатой кнопкой.
--------
Увеличил скриншоты. Добавил загадочную "клизму" (или капля).