map: Maps are now 16x16 and have a tile size of 16x16
authorLukas Krickl <lukas@krickl.dev>
Mon, 30 Jun 2025 14:36:45 +0000 (16:36 +0200)
committerLukas Krickl <lukas@krickl.dev>
Mon, 30 Jun 2025 14:36:45 +0000 (16:36 +0200)
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

BUGS.md
makefile
maps/default_map.s
src/defs.s
src/map.s
src/unit.s
tiles/bank8000.inc
tiles/bank9000.inc
tools/tms2map.py

diff --git a/BUGS.md b/BUGS.md
index c7afc1df11186b5c1f28162d8b180d10d6663af3..9154d7437d5e4a79c0b609b40e281d0ff2d9ef08 100644 (file)
--- 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.
index 71183e0e5c01fb0ac9740822df2e5202d8c40ba8..8f9b4bbe98d8bfa9694a70867b79c54ebf5b7d5a 100644 (file)
--- 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
index e4b0aea7f081cb831988e1135b7f0021110c8883..112449deaac3d20605b25c0c5f43a8ca665024b1 100644 (file)
@@ -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
index bd890a2b43804a1e9a3e522dd777c0a260bb071b..5ae90af1fc8d98c3a45a95b7093de1e5abb303cf 100644 (file)
 #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
index 975d758e7762fb898cd801ccef9d78cc0d6824b1..673ba6bc09624e4e6b93d74862076d7a76cc228b 100644 (file)
--- 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:
index 6a3833942e2a69de67e2b73f29d005cb9cacb6d1..1989f290e1ea71ebeabb91e7a9b8ecdbed6b69c8 100644 (file)
@@ -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
 
 
index cf9fddca0b27d39f503fda21988bc326fd9c049f..22db67e9025ece4ab880743ef15bc9b9da4c1b29 100644 (file)
 .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
 .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
 .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
 .chr 00000000
 .chr 00000000
 .chr 00000000
-.chr 00000000
-.chr 00000000
+.chr 00000011
+.chr 00000011
 ; tile 97
 .chr 00000000
 .chr 00000000
 .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
 .chr 00000000
 .chr 00000000
 ; tile 113
-.chr 00000000
-.chr 00000000
+.chr 11000000
+.chr 11000000
 .chr 00000000
 .chr 00000000
 .chr 00000000
 .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
index 54eee8a07691f8c37b1cf4b8520a7a38d35af2d9..c41637f63d140f1efcc73578340c79d0bc7a9191 100644 (file)
 .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
 .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
 .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
 .chr 00000000
 .chr 00000000
 .chr 00000000
-.chr 00000000
-.chr 00000000
+.chr 00000011
+.chr 00000011
 ; tile 97
 .chr 00000000
 .chr 00000000
 .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
 .chr 00000000
 .chr 00000000
 ; tile 113
-.chr 00000000
-.chr 00000000
+.chr 11000000
+.chr 11000000
 .chr 00000000
 .chr 00000000
 .chr 00000000
 .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
index 61b19f4f912f702629695923cbd4a539ac36c8d5..97f501619a4b64dddf5bc161b582701a07448c4b 100755 (executable)
@@ -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):