Registrarse

[ASM] E | Cambiar mini del protagonista

kakarotto

Leyenda de WaH
Buenas a todos queridos waher@s, hoy os traigo un tutorial corto e interesante, aunque realmente todos los créditos van para FBI de pokecommunity y aclaro, también, que es un tutorial adaptado del usuario
@L!nOS, así que doy créditos a ellos por su gran trabajo:

Mucha gente con pocos conocimientos de asm le gustaría cambiar el mini, la cuestión es que para emerald hay poca información al respecto, no todo el mundo entiende inglés y este tutorial va destinado a simplificar a los em-hackers la vida una barbaridad.

Para este tutorial necesitamos:
HxD ( O tu editor de hexadecimal favorito )
Tener nociones básicas sobre cómo crear punteros, compilar rutinas con thumb e insertar bytes sin sobreescribir (Ctrl+B)
FSF ( Esto es opcional, ya que con HxD puedes buscar espacio libre )
--

Dividiremos cada cosa en su spoiler correspondiente para dejarlo muy claro:

Copia esta rutina en un bloc de notas y compílalo con la herramienta thumb, que no es nada más ni nada menos que un ejecutable por línea de comandos, para ello debes arrastrar tu archivo a la herramienta y tu archivo deberá llamarse XXX.asm (dónde XXX es el nombre elegido por tí).

Código:
.text
.align 2
.thumb
.thumb_func

@hook from 0805CA4C via r0

main:
@flag check
checkFlag:
mov r0, #0xFF 
lsl r0, r0, #0x2
add r0, r0, #0xA @0x3FC + 0xA = @406
ldr r2, =(0x809D790+1)
push {r1, r3}
bl linker
pop {r1, r3}
cmp r0, #0x1
bne noCrash

setOW:
ldr r0, =(0x20375D8)
ldrb r0, [r0]
cmp r0, #0xFF
beq noCrash
mov r3, r0

noCrash:
mov r8, r3
lsl r4, r4, #0x10
lsr r4, r4, #0x10
lsl r5, r5, #0x10
ldr r0, =(0x808BFF8 +1)
bx r0

linker:
bx r2

.align 2
              //añade un espacio antes de compilar aquí
Si lo deseas puedes copiarlo compilado:

Código:
FF 20 80 00 0A 30 09 4A 0A B4 00 F0 0E F8 0A BC 01 28 04 D1 06 48 00 78 FF 28 00 D0 03 1C 98 46 24 04 24 0C 2D 04 03 48 00 47 10 47 91 D7 09 08 D8 75 03 02 F9 BF 08 08
(Recuerda eliminar los espacios entre cada byte)

Una vez insertada la rutina deberás anotar el offset donde lo introdujiste, para obtener su puntero. En mi caso será 50ADE708

Ahora ve al offset 8BFF0 e introduce 00 48 00 47 xx xx xx xx+1,donde "xx xx xx xx" es el puntero al revés+1. En mi caso sería 51 AD E7 08

Ya está introducida la rutina correctamente y funcionando. Ahora necesitaremos el script que haga que nos funcione:

Podemos activar el script y desactivarlo en función de nuestras necesidades.

Para activarlo
Código:
#org 0xE3D0EA
setflag 0x406           //Esta es la flag que usamos para ver su apariencia
setvar 0x8000 0xN  //Donde "N" es el número del mini a utilizar.
callasm 0x8089C35  //Llamar a la rutina de refrescar mapa (special 0x91)
end
Una vez entres a un lugar nuevo, verás los cambios.
Para desactivarlo
Código:
#freespace 0xFF
#dynamic 0xE00000
#org @start
clearflag 0x406   //"limpiamos" la flag para reestablecer el mini del héroe
callasm 0x8089C35 //volvemos a refrescar
end
Al igual que la otra opción, verás los cambios una vez entres a un lugar.

Cabe resaltar que podría poner una tabla con el nº de mini a utilizar, pero la verdad no la he investigado totalmente. Si alguien es tan amable de exponerla, sería genial. Yo he encontrado alguno:

0: Héroe masculino
1: Héroe femenino
2: Héroe masculino en bicicleta
3: Héroe femenino en bicicleta
[...]

Aclarar que algún número de mini se bugea y pierde las paletas originales al usarlo un rato (es decir, andando con ese mini por algun mapa)

Y bueno, eso es todo waheros, quería felicitaros las Navidades y sobre todo animar, una vez más, a todos aquellos "em-hackers" en su empeño por demostrar que esta rombase es la mejor con diferencia.

