Как известно, году  эдак в 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" между лине-
йками энергий команд??? Может,это какой-то
символ? На  этом же месте может высвечива-
ться остаток времени раунда, если включить
соответствующий флажок...