Advertisement
Guest User

SpinyBoss.asm

a guest
Apr 16th, 2016
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.53 KB | None | 0 0
  1. !BossPhase = $C2
  2. !Hitpoints = $1528
  3. !Status = $14C8
  4. !PhaseTimer = $1540
  5. !ThrowBlockCntr = $1534
  6.  
  7. !ThrowBlkAt = $03 ;after how many boss phases a throw block should fall
  8. !MaxHP = $05 ;How many HP this boss has (6 or 5 i didn't bother counting()
  9. !SpriteFire = $BB ;Fireball custom sprite number.
  10.  
  11. print "INIT ",pc
  12. LDA #!MaxHP
  13. STA !Hitpoints,x
  14. STZ !BossPhase,x
  15. STZ $1594,x
  16. RTL
  17.  
  18. print "MAIN ",pc
  19. PHB
  20. PHK
  21. PLB
  22. JSR MainRoutine
  23. PLB
  24. RTL
  25.  
  26. Phases: dw SimplyWait ;$00 - Simply wait till Mario actually approaches the boss (like boom-boom)
  27. dw SpinOnFloor ;$01 - Spin on floor like the flashing shell
  28. dw BreatheFireThrice ;$02 - Simply breathe few fireballs (ignore label name)
  29. dw BreatheTripleFire ;$03 - Breathe 3 fireballs at once, creating a 16x(16*3) wall of fire
  30. dw Dummy
  31. dw Dummy
  32. dw Dummy
  33. dw Dummy
  34. dw GotHit ;$08 - Attack when he gets hit
  35.  
  36. GFXPhases: dw GFXWait
  37. dw GFXSpin
  38. dw GFXBreatheFire
  39. dw GFXTripleFire
  40. dw GFXSpin
  41. dw GFXJump
  42. dw GFXJump
  43. dw GFXDie
  44. dw GFXSpin
  45.  
  46. MainRoutine:
  47.  
  48. Attacks: JSR Graphics
  49. LDA $9D
  50. BNE .return
  51.  
  52. JSR SPRITE_INTERACT
  53.  
  54. LDA $14C8,x
  55. CMP #$02
  56. BNE .normal
  57. LDA $1594,x
  58. RTS ; return
  59.  
  60. .normal LDA !BossPhase,x
  61. .Gotophase ASL A
  62. TAX
  63. JSR (Phases,x)
  64. .return RTS
  65.  
  66. XMax: db $30,$30^$FF-$01
  67. XAccel: db $02,$01^$FF
  68.  
  69.  
  70. SimplyWait: ;Wait till mario approaches the boss
  71. !MaxLeft = $0060
  72. !MaxRight = $0060
  73.  
  74. LDX $15E9
  75. LDA $14E0,x
  76. XBA
  77. LDA $E4,x
  78. REP #$20
  79. SBC $94
  80. ADC.w #!MaxLeft
  81. CMP.w #!MaxLeft+!MaxRight
  82. SEP #$20
  83. BCS NotCloseEnough
  84.  
  85. STZ $7B
  86. LDA $77
  87. AND #$04
  88. BEQ NotCloseEnough
  89. LDA #$FF ;hurf durf spin around
  90. STA !PhaseTimer,x
  91. INC !BossPhase,x
  92. ;LDA #$05
  93. ;STA $1DFB
  94.  
  95. NotCloseEnough: RTS
  96.  
  97. SpinOnFloor: LDX $15E9
  98.  
  99. .clipping
  100. JSL $03B664
  101. JSR GetSpriteClipping
  102. JSL $03B72B
  103. BCC ++
  104.  
  105. LDA $7D
  106. BMI +
  107.  
  108. LDA $140D
  109. ORA $187A
  110. BEQ +
  111.  
  112. LDA #$02
  113. STA $1DF9
  114. JSL $01AA33
  115. JSL $01AB99
  116. BRA ++
  117. + JSL $00F5B7
  118. RTS
  119.  
  120. ++ LDA !PhaseTimer,x
  121. CMP #$F0
  122. BCS .return ;dont move for a bit
  123.  
  124. LDA !PhaseTimer,x
  125. BEQ .Gotoright
  126.  
  127. JSR SUB_HORZ_POS
  128. LDA $B6,x
  129. CMP XMax,y
  130. BEQ .gravity
  131. CLC
  132. ADC XAccel,y
  133. STA $B6,x
  134.  
  135. .gravity JSL $01802A
  136. LDA $1588,x
  137. BIT #$02
  138. BNE .leftblock
  139. BIT #$01
  140. BNE .rightblock
  141. RTS
  142.  
  143. .rightblock LDA.b #$12^$FF
  144. STA $B6,x
  145.  
  146. JSR GenerateDirt
  147.  
  148. LDA #$20
  149. STA $1887
  150.  
  151. LDA #$25
  152. STA $1DFC
  153. .return RTS
  154.  
  155. .leftblock LDA #$12
  156. STA $B6,x
  157.  
  158. JSR GenerateDirt
  159.  
  160. LDA #$20
  161. STA $1887
  162.  
  163. LDA #$25
  164. STA $1DFC
  165. RTS
  166.  
  167. .Gotoright
  168. LDA $14E0,x
  169. XBA
  170. LDA $E4,x
  171. REP #$20
  172. SEC
  173. SBC $1A
  174. CLC
  175. ADC #$0032
  176. CMP #$0100
  177. SEP #$20
  178. BCS .stop
  179.  
  180. LDA #$25
  181. STA $B6,x
  182. BRL .gravity
  183.  
  184.  
  185. .stop STZ $B6,x
  186. .NextPhase JSR GoToRandomPhase
  187. BRL .gravity
  188.  
  189. BreatheFireThrice:
  190. LDX $15E9
  191. .clipping
  192. JSL $03B664
  193. JSR GetSpriteClipping
  194. JSL $03B72B
  195. BCC ++
  196.  
  197. LDA $7D
  198. BMI +
  199.  
  200. LDA $140D
  201. ORA $187A
  202. BEQ +
  203.  
  204. LDA #$02
  205. STA $1DF9
  206. JSL $01AA33
  207. JSL $01AB99
  208. BRA ++
  209. + JSL $00F5B7
  210. RTS
  211.  
  212. ++ LDA !PhaseTimer,x
  213. CMP #$E0
  214. BEQ .GenFire
  215. CMP #$B0
  216. BEQ .GenFire
  217. CMP #$50
  218. BEQ .GenFire
  219. CMP #$40
  220. BEQ .GenFire
  221. LDX $15E9
  222. LDA !PhaseTimer,x
  223. BNE +
  224. JSR .GenFire
  225. JSR GoToRandomPhase
  226.  
  227. + RTS
  228.  
  229. .GenFire TXY
  230. LDX #$0B
  231. .GLoop LDA $14C8,X
  232. BEQ .Cont
  233. DEX
  234. BPL .GLoop
  235. RTS
  236.  
  237. .Cont LDA #$08 ;set to main
  238. STA $14C8,x ;status
  239.  
  240. LDA #!SpriteFire ;sprite to generate
  241. STA $7FAB9E,x ;custom sprite
  242. PHY
  243. JSL $07F7D2 ;clear
  244. JSL $0187A7
  245. PLY
  246. LDA #$88
  247. STA $7FAB10,x
  248.  
  249. LDA $00E4,y
  250. STA $E4,x
  251. LDA $14E0,y
  252. STA $14E0,x
  253.  
  254. LDA $00D8,y
  255. CLC
  256. ADC #$10
  257. STA $D8,x
  258. LDA $14D4,y
  259. ADC #$00
  260. STA $14D4,x
  261.  
  262. LDA #$17
  263. STA $1DFC
  264.  
  265. PHY
  266. JSR CALCFULLFRAME ;y is unchanged
  267. TAY
  268. LDA XSPEEDS,y
  269. STA $B6,x
  270. LDA YSPEEDS,y
  271. CLC
  272. ADC #$07
  273. STA $AA,x
  274. PLX
  275. RTS
  276.  
  277. BreatheTripleFire:
  278. LDX $15E9
  279. JSL $03B664
  280. JSR GetSpriteClipping
  281. JSL $03B72B
  282. BCC ++
  283.  
  284. LDA $7D
  285. BMI +
  286.  
  287. LDA $140D
  288. ORA $187A
  289. BEQ +
  290.  
  291. LDA #$02
  292. STA $1DF9
  293. JSL $01AA33
  294. JSL $01AB99
  295. BRA ++
  296. + JSL $00F5B7
  297. RTS
  298.  
  299. ++ LDA !PhaseTimer,x
  300. BEQ .NextPhase
  301. CMP #$D0
  302. BCS .return
  303. CMP #$20
  304. BCC .return
  305.  
  306. LDA $14
  307. AND #$1F
  308. BNE .return
  309.  
  310. JSR .GenFire
  311.  
  312. BRA .return
  313.  
  314. .NextPhase JSR GoToRandomPhase
  315. .return RTS
  316.  
  317. .GenFire TXY
  318. LDX #$0B
  319. .GLoop LDA $14C8,X
  320. BEQ .Cont
  321. DEX
  322. BPL .GLoop
  323. RTS
  324.  
  325. .Cont LDA #$08 ;set to main
  326. STA $14C8,x ;status
  327.  
  328. LDA #!SpriteFire ;sprite to generate
  329. STA $7FAB9E,x ;custom sprite
  330. PHY
  331. JSL $07F7D2 ;clear
  332. JSL $0187A7
  333. PLY
  334. LDA #$88
  335. STA $7FAB10,x
  336.  
  337. LDA $00E4,y
  338. STA $E4,x
  339. LDA $14E0,y
  340. STA $14E0,x
  341.  
  342. LDA $00D8,y
  343. CLC
  344. ADC #$10
  345. STA $D8,x
  346. LDA $14D4,y
  347. ADC #$00
  348. STA $14D4,x
  349.  
  350. LDA #$17
  351. STA $1DFC
  352.  
  353. PHY
  354. JSL $01ACF9
  355. LDA $148D
  356. AND #$03
  357. TAY
  358. LDA FireSpeedTableX,y
  359. STA $B6,x ;xspeed
  360. JSL $01ACF9
  361. LDA $148D
  362. AND #$03
  363. TAY
  364. LDA FireSpeedTableY,y
  365. STA $AA,x ;yspeed
  366. PLX
  367.  
  368. RTS
  369.  
  370. FireSpeedTableX: db $24^$FF,$28^$FF,$2B^$FF,$2F^$FF
  371. FireSpeedTableY: db $00^$FF,$01^$FF,$02^$FF,$04^$FF
  372.  
  373.  
  374. ShellFireAttack:
  375. FieryJump:
  376. MeteorJump:
  377. Dummy: LDX $15E9
  378. RTS
  379.  
  380.  
  381. GotHit: LDX $15E9
  382. JSL $03B664
  383. JSR GetSpriteClipping
  384. JSL $03B72B
  385. BCC ++
  386.  
  387. LDA $7D
  388. BMI +
  389.  
  390. LDA $140D
  391. ORA $187A
  392. BEQ +
  393.  
  394. LDA #$02
  395. STA $1DF9
  396. JSL $01AA33
  397. JSL $01AB99
  398. BRA ++
  399. + JSL $00F5B7
  400. RTS
  401.  
  402. ++ LDA $14E0,x
  403. XBA
  404. LDA $E4,x
  405. REP #$20
  406. SEC
  407. SBC $1A
  408. CLC
  409. ADC #$0040
  410. CMP #$0100
  411. SEP #$20
  412. BCS .stop
  413.  
  414. LDA #$25
  415. STA $B6,x
  416. BRL SpinOnFloor_gravity
  417.  
  418. .stop LDA !PhaseTimer,x
  419. CMP #$10
  420. BNE +
  421. JSR .genfire
  422. RTS
  423. + CMP #$0B
  424. BNE +
  425. JSR .genfire
  426.  
  427. RTS
  428. + CMP #$08
  429. BNE +
  430. JSR .genfire
  431.  
  432. RTS
  433.  
  434. + CMP #$00
  435. BNE +
  436. JSR GoToRandomPhase
  437.  
  438. + RTS
  439.  
  440. .genfire TXY
  441. STA $00
  442. LDX #$0B
  443. .GLoop LDA $14C8,X
  444. BEQ .Cont
  445. DEX
  446. BPL .GLoop
  447. RTS
  448.  
  449. .Cont LDA #$08 ;set to main
  450. STA $14C8,x ;status
  451.  
  452. LDA #!SpriteFire ;sprite to generate
  453. STA $7FAB9E,x ;custom sprite
  454. PHY
  455. JSL $07F7D2 ;clear
  456. JSL $0187A7
  457. PLY
  458. LDA #$88
  459. STA $7FAB10,x
  460.  
  461. LDA $00E4,y
  462. STA $E4,x
  463. LDA $14E0,y
  464. STA $14E0,x
  465.  
  466. LDA $00D8,y
  467. CLC
  468. ADC #$10
  469. STA $D8,x
  470. LDA $14D4,y
  471. ADC #$00
  472. STA $14D4,x
  473.  
  474. LDA #$17
  475. STA $1DFC
  476.  
  477. PHY
  478. JSR CALCFULLFRAME ;y is unchanged
  479. TAY
  480. LDA XSPEEDS,y
  481. STA $B6,x
  482. LDA YSPEEDS,y
  483. CLC
  484. ADC #$07
  485. STA $AA,x
  486. PLX
  487. RTS
  488.  
  489. Graphics: JSL GET_DRAW_INFO
  490. LDA !BossPhase,x
  491. ASL A
  492. TAX
  493. JSR (GFXPhases,x)
  494. RTS
  495.  
  496. GFXBreatheFire: LDX $15E9
  497. LDA $00
  498. STA $0300,y
  499. LDA $01
  500. STA $0301,y
  501. LDA #$04
  502. STA $0302,y
  503. LDA $64
  504. ORA $15F6,x
  505. STA $0303,y
  506.  
  507. LDA $00
  508. CLC
  509. ADC #$10
  510. STA $0300+4,y
  511. LDA $01
  512. STA $0301+4,y
  513. LDA #$06
  514. STA $0302+4,y
  515. LDA $64
  516. ORA $15F6,x
  517. STA $0303+4,y
  518.  
  519. LDA $00
  520. STA $0300+8,y
  521. LDA $01
  522. CLC
  523. ADC #$10
  524. STA $0301+8,y
  525. LDA #$24
  526. STA $0302+8,y
  527. LDA $64
  528. ORA $15F6,x
  529. STA $0303+8,y
  530.  
  531. LDA $00
  532. CLC
  533. ADC #$10
  534. STA $0300+12,y
  535. LDA $01
  536. CLC
  537. ADC #$10
  538. STA $0301+12,y
  539. LDA #$26
  540. STA $0302+12,y
  541. LDA $64
  542. ORA $15F6,x
  543. STA $0303+12,y
  544.  
  545. LDY #$02 ;16x16
  546. LDA #$04 ;tile #s
  547. JSL $01B7B3
  548. RTS
  549.  
  550. GFXWait: LDX $15E9
  551. LDA $00
  552. STA $0300,y
  553. LDA $01
  554. STA $0301,y
  555. LDA #$08
  556. STA $0302,y
  557. LDA $64
  558. ORA $15F6,x
  559. STA $0303,y
  560.  
  561. LDA $00
  562. CLC
  563. ADC #$10
  564. STA $0300+4,y
  565. LDA $01
  566. STA $0301+4,y
  567. LDA #$0A
  568. STA $0302+4,y
  569. LDA $64
  570. ORA $15F6,x
  571. STA $0303+4,y
  572.  
  573. LDA $00
  574. STA $0300+8,y
  575. LDA $01
  576. CLC
  577. ADC #$10
  578. STA $0301+8,y
  579. LDA #$28
  580. STA $0302+8,y
  581. LDA $64
  582. ORA $15F6,x
  583. STA $0303+8,y
  584.  
  585. LDA $00
  586. CLC
  587. ADC #$10
  588. STA $0300+12,y
  589. LDA $01
  590. CLC
  591. ADC #$10
  592. STA $0301+12,y
  593. LDA #$2A
  594. STA $0302+12,y
  595. LDA $64
  596. ORA $15F6,x
  597. STA $0303+12,y
  598.  
  599. LDY #$02 ;16x16
  600. LDA #$03 ;tile #s
  601. JSL $01B7B3
  602. RTS
  603.  
  604. SpinTable: db $08,$0C,$40,$0C
  605. db $0A,$0E,$42,$0E
  606. db $28,$2C,$60,$2C
  607. db $2A,$2E,$62,$2E
  608. GFXTripleFire:
  609. GFXSpin: LDX $15E9
  610.  
  611. PHX
  612. LDA $14
  613. AND #$0F
  614. LSR A
  615. LSR A
  616. TAX
  617. LDA SpinTable,x
  618. STA $0302+0,y
  619. LDA SpinTable+4,x
  620. STA $0302+4,y
  621. LDA SpinTable+8,x
  622. STA $0302+8,y
  623. LDA SpinTable+12,x
  624. STA $0302+12,y
  625. PLX
  626.  
  627. LDA $00
  628. STA $0300,y
  629. LDA $01
  630. STA $0301,y
  631. LDA $64
  632. ORA $15F6,x
  633. STA $0303,y
  634.  
  635. LDA $00
  636. CLC
  637. ADC #$10
  638. STA $0300+4,y
  639. LDA $01
  640. STA $0301+4,y
  641. LDA $64
  642. ORA $15F6,x
  643. STA $0303+4,y
  644.  
  645. LDA $00
  646. STA $0300+8,y
  647. LDA $01
  648. CLC
  649. ADC #$10
  650. STA $0301+8,y
  651. LDA $64
  652. ORA $15F6,x
  653. STA $0303+8,y
  654.  
  655. LDA $00
  656. CLC
  657. ADC #$10
  658. STA $0300+12,y
  659. LDA $01
  660. CLC
  661. ADC #$10
  662. STA $0301+12,y
  663. LDA $64
  664. ORA $15F6,x
  665. STA $0303+12,y
  666.  
  667. LDY #$02 ;16x16
  668. LDA #$03 ;tile #s
  669. JSL $01B7B3
  670. RTS
  671.  
  672.  
  673. GFXJump:
  674. GFXDie:
  675. GFXHit:
  676. LDX $15E9
  677. RTS
  678.  
  679. ; ==========================================================
  680. ; LIBRARY ROUTINES
  681. ; ==========================================================
  682.  
  683. ;#####################GET DRAW INFO######################
  684.  
  685. GET_DRAW_INFO: STZ $186C,x
  686. STZ $15A0,x
  687. LDA $E4,x
  688. CMP $1A
  689. LDA $14E0,x
  690. SBC $1B
  691. BEQ ON_SCREEN_X
  692. INC $15A0,x
  693.  
  694. ON_SCREEN_X: LDA $14E0,x
  695. XBA
  696. LDA $E4,x
  697. REP #$20
  698. SEC
  699. SBC $1A
  700. CLC
  701. ADC #$0040
  702. CMP #$0180
  703. SEP #$20
  704. ROL A
  705. AND #$01
  706. STA $15C4,x
  707. BNE INVALID
  708.  
  709. PHB
  710. PHK
  711. PLB
  712. LDY #$00
  713. LDA $1662,x
  714. AND #$20
  715. BEQ ON_SCREEN_LOOP
  716. INY
  717. ON_SCREEN_LOOP: LDA $D8,x
  718. CLC
  719. ADC SPR_T1,y
  720. PHP
  721. CMP $1C
  722. ROL $00
  723. PLP
  724. LDA $14D4,x
  725. ADC #$00
  726. LSR $00
  727. SBC $1D
  728. BEQ ON_SCREEN_Y
  729. LDA $186C,x
  730. ORA SPR_T2,y
  731. STA $186C,x
  732. ON_SCREEN_Y: DEY
  733. BPL ON_SCREEN_LOOP
  734.  
  735. LDY $15EA,x
  736. LDA $E4,x
  737. SEC
  738. SBC $1A
  739. STA $00
  740. LDA $D8,x
  741. SEC
  742. SBC $1C
  743. STA $01
  744. PLB
  745. RTL
  746.  
  747. INVALID: REP #$20
  748. PLA
  749. PLY
  750. PLA
  751. PHY
  752. PHA
  753. SEP #$20
  754. RTL
  755.  
  756. SPR_T1: db $0C,$1C
  757. SPR_T2: db $01,$02
  758.  
  759.  
  760. ;--------------------------;
  761. ; Sprite Clipping Routine ;
  762. ; Mostly borrowed from SMW ;
  763. ;--------------------------;
  764.  
  765. GetSpriteClipping:
  766. LDA $E4,x
  767. CLC
  768. ADC #$03
  769. STA $04
  770. LDA $14E0,x
  771. ADC #$00
  772. STA $0A
  773. LDA.b #$1F-$03 ; Width of sprite clipping
  774. STA $06
  775. LDA $D8,x
  776. CLC
  777. ADC #$06
  778. STA $05
  779. LDA $14D4,x
  780. ADC #$00
  781. STA $0B
  782. LDA #$19 ; Height of sprite clipping
  783. STA $07
  784. RTS
  785.  
  786.  
  787. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  788. ; SUB_HORZ_POS
  789. ; This routine determines which side of the sprite Mario is on. It sets the Y register
  790. ; to the direction such that the sprite would face Mario
  791. ; It is ripped from $03B817
  792. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  793.  
  794. SUB_HORZ_POS: LDY #$00
  795. LDA $94
  796. SEC
  797. SBC $E4,x
  798. STA $0F
  799. LDA $95
  800. SBC $14E0,x
  801. BPL SPR_L16
  802. INY
  803. SPR_L16: RTS
  804.  
  805.  
  806.  
  807. ;;;;;;;;;generates dirt
  808.  
  809. GenerateDirt: LDY #$0B
  810. - LDA $17F0,y
  811. BEQ +
  812. DEY
  813. BPL -
  814. BRA ++
  815.  
  816. + LDA #$01
  817. STA $17F0,y
  818.  
  819. JSL $01ACF9
  820. AND #$8F
  821. STA $1808,y
  822. LDA $80
  823. STA $17FC,y
  824. LDA $81
  825. STA $1814,y
  826.  
  827. JSL $01ACF9
  828. AND #$01
  829. STA $182C,y
  830. LDA #$00
  831. STA $1820,y
  832. ++ RTS
  833.  
  834. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  835.  
  836. !FC_TEMP1 = $00 ; will use 2 bytes
  837. !FC_TEMP2 = $02 ; will use 2 bytes
  838. !FC_TEMP3 = $04 ; will use 2 bytes
  839. !FC_TEMP4 = $06 ; will use 2 bytes
  840.  
  841. CALCFULLFRAME: JSR CALCFRAME
  842. JSR CALCQUADFLIP
  843. RTS
  844.  
  845. CALCQUADFLIP: PHA
  846. JSR SUB_VERT_POS
  847. PLA
  848. CPY #$00
  849. BNE CHKHORZ
  850. EOR #$FF
  851. CLC
  852. ADC #$1F
  853. CHKHORZ: PHA
  854. JSR SUB_HORZ_POS
  855. PLA
  856. CPY #$00
  857. BEQ ENDQUADCHK
  858. EOR #$FF
  859. CLC
  860. ADC #$3E
  861. ENDQUADCHK: RTS
  862.  
  863. CALCFRAME: LDA $D8,x
  864. SEC
  865. SBC $96
  866. STA !FC_TEMP2
  867. LDA $14D4,x
  868. SBC $97
  869. STA !FC_TEMP2+1
  870. BNE HORZDIST
  871. LDA !FC_TEMP2
  872. BNE HORZDIST
  873. BRA SETHORZ
  874. HORZDIST: LDA $E4,x
  875. SEC
  876. SBC $94
  877. STA !FC_TEMP1
  878. LDA $14E0,x
  879. SBC $95
  880. STA !FC_TEMP1+1
  881. BNE BEGINMATH
  882. LDA !FC_TEMP1
  883. BNE BEGINMATH
  884. BRA SETVERT
  885. BEGINMATH: PHP
  886. REP #$20
  887. LDA !FC_TEMP2
  888. BPL CHKXDIST
  889. EOR #$FFFF
  890. INC A
  891. STA !FC_TEMP2
  892. CHKXDIST: LDA !FC_TEMP1
  893. BPL MULT
  894. EOR #$FFFF
  895. INC A
  896. STA !FC_TEMP1
  897. MULT: ASL A
  898. ASL A
  899. ASL A
  900. ASL A
  901. STA !FC_TEMP3
  902. LDA !FC_TEMP1
  903. CLC
  904. ADC !FC_TEMP2
  905. STA !FC_TEMP4
  906. LDY #$00
  907. LDA !FC_TEMP4
  908. DEC A
  909. DIVLOOP: CMP !FC_TEMP3
  910. BCS END_DIVIDE
  911. INY
  912. CLC
  913. ADC !FC_TEMP4
  914. BRA DIVLOOP
  915. END_DIVIDE: TYA
  916. PLP
  917. RTS
  918. SETHORZ: LDA #$0F
  919. RTS
  920. SETVERT: LDA #$00
  921. RTS
  922.  
  923. ;; PROJECTILE SPEEDS FOR EACH ANGLE
  924. ;; you can make your own speeds with, using http://smwedit.awardspace.com/_TEMP2.php as an aid,
  925. ;; but that tool won't do all the calculations for you (it'll only calculate the second half of X and Y)
  926. ;; Default settings:
  927. ;; Degrees: 180 (don't change)
  928. ;; Frames: 30 (don't change)
  929. ;; Radius: 64 (CHANGE THIS, THIS IS THE BASE SPEED)
  930. ;; Bytes: 1 (don't change)
  931. ;; #'s/line: 4 (don't change)
  932. ;; Add end frame: YES
  933.  
  934. XSPEEDS: db $00,$07,$0D,$14
  935. db $1A,$20,$26,$2B
  936. db $30,$34,$37,$3A
  937. db $3D,$3F,$40,$40
  938. db $40,$3F,$3D,$3A
  939. db $37,$34,$30,$2B
  940. db $26,$20,$1A,$14
  941. db $0D,$07,$00
  942. db $00,$F9,$F3,$EC
  943. db $E6,$E0,$DA,$D5
  944. db $D0,$CC,$C9,$C6
  945. db $C3,$C1,$C0,$C0
  946. db $C0,$C1,$C3,$C6
  947. db $C9,$CC,$D0,$D5
  948. db $DA,$E0,$E6,$EC
  949. db $F3,$F9,$00
  950.  
  951. YSPEEDS: db $C0,$C0,$C1,$C3
  952. db $C6,$C9,$CC,$D0
  953. db $D5,$DA,$E0,$E6
  954. db $EC,$F3,$F9,$00
  955. db $07,$0D,$14,$1A
  956. db $20,$26,$2B,$30
  957. db $34,$37,$3A,$3D
  958. db $3F,$40,$40
  959. db $40,$40,$3F,$3D
  960. db $3A,$37,$34,$30
  961. db $2B,$26,$20,$1A
  962. db $14,$0D,$07,$00
  963. db $F9,$F3,$EC,$E6
  964. db $E0,$DA,$D5,$D0
  965. db $CC,$C9,$C6,$C3
  966. db $C1,$C0,$C0
  967.  
  968. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  969. ; SUB_VERT_POS
  970. ; This routine determines if Mario is above or below the sprite. It sets the Y register
  971. ; to the direction such that the sprite would face Mario
  972. ; It is ripped from $03B829
  973. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  974.  
  975. SUB_VERT_POS: LDY #$00
  976. LDA $96
  977. SEC
  978. SBC $D8,x
  979. STA $0F
  980. LDA $97
  981. SBC $14D4,x
  982. BPL SPR_L11
  983. INY
  984. SPR_L11: RTS
  985.  
  986. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  987. PhaseDurationTable: db $69,$FF,$FF,$FF,$69,$69,$69,$69,$69
  988.  
  989. GoToRandomPhase: JSL $01ACF9
  990. LDA $148D
  991. AND #$07
  992. STA $00
  993. JSL $01ACF9
  994. LDA $148D
  995. AND #$01
  996. CLC
  997. ADC $00
  998. STA !BossPhase,x
  999. TAY
  1000. LDA PhaseDurationTable,y
  1001. CMP #$69
  1002. BEQ GoToRandomPhase ;try again until you fetch a valid count
  1003. STA !PhaseTimer,x
  1004. INC !ThrowBlockCntr,x
  1005. LDA !ThrowBlockCntr,x
  1006. CMP #!ThrowBlkAt
  1007. BNE +
  1008. STZ !ThrowBlockCntr,x
  1009. JSR GenerateThrowBlockAtTop
  1010. + RTS
  1011.  
  1012. ;====================================
  1013. GenerateThrowBlockAtTop:
  1014. .GenFire TXY
  1015. LDX #$0B
  1016. .GLoop LDA $14C8,X
  1017. BEQ .Cont
  1018. DEX
  1019. BPL .GLoop
  1020. RTS
  1021.  
  1022. .Cont PHY
  1023. LDA #$09 ;set to main
  1024. STA $14C8,x ;status
  1025.  
  1026. LDA #$53 ;sprite to generate
  1027. STA $9E,x ;custom sprite
  1028. PHY
  1029. JSL $07F7D2 ;clear
  1030. PLY
  1031.  
  1032. LDA #$78
  1033. STA $E4,x
  1034. LDA $95
  1035. STA $14E0,x
  1036.  
  1037. LDA #$FF
  1038. STA $1540,x
  1039.  
  1040. LDA #$00
  1041. STA $D8,x
  1042.  
  1043. LDA #$00
  1044. STA $14D4,x
  1045.  
  1046. STZ $B6,x
  1047. STZ $AA,x
  1048. PLX
  1049. RTS
  1050.  
  1051. ; ===============================================
  1052.  
  1053. KILLED_X_SPEED: db $F0,$10
  1054.  
  1055.  
  1056. SPRITE_INTERACT: LDY #$0B ; sprite is being kicked
  1057. INTERACT_LOOP: LDA $14C8,y ; \ if the sprite status is..
  1058. CMP #$09 ; | ...shell-like
  1059. BCS PROCESS_SPRITE ; /
  1060. NEXT_SPRITE: DEY
  1061. BPL INTERACT_LOOP
  1062. RTS
  1063.  
  1064. PROCESS_SPRITE: PHX
  1065. TYX
  1066. JSL $03B6E5 ; get sprite clipping B routine
  1067. PLX
  1068. JSR GetSpriteClipping ; get sprite clipping A routine
  1069. JSL $03B72B ; check for contact routine
  1070. BCC NEXT_SPRITE
  1071.  
  1072. PHX
  1073. TYX
  1074.  
  1075. JSL $01AB72 ; show sprite contact gfx routine
  1076.  
  1077. LDA #$02 ; \ Kill thrown sprite
  1078. STA $14C8,x ; /
  1079.  
  1080. LDA #$D0 ; \ Set killed Y speed
  1081. STA $AA,x ; /
  1082.  
  1083. LDY #$00 ; Set killed X speed
  1084. LDA $B6,x
  1085. BPL SET_SPEED
  1086. INY
  1087.  
  1088. SET_SPEED: LDA KILLED_X_SPEED,y
  1089. STA $B6,x
  1090.  
  1091. NO_KILL: PLX
  1092.  
  1093. HANDLE_HIT: LDA #$28 ; \ Play sound effect
  1094. STA $1DFC ; /
  1095. LDA #$47 ; \ Play sound effect
  1096. STA $1DFC ; /
  1097.  
  1098. LDA #$01 ; \ Set stunned state
  1099. STA $C2,x ; /
  1100.  
  1101. LDA #$20 ; \ Set stunned timer
  1102. STA $1564,x ; /
  1103.  
  1104. DEC !Hitpoints,x ; Increase hit counter and...
  1105. LDA !Hitpoints,x ; \ Check if the sprite has been hit 3 times
  1106. BNE JustHit
  1107.  
  1108. LDA #$02 ; \ Kill sprite
  1109. STA $14C8,x ;
  1110. LDA #$D0
  1111. STA $AA,x
  1112. LDA #$10
  1113. STA $B6,x
  1114. RTS
  1115.  
  1116. JustHit: LDA #$FF
  1117. STA !PhaseTimer,x
  1118. LDA #$08
  1119. STA !BossPhase,x
  1120.  
  1121. LDA #$28
  1122. STA $1DFC
  1123. RTS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement