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