Registrarse

[Otros] E, FR, R | Activar un Script usando un Objeto

Lunos

Enfrentando a La Organización
Miembro insignia
Holi, el dia de hoy les traeré un tutorial simple y facil de entender.
El objetivo es crear un objeto en Pokémon Ruby, Emerald o Fire Red mediante el cual activaremos un script.
Antes de empezar, como siempre, tocan los creditos.
El creador de la rutina original que es para Fire Red fue Darthatron y la posteó justo aqui.
El que porteó la rutina a Pokémon Emerald fue Phenom2122 y la posteó justo aqui.
El que porteó la rutina a Pokémon Ruby fue karatekid552 y la posteó justo aqui.
Dicho eso, empecemos.

Requisitos:
-ROM de Pokémon Fire Red USA v1.0 / ROM de Pokémon Emerald USA / ROM de Pokémon Ruby USA v1.0
-Editor Hexadecimal de nuestra preferencia (Yo usaré mi amado HxD)
-Un editor de objetos (Yo usaré Item Manager)
-Una calculadora en modo programador (Yo usaré el sencillo calc.exe de toda la vida)
Opcionalmente tambien podemos usar un editor de texto para tomar notas (Yo usaré el buen notepad.exe)

Procedimiento:
1) Primero debemos crear nuestro objeto.
Los parametros mas relevantes son:
Nombre, Index Number, Pocket, Type y Field Usage.

En mi caso, este fue el resultado:


2) Con nuestro objeto ya creado, ahora debemos escribir el script al que invocará.
Tal y como la primera vez, yo escribí un script que me permita curar a mi equipo Pokémon.

3) Ya listos nuestro objeto y nuestro script, es hora de usar nuestro editor hexadecimal.
Lo primero que haremos será insertar en un offset vacio esta Rutina ASM Compilada:

Fire Red:
10 B5 04 1C 78 46 13 30 0C 49 08 60 20 1C 0C 49 00 F0 10 F8 10 BC 01 BC 00 47 10 B5 04 1C 0A 48 05 49 00 F0 07 F8 20 1C 06 49 00 F0 03 F8 10 BC 01 BC 00 47 08 47 C0 46 E5 9A 06 08 98 99 03 02 3D 10 0A 08 09 75 07 08 XX XX XX 08​

Emerald:
10 B5 04 1C 78 46 13 30 0C 49 08 60 20 1C 0C 49 00 F0 10 F8 10 BC 01 BC 00 47 10 B5 04 1C 0A 48 05 49 00 F0 07 F8 20 1C 06 49 00 F0 03 F8 10 BC 01 BC 00 47 08 47 C0 46 F9 8E 09 08 F4 A0 03 02 DD D0 0F 08 9D 90 0A 08 XX XX XX 08​

Ruby:
10 B5 04 1C 78 46 13 30 0C 49 08 60 20 1C 0C 49 00 F0 10 F8 10 BC 01 BC 00 47 10 B5 04 1C 0A 48 05 49 00 F0 07 F8 20 1C 06 49 00 F0 03 F8 10 BC 01 BC 00 47 08 47 C0 46 B9 55 06 08 00 5D 00 03 51 90 0C 08 75 AB 07 08 XX XX XX 08​

Como veran, la rutina tiene un "XX XX XX".
Eso lo reemplazarán con el offset donde hayan insertado su script, convertido en pointer.

¿Como convertir un offset en pointer? Simple y sencillo.
Tomamos nuestro offset, intercambiamos la posición de su primer y tercer par, añadimos un "08" al final y ya está.

Ejemplo: Yo inserté mi script en 802C28.
Asi que intercambio las posiciones del primer y el tercer par dando como resultado 28 2C 80
Para terminar añado un 08 resultando en 28 2C 80 08, ese es mi pointer.


En este caso, el 08 ya está incluido en la rutina por lo que no hace falta.

4) Con nuestra rutina ya insertada en nuestra ROM y dentro de ella nuestro script, toca volver al Item Manager.
Vamos al Field Usage del objeto y lo reemplazaremos por el offset donde insertamos la Rutina ASM Compilada +1, dejando intacto el 8 al inicio.
En mi caso, como mencioné antes, yo inserté la rutina en 71B850.
Por lo tanto, el Field Usage de mi objeto será: 871B851.

5) Guardamos y probamos.

Aqui mi resultado en las 3 ROMs.


Y eso es todo.​

Post Original:
Holi.
Encontré hace un rato este precioso tutorial y quiero compartirlo con ustedes.
Antes de empezar, como siempre, los creditos totales van para Darthatron de PokeCommunity quien compartió su rutina justo aqui y tambien cabe aclarar que para el tutorial estaré utilizando FireRed.

Sin embargo, el usuario "Phenom2122" de PokeCommunity ha porteado la rutina a Pokémon Emerald justo aqui.

Ahora si, dicho esto...
¡Empecemos!

1) Primero, creamos un objeto en Item Manager.
Los parametros a rellenar son.
-Nombre del Objeto (En mi caso, "HEALER")
-Index Number (En mi caso, 34)
-Descripción (Opcional)
-Pocket (En mi caso, "Key Items")
Clickeamos en el Boton ">>" y nos aseguramos de que el Type sea el 02 Use-of-SELECT.

2) Una vez que tengamos nuestro objeto ya creado, escribiremos nuestro Script en XSE.
En mi caso, yo hice un script que ejecutará un Msgbox, luego el fadescreen 0x1, luego el Special 0x0, luego el fadescreen 0x0, luego el Fanfare de curación, luego el waitfanfare, luego otro msgbox mas, y fin.
Si, adivinaron, un Item que curará a tus Pokémon <3 .. (2OP4M3)
Anoten el offset del script ya compilado, en mi caso fue: 900182

3) Ahora, necesitaremos poner esta rutina ASM compilada en algun Offset Libre.
Anoten tambien ese offset libre porque será el Field Usage del Objeto.
En mi caso, la rutina irá en: 71A330
Fire Red:
Código:
10 B5 04 1C 78 46 13 30 0C 49 08 60 20 1C 0C 49 00 F0 10 F8 10 BC 01 BC 00 47 10 B5 04 1C 0A 48 05 49 00 F0 07 F8 20 1C 06 49 00 F0 03 F8 10 BC 01 BC 00 47 08 47 C0 46 E5 9A 06 08 98 99 03 02 3D 10 0A 08 09 75 07 08 XX XX XX 08
Emerald:
Código:
10 B5 04 1C 78 46 13 30 0C 49 08 60 20 1C 0C 49 00 F0 10 F8 10 BC 01 BC 00 47 10 B5 04 1C 0A 48 05 49 00 F0 07 F8 20 1C 06 49 00 F0 03 F8 10 BC 01 BC 00 47 08 47 C0 46 F9 8E 09 08 F4 A0 03 02 DD D0 0F 08 9D 90 0A 08 XX XX XX 08
4) Modificaremos los bytes "XX XX XX" con el Offset donde está nuestro script compilado, convertido en un Pointer.

Mark: ¡Espera, Espera, Espera! ¡Alto ahi, cerebrito!
¿¡Y como se pasa de Offset a Pointer?

Lunos: ¡Pues muy sencillo, Mark!
Primero, tomaremos nuestro offset, que repito, en mi caso fue el: 900182
Segundo, lo separamos en 3 parejas de 2 digitos cada uno.
En mi caso, 900182 quedaria en 90 01 82
Y en Tercero, lo daremos vuelta de este modo: "82 01 90"

Nota: Normalmente, se añade un "08" al final, pero como en este caso ya está añadido, pues nada.

5) Volvemos al Item Manager, abrimos nuestra ROM, vamos hacia nuestro objeto, pulsamos el Boton ">>" y nos centraremos en el Campo "Field Usage".
¿Recuerdas que te dije que guardases el Offset en el que ponias la Rutina ASM compilada?
Pues ahora lo necesitarás.
En mi caso, puse el codigo en el offset 71A330 como dije anteriormente.
Pues lo unico que tenemos que hacer es poner el offset +1 en el Field Usage.

¿Yo puse mi trozo de codigo en 71A330?
Pues entonces, el Field Usage quedará en "871A331"
-"8" al inicio porque asi funciona Item Manager.
-Y 71A331 porque 71A330 + 1 = 71A331

Y listo, está hecho.
¡Ahora solo nos queda darnos el objeto mediante GiveItem (O GivePokemon con el Objeto Equipado, da igual) y a probar!

Algunas imagenes del producto terminado:

Y como se que unos simples Msgbox en Imagen no demuestran mucho..
Aqui dejo el IPS.
ponganlo en una ROM Limpia de FireRed y vayan con el Youngster del Centro Pokemon de Ciudad Verde.

ADVERTENCIA:
Al parecer, algunos comandos podrian no funcionar.
Yo he usado el "lock" y arruina totalmente el objeto.
Asi que principalmente, jueguen un poco con eso.
Yo puedo confirmar que los comandos:
-Msgbox 0x5 y 0x6
-Fanfare 0x100
-Waitfanfare
-Fadescreen 0x1 y 0x0
-Compare LASTRESULT 0x1
-If 0x1 goto
-If 0x0 goto
Funcionan perfectisimamente.

Y bueno, eso ha sido todo.
Espero que les sea de utilidad.
Hasta luego <3

EDITO:
En lo posible, leanlo despacio porque podria ser un tanto confuso.
Si se necesita, quiza termine añadiendo imagenes en cada paso.

EDITO2:
¡Diantres!
He puesto "Registrar" en el titulo en lugar de "Registrando" >_< ...
Si un Moderador pudiese corregirlo, seria fenomenal <3

EDITO3 (02/08/2017):
Añadida una versión de la rutina compilada para Pokémon Emerald.
La de Fire Red NO funciona en Emerald.​
 
Última edición:

FEL!X

ᴛᴜ ᴀᴍɪɢᴏ ᴇʟ ᴇsᴘᴀᴅᴀᴄʜíɴ
Usuario de Oro
Respuesta: GBA | Script | Activar un Script "Usando" o "Registrar" un Objeto

¡Brutal Lunos! Es un bestial aportazo.

En un principio no he entendido a que te referias, yo cambiaría el título por "Activar un script al usar un objeto". Creo que es más intuitivo.

Está genial, a simple vista ya me puedo imaginar un montón de cosas que se pueden hacer con esto- como por ejemplo: encender/apagar una linterna, activar/desactivar algún que otro aparato para dicho evento, hacer cambios de minis, givepokemons y muchísimos specials.

Gran aportazo, de veras, gracias por postearlo. :heart:

Un abrazo.

PD: La idea del "Healer" y otras más irán de puta madre para el testeo.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: GBA | Script | Activar un Script "Usando" o "Registrar" un Objeto

¡Brutal Lunos! Es un bestial aportazo.

En un principio no he entendido a que te referias, yo cambiaría el título por "Activar un script al usar un objeto". Creo que es más intuitivo.

Está genial, a simple vista ya me puedo imaginar un montón de cosas que se pueden hacer con esto- como por ejemplo: encender/apagar una linterna, activar/desactivar algún que otro aparato para dicho evento, hacer cambios de minis, givepokemons y muchísimos specials.

Gran aportazo, de veras, gracias por postearlo. :heart:

Un abrazo.

PD: La idea del "Healer" y otras más irán de puta madre para el testeo.
¡Es cierto! ¡Ni lo habia pensado!
¡Esto viene de perlas para hacer Trajes a modo de Objetos <3
Sobre el titulo, creo que los Usuarios sin rango no pueden modificarlo, yo al menos lo intenté pero al modificar el post principal, no me deja alterar el titulo >_< ...

EDITO:
Ahi está, tan solo tenia que ir al Editor Avanzado, ni me habia fijado xDD
 

Gold

Porrero a tiempo parcial
Miembro insignia
Genial, genial y más que genial

Este es el tutorial que usé para los nuevos items del Ragnarök, es una pasada de tutorial, gracias por traerlo, le servirá a muchos.

Saludos c:
 
M

Miembro eliminado 28262

Invitado
Respuesta: GBA | Script | Activar un Script usando un Objeto

WTF!! Porque esto tiene tan pocos comentarios?
En fin... este tutorial es la leche! Entendí completamente todo y está muy bien explicado. Felicitaciones Lunedì