Saludos.
 
Última edición:

Samu

Miembro insignia
Miembro insignia
Hola, tengo una rutina para cambiar el backsprite, el overworld y el sprite del protagonista (Los cambios son permanentes. Pueden ser revertidos de nuevo con la rutina). Iba a hacer un hilo a parte con esto, pero creo que quedará más ordenado si lo dejo por aquí.

Código:
.thumb
.align 2

@;Establece como backsprite nuevo el valor de la variable 8000

main:
	push {r0-r1, lr}
	ldr r0, player
	ldr r0, [r0]
	add r0, r0, #0x8
	ldr r1, var_8000
	ldrb r1, [r1]
	strb r1, [r0]
	pop {r0-r1, pc}
	
.align 2
player:
	.word 0x03005D90
var_8000:
	.word 0x020275D8 + (2 * 0x8000) @Se puede cambiar 8000 por cualquier variable
Lo que hace la rutina es una tontería, se dirige a la región de la memoria que tiene la información del player y modifica el 8º byte, que es el que marca si eres entre otras cosas Chico/Chica.

En Emerald los posibles valores son los siguientes:
Código:
0 -> Brendan.
1 -> May.
2 -> Avatar RFM
3 -> Avatar RFF
4 -> Brendan (ruby)
5 -> May (ruby)
6 -> Blasco 
7 -> Steven
Comentar que la rutina solo funciona "completamente" al cambiar entre los "packs" de 0 y 1, ya que el resto no están previstos para ser utilizados como avatares por el jugador, y el overworld asociado a su slot es una estancias de los overworld protagonistas (bicicleta, surf etc). Ahora bien, se puede usar esta rutina en conjunción con la que trae Kakaroto para tener hasta 8 backsprites distintos sin tener como overworld a un tío en bici xd.

EDIT: Corregido un error en la rutina. (Había puesto 8000 en vez de 0x8000).
 
Última edición:

kakarotto

Leyenda de WaH
Respuesta: EM | ASM | Cambiar mini del protagonista

Agradezco enormemente el trabajo de @Samu, como dije hay algunos minis que se bugean y seguramente es por lo que dice él de que el juego no está preparado para utilizarlos. Sin embargo he podido jugar como:

Bruno
Aura
Bruno en bici
Aura en bici
Los regis
Kyogre
Groudon
Magno
Aquiles
Chico gordo
Anciano
... etc.

Podéis utilizar la rutina que mejor se adapte a vuestras necesidades.
 

Samu

Miembro insignia
Miembro insignia
Re: Respuesta: EM | ASM | Cambiar mini del protagonista

Agradezco enormemente el trabajo de @Samu, como dije hay algunos minis que se bugean y seguramente es por lo que dice él de que el juego no está preparado para utilizarlos. Sin embargo he podido jugar como:

Bruno
Aura
Bruno en bici
Aura en bici
Los regis
Kyogre
Groudon
Magno
Aquiles
Chico gordo
Anciano
... etc.

Podéis utilizar la rutina que mejor se adapte a vuestras necesidades.
La idea es que puedes usar ambas a la vez.
Por ejemplo pones unos backsprites custom en el lugar de los backsprites de FR, usas mi rutina para cargar el backsprite 2/3 y usas la tuya para cargar un mini acorde (y así evitas tener el mini de Brendan en bici).
 

RikkaTyrant's Eye

Usuario de plata
Respuesta: EM | ASM | Cambiar mini del protagonista

@kakarotto.Sería posible poner todo esto en un mini que active la flag?en plan poniendole un yes/no box:
Hola.Quieres hacer cosplay?
Yes/no.
Y otro que haga lo contrario:
Hola.Quieres parar con el cosplay?
Yes/no
 
Última edición:

Rubire4

Usuario mítico
Respuesta: EM | ASM | Cambiar mini del protagonista

@kakarotto.Sería posible poner todo esto en un mini que active la flag?en plan poniendole un yes/no box:
Hola.Quieres hacer cosplay?
Yes/no.
Y otro que haga lo contrario:
Hola.Quieres parar con el cosplay?
Yes/no
Claro, solo tienes que adaptar el script como quieras o introducirlo dentro de otro.
En este caso mira el apartado de msgbox del tutorial de scripting: https://whackahack.com/foro/t-42542/megatutorial-scripting-desde-cero-finalizado
 
Arriba