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,7 +37,7 @@ PNGA := $(GBDK_HOME)/bin/png2asset
37 37
 ROMU := $(GBDK_HOME)/bin/romusage
38 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 41
 LCCFLAGS += -I$(BUILD_DIR)/$(DATA_DIR)
42 42
 LCCFLAGS += -Wm"-yn Duality" -Wm-yt0x1A -Wm-yoA -Wm-ya16 -Wm-yc
43 43
 LCCFLAGS += -autobank -Wb-ext=.rel -Wb-v -Wf-bo255
@@ -88,10 +88,16 @@ $(BUILD_DIR)/$(DATA_DIR)/%.c $(BUILD_DIR)/$(DATA_DIR)/%.h: $(DATA_DIR)/%.png
88 88
 	,$(if $(findstring _fnt,$<), \
89 89
 		@echo "Converting font $<" && \
90 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 98
 		@echo "Converting tile $<" && \
93 99
 		$(PNGA) $< -o $@ -spr8x8      \
94
-	))
100
+	))))
95 101
 
96 102
 $(BUILD_DIR)/%.o: %.c $(SPRITES)
97 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,43 +43,58 @@ static void status(uint8_t health, uint8_t power, uint8_t *hiwater) NONBANKED {
43 43
     if (health > 0) {
44 44
         switch (health >> 6) {
45 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 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 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 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 60
     if (power > 0) {
61 61
         switch (power >> 6) {
62 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 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 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 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 92
 int32_t game(void) NONBANKED {
79 93
     disable_interrupts();
80 94
     DISPLAY_OFF;
81 95
     map_game();
82 96
     SHOW_BKG;
97
+    spr_init_pal();
83 98
     SHOW_SPRITES;
84 99
     SPRITES_8x8;
85 100
 
@@ -174,6 +189,7 @@ int32_t game(void) NONBANKED {
174 189
                 health -= damage;
175 190
             } else if (health <= damage) {
176 191
                 health = 0;
192
+                show_explosion(power);
177 193
                 break;
178 194
             }
179 195
         } else if (damage < 0) {

+ 10
- 3
src/main.c View File

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

+ 25
- 2
src/maps.c View File

@@ -120,8 +120,13 @@ static void str(const char *s, uint8_t x_off, uint8_t y_off, uint8_t is_black) N
120 120
     uint8_t n = 0;
121 121
     while (*s) {
122 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 130
         character(c - 'a', n++, x_off, y_off, is_black);
126 131
     }
127 132
 }
@@ -198,6 +203,24 @@ void win_score_draw(struct scores score, uint8_t off, uint8_t is_black) NONBANKE
198 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 224
 uint8_t win_game_draw(int32_t score) NONBANKED {
202 225
     fill_win(0, 0, 10, 2, fnt_off + numbers_fnt_TILE_COUNT, 0x81);
203 226
 

+ 1
- 0
src/maps.h View File

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

+ 47
- 146
src/sprite_data.c View File

@@ -29,14 +29,8 @@
29 29
 #include "light.h"
30 30
 #include "dark.h"
31 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 35
 const palette_color_t power_palettes[4] = {
42 36
   //RGB8(  0,  0,  0), RGB8(240,  0,  0), RGB8(196,  0,  0), RGB8(116,  0,  0)
@@ -47,8 +41,10 @@ const palette_color_t power_palettes[4] = {
47 41
 struct sprites metasprites[SPRITE_COUNT] = {
48 42
     { // SPR_SHIP_0
49 43
         .ms = rockshp_0_metasprites,
44
+        .ms_n = ARR_LEN(rockshp_0_metasprites),
50 45
         .ti = rockshp_0_tiles,
51 46
         .pa = rockshp_0_palettes,
47
+        .pa_n = rockshp_0_PALETTE_COUNT,
52 48
         .pa_i = OAMF_CGB_PAL0,
53 49
         .cnt = rockshp_0_TILE_COUNT,
54 50
         .off = TILE_NUM_START,
@@ -56,8 +52,10 @@ struct sprites metasprites[SPRITE_COUNT] = {
56 52
     },
57 53
     { // SPR_SHIP_90
58 54
         .ms = rockshp_90_metasprites,
55
+        .ms_n = ARR_LEN(rockshp_90_metasprites),
59 56
         .ti = rockshp_90_tiles,
60 57
         .pa = NULL,
58
+        .pa_n = rockshp_90_PALETTE_COUNT,
61 59
         .pa_i = OAMF_CGB_PAL0,
62 60
         .cnt = rockshp_90_TILE_COUNT,
63 61
         .off = TILE_NUM_START,
@@ -65,8 +63,10 @@ struct sprites metasprites[SPRITE_COUNT] = {
65 63
     },
66 64
     { // SPR_THRUST_0
67 65
         .ms = thrust_0_metasprites,
66
+        .ms_n = ARR_LEN(thrust_0_metasprites),
68 67
         .ti = thrust_0_tiles,
69 68
         .pa = thrust_0_palettes,
69
+        .pa_n = thrust_0_PALETTE_COUNT,
70 70
         .pa_i = OAMF_CGB_PAL1,
71 71
         .cnt = thrust_0_TILE_COUNT,
72 72
         .off = TILE_NUM_START,
@@ -74,8 +74,10 @@ struct sprites metasprites[SPRITE_COUNT] = {
74 74
     },
75 75
     { // SPR_THRUST_90
76 76
         .ms = thrust_90_metasprites,
77
+        .ms_n = ARR_LEN(thrust_90_metasprites),
77 78
         .ti = thrust_90_tiles,
78 79
         .pa = NULL,
80
+        .pa_n = thrust_90_PALETTE_COUNT,
79 81
         .pa_i = OAMF_CGB_PAL1,
80 82
         .cnt = thrust_90_TILE_COUNT,
81 83
         .off = TILE_NUM_START,
@@ -83,8 +85,10 @@ struct sprites metasprites[SPRITE_COUNT] = {
83 85
     },
84 86
     { // SPR_LIGHT
85 87
         .ms = light_metasprites,
88
+        .ms_n = ARR_LEN(light_metasprites),
86 89
         .ti = light_tiles,
87 90
         .pa = light_palettes,
91
+        .pa_n = light_PALETTE_COUNT,
88 92
         .pa_i = OAMF_CGB_PAL2,
89 93
         .cnt = light_TILE_COUNT,
90 94
         .off = TILE_NUM_START,
@@ -92,8 +96,10 @@ struct sprites metasprites[SPRITE_COUNT] = {
92 96
     },
93 97
     { // SPR_DARK
94 98
         .ms = dark_metasprites,
99
+        .ms_n = ARR_LEN(dark_metasprites),
95 100
         .ti = dark_tiles,
96 101
         .pa = dark_palettes,
102
+        .pa_n = dark_PALETTE_COUNT,
97 103
         .pa_i = OAMF_CGB_PAL3,
98 104
         .cnt = dark_TILE_COUNT,
99 105
         .off = TILE_NUM_START,
@@ -101,8 +107,10 @@ struct sprites metasprites[SPRITE_COUNT] = {
101 107
     },
102 108
     { // SPR_SHOT
103 109
         .ms = shoot_metasprites,
110
+        .ms_n = ARR_LEN(shoot_metasprites),
104 111
         .ti = shoot_tiles,
105 112
         .pa = shoot_palettes,
113
+        .pa_n = shoot_PALETTE_COUNT,
106 114
         .pa_i = OAMF_CGB_PAL4,
107 115
         .cnt = shoot_TILE_COUNT,
108 116
         .off = TILE_NUM_START,
@@ -110,8 +118,10 @@ struct sprites metasprites[SPRITE_COUNT] = {
110 118
     },
111 119
     { // SPR_SHOT_LIGHT
112 120
         .ms = shoot_metasprites,
121
+        .ms_n = ARR_LEN(shoot_metasprites),
113 122
         .ti = shoot_tiles,
114 123
         .pa = NULL,
124
+        .pa_n = shoot_PALETTE_COUNT,
115 125
         .pa_i = OAMF_CGB_PAL2,
116 126
         .cnt = shoot_TILE_COUNT,
117 127
         .off = SPR_SHOT,
@@ -119,155 +129,46 @@ struct sprites metasprites[SPRITE_COUNT] = {
119 129
     },
120 130
     { // SPR_SHOT_DARK
121 131
         .ms = shoot_metasprites,
132
+        .ms_n = ARR_LEN(shoot_metasprites),
122 133
         .ti = shoot_tiles,
123 134
         .pa = NULL,
135
+        .pa_n = shoot_PALETTE_COUNT,
124 136
         .pa_i = OAMF_CGB_PAL3,
125 137
         .cnt = shoot_TILE_COUNT,
126 138
         .off = SPR_SHOT,
127 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 147
         .pa_i = OAMF_CGB_PAL5,
134
-        .cnt = bar_1_TILE_COUNT,
148
+        .cnt = bar_spr8_TILE_COUNT,
135 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 156
         .pa = power_palettes,
157
+        .pa_n = bar_spr8_PALETTE_COUNT,
205 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,10 +32,17 @@
32 32
 // Metasprite tiles are loaded into VRAM starting at tile number 0
33 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 40
 struct sprites {
36 41
     const metasprite_t * const * ms;
42
+    uint8_t ms_n;
37 43
     const uint8_t * ti;
38 44
     const palette_color_t * pa;
45
+    uint8_t pa_n;
39 46
     uint8_t pa_i;
40 47
     uint8_t cnt;
41 48
     uint8_t off;

+ 28
- 8
src/sprites.c View File

@@ -27,10 +27,6 @@ void spr_init(void) NONBANKED {
27 27
     for (uint8_t i = 0; i < SPRITE_COUNT; i++) {
28 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 30
         if (metasprites[i].off == TILE_NUM_START) {
35 31
             metasprites[i].off = off;
36 32
             off += metasprites[i].cnt;
@@ -41,16 +37,40 @@ void spr_init(void) NONBANKED {
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 50
 void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip,
45 51
               int8_t x_off, int8_t y_off, uint8_t frame,
46 52
               uint8_t *hiwater) NONBANKED {
47 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 69
     switch (flip) {
50 70
         case FLIP_Y:
51 71
             *hiwater += move_metasprite_flipy(
52 72
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
53
-                    metasprites[sprite].pa_i, *hiwater,
73
+                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
54 74
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
55 75
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
56 76
             break;
@@ -58,7 +78,7 @@ void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip,
58 78
         case FLIP_XY:
59 79
             *hiwater += move_metasprite_flipxy(
60 80
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
61
-                    metasprites[sprite].pa_i, *hiwater,
81
+                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
62 82
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
63 83
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
64 84
             break;
@@ -66,7 +86,7 @@ void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip,
66 86
         case FLIP_X:
67 87
             *hiwater += move_metasprite_flipx(
68 88
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
69
-                    metasprites[sprite].pa_i, *hiwater,
89
+                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
70 90
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
71 91
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
72 92
             break;
@@ -75,7 +95,7 @@ void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip,
75 95
         default:
76 96
             *hiwater += move_metasprite_ex(
77 97
                     metasprites[sprite].ms[frame], metasprites[sprite].off,
78
-                    metasprites[sprite].pa_i, *hiwater,
98
+                    metasprites[sprite].pa_i & PALETTE_NO_FLAGS, *hiwater,
79 99
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
80 100
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
81 101
             break;

+ 4
- 16
src/sprites.h View File

@@ -35,22 +35,9 @@ enum SPRITES {
35 35
     SPR_SHOT,
36 36
     SPR_SHOT_LIGHT,
37 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 42
     SPRITE_COUNT
56 43
 };
@@ -72,6 +59,7 @@ enum SPRITE_ROT {
72 59
 };
73 60
 
74 61
 void spr_init(void);
62
+void spr_init_pal(void);
75 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 64
 void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater);
77 65
 

Loading…
Cancel
Save