Важная информация

User Tag List

Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 15 из 15

Тема: IMPACT тайна 80-го уровня

  1. #11
    Junior Аватар для Gamer999
    Регистрация
    08.04.2016
    Адрес
    г. Керчь, Крым
    Сообщений
    22
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ух Ты,не знал такого 'сюрприза' на уровне 80.А я-то всё думал почему он такой сложный?!Я только лишь однажды его прошел.Проходил я его только если тяжелый шар взять.
    Я еще заметил,что если шар долго летает по экрану,то его скорость увеличивается,а если дальше пытаться его удержать,то игра вылетает.

  2. #12
    Junior Аватар для Gamer999
    Регистрация
    08.04.2016
    Адрес
    г. Керчь, Крым
    Сообщений
    22
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Нашел у себя в записях хороший Poke для игры Impact.
    POKE 51523,58 - Сюрприз :-D

  3. #13
    Junior
    Регистрация
    31.03.2016
    Адрес
    г. Санкт-Петербург
    Сообщений
    20
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    11
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию IMPACT Как создать свои уровни

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

    IMPACT: Как создать свои уровни вместо базовых.


    Напомню, что в игре IMPACT уровни поделены на две части: базовые уровни №№ 01-80, которые располагаются в памяти с адреса 26000 по 36796 и пользовательские уровни 81-90 (с 41700 по 44479). Как я упоминал в прошлой статье, структура этих категорий уровней также отличается друг от друга. Базовые уровни упакованы и не имеют фиксированной длины. Начало следующего уровня вычисляется по вспомогательным значениям предыдущего, где задается смещение. В этом случае критично даже изменение отдельных битов, в результате чего могут сдвинуться не только кирпичики, но перекоситься все нижестоящие уровни.
    Пользовательские уровни имеют несжатый и незашифрованный формат. Длина каждого по 277 байт. Предположу, что у многих возникала мысль. А можно ли построить уровни с помощью этого редактора и вставить вместо базовых? Да можно, и даже несколькими способами. Кто-то даже выдвигал теорию, что именно с помощью этого редактора и составляли базовые уровни. Обзор начнем с простейшего варианта.

    Вариант 1
    Подмена адресов


    Самый простой способ заключается в подмене адресов базовых и пользовательских уровней. В этом случае при старте игры без пароля, программа считывает уровень 81, но идентифицирует его как 01.
    Для этого создайте уровни во встроенном редакторе «Designer»:


    Рис. 1. Создание пользовательских уровней в редакторе IMPACT.

    Как пользоваться редактором, я думаю объяснять не нужно. Кто хоть раз пробовал в нем что-нибудь создавать, тот сразу вспомнит. А потом начинается самое главное. Первым делом выставляем по адресу 48833 в команде сравнения CP 81, число 1, чтобы игра игнорировала сжатые уровни и сразу переходила к переброске пользовательских несжатых уровней в действующую карту игры:

    48833 --> 1

    Затем сменим стартовый адрес, откуда брать уровни. Этим адресом станет 41700. Для этого в команде LD HL, 26000 по адресу 48560, вместо 26000 нужно поставить 41700. Для этого сделайте:

    48560 --> 228
    48561 --> 162


    Уровней будет всего 10 штук, поэтому нужно выставить ограничение, чтобы после 10 уровня игра завершалась выходом в основное меню. Для этого в команде CP 80 по адресу 56106 поменяйте значение на 10:

    56106 --> 10

    Естественно при этом не забудьте исправить «ошибку 80-го уровня». Таким образом, у вас получится мини-игра из 10 уровней, которая будет запускаться по умолчанию без паролей. Недостаток такого метода очевиден.
    Можно немного усовершенствовать данный метод, и разместить уровни с адреса 26000. Таким образом, можно разместить почти 40 уровней. Но это тоже не совсем подходящий вариант.

    Вариант 2
    Создание запакованного массива


    Есть более совершенный способ, благодаря которому можно построить все 80 полноценных уровней. Но, как говорится в известной игре Duke Nukem: «А здесь придется попотеть!».
    Рассмотрим метод полноценной замены уровней, с помощью небольшого самодельного запаковщика, который я создал на заре освоения ассемблера. Попробуем вместе создать уровни. Параллельно я буду писать статью, создавая пошаговую инструкцию.
    Вначале во встроенном в игру редакторе, создайте нужное количество уровней. Разумеется, рисовать придется партиями по 10 штук.
    Создав 1-ю партию из 10 уровней, сохраните слепок памяти .z80. Откройте игру с сохраненными уровнями в эмуляторе EmuZWin (если создавали в другом эмуляторе) и дизассемблируйте массив с адреса 41700 по адрес 44479 включительно. Поставив галочку As Data Block, лучше установите точку на DEFB:


    Рис . 2. Подготовка к извлечению массива данных из игры.

    Текстовый полуфабрикат перенесите куда-нибудь, например, в блокнот и переименуйте, к примеру «Impact 01-10.txt»:


    Рис. 3. Перенос массива пользовательских уровней IMPACT в блокнот.

    Теперь очистите редактор или перезагрузите игру. Приступайте к созданию следующей партии уровней из 10 штук. Снова дизассемблируйте и создайте следующий файл с уровнями «Impact 11-20.txt». Вы можете сделать любое количество уровней, главное потом уложится в отведенное место в памяти, но об этом позже.
    После того, как вы создадите уровни, все эти массивы необходимо сжать, зашифровать и склеить. Для этого я предлагаю специальный компрессировщик собственного изобретения:

    ImpCoder-3.rar

    Очистите память эмулятора от игры и загрузите компрессировщик в EmuZWin (все время мне видится буква « l» в названии эмулятора, но на этот раз я написал это слово правильно). Программа запустится, и будет ожидать нажатия ENTER для начала шифровки данных. Ничего не нажимая, возьмите первый файл с уровнями «Impact 01-10.txt», откройте окно ассемблера, перенесите данные CTRL+C/CTRL+V и скомпилируйте ничего не меняя:


    Рис . 4. Компиляция массива данных с уровнями в память эмулятора.

    Массив данных должен записаться с адреса 41700. Теперь нажмите ENTER в программе-упаковщике:


    Рис. 5. Компрессия уровней и вывод информации о них.

    В результате работы, программа скомпонует в память с адреса 26000, первые 10 уровней игры и будет ожидать нажатия ENTER для обработки следующей партии. На экране вы увидите стартовые адреса и длину каждого уровня в сжатом виде. Эти данные будут Вам необходимы для дальнейшей разметки точек входа по паролям, поэтому запишите информацию по интересующим уровням. Теперь ничего не нажимая, аналогичным образом, скомпилируйте через окно «ZX Assembler++» следующий массив из файла «Impact 11-20.txt» и нажмите ENTER:


    Рис. 6. Компрессировка и склейка следующего массива с уровнями.

    Программа зашифрует и склеит следующую часть уровней, выдав на экран результат работы. Аналогичным образом зашифруйте следующую часть…
    Паковать и размещать свои уровни можно только по адрес 36800. Если вы видите по результатам, что все 80 уровней даже в запакованном виде могут сильно вылезти за обозначенный диапазон адресов, то лучше остановиться на меньшем количестве, например 70 штук. Вы можете в любой момент выйти из упаковщика и остановиться на требуемом количестве уровней, нажав клавишу BREAK.
    Если Вы немного не уложились в отведенный участок, это не страшно. Код игры позволяет выкроить килобайт с лишним верхних адресов памяти для базовых уровней. По окончании шифрования всех 80 уровней программа остановится с сообщением о номере версии и дате создания:


    Рис. 7. Окончание работы компрессировщика.

    Массив с адреса 26000 и по получившееся значение дизассемблируйте, оставив данные в окошке «ассемблера++».
    Теперь очистите память эмулятора от утилиты и запустите игру IMPACT. Допустим, вы создали все 80 уровней, и массив влез в допустимый диапазон. Для этого просто вставьте массив в игру, во время стартового меню:


    Рис. 8. Компиляция запакованного массива уровней в игру IMPACT.

    А что если склеенный шифрованный массив немного не влезает в указанный диапазон. Как тут быть? Выход один. Нужно дополнительно выделить память под базовые уровни. Если посмотреть в отладчике область памяти между BASIC системой и началом уровней, то видно, что там еще имеется некоторое свободное место.
    Таким образом, можно смело выжать еще 1400 байт и увеличить место для собственных уровней. Аналогично тому, как смещали адрес начала запакованных уровней с 26000 на 41700, теперь сместим его на 24600. Для этого сделайте следующее:

    48560 --> 24
    48561 --> 96


    Только учтите, что после этого из всех адресов, которые показывает кодировщик, нужно будет вычесть 1400.
    Но это не все. Вернее, игра уже будет работать, если непрерывно проходить с самого первого уровня. Но ведь программой предусмотрено 8 дополнительных точек входа, которые в игре выставлены с интервалом в каждые 10 уровней (11, 21, 31...). При этом, после прохождения предшествующего уровня, на экран выдается вспомогательный пароль из 4-х символов. Структура промежуточной точки входа по паролю состоит из 7 байт: 4 байта буквенно-числовой пароль, 5-й байт номер уровня для декоративного отображения во время игры и внутреннего счетчика. 6-7 байты это 2-х байтный адрес размещения извлекаемого уровня в стандартном формате. Эти адреса-явки-пароли данные последовательно располагаются в памяти с ячейки 46533:


    Рис. 9. Структура данных точек входа по паролям.

    На рисунке для удобства просмотра все точки входа я отделил красной чертой. В самом последнем блоке, мы видим точку входа для пользовательских уровней. Верхние 4 байта это слово USER, далее «декоративный» номер уровня, и значения 228 162, что соответствует физическому адресу 41700:
    Для удобства даю «причесанный» дизассемблер данной области, который можно модифицировать и компилировать в игру:

    ORG 46533

    DEFB 'EGGS', 11
    DEFW 27253
    DEFB 'CHIP', 21
    DEFW 28393
    DEFB 'LEAD', 31
    DEFW 29622
    DEFB 'TICK', 41
    DEFW 30895
    DEFB 'CASE', 51
    DEFW 32272
    DEFB 'FACE', 61
    DEFW 33525
    DEFB 'J.D.', 71
    DEFW 34906
    DEFB 'USER', 81
    DEFW 41700


    Следовательно, нужно выставить новые точки входа в средние уровни. Для этого из шифратора выпишите нужные значения для понравившихся уровней и вставьте вместо старых, которые уже неактуальны. Пароли также можете сменить на произвольные. Просто возьмите эту программу, модифицируйте, и оттранслируйте через «ZX-Assembler++» в игру вместе с компрессированным массивом.
    И последнее, о чем хочется упомянуть. Интервал между номерами уровней, когда должна появляться подсказка пароля. К сожалению, программа устроена так, что может отсчитывать равные промежутки между вспомогательными точками входа:


    Рис. 10. Программа установки интервала между подсказками вспомогательных паролей.

    Шаг между подсказками задается в адресе 56118 командой SUB 10. Если у вас уровней меньше, например 40, то целесообразно установить шаг между подсказками 5. Для этого необходимо сделать:

    56118 --> 5

    Ну и тогда необходимо установить новый предел, как говорилось в самом начале статьи. Для этого по адресу 56106 поставьте новое значение конечного уровня, чтобы по окончании последнего созданного уровня игра заканчивалась и выходила в главное меню. Пусть для примера будет 20:

    56106 --> 20

    Если упакованные уровни занимают не очень много места, то теоретически можно попробовать создать большее количество уровней, по крайней мере вывод изображения позволяет показать до 99. Для этого нужно выставить соответствующие значения в командах сравнения с пределом. Но на практике пока такое не проверял. Поэтому за результат поручиться не могу.
    В подтверждение вышесказанного, предлагаю готовый тестовый IMPACT с 20-ю базовыми уровнями, который я изготовил параллельно написанию данной статьи:

    IMPACT2016.rar

    Низ стартового меню подскажет, что это тестовая версия. Вспомогательные пароли установлены через каждые 3 уровня (4, 7, 10, 13, 16 и 19). В конце предшествующего уровня должен отображаться пароль на следующий блок. После 20-го уровня игра заканчивается. Также обратите внимание, что начальный адрес базовых уровней отодвинут с 26000 на 24600.

    Напоследок о недокументированных особенностях, которые нельзя реализовать в редакторе, так как он достаточно хорошо защищен от ввода нежелательных значений. Вручную можно экспериментировать с разными числами, и некоторые значения дают интересные эффекты. Скомпилируйте этот уровень в оригинальную игру и попробуйте поиграть:

    ORG 26000

    DEFB 67, 96, 2, 0, 0, 0, 15, 0
    DEFB 255, 255, 255, 255, 255, 255, 255, 255
    DEFB 255, 255, 2, 0, 56, 3, 224, 63
    DEFB 131, 254, 15, 224, 62, 0, 224, 2
    DEFB 0, 0, 0, 0, 0, 0, 0, 0
    DEFB 0, 0, 0, 0, 0, 0, 0, 0
    DEFB 0, 0, 0, 3, 3, 3, 3, 3
    DEFB 3, 3, 3, 3, 3, 3, 3, 3
    DEFB 3, 3, 3, 3, 3, 3, 3, 3
    DEFB 3, 3, 3, 3, 3, 3, 3, 3
    DEFB 3, 3, 3, 3, 3, 3, 3, 3
    DEFB 3, 3, 3, 3


    Желаю всем позитива, творческих успехов в построении уровней и хороших выходных.

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

    P.P.S. Возможны какие-то опечатки при переносе статьи на форум, поэтому заранее извиняюсь.

  4. #14
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,752
    Спасибо Благодарностей отдано 
    264
    Спасибо Благодарностей получено 
    279
    Поблагодарили
    207 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Yuri80, не раскрыт формат сжатия уровней
    С уважением,
    Jerri / Red Triangle.

  5. #15
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Yuri80 Посмотреть сообщение
    IMPACT Как создать свои уровни
    Очередная статья, которая отлично вписалась бы в формат блога!
    С уважением, Станислав.

Страница 2 из 2 ПерваяПервая 12

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Обсуждение: Тайна оператора EDIT
    от ivagor в разделе Корвет
    Ответов: 16
    Последнее: 05.12.2018, 15:17
  2. Тайна оператора EDIT
    от esl в разделе Корвет
    Ответов: 1
    Последнее: 20.05.2014, 14:02
  3. Ответов: 48
    Последнее: 25.06.2013, 01:24

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •