sb: shield work mostly works

This commit is contained in:
Vince Weaver 2023-06-11 00:52:09 -04:00
parent d64015eae6
commit 26a4a66e4a
2 changed files with 158 additions and 8 deletions

View File

@ -17,6 +17,24 @@
; if it misses you, makes small explosion, starts again at far wall
; with same X as it went off screen with
; things missing from real game
; some of the animations (both of player and head being destroyed)
; there are some pauses after things happen
;
; Notes
; collision detection on shield should really be 16 bit, some things
; get past the shield check but then collide on the next frame
; sprite routines cheat in a lot of ways. assume blue/orange
; assume X only in 3.5 pixel offsets
; do minimal transparency using black0
; Challenges:
; moving such huge sprites
; fitting all in RAM
; sound
.include "zp.inc"
.include "hardware.inc"
@ -331,7 +349,7 @@ check_player_collide:
sbc PLAYER_X
cmp #2
bcc skip_check_player_collide ; blt
cmp #6
cmp #8
bcs skip_check_player_collide
jmp asplode_asplode
@ -339,24 +357,126 @@ check_player_collide:
skip_check_player_collide:
;===========================
; check shield
; check shield collide
; only if Y=15 and YDIR=1
check_shield_collide:
lda BULLET_Y
cmp #15
bne skip_check_shield_collide
beq do_check_shields
jmp skip_check_shield_collide
do_check_shields:
; sorta-random number in X
ldx FRAME
lda $6000,X ; from source code
and #$3
tax
lda SHIELD_POSITION
beq skip_check_shield_collide ; 0 means DOWN
; flip dir
shields_up:
; our rules
; SHIELD_X_VEL maxes at 1/-1
; hitting shield left subs random $10/$20/$20/$40
; hitting shield right adds random $10/$20/$20/$40
; hitting shield center adds/subs random $10/$20
; TODO: sound
cmp #SHIELD_UP_RIGHT
beq check_hit_shield_right
cmp #SHIELD_UP_CENTER
beq check_hit_shield_center
check_hit_shield_left:
sec
lda BULLET_X
sbc PLAYER_X
cmp #1
bcc skip_check_shield_collide ; blt
cmp #7
bcs skip_check_shield_collide ; bge
hit_shield_left:
sec
lda BULLET_X_VEL_L
sbc bullet_vals,X
sta BULLET_X_VEL_L
lda BULLET_X_VEL
sbc #0
sta BULLET_X_VEL
jmp done_hit_shield
check_hit_shield_right:
sec
lda BULLET_X
sbc PLAYER_X
cmp #4
bcc skip_check_shield_collide ; blt
cmp #10
bcs skip_check_shield_collide
hit_shield_right:
clc
lda BULLET_X_VEL_L
adc bullet_vals,X
sta BULLET_X_VEL_L
lda BULLET_X_VEL
adc #0
sta BULLET_X_VEL
jmp done_hit_shield
check_hit_shield_center:
sec
lda BULLET_X
sbc PLAYER_X
cmp #2
bcc skip_check_shield_collide ; blt
cmp #8
bcs skip_check_shield_collide ; bge
hit_shield_center:
cpx #1
bcs center_left
clc
lda BULLET_X_VEL_L
adc bullet_vals_center,X
sta BULLET_X_VEL_L
lda BULLET_X_VEL
adc #0
sta BULLET_X_VEL
jmp done_hit_shield
center_left:
sec
lda BULLET_X_VEL_L
sbc bullet_vals_center,X
sta BULLET_X_VEL_L
lda BULLET_X_VEL
sbc #0
sta BULLET_X_VEL
; jmp done_hit_shield
done_hit_shield:
; max at $1/$00 or $FF/$00
; flip ydir
lda #0
sta BULLET_YDIR
; TODO: sound
skip_check_shield_collide:
;===========================
@ -607,6 +727,12 @@ bullet_sprite_y:
.byte 143,148,153,158
.byte 163
bullet_vals:
.byte $10,$20,$20,$40
bullet_vals_center:
.byte $20,$00,$00,$20
; original
; 1 = 6
; 2 = 12

View File

@ -23,12 +23,13 @@ asplode_loop:
jsr hgr_copy
;==========================
; draw head
; draw big head
;==========================
lda #<big_head0_sprite
ldx HEAD_DAMAGE
lda head_sprites_l,X
sta INL
lda #>big_head0_sprite
lda head_sprites_h,X
sta INH
lda #16 ; center
sta SPRITE_X
@ -45,8 +46,22 @@ asplode_loop:
sta INL
lda asplode_sprite_h,X
sta INH
cpx #11
bcs use_hardcoded_x
ldy BULLET_X
dey
tya
jmp asplode_it_x
use_hardcoded_x:
lda asplode_sprite_x,X
asplode_it_x:
sta SPRITE_X
lda asplode_sprite_y,X
sta SPRITE_Y
jsr hgr_draw_sprite_big
@ -153,6 +168,15 @@ done_asplode_head:
lda #20
jsr long_wait ; tail call
; reset things
lda #0
sta SHIELD_POSITION
sta BULLET_Y
lda #1
sta BULLET_YDIR
rts