Кайф! Очень-очень круто! %)
Правка:
Они ещё и исходники выложили для таких же отбитых :)
Круто, круто! Надо заценить на эмуле и потом еще отписать впечатления...
P.S.
Чуток погамал. Да, всё так и есть - довольно играбельно для платформы, правда жёсткость геймплея старорежимная - отмудохали меня с непривычки в третьей же подворотне.
Тем не менее качество сразу же чувствуется.
Образ с игрой можно скачать тут: http://idpixel.ru/games/m/mightyfinalfight/files/mff_v1.0.tap.zip
Исходники там же лежат по следующей ссылке: http://idpixel.ru/games/m/mightyfinalfight/files/mff_source.zip
Пойду глядеть в последние...
P.S.
В общем посмотрел исходники - реальный, комплексный проектище, со дозагрузками, кучей ресурсов, причём как я понял всё что нужно для компиляции, возможно даже редактирования ресурсов и далее эмуляции вложено в архив же.
По коду полазил - видно что всё структурированно нормально так.
Смещения до полей в объектах описаны в main.asm:
;дескриптор объекта object.ycord equ 0 ;координата y в локации в пикселях (2 байта) object.xcord equ 2 ;координата x в локации в пикселях (2 байта) object.yoffset equ 4 ;высота объекта над поверхностью, вычитается из ycord (1 байт) object.type equ 5 ;тип объекта (1 байт), если равно #00 - нет объекта object.animation equ 6 ;номер текущей анимации (1 байт) object.frametime equ 7 ;счетчик продолжительности вывода кадра (1 байт) object.composition equ 8 ;адрес текущей композиции (2 байта) object.xaccel equ 10 ;скорость перемещения объекта по координате X с учётом направления (-127;127) (1 байт) object.yaccel equ 11 ;ускорение объекта по координате Y (гравитация) (1 байт) object.hits equ 12 ;счетчик непрерывно попадавших в цель ударов (1 байт) object.animadr equ 13 ;адрес начала анимаций объекта (2 байт) object.animpage equ 15 ;страница начала анимаций объекта (1 байт) object.faze equ 16 ;текущая фаза (1 байт) (для врагов) object.twistercnt equ 16 ;счётчик для суперудара "твистер" (1 байт) (для героев) object.energy equ 17 ;жизненная энергия объекта (1 байт) object.maxenergy equ 18 ;максимальная жизненная энергия объекта (1 байт) object.hitpower equ 19 ;сила текущего удара (1 байт) object.cntr equ 20 ;счётчик общего назначения (1 байт) object.itemkind equ 20 ;(для Items) вид Items (1 байт) object.rage equ 21 ;накопленный Rage (1 байт) object.itemprop equ 21 ;свойства Item, берется при создании из yoffset(1 байт) object.stamina equ 22 ;выносливость, если больше 150, то герою наносится критический урон (1 байт) object.undeadcntr equ 23 ;счётчик бессмертия (1 байт) object.enemyobject equ 24 ;адрес вражеского объекта (2 байта) object.movecord equ 24 ;координаты, к которым стремится враг во время 5-ой фазы или герой в режиме скрипта object.damagearea equ 24 ;размеры коллайдера поражения у Items (2 байта) object.weapon equ 26 ;оружие героя, количество (1 байт) object.itemspeed equ 26 ;скорость перемещения у Items (1 байт) object.status equ 27 ;статус объекта (2 байта) object.scriptadr equ 29 ;текущий адрес описателя скрипта (2 байта) object.scripttype equ 31 ;текущий тип скрипта (1 байт) ;статусы IS_DIRECT equ 0 ;направление объекта по горизонтали (0 - вправо, 1 - влево) IS_DAMAGE equ 1 ;объект получил повреждение IS_NOINT equ 2 ;проигрывается анимация, которую нельзя прерывать IS_THROW equ 3 ;объект бросили IS_CRITDAMAGE equ 4 ;объект получил критический удар IS_CAPTURED equ 5 ;объект захвачен (для вражеских объектов) IS_SUPERMOVE equ 5 ;объект в движении во время супер удара (для героев) IS_SUPERDAMAGE equ 6 ;объект получил супер удар (либо героя ударили сзади) IS_SCRIPTMODE equ 7 ;объект в режиме скрипта IS_DIRENEMY equ 8 ;с какой стороны подходит к врагу IS_UPDOWNENEMY equ 9 ;уходить с линии атаки вверх или вниз IS_ENEMYCAPTURE equ 10 ;захвачен враг IS_SUPERHIT equ 11 ;объект наносит супер удар IS_CRITHIT equ 12 ;объект наносит критический удар IS_KNEE equ 13 ;объект наносит удар коленом IS_FALLDEEP equ 14 ;объект падает в пропасть IS_BLOCK equ 15 ;объект в состоянии блока object.lenght equ 32 ;размер описателя объекта object.maxnum equ 8 ;максимальное число объектов
В процедуры работающие с объектами указатель на дескриптор объекта передаётся в IX, а иногда в IY что весьма логично для платформы:
;бросок объекта event_throw ld (ix+object.yaccel),-25 ld a,(ix+object.status) xor 1 ld (ix+object.status),a ret
или вот в macroses.asm макрос по установке статуса объекта (статусы типа IS_BLOCK это номера бит в 2-байтовом поле статуса):
;включить свойство MACRO set_status property IF property < 8 set property,(ix+object.status) ELSE set property-8,(ix+object.status+1) ENDIF ENDM ;включить свойство (IY) MACRO set_enemy_status property IF property < 8 set property,(iy+object.status) ELSE set property-8,(iy+object.status+1) ENDIF ENDM
В общем да, >300 Кб одним только asm-исходников + куча ресурсов как в исходном так и в бинарном виде. Респект и уважуха.
Какая-то запущенная стадия ностальгирования.
Зачем тратить столько усилий на безнадёжно устаревшую платформу?..
Хотя, как говорится, чем бы дитя не тешилось, лиш бы не плакало.
Zx
> Зачем тратить столько усилий на безнадёжно устаревшую платформу?..
Ник интересный... когнитивный диссонанс у меня
Zx
> Зачем тратить столько усилий на безнадёжно устаревшую платформу?..
Да потому что очередное мыльное кинцо на актуальные платформы больше никого не задевает
0iStalker
> больше никого не задевает
Я почти уверен, что данная игра не задела никого младше 21 года. Потому как она вся обыгрывает воспоминания, которых в таком возрасте быть не может.
Zx
> Я почти уверен, что данная игра не задела никого младше 21 года. Потому как она
> вся обыгрывает воспоминания, которых в таком возрасте быть не может.
Сходи лучше подоказывай филателистам, что они прожигают жизнь на всякую хрень несусветную или любителям посмотреть аниме, что гораздо продуктивнее в это время заняться фрилансом и заработать на яхту, больше толку выйдет.
=A=L=X=
Кто способен фрилансом заработать на яхту, тот и аниме успеет посмотреть столько, сколько не успеет посмотреть тот, кто не способен заработать фрилансом на яхту.
beejah
> аниме успеет посмотреть
Если будет смотреть аниме - не заработает на яхту. Надо уметь расставлять приоритеты и не прожигать жизнь на многокадровые порисушки каких то япошек взбаламошенных.
В 90-х игра имела бы колоссальный успех, сейчас удивлен что еще живы люди которые это умеют делать.
gamedevfor
> сейчас удивлен что еще живы люди которые это умеют делать
Так сейчас то как раз делать такое проще чем тогда намного. Тулзы, компили, отладка в эмуляторе - всё легко и просто достаётся. Да и ассемблер с современной точки зрения совсем простенький, недаром с чего то типа 8080 в институтах его и преподают обычно.
=A=L=X=
И тогда писали что игры под ZX делали на PC. На самом ZX делали только народные умельцы.
gamedevfor
> И тогда писали что игры под ZX делали на PC.
Несомненно когда есть более мощная машина с более удобным софтом - делать на ней то или иное удобнее, чем на оригинале.
Так например даже Doom по большому счёту делался на несовместимом с IBM PC компьютере от Стива Джобса (после изгнания из Apple) - NeXT. А на IBM PC оттуда был сперва портирован рендер, а уже потом и утилиты.
Ну или там 3D-модельки и статичные рендеры раньше тоже для игр на разных совершенно платформах, включая IBM PC, создавали на станциях Silicon Graphics - и так далее.
Эта практика неудивительна. Но PC в годы актуальности Speccy не мог запустить игру на спектруме - эмуляторов то вообще не было, поэтому финальный продукт тестировался на реальном железе и с отладкой тут было не очень всё.
Сейчас в эмуляторах можно быть вообще богом отладки и мониторить весь ПК как свои пять пальцев. Раньше для таких удобностей надо было монструозный DevKit собирать, я даже не уверен что с ZX такие были вообще.
Тема в архиве.