Sobre codigos

Lugar donde se intentarán resolver problemas específicos
Responder
Avatar de Usuario
gadesx
Administrador
Administrador
Mensajes: 1984
Registrado: 24 Ene 2011, 16:43
Ubicación: El puche
Contactar:

Sobre codigos

Mensaje por gadesx » 06 Mar 2013, 12:17

No entiendo es por qué en los codigos de gameshark y todo eso
si un codigo es por ejemplo
8009D92A-FFFF estos ultimos valores son 65535
pero si coges el numero anterior y lo subes uno, es decir el A por una B
8009D92B-FFFF el codigo dará 16777216
supongo que es como si pusieras el valor de más bytes, el caso es que yo de pequeño
lo descubrí trasteando porque al trucar el dinero en los rpgs, pues tenia maximo 65535
y las armas valian más y ya ves haciendo eso si podia tener el limite tipico de 9999999 de dinero

tambien pasa normalmente en los juegos que si
8009D92A-XXXX es el codigo del HP del heroe, si le sumas 2 al valor anterior a los digitos X, es decir
8009D92C-XXXX este será el de HP total
y bueno subiendo de 2 en 2 y bajando de 2 en 2 se encuentran
cosas de codigo digamos cercanas,
como MP-MP total, etc

Y sobre los items pues el FF7 mismo usaba algo asi:

8009D9ZZ-XXYY

ZZ Posicion del item en la base de datos (2 items)
XX ID de item 1 (Poción, Cola de Fénix, etc)
YY IDdel item 2
y la cantidad del mismo con otro codigo.

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5521
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 06 Mar 2013, 12:31

Eso es porque en los GS metes valores de 16 bits y tú quieres cambiar datos de 32 bits.

Por ejemplo, suponiendo que en tu caso estés modificando el dinero o la experiencia, se usarán 4 bytes en low endian, y no 2 como suele pasar con la vida, magia, etc.:
...92A
...92B
...92C
...92D
(no me acuerdo ahora cómo era el offset, pero vamos a imaginar que son los tres últimas dígitos hexadecimales)

Esos 4 valores inicialmente estarán a cero:
...92A=0
...92B=0
...92C=0
...92D=0

Al hacer 8009D92A-FFFF lo que haces es que siempre pones 'FF' en los dos primeros bytes, el típico 65535:
...92A=FF
...92B=FF
...92C=0
...92D=0
0*256^3 + 0*256*2 + 0xFF*256^1 + 0xFF*256^0 = 65535

Pero si modificas el código y pones 8009D92B-FFFF te queda:
...92A=0
...92B=FF
...92C=FF
...92D=0
0*256^3 + 0xFF*256*2 + 0xFF*256^1 + 0*256^0 = 16776960

So lo haces después de hacber cambiado la dirección que termina en "A" te quedaría:
...92A=FF
...92B=FF
...92C=FF
...92D=0
0*256^3 + 0xFF*256*2 + 0xFF*256^1 + 0xff*256^0 = 167777215

¿Dónde está el problema? Pues que en esos valores hay que usar dos códigos, uno con el 8009D92A-FFFF y otro con el 8009D92C-FFFF para que el cheat modifique correctamente los 4 bytes del valor. Bueno, aquí hemos puesto FFFF en ambos casos, pero lo normal es que se busque el valor correcto, por si da problemas de rebose. Si el máximo es 9999999, en hexadecimal 0x98967F, pondríamos 8009D92A-7F96 y 8009D92D-9800 (creo que se ponían así, pero si no va es al revés).


Lo de que sumando dos se obtiene otra cosa, etc. es porque normalmente los datos van así:
- posición X+0: 2 bytes con el HP actual
- posición X+2: 2 bytes con el HP máximo
- posición X+4: 2 bytes con el MP actual
- posición X+6: 2 bytes con el MP máximo
Así que sumando dos a un offset te da el que tiene el valor máximo.


Lo de los items es similar. Si el offset inicial de las cosas es XX0 tienes:
- en XX0 el objeto 1
- en XX1 el objeto 2
- en XX2 el objeto 3
etc.

Otro caso, que es el que cuentas, es que los valores se almacenen en 2 bytes, uno con el código del objeto y otro con el número de veces que lo tienes, pero ahora es cada 2 bytes (imagino que es lo que querías poner en vez de "2 items"):
- en XX0 el objeto 1 con su valor
- en XX2 el objeto 2 con su valor
- en XX4 el obheto 3 con su valor

Responder