Captain Drexx изнутри

Итак, я начну небольшой цикл статей об этой, не побоюсь этого слова, ВЕЛИКОЙна игре!

Для начала вспомним, как весь этот бардак выглядел.


Итак…
Разбор игры будет проведён логическими блоками. Будут затронуты такие части как:

1. intro — выбор управления меню, разбор кода перехода на уровень игры (эта статья);

2. основной цикл игры:
  • creeps — хранение, вывод спрайтов крипов, путешествие крипов по пути
  • towers — установка, апгрейд башни; обработка стрельбы башен.
  • user interface — управление, отработка игровых событий;
  • full source — исходники игры



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

Я не буду проходить полностью по всем строкам игры, рассматривать будет только действительно интересные блоки, причём по частям. Исходник будет с каждым постом расти.

Сегодняшний исходник. intro

Инициализация.
скачали? поехали смотреть, что там.
Чистим экраны, инитим контролы – это может быть кемпстон маус и/или клавиатура, инитим звуковой набор (AFXINIT), создаём набор адресов строк экрана через 16 по вертикали (они пригодятся для ускорения расчётов вывода тайлов карты, размещения башен и т.д.), инитим прерывания и переходим в не основной, но очень важный цикл – интро. Почему важный? После окончания работы над движком игры оказалось, что работы ещё очень много – по обвязке. Ибо – интро, аутро, контролы, хайскоры… капец ;)
Интра у меня лежит в банке 0 по адресу С000, который во время самой игры не юзается из-за постоянной работы с экранами 128го спека.

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


Есть всего две части интры – это выбор контролов и вывод топ скорс. Все они переходят друг в друга по счётчику, при этом обслуживают нажатие кнопки мыши (при её включении в меню). первая — меню — даёт доступ к плееру хелпа, выводу кредитов, переключателю использования мыши, а так-же вводу кода для перехода на уровень игры. В общем, пока ничего интересного, кроме мелкого эффекта на меню – метка diz1, юзаем 256 байт градиента с дизером для and (hl) и вывода на экран.

Интересным может быть система кодов для игры, в которую можно попасть по кнопке 4
Итак, с начала мы выводим обьясняющие надписи и ждём ввода. Ввод «джойстиком» – через право-лево и стрельбу :)

Работает код так:
Вводится всего 6 символов. Пятый у нас – жоско заксоренный номер уровня, он же ключ для ксора заработанных очков (предыдущие 4 символа). Шестым символом является контрольная сумма предыдущих, подрезанная до 7 и вытянутая до буквы а ascii. Т.е., банально проходим по расшифровке, подсчитываем что имеем и срваниваем с введёнными данными. Если всё хорошо, то мы получаем номер уровня и выходим из декода. Если не срослось – всё по нулям, идём обратно в интру.

pass_decode	ld hl,player_name+4
		ld a,(hl)
		sub #45
		xor 4
		ld (pass_lev+1),a    ;получили номер уровня
		ld c,a	; level
		ld b,4

pd1		dec hl
		ld a,(hl)
		sub #41    ;простой шифр для scores - кодируем как ascii и ксорим уровнем. scores у нас в hex, хватит 4 значений.
		xor c
		ld (hl),a
		djnz pd1
		ld de,0
		push hl
		ld a,(hl)
		rlca
		rlca
		rlca
		rlca
		ld e,a
		inc hl
		ld a,(hl)
		or e
		ld e,a    ; получаем scores в E
		inc hl
		ld a,(hl)
		rlca
		rlca
		rlca
		rlca
		ld d,a
		inc hl
		ld a,(hl)
		or d
		ld d,a    ; получаем scores в DE
		pop hl
		
		xor a
		ld b,5
		ld c,(hl)    ; подсчитываем данные о scores для сравнения с контрольной суммой
		add c
		inc hl
		djnz $-3
		and 7
		add #46    ; приводим к введённой букве
pass_lev	ld c,0
		ld b,(hl)    ;сравниваем с контрольной суммой
		cp b
		ret z    ; сумма сошлась! нужен переход на уровень
		xor a
		ld c,a
		ld d,a
		ld e,a
		ret    ; нас пытаются обвести вокруг чивототам :)


на сегодня всё, дальше будет разбор уже движка.

2 комментария

avatar
добавил разбор декодирования очков / кода уровня
  • VBI
  • 0
avatar
Ну, ВЕЛИКАЯна игра каким-то макаром попала в ютюб, как одна из достойных в 2014 :)
  • VBI
  • 0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.