Вопрос как раз очень правильный.
Есть два пути изменения текста: с использованием пойнтеров и без использования. Пойнтер - это указатель на начало (а иногда и середину) строки. Игра знает, где размещены таблицы пойнтеров, поэтому при необходимости отобразить строку, она читает пойнтер и переходит на начало строки. Первый путь не подразумевает изменения пойнтера, и действительно не порождает глюков, но длина всех русских строк должна быть меньше или равна английским, что не всегда возможно, поэтому появляются всякие извращения в виде сокращений или дурацких фраз, лишь бы уместиться в отведенную длину. Второй путь логичнее: после изменения всех строк пересчитываются их длины и соответственно им изменяются адреса пойнтеров, что позволяет использовать любую длину строк.
Моя самописная программа ищет пойнтеры так: получив адрес начала строки она сканирует РОМ от начала до конца выискивая совпадения. Эти совпадения по умолчанию считаются адресами пойнтеров и модифицируются в процессе заливки текста в РОМ. Но существует небольшая вероятность, что адрес строки случайно совпадет с кодом игры. То есть, например, адрес начала строки 00168170h, в эмуляторе и GBA РОМ размещается с адреса 08000000h поэтому к адресу начала строки надо прибавить это значение, получая в итоге 08168170h, и программа ищет в РОМе последовательность байт 70 81 16 08. Все места, где эта последовательность обнаружилась считаются пойнтерами, а так как адрес начала русской строки будет другой, то они все изменятся. И вот случайно в коде игры (не в таблице пойнтеров, а именно в исполняемом коде) встречается такая последовательность. Она ошибочно считается пойнтером и модифицируется. Это и порождает глюк. Отлавливается по некорректному адресу пойнтера, он слишком маленький. В следующем переводе я постараюсь лучше изучить структуру таблицы пойнтеров для корректного их извлечения.