Dandaman955

SLZ3 Boss Code Analysis (Unfinished)

Jul 8th, 2020
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.38 KB | None | 0 0
  1. Obj7A_Delete:
  2. jmp DeleteObject
  3. ; ===========================================================================
  4. ; ---------------------------------------------------------------------------
  5. ; Object 7A - Eggman (SLZ)
  6. ; ---------------------------------------------------------------------------
  7.  
  8. Obj7A: ; XREF: Obj_Index
  9. moveq #0,d0
  10. move.b $24(a0),d0
  11. move.w Obj7A_Index(pc,d0.w),d1
  12. jmp Obj7A_Index(pc,d1.w)
  13. ; ===========================================================================
  14. Obj7A_Index: dc.w Obj7A_Main-Obj7A_Index
  15. dc.w Obj7A_ShipMain-Obj7A_Index
  16. dc.w Obj7A_FaceMain-Obj7A_Index
  17. dc.w Obj7A_FlameMain-Obj7A_Index
  18. dc.w Obj7A_TubeMain-Obj7A_Index
  19.  
  20. Obj7A_ObjData: dc.b 2, 0, 4 ; routine number, animation, priority
  21. dc.b 4, 1, 4
  22. dc.b 6, 7, 4
  23. dc.b 8, 0, 3
  24. ; ===========================================================================
  25.  
  26. Obj7A_Main: ; XREF: Obj7A_Index
  27. move.w #$2188,8(a0) ; starting x pos
  28. move.w #$228,$C(a0) ; starting y pos
  29. move.w 8(a0),$30(a0) ; copy for boss moving routine.
  30. move.w $C(a0),$38(a0) ; ''
  31. move.b #$F,$20(a0) ; set hitbox.
  32. move.b #8,$21(a0) ; set number of hits to 8
  33. lea Obj7A_ObjData(pc),a2
  34. movea.l a0,a1
  35. moveq #3,d1 ; object is split into 4 parts.
  36. bra.s Obj7A_LoadBoss
  37. ; ===========================================================================
  38.  
  39. Obj7A_Loop:
  40. jsr SingleObjLoad2 ; find free obj space
  41. bne.s loc_1895C ; if there isn't, don't load the rest
  42. move.b #$7A,0(a1) ; load the boss obj
  43. move.w 8(a0),8(a1) ; copy x pos to obj
  44. move.w $C(a0),$C(a1) ; copy y pos to obj
  45.  
  46. Obj7A_LoadBoss: ; XREF: Obj7A_Main
  47. bclr #0,$22(a0) ; set x orientation
  48. clr.b $25(a1) ; clear the second routine counter
  49. move.b (a2)+,$24(a1) ; load the ship/face/flame/tube each pass
  50. move.b (a2)+,$1C(a1) ; copy the respective anim id
  51. move.b (a2)+,$18(a1) ; set sprite priorities
  52. move.l #Map_Eggman,4(a1) ; set eggman sprite mappings
  53. move.w #$400,2(a1) ; set maptile value
  54. move.b #4,1(a1) ; use playfield coords
  55. move.b #$20,$19(a1) ; set horiz radius
  56. move.l a0,$34(a1) ; store source object addr in ram
  57. dbf d1,Obj7A_Loop ; repeat sequence 3 more times
  58.  
  59. loc_1895C:
  60. lea ($FFFFD040).w,a1 ; load obj ram space
  61. lea $2A(a0),a2 ; load dedicated space in boss' ram to store available seesaw addresses
  62. moveq #$5E,d0 ; seesaw obj id
  63. moveq #$3E,d1 ; check 3F*40 times
  64.  
  65. loc_18968:
  66. cmp.b (a1),d0 ; is it a seesaw
  67. bne.s loc_18974 ; if not branch
  68. tst.b $28(a1)
  69. beq.s loc_18974
  70. move.w a1,(a2)+ ; copy seesaw address to boss' ram
  71. ; DANGER - Routine doesn't set a bound for 3 seesaws,
  72. yet only has slots for 3 seesaws. It does this for 3F*40 times
  73. so theoretically, adding more seesaws through hacking or
  74. debug might flood ram and bug/crash the game through
  75. corrupting obj ram.
  76.  
  77. loc_18974:
  78. adda.w #$40,a1 ; load next obj slot
  79. dbf d1,loc_18968 ; loop 3F*40 times
  80.  
  81. Obj7A_ShipMain: ; XREF: Obj7A_Index
  82. moveq #0,d0 ; clear d0
  83. move.b $25(a0),d0 ; load the routine counter value
  84. move.w Obj7A_ShipIndex(pc,d0.w),d0 ; get the routine distance
  85. jsr Obj7A_ShipIndex(pc,d0.w) ; jump to it
  86. lea (Ani_Eggman).l,a1 ; load eggman ani scripts
  87. jsr AnimateSprite ; run them
  88. moveq #3,d0 ; prepare x/y flip
  89. and.b $22(a0),d0 ; get obj status
  90. andi.b #$FC,1(a0) ; clear stored x/y flip bits
  91. or.b d0,1(a0) ; update and set x/y flip
  92. jmp DisplaySprite ; write to sprite buffer
  93. ; ===========================================================================
  94. Obj7A_ShipIndex:dc.w loc_189B8-Obj7A_ShipIndex
  95. dc.w loc_18A5E-Obj7A_ShipIndex
  96. dc.w Obj7A_MakeBall-Obj7A_ShipIndex
  97. dc.w loc_18B48-Obj7A_ShipIndex
  98. dc.w loc_18B80-Obj7A_ShipIndex
  99. dc.w loc_18BC6-Obj7A_ShipIndex
  100. ; ===========================================================================
  101.  
  102. ; init boss starting pos
  103. loc_189B8: ; XREF: Obj7A_ShipIndex
  104. move.w #-$100,$10(a0) ; Set an xvel of 1px left
  105. cmpi.w #$2120,$30(a0) ; Has the ship reached x-2120?
  106. bcc.s loc_189CA ; If it hasn't, branch.
  107. addq.b #2,$25(a0) ; begin regular movement on next obj pass (loc_18A5E)
  108.  
  109. ; Updates boss movement
  110. loc_189CA:
  111. bsr.w BossMove ; set new boss move values in $30/$38
  112. move.b $3F(a0),d0 ; load boss bob counter
  113. addq.b #2,$3F(a0) ; increment the counter
  114. jsr (CalcSine).l ; generate next sinusoidal height
  115. asr.w #6,d0 ; divide by 0x40, keep amplitude sign
  116. add.w $38(a0),d0 ; add new boss vertical values
  117. move.w d0,$C(a0) ; set vertical position
  118. move.w $30(a0),8(a0) set horizontal position.
  119. bra.s loc_189FE ; jump to <-
  120. ; ===========================================================================
  121. ; copies new boss movement without bob, used for fleeing
  122. loc_189EE:
  123. bsr.w BossMove ; store next x/y movement in $30/$38
  124. move.w $38(a0),$C(a0) ; update vpos
  125. move.w $30(a0),8(a0) ; update hpos
  126.  
  127. loc_189FE:
  128. cmpi.b #6,$25(a0) ; is the boss running a 'defeated' routine?
  129. bcc.s locret_18A44 ; if it is, just run anims etc.
  130. tst.b $22(a0)
  131. bmi.s loc_18A46
  132. tst.b $20(a0)
  133. bne.s locret_18A44
  134. tst.b $3E(a0)
  135. bne.s loc_18A28
  136. move.b #$20,$3E(a0) ; Set vulnerability counter to 32 frames.
  137. move.w #$AC,d0 ; load boss hit sound id
  138. jsr (PlaySound_Special).l ; play boss damage sound
  139.  
  140. loc_18A28:
  141. lea ($FFFFFB22).w,a1 ; Load the palette entry to flash.
  142. moveq #0,d0 : Clear d0.
  143. tst.w (a1) ; is it already white
  144. bne.s loc_18A36 ; if it is skip
  145. move.w #$EEE,d0 ; color bits for white
  146.  
  147. loc_18A36:
  148. move.w d0,(a1) ; fill first palette with white
  149. subq.b #1,$3E(a0) ; subtract from hit timer
  150. bne.s locret_18A44 ; if the boss is still invincible, branch
  151. move.b #$F,$20(a0) ; reset hitbox
  152.  
  153. locret_18A44:
  154. rts ; Finish anim/flip code in Obj7A
  155. ; ===========================================================================
  156.  
  157. loc_18A46:
  158. moveq #100,d0 ; 1000 points trimmed
  159. bsr.w AddPoints ; add to score
  160. move.b #6,$25(a0)
  161. move.b #$78,$3C(a0)
  162. clr.w $10(a0) ; stop horizontal movement
  163. rts
  164. ; ===========================================================================
  165. ; Start boss moving again after dropping bomb.
  166. loc_18A5E: ; XREF: Obj7A_ShipIndex
  167. move.w $30(a0),d0
  168. move.w #$200,$10(a0) ; set speed to 2px right
  169. btst #0,$22(a0) ; is obj x flipped (obj may 'start' facing left so right is flipped)?
  170. bne.s loc_18A7C ; if it is, branch.
  171. neg.w $10(a0) ; invert x speed
  172. cmpi.w #$2008,d0 ; has the boss reached the left limit?
  173. bgt.s loc_18A88 ; if it hasn't, branch.
  174. bra.s loc_18A82 ; set to flip facing right
  175. ; ===========================================================================
  176.  
  177. loc_18A7C:
  178. cmpi.w #$2138,d0 ; has obj reached right limit?
  179. blt.s loc_18A88 ; if it hasn't, branch
  180.  
  181. loc_18A82:
  182. bchg #0,$22(a0) ; Flip obj x orientation
  183.  
  184. loc_18A88:
  185. move.w 8(a0),d0 ; get boss xpos
  186. moveq #-1,d1 ; set d1 to $FFFFFFFF
  187. moveq #2,d2 ; check 3 seesaws
  188. lea $2A(a0),a2
  189. moveq #$28,d4
  190. tst.w $10(a0)
  191. bpl.s loc_18A9E
  192. neg.w d4
  193.  
  194. loc_18A9E:
  195. move.w (a2)+,d1
  196. movea.l d1,a3
  197. btst #3,$22(a3) ; is sonic on seesaw
  198. bne.s loc_18AB4 ; if yes check others
  199. move.w 8(a3),d3 ; get seesaw hpos
  200. add.w d4,d3
  201. sub.w d0,d3
  202. beq.s loc_18AC0 ; set to drop bomb
  203.  
  204. loc_18AB4:
  205. dbf d2,loc_18A9E
  206.  
  207. move.b d2,$28(a0) ; set as no seesaw ($FF)
  208. bra.w loc_189CA ; run boss movement
  209. ; ===========================================================================
  210.  
  211. loc_18AC0:
  212. move.b d2,$28(a0) ; store id of seesaw as subtype
  213. addq.b #2,$25(a0) ; run obj7a_makeball on next pass
  214. move.b #$28,$3C(a0) ; Set eggman freeze timer
  215. bra.w loc_189CA
  216. ; ===========================================================================
  217. ; bomb generating code
  218.  
  219. Obj7A_MakeBall: ; XREF: Obj7A_ShipIndex
  220. cmpi.b #$28,$3C(a0)
  221. bne.s loc_18B36
  222. moveq #-1,d0
  223. move.b $28(a0),d0
  224. ext.w d0
  225. bmi.s loc_18B40
  226. subq.w #2,d0
  227. neg.w d0
  228. add.w d0,d0
  229. lea $2A(a0),a1
  230. move.w (a1,d0.w),d0
  231. movea.l d0,a2
  232. lea ($FFFFD040).w,a1 ; load the rest of objram
  233. moveq #$3E,d1
  234.  
  235. loc_18AFA:
  236. cmp.l $3C(a1),d0
  237. beq.s loc_18B40
  238. adda.w #$40,a1
  239. dbf d1,loc_18AFA
  240.  
  241. move.l a0,-(sp)
  242. lea (a2),a0
  243. jsr SingleObjLoad2 bookmark
  244. movea.l (sp)+,a0
  245. bne.s loc_18B40
  246. move.b #$7B,(a1) ; load spiked ball object
  247. move.w 8(a0),8(a1) ; inherit the x position of the boss.
  248. move.w $C(a0),$C(a1) ; inherit the y position of the boss.
  249. addi.w #$20,$C(a1) ; Offset by 32px downwards.
  250. move.b $22(a2),$22(a1) ; inherit the status flags of the boss.
  251. move.l a2,$3C(a1)
  252.  
  253. loc_18B36:
  254. subq.b #1,$3C(a0)
  255. beq.s loc_18B40
  256. bra.w loc_189FE
  257. ; ===========================================================================
  258.  
  259. loc_18B40:
  260. subq.b #2,$25(a0)
  261. bra.w loc_189CA
  262. ; ===========================================================================
  263.  
  264. loc_18B48: ; XREF: Obj7A_ShipIndex
  265. subq.b #1,$3C(a0)
  266. bmi.s loc_18B52
  267. bra.w BossDefeated ; load a random .boss explosion
  268. ; ===========================================================================
  269.  
  270. loc_18B52:
  271. addq.b #2,$25(a0)
  272. clr.w $12(a0)
  273. bset #0,$22(a0)
  274. bclr #7,$22(a0)
  275. clr.w $10(a0)
  276. move.b #-$18,$3C(a0)
  277. tst.b ($FFFFF7A7).w
  278. bne.s loc_18B7C
  279. move.b #1,($FFFFF7A7).w
  280.  
  281. loc_18B7C:
  282. bra.w loc_189FE
  283. ; ===========================================================================
  284.  
  285. loc_18B80: ; XREF: Obj7A_ShipIndex
  286. addq.b #1,$3C(a0)
  287. beq.s loc_18B90
  288. bpl.s loc_18B96
  289. addi.w #$18,$12(a0)
  290. bra.s loc_18BC2
  291. ; ===========================================================================
  292.  
  293. loc_18B90:
  294. clr.w $12(a0)
  295. bra.s loc_18BC2
  296. ; ===========================================================================
  297.  
  298. loc_18B96:
  299. cmpi.b #$20,$3C(a0)
  300. bcs.s loc_18BAE
  301. beq.s loc_18BB4
  302. cmpi.b #$2A,$3C(a0)
  303. bcs.s loc_18BC2
  304. addq.b #2,$25(a0)
  305. bra.s loc_18BC2
  306. ; ===========================================================================
  307.  
  308. loc_18BAE:
  309. subq.w #8,$12(a0)
  310. bra.s loc_18BC2
  311. ; ===========================================================================
  312. ; for when the boss flees
  313. loc_18BB4:
  314. clr.w $12(a0) ; cancel vertical movement
  315. move.w #$84,d0 ; load slz music id
  316. jsr (PlaySound).l ; play SLZ music
  317.  
  318. loc_18BC2:
  319. bra.w loc_189EE ; make the boss move.
  320. ; ===========================================================================
  321.  
  322. loc_18BC6: ; XREF: Obj7A_ShipIndex
  323. move.w #$400,$10(a0)
  324. move.w #-$40,$12(a0)
  325. cmpi.w #$2160,($FFFFF72A).w
  326. bcc.s loc_18BE0
  327. addq.w #2,($FFFFF72A).w
  328. bra.s loc_18BE8
  329. ; ===========================================================================
  330.  
  331. loc_18BE0:
  332. tst.b 1(a0)
  333. bpl.w Obj7A_Delete
  334.  
  335. loc_18BE8:
  336. bsr.w BossMove
  337. bra.w loc_189CA
  338. ; ===========================================================================
  339.  
  340. Obj7A_FaceMain: ; XREF: Obj7A_Index
  341. moveq #0,d0
  342. moveq #1,d1
  343. movea.l $34(a0),a1
  344. move.b $25(a1),d0
  345. cmpi.b #6,d0
  346. bmi.s loc_18C06
  347. moveq #$A,d1
  348. bra.s loc_18C1A
  349. ; ===========================================================================
  350.  
  351. loc_18C06:
  352. tst.b $20(a1)
  353. bne.s loc_18C10
  354. moveq #5,d1
  355. bra.s loc_18C1A
  356. ; ===========================================================================
  357.  
  358. loc_18C10:
  359. cmpi.b #4,($FFFFD024).w
  360. bcs.s loc_18C1A
  361. moveq #4,d1
  362.  
  363. loc_18C1A:
  364. move.b d1,$1C(a0)
  365. cmpi.b #$A,d0
  366. bne.s loc_18C32
  367. move.b #6,$1C(a0)
  368. tst.b 1(a0)
  369. bpl.w Obj7A_Delete
  370.  
  371. loc_18C32:
  372. bra.s loc_18C6C
  373. ; ===========================================================================
  374.  
  375. Obj7A_FlameMain: ; XREF: Obj7A_Index
  376. move.b #8,$1C(a0)
  377. movea.l $34(a0),a1
  378. cmpi.b #$A,$25(a1)
  379. bne.s loc_18C56
  380. tst.b 1(a0)
  381. bpl.w Obj7A_Delete
  382. move.b #$B,$1C(a0)
  383. bra.s loc_18C6C
  384. ; ===========================================================================
  385.  
  386. loc_18C56:
  387. cmpi.b #8,$25(a1)
  388. bgt.s loc_18C6C
  389. cmpi.b #4,$25(a1)
  390. blt.s loc_18C6C
  391. move.b #7,$1C(a0)
  392.  
  393. loc_18C6C:
  394. lea (Ani_Eggman).l,a1
  395. jsr AnimateSprite
  396.  
  397. loc_18C78:
  398. movea.l $34(a0),a1
  399. move.w 8(a1),8(a0)
  400. move.w $C(a1),$C(a0)
  401. move.b $22(a1),$22(a0)
  402. moveq #3,d0
  403. and.b $22(a0),d0
  404. andi.b #-4,1(a0)
  405. or.b d0,1(a0)
  406. jmp DisplaySprite
  407. ; ===========================================================================
  408.  
  409. Obj7A_TubeMain: ; XREF: Obj7A_Index
  410. movea.l $34(a0),a1
  411. cmpi.b #$A,$25(a1)
  412. bne.s loc_18CB8
  413. tst.b 1(a0)
  414. bpl.w Obj7A_Delete
  415.  
  416. loc_18CB8:
  417. move.l #Map_BossItems,4(a0)
  418. move.w #$246C,2(a0)
  419. move.b #3,$1A(a0)
  420. bra.s loc_18C78
  421. ; ===========================================================================
Add Comment
Please, Sign In to add comment