Browse Source

add explosion sprites and convert individual bar sprites to one. load explosion palettes dynamically.

Thomas B 1 month ago
parent
commit
7c8f2a609c
19 changed files with 162 additions and 193 deletions
  1. 8
    2
      Makefile
  2. BIN
      data/bar_1.png
  3. BIN
      data/bar_2.png
  4. BIN
      data/bar_3.png
  5. BIN
      data/bar_4.png
  6. BIN
      data/bar_5.png
  7. BIN
      data/bar_6.png
  8. BIN
      data/bar_7.png
  9. BIN
      data/bar_8.png
  10. BIN
      data/bar_spr8.png
  11. BIN
      data/expl_spr16.png
  12. 32
    16
      src/game.c
  13. 10
    3
      src/main.c
  14. 25
    2
      src/maps.c
  15. 1
    0
      src/maps.h
  16. 47
    146
      src/sprite_data.c
  17. 7
    0
      src/sprite_data.h
  18. 28
    8
      src/sprites.c
  19. 4
    16
      src/sprites.h

+ 8
- 2
Makefile View File

37
 ROMU := $(GBDK_HOME)/bin/romusage
37
 ROMU := $(GBDK_HOME)/bin/romusage
38
 GB_EMU := gearboy
38
 GB_EMU := gearboy
39
 
39
 
40
-LCCFLAGS := -Wa-l -Wl-m -Wp-MMD
40
+LCCFLAGS := -Wa-l -Wl-m -Wp-MMD # -Wf--opt-code-speed
41
 LCCFLAGS += -I$(BUILD_DIR)/$(DATA_DIR)
41
 LCCFLAGS += -I$(BUILD_DIR)/$(DATA_DIR)
42
 LCCFLAGS += -Wm"-yn Duality" -Wm-yt0x1A -Wm-yoA -Wm-ya16 -Wm-yc
42
 LCCFLAGS += -Wm"-yn Duality" -Wm-yt0x1A -Wm-yoA -Wm-ya16 -Wm-yc
43
 LCCFLAGS += -autobank -Wb-ext=.rel -Wb-v -Wf-bo255
43
 LCCFLAGS += -autobank -Wb-ext=.rel -Wb-v -Wf-bo255
88
 	,$(if $(findstring _fnt,$<), \
88
 	,$(if $(findstring _fnt,$<), \
89
 		@echo "Converting font $<" && \
89
 		@echo "Converting font $<" && \
90
 		$(PNGA) $< -o $@ -spr8x8 -sw 16 -sh 16 -map -noflip \
90
 		$(PNGA) $< -o $@ -spr8x8 -sw 16 -sh 16 -map -noflip \
91
+	,$(if $(findstring _spr8,$<), \
92
+		@echo "Converting 8x8 sprite $<" && \
93
+		$(PNGA) $< -o $@ -spr8x8 -sw 8 -sh 8 -noflip \
94
+	,$(if $(findstring _spr16,$<), \
95
+		@echo "Converting 16x16 sprite $<" && \
96
+		$(PNGA) $< -o $@ -spr8x8 -sw 16 -sh 16 -noflip \
91
 	,                                     \
97
 	,                                     \
92
 		@echo "Converting tile $<" && \
98
 		@echo "Converting tile $<" && \
93
 		$(PNGA) $< -o $@ -spr8x8      \
99
 		$(PNGA) $< -o $@ -spr8x8      \
94
-	))
100
+	))))
95
 
101
 
96
 $(BUILD_DIR)/%.o: %.c $(SPRITES)
102
 $(BUILD_DIR)/%.o: %.c $(SPRITES)
97
 	@mkdir -p $(@D)
103
 	@mkdir -p $(@D)

BIN
data/bar_1.png View File


BIN
data/bar_2.png View File


BIN
data/bar_3.png View File


BIN
data/bar_4.png View File


BIN
data/bar_5.png View File


BIN
data/bar_6.png View File


BIN
data/bar_7.png View File


BIN
data/bar_8.png View File


BIN
data/bar_spr8.png View File


BIN
data/expl_spr16.png View File


+ 32
- 16
src/game.c View File

