mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-12-29 00:31:52 +00:00
361 lines
4.2 KiB
ArmAsm
361 lines
4.2 KiB
ArmAsm
|
; Handle blast
|
||
|
|
||
|
blast0_out: .byte $0
|
||
|
blast0_start: .byte $0
|
||
|
blast0_end: .byte $0
|
||
|
blast0_y: .byte $0
|
||
|
blast0_direction: .byte $0
|
||
|
blast0_count: .byte $0
|
||
|
|
||
|
;=========================
|
||
|
; fire blast
|
||
|
;=========================
|
||
|
|
||
|
fire_blast:
|
||
|
|
||
|
lda blast0_out
|
||
|
bne done_fire_blast
|
||
|
|
||
|
lda PHYSICIST_X
|
||
|
|
||
|
ldx DIRECTION ; 0=left, 1=right
|
||
|
beq blast_facing_left
|
||
|
|
||
|
clc
|
||
|
adc #5
|
||
|
jmp blast_done_adjust
|
||
|
|
||
|
|
||
|
blast_facing_left:
|
||
|
sec
|
||
|
sbc #2
|
||
|
|
||
|
blast_done_adjust:
|
||
|
|
||
|
sta COLLISION_X
|
||
|
lda PHYSICIST_Y
|
||
|
sta COLLISION_Y
|
||
|
|
||
|
; activate blast slot
|
||
|
|
||
|
inc blast0_out
|
||
|
|
||
|
; reduce gun charge
|
||
|
; FIXME: don't shoot if too low
|
||
|
lda GUN_CHARGE
|
||
|
sec
|
||
|
sbc #10
|
||
|
sta GUN_CHARGE
|
||
|
|
||
|
; reset blast count
|
||
|
|
||
|
lda #0
|
||
|
sta blast0_count
|
||
|
|
||
|
; set y
|
||
|
|
||
|
lda PHYSICIST_Y
|
||
|
clc
|
||
|
adc #4
|
||
|
|
||
|
ldx PHYSICIST_STATE
|
||
|
cpx #P_CROUCH_SHOOTING
|
||
|
bne blast_ypos_done
|
||
|
|
||
|
blast_crouch:
|
||
|
clc
|
||
|
adc #4
|
||
|
blast_ypos_done:
|
||
|
|
||
|
sta blast0_y
|
||
|
|
||
|
; set direction
|
||
|
|
||
|
lda DIRECTION
|
||
|
sta blast0_direction
|
||
|
|
||
|
beq blast_left
|
||
|
bne blast_right
|
||
|
|
||
|
; set x
|
||
|
|
||
|
blast_left:
|
||
|
jsr calc_gun_left_collision
|
||
|
|
||
|
ldx PHYSICIST_X
|
||
|
dex
|
||
|
stx blast0_end
|
||
|
|
||
|
txa
|
||
|
sec
|
||
|
sbc #10
|
||
|
sta blast0_start
|
||
|
|
||
|
jmp done_fire_blast
|
||
|
|
||
|
blast_right:
|
||
|
jsr calc_gun_right_collision
|
||
|
|
||
|
lda PHYSICIST_X
|
||
|
clc
|
||
|
adc #5
|
||
|
sta blast0_start
|
||
|
|
||
|
clc
|
||
|
adc #10
|
||
|
sta blast0_end
|
||
|
|
||
|
done_fire_blast:
|
||
|
rts
|
||
|
|
||
|
|
||
|
;====================
|
||
|
; draw blast
|
||
|
;====================
|
||
|
|
||
|
draw_blast:
|
||
|
|
||
|
lda blast0_out
|
||
|
beq done_draw_blast
|
||
|
|
||
|
lda #$fe
|
||
|
sta hlin_color_smc+1
|
||
|
|
||
|
lda #$00
|
||
|
sta hlin_mask_smc+1
|
||
|
|
||
|
ldy blast0_y
|
||
|
|
||
|
sec
|
||
|
lda blast0_end
|
||
|
sbc blast0_start
|
||
|
tax
|
||
|
|
||
|
lda blast0_start
|
||
|
|
||
|
jsr hlin
|
||
|
|
||
|
ldy blast0_y
|
||
|
sty YPOS
|
||
|
|
||
|
lda blast0_direction
|
||
|
beq blast_going_left
|
||
|
ldy blast0_end
|
||
|
jmp blast_going_done
|
||
|
blast_going_left:
|
||
|
ldy blast0_start
|
||
|
blast_going_done:
|
||
|
sty XPOS
|
||
|
|
||
|
lda #<gun_charge_sprite8
|
||
|
sta INL
|
||
|
lda #>gun_charge_sprite8
|
||
|
sta INH
|
||
|
|
||
|
jsr put_sprite_crop
|
||
|
|
||
|
done_draw_blast:
|
||
|
|
||
|
rts
|
||
|
|
||
|
|
||
|
|
||
|
;===================
|
||
|
; move blast
|
||
|
;===================
|
||
|
move_blast:
|
||
|
lda blast0_out
|
||
|
beq done_move_blast
|
||
|
|
||
|
; slow down blast
|
||
|
lda blast0_count
|
||
|
and #$3
|
||
|
bne no_move_blast
|
||
|
|
||
|
lda blast0_direction
|
||
|
bne move_blast_right
|
||
|
|
||
|
move_blast_left:
|
||
|
|
||
|
lda blast0_count
|
||
|
cmp #4
|
||
|
bcc still_starting_blast_left
|
||
|
cmp #8
|
||
|
bcc still_shooting_blast_left
|
||
|
|
||
|
continue_shooting_blast_left:
|
||
|
still_shooting_blast_left:
|
||
|
|
||
|
lda blast0_end
|
||
|
sec
|
||
|
sbc #10
|
||
|
sta blast0_end
|
||
|
|
||
|
still_starting_blast_left:
|
||
|
|
||
|
lda blast0_start
|
||
|
sec
|
||
|
sbc #10
|
||
|
sta blast0_start
|
||
|
|
||
|
blast_edge_detect_left:
|
||
|
|
||
|
lda blast0_end
|
||
|
cmp LEFT_SHOOT_LIMIT
|
||
|
bmi disable_blast_left
|
||
|
|
||
|
lda blast0_start
|
||
|
cmp LEFT_SHOOT_LIMIT
|
||
|
bpl no_move_blast
|
||
|
|
||
|
lda LEFT_SHOOT_LIMIT
|
||
|
sta blast0_start
|
||
|
|
||
|
jmp no_move_blast
|
||
|
|
||
|
|
||
|
move_blast_right:
|
||
|
|
||
|
lda blast0_count
|
||
|
cmp #4
|
||
|
bcc still_starting_blast_right
|
||
|
cmp #8
|
||
|
bcc still_shooting_blast_right
|
||
|
|
||
|
continue_shooting_blast_right:
|
||
|
lda blast0_start
|
||
|
clc
|
||
|
adc #10
|
||
|
sta blast0_start
|
||
|
|
||
|
still_shooting_blast_right:
|
||
|
lda blast0_end
|
||
|
clc
|
||
|
adc #10
|
||
|
sta blast0_end
|
||
|
|
||
|
still_starting_blast_right:
|
||
|
|
||
|
blast_edge_detect_right:
|
||
|
|
||
|
; detect if totally off screen
|
||
|
lda blast0_start
|
||
|
cmp RIGHT_SHOOT_LIMIT
|
||
|
bcs disable_blast_right
|
||
|
|
||
|
lda blast0_end
|
||
|
cmp RIGHT_SHOOT_LIMIT
|
||
|
bcc no_move_blast
|
||
|
|
||
|
lda RIGHT_SHOOT_LIMIT
|
||
|
sta blast0_end
|
||
|
|
||
|
no_move_blast:
|
||
|
inc blast0_count
|
||
|
|
||
|
done_move_blast:
|
||
|
|
||
|
rts
|
||
|
|
||
|
;=====================
|
||
|
; hit something, left
|
||
|
;=====================
|
||
|
disable_blast_left:
|
||
|
lda LEFT_SHOOT_TARGET
|
||
|
jmp blast_something_common
|
||
|
|
||
|
;==================
|
||
|
; hit something, right
|
||
|
;==================
|
||
|
disable_blast_right:
|
||
|
|
||
|
lda RIGHT_SHOOT_TARGET
|
||
|
|
||
|
|
||
|
;=========================
|
||
|
; blash something, common
|
||
|
;=========================
|
||
|
blast_something_common:
|
||
|
|
||
|
ldx #0
|
||
|
stx blast0_out
|
||
|
tax
|
||
|
and #$f0
|
||
|
|
||
|
cmp #TARGET_DOOR
|
||
|
beq blast_door
|
||
|
|
||
|
cmp #TARGET_ALIEN
|
||
|
beq blast_alien
|
||
|
|
||
|
cmp #TARGET_FRIEND
|
||
|
beq blast_friend
|
||
|
|
||
|
cmp #TARGET_SHIELD
|
||
|
beq blast_shield
|
||
|
|
||
|
jmp done_blasting_common
|
||
|
|
||
|
|
||
|
blast_alien:
|
||
|
txa
|
||
|
and #$f
|
||
|
tax
|
||
|
|
||
|
lda #A_DISINTEGRATING
|
||
|
sta alien_state,X
|
||
|
|
||
|
lda #0
|
||
|
sta alien_gait,X
|
||
|
|
||
|
jmp done_blasting_common
|
||
|
|
||
|
blast_friend:
|
||
|
|
||
|
lda #F_DISINTEGRATING
|
||
|
sta friend_state
|
||
|
|
||
|
lda #FAI_DISINTEGRATING
|
||
|
sta friend_ai_state
|
||
|
|
||
|
lda #0
|
||
|
sta friend_gait
|
||
|
|
||
|
jmp done_blasting_common
|
||
|
|
||
|
blast_shield:
|
||
|
|
||
|
; FIXME: need animation for this
|
||
|
|
||
|
txa
|
||
|
and #$f
|
||
|
tax
|
||
|
|
||
|
lda #0
|
||
|
sta shield_out,X
|
||
|
|
||
|
dec SHIELD_OUT
|
||
|
|
||
|
jmp done_blasting_common
|
||
|
|
||
|
blast_door:
|
||
|
|
||
|
inc BLASTED_WALL
|
||
|
|
||
|
; FIXME: change direction based on blast
|
||
|
txa
|
||
|
and #$f
|
||
|
tay
|
||
|
|
||
|
lda #DOOR_STATUS_EXPLODING1
|
||
|
sta (DOOR_STATUS),Y
|
||
|
|
||
|
jsr recalc_walk_collision
|
||
|
|
||
|
|
||
|
done_blasting_common:
|
||
|
|
||
|
rts
|
||
|
|
||
|
|