keen: update start position

keen comes through the door, he doesn't drop in from the sky
like that maniac duke nukem
This commit is contained in:
Vince Weaver 2024-03-16 16:09:01 -04:00
parent fb1cf56ec9
commit 018f407828
4 changed files with 109 additions and 63 deletions

View File

@ -42,11 +42,13 @@ Status:
* 11223344 * 20000 * 5 * N *
Level1:
in png: X=80 to 543, Y=12 to 80 (tiles 4x4)
x=0 to 116 Y=0..17
start position: in png 88,65
tile position = 0,5
keen position = 2,24 (remember, tiles 2 bytes high)
tilemap copies

View File

@ -60,25 +60,24 @@ keen_start:
lda #1
sta FIREPOWER
; lda #2 ; draw twice (both pages)
; sta UPDATE_STATUS
; lda #7
; sta HEALTH
lda #4
sta DRAW_PAGE
lda #18
; Level 1
; start at 2,24 (remember tiles 2 bytes high even though 4 pixels)
; but with reference to starting tilemap (0,5) should be
; 2,8?
lda #2
sta KEEN_X
lda #0
lda #24
sta KEEN_Y
lda #1
sta KEEN_DIRECTION
; jsr update_status_bar
;====================================
; load level1 background
;====================================
@ -107,15 +106,14 @@ keen_start:
;====================================
; copy in tilemap subset
;====================================
; copies local 16x10 tilemap to $bc00
; we start out assuming position is 28,0
; we copy in full screen, 40x48 = 20x12 tiles
; we start out assuming position is 0,5
; note 16x10 is 32*40
; if we want full screen it should be 40x48 = 20x12
lda #28
sta TILEMAP_X
lda #0
sta TILEMAP_X
lda #5
sta TILEMAP_Y
jsr copy_tilemap_subset
@ -128,10 +126,6 @@ keen_start:
keen_loop:
; copy over background
; jsr gr_copy_to_current
; draw tilemap
jsr draw_tilemap
@ -152,10 +146,6 @@ keen_loop:
; jsr check_open_door
; draw a status bar
; jsr draw_status_bar
jsr page_flip
jsr handle_keypress
@ -185,9 +175,6 @@ no_frame_oflo:
jmp done_with_keen
do_keen_loop:
; delay
@ -201,7 +188,7 @@ done_with_keen:
bit KEYRESET ; clear keypress
lda #LOAD_TITLE
lda #LOAD_MARS
sta WHICH_LOAD
rts ; exit back

View File

@ -110,19 +110,32 @@ check_left:
bne check_right
left_pressed:
;===============================
; left pressed
; if facing left, walk left
; if facing right and walking, stop
; if facing right and not walking, face left
lda KEEN_DIRECTION
cmp #$ff ; check if facing left
bne face_left
bne left_facing_right
lda #1
lda #4
sta KEEN_WALKING
jmp done_left_pressed
face_left:
lda #$ff
sta KEEN_DIRECTION
left_facing_right:
lda KEEN_WALKING
beq left_not_walking
lda #0
sta KEEN_WALKING
beq done_left_pressed ; bra
left_not_walking:
lda #$ff
sta KEEN_DIRECTION
done_left_pressed:
jmp done_keypress
@ -131,25 +144,65 @@ check_right:
cmp #'D'
beq right_pressed
cmp #$15 ; right key
bne check_up
bne check_jump_right
;===============================
; right pressed
; if facing right, walk right
; if facing left and walking, stop
; if facing left and not walking, face right
right_pressed:
lda KEEN_DIRECTION
cmp #$1 ; check if facing right
bne face_right
bne right_facing_left
lda #1
lda #4
sta KEEN_WALKING
jmp done_left_pressed
face_right:
lda #$1
sta KEEN_DIRECTION
right_facing_left:
lda KEEN_WALKING
beq right_not_walking
lda #0
sta KEEN_WALKING
beq done_right_pressed ; bra
right_not_walking:
lda #$1
sta KEEN_DIRECTION
done_right_pressed:
jmp done_keypress
check_jump_right:
cmp #'E'
bne check_up
jump_right:
; jump
lda KEEN_JUMPING
bne done_right_pressed ; don't jump if already jumping
lda KEEN_FALLING
bne done_right_pressed ; don't jump if falling
lda #JUMP_HEIGHT
sta KEEN_JUMPING
jsr jump_noise
lda #1
sta KEEN_DIRECTION
lda #10
sta KEEN_WALKING
jmp done_keypress
check_up:
cmp #'W'
beq up_pressed

View File

@ -14,7 +14,7 @@ TILE_COLS = 20
move_keen:
lda #0
sta SUPPRESS_WALK
sta SUPPRESS_WALK ; ????
jsr keen_get_feet_location ; get location of feet
@ -24,60 +24,64 @@ move_keen:
jsr handle_jumping ; handle jumping
lda KEEN_WALKING
lda KEEN_WALKING ; if not walking, we're done
beq done_move_keen
lda SUPPRESS_WALK
dec KEEN_WALKING ; decrement walk count
lda SUPPRESS_WALK ; why????
bne done_move_keen
lda KEEN_DIRECTION
lda KEEN_DIRECTION ; check direction
bmi move_left
lda KEEN_X
cmp #22
lda KEEN_X ; if X more than 22
cmp #22 ; scroll screen rather than keen
bcc keen_walk_right
keen_scroll_right:
clc
clc ; location is 8:8 fixed point
lda KEEN_XL
adc #KEEN_SPEED
adc #KEEN_SPEED ; add in speed
sta KEEN_XL
bcc skip_keen_scroll_right
bcc skip_keen_scroll_right ; if carry out we scroll
inc TILEMAP_X
inc TILEMAP_X ; scroll screen to right
jsr copy_tilemap_subset
jsr copy_tilemap_subset ; update tilemap
skip_keen_scroll_right:
jmp done_move_keen
keen_walk_right:
lda KEEN_XL
lda KEEN_XL ; get 8:8 fixed
clc
adc #KEEN_SPEED
adc #KEEN_SPEED ; add in speed
sta KEEN_XL
bcc dwr_noflo
inc KEEN_X
bcc dwr_noflo ; if no overflow
inc KEEN_X ; otherwise update X
dwr_noflo:
jmp done_move_keen
move_left:
lda KEEN_X
lda KEEN_X ; get current X
cmp #14
bcs keen_walk_left
bcs keen_walk_left ; bge ; if >=14 walk
keen_scroll_left:
keen_scroll_left: ; otherwise scroll
sec
sec ; 8.8 fixed point
lda KEEN_XL
sbc #KEEN_SPEED
sta KEEN_XL
bcs skip_keen_scroll_left
dec TILEMAP_X
dec TILEMAP_X ; scroll left
jsr copy_tilemap_subset
@ -151,7 +155,7 @@ collide_left_right:
;===================
lda KEEN_DIRECTION
beq done_keen_collide
beq done_keen_collide ; ?
bmi check_left_collide