From 26a4a66e4a36ce1580971f9a8e92f41263a09f86 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Sun, 11 Jun 2023 00:52:09 -0400 Subject: [PATCH] sb: shield work mostly works --- games/sb/asplode.s | 136 ++++++++++++++++++++++++++++++++++++++-- games/sb/asplode_head.s | 30 ++++++++- 2 files changed, 158 insertions(+), 8 deletions(-) diff --git a/games/sb/asplode.s b/games/sb/asplode.s index ec9df4e8..8f09a81b 100644 --- a/games/sb/asplode.s +++ b/games/sb/asplode.s @@ -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 diff --git a/games/sb/asplode_head.s b/games/sb/asplode_head.s index 40f7918d..b4088f89 100644 --- a/games/sb/asplode_head.s +++ b/games/sb/asplode_head.s @@ -23,12 +23,13 @@ asplode_loop: jsr hgr_copy ;========================== - ; draw head + ; draw big head ;========================== - 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