FAQ: Правим SOFT кнопки
Автор: Zveka
Оформление: aNNiMON
Во многих случаях в этом вам поможет программа Java Adapter, в освоении не трудна.
Но Java Adapter не идеален, и поэтому иногда правит софт-кнопки не так, как надо, или вообще отказывается что-то изменять.
И тогда приходиться с помощью программы Java Bite править софты вручную (можно править не только софты, а ещё к примеру циферки 132 и 176 к примеру).
Необходимые программы: Java Adapter, Java Bite, Java Decompiler, Win Hex
Исправления на примере Darkest Fear от Rovio:
1. Делаем копию игры.
2. Извлекаем все файлы из игры и копии игры в свои каталоги (Darkest Fear и Копия Darkest Fear).
3. Пропускаем копию игры через Java Adapter и смотрим, в каких классах он делает исправления (в нашем случае это будут классы l.class и n.class). Стоит помнить, что показываемые классы могут быть ошибочны, и кнопки могут быть спрятаны например в классе a.class.
4. Теперь пропускаем классы l и n (из папки копии игры) через Java Decompiler и смотрим код на наличие нокиевских (в этом случае) софт кнопок (почти всегда это слова case со значением) -6 и -7 и видим, что они только в n.java.
5. Запускаем Java Bite и открываем класс n.class из папки Darkest Fear (Classes -> Add Java Class).
Работа в Java Bite:
1. Слева раскрываем + и видим список, раскрываем ещё один + возле Methods, нажимаем на Methods, справа появится список из класса, как в нем идут все его функции по порядку, слева же ниже Methods они показаны по алфавиту.
2. Смотрим текст n.java чтобы узнать, куда же следовать в Java Bite. И увидим, что кнопки расположены в блоке private int _aII(int i), а сразу за ним идет public final void keyPressed(int i). Смотрим в Java Bite список справа и находим этот блок а выше keyPressed, но так же видим что существуют и другие блоки а, а программа не сумеет открыть нужный нам блок, если их много. Поэтому щелкаем 2 раза на нужном блоке а и в 1й строке появившегося окна изменяем его имя на другое, которого нет в списке, например [[C. И тут в списке слева появится внизу искомый нами блок, нажимаем на него.
3. Справа появляется его содержимое, нас интересует строка tableswitch, кликаем на неё. В ней даны кнопки и их значения от -7 до 57 (порядок от минуса к плюсу строго обязателен). Сименсовские софты соотвествуют -1 (левый) и -4 (правый) нокиевским -6 и -7 соответсвенно. Кликаем на значение 00000140 напротив CASE -1 и ставим там значение CASE -6 (это 00000138). То же делаем и с -4.
4. Нажимаем Methods и переименовываем обратно из [[C в а
5. Делаем сохранение Class -> Save Class и закрываем программу. Появится вопрос при закрытии, жмите нет.
6. Запаковываем игру, вуаля, софты работают.
По аналогии пробуйте ковырять другие игры, с опытом научитесь другим хитростям.
Про преверификацию, исправление других кнопок, добавлению своих кнопок, работу в Win Hex будет позже...
Добавление:
Еще можно использовать вторую версию Java Adapter'а, которая намного надежнее и стабильнее предыдущей. Скачать можно здесь
Еще кнопки указываются в конструкциях bipush_000 (где 000 это число до 256). Минусовые кнопки отбавляются от 256, например -4 это bipush_252, положительные, типа 26 так и будут 26.
В игре выше кнопки были в конструкции tableswitch, реже попадается конструкция lookupswitch и тогда Java Bite отпадает, он не умеет ее править. На помощь приходит WinHex.
Находим игру Alpha Wing EX и потрошим ее e.class , открыв его в Байте. В методах выбираем GetGameAction и справа видим этот lookupswitch. Далее смотрим на название колонок и «оттягиваем» столбик Disassembled вправо, освобождая столбик ByteCode.
Далее видим в столбце код примерно такого вида: AB0000000000790000000AFFFFFFFC00…. Запоминаете его или запишите (четное количество символов кода) и открываете WinHex’ом e.class Жмем Ctrl+Alt+F и вводим часть кода для поиска (чем больше, тем точнее); найдя его чуть-чуть далее кода будут идти коды FF FF FF FA и FF FF FF F9 (FA это значение -6, F9 значение -7).
Узнать как будет выглядеть -1 в хексе легко, жмем F8 и в окошке справа пишем цифру для перевода 255 и жмем enter (берем 256 -1=255) получаем FF.
Терь просто правим FA на FF и F9 на FC и сохраняем. Так значения -6 и -7 из конструкции lookupswitch станут -1 и -6.
Превирификация
Тут наглядных примеров не будет, расскажу на словах.
Допустим, вы исправили конструкцию iconstr_null на bipush_255 (это кнопка -1, иногда так отображена в Байте). Или когда в конструкции tableswitch со значениями от -7 до -1 расширяете ее от -62 до -1 и прописываете значения для сименса (-62 значение от -4, для -26 значение -5 и т.д., этим вы добавите рабочий джойстик) и сохраните ее. Т.е. вы добавив или убавив байтов обязаны прогнать игру через превирификатор и заменить правленый класс на превирифицированный, иначе игра работать не будет.
Прикладываю архивчик, все файлы игры ложить в папку default, жать 1.bat и смотреть папку output, если там не все классы, или правленый класс по размеру меньше, то или вы где-то накосячили, или игра противится внесениям таких изменений…
Вообще это все из пака эмуляторов телефона сименс, выдрал оттуда, вроде работоспособно, если нет, жалуйтесь.