tuts_gba
Thread Id: 30417
Thread Name: FR | Scripting & ASM | Mostrar Tilemaps Personalizados
#0
VampireQueen 28216
Tutorial Escrito por CryStal KcK (O Gold como le llaman ustedes)
----------
Hola a todos los Waheros, espero esteis bien ya saben que eso no me interesa hoy les traigo uno de mi tutos que más gente esperaba (El de cabezales de mapas creía que estaba completo, pero aún hay fallos) y bueno, este tutorial se lo dedico a [MENTION=26309]Tito Sayer301[/MENTION] que me lo pidió hace días, pero ahora si acá lo tenes hamor mio.

¿Que haremos con esto?
Pues simple, modificar la función ASM del Special 0x108 que es el que muestra el diploma que completamos la Pokedex, para así mostrar tilemaps a 16 colores personalizados, en su momento hackers como Trevor o Trifindo hicieron algo parecido a esto pero con mapas tiles, pero eso significaba quemarte un tileset entero y un mapa, por eso aqui lo haremos menos cutre, bien ¡Comenzaremos ahora!

Algunos puntos se especificarán al final del tutorial

Al aplicar esto la función del special 0x108 seguirá igual,
Si el valor de la variable 0x8002 es distinto a 0 cargará un tilemap diferente de la tabla, siendo que si halla como valor 0 entonces ignorará la rutina y cargará el diploma sin problema alguno.

Los .word 0xFFFFFFFF son punteros a tu propia tabla, teniendo como máximo 255 tilemaps (recuerda que la rutina es ignorada si la varible esta a 0x0!)
y para los vagos que odian compilar rutinas los novatos en ASM al final quedan adjuntas ls rutinas.

Los XX XX XX 08 representan el puntero al offset donde pusite tu rutina (ya sabes, es. THUMB, +1).

Rutinas Relacionadas al Tilemap/Tileset:

.align 2
.thumb

/*Reemplazador del Tilemap (Raw)*/

main:ldr r0, .VAR_8002
ldrb r0, [r0]
cmp r0, #0x0
bne go_table
ldr r1, .ORIG_RAW

continue:mov r0, #0x1
mov r2, #0x0
mov r3, #0x0
bl func
ldr r4, .NEXT_INT
bx r4

go_table:ldr r1, .TABLE_RAWS
lsl r0, r0, #0x2
add r1, r1, r0
ldr r1, [r1]
b continue

func:ldr r4, .DO_FNC
bx r4

.hword 0x0000
.ORIG_RAW:.word 0x084154E8
.TABLE_RAWS:.word 0xFFFFFFFF /*Change accordingly; word-aligned*/
.NEXT_INT:.word 0x080F4CD7
.VAR_8002:.word 0x020370BC
.DO_FNC:.word 0x08002041

en 0xF4CCA, escribe "00 00 00 4C 20 47 XX XX XX 08 00 00".

.align 2
.thumb

/*Reemplazador de Tileset (Tiles Actuales)*/

main:ldr r0, .VAR_8002
ldrb r0, [r0]
cmp r0, #0x0
bne go_table
ldr r1, .ORIG_DIPLOMA

continue:mov r0, #0x0
str r0, [sp, #0x0]
mov r0, #0x1
ldr r4, .NEXT_INT
bx r4

go_table:ldr r1, .TABLE_DIPLOMAS
lsl r0, r0, #0x2
add r1, r1, r0
ldr r1, [r1]
b continue

.hword 0x0000
.ORIG_DIPLOMA:.word 0x084147C0
.TABLE_DIPLOMAS:.word 0xFFFFFFFF /*Change accordingly; word-aligned*/
.NEXT_INT:.word 0x080F4FD1
.VAR_8002:.word 0x020370BC

en 0xF4FC8, escribe 00 4C 20 47 XX XX XX 08.

.align 2
.thumb

/*Reemplazador de Paletas*/

main:ldr r1, .VAR_8002
ldrb r1, [r1]
cmp r1, #0x0
bne go_table
ldr r0, .ORIG_PAL

continue:mov r1, #0x0
mov r2, #0x40
bl func
ldr r7, .NEXT_INT
bx r7

go_table:ldr r0, .TABLE_PALS
lsl r1, r1, #0x2
add r0, r0, r1
ldr r0, [r0]
b continue

func:ldr r7, .DO_FNC
bx r7

.align 2
.ORIG_PAL:.word 0x08415954
.TABLE_PALS:.word 0xFFFFFFFF /*Change accordingly; word-aligned*/
.NEXT_INT:.word 0x080F4FF9
.VAR_8002:.word 0x020370BC
.DO_FNC:.word 0x080703ED

en 0xF4FEE, escribe 01 49 08 47 00 00 XX XX XX 08.

Rutinas Relacionadas al texto:

.align 2
.thumb

/*Reemplazador de texto del encabezado*/

main:ldr r5, .VAR_8002
ldrb r5, [r5]
cmp r5, #0x0
bne go_table
ldr r1, .ORIG_MSG

continue:add r0, sp, #0xC
bl func
ldr r4, .NEXT_INT
bx r4

go_table:ldr r1, .LDPTR_0
ldr r1, [r1]
b continue

func:ldr r4, .DO_FNC
bx r4

.hword 0x0000
.ORIG_MSG:.word 0x0841B60E
.LDPTR_0:.word 0x03000F14 /*Loadpointer slot 0x0*/
.NEXT_INT:.word 0x080F5061
.VAR_8002:.word 0x020370BC
.DO_FNC:.word 0x0813CCC9

en 0xF5058, escribe 00 4C 20 47 XX XX XX 08.

.align 2
.thumb

/*Reemplazador de texto del Cuerpo*/

main:ldr r1, .VAR_8002
ldrb r1, [r1]
cmp r1, #0x0
bne go_table
ldr r1, .ORIG_MSG

continue:add r0, sp, #0xC
bl func
ldr r7, .NEXT_INT
bx r7

go_table:ldr r1, .LDPTR_1
ldr r1, [r1]
b continue

func:ldr r7, .DO_FNC
bx r7

.hword 0x0000
.ORIG_MSG:.word 0x0841B619
.LDPTR_1:.word 0x03000F18 /*Loadpointer slot 0x1*/
.NEXT_INT:.word 0x080F5095
.VAR_8002:.word 0x020370BC
.DO_FNC:.word 0x0813CCC9

en 0xF508C, escribe 00 4F 38 47 XX XX XX 08.

.align 2
.thumb

/*Reemplazador de texto de firma*/

main:ldr r0, .VAR_8002
ldrb r0, [r0]
cmp r0, #0x0
bne go_table
ldr r0, .ORIG_MSG

continue:str r0, [sp, #0x8]
mov r0, #0x0
mov r1, #0x2
ldr r7, .NEXT_INT
bx r7

go_table:ldr r0, .LDPTR_2
ldr r0, [r0]
b continue

.hword 0x0000
.ORIG_MSG:.word 0x0841B684
.LDPTR_2:.word 0x03000F1C /*Loadpointer slot 0x2*/
.NEXT_INT:.word 0x080F50C9
.VAR_8002:.word 0x020370BC

en 0xF50C0, escribe 00 4F 38 47 XX XX XX 08.

.align 2
.thumb

/*Reemplazador de Propiedades del Texto*/

main:ldr r7, .VAR_8002
ldrb r7, [r7]
cmp r7, #0x0
bne go_table
ldr r6, .ORIG_DATA

continue:str r6, [sp, #0x0]
str r5, [sp, #0x4]
add r0, sp, #0xC
ldr r7, .NEXT_INT
bx r7

go_table:ldr r6, .VAR_8000
b continue

.align 2
.ORIG_DATA:.word 0x08415A04
.VAR_8000:.word 0x020370B8 /*Var 0x8000 and 0x8001*/
.NEXT_INT:.word 0x080F5081
.VAR_8002:.word 0x020370BC

en 0xF5078, escribe 00 4F 38 47 XX XX XX 08.

Finalmente:
en 0xF50D8, escribe 00 4F 70 BD F0 30 00 03.

Ahora, a aplicarlo:
Antes de usar el special 0x108, si fijas el valor de la variable 0x8002 a otro valor distinto a 0, este mostrará tilemaps alternos al diploma, claro, sin modificar el original.

Now for the text parts:
Antes de usar el special 0x108, si quieres mostrar un texto de encabezado como: "PLAYER: [player]" en Xse pon esto en un script:
loadpointer 0x0 0xYYYYYYYY

si quieres mostrar texto al medio de la pantalla usa esto:
loadpointer 0x1 0xYYYYYYYY

Si quieres mostrar una firma a final, usa esto:
loadpointer 0x2 0xYYYYYYYY

Recuerda que debes cargar todo eso en las pocisiones indicadas (siempre que se especfique como 0x08FFFFFF) o por supuesto, el juego se crasheará.

Finalmente, no es necesario cambiar los contenidos de 0x415A04 porque ahora es dependiente a las variables 0x8000 y 0x8001 (si usas diplomas alternos, porque el original sigue en 0x415A04). Ahora, si quieres usar 00 02 03 00, solo haz esto:
setvar 0x8000 0x200
setvar 0x8001 0x3

O 00 01 00 00:

setvar 0x8000 0x100
setvar 0x8001 0x0


Ahora, un ejemplo completo:

#dynamic 0x800000

#org @start
lock
setvar 0x8002 0x1 //Usa el tilemap personalizado #0 (posición 0x1 en la table)
setvar 0x8000 0x100 //Produce el mismo efecto
setvar 0x8001 0x0 //Cambia el efecto de color del texto
loadpointer 0x0 @ASDF //Cabezal
loadpointer 0x1 @TROLOLOL // Cuerpo
loadpointer 0x2 @OLAKEASE // Firma
special 0x108
waitstate
release
end

#org @asdf
= KYORDON

#org @trololol
= GROUDON and KYOGRE were once best\nbuddies just so you know[.]\n\nBut RAYQUAZA screwed up\neverything[.] Real bad!

#org @olakease
= BRENDAN


Para un texto azul, se usa asi:
setvar 0x8000 0x800
setvar 0x8001 0x602

Resultado:


Manteniendo ambas variables en 0x0 mantendremos el texto de color blanco, no puedo asegurar que color es cada cosa, asi que experimenten con eso.

Reparando Bugs de la rutina original:
Po desgracia, cuando un tilemap es mostrado una fanfare suena, para que suene mudo escribe c0 46 c0 46 en 0xF4D3E

Tambien la rutina original hace que tras mostrarse el tilemap el script termine de inmediato, sin importar si después de mostrar el tilemaps hay mas comados, para que el script siga escribe E1 en 0xF4E20

Otras cosas a recordar:
Cada tabla es indepediente una de otra (osea cada tabla debe estar en una offset distinta)
Cada tabla solo puede tener 255 punteros.
Fijando el valor de 0x8002 a 0xF43, por ejemplo, es lo mismo a que la fijemos 0x8002 a 0x43 (se ignora los primeros bytes)
No explicaré como insertar datos comprimidos sin repuntear, ya que si estas aquí ya deberías saber eso (es un tuto de ASM, osea no recomendado a novatos)
Cuando hagas el tilemap de tu imagen en NTME recuerda que el tamaño del Tilemap (RAW) debe ser de 32x64
No estoy seguro si se pueden mostrar tilemaps en secuencias
Como pasa con la rutina original, si no presionas una tecla el tilemap no desaparecerá.
La tabla de la rutina Reemplazadora del Tilemap (Raw) contiene los punteros a los tilemaps (RAW) de las imágenes y asi sucesivamente cada una es independiente de otra.

En este momento trabajo la rutina para mostrar tilemap a 255 colores mas dos .obj (sprites a 64x64) la cual uso como base para hacer el C-gear y mostrarlo al presionar L o R.

Los créditos en este tutorial van para Haru~ y Knizz por varias de las cosas aquí mostradas.

Es todo, Saludos!!!
#1
Neodanix 28902
Wow, mola la rutina, suerte en hacerlo a 255, los .obj y mostrarlo con L o R
#2
Megascep_9 Kuchiki 28187
OMG pero genial...!!!!

Yo era uno de los que andaba preguntando por ahí como hacer eso XD.

Por ahora no lo necesito, pero ya se donde buscar cuando quiera hacer un super sexy escena para mi hack :3
#3
Cheve_X 15014
No se si lo habrás arreglado tú o algo, pero tened en cuenta que al usarlo en un Script, llamará a un End automáticamente, no seguirá con la ejecución del mismo. (A no ser que, como dije, hallas cambiado esa parte de la estructura de la Rutina Original) aún así está genial para hacer varias cosas ;)

Gracias por el aporte, saludines :)
#4
VampireQueen 28216
Para [MENTION=15014]Kuro Neko~[/MENTION]
"Lee esta parte
Tambien la rutina original hace que tras mostrarse el tilemap el script
termine de inmediato, sin importar si después de mostrar el tilemaps
hay mas comados, para que el script siga escribe E1 en 0xF4E20

Como verás el script continua al modificar esa parte.