Language…
8 users online:  AmperSam, Cristian Cardoso, CroNo, Dan2point5, Hayashi Neru, JeepySol, JPhanto, random_box - Guests: 255 - Bots: 309
Users: 64,795 (2,377 active)
Latest user: mathew

Ayuda para SMW hacking.

Gracias, ahora necesito saber una solución para este bug: Al cruzarme con un sprite dinámico (en mi caso, la Wild Piranha Plant), las monedas quedan bugueadas: al conseguirlas, sus gráficos se quedan donde las conseguí. imamelia me dijo que tenía que ver con algo así de "V-Blank" o algo así (estoy tan complicado con mi ROM)...

Userbar by Green Jerry

Also a Fortaleza Reznor user. If you... digo, si hablas español, hackeas, buscas ayuda, o simplemente se te da conocer gente, únete, somos puerta abierta.
Tengo dos ideas de que esta sucediendo:

1) Como es un sprite del DSX, lo mas probable es que el buffer que usa termina usando la misma ram del buffer de las animaciones y exanimaciones del LM, tal vez cambiando este valor funcione aunque se necesitaria saber que RAMs usas (mas bien, que parches utilizas) para acomodar todo adecuadamente para que no tengas conflicto.

2) Tal vez tengas demasiadas exanimaciones globales, reduciendo esto ayudaria con el problema porque entre mas exanimaciones tengas menos tiempo en el V-Blank tendras, lo cual es malo en estas circunstancias.

Quizas una imagen de las exanimaciones globales (y del nivel), del juego y una lista de lo que usas ayudaria.
lo del buffer no me parece viable por que el buffer de exanimaciones es distinto al de sprites dinamicos, lo segundo podria ser aunque no me deja convencido ya que normalmente eso pasa acompañado de un flinckering de pantalla y aveces la snes se vuelve loca cambiando graficos que son nada que ver, la otra idea que se me ocurre es que las monedas no las esta animando con exanimaciones sino que con el sistema de cambio de exgfx del dynamic Z cosa que no lo encuentro buena idea si es para los graficos de unas monedas, eso esta mas pensado para cosas mas masivas y exclusivas de un solo nivel que para animaciones globales.

------------------------------------------------------

Youtube
Twitter
SMWControlLibX GitHub
My Discord Server
Snestorage where you can download my resources
Como no es probable que no cause una barra negra of doom (ese flickering), entonces es que un parche externo que no es ni el DSX o DYZ o la rutina del LM el causante del problema, si mal no recuerdo yo tuve este problema y fue por conflicto de RAMs (el Layer 3 Customizer causa estos problemas si no cambias la ram que se te menciona).

Solo quedaria esperar que cosas usa LMPuny, porque quizas termine siendo algo totalmente distinto a lo que se suponenemos que es el problema.
Les daré un listado completo de los archivos externos de mi ROM:

