From: Lukas Krickl Date: Mon, 30 Jun 2025 14:36:45 +0000 (+0200) Subject: map: Maps are now 16x16 and have a tile size of 16x16 X-Git-Url: https://git.krickl.dev/?a=commitdiff_plain;h=4fc2d7b402c4f2a67d45ce2def38c246ab99c9e2;p=gbrg%2F.git map: Maps are now 16x16 and have a tile size of 16x16 This mostly required reworking rendering as the actual game logic is tile based anyway. Drawing maps now happens in 2 steps. Actors do not take into account the larger size yet. I will probably switch to 8x16 objects eventually. This will however require a rework of the image converter --- diff --git a/BUGS.md b/BUGS.md index c7afc1d..9154d74 100644 --- a/BUGS.md +++ b/BUGS.md @@ -1,5 +1,5 @@ # Known Bugs +## Objects are out of bounds - - +Sometimes objects are flickering at tile 0/0. diff --git a/makefile b/makefile index 71183e0..8f9b4bb 100644 --- a/makefile +++ b/makefile @@ -17,4 +17,4 @@ tiles: .PHONY: maps maps: - ./tools/tms2map.py assets/maps/base.tmx default_map > maps/default_map.s + ./tools/tms2map.py assets/maps/base1616.tmx default_map > maps/default_map.s diff --git a/maps/default_map.s b/maps/default_map.s index e4b0aea..112449d 100644 --- a/maps/default_map.s +++ b/maps/default_map.s @@ -10,31 +10,20 @@ dw bank9000 default_map_bg: -.db 0x1, 0x65, 0x1f, 0x64, 0x1, 0x64, 0x1, 0x64 -.db 0x3, 0x6b, 0x1b, 0x64, 0x1, 0x64, 0x5, 0x64 -.db 0x2, 0x65, 0x18, 0x64, 0x1, 0x64, 0x5, 0x64 -.db 0x2, 0x65, 0x18, 0x64, 0x1, 0x64, 0x7, 0x64 -.db 0x1, 0x65, 0x4, 0x64, 0x1, 0x4a, 0x3, 0x5c -.db 0x1, 0x4b, 0xe, 0x64, 0x1, 0x64, 0xc, 0x64 -.db 0x1, 0x5d, 0x3, 0x7a, 0x1, 0x4d, 0xe, 0x64 -.db 0x1, 0x64, 0xc, 0x64, 0x1, 0x6c, 0x1, 0x6a -.db 0x2, 0x6b, 0x1, 0x6d, 0xe, 0x64, 0x1, 0x64 -.db 0xc, 0x64, 0x5, 0x78, 0xe, 0x64, 0x1, 0x64 -.db 0x1f, 0x64, 0x1, 0x64, 0x1f, 0x64, 0x1, 0x64 -.db 0x4, 0x64, 0x5, 0x74, 0x16, 0x64, 0x1, 0x64 -.db 0x4, 0x64, 0x5, 0x74, 0x16, 0x64, 0x1, 0x64 -.db 0x4, 0x64, 0x5, 0x74, 0x16, 0x64, 0x1, 0x64 -.db 0x4, 0x64, 0x8, 0x74, 0x13, 0x64, 0x1, 0x64 -.db 0x8, 0x64, 0x4, 0x74, 0x13, 0x64, 0x1, 0x64 -.db 0x1f, 0x64, 0x1, 0x64, 0x1f, 0x64, 0x1, 0x64 -.db 0x1f, 0x64, 0x1, 0x64, 0x1f, 0x64, 0x1, 0x64 -.db 0x1f, 0x64, 0x1, 0x64, 0x1f, 0x64, 0x1, 0x64 -.db 0x1f, 0x64, 0x1, 0x64, 0x1f, 0x64, 0x1, 0x64 -.db 0x1e, 0x64, 0x1, 0x65 +.db 0x1, 0x42, 0xe, 0x60, 0x1, 0x62, 0x1, 0x60 +.db 0xf, 0x60, 0x1, 0x60, 0x6, 0x60, 0x4, 0x44 +.db 0x5, 0x60, 0x1, 0x60, 0xf, 0x60, 0x1, 0x60 +.db 0xf, 0x60, 0x1, 0x60, 0xf, 0x60, 0x1, 0x60 +.db 0xf, 0x60, 0x1, 0x60, 0x2, 0x60, 0x4, 0x44 +.db 0x9, 0x60, 0x1, 0x60, 0x7, 0x60, 0x3, 0x62 +.db 0x5, 0x60, 0x1, 0x60, 0x7, 0x60, 0x3, 0x62 +.db 0x5, 0x60, 0x1, 0x60, 0x7, 0x60, 0x3, 0x62 +.db 0x5, 0x60, 0x1, 0x60, 0xf, 0x60, 0x1, 0x60 +.db 0xf, 0x60, 0x1, 0x60, 0xf, 0x60, 0x1, 0x60 +.db 0xf, 0x60, 0x1, 0x62, 0xe, 0x60, 0x1, 0x42 .db 0x00 ; termiante data default_map_tile_flags: -.db 0x22, 0x0, 0x3, 0x1, 0x68, 0x0, 0x5, 0x1 -.db 0x3b, 0x0, 0x4, 0x1, 0xff, 0x0, 0xff, 0x0 -.db 0x31, 0x0 +.db 0x27, 0x0, 0x4, 0x1, 0x48, 0x0, 0x4, 0x1 +.db 0x89, 0x0 .db 0x00 ; termiante data diff --git a/src/defs.s b/src/defs.s index bd890a2..5ae90af 100644 --- a/src/defs.s +++ b/src/defs.s @@ -16,20 +16,20 @@ #define STACK_BEGIN 0xDFFF #define TILE_SIZE 8 -#define MAP_W 32 +#define MAP_W 16 .def int MAP_W_DEF = MAP_W -#define MAP_H 24 +#define MAP_H 16 #define MAP_SIZE (MAP_W * MAP_H) -#define VIEW_PORT_TILES_W 12 -#define VIEW_PORT_TILES_H 10 +#define VIEW_PORT_TILES_W 6 +#define VIEW_PORT_TILES_H 5 ; seed for the rng ; 8 bit signed int #define RAND_MAGIC 0x1B #define SRAND_INITIAL 0x19 -#define WINDOW_Y 120 +#define WINDOW_Y 112 #define WINDOW_X 1 ; defines end of scroll location diff --git a/src/map.s b/src/map.s index 975d758..673ba6b 100644 --- a/src/map.s +++ b/src/map.s @@ -275,20 +275,80 @@ map_tile_banks_load: ; draws all cells currently loaded to the screen ; only call during blank! map_draw_all: +#define TMP_TILE_COUNT scratch +#define TMP_TILE_OFFSET scratch+1 ; de = loop counter ld de, MAP_SIZE ld bc, SCRN0 + + ; clear tile count + xor a, a + ld [TMP_TILE_COUNT], a + ; set a tile offset + ld [TMP_TILE_OFFSET], a ld hl, map ; hl = c_tile + + ; load row 1 + call map_draw_row + + ld de, MAP_SIZE + ld bc, SCRN0+32 + ; clear tile count + xor a, a + ld [TMP_TILE_COUNT], a + ; set a tile offset + ld a, 16 + ld [TMP_TILE_OFFSET], a + ld hl, map + call map_draw_row + ret + + ; draws a map row + ; inputs: + ; hl: map ptr + ; bc: SCRN start + ; de: MAP_SIZE + ; [TMP_TILE_COUNT]: 0 + ; [TMP_TILE_OFFSET]: 0 or 16 +map_draw_row: @loop: + push de + ; load row 1 ld a, [hl] ; load tile + ld d, a + ld a, [TMP_TILE_OFFSET] + add a, d ; tile + tile offset + + ld [bc], a ; draw + inc bc ; bc++ + inc a ; move one tile over ld [bc], a ; draw inc bc ; bc++ - push de + ; count tiles drawn + ld a, [TMP_TILE_COUNT] + inc a + cp a, MAP_W ; map size + ; bc + 32 to go to next row if edge is reached + jr nz, @no_advance REL + + push hl + ld hl, 32 + add hl, bc + push hl + pop bc ; bc = next row + + pop hl + + ; clear map tile counter + xor a, a +@no_advance: + ld [TMP_TILE_COUNT], a + ld de, c_size add hl, de ; next cell pop de @@ -302,6 +362,8 @@ map_draw_all: jr nz, @loop REL ret +#undefine TMP_TILE_COUNT +#undefine TMP_TILE_OFFSET ; empty actor table map_actor_table_null: diff --git a/src/unit.s b/src/unit.s index 6a38339..1989f29 100644 --- a/src/unit.s +++ b/src/unit.s @@ -101,8 +101,8 @@ unit_generic_draw_adjust_subtile: jp z, @done ld a, [de] ; load timer - div16 a ; a = timer/16 giving us a pixel offset - ld c, a ; c = timer/16 + div8 a ; a = timer/8 giving us a pixel offset + ld c, a ; c = timer/8 ; test bit 7 for up bit 7, b @@ -167,13 +167,13 @@ unit_generic_draw: ; set y pos ld a, [de] - mul8 a + mul16 a add a, OBJ_OFF_Y sub a, b ld [hl+], a ; if the position is inside the window set PRIO bit - cp a, 136 ; window start position in pixels + cp a, 128 ; window start position in pixels jr c, @not_on_window REL ld a, OAM_FPRIO ld [TMP_OAMFLAG_PRIO], a @@ -182,7 +182,7 @@ unit_generic_draw: ; set x pos inc de ld a, [de] - mul8 a + mul16 a add a, OBJ_OFF_X sub a, c ld [hl+], a @@ -526,39 +526,39 @@ unit_scroll_center: ld a, [hl+] ; max y - cp a, 0x10 + cp a, 0x0E jr c, @not_max_y REL - ld a, 0x10 + ld a, 0x0E @not_max_y: ; min y - cp a, 0x07 + cp a, 0x05 jr nc, @not_min_y REL - ld a, 0x07 + ld a, 0x05 @not_min_y: ; adjust scroll sub a, (MAP_H - VIEW_PORT_TILES_H) / 2 - mul8 a + mul16 a ld [scroll_y], a ; x position scroll ld a, [hl] ; max x - cp a, 0x16 + cp a, 0x0B jr c, @not_max_x REL - ld a, 0x16 + ld a, 0x0B @not_max_x: ; min x - cp a, 0x0A + cp a, 0x05 jr nc, @not_min_x REL - ld a, 0x0A + ld a, 0x05 @not_min_x: sub a, (MAP_W - VIEW_PORT_TILES_W ) / 2 - mul8 a + mul16 a ld [scroll_x], a diff --git a/tiles/bank8000.inc b/tiles/bank8000.inc index cf9fddc..22db67e 100644 --- a/tiles/bank8000.inc +++ b/tiles/bank8000.inc @@ -593,41 +593,41 @@ .chr 00000000 .chr 00000000 ; tile 66 -.chr 00333300 -.chr 03111132 -.chr 03111132 -.chr 03122323 -.chr 00322213 -.chr 00033330 -.chr 03312133 -.chr 31312131 -; tile 67 -.chr 32311133 -.chr 31311130 -.chr 03321230 -.chr 00333130 -.chr 00003330 -.chr 00000000 .chr 00000000 .chr 00000000 -; tile 68 -.chr 00000000 .chr 00000000 .chr 00000000 +.chr 00000002 +.chr 00000011 +.chr 00000011 +.chr 00000111 +; tile 67 .chr 00000000 .chr 00000000 .chr 00000000 .chr 00000000 .chr 00000000 +.chr 10000000 +.chr 10000000 +.chr 11000000 +; tile 68 +.chr 22222222 +.chr 22222222 +.chr 22222222 +.chr 33333333 +.chr 33333333 +.chr 11111111 +.chr 11111111 +.chr 11111111 ; tile 69 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 22222222 +.chr 22222222 +.chr 22222222 +.chr 33333333 +.chr 33333333 +.chr 11111111 +.chr 11111111 +.chr 11111111 ; tile 70 .chr 00000000 .chr 00000000 @@ -737,25 +737,16 @@ .chr 00000000 .chr 00000000 ; tile 82 -.chr 00333000 -.chr 03211330 -.chr 00333230 -.chr 00032313 -.chr 00313313 -.chr 03130323 -.chr 31300030 -.chr 23000000 -; tile 83 -.chr 30000000 -.chr 00000000 -.chr 00000000 +.chr 00000111 +.chr 00000003 +.chr 00000002 .chr 00000000 .chr 00000000 .chr 00000000 .chr 00000000 .chr 00000000 -; tile 84 -.chr 00000000 +; tile 83 +.chr 11000000 .chr 00000000 .chr 00000000 .chr 00000000 @@ -763,15 +754,24 @@ .chr 00000000 .chr 00000000 .chr 00000000 +; tile 84 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 11111122 +.chr 11111222 ; tile 85 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 21111111 +.chr 22211111 ; tile 86 .chr 00000000 .chr 00000000 @@ -869,8 +869,8 @@ .chr 00000000 .chr 00000000 .chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 00000011 +.chr 00000011 ; tile 97 .chr 00000000 .chr 00000000 @@ -878,26 +878,26 @@ .chr 00000000 .chr 00000000 .chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 00110000 +.chr 00110000 ; tile 98 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 22222222 +.chr 22222222 +.chr 22211221 +.chr 22211221 +.chr 22222112 +.chr 22222112 +.chr 22222222 +.chr 22211221 ; tile 99 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 22222222 +.chr 22222222 +.chr 12211222 +.chr 12211222 +.chr 21122222 +.chr 21122222 +.chr 22222222 +.chr 12211222 ; tile 100 .chr 00000000 .chr 00000000 @@ -1016,8 +1016,8 @@ .chr 00000000 .chr 00000000 ; tile 113 -.chr 00000000 -.chr 00000000 +.chr 11000000 +.chr 11000000 .chr 00000000 .chr 00000000 .chr 00000000 @@ -1025,23 +1025,23 @@ .chr 00000000 .chr 00000000 ; tile 114 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 22211221 +.chr 22222112 +.chr 22222112 +.chr 22222222 +.chr 22222222 +.chr 22222222 +.chr 22222222 +.chr 22222222 ; tile 115 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 12211222 +.chr 21122222 +.chr 21122222 +.chr 22222222 +.chr 22222222 +.chr 22222222 +.chr 22222222 +.chr 22222222 ; tile 116 .chr 22222222 .chr 21212222 diff --git a/tiles/bank9000.inc b/tiles/bank9000.inc index 54eee8a..c41637f 100644 --- a/tiles/bank9000.inc +++ b/tiles/bank9000.inc @@ -597,37 +597,37 @@ .chr 00000000 .chr 00000000 .chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 00000002 +.chr 00000011 +.chr 00000011 +.chr 00000111 ; tile 67 .chr 00000000 .chr 00000000 .chr 00000000 .chr 00000000 .chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 10000000 +.chr 10000000 +.chr 11000000 ; tile 68 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 22222222 +.chr 22222222 +.chr 22222222 +.chr 33333333 +.chr 33333333 +.chr 11111111 +.chr 11111111 +.chr 11111111 ; tile 69 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 22222222 +.chr 22222222 +.chr 22222222 +.chr 33333333 +.chr 33333333 +.chr 11111111 +.chr 11111111 +.chr 11111111 ; tile 70 .chr 00000000 .chr 00000000 @@ -737,16 +737,16 @@ .chr 11111133 .chr 33333330 ; tile 82 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 00000111 +.chr 00000003 +.chr 00000002 .chr 00000000 .chr 00000000 .chr 00000000 .chr 00000000 .chr 00000000 ; tile 83 -.chr 00000000 +.chr 11000000 .chr 00000000 .chr 00000000 .chr 00000000 @@ -755,23 +755,23 @@ .chr 00000000 .chr 00000000 ; tile 84 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 11111122 +.chr 11111222 ; tile 85 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 11111111 +.chr 21111111 +.chr 22211111 ; tile 86 .chr 00000000 .chr 00000000 @@ -869,8 +869,8 @@ .chr 00000000 .chr 00000000 .chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 00000011 +.chr 00000011 ; tile 97 .chr 00000000 .chr 00000000 @@ -878,26 +878,26 @@ .chr 00000000 .chr 00000000 .chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 00110000 +.chr 00110000 ; tile 98 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 22222222 +.chr 22222222 +.chr 22222112 +.chr 22222112 +.chr 22211221 +.chr 22211221 +.chr 22222222 +.chr 22222112 ; tile 99 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 22222222 +.chr 22222222 +.chr 21122222 +.chr 21122222 +.chr 12222222 +.chr 12222222 +.chr 22222222 +.chr 21122222 ; tile 100 .chr 00000000 .chr 00000000 @@ -1016,8 +1016,8 @@ .chr 00000000 .chr 00000000 ; tile 113 -.chr 00000000 -.chr 00000000 +.chr 11000000 +.chr 11000000 .chr 00000000 .chr 00000000 .chr 00000000 @@ -1025,23 +1025,23 @@ .chr 00000000 .chr 00000000 ; tile 114 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 22222112 +.chr 22211221 +.chr 22211221 +.chr 22222222 +.chr 22222222 +.chr 22222222 +.chr 22222222 +.chr 22222222 ; tile 115 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 -.chr 00000000 +.chr 21122222 +.chr 12222222 +.chr 12222222 +.chr 22222222 +.chr 22222222 +.chr 22222222 +.chr 22222222 +.chr 22222222 ; tile 116 .chr 22222222 .chr 22121222 diff --git a/tools/tms2map.py b/tools/tms2map.py index 61b19f4..97f5016 100755 --- a/tools/tms2map.py +++ b/tools/tms2map.py @@ -53,7 +53,9 @@ def convert_val(byte): val = int(byte) if val > 0: val -= 1 - return val + # calculate the real tile offset from a 16x16 tileset + # to a 8x8 tileset + return (val * 2 + int(val / 8) * 16) & 0xFF def convert_none(byte): return int(byte) @@ -107,7 +109,7 @@ def get_flag(tile): if sub_child.tag == 'property': for flag in FLAGS: if sub_child.attrib['name'] == flag: - TILE_FLAGS[int(tile.attrib['id'])-1] = FLAGS[flag] + TILE_FLAGS[int(tile.attrib['id'])] |= FLAGS[flag] # get all flags and write them to TILE_FLAGS def get_flags(tileset):