Registrarse

[RH - Otros] Cambiar ID del prota al cambiar de personaje

Estado
Cerrado para nuevas respuestas.
Una duda,cuando cambias de personaje el id del pokemon no cambia,soy relativamente nuevo en el tema de romhacking,se podria cambiar la id de los pokemon al cambiar de personaje? o ya seria muy complicado?
 

MAIDEN

SkyBlue
Es posible cambiar la ID del protagonista, sí, pero la forma de hacerlo depende de la ROM que estés utilizando como base.

En ruby es muy sencillo conseguirlo:
Basta con usar el comando ¨writebytetooffset¨ en un script para cambiar los valores de 02024EA4 (Que es donde se encuentra la ID del protagonista)
Luego antes de finalizar el script, debes de usar el special 0x8E
Con esto los cambios que hagas con este método serán permanentes (A no ser que lo quieras volver a cambiar)
Código:
writebytetooffset 0x(valor) 0x02024EA4
writebytetooffset 0x(valor) 0x02024EA5
...
special 0x8E
(Créditos a Hackmew por la información y Mariofan por evitar el refrescado)

En cuanto respecta a Firered y Emerald, aún desconozco la forma de hacerlo, pues la información del protagonista no funciona como lo hace en Ruby.
(En esta situación se necesitará el ASM, pues la información del protagonista es dinámica)
 
Última edición:

CompuMax

Discord: CompuMax#0425
Miembro insignia
Cambiar el ID del personaje o de los pokémon acarrea algunos detalles que generalmente no son deseables. Por ejemplo, al restablecer el ID o usar uno distinto, cada pokémon con un ID distinto al del personaje en ese determinado momento se tratará como un pokémon de intercambio y ya se sabe lo que esto significa:

- Adquiere más experiencia que los capturados por el jugador
- Se requiere de las medallas para que obedezcan a partir de determinados niveles

Hace un tiempo hice unas rutinas para cambiar el nombre y el género del personaje en Fire Red pero teniendo cuidado de no cambiar el ID precisamente para evitar esos problema y como bien lo ha indicado MAIDEN la dirección de la data del personaje es dinámica y el puntero a esa dirección se encuentra almacenada en 0x0300500C.

Aquí una de las rutinas que hice:

Código:
@;====================================================================================
@;         		Rutina para cargar nombres personalizados
@;====================================================================================
@; 	Crear una tabla con la siguiente estructura:
@;  [Nombre(máx 7 caracteres)][Género(00 = Chico, 01 = Chica)]
@;	Si el nombre tiene menos de 7 caracteres completar con 0xFF
@;====================================================================================
@;	Instalación:
@;====================================================================================
@; 	Compilar la rutina e insertar en un offset alineado
@;====================================================================================
@;	Uso:
@;====================================================================================
@;	Settear la variable 0x8000 con 0 para restaurar o 1 para cambiar el nombre
@;	Settear la variable 0x8001 con el valor del índice de la tabla que será usado
@;	Llamar la rutina en modo Little-Endian (Offset+1)
@;====================================================================================


.thumb
.align 2

Main:
	push {lr}
	ldr r0, .var_8000
	ldrh r0, [r0]
	cmp r0, #1 [MENTION=26827]Camb[/MENTION]ia de nombre?
	beq Change_Name
	
