; draw/move laser ; o/~ carrying a laser, down the road that I must travel o/~ ; o/~ carrying a laser, in the darkness of the night o/~ ;==================== ; move laser ;==================== move_laser: lda LASER_OUT beq done_move_laser lda LASER_X clc adc LASER_DIRECTION sta LASER_X laser_check_tiles: ; collision detect with tiles ; laser location is roughly ; (y/4)*16 + (x/2) - 2 lda LASER_Y lsr lsr asl asl asl asl sta LASER_TILE lda LASER_X lsr clc adc LASER_TILE sec sbc #2 sta LASER_TILE ldx LASER_TILE lda tilemap,X cmp #ALLHARD_TILES bcs destroy_laser laser_check_enemies: ; collision detect with enemies jsr laser_enemies ; detect if off screen laser_check_right: lda LASER_X cmp #31 bcc laser_check_left ; not_too_far_right bcs destroy_laser laser_check_left: cmp #6 bcs done_move_laser bcc destroy_laser destroy_laser: lda #0 sta LASER_OUT done_move_laser: rts ;==================== ; draw laser ;==================== draw_laser: lda LASER_OUT beq done_draw_laser lda LASER_X sta XPOS lda LASER_Y sta YPOS ; lda LASER_DIRECTION lda #laser_sideways_sprite sta INH jsr put_sprite_crop done_draw_laser: rts laser_sideways_sprite: .byte 4,1 ; .byte $3A,$cA,$3A,$cA .byte $A3,$Ac,$A3,$Ac ;======================= ; laser enemies ;======================= ; see if laser hits any enemies laser_enemies: ldy #0 laser_enemies_loop: ; see if out lda enemy_data+ENEMY_DATA_OUT,Y beq done_laser_enemy ; get local tilemap co-ord sec lda enemy_data+ENEMY_DATA_TILEX,Y sbc TILEMAP_X sta TILE_TEMP sec lda enemy_data+ENEMY_DATA_TILEY,Y sbc TILEMAP_Y asl asl asl asl clc adc TILE_TEMP cmp LASER_TILE bne done_laser_enemy ; hit something hit_something: lda #0 sta LASER_OUT sta FRAMEL ; sta enemy_data+ENEMY_DATA_OUT,Y lda #1 sta enemy_data+ENEMY_DATA_EXPLODING,Y ; jsr enemy_noise ; jsr inc_score_by_10 jmp exit_laser_enemy done_laser_enemy: tya clc adc #8 tay cpy #(NUM_ENEMIES*8) bne laser_enemies_loop exit_laser_enemy: rts