Уже давно Post #418495 я с интересом поглядывал на Комикс Зону.
Но, тогда, неуловимый глюк с крысой появляющейся вне клетки, почти в самом начале игры стал непреодолимым препятствием для начала проекта...
Так вот, не прошло и трех лет и нескольких сотен бесплодных попыток, как мне наконец удалось повторить этот глюк под запись!!!
http://dehacked.2y.net/microstorage.php/info/1131252642/Cage%20Glitch%20Comix%20Zone.gmv
Теперь, надеюсь на помощь наших славных экспертов, feos и/или r57shell, способных разобраться как именно он работает.
I show you how deep the rabbit hole goes.
Current projects: NES: Tetris "fastest 999999" (improvement, with r57shell)
Genesis: Adventures of Batman & Robin (with Truncated); Pocahontas; Comix Zone (improvement); Mickey Mania (improvement); RoboCop versus The Terminator (improvement); Gargoyles (with feos)
Joined: 4/17/2010
Posts: 11479
Location: Lake Chargoggagoggmanchauggagoggchaubunagungamaugg
Круть! Для упрощения сравнения запость плиз неудачную попытку тоже.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Обычно же крыс всегда же в клетке появляется => можешь для сравнения взять опубликованный мувик: http://tasvideos.org/954M.html
I show you how deep the rabbit hole goes.
Current projects: NES: Tetris "fastest 999999" (improvement, with r57shell)
Genesis: Adventures of Batman & Robin (with Truncated); Pocahontas; Comix Zone (improvement); Mickey Mania (improvement); RoboCop versus The Terminator (improvement); Gargoyles (with feos)
Joined: 4/17/2010
Posts: 11479
Location: Lake Chargoggagoggmanchauggagoggchaubunagungamaugg
Сегодня уже не успею разобрать причину, но вот скрипт для объектов на скорую руку.
Download крыса-кун.lua
Language: lua
gui.register(function()
camx = memory.readwordsigned(0xffc000)
camy = memory.readwordsigned(0xffc002)
base = memory.readlong(0xffbec0)-0xff000000
for i=0,500 do
this = memory.readlong(base)-0xff000000
if this ~= 0 and this == 0xff633c or this == 0xff654e then
x = memory.readwordsigned(this+0x1a)-camx
y = memory.readwordsigned(this+0x1c)-camy
end
base = this
end
end)
В твоем мувике адрес высоты крысы - $ff656a, в публикации - $ff6358. На спавне всегда пишется позиция $14a, потом увеличивается на 1, и у тебя крыса проваливается мимо пола клетки.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Спасибо, спешки особо нет. Сейчас на ТАС вообще времени почти нет, даже не знаю когда пилить буду... Однако Комикс Зона это такой лакомый кусочек, так что думаю для нее удастся по пару часиков в неделю выкраивать.
Я посчитал, глюк с клеткой всего сорок с небольшим кадров экономит, немного меньше чем я ожидал, но улучшение есть улучшение, какое уж есть :) Надеюсь сетап не сильно долгий будет, а то вообще облом получится, хехе.
Кстати скрипт чето не работает, наверное галку Disable HTML поставить забыл.
I show you how deep the rabbit hole goes.
Current projects: NES: Tetris "fastest 999999" (improvement, with r57shell)
Genesis: Adventures of Batman & Robin (with Truncated); Pocahontas; Comix Zone (improvement); Mickey Mania (improvement); RoboCop versus The Terminator (improvement); Gargoyles (with feos)
Joined: 10/6/2011
Posts: 1697
Location: RU · ID · AM
Ох ты ж, наконец-то, кто-то воспроизвёл эту багу!
Очень здорово, что теперь можно продолжить ТАС этой игрушки! Обожаю её.
Боюсь показаться банальным, но мож просто скрипт для BizHawk, а тасишь на Gens? :)
S3&A [Amy amy%] improvement (with Evil_3D & kaan55) — currently in SPZ2
my TAS channel · If I ever come into your dream, I’ll be riding an eggship :)
Joined: 4/17/2010
Posts: 11479
Location: Lake Chargoggagoggmanchauggagoggchaubunagungamaugg
А какой работы ты от него ждешь? Он же ничего не делает, просто читает объекты.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Не знаю чего ждал, обычно скрипты выводят что-нибудь на экран, а не только читают :)
Ладно не буду отвлекать, главное понять от чего зависит стартовое положение крыса и как это нужное нам аномальное значение искусственно вызывать.
Да, старый ТАС этой игрушки просто шикарный, один из моих любимых на сеге. Давно хотел к нему приложится, но крыс мешал. Теперь, надеюсь с феосовой помощью, крыса удастся выдрессировать и можно будет начать записывать.
Кстати в задержке есть и свой плюс, за три прошедших года, пару новых улучшений нашлось - в частности, изменение маршрута на втором уровне и более быстрый способ убийства шаолиньского босса.
Еще есть несколько потенциально полезных тактик использования самолетиков, но их предстоит тестить на местах, все упирается в менеджмент здоровья.
I show you how deep the rabbit hole goes.
Current projects: NES: Tetris "fastest 999999" (improvement, with r57shell)
Genesis: Adventures of Batman & Robin (with Truncated); Pocahontas; Comix Zone (improvement); Mickey Mania (improvement); RoboCop versus The Terminator (improvement); Gargoyles (with feos)
По адресу 1DEB84 есть проверка $2A(A6) на 1, и если это не так, то пропускает проверку $26(A6) на меньше $F6
Так вот $26(A6) в обоих мувиках в том месте имеет значение EE. (по адресам FF69CA, FF65C6 в публикации и бажном соответственно)
Но вот в публикации на эту вторую проверку он не попадает, потому что $2A(A6) не 1 а точнее $1D1, и поэтому попадает на другую, по которой уходит на код который обнуляет вертикальную скорость падения мыши - то есть она не падает.
А в бажном $2A(A6) равна как раз 1, и он на проверке на меньше $F6 сразу прыгает на путь "ничего не делать", поэтому скорость не обновляет, а она растёт.
Что интереснее, этот $2A в обоих случаях часто переписывается мусором.
В публикации именно каким-то мусором там получается $1D1.
Аналогично в бажном мувике каким-то мусором получается $1.
Может кому получится найти как заставить там оказаться мусору, или кто-то поймёт что за мусор. Но судя по коду, в бажной версии туда попадает распакованный кусок архива.
Пока честно говоря мудрено, непонятно каким образом можно туда нужное значение прописать...
Но это уже что-то. Дай пожалуйста скрипт, где это важное $2A, перезаписываемое мусором, на экран выводится. Поиграюсь со скриптом, посмотрю как значения будут меняются, вдруг удастся найти закономерность.
I show you how deep the rabbit hole goes.
Current projects: NES: Tetris "fastest 999999" (improvement, with r57shell)
Genesis: Adventures of Batman & Robin (with Truncated); Pocahontas; Comix Zone (improvement); Mickey Mania (improvement); RoboCop versus The Terminator (improvement); Gargoyles (with feos)
cage = {}
gui.register(function()
camx = memory.readwordsigned(0xffc000)
camy = memory.readwordsigned(0xffc002)
base = 0xffbec0
while true do
this = memory.readlong(base)
if this == 0 then break end
this = this - 0xff000000
x, y = nil,nil
if this ~= 0 and this ~= 0xff6298 then -- and this == 0xff633c or this == 0xff654e then
x = memory.readwordsigned(this+0x1a)-camx
y = memory.readwordsigned(this+0x1c)-camy
--gui.drawtext(x,y,string.format("%X",this))
end
base = this
end
for i,v in ipairs(cage) do
gui.drawtext(0,i*8,string.format("%X",memory.readwordunsigned(v+0x2A)))
end
end)
gens.registerbefore(function()
cage = {}
end)
memory.registerexec(0x1DEB62,function()
table.insert(cage,AND(memory.getregister('a6'),0xFFFFFF))
end)
на экране в левом верхнем углу кажет значение когда есть клетка.
А нельзя это значение всегда показывать? Просто когда клетка появилась, от него к сожалению совершенно нет толку т.к. манипулировать уже поздно, с тем же успехом можно на крыса посмотреть... Или до этого момента оно вообще не существует?
I show you how deep the rabbit hole goes.
Current projects: NES: Tetris "fastest 999999" (improvement, with r57shell)
Genesis: Adventures of Batman & Robin (with Truncated); Pocahontas; Comix Zone (improvement); Mickey Mania (improvement); RoboCop versus The Terminator (improvement); Gargoyles (with feos)
каждый раз разное место. и место известно только когда она появится.
и по значению можно посмотреть раньше, так как крыса можно посмотреть немного позже.
как минимум можешь поискать что ты можешь сделать чтоб повлиять на значение.
Единственное, что заметил два значения образуются значительно чаще других: 1111 и 0. Еще иногда попадаются близкие и кратные к 1111: 1110, 1116, 2222, 4444...
Все остальные значения рандомно мусорные и полностью лишены логики, не вижу никакой системы за что можно зацепится.
Боюсь пока повторить глюк столь же трудно как и в первый раз (=почти невозможно), про необходимую оптимизацию вообще молчу. Может можно еще что-нибудь сделать?
Очень не хочется опять бросать, так толком и не начав. Ведь хороший ТАС мог бы получиться, столько всего раскопал - новые трюки, нетривиальные решения, мелкие и крупные хитрости, математически точные броски самолетиков...
Будет печально если вся эта феерия так не увидит свет из-за какой-то упрямой крысы.
I show you how deep the rabbit hole goes.
Current projects: NES: Tetris "fastest 999999" (improvement, with r57shell)
Genesis: Adventures of Batman & Robin (with Truncated); Pocahontas; Comix Zone (improvement); Mickey Mania (improvement); RoboCop versus The Terminator (improvement); Gargoyles (with feos)
Joined: 10/6/2011
Posts: 1697
Location: RU · ID · AM
Честно говоря, мне приходилось умышленно не применять известные мне трюки из-за того, что их слишком трудно воспроизвести. К примеру, в Сонике есть трюк с влезанием в стенку (точнее, в пол) в нижней части петли, который включает в себя сворачивание в клубок. Но как я один раз обнаружил на практике, этот же трюк можно осуществить и персонажем, который не умеет сворачиваться в клубок, в частности, это Эми и розовый Наклз. Но это несоизмеримо труднее при прочих равных исходных условиях (скорость, форма петли). Я лишь знаю, что это возможно, потому что один раз это со мной приключилось, но так как я тратил многие тысячи циклов перезаписи на попытки воспроизвести этот трюк в серьёзных проектах, я на него забил. Не хотелось бы, конечно, чтобы так же получилось с этой крысой.
S3&A [Amy amy%] improvement (with Evil_3D & kaan55) — currently in SPZ2
my TAS channel · If I ever come into your dream, I’ll be riding an eggship :)
Сейчас не так важно что туда попадает, важнее понять что на это влияет.
То есть, как можно поменять последние фреймы до появления клетки чтобы это значение было другим.
Этот вариант никуда не годится. Как можно начинать симфонию с фальшивой ноты?
Самое банальное, что влияет - это место в котором спускаемся вниз к клетке (конечно в идеале желательно занять самое левое, но сдвинуться на несколько пикселей вправо ради манипуляции кажется вполне приемлемым).
Направление куда смотрит персонаж в момент спуска тоже иногда влияет. Также если спускаться во время переката часто получаются другие значения.
Вот мой базовый мувик (101 кадр улучшения), куда хотелось бы инкрустировать крысо-глюк, исходное значение там (1DF).
http://dehacked.2y.net/microstorage.php/info/1205120466/Comix%20Zone%20%281DF%29.gmv
И несколько примеров, изменения этого значения {отличных от вышеупомянутых банальных способов}:
V1-Если сдвигаем удар по люку на 1 кадр, с 1531 на 1532, то получаем новое значение (8811).
http://dehacked.2y.net/microstorage.php/info/261819805/Comix%20Zone%20%288811%29.gmv
Стоит отметить, что влияют не только последние кадры, но и то что происходило на предыдущих экранах тоже.
V2-Например если смотреть влево, когда берем предметы, для этого редактируем кадры 592-594, то получаем значение (1FFF).
http://dehacked.2y.net/microstorage.php/info/182827343/Comix%20Zone%20%281FFF%29.gmv
V3- Если заменить в кадре 1209 [>] на [^>], добавив небольшое подергивание на втором экране получаем (111).
http://dehacked.2y.net/microstorage.php/info/387413960/Comix%20Zone%20%28111%29.gmv
И таких примеров можно придумывать еще и еще, а их комбинации рано или поздно дадут весь возможный спектр значений. Но, тупо перебрать все варианты не представляется возможным т.к. их слишком много.
I show you how deep the rabbit hole goes.
Current projects: NES: Tetris "fastest 999999" (improvement, with r57shell)
Genesis: Adventures of Batman & Robin (with Truncated); Pocahontas; Comix Zone (improvement); Mickey Mania (improvement); RoboCop versus The Terminator (improvement); Gargoyles (with feos)
Joined: 4/17/2010
Posts: 11479
Location: Lake Chargoggagoggmanchauggagoggchaubunagungamaugg
Так а зачем уповать на удачу? Если запись этого трюка есть, просто бегаешь по форуму и всех просишь раздебажить. Вот если записи нету, там да, сложно.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Joined: 10/6/2011
Posts: 1697
Location: RU · ID · AM
Дело в том, что причина, вроде бы, ясна. Просто нужно выровняться правильно и таким образом на большой скорости «проскочить» некоторый участок между 2 кадрами. На скоростях более 6000 sp/f это случается весьма часто, но на более типичных скоростях около 3000-4000 едва ли возможно. Переход в крутящееся состояние на мгновение уменьшает Y-координату персонажа, тем самым сокращая минимальную скорость, необходимую для того, чтобы трюк стал возможным. Я скидывал запись этого бага марзоджру, но он ничего толкового не смог из этого извлечь. На самом деле он гораздо чаще рекомендует метод проб и ошибок, чем может показаться :)
Archanfel wrote:
Этот вариант никуда не годится. Как можно начинать симфонию с фальшивой ноты?
А так, ТАС получить хочется, а воспроизвести не могу ни я, ни кто-либо из друзей. Ни marzojr, ни feeuzz, ни Evil_3D не воспроизводили эту штуку, хотя пытались.
Я вам больше скажу, это далеко не единственный такой трюк, который я умышленно не делаю. Можете называть меня плохим TAS-ером, но есть и другие похожие места. Например, при игре за Наклза в S3&K в одном месте скорость (~4300) позволяет пролететь сквозь стенку толщиной 16 пикселей, и это сократило бы время, но никто это ещё никогда не сделал, потому что нужно как следует спозиционироваться, чтобы пропустить эту стенку, а горизонтального контроля в тот момент нет, поэтому выравниваться надо несколько заранее — в момент получения буста, и большой вопрос, можно ли там спозиционироваться. Подобных микрозадачек при тасинге этой игры возникают десятки, но их некому решать, точнее, если всякий раз застопориваться, ты вряд-ли когда-нибудь придёшь к результату. Хотя, конечно, Аглар и Зурггрифф такие задачки обычно решают, но у них и мозгов серьёзно так побольше)))))
S3&A [Amy amy%] improvement (with Evil_3D & kaan55) — currently in SPZ2
my TAS channel · If I ever come into your dream, I’ll be riding an eggship :)
Joined: 4/17/2010
Posts: 11479
Location: Lake Chargoggagoggmanchauggagoggchaubunagungamaugg
Да, круто конечно. Весело видать тасить на двиге в котором даже знание всех условий не помогает :D
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Есть ли подвижки в решении крысиного вопроса? 🐀
Совсем глухарь, или есть шансы на положительный исход?
I show you how deep the rabbit hole goes.
Current projects: NES: Tetris "fastest 999999" (improvement, with r57shell)
Genesis: Adventures of Batman & Robin (with Truncated); Pocahontas; Comix Zone (improvement); Mickey Mania (improvement); RoboCop versus The Terminator (improvement); Gargoyles (with feos)
Комикс Зона - одна из лучших сеговских игр. Рано или поздно ТАС должен будет переродиться. В зависимости от того, как сильно его улучшат, есть три варианта:
Малая колесница - 10 секунд улучшения и менее.
Большая колесница - около 20 секунд улучшения.
Алмазная колесница - 30 секунд улучшения и более.
Если кто-нибудь другой возьмется его улучшать, то в 99,99% он остановится на первых двух вариантах. Я же достаточно безумен что бы замахнуться на третий вариант, и создать такой ТАС, которого достойна эта игра.
Трудновоспроизводимый крысиный глюк это единственное, что останавливает меня сделать это. Один раз этот глюк случайно получился, (что уже чудо), но без тайного искусства Обратной Инженерии не разобраться, как его повторить.
Поэтому пришлось просись помощи ведающих feos и r57shell. От вас зависит, будет ли рожден "Бодхисаттва бумажных самолетиков".
I show you how deep the rabbit hole goes.
Current projects: NES: Tetris "fastest 999999" (improvement, with r57shell)
Genesis: Adventures of Batman & Robin (with Truncated); Pocahontas; Comix Zone (improvement); Mickey Mania (improvement); RoboCop versus The Terminator (improvement); Gargoyles (with feos)
По адресу 1DEB84 есть проверка $2A(A6) на 1, и если это не так, то пропускает проверку $26(A6) на меньше $F6
Так вот $26(A6) в обоих мувиках в том месте имеет значение EE. (по адресам FF69CA, FF65C6 в публикации и бажном соответственно)
Но вот в публикации на эту вторую проверку он не попадает, потому что $2A(A6) не 1 а точнее $1D1, и поэтому попадает на другую, по которой уходит на код который обнуляет вертикальную скорость падения мыши - то есть она не падает.
А в бажном $2A(A6) равна как раз 1, и он на проверке на меньше $F6 сразу прыгает на путь "ничего не делать", поэтому скорость не обновляет, а она растёт.
Что интереснее, этот $2A в обоих случаях часто переписывается мусором.
В публикации именно каким-то мусором там получается $1D1.
Аналогично в бажном мувике каким-то мусором получается $1.
Может кому получится найти как заставить там оказаться мусору, или кто-то поймёт что за мусор. Но судя по коду, в бажной версии туда попадает распакованный кусок архива.
Раз EE сразу меньше, предположу, что $F6 - значение, а не адрес.
Исходя из этого, позволю себе поделиться парой домыслов. Я, признаться, об обратной инженерии больше мечтать могу, но тем не менее.
Если представить себе предметный смысл таких проверок, мне это кажется похожим на проверку достижения падающим персонажем пола, чтобы в таком случае обнулить ему скорость. Тот факт, что прямо сейчас персонаж падает, определяется отдельным признаком в структуре данных состояния этого персонажа (объекта).
Тот факт, что признак состояния падения жестко проверяется на равно 1 (как и наличие в "мусоре" данных, не касающихся логики игрового процесса), может указывать на то, что движок игры использует для отслеживания состояния объектов динамические структуры данных. Когда игра создает объект "крысу", возможно, она не инициализирует признак падения, подразумевая, что по умолчанию падать не надо, а после по совпадению, на выбранном месте в куче там оказывается "мусор", равный 1, и крыса сразу делается падающей.
С другой стороны, по этой логике, любой подвижный персонаж в игре может при своем появлении с пренебрежимо малой вероятностью взять и провалиться... Почему не проваливаются друг в друга бочки и ящики?
Возможно, без участия Скетча крыса спавнится неаккуратно. Возможно, что любая встреча с крысой может быть чревата таким падением ее сквозь пол.
Возможно, я ошибаюсь, и был бы рад это признать, так как если я окажусь прав, симуляция проявления такого бага это Masterjun'инг какой-то.
Totally irrelevant link
My consoles: PS2 (PS1 as bw\c), NDS Lite (GBA as bw/c), 3DS XL, Wii U (vWii theoretically), PS4 slim.
Рад сообщить, что мне все-таки удалось организовать невозможный побег крыса!
Поскольку даже обратная инженерия оказалась бессильна симулировать появления такого бага, пришлось проводить грубый перебор.
Первые две недели интенсивных тестов вручную (перебирал примерно по сотне значений в день) к сожалению не принесли желаемого результата. И надежд, что случайно повезет становилось все меньше и меньше.
Однако на этой неделе придумал как можно значительно ускорить этот процесс.
Ускоренный перебор я реализовал так: записал 100 различных вариантов прохождения третьего экрана, 16 вариантов второго экрана и 4 варианта первого экрана.
Затем в тасэдиторе долго и упорно копипастил все сочетания трех экранов, создав таким образом партию из 100x16x4=6400 уникальных мувиков. Потом один за одним просматривал сгенерированные мувики на перемотке и проверял где крыс.
Эксперимент №5276 удался - подопытный объект сбежал из клетки.
Теперь улучшению Комикс Зоны определенно быть.
I show you how deep the rabbit hole goes.
Current projects: NES: Tetris "fastest 999999" (improvement, with r57shell)
Genesis: Adventures of Batman & Robin (with Truncated); Pocahontas; Comix Zone (improvement); Mickey Mania (improvement); RoboCop versus The Terminator (improvement); Gargoyles (with feos)