Registrarse

GBC | Manual de Scripts [Act. 07/03]

Gold

Porrero a tiempo parcial
Miembro insignia
MEGAMANUAL DE SCRIPTS (8% Completo)

Hola a todos, el dia de hoy les traigo un tutorial nunca antes visto en la comunidad latina, se trata del megacomprendio de scripts GBC (habia un par pero estan mal explicados e incompletos), usando como compilador PKSV UI de Score_under, y como herramienta escencial Johtomap, y a-point, o cualquier calculadora de punteros para GBC.

LISTA DE HERRAMIENTAS PARA SCRIPTEAR GBC
*Johtomap (ultima version)
*Pksv-UI
*A-point
*Gold Finger, transhexion o HXD (Los mejores editores hexadecimales)
*Visualboy Advance (sino como probaras tus scripts eh?)
*Bloc de notas (debes de tener apuntado donde pones cada cosa)
*un rom de pokemon gold o silver (en ingles)

Antes de iniciar les pondre los tipos de scripts que encontraremos en GBC:

[Tabs][tab=Scripts Comunes]Estos son los scripts mas usados en GBC, no tienen una estructura complicada, en comparacion a otros tipos, estos eventos se repiten una y otra vez, puede ser uno sencillo como un simple npc que te habla, u otro mas complicado, como la batalla contra tu rival o Yasmina cuando esta en el faro y no le has dado la medicina[/tab]
[Tab=Scripts de Gatillo] Estos son una clase de scripts mas complicado, consiste en scripts invisibles que se ejecutan cuando el prota pisa un tile especifico, cabe mencionar que estos scripts tienen distintas condiciones, siendo:

00= El script esta encendido, osea que cada vez que pises el tile donde esta el script de gatillo el script se ejecutara, a menos que otro script le cambie la condicion.
01= El script esta apagado, osea que aunque pases una y otra vez el tile donde esta el script,.este no se ejecutara, a menos que otro script le cambie la condicion.

La condicion del script de gatillo se configura desde johtomap.
Ademas el juego no ejecuta scripts de gatillo fuera de la tabla de scripts de gatillo, para agregar uno nuevo debes de editar en hex la ubicacion de un script de gatillo que no usaras y mandarle al nuevo mapa donde lo usaras (se explicara el proceso mas detenidamenre mas tarde.

Un ejemplo de script de gatillo es cuando te reta tu rival en cherrygrove, pasas por ese tile la primera vez y no pasa nada, pero el script tras recibir el pokedex le cambia la condicion a 00, entonces cuando pasas por ahi el script se ejecuta, pero al final del script hay un comando que le devuelve la condicion a 01, por lo cual pueses seguir pasando y no se repetira ese evento.[/tab]
[Tab=Scripts de Mapa]: Es una clase de script que se le es asignado al mapa actual, la funcion de estos es autoejecutar el script asignado al mapacal nomas entrar al mapa, lo peculiar es que solo se ejecuta una vez, y es imposible volverlo a ejecutar.

Para acceder al script de nivel de un mapa solo basta con ir a las propiedades del mapa, buscar la casilla "map script" y darle "decompile"

OJO: a veces pksv se equivoca al mostrar el script de nivel de un mapa (por ejemplo el script de nivel del lab. Del prof. Elm esta en 0x180023, pero johtomap dice que esta en 0x180000.

Un ejemplo de estos es cuando entras por primera vez al lab del prof. Elm, automaticamente y sin pisar ningun script de gatillo te mueves hacia donde esta el prof. Elm, pero si vuelves a entrar veras que ya no pasa ese script.[/tab][/tabs]

Ahora que sabemos que tipos de scripts hay les pondre una explicacion del uso basico de PKSV, luego pasamos "a lo que te truje" osea comandos y aplicacion de estos

Lo primero que haremos sera asociar pksv a jothomap, usare unas imagenes de cortesia de @javcdark , abrimos el rom con johtomap, nos dirigimos a la casilla de eventos, seleccionamos la persona, trigger, script de nivel o cartel que queremos editar, luego de seleccionarlo le damos click a "decompile script", si es la primera vez que usamos johtomap este dira que no hay un editor de scripts asociado, le damos que si y buscaremos el pksv.

Yaseleccionamos el personaje que deseamos editar y despues damos click en "decompile script"

y se nos abrira una ventana como esta


esto de jothomap es para tener un mejor control de lo que queremos, y asi no liarnos despues viendo a que personaje le pusimos el script o a cual no.

Ahora viene el listado de comandos disponibles en pksv, ycsu valor en hex:

[Tabs][tab=Comandos]
0x00: "2call",
0x01: "3call",
0x02: "2ptcall",
0x03: "2jump",
0x04: "3jump",
0x05: "2ptjump",
0x06: "if equal",
0x07: "if not equal",
0x08: "if false",
0x09: "if true",
0x0A: "if less than",
0x0B: "if greater than",
0x0C: "jumpstd",
0x0D: "callstd",
0x0E: "3callasm",
0x0F: "special",
0x10: "2ptcallasm",
0x11: "checkmaptriggers",
0x12: "domaptrigger",
0x13: "checktriggers",
0x14: "dotrigger",
0x15: "writebyte",
0x16: "addvar",
0x17: "random",
0x19: "copybytetovar",
0x1A: "copyvartobyte",
0x1C: "checkcode",
0x1E: "writecode",
0x1F: "giveitem",
0x20: "takeitem",
0x21: "checkitem",
0x22: "givemoney",
0x23: "takemoney",
0x24: "checkmoney",
0x25: "givecoins",
0x26: "takecoins",
0x27: "checkcoins",
0x2B: "checktime",
0x2C: "checkpoke",
0x2D: "givepoke",
0x2E: "giveegg",
0x2F: "givepokeitem",
0x31: "checkbit1",
0x32: "clearbit1",
0x33: "setbit1",
0x34: "checkbit2",
0x35: "clearbit2",
0x36: "setbit2",
0x37: "wildoff",
0x38: "wildon",
0x39: "xycompare",
0x3A: "warpmod",
0x3B: "blackoutmod",
0x3C: "warp",
0x41: "itemtotext",
0x43: "trainertotext",
0x44: "stringtotext",
0x45: "itemnotify",
0x46: "pocketisfull",
0x47: "loadfont",
0x48: "refreshscreen",
0x49: "loadmovesprites",
0x4B: "3writetext",
0x4C: "2writetext",
0x4E: "yesorno",
0x4F: "loadmenudata",
0x50: "writebackup",
0x51: "jumptextfaceplayer",
0x52: "jumptext",
0x53: "closetext",
0x54: "keeptextopen",
0x55: "pokepic",
0x56: "pokepicyesorno",
0x57: "interpretmenu",
0x58: "interpretmenu2",
0x5C: "loadpokedata",
0x5D: "loadtrainer",
0x5E: "startbattle",
0x5F: "returnafterbattle",
0x60: "catchtutorial",
0x63: "winlosstext",
0x65: "talkaftercancel",
0x67: "setlasttalked",
0x68: "applymovement",
0x6A: "faceplayer",
0x6B: "faceperson",
0x6C: "variablesprite",
0x6D: "disappear",
0x6E: "appear",
0x6F: "follow",
0x70: "stopfollow",
0x71: "moveperson",
0x74: "showemote",
0x75: "spriteface",
0x76: "follownotexact",
0x77: "earthquake",
0x79: "changeblock",
0x7A: "reloadmap",
0x7B: "reloadmappart",
0x7C: "writecmdqueue",
0x7D: "delcmdqueue",
0x7E: "playmusic",
0x7F: "playrammusic",
0x80: "musicfadeout",
0x81: "playmapmusic",
0x82: "reloadmapmusic",
0x83: "cry",
0x84: "playsound",
0x85: "waitbutton",
0x86: "warpsound",
0x87: "specialsound",
0x88: "passtoengine",
0x89: "newloadmap",
0x8A: "pause",
0x8B: "deactivatefacing",
0x8C: "priorityjump",
0x8D: "warpcheck",
0x8E: "ptpriorityjump",
0x8F: "return",
0x90: "end",
0x91: "reloadandreturn",
0x92: "resetfuncs",
0x93: "pokemart",
0x94: "elevator",
0x95: "trade",
0x96: "askforphonenumber",
0x97: "phonecall",
0x98: "hangup",
0x99: "describedecoration",
0x9A: "fruittree",
0x9C: "checkphonecall",
0x9D: "verbosegiveitem",
0x9E: "loadwilddata",
0x9F: "halloffame",
0xA0: "credits",
0xA1: "warpfacing",
0xA2: "storetext",
0xA3: "displaylocation",[/tab][/tabs]
Ahora antes de empezar a armar nuestros scripts, es necesario que conozcamos sobre punteros y repunteo, pues tanto johtomap como Pksv trabajan con su propio sistema de punteros, este es:
Sistema de Punteros Permutados​
¿Que es eso de punteros permutados? Pues primero busca en un diccionario el significado de Permutar.

Ahora para saber un puntero permutado, se debe de hacer lo siguiente:

Buscar el puntero comun de la offset a la cual le sacaremos el puntero permutado, por ejemplo saco el puntero de 0x18004E, el cual es 26:4E40 (es un ejemplo, ese no es su puntero real) entonces para sacar el puntero permutado se cuentan los bytes del byte mas bajo hasta el banco, osea alrevés, entonces el puntero permutado de 2 bytes de esa offset es 0x404E, y el puntero permutado de 3 bytes seria 0x404E26, siendo estos los punteros que usaremos para compilar nuestros scripts.

Bank Script​

Por ultimo estan los bank script, un bank script es el banco en el cual se encuentran agrupados los scripts de cada mapa, por lo tanto al hacer un script nuevo este debe de estar en el mismo bank script, si esta en otro lugar el script simplemente no se ejecutará.

Por ejemplo en johtomap podemos ver que los scripts se hallan en el banco 0A (creo) lo cual es equivalente a que todos los scripts estan en el banco 0A (entre 18000 y 183FF) pero podemos hacer saltos, llamadas o poner textos a otros bancos.

ahora que sabemos esto pasamos a la compilacion de los scripts, empezare por los mas sencillos.

SCRIPTS SENCILLOS

este es el script mas sencillo de todos, solo se usan un par de comandos, antes de ello comenzaremos con saber como empezar tu script, OJO: si es tu primer script te recomiendo que NO hagas tu primer script encima de otro, busca espacio libre para ello (ya sea usando hackomatic o con un editor hex).

Ahora veremos la estructura de este script
Código:
#org 0x18007C
jumptextfaceplayer 0x4EA0 ' 0x181EA0
end

#org 0x181EA0
= Ola ke ase?\nmira este texto\lo ke ase?\e
Ahora explicare la estructura del script mas claro:
Código:
#org 0x(offset donde inicia tu script)
jumptextfaceplayer (puntero permutado 2bytes)(offset del texto)
end(con este comando finalizas tu script)

#org 0x(offset del texto)
= (pon tu texto aqui)
Ahora estudiemos los comandos usados:
#ORG: Con esto iniciamos el script, es para que el rom sepa el inicio de un script, va seguido del offset donde inicia el script.
Jumptextfaceplayer: es un comando de 2 bytes, es el mas sencillo, pues solo hace que:
El npc asignado te voltee a ver
cargar la fuente y bloquear los npc's del mapa
te diga un texto y fin.

Este comando no puede combinarse con otros, es solo para los npc comunes que solo te dicen algo.

Bien ya hemos aprendido como se estructura un script, y ademas sabemos como hacer un texto sencillo, vamos a algo mas complicado
En este apartado vamos a aprender sobre algo mas dificilillo, se trata de los comandos que nos dan cosas (item, pokemon, monedas) y en si son sencillos, asi qie explicare primero el de dar item:
Código:
#org 0x18006B
faceplayer
loadfont
2writetext 0x4450 ' 0x180450
keeptextopen
verbosegiveitem 0x6 0x1
3writetext 0x6A6568 ' 0x1A2568
closetext
loadmovesprites
end

#org 0x180450
= Aah, esto ya no\nme sirve, ¡toma!\e

#org 0x1A2568
= que te sirva a\nti. que a mi\pya no me vale.\e
Whoa! este es mas largo, cierto? Ahora a explicar cada comando que use en el script.

Faceplayer: es mas que obvio, hace que el npc al que le hablas te voltee a ver.
loadfont: es fundamental poner este comando antes de cada texto, pues sirve para que el rom cargue la fuente para abrir un cuadro de texto.
2writetext: este comando escribe un texto al juego, pero debe de estar en el mismo banco, entonces su puntero permutado sera de 2 bytes, si quieres ganar espacio en el banco no te recomiendo usarlo
keeptextopen: como su nombre lo dice, cuando un texto termina, mantiene la textbox abierta, es para evitar volver a abrirla cuando nos den un item.
verbosegiveitem: sirve para que el npc seleccionado nos de un item, con el formato xx yy donde:
xx= numero hexadecimal del item que nos dará
yy= cantidad del item que nos dará
3writetext: este hace lo mismo que el 2writetext, con la diferencia que este usa un puntero permutado de 3 bytes, lo que significa que puede estar en cualquier lugar del rom, recomiendo mucho este comando, asi evitan llenar demasiado pronto el bank script, ademas es util si vas a poner textos largos.
loadmovesprites: siempre debe estar despues de escribir un texto, pues al cerrarse la textbox este comando hace que los npc vuelvan a moverse trs ejecutado el script.
end: finaliza el script, me he cargado en el rom varias veces por no poner end al final del script.
Bien, ahora aprenderemos a usar el comando de movimiento de minis, este comando es muy utilizado en scripts de gatillo, aunque puedes usarlo en scripts normales, como en el siguiente ejemplo, cabe mencionar que los movimientos se agrupan igual que un texto, osea en un #org al final, mira este ejemplo:
Código:
faceplayer
loadfont
checkbit1 0x6D
if true :inicio2
2writetext :texto2
closetext
loadmovesprites
setbit1 0x6D
end

:inicio2
2writetext :texto1
closetext
loadmovesprites
applymovement 0x4 0x4710 ' 0x120710
disappear 0x4 
setbit1 0x6D
end

:texto1
= Hola forastero\ntengo sueño\lasi que me voy\padios!!\e

:texto2
= no tengo\nsueño, por eso\lsigo aqui :P\e

#org 0x120710
M step_left step_down step_down end
Bien, como pudieron ver acabo de usar varios comandos desconocidos, pero eso va despues, porque ahora nos fijaremos en este comando:

applymovement: Este comando hace que cierto minisprite se mueva, el formato a seguir es el siguiente:
Código:
applymovement [N° de Minisprite][Puntero Permutado 2 bytes][Offset de los movimientos]
Explicare lo siguiente:
Para mover al prota, debes de poner en N° de minisprite "0x0", para mover los npc debes de poner el numero del minisprite (puedes verlo en johtomap) y sumarle +2 (hex) por ejemplo, en johtomap selecciono el minisprite "8", para moverlo le sumo 2 hexadecimal, entonces en N° de minisprite pondre "0xA"

Ahora que sabemos que se agrupan casi de la misma manera que un texto, preocederemos a conocer su estructura completa como script
Código:
#org [tu offset]
M [nombre de cada paso] end
ahora estudiaremos la lista de pasos, aqui estan, pero aun me faltan completar algunos:
Código:
00 = Turn_Down
01 = Turn_Up
02 = Turn_Left
03 = Turn_Right
04 = half_step_down
05 = half_step_up
06 = half_step_left
07 = half_step_right
08 = slow_step_down
09 = slow_step_up
0A = slow_step_left
0B = slow_step_right
0C = step_down
0D = step_up
0E = step_left
0F = step_right

Los siguientes pasos siguen en hexadecimal y aun no se su nombre en pksv
10 = 1½ step
11 = 1½ step up
12 = 1½ step left
13 = 1½ step right
14 = slow slide 1 step down
15 = slow slide 1 step up
16 = slow slide 1 step left
17 = slow slide 1 step right
18 = slide 1 step down
19 = slide 1 step up
1A = slide 1 step left
1B = slide 1 step right
1C = fast slide 1 step down 
1D = fast slide 1 step up
1E = fast slide 1 step left
1F = fast slide 1 step right
20 = Turn 1 step (Face opposite of HIRO) down
21 = Turn 1 step (Face opposite of HIRO) up
22 = Turn 1 step (Face opposite of HIRO) left
23 = Turn 1 step (Face opposite of HIRO) right
24 = Turn 1 step (Facing HIRO) down 
25 = Turn 1 step (Facing HIRO) up
26 = Turn 1 step (Facing HIRO) left
27 = Turn 1 step (Facing HIRO) right
28 = 1 step in waterfall mode (facing changes between down and right) down ???
29 = 1 step in waterfall mode (facing changes between down and right) up ???
2A = 1 step in waterfall mode (facing changes between down and right) left ???
2B = 1 step in waterfall mode (facing changes between down and right)  right ???
2C = slow jump over 1 step down
2D = slow jump over 1 step up
2E = slow jump over 1 step left
2F = slow jump over 1 step right
30 = jump over 1 step down
31 = jump over 1 step up
32 = jump over 1 step left
33 = jump over 1 step right
34 = fast jump over 1 step
3A = remove fixed facing
3B = fix facing
3D = hide person
45 = make move before command faster
46 = Wait for time (xx as time)
47 = End of moving script
49 = hide person
4C = Teleport from
4D = Teleport to
4E = Fall from above screen
4F = 5 whole turns
55 = Shake screen (xx as displacement)
No hay mucho misterio en los pasos, es obvio que hace cada paso, por ejemplo half_step_up ya sabemos que es "medio paso hacia arriba"

Con eso estamos completos en este comando, mas adelante veremos como se aplican en scripts de gatillo.

Hasta aqui llega la investigacion por el momento, se esta investigando uno a uno la utilizacion y aplicacion de cada comando, luego se agregara.ioj

OJO: Si quieres que se complete esta guia, puedes ayudarme corrigiendo a agregando mas documentacion al respecto, porfavor contacta por mp o perfil si quieres agregar mas datos y enriquecer este megacomprendio de scripts.
 
Última edición:

Master Brock

Miembro insignia
Miembro insignia
Usuario de Platino
Respuesta: [GBC] Comprendio de Scripts [8% Completo]

Que buenisima idea...
Una guia que te informen de los scrip, a mi me encanta,
Aunque no pueda aportar nada... que sepas que la apoyo totalmente
;)
 

Pacodelopio

Entrenador Pkmn
Re: [GBC] Comprendio de Scripts [8% Completo]

Que iniciativa mas buena, ese gold qe crack esperemo que esto crezca poco a poco, jajaja :D
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: [GBC] Comprendio de Scripts [8% Completo]

Muy buena iniciativa, desde hace meses que te exigía sacarla y nomas no haces caso.

Aqui va mi aporte a la guía por el momento:

GOLD_Z! dijo:
OJO: a veces pksv se equivoca al mostrar el script de nivel de un mapa (por ejemplo el script de nivel del lab. Del prof. Elm esta en 0x180023, pero johtomap dice que esta en 0x180000.
Te explico.

No es que PKSV ni Jmap se equivoquen, lo que pasa es que el script header (o "scripts de mapa" como tu le dices) sigue una estructura:

[Number1 of pointers] [2byte pointer to script][00][00]][Number2 of pointers] Number2 [2byte pointer to script]

Si tu revisas esta estructura en 0x180000 y la sigues, veras que hay 6 pointers y el primero te lleva a 0x18001A; de ahi hace un "priorityjump" y te envia a 0x180023 donde se encuentra el primer script al entrar al laboratorio del profesor. Es por eso que parece que los datos de Jmap y PKSV no coinciden, pero en realidad se usa este metodo por que hay mapas con mas de un script.

Respecto a ir completando la guia que te parece solo una absurda traduccion (corta) del compendio original. Algo como esto:

Código:
0x00: "2call" ; Puntero de 2-bytes a Script; cuando el script termina regresa al script inicial/original.
Todo esto usando un vocabulario uniforme: usar mayusculas al inicio de "Script", cuando se hable de bytes usar un guion entre el numero y la palabra byte (2-byte, 3-byte), usar unicamente la palabra puntero o pointer segun te paresca, pero no usar ambas, etc. etc. etc.

PD: La palabra correcta es Compendio.

Edito:
A la estructura le hicieron falta unos bytes, la correcta es esta:

[Number1 of pointers] [2byte pointer to script][00][00]][Number2 of pointers] [Number][2byte pointer to script]

