Making of Border Dash
Посвящено продвижению поребрика в массы :)
Сразу прошу прощения за возможные грамматические, синтаксические, пунктуационные, стилистические и прочие ошибки, ибо чукча не писатель :)
Итак, начнем…
Для начала хочу передать приветы-спасибы людям, без которых интра получилась бы совсем не такой или вовсе не получилась:
bfox — за анси-картинку-заставку, моральную поддержку и разные подсказки.
lvd — за подсказки, бета-тестирование и идею звука.
Alone Coder — за статью в ZX Guide#3 «Синхронизация с точностью до такта».
nyuk — за бета-тестирование и отличное пати :)
Сыну — за то что не мешал сидя у меня на коленях, когда готовил интру к релизу :)
Теперь к сути.
Лирическая часть
О создании интры задумался где-то в середине февраля: 2 года назад написал одну интру и остановился — непорядок, надо исправлять. Начал думать, а что же я могу сделать? Ну сделать-то наверное многое могу, но по факту умею только поребрик — на другое просто бы не хватило времени, ввиду отсутствия знаний и опыта. Собственно выбор сделан — поребрику быть! Но вот что именно? Начал перебирать варианты — что-то слишком простое и неинтересное, что-то мегасложное или не реализуемое, что-то не влезает в 256 байт (поребрик + экшен на папере) или квадратики. Квадратики — что с ними можно сделать интересного? Бегущие? Было… Включение/выключение — уже интереснее, но что-то не то… Fade in/out — опять чего-то не хватает, какой-то изюминки. Переливающиеся — ого, вроде оно! Но как именно? Бегущие цветные полосы — то что надо! Может добавить скролл? Подумал и откинул эту идею — не смог придумать алгоритм, да и в 256 байт не влезу. Остановился просто на цветных полосах, так собственно и родилось название по аналогии с небезызвестной игрой :) Была еще мысль впихнуть AY-звук из игры, но оставил на потом — если место останется, но его не осталось…Решение принято, засел за писанину. Но пока так, по два байта (утрировано) в день, попутно укладывая алгоритм в голове. 20 февраля в гости приехали bfox с Катей и мы с Олегом плотненько так пообсуждали интру. Буквально за несколько дней до этого я придумал фишку, не противоречащую правилам — аски-картинуку на папере (да, я читер! :) ) и попросил Олега помочь с оной. На что Олег предложил пойти дальше и нарисовать заставку через UDG-символы — сел и практически за вечер выдал готовый результат, чем мне не оставил выбора — хоть убиться, но интру надо сделать! :)
Дальше пошел хардкор-кодинг — я к ужиманию кода подходил раза 4-5, да и алгоритм менял, пусть и незначительно, несколько раз. Еще про ужимание — я последний раз практически ногами утаптывал то, что на первый взгляд уже не ужать — выжимал 30 с лишним байт для внедрения Алоновского синхронизатора. И ведь ужал! :) Можно было бы обойтись и без него, но мне не понравилось, что при запуске из trd поребрик каждый раз съезжает относительно папера на 0-3 тактов — некамильфо…
Еще из интересного: бета-тестирование — изначально я для цвета фона использовал OUT (C), 0, но как оказалось это недокументированная команда (спасибо lvd ) — на реале выдувается FF… т.е. фон внезапно стал белым. Можно было бы и забить на это, но меня аж покоробил тот факт, что на эмуле и на реале интра будет выглядеть по разному… В итоге опять пришлось чуток менять алгоритм — скатываться с инзначальных 6 цветов (для кратности — 24/6 = 8 блоков полос в одном квадрате) в полосах до 5… Мы когда с Фоксом подбирали последовательность цветов на 6, то получилось гораздо симпатичней, чем на 5. Да и 5 цветов в смотрибельную последовательность, как оказалось, сложить гораздо сложнее…
Потом еще lvd предложил идею «бесплатного» звука — а чего бы параллельно не фонить в биты бипера? Собственно фонит каждый из квадратов и, соответственно, в зависимости от количества квадратов на экране меняется уровень звука, т.е. он как бы плавает.
Ну а результат вы видели :)
Место для кидания тапками
Попутно были созданы пара тулзов:1. Поскольку поребрик это такты, такты и еще раз такты, то я по быстрому накидал справочник команд Z80 + калькулятор тактов цикла.
2. Конвертер scr2udg, нормально работающий с яркостью и флешем. Флеш конечно не нужен был, но раз он есть в атрибутах, то прикрутил и его.
Теперь можете кидаться тапками, ибо эти тулзы были написаны для 1С 8.x!!! :)
Техническая часть
Тут изложу кратко общий принцип работы и некоторые моменты.Интра загружается и стартует по адресу #8000 (32768).
При запуске строит 2 таблицы вниз и обработчик прерывания вверх начиная с org+#FE.
Таблица t_line_addr содержит адреса первых линий квадратов и состояние включен/выключен. 3 байта на квадрат.
Таблица t_clr_addr содержит 2 набора цветов для каждого из состояний вкл/выкл. На включенное состояние последовательность регистров используемых в OUT (C), x (второй байт команды минус #41), на выключенное состояние нули минус #41. #41 является вторым байтом команды OUT (C), B. В последствии, при установке нужных байт в обработчике прерывания, #41 прибавляется к значению из таблицы цветов и на выходе получается второй байт команды OUT (C), x.
Процедура set_sq на самом деле только включает квадраты, но результат получается разным, в зависимости от того, из какой части таблицы цветов взято значение.
Ах да, чуть не забыл — синхронизатор тактов, наверное, логичнее было бы расположить после процедуры create_paint_code (т.е. перед main_loop), а не в самом начале, но я чего-то поленился переделать :)
Ну вот, вроде, собственно и все. Если есть какие вопросы — постараюсь ответить. У меня зачастую полет мысли такой, что я связанными словами далеко не всегда могу объяснить :)
Хотел вставить исходник сюда, но как-то некрасиво получилось. По этому его можно скачать тут.
upd
Для тех, кто собирается колупать и править код:
На заметку — если будете править и размер вдруг превысит 255 байт, то программа уже не будет работать из-за одной хитрости, экономящей байт при установке обработчика прерывания. при превышении орг надо выставлять 32768-(размер-255)
37 комментариев
как-то так))
а забавные моменты были, я даже в чатике глюк показывал, но тут палить не буду — тянет на самостоятельную интру, может на безрыбье сгодится))
да и вообще мне грех жаловаться — 2 года назад моя первая работа заняла 6 или 7 место, а вторая работа конкретно наступает на пятки лидеру :)
демка впечатлила.
На заметку — если будете править и размер вдруг превысит 255 байт, то программа уже не будет работать из-за одной хитрости, экономящей байт при установке обработчика прерывания. при превышении орг надо выставлять 32768-(размер-255)