Рисуночные символы предназначены для рисования символов на картинках, а системные символы - для вызова шрифтов, идущих в комплекте с телефоном, которые в принципе можно отличить по внешнему виду. После того, как текст такой игры будет переведен на китайский язык, вся игра отобразит «口口口口口口» (пусто). Для игр, в которых используются собственные графические символы, методы перевода на китайский включают матричную китаизацию и модификацию системных символов. Матричная локализация имеет свои ограничения, такие как слишком много текста, матричные индексы в файлах классов и т. д., и применима только к некоторым играм. Многие из них изменены на системные слова. Модификация требует от вас определенного понимания языка Java, поэтому перед чтением этого руководства, если вы не знаете Java, рекомендуется загрузить и изучить JAVA Beginners , чтобы понять JAVA (необходимо необходимо распаковать). Инструменты подготовки стороны S40: MC, MobyExplorer,
Декомпиляция Mocha
Редактор байт-кода BE
jasmin(/ur l)
(url=http://down2.s60net.com:8118/res/201112/10/17938831/paojiao_94825.jar?) предыдущий аудитор ( /url)
(url=http://down2.s60net.com:8118/res/20118/15/89301505/paojiao_89300.jar?) Disass embler2Jasmin
Среди Java-игр, использующих графические шрифты, игры производителя игр DigitalChocolate являются самыми простыми. В общем, игра DigitalChocolate модифицирована. Игра «Шоколад» — это введение в обучение. Метод модификации игры этого производителя представляет собой фиксированную формулу и не очень сложен. В качестве примера возьмем « My Pet Shop My Pet Store» компании DigitalChocolate. После распаковки игры используйте декомпиляцию Mocha, чтобы декомпилировать содержащиеся в ней файлы классов, и кратко просмотрите их, чтобы найти следующие методы: public? (Изображение изображения, DataInputStreamdatainputstream, Шрифт шрифта, int?, int?) {} Мы обнаружили, что это находится в i. В классе, вообще говоря, файлы этого метода находятся в файлах классов размером от 3 до 4К. Поэтому отдавайте приоритет открытию для просмотра файлов размером от 3 до 4К, и вы быстро их найдете. public i (изображение изображения, DataInputStreamdataInputStream, шрифт шрифта, inti1, int j1) {int k; интервал я2; интервал j2; чар ч; if (image ! = null) (опущено...) Нам нужно добавить image = null выше if (image! = null). Не думайте об этом в i. Добавить его в Java не получится. Из-за путаницы или причин, связанных с инструментами, декомпилированный Java-файл не может быть скомпилирован обратно в файл класса. Цель может быть достигнута путем изменения байт-кода. Сначала создайте новые папки «1» и «2» и поместите i. Вставьте класс, откройте программу Disassembler2Jasmin, и вы увидите два адресных поля. Заполните первый, E:/1/i. Заполните второе поле класса E:/2/. Нажмите «Unshell» на левой программной клавише и измените i. Класс декомпилируется в байт-код, который генерирует i. j-файл. Откройте i с помощью текстового редактора. j, который представляет собой так называемый байт-код, найденный в начале: ignorespecial java/lang/Object/
astore_1 перед aload_1 и, наконец: ignorespecial java/lang/Object/
astore_1, а затем сохраните и просмотрите его, что гораздо удобнее. -------------Основной процесс работы такой, зачем вам нужно его модифицировать? О принципе поговорим ниже. В я. Мы видим этот метод в Java: public void a (Графическая графика, строковая строка, int i1, int j1, int k1) {if (a! = null) {...graphics. setClip(i5, j5, k5 - i5, i6 - j5); графика. drawImage(a, i1 - (a[i4] & 255), j1 - a[i4] - b2, 20);}i1 += b1 + c;}graphics. setClip(i2, k2, i3, j3); return;} Примечание. Многие игры используют метод public void a (Graphicsgraphics, String string, int i1, int j1, int k1...) для рисования строк. В разделе if мы видим метод setClip для обрезки картинок. Принцип метода setClip заключается в отображении на экране только части контента так, чтобы отображалось содержимое картинки, находящейся именно в этой части. drawImage — метод, используемый для рисования указанных изображений. Легко представить, что метод if используется для отображения слов-картинок. графика. УстановитьФонт (а); int j2 = графика. getColor();if (a){......graphics. установитьЦвет (б); графика. drawString(строка, i1, j1 - 1, k1); графика. drawString(строка, i1 - 1, j1, k1); графика. drawString(строка, i1 + 1, j1, k1); графика. drawString(строка, i1, j1 + 1, k1);} графики. УстановитьЦвет (а); графика. drawString (строка, i1, j1, k1); графика. setColor(j2);} Примечание. Часть ниже if является ключевой. Мы видели метод drawString для рисования строк, поэтому знаем, что нам нужно сделать, чтобы этот метод не выполнял часть внутри if, а напрямую переходил к части системного слова, расположенной ниже. (Дополнение: если операторы условного расхождения преобразуются в разные процессы в соответствии с разными условиями. Затем посмотрите на начало, если (a! = null), мы видим, что оно оценивается путем оценки переменной a. И где эта переменная определена? Ранее мы говорили о методе public c (Image image, DataInputStreamdatainputstream, Font font, int i, int j), мы могли бы также сократить и посмотреть. public i (Image image, DataInputStreamdataInputStream, Шрифт шрифта, int i1, int j1) {int k; int j2; int char ch; if (image ! = null) {a = image; ...} else {a = font; a = i1;б = j1; а = j1! = -1; } Примечание. Как видите, этот метод использует переменную a, и ответственность этой переменной — определить, является ли количество изображений нулевым. Затем я увидел шрифт = в else; это предложение означает присвоение размера шрифта (переменной шрифта), что можно понимать как присвоение системного шрифта a. Поэтому мы надеемся попытаться заставить этот метод всегда выполняться else, чтобы мы могли добавить image = null перед if (image ! = null); Таким образом, значение image вначале равно нулю, и часть else будет выполнена. В байт-коде: aload_1ifnull Label216 соответствует if (image! = null). (Из-за этого инструмента изменить положение на мобильном телефоне сложнее, чем на компьютере.) aload_1 — загрузить первый (1) объект, на который ссылается локальная переменная, и поместить его в стек. Первая локальная переменная соответствует изображению в первой позиции имени метода. Добавьте сюда image=null, чтобы создать нулевую сумму для изображения. aconst_nullastore_1 Если вы хотите узнать больше об этом принципе, вы можете взглянуть на Java Bytecode Revealed. Следует отметить, что «1» в astore_1 основано на предыдущем if (image ! = null). Видим, что третья строка — aload_1, здесь она 1, значит, astore_1 тоже должна быть 1. В свою очередь, если это aload_2, то это должно быть astore_2 и так далее. aconst_null
astore_1 Этот сегмент кода является относительно механическим, поэтому его можно запомнить. Игры, выпускаемые Digital Chocolate, относительно фиксированы, и каждый, кто хочет локализовать свои игры, должен изменить их таким образом. Модификации игры DC по сути являются основой для многих игровых модификаций. Поэтому рекомендуется досконально освоить его каждому. Игры других производителей не так просты, и даже игры одного производителя могут иметь разные способы модификации. Что необходимо, так это постоянное обучение и практика, накопление опыта и углубление понимания Java.
-------------------Китайская версия текста игры Digital Chocolate. После успешной замены символов изображения на системные символы вы можете напрямую перевести текст на китайский язык. Языковые файлы — это в основном l0_0, l0_1, l0_2 и так далее. В "Моем зоомагазине" обычно выбирайте китайский l0_0 (английский). Используйте плагин в папке SUMEA в компьютерном инструменте Halo, чтобы открыть и изменить его напрямую. На мобильном телефоне вам нужно использовать шестнадцатеричный формат. Откройте l0_0 в шестнадцатеричном формате. 00 00 3c 75 представляет общее количество байтов 15477, 00 00 01 6c представляет общее количество начальных байтов 364, 00 00 05 b8, 00 00 05 c1... представляет начальный байт поля. Что такое начальный байт поля? Левая софт-клавиша - Редактировать - Перейти по адресу, введите адрес 0x5b8 или десятичное 1464. После подтверждения вы обнаружите, что он идет на байт номер 00 06 английского языка. Затем введите второй 0x5c1, чтобы перейти к 00 02 из Ok ниже. Каждый начальный байт по очереди соответствует следующим полям. Грубо говоря, 5b8 — это общее количество байт до 00 06. Количество байтов изменится, когда мы его локализуем, и их необходимо модифицировать, что довольно сложно и хлопотно.