From 1866d19a531e00b436fb360cfda0249fdfa0277e Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Thu, 14 Mar 2024 01:21:45 -0400 Subject: [PATCH] keen: add support for partial blocks --- games/keen/NOTES | 12 +++++++++--- games/keen/draw_tilemap.s | 16 +++++++--------- games/keen/handle_laser.s | 2 +- games/keen/maps/level1_map.png | Bin 9232 -> 7811 bytes games/keen/move_keen.s | 19 ++++++++++--------- 5 files changed, 27 insertions(+), 22 deletions(-) diff --git a/games/keen/NOTES b/games/keen/NOTES index f299bf2e..061ec10d 100644 --- a/games/keen/NOTES +++ b/games/keen/NOTES @@ -15,9 +15,15 @@ Memory map: tiles are 2x4, or 4 bytes each so in theory can have up to 256 of them - in 16x16 grid + but if we want data to fit in one page then 64 it the maximum + +tilemap: tilemap is 256 wide by 40 tall = 10k -Tiles: - hard tiles start at 32 +Tile types: + 0..26 transparent tiles + 27..31 items + 32..39 walkthrough tiles + 40..63 hard tiles + diff --git a/games/keen/draw_tilemap.s b/games/keen/draw_tilemap.s index 2bc0349b..67d68b5d 100644 --- a/games/keen/draw_tilemap.s +++ b/games/keen/draw_tilemap.s @@ -25,7 +25,9 @@ tilemap_outer_loop: sta GBASH - ldy #0 ; draw row from 0..40 + ldy #0 ; draw row from 0..39 + ; might be faster to count backwards + ; but would have to adjust a lot tilemap_loop: ldx TILEMAP_OFFSET ; get actual tile number @@ -58,7 +60,7 @@ not_odd_line: cpy #40 ; until done bne tilemap_loop - ; FIXME: countdown instead? + ; row is done, move to next line @@ -103,18 +105,14 @@ done_move_to_line: ;=================================== ; copy tilemap ;=================================== - ; want to copy a 16x10 area from global tileset to local - - ; originally 16x10 16x10 = 160 bytes - ; extend to 20x12 for full screen? 20x12 = 240 bytes - + ; local tilemap subset is 20x12 tiles = 240 bytes + ; nicely fits in one page + ; ; big tilemap is 256*40 ; so each row is a page ; TILEMAP_X, TILEMAP_Y specify where in big - ; copy to tilemap - TILEMAP_X_COPY_SIZE = 20 TILEMAP_Y_COPY_SIZE = 12 diff --git a/games/keen/handle_laser.s b/games/keen/handle_laser.s index ab381b95..42d9c24a 100644 --- a/games/keen/handle_laser.s +++ b/games/keen/handle_laser.s @@ -38,7 +38,7 @@ laser_check_tiles: ldx LASER_TILE lda tilemap,X - cmp #HARD_TILES + cmp #ALLHARD_TILES bcs destroy_laser diff --git a/games/keen/maps/level1_map.png b/games/keen/maps/level1_map.png index 8fe435b4e263f1542e7a4a654b4a231033d08598..724674e63d4c7afed2e41eab9ce3fb118e106d14 100644 GIT binary patch delta 3437 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 delta 4900 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 diff --git a/games/keen/move_keen.s b/games/keen/move_keen.s index d4a2c291..0638f49f 100644 --- a/games/keen/move_keen.s +++ b/games/keen/move_keen.s @@ -2,7 +2,8 @@ KEEN_SPEED = $80 YDEFAULT = 20 -HARD_TILES = 32 ; start at 32 +HARDTOP_TILES = 32 ; start at 32 +ALLHARD_TILES = 40 ; start at 40 TILE_COLS = 20 @@ -133,8 +134,8 @@ keen_check_head: lda tilemap,X - ; if tile# < HARD_TILES then we are fine - cmp #HARD_TILES + ; if tile# < ALLHARD_TILES then we are fine + cmp #ALLHARD_TILES bcc collide_left_right ; blt lda #0 @@ -162,8 +163,8 @@ check_right_collide: tax lda tilemap,X - ; if tile# < HARD_TILES then we are fine - cmp #HARD_TILES + ; if tile# < ALLHARD_TILES then we are fine + cmp #ALLHARD_TILES bcc done_keen_collide ; blt lda #1 ; @@ -179,8 +180,8 @@ check_left_collide: tax lda tilemap,X - ; if tile# < HARD_TILES then we are fine - cmp #HARD_TILES + ; if tile# < ALLHARD_TILES then we are fine + cmp #ALLHARD_TILES bcc done_keen_collide ; blt lda #1 @@ -328,8 +329,8 @@ check_falling: tax lda tilemap,X - ; if tile# < HARD_TILES then we fall - cmp #HARD_TILES + ; if tile# < HARDTOP_TILES then we fall + cmp #HARDTOP_TILES bcs feet_on_ground ; bge ;=======================