¿Por qué no aparece el nombre de clase de n pero d cuando uso halo2.0? Por favor, dé una respuesta de experto.
Las modificaciones de BT pueden destruir la diversión original del juego, por lo que no lo recomiendo, solo para intercambios técnicos. Sin embargo, si quieres experimentar la diversión del juego, descarga la versión original tú mismo.
Herramientas: halo2.0, DJ Java Decompiler
Juego Java: Legend of Heroes s60 versión original (S60V3, 240*320) (Este artículo es sólo un ejemplo. Por qué el original ¿Por qué solo la versión S60? Esto es para permitir que más fanáticos modifiquen la versión china de Legend of Heroes por sí mismos, porque estarás motivado si quieres jugarlo (si usas mis modificaciones directamente, no podrás hacerlo). aprenda las modificaciones de BT). /p>
1. Preparación de datos
¿Qué es la preparación de datos? ¿Por qué necesitamos preparar los datos? En resumen, ¿qué datos necesitamos modificar y cuáles son los originales? ¿Valores iniciales en el juego? Entonces, usemos sjboy para simularlo primero y veamos qué datos de atributos necesitamos cambiar.
¡Cuando selecciones un personaje, la pantalla parpadeará directamente! No ingresas al juego incluso si presionas la tecla F3. De hecho, mientras sigas presionando la tecla F3, el juego se ralentizará. Después de ingresar al juego, accederás a la interfaz del menú de personajes.
Bueno, principalmente los siguientes datos, dinero 300
Imagen 1: Nivel número 1, valor de experiencia 0, la actualización requiere valor de experiencia 80, valor de salud 72/72, valor de maná 60/60
Imagen 2: Fuerza 8, salud 5, agilidad 3, Voluntad 4, ataque 16, defensa 5
Figura 3: Se pueden sumar 0 puntos
2. modificar datos
Entonces, busquemos estos datos uno por uno y modifíquelos a los valores BT que desee. Revise el tutorial sobre cómo modificar bb, abra halo2.0, seleccione el editor de clases y edite. , búsqueda de texto completo, ingrese 300 (por qué es 300), porque este valor es bastante especial. La tasa de repetición es relativamente pequeña. Si elige 1, 0, 8 u otros, puede encontrar muchos entusiastas sin ellos. Los fundamentos de programación no sabrán cuál elegir. ¿Por qué no elegir 72 Special? ¡Quiero contarles algunas noticias desafortunadas cuando busquen en este juego! se encuentran. ¿Por qué? No, es el análisis de los archivos compilados en el futuro). Solo se encontró un objetivo y los parámetros se modificaron de acuerdo con el tutorial de bb: dinero 300, fuerza 8, vida 5, agilidad 3, voluntad 4, 5 valores.
Entonces, según el método de bb, ¿por qué no puedo encontrar otros valores relevantes? ¿Y si tengo que modificarlo? En realidad, hay dos formas de asignar valores de atributos, una es explícita, como i = 300 o a = 5, y el tutorial de bb solo puede modificar estos datos. El otro es implícito, como a = (b c)*100, etc. Este tutorial se centra en la modificación de valores implícitos.
En términos generales, si asigna valores de atributos, estarán en el mismo archivo de clase, por lo que como encontramos la clase para money300, también deberíamos encontrar los otros valores de atributos.
Entonces, ¿en qué archivo de clase se encuentra money300? La respuesta está en el nombre de la clase en los resultados de la búsqueda: ao.
Ahora use DJ para descompilar ao.class, busque 300 y luego encuentre a_g_fld.a = 300, es decir, el nombre de la variable de; El dinero es a_g_fld a, ¡el valor es 300! Luego busqué 8, 5, 3 y 4 respectivamente, ¡y los encontré todos!
Ejemplo 6: // '\006'
b_short_fld = 8;
e_short_fld = 5;
f_short_fld = 3;
g_short_fld = 4;
a_e_array1d_fld[0] = (e)ad.a((byte)0, (byte)0, verdadero, falso);
a_e_array1d_fld[0].b = true;
a_e_array1d_fld[0].h = 1;
break;
Jaja, la variable de potencia se llama b_short_fld La siguiente analogía no lo explicará.
Luego busqué 72 y descubrí que no estaba allí. Esto también confirma que se trata de una asignación implícita. Entonces, ¿qué debemos hacer? Hay tantas variables que parece que a los personajes les da vueltas la cabeza, pero aún así es difícil saber cuál es cuál. Al principio lo pensé durante mucho tiempo, analizándolos uno por uno, pero fue demasiado lento. Así que primero busqué b_short_fld para ver si podía encontrar el quid.
h_short_fld = ((b_short_fld m) * 4) / 5
i_short_fld = (b_short_fld m) / 5
dataoutputstream.writeShort(b_short_fld);
¿No son los dos primeros los llamados implícitos? ¿Qué representan h y i? Ignoralos por ahora. La última oración es una operación de flujo io, lo que significa escribir el valor de la variable b_short_fld. Esta frase nos da algo de inspiración.
Porque resulta
dataoutputstream = new DataOutputStream(bytearrayoutputstream)).writeByte(f_byte_fld);
dataoutputstream.writeByte(g_byte_fld);
dataoutputstream.writeShort(e_short_fld);
dataoutputstream.writeShort(f_short_fld);
dataoutputstream.writeShort(g_short_fld);
Siempre que encuentres la fuente de estos datos, que es la fuente de los valores de los atributos. Las últimas 4 variables son los 4 parámetros de atributos del tutorial de bb, por lo que no los discutiré aquí.
1. Comencemos con la variable f_byte_fld. Primero busque qué representa esta variable. Hay 3 lugares para buscar esta variable: ****. Los dos primeros son escritura y lectura, y el otro asigna el valor inicial del byte público f_byte_fld = 0, así que no lo comprobaré por ahora.
2. La variable g_byte_fld todavía está buscando, g_byte_fld = 1; además, hay varios juicios que se omiten y los entusiastas interesados pueden estudiarlos por sí mismos.
Además, si (g_byte_fld lt; 99)
{g_byte_fld;
......
}
Adivina el nivel. Si la variable es menor que 99, recurre... Después de la prueba, de hecho es la variable la que representa el nivel. Luego intentemos cambiar la variable a 11, es decir, cambiar g_byte_fld = 1 a g_byte_fld = 1; entonces esta es una función explícita. El método de modificación es el mismo que el del tutorial de bb. /p>
3 .Variable a_int_fld = d_int_fld; b_int_fld = e_int_fld; Luego primero miramos la variable d_int_fld int_fld
d_int_fld = (e_short_fld n g_byte_fld) * 12;
e_int_fld = (g_short_fld p g_byte_fld) * 12 ;
Nos da algo de esperanza. Dado que 72 y 60 son múltiplos de 12, probablemente esto sea lo que estamos buscando.
Hasta donde sabemos, e_short_fld = 5, g_short_fld = 4 (mencionado anteriormente), por lo que g_byte_fld es el nivel mencionado en la Sección 2, es decir, los valores mágicos y de salud y la salud relacionados con la voluntad, están relacionados con el rango. Entonces, ¿qué significan n y p?
anulación final pública n()
{
e ae1[] = (e[])a_e_array1d_fld;
m = 0 ;
n = 0;
o = 0;
p = 0;
for(int i1 = 0; i1 lt ; 5; i1 )
if(ae1[i1] != nulo)
{
m = ae1[i1].j[0];
n = ae1[i1].j[1];
o = ae1[i1].j[2]; .j[3];
}
No hay diferencia entre n() y la asignación en recursividad. Los valores iniciales son n = 0 y p = 0; después de la sustitución, d_int_fld = 72; e_int_fld = 60, ^_^, el valor final es el valor real. Entonces la modificación más simple es modificar el coeficiente 12, porque esto no cambia la fórmula original y es fácil de operar. Por supuesto, también se puede modificar a otros valores. Lo cambié como dije, cambiando 12 por 60. En teoría debería ser 360 y 300.
Pasos de operación para Halo2.0: abra el frasco y seleccione ao.class. Haga clic derecho para editar la clase y aparecerá la siguiente imagen:
Descompilar, d_int_fld = (e_short_fld n g_byte_fld) * 12 en public final void n (), y luego usar el método halo2.0; para encontrar Encuentre n en el método 0, descubra que el control de acceso público y final se han verificado y el tipo es nulo, que es exactamente lo mismo que la descompilación, y luego seleccione el código en el método n, como se muestra en la figura
Compare 159 bipush 12 y 180 bupush 12 de 12 se cambian a 60, guarde el método, compile, empaquete y ejecute:
Es consistente con la suposición. Por supuesto, Binggo también puede modificar directamente la función implícita, lo cual no se discutirá aquí.
(No hay restricciones de modificación. Siempre que se te ocurra, hay muchas formas de modificarlo. Solo proporciono algunas ideas)
Entonces, ¿qué se encontró a_int_fld antes? Sigue buscando,
public final void b(int i1)
{
a_int_fld = i1;
if(a_int_fld gt ; d_int_fld )
a_int_fld = d_int_fld;
if(a_int_fld lt; 0)
a_int_fld = 0;
bs.a_as_static_fld c( );
if(a_int_fld == 0)
{
a((byte)6);
super k = 0;
u = 24;
regresar
} más
{
regresar
p>
}
}
Por lo tanto, podemos saber que a_int_fld representa el valor actual de salud. Asimismo, sabemos que b_int_fld representa el valor actual del valor mágico.
4. Variable c_int_fld, c_int_fld = 0; el valor inicial es 0, ¿es un valor empírico? Continuar leyendo,
public final void f(int i1)
{
i1 *= 4;
for(c_int_fld = i1 ; c_int_fld gt; = f_int_fld;)
{
c_int_fld -= f_int_fld;
r();
}
if(c_int_fld lt; 0)
c_int_fld = 0;
bs.a_as_static_fld.e();
a_p_fld.a(i1)
}
Ahora que aparece f_int_fld, lo encontrarás buscando
f_int_fld = (g_byte_fld * g_byte_fld * g_byte_fld - g_byte_fld * g_byte_fld) 80 * g_byte_fld ;
Me emocioné cuando vi 80, porque el valor inicial de g_byte_fld es 1 (ya buscado antes), luego el valor inicial de f_int_fld es 80, jaja, finalmente encontré los puntos de experiencia necesarios para actualizar. . Para verificar nuestra conjetura, intenta cambiar 80 a 99, como se muestra en la imagen, de hecho es el caso:
Jaja, simplemente cambia f_int_fld a 1 y podrás alcanzar el nivel N matando un monstruo. , o una función compilada por mí mismo, que te permite subir de nivel venciendo a un monstruo.
Volviendo a c_int_fld hace un momento, cuando c_int_fld = i1; c_int_fld gt; = f_int_fld;, c_int_fld = i1; c_int_fld -= f_int_fld; supongo que la variable c_int_fld representa el valor de la experiencia. Porque, si c_int_fld = 82gt;80 entonces sube de nivel y el valor de la experiencia se convierte en 82-80 = 2. Bien, simplemente modifiquemos el valor inicial de c_int_fld, c_int_fld = 0, intentemos cambiar 0 a 66.
Modifique la declaración de asignación de variables en el método público final void c (byte byte0) para obtener la siguiente imagen:
En este punto, la Figura 1 incluye el número de niveles, el valor de la experiencia y el valor de la experiencia necesarios para la actualización. valor de salud, maná y todos los demás parámetros. Todos han sido encontrados y modificados.
5.a.addElement(new aw((byte)4));
a_short_fld = 3;
}
Análisis , la variable a_short_fld representa la cantidad de puntos que se pueden agregar al addable. ¿Por qué sucede esto? En primer lugar, el valor inicial es 0. Además, en el nivel 99, cada variable de subida de nivel tiene su propio número base 3, que presumiblemente representa la cantidad de puntos que se pueden agregar después de actualizar. Como se muestra en la figura después de la modificación:
En este punto, los datos escritos en el proceso de operación de io se han analizado uno por uno. Sin embargo, todavía parecen faltar los valores de ataque y defensa en la Figura 2. Entonces, ¿dónde se esconden? De hecho, lo busqué durante mucho tiempo pero no pude encontrarlo. Más tarde me di cuenta de que el valor de ataque está relacionado de alguna manera con el valor de poder a medida que se modifica el valor de poder, el valor de ataque también cambiará en consecuencia. >
Entonces, busquemos la variable b_short_fld. Encontrado
h_short_fld = ae1[0] == null ?0: ((short) (ae1[0].a (ae1[0].e * 5) / 2));
h_short_fld = ((b_short_fld m) * 4) / 5;
i_short_fld = ae1[1] == null ?0: ((corto) (ae1[1].a ae1[1 ] .e));
i_short_fld = ae1[2] == null ?0: ((corto) (ae1[2].a ae1[2].e * 2));
i_short_fld = ae1[3] == nulo ?0: ae1[3].a;
i_short_fld = ae1[4] == nulo ?0: ae1[4].a; p>
i_short_fld = (b_short_fld m) / 5;
i_short_fld = g_byte_fld / 3;
h_short_fld e i_short_fld son funciones implícitas muy especiales relacionadas con el poder, dignas de nuestra atención.
Después de la modificación, descubrimos que de hecho es como esperábamos (la forma en que cambian las variables específicas no está incluida en la expansión y la base de datos de variables involucrada es grande. Me temo que muchos entusiastas se sentirán confundidos Después de leerlo, los fanáticos interesados pueden consultar algunos conocimientos básicos).
El 4 en h_short_fld =((b_short_fld m)*4)/5 se cambia a 40, y la división idiv en i_short_fld =g_byte_fld/3 se cambia a multiplicación imul (los gráficos específicos no aparecen en la lista, si puedes operarlo hábilmente, halo2.0 debería estar bien, simplemente cambia el desplazamiento 433:idiv, edita (avanzado) y cámbialo a imul)
Después de obtenerlo, el ataque se convierte en 74 y la defensa. se convierte en 8
3. Resumen: este tutorial explica principalmente cómo encontrar datos de destino. El funcionamiento de halo2.0 no se explica en detalle, ¡comprenda!
Todos los datos en la preparación de datos se han encontrado uno por uno.
La modificación de BT no es una tarea fácil y requiere cierta paciencia y deliberación.