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
Ahora explicare la estructura del script mas claro:
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
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
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)
#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:
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.
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
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:
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:
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
ahora estudiaremos la lista de pasos, aqui estan, pero aun me faltan completar algunos:
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.
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
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]
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
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)
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: