MissingNo. 글리치는 단일한 버그가 아닌, 여러 작은 코드 특성들이 예상치 못하게 결합되어 발생했습니다. 이는 주로 게임보이의 극심한 메모리 제약과 어셈블리 언어 사용에서 비롯되었습니다.
MissingNo. 글리치 발생 원인
1. 해안 타일의 포켓몬 조우 로직
-
문제점: 야생 포켓몬 조우 여부를 판단할 때는 플레이어 캐릭터의 오른쪽 아래 서브타일(물)을 참조하는 반면, 조우할 포켓몬의 종류(물/풀)를 결정할 때는 왼쪽 아래 서브타일(육지)을 참조합니다.
-
결과: 플레이어가 해안선을 따라 이동할 때, 물 위에 있지만 육지 포켓몬(풀 타입)을 만날 수 있는 상황이 발생합니다.
2. 지역 전환 시 조우 테이블 유지
-
문제점: 새로운 지역으로 이동할 때, 해당 지역의 풀 포켓몬 조우율이 0보다 큰 경우에만 해당 지역의 조우 테이블을 복사합니다. 그렇지 않으면 이전 지역의 조우 테이블이 그대로 유지됩니다.
-
결과: 비전 시티(Viridian City)에서 노인 튜토리얼을 진행한 후, 다른 풀 지역을 거치지 않고 시나바 섬(Cinnabar Island)으로 날아가면 비전 시티의 조우 테이블이 유지됩니다.
3. 플레이어 이름 저장 방식
-
문제점: 노인 튜토리얼 중 플레이어의 이름이 임시로 풀 포켓몬 조우 테이블 메모리 영역에 저장됩니다.
-
결과: 특정 문자(예: 대문자 ‘S’)나 이름 끝의 제어 문자가 MissingNo.의 내부 ID(146)에 해당하는 십진수 80으로 매핑되어, 가짜 MissingNo. 조우 테이블이 생성됩니다.
4. 포켓몬 데이터 처리 및 인덱싱 오류
-
문제점: MissingNo.의 내부 ID(0)를 포켓몬 도감(Pokédex) ID로 변환하는 과정에서 1바이트 부호 없는 정수(unsigned integer)가 언더플로우되어 255가 됩니다. 이 값이 배열 인덱스로 사용되어 151개 항목의 배열 범위를 넘어선 256번째 인덱스를 참조합니다.
-
결과: 배열의 끝을 넘어선 메모리 영역(예: 다른 트레이너의 포켓몬 데이터 또는 코드)을 읽어오게 되며, 이를 스프라이트 데이터로 압축 해제하려 시도하여 MissingNo.의 손상된 그래픽이 나타납니다.
5. 인벤토리 아이템 복제
-
문제점: 포켓몬 도감 ‘발견’ 비트맵 데이터 바로 뒤에 인벤토리 데이터가 저장되어 있습니다. MissingNo.를 조우하면 가상의 256번째 포켓몬을 도감에 기록하려 하는데, 이 과정에서 도감 데이터 영역을 넘어 인벤토리 데이터에 쓰기 작업을 수행합니다.
-
결과: 인벤토리의 6번째 아이템 수량 바이트의 최상위 비트(high bit)가 설정되어, 아이템 수량에 128이 추가됩니다 (단, 기존 수량이 128 미만일 때).