**************************************************************************** **************************************************************************** ** ** Monster for TI-89 / TI-92 Plus - Brick collision ** ** Copyright 2002 by Patrick Davidson. This software may be freely ** modified and/or copied with no restrictions. There is no warranty. ** ** by Patrick Davidson (pad@calc.org, http://pad.calc.org/) ** ** Last updated March 6, 2002 ** **************************************************************************** **************************************************************************** ****************************************** DETECT AND PROCESS HITS * * Takes (D4,D5) as X coordinates of a point on the ball. * * Changes D4-D5/A0 only. * * Finds the appropriate point in the map for this position and checks * for a brick. If one is found, takes appropriate action (such as reducing, * destroying, exploding, etc.). Returns zero flag set for no collision, * clear for a collision. * * Check_Brick_Hit expects D2/D3 to hold velocities and does all actions * needed for hitting with a ball (particularly, scoring and adjusting ball * motion randomly). * * Check_Brick_Hit_Special functions for hits by things such as lasers. * ******** Check_Brick_Hit: move.w d4,temp_x(a5) move.w d5,temp_y(a5) lsr.w #4,d4 IFD ti89 lsr.w #3,d5 ENDIF IFND ti89 ext.l d5 divu #10,d5 ENDIF mulu #18,d5 add.w d4,d5 lea map(a5),a0 add.w d5,a0 moveq #0,d4 move.b (a0),d4 add.w d4,d4 move.w brick_types(pc,d4.w),d4 tst.w brickthru(a5) beq.s \nb cmp.w #11*TILE_HEIGHT,temp_y(a5) bge.s \nb moveq #1,d5 jsr brick_types(pc,d4.w) moveq #0,d4 rts \nb: moveq #0,d5 jmp brick_types(pc,d4.w) brick_types: dc.w no_brick-brick_types dc.w solid_brick-brick_types dc.w solid_brick-brick_types dc.w solid_brick-brick_types dc.w brick_1-brick_types dc.w brick_2-brick_types dc.w solid_brick-brick_types dc.w large_topleft-brick_types dc.w large_topright-brick_types dc.w large_bottomright-brick_types dc.w large_bottomleft-brick_types dc.w solid_brick-brick_types dc.w solid_brick-brick_types Check_Brick_Hit_Special: move.w d4,temp_x(a5) move.w d5,temp_y(a5) lsr.w #4,d4 IFD ti89 lsr.w #3,d5 ENDIF IFND ti89 ext.l d5 divu #10,d5 ENDIF mulu #18,d5 add.w d4,d5 lea map(a5),a0 add.w d5,a0 moveq #0,d4 move.b (a0),d4 add.w d4,d4 move.w brick_types_special(pc,d4.w),d4 jmp brick_types(pc,d4.w) brick_types_special: dc.w no_brick-brick_types dc.w solid_brick_special-brick_types dc.w solid_brick_special-brick_types dc.w solid_brick_special-brick_types dc.w brick_1_special-brick_types dc.w brick_2-brick_types dc.w solid_brick_special-brick_types dc.w large_topleft-brick_types dc.w large_topright-brick_types dc.w large_bottomright-brick_types dc.w large_bottomleft-brick_types dc.w solid_brick_special-brick_types dc.w solid_brick_special-brick_types no_brick: moveq #0,d4 rts solid_brick: bne.s solid_brick_special moveq #2,d4 bsr random add.w d4,d4 ; randomly 1 or -1 subq.w #1,d4 add.w b_angle(a6),d4 ; add angle to this move.w d4,b_angle(a6) bge.s \bigenough ; trying -1, go to 2 instead move.w #2,b_angle(a6) rts \bigenough: cmp.w #17,d4 blt.s solid_brick_special move.w #15,b_angle(a6) ; trying 17, go to 14 instead solid_brick_special: rts brick_1_normal: sf (a0) move.w temp_x(a5),d4 and.w #$fff0,d4 move.w temp_y(a5),d5 and.w #$fff8,d5 bsr Deploy_Bonus subq.w #1,bricks_left(a5) rts brick_1: bsr.s brick_1_normal pea (a1) lea score_inc+4(a5),a0 lea score+4(a5),a1 bsr Add_BCD moveq #5,d4 lea temp_buffer(a5),a0 move.l d4,(a0)+ lea score_inc+4(a5),a1 bsr Add_BCD move.l (sp)+,a1 rts brick_1_special: bsr.s brick_1_normal pea (a1) lea score+4(a5),a1 lea temp_buffer(a5),a0 move.l #$40,(a0)+ bsr Add_BCD move.l (sp)+,a1 rts brick_2: subq.b #1,(a0) rts large_bottomright: subq.l #1,a0 large_bottomleft: lea -18(a0),a0 bra.s large_topleft large_topright: subq.l #1,a0 large_topleft: moveq #4,d4 move.b d4,(a0)+ move.b d4,(a0) move.b d4,17(a0) move.b d4,18(a0) rts