Guest User

Untitled

a guest
Jun 15th, 2020
48
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Sprite_10310:
  2. Obj17:
  3.     moveq    #0,d0
  4.     move.b    routine(a0),d0
  5.     move.w    Obj17_Index(pc,d0.w),d1
  6.     jmp    Obj17_Index(pc,d1.w)
  7. ; ===========================================================================
  8. ; off_1031E:
  9. Obj17_Index:    offsetTable
  10.         offsetTableEntry.w Obj17_Init        ; 00 Load object art and mappings
  11.         offsetTableEntry.w Obj17_Idle        ; 02
  12.         offsetTableEntry.w Obj17_Touched       ; 04
  13.         offsetTableEntry.w Obj17_Align       ; 06
  14.         offsetTableEntry.w Obj17_Charge      ; 08
  15.         offsetTableEntry.w Obj17_Delay       ; 0A
  16.         ;offsetTableEntry.w Obj17_Display     ; 02 Display the object on screen
  17. ; ===========================================================================
  18. ; loc_10324: Obj17_Main:
  19. Obj17_Init:
  20.     ;addq.b    #2,routine(a0)
  21.     move.l    #Obj17_MapUnc,mappings(a0)
  22.     move.w    #make_art_tile(ArtTile_ArtNem_Pole,1,0),art_tile(a0)
  23.     move.b    #4,render_flags(a0)
  24.     move.b    #3,priority(a0)
  25.     move.b    #8,width_pixels(a0)
  26.     move.w    x_pos(a0),$3C(a0) ;store x and y spawn positions
  27.     move.w    y_pos(a0),$3E(a0) ;''
  28.  
  29. Obj17_Reset:
  30.         move.b    #$02,routine(a0)              ; advance to next routine (for next frame)
  31.     move.b    #$40|$0F,collision_flags(a0)
  32.  
  33. ;---------------------------------------------
  34. ;Obj17_Idle
  35. ;---------------------------------------------
  36.  
  37. Obj17_Idle:
  38.     move.l  #$FFFFFF80,d2               ; prepare subtraction/and value
  39.     move.w  $3C(a0),d0              ; load object's original X spawn position
  40.     and.w   d2,d0                   ; wrap to nearest object load block
  41.     move.w  (Camera_X_pos).w,d1         ; load screen's X position
  42.     add.w   d2,d1                   ; move left a load block (include block to left of screen)
  43.     and.w   d2,d1                   ; wrap to nearest object load block
  44.     sub.w   d1,d0                   ; subtract from object's X spawn position
  45.     cmpi.w  #$0300-$80,d0               ; is the object still within the load area? (-$80 to +$2FF relative to screen)
  46.     bhi.w   DeleteObject                ; if not, branch to delete the object (it's gone out of range)
  47.     bra.w   DisplaySprite               ; save object to priority list for display
  48.  
  49. ; ---------------------------------------------------------------------------
  50. ; Object 17 - 04 - Sonic touched the cannon
  51. ; ---------------------------------------------------------------------------
  52.  
  53. Obj17_Touched:
  54.         sf.b  $20(a0)                   ; clear touch/collision response
  55.         move.b  #$81,($FFFFF7C8).w          ; force lock Sonic (no physics, control, gravity etc)
  56.         lea  ($FFFFB000).w,a1           ; load Sonic's object RAM slot
  57.         move.b  AniIDSonAni_Roll,$1C(a1)                ; set Sonic's animation to rolling
  58.         moveq   #$00,d0                 ; clear d0
  59.         move.l  d0,x_vel(a1)                ; clear Sonic's X and Y speed
  60.         move.w  d0,inertia(a1)              ; clear Sonic's ground speed
  61.         move.b  $22(a0),d0              ; load object's status
  62.         andi.b  #%00000001,d0               ; get only the mirror (left/right facing) status
  63.         ori.b   #%00000110,d0               ; set Sonic's "in-air" and "roll" status bits
  64.         move.b  d0,$22(a1)              ; set Sonic's direction/status correctly
  65.         sf.b    $3C(a1)                 ; clear "height cap" flag (prevent release jump buttons effect)
  66.         move.b  #$02,$24(a1)                ; ensure Sonic is in normal control mode
  67.         addq.b  #$02,$24(a0)                ; advance to next routine (for next frame)
  68.  
  69. ; ---------------------------------------------------------------------------
  70. ; Object 17 - 06 - aligning Sonic towards centre of cannon
  71. ; ---------------------------------------------------------------------------
  72.  
  73. Obj17_Align:
  74.         lea ($FFFFB000).w,a1            ; load Sonic's object RAM slot
  75.         move.w  x_pos(a1),d1                ; load Sonic's X and Y positions
  76.         move.w  y_pos(a1),d2                ; ''
  77.         sub.w   x_pos(a0),d1                ; subtract cannon's X and Y to get the distance
  78.         sub.w   y_pos(a0),d2                ; ''
  79.         move.w  d1,d0                   ; check if Sonic is at object on X and Y already
  80.         or.w    d2,d0                   ; ''
  81.         beq.s   Obj17_AlignFinish           ; if so, branch
  82.         jsr     CalcAngle               ; get the angle Sonic is from the cannon (00 - FF inside d0)
  83.         jsr     CalcSine                ; get the sine/cosine (X and Y) using the angle in d0
  84.         ext.l   d1                  ; sign extend to long-word
  85.         ext.l   d0                  ; ''
  86.         asl.l   #$08,d1                 ; multiply X and Y to x10000
  87.         asl.l   #$08,d0                 ; ''
  88.         sub.l   d1,x_pos(a1)                ; move Sonic towards the object on X
  89.         sub.l   d0,y_pos(a1)                ; move Sonic towards the object on Y
  90.         bra.w   Obj17_Idle              ; continue for deletion check and display
  91.  
  92. Obj17_AlignFinish:
  93.         addq.b  #$02,$24(a0)                ; advance to next routine (for next frame)
  94.         move.b  #$10,$3B(a0)                ; set charge timer
  95.         ;move.w SndID_DoorSlam,d0               ; play charge/lock SFX
  96.         jsr (PlaySound).l           ; ''
  97.  
  98. ; ---------------------------------------------------------------------------
  99. ; Object 17 - 08 - charging and firing the cannon
  100. ; ---------------------------------------------------------------------------
  101.  
  102. Obj17_Charge:
  103.         addq.w  #$01,x_pos(a0)              ; move cannon down
  104.         subq.w  #$01,y_pos(a0)              ; move cannon left
  105.         btst.b  #$00,$22(a0)                ; is object facing right?
  106.         beq.s   Obj17_ChargeRight           ; if so, branch
  107.         addq.w  #$01+1,$08(a0)              ; move cannon right instead
  108.  
  109. Obj17_ChargeRight:
  110.         subq.b  #$01,$3B(a0)                ; minus 1 from charge timer
  111.         bcc.w   Obj17_Idle              ; if not finished, branch
  112.         move.w  $3C(a0),x_pos(a0)               ; restore cannon's X position
  113.         move.w  $3E(a0),y_pos(a0)               ; restore cannon's Y position
  114.         move.l  #$0C00F400,($FFFFB010).w        ; set Sonic's X and Y speeds (up and right)
  115.         btst.b  #$00,$22(a0)                ; is the cannon facing right?
  116.         beq.s   Obj17_ReleaseRight          ; if so, branch
  117.         neg.w   ($FFFFB010).w               ; reverse Sonic's X speed
  118.  
  119. Obj17_ReleaseRight:
  120.         sf.b    ($FFFFF7C8).w               ; release Sonic
  121.         move.b  #$60,$3B(a0)                ; set delay time before allowing cannon to activate again
  122.         addq.b  #$02,$24(a0)                ; increase routine counter
  123.         ;move.w SndID_Teleport,d0               ; play release SFX
  124.         jsr (PlaySound).l           ; ''
  125.  
  126. ; ---------------------------------------------------------------------------
  127. ; Object 17 - 0A - delaying to give Sonic time to shoot away from object
  128. ; ---------------------------------------------------------------------------
  129.  
  130. Obj17_Delay:
  131.         subq.b  #$01,$3B(a0)                ; minus 1 from delay timer
  132.         bcc.w   Obj17_Idle              ; if not finished, branch
  133.         bra.w   Obj17_Reset             ; branch to reset routine counter and collision/touch
  134.  
  135.  
  136. ; ===========================================================================
  137. ; loc_1044A:
  138. Obj17_Display:
  139.     bra.w    DisplaySprite
  140. ; ===========================================================================
  141. ; ===========================================================================
RAW Paste Data