Fortaleza Reznor
[xkas] JSL.asm (biblioteca de subrutinas) FLVP3jF¡Bienvenido a Fortaleza Reznor!
¿Que es Fortaleza Reznor?
Fortaleza Reznor es un foro de SMWH (Super Mario World Hacking) Aquí modificamos (hackeamos) el juego de Mario World a nuestro gusto y enseñamos a otros a saber a manejar el hacking de SMW usando la famosa herramienta "Lunar Magic".

¡Regístrate!
Únete a nuestra comunidad!, te ayudaremos en cada duda que tengas respecto al SMWH. Aparte podrás participar en eventos que hay en el foro y descargar los recursos que crean nuestros usuarios.

¡ANÍMATE! ¡Te divertirás en nuestro foro!

Atte:
La administracion.
Fortaleza Reznor
[xkas] JSL.asm (biblioteca de subrutinas) FLVP3jF¡Bienvenido a Fortaleza Reznor!
¿Que es Fortaleza Reznor?
Fortaleza Reznor es un foro de SMWH (Super Mario World Hacking) Aquí modificamos (hackeamos) el juego de Mario World a nuestro gusto y enseñamos a otros a saber a manejar el hacking de SMW usando la famosa herramienta "Lunar Magic".

¡Regístrate!
Únete a nuestra comunidad!, te ayudaremos en cada duda que tengas respecto al SMWH. Aparte podrás participar en eventos que hay en el foro y descargar los recursos que crean nuestros usuarios.

¡ANÍMATE! ¡Te divertirás en nuestro foro!

Atte:
La administracion.
Fortaleza Reznor
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.


¡Super Mario World Hacking en español! ¡Ayuda, tips, diversión y más!
 
ÍndiceMiembrosRegistrarseConectarseBuscar

Comparte
 

 [xkas] JSL.asm (biblioteca de subrutinas)

Ver el tema anterior Ver el tema siguiente Ir abajo 
AutorMensaje
anonimzwx
Baby Yoshi
Baby Yoshi
anonimzwx

Posts Posts : 1260


[xkas] JSL.asm (biblioteca de subrutinas) Empty
MensajeTema: [xkas] JSL.asm (biblioteca de subrutinas)   [xkas] JSL.asm (biblioteca de subrutinas) EmptyMar Mayo 13, 2014 6:26 pm

Descripcion: este es un WIP que ire complementando a medida que avance en mi hack. Contiene varias rutinas que facilitan el trabajo al momento de hacer sprites, ademas ahorras espacios porque las puedes utiliza en todos los sprites que hagas.

Descarga: Link

Uso general:

Como en muchos parches debes cambiar el freespace pero en este debes cambiar mas de 1 solo freespace:

El default es:

!Freespace = $3E8000
!colision = $3E8008
!GET_DRAW_INFO = $3E800C
!SUB_OFF_SCREEN_X0 = $3E8010
!detectarCercania = $3E8014
!RutinaGraficaOAM200 = $3E8018
!GETDRAWOAM200 = $3E801C

Pero si deseas cambiarlo debes cambiar los primeros 2 numeros de cada uno por el del que buscas por ejemplo
si quieres que el freespace quede en $2D8000 debes poner esto:

!Freespace = $2D8000
!colision = $2D8008
!GET_DRAW_INFO = $3E800C
!SUB_OFF_SCREEN_X0 = $2D8010
!detectarCercania = $2D8014
!RutinaGraficaOAM200 = $2D8018
!GETDRAWOAM200 = $2D801C

llamando las sub rutinas:

Para llamar cualquiera de las sub rutinas pones lo siguiente:

en la parte mas arriba pones algo como

!GET_DRAW_INFO = $3E800C

y luego para llamar esa rutina haces solamente esto:

JSL !GET_DRAW_INFO

Ahora cada sub rutina tiene sus propios parametros.

Como usar las sub rutinas:

Colision Flexible (!colision): Esta rutina te permite hace colision entre 2 sprites cualquieras (ya sean clusters, extended, sprites normales, mario, incluso sprites ficticios). Para usarla necesitamos los siguientes parametros:

$00 = posicion en x del primer sprite (low byte)
$01 = posicion en x del primer sprite (high byte)
$02 = posicion en y del primer sprite (low byte)
$03 = posicion en y del primer sprite (high byte)

$04 = posicion en x del segundo sprite (low byte)
$05 = posicion en x del segundo sprite (high byte)
$06 = posicion en y del segundo sprite (low byte)
$07 = posicion en y del segundo sprite (high byte)

$08 = ancho del primer sprite
$09 = alto del primer sprite

$0A = ancho del segundo sprite
$0B = alto del segundo sprite

$08,$09,$0A y $0B se sacan probando cuanto es lo adecuado, puedes estimarlos mentalmente pero no son tan obvios a veces recomiendo prueba y error para encontrar la colision adecuada .

Al terminar la rutina el carry estara prendido si hubo colision y estara apagado si no hubo colision.

Ejemplo de uso:

Código:

        LDA $E4,x
   STA $00
   LDA $14E0,x
   STA $01
   LDA $D8,x
   STA $02
   LDA $14D4,x
   STA $03

   LDA $94
   STA $04
   LDA $95
   STA $05
   LDA $96
   STA $06
   LDA $97
   STA $07
   
   LDA #$0A
   STA $08
   LDA #$0C
   STA $09
   LDA #$0A
   STA $0A
   LDA #$1E
   STA $0B
   
   JSL !colision
   BCC retCol
   JSR RutinaCuandoHayColision ;aca poner lo que sucede cuando los 2 sprites colisionan.
retCol:
   RTS





NOTA importante: la rutina funciona bien ya esta probada, si no te funcona la colision es por que pusiste mal los valores $08,$09,$0A o $0B.

!GET_DRAW_INFO: el clasico GET_DRAW_INFO de casi todos los sprites solo que con una pequeña variacion. cuando un sprite no debe ser dibujado (por que esta fuera de la pantalla) la RAM $06 va estar en 1, si se debe dibujar estara en 0.

Ejemplo de uso:

Código:

Frame1_Start:
JSL !GET_DRAW_INFO

LDA $06
BEQ contFrame1
RTS
contFrame1:
PHX
LDX #$1
Loop_Frame1:
LDA $00
CLC
ADC XDISP_Frame1,x
STA $0300,y

LDA $01
CLC
ADC YDISP_Frame1,x
STA $0301,y

LDA TILEMAP_Frame1,x
STA $0302,y

LDA PROPERTIES_Frame1,x
ORA $64
STA $0303,y

INY
INY
INY
INY

DEX
BPL Loop_Frame1
PLX

LDY #$02
LDA #$1
JSL $01B7B3
RTS





!SUB_OFF_SCREEN_X0: No utilizar por el momento.

!detectarCercania: esta rutina detecta que tan cerca esta un sprite de otro en una direccion especifica. Por ejemplo con esta rutina puedes saber si un sprite esta 5 tiles a la derecha o 5 tiles a la izquierda del otro sprite.
Esta rutina al igual que la de colision funciona con cualquier par de sprites (mario, sprites normales, clusters, extended, incluso sprites ficticios).

Para usarla debes llenar unos cuantos parametros que son los siguientes:

$00 = low byte en la dimension Escogida (x o y) del primer sprite
$01 = high byte en la dimension Escogida (x o y) del primer sprite
$04 = low byte en la dimension Escogida (x o y) del segundo sprite
$05 = high byte en la dimension Escogida (x o y) del segundo sprite
$08 = distancia hacia un lado
$09 = distancia hacia el otro lado

una ves que se hace esta rutina el carry se activara si el sprite estaba dntro del rango especificado y se desactivara si estaba fuera del rango.

ejemplo en codigo 1:

Código:


   LDA $D8,x
   STA $00
   LDA $14D4,x
   STA $01
   
   LDA $96
   STA $04
   LDA $97
   STA $05
   
   LDA #$08
   STA $08
   LDA #$08
   STA $09
   
   JSL !detectarCercania
   BCC NoEsta en el rango
        JSR LoQueDebeHacerCuandoEstaDentroDelRango ;aca poner la rutina con lo que dberia hacer si el sprite esta en el rango
NoEsta en el rango:
        RTS





En este caso se vio un rango vertical (osea si esta mas arriba de tanto y mas abajo de tanto).

Nota: los valores $08 y $09 casi siempre seran iguales pero si deseas que detecte mas hacia un lado que el otro pueden ser distintos.

Rutina Grafica con OAM 200 (!RutinaGraficaOAM200): esta rutina te permite poner un Tile en una posicion especificada usando la OAM 200. Muy util para la rutina grafica de un extended sprite, un cluster, un sprite ficticio o efectos graficos. Tambien puede ser utilizada para poner tiles en posiciones fijas en la pantalla.

Para utilizar esta rutina debemos llenar los siguientes datos:

$00 = posicion X del tile (low byte)
$01 = posicion X del tile (high byte)
$02 = posicion Y del tile (low byte)
$03 = posicion Y del tile (high byte)
$04 = tamaño del Tile
$05 = desplazamiento en X del tile
$06 = desplazamiento en Y del tile
$07 = Tile
$08 = Propiedad
$0A = Y index

el desplazamiento del tile es para saber que tan desplazado esta el tile con respecto a la posicion especificada.

el tamaño del tile es #$00 si el tile es de 8X8 y #$02 si el tile es de 16X16

