keen: make keen co-ords closer to enemies

this might make things easier?
This commit is contained in:
Vince Weaver 2024-04-05 15:25:26 -04:00
parent 2fe318a13b
commit 38ded8a67c
4 changed files with 208 additions and 98 deletions

View File

@ -4,9 +4,21 @@
;========================= ;=========================
draw_keen: draw_keen:
lda KEEN_X sec
lda KEEN_TILEX
sbc TILEMAP_X
asl
clc
adc KEEN_X
sta XPOS sta XPOS
lda KEEN_Y
sec
lda KEEN_TILEY
sbc TILEMAP_Y
asl
asl
clc
adc KEEN_Y
sta YPOS sta YPOS
lda KEEN_DIRECTION lda KEEN_DIRECTION
@ -116,5 +128,3 @@ actually_draw_keen:
jsr put_sprite_crop jsr put_sprite_crop
rts rts

View File

@ -50,11 +50,17 @@ keen_start:
; but with reference to starting tilemap (0,5) should be ; but with reference to starting tilemap (0,5) should be
; 2,8? ; 2,8?
lda #2
sta KEEN_X
lda #24
sta KEEN_Y
lda #1 lda #1
sta KEEN_TILEX
lda #13
sta KEEN_TILEY
lda #0 ; offset from tile location
sta KEEN_X
lda #0
sta KEEN_Y
lda #RIGHT ; direction
sta KEEN_DIRECTION sta KEEN_DIRECTION
;==================================== ;====================================

View File

@ -13,14 +13,14 @@ TILE_COLS = 20
;========================= ;=========================
move_keen: move_keen:
lda #0 ; lda #0
sta SUPPRESS_WALK ; ???? ; sta SUPPRESS_WALK ; ????
jsr keen_get_feet_location ; get location of feet ; jsr keen_get_feet_location ; get location of feet
jsr check_falling ; check for/handle falling jsr check_falling ; check for/handle falling
jsr keen_collide ; check for right/left collision ; jsr keen_collide ; check for right/left collision
jsr handle_jumping ; handle jumping jsr handle_jumping ; handle jumping
@ -30,8 +30,8 @@ move_keen:
dec KEEN_WALKING ; decrement walk count dec KEEN_WALKING ; decrement walk count
lda SUPPRESS_WALK ; why???? ; lda SUPPRESS_WALK ; why????
bne done_move_keen ; bne done_move_keen
lda KEEN_DIRECTION ; check direction lda KEEN_DIRECTION ; check direction
bmi move_left bmi move_left
@ -39,7 +39,7 @@ move_keen:
;============================== ;==============================
; Move Keen Right ; Move Keen Right
;============================== ;==============================
; if (keen_x<22) || (tilemap_x>xmax-20) walk ; if (keen_tilex-tilemap_x<11) || (tilemap_x>96) walk
; otherwise, scroll ; otherwise, scroll
lda TILEMAP_X lda TILEMAP_X
@ -47,8 +47,10 @@ move_keen:
bcs keen_walk_right bcs keen_walk_right
lda KEEN_X ; if X more than 22 sec
cmp #22 ; scroll screen rather than keen lda KEEN_TILEX
sbc TILEMAP_X
cmp #11
bcc keen_walk_right bcc keen_walk_right
keen_scroll_right: keen_scroll_right:
@ -61,8 +63,14 @@ keen_scroll_right:
inc TILEMAP_X ; scroll screen to right inc TILEMAP_X ; scroll screen to right
inc KEEN_TILEX
jsr copy_tilemap_subset ; update tilemap jsr copy_tilemap_subset ; update tilemap
skip_keen_scroll_right: skip_keen_scroll_right:
jmp done_move_keen jmp done_move_keen
@ -74,7 +82,17 @@ keen_walk_right:
sta KEEN_XL sta KEEN_XL
bcc dwr_noflo ; if no overflow bcc dwr_noflo ; if no overflow
inc KEEN_X ; otherwise update X inc KEEN_X ; otherwise update X
lda KEEN_X
cmp #2
bne dwr_noflo
lda #0
sta KEEN_X
inc KEEN_TILEX
dwr_noflo: dwr_noflo:
jmp done_move_keen jmp done_move_keen
@ -83,15 +101,17 @@ move_left:
;============================== ;==============================
; Move Keen Left ; Move Keen Left
;============================== ;==============================
; if (keen_x>=14) || (tilemap_x=0) walk ; if (keen_tilex-tilemap_x>=7) || (tilemap_x=0) walk
; otherwise, scroll ; otherwise, scroll
lda TILEMAP_X lda TILEMAP_X
beq keen_walk_left beq keen_walk_left
lda KEEN_X ; get current X sec
cmp #14 lda KEEN_TILEX
bcs keen_walk_left ; bge ; if >=14 walk sbc TILEMAP_X
cmp #7
bcs keen_walk_left
keen_scroll_left: ; otherwise scroll keen_scroll_left: ; otherwise scroll
@ -102,6 +122,7 @@ keen_scroll_left: ; otherwise scroll
bcs skip_keen_scroll_left bcs skip_keen_scroll_left
dec TILEMAP_X ; scroll left dec TILEMAP_X ; scroll left
dec KEEN_TILEX
jsr copy_tilemap_subset jsr copy_tilemap_subset
@ -116,8 +137,20 @@ keen_walk_left:
sbc #KEEN_SPEED sbc #KEEN_SPEED
sta KEEN_XL sta KEEN_XL
bcs dwl_noflo bcs dwl_noflo
dec KEEN_X dec KEEN_X
bpl dwl_noflo
; adjust tile location
lda #1
sta KEEN_X
dec KEEN_TILEX
dwl_noflo: dwl_noflo:
jmp done_move_keen jmp done_move_keen
done_move_keen: done_move_keen:
@ -213,32 +246,52 @@ handle_jumping:
lda KEEN_JUMPING lda KEEN_JUMPING
beq done_handle_jumping ; skip if not actually jumping beq done_handle_jumping ; skip if not actually jumping
;=================================================== actually_jumping:
; scroll but only if KEEN_Y<20 (YDEFAULT)
; and TILEMAP_Y >0
lda TILEMAP_Y ; if tilemap=0, scroll keen ;===================================================
; if more than 4 tiles down the screen
; if (tilemap_y-keen_tiley)>4 then move keen
; otherwise, scroll screen, but only if tilemap_y>0
;=====================
; check if hit top of screen (shouldn't happen if collision working)
lda KEEN_TILEY ;
cmp #1 ; if hit top of screen, start falling
bcc start_falling
lda TILEMAP_Y ; if tilemap==0, scroll keen
cmp #0 ; instead of scrolling screen cmp #0 ; instead of scrolling screen
beq keen_rising beq keen_rising
; check if hit top of screen sec
lda TILEMAP_Y
sbc KEEN_TILEY
lda KEEN_Y ; cmp #4 ; compare to middle of screen
cmp #2 ; if hit top of screen, start falling
bcc start_falling
cmp #YDEFAULT ; compare to middle of screen
bcc scroll_rising ; blt bcc scroll_rising ; blt
; move keen ; move keen
keen_rising: keen_rising:
dec KEEN_Y
dec KEEN_Y lda KEEN_Y
beq keen_rising_not2
keen_rising2:
lda #0
sta KEEN_Y
jmp done_check_rising
keen_rising_not2:
dec KEEN_TILEY
lda #2
sta KEEN_Y
jmp done_check_rising jmp done_check_rising
scroll_rising: scroll_rising:
dec TILEMAP_Y dec TILEMAP_Y
dec KEEN_TILEY
jsr copy_tilemap_subset jsr copy_tilemap_subset
jmp done_check_rising jmp done_check_rising
@ -252,16 +305,13 @@ start_falling:
; otherwise hit peak, start falling ; otherwise hit peak, start falling
lda #1 ; avoid gap before falling triggered lda #1 ; avoid gap before falling triggered
sta KEEN_FALLING sta KEEN_FALLING
lda #0
sta KEEN_JUMPING
done_handle_jumping: done_handle_jumping:
rts rts
;========================= ;=========================
; check_falling ; check_falling
;========================= ;=========================
@ -270,46 +320,97 @@ check_falling:
lda KEEN_JUMPING lda KEEN_JUMPING
bne done_check_falling ; don't check falling if jumping bne done_check_falling ; don't check falling if jumping
lda KEEN_FOOT_BELOW1 ;=========================
; check below feet
; if KEEN_X=0 check below and below+1
; if KEEN_X=1 check below+1
; if tile# > HARDTOP_TILES then we stop falling clc
cmp #HARDTOP_TILES lda KEEN_TILEY
bcs feet_on_ground ; bge adc #2 ; point below feet
lda KEEN_FOOT_BELOW2 adc #>big_tilemap
sta INH
lda #0
sta INL
; if tile# > HARDTOP_TILES then we stop falling ldy KEEN_TILEX
cmp #HARDTOP_TILES
bcs feet_on_ground ; bge lda KEEN_X
bne check_below_plus1
check_below:
lda (INL),Y
cmp #HARDTOP_TILES
bcs feet_on_ground ; if hardtop tile, don't fall
check_below_plus1:
iny
lda (INL),Y
cmp #HARDTOP_TILES
bcs feet_on_ground ; if hardtop tile, don't fall
;======================= ;=======================
; falling ; falling
no_ground_were_falling:
lda #1 lda #1
sta KEEN_FALLING sta KEEN_FALLING
; if y==0, just bump to 2, no need to check
; if y==2 need to check scrolling
lda KEEN_Y
bne do_full_falling_check
keeny_was_zero:
lda #2
sta KEEN_Y
jmp done_check_falling
do_full_falling_check:
;=================================================== ;===================================================
; scroll but only if KEEN_Y>=20 (YDEFAULT) ; if ((tilemap_y>max_tile_y) || ((keen_tiley-tilemap_y)<10) keen_fall
; else scoll_fall
; scroll but only if (KEEN_TILEY-TILEMAP_Y)>=10 (YDEFAULT/2)
; and TILEMAP_Y < MAX_TILE_Y ; and TILEMAP_Y < MAX_TILE_Y
; if (keen_tiley-tilemap_y)<10, keen_fall
sec
lda KEEN_TILEY
sbc TILEMAP_Y
cmp #8
bcc keen_fall ; bge
; if tilemap_y >= max_tile, keen_fall
lda TILEMAP_Y lda TILEMAP_Y
cmp #MAX_TILE_Y cmp #MAX_TILE_Y
bcs keen_fall ; bge bcs keen_fall ; bge
lda KEEN_Y
cmp #YDEFAULT jmp scroll_fall ; FIXME, rearrange logic so this falls through
bcs scroll_fall ; bge
keen_fall: keen_fall:
inc KEEN_Y ; this must be +2 ; KEEN_Y is known to be 2 here
inc KEEN_Y ; as we only draw sprites on even lines ; if KEEN_Y==2, KEEN_Y->0, INC KEEN_TILEY
lda #0
sta KEEN_Y
inc KEEN_TILEY
jmp done_check_falling jmp done_check_falling
scroll_fall: scroll_fall:
; KEEN_Y is known to be 2 here
; if KEEN_Y==2, KEEN_Y->0, scroll
lda #0
sta KEEN_Y
inc TILEMAP_Y inc TILEMAP_Y
inc KEEN_TILEY
jsr copy_tilemap_subset jsr copy_tilemap_subset
jmp done_check_falling jmp done_check_falling
@ -334,24 +435,13 @@ feet_on_ground:
rts rts
was_not_falling: was_not_falling:
; check to see if Y still hi, if so scroll back down
; lda KEEN_Y
; cmp #YDEFAULT
; bcs done_check_falling ; bge
; too high up on screen, adjust down and also adjust tilemap down
; inc KEEN_Y
; inc KEEN_Y
; inc TILEMAP_Y ; share w above?
; jsr copy_tilemap_subset
done_check_falling: done_check_falling:
rts rts
.if 0
;======================= ;=======================
; keen_get_feet_location ; keen_get_feet_location
;======================= ;=======================
@ -508,3 +598,4 @@ head_lookup:
.byte 220,220,220,220 ; 43 .byte 220,220,220,220 ; 43
.byte 240,240,240,240 ; 47 .byte 240,240,240,240 ; 47
.endif

View File

@ -88,53 +88,56 @@ PATTERN_H = $7F
WHICH_LOAD = $80 ; which file to load WHICH_LOAD = $80 ; which file to load
KEEN_XL = $81 TILEMAP_X = $81 ; upper left corner of tilemap
KEEN_X = $82 ; location of protagonist TILEMAP_Y = $82
KEEN_Y = $83
KEEN_DIRECTION = $84
KEEN_WALKING = $85
KEEN_JUMPING = $86
LASER_OUT = $87
LASER_X = $88
LASER_Y = $89
LASER_DIRECTION = $8A
TILEMAP_X = $8B
TILEMAP_Y = $8C
KEEN_TILEX = $83
KEEN_TILEY = $84
KEEN_X = $85 ; location of protagonist
KEEN_XL = $86 ; 8.8 fixed point?
KEEN_Y = $87
KEEN_DIRECTION = $88
KEEN_WALKING = $89
KEEN_JUMPING = $8A
RAYGUNS = $8E LASER_OUT = $8B
KEYCARDS = $8F LASER_X = $8C
LASER_Y = $8D
LASER_DIRECTION = $8E
RAYGUNS = $8F
KEYCARDS = $90
INV_RED_KEY = $01 INV_RED_KEY = $01
INV_BLUE_KEY = $02 INV_BLUE_KEY = $02
INV_YELLOW_KEY = $04 INV_YELLOW_KEY = $04
INV_GREEN_KEY = $08 INV_GREEN_KEY = $08
KEENS = $90 KEENS = $91
SCORE0 = $91 SCORE0 = $92
SCORE1 = $92 SCORE1 = $93
SCORE2 = $93 SCORE2 = $94
SHIP_PARTS = $94 SHIP_PARTS = $95
PARTS_BOTTLE = $01 PARTS_BOTTLE = $01
PARTS_VACUUM = $02 PARTS_VACUUM = $02
PARTS_BATTERY = $04 PARTS_BATTERY = $04
PARTS_JOYSTICK = $08 PARTS_JOYSTICK = $08
KEEN_FALLING = $95 KEEN_FALLING = $96
KEEN_SHOOTING = $96 KEEN_SHOOTING = $97
SOUND_OFFSET = $97 SOUND_OFFSET = $98
SUPPRESS_WALK = $98 SUPPRESS_WALK = $99
;ENEMY_DATAL = $99 POGO = $9A
;ENEMY_DATAH = $9A LASER_TILE = $9B
POGO = $9B TILE_TEMP = $9C
LASER_TILE = $9C
TILE_TEMP = $9D TILEY = $9D
TILE_ODD = $9E
TILEMAP_OFFSET = $9F
;
TILEY = $9E
TILE_ODD = $9F
TILEMAP_OFFSET = $A0
KEEN_FOOT_TILE1 = $A1 KEEN_FOOT_TILE1 = $A1
KEEN_FOOT_TILE2 = $A2 KEEN_FOOT_TILE2 = $A2