Автор Тема: Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)  (Прочитано 23992 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #30 : 10 Апрель 2018, 21:55:35 »
bugmenot, они же изометрические (перепутал) под углом, а не сверху.
« Последнее редактирование: 11 Апрель 2018, 01:25:15 от Sharpnull »

Оффлайн Werton

  • Пользователь
  • Сообщений: 878
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #31 : 28 Апрель 2018, 17:34:01 »
Приветствую товарищи :drinks: позвольте продемонстрировать вам очередные результаты лоботомии нашего с вами пациента :lol:  Первый пост не редактируется, потому оставляю пока здесь.

Самое главное что было сделано, это добавлен режим Mad Mode (что собственно и было самоцелью данной поделки). В нем, при старте каждого уровня, активируются случайным образом различные модификаторы, которые вносят небольшие изменение в правила игры, усложняя тем самым жизнь игроку (по задумке, играть должно было стать веселее, но что уж получилось я хз  :lol: ). Количество одновременно действующих модов увеличивается каждые 3 уровня (в Custome Mode настраивается), пока не достигнет 6ти.
Из-за нехватки времени, некоторые, особо вредные из описанных ранее багов так и не были устранены, сделано только то, что описано ниже. Но в целом, считаю, задачу выполненной и на этом хочу закончить издевательство на данной игрой развитие данного мода, но возможно еще будут кое-какие фиксы особо вредных багов или мелкие правки. :surrender:

===== версия 1.08 =====
-добавлены новый режим игры - Mad Mode
-добавлены следующие модификаторы для Mad Mode и Custome Mode:
"enemy's armor increased"              -броня врага увеличивается
"enemy's speed increased"              -скорость врага возрастает
"enemy crushes concrete walls"            -снаряды врага пробивают бетон
"enemy's shells speed increased"          -скорость снаряда врага увеличивается
"player's speed decrease"                 -игрок замедляется
"rubber concrete walls"                   -снаряды рикошетят от бетона и границы поля
"enemy goes through walls"                -враг ездит сквозь стены
"enemy's spawn speed increased"           -враг респаунится быстрее
"number of enemies increased"             -количество врагов х2
"player used enemy skin"                  -игрок ездит на вражеских танках
"enemy used player skin"                  -враги ездят на танках игрока
"player kills player"                     -игроки убивают друг друга
"no bonuses"                              -нет бонусов
"enemies on map increased"                -количество врагов на карте увеличено
"enemies start with shield"               -враг стартует с щитом
"player start without shield"             -игрок стартует без щита
"player is ass killer"                    -врага возможно уничтожить только сзади
"the enemy is invulnerable"               -врага возможно уничтожить только гранатой
-добавлены предустановленные режимы: Battle City, Tank1990 и Custome Mode (большинство настроек перенесены из опций)
-добавлены в Custome Mode настройки: number of mods - количество модификаторов на старте,
inc mods each lvl - число уровней, через которое будет возрастать количество активных модификаторов
-добавлено срезание кустов снарядом при взятии пистолета (в режиме Tank1990)
-исправлено кривой эффект "шторки" при старте уровня
-исправлено мигание экрана при старте уровня
-исправлено надпись пауза рисовалась позади танков
-исправлено звук двигателя играл во время паузы
-исправлено не сбрасывалась заморозка игрока после его уничтожения
-исправлено при взрыве противника гранатой, взявшего каску, следующий появлялся уже с каской
-исправлено снижение скорости быстрых танков после заморозки часами
-удалены лишние настройки в опциях


* battlecity-md_1.08.zip (158.14 КБ - загружено 349 раз.)






Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #32 : 28 Апрель 2018, 20:10:59 »
Werton, если это конец, то что там с исходным кодом?
Напомню, из важных багов, которые остались: пробивка двух кирпичей вместо одного и смещение обработки столкновений справа и снизу. Из-за последнего ещё травка не вся уничтожается.
--------
Mad Mode напомнило Test Your Luck из Mortal Kombat (2011), только там были и бонусы для игрока.
« Последнее редактирование: 28 Апрель 2018, 22:18:57 от Sharpnull »

Оффлайн Werton

  • Пользователь
  • Сообщений: 878
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #33 : 29 Апрель 2018, 02:18:25 »
Sharpnull, про те баги в курсе, просто с наскока не удалось с ними разобраться :neznayu: , доп. бонусы не стал делать, так как показалось и так легко. А про исходник думал раз тема стухла значит никому не интересно, но если есть желание поковырять то вот:

* battlecity-md_1.08-0_src.7z (904.98 КБ - загружено 305 раз.)

в файле history.txt так же описаны известные на тот момент баги.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #34 : 29 Апрель 2018, 12:09:05 »
Werton, я указал баги для других, другие не следят же. Посмотрю исходник, если что-то смогу исправить, то напишу в эту тему или вам.
--------
Кажется добавился баг, после завершения уровня остаются случайные тайлы на экране подсчёта очков.
Обновление: В Kega Fusion их нет, но это убогий эмулятор, у него ещё скорость эмуляция выше, чем должна быть. В старом Gens есть. В Exodus не пробовал.
Второй баг: после завершения уровня (смерти), не получается выбрать другой режим, кроме Mad Mode.

Посмотрел код. Убрал все предупреждения компилятора. В основном это неявные объявления, но вот несколько важных:
Если используете русские буквы в тексте, то всегда сохраняйте в UTF-8. Поэтому gamelogic.c и history.txt сохранил в UTF-8. В других файлах кириллицы не нашёл.

Код здесь https://github.com/infval/battlecity-md, разница кода. Лишних файлов в репозитории нет, кроме моих .vscode, .gitignore и батников.
Что за файлы Hold.dat и loss? Они при компиляции не участвуют. Остальные вроде понятно зачем.
--------
Второй баг решается сбросом режима config.game_mode = 0; в modeMenu() перед циклом. Обновил код на github. Прикрепил обновлённый бинарник.
« Последнее редактирование: 29 Апрель 2018, 17:49:38 от Sharpnull »

Оффлайн Werton

  • Пользователь
  • Сообщений: 878
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #35 : 29 Апрель 2018, 18:08:10 »
Sharpnull, спасибо.
Если используете русские буквы в тексте, то всегда сохраняйте в UTF-8.
кириллица в исходниках не моя, честно :lol: а пересохранять столько файлов было лень, работало ведь :)
Что за файлы Hold.dat и loss? Они при компиляции не участвуют.
там еще language.dat лишний, возможно, какие то настройки от эмуляторов остались, некоторые свои конфиги кидали в папку с ромом (первоначально ром в корне был)