Restore_Name:
	ldr r0, .Backup_Hero
	ldr r0, [r0]
	cmp r0, #0
	beq Backup
	ldr r0, .Backup_Hero
	ldr r1, .Name
	ldr r1, [r1]
	mov r2, #4
	swi 0xB				
	ldr r0, [r0, #0x8]
	ldrb r0, [r0]
	ldr r1, .Name
	ldr r1, [r1, #0x8]
	strb r0, [r1]
	pop {pc}
	
Change_Name:
	ldr r0, .Backup_Hero
	ldr r0, [r0]
	cmp r0, #0
	beq Backup
	ldr r0, .var_8001
	ldrh r0, [r0]
	mov r1, #0x8
	mul r0, r1
	ldr r1, .Table
	add r0, r0, r1
	ldr r1, .Name
	ldr r1, [r1]
	mov r2, #4
	swi 0xB
	mov r2, #0xFF
	strb r2, [r1, #0x7]
	ldrb r0, [r0, #0x7]
	strb r0, [r1, #0x8]
	pop {pc}
	
Backup:
	push {lr}
	ldr r0, .Name
	ldr r0, [r0]
	ldr r1, .Backup_Hero
	mov r2, #0x5
	swi 0xB
	pop {pc}

.align 2
.var_8000: 		.word 0x020370B8 	@0 = restaura, 1 = cambia
.var_8001:		.word 0x020370BA   [MENTION=38955]val[/MENTION]or = índice del nombre + género de la tabla
.Name:			.word 0x0300500C 	@puntero dinámico del nombre
.Table:			.word 0x08800000 	@Tabla
.Backup_Hero:		.word 0x020200F0 	@RAM donde se guarda el nombre original y su género
Y su funcionamiento In Game:


En este caso como se cambia el byte del género, se cambia el sprite de la trainer card y el backsprite en batalla.

En definitiva, respondiendo a tu duda, ¡si! se puede cambiar el ID pero a mi parecer no sería recomendable. Claro, depende de lo que se desee hacer.
 
Última edición:

Gold

Porrero a tiempo parcial
Miembro insignia
Cambiar el ID del personaje o de los pokémon acarrea algunos detalles que generalmente no son deseables. Por ejemplo, al restablecer el ID o usar uno distinto, cada pokémon con un ID distinto al del personaje en ese determinado momento se tratará como un pokémon de intercambio y ya se sabe lo que esto significa:

- Adquiere más experiencia que los capturados por el jugador
- Se requiere de las medallas para que obedezcan a partir de determinados niveles

Hace un tiempo hice unas rutinas para cambiar el nombre y el género del personaje en Fire Red pero teniendo cuidado de no cambiar el ID precisamente para evitar esos problema y como bien lo ha indicado MAIDEN la dirección de la data del personaje es dinámica y el puntero a esa dirección se encuentra almacenada en 0x0300500C.

Aquí una de las rutinas que hice:

Código:
@;====================================================================================
@;         		Rutina para cargar nombres personalizados
@;====================================================================================
@; 	Crear una tabla con la siguiente estructura:
@;  [Nombre(máx 7 caracteres)][Género(00 = Chico, 01 = Chica)]
@;	Si el nombre tiene menos de 7 caracteres completar con 0xFF
@;====================================================================================
@;	Instalación:
@;====================================================================================
@; 	Compilar la rutina e insertar en un offset alineado
@;====================================================================================
@;	Uso:
@;====================================================================================
@;	Settear la variable 0x8000 con 0 para restaurar o 1 para cambiar el nombre
@;	Settear la variable 0x8001 con el valor del índice de la tabla que será usado
@;	Llamar la rutina en modo Little-Endian (Offset+1)
@;====================================================================================


.thumb
.align 2

Main:
	push {lr}
	ldr r0, .var_8000
	ldrh r0, [r0]
	cmp r0, #1 [MENTION=26827]Camb[/MENTION]ia de nombre?
	beq Change_Name
	
Restore_Name:
	ldr r0, .Backup_Hero
	ldr r0, [r0]
	cmp r0, #0
	beq Backup
	ldr r0, .Backup_Hero
	ldr r1, .Name
	ldr r1, [r1]
	mov r2, #4
	swi 0xB				
	ldr r0, [r0, #0x8]
	ldrb r0, [r0]
	ldr r1, .Name
	ldr r1, [r1, #0x8]
	strb r0, [r1]
	pop {pc}
	
Change_Name:
	ldr r0, .Backup_Hero
	ldr r0, [r0]
	cmp r0, #0
	beq Backup
	ldr r0, .var_8001
	ldrh r0, [r0]
	mov r1, #0x8
	mul r0, r1
	ldr r1, .Table
	add r0, r0, r1
	ldr r1, .Name
	ldr r1, [r1]
	mov r2, #4
	swi 0xB
	mov r2, #0xFF
	strb r2, [r1, #0x7]
	ldrb r0, [r0, #0x7]
	strb r0, [r1, #0x8]
	pop {pc}
	
Backup:
	push {lr}
	ldr r0, .Name
	ldr r0, [r0]
	ldr r1, .Backup_Hero
	mov r2, #0x5
	swi 0xB
	pop {pc}

.align 2
.var_8000: 		.word 0x020370B8 	@0 = restaura, 1 = cambia
.var_8001:		.word 0x020370BA   [MENTION=38955]val[/MENTION]or = índice del nombre + género de la tabla
.Name:			.word 0x0300500C 	@puntero dinámico del nombre
.Table:			.word 0x08800000 	@Tabla
.Backup_Hero:		.word 0x020200F0 	@RAM donde se guarda el nombre original y su género
Y su funcionamiento In Game:


En este caso como se cambia el byte del género, se cambia el sprite de la trainer card y el backsprite en batalla.

En definitiva, respondiendo a tu duda, ¡si! se puede cambiar el ID pero a mi parecer no sería recomendable. Claro, depende de lo que se desee hacer.
En ese caso deshabilitar la ganancia de experiencia de Pokémon intercambiados y la obedencia por medallas sería una opción factible.
 
Estado
Cerrado para nuevas respuestas.
Arriba