From 38ded8a67c32f93e25e8ba9ed4471f467a54bdeb Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Fri, 5 Apr 2024 15:25:26 -0400 Subject: [PATCH] keen: make keen co-ords closer to enemies this might make things easier? --- games/keen/draw_keen.s | 18 +++- games/keen/level1.s | 14 ++- games/keen/move_keen.s | 207 +++++++++++++++++++++++++++++------------ games/keen/zp.inc | 67 ++++++------- 4 files changed, 208 insertions(+), 98 deletions(-) diff --git a/games/keen/draw_keen.s b/games/keen/draw_keen.s index 43a98a11..b1bdd9af 100644 --- a/games/keen/draw_keen.s +++ b/games/keen/draw_keen.s @@ -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 - - diff --git a/games/keen/level1.s b/games/keen/level1.s index 25342c4e..72f05415 100644 --- a/games/keen/level1.s +++ b/games/keen/level1.s @@ -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 ;==================================== diff --git a/games/keen/move_keen.s b/games/keen/move_keen.s index 49f32605..84a2f61d 100644 --- a/games/keen/move_keen.s +++ b/games/keen/move_keen.s @@ -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 diff --git a/games/keen/zp.inc b/games/keen/zp.inc index acb340fc..60505442 100644 --- a/games/keen/zp.inc +++ b/games/keen/zp.inc @@ -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