Как работает баг с миром −1 в Super Mario Bros

https://www.youtube.com/watch?v=Hv_h_R3o9r8
  • Перевод


Мир −1 в оригинальной Super Mario Bros. — один из самых известных багов на NES. Если в зону перехода (Warp Zone) зайти специальным образом, игра глючит, и при входе в трубу вы попадаете в странный мир.

Попасть в мир −1 можно, почти пройдя уровень 1-2 и встав на трубу, ведущую на поверхность земли, к флагштоку и концу уровня. Затем нужно передвинуться к левому краю трубы, пригнуться и подпрыгнуть вправо, чтобы опускаясь Марио находился почти под потолком. Может потребоваться несколько попыток, но в результате он попадёт в нужную точку и автоматически пройдёт сквозь трубу, а затем через стену в комнату с зоной перехода. Если не будет виден хотя бы один пиксель трубы, Марио окажется в ловушке и игроку придётся ждать, пока не закончится время.

Ещё один способ попадания в мир −1: разбить два кирпичных блока на потолке, оставив самый правый. Потом нужно подойти к левому концу трубы и подпрыгнуть вправо. Пригибаться в этом случае не обязательно, потому что Марио может попытаться ударить (на самом деле не разрушая его). При этом в игре произойдёт сбой, и Марио сможет пройти сквозь трубу и стену. Но этот способ более сложен и долог. Если всё сделано правильно, игрок увидит перед собой три трубы зоны перехода. Если залезть в левую или правую трубу, Марио попадёт в мир −1. Если же опуститься в среднюю трубу, он перейдёт на уровень 5-1. В случае, если правая стена зоны перехода становится видимой, баг перестаёт действовать.

Но это не вся история о том, почему работает этот баг. Некоторые говорят, что так происходит, потому что на экране зоны перехода над трубой не отображается номер мира, когда вы заходите в неё. Но это неправда, и те, кто обладает пониманием механики игры, никогда не поверит в такое объяснение. Прочитав эту статью, вы сможете рассказать фантазёрам, что же происходит на самом деле. В этой статье мы подробно разберём и раскроем тайны возникновения бага «мира минус один».

Как работают зоны перехода


Чтобы понять, как мы попадаем мир −1, нам нужно сначала разобраться, как работают Warp Zone. В игре есть три таких зоны: одна в конце мира 1-2 (для перехода в миры 2, 3 или 4), вторая в конце 4-2 (перемещает в мир 5), а в третью можно попасть по лозе в мире 4-2 (и выбрать мир 6, 7 или 8). Давайте посмотрим, как игра узнаёт, в какие миры должна вести зона перехода.


Рисунок 1

Номера зон хранятся начиная со смещения $87F2 запущенной программы, данные выглядят следующим образом: 04 03 02 00 24 05 24 00 08 07 06 00 (00 отделяют зоны друг от друга). Первые 4 байта относятся к зоне в мире 1-2, следующие 4 байта — к подземной зоне мира 4-2, а последние 4 байта — к надземной зоне мира 4-2. Мы можем доказать это, взломав игру. Я использовал HEX-редактор, чтобы изменить значение 04 на 08, и посмотрите, что получилось:



С помощью редактирования памяти можно попасть и в другие миры-баги, например, в мир 0.



Следующая часть данных (на рисунке 1 красного цвета) относится к подземной зоне в мире 4-2, и состоит из 24 05 24. Это соответствует переходу в мир $24 (36) через левую трубу, в мир 5 через среднюю трубу и снова в мир $24 (36) через правую трубу. Но левая и правая трубы не существуют, поэтому мы можем попасть только в мир 5. Что же означает 24 в зоне перехода? Числами $24 в Super Mario Bros. обозначаются пустые места. Они нужны, потому что в смещении $87F2 указывается не только то, КУДА перемещают трубы, но и ЧТО на них писать. Объект зоны перехода должен всегда отрисовывать три тайла, соответствующие трубам зоны, но поскольку во второй зоне есть только одна труба, игра отрисовывает пустые пространства слева и справа. Мы можем показать хак, изменяющий эти значения слева и справа для отрисовки ненужных нам значений. Поэтому использование пустого места оправдано.



Эти переходы технически всё равно работают, мы просто не можем использовать их без трубы. Хаком я вставил ещё одну трубу, чтобы показать вам, что происходит при входе в трубу, переносящую в мир 36. Как труба с цифрой 5 переносит нас в мир 5, так и труба без цифры переносит в мир _, то есть на уровень −1.



Так как технически $24 означает 36, мы на самом деле переносимся в мир 36. Но игра обозначает это число пустым местом, поэтому кажется, что мы попали в мир _. На самом деле это мир 36. Но постойте, значения 24 есть только во второй зоне. Как же мы переходим в этот мир из уровня 1-2?

Как работает баг мира −1


На самом деле все зоны переходов — это один и тот же объект. Игра определяет, какую зону загрузить, на основании значения по адресу $06D6. По умолчанию это значение равно 00, то есть не соответствует никакой зоне. Но это нормально, потому что большую часть времени мы не находимся рядом с зонами перехода. Однако рядом с концом уровня 1-2 мы создаём объект блокировки скроллинга.



Он создаётся, когда мы находимся по горизонтали в этом месте.

Этот объект при создании выполняет код, который также увеличивает значение по адресу $06D6 на единицу, создавая трубы в зоне перехода. Обычно мы попадаем в зону перехода, пробежав по верхней части экрана, при этом создаётся ещё один объект блокировки скроллинга, а тот создаёт правильное значение зоны перехода.



Вот как это работает:

  • Сначала игра загружает значение 04 по адресу $06D6. Это означает, что будет использоваться первая зона перехода.
  • Потом она проверяет, на каком уровне находится игрок. Если игрок в мире 1, она использует 04 и сохраняет это значение в $06D6, а затем пропускает весь последующий код.
  • Если игрок в другом мире, она загружает значение 05. Затем игра проверяет, на каком типе уровня находится игрок. Если игрок на подземном, подводном или замковом уровне, то она сохраняет в $06D6 значение 05.

Как сказано выше, если мы на уровне 1-2, это сохранение не выполняется, потому что игра пропускает эти инструкции и значение остаётся 04. Если же игрок находится на уровне над землёй, игра записывает значение 06 по адресу $06D6.

В результате для зоны уровня 1-2 значение будет 04, для подземной зоны уровня 4-2 — 05, а для надземной зоны — 06. Игра выводит на экран сообщение WELCOME TO WARP ZONE, если значение по адресу $06D6 равно 04, 05 или 06, что всегда истинно, когда мы создаём зоны перехода при обычном игровом процессе. Когда мы проходим объект создания зоны перехода, игра создаёт текст приветствия зоны перехода.

После вывода текста процедура определяет, какую зону перехода нужно загрузить, вычитая 04 из значения $06D6. Так что если значение равно 04, мы получаем 00, если 05, то 01, а если 06 — 02. Но так как мы создали объект блокировки скроллинга, а после этого вошли в стену, значение $06D6 по-прежнему равно 01.

Это значение 01 соответствует зоне перехода уровня 4-2, поэтому игра думает, что мы находимся в зоне уровня 4-2, а не 1-2. Мы можем проверить это, зайдя во вторую трубу, которая переносит нас в мир 5. Если мы заходим в левую или правую трубу, мы переходим в мир 36, или мир −1. Это объясняет, как мы попадаем в мир −1.

Мир −1


Почему этот мир является бесконечно зацикленной копией мира 7-2? Сначала разберёмся, почему мир −1 похож на 7-2. Когда мы заходим в трубу, игра запускает алгоритм, определяющий, в какую комнату нужно поместить Марио. Если значение по адресу $06D6 равно 00, что бывает в большинстве случаев, игра пропускает этот код и отправляет Марио в область, определённую в адресе $0650.

Это значит, что когда мы проходим сквозь изогнутую трубу на уровне 1-2, значение $06D6 равно 00, что возможно только при взломе, мы переходим туда, куда нас отправляет смещение со значением 25, что соответствует концу уровня. Так происходит, когда Марио заходит в изогнутую трубу. Но если значение не равно 00 и это не случай мира −1, потому что блокировка скроллинга устанавливает значение 01, то игра использует номер мира для поиска соответствующего смещения области в таблице поиска, чтобы понять, данные какого уровня нужно загрузить.

Если установить в качестве номера уровня $24, то код зоны перехода, определяющий место для перехода, использует значение $24 для смещения мира и получает значение $33, которое говорит игре искать смещение на $33 (51) байта от начала таблицы поиска, которое имеет значение 01, соответствующее миру 7-2. Таблица поиска состоит всего из 34 байтов, потому что обычно этого хватает для игры, поэтому смещение на 51 байт находится за пределами области таблицы поиска, в области таблицы данных врагов. Мы берём эти данные из таблицы, к которым таблица поиска на самом деле не должна иметь доступа. И так же работают другие миры-баги. Итак, игра загружает то, что она считает уровнем 36-1, но содержащий данные уровня 7-2.



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



Текущий номер мира не соответствует номеру в объекте. Смещение области не обновляется, поэтому загружает клон уровня 7-2, который предназначен для изменения объекта области, но поскольку смещение области установлено на $25, мы перемещаемся в мир 7. Когда мы на самом деле находимся на уровне 7-2, смещению области установлено значение $25, потому что номер мира соответствует текущему номеру мира объекта.

Однако мир −1, считывающий данные с 7-2, находится не в мире 7, поэтому игра не загружает смещение области $25 в переменную смещения, что позволило бы нам покинуть уровень. Вместо этого, оно по-прежнему содержит значение 01, установленное на уровне 1-2. Поскольку смещение никогда не меняется, вместо выхода на поверхность уровень загружается сначала. Поэтому мир −1 бесконечно зациклен.

