Как стать автором
Обновить

Комментарии 29

Теплый ламповый Dizzy. Помниться русские «клоны» X и Y мне достались уже под TR-DOS…
«ладно, давай сюда свои крэкеры иностранные» — алкаш про сухой корм для собак

О, эта игра у меня в ТОПчиках ходила на кассетах, действительно очень играбельно было, я потом ещё младшую сестру подсадил на прохожение квестов.

О, времена… Еще лежит у меня такая кассета

Надо оцифровать :)

Оцифровал — там не было ничего специфического, чего не было уже оцифровано энтузиастами группы vk.com/tapeversion
image
Традиционно спрошу, нет ли у кого алгоритма движения/прыжков Dizzy? Как в оригинальной игре изменялись координаты?
я думаю там были таблички с координатами движения, обычно так делали для всяких скроллингов, т.к. считать sin&cos на 8-битном процессоре в реальном времени как то не комильфо.
Всё может быть. Но довольно много народу сделали Dizzy в РФ. Вот бы кто-нибудь из них и рассказал, как перемешается персонаж. Мне там всё интересно. Как он поднимается, как отскакивает от стенок и препятствий (помните, шажок не угадали, откуда прыгнуть, и Dizzy скачет мячиком куда не надо), как кувыркается на месте.
Это уже механика игры, думаю сейчас ничего не изменилось, обычно если фона не было, то проверяли на границы экрана и присутствие пикселей, если фоны есть, то уже можно сверяться с картой уровня, например для простоты сделанной как карта знакомест(то что отвечает за цвета на zx spectrum), а кувыркается на месте, это по сути спрайты, заранее рисовали, а потом уже делали анимацию, сменой спрайтов, на спектруме изображение формировалось в памяти, не было никаких сопроцессоров, как например на денди.
Обычно когда хотелось посмотреть что и как работает, брался STS и изучался код :), так и учились.
По ступенькам он поднимается следующим методом. Диззи делает шаг вбок (если высота стенки не больше чем N пикселей). Внезапно внутри него оказывается ступенька, движок выдавливает его наверх.
Разумеется мы собирались делать свой Диззи, поэтому я понемногу начал разбираться в этом. Правда потом всё затихло.
На самом деле, не особо сложно сейчас взять какой-нибудь Диззи 3.5 и разобраться в движке. Он не очень большой по размеру, там мало графики, зато есть полный набор движений, прыжков и всего такого.
так код доступен же. на прерывании по таймеру он висел, насколько я помню. не такой уж он мудреный был, я чет копался в нем в детстве
Я в начале 90-х на денди видел игры с целым порядковым числом. Например: боевые жабы 1, боевые жабы 2. Но как-то пришел к товарищу и там его кореш через кассету заливает в какой-то спектрум dizzy 1.2. Мой мир был сломан — я и понятия не имел — как это версия игры может быть не целым числом))
А потом dizzy досталась мне на денди — вот я тетрадку исписал как мне эти квесты проходить. Так и не победил. А в нашем поселке буклеты типа: секреты 1000 игр денди — не достать. Интернета не было. Выживали как могли))
Тёплое ламповое детство.
Dizzy 1.2? Впервые слышу. :) Я только Dizzy 3.5 знаю.
Причём это была не полноценная игра, а короткая интермедия в пару экранов.
Это которая 3.5. А вот что за 1.2…
Ну версию я образно назвал. Всё таки почти 30 лет назад дело было. Просто школьник о версионности знал что есть версия игры 1 и вторая часть. А тут дробная. Молодой мозг тогда сопротивлялся — «как такое может быть?»))
А они случайно не рассказывали как им пришла мысль сделать этот чортов мост в Диззи 1? Уверен много клавиатур было сломано от злости, когда до конца прохождения оставалось пара действий, но ты ошибся с прыжком.

Ссылка на оригинал не открывается.

Оригинала в сети нет — там ссылка на сайт издательства. Журнал можно скачать из архивов.

одна из интереснейших игр детства. в жанре "принеси-подай" так точно! :) очень нравилась неочевидность но логичность заданий.

Списывался с братьями года 3 назад, обменялись подарками. Прислали мне вот такой интересный артефакт