Добавлено позже:
еще регрессию выявил, враг размораживается быстро, мой косяк

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #36 : 29 Апрель 2018, 18:42:53 »
а пересохранять столько файлов было лень
Остальные без кириллицы, а значит уже формально в UTF-8 :) (valid ASCII text is valid UTF-8-encoded Unicode as well)
--------
Исправил заезд танков за правую и нижнюю границы поля. В collision.c:
if (x1 < 0 || x1 >= MAP_W - 1 || y1 < 0 || y1 >= MAP_H - 1) return 0;меняем на
if (x1 < 0 || x2 >= MAP_W || y1 < 0 || y2 >= MAP_H) return 0;--------
Исправил невозможность уничтожить блоки возле границ поля внизу и справа. В collision.c, detectBulletToWallCollision():
if (x0 < 0 || x0 >= MAP_W - 1 || y0 < 0 || y0 >= MAP_H - 1) {меняем на
if (x0 < 0 || x0 >= MAP_W || y0 < 0 || y0 >= MAP_H) {Обновление: правда тогда взрыв смещён.
« Последнее редактирование: 29 Апрель 2018, 19:22:52 от Sharpnull »

Оффлайн Werton

  • Пользователь
  • Сообщений: 878
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #37 : 29 Апрель 2018, 19:30:57 »
я там пулреквест кинул фикс на заморозку

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #38 : 29 Апрель 2018, 19:52:29 »
Werton, принял. Исправил смещение взрыва со всеми стенами. Теперь всё чётко :cool:
--------
Возможно исправил взрыв двух кирпичей вместо одного. В collision.c, detectBulletToWallCollision():
s16 mod = (((x | y) & 7) - 1) >> 2;На основе позиции пули вычисляется mod, который может быть -1, 0, 0, 0, 0, 1, 1, 1. Потом это значение используется в tileAfterHit(tile_idx, rotate, mod), где:
s16 tileAfterHit(u16 tile_idx, u16 bullet_rotate, u16 dip) {
    u16 mask;
    if (tile_idx == RES_TILE_ARMOR) return tile_idx;
    if (tile_idx == (RES_TILE_GRASS | TILE_ATTR(0, 1, 0, 0))) {
            return RES_TILE_GRASS;
    }
    else {
        if (tile_idx > 16 || tile_idx == 0) return -1;
    }
    if (bullet_rotate & 1) {
        mask = 10 >> dip;
    } else {
        mask = 12 >> (dip << 1);
    }
    if ((tile_idx & mask) == tile_idx) return -1;
    return tile_idx & mask;
}
Выражение "число >> -1" выдало бы ошибку при компиляции, но если это переменная, то всегда возвращается 0. Возможно поэтому ниже стоит этот код if ((tile_idx & mask) == tile_idx) return -1;(это для другого)
В общем, если написать s16 mod = ((x | y) & 7) >> 2;, то есть будет только 0 или 1, вроде всё работает правильно, но нужно удостовериться, так как я не до конца понимаю что делает этот код.

Причина точно в позиции танка и соответственно стартовой позиции пули. Чтобы воспроизвести баг, я ставил танк перед стеной и пытался сдвинуть его чуть-чуть, чтобы получить неверные координаты.
--------
Выкладываю бинарник, если кто-то хочет потестить.
--------
Про оставшиеся тайлы на экране подведения очков. Как я говорил когда-то раньше, нужно использовать SYS_disableInts() и SYS_enableInts(), в коде их нигде нет. К сожалению, я не знаю все случаи когда нужно отключать прерывания. В документации написано, что например для доступа к VDP, но это не значит, что нужно все функции VDP_* обрамлять. По примерам из SGDK видно, что если устанавливаются палитра или тайлы.
Если в gameover.c добавить отключение прерываний:
SYS_disableInts();
    VDP_setPalette(0, palette_black);
//    VDP_setPalette(1, palette_black);
    VDP_fillTileMapRect(PLAN_A, 0, 0, 0, planWidth, planHeight);
    VDP_fillTileMapRect(PLAN_B, 0, 0, 0, planWidth, planHeight);
//    VDP_fillTileMapRect(PLAN_B, 0, 0, 0, 32, 28);
SYS_enableInts();
То не будет кусков тайлов, как на скриншоте №1.
Такое же вроде нужно и в showGameoverWord() написать, но без них не замечал. Всё равно там остаются спрайты танков на доли секунды как на скриншоте №2. Если заменить VDP_updateSprites(1,1); на VDP_updateSprites(1, FALSE);, то такого не будет.
На GitHub пока не вносил, нужно будет позже разобраться.
« Последнее редактирование: 30 Апрель 2018, 08:21:42 от Sharpnull »

Оффлайн Werton

  • Пользователь
  • Сообщений: 878
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #39 : 30 Апрель 2018, 14:48:48 »
потестил последний билд на андроидовском md.emu и regen, баг с пробитем 2х стенок не обнаруживается, но баг со спрайтами остался, еще надпись gameover при про проигрыше, если на экране куча танков было, остается висеть до титульного экрана (на не фикшенной версии - также).
196684-0
« Последнее редактирование: 30 Апрель 2018, 15:00:06 от Werton »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #40 : 30 Апрель 2018, 19:10:20 »
Werton, остаток Game Over тоже видел и в Gens, ловил ещё в версии 1.07. Если найду причину, напишу.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #41 : 01 Май 2018, 01:09:10 »
* Исправил остатки спрайтов Game Over и других, дело в этом цикле:
u16 spr_kl2 = sprite_counter;
for (ttt=0; ttt<(spr_kl-sprite_counter)+2; ttt++) {
    VDP_setSpriteFull(sprite_counter, -8, -8, SPRITE_SIZE(1, 1), 0, sprite_counter+1);
    sprite_counter++;
}
sprite_counter изменяется и используется в условии, из-за этого не все спрайты затираются.
* Также убрал обновление спрайтов из коллбэка VBlank и перенёс перед VDP_waitVSync() (т. е. перед VBlank, а не сразу после), это приводило к мерцанию при 9+ танков на поле и остаткам тайлов на экране подсчёта экрана. Хотя 9+ танков быть всё равно не должно, в этом случае начинаются тормоза.
* Написал VDP_updateSprites(1, FALSE); вместо VDP_updateSprites(1,1);, чтобы спрайты танков сразу исчезали после экрана очков.
* Убрал мерцание в начале уровня, не тот слой становился серым. SYS_disableInts() не понадобилось :) В Kega Fusion почему-то последние полосы открытия видны чуть дольше, чем должны. Это было и до моих правок.
--------
Из багов, которые кажется не были озвучены:
- В оригинале если стрелять по центру блока, а слева или справа осталась тонкая стенка, то она не задевается:
0001 или 1000
0001     1000
 /\       /\
 ||       ||
- Петух не задевается, если стрелять со смещением. Нужно в detectBulletToStaffCollision() дописать по аналогии с detectBulletToWallCollision().
- Если зажать кнопку выстрела (не турбо), то при движении или повороте происходят выстрелы.
- При заморозке (оглушении?) игрока, он может один раз выстрелить.
« Последнее редактирование: 01 Май 2018, 02:14:44 от Sharpnull »

Оффлайн Werton

  • Пользователь
  • Сообщений: 878
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #42 : 01 Май 2018, 02:44:58 »
Sharpnull, отличная работа :thumbup:

Добавлено позже:
Хотя 9+ танков быть всё равно не должно, в этом случае начинаются тормоза.
Вот поэтому я не стал особо увеличивать кол-во танков в моде, заметил эту тормозню, видимо надо код оптимизировать, явно консоль на большее способна.
« Последнее редактирование: 01 Май 2018, 05:33:43 от Werton »

Оффлайн Werton

  • Пользователь
  • Сообщений: 878
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #43 : 01 Май 2018, 06:44:04 »
Добавил еще возможность стрельбы при заморозке, собрал описание фиксов для наглядности, за сами фиксы дружно благодарим Sharpnull), отметил его как тестера и багфиксера в стартовых титрах :)

