Registrarse

[Oficial] Tema de Investigaciones para ROMs Españolas

.Areku_Sama

Old school ROM-Hacker EST. 2006
Esto es oro puro:
Saltar el intro del Profesor Abedul/Birch En Pokemon Esmeralda [BPES]

ir al OFFSET 0x308AC Y reemplazar los siguientes bytes:
B1 08 03 08

Por estos otros:
31 16 03 08

El intro no se logra saltar del todo. Aún aparece un segundo del intro del Profesor Abedul, pero silenciando el sonido del intro y cambiando las paletas verdes del fondo a negra. Es como si no hubiese nada.

Créditos a Le-Pug y a Touched.
Post original:

https://www.pokecommunity.com/showpost.php?p=8444249&postcount=590
 

CompuMax

Discord: CompuMax#0425
Bueno paso por aquí dejando mi granito de arena como había prometido :D

ROJO FUEGO

Pos. Y = 0x054AF4
Banco = 0x054AF8
Mapa = 0x054AFA
Pos. X = 0x054AFC

0x079226 - Número del Pokémon

0x046216 - Cambiar 05 a 01
0x046C96 - Cambiar 05 a 01
0x054A60 - Cambiar 08 40 a 01 20
0x054A90 - Cambiar 08 40 a 01 20
0x137778 - Cambiar 05 01



- Objeto en la PC = 0x3FCB9C Codificado de la misma manera que en el PokeMart. Ejemplo: MasterBall=01, PokéBall=02, etc.
- Cantidad de Objeto = 0x3FCB9C en Hex
- Dinero Inicial = 0x054C54 Se pasa a Hex y se escribe permutado desde 0x054C54 hasta 0x054C56.
Ejemplo: 100.000 = 0x0186A0 => A0 86 01
0x111131 - Cambiar 28 a 01
0x111133 - Cambiar D0 a E0



0x0440C2 - Cambiar 01 a 00
0x125C24 - Cambiar 01 a 00



NOTA: Son las opciones con las cuales se comienza en un JUEGO NUEVO

IMAGEN Y VELOC. TEXTO Cambiar el valor por la combinación deseada en 0x054A60.

IMAGEN = TIPO 1, y VELOC. TEXTO
LENTA = 00, MEDIA = 01, RÁPIDA = 02

IMAGEN = TIPO 2, y VELOC. TEXTO
LENTA = 08, MEDIA = 09, RÁPIDA = 0A

IMAGEN = TIPO 3, y VELOC. TEXTO
LENTA = 10, MEDIA = 11, RÁPIDA = 12

IMAGEN = TIPO 4, y VELOC. TEXTO
LENTA = 18, MEDIA = 19, RÁPIDA = 1A

IMAGEN = TIPO 5, y VELOC. TEXTO
LENTA = 20, MEDIA = 21, RÁPIDA = 22

IMAGEN = TIPO 6, y VELOC. TEXTO
LENTA = 28, MEDIA = 29, RÁPIDA = 2A

IMAGEN = TIPO 7, y VELOC. TEXTO
LENTA = 30, MEDIA = 31, RÁPIDA = 32

IMAGEN = TIPO 8, y VELOC. TEXTO
LENTA = 38, MEDIA = 39, RÁPIDA = 3A

IMAGEN = TIPO 9, y VELOC. TEXTO
LENTA = 40, MEDIA = 41, RÁPIDA = 42

IMAGEN = TIPO 10, y VELOC. TEXTO
LENTA = 48, MEDIA = 49, RÁPIDA = 4A

IMAGEN = TIPO 11, y VELOC. TEXTO
LENTA = 50, MEDIA = 51, RÁPIDA = 52

IMAGEN = TIPO 12, y VELOC. TEXTO
LENTA = 58, MEDIA = 59, RÁPIDA = 5A

IMAGEN = TIPO 13, y VELOC. TEXTO
LENTA = 60, MEDIA = 61, RÁPIDA = 62

IMAGEN = TIPO 14, y VELOC. TEXTO
LENTA = 68, MEDIA = 69, RÁPIDA = 6A

IMAGEN = TIPO 15, y VELOC. TEXTO
LENTA = 70, MEDIA = 71, RÁPIDA = 72

IMAGEN = TIPO 16, y VELOC. TEXTO
LENTA = 78, MEDIA = 79, RÁPIDA = 7A

IMAGEN = TIPO 17, y VELOC. TEXTO
LENTA = 80, MEDIA = 81, RÁPIDA = 82

IMAGEN = TIPO 18, y VELOC. TEXTO
LENTA = 88, MEDIA = 89, RÁPIDA = 8A

IMAGEN = TIPO 19, y VELOC. TEXTO
LENTA = 90, MEDIA = 91, RÁPIDA = 92

IMAGEN = TIPO 20, y VELOC. TEXTO
LENTA = 98, MEDIA = 99, RÁPIDA = 9A

