aNNiMON, в общем: вернулся я к этому делу) маленько подучил некоторую информацию по J2ME и исправил ошибку разработчиков игры.(ну может это была и не ошибка, но явная недоработка добавляющая хардкор игре). Через
luyten-0.5.4 смог прочитать поведение кода и нашел функцию, которая сбрасывала все состояния кнопок. Как мы помним за кнопки управления отвечает класс наследующий
Canvas, где и запрятаны нужные функции-события для нажатых кнопок:
keyPressed и
keyReleased.
keyPressed: //срабатывает, когда какая-то из кнопок нажимается(в нашем случае задает состояния обьекта)
Открыть спойлер
Закрыть спойлер
public void keyPressed(final int g) {
int gameAction = 0;
Game.p = false;
Game.q = false;
Game.g = g;
if (Game.g == -6) {
Game.s = true;
return;
}
if (Game.g == -7) {
Game.r = true;
return;
}
try {
gameAction = this.getGameAction(g);
}
catch (Exception ex) {}
if (Game.g == 49) {
Game.p = true;
return;
}
if (Game.g == 50) {
Game.k = true;
return;
}
if (Game.g == 51) {
Game.q = true;
return;
}
if (Game.g == 52) {
Game.m = true;
return;
}
if (Game.g != 53) {
if (Game.g == 54) {
Game.n = true;
return;
}
if (Game.g == 56) {
Game.l = true;
return;
}
if (gameAction == 1) {
Game.k = true;
return;
}
if (gameAction == 6) {
Game.l = true;
return;
}
if (gameAction == 2) {
Game.m = true;
return;
}
if (gameAction == 5) {
Game.n = true;
return;
}
if (gameAction != 8) {
return;
}
}
Game.o = true;
Game.s = true;
}
keyReleased://задается при отпускании кнопки
Открыть спойлер
Закрыть спойлер
public void keyReleased(final int n) {
u();
}
Вот тут я и насторожился, что опускается любая из кнопок а функция на всех одна и не особо был удивлен когда увидел это:
Открыть спойлер
Закрыть спойлер
private static void u() {
Game.k = false;
Game.l = false;
Game.m = false;
Game.n = false;
Game.o = false;
Game.r = false;
Game.s = false;
}
немного поискав декомпиляторов, я понял, что изменить class на уровне того что я вижу, никак нельзя - class-файл это бинарный файл и в него никак не запихнуть элементарное
if else т.е. декомпилятор можн использовать как средство чтения и мониторинга изменений в нем. В долгих поисках байт редакторов, перебрав пару десятков то ли с кривым интерфейсом, то ли с некорректной функциональностью, я смог найти парочку что бы реализовать, хоть какие то изменения. Открыв файл в байткод виде, я смог изучить поведение и значения команд
Открыть спойлер
Закрыть спойлер
private static void u();
Flags: PRIVATE, STATIC
Code:
0: iconst_0
1: putstatic Game.k:Z
4: iconst_0
5: putstatic Game.l:Z
8: iconst_0
9: putstatic Game.m:Z
12: iconst_0
13: putstatic Game.n:Z
16: iconst_0
17: putstatic Game.o:Z
20: iconst_0
21: putstatic Game.r:Z
24: iconst_0
25: putstatic Game.s:Z
28: return
Использовав байт-редактор
recaf-1.15.8.jar(просто офигенный байт-редактор) я смог удалить ненужные строки и добавить свои. При чем class-файл не пришлось даже с архива извлекать. И вот что я сделал:
Открыть спойлер
Закрыть спойлер
private static void u() {
Game.r = false;
Game.s = false;
}
//////////////////////////////////////
public void keyReleased(final int n) {
u();
if (n == 50 || n == -1) {
Game.k = false;
return;
}
if (n == 52 || n == -3) {
Game.m = false;
return;
}
if (n == 53 || n == -5) {
Game.o = false;
return;
}
if (n == 54 || n == -4) {
Game.n = false;
return;
}
if (n == 56 || n == -2) {
Game.l = false;
return;
}
if (n == 49) {
Game.p = false;
return;
}
if (n == 51) {
Game.q = false;
}
}
и вуаля: состояние снимается тогда и только тогда, когда соответствующая кнопка будет отпущена. Игра стала в разы комфортнее) Прикрепляю ее сюда.
Хотелось бы доделать пару уровней, но из-за лексической обфускации там черт ногу сломит, а сидеть и угадывать по типам где какая переменная не зная всех законов и поведений преобразований типов это...не то что бы невозможно, но пока не в моих силах.
Благодарю тебя за начальную помощь. Условно говоря: ты действительно сделал все за меня. Сейчас я задумался над тем, что на ПК на тек момент ни одного годного эмулятора J2ME, так как даже KEmulator надо жестко проредактировать в плане как интерфейса так и функций, так бы можно было использовать с открытым кодом MicroEmulator в котором помимо интерфейсных недоработок, еще надо бы прикрутить поддержку JSR-184 и хотелось бы попытаться сделать, то что пока никому не было доступно: сделать легендарный MascotCapsule 3D, тот самый который доступен только SonyEricsson-ам и то не всем) Ну в общем: у меня все. Будет что интересное поделюсь.
Прикрепленные файлы:
Bravian_Lands_0(…).jar (147.64 кб.) Скачано 207 раз