===== версия 1.08-4 =====
-добавлено возможность стрельбы при заморозке игрока (как было в оригинале)
-устранено невозможность уничтожить блоки возле границ поля внизу и справа
-устранено заезд танков за правую и нижнюю границы поля
-устранено остатки спрайтов Game Over
-устранено при смене экрана подсчета очков спрайта танков исчезали с задержкой
-устранено мерцание в начале уровня
-устранено смещение взрыва со всеми стенами
-устранено иногда при выстреле происходило пробитие двух кирпичей вместо одного
-устранено потенциальное мерцание танков
-устранено враг после взятия часов размораживался слишком быстро

* battlecity-md_1.08-4.zip (158.14 КБ - загружено 296 раз.)

« Последнее редактирование: 01 Май 2018, 06:58:28 от Werton »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #44 : 01 Май 2018, 15:01:02 »
Werton, принял pull request, возможно стоило объединить в один коммит (squash), добавил как есть. Добавил вас в Collaborators, если что.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #45 : 01 Май 2018, 19:59:55 »
Важное исправление. Было смещение спрайта пули и её начальной позиции вылета:
Случайно заметил, что пули летящие вниз и вправо дольше в полёте, стал отнимать 8 пикселей при отрисовки и оказалось, что пуля вылетает прямо из позиции танка, которая в левом верхнем углу, поэтому стреляя влево/вверх вылет был прямо из ствола, а в другие стороны пуля пролетала через весь танк. Думаю баг "-Снаряд появляется поверх танка ближе к центру (второй скриншот). ..." можно убрать из багов, я наверно ловил как раз тот момент пролёта через танк (обновление: посмотрел ещё раз оригинал, кажется всё-таки ближе к стволу, а не из центра). Возможно +/- пиксель не точно, пули при рикошете кажутся чуть дальше слева.