ANIM. COMBATE = SÍ, TIPO DE COMBATE = CAMBIO, SONIDO = MONO
0X054A90 = 00
ANIM. COMBATE = SÍ, TIPO DE COMBATE = CAMBIO, SONIDO = ESTÉREO
0X054A90 = 01
ANIM. COMBATE = SÍ, TIPO DE COMBATE = MANTENER, SONIDO = MONO
0X054A90 = 02
ANIM. COMBATE = SÍ, TIPO DE COMBATE = MANTENER, SONIDO = ESTÉREO
0X054A90 = 03
ANIM. COMBATE = NO, TIPO DE COMBATE = CAMBIO, SONIDO = MONO
0X054A90 = 04
ANIM. COMBATE = NO, TIPO DE COMBATE = CAMBIO, SONIDO = ESTÉREO
0X054A90 = 05
ANIM. COMBATE = NO, TIPO DE COMBATE = MANTENER, SONIDO = MONO
0X054A90 = 06
ANIM. COMBATE = NO, TIPO DE COMBATE = MANTENER, SONIDO = ESTÉREO
0X054A90 = 07

- CONTROLES Cambiar el valor de 0x054A96 de acuerdo a la función deseada.
AYUDA = 00, LR = 01, L=A = 02

Créditos:
- Hex Helper Double OH de Joexv
- GBA Intro Manager de Diegoisawesome
 

DrakoVinyl

Profesional de WaH
*RF|Quitar mensajes de Oak en batalla



Esto lo que hace básicamente es quitar los mensajes de Oak en batalla (trainerbattle de tipo 0x9), dichos mensajes son los que aparecen en la primera batalla que disputa el protagonista en RojoFuego donde Oak cuenta lo básico que se debe hacer al luchar, etc.


Procedimiento:


1)-
En un editor hexadecimal ve a la dirección 0x0804B4.

2)- Una vez ahí,reemplaza (su usas HxD, hazlo con "CTRL+B" para pegar escribiendo):


Código:
20 68 10 21 08 43 20 60
Por:

Código:
00 00 00 00 00 00 00 00
Eso es todo lo que hay que hacer.


♠Un saludo!♠
 
Última edición:

DrakoVinyl

Profesional de WaH
RF - Puntos de cura y posiciones de vuelo.
Hola XD
He estado hasta el "cogote" de tarea, y hasta ahora solo he podido localizar los offsets de los puntos de cura y vuelo. Aún me falta localizar los offsets de ruby y esmeralda (ésto habría sido más fácil y rápido si hubiese utilizado la herramienta de javi, pero como estoy en linux, no puedo).

Offset de los puntos de cura: 0x3E8F88
Offset de los puntos de vuelo: 0x3E8EE0

Sólo falta detallar ambas tablas, y demás aspectos, pero en sí, solo con ver la tabla, es fácil de entender.

*Posteo esto "incompleto" para que al que le de curiosidad, valla y lo mire, así me evito explicarlo yo(?) así aprende algo, y no tiene todo masticadito (?). Posiblemente, mañana tenga todo completo.*

♠Un saludo!♠
 

DrakoVinyl

Profesional de WaH
Hola!
El otro día estaba aburrido, así que me puse portar algunas rutinas para Rojo Fuego. Espero que alguien las use :/


*Define los puntos de cura a los mapas que quieras*


Esta rutina pertenece al apartado de rutinas dispuestas por el engine de jpan, así que hay que darle sus merecidos créditos. Y a mi un pequeño agradecimiento por haber portado la rutina a la rom española :V jaja

Este método está diseñado para determinar en qué mapa apareces tras perder un combate. Resalto el hecho de que al implementar este sistema, el anterior queda "inutilizado".

Lo primero será insertar una rutina. La rutina a insertar opera mediante tres variables que por defecto son la 0x405A, 0x405B 0x405C, si por algún motivo no quieres usar esas, y te apetece usar otra diferente, cambia las partes en color rojo en la rutina (si cambias las variables, estas no deben ser dinámicas [0x8000-0x800F]).

Para no perder tiempo compilando la rutina, la dejo ya lista XD:

0B 48 AE F7 D7 FA 01 06 00 0A 09 0E 21 70 60 70 FF 20 A0 70 07 48 AE F7 CD FA 00 04 00 0C A0 80 05 48 AE F7 C7 FA 00 04 00 0C E0 80 38 E0 00 00 5A 40 00 00 5B 40 00 00 5C 40 00 00
Nota: Si cambias las variables, ten en cuenta que en la rutina aparecen como si estuvieran "permutadas", por ejemplo la variable 0x405A, queda 5A40.

La rutina debes insertarla (si usas HXD, con CTRL+B o sea, "pegar escribiendo") en la dirección 0xBFFEC. Si, tan simple como eso, no hay que hacer mas nada, la rutina queda felizmente implementada y en funcionamiento.

Dejando la rutina un poco de lado, hablemos del método de uso:


Hay que crear un script de nivel de tipo 03 en todos los mapas donde se ejecute una batalla, tan simple como eso.

Ejemplo facultativo:

Código:
#dynamic 0x800000
#org [MENTION=15825]Rojo[/MENTION]Fuego

sethalingplace 0x'el parámetro ha de ser 0x1 ó 0x0. Si el parámetro es 0x0, se carga el script de cura de un centro pokémon. Y si es 0x1, se carga el script de cura de la casa del prota.
setvar 0x405A 0xMMBB 'El valor de la variable determina tanto el mapa, como el banco de mapa. Donde en el primer byte de la variable (0x[B]MM[/B]BB, se pone el número de mapa, y en el segundo byte [0xMM[B]BB[/B], el del banco.
setvar 0x405B 0x'Posición en "X" dentro del mapa.
setvar 0x405c 0x'Posición en "Y" dentro del mapa.
end 'No need for explanation.