Ahora es muy noche pero si esto sirve créeme que la voy voy liar en final red!

Muchísimas gracias papu
Paz y Respeto!

#Seich Capriccola
 

Xabier2012

Usuario mítico
Respuesta: GBA | Script | Activar un Script usando un Objeto

Es lo que estaba buscando. Y la verdad es que me parece un tutorial bastante importante
como para que tenga tan pocos comentarios. Por cierto.
¿Alguien me explica con mayor detalle los pasos 3 y 4? XD
 

Toni

Leyenda de WaH
Respuesta: GBA | Script | Activar un Script usando un Objeto

Es lo que estaba buscando. Y la verdad es que me parece un tutorial bastante importante
como para que tenga tan pocos comentarios. Por cierto.
¿Alguien me explica con mayor detalle los pasos 3 y 4? XD
Muy fácil. En un offset libre pones ese código que muestra en el tuto
Si te fijas bien, hacia el final del código hay 3X.
Pues esas 3X las sustituye por el puntero del offset donde has insertado el código.(punetero=offset permutado)
No creo que necesites una explicación de cómo se permuta, está explicado
Lo has entendido?
Un saludo, espero que te sirva.
 

Xabier2012

Usuario mítico
Respuesta: GBA | Script | Activar un Script usando un Objeto

Muy fácil. En un offset libre pones ese código que muestra en el tuto
Si te fijas bien, hacia el final del código hay 3X.
Pues esas 3X las sustituye por el puntero del offset donde has insertado el código.(punetero=offset permutado)
No creo que necesites una explicación de cómo se permuta, está explicado
Lo has entendido?
Un saludo, espero que te sirva.
Lo he entendido. Lo que pasa es que nunca he buscado un offsets libre con este programa y entonces voy a lo desconocido. Claro que no es difícil de entender. Si tengo algun problema cuando lo haga os informo.
 

Toni

Leyenda de WaH
Respuesta: GBA | Script | Activar un Script usando un Objeto

Que programa?
HxD? Sólo tienes que mirar los bytes que tengan FF, significa que están vacías. Puedes buscar espacio con FSF
 

Xabier2012

Usuario mítico
Respuesta: GBA | Script | Activar un Script usando un Objeto

He abierto el Item editor y me ha dado rum-time error "6"
Creo que con mi fire red no va. ¿Es lo mismo el item editor que el item manager?
Si alguien lo tiene que me lo pase. Gracias
 

Juan Kio

Aprendiendo decomp...
Respuesta: GBA | Script | Activar un Script usando un Objeto

Uff que pedazo de tutorial,la verdad esto va de cabeza a mi hack
Parece un poco largo pero con un poco de tiempo se logra
Muchas gracias por traerlo a WaH,de 10
:)
 
Duda, ¿Se puede restringir el uso de un objeto a exclusivamente usar en el exterior? Por ejemplo, la bicicleta no se puede usar en las casas, pero se puede usar en cuevas, yo quiero crear un objeto que solo pueda usarse en medio de un pueblo/ciudad o ruta.
 

Katherine

Omnipresente
Miembro de honor
Respuesta: Re: GBA | Script | Activar un Script usando un Objeto

Duda, ¿Se puede restringir el uso de un objeto a exclusivamente usar en el exterior? Por ejemplo, la bicicleta no se puede usar en las casas, pero se puede usar en cuevas, yo quiero crear un objeto que solo pueda usarse en medio de un pueblo/ciudad o ruta.
Pues así, de primeras se me ocurre un método fácil y algo chapucero quizá.
Cada vez que se llame al script del objeto, que este compruebe el valor de una variable/flag y dependiendo de su valor que muestre un mensaje conforme no se ha podido usar el objeto o que se use con normalidad. Variable que sería modificada en cada uno de los mapas al entrar mediante un script de nivel.
Por ejemplo: entras en un lugar donde no quieres que se pueda usar el objeto, le das a la variable el valor 0. Entras en un lugar donde si quieres que sea utilizable, le das a la variable el valor 1. Entonces, al llamar el script del objeto, si la variable es 0 muestra mensaje de error, si es 1, lo usa con normalidad.