Новый баг: смещение спрайта танка врага, раньше не замечал пока не стал им. Приложил скриншоты.
Это оказался не баг, а оригинальное смещение с NES. Правда спрайты танков всё равно имеют немного другое положение, это не так важно.
« Последнее редактирование: 01 Май 2018, 21:01:47 от Sharpnull »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #46 : 02 Май 2018, 14:39:52 »
Новые исправления:
* В прошлом исправлении смещение спрайта стояло от балды. Я посмотрел на спрайты пули и сделал точные смещения, теперь центр пули как на скриншоте.
* Убраны нежелательные выстрелы, если зажать A или C (с вкл. турбо) и двигать танк. Если это была фишка, тогда я её сломал :)
* Возможность разрушить орла, если пуля смещена. Но не как в оригинале, где разрушение уже после 3-го выстрела, а после 4-го. На скриншоте после 3-го выстрела орёл цел. Чтобы как на NES, обработку столкновений с орлом нужно перенести туда же, где и кирпичи, но придётся решать проблемы со звуком: когда я пробовал, звук разрушенного кирпича перебивал.

Werton, убийство себя рикошетом с вкл. PVP модом считается нормальным поведением?

Оффлайн Werton

  • Пользователь
  • Сообщений: 878
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #47 : 02 Май 2018, 15:09:56 »
убийство себя рикошетом с вкл. PVP модом считается нормальным поведением?
Да, так и задумывал, чтобы эффект модов суммировался и жизнь медом не казалась :lol:

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #48 : 03 Май 2018, 14:31:29 »
Важные исправления, так как влияют на столкновения пули и танков:
* Раньше можно было убивать стоя задом к врагу. В версиях до моих фиксов такое было возможно только в двух направления, а после - во всех направлениях, так как снаряд летел из центра, а не из угла.
* В двух направлениях пуля нагоняла на 6 пикселей раньше.
* Раньше пуля была не пикселем, а летящей палкой перпендикулярно направлению полёта. Из-за этого окно попадания поперёк пули было 28 пикселей (30 - 2*1 отступа), а вдоль было 14 (16 - 2*1) пикселей. Теперь 16x16, как размер спрайта, можно выглядывать и тебя не убьют, но проехать через вас не получиться как в оригинале.
Найден новый баг: сохраняются моды после игры в Mad Mode и последующую игру в другой режим.

Werton,
* Если можете, посмотрите конфиг, чтобы сбрасывалось правильно. Если сохранять нужно только Options, то проще config_init() вызывать перед выбором режима, тогда и моя правка в modeMenu() config.game_mode = 0; не нужна будет.
* Я ошибся что анимации взрывов длились меньше, не знаю почему мне так казалось. Сверил по кадрам: в NES маленький взрыв 10 кадров, а здесь 11, что достаточно точно. Кадры считал в FCEUX с замедлением времени, а для SMD через GensKMod. Из history.txt этот пункт не убирал.
* Тормоза при 9+ вражеских танков из-за проверки столкновений, так как проверяются все со всеми в gamelogic.c:
Этот код выполняется для каждого танка, а в moveAvailableInUnits() проверка также для всех танков. Я пробовал хак и перед delta_2 = moveAvailableInUnits(&game_player[ i ]); дописывал if (delta_1 == 32) continue;, это отсекало один вызов moveAvailableInUnits(), если танки были далеки друг от друга, и FPS оставался на уровне 60, но если были близки - тормоза оставались такими же.
В NES, как следует из этой статьи, танки рисовали под себя невидимые стены, это позволяло избежать вычислений и поэтому по стволу игрока могли проехать. Переделывать как в оригинале было бы долго, лучше оставить как есть.
* Подробности исправлений столкновений. Из collision.c, в detectBulletToUnitsCollision() стало:
--------
Ещё одно замечание, так как код запутанный. Если margin_x = margin_y = 1..n, то отступ дальней стороны от пули всё равно будет 0. Для того, чтобы были честные отступы, нужно ещё проверку делать вроде delta_x >= margin_x, delta_y >= margin_y, при этом только одно из них в зависимости от направления пули. Проще было бы заменить код на проверку пикселя внутри прямоугольника, но я следовал духу кода :)
« Последнее редактирование: 03 Май 2018, 16:44:28 от Sharpnull »