Так мы разрешили загадку бага с миром −1 в Super Mario Bros.! Теперь мы знаем, что такое мир −1 и как он появляется, а самое главное — как нам удаётся туда попасть. Надеюсь, вам было интересно.
Поделиться публикацией
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 75
    +4
    Вопрос специалистам багов: Если наш мир симулятор, на поиски каких багов на лучше всего сосредоточится?
    Типа если мы такие разумные Марио, то должны заметить какие-то события свидетельствующие о симуляции. Возможно нужно создать вычислительную перегрузку? Например запустить симулятор внутри симулятора.
      +50
      Вы персонаж, вы не можете найти баг. Баги ищет игрок.
        0
        Вот тут чел пишет, что «создание такой виртуальной машины, которая не будет детектится является фундаментально неразрешимой задачей».
        Я пока не прочитал его источник, так что подтвердить не могу.
          0
          Там не про то. Там программа, знающая, как должна вести себя реальная машина, ищет нестыковки в виртуальной.
            +4
            Чтобы найти баг, нужно хотя бы иметь представление о том, как это должно работать в «реальной» системе. А так баг это или фича остаётся только догадываться.
            • НЛО прилетело и опубликовало эту надпись здесь
              • НЛО прилетело и опубликовало эту надпись здесь
                  0
                  Да, например с помощью бубна вызывать дождь:
                  сокращенная версия художественного рассказа
                  Танцы с бубном
                  -Привет,- сказал демиург Шамбамбукли демиургу Мазукте, который ожесточенно ковырялся отверткой в мироздании.- Чем занимаешься?
                  -Исправляю ошибки.
                  -Ошибки?!
                  -Ну да. Баги, лаги, называй как хочешь.
                  Шамбамбукли удивленно потряс головой.
                  -Ну вот, вроде готово,- произнес он немного неуверенно.- Думаю, что исправил всё, что было.
                  -А что было?- поинтересовался Шамбамбукли.
                  -Ерунда всякая,- вздохнул Мазукта.- Понимаешь, есть у людей такое неприятное свойство: они вечно ищут, как бы обойти законы природы или, на худой конец, использовать их не по назначению. Вот например, скажи-ка мне, отчего бывает дождь?
                  -Ну, это просто!- фыркнул Шамбамбукли.- Когда насыщенные массы воздуха поднимаются в верхние холодные слои атмосферы, в них конденсируются…
                  -Достаточно!- прервал Мазукта.- Вижу, что знаешь. Теплые воздушные течения, холодные потоки, циклоны, антициклоны, перепады давления — ну, механика стандартная, проверена временем. Всё работает, не без перебоев, конечно, но это уже мелочи. Идеальных систем не бывает. Работает и производит дождь. Так?
                  -Так…
                  -Ну и кто бы мог подумать, что танцы с бубном вокруг костра приводят к такому же результату?!
                  -А они приводят?- удивился Шамбамбукли.
                  -Уже нет. Я это только что исправил. Хочешь поглядеть?
                  -Хочу.
                  Мазукта пододвинул к Шамбамбукли мироздание и показал пальцем: «смотри сюда».

                  На утоптанной площадке уже второй час танцевал шаман, под неодобрительными взглядами соплеменников. Дождь и не думал начинаться.
                  -Ха,- довольно фыркнул Мазукта,- что, съел? Ничего не получится, и не старайся, эту дырку я уже заделал.
                  Шаман, конечно, не мог слышать голоса демиурга, но начал подозревать недоброе. Он остановился, отложил бубен и уставился на безоблачное небо. Соплеменники хмурились и нетерпеливо переступали с ноги на ногу.
                  -Сейчас они его убьют,- сообщил Мазукта.- Как не справляющегося с обязанностями.
                  Тем временем несколько вооруженных мужчин подошли к шаману, столпились вокруг и стали что-то оживленно обсуждать, темпераментно размахивая руками. Кто-то подозвал стоявших поодаль женщин и отдал краткие распоряжения, после чего женщины быстро умчались в поселок.
                  Шаман сел на корточки и начал что-то чертить на песке, воины разбрелись по площадке, меряя её шагами и поминутно перекликаясь. Вождь достал откуда-то восковую табличку и теперь записывал данные.
                  Скоро вернулись женщины с полными корзинами затребованных вещей: барабанами, погремушками, примитивным барометром, складным метром и прочей полезной дребеденью. Шаман на пробу взял наполненную горохом тыкву и потряс её. Вождь сверился с барометром и отрицательно покачал головой. Шаман отложил тыкву и взял тростниковую дудочку, потом пищалку, потом губную гармошку, и так далее, пока наконец вождь не ухмыльнулся торжествующе и не показал большой палец.
                  -Барабан?- моргнул Мазукта.- Ну да, конечно… А что, это может сработать… И как же я сразу… Вот же чертовы хакеры!
                  А над головой шамана уже начали потихоньку собираться грозовые тучи…

                  Петр Бормор, Игры демиургов.
                  • НЛО прилетело и опубликовало эту надпись здесь
                      0
                      На разгон облаков есть более современный баг.
                      • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          Понимаешь, есть у людей такое неприятное свойство: они вечно ищут, как бы обойти законы природы или, на худой конец, использовать их не по назначению.
                          Вот тут тонкая грань между багом и фичей. От куда нам знать что это именно фича, а не баг? Проход сквозь стену тоже вписан в движок Mario мира.
                          • НЛО прилетело и опубликовало эту надпись здесь
                        0
                        Если вызвать дождь — то облаков уже не будет…
                        А бубен может напрямую звуковыми колебаниями воздействовать, создавая центры конденсации.
                    0
                    Всё чуть проще — в марио для перехода в мир -1 исползуется другой баг — проход сквозь стены, который какра и был обнаружен случайно, в процессе вполне себе нормально игрового процесса (Пусть и немного нестандартного — Не каждый додумается приседать в прыжке, летя при этом на стену).

                    В нашем мире тоже можно намеренно вызвать баг… нашего мозга — употребив некоторые вещества :)
                      0
                      может в нашем мире тоже есть где-то стена через которую можно пройти присев в прыжке? :)
                    0
                    Чем не наши теории и её несостыковки с наблюдаемым?
                      0
                      Простите, но вы сломали мне парсер. Что вы хотели сказать?
                        +1
                        Ну ок, давайте проведем мысленный эксперимент (бог с ней с квантовой физикой, давайте что нибудь попроще). Предположим что мы живем в некоторой виртуальной среде. У нас была некоторая спецификация к этой среде и команда которая её реализовала.

                        Предположим согласно этой спецификации у обычных домашних котов в этой среде не может быть шерсть более двух цветов (общеизвестный факт, что в подавляющем большинстве случаев трехцветными бывают только кошки из-за генетических особенностей). Предположим также, что в команде разработчиков было криволапое существо, которое допустило ошибку при реализации цвета кота, так что при определенных обстоятельствах коты получаются трехцветными.

                        Теперь вопрос: каким образом мы можем утверждать, что видя трехцветного кота это баг, а не фича нашего мира, не видя спецификации к нашей виртуальной системе?

                        На мой взгляд никак.
                          0
                          Ну я так и сказал, всё что мы видим, мы вынуждены полагать фичей.
                  +1
                  Ну если вы разумный персонаж обладающий волей и памятью, то должны заметить странный переход из мира 1 в мир 2. Но как писали ниже мы действительно не можем понять баг это или фича. С другой стороны подобные странности должны наводить на мысли. А выглядеть все это будет как нечто мистическое)
                    +1
                    Для этого разумный персонаж должен «Знать всю игру», иначе как он отличит баг от авторской задумки?
                    0
                    Хуже: NPC
                      0
                      Была статься в которой рассказывают про баг который обнаружили при помощи ботов. Там боты начали строить сверхсильное оружие потому что разработчики сделали ошибку при разработке механики модификации вооружения. Однако вряд ли они смогут понять баг это или фича.
                        0
                        Вот эта статья.
                          0
                          У багов могут быть критерии. Например в Марио баг дает незаконное преимущество!
                          0
                          Ничего не знающие люди в Матрице — они игроки или персонажи? Если персонажи, то они видят баги из-за тех, кто стал игроком.
                          0
                          Да и так ясно, что симуляция, причём забагованная «по самое не могу» — взять хотя бы опыт со стиральной машиной и двумя носками.
                            0
                            единую теорию всего не могут придумать, не стыкуется что-то макро мир с микро миром и всякими квантовыми эффектами. до одного масштаба считают так, а с более мелкого по другим формулам.
                            в реальном мире всё бы стыковалось и придумали единую теорию.
                            электрон и частица и волна одновременно. это и есть баг, точнее оптимизация расчетов.
                            нет сигналов от других цивилизаций из космоса. хотя должны быть. тоже из разряда багов-фичей. просчитывают только 1 цивилизацию, нашу.
                            ну еще может есть край мира. может он недалеко от границы солнечной системы. а всё что дальше это голограмма из реального мира.
                              0
                              Голограмма — слишком романтично. Я бы сделал процедурную генерацию тех участков, которые мы обследуем, при чем с учётом LOD.
                                0
                                так то оно конечно экономнее в плане ресурсов. но мы то не знаем целей симуляции. вполне возможно одна из целей это изучение звёзд. а вдруг мы выведем какую-нибудь закономерность которую они пропустили?
                                0
                                «в реальном мире всё бы стыковалось и придумали единую теорию. „

                                Да ладно. В интернет-магазинах то периодически заказ с доставкой просчитывается на фронте, а самовывоз на бекенде по абсолютно разным алгоритмам. А тут просто начинали с крупных масштабов, все реализовали, а потом манагеры попросили больше детализации. Пришлось костыльнуть, не переписывать же всё с нуля.

                                Дело то житейское.
                                  0
                                  сначала была тестовая комната на 2х человек — называлась рай.
                                  потом дизайнеры нарисовали плоскую землю на трёх китах, потому как красиво, дизайн и всё такое,
                                  потом по мере заселения пришлось делать её круглой, чтобы не сваливались человеки. а некоторые особо ушлые не добывали мясо этих трёх китов.
                                  сейчас вот надо заселять звёздные системы, а на этом «движке» только химические ракеты дают нормальную тягу, а к ним надо ну очень много топлива, до звёзд не долететь.
                                  и на ионниках, тоже не получиться, тяга маленькая.
                                  и вот недавно еще один костыль, EmDrive. не переписывать же всё с нуля.
                                  0
                                  ну еще может есть край мира. может он недалеко от границы солнечной системы

                                  Тогда летящие вояджеры будут расширять границы симуляции, и однажды память в системе кончится и мир рухнет. Мы, правда, тоже исчезнем вместе с ним, так что никогда об этом не узнаем.

                                    0
                                    Поэтому нам iPhone и подкинули, чтобы мы пока на земле посидели.
                                  +5
                                  Пока что самым странным багом является деление на ноль при определении плотности материи, если её слишком плотно упаковать, начинаются глюки.

                                  Например, если Солнце сжать в шарик радиусом меньше 3км, то оно исчезнет.

                                  Я вижу чистой воды баг в механике.
                                    +3
                                    Наоборот, деления на ноль не возникает, потому что эти точки пространства «выколоты» чтобы не генерировать исключения и не вешать обработчики. Для этого пришлось строить Вселенную исключительно на унитарных самосопряжённых операторах, которые не создают развилок в потоках выполнения.

                                    Солнце никуда не исчезает, просто его электромагнитное излучение плавно затухает, гравитация же остаётся.
                                      +2
                                      Возможно, вы просто не до конца понимаете(знаете) механику?
                                        0
                                        А квантовая механика из недавнего топика про квантовую «телепортацию» — и вовсе подсказывает, что мир «рендерится» только в процессе наблюдения и «деструктится» как только наблюдателей нет.
                                        +3
                                        работающий emDrive?
                                          +7
                                          Очевидно же, что нужно биться об стену. Желательно с разбегу и в прыжке. Когда пройдёте сквозь стену, прыгайте в ближайший канализационный люк.)
                                            0
                                            Например, теоретически предсказаны, но не обнаружены топологические дефекты пространства. Например струна, которая обладает следующими свойствами: она очень тонкая, она обладает массой; если пытаться облететь вокруг струны по окружности, то путь окажется короче, чем если лететь в обычном пространстве (без струны).Это как если бы кусок пространства вырезали и края склеили.
                                              +4
                                              Если наш мир — симулятор, я бы воздержался от прыжков в стены :)
                                                0
                                                Ну вот, к примеру, вероятный баг. Это из фундаментальных. Есть еще куча багов с животными. На самом деле, если поискать, можно найти немало вещей, похожих на баги.
                                                  0
                                                  В 99.999% случаях багов, происходит general fault со смертью главного героя, а то и всей программы. Шанс, что баг в симуляторе даст вам сверхспособность практически отсутствует.

                                                  Вы дейстительно хотите попытаться его искать?
                                                  –11
                                                  Необязательно делать так, покрайней мере на первом уровне. Просто запрыгиваете на движущиеся плиты и по ним на самый верх, пробегаете по верху и там будет дырка в потолке которая ведет к этим трем трубам. Насколько я помню, так можно сделать практически везде где есть переходы к трубам (запрыгнуть на кирпичи проложенные по верху)
                                                    +12
                                                    Вы вообще статью прочитали? Сама комната — это не баг.
                                                      +1
                                                      Недопонял, извините.
                                                    +5
                                                    Один раз прошел эту игру на денди с одной жизнью. Я был очень горд собой)))
                                                      +4
                                                      Как я счастлив, что я своей жизнью распорядился иначе.
                                                        +2

                                                        Дааа… потратить время, чтобы прочитать немалую статью, а главное: две страницы комментариев, да потом еще и "блеснуть своим разумом" — это конечно, "ачивка покруче"…
                                                        невооруженным взглядом заметно ваше эффективное использование времени!
                                                        p.s. ценность статьи и комментариев — каждый сам для себя вынесет.

                                                      +6
                                                      Остался один вопрос. Почему игра так глючит, что позволяет Марио пройти сквозь трубу и стену?
                                                        +3
                                                        Сначала Марио каким-то образом «застревает» в стене, а потом игра пытается его вытолкнуть, но не в том направлении, и он погружается ещё глубже. Игра продолжает его выталкивать вправо, и наконец он попадет в Warp Zone. В статье не рассматривается «физика», она только о том, что происходит в памяти, поэтому этот момент не раскрыт.
                                                          +4
                                                          Вот в том то и вопрос, почему он застревает в стене, причём, именно в этом месте, ведь, если побежать в стену снизу, то он не застрянет. Вот и хочется узнать, что там со стеной и/или трубой в этом месте под потолком. А это, вроде, имеет отношение к памяти :)
                                                            +1
                                                            Ну, я наверно недостаточно точно выразился. Разумеется, всё происходящее в игре вообще происходит в памяти. В любом случае, автором этот вопрос не рассмотрен.
                                                              +1
                                                              Насколько я слышал, там есть экономия на определении столкновений. Оно происходит раз в несколько тиков. Возможно, баг связан с тем, что если удачно подгадать, то можно делать такие фокусы. Может быть, есть ещё какие-то факторы.
                                                                +1
                                                                Вообще, баги с погружением в объекты есть много где. В том же Морровинде разных версий были способы навечно погрязнуть в каком-нибудь булыжнике. В Doom и Quake разных версий были способы провалиться сквозь геометрию и упасть в белизну… Только стояла проверка, что ты достиг границы и игрока по достижению границы убивали. А встречались и игры, где этой проверки не было. Там смешно было — бегаешь по пустоте, где-то далеко над головой в тумане уровень, и ничего сделать нельзя…
                                                                В аркадах на 8-битных платформах вообще много таких багов было с хождением сквозь стены и проваливанием сквозь пол — проверка производилась по совпадению точки с границей и если точка персонажа проскакивала эту границу из-за ошибок в целочисленной арифметике (особенно часто при диагональном движении), то персонаж мог проходить сквозь стены. Это, часто, было «документировано» и использовалось для ускорения прохождения игры. За давностью лет забыл уже сами игры, где это встречалось, а в интернетах из-за того, что большинство тех игр было из 80-х, информация так и не появилась… Только про покемонов на геймбое много историй, как ходить сквозь стены :-)
                                                                +12
                                                                Ради экономии памяти в таких играх физика обычно сочеталась с геометрией. Поскольку смещение за игровой цикл нередко было больше одного пикселя, персонаж мог попасть внутрь стены (пола или потолка), по этому такое непроходимые объекты программировали на так называемые коллайдеры, если персонаж внутри — его выталкивает, сообщая ему вектор скорости, если стоит впритык — обнуляет соответствующий вектор скорости (вертикальный для пола/потолка, горизонтальный для стен). Цимес в том, что игра не сохраняет путь персонажа, а потому не знает, откуда он влетел. Так же ради той же экономии не делаются направленные коллайдеры стен (выталкивающие в определённые стороны). Персонажа просто выталкивает в сторону ближайшей границы. Обычно это работает корректно. Но если влететь достаточно глубоко в стену (или в коде коллайдера есть дополнительные баги), то выталкивать начинает в противоположную сторону и персонаж проходит сквозь стены.

                                                                Подобные баги не изжиты и в современных играх. Когда персонажа резко отбрасывает в космос (в скайриме, после удара гигантом в землю) или персонаж «застревает в текстурах» или после застревания его начинает колбасить, на самом деле он застревает в физической сетке. Физический движок сообщает (или нет, в зависимости от реализации) телу импульс, выталкивающий его из твёрдого тела. Если части тела обсчитываются более или менее отдельно (ragdoll), то часть может погрузиться слишком глубоко и части тела начнут получать разные импульсы. Поскольку разрыв 3d-модели не предусмотрен, персонажа начинает мотать из стороны в сторону. Разумеется, современные движки устроены куда сложнее и в отдельных случаях причины колбасенья могут радикально отличаться.
                                                                  +1
                                                                  Какая угрюмая смерть — «застрять в текстурах». И даже руку себе не отрезать — на твое тело наложено проклятье, которое как эхо звучит в подсознании: «разрыв 3d-модели не предусмотрен».
                                                                    0
                                                                    https://youtu.be/igxAkcopAfw?t=1m14s
                                                            +9
                                                            Побольше бы таких статей, прям как в старые добрые
                                                              +10
                                                              Восторг от случайного выпрыгивания с платформы на «крышу» и нахождение ворп-зоны не забыть :3
                                                                +3
                                                                если есть желание посмотреть как выглядит мир -1 https://www.youtube.com/watch?v=tjEW-leqPfc
                                                                  +3
                                                                  Занятно. Особенно, про то, что было целых 3 уровня — "-1, -2 и -3" на оригинальном Famicom. И про то, как они выглядели.

                                                                  Очаровательный по своей многогранности глюк. Такое может произойти только в программе, написанной на очень низкоуровневом языке.
                                                                  +3
                                                                  Посмотрите фильм «Тринадцатый этаж».
                                                                  Там игрок находит баг в его мире.
                                                                    +5
                                                                    Вы не так поняли сюжет:
                                                                    Игрок и его коллега создали виртуальный мир. Коллега, зная о глюке в вирте, решил его проверить в реале. И о чудо, в реале этот глюк тоже воспроизводится — если вдруг поехать туда куда Вы никогда в жизни не собирались, то окажется что там мир «не достроен».

                                                                    Очень хороший фильм.
                                                                      +4
                                                                      Вы бы такие вещи под спойлер прятали, а то вдруг кто не видел фильм. Ну так, на будущее.
                                                                        +1
                                                                        Записал, название в фильма в список «Надо посмотреть» в самое начало.
                                                                        Увидел ваш коментарий, переставил в самый конец.
                                                                        Используйте пожалуйста спойлер в следующий раз.
                                                                          +1
                                                                          Все равно посмотрите) Спойлер не более чем фраза «Нео вдруг узнает, что все мы в Матрице». Фильм стоит просмотра!
                                                                            0
                                                                            Классный фильм!
                                                                            0
                                                                            *фэйспалм*
                                                                            Извините пожалуйста!
                                                                            Я бы и рад пользоваться плюшками редактора, но благодаря местным неадекватным «доброжелателям» мне этот скил недоступен :(
                                                                        +3
                                                                        Еггогология в чистом виде. Только на ПМК размах иссследований глюков АЛУ был пошире.
                                                                          0
                                                                          «Еггог», как много в этом слове…
                                                                          +1
                                                                          Очень уважаю ассемблер-джедаев.
                                                                            0
                                                                            интересная статья, побольше бы статей про баги

                                                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                            Самое читаемое