43
     if (health > 0) {
43
     if (health > 0) {
44
         switch (health >> 6) {
44
         switch (health >> 6) {
45
             case 3:
45
             case 3:
46
-                spr_draw(SPR_HEALTH_1 + (((health >> 6) == 3) ? ((health >> 3) & 7) : 7),
47
-                         FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 24, 0, hiwater);
46
+                spr_draw(SPR_HEALTH, FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 24,
47
+                         ((health >> 6) == 3) ? 7 - ((health >> 3) & 7) : 0, hiwater);
48
             case 2:
48
             case 2:
49
-                spr_draw(SPR_HEALTH_1 + (((health >> 6) == 2) ? ((health >> 3) & 7) : 7),
50
-                         FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 16, 0, hiwater);
49
+                spr_draw(SPR_HEALTH, FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 16,
50
+                         ((health >> 6) == 2) ? 7 - ((health >> 3) & 7) : 0, hiwater);
51
             case 1:
51
             case 1:
52
-                spr_draw(SPR_HEALTH_1 + (((health >> 6) == 1) ? ((health >> 3) & 7) : 7),
53
-                         FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 8, 0, hiwater);
52
+                spr_draw(SPR_HEALTH, FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 8,
53
+                         ((health >> 6) == 1) ? 7 - ((health >> 3) & 7) : 0, hiwater);
54
             case 0:
54
             case 0:
55
-                spr_draw(SPR_HEALTH_1 + (((health >> 6) == 0) ? ((health >> 3) & 7) : 7),
56
-                         FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 0, 0, hiwater);
55
+                spr_draw(SPR_HEALTH, FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 0,
56
+                         ((health >> 6) == 0) ? 7 - ((health >> 3) & 7) : 0, hiwater);
57
         }
57
         }
58
     }
58
     }
59
 
59
 
60
     if (power > 0) {
60
     if (power > 0) {
61
         switch (power >> 6) {
61
         switch (power >> 6) {
62
             case 3:
62
             case 3:
63
-                spr_draw(SPR_POWER_1 + (((power >> 6) == 3) ? ((power >> 3) & 7) : 7),
64
-                         FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 0, 0, hiwater);
63
+                spr_draw(SPR_POWER, FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 0,
64
+                         ((power >> 6) == 3) ? 7 - ((power >> 3) & 7) : 0, hiwater);
65
             case 2:
65
             case 2:
66
-                spr_draw(SPR_POWER_1 + (((power >> 6) == 2) ? ((power >> 3) & 7) : 7),
67
-                         FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 8, 0, hiwater);
66
+                spr_draw(SPR_POWER, FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 8,
67
+                         ((power >> 6) == 2) ? 7 - ((power >> 3) & 7) : 0, hiwater);
68
             case 1:
68
             case 1:
69
-                spr_draw(SPR_POWER_1 + (((power >> 6) == 1) ? ((power >> 3) & 7) : 7),
70
-                         FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 16, 0, hiwater);
69
+                spr_draw(SPR_POWER, FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 16,
70
+                         ((power >> 6) == 1) ? 7 - ((power >> 3) & 7) : 0, hiwater);
71
             case 0:
71
             case 0:
72
-                spr_draw(SPR_POWER_1 + (((power >> 6) == 0) ? ((power >> 3) & 7) : 7),
73
-                         FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 24, 0, hiwater);
72
+                spr_draw(SPR_POWER, FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 24,
73
+                         ((power >> 6) == 0) ? 7 - ((power >> 3) & 7) : 0, hiwater);
74
         }
74
         }
75
     }
75
     }
76
 }
76
 }
77
 
77
 
78
+static void show_explosion(uint16_t power) {
79
+    for (uint8_t n = 0; n < (4 * 4); n++) {
80
+        uint8_t hiwater = SPR_NUM_START;
81
+        spr_draw(SPR_EXPL, FLIP_NONE, 0, 0, n >> 2, &hiwater);
82
+
83
+        // can't draw objects, we used the pallettes for the explosion
84
+        //obj_draw(0, 0, &hiwater);
85
+
86
+        status(0, power >> POWER_SHIFT, &hiwater);
87
+        hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
88
+        vsync();
89
+    }
90
+}
91
+
78
 int32_t game(void) NONBANKED {
92
 int32_t game(void) NONBANKED {
79
     disable_interrupts();
93
     disable_interrupts();
80
     DISPLAY_OFF;
94
     DISPLAY_OFF;
81
     map_game();
95
     map_game();
82
     SHOW_BKG;
96
     SHOW_BKG;
97
+    spr_init_pal();
83
     SHOW_SPRITES;
98
     SHOW_SPRITES;
84
     SPRITES_8x8;
99
     SPRITES_8x8;
85
 
100
 
174
                 health -= damage;
189
                 health -= damage;
175
             } else if (health <= damage) {
190
             } else if (health <= damage) {
176
                 health = 0;
191
                 health = 0;
192
+                show_explosion(power);
177
                 break;
193
                 break;
178
             }
194
             }