Tools:
-Romi's SpriteTool
-AddMusicM (ahora lo quiero cambiar por el AddMusicK)
-BlockTool Super Deluxe (no me quiero cambiar aún)
-CFG Editor
-Xkas
-Asar
-Tweaker
-SMW Customizer
-Lunar Magic 2.22 (obvio)
-LM Addons
-Racing Stripe
-LevelASM (no sé usarlo)
-Lunar IPS
-SNES9X
Sprites:
-00 Goomba de SMB3
-01 Hermano Martillo (Hammer Bro)
-02 Hermano Bumerán (Boomerang Bro)
-03 Bumerán
-04 Planta Pirómana (Venus Fire Trap)
-05 Planta Pirómana de cabeza (Upside down Venus Fire Trap)
-06 Hermano Caparazón (Shell Bro)
-07 Planta Piraña lateral
-08 Buzzy Beetle de cabeza
-09 Metalón (Tap-Tap)
-0A Chomp de fuego (Fire Chomp)
-0B Llama del Chomp de fuego (Fire Chomp's flame)
-0C Buster Beetle
-0D Bloque de Buster Beetle
-0E Varón Pisotón pesado (Power Thwomp)
-0F Varón Pisotón a la izquierda
-10 Varón Pisotón a la derecha
-11 Cadena de fuego de Super Mario Asvance 4
-12 Disco rotante (Roto-Disc)
-13 Roca Pisotón saltando a la izquierda
-14 Roca Pisotón saltando a la derecha
-15 Roca Pisotón saltando estática
-16 Bloque de castillo gris moviéndose (Dissambely del BB, usado para que se mueva vertical)
-17 Gran Picudo de ASMWCP (Jefe Nº1 en mi ROM y en ASMWCP)
-18 Bolas de fuego del Gran Picudo
-19 Koopa Divino (de los Koopa Élite de Atma
-1A Koopa Vendaval (de los Koopa Élite de Atma
-1B Bill Misil (Missile Bill)
-1C Ascensor con flecha redondo de Toshi's Island (Sprite Dinámico)
-1D Chomp Cadenas (Chain Chomp)
-1E Champi Dorado (Golden Shroom)
-1F Planta Piraña Salvaje (Wild Piranha Plant 2.0 por edit1754, Sprite Dinámico)
-20 Plantarina Piraña Salvaje (Wild Ptooie Piranha, del pack de Sprites Dinámicos de smkdan, Sprite Dinámico)
-21 Needlenose Amarillo (el usado por la Wild Ptooie Piranha)
-22 Planta Piraña de tallo corto
-23 Planta Piraña de tallo corto de cabeza
-24 Planta Pirómana HDMA
-25 Planta Pirómana HDMA de cabeza
-26 Planta Piraña de tallo corto HDMA (con el Extra Bit se puede especificar si es de cabeza o no)
-27 Planta Piraña lateral HDMA
-28 Varón Picudo Misil (Homing Thwomp)
-29 Versión mejorada del bloque creador/comedor
-2A Máquina de Bill Balas portable
-2B Bill Bala de la máquina portable
-C0 Disparados de Bill Misiles
-D0 Generador de truenos en background (v2)
-D1 Generador de suelo para que el jugador no pueda pasar por debajo del nivel
-D2 Generador para Cutscenes
-D3 Generador del evento de destrucción de castillo cuando un jefe es derrotado

Bloques:

Son un montón, me mataría diciéndolos. #tb{¬_¬}

Parches:

-Corrección de errores de SMW
-Corrección del Meesage Box y Light Box
-Powerdown Perfecto de SMB3
-Parche de Sprites dinámicos
-Dynamic Z 2.1
-HDMA Bug Fixes 4.2
-Stim.asm
-Level ASM
-Layer 3 Customizer
-Layer 3 ExGFX
-Parche que hace que las bolas de fuegos salten al ser lanzadas presionando Arriba
-Parche de salto a la pared
-Corrección del tallo del Classic Piranha Plant
-Autoguardado
-Custom Bouncing Blocks
-Bounce Unrestrictor
-6-Digit Coin Counter 1.5
-Algunos efectos HDMA

Userbar by Green Jerry

Also a Fortaleza Reznor user. If you... digo, si hablas español, hackeas, buscas ayuda, o simplemente se te da conocer gente, únete, somos puerta abierta.
Originally posted by LMPuny
-Layer 3 Customizer
-Layer 3 ExGFX


Encontre a los culpables sin mucho investigar. Antes que nada, ¿por que usas los dos?, eso no es muy sano para el ROM como que digamos... sugeriria usar el Layer 3 Customizer, pero si se te hace muy complicado mejor usa el Layer 3 ExGFX + Stim.asm... o esperar la nueva version del LM que deberia de salir en el cumple de este que es en esta o la otra semana porque traera editor de Layer 3 si bien recuerdo las filtraciones en #serioushax.

-----------------------------

Para arreglar el Layer 3 Customizer busca:

Code
!DecompressionBuffer = $ValorQueNoRecuerdo


Y cambialo a:

Code
!DecompressionBuffer = $7F1500


-----------------------------

Para arreglar el Layer3ExGFX busca:

.
..
...
..
.

Tiene demasiadas cosas a cambiar y no estoy seguro de que vaya a funcionar y no planeo ponerme a testear.

-----------------------------

En caso de que no tengas el Layer3ExGFX o Layer 3 Customizer compatibles con el AddMusicK usa estas versiones:

Layer3ExGFX: https://dl.dropboxusercontent.com/u/67177523/Hack/Cosas%20ASM/Layer3ExGFX.asm
Layer 3 Customizer: https://dl.dropboxusercontent.com/u/67177523/Hack/Cosas%20ASM/layer3hack.asm

Debes de usar el AMK justo despues de usar uno de estas dos versiones especiales de los parches, si no cosas malas pasaran en el OW.

Por cierto, solo ocupaba los parches y herramientas, lo demas estuvo de mas.
Me estoy cambiando al AMK, pero al remover el AddMusicM,, se me buguea el ROM... Se congela el juego al seleccionar la partida y los jugadores.

Userbar by Green Jerry

Also a Fortaleza Reznor user. If you... digo, si hablas español, hackeas, buscas ayuda, o simplemente se te da conocer gente, únete, somos puerta abierta.
Seria mejor idea mover las cosas de tu ROM a uno nuevo, el AMK es muy seguro de que se rompa con un hack que tiene otro asm de otro AM, aun cuando se dice que borra el rastro de los otros, es mas seguro si haces lo que digo.
#thp{O_O1}
Eh, eh... Tengo demasiados parches en mi ROM... Hasta varios edits con LM... ¿No sería mejor quitar todos los temas de AddMusicM y los brr antes de quitarlo del ROM y usar el AMK?#smw{^_^;}

Userbar by Green Jerry

Also a Fortaleza Reznor user. If you... digo, si hablas español, hackeas, buscas ayuda, o simplemente se te da conocer gente, únete, somos puerta abierta.
Es mas complicado hacer eso, preferible es transferir todo. No es un proceso complicado, solo es un poco tardado.
Bueno, ya hice eso, y me sigue sucediendo el mismo bug.

Userbar by Green Jerry

Also a Fortaleza Reznor user. If you... digo, si hablas español, hackeas, buscas ayuda, o simplemente se te da conocer gente, únete, somos puerta abierta.
Ahi ya no tengo idea a decir verdad. Quizas si insertas uno por uno cada parche y ves cual es el causante ayudaria (ya sea para arreglarlo o removerlo segun convenga).
Masterlink me dio un Port de Krook's March para AddMusicM, pero colocándole #am4 o #amm en el comienzo, me lanza un error en la línea 19 (11 si le pongo #am4) de "Pitch" o algo así...
Link
Le quité el #amm o #am4 porque no sé cuál ponerle, en todo caso, con ambos me lanza el mismo error.

Userbar by Green Jerry

Also a Fortaleza Reznor user. If you... digo, si hablas español, hackeas, buscas ayuda, o simplemente se te da conocer gente, únete, somos puerta abierta.
Oigan ¿qué fue de la herramienta de "The New BG Ripper Tool" ya no existe? la he buscado pero no sirve el link...

¿Alguna herramienta qué este a su nivel o sigue existiendo?
aqui
i just lurk sometimes
que tal amigos del foro, tengo una duda respecto al odioso addmusick...

Les explico, de la pagina me baje el pack de sonidos de yoshi island, segun yo segui el pequeño tutorial que viene en el archivo readme pero siempre me tira error y por lo cual no inserta nada, mi duda es... hay algun tutorial bien explicado de este programa? o yo soy muy torpe para usarlo XD

les explicare con detalles lo que hago.
Segun el readme, debo poner las carpetas de los samples "YI, YI2 y YI3" en la carpeta "samples" asi lo hice. Despues de ello, en la lista txt. al final puse la ubicacion del archivo txt de musica y guarde. Posteriormente abri el AddMusick e inserte toda la musica pero me salio el siguiente error

"The specified sample group. "YI" , could not be found"

estoy harto de este programa, alguna solucion? gracias
No es culpa del programa, es culpa del que hizo ese soundtrack porque se las ingenio para hacerlo de la forma menos amigable con los usuarios... la verdad quiero borrarlo de la seccion, pero como ya fue aceptado lo mejor seria dejarlo ahi. Vere si luego lo edito para añadirle una parte mas al readme.

Bueno, respecto a tu problema, debes poner esto dentro de tu Addmusic_sample groups.txt, preferiblemente abajo de todo lo que ya viene ahi:

#YI
{
"YI/yi-16.brr"!
"YI/yi-17.brr"
"YI/yi-18.brr"!
"YI/yi-19.brr"!
"YI/yi-1A.brr"
"YI/yi-1B.brr"
"YI/yi-1C.brr"!
"YI/yi-1D.brr"
"YI/yi-1E.brr"
"YI/yi-1F.brr"
"YI/yi-20.brr"
"YI/yi-21.brr"!
"YI/yi-22.brr"!
"YI/yi-23.brr"
"YI/yi-24.brr"
"YI/yi-25.brr"!
"YI/yi-26.brr"
"YI/yi-27.brr"
"YI/yi-28.brr"
"YI/yi-29.brr"!
"YI/yi-2A.brr"
"YI/yi-2B.brr"
"YI/yi-2C.brr"!
"YI/yi-2D.brr"
"YI/yi-2E.brr"
}

#YI2
{
"YI2/yi-14.brr"
"YI2/yi-15.brr"
"YI2/yi-16.brr"
"YI2/yi-17.brr"
"YI2/yi-18.brr"
"YI2/yi-19.brr"
"YI2/yi-1A.brr"
}

#YI3
{
"YI3/yi-14.brr"
"YI3/yi-15.brr"
"YI3/yi-16.brr"
"YI3/yi-17.brr"
"YI3/yi-18.brr"
"YI3/yi-19.brr"
"YI3/yi-1A.brr"
"YI3/yi-1B.brr"
"YI3/yi-1C.brr"
"YI3/yi-1D.brr"
"YI3/yi-1E.brr"
"YI3/yi-1F.brr"
"YI3/yi-20.brr"
"YI3/yi-21.brr"
"YI3/yi-22.brr"
}

Lo insertas y ya esta.
Originally posted by Masterlink
No es culpa del programa, es culpa del que hizo ese soundtrack porque se las ingenio para hacerlo de la forma menos amigable con los usuarios... la verdad quiero borrarlo de la seccion, pero como ya fue aceptado lo mejor seria dejarlo ahi. Vere si luego lo edito para añadirle una parte mas al readme.

Bueno, respecto a tu problema, debes poner esto dentro de tu Addmusic_sample groups.txt, preferiblemente abajo de todo lo que ya viene ahi:

#YI
{
"YI/yi-16.brr"!
"YI/yi-17.brr"
"YI/yi-18.brr"!
"YI/yi-19.brr"!
"YI/yi-1A.brr"
"YI/yi-1B.brr"
"YI/yi-1C.brr"!
"YI/yi-1D.brr"
"YI/yi-1E.brr"
"YI/yi-1F.brr"
"YI/yi-20.brr"
"YI/yi-21.brr"!
"YI/yi-22.brr"!
"YI/yi-23.brr"
"YI/yi-24.brr"
"YI/yi-25.brr"!
"YI/yi-26.brr"
"YI/yi-27.brr"
"YI/yi-28.brr"
"YI/yi-29.brr"!
"YI/yi-2A.brr"
"YI/yi-2B.brr"
"YI/yi-2C.brr"!
"YI/yi-2D.brr"
"YI/yi-2E.brr"
}

#YI2
{
"YI2/yi-14.brr"
"YI2/yi-15.brr"
"YI2/yi-16.brr"
"YI2/yi-17.brr"
"YI2/yi-18.brr"
"YI2/yi-19.brr"
"YI2/yi-1A.brr"
}

#YI3
{
"YI3/yi-14.brr"
"YI3/yi-15.brr"
"YI3/yi-16.brr"
"YI3/yi-17.brr"
"YI3/yi-18.brr"
"YI3/yi-19.brr"
"YI3/yi-1A.brr"
"YI3/yi-1B.brr"
"YI3/yi-1C.brr"
"YI3/yi-1D.brr"
"YI3/yi-1E.brr"
"YI3/yi-1F.brr"
"YI3/yi-20.brr"
"YI3/yi-21.brr"
"YI3/yi-22.brr"
}

Lo insertas y ya esta.


Amigo, te llevas las palmas... me sirvio de mucho tu ayuda... gracias, eso comprueba que el torpe fui yo por no agregar la lista de samples al archivo txt jejeje XD de nuevo, gracias
que tal... bueno, se que soy un poco torpe con esto pero tengo otra duda.
Me baje el paquete de sprites de Yoshi Island para usar la egg plant, en veces anteriores la he agregado a algunos roms pero no generaba sprites personalizados. La verdad estoy muy verde respecto al ASM entonces quisiera saber que debo modificar para hacer que la planta genere sprites personalizados??? el texto en el asm es el siguiente:

;Egg Plant
;by smkdan

;IGNORES PALETTE IN CFG EDITOR

;USES EXTRA BIT
;If set, a custom sprite is generated. Else, a standard sprite is generated.

;EXTRA PROP 1:
;Sprite number to generate

;EXTRA PROP 2:
;How many of chosen sprite (above) can be on screen before it stops generating. A sprite is counted even if it wasn't generated.

;A plant from SMW2 that shoots out an item or enemy of your choice

;Tilemaps for SP3

DIR = $03
PROPRAM = $04
PROPINDEX = $05
XDISPINDEX = $06
YDISPINDEX = $07
FRAMEINDEX = $08
TEMP = $09

;1570: Frame # for GFX
;C2: action for shooting
;1602: counter for action

;===

;Data to use for the sprite to be generated

;=====

dcb "INIT"
RTL

dcb "MAIN"
PHB
PHK
PLB
JSR Run
PLB
RTL ;also nothing


Run
JSR SUB_OFF_SCREEN_X0
JSR GET_DRAW_INFO
JSR GFX ;draw sprite

LDA $14C8,x
CMP #$08
BNE Return
LDA $9D ;locked sprites?
BNE Return

LDA $C2,x ;load decision bit
BEQ Idle ;doing nothing, keep counting
CMP #$01
BEQ Shooting

Idle
LDA $1602,x
INC A
STA $1602,x
CMP #$30
BNE Return_S ;return if not yet 30h

INC $C2,x ;+1 for behaviour
STZ $1602,x ;reset counter, to be used in GFX also
STZ $1570,x ;reset frame counter for inflating GFX

Shooting
LDA $1602,x
INC A
STA $1602,x
CMP #$0C ;return if counter not yet 6 x2
BNE Return_S

JSR GenerateX ;attempt to generate sprite

STZ $C2,x ;back to idling
STZ $1570,x ;reset frame counter for idling
STZ $1602,x ;reset counter

Return_S
LDA $1588,x
AND #$04
BEQ InAir
LDA #$10 ;falling yspd, if not already falling
STA $AA,x

InAir
JSL $01802A ;speed update

Return
RTS

GenerateX
LDA $7FAB10,x
AND #$04
BNE GenCust ;custom sprite if extra bit is set

JSR CountSpritesStd ;standard count sprite routine
BEQ ReturnG ;Z = 1 if it's to return

JSL $02A9E4 ;grab free sprite slot
BMI ReturnG ;return if none left before anything else...

JSR SetupStd

RTS ;return std

GenCust
JSR CountSpritesCust ;standard count sprite routine
BEQ ReturnG ;Z = 1 if it's to return

JSL $02A9E4 ;grab free sprite slot
BMI ReturnG ;return if none left before anything else...

JSR SetupCust

RTS ;return custom

ReturnG
JSR SUB_SMOKE ;smoke if not generating
RTS

;===

SetupStd
PHX ;preserve sprite index

LDA $7FAB28,x ;compare to see if it's a throw block
CMP #$53
BEQ ThrowBlock

LDA #$01 ;init routine as normal
STA $14C8,y
LDA $7FAB28,x
STA $9E,y ;sprite type
BRA SkipStd

ThrowBlock
LDA #$09 ;status = stationary
STA $14C8,y ;normal status, run init routine?

LDA #$53 ;load throwblock to generate
STA $9E,y ;into sprite type table

SkipStd
LDA $E4,x ;same Xpos
STA $E4,y
LDA $14E0,x ;share same screen
STA $14E0,y

LDA $D8,x
SEC
SBC #$14
STA $D8,y ;Ypos
LDA $14D4,x
SBC #$00
STA $14D4,y ;same screen

TYX ;new sprite slot into X
JSL $07F7D2 ;create sprite

LDA $9E,y ;if throw block
CMP #$53
BNE NotThrowBlock

LDA #$FF ;set stun timer
STA $1540,y

NotThrowBlock
JSL $01ACF9 ;'random number'
AND #$8F ;preserve direction bit and low 4 bits
BPL PositiveRS
ORA #$70 ;set higher bits if negative

PositiveRS
STA $B6,x ;set Xspd

LDA #$B0 ;set Yspd fixed
STA $AA,x

LDA #$3A ;gulping sound
STA $1DFC

PLX ;restore sprite index

RTS ;return

;===

SetupCust
PHX ;preserve sprite index

LDA #$01
STA $14C8,y ;normal status, run init routine?
LDA $7FAB28,x ;load sprite to generate...from extra prop 1

PHX
TYX
STA $7FAB9E,x ;into sprite type table for custom sprites
PLX

LDA $E4,x ;same Xpos
STA $E4,y
LDA $14E0,x ;share same screen
STA $14E0,y

LDA $D8,x
SEC
SBC #$14
STA $D8,y ;Ypos
LDA $14D4,x
SBC #$00
STA $14D4,y ;same screen

TYX ;new sprite slot into X
JSL $07F7D2 ;create sprite
JSL $0187A7
LDA #$88 ;set as custom sprite
STA $7FAB10,X

JSL $01ACF9 ;'random number'
AND #$8F ;preserve direction bit and low 4 bits
BPL PositiveRC
ORA #$70 ;set higher bits if negative

PositiveRC
STA $B6,x ;set Xspd

LDA #$B0 ;set Yspd fixed
STA $AA,x

LDA #$3A ;gulping sound
STA $1DFC

PLX ;restore sprite index

RTS ;return

;===

CountSpritesStd
STZ TEMP ;TEMP will be the sprite counter
LDY #$00

StdLoop
LDA $9E,y ;look into sprite type table
CMP $7FAB28,x ;compare with generated sprite type
BNE NoIncS ;if not equal, skip this part

LDA $14C8,y ;load status
BEQ NoIncS ;if sprite is dead, don't increment

INC TEMP ;else increment
LDA TEMP ;compare TEMP to count
CMP $7FAB34,x ;if count is reached....
BCS ReturnStdN ;just return

NoIncS
INY ;advance index
CPY #$0C ;if some left to check...
BNE StdLoop ;loop again

LDA #$01 ;Z = 0
RTS

ReturnStdN
LDA #$00 ;Z = 1
RTS

;=====

CountSpritesCust
STZ TEMP ;TEMP will be the sprite counter
LDY #$00

CustLoop
PHX
TYX ;Y into X
LDA $7FAB9E,x ;look into sprite type table for custom sprites
PLX

CMP $7FAB28,x ;compare with generated sprite type
BNE NoIncC ;if not equal, skip this part

TYX ;Y->X, for long indexed
LDA $7FAB10,x ;see if it's also a custom sprite...
AND #$08
BEQ NoIncC ;return if custom sprite flag is clear

LDA $14C8,y ;load status
BEQ NoIncC ;if sprite is dead, don't increment

INC TEMP ;else increment
LDA TEMP ;compare TEMP to count

LDX $15E9 ;original sprite index
CMP $7FAB34,x ;if count is reached....
BCS ReturnCustN ;just return

NoIncC
LDX $15E9 ;restore sprite index

INY ;advance index
CPY #$0C ;if some left to check...
BNE CustLoop ;loop again

LDA #$01 ;Z = 0
RTS

ReturnCustN
LDA #$00 ;Z = 1
RTS

;===

TILEMAP dcb $4E,$3A,$2A ;body, stem, stem
dcb $4E,$3A,$2A
dcb $60,$3A,$2A

;shooting frames

dcb $4A,$3A,$2A
dcb $48,$3A,$2A
dcb $4A,$3A,$2A
dcb $4A,$3A,$2A
dcb $4C,$3A,$2A ;generating frame
dcb $4C,$3A,$2A

XDISP dcb $01,$00,$08
dcb $01,$00,$08
dcb $00,$00,$08

dcb $00,$00,$08
dcb $00,$00,$08
dcb $00,$00,$08
dcb $00,$00,$08
dcb $01,$00,$08
dcb $01,$00,$08

YDISP dcb $F8,$07,$07 ;It's 8px down from it's origin
dcb $F9,$07,$07
dcb $F9,$07,$07

dcb $F8,$07,$07
dcb $F8,$07,$07
dcb $F8,$07,$07
dcb $F8,$07,$07
dcb $F7,$07,$07
dcb $F7,$07,$07

PROP dcb $04,$06,$06 ;pink,green,green

SIZE dcb $02,$00,$00

GFX
LDA $15F6,x ;load properties
STA PROPRAM ;into TEMP

LDA $157C,x ;direction...
STA DIR

STZ FRAMEINDEX ;zero, since it will be added

LDA $C2,x ;action
BEQ IdleG ;zero = idling

;shooting
LDA $1602,x ;load counter
LSR A ;every 2nd advance

CLC
ADC #$03 ;skip past idle frames
STA $1570,x
BRA Skip

IdleG
LDA $14
AND #$07 ;every 8th frame
BNE Skip
LDA $9D ;due to odd way it animates, skip animating if sprites are locked
BNE Skip
LDA $1570,x ;grab frame no.
INC A
STA $1570,x
CMP #$03 ;3 = overflow
BNE Skip
STZ $1570,x

Skip
LDA $1570,x ;frame #
ASL A ;x2
CLC
ADC $1570,x ;x3
CLC
ADC FRAMEINDEX
STA FRAMEINDEX

LDX #$00 ;loop index

OAM_Loop
TYA
LSR A
LSR A
PHY
TAY
LDA SIZE,x
STA $0460,y ;size table
PLY ;restore

TXA
CLC
ADC FRAMEINDEX
PHX
TAX

LDA $00
CLC
ADC XDISP,x
STA $0300,y
PLX

TXA
CLC
ADC FRAMEINDEX
PHX
TAX

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

PLX

TXA
CLC
ADC FRAMEINDEX
PHX
TAX
LDA TILEMAP,x
STA $0302,y
PLX

LDA PROPRAM
AND #$01 ;page bit only, ignore palette setting
ORA $64
ORA PROP,x ;palette, just using loop index
STA $0303,y

INY
INY
INY
INY
INX
CPX #$03 ;3 tiles for flower body and stem
BNE OAM_Loop

LDX $15E9

LDY #$FF ;$460 written
LDA #$02 ;3 tiles
JSL $01B7B3

RTS

;=================
;BORROWED ROUTINES
;=================

SUB_SMOKE LDY #$03 ; \ find a free slot to display effect
FINDFREE LDA $17C0,y ; |
BEQ FOUNDONE ; |
DEY ; |
BPL FINDFREE ; |
RTS ; / return if no slots open

FOUNDONE LDA #$01 ; \ set effect graphic to smoke graphic
STA $17C0,y ; /
LDA $D8,x ; \ smoke y position = generator y position
CLC
ADC #$EC
STA $17C4,y ; /
LDA #$14 ; \ set time to show smoke
STA $17CC,y ; /
LDA $E4,x ; \ load generator x position and store it for later
CLC
ADC #$00
STA $17C8,y ; /
LDX $15E9

RTS
;GET_DRAW_INFO
;==============

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $B760 - graphics routine helper - shared
; sets off screen flags and sets index to OAM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SPR_T1 dcb $0C,$1C
SPR_T2 dcb $01,$02

GET_DRAW_INFO STZ $186C,x ; reset sprite offscreen flag, vertical
STZ $15A0,x ; reset sprite offscreen flag, horizontal
LDA $E4,x ; \
CMP $1A ; | set horizontal offscreen if necessary
LDA $14E0,x ; |
SBC $1B ; |
BEQ ON_SCREEN_X ; |
INC $15A0,x ; /

ON_SCREEN_X LDA $14E0,x ; \
XBA ; |
LDA $E4,x ; |
REP #$20 ; |
SEC ; |
SBC $1A ; | mark sprite invalid if far enough off screen
CLC ; |
ADC.W #$0040 ; |
CMP.W #$0180 ; |
SEP #$20 ; |
ROL A ; |
AND #$01 ; |
STA $15C4,x ; /
BNE INVALID ;

LDY #$00 ; \ set up loop:
LDA $1662,x ; |
AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
BEQ ON_SCREEN_LOOP ; | else, go through loop once
INY ; /
ON_SCREEN_LOOP LDA $D8,x ; \
CLC ; | set vertical offscreen if necessary
ADC SPR_T1,y ; |
PHP ; |
CMP $1C ; | (vert screen boundry)
ROL $00 ; |
PLP ; |
LDA $14D4,x ; |
ADC #$00 ; |
LSR $00 ; |
SBC $1D ; |
BEQ ON_SCREEN_Y ; |
LDA $186C,x ; | (vert offscreen)
ORA SPR_T2,y ; |
STA $186C,x ; |
ON_SCREEN_Y DEY ; |
BPL ON_SCREEN_LOOP ; /

LDY $15EA,x ; get offset to sprite OAM
LDA $E4,x ; \
SEC ; |
SBC $1A ; | $00 = sprite x position relative to screen boarder
STA $00 ; /
LDA $D8,x ; \
SEC ; |
SBC $1C ; | $01 = sprite y position relative to screen boarder
STA $01 ; /
RTS ; return

INVALID PLA ; \ return from *main gfx routine* subroutine...
PLA ; | ...(not just this subroutine)
RTS ; /


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_OFF_SCREEN
; This subroutine deals with sprites that have moved off screen
; It is adapted from the subroutine at $01AC0D
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SPR_T12 dcb $40,$B0
SPR_T13 dcb $01,$FF
SPR_T14 dcb $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes
dcb $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes
SPR_T15 dcb $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes
dcb $01,$FF,$01,$FF,$01,$00,$01,$FF ;bank 3 sizes

SUB_OFF_SCREEN_X1 LDA #$02 ; \ entry point of routine determines value of $03
BRA STORE_03 ; | (table entry to use on horizontal levels)
SUB_OFF_SCREEN_X2 LDA #$04 ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X3 LDA #$06 ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X4 LDA #$08 ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X5 LDA #$0A ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X6 LDA #$0C ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X7 LDA #$0E ; |
STORE_03 STA $03 ; |
BRA START_SUB ; |
SUB_OFF_SCREEN_X0 STZ $03 ; /

START_SUB JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
BEQ RETURN_35 ; /
LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
AND #$01 ; |
BNE VERTICAL_LEVEL ; /
LDA $D8,x ; \
CLC ; |
ADC #$50 ; | if the sprite has gone off the bottom of the level...
LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
ADC #$00 ; |
CMP #$02 ; |
BPL ERASE_SPRITE ; / ...erase the sprite
LDA $167A,x ; \ if "process offscreen" flag is set, return
AND #$04 ; |
BNE RETURN_35 ; /
LDA $13 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0756 VC:176 00 FL:205
AND #$01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0780 VC:176 00 FL:205
ORA $03 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0796 VC:176 00 FL:205
STA $01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0820 VC:176 00 FL:205
TAY ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0844 VC:176 00 FL:205
LDA $1A ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0858 VC:176 00 FL:205
CLC ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0882 VC:176 00 FL:205
ADC SPR_T14,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0896 VC:176 00 FL:205
ROL $00 ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizcHC:0928 VC:176 00 FL:205
CMP $E4,x ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:0966 VC:176 00 FL:205
PHP ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:0996 VC:176 00 FL:205
LDA $1B ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizCHC:1018 VC:176 00 FL:205
LSR $00 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdiZCHC:1042 VC:176 00 FL:205
ADC SPR_T15,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizcHC:1080 VC:176 00 FL:205
PLP ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F0 P:eNvMXdizcHC:1112 VC:176 00 FL:205
SBC $14E0,x ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1140 VC:176 00 FL:205
STA $00 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1172 VC:176 00 FL:205
LSR $01 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1196 VC:176 00 FL:205
BCC SPR_L31 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1234 VC:176 00 FL:205
EOR #$80 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1250 VC:176 00 FL:205
STA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1266 VC:176 00 FL:205
SPR_L31 LDA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1290 VC:176 00 FL:205
BPL RETURN_35 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1314 VC:176 00 FL:205
ERASE_SPRITE LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
CMP #$08 ; |
BCC KILL_SPRITE ; /
LDY $161A,x ;A:FF08 X:0007 Y:0001 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1108 VC:059 00 FL:2878
CPY #$FF ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1140 VC:059 00 FL:2878
BEQ KILL_SPRITE ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1156 VC:059 00 FL:2878
LDA #$00 ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1172 VC:059 00 FL:2878
STA $1938,y ;A:FF00 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZcHC:1188 VC:059 00 FL:2878
KILL_SPRITE STZ $14C8,x ; erase sprite
RETURN_35 RTS ; return

VERTICAL_LEVEL LDA $167A,x ; \ if "process offscreen" flag is set, return
AND #$04 ; |
BNE RETURN_35 ; /
LDA $13 ; \
LSR A ; |
BCS RETURN_35 ; /
LDA $E4,x ; \
CMP #$00 ; | if the sprite has gone off the side of the level...
LDA $14E0,x ; |
SBC #$00 ; |
CMP #$02 ; |
BCS ERASE_SPRITE ; / ...erase the sprite
LDA $13 ;A:0000 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:1218 VC:250 00 FL:5379
LSR A ;A:0016 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1242 VC:250 00 FL:5379
AND #$01 ;A:000B X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1256 VC:250 00 FL:5379
STA $01 ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1272 VC:250 00 FL:5379
TAY ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1296 VC:250 00 FL:5379
LDA $1C ;A:001A X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0052 VC:251 00 FL:5379
CLC ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0076 VC:251 00 FL:5379
ADC SPR_T12,y ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0090 VC:251 00 FL:5379
ROL $00 ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:enVMXdizCHC:0122 VC:251 00 FL:5379
CMP $D8,x ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0160 VC:251 00 FL:5379
PHP ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0190 VC:251 00 FL:5379
LDA.W $001D ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F2 P:eNVMXdizcHC:0212 VC:251 00 FL:5379
LSR $00 ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdiZcHC:0244 VC:251 00 FL:5379
ADC SPR_T13,y ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdizCHC:0282 VC:251 00 FL:5379
PLP ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:envMXdiZCHC:0314 VC:251 00 FL:5379
SBC $14D4,x ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0342 VC:251 00 FL:5379
STA $00 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0374 VC:251 00 FL:5379
LDY $01 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0398 VC:251 00 FL:5379
BEQ SPR_L38 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0422 VC:251 00 FL:5379
EOR #$80 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0438 VC:251 00 FL:5379
STA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0454 VC:251 00 FL:5379
SPR_L38 LDA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0478 VC:251 00 FL:5379
BPL RETURN_35 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0502 VC:251 00 FL:5379
BMI ERASE_SPRITE ;A:8AFF X:0002 Y:0000 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0704 VC:184 00 FL:5490

SUB_IS_OFF_SCREEN LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
ORA $186C,x ; |
RTS ; / return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $B817 - horizontal mario/sprite check - shared
; Y = 1 if mario left of sprite??
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;org $03B817

SUB_HORZ_POS LDY #$00 ;A:25D0 X:0006 Y:0001 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1020 VC:097 00 FL:31642
LDA $94 ;A:25D0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZCHC:1036 VC:097 00 FL:31642
SEC ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1060 VC:097 00 FL:31642
SBC $E4,x ;A:25F0 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizCHC:1074 VC:097 00 FL:31642
STA $0F ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1104 VC:097 00 FL:31642
LDA $95 ;A:25F4 X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1128 VC:097 00 FL:31642
SBC $14E0,x ;A:2500 X:0006 Y:0000 D:0000 DB:03 S:01ED P:envMXdiZcHC:1152 VC:097 00 FL:31642
BPL LABEL16 ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1184 VC:097 00 FL:31642
INY ;A:25FF X:0006 Y:0000 D:0000 DB:03 S:01ED P:eNvMXdizcHC:1200 VC:097 00 FL:31642
LABEL16 RTS ;A:25FF X:0006 Y:0001 D:0000 DB:03 S:01ED P:envMXdizcHC:1214 VC:097 00 FL:31642