el Tile es sacable del lunarmagic usando el boton  8x8.

La propiedad usa YXPPCCCT.

Y = si el tile esta flippeado en el eje Y.
X = si el tile esta flippeado en el eje X.
PP = Prioridad del tile (puede ser 00,01,10,11 donde 00 haria que fuera detras de todo el FG y 11 haria que fuera delante del FG) considerar que la prioridad no aplica para sprites solo para el layer 1 y layer 2.
CCC = paleta (000 = paleta 8,001 = paleta 9 ... 111 = paleta F)
T = si es 0 usara graficos de SP1 y SP2, si es 1 usara graficos de SP3 y SP4.

el Y index corresponde al valor en la tabla oam. quedara mas claro con el ejemplo.

Ejemplo de Uso para un Tile simple:

Código:

Graphics:
OAMStuff: db $48,$4C,$50,$54,$58,$5C,$60,$64,$68,$6C,$70,$E0,$E4,$E8,$EC,$F0,$F4,$F8,$FC    
   LDA $1E16,y
   STA $00
   
   LDA $1E3E,y
   STA $01
   
   LDA $1E02,y
   STA $02
   
   LDA $1E2A,y
   STA $03
   
   LDA #$02
    STA $04
    LDA #$00
    STA $05
    LDA #$00
    STA $06
   LDA #$0E
   STA $07
   LDA #$3C
   STA $08
   
   PHY
   
   LDA OAMStuff,y
   STA $0A
   
   JSL !RutinaGraficaOAM200
   PLY
   RTS




Esta rutina pone un Tile en la posicion de un cluster. Lo que podria ser la rutina grafica de un cluster de 16X16.

Ejemplo para una rutina que usa mas de un Tile.

Código:

OAMStuff: db $48,$4C,$50,$54,$58,$5C,$60,$64,$68,$6C,$70,$E0,$E4,$E8,$EC,$F0,$F4,$F8,$FC    

PROPERTIES_Frame: db $24,$64,$24,$64,$24,$24
TILEMAP_Frame: db $26,$26,$36,$36,$28,$38
XDISP_Frame: db $F0,$0F,$F0,$0F,$00,$00
YDISP_Frame: db $00,$00,$08,$08,$00,$08

rutinaGrafica:

        LDX #$05 ;cantidad de tiles

LoopRutinaGrafica:

   LDA $1E16,y

   STA $00
   

   LDA $1E3E,y

   STA $01
   

   LDA $1E02,y
   STA $02
   
   LDA $1E2A,y
   STA $03
   
   LDA #$02
    STA $04
    LDA  XDISP_Frame,x
    STA $05
    LDA YDISP_Frame,x
    STA $06
   LDA TILEMAP_Frame,x
   STA $07
   LDA PROPERTIES_Frame,x
   STA $08
   
   PHY
   
   LDA OAMStuff,x
   STA $0A
   
   JSL !RutinaGraficaOAM200
   PLY

        DEX
        BMI salirRutinaGrafica
        JMP LoopRutinaGrafica

salirRutinaGrafica:
   RTS


Get Draw Info especial: Este es un get draw info especial que se puede utilizar para cualquier tile en pantalla. Para utilizarlo debes llenar lo siguiente:

$00 = posicion X del tile (low byte)
$01 = posicion X del tile (high byte)
$02 = posicion Y del tile (low byte)
$03 = posicion Y del tile (high byte)
$04 = tamaño del tile (00 = 8X8, 02 = 16X16)

una ves terminada la rutina tendras la siguiente informacion:

$00 = posicion X del tile relativa a la pantalla
$01 = posicion Y del tile relativa a la pantalla
$06 = dice si el tile es valido o no
$05 = dice la modalidad para ser dibujado el tile

si $06 es 1 entonces el tile no es valido por lo que no debes usarlo en la pantalla.

$05 te dira la "modalidad" con la que debe ser puesto el tile, 00 = tile normal de 8X8, 01 = tile cortado de 8X8 (se usa para los bordes de la pantalla), 02 = tile normal de 16X16 , 03 = tile cortado de 16X16 (se usa para los bordes).
Volver arriba Ir abajo
 

[xkas] JSL.asm (biblioteca de subrutinas)

Ver el tema anterior Ver el tema siguiente Volver arriba 
Página 1 de 1.

 Temas similares

-
» Biblioteca de ASM
» [xkas] Dynamic Z
» [Xkas/Asar] Reasignacion de la OAM 200
» [asar/xkas(?)] Explosión de SMB2
» [xkas/asar]Cambio de Música en pausa

Permisos de este foro:No puedes responder a temas en este foro.
Fortaleza Reznor ::  Ayuda y Recursos de SMW Hacking :: Exhibición y Archivero de Música, GFX y ASM :: Archivero de ASM-