Еще есть некоторое количество сканов их рабочих записей. А вообще можно купить отличную книгу The Story of The Oliver Twins
Кажется в Д2 есть комната с плашкой «привет читер». Случайно нашли, когда исследовали возможности движка.
Официальный Dizzy 8 прямо очень крутой по графике. Вроде железо то же самое, но арт дизайн продвинулся за эти годы.

Ностальгия! Как сейчас помню, как проходил яйцо на спектруме. Fantasy World которая.
Были потом попытки играть в Dizzy на ПК (были версии) или на эмуляторе — но это все не то уже

Я начал делать свою игру про Диззи.



Если кому интересно, проект будет развиваться тут:

Редактор карт (под Qt 5.7).

Сама игра про Диззи (MFC).

В репозиториях исходники, графика, карты и исполняемые файлы.

В данный момент реализована анимация (пока в редакторе в режиме вставки тайла можно нажать Insert и откроется окно анимаций; из других клавиш работает delete в режиме выбора и escape при вставке блока тайлов). В самойже игре сделана прокрутка экранов, добавлены кувырки (если Диззи падает на голову, он продолжает движение с перекатыванием), а анимацию игра и так поддерживала изначально (только редактор её не мог сделать).
Разработка продолжается и, возможно, когда-нибудь я доделаю игру. :)
А сейчас всё это выглядит уже так. И это уже практически полноценная игра (точнее, движок).



Диззи уже может погибнуть. :)

Принцип работы движка следующий. Весь мир разбит на тайлы 16x16. Тайлы могут иметь имена. Всё взаимодействие описывается через эти самые имена тайлов. Сценарии игры лежат в папке ScreenPlay в обычном текстовом виде. При запуске игра сканирует этот каталог и все сценарии (они могут называться как угодно) добавляет в условия игры.
Возможны сейчас следующие условия:
1) Пересечение тайла с Диззи: IfDizzyIntersection(«CAT») — данное условие сработает при столкновении с тайлом с именем «CAT».
2) Пересечение тайлов между собой. IfIntersection(«FIRE_LEFT»,«FIRE_LEFT_BORDER») — данное условие сработает при столкновении тайла «FIRE_LEFT» с тайлом с именем «FIRE_LEFT_BORDER» (это движущийся влево огонь и граница его перемещения).
3) Взятие тайлов в инвентарь (да, Диззи нужно отдельно разрешать что-то брать — могут быть неберущиеся предметы, как это было с мечом в камне из Диззи-4 — взять его можно только используя «липкие руки»): IfPickUp(«RING») данное условие сработает при попытке взять тайл «RING».
4) Срабатывание таймера: IfTimer(«WAIT CAT») — данное условие сработает для тайла «WAIT CAT „при срабатывании таймера.
5) Использование тайлов между собой: IfUse(“BOTTLE WATER»,«CAT») — данное условие сработает при взаимодействии тайла с именем «BOTTLE WATER» на тайле «CAT».

На данный момент это все возможные условия. Потом, может быть, появятся новые.

