Browse Source

always draw ship sprite, no bg map attributes, re-use palettes for status.

Thomas B 1 month ago
parent
commit
b4dceadd4d
6 changed files with 53 additions and 26 deletions
  1. 1
    1
      Makefile
  2. 3
    15
      src/game.c
  3. 2
    0
      src/main.c
  4. 31
    6
      src/maps.c
  5. 14
    3
      src/sprite_data.c
  6. 2
    1
      src/sprites.h

+ 1
- 1
Makefile View File

@@ -124,7 +124,7 @@ $(BUILD_DIR)/$(DATA_DIR)/%.c $(BUILD_DIR)/$(DATA_DIR)/%.h: $(DATA_DIR)/%.png
124 124
 	$(eval SPRFLAG = $(shell echo "$<" | sed -n 's/.*_spr\([0-9]\+\).*/\-sw \1 \-sh \1/p'))
125 125
 	$(if $(findstring _map,$<),                                                             \
126 126
 		@echo "Converting map $<" &&                                                    \
127
-		$(PNGA) $< -o $@ -spr8x8 -map -use_map_attributes -noflip                       \
127
+		$(PNGA) $< -o $@ -spr8x8 -map -noflip                                           \
128 128
 	,$(if $(findstring _fnt,$<),                                                            \
129 129
 		@echo "Converting font $<" &&                                                   \
130 130
 		$(PNGA) $< -o $@ -spr8x8 -sw 16 -sh 16 -map -noflip                             \

+ 3
- 15
src/game.c View File

@@ -121,8 +121,8 @@ static void status(uint8_t health, uint8_t power, uint8_t *hiwater) NONBANKED {
121 121
         }
122 122
     }
123 123
 
124
-    spr_draw(SPR_STATUS, FLIP_NONE, BAR_OFFSET_X, HEALTH_OFFSET_Y - 24 - 9, 0, hiwater);
125
-    spr_draw(SPR_STATUS, FLIP_NONE, BAR_OFFSET_X, POWER_OFFSET_Y + 0 - 9, 1, hiwater);
124
+    spr_draw(SPR_STATUS_HEALTH, FLIP_NONE, BAR_OFFSET_X, HEALTH_OFFSET_Y - 24 - 9, 0, hiwater);
125
+    spr_draw(SPR_STATUS_POWER, FLIP_NONE, BAR_OFFSET_X, POWER_OFFSET_Y + 0 - 9, 1, hiwater);
126 126
 }
127 127
 
128 128
 static void show_explosion(uint16_t power) NONBANKED {
@@ -158,7 +158,6 @@ int32_t game(void) NONBANKED {
158 158
     int16_t spd_y = 0;
159 159
     enum SPRITE_ROT rot = 0;
160 160
     enum ACCELERATION prev_acc = 0xFF; // so we draw the ship on the first frame
161
-    uint8_t ship_hiwater = 0;
162 161
     uint16_t health = HEALTH_MAX;
163 162
     uint16_t power = POWER_MAX;
164 163
     int32_t score = 0;
@@ -331,9 +330,6 @@ int32_t game(void) NONBANKED {
331 330
             }
332 331
         }
333 332
 
334
-        // re-draw ship sprite when we've just rotated or are starting or stopping acceleration
335
-        uint8_t redraw = (acc & ACC_R) || ((prev_acc & (ACC_X | ACC_Y)) != (acc & (ACC_X | ACC_Y)));
336
-
337 333
         if (key_pressed(J_START)) {
338 334
             if (pause_screen()) {
339 335
                 break;
@@ -341,9 +337,6 @@ int32_t game(void) NONBANKED {
341 337
 
342 338
             // restart bg music
343 339
             snd_music(SND_GAME);
344
-
345
-            // re-draw ship sprite
346
-            redraw = 1;
347 340
         }
348 341
 
349 342
         pos_x = (pos_x + spd_x) & POS_MASK_BG;
@@ -359,12 +352,7 @@ int32_t game(void) NONBANKED {
359 352
             spr_draw(SPR_DEBUG_LARGE, FLIP_NONE, 0, 0, 0, &hiwater);
360 353
         }
361 354
 
362
-        if (redraw) {
363
-            spr_ship(rot, acc & (ACC_X | ACC_Y), &hiwater);
364
-            ship_hiwater = hiwater;
365
-        } else {
366
-            hiwater = ship_hiwater;
367
-        }
355
+        spr_ship(rot, acc & (ACC_X | ACC_Y), &hiwater);
368 356
 
369 357
         int16_t damage = obj_do(&spd_x, &spd_y, &score, &hiwater, 0);
370 358
         if (damage > 0) {

+ 2
- 0
src/main.c View File

@@ -25,6 +25,7 @@
25 25
 
26 26
 #include "banks.h"
27 27
 #include "config.h"
28
+#include "gb/hardware.h"
28 29
 #include "maps.h"
29 30
 #include "obj.h"
30 31
 #include "sprites.h"
@@ -545,6 +546,7 @@ void main(void) NONBANKED {
545 546
     // "cheat" and enable double-speed CPU mode on GBC
546 547
     if (_cpu == CGB_TYPE) {
547 548
         cpu_fast();
549
+        LCDC_REG &= ~LCDCF_BGON;
548 550
     }
549 551
 
550 552
     conf_init();

+ 31
- 6
src/maps.c View File

@@ -67,7 +67,17 @@ void map_title(void) NONBANKED {
67 67
     START_ROM_BANK(BANK(title_map));
68 68
         set_bkg_palette(OAMF_CGB_PAL0, title_map_PALETTE_COUNT, title_map_palettes);
69 69
         set_bkg_data(0, title_map_TILE_COUNT, title_map_tiles);
70
-        set_bkg_attributes(0, 0, title_map_MAP_ATTRIBUTES_WIDTH, title_map_MAP_ATTRIBUTES_HEIGHT, title_map_MAP_ATTRIBUTES);
70
+        if (title_map_MAP_ATTRIBUTES != NULL) {
71
+            set_bkg_attributes(0, 0,
72
+                               title_map_WIDTH / title_map_TILE_W, title_map_HEIGHT / title_map_TILE_H,
73
+                               title_map_MAP_ATTRIBUTES);
74
+        } else {
75
+            VBK_REG = VBK_ATTRIBUTES;
76
+            fill_bkg_rect(0, 0,
77
+                          title_map_WIDTH / title_map_TILE_W, title_map_HEIGHT / title_map_TILE_H,
78
+                          0x00);
79
+            VBK_REG = VBK_TILES;
80
+        }
71 81
         set_bkg_tiles(0, 0, title_map_WIDTH / title_map_TILE_W, title_map_HEIGHT / title_map_TILE_H, title_map_map);
72 82
     END_ROM_BANK();
73 83
 }
@@ -76,7 +86,17 @@ void map_game(void) NONBANKED {
76 86
     START_ROM_BANK(BANK(bg_map));
77 87
         set_bkg_palette(OAMF_CGB_PAL0, bg_map_PALETTE_COUNT, bg_map_palettes);
78 88
         set_bkg_data(0, bg_map_TILE_COUNT, bg_map_tiles);
79
-        set_bkg_attributes(0, 0, bg_map_MAP_ATTRIBUTES_WIDTH, bg_map_MAP_ATTRIBUTES_HEIGHT, bg_map_MAP_ATTRIBUTES);
89
+        if (bg_map_MAP_ATTRIBUTES != NULL) {
90
+            set_bkg_attributes(0, 0,
91
+                               bg_map_WIDTH / bg_map_TILE_W, bg_map_HEIGHT / bg_map_TILE_H,
92
+                               bg_map_MAP_ATTRIBUTES);
93
+        } else {
94
+            VBK_REG = VBK_ATTRIBUTES;
95
+            fill_bkg_rect(0, 0,
96
+                          bg_map_WIDTH / bg_map_TILE_W, bg_map_HEIGHT / bg_map_TILE_H,
97
+                          0x00);
98
+            VBK_REG = VBK_TILES;
99
+        }
80 100
         set_bkg_tiles(0, 0, bg_map_WIDTH / bg_map_TILE_W, bg_map_HEIGHT / bg_map_TILE_H, bg_map_map);
81 101
     END_ROM_BANK();
82 102
 }
@@ -103,12 +123,17 @@ void win_init(uint8_t is_splash) NONBANKED {
103 123
 static void set_win_based(uint8_t x, uint8_t y, uint8_t w, uint8_t h,
104 124
                           const uint8_t *tiles, uint8_t base_tile, uint8_t tile_bank,
105 125
                           const uint8_t *attributes, uint8_t attr_bank) NONBANKED {
106
-    START_ROM_BANK(attr_bank);
126
+    if (attributes != NULL) {
127
+        START_ROM_BANK(attr_bank);
128
+            VBK_REG = VBK_ATTRIBUTES;
129
+            set_win_tiles(x, y, w, h, attributes);
130
+        END_ROM_BANK();
131
+    } else {
107 132
         VBK_REG = VBK_ATTRIBUTES;
108
-        set_win_tiles(x, y, w, h, attributes);
109
-    END_ROM_BANK();
133
+        fill_win_rect(x, y, w, h, 0x00);
134
+    }
110 135
 
111
-    START_ROM_BANK_2(tile_bank);
136
+    START_ROM_BANK(tile_bank);
112 137
         VBK_REG = VBK_TILES;
113 138
         set_win_based_tiles(x, y, w, h, tiles, base_tile);
114 139
     END_ROM_BANK();

+ 14
- 3
src/sprite_data.c View File

@@ -165,17 +165,28 @@ struct sprites metasprites[SPRITE_COUNT] = {
165 165
         .off = TILE_NUM_START,
166 166
         .bank = BANK(pause),
167 167
     },
168
-    { // SPR_STATUS
168
+    { // SPR_STATUS_HEALTH
169 169
         .ms = status_spr8_metasprites,
170 170
         .ms_n = ARR_LEN(status_spr8_metasprites),
171 171
         .ti = status_spr8_tiles,
172
-        .pa = status_spr8_palettes,
172
+        .pa = NULL,
173 173
         .pa_n = status_spr8_PALETTE_COUNT,
174
-        .pa_i = OAMF_CGB_PAL7 | PALETTE_DYNAMIC_LOAD_IP,
174
+        .pa_i = OAMF_CGB_PAL5,
175 175
         .cnt = status_spr8_TILE_COUNT,
176 176
         .off = TILE_NUM_START,
177 177
         .bank = BANK(status_spr8),
178 178
     },
179
+    { // SPR_STATUS_POWER
180
+        .ms = status_spr8_metasprites,
181
+        .ms_n = ARR_LEN(status_spr8_metasprites),
182
+        .ti = status_spr8_tiles,
183
+        .pa = NULL,
184
+        .pa_n = status_spr8_PALETTE_COUNT,
185
+        .pa_i = OAMF_CGB_PAL6,
186
+        .cnt = status_spr8_TILE_COUNT,
187
+        .off = SPR_STATUS_HEALTH,
188
+        .bank = BANK(status_spr8),
189
+    },
179 190
     { // SPR_DEBUG
180 191
         .ms = debug_marker_metasprites,
181 192
         .ms_n = ARR_LEN(debug_marker_metasprites),

+ 2
- 1
src/sprites.h View File

@@ -36,7 +36,8 @@ enum SPRITES {
36 36
     SPR_POWER,
37 37
     SPR_EXPL,
38 38
     SPR_PAUSE,
39
-    SPR_STATUS,
39
+    SPR_STATUS_HEALTH,
40
+    SPR_STATUS_POWER,
40 41
     SPR_DEBUG,
41 42
     SPR_DEBUG_LARGE,
42 43
 

Loading…
Cancel
Save