Оффлайн Werton

  • Пользователь
  • Сообщений: 878
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #49 : 03 Май 2018, 16:41:24 »
сохраняются моды после игры в Mad Mode и последующую игру в другой режим.
Исправил на гите, а также исправил найденный баг с продолжением движения замороженного в движении игрока.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #50 : 03 Май 2018, 17:00:25 »
баг с продолжением движения замороженного в движении игрока.
Хотел спросить об этом, думал может это специально, как паралич в Road Rash (мотоцикл едет дальше). В сообщении выше в самом низу я добавил ещё замечание о столкновении, на всякий случай.
--------
Как я и боялся, остались некоторые переменные. Из mutator.c:
case 13:
mods.en_on_map_inc = 1;
config.max_enemies_on_map = MAX_ENEMIES + 2;
config.units_on_map = config.max_enemies_on_map + 2;
config.max_explode = config.units_on_map << 1;
config.max_bullets = config.units_on_map << 1;
Количество врагов остаётся после этого, остальное тоже, кроме en_on_map_inc.
Ещё эти (mods_count - точно) из config_init():
config.mods_count = MODS_COUNT;
config.mods_inc_lvl = MODS_INC;
А config.random_mods = RANDOM_MODS; всегда имеет это значение. Но это уже по рефакторингу, там есть ещё лишние переменные вроде config.difficulty и дублировании mods.en_on_map_inc = 0; в reset_modes().
« Последнее редактирование: 03 Май 2018, 17:20:25 от Sharpnull »

Оффлайн Werton

  • Пользователь
  • Сообщений: 878
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #51 : 04 Май 2018, 02:27:07 »
А config.random_mods = RANDOM_MODS; всегда имеет это значение. Но это уже по рефакторингу, там есть ещё лишние переменные вроде config.difficulty и дублировании mods.en_on_map_inc = 0; в reset_modes().
RANDOM_MODS это флаг для дебага так сказать, чтобы отключить случайность и можно было моды потестить
config.difficulty да не используется, это остатки от было начатой реализации настройки сложности, но заброшенной т.к. тупо надоело это все. Остальное справедливо, честно я полностью потерял интерес к этой затеи, поправь все как сам считаешь нужным, если есть такое желание конечно.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #52 : 04 Май 2018, 18:01:20 »
Исправления, в основном визуальные для соответствия оригиналу:
* Сброс настроек после игры с модами.
* Исправлены положения: GAME OVER (во время игры), жизней, PAUSE.
* GAME OVER (во время игры) рисуется поверх танков.
* Мерцание PAUSE быстрее.
* Вместо иконки второго игрока IIP отображалось IP.
* Жизни отображаются на одну меньше как на NES. Не знаю сколько макс. количество жизней в NES, здесь нет ограничений. При 20000 очках в NES прибавляется жизнь, здесь нет.

К слову, о неточностях с оригиналом:
При игре вдвоём, после смерти игрока сбоку прибегает GAME OVER для проигравшего игрока.
При переходе на следующий уровень шторки закрываются для карты уровня, а не для подведения рекордов, как здесь.

GensKMod мусор конечно, кадры он неправильно сохранял. Запись экрана в 60FPS дала точнее результат. Маленький взрыв происходит по-разному от 6 до 9 кадров, а в оригинале около 10. Время анимации не буду трогать.
--------
Ещё одно исправление:
* Проверка столкновений снарядов была смещена, это сказывалось на перпендикулярных столкновениях. Вражеский танк даже мог отбить летящий в его бок снаряд, выпустив свой в другом направлении. Теперь видно как снаряд подлетает к другому и сбивает.
Обновил файл.
« Последнее редактирование: 04 Май 2018, 19:12:16 от Sharpnull »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #53 : 05 Май 2018, 14:17:52 »
Исправления, в этот раз со звуком:
* Был звук разбивки кирпичной стены вместо звука разбивки снаряда в некоторых случаях. Также сейчас: если одновременно бить по стали и кирпичу, будет оба звука в разных каналах (SOUND_PCM_CH3 и SOUND_PCM_CH4). Баг был известен как:
-звук попадания как в кирпич при попадании в вертикальную броню (2 кубика), снизу и сверху справа (вообще глюки со звуком)
* Использовался неверный звук снятия HP с танка. Теперь "заморозка" тоже с таким звуком, на NES же при "заморозке" другого игрока никакого звука не было.
* Если у первого игрока закончились жизни, второго игрока нельзя было убить бомбой, взятой противником.