Когда условие сработало, выполняются какие-то действия (Action). Для некоторых условий действия только для одного тайла, а для других нужно описывать действие для двух тайлов ( скажем, при столкновении нужно задать каждому столкнувшемуся, что произойдёт с ним)
Этих действий много. Сейчас они такие:
1) ActionMessage(20,100,«СООБЩЕНИЕ») — будет выведено сообщение в заданнх координатах. Да, экран в Диззи 320x240, растянутый до 640x480 для PC.
2) ActionChangeName(«BOTTLE OF WATER») — поменять тайлу имя на заданное. Зачем нужно? Бежал у вас огонь до границы влево и теперь должен бежать в право. Как это сделать? Поменять ему имя. И для другого имени сделать уже условие контроля правой границы и условие таймера с событием изменения координаты в другую сторону.
3) ActionChangeDescription(«БУТЫЛКА ВОДЫ») — заменяет описание предмета, которое выводится в инвентаре. Была у вас бутылка пустая, а стала с водой. Имя вы поменяли. А теперь надо описание для инвентаря поменять.
4) ActionChangeGlobalName(«BOTTLE OF WATER») — поменять имя для ВСЕХ тайлов с таким же именем на карте. Зачем нужно? Если картинка состоит из ряда тайлов (скажем, фигура Волшебника), то изменяет его состояние все его тайлы, а не только та часть, с которой вы взаимодействовали.
5) ActionChangeGlobalDescription(«БУТЫЛКА ВОДЫ») — так же меняет глобально все описания.
6) ActionChangePosition(100,100) — задать тайлу позицию в числах. Неудобно для использования. Не гибко.
7) ActionCopyPosition(«RING»,«RING_POS») — перенести позицию первого тайла на место второго. Например, когда кот вам даёт кольцо, он переносит кольцо из некой области карты (вам не видимой — вы там не будете гулять) в заданную позицию.
8) ActionPickUp() — добавляет тайл в список возможных для взятия в инвентарь.
9) ActionSingle() — однократное действие. Зачем нужно? Диззи коснулся тайла воды. Должен терять энергию. Но вот беда, коснулся он нескольких тайлов воды. Совершенно незачем для каждого тайла отнимать у Диззи энергию. Вот это действие и выполнит для данного события действия стоящие следом ровно один раз.
10) ActionSetAnimationStep(1) — устанавливает шаг анимации (анимация обычно в этом случае есть, но остановлена в редакторе). Позволяет менять картинку одного тайла на другой. Была бутылка без воды, стала с водой.
11) ActionMove(1,0) — изменяет координату тайла на заданные приращения по X и по Y. Именно с помощью этого действия и движется, например, тайл огня.
12) ActionSetEnabled(true) — задаёт разрешён тайл или нет. Если нет, он удаляется с игрового поля. Так можно избавляться от ненужных предметов и персонажей.
13) ActionEnergyUpdate(-1) — изменяет энергию Диззи.
14) ActionAddScore(100) — изменяет очки Диззи. Кстати, можно и уменьшать.
15) ActionAddLife() — добавляет Диззи жизнь.
16) ActionAddItem() — увеличивает счётчик найденных предметов на 1 (в Диззи-6 Диззи собирал вишенки, например).

Начало и конец блоков действий описывают:
ActionBegin
ActionEnd

и

ActionFirstBegin
ActionFirstEnd
ActionSecondBegin
ActionSecondEnd.

Есть ещё команды, выполняемые до начала игры и к действиям и условиям не относящиеся:
1) SetDescription(«BOTTLE WATER»,«БУТЫЛКА ВОДЫ»)- задать описание.
2) CopyPosition(«FIRE»,«FIRE_POS») — перенести тайл в позицию другого тайла.
3) SetDizzyPosition(«DIZZY_START_POSITION») — перенести Диззи в позицию тайла. Позволяет задать место старта.

Особый тайл имеет имя «RESPAWN» — его нужно ставить там, где Диззи может погибнуть. Тогда Диззи возродится у ближайшего такого тайла.

Пример сценария:

IfUse(«BOTTLE WATER»,«WAIT CAT»)
ActionFirstBegin
ActionChangeGlobalDescription(«ПУСТАЯ БУТЫЛКА»)
ActionChangeGlobalName(«BOTTLE»)
ActionSetAnimationStep(0)
ActionFirstEnd
ActionSecondBegin
ActionSingle()
ActionChangeGlobalName(«LUCKY CAT»)
ActionCopyPosition(«RING»,«RING_POS»)
ActionMessage(30,100,«ДИЗЗИ ДАЛ БУТЫЛКУ ВОДЫ КОТЁНКУ...»)
ActionMessage(40,80,«БУЛЬК-БУЛЬК!\СПАСИБО! ЗА ЭТО Я ДАМ ТЕБЕ\КОЛЬЦО. Я ЕГО ГДЕ-ТО СПЁР.»)
ActionAddScore(100)
ActionSecondEnd

Или вот:

IfDizzyIntersection(«FIRE_LEFT»)
ActionBegin
ActionEnergyUpdate(-1)
ActionEnd

Ну вот, вроде бы и весь язык. :)
Олег Ориджин


Таинственный разработчик, которого так хотел увидеть ведущий канала SincLair, что провёл расследование, результатом которого было недоумение. :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории