Как известно, году эдак в 1997 я начал
писать игру Worms. Тогда же я узнал, что
этим же занимаются ещё по крайней мере 4
человека/группы. В связи с этим фактом мне
пришло в голову объединить мои и чьи-то
там ещё усилия и закончить наконец этот
проект, если не самолично, то хотя бы при
моём участии (прославиться решил ;). Было
принято решение зарелизить исходник в од-
ном из номеров ZX-Guide. Однако номера шли
и шли,а исходник всё не был и не был опуб-
ликован,потому что под тяжестью работы над
журналом мне постоянно не хватало времени
привести программу в приблизительно удобо-
варимый вид.
Это и сейчас не полностью сделано.Так,в
программе есть неиспользуемые части,остав-
шиеся от предыдущих версий,а некоторые ра-
бочие фрагменты программы не подключены в
главный цикл. Но за 4 года в программе по-
явились вещи,над которыми стоило работать:
- Fast Mapping 30x17 (он самый,родной;)
при карте 93x32 (93x22 занято,верх пустой,
внизу речка)
- Fast Worms 8x8 Print (выводятся непо-
средственно на экран.Возможно одновременно
использовать 64 (если не ошибаюсь) фазы. Я
подсчитал: этого достаточно для эпизода
взрыва - см. ниже). Скора эта процедура не
inner loop'ом (он обычный, его 8 штук:
LD A,(DE)
OR (HL)
LD (DE),A
INC H
INC E | DEC E
LD A,(DE)
OR (HL)
LD (DE),A
INC H
INC D
и т.д.,с установленном в нужном месте DOWN
DE), она скора внешней частью - пересчётом
списка координат червей в регистры и вызо-
вом этого inner loop'а.Весь прикол в кома-
ндах:
LD SP,IY
POP DE
...
RET ;go to inner loop
которые берут два адреса из таблицы. Таких
таблиц две: для верхней половины экрана и
для нижней. Так избегается юла,и во многом
из-за этой конструкции высота экрана равна
17 знакомест. (Такая же высота,в принципе,
получалась и исходя из требований дизайна)
- Random Map Generator - этим я должен
гордиться;) Карта получается по форме один
в один как оригинал,причём алгоритм приду-
мал я сам. В спектрумовских аналогах Worms
ничего подобного до сих пор не было.
- Random Worms Placing Routine - случа-
йная расстановка червей на созданной кар-
те. Алгоритм очень простой,но опять-таки я
вроде бы первый,кто его реализовал на ZX.
- Логический конвейер, а проще говоря -
полёт червей. Очень быстро работает, хо-
тя достаточно примитивно - так, катящийся
червь не сбивает стоящего собрата.Да и во-
обще,он пока не катится. Раньше (при более
древней версии движка) он катался и крути-
лся в полёте (именно из-за этого и катал-
ся, принцип DIZZY). Так что эта программа
будет в любом случае дорабатываться лично
мной.
Итак, ещё раз о том,зачем это опублико-
вано.
Я обязательно хочу,чтобы на Speccy поя-
вилась игра Worms, причём она была реали-
зована при моём участии. Для этого я пока-
зываю исходник тому, кто его поймёт. Этот
человек может принять 3 решения:
а)"Диман,я беру твой движок,дорабатывай
поскорее,я допишу остальное (да оно,собст-
венно, и дописано;)"
б)"Мне сильно понравилась эта и вон та
процедурка, дай-ка я её позаимствую для
своей версии. Тебе не сильно напряжно её
довести до ума?"
в)"Я тут посмотрел на твой исходник, а
потом на свой (или наоборот;) и решил: пи-
сать вормов будешь ты. Мои сорсы прилагаю-
тся".
Одно из преимуществ перед демоверсией
уже видно.Другой плюс в том,что я не пложу
новых демоверсий и не нервирую этим народ.
Третий плюс в том,что видно,ЧТО и КАК сде-
лано,что не даёт мне обманывать юзера тем,
что "всё почти дописано", в то время как,
например, отсутствовал бы генератор карты.
Ведь нас уже обманывали так, правда?
Что тут и как.
Для более плавного скроллинга (при по-
лёте снаряда это важно) я решил двигать
карту если не попиксельно, то по крайней
мере по 2 точки.Этим определилось всё рас-
пределение памяти: 4 странички под копии
карты,ещё одна под червей и bounding маску
карты (карта в 2 раза меньше,пиксель в ко-
торой указывает,что в этом месте червь до-
лжен стоять,не просачиваясь сквозь землю),
внизу выводилка, таблицы и остальная часть
программы.В свободной части верхней памяти
- спрайты.Меню при нехватке памяти - подг-
ружаемое.
Панелька статуса и панелька для выбора
оружия нарисованы. По-моему,цветовое реше-
ние этих панелек очень удачно и вполне ко-
мпенсирует чёрно-белую центральную часть
экрана. Графика для карты пробная (выдрана
из demo F.A.), но вполне терпимая. Графика
для червей недорисована.
Кстати,графика для карты лежит в форма-
те SCUT1.1 - можете загружать и редактиро-
вать ;)
Игра должна работать в нескольких осно-
вных эпизодах:
- Управление червём. Минимум загружен-
ности процессора: только мэппинг,вывод од-
ного червя и его кинематика. Остальные че-
рви вместе с надписями нарисованы на самой
карте. (В текущем сорсе - только надписи.)
Проблема: у червя,стоящего на самом верху,
надпись на карте не поместится. Решение:
кидать надпись спрайтом, времени много, а
часть памяти на этом этапе свободна. (Пока
не реализовано.)
- Полёт снаряда. Аналогично по времени,
но вместо червя - снаряд. Процедура следя-
щей камеры достаточно простая: просто дер-
жать снаряд в центре.
- Взрыв и последующие за ним полёты по-
дорванных червей. Самая времяёмкая часть.В
самом плохом случае это 16 летящих червей
(реализовано), 8 летящих мин (не реализо-
вано), 4 обломка Cluster Bomb (см.описание
в ZX-Guide 2.5 trash). Алгоритм следящей
камеры не придуман. Поскольку для тупого
сравнивания координат червей и мин требуе-
тся значительное количество времени,то уп-
рощаем задачу:сперва проверяется,не попали
ли движущиеся черви на стоячие мины, а по-
том - движущиеся мины на стоячих червей.
Выигрыш где-то в 3-4 раза. По-видимому, в
оригинале такой же алгоритм.Ничего сложно-
го здесь не предвидится, т.к.стоячие и ле-
тящие черви уже хранятся раздельно.Кстати,
в основном списке (который обрабатывается
конвейером) по 6 байт на червя:
Lspr, Hspr, X/4, Y, Vx, Vy
где spr - это 2 байта:
L=xxSPRITE
H=110M0001 (если H=1, то конец списка)
xx = младшие 2 бита X-координаты;
SPRITE = 6 бит номера спрайта;
M = 1 бит зеркального отражения.
Есть ещё дополнительные списки: для энер-
гии, имён червей и т.п.
- Убавление энергии и самоубийства чер-
вей. Требования к времени - частично как в
первом эпизоде,частично как в третьем (так
как сцены прощания червей и взрывы череду-
ются).
- Ход компьютера. Со временем траблов
нет, но от самого интеллекта есть только
идеи. Например, червь выбирает ближайшего
врага (если он не впритык - иначе динамит
или в морду), берёт гранату и кидает по
баллистической напролом. В оригинале обна-
ружена тенденция стелять в стрелявшего
раньше.
- Управление червём в момент, когда он
качается на верёвке. Идей алгоритма нет
вообще! В каждой реализации на оффтопике
верёвка работает по-разному!
- Ну,и мелочи: скидывание призов,анима-
ции телепорта,пневмобура,камикадзе и т.п.
Вот что надо написать.
А в исходнике можно: R - генерить новую
карту, S - сменить спрайт червя.
Ну и напоследок:объяснит ли кто мне на-
конец, что означают буквы "KO" между лине-
йками энергий команд??? Может,это какой-то
символ? На этом же месте может высвечива-
ться остаток времени раунда, если включить
соответствующий флажок...
Сайт управляется системой
uCoz