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

+ 3
- 15
src/game.c View File

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
 static void show_explosion(uint16_t power) NONBANKED {
128
 static void show_explosion(uint16_t power) NONBANKED {
158
     int16_t spd_y = 0;
158
     int16_t spd_y = 0;
159
     enum SPRITE_ROT rot = 0;
159
     enum SPRITE_ROT rot = 0;
160
     enum ACCELERATION prev_acc = 0xFF; // so we draw the ship on the first frame
160
     enum ACCELERATION prev_acc = 0xFF; // so we draw the ship on the first frame
161
-    uint8_t ship_hiwater = 0;
162
     uint16_t health = HEALTH_MAX;
161
     uint16_t health = HEALTH_MAX;
163
     uint16_t power = POWER_MAX;
162
     uint16_t power = POWER_MAX;
164
     int32_t score = 0;
163
     int32_t score = 0;
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
         if (key_pressed(J_START)) {
333
         if (key_pressed(J_START)) {
338
             if (pause_screen()) {
334
             if (pause_screen()) {
339
                 break;
335
                 break;
341
 
337
 
342
             // restart bg music
338
             // restart bg music
343
             snd_music(SND_GAME);
339
             snd_music(SND_GAME);
344
-
345
-            // re-draw ship sprite
346
-            redraw = 1;
347
         }
340
         }
348
 
341
 
349
         pos_x = (pos_x + spd_x) & POS_MASK_BG;
342
         pos_x = (pos_x + spd_x) & POS_MASK_BG;
359
             spr_draw(SPR_DEBUG_LARGE, FLIP_NONE, 0, 0, 0, &hiwater);
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
         int16_t damage = obj_do(&spd_x, &spd_y, &score, &hiwater, 0);
357
         int16_t damage = obj_do(&spd_x, &spd_y, &score, &hiwater, 0);
370
         if (damage > 0) {
358
         if (damage > 0) {

+ 2
- 0
src/main.c View File

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

+ 31
- 6
src/maps.c View File

67
     START_ROM_BANK(BANK(title_map));
67
     START_ROM_BANK(BANK(title_map));
68
         set_bkg_palette(OAMF_CGB_PAL0, title_map_PALETTE_COUNT, title_map_palettes);
68
         set_bkg_palette(OAMF_CGB_PAL0, title_map_PALETTE_COUNT, title_map_palettes);
69
         set_bkg_data(0, title_map_TILE_COUNT, title_map_tiles);
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
         set_bkg_tiles(0, 0, title_map_WIDTH / title_map_TILE_W, title_map_HEIGHT / title_map_TILE_H, title_map_map);
81
         set_bkg_tiles(0, 0, title_map_WIDTH / title_map_TILE_W, title_map_HEIGHT / title_map_TILE_H, title_map_map);
72
     END_ROM_BANK();
82
     END_ROM_BANK();
73
 }
83
 }
76
     START_ROM_BANK(BANK(bg_map));
86
     START_ROM_BANK(BANK(bg_map));
77
         set_bkg_palette(OAMF_CGB_PAL0, bg_map_PALETTE_COUNT, bg_map_palettes);
87
         set_bkg_palette(OAMF_CGB_PAL0, bg_map_PALETTE_COUNT, bg_map_palettes);
78
         set_bkg_data(0, bg_map_TILE_COUNT, bg_map_tiles);
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
         set_bkg_tiles(0, 0, bg_map_WIDTH / bg_map_TILE_W, bg_map_HEIGHT / bg_map_TILE_H, bg_map_map);
100
         set_bkg_tiles(0, 0, bg_map_WIDTH / bg_map_TILE_W, bg_map_HEIGHT / bg_map_TILE_H, bg_map_map);
81
     END_ROM_BANK();
101
     END_ROM_BANK();
82
 }
102
 }
103
 static void set_win_based(uint8_t x, uint8_t y, uint8_t w, uint8_t h,
123
 static void set_win_based(uint8_t x, uint8_t y, uint8_t w, uint8_t h,
104
                           const uint8_t *tiles, uint8_t base_tile, uint8_t tile_bank,
124
                           const uint8_t *tiles, uint8_t base_tile, uint8_t tile_bank,
105
                           const uint8_t *attributes, uint8_t attr_bank) NONBANKED {
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
         VBK_REG = VBK_ATTRIBUTES;
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
         VBK_REG = VBK_TILES;
137
         VBK_REG = VBK_TILES;
113
         set_win_based_tiles(x, y, w, h, tiles, base_tile);
138
         set_win_based_tiles(x, y, w, h, tiles, base_tile);
114
     END_ROM_BANK();
139
     END_ROM_BANK();

+ 14
- 3
src/sprite_data.c View File

165
         .off = TILE_NUM_START,
165
         .off = TILE_NUM_START,
166
         .bank = BANK(pause),
166
         .bank = BANK(pause),
167
     },
167
     },
168
-    { // SPR_STATUS
168
+    { // SPR_STATUS_HEALTH
169
         .ms = status_spr8_metasprites,
169
         .ms = status_spr8_metasprites,
170
         .ms_n = ARR_LEN(status_spr8_metasprites),
170
         .ms_n = ARR_LEN(status_spr8_metasprites),
171
         .ti = status_spr8_tiles,
171
         .ti = status_spr8_tiles,
172
-        .pa = status_spr8_palettes,
172
+        .pa = NULL,
173
         .pa_n = status_spr8_PALETTE_COUNT,
173
         .pa_n = status_spr8_PALETTE_COUNT,
174
-        .pa_i = OAMF_CGB_PAL7 | PALETTE_DYNAMIC_LOAD_IP,
174
+        .pa_i = OAMF_CGB_PAL5,
175
         .cnt = status_spr8_TILE_COUNT,
175
         .cnt = status_spr8_TILE_COUNT,
176
         .off = TILE_NUM_START,
176
         .off = TILE_NUM_START,
177
         .bank = BANK(status_spr8),
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
     { // SPR_DEBUG
190
     { // SPR_DEBUG
180
         .ms = debug_marker_metasprites,
191
         .ms = debug_marker_metasprites,
181
         .ms_n = ARR_LEN(debug_marker_metasprites),
192
         .ms_n = ARR_LEN(debug_marker_metasprites),

+ 2
- 1
src/sprites.h View File

36
     SPR_POWER,
36
     SPR_POWER,
37
     SPR_EXPL,
37
     SPR_EXPL,
38
     SPR_PAUSE,
38
     SPR_PAUSE,
39
-    SPR_STATUS,
39
+    SPR_STATUS_HEALTH,
40
+    SPR_STATUS_POWER,
40
     SPR_DEBUG,
41
     SPR_DEBUG,
41
     SPR_DEBUG_LARGE,
42
     SPR_DEBUG_LARGE,
42
 
43
 

Loading…
Cancel
Save