Из звуковых несоответствий остаются, исправлять нет смысла:
- Звук стоящего танка должен прерываться после убийства всех врагов. Но если это звук нашего танка, почему он прерывается в оригинале? Затишье после войны или это был звук не нашего танка?
- Звук взрыва базы во время стартовой музыки отсутствует. Такое возможно только когда игрок себя убивает сразу.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #54 : 06 Май 2018, 16:24:06 »
Исправления, теперь с очками:
* Не работала загрузка рекорда из SRAM. Была в 1.07b, в 1.08 сломалась. Ваш эмулятор сохраняет это в файле название_игры.srm обычно в папке с эмулятором.
* Было ошибочное удвоение очков.
* Теперь за взятые бонусы дают очки.
* Не давали очки за врагов в оболочке игрока. С этим багов связаны другие: много очков за убийство такого врага, а после смерти появлялся спрайт рождения вместо количества очков.
С врагом в оболочке игрока остались проблемы. Даже если оболочка начальная, поведение всё равно будет как у обычных танков, а очки дают за оболочку. То есть за жирного врага с начальной оболочкой игрока будет 100 очков вместо 400, но если враг возьмёт звезду, то очки будут +100. Исправлять это не буду, но чтобы не сбивать с толку на подведении очков отображаются оболочки игрока.
* После первого запуска игры движения врагов были одинаковыми, кроме режима Mad Mode.
---
Ещё одно исправление на сегодня:
* Мод жоподёр (ass killer) работал неправильно, враг убивался если игрок имел такой же поворот танка во время попадания.
« Последнее редактирование: 06 Май 2018, 22:08:14 от Sharpnull »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #55 : 09 Май 2018, 19:49:59 »
Мой последний релиз. Напоминаю, что исходный код находится здесь: 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 звук гусениц прерывается после убийства всех врагов.

Баги:
- Звук взрыва базы во время стартовой музыки отсутствует.
- Музыка пропадает на следующем уровне, если взять в конце уровня бонус. Также остаётся след от взятия бонуса.
- После первого выстрела, второй быстрее выпускается, чем последующие с зажатой кнопкой.
--------
Увеличил скриншоты. Добавил загадочную "клизму" (или капля).
197096-0 197098-1 197100-2
« Последнее редактирование: 11 Май 2018, 16:24:33 от Sharpnull »

Оффлайн Werton

  • Пользователь
  • Сообщений: 878
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #56 : 10 Май 2018, 14:58:08 »
Sharpnull, хорошо поработал, респект :thumbup:

Оффлайн vovan225

  • Пользователь
  • Сообщений: 3
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #57 : 11 Январь 2019, 22:02:40 »
Парни спасибо за игру! вспомнил 90-стые. Хотел сказать ещё про одну очень важную фитчу - в игре на приставке ещё можно было брать жизнь у второго игрока нажатием двух кнопок А и B одновременно. Можно это реализовать??? Было бы офигенно!!! Без этого играть в двоем не очень интересно, если одного убили то ему тупо остаётся ждать пока доиграет другой.
« Последнее редактирование: 11 Январь 2019, 22:21:55 от vovan225 »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5016
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #58 : 12 Январь 2019, 00:07:16 »
брать жизнь у второго игрока нажатием двух кнопок А и B одновременно
Тестируйте.
« Последнее редактирование: 12 Январь 2019, 00:27:20 от Sharpnull »

Оффлайн vovan225

  • Пользователь
  • Сообщений: 3
    • Просмотр профиля
Battle City для Sega Megadrive (форк от battlecity-md от KRIKzz)
« Ответ #59 : 13 Январь 2019, 10:08:10 »
 :wow: Спасибо!!! ща будем тестить!

Добавлено позже:
Протестили - первый игрок может брать жизни а второй нет, по крайней мере в танк 1990 так. И вот бы ещё добавить прикольный звук "тррррр" при рубке леса заметил что его нет ;)
« Последнее редактирование: 13 Январь 2019, 10:46:09 от vovan225 »