Browse Source

add proper colors to score on gbc

Thomas B 1 month ago
parent
commit
2c36dec0a9
3 changed files with 40 additions and 11 deletions
  1. 1
    1
      Makefile
  2. BIN
      data/numbers.png
  3. 39
    10
      src/maps.c

+ 1
- 1
Makefile View File

@@ -86,7 +86,7 @@ $(BUILD_DIR)/$(DATA_DIR)/%.c $(BUILD_DIR)/$(DATA_DIR)/%.h: $(DATA_DIR)/%.png
86 86
 		$(PNGA) $< -o $@ -spr8x8 -map -use_map_attributes -noflip \
87 87
 	,$(if $(findstring numbers,$<), \
88 88
 		@echo "Converting font $<" && \
89
-		$(PNGA) $< -o $@ -spr8x8 -sw 16 -sh 16 -map -no_palettes \
89
+		$(PNGA) $< -o $@ -spr8x8 -sw 16 -sh 16 -map \
90 90
 	,                                     \
91 91
 		@echo "Converting tile $<" && \
92 92
 		$(PNGA) $< -o $@ -spr8x8      \

BIN
data/numbers.png View File


+ 39
- 10
src/maps.c View File

@@ -27,6 +27,22 @@
27 27
 
28 28
 #define MAX_DIGITS 7
29 29
 
30
+// TODO inverted score color not visible on DMG
31
+
32
+const unsigned char num_attr_1[40] = {
33
+    0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,
34
+    0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,
35
+};
36
+
37
+const unsigned char num_attr_2[40] = {
38
+    0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
39
+    0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
40
+};
41
+const palette_color_t num_pal_inv[4] = {
42
+  //RGB8(  0,  0,  0), RGB8(248,252,248), RGB8(  0,  0,  0), RGB8(  0,  0,  0)
43
+    RGB8(  0,  0,  0), RGB8(  0,  0,  0), RGB8(248,252,248), RGB8(  0,  0,  0)
44
+};
45
+
30 46
 void map_title(void) {
31 47
     set_bkg_palette(OAMF_CGB_PAL0, title_map_PALETTE_COUNT, title_map_palettes);
32 48
     set_bkg_data(0, title_map_TILE_COUNT, title_map_tiles);
@@ -41,17 +57,32 @@ void map_game(void) {
41 57
     set_bkg_tiles(0, 0, bg_map_WIDTH / bg_map_TILE_W, bg_map_HEIGHT / bg_map_TILE_H, bg_map_map);
42 58
 }
43 59
 
44
-static void digit(uint8_t val, uint8_t digit, uint8_t x_off) {
60
+inline void set_win_based(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *tiles, uint8_t base_tile, const uint8_t *attributes)
61
+{
62
+    VBK_REG = VBK_ATTRIBUTES;
63
+    set_win_tiles(x, y, w, h, attributes);
64
+    VBK_REG = VBK_TILES;
65
+    set_win_based_tiles(x, y, w, h, tiles, base_tile);
66
+}
67
+
68
+static void digit(uint8_t val, uint8_t digit, uint8_t x_off, uint8_t is_black) {
45 69
     uint8_t off = val * numbers_WIDTH / numbers_TILE_W;
46
-    set_win_based_tiles(x_off + (digit * numbers_WIDTH / numbers_TILE_W), 0,
47
-                        numbers_WIDTH / numbers_TILE_W, 1,
48
-                        numbers_map + off, bg_map_TILE_COUNT);
49
-    set_win_based_tiles(x_off + (digit * numbers_WIDTH / numbers_TILE_W), 1,
50
-                        numbers_WIDTH / numbers_TILE_W, 1,
51
-                        numbers_map + off + (sizeof(numbers_map) / 2), bg_map_TILE_COUNT);
70
+
71
+    set_win_based(x_off + (digit * numbers_WIDTH / numbers_TILE_W), 0,
72
+                  numbers_WIDTH / numbers_TILE_W, 1,
73
+                  numbers_map + off, bg_map_TILE_COUNT,
74
+                  (is_black ? num_attr_2 : num_attr_1) + off);
75
+
76
+    set_win_based(x_off + (digit * numbers_WIDTH / numbers_TILE_W), 1,
77
+                  numbers_WIDTH / numbers_TILE_W, 1,
78
+                  numbers_map + off + (sizeof(numbers_map) / 2), bg_map_TILE_COUNT,
79
+                  (is_black ? num_attr_2 : num_attr_1) + off);
52 80
 }
53 81
 
82
+
54 83
 void win_game_load(void) {
84
+    set_bkg_palette(OAMF_CGB_PAL0 + bg_map_PALETTE_COUNT, numbers_PALETTE_COUNT, numbers_palettes);
85
+    set_bkg_palette(OAMF_CGB_PAL0 + bg_map_PALETTE_COUNT + 1, numbers_PALETTE_COUNT, num_pal_inv);
55 86
     set_win_data(bg_map_TILE_COUNT, numbers_TILE_COUNT, numbers_tiles);
56 87
 }
57 88
 
@@ -59,8 +90,6 @@ void win_game_draw(int32_t score) {
59 90
     // TODO can not set numbers larger than int16 max?!
60 91
     //score = 32767 + 1; // wtf?!
61 92
 
62
-    // TODO support color switch, but how?
63
-
64 93
     uint8_t is_black = 0;
65 94
     if (score < 0) {
66 95
         score = -score;
@@ -83,6 +112,6 @@ void win_game_draw(int32_t score) {
83 112
     }
84 113
 
85 114
     for (uint8_t i = 0; i < len; i++) {
86
-        digit(digits[len - i - 1], i, 10 - len);
115
+        digit(digits[len - i - 1], i, 10 - len, is_black);
87 116
     }
88 117
 }

Loading…
Cancel
Save