Miau revoir~.
 

Dani_SR_17

¡Pokémon LionHeart!
Respuesta: GBA | Script | Activar un Script usando un Objeto

Duda, ¿Se puede restringir el uso de un objeto a exclusivamente usar en el exterior? Por ejemplo, la bicicleta no se puede usar en las casas, pero se puede usar en cuevas, yo quiero crear un objeto que solo pueda usarse en medio de un pueblo/ciudad o ruta.
Déjate de cosas tan cutres.
El gran @Sir Adke me dio la solución maestra para ello en este post.

Solo tienes que mirar el valor de 02036E13 con comparefarbytetobyte, y te dirá el tipo de mapa en el que estás (según lo has configurado en el cabezal del AM).

PD: La bici no depende de si esta en interior o exterior, tengo un tutorial sobre ello.
 
Entiendo. Pues muchas gracias, tengo entonces que hacer el comparefarbytetobyte y permitir solo que funcione en 0x1, 0x2 y 0x3.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: GBA | Script | Activar un Script usando un Objeto

He editado el post principal.
-Añadí la rutina compilada que si funciona en Pokémon Emerald.
-Modifiqué un poco ciertos terminos usados en el tutorial.

Sin embargo, creo que lo pondré todo en un spoiler por los bonitos recuerdos y lo volveré a escribir, porque ese pedazo de cacho de trozo de tutorial tiene pinta de ser aburridisimo.
A mas tardar para mañana ya deberia de tenerlo listo, pero probablemente me lo sacaré de encima hoy.​
 
Última edición:
M

Miembro eliminado 28262

Invitado
Respuesta: GBA | Script | Activar un Script usando un Objeto

He editado el post principal.
-Añadí la rutina compilada que si funciona en Pokémon Emerald.
-Modifiqué un poco ciertos terminos usados en el tutorial.

Sin embargo, creo que lo pondré todo en un spoiler por los bonitos recuerdos y lo volveré a escribir, porque ese pedazo de cacho de trozo de tutorial tiene pinta de ser aburridisimo.
A mas tardar para mañana ya deberia de tenerlo listo, pero probablemente me lo sacaré de encima hoy.​
Se agradece, este tutorial nos ha servido muchisimo, una pequeña actualizacion y una revisión que sirva para los nuevos retoños de estos días está más que bienvenida.

Saludos y Buenas vibras!
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: GBA | Script | Activar un Script usando un Objeto

Listo, creo que quedó un poco mejor que antes.
Tambien he añadido la rutina para Ruby y he dejado 3 GIFs mostrando que todas funcionan correctamente.
 

Versekr Dark

Usuario mítico
Respuesta: GBA | Script | Activar un Script usando un Objeto

Rutina Rojo Fuego:

.text
.align 2
.thumb
.thumb_func
.global Hax

setup:
push {r4, lr}
mov r4, r0
mov r0, pc
add r0, #0x13
ldr r1, .unk_02039884
str r0, [r1]
mov r0, r4
ldr r1, .sub_080A11F0
bl bx_r1
pop {r4}
pop {r0}
bx r0

main:
push {r4, lr}
mov r4, r0
ldr r0, .ScriptToCall
ldr r1, .CallScript
bl bx_r1
mov r0, r4
ldr r1, .del_c3_from_linked_list
bl bx_r1
pop {r4}
pop {r0}
bx r0

.align 2
bx_r1:
bx r1

.align 2
.CallScript:
.word 0x08069BA8+1
.unk_02039998:
.word 0x02039884
.sub_080A103C:
.word 0x080A11F0+1
.del_c3_from_linked_list:
.word 0x08077540+1
.ScriptToCall:
.word 0x08XXXXXX

Compilada

10 B5 04 1C 78 46 13 30 0C 49 08 60 20 1C 0C 49 00 F0 10 F8 10 BC 01 BC 00 47 10 B5 04 1C 0A 48 05 49 00 F0 07 F8 20 1C 06 49 00 F0 03 F8 10 BC 01 BC 00 47 08 47 C0 46 A9 9B 06 08 84 98 03 02 F1 11 0A 08 41 75 07 08 XX XX XX 08
 
Arriba