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:
lda KEEN_X
sec
lda KEEN_TILEX
sbc TILEMAP_X
asl
clc
adc KEEN_X
sta XPOS
lda KEEN_Y
sec
lda KEEN_TILEY
sbc TILEMAP_Y
asl
asl
clc
adc KEEN_Y
sta YPOS
lda KEEN_DIRECTION
@ -116,5 +128,3 @@ actually_draw_keen:
jsr put_sprite_crop
rts

View File

@ -50,11 +50,17 @@ keen_start:
; but with reference to starting tilemap (0,5) should be
; 2,8?
lda #2
sta KEEN_X
lda #24
sta KEEN_Y
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
;====================================

View File

@ -13,14 +13,14 @@ TILE_COLS = 20
;=========================
move_keen:
lda #0
sta SUPPRESS_WALK ; ????
; lda #0
; 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 keen_collide ; check for right/left collision
; jsr keen_collide ; check for right/left collision
jsr handle_jumping ; handle jumping
@ -30,8 +30,8 @@ move_keen:
dec KEEN_WALKING ; decrement walk count
lda SUPPRESS_WALK ; why????
bne done_move_keen
; lda SUPPRESS_WALK ; why????
; bne done_move_keen
lda KEEN_DIRECTION ; check direction
bmi move_left
@ -39,7 +39,7 @@ move_keen:
;==============================
; Move Keen Right
;==============================
; if (keen_x<22) || (tilemap_x>xmax-20) walk
; if (keen_tilex-tilemap_x<11) || (tilemap_x>96) walk
; otherwise, scroll
lda TILEMAP_X
@ -47,8 +47,10 @@ move_keen:
bcs keen_walk_right
lda KEEN_X ; if X more than 22
cmp #22 ; scroll screen rather than keen
sec
lda KEEN_TILEX
sbc TILEMAP_X
cmp #11
bcc keen_walk_right
keen_scroll_right:
@ -61,8 +63,14 @@ keen_scroll_right:
inc TILEMAP_X ; scroll screen to right
inc KEEN_TILEX
jsr copy_tilemap_subset ; update tilemap
skip_keen_scroll_right:
jmp done_move_keen
@ -74,7 +82,17 @@ keen_walk_right:
sta KEEN_XL
bcc dwr_noflo ; if no overflow
inc KEEN_X ; otherwise update X
lda KEEN_X
cmp #2
bne dwr_noflo
lda #0
sta KEEN_X
inc KEEN_TILEX
dwr_noflo:
jmp done_move_keen
@ -83,15 +101,17 @@ move_left:
;==============================
; Move Keen Left
;==============================
; if (keen_x>=14) || (tilemap_x=0) walk
; if (keen_tilex-tilemap_x>=7) || (tilemap_x=0) walk
; otherwise, scroll
lda TILEMAP_X
beq keen_walk_left
lda KEEN_X ; get current X
cmp #14
bcs keen_walk_left ; bge ; if >=14 walk
sec
lda KEEN_TILEX
sbc TILEMAP_X
cmp #7
bcs keen_walk_left
keen_scroll_left: ; otherwise scroll
@ -102,6 +122,7 @@ keen_scroll_left: ; otherwise scroll
bcs skip_keen_scroll_left
dec TILEMAP_X ; scroll left
dec KEEN_TILEX
jsr copy_tilemap_subset
@ -116,8 +137,20 @@ keen_walk_left:
sbc #KEEN_SPEED
sta KEEN_XL
bcs dwl_noflo
dec KEEN_X
bpl dwl_noflo
; adjust tile location
lda #1
sta KEEN_X
dec KEEN_TILEX
dwl_noflo:
jmp done_move_keen
done_move_keen:
@ -213,32 +246,52 @@ handle_jumping:
lda KEEN_JUMPING
beq done_handle_jumping ; skip if not actually jumping
;===================================================
; scroll but only if KEEN_Y<20 (YDEFAULT)
; and TILEMAP_Y >0
actually_jumping:
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
beq keen_rising
; check if hit top of screen
sec
lda TILEMAP_Y
sbc KEEN_TILEY
lda KEEN_Y ;
cmp #2 ; if hit top of screen, start falling
bcc start_falling
cmp #YDEFAULT ; compare to middle of screen
cmp #4 ; compare to middle of screen
bcc scroll_rising ; blt
; move keen
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
scroll_rising:
dec TILEMAP_Y
dec KEEN_TILEY
jsr copy_tilemap_subset
jmp done_check_rising
@ -252,16 +305,13 @@ start_falling:
; otherwise hit peak, start falling
lda #1 ; avoid gap before falling triggered
sta KEEN_FALLING
lda #0
sta KEEN_JUMPING
done_handle_jumping:
rts
;=========================
; check_falling
;=========================
@ -270,46 +320,97 @@ check_falling:
lda KEEN_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
cmp #HARDTOP_TILES
bcs feet_on_ground ; bge
clc
lda KEEN_TILEY
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
cmp #HARDTOP_TILES
bcs feet_on_ground ; bge
ldy KEEN_TILEX
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
no_ground_were_falling:
lda #1
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
; 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
cmp #MAX_TILE_Y
bcs keen_fall ; bge
lda KEEN_Y
cmp #YDEFAULT
bcs scroll_fall ; bge
jmp scroll_fall ; FIXME, rearrange logic so this falls through
keen_fall:
inc KEEN_Y ; this must be +2
inc KEEN_Y ; as we only draw sprites on even lines
; KEEN_Y is known to be 2 here
; if KEEN_Y==2, KEEN_Y->0, INC KEEN_TILEY
lda #0
sta KEEN_Y
inc KEEN_TILEY
jmp done_check_falling
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 KEEN_TILEY
jsr copy_tilemap_subset
jmp done_check_falling
@ -334,24 +435,13 @@ feet_on_ground:
rts
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:
rts
.if 0
;=======================
; keen_get_feet_location
;=======================
@ -508,3 +598,4 @@ head_lookup:
.byte 220,220,220,220 ; 43
.byte 240,240,240,240 ; 47
.endif

View File

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