179
         } else if (damage < 0) {
195
         } else if (damage < 0) {

+ 10
- 3
src/main.c View File

38
     HIDE_WIN;
38
     HIDE_WIN;
39
 
39
 
40
     hide_sprites_range(SPR_NUM_START, MAX_HARDWARE_SPRITES);
40
     hide_sprites_range(SPR_NUM_START, MAX_HARDWARE_SPRITES);
41
-    win_score_clear(is_black);
41
+    win_score_clear(is_black ? 1 : 0);
42
 
42
 
43
     move_win(MINWNDPOSX, MINWNDPOSY);
43
     move_win(MINWNDPOSX, MINWNDPOSY);
44
     SHOW_WIN;
44
     SHOW_WIN;
80
     disable_interrupts();
80
     disable_interrupts();
81
     DISPLAY_OFF;
81
     DISPLAY_OFF;
82
     map_title();
82
     map_title();
83
+    move_bkg(0, 0);
83
     SHOW_BKG;
84
     SHOW_BKG;
85
+    spr_init_pal();
84
     SHOW_SPRITES;
86
     SHOW_SPRITES;
85
     SPRITES_8x8;
87
     SPRITES_8x8;
86
 
88
 
115
     }
117
     }
116
 }
118
 }
117
 
119
 
118
-uint16_t ask_name(void) NONBANKED {
120
+uint16_t ask_name(int32_t score) NONBANKED {
119
     disable_interrupts();
121
     disable_interrupts();
120
     DISPLAY_OFF;
122
     DISPLAY_OFF;
121
     map_title();
123
     map_title();
124
+    move_bkg(0, 0);
122
     SHOW_BKG;
125
     SHOW_BKG;
126
+    spr_init_pal();
123
     SHOW_SPRITES;
127
     SHOW_SPRITES;
124
     SPRITES_8x8;
128
     SPRITES_8x8;
125
 
129
 
126
     hide_sprites_range(SPR_NUM_START, MAX_HARDWARE_SPRITES);
130
     hide_sprites_range(SPR_NUM_START, MAX_HARDWARE_SPRITES);
127
 
131
 
132
+    win_init(1);
133
+    win_name(score);
134
+
128
     // TODO ask for name
135
     // TODO ask for name
129
 
136
 
130
     move_win(MINWNDPOSX, MINWNDPOSY);
137
     move_win(MINWNDPOSX, MINWNDPOSY);
172
         int32_t score = game();
179
         int32_t score = game();
173
 
180
 
174
         if (score_ranking(score)) {
181
         if (score_ranking(score)) {
175
-            uint16_t name = ask_name();
182
+            uint16_t name = ask_name(score);
176
             struct scores s = { .name = name, .score = score };
183
             struct scores s = { .name = name, .score = score };
177
             score_add(s);
184
             score_add(s);
178
         }
185
         }

+ 25
- 2
src/maps.c View File

120
     uint8_t n = 0;
120
     uint8_t n = 0;
121
     while (*s) {
121
     while (*s) {
122
         char c = *(s++);
122
         char c = *(s++);
123
-        if ((c >= 'A') && (c <= 'Z')) c = c - 'A' + 'a';
124
-        if ((c < 'a') || (c > 'z')) c = 'x';
123
+        if ((c >= 'A') && (c <= 'Z')) {
124
+            c = c - 'A' + 'a';
125
+        }
126
+        if ((c < 'a') || (c > 'z')) {
127
+            n++;
128
+            continue;
129
+        }
125
         character(c - 'a', n++, x_off, y_off, is_black);
130
         character(c - 'a', n++, x_off, y_off, is_black);
126
     }
131
     }
127
 }
132
 }
198
     number(is_black ? -score.score : score.score, 7, 4 + off * 3, is_black);
203
     number(is_black ? -score.score : score.score, 7, 4 + off * 3, is_black);
199
 }
204
 }
200
 
205
 