La parte roja es la correcion. La segunda parte de la estructura de los script del Script Header necesita un byte antes de cada pointer para saber en que momento se ejecuta segun esta tabla.



Ademas, usualmente estos scripts terminan con el comando 'return'.
 
Última edición:

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: [GBC] Comprendio de Scripts [8% Completo]

He hecho una pequena actualizacion al comprendio, explicando algunas cosas escenciales para scriptear en pksv, ademas de la estructura de un script sencillo.
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: [GBC] MegaManual de Scripts [Act. 19/02]

Doble post, awwwyeah!

He agregado otro apartado al tutorial, este es sobre los comandos necesarios para que nos den un item, pero aclaro que el expuesto aqui es no usando flags, por lo que si prueban el script de arriba veran que se repetira infinitamente, ya explicare ese detalle despues.
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: [GBC] MegaManual de Scripts [Act. 21/02]

¿triple post? Not bad...

Aqui dejo un pequeño apartado explicando la funcion de las etiquetas dinámicas, aqui la dejo para que no busquen en el monstruoso post
las etiquetas dinamicas son una funcion de pksv (de xse tambien) la cual hace que el compilador organize automaticamente el script a modo que no busques maualmente en hex donde poner cada script,texto o pasos.

Su estructura es la siguiente:

Código:
#dyn 0x180000
#org @iniciodelscript
faceplayer
loadfont
2writetext :texto1
keeptextopen
giveitem 0x2A 0x1
2writetext :texto2
closetext
loadmovesprites
end

:texto1
= Esta es una\nprueba de un\lscript, equisde\e

:texto2
= Una prueba sobre\ncomo usar la\lfuncion dynamic\e
facil no? explicare cada cosa que no conociamos
Código:
#dyn 0x180000
esto significa que usaremos offsets dinamicas para el script, por eso pusimos #dyn al inicio, luego va seguido del offset donde empieza el script deseado
Código:
#org @iniciodelscript
como ya sabemos los scripts inician siempre con un #org, igual aca, y explicare los signos "@" y ":"
@=Organizar un el inicio de un script, por eso solo puede ir en el encabezado del script
:= Organiza los subscripts, saltos, llamadas, textos y pasos dentro del mismo banco, por lo cual al usarlo en subscripts siempre buscan espacio dentro del mismo banco.

Como nos dimos cuenta, en vez de poner las offsets de los textos pusimos ":texto" esto es porque las etiquetas dinamicas hacen que se autoorganize el script y que se ponga cada cosa donde mejor quede, en vez de buscarlo nosotros mismos.

Anotaciones:
1. las etiquetas dinamicas NO deben de tener espacios, por ejemplo, nunca debemos poner ":salto 1" porque es incorrecto, lo correcto seria ":salto1" si lo ponemos veremos en el log que el script esta incorrecto.
2. NUNCA mezcles etiquetas dinamicas con saltos, subscripts, llamadas, textos o pasos que manden a otro banco, ya que esto confunde al compilador y te organizara el script en el otro banco,
2. PKSV no se actualiza desde hace rato, por lo cual las etiquetas dinamicas pueden fallar.
 
Última edición:
Respuesta: [GBC] MegaManual de Scripts [Act. 21/02]

Me gusta mucho estar parte del hack ya que según esto uno personaliza su hack mediante una historia , es una tremenda iniciativa el compartir parte de tus conocimientos @Sr.Dr.Prof. G0LD♪ , ojala algún día llegues a completarlo sin duda alguna un gran aporte ala comunidad WAH GBC y por ello te doy las gracias !!!!
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: [GBC] MegaManual de Scripts [Act. 03/03]

Actualizado el Manual con el comando Applymovement, sera vital conocerlo para los scripts de gatillo.

Saludos!!!
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: [GBC] MegaManual de Scripts [Act. 07/03]

Me autowarneare por multipost (?)

Esta vez les actualizo un minitutorial de las funciones de pksv, para ya no tener el editor hexadecimal, la calculadora, la calculadora de punteros y el bloc de notas abiertos a la vez, ya que todo viene en Pksv.

Empezaremos con buscar espacio libre en PKSV, ya que necesito poner un texto bastante largo y necesito al menos 0x70 bytes para ello, asi que se haremos esto:

1. Escribir el texto en un #org normal, poner cualquier offset valida, y nos vamos a ROM>Debug (fake compile) y se nos abrira una ventanita que nos mostrara todos los #org y strings, lo que nos interesa es ir hasta el final, veremos que estan todos las offsets y cuanto pesan, nos interesa el texto donde pondremos el texto, por ejemplo el texto que escribi pesa 0x9C bytes, entonces ese espacio necesitamos buscar

2. Ahora buscaremos el espacio libre, para ello nos vamos a ROM>Find Free Space y se nos abre una ventanita pequeña, ahora necesitamos saber donde mas o menos necesitamos el espacio libre, como uso el comando 3writetext puedo buscar espacio en cualquier lugar del ROM, los espacios libres grandes comienzan a partir de 0x182000, entonces pongo en el primer rectangulo esa offset

En el siguiente rectangulo la cantidad de bytes a buscar, como necesito 0x9C bytes para ese texto pongo ese valor ahi, ahora daremos clic a la opcion "00 mode" esto debido a que el espacio libre en GBC son los bytes 00.

Ahora solo damos find y nos mostrara nuestra offset deseada, en mi caso me mostro 0x818B6C0, pero ¿el rom no tiene tantos bytes cierto? pues para ver la direccion correcta solo ignoramos el 0x8, entonces la offset libre es 0x18B6C0, por lo tanto ahi hay suficiente espacio para poner nuestro texto sin sobreescribir nada.
Ya sabemos donde poner nuestro texto, pero ahora como ya estaba hablado, PKSV para escribir texto requiere del puntero permutado de la offset, pues como normalmente lo harias abres a-point, calculas la offset, la pones alreves y ya, pero esta vez no abriremos nada, lo haremos desde PKSV.

1. Ubica tu offset, mi texto lo puse en 0x18B6C0, entonces para calcularlo solo nos vamos a Tools>Calc and Notes, y se nos despliega una ventana parecida a la calculadora de windows, pero esta es mas orientada al RH.

2. Con las teclas de la calculadora escribiremos la offset a calcular, entonces ya escrito le daremos click al boton "Offset2pointer", y aparecera el puntero en los dos rectangulos de abajo, en mi caso me aparecio 5F:C056, pero ¿porque si uso a-point me da otro puntero? es porque pksv trabaja con punteros permutados, y al calcular el puntero lo autopermuta, entonces el puntero de 2-bytes a escribir es 0xC056, pero como yo necesito un puntero de 3-bytes solo le agrego el banco al final, quedando 0xC0565F, entonces en el script escribiremos "3writetext 0xC0565F".

Compilamos el script, si no tuvimos un error previo el script deberia de quedar perfecto, lo hicimos todo sin abrir ningun programa adicional
Ahora ya quedo mi script, pero ¿y si necesito escribir otro texto justo despues del anterior y no quiero abrir mas programas? pues es sencillo, solo necesitamos saber el tamaño del texto, mi anterior texto pesaba 0x9C bytes, entonces haremos esto.

1. Abrimos la calculadora de PKSV, y escribimos la offset donde empezaba el anterior texto, en mi caso 18B6C0, entonces segun PKSV el texto pesa 0x9C, para no sobreescribir el anterior le sumare 1 byte, quedando 0x9D, entonces con la calculadora sumaremos 18B6C0+9D, quedando 18B8DC, entonces ahi pondremos el siguiente texto.

Realizamos el proceso de calculo de punteros, y listo, el texto quedo quedo agrupado en bancos, esto es para llevar un orden en los textos, lo malo es que si cambiamos de opinion y queremos alargar el texto debemos de buscar otra offset, ya que al quedar juntos los textos al alargar uno sobreescribes otro.
 

Gold

Porrero a tiempo parcial
Miembro insignia
¿Nadie puede completar este post? ¿por qué banearon al dueño del post?
El autor regresará en octubre, pero probablemente no acabe la guia porque el ya no hackea GBC y por el bajo interés mostrado hacia el tutorial, además usuarios como @Chamber pueden guiarte de mejor manera que el autor de este tutorial c:
 
El autor regresará en octubre, pero probablemente no acabe la guia porque el ya no hackea GBC y por el bajo interés mostrado hacia el tutorial, además usuarios como @Chamber pueden guiarte de mejor manera que el autor de este tutorial c:
De hecho ya contacte con @ Chamber porque quiero hacer un par de cosillas en el pokemon gold y requieren un par de scripts. :D A ver si no está ocupado y puede enseñarme. xD
 

Chamber

Miembro insignia
Miembro insignia
¿Nadie puede completar este post? ¿por qué banearon al dueño del post?
Lo Banearon por ser un IDIOTA!! (?)

Ser hacker requiere ser autodidacta. De momento ya te recomende las lecturas necesarias en español (hechas por javcdark y por mi) para comprender las bases del GBC y los scripts basicos.

Yo te podria ayudar con los eventos de los legendarios poniendo los NPC y sus scritps, pero no tengo tiempo de enseñarte personalmente. Eso lo puedes lograr haciendo las tareas de mi escuela de GBC y yo te ayudo con las dudas.
 

LagannTTGG

Rom, Rom... Rom Hackeando!
Gracias ruki, este manual esta perfecto para nosotros lo que queremos rom hackear en GBC, pero me ha quedado una duda:

En la explicacion de los Scripts, dices que al inicio y cada comando debe tener un Offset. Como le asigno un Offset a cada Script?

Edito: Falto explicar el verbosegivepoke...
 
Última edición:

Crystal_

Héroe de WaH
Gracias ruki, este manual esta perfecto para nosotros lo que queremos rom hackear en GBC, pero me ha quedado una duda:

En la explicacion de los Scripts, dices que al inicio y cada comando debe tener un Offset. Como le asigno un Offset a cada Script?

Edito: Falto explicar el verbosegivepoke...
El offset de un script es simplemente la posición en la ROM en la que se encuentra dicho script. La herramienta usada en el tutorial para crear scripts utiliza la directiva #org para especificar el offset en el que el script debería ser escrito en la ROM. Varios comandos (ej. jumptextfaceplayer) utilizan punteros a texto o a otros scripts como parametros, que deben ser obtenidos del offset absoluto como se explica en el tutorial (ej. offset 0x18004E -> puntero 4E 40). Lo ideal para hacer hacks es utilizar pokecrystal, para que puedas referenciar todo con etiquetas (nombres) y así olvidarte de los offsets y punteros de cada cosa.

No existe "verbosegivepoke", tan solo "givepoke" y "verbosegiveitem".
 
Arriba