Advertisement
Romano338

Zuma Sprite ASM

Nov 28th, 2018
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.60 KB | None | 0 0
  1.  
  2. ; Zuma´s Frog
  3. ; By NaroGugul
  4.  
  5. ; Sprite based on the frog from the Zuma game series.
  6. ; Spits balls to the players direction.
  7. ; Can be used as just a hazard or as a boss.
  8. ; Some options (ball frequency, type, speed, number of hits for the boss...) can be set in the defines.
  9. ; By default uses custom gfx to be inserted in SP3. Remap it to fit your needs.
  10.  
  11.  
  12. ;=======================================================================================================================
  13. ;=== DEFINES ===========================================================================================================
  14. ;=======================================================================================================================
  15.  
  16. !ExtendedSpriteNumber = $06 ; Extended Sprite number of ZumaFrogEXT.asm in the list.txt
  17.  
  18. !CanBeKilled = 2 ; 0 = It cannot be killed;
  19. ; 1 = Can be killed by thrown stuff;
  20. ; 2 = its a Boss.. same as 1, but will end the level when killed;
  21. ; 3 = its a Boss, but will trigger the secret exit.
  22.  
  23. !NumberOfHits = 3 ; Number of hits for it to be killed.
  24.  
  25. !WhatItSpawns = 3 ; 0 - Only the custom balls (Can be stumped and used like shells);
  26. ; 1 - Alternate between custom balls and custom extended sprite;
  27. ; 2 - Alternate between custom balls and custom extended sprite randomly;
  28. ; 3 - Only custom extended sprite (Cannot be stomped. Hurts Mario on touch).
  29.  
  30. !BallSpeed = 30 ; Speed of the Ball.
  31.  
  32. !InitialShotFrequency = 40 ; Number of frames between each shot.
  33.  
  34. !FrequencyDecrement = 5 ; How much faster it will shoot between each phase.
  35.  
  36.  
  37. !Phase = $1510
  38. !NextBallColor = $1504
  39. !FacingDirection = $157C
  40. !ShotFrequencyRam = $151C
  41. !Timer = $1540
  42. !CurrentFrequency = $1534
  43. !WhichBall = $1594
  44.  
  45. ;=======================================================================================================================
  46. ;=== INIT/MAIN =========================================================================================================
  47. ;=======================================================================================================================
  48.  
  49.  
  50. print "INIT ",pc
  51. PHB : PHK : PLB
  52. LDA $7FAB10,x
  53. AND #$04 ; extra bit set
  54. BNE +++
  55. STZ !WhichBall,x
  56. LDA #!WhatItSpawns : CMP #$03 : BNE + : LDA #$01 : STA !WhichBall,x
  57. +
  58. LDA #$06 : STA !NextBallColor,x
  59. LDA #!InitialShotFrequency : STA !Timer,x : STA !CurrentFrequency,x
  60. LDA #!NumberOfHits : STA !Phase,x : DEC !Phase,x
  61. if !CanBeKilled >= 2
  62. LDA $167A,x : ORA #$04 : STA $167A,x
  63. endif
  64. PLB
  65. RTL
  66. +++
  67. STZ $1656,x
  68. STZ $1662,x
  69. LDA #$01 : STA !Phase,x
  70. PLB
  71. RTL
  72.  
  73. print "MAIN ",pc
  74. PHB : PHK : PLB
  75. LDA $7FAB10,x
  76. AND #$04 ; extra bit set
  77. BNE +
  78. JSR MAINCODE
  79. PLB
  80. RTL
  81. +
  82. JSR BALLCODE
  83. PLB
  84. RTL
  85.  
  86. MAINCODE:
  87.  
  88. JSR GRAPHICS
  89. LDA #$00
  90. %SubOffScreen()
  91. JSR FACINGDIRECTION
  92. LDA !Timer,x : BNE +
  93. JSR SPAWNBALL
  94. +
  95. JSR MARIOINTERACTION
  96. if !CanBeKilled != 0
  97. JSR THROWNSPRITESKILL
  98. endif
  99. RTS
  100.  
  101.  
  102. BALLCODE:
  103. JSR GRAPHICSBALL
  104. LDA #$00
  105. %SubOffScreen()
  106. LDA !Phase,x : BEQ +
  107. JSR BALLBEHAVIOR
  108. +
  109. RTS
  110.  
  111. ;=======================================================================================================================
  112. ;=== BEHAVIOR ==========================================================================================================
  113. ;=======================================================================================================================
  114.  
  115. FACINGDIRECTION:
  116. LDA $E4,x : STA $0E
  117. LDA $14E0,x : STA $0F
  118. LDA $D8,x : STA $0C
  119. LDA $14D4,x : STA $0D
  120.  
  121. REP #$20
  122. LDA $0E : CLC : ADC #$0008 : SEC : SBC $94 : STA $00
  123. LDA $0C : CLC : ADC #$0010 : SEC : SBC $98 : STA $02
  124. SEP #$20
  125.  
  126. LDA #$7F
  127. %Aiming()
  128.  
  129. LDA $02 : BPL Down
  130. Up:
  131. CMP #$90 : BCC UpUp
  132. CMP #$C8 : BCS LLorRR
  133. BRA ULorUR
  134. Down:
  135. CMP #$70 : BCS DownDown
  136. CMP #$38 : BCC LLorRR
  137. BRA DLorDR
  138. UpUp:
  139. LDA #$00 : STA !FacingDirection,x : BRA EndDirection
  140. DownDown:
  141. LDA #$04 : STA !FacingDirection,x : BRA EndDirection
  142. LLorRR:
  143. LDA $00 : BMI LeftLeft
  144. RightRight:
  145. LDA #$02 : STA !FacingDirection,x : BRA EndDirection
  146. LeftLeft:
  147. LDA #$06 : STA !FacingDirection,x : BRA EndDirection
  148. ULorUR:
  149. LDA $00 : BMI UpLeft
  150. UpRight:
  151. LDA #$01 : STA !FacingDirection,x : BRA EndDirection
  152. UpLeft:
  153. LDA #$07 : STA !FacingDirection,x : BRA EndDirection
  154. DLorDR:
  155. LDA $00 : BMI DownLeft
  156. DownRight:
  157. LDA #$03 : STA !FacingDirection,x : BRA EndDirection
  158. DownLeft:
  159. LDA #$05 : STA !FacingDirection,x : BRA EndDirection
  160. EndDirection:
  161. RTS
  162.  
  163.  
  164. MARIOINTERACTION:
  165. JSL $01A7DC
  166. BCC +
  167. LDA #$05 : STA $154C,x
  168. %SubVertPos()
  169. LDA $0F
  170. CMP #$EB
  171. BCS ++
  172. LDA $7D
  173. BMI ++
  174. JSL $01AA33 ; set Mario speed
  175. JSL $01AB99 ; display contact graphic
  176. BRA +
  177. ++
  178. JSL $00F606
  179. +
  180. RTS
  181.  
  182.  
  183. BallsArray: db $04,$06,$08,$0A
  184. BallOffsetX: db $08,$10,$10,$10,$08,$00,$00,$00
  185. BallOffsetY: db $00,$00,$08,$10,$10,$10,$08,$00
  186.  
  187. SPAWNBALL:
  188.  
  189. LDA $E4,x : STA $0E
  190. LDA $14E0,x : STA $0F
  191. LDA $D8,x : STA $0C
  192. LDA $14D4,x : STA $0D
  193.  
  194. REP #$20
  195. LDA $0E : CLC : ADC #$0010 : SEC : SBC $94 : STA $00
  196. LDA $0C : CLC : ADC #$0010 : SEC : SBC $98 : STA $02
  197. SEP #$20
  198.  
  199. LDA #!BallSpeed
  200. %Aiming()
  201. LDA $02 : STA $03
  202. LDA $00 : STA $02
  203. STZ $00
  204. STZ $01
  205. LDA !FacingDirection,x : TAX
  206. LDA BallOffsetX,x : STA $00
  207. LDA BallOffsetY,x : STA $01
  208. LDX $15E9
  209.  
  210.  
  211. LDA !WhichBall,x : BEQ CustomSprite
  212. ExtendedSprite:
  213. LDA #!ExtendedSpriteNumber+!ExtendedOffset
  214. %SpawnExtended()
  215. BRA DidItSpawn
  216. CustomSprite:
  217. LDA $7FAB9E,x
  218. SEC
  219. %SpawnSprite()
  220.  
  221. DidItSpawn:
  222. BCS +
  223. LDA !WhichBall,x : BEQ CustomSpriteSet
  224. ExtendedSpriteSet:
  225. LDX $15E9 : LDA !NextBallColor,x : STA $1765,y
  226. LDA #$07 : STA $176F,y
  227. BRA FinishSpawn
  228. CustomSpriteSet:
  229. TYX
  230. LDA #$8C : STA $7FAB10,x
  231. LDX $15E9 : LDA !NextBallColor,x : STA !NextBallColor,y
  232.  
  233. FinishSpawn:
  234. LDA #$09 ; \ Play the "bullet bill shoot" sound effect.
  235. STA $1DFC ; /
  236.  
  237. JSL $01ACF9 : LDA $148D : AND #$03
  238. TAX : LDA BallsArray,x
  239. LDX $15E9 : STA !NextBallColor,x
  240. LDA !CurrentFrequency,x : STA !Timer,x
  241.  
  242. LDA #!WhatItSpawns : BNE ++ : STZ !WhichBall,x : BRA +
  243. ++ CMP #$01 : BNE ++ : LDA !WhichBall,x : EOR #$01 : STA !WhichBall,x : BRA +
  244. ++ CMP #$02 : BNE ++ : JSL $01ACF9 : LDA $148D : AND #$01 : STA !WhichBall,x : BRA +
  245. ++ LDA #$01 : STA !WhichBall,x
  246. +
  247.  
  248. RTS
  249.  
  250.  
  251. if !CanBeKilled != 0
  252. THROWNSPRITESKILL:
  253.  
  254. ; Most of this routine was borrowed from the Big Boo Boss by Davros ;)
  255.  
  256. SPRITE_INTERACT: LDY #!SprSize-1 ;
  257. LOOP: LDA !14C8,y ; \ if the sprite status is..
  258. CMP #$09 ; | ...shell-like
  259. BEQ PRE_PROCESS_SPRITE ; /
  260. CMP #$0A ; \ ...throwned shell-like
  261. BEQ PROCESS_SPRITE ; /
  262. NEXT_SPRITE: DEY ;
  263. BPL LOOP ; ...otherwise, loop
  264. RTS ; return
  265. PRE_PROCESS_SPRITE:
  266. LDA $AA,y : BEQ NEXT_SPRITE
  267. PROCESS_SPRITE: PHX ; push x
  268. TYX ; transfer x to y
  269. JSL $03B6E5|!BankB ; get sprite clipping B routine
  270. PLX ; pull x
  271. JSL $03B69F|!BankB ; get sprite clipping A routine
  272. JSL $03B72B|!BankB ; check for contact routine
  273.  
  274. BCC NEXT_SPRITE ;
  275. KILL_BALLS:
  276. LDA $7FAB9E,x : STA $0F
  277. PHX ;Push the X register
  278. LDX #$00 ;innitiate the counter
  279. loop:
  280. LDA $7FAB9E,x ;Load the sprite numbers of all the sprites on screen (one at a time)
  281. CMP $0F ;\If it's not the one you specified, don't kill it
  282. BNE notkill ;/
  283. LDA $7FAB10,x
  284. AND #$04 ; extra bit set
  285. BEQ +
  286. LDA #$04 ;\ Make the sprite dissapear in a puff of smoke
  287. STA $14C8,x ;/
  288. LDA #$08
  289. STA $1DF9
  290. LDA #$1F
  291. STA $1540,x
  292. +
  293. notkill:
  294. INX ;Move on to the next slot
  295. CPX #$0C ;\If they haven't all been checked, go back to the beginning
  296. BCC loop ;/
  297. PLX ;Pull the X register from the stack
  298.  
  299.  
  300. CONTINUE:
  301. PHX ; push x
  302. TYX ; transfer x to y
  303. LDA #$04 : STA !14C8,x ; destroy the sprite
  304. LDA #$08 : STA $1DF9
  305. LDA #$1F : STA $1540,x
  306. PLX ; pull x
  307.  
  308. LDA !Phase,x : BNE +
  309. LDA #$04 : STA $14C8,x
  310. LDA #$08 : STA $1DF9
  311. LDA #$1F : STA $1540,x
  312. if !CanBeKilled >= 2
  313. if !CanBeKilled == 3
  314. INC $1DEA
  315. endif
  316. DEC $13C6|!Base2 ; prevent Mario from walking at the level end
  317. LDA #$FF ; \ set goal
  318. STA $1493|!Base2 ; /
  319. LDA #$0B ; \ set ending music
  320. STA $1DFB|!Base2 ; /
  321.  
  322. RTS
  323.  
  324. endif
  325.  
  326. RTS
  327. +
  328.  
  329. LDA $1534,x : STA $0F
  330. LDA !CurrentFrequency,x : SEC : SBC #!FrequencyDecrement : STA !CurrentFrequency,x : STA !Timer,x
  331. DEC !Phase,x
  332. LDA #$10 : STA $1DF9 ; Play the "magikoopa shoot magic" sound effect.
  333. LDX $15E9
  334.  
  335. RTS
  336. endif
  337.  
  338.  
  339. ;=======================================================================================================================
  340. ;=== BALL ==============================================================================================================
  341. ;=======================================================================================================================
  342.  
  343.  
  344. BALLBEHAVIOR:
  345.  
  346. JSL $01801A ; Updates the sprite Y position
  347. JSL $018022 ; Updates the sprite X position
  348.  
  349. LDA $1490 : BNE Return
  350. LDA !Phase,x : BEQ Return
  351. JSL $01A7DC
  352. BCC Return
  353. LDA #$05 : STA $154C,x
  354. %SubVertPos()
  355. LDA $0F
  356. CMP #$EB
  357. BCS ++
  358. LDA $7D
  359. BMI ++
  360. LDA $140D : BEQ +++
  361.  
  362. JSL $01AA33 ; set Mario speed
  363. JSL $01AB99 ; display contact graphic
  364. LDA #$04 : STA !14C8,x ; destroy the sprite
  365. LDA #$08 : STA $1DF9
  366. LDA #$1F : STA $1540,x
  367. BRA Return
  368. +++
  369. JSL $01AA33 ; set Mario speed
  370. JSL $01AB99 ; display contact graphic
  371. STZ !Phase,x
  372. STZ $AA,x : STZ $B6,x
  373. LDA #$04 : STA $9E,x
  374. LDA #$09 : STA $14C8,x
  375. LDA #$10 : STA $1656,x
  376. LDA #$00 : STA $1662,x
  377. LDA #$0A : STA $166E,x
  378. LDA #$21 : STA $167A,x
  379. LDA #$00 : STA $1686,x
  380. LDA #$0A : STA $190F,x
  381. LDA #$02 : STA $1DF9
  382. BRA Return
  383. ++
  384. JSL $00F606
  385.  
  386.  
  387. Return:
  388. RTS
  389.  
  390.  
  391.  
  392. ;=======================================================================================================================
  393. ;=== GRAPHICS ==========================================================================================================
  394. ;=======================================================================================================================
  395.  
  396.  
  397. Tiles: db $24,$20,$08,$00,$04,$02,$06,$22 ; Up Left Tile ; U,UR,R,DR,D,DL,L,UL
  398. db $24,$22,$06,$02,$04,$00,$08,$20 ; Up Right Tile ;
  399. db $04,$00,$08,$20,$24,$22,$06,$02 ; Down Left Tile ;
  400. db $04,$02,$06,$22,$24,$20,$08,$00 ; Down Right Tile ;
  401.  
  402. TilesFlipX: db $00,$00,$40,$00,$00,$40,$00,$40
  403. db $40,$00,$40,$00,$40,$40,$00,$40
  404. db $00,$00,$40,$00,$00,$40,$00,$40
  405. db $40,$00,$40,$00,$40,$40,$00,$40
  406.  
  407. TilesFlipY: db $80,$80,$00,$00,$00,$00,$00,$80
  408. db $80,$80,$00,$00,$00,$00,$00,$80
  409. db $80,$80,$80,$00,$00,$00,$80,$80
  410. db $80,$80,$80,$00,$00,$00,$80,$80
  411.  
  412. TilesOffsetX: db $00,$00,$00,$00,$00,$00,$00,$00
  413. db $10,$10,$10,$10,$10,$10,$10,$10
  414. db $00,$00,$00,$00,$00,$00,$00,$00
  415. db $10,$10,$10,$10,$10,$10,$10,$10
  416.  
  417. TilesOffsetY: db $00,$00,$00,$00,$00,$00,$00,$00
  418. db $00,$00,$00,$00,$00,$00,$00,$00
  419. db $10,$10,$10,$10,$10,$10,$10,$10
  420. db $10,$10,$10,$10,$10,$10,$10,$10
  421.  
  422. !NextBallTile = $26
  423.  
  424. NextBallOffsetX: db $0C,$06,$05,$06,$0C,$12,$13,$12
  425.  
  426. NextBallOffsetY: db $13,$12,$0C,$06,$05,$06,$0C,$12
  427.  
  428.  
  429.  
  430. GRAPHICS:
  431. LDA !Phase,x : STA $09
  432. LDA $15F6,x : STA $0F
  433. %GetDrawInfo()
  434. ;MAIN TILES
  435. TYA
  436. STA $0A
  437. LSR #2
  438. STA $0B
  439.  
  440. STZ $0E
  441. LDX #$04
  442. Loop:
  443. PHX
  444. LDY $0A
  445. LDX $15E9 : LDA !FacingDirection,x : CLC : ADC $0E : TAX
  446. LDA $00 : CLC : ADC TilesOffsetX,x
  447. STA $0300,y ; X position
  448. LDA $01 : CLC : ADC TilesOffsetY,x
  449. STA $0301,y ; Y position
  450. LDA Tiles,x
  451. STA $0302,y ; Tile number
  452.  
  453. LDA $09 : BNE +
  454. LDA #$09 : BRA ++
  455. + LDA $0F
  456. ++
  457. ORA $64 : ORA TilesFlipX,x : ORA TilesFlipY,x
  458. STA $0303,y ; Properties
  459.  
  460. LDA $0E : CLC : ADC #$08 : STA $0E
  461.  
  462. INY #4 : STY $0A
  463. LDY $0B
  464. LDA #$02
  465. STA $0460,y
  466. INC $0B
  467. PLX
  468. DEX
  469. CPX #$00 : BNE Loop
  470.  
  471.  
  472. ;NEXT BALL TILE
  473. LDY $0A
  474. LDX $15E9 : LDA !FacingDirection,x : TAX
  475. LDA $00 : CLC : ADC NextBallOffsetX,x
  476. STA $0300,y
  477. LDA $01 : CLC : ADC NextBallOffsetY,x
  478. STA $0301,y
  479. LDA #!NextBallTile
  480. STA $0302,y
  481. LDX $15E9
  482. LDA !NextBallColor,x : ORA #$01
  483. STA $0303,y
  484. LDY $0B
  485. LDA #$00
  486. STA $0460,y
  487.  
  488.  
  489. LDA #$04 ; Tile to draw - 1
  490. LDX $15E9
  491. LDY #$FF
  492. JSL $01B7B3
  493.  
  494. RTS
  495.  
  496.  
  497. !BallTile = $27
  498. GRAPHICSBALL:
  499. LDX $15E9
  500. %GetDrawInfo()
  501.  
  502. LDA #$F0
  503. STA $0309,y ; hide garbage tiles
  504.  
  505. LDA $00
  506. STA $0300,y ; X position
  507. LDA $01
  508. STA $0301,y ; Y position
  509. LDA #!BallTile
  510. STA $0302,y ; Tile number
  511. LDA #$01 : ORA $64 : ORA !NextBallColor,x
  512. STA $0303,y ; Properties
  513.  
  514. LDA #$00 ; Tile to draw - 1
  515. LDY #$02 ; 16x16 sprite
  516. JSL $01B7B3
  517. RTS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement