Перейти к содержимому

vladikcomper

Пользователи
  • Публикации

    947
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    9

Все публикации пользователя vladikcomper

  1. Конечно, они же были в Адвансах. Но как видно, в Sonic 2 Retro Remix эти спрайты перерисованы в классическом стиле. Способность можно назвать по-разному, первое, что пришло в голову - Sonic Whirl
  2. SONIC2010, твой мини-хак очень приятен. Не смотря на то, что это по сути оригинал с новыми способностями, я с интересом пробежался по Грин Хиллу. Больше всего понравился Double Jump, может, потому что это довольно свежая идея, которую встретишь не в каждом хаке. У тебя очень хорошая реализация, в то время как многие копируют технику Дабл Джампа с Мегамикса, у тебя что-то действительно новое. Анимация выполнена замечательно, как вижу, ты еще нарисовал переходный кадр от анимации подъема к анимации падения, с ним все смотрится еще лучше. А вот это не совсем хорошо. Думаю, ты сам понимаешь. Не то, что бы это запрещено, это просто выглядит как неуважение к труду других людей. Конечно, тебе решать, но кража контента не приветствуется во многих иностранных комьюнити. Впрочем, ты уже сам знаешь по опыту с SSRG. Не исключаю также, что авторы хака взяли эти спрайты из какого-нибудь свободного спрайтового ресурса. В любом случае рип их из хака не будет разумным поступком.
  3. В коде инициализации уровня есть такой цикл: Level_TtlCard: move.b #$C,($FFFFF62A).w bsr.w DelayProgram jsr ObjectsLoad jsr BuildSprites bsr.w RunPLC_RAM move.w ($FFFFD108).w,d0 cmp.w ($FFFFD130).w,d0; has title card sequence finished? bne.s Level_TtlCard; if not, branch tst.l ($FFFFF680).w; are there any items in the pattern load cue? bne.s Level_TtlCard; if yes, branch jsr Hud_Base Он проверяет две вещи: 1) Title Cards уже полностью появились? Если нет, бранч на Level_TtlCard для зацикливания. 2) Все команды загрузки сжатого арта выполнены? Если нет, тот же бранч в начало цикла. Скорее всего, у тебя не выполняется второе условие, и игра входит в бесконечный цикл. Из-за чего это? Какой-то баг, связанный с очередью команд PLC. Очередь наполняется командами на загрузку арта, а потом игра этот арт загружает параллельно с игровым процессом, постепенно свобождая очередь - удаляет из нее уже выполненные команды. В один прекрасный момент команды кончаются - все загружено, очередь пуста, тогда-то тот самый Level_TtlCard и выходит из цикла. Очередь занимает память в диапозоне $F680-$F6FF. Очевидно, она не резиновая, и рано или поздно может переполнится. Код очереди в Соник 1, как и в Соник 2 до ума не доведен, во-первых, он не проверяет переполнение, во-вторых, помнится, в нем есть программная ошибка, из-за которой она работает с меньшим количеством записей, чем изначально рассчитана. С переполнением очереди особо не поборешься - врядли удастся найти свободный блок памяти длиной более $A0 байт. Если тебе хочется загрузить больше арта, можно грузить напрямую: vram $B000 ; <-- куда грузить lea (Art_my).l,a0; <-- что грузить bsr.w NemDec Этот код можно разместить, например после jsr Hud_Base
  4. SonMapEd такого не может, на это есть дизасемблы: http://info.sonicretro.org/Disassemblies В них все данные распределены по файлам, именно в такие файлы данные и сохраняет SonMapEd. Потом компилятором (поставляется с дизасемблом) все компилируется в РОМ.
  5. Это же для фан игр, поэтому форматы файлов рассчитаны Multimedia Fusion, The Games Factory и пр. Однако обычные картинки тоже есть, надо в графе Format выбрать Sheet.
  6. Может, авторы хака S2RR сами их рисовали. Подобные спрайты можно поискать, например здесь: http://www.sonicfangameshq.com/sprites.html
  7. Готовой роутины для этого в игре не предусмотрено, ее придется писать вручную. Если не знаешь, как составлять алгоритм, его можно посмотреть в суброутине TouchResponse (проверка столкновения Соника с объектом).
  8. Здесь все впорядке, так как нажатия кнопок загружаются в регистр d0 и код уже оперирует им. Если конечно после этого нет команды типа move.b d0,($FFFFF602), но это вряд ли. Попробуй еще проверить адрес $FFFFF604, из него копируются кнопки в $FFFFF602, если управление игроком не заблокировано. Если и с ними все в порядке, то проблема в другом (тогда будет странно, что прыжок фиксированый). Еще одна моя догадка - не работает понижение "гравитации" под водой: btst #6,$22(a0); is Sonic underwater? beq.s loc_12EA6; if no, branch subi.w #$28,$12(a0) Это в Obj01_MdJump и Obj01_MdJump2. Может ты бы видео с глюком записал? А то со слов не всегда видно проблему во всех деталях, сложно сказать, что именно случилось.
  9. Да в любом месте. Если ты писал новые процедуры, проверял в них нажатия кнопок, посмотри их, вдруг в них ошибка.
  10. Теперь суть проблемы проясняется. Если высота фиксирована, значит Sonic_JumpHeight по каким-то причинам не видит, что кнопка прыжка удерживается, считает что она отпущена. Если кнопка отпущена, а Соник только начинает свой прыжок, скорость прыжка, а значит и его высота, урезаются. theld A+B+C,(SonicControl); is A, B or C pressed? bne.s locret_134C2 ; if yes, branch move.w d1,$12(a0) Последняя строчка урезает вертикальную скорость до -$400 на земле и -$200 под водой. Судя по всему, код с первого же вызова считает, что кнопка отпущена, и урезает скорость. Скорее всего, это получается из-за того, что ты переписал или случайно очистил битовое поле SonicControl|Held (оно ссылается на адрес $FFFFF602). Например, если у тебя в коде есть команды, наподобие: andi.b #<что-то>,(SonicControl|Held) andi.b #<что-то>,(SonicControl); эквивалентно предыдущей andi.b #<что-то>,($FFFFF602).w ; эквивалентно предыдущей move.w #<что-то>,(SonicControl) то у тебя очищается/переписывается битовое поле с удерживаемими кнопками, что приводит к таким багам.
  11. Кат-сцены, может будут. Это станет ясно, когда уровни игры примут более законченный вид. Вменяемого сюжета скорее не будет, так как я просто делаю хак с забавными боссами, никак не проект с глубокомысленным развитием событий.
  12. Включи Auto Fix Checksum
  13. Этот хак смело можно назвать одним из лучших русских хаков. Несмотря на свою сыроватость, он великолепен. Уровни, графика и новый HUD придают игре абсолютно новую атмосферу, музыка тоже приятно, с удовольствием прошел уровни несколько раз. Единственное, что огорчило - наличие пропастей, в которые иногда можно упасть, хорошо что лампосты расставлены разумно, и можно без труда начать недалеко и места смерти. Очень приятно видеть измененные объекты. Кажется, в новой версии они стали еще умнее (в старых демках платформы поднимались до бесконечности, насколько помню). Боссы вообще суперскими получились, не говоря уже про целый акт MZ3 - он эпичен =) Босс MZ3 очень сложен, но интересен, как и сам акт. Я едва прошел его даже со сейвстейтами, зато получил от прохождения массу удовольстия. К сожалению, в хаке еще остались проблемы с прошлых демок: зона выбора уровней работает только в Генсах, хак вылетает на Регене. Поскольку мне было скучно, решил узнать причины проблем и пофиксить их. Так что встречайте исправленную версию хака =Р http://vladikcomper.narod.ru/download/Sonic_TG_Demo_4.7z (Зона выбора уровней работает в Кеге, хак теперь частично работает в Регене.)
  14. Нет, под водой Соник прыгает так же высоко, как и на земле. Мне как раз довелось в этом недавно убедиться. Несмотря на то, что ему задается меньшая скорость при прыжке под водой, она полностью компенсируется меньшей "гравитацией" в воде (даже при скорости $200 можно прыгнуть так же, как на земле, при скорости $400 прыжок получится слишком высоким. TailsX-Doll, расскажи подробнее, когда это случилось, после каких действий. Как выглядит этот низкий прыжок? Его высота фиксирована или зависит от того, как долго держать кнопку прыжка? Нормально ли Соник ведет себя под водой (кроме низкого прыжка)?
  15. http://narod.yandex.ru/disk/8347228001/S1H..._zipspecial.zip
  16. Даже не знаю, чем тебе помочь. Я никогда не занимался хакингом SMPS (и музыкальным хакингом вообще), так что не вникал в него и не изучал его исходники. Могу только посоветовать откопать на ретро оригинал гида (если ты пользовался переводом), может, в переводе была неточность или что-то пропущено, или в гиде была описка, которая могла бы быть давно исправлена.
  17. К сожалению, я не читал гид и не имею представления о минусах и плюсах изложенного там метода, зато я могу предложить альтернативный способ, которым пользуюсь сам. Не знаю, лучше он или хуже, но по другому делать я не пробовал =Р Итак, недавно я нарисовал красивую картику, и мне надо было сделать из нее спрайт для игры. Я действую весьма своеобразным способом, результат при хороших навыках получается самый идеальный (лучше, чем может сгенерировать SonMapEd при импортировании), но много работы придется проделать вручную. На картинке выше - наглядное воссоздание моего способа. Моя замечательная картинка симметрична, поэтому я избавился от нижней части - ее можно будет отразить в SonMapEd'e. Потом я прикинул, на какие кусочки (pieces), можно разбить спрайт. То, как разбивать, зависит ситуации, надо найти "золотую середину" - чтобы спрайтов было немного, и много пустых тайлов в них не попадало. Впрочем, со спрайтами Соника это не так важно, они небольшие. Далее, я раскладываю каждый спрайт на тайлы, вручную. Это не сложно, если знать, как строятся спрайты (это можно подсмотреть в SonMapEd'е). В моем случае, я вначале разложил на тайлы крайний левый кусок, потом левый верхний, потом большой слева. Остальные три кусочка мне раскладывать лень, это же только воссоздание того, что я делал. Когда все готово, набор тайлов я сохраняю в отдельный файл и портирую Imagenesis'ом в обычные несжатые тайлы. Если речь о добавлении Сонику нового спрайта, то получившиеся тайлы просто добавляются в конец artunc\sonic.bin в HEX-редакторе. Потом, все загружается в SonMapEd, и начинается самая приятная часть - сборка картинки из готовых кусочков :)
  18. Каким образом ты удалял их данные из Pattern load cues.asm? Если удалять целые блоки с лейбелами или убирать их из списка, вполне может получиться такая вот путаница с артами в игре. К сожалению, нельзя прописать в блоке, что ничего загружать не надо, так как даже 0 в начале блока говорит, что нужно выполнить одну команду и т. д. Самый лучший способ избавиться от арта животных, удалить в коде место, где игра загружает их арт. Арт животных загружает Title Cards в процедуре Obj34_ChangeArt, закоментируй нужные строчки, и их арт больше не загрузится. Найти нужный код просто. Из справочника по RAM адресам узнаешь, какой адрес у счетчика кислорода: $FE14 Оставшийся воздух (работает под водой) Где-то этот счетчик должен уменьшаться, то где-то должна быть команда subq.w #1,($FFFFFE14).w. Ищещь в коде эту команду и натыкаешься на: Obj0A_ReduceAir: subq.w #1,($FFFFFE14).w; subtract 1 from air remaining bcc.w Obj0A_GoMakeItem; if air is above 0, branch Нужный код найден! Что делать дальше, думаю, ты разберешься =Р У тебя бранч не тот. Бранчи bcc/bcs очень коварны, многие в них путаются, используют неправильно, из-за их туманных для новичков определений: BCS - Branch if Carry Set BCC - Branch if Carry Clear Объяснять их значения очень долго, и чтобы их понять, нужно иметь представление о Condition Code Register и о том, что CMP - это на самом деле неявное вычитание, для сравнения чисел, первое вычитается из второго, однако результат операции в отличие от SUB никуда не записывается, только лишь затрагивает CCR (Condition Code Register). По битам CCR бранчи могут определить, какое число меньше, какое больше и пр. Какой все же АСМ гениальный :) Пока тебе лучше запомнить вот так: cmpi.w #$XX,($FFFFFE20).w bcc Location ; Кол-во колец больше или равно $XX bcs Location ; Кол-во колец меньше $XX Как видишь, ты пытался бранчить, если у Соника колец меньше, чем 0. Этого никогда не будет, поэтому бранч не работал. Лучше просто использовать beq. cmpi.w #0,($FFFFFE20).w beq Location ; Если кол-во колец равно 0, переход
  19. move.b #4,($FFFFF600).w
  20. Ребят, ну зачем пасхалки палить? Так же неинтересно будет.
  21. Есть классный гид на эту тему: http://sonicresearch.org/forums/index.php?showtopic=1783
  22. Хак заметно похорошел с прошлого релиза. Очень понравилось, что в хаке несколько персонажей, и у каждого свои особенности. Только смущает внешний вид Ашуры, я, конечно, не особо знаком с этим персонажем, и даже точно не представляю как он выглядит, но это черное пятно (перекрашенное освещение на голове) создает ощущение, что это глюк палитры у Соника. Еще небольшое неудобство - физика двойного прыжка у Майти, точнее то, что обнуляется горизонтальная скорость. Может быть, лучше просто уменьшить ее в два раза? Так как при двойном прыжке на больших скоростях выглядит неестественно и неожиданно. Уровни сделано хорошо, плохих мест не заметил, напротив, и было приятно проходить, особенно Соником и Ашурой. А новые графические изменения создают полную атмосферу ночи. Музыка тоже приятная, особенно с новыми хорошими сэмплами =) А еще порадовали изменения некоторых звуков, звуки взрывов хоть и звучат странно, но послушать их интересно - не в каждом хаке увидишь такое. Еще заметил баг - у меня вылетает FZ на Кеге. И на Генсе. И тем более, на Регене. Причина тому, как сообщает достоверный Реген - Address Error. Но в целом, все замечательно. Жду следующей версии хака, интересно будет посмотреть на новых боссов.
  23. Чтобы требуемая вещь получилась, нужно знать, что делать, иметь достаточно хорошие познания в той или иной области движка. Существует бесконечное множество решений (и их вариаций) на разные проблемы, если речь идет о модификации игры, то здесь необходимо иметь некоторое представление о работе движка игры и немного опыта по его использованию. Скажи, что ты пытался делать и как ты умудрился перепробовать буквально все? "Безрезультатно перепробовать все" обычно говорят люди, которые не имеют полного представление о том, каким образом можно сделать эту вещь. В этом случае шанс на успех приближается к нулю. Постараюсь помочь тебе разобраться с этим. Тема, которую ты затронул на самом деле очень сложна. От тебя потребуется глубокое познание движка и хорошие знания АСМа. Разместить Соника левее нулевой координаты по оси Х невозможно. Во-первых, там нет чанка, на котором можно стоять. Во-вторых многие роутины игры работают с его координатой как с беззнаковым числом, поэтому они сочтут, что Соник переместился за левую границу уровня, а находится далеко-далеко справа. Очевидно, чтобы обойти эту ситуацию, нужно сдвигать камеру вначале уровней, чтобы ее позиция была не $0000, а, например, $0040 (64 пикселя правее), тогда Соника можно разместить в самом начале уровня, и это начало будет за левой границей камеры. Другая проблема - наличие самой границы, она же ведь не дает Сонику зайти за пределы камеры, и даже если разместить его левее, граница сработает, и немедленно откинет Соника в пределы камеры. Границу придется временно отключать, когда Соник выбегает слева. Делается это в коде Sonic_LevelBound. Для этого можно сделать какой-нибудь флаг, подобно флагу $FFFFF7AA, который позволяет Сонику заходить за правую границу камеры. Ну и самое главое - заставить Соника, собственно выбегать. Для этого помимо позиции, ему нужно задать скорости. Его стартовое положение задается в LevSz_StartLoc, можно добавить в массив StartLocArray еще и скорости и работать с ними. А заставить Соника бежать совсем просто: Блокируешь управление с джойпада - move.b #1,($FFFFF7CC).w Имитируешь нажатие требуемых кнопок, если у тебя дизасембл S1HS2 то синтаксис команды будет понятным: move.w #Right<<8,(SonicControl). Только надо не забыть еще потом это управление разблокировать. Это сделать можно миллионами способов, если ты отлично разбираешься в АСМе и смог успешно реализовать все до этого шага, тебе это не составит труда. =Р
  24. Прогресс разумеется есть, и большой, не стоит волноваться по этому поводу. Я обязательно покажу обновления, когда сочту нужным. Пока еще слишком рано, не надо требовать их раньше времени.
  25. 1) Снова придется поработать с кодом Obj85. Obj85_ObjData: dc.w $100, $100, $470; X pos, Y pos, VRAM setting dc.l Map_obj82 ; mappings pointer dc.w $25B0, $590, $300 dc.l Map_obj84 dc.w $26E0, $596, $3A0 dc.l Map_FZBoss dc.w $26E0, $596, $470 dc.l Map_obj82 dc.w $26E0, $596, $400 dc.l Map_Eggman dc.w $26E0, $596, $400 dc.l Map_Eggman За Эггмобиль отвечают два последних объекта, один из них сам "мобиль", второй - пламя (flame). Убрать их очень просто - достаточно изменить код загрузки объектов, чтобы он загружал не 6 объектов, а 4. 2) Для корретного отображения кольца нужно, разумеется, загрузить его тайлы. moveq #$XX,d0 jsr LoadPLC Я не помню, какой номер PLC у большого кольца, это можно посмотреть в _inc\Pattern Load Cues.asm, а можно даже и в коде (если знать, где). Но учти, его тайлы могут конфликтовать с тайлами FZ. Но думаю, если загружать тайлы, когда босс уже пройден и не виден, все будет ок. Чтобы добавить новый режим в GameModeArray, достаточно просто дописать в конец новый бранч: GameModeArray: bra.w SegaScreen; Sega Screen ($00) bra.w TitleScreen; Title Screen ($04) bra.w Level ; Demo Mode ($08) bra.w Level ; Normal Level ($0C) bra.w SpecialStage; Special Stage ($10) bra.w ContinueScreen; Continue Screen ($14) bra.w EndingSequence; End of game sequence ($18) bra.w Credits ; Credits ($1C) bra.w NewScreenie; Credits ($20) rts ; ============================================================ =============== Номера режимов возрастают по порядку, каждый следующий номер на 4 больше предыдущего. Это связано с тем, что команда bra.w занимает 4 байта, следовательно оффсет каждой следующей команды на 4 больше предыдущей. Единственная проблема поджидает нас в коде, который этот режим запускает, но исправить это очень просто. Посмотрим на код MainGameLoop (вариант из S1HS2): MainGameLoop: move.b ($FFFFF600).w,d0; load Game Mode andi.w #%11100,d0; apply bit mask, so d0 will be <= $1C and multiple of 4 jsr GameModeArray(pc,d0.w); jump to apt location in ROM bra.s MainGameLoop Вначале загружается байт из адреса $FFFFF600, потом к нему применяется побитовая маска - %11100, или $1C. Операция ANDI здесь очень важна. Во-первых, она предохраняет число от случайных значений, после применения маски число будет строго в интервале $00-$1C и кратно 4. Я специально записал значение в двоичном виде, чтобы ни у кого не было соблазна подумать, что в ANDI можно вписать любое число, чтобы задать некий интервал. Это побитовая операция, она очищает в нужном нам адресе/регистре все биты, которые равны 0 в маске. Еще важно то, что размер операции - word, то есть маска применяется не к байту, а к двум байтам (слову), а поскольку в маске заданы только 3 бита, все вокруг них обнуляется, так получается, что инструкция еще и подчистила d0 от лишнего мусора. Ведь в первой инструкции тронулся только 1 байт регистра, а jsr будет работать с d0 как со словом. Как уже было сказано, при этой маске число будет строго в интервале $00-$1C, а у нас-то добавился режим $20. Чтобы исправить это, можно расширить маску, т.е. написать "andi.w #%111100,d0", тогда будут допустимы значения в интервале от $00 до $3C.
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×