También, si se quiere un poco más de "personalización y profesionalidad", se puede crear un script en el que se cure a los pokémons (mediante el special 0x0) obviamente, pero además, añadiéndole al script una comparación del valor de la variable 0x405A para determinar lo que suceda según el mapa en el que aparezcamos una vez perdida una batalla.

Eso ha de ser así ya que solo disponemos de dos scripts de cura. Si!, los que mencioné que se determinan su ejecución mediante el sethealingplace.

Dichos scripts son llamados desde la dirección 07F604 (el que nos cura los pokémon en el CP tras haber perdido una batalla), y 07F624 (el de cuando los pokémons son curados en la casa del prota por su madre).

Allí, hay que poner los punteros hacia la dirección de los respectivos scripts.



*Escribe el nombre del protagonista*



Sencillo, esta rutina sirva para cambiarle el nombre al protagonista, o darle uno si es que no tiene.
A diferencia de la rutina original que trae el juego, en la que tras darle nombre al jugador, el script terminaba abriendo también el menú, con esta rutina no ocurre eso.


============
¿Qué hacer?
============


Compila esta rutina ASM e insértala en un lugar con suficiente espacio libre en tu rom:

Código:
push {r4, lr}
sub sp, sp, #0x8
ldr r0, =0x3004F5C
ldr r1, [r0]
ldrb r2, [r1, #8]
mov r3, #0x0
ldr r0, =0x80569B9
str r0, [sp, #4]
mov r0, #0
str r0, [sp]
ldr r4, =0x809DB0D
bl bx_r4
add sp, sp, #0x8
pop {r4, pc}

bx_r4: bx r4

O bien, inserta la rutina ya compilada:

Código:
10 B5 82 B0 06 48 01 68 0A 7A 00 23 05 48 01 90 00 20 00 90 04 4C 00 F0 02 F8 02 B0 10 BD 20 47 5C 4F 00 03 B9 69 05 08 0D DB 09 08

=============
Modo de uso:
=============



Código:
#dynamic 0x800000
#org [MENTION=15825]Rojo[/MENTION]Fuego
[bla bla bla]
callASM 0x'offset donde insertaste la rutina +1
waitstate 'espera a que la rutina se ejecute correctamente. Si no se pone este comando, el script termina luego de que le pongas un nombre al jugador.
[bla bla bla]
end

*Cambia el género (sexo) del protagonista*

Esta rutina la hizo Javi, y para ahorrarme la descripción, cito lo que el ha dicho XD.

Javi4315♪ dijo:
Esta rutina te permite cambiar del personaje masculino al personaje femenino. Si la elección de un personaje es forzada, luego tienes la opción de tener un segundo personaje con su propio mini, sprite y backsprite. Eso o lo que se te ocurra.

El funcionamiento es muy sencillo. Simplemente tienes que guardar en la variable 0x8000 el valor 0x0 (para convertirte en chico) o 0x1 (para convertirte en chica). Luego, simplemente, ejecuta la rutina.

La rutina es la siguiente:

Código:
.align 2
.thumb

push {r0-r1,lr}
ldr r0, .data
ldr r1, [r0]
mov r0, #0x0
ldr r0, .var_8000
ldrb r0, [r0]
strb r0, [r1,#0x8]
pop {r0-r1,pc}

.data: .word 0x3004F5C    
.var_8000: .word 0x020370B8
Compilada:

Código:
03 B5 03 48 01 68 00 20 02 48 00 78 08 72 03 BD 5C 4F 00 03 B8 70 03 02


♠Un saludo!♠
 
Última edición:

DrakoVinyl

Profesional de WaH
Hola a todos, Hoy vengo a aportar un poco más para Rubí y Esmeralda que son las roms para las que he aportado menos, y en general en este tema hay menos aportes dedicados a estas roms.

¡Empecemos con algo rápido!



E-R|Quitar "intro" del camión

*Créditos a Diegoisawesome (por los datos de las rom inglesas que recopilé de su herramienta) y a mi por haberlos buscado para la rom española*

Esto sirve para quitar la "sacudida" y el ruido a motor de cuando iniciamos una nueva partida.
Recordar que si no hacéis esto, por más que cambiéis el mapa en el que se inicia el juego, aparecerá tanto el sonido del
camión como la sacudida.

Ir a las direcciones correspondientes según el rom, y a partir de ellas escribir los bytes que aparecen a continuación.

Esmeralda

Offset: 030872
Reemplazar BB 20 40 00 por 77 20 FF 30

Offset: 0FB154
Reemplazar 85 AF 0F 08 por 11 60 08 08


Rubí

Offset: 00A46A
Reemplazar BB 20 40 00 por 77 20 FF 30

Offset: 00A6D2
Reemplazar AF 20 40 00 por 5F 20 FF 30

Offset: 00B452
Reemplazar AF 24 64 00 por 5F 24 FF 34

Offset: 0C79C8
Reemplazar F9 77 0C 08 por 49 49 05 08




R|Cambiar el nombre del protagonista


Esto es muy sencillo de lograr, para ello, simplemente haremos una serie de WBTOs. 8, para ser exactos:

Código:
writebytetooffset 0x[LETRA] 0x2024EA4
writebytetooffset 0x[LETRA] 0x2024EA5
writebytetooffset 0x[LETRA] 0x2024EA6
writebytetooffset 0x[LETRA] 0x2024EA7
writebytetooffset 0x[LETRA] 0x2024EA8
writebytetooffset 0x[LETRA] 0x2024EA9
writebytetooffset 0x[LETRA] 0x2024EAA
writebytetooffset 0xFF 0x2024EAB

Donde "[LETRA]" en cada caso sería el valor hexadecimal correspondiente a la letra que queramos poner.
Si el nombre que se ponga ahí usa menos de 7 letras, en las que queden hay que poner FF.
Así de simple!




R|Establecer el género (sexo) del protagonista


Esto también se consigue sin problemas usando WBTO;

Código:
writebytetooffset 0x[GENERO] 0x2024EAC
Donde "[GENERO]" sería el valor correspondiente al genero a cambiar; 0 para chico y 1 para chica.
Para hay que refrescar la pantalla mediante un warp para que se apliquen los cambios.




R|Datos para añadir más comandos o editar los que vienen en el juego.

Esto es investigación 100% mia, y di con ella cuando investigaba la dirección de la ram donde se guarda el nombre del prota, para lo del apartado de mas arriba XD.

La tabla de comandos está a partir del offset 0x14B328 y ocupa una dimensión de 0x31C bytes (En DEC; 796) o sea que va hasta el offset 14B643. Para añadir más comandos copiad y pegad la tabla en una dirección con suficiente espacio libre en buestra rom.
Luego buscad la siguiente estructura de bytes que corresponden:

28 B3 14 08 40 B6 14 08

Como ven, son dos punteros. El primero sería el de donde empieza la tabla, y el segundo, es un puntero (*atención que puede marear eh!*) al ultimo puntero que está en la tabla de comandos (además, este puntero tiene la función de "limitador" para que haya una cantidad específica de comandos). Con esto que os acabo de decir, si repuntean la tabla, supongo que ya saben lo que hay que hacer!

¿Y como hago para saber cual es cual?​

Si recordarán, en XSE al presionar "F1" aparece una mini ayuda que explica cuantos parámetros tiene cada comando y bla bla bla...


De esa imágen interesa lo que está encerrado en rojo, donde ese numero equivale a la posición del comando detro de la tabla de comandos.

Para que se entienda mejor, les hago un ejemplo:

Yo buscaré en la tabla el puntero del comando checkgendel.
Así que sabiendo que la tabla empieza en 0x14B328, que es un puntero por comando (un puntero =4 bytes) y que el checgender es el comando A0 en la tabla, hago lo siguiente:

0xA0 * 0x4 = 0x280. y ahora, 0x14B328 + 0x280= 0x14B5A8.

Así que el el puntero a la rutina del comando checkgender está en 0x14B5A8. :D

Ahora os toca hacer vuestra magia con ASM ;)


RF|Editar las opciones del menú principal


He aquí todo lo que necesitaréis para crear funciones "personalizadas" para el menú. Si, hablo del menú que se despliega cuando pulsamos "START",
donde salen opciones como la de guardar la partida, etc.
Kaiser de Emperana hizo un tutorial
(ESTE) que explica todo detalladamente. Me basaré en su tuto para llevar a cabo esto.




Primero, hay que crear un script en el cual ira lo que queramos que se ejecute cada vez que seleccionemos la opción del menú.

Ahora hay que editar los datos en rojo de la siguiente rutina por los datos que os dejo más abajo:

En YYYYYY, ponen este offset:
Rojo Fuego: 069BA8
Esmeralda:
Ruby:

En ZZZZZZ, ponen este offset:
Rojo Fuego: 06F579
Esmeralda:
Ruby:


Y en XXXXXX ponen el offset del Script que quieren que se ejecute.


Código:
.align 2
.thumb

Main:
	push {r0,lr}
	bl CERRAR_MENU
	bl RUTINASONICARVALHO
	pop {r0,pc}

CERRAR_MENU:
	ldr r0, RUTINA_EXIT
	bx r0

RUTINASONICARVALHO:
	push {lr}
	ldr r0, SCRIPT_ADRESS
	bl SCRIPT_ROUTINE
	pop {pc}

SCRIPT_ROUTINE:
	ldr r1, SCRIPT_EXECUTER
	bx r1

.align 2

RUTINA_EXIT:
	.word 0x08[COLOR="RED"]YYYYYY[/COLOR]
SCRIPT_ADRESS: 
	.word 0x08[COLOR="RED"]XXXXXX[/COLOR]
SCRIPT_EXECUTER: 
	.word 0x08[COLOR="RED"]ZZZZZZ[/COLOR]




Una vez compilada e insertada la rutina en el rom, hay que ir al offset del puntero que llama a la rutina que vamos a
reemplazar, y escribimos allí el offset permutado +1 hacia la rutina que acabamos de insertar.
No olvides cambiar tanto el nombre de la opción, como su descripción para que sea acorde a la nueva función que le acabas de dar.


Aquí todos los datos restantes que son de importancia según el rom en que se esté trabajando.


Descripción de la opción "POKÉDEX":

Offset del texto: 0x414782
Puntero al texto: 0x3A2A84


Descripción de la opción "POKÉMON":[/FONT]

Offset del texto: 0x4147C9
Puntero al texto: 0x3A2A88


Descripción de la opción "MOCHILA":

Offset del texto: 0x41480A
Puntero al texto: 0x3A2A8C


Descripción de la opción "[PLAYER]":

Offset del texto: 0x41484E
Puntero al texto: 0x3A2A90 y 0x3A2AA4


Descripción de la opción "GUARDAR":

Offset del texto: 0x414896
Puntero al texto: 0x3A2A94


Descripción de la opción "OPCIONES":

Offset del texto: 0x4148E2
Puntero al texto: 0x3A2A98


Descripción de la opción "SALIR"

Offset del texto: 0x414930
Puntero al texto: 0x3A2A9C


Descripción de la opción "RETIR."

Offset del texto: 0x414962
Puntero al texto: 0x3A2AA0


Esta parte está dispuesta de la siguiente forma; [Puntero a nombre de la opción][Puntero a la rutina de la función en
si][Puntero a nombre de la opción][Puntero a la rutina de la función en si], la secuencia se sucede hasta llegar a la ultima
opción, o sea, "SALIR".
Pero para que no se mareen, dejo todo ya masticadito y por separado porque se lo noobs que son (?)XDDDDDD.


POKÉDEX:

Offset del texto: 0x4109FF
Puntero al texto: 0x3A2A34


POKÉMON:

Offset del texto: 0x4101A8
Puntero al texto: 0x3A2A3C


MOCHILA:

Offset del texto: 0x410A07
Puntero al texto: 0x3A2A44


[PLAYER]:

Offset del texto: 0x410A14
Puntero al texto: 0x3A2A4C


GUARDAR:

Offset del texto: 0x410A17
Puntero al texto: 0x3A2A54


OPCIONES:

Offset del texto: 0x410A1F
Puntero al texto: 0x3A2A5C


SALIR:

Offset del texto: 0x410A28
Puntero al texto: 0x3A2A64


RETIR.:

Offset del texto: 0x410A2E
Puntero al texto: 0x3A2A6C


POKÉDEX:

Offset a la rutina: 0x06F449
Puntero a la rutina: 0x3A2A38


POKÉMON:

Offset a la rutina: 0x06F485
Puntero a la rutina: 0x3A2A40


MOCHILA:

Offset a la rutina: 0x06F4B9
Puntero a la rutina: 0x3A2A48


[PLAYER]:

Offset a la rutina: 0x06F4ED
Puntero a la rutina: 0x3A2A50


GUARDAR:

Offset a la rutina: 0x06F521
Puntero a la rutina: 0x3A2A58


OPCIONES:

Offset a la rutina: 0x06F535
Puntero a la rutina: 0x3A2A60


SALIR:

Offset a la rutina: 0x06F579
Puntero a la rutina: 0x3A2A6A


RETIR.:

Offset a la rutina: 0x06F58D
Puntero a la rutina: 0x3A2A70

Por ahora eso es todo, luego traeré la documentación para cambiar las opciones en Rubí y Esmeralda.

♠Un saludo!♠
 
Última edición:

DrakoVinyl

Profesional de WaH
¡Hola waheros! Con ánimos de revivir un poco este tema, hoy os traigo un puñadito de cosas para Rojo Fuego. :T




ASM | Precios de objetos de la tienda ajustados por porcentaje



Los créditos por esta maravilla van para FBI, quien hizo la rutina, yo solo la hice funcional en la rom de nuestro idioma, aunque no está demás agradecer XDD.

La rutina que verán a continuación, nos permite ajustar mediante un porcentaje, los precios de los objetos de la tienda.
Dicho porcentaje puede ser tanto de aumento, como de disminución del precio.
El porcentaje es "global", es decir, afecta a todos los objetos. Por si no has pillado esto ultimo, significa que si se pone
un aumento porcentual del 50%, todos los objetos van a estar 50% más caros que su valor habitual.



Compila e inserta la rutina en un lugar con suficiente espacio vacío en tu rom:


================
Pasos a seguir
================

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

start:
	add r0, r0, r4
	ldrh r0, [r0, #0x10]
	mov r4, r0
	push {r2-r3}
	mov r0, #0x98
	lsl r0, r0, #0x2
	ldr r2, =(0x806E708 +1)
	bl linker
	cmp r0, #0x0
	beq noChange
	
calculateNewPrice:
	ldr r1, =(0x20370B8)
	ldrh r1, [r1]
	mov r0, r4
	mul r0, r0, r1
	mov r1, #0x64
	ldr r2, =(0x81E379c +1)
	bl linker
	mov r1, r4

checkModification:
	ldr r2, =(0x20370BA)
	ldrb r2, [r2]
	cmp r2, #0x0
	bne decreasePrice
	add r0, r0, r1
	b end
	
noChange:
	mov r0, r4
	b end
	
decreasePrice:
	sub r0, r1, r0
	
end:
	pop {r2-r3}
	pop {r4}
	pop {r1}
	bx r1
	
linker:
	bx r2
	
.align 2

Ahora dirígete a la dirección 0x09AACC y escribe estos bytes:

Código:
00 49 08 47 PP PP PP 08
PP PP PP = Offset permutado de donde insertaste la rutina +1.




=============
Modo de uso
=============


La flag 0x260 determina si el sistema está en funcionamiento o no.
Sabiendo eso, si la flag está activada, podemos hacer que los precios oscilen en base al porcentaje establecido.


La variable 0x8000 dicta si el porcentaje es de aumento o disminución del precio.
Cuando el valor de la variable está a 0x0, es interpretado como un incremento en el porcentaje. Cualquier valor distinto de
0x0, es interpretado como decrecimiento porcentual (porcentaje a favor de la disminución del precio).


La variable 0x8001 es el porcentaje.
Si queremos poner 50% de aumento, pues ponemos 0x32 (0x32= 50 en numeración decimal).
Donde 50% es 0,5. 0,5 multiplicado por 100; 50. No voy a explicar como calcular porcentajes, ya deberían de saber hacerlo.
XDDDDDDDDDDDD



Y por si a caso, un script de ejemplo:


Código:
#dynamic 0x800000

#org @start
special 0x187
compare LASTRESULT 0x2
if 0x1 goto @snippet1
lock
faceplayer
preparemsg   [MENTION=29127]String[/MENTION]1 '"¡Hola! ¿Puedo ayudarte en algo?"
waitmsg
[b]setflag 0x260		  //Activa el sistema de porcentaje[/b]
[b]setvar 0x8000 0x1	 //El porcentaje es de disminución del precio[/b]
[b]setvar 0x8001 0x50	//Disminución de un 50%[/b]
pokemart  [MENTION=39694]Mar[/MENTION]t1
[b]clearflag 0x260	      //Desactiva el sistema[/b]
msgbox   [MENTION=29127]String[/MENTION]2 MSG_KEEPOPEN '"¡Vuelve cuando quieras!"
release
end

'---------------
#org @snippet1
release
end


'---------
' Strings
'---------
#org   [MENTION=29127]String[/MENTION]1
= ¡Hola! ¿Puedo ayudarte en algo?

#org   [MENTION=29127]String[/MENTION]2
= ¡Vuelve cuando quieras!


'-----------
' MartItems
'-----------
#org  [MENTION=39694]Mar[/MENTION]t1
#raw word 0x4
#raw word 0xD
#raw word 0xE
#raw word 0x12
#raw word 0x11
#raw word 0xF
#raw word 0x55
#raw word 0x56
#raw word 0x0



ASM | Showpokepic Pro


Es que las rutinas de JaviSenseiNumeritos me encantan XDDD
Ya sabéis para quien van los créditos, Javi4315♪ ;)

Con este recurso, podremos optar por mostrar o no la “caja” que aparece cuando mostramos el sprite de un pokémon con este comando (showpokepic).



Primero, compila la siguiente rutina e insertala en un lugar con suficiente espacio libre en tu rom.
¡MUY IMPORTANTE, ANOTA EL OFFSET DE DONDE LA INSERTASTE!

Código:
.align 2
.thumb

push {lr}
lsl r0, r0, #0x18
lsr r0, r0, #0x18
lsl r1, r1, #0x18
lsr r1, r1, #0x18
mov r2, #0x85
lsl r2, r2, #0x2
mov r3, #0xE
ldr r6, =0x810F499
bl call
pop {r0}
bx r0

call:
bx r6
Para los vagos, aquí la rutina ya compilada

Código:
00 B5 00 06 00 0E 09 06 09 0E 85 22 92 00 0E 23 02 4E 00 F0 02 F8 01 BC 00 47 30 47 99 F4 10 08

Ahora, compila e inserta esta rutina.
Debes editar la parte de la rutina donde aparece 0x08FFFFFF. Allí, donde pone FFFFFF, escribe en su lugar el offset de donde insertaste la primera rutina +1.


No olvides anotar también el offset de donde insertaste esta rutina.

Código:
.align 2
.thumb

ldr r6, =0x020370B8
ldrb r6, [r6]
cmp r6, #0x1
beq end
ldr r6, =0x08FFFFFF
bx r6

end:
push {lr}
pop {r0}
bx r0


Ahora ve al offset 0F7ACC

Y escribe los siguientes bytes:

Código:
00 4E 30 47 XX XX XX 08
Donde XX XX XX es el offset permutado +1 de donde insertaste la segunda rutina.


Eso es todo.

El modo de uso es simple; cuando la variable 0x8000 tenga el valor 0x1, la caja no se “dibuja”. En cambio, si el valor de la variable es distinto de 0x1, la caja si se dibuja.

Por las dudas, un script facultativo:

Código:
setvar 0x8000 0x1	'para que no se dibuje la caja
showpokepic 0x7E 0xA 0x5	'Muestra en el centro de la pantalla el sprite de un Magmar .
[…]

Deportivas sin tener que activar una flag


Ir a 0x05BB0E

Reemplazar 12 F0 FB FD por 01 20 C0 46

Los créditos esta vez son para Sagiri de PokeCommunity.


Pokémon Game Editor (PGE) INI Pokémon Rojo Fuego (BPRS)

Por ultimo, os dejo los datos de Rojo fuego, para incluir en el archivo “.ini” de la herramienta Pokémon Game Editor.

Código:
[BPRS]
ROMName=Pokémon Rojo Fuego (Español)
ItemData=3D4F50
AttackNames=242800
TMData=454C1C
TotalTMsPlusHMs=58
TotalTMs=50
ItemIMGData=3CF48C
NumberOfItems=375
NumberOfAttacks=354
MoveTutorAttacks=4541D8
NumberOfMoveTutorAttacks=16
PokemonNames=24164C
NumberOfPokemon=412
NationalDexTable=24D7B6
SecondDexTable=24D480
PokedexData=44912C
NumberOfDexEntries=387
PokemonData=24FF4C
AbilityNames=24B408
NumberOfAbilities=78
Pointer2PointersToMapBanks=55340
OriginalBankPointer0=34D7CC
OriginalBankPointer1=34D7E0
OriginalBankPointer2=34D9CC
OriginalBankPointer3=34DABC
OriginalBankPointer4=34DBC4
OriginalBankPointer5=34DBD4
OriginalBankPointer6=34DBEC
OriginalBankPointer7=34DC0C
OriginalBankPointer8=34DC34
OriginalBankPointer9=34DC4C
OriginalBankPointer10=34DC6C
OriginalBankPointer11=34DCBC
OriginalBankPointer12=34DCE4
OriginalBankPointer13=34DD04
OriginalBankPointer14=34DD0C
OriginalBankPointer15=34DD34
OriginalBankPointer16=34DD44
OriginalBankPointer17=34DD4C
OriginalBankPointer18=34DD54
OriginalBankPointer19=34DD5C
OriginalBankPointer20=34DD60
OriginalBankPointer21=34DD64
OriginalBankPointer22=34DD6C
OriginalBankPointer23=34DD74
OriginalBankPointer24=34DD80
OriginalBankPointer25=34DD88
OriginalBankPointer26=34DD94
OriginalBankPointer27=34DD9C
OriginalBankPointer28=34DDA0
OriginalBankPointer29=34DDA4
OriginalBankPointer30=34DDA8
OriginalBankPointer31=34DDAC
OriginalBankPointer32=34DDC8
OriginalBankPointer33=34DDDC
OriginalBankPointer34=34DDF0
OriginalBankPointer35=34DE10
OriginalBankPointer36=34DE30
OriginalBankPointer37=34DE44
OriginalBankPointer38=34DE58
OriginalBankPointer39=34DE5C
OriginalBankPointer40=34DE60
OriginalBankPointer41=34DE64
OriginalBankPointer42=34DE6C
NumberOfMapsInBank0=4
NumberOfMapsInBank1=122
NumberOfMapsInBank2=59
NumberOfMapsInBank3=65
NumberOfMapsInBank4=3
NumberOfMapsInBank5=5
NumberOfMapsInBank6=7
NumberOfMapsInBank7=9
NumberOfMapsInBank8=5
NumberOfMapsInBank9=7
NumberOfMapsInBank10=19
NumberOfMapsInBank11=9
NumberOfMapsInBank12=7
NumberOfMapsInBank13=1
NumberOfMapsInBank14=9
NumberOfMapsInBank15=3
NumberOfMapsInBank16=1
NumberOfMapsInBank17=1
NumberOfMapsInBank18=1
NumberOfMapsInBank19=0
NumberOfMapsInBank20=0
NumberOfMapsInBank21=1
NumberOfMapsInBank22=1
NumberOfMapsInBank23=2
NumberOfMapsInBank24=1
NumberOfMapsInBank25=2
NumberOfMapsInBank26=1
NumberOfMapsInBank27=0
NumberOfMapsInBank28=0
NumberOfMapsInBank29=0
NumberOfMapsInBank30=0
NumberOfMapsInBank31=6
NumberOfMapsInBank32=4
NumberOfMapsInBank33=4
NumberOfMapsInBank34=7
NumberOfMapsInBank35=7
NumberOfMapsInBank36=4
NumberOfMapsInBank37=4
NumberOfMapsInBank38=0
NumberOfMapsInBank39=0
NumberOfMapsInBank40=0
NumberOfMapsInBank41=1
NumberOfMapsInBank42=0
MapLabelData=459F14
NumberOfMapLabels=109
PokemonFrontSprites=230818
PokemonBackSprites=231CB8
PokemonNormalPal=232A78
PokemonShinyPal=233838
IconPointerTable=3CE958
IconPalTable=3CF038
CryTable=483210
CryTable2=484440
CryConversionTable=24F19C
FootPrintTable=43A6C8
PokemonAttackTable=258F7C
PokemonEvolutions=254F1C
TMHMCompatibility=24E390
TMHMLenPerPoke=8
MoveTutorCompatibility=4541F6
EnemyYTable=230138
PlayerYTable=2315D8
EnemyAltitudeTable=235770
AttackData=24C3CC
AttackDescriptionTable=47EF78
AbilityDescriptionTable=24B2D0
AttackAnimationTable=1C6420
IconPals=3CE8F8
JamboLearnableMovesTerm=0000FF
StartSearchingForSpaceOffset=710DF0
FreeSpaceSearchInterval=100
NumberOfEvolutionsPerPokemon=5
NumberOfEvolutionTypes=15
EvolutionName0=None
EvolutionName1=Happiness
EvolutionName2=Happiness (Day)
EvolutionName3=Happiness (Night)
EvolutionName4=Level
EvolutionName5=Trade
EvolutionName6=Trade w/ Item
EvolutionName7=Item
EvolutionName8=Atk > Def
EvolutionName9=Atk = Def
EvolutionName10=Atk < Def
EvolutionName11=High Personality
EvolutionName12=Low Personality
EvolutionName13=Allow Pokemon Creation
EvolutionName14=Create Extra Pokemon
EvolutionName15=Max Beauty
Evolution0Param=none
Evolution1Param=evolvesbutnoparms
Evolution2Param=evolvesbutnoparms
Evolution3Param=evolvesbutnoparms
Evolution4Param=level
Evolution5Param=evolvesbutnoparms
Evolution6Param=item
Evolution7Param=item
Evolution8Param=level
Evolution9Param=level
Evolution10Param=level
Evolution11Param=level
Evolution12Param=level
Evolution13Param=evolvesbutnoparms
Evolution14Param=level
Evolution15Param=evolvesbasedonvalue
EggMoveTable=25A6D4
EggMoveTableLimiter=45C9C
HabitatTable=44D528
ItemAnimationTable=45A3CC
TrainerTable=23A25C
NumberOfTrainers=742
TrainerClasses=239CC4
NumberOfTrainerClasses=6B
TrainerImageTable=234CE8
NumberOfTrainerImages=147
TrainerPaletteTable=235188
TrainerClassMoney=24A98C
DexSizeTrainerSprite=135
TradeData=268754
NumberOfTrades=9
PokedexAlphabetTable=43E834
PokedexLightestTable=43EB6A
PokedexSmallestTable=43EE6E
PokedexTypeTable=43F172


♠¡Un saludo!♠
 
Última edición:

Berserker1523

2-Intentando discernir qué es lo más importante...
Pokémon Rojo Fuego

Estos fueron los offsets que encontré para seguir el tutorial de ShyRayq de agregar el tipo Hada en FR: https://web.archive.org/web/20160531010632/https://www.pokecommunity.com/showthread.php?t=313872

Imagen de los tipos (status): E95D10
Paleta E95CF0

No sé que es una tabla
"Tabla" para acomodar los tipos con su respectiva coordenada de la imagen: 44D570

"Tabla" para definir la efectividad de los tipos: 24A7BC

"Tabla" que contiene el nombre del tipo del movimiento usado en el HUD a la hora de atacar en un combate (el texto que aparece abajo a la derecha que dice: "Tipo/elTipoEnCuestión"): 24A90C

------------------------------------------------------------------------------------

Offsets de los datos de los Pokémon y los movimientos (Si ya lo han puesto, pues es mejor tenerlo 2 veces (?))

Datos de los ataques (en el tuto decía que empezaban 12 bytes en FR antes de lo que de verdad era, donde solo habían 00s, no sé si sí sea así): "Real": 24C3CC
Hipotético: (donde empieza el primer ataque: Destructor): 24C3E8

Información útil: La longitud hipotética de un ataque es de 5 bytes, el byte n°3 es el tipo de este. Luego de estos 5 bytes, como "separación" entre los tipos (tal vez si sean útiles estos bytes), hay 3 bytes de valor 00, luego 1 byte de valor 33 seguido de 3 bytes de valor 00, luego de esto comienza el nuevo ataque y así sucesivamente.
--Se puede ver el orden de los ataques con cualquier editor de estos, por ejemplo Gen 3 Tools (aunque están predeterminados para Fire Red, es decir, en inglés).


Datos de los Pokémon (Pokédex, es decir, de todos los pokes disponibles en el juego, no los del equipo del jugador) : "Real": 24FF4C
Hipotético: 24FF68 (datos bulbasaur).

Información útil: La longitud hipotética de los datos de un pokémon es de 0x17 Bytes (23 en decimal), los bytes n°7 y n°8 son los 2 tipos del pokémon (si tiene un solo tipo, tendrán el mismo valor). Luego de esto, vienen 2 bytes de valor 00, 1 byte de valor 03 seguido de otros 2 bytes de valor 00. Después, empieza el siguiente Pokémon en la Pokédex.

Tipos de Squirtle: 250016
 
Última edición:

Versekr Dark

Usuario de Platino
Experiencia al capturar Pokémon Rojo Fuego(Esp)

Créditos a: lsmash


2E E0 3F 02 02 00 2E 0C 3C 02 02 00 2E 0D 3C 02 02 00 23 00 F1 97 95 1D 0828 8C 95 1D 08

-Go to 1D9587, and replace the original bytes with 41 XX XX XX 08

-Next, go to 159D8, and replace the bytes with 11 5A 01 08.

Hacer las MTs infinitas en Pokémon Rojo Fuego(Esp):

Créditos a: FBI

Now navigate to 0x132070 and insert:
Code:
00 48 00 47 XX XX XX 08

Routine:

00 2D 01 D1 05 4B 18 47 38 1C 08 21 22 1C 04 4E 00 F0 02 F8 01 4B 18 47 30 47 C0 46 7B 20 13 08 79 37 13 08

Make it consumable after animation:
Insert: 00 00 00 00 at 0x1250F0

Now navigate to 0x132021 and change the byte to E0

Make it Ungivable:
insert that at 0x13287D: 00 00 17 E0

To insert:
Do the byte changes below
0x1250F4: 00 00 00 00
0x125DFC: 00 00 00 00
 
Arriba