Ура!
Вид для печати
Ура!
Когда релиз ?
я про ре-релиз :)
Какой такой? С интро и читами? Возможно Слайдер сделает через какое-то время.
Стримы по Рексу кончились, и мотивация упала. Хотел ещё посмотреть дальнострельность лазера и индикацию заряда неиспользуемого оружия. Не уверен, что это баг или глюк, может так и надо? Но не знаю. Можно было-бы сделать выбор "системных" кнопок: пауза, сброс, смартбомба. Но тоже лениво.
Точно думаю сделать Рекс 1 модификацию 5. Капель в первой фазе нет, а пузырики слева не появляются (уже на 2-м экране есть турель слева), и "утечка памяти". Надо бы исправить по горячему. Код в первой и второй фазе в основном совпадает, только в разных адресах.
вспомнил что ещё есть играбельная демоверсия с экранами второй части, а врагами из первой.
https://archive.org/download/World_o...Tape10.tzx.zip
(на второй стороне)
Не видел эту.
Решил проверить, есть ли тут турели близкие к левому краю экрана. (Да я одержим ими :) )
Внезапно и случайно прошёл. Тут не так много экранов.
Пробовал непрерывно стрелять и не брать пузыри. Энергия оружия вообще не падает. И со смертью тоже. А значит не может спустится ниже жёлтых дронов. Ну, кроме дронов в этом миксе нет оружия вообще.
Поскольку он такой маленький, то возится с ним, что-то исправлять, не вижу особого смысла.
Заметил странность, пытаясь фармить мелкие пузырики на стартовом экране.
Постепенно прокачивается дронопушка, и количество дронов растёт. Докачавшись до белого, дроны встают полным кольцом. Всё пока как надо.
Копим дальше пузырики, и вот начинает качаться 5-е оружие, которого нет. Оно становится магентовым, и... дронов становится только четыре. Хотя дронопушка так и белая.
Не логично. Глюк по моему. Согласны?
Надо поэкспериментировать в классических частях Рекса. Взять только дронопушку.
Прошёл, понимаешь, первую фазу, взяв только дроны. Заметил, что та же ерунда, прокачав дроны, и прокачивая невзятое оружие, опять растёт количество дронов от 4. Хотя по логике должно оставаться максимальное.
Ладно, получил пароль(9990908307709007), ввожу его во вторую фазу. Энергию мне понизили до лазера. Лазер я не брал... но стреляю с лазера! Иконка пустая, но пульки лазерные вылетают. После первой смены оружия на дроны или наоборот, на первую пушку, больше лазер включить нельзя. Но начальная инициализация жёсткая на лазер! Стопроцентный глюк!
Ты крут. Взял и прошел первую фазу.
Разобрался и перелопатил (пока для первой фазы) блок процедур, контролирующих прокачку оружия и индикацию. Поисправлял косячки. Еле впихнул в то же место, пришлось даже JP шки переделать на JR-ы.
Пока глючит(сам где то понакосячил), но глючит в нужном направлении! :) Осталось отладить.
Одно тянет за собой другое, вроде всё поправил, но надо потестировать получше.
Несколько выясненных фактов:
* Изначальная пушка не теряет энергию при стрельбе. Вызывается процедура уменьшения энергии с параметром 0.
* Чтобы подзарядить оружие, надо набрать 120 энергии. При понижении уровня остаётся 50 единиц. Вот такое низкое КПД=50/120=0,41(6)
* При возрождении теряется 100 единиц энергии. Если накоплено 100-119 - уровень не понижается(например белый, так и останется белым). Если накоплено 50-99 - уровень понижается (белый станет жёлтым). Если было накоплено меньше 50, то уровень понижается два раза(белый станет циановым)!
* После взятия пузырика панель вспыхивает. Пока идёт вспышка, бегунок не бегает, время не идёт. Теоретически можно непрерывно выбивая из наступающих врагов пузырики, продержаться как угодно долго на экране.
* Взявши вопросиком "100 rapid fire", у нас возникает турбокнопка огня. Надо её держать, для непрерывного огня. А я раньше её, по привычке, продолжал тыкать.
Некоторые поправленные баги:
* Перекачав спрей(последнее оружие), остаток энергии не устанавливался на максимум. Из за этого труднее было держать его в состоянии 8-вэй (стрельба "ферзём"). Например набрав шариков до 122 единиц энергии, 120 сбрасывалось, оставалось 2, и через пару выстрелов уровень понижался до 4-вэй (стрельба "ладьёй"). А между ферзём и ладьёй большая разница. Подправил это. Теперь энергия насыщается до 120.
* Бегунок индикации времени, двигаясь вправо не писал в теневой буфер. Из-за этого, после вспышки, появлялось зелёное, там где не надо. Конечно оно затиралось проходом бегунка, но глянув до того как он пройдёт, можно было подогнаться, что времени осталось очень мало.
* Индикация заряда оружия, во время вспышки, вообще не рисовалась. Сделал, чтобы рисовалось в теневой буфер. А то из за этого, прокаченное оружие иногда оставалось жёлтым. Допустим, брались несколько пузыриков, первый запустил вспышку, а остальные прокачали лазер с жёлтого, до спрея.
Осталось разобраться:
* Лазер, всё ещё, иногда коротко стреляет
* "картошки" иногда застревают на краю экрана. Особенно на левом краю, на экране перед боссом.
* Дроны у меня как то раз неровно встали. Обычно они расставлены с равным интервалом, а тут внезапно наехали друг на друга. В процедуре добавления энергии оружия, при переходе оружия на новый уровень, вызывается костыль, который жёстко константами расставляет дроны в ряд. Хорошо бы наладить дроны, чтобы этот костыль можно было убрать.
Сейчас я мучаю первую фазу, надо будет адаптировать патч для второй фазы.
Кому интересно глянуть, прикладываю текущий снапшот. (В нём можно выбить пузырик из самой левой турели на втором экране, подобрать его, полюбоваться как панель меньше глючит... :) )
Товарищи, а реально сделать играбельной демку? Чтобы игрок сам мог побегать. https://spectrumcomputing.co.uk/pub/...exDemo.tap.zip
Юрий, если посмотреть карту, то это часть первого уровня . обрезали из-за нехватки памяти?
https://maps.speccy.cz/map.php?id=Rex
jerri, Изначально на кассете, на двух сторонах, ВСЁ было.
Для ТР-ДОС вот тут нашёл релизы, где тоже ВСЁ есть.
Или ты имеешь ввиду, чтобы все части сразу загружались в 128К?
Кстати при попытке переопределить клавиши происходит сильный дребезг клавиатуры, похоже это касается всех релизов.
Если переделывать в 128-ю версию, то у Рекса есть большой резерв оптимизации.
Сейчас экран рисуется в теневом линейном буфере с нуля (обнуление PUSH,PUSH,PUSH...), послойно, а в конце статика. И переброска (POP DE: LDI, LDI, LDI...) Прерываний строго нет.
Можете глянуть приложенный файл, я там сделал переброску буфера в экран после рисования каждого слоя. На 30% скорости эмуляции ещё виднее.
Так вот, теоретически можно попробовать не рисовать статику в каждый цикл, а всё подвижное рисовать промеж статики (она точно по знакоместам). Синхронизировать с прерываниями. И может использовать 7-ю страницу, чтоб не перебрасывать, а переключать.
Но это всё мечты. Проще слепить 128к версию, где все уровни упаковать в доп память, и распаковывать очередную фазу по мере прохождения.
Что-то подобное сделал KSA в Stormlord's Collection: https://vtrd.in/release.php?r=23b048...5677e157fda4e8
после прохождения части грузится следущая. Ну и в случае 128к можно уместить оба рекса в памяти.
- - - Добавлено - - -
- - - Добавлено - - -
Странно, не могу теперь это вопроизвести. USP в Arco linux, скорей всего было неактивно окно эмулятора.
Картошками я называю летающие хреновинки, округлые, размером примерно в знакоместо, которые изначально установлены на экране, случайно ползающие. Часто они изначально спят в разрушаемом камне. Если этот камень расстрелять, то через четыре игровых цикла картошка проснётся.
Картошка всё время ходит так: выбирается случайное направление, и устанавливается счётчик прямого хода - случайное число от 8 до 15. Пройдя в одном направлении столько шажочков, этот счётчик обнуляется, и по новой, новое случайное направление со счётчиком от 8 до 15. Натыкаясь на препятствие кортошка разворачивается на 180 градусов, а счётчик прямого хода устанавливается в 4.
В оригинальной игре был такой недочёт. Проверялось, рядом ли картошка с краем экрана, и если рядом, то направление меняется на противоположенное, и счётчик прямого хода устанавливается на 4. Естественно прогер хотел, чтобы она отражалась от краёв. Но иногда, случалось неприятность. В момент попадания на край, у картошки кончался прямой ход, и она выбирала направление от края. Затем проверка показывала, что, а мы оказывается на краю, направление менялось на противоположенное, и делался ещё один шаг к краю. Плюс счётчик прямого хода в 4. И вот мы уже углубились в зоны края экрана, и постоянно меняя направление дёргаемся там. А случайное направление больше не вызывается, потому что счётчик прямого хода не обнуляется.
Пропатчил я это место (C0E0..C148). Утрамбовал всё. Добавил, чтобы проверялось конкретно: зашли на левый край, значит скорость вправо; зашли на правый край, значит скорость влево, и по вертикали то же.
Байтов хватило тика в тику.
Что получилось, см. снапшот.
Этого было бы вполне достаточно. Как вариант, можно ещё добавить возвращение на предыдущий экран, как это сделано в этом релизе - https://vtrd.in/release.php?r=ccdd27...34ffac37ab1717
Только без оживления убитых врагов.
И ещё непонятно, как Rex из демо версии с кораблём должен переходить на первый игровой экран (первой части), судя по карте прохода там нет.
Сначала надо-бы найти или придумать научнофантастическую причину, почему Рекс не может долго находится на одном экране. Потому что свободный проход несколько ломает это ограничение. Или остаток времени на экране тоже сохранять?
А с переносом на платформу врагов тоже не оживлять?
Ну это можно сделать, например так. Сделать чтобы был проход, но чтобы он заваливался после прохождения. Или чтобы Рекс попадал туда, через особую телепортационную.
Но больше всего мне нравится вариант, сделать ещё один экран, сразу под стартовым. В него мы заходим через тоннель слева из демоуровня. Из него можно идти направо, к поездам, а можно подняться наверх, и впрыгнуть в изначально стартовый экран, прям из пола под платформой возрождения.
Нарисовал
Как сделать гладкий переход из первой фазы во вторую, придумать тоже надо. Тут мы на лифту поднимаемся, а потом из телепорта выходим, негладко. Возможно, в промежутке, опять загрузить демо-фазу, и из неё использовать некоторые экраны, с голубыми блоками. Тем более голубые блоки появляются вкраплениями в конце первой фазы.
Я бы вообще выкинул ограничение по времени нахождения на одном экране, но добавил запрет двигающимся врагам появляться на экране после окончания времени, чтобы Rex не смог собирать бонусы бесконечно долго.
По идее да, если Rex убил (взорвал) статичного врага (пушку, ракетницу), то его уже быть не должно. Можно конечно предположить, что вражеские солдаты устанавливают новую технику, взамен взорванной...
Эти два вопроса нуждаются в дискуссии.
Да, это лучший вариант. Там даже рисовать особо не надо. В демоверсии, экран следующий после корабля, направо, находится сразу над стартовым экраном, в нём есть проход вправо по тоннелю. Остаётся только проделать ещё один проход вверх, на стартовый экран.
В принципе, достаточно нарисовать на стартовом экране второй части кусочек лифта уходящий вниз, и сделать чтобы Rex по нему поднялся вверх на платформу. Получается всё логично, прямой лифт снизу из первой части, во вторую. Небольшие отличия в расцветке лифта значения не имеют, просто покрасили одну часть лифта в один цвет, другую в другой.
Забавное "кругосветное" путешествие по коду у меня получилось. В поисках причины почему лазер стреляет коротко.
подробности
Начал с ловушки нажатия клавиши огонь. Обнаружил, что зачем-то оно вызывается 2 раза, когда можно просто сохранить результат первого в стеке. Поправил, зачем лишнее время тратить.
Потом разбирал что делается при выстреле лазером, я-то наивный думал, что делается такая себе пуля, только длинная. Но нет, делается короткая пуля. Но эта короткая лазерная пуля помнит где она появилась, и 8 циклов делает в этом месте ещё по одной лазерной пуле, которые уже новых пуль не рождают.
Поэтому без разницы что будет с Рексом после выстрела, он может уйти, упасть и отвернуться, лазерный луч будет продолжать выходить из одной и той же точки. Но если лидирующая пуля попадёт во что нибудь, или покинет экран, то генерация луча тут-же прервётся. Поэтому стрелять лазером в упор не так эффективно. Если лазерная пуля лидер успеет создать побольше хвостовых пуль, то все они более массово вопьются в цель.
В общей куче, каждая пуля занимает 15 байт. Последний байтик, как раз, и хранит, сколько циклов осталось пуле лететь. А оно инициализируется из ячейки A068. А эта ячейка пишется.. в процедуре увеличения уровня оружия, которую я уже разбирал. И я вернулся туда, где уже был. Если бы я тогда потрудился узнать, где значение A068 используется, то уже бы наладил лазер, продолжая думать, что лазерный луч - одна длинная пуля. :)
Ячейка A068, конечно писалась, но только когда уровень оружия повышался. А когда уровень оружия понижался - нет, и когда оружие
полностью прокачивалось, и начиналось качаться следующее - тоже нет. Как будто не туда эту формулу влепили, или продублировать забыли.
Переставил так, чтобы ячейка A068 всегда соответствовала уровню оружия из которого стреляем.[свернуть]
Теперь стало всё работать логично. И оказалось, что лазер с минимальной прокачкой, стреляет даже ещё короче, чем нам казалось коротко. Наверное, так и было задумано, просто не работало из за слишком торопливого кодинга.
Про дроны.
Убрал костыль, который вызывался при повышении уровня оружия, из-за которого дроны сбрасывались в исходное положение. Выглядело как скачок.
Переписал саму процедуру движения дронов, чтобы работала без костыля. Заодно ускорил и сократил. Выиграл 66 байт.
Жалко, столько байт пропадает, хочу что нибудь вставить.
Например, чтобы дроны крутились в ту сторону, куда повёрнут Рекс. (Как в Киберноиде).
Или чтобы дроны не так резко появлялись и исчезали.
Вроде это не должно сломать игру?
Даже не знаю.
Ну в той версии, где можно свободно бродить туда-сюда, в ней и на одном экране можно вечно тусить.
- - - Добавлено - - -
Ага, сильное упрощение. Но та версия, где можно свободно гулять и долго сидеть на одном экране, набивая пузырики, всё равно показалась слишком сложной для Слайдера и он взял мою версию и ещё и читы туда вставил :v2_dizzy_facepalm:
А вообще я был сильно зол, что ту версию запихнули на вирт в ремиксы, куда никто обычно не заходит :mad:
Black Cat / Era CG, нит. Геймплей не меняет. Вот чит на бесконечные жизни меняет, а это нет.
Натестировался в первой фазе так, что уже прохожу её по честному.
Заметил бажик. Когда в вопросике берёшь "ENERGY LOSS", зачем - то сбрасывается панель. Долго думал, но не понял зачем это. То есть всё оружие синеет, очки в ноль и так далее. Возможно это чтобы был визуальный эффект.
Убираю это непонятное, ставлю эффект потемнения панели. При взятии пузыря идёт просветление-потемнение-выравнивание. А тут будет без первой фазы, сразу потемнение.
Заметил при дебаженьи, что процедура вывода спрайта на теневой линейный экран достаточно неоптимальна. Особенно когда спрайт надо зеркалить. Таблицы не выравнены. Попробую сделать получше.
Планирую. Постепенно, хаг за хагом.
Вообще не вижу. Прерывания строго выключены, компенсаторов никаких нет. Видимо расчет на то, что примерно половина спрайтов зеркалируется, а количество спрайтов не меняется резко. На разных экранах скорость игры заметно разнится. Очень быстрый экран, тот на котором берём оружие дроны.Подробнее о выводе спрайтовх
Просто посмотрите код внутреннего цикла:Сколько лишнего во внутреннем цикле!Код:ORG 0B317H;(B2ABH)
SPRH EQU $+1: LD B,10H ; высота спрайта 16 пикселей
LOOP1 ;------------\
PUSH BC
PUSH HL
SPRW EQU $+1: LD B,02H ; ширина спрайта 2 байта
LOOP2 ;--------\
LD A,(DE) ; берём байт
IF MIRR
PUSH DE
PUSH HL
LD E,A
LD D,00H
LD HL,AD5DH ; таблица зеркаливания
ADD HL,DE
LD A,(HL) ; отзеркаленый байт
POP HL
POP DE
ENDIF
OR (HL)
LD (HL),A
INC DE
DEC HL
DJNZ LOOP2 ;--------/
POP HL
LD HL,20H
ADD HL,BC
POP BC
DJNZ LOOP1 ;------------/
Вообще большинство спрайтов выводятся одной процедурой. Она берёт значения из переменных в памяти, вычисляет адрес в буфере экрана, адрес спрайта в нужной фазе, пропатчивает высоту и ширину, и производит рисование в двух ветвях, без зеркалирования и с.
Но дроны, например, рисуются напрямую в процедуре обработки дронов(их я уже оптимизировал). Возможно пули тоже рисуются своей рисовалкой.
Сейчас планирую таблицу зеркаливания выровнить по 100H. Потом попробую развернуть самый внутренний цикл. Самый широкий спрайт это шестибайтный босс.
Далее интересно будет взглянуть, как статика(горы,лестницы, и.т.д) выводится. Нельзя-ли там чего ускорить.
[свернуть]
----------------------------------
Чем больше играю, тем больше не нравится платформинг. На лестнице, на второй ступеньше сверху, вообще чудеса проникновения происходят. Возможно Lethargeek прав, можно и поправить. Но код пока не смотрел.
Ещё заметил, что картошки, хотя теперь и не застревают на краю экрана, но всё ещё могут застрять внутри камней. Ещё не решил, как это поправить. Ведь они любят спать в камнях, это как бы логично.
Еще не знаю следует ли править, то что стреляя в камень, в упор, пуля вылетает с другой стороны. Был-бы куст - было-бы всё логично. Но ведь камень.
Оптимизировал вывод повёрнутого спрайта, так что теперь он работает быстрее чем неповёрнутый. :)
чуть подробнее
Перенёс таблицы экранных адресов и разворота в свободную память перед теневым экраном.
Туда сгонялся всякий мусор. Например процедура, которая высвечивает сколько мы только что набрали очков, от 100 до 900, в каждом игровом цикле записывает два байта. Когда надо засветить, то пишет в атрибутную область, а когда очков мы ещё не набрали - писала в сгонную память. Перенаправил её в ПЗУ.
Спрайты, дроны и пули, когда персонажи вылазят за верхнюю границу игрового поля, тоже "рисовались" в этой сгонной области. Для спрайтов сделал обрезание, для дронов сделал проверку, а для пуль переставил проверку перед рисованием. Да, для пуль проверка была, но после рисования, для того чтобы удалить вылетевшую пулю.
Потом надо будет переделать вывод красной картинки "REX" перед игрой, потому как она тоже пересекается со сгонной областью, и я её попортил.
[свернуть]
Но на скорости самой игры это особо не отразилось. :(
Хоть в игре нет компенсаторов, зато есть балласт:
1. Рисование статики в теневом экране(~84Кт(килотактов))
2. Перенос теневого экрана на видимый экран (~90Кт) (LDI:LDI...)
3. Очистка теневого экрана (~30Кт) (PUSH:PUSH...)
Пока этот балласт не трогал, а сейчас разбираю пуледвижение и пулеобразование.
А вообще планирую попробовать объединить эти 3 пункта, в один цикл, по всем знакоместам, статику выводить прямо на экран, и только когда надо. А пространство между статикой переносить и очищать сразу. Должно получиться быстрее. Если придётся, то включим кадровые прерывания, и засинхронизируемся.
Поподробнее
Движение всех пуль, зарядов, ракет и снарядов обрабатывается в одном цикле. Изменив его, мне теперь надо подправить создание всех этих типов пуль. Они создаются множеством конструкторов, которые вызывают общий родительский конструктор с несколькими входами. Сейчас всё это надо попровлять:v2_crazy:
Каждая пуля занимает 15 байт. Она хранит двойную бухгалтерию, координаты X Y отдельно, и адрес в теневом экране отдельно. Там же хранятся, скорости (смещения за игровой цикл) по координатам и по адресу. Тип пули. Принадлежность: наша или противничья. оставшееся время жизни. Для ракет фаза движения. Статус пули: есть, нет, или исчезает. И что-то возможно ещё.
Забавное место нашёл. Для проверки пролетает ли пуля через тайл вызывалась специальная подпрограмма проверки проходимости. Она, значит, брала байтик, и искала его среди 6 байтиков, в цикле с CPI. Сначала я её "оптимизировал" заменив этот цикл на CPIR. А потом вообще заметил, что значения проходимых тайлов это 0 и диапазон от #0E до #12. Заменил весь этот вызов на простые проверки.
Пули рисуются первые, на чистом теневом экране. Поэтому авторы внаглую выводят их не по OR, а прям LD. Хотя возможно некоторое затирание одних пуль другими, но это не заметно.
Турели стреляют четырёхпиксельным крестиком. А спрей стреляет покрупнее восьмипиксельным крестиком. Тип пули один и тот-же, но по разному рисуется, в зависимости от принадлежности.
[свернуть]
Сейчас всё это с первой фазой делаю, а потом ещё и со второй надо будет.