206
+void win_name(int32_t score) NONBANKED {
207
+    SWITCH_ROM(BANK(title_map));
208
+    set_win_based(0, 0,
209
+                  title_map_WIDTH / title_map_TILE_W, title_map_HEIGHT / title_map_TILE_H,
210
+                  title_map_map, 0, title_map_MAP_ATTRIBUTES);
211
+
212
+    str("score", 10 - 5, 1, score < 0);
213
+    number(score, 0xFF, 3, score < 0);
214
+
215
+    str("enter", 10 - 5, 6, score < 0);
216
+    str("name", 10 - 4, 8, score < 0);
217
+
218
+    // placeholder
219
+    str("aaa", 10 - 3, 12, score < 0);
220
+
221
+    str("start ok", 10 - 8, 16, score < 0);
222
+}
223
+
201
 uint8_t win_game_draw(int32_t score) NONBANKED {
224
 uint8_t win_game_draw(int32_t score) NONBANKED {
202
     fill_win(0, 0, 10, 2, fnt_off + numbers_fnt_TILE_COUNT, 0x81);
225
     fill_win(0, 0, 10, 2, fnt_off + numbers_fnt_TILE_COUNT, 0x81);
203
 
226
 

+ 1
- 0
src/maps.h View File

30
 void win_splash_draw(int32_t lowest, int32_t highest);
30
 void win_splash_draw(int32_t lowest, int32_t highest);
31
 void win_score_clear(uint8_t is_black);
31
 void win_score_clear(uint8_t is_black);
32
 void win_score_draw(struct scores score, uint8_t off, uint8_t is_black);
32
 void win_score_draw(struct scores score, uint8_t off, uint8_t is_black);
33
+void win_name(int32_t score);
33
 uint8_t win_game_draw(int32_t score);
34
 uint8_t win_game_draw(int32_t score);
34
 
35
 
35
 #endif // __MAPS_H__
36
 #endif // __MAPS_H__

+ 47
- 146
src/sprite_data.c View File

29
 #include "light.h"
29
 #include "light.h"
30
 #include "dark.h"
30
 #include "dark.h"
31
 #include "shoot.h"
31
 #include "shoot.h"
32
-#include "bar_1.h"
33
-#include "bar_2.h"
34
-#include "bar_3.h"
35
-#include "bar_4.h"
36
-#include "bar_5.h"
37
-#include "bar_6.h"
38
-#include "bar_7.h"
39
-#include "bar_8.h"
32
+#include "bar_spr8.h"
33
+#include "expl_spr16.h"
40
 
34
 
41
 const palette_color_t power_palettes[4] = {
35
 const palette_color_t power_palettes[4] = {
42
   //RGB8(  0,  0,  0), RGB8(240,  0,  0), RGB8(196,  0,  0), RGB8(116,  0,  0)
36
   //RGB8(  0,  0,  0), RGB8(240,  0,  0), RGB8(196,  0,  0), RGB8(116,  0,  0)
47
 struct sprites metasprites[SPRITE_COUNT] = {
41
 struct sprites metasprites[SPRITE_COUNT] = {
48
     { // SPR_SHIP_0
42
     { // SPR_SHIP_0
49
         .ms = rockshp_0_metasprites,
43
         .ms = rockshp_0_metasprites,
44
+        .ms_n = ARR_LEN(rockshp_0_metasprites),
50
         .ti = rockshp_0_tiles,
45
         .ti = rockshp_0_tiles,
51
         .pa = rockshp_0_palettes,
46
         .pa = rockshp_0_palettes,
47
+        .pa_n = rockshp_0_PALETTE_COUNT,
52
         .pa_i = OAMF_CGB_PAL0,
48
         .pa_i = OAMF_CGB_PAL0,
53
         .cnt = rockshp_0_TILE_COUNT,
49
         .cnt = rockshp_0_TILE_COUNT,
54
         .off = TILE_NUM_START,
50
         .off = TILE_NUM_START,
56
     },
52
     },
57
     { // SPR_SHIP_90
53
     { // SPR_SHIP_90
58
         .ms = rockshp_90_metasprites,
54
         .ms = rockshp_90_metasprites,
55
+        .ms_n = ARR_LEN(rockshp_90_metasprites),
59
         .ti = rockshp_90_tiles,
56
         .ti = rockshp_90_tiles,
60
         .pa = NULL,
57
         .pa = NULL,
58
+        .pa_n = rockshp_90_PALETTE_COUNT,
61
         .pa_i = OAMF_CGB_PAL0,
59
         .pa_i = OAMF_CGB_PAL0,
62
         .cnt = rockshp_90_TILE_COUNT,
60
         .cnt = rockshp_90_TILE_COUNT,
63
         .off = TILE_NUM_START,
61
         .off = TILE_NUM_START,
65
     },
63
     },
66
     { // SPR_THRUST_0
64
     { // SPR_THRUST_0
67
         .ms = thrust_0_metasprites,
65
         .ms = thrust_0_metasprites,
66
+        .ms_n = ARR_LEN(thrust_0_metasprites),
68
         .ti = thrust_0_tiles,
67
         .ti = thrust_0_tiles,
69
         .pa = thrust_0_palettes,
68
         .pa = thrust_0_palettes,
69
+        .pa_n = thrust_0_PALETTE_COUNT,
70
         .pa_i = OAMF_CGB_PAL1,
70
         .pa_i = OAMF_CGB_PAL1,
71
         .cnt = thrust_0_TILE_COUNT,
71
         .cnt = thrust_0_TILE_COUNT,
72
         .off = TILE_NUM_START,
72
         .off = TILE_NUM_START,
74
     },
74
     },
75
     { // SPR_THRUST_90
75
     { // SPR_THRUST_90
76
         .ms = thrust_90_metasprites,
76
         .ms = thrust_90_metasprites,
77
+        .ms_n = ARR_LEN(thrust_90_metasprites),
77
         .ti = thrust_90_tiles,
78
         .ti = thrust_90_tiles,
78
         .pa = NULL,
79
         .pa = NULL,
80
+        .pa_n = thrust_90_PALETTE_COUNT,
79
         .pa_i = OAMF_CGB_PAL1,
81
         .pa_i = OAMF_CGB_PAL1,
80
         .cnt = thrust_90_TILE_COUNT,
82
         .cnt = thrust_90_TILE_COUNT,
81
         .off = TILE_NUM_START,
83
         .off = TILE_NUM_START,
83
     },
85
     },
84
     { // SPR_LIGHT
86
     { // SPR_LIGHT
85
         .ms = light_metasprites,
87
         .ms = light_metasprites,
88
+        .ms_n = ARR_LEN(light_metasprites),
86
         .ti = light_tiles,
89
         .ti = light_tiles,
87
         .pa = light_palettes,
90
         .pa = light_palettes,
91
+        .pa_n = light_PALETTE_COUNT,
88
         .pa_i = OAMF_CGB_PAL2,
92
         .pa_i = OAMF_CGB_PAL2,
89
         .cnt = light_TILE_COUNT,
93
         .cnt = light_TILE_COUNT,
90
         .off = TILE_NUM_START,
94
         .off = TILE_NUM_START,
92
     },
96
     },
93
     { // SPR_DARK
97
     { // SPR_DARK
94
         .ms = dark_metasprites,
98
         .ms = dark_metasprites,
99
+        .ms_n = ARR_LEN(dark_metasprites),
95
         .ti = dark_tiles,
100
         .ti = dark_tiles,
96
         .pa = dark_palettes,
101
         .pa = dark_palettes,
102
+        .pa_n = dark_PALETTE_COUNT,
97
         .pa_i = OAMF_CGB_PAL3,
103
         .pa_i = OAMF_CGB_PAL3,
98
         .cnt = dark_TILE_COUNT,
104
         .cnt = dark_TILE_COUNT,
99
         .off = TILE_NUM_START,
105
         .off = TILE_NUM_START,
101
     },
107
     },
102
     { // SPR_SHOT
108
     { // SPR_SHOT
103
         .ms = shoot_metasprites,
109
         .ms = shoot_metasprites,
110
+        .ms_n = ARR_LEN(shoot_metasprites),
104
         .ti = shoot_tiles,
111
         .ti = shoot_tiles,
105
         .pa = shoot_palettes,
112
         .pa = shoot_palettes,
113
+        .pa_n = shoot_PALETTE_COUNT,
106
         .pa_i = OAMF_CGB_PAL4,
114
         .pa_i = OAMF_CGB_PAL4,
107
         .cnt = shoot_TILE_COUNT,
115
         .cnt = shoot_TILE_COUNT,
108
         .off = TILE_NUM_START,
116
         .off = TILE_NUM_START,
110
     },
118
     },
111
     { // SPR_SHOT_LIGHT
119
     { // SPR_SHOT_LIGHT
112
         .ms = shoot_metasprites,
120
         .ms = shoot_metasprites,
121
+        .ms_n = ARR_LEN(shoot_metasprites),
113
         .ti = shoot_tiles,
122
         .ti = shoot_tiles,
114
         .pa = NULL,
123
         .pa = NULL,
124
+        .pa_n = shoot_PALETTE_COUNT,
115
         .pa_i = OAMF_CGB_PAL2,
125
         .pa_i = OAMF_CGB_PAL2,
116
         .cnt = shoot_TILE_COUNT,
126
         .cnt = shoot_TILE_COUNT,
117
         .off = SPR_SHOT,
127
         .off = SPR_SHOT,
119
     },
129
     },
120
     { // SPR_SHOT_DARK
130
     { // SPR_SHOT_DARK
121
         .ms = shoot_metasprites,
131
         .ms = shoot_metasprites,
132
+        .ms_n = ARR_LEN(shoot_metasprites),
122
         .ti = shoot_tiles,
133
         .ti = shoot_tiles,
123
         .pa = NULL,
134
         .pa = NULL,
135
+        .pa_n = shoot_PALETTE_COUNT,
124
         .pa_i = OAMF_CGB_PAL3,
136
         .pa_i = OAMF_CGB_PAL3,
125
         .cnt = shoot_TILE_COUNT,
137
         .cnt = shoot_TILE_COUNT,
126
         .off = SPR_SHOT,
138
         .off = SPR_SHOT,
127
         .bank = BANK(shoot),
139
         .bank = BANK(shoot),
128
     },
140
     },
129
-    { // SPR_HEALTH_1
130
-        .ms = bar_1_metasprites,
131
-        .ti = bar_1_tiles,
132
-        .pa = bar_1_palettes,
141
+    { // SPR_HEALTH
142
+        .ms = bar_spr8_metasprites,
143
+        .ms_n = ARR_LEN(bar_spr8_metasprites),
144
+        .ti = bar_spr8_tiles,
145
+        .pa = bar_spr8_palettes,
146
+        .pa_n = bar_spr8_PALETTE_COUNT,
133
         .pa_i = OAMF_CGB_PAL5,
147
         .pa_i = OAMF_CGB_PAL5,
134
-        .cnt = bar_1_TILE_COUNT,
148
+        .cnt = bar_spr8_TILE_COUNT,
135
         .off = TILE_NUM_START,
149
         .off = TILE_NUM_START,
136
-        .bank = BANK(bar_1),
150
+        .bank = BANK(bar_spr8),
137
     },
151
     },
138
-    { // SPR_HEALTH_2
139
-        .ms = bar_2_metasprites,
140
-        .ti = bar_2_tiles,
141
-        .pa = NULL,
142
-        .pa_i = OAMF_CGB_PAL5,
143
-        .cnt = bar_2_TILE_COUNT,
144
-        .off = TILE_NUM_START,
145
-        .bank = BANK(bar_2),
146
-    },
147
-    { // SPR_HEALTH_3
148
-        .ms = bar_3_metasprites,
149
-        .ti = bar_3_tiles,
150
-        .pa = NULL,
151
-        .pa_i = OAMF_CGB_PAL5,
152
-        .cnt = bar_3_TILE_COUNT,
153
-        .off = TILE_NUM_START,
154
-        .bank = BANK(bar_3),
155
-    },
156
-    { // SPR_HEALTH_4
157
-        .ms = bar_4_metasprites,
158
-        .ti = bar_4_tiles,
159
-        .pa = NULL,
160
-        .pa_i = OAMF_CGB_PAL5,
161
-        .cnt = bar_4_TILE_COUNT,
162
-        .off = TILE_NUM_START,
163
-        .bank = BANK(bar_4),
164
-    },
165
-    { // SPR_HEALTH_5
166
-        .ms = bar_5_metasprites,
167
-        .ti = bar_5_tiles,
168
-        .pa = NULL,
169
-        .pa_i = OAMF_CGB_PAL5,
170
-        .cnt = bar_5_TILE_COUNT,
171
-        .off = TILE_NUM_START,
172
-        .bank = BANK(bar_5),
173
-    },
174
-    { // SPR_HEALTH_6
175
-        .ms = bar_6_metasprites,
176
-        .ti = bar_6_tiles,
177
-        .pa = NULL,
178
-        .pa_i = OAMF_CGB_PAL5,
179
-        .cnt = bar_6_TILE_COUNT,
180
-        .off = TILE_NUM_START,
181
-        .bank = BANK(bar_6),
182
-    },
183
-    { // SPR_HEALTH_7
184
-        .ms = bar_7_metasprites,
185
-        .ti = bar_7_tiles,
186
-        .pa = NULL,
187
-        .pa_i = OAMF_CGB_PAL5,
188
-        .cnt = bar_7_TILE_COUNT,
189
-        .off = TILE_NUM_START,
190
-        .bank = BANK(bar_7),
191
-    },
192
-    { // SPR_HEALTH_8
193
-        .ms = bar_8_metasprites,
194
-        .ti = bar_8_tiles,
195
-        .pa = NULL,
196
-        .pa_i = OAMF_CGB_PAL5,
197
-        .cnt = bar_8_TILE_COUNT,
198
-        .off = TILE_NUM_START,
199
-        .bank = BANK(bar_8),
200
-    },
201
-    { // SPR_POWER_1
202
-        .ms = bar_1_metasprites,
203
-        .ti = bar_1_tiles,
152
+    { // SPR_POWER
153
+        .ms = bar_spr8_metasprites,
154
+        .ms_n = ARR_LEN(bar_spr8_metasprites),
155
+        .ti = bar_spr8_tiles,
204
         .pa = power_palettes,
156
         .pa = power_palettes,
157
+        .pa_n = bar_spr8_PALETTE_COUNT,
205
         .pa_i = OAMF_CGB_PAL6,
158
         .pa_i = OAMF_CGB_PAL6,
206
-        .cnt = bar_1_TILE_COUNT,
207
-        .off = SPR_HEALTH_1,
208
-        .bank = BANK(bar_1),
209
-    },
210
-    { // SPR_POWER_2
211
-        .ms = bar_2_metasprites,
212
-        .ti = bar_2_tiles,
213
-        .pa = NULL,
214
-        .pa_i = OAMF_CGB_PAL6,
215
-        .cnt = bar_2_TILE_COUNT,
216
-        .off = SPR_HEALTH_2,
217
-        .bank = BANK(bar_2),
218
-    },
219
-    { // SPR_POWER_3
220
-        .ms = bar_3_metasprites,
221
-        .ti = bar_3_tiles,
222
-        .pa = NULL,
223
-        .pa_i = OAMF_CGB_PAL6,
224
-        .cnt = bar_3_TILE_COUNT,
225
-        .off = SPR_HEALTH_3,
226
-        .bank = BANK(bar_3),
227
-    },
228
-    { // SPR_POWER_4
229
-        .ms = bar_4_metasprites,
230
-        .ti = bar_4_tiles,
231
-        .pa = NULL,
232
-        .pa_i = OAMF_CGB_PAL6,
233
-        .cnt = bar_4_TILE_COUNT,
234
-        .off = SPR_HEALTH_4,
235
-        .bank = BANK(bar_4),
236
-    },
237
-    { // SPR_POWER_5
238
-        .ms = bar_5_metasprites,
239
-        .ti = bar_5_tiles,
240
-        .pa = NULL,
241
-        .pa_i = OAMF_CGB_PAL6,
242
-        .cnt = bar_5_TILE_COUNT,
243
-        .off = SPR_HEALTH_5,
244
-        .bank = BANK(bar_5),
245
-    },
246
-    { // SPR_POWER_6
247
-        .ms = bar_6_metasprites,
248
-        .ti = bar_6_tiles,
249
-        .pa = NULL,
250
-        .pa_i = OAMF_CGB_PAL6,
251
-        .cnt = bar_6_TILE_COUNT,
252
-        .off = SPR_HEALTH_6,
253
-        .bank = BANK(bar_6),
254
-    },
255
-    { // SPR_POWER_7
256
-        .ms = bar_7_metasprites,
257
-        .ti = bar_7_tiles,
258
-        .pa = NULL,
259
-        .pa_i = OAMF_CGB_PAL6,
260
-        .cnt = bar_7_TILE_COUNT,
261
-        .off = SPR_HEALTH_7,
262
-        .bank = BANK(bar_7),
263
-    },
264
-    { // SPR_POWER_8
265
-        .ms = bar_8_metasprites,
266
-        .ti = bar_8_tiles,
267
-        .pa = NULL,
268
-        .pa_i = OAMF_CGB_PAL6,
269
-        .cnt = bar_8_TILE_COUNT,
270
-        .off = SPR_HEALTH_8,
271
-        .bank = BANK(bar_8),
159
+        .cnt = bar_spr8_TILE_COUNT,
160
+        .off = SPR_HEALTH,
161
+        .bank = BANK(bar_spr8),
162
+    },
163
+    { // SPR_EXPL
164
+        .ms = expl_spr16_metasprites,
165
+        .ms_n = ARR_LEN(expl_spr16_metasprites),
166
+        .ti = expl_spr16_tiles,
167
+        .pa = expl_spr16_palettes,
168
+        .pa_n = expl_spr16_PALETTE_COUNT,
169
+        .pa_i = OAMF_CGB_PAL0 | PALETTE_DYNAMIC_LOAD,
170
+        .cnt = expl_spr16_TILE_COUNT,
171
+        .off = TILE_NUM_START,
172
+        .bank = BANK(expl_spr16),
272
     }
173
     }
273
 };
174
 };

+ 7
- 0
src/sprite_data.h View File

32
 // Metasprite tiles are loaded into VRAM starting at tile number 0
32
 // Metasprite tiles are loaded into VRAM starting at tile number 0
33
 #define TILE_NUM_START 0
33
 #define TILE_NUM_START 0
34
 
34
 
35
+#define PALETTE_DYNAMIC_LOAD 0xF0
36
+#define PALETTE_NO_FLAGS 0x0F
37
+
38
+#define ARR_LEN(x) (sizeof(x) / sizeof(x[0]))
39
+
35
 struct sprites {
40
 struct sprites {
36
     const metasprite_t * const * ms;
41
     const metasprite_t * const * ms;
42
+    uint8_t ms_n;
37
     const uint8_t * ti;
43
     const uint8_t * ti;
38
     const palette_color_t * pa;
44
     const palette_color_t * pa;
45
+    uint8_t pa_n;
39
     uint8_t pa_i;
46
     uint8_t pa_i;
40
     uint8_t cnt;
47
     uint8_t cnt;
41
     uint8_t off;
48
     uint8_t off;

+ 28
- 8
src/sprites.c View File

27
     for (uint8_t i = 0; i < SPRITE_COUNT; i++) {
27
     for (uint8_t i = 0; i < SPRITE_COUNT; i++) {
28
         SWITCH_ROM(metasprites[i].bank);
28
         SWITCH_ROM(metasprites[i].bank);
29
 
29
 
30
-        if (metasprites[i].pa != NULL) {
31
-            set_sprite_palette(metasprites[i].pa_i, 1, metasprites[i].pa);
32
-        }
33
-
34
         if (metasprites[i].off == TILE_NUM_START) {
30
         if (metasprites[i].off == TILE_NUM_START) {
35
             metasprites[i].off = off;
31
             metasprites[i].off = off;
36
             off += metasprites[i].cnt;
32
             off += metasprites[i].cnt;
41
     }
37
     }
42
 }
38
 }
43
 
39
 
40
+void spr_init_pal(void) NONBANKED {
41
+    for (uint8_t i = 0; i < SPRITE_COUNT; i++) {
42
+        SWITCH_ROM(metasprites[i].bank);
43
+
44
+        if ((metasprites[i].pa != NULL) && (!(metasprites[i].pa_i & 0xF0))) {
45
+            set_sprite_palette(metasprites[i].pa_i, metasprites[i].pa_n, metasprites[i].pa);
46
+        }
47
+    }
48
+}
49
+
44
 void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip,
50
 void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip,
45
               int8_t x_off, int8_t y_off, uint8_t frame,
51
               int8_t x_off, int8_t y_off, uint8_t frame,
46
               uint8_t *hiwater) NONBANKED {
52
               uint8_t *hiwater) NONBANKED {
47
     SWITCH_ROM(metasprites[sprite].bank);
53
     SWITCH_ROM(metasprites[sprite].bank);
48
 
54
 
55
+    if (frame >= metasprites[sprite].ms_n) {
56
+        frame = 0;
57
+    }
58
+
59
+    if (metasprites[sprite].pa_i & PALETTE_DYNAMIC_LOAD) {
60
+        uint8_t pa_i = frame;
61
+        if (pa_i >= metasprites[sprite].pa_n) {
62
+            pa_i = 0;
63
+        }
64
+
65
+        // used for explosion. just overwrite our fist four palettes. we dont need them at the end of the game.
66
+        set_sprite_palette((metasprites[sprite].pa_i & PALETTE_NO_FLAGS) + pa_i, 1, metasprites[sprite].pa + (pa_i * 1));
67
+    }
68
+
49
     switch (flip) {
69
     switch (flip) {
50
         case FLIP_Y:
70
         case FLIP_Y:
51
             *hiwater += move_metasprite_flipy(
71
             *hiwater += move_metasprite_flipy(
52
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
72
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
53
-                    metasprites[sprite].pa_i, *hiwater,
73
+                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
54
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
74
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
55
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
75
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
56
             break;
76
             break;
58
         case FLIP_XY:
78
         case FLIP_XY:
59
             *hiwater += move_metasprite_flipxy(
79
             *hiwater += move_metasprite_flipxy(
60
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
80
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
61
-                    metasprites[sprite].pa_i, *hiwater,
81
+                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
62
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
82
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
63
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
83
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
64
             break;
84
             break;
66
         case FLIP_X:
86
         case FLIP_X:
67
             *hiwater += move_metasprite_flipx(
87
             *hiwater += move_metasprite_flipx(
68
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
88
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
69
-                    metasprites[sprite].pa_i, *hiwater,
89
+                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
70
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
90
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
71
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
91
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
72
             break;
92
             break;
75
         default:
95
         default:
76
             *hiwater += move_metasprite_ex(
96
             *hiwater += move_metasprite_ex(
77
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
97
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
78
-                    metasprites[sprite].pa_i, *hiwater,
98
+                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
79
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
99
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
80
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
100
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
81
             break;
101
             break;

+ 4
- 16
src/sprites.h View File

35
     SPR_SHOT,
35
     SPR_SHOT,
36
     SPR_SHOT_LIGHT,
36
     SPR_SHOT_LIGHT,
37
     SPR_SHOT_DARK,
37
     SPR_SHOT_DARK,
38
-    SPR_HEALTH_1,
39
-    SPR_HEALTH_2,
40
-    SPR_HEALTH_3,
41
-    SPR_HEALTH_4,
42
-    SPR_HEALTH_5,
43
-    SPR_HEALTH_6,
44
-    SPR_HEALTH_7,
45
-    SPR_HEALTH_8,
46
-    SPR_POWER_1,
47
-    SPR_POWER_2,
48
-    SPR_POWER_3,
49
-    SPR_POWER_4,
50
-    SPR_POWER_5,
51
-    SPR_POWER_6,
52
-    SPR_POWER_7,
53
-    SPR_POWER_8,
38
+    SPR_HEALTH,
39
+    SPR_POWER,
40
+    SPR_EXPL,
54
 
41
 
55
     SPRITE_COUNT
42
     SPRITE_COUNT
56
 };
43
 };
72
 };
59
 };
73
 
60
 
74
 void spr_init(void);
61
 void spr_init(void);
62
+void spr_init_pal(void);
75
 void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off, uint8_t frame, uint8_t *hiwater);
63
 void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off, uint8_t frame, uint8_t *hiwater);
76
 void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater);
64
 void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater);
77
 
65
 

Loading…
Cancel
Save