Browse Source

draw score in window

Thomas B 1 month ago
parent
commit
22f5375e45
10 changed files with 388 additions and 267 deletions
  1. 6
    3
      Makefile
  2. BIN
      data/numbers.png
  3. 19
    8
      src/game.c
  4. 49
    0
      src/maps.c
  5. 4
    0
      src/maps.h
  6. 1
    1
      src/obj.c
  7. 248
    0
      src/sprite_data.c
  8. 46
    0
      src/sprite_data.h
  9. 14
    254
      src/sprites.c
  10. 1
    1
      src/sprites.h

+ 6
- 3
Makefile View File

@@ -84,22 +84,25 @@ $(BUILD_DIR)/$(DATA_DIR)/%.c $(BUILD_DIR)/$(DATA_DIR)/%.h: $(DATA_DIR)/%.png
84 84
 	$(if $(findstring _map,$<),           \
85 85
 		@echo "Converting map $<" &&  \
86 86
 		$(PNGA) $< -o $@ -spr8x8 -map -use_map_attributes -noflip \
87
+	,$(if $(findstring numbers,$<), \
88
+		@echo "Converting font $<" && \
89
+		$(PNGA) $< -o $@ -spr8x8 -sw 16 -sh 16 -map -no_palettes \
87 90
 	,                                     \
88 91
 		@echo "Converting tile $<" && \
89 92
 		$(PNGA) $< -o $@ -spr8x8      \
90
-	)
93
+	))
91 94
 
92 95
 $(BUILD_DIR)/%.o: %.c $(SPRITES)
93 96
 	@mkdir -p $(@D)
94 97
 	@echo Compiling $<
95 98
 	@$(LCC) $(LCCFLAGS) -c -o $@ $<
96 99
 
97
-$(BUILD_DIR)/%.o: $(BUILD_DIR)/%.c
100
+$(BUILD_DIR)/%.o: $(BUILD_DIR)/%.c $(SPRITES)
98 101
 	@mkdir -p $(@D)
99 102
 	@echo Compiling $<
100 103
 	@$(LCC) $(LCCFLAGS) -c -o $@ $<
101 104
 
102
-$(BUILD_DIR)/%.o: %.s
105
+$(BUILD_DIR)/%.o: %.s $(SPRITES)
103 106
 	@mkdir -p $(@D)
104 107
 	@echo Assembling $<
105 108
 	@$(LCC) $(LCCFLAGS) -c -o $@ $<

BIN
data/numbers.png View File


+ 19
- 8
src/game.c View File

@@ -20,6 +20,7 @@
20 20
 #include <gbdk/platform.h>
21 21
 #include <gbdk/metasprites.h>
22 22
 #include <rand.h>
23
+#include <stdint.h>
23 24
 
24 25
 #include "maps.h"
25 26
 #include "obj.h"
@@ -43,16 +44,16 @@ static void status(uint8_t health, uint8_t power, uint8_t *hiwater) {
43 44
         switch (health >> 6) {
44 45
             case 3:
45 46
                 spr_draw(SPR_HEALTH_1 + (((health >> 6) == 3) ? ((health >> 3) & 7) : 7),
46
-                         FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 24, hiwater);
47
+                         FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 24, 0, hiwater);
47 48
             case 2:
48 49
                 spr_draw(SPR_HEALTH_1 + (((health >> 6) == 2) ? ((health >> 3) & 7) : 7),
49
-                         FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 16, hiwater);
50
+                         FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 16, 0, hiwater);
50 51
             case 1:
51 52
                 spr_draw(SPR_HEALTH_1 + (((health >> 6) == 1) ? ((health >> 3) & 7) : 7),
52
-                         FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 8, hiwater);
53
+                         FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 8, 0, hiwater);
53 54
             case 0:
54 55
                 spr_draw(SPR_HEALTH_1 + (((health >> 6) == 0) ? ((health >> 3) & 7) : 7),
55
-                         FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 0, hiwater);
56
+                         FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 0, 0, hiwater);
56 57
         }
57 58
     }
58 59
 
@@ -60,16 +61,16 @@ static void status(uint8_t health, uint8_t power, uint8_t *hiwater) {
60 61
         switch (power >> 6) {
61 62
             case 3:
62 63
                 spr_draw(SPR_POWER_1 + (((power >> 6) == 3) ? ((power >> 3) & 7) : 7),
63
-                         FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 0, hiwater);
64
+                         FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 0, 0, hiwater);
64 65
             case 2:
65 66
                 spr_draw(SPR_POWER_1 + (((power >> 6) == 2) ? ((power >> 3) & 7) : 7),
66
-                         FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 8, hiwater);
67
+                         FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 8, 0, hiwater);
67 68
             case 1:
68 69
                 spr_draw(SPR_POWER_1 + (((power >> 6) == 1) ? ((power >> 3) & 7) : 7),
69
-                         FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 16, hiwater);
70
+                         FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 16, 0, hiwater);
70 71
             case 0:
71 72
                 spr_draw(SPR_POWER_1 + (((power >> 6) == 0) ? ((power >> 3) & 7) : 7),
72
-                         FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 24, hiwater);
73
+                         FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 24, 0, hiwater);
73 74
         }
74 75
     }
75 76
 }
@@ -104,6 +105,11 @@ int32_t game(void) {
104 105
     obj_add(SPR_SHOT_LIGHT, 32, 32, 0, 0);
105 106
     obj_add(SPR_SHOT_DARK, -32, -32, 0, 0);
106 107
 
108
+    win_game_load();
109
+    win_game_draw(score);
110
+    move_win(MINWNDPOSX + 0, MINWNDPOSY + DEVICE_SCREEN_PX_HEIGHT - 16);
111
+    SHOW_WIN;
112
+
107 113
     while(1) {
108 114
         key_read();
109 115
 
@@ -160,6 +166,7 @@ int32_t game(void) {
160 166
             }
161 167
         }
162 168
 
169
+        int32_t prev_score = score;
163 170
         int16_t damage = obj_act(&spd_x, &spd_y, &score);
164 171
         if (damage > 0) {
165 172
             if (health > damage) {
@@ -175,6 +182,10 @@ int32_t game(void) {
175 182
             }
176 183
         }
177 184
 
185
+        if (score != prev_score) {
186
+            win_game_draw(score);
187
+        }
188
+
178 189
         // adjust speed down when not moving
179 190
         if (!(acc & ACC_X)) {
180 191
             if (spd_x != 0) {

+ 49
- 0
src/maps.c View File

@@ -23,6 +23,9 @@
23 23
 
24 24
 #include "title_map.h"
25 25
 #include "bg_map.h"
26
+#include "numbers.h"
27
+
28
+#define MAX_DIGITS 7
26 29
 
27 30
 void map_title(void) {
28 31
     set_bkg_palette(OAMF_CGB_PAL0, title_map_PALETTE_COUNT, title_map_palettes);
@@ -37,3 +40,49 @@ void map_game(void) {
37 40
     set_bkg_attributes(0, 0, bg_map_MAP_ATTRIBUTES_WIDTH, bg_map_MAP_ATTRIBUTES_HEIGHT, bg_map_MAP_ATTRIBUTES);
38 41
     set_bkg_tiles(0, 0, bg_map_WIDTH / bg_map_TILE_W, bg_map_HEIGHT / bg_map_TILE_H, bg_map_map);
39 42
 }
43
+
44
+static void digit(uint8_t val, uint8_t digit, uint8_t x_off) {
45
+    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);
52
+}
53
+
54
+void win_game_load(void) {
55
+    set_win_data(bg_map_TILE_COUNT, numbers_TILE_COUNT, numbers_tiles);
56
+}
57
+
58
+void win_game_draw(int32_t score) {
59
+    // TODO can not set numbers larger than int16 max?!
60
+    //score = 32767 + 1; // wtf?!
61
+
62
+    // TODO support color switch, but how?
63
+
64
+    uint8_t is_black = 0;
65
+    if (score < 0) {
66
+        score = -score;
67
+        is_black = 1;
68
+    }
69
+
70
+    uint8_t len = 0;
71
+    uint8_t digits[MAX_DIGITS];
72
+    do {
73
+        digits[len++] = score % 10L;
74
+        score = score / 10L;
75
+        if (len >= MAX_DIGITS) {
76
+            break;
77
+        }
78
+    } while (score > 0);
79
+
80
+    // if the number was too large for our buffer don't draw anything
81
+    if (score > 0) {
82
+        return;
83
+    }
84
+
85
+    for (uint8_t i = 0; i < len; i++) {
86
+        digit(digits[len - i - 1], i, 10 - len);
87
+    }
88
+}

+ 4
- 0
src/maps.h View File

@@ -20,7 +20,11 @@
20 20
 #ifndef __MAPS_H__
21 21
 #define __MAPS_H__
22 22
 
23
+#include <stdint.h>
24
+
23 25
 void map_title(void);
24 26
 void map_game(void);
27
+void win_game_load(void);
28
+void win_game_draw(int32_t score);
25 29
 
26 30
 #endif // __MAPS_H__

+ 1
- 1
src/obj.c View File

@@ -202,6 +202,6 @@ void obj_draw(int16_t spd_x, int16_t spd_y, uint8_t *hiwater) {
202 202
             objs[i].active = 0;
203 203
         }
204 204
 
205
-        spr_draw(objs[i].sprite, FLIP_NONE, objs[i].off_x >> POS_SCALE_OBJS, objs[i].off_y >> POS_SCALE_OBJS, hiwater);
205
+        spr_draw(objs[i].sprite, FLIP_NONE, objs[i].off_x >> POS_SCALE_OBJS, objs[i].off_y >> POS_SCALE_OBJS, 0, hiwater);
206 206
     }
207 207
 }

+ 248
- 0
src/sprite_data.c View File

@@ -0,0 +1,248 @@
1
+/*
2
+ * sprite_data.c
3
+ * Duality
4
+ *
5
+ * Copyright (C) 2025 Thomas Buck <thomas@xythobuz.de>
6
+ *
7
+ * Based on examples from gbdk-2020:
8
+ * https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/cross-platform/metasprites/src/metasprites.c
9
+ *
10
+ * This program is free software: you can redistribute it and/or modify
11
+ * it under the terms of the GNU General Public License as published by
12
+ * the Free Software Foundation, either version 3 of the License, or
13
+ * (at your option) any later version.
14
+ *
15
+ * This program is distributed in the hope that it will be useful,
16
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
+ * GNU General Public License for more details.
19
+ *
20
+ * See <http://www.gnu.org/licenses/>.
21
+ */
22
+
23
+#include "sprite_data.h"
24
+
25
+#include "rockshp_0.h"
26
+#include "rockshp_90.h"
27
+#include "thrust_0.h"
28
+#include "thrust_90.h"
29
+#include "light.h"
30
+#include "dark.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"
40
+
41
+const palette_color_t power_palettes[4] = {
42
+  //RGB8(  0,  0,  0), RGB8(240,  0,  0), RGB8(196,  0,  0), RGB8(116,  0,  0)
43
+    RGB8(  0,  0,  0), RGB8(  0,240,  0), RGB8(  0,196,  0), RGB8(  0,116,  0)
44
+
45
+};
46
+
47
+struct sprites metasprites[SPRITE_COUNT] = {
48
+    { // SPR_SHIP_0
49
+        .ms = rockshp_0_metasprites,
50
+        .ti = rockshp_0_tiles,
51
+        .pa = rockshp_0_palettes,
52
+        .pa_i = OAMF_CGB_PAL0,
53
+        .cnt = rockshp_0_TILE_COUNT,
54
+        .off = TILE_NUM_START
55
+    },
56
+    { // SPR_SHIP_90
57
+        .ms = rockshp_90_metasprites,
58
+        .ti = rockshp_90_tiles,
59
+        .pa = NULL,
60
+        .pa_i = OAMF_CGB_PAL0,
61
+        .cnt = rockshp_90_TILE_COUNT,
62
+        .off = TILE_NUM_START
63
+    },
64
+    { // SPR_THRUST_0
65
+        .ms = thrust_0_metasprites,
66
+        .ti = thrust_0_tiles,
67
+        .pa = thrust_0_palettes,
68
+        .pa_i = OAMF_CGB_PAL1,
69
+        .cnt = thrust_0_TILE_COUNT,
70
+        .off = TILE_NUM_START
71
+    },
72
+    { // SPR_THRUST_90
73
+        .ms = thrust_90_metasprites,
74
+        .ti = thrust_90_tiles,
75
+        .pa = NULL,
76
+        .pa_i = OAMF_CGB_PAL1,
77
+        .cnt = thrust_90_TILE_COUNT,
78
+        .off = TILE_NUM_START
79
+    },
80
+    { // SPR_LIGHT
81
+        .ms = light_metasprites,
82
+        .ti = light_tiles,
83
+        .pa = light_palettes,
84
+        .pa_i = OAMF_CGB_PAL2,
85
+        .cnt = light_TILE_COUNT,
86
+        .off = TILE_NUM_START
87
+    },
88
+    { // SPR_DARK
89
+        .ms = dark_metasprites,
90
+        .ti = dark_tiles,
91
+        .pa = dark_palettes,
92
+        .pa_i = OAMF_CGB_PAL3,
93
+        .cnt = dark_TILE_COUNT,
94
+        .off = TILE_NUM_START
95
+    },
96
+    { // SPR_SHOT
97
+        .ms = shoot_metasprites,
98
+        .ti = shoot_tiles,
99
+        .pa = shoot_palettes,
100
+        .pa_i = OAMF_CGB_PAL4,
101
+        .cnt = shoot_TILE_COUNT,
102
+        .off = TILE_NUM_START
103
+    },
104
+    { // SPR_SHOT_LIGHT
105
+        .ms = shoot_metasprites,
106
+        .ti = shoot_tiles,
107
+        .pa = NULL,
108
+        .pa_i = OAMF_CGB_PAL2,
109
+        .cnt = shoot_TILE_COUNT,
110
+        .off = SPR_SHOT
111
+    },
112
+    { // SPR_SHOT_DARK
113
+        .ms = shoot_metasprites,
114
+        .ti = shoot_tiles,
115
+        .pa = NULL,
116
+        .pa_i = OAMF_CGB_PAL3,
117
+        .cnt = shoot_TILE_COUNT,
118
+        .off = SPR_SHOT
119
+    },
120
+    { // SPR_HEALTH_1
121
+        .ms = bar_1_metasprites,
122
+        .ti = bar_1_tiles,
123
+        .pa = bar_1_palettes,
124
+        .pa_i = OAMF_CGB_PAL5,
125
+        .cnt = bar_1_TILE_COUNT,
126
+        .off = TILE_NUM_START
127
+    },
128
+    { // SPR_HEALTH_2
129
+        .ms = bar_2_metasprites,
130
+        .ti = bar_2_tiles,
131
+        .pa = NULL,
132
+        .pa_i = OAMF_CGB_PAL5,
133
+        .cnt = bar_2_TILE_COUNT,
134
+        .off = TILE_NUM_START
135
+    },
136
+    { // SPR_HEALTH_3
137
+        .ms = bar_3_metasprites,
138
+        .ti = bar_3_tiles,
139
+        .pa = NULL,
140
+        .pa_i = OAMF_CGB_PAL5,
141
+        .cnt = bar_3_TILE_COUNT,
142
+        .off = TILE_NUM_START
143
+    },
144
+    { // SPR_HEALTH_4
145
+        .ms = bar_4_metasprites,
146
+        .ti = bar_4_tiles,
147
+        .pa = NULL,
148
+        .pa_i = OAMF_CGB_PAL5,
149
+        .cnt = bar_4_TILE_COUNT,
150
+        .off = TILE_NUM_START
151
+    },
152
+    { // SPR_HEALTH_5
153
+        .ms = bar_5_metasprites,
154
+        .ti = bar_5_tiles,
155
+        .pa = NULL,
156
+        .pa_i = OAMF_CGB_PAL5,
157
+        .cnt = bar_5_TILE_COUNT,
158
+        .off = TILE_NUM_START
159
+    },
160
+    { // SPR_HEALTH_6
161
+        .ms = bar_6_metasprites,
162
+        .ti = bar_6_tiles,
163
+        .pa = NULL,
164
+        .pa_i = OAMF_CGB_PAL5,
165
+        .cnt = bar_6_TILE_COUNT,
166
+        .off = TILE_NUM_START
167
+    },
168
+    { // SPR_HEALTH_7
169
+        .ms = bar_7_metasprites,
170
+        .ti = bar_7_tiles,
171
+        .pa = NULL,
172
+        .pa_i = OAMF_CGB_PAL5,
173
+        .cnt = bar_7_TILE_COUNT,
174
+        .off = TILE_NUM_START
175
+    },
176
+    { // SPR_HEALTH_8
177
+        .ms = bar_8_metasprites,
178
+        .ti = bar_8_tiles,
179
+        .pa = NULL,
180
+        .pa_i = OAMF_CGB_PAL5,
181
+        .cnt = bar_8_TILE_COUNT,
182
+        .off = TILE_NUM_START
183
+    },
184
+    { // SPR_POWER_1
185
+        .ms = bar_1_metasprites,
186
+        .ti = bar_1_tiles,
187
+        .pa = power_palettes,
188
+        .pa_i = OAMF_CGB_PAL6,
189
+        .cnt = bar_1_TILE_COUNT,
190
+        .off = SPR_HEALTH_1
191
+    },
192
+    { // SPR_POWER_2
193
+        .ms = bar_2_metasprites,
194
+        .ti = bar_2_tiles,
195
+        .pa = NULL,
196
+        .pa_i = OAMF_CGB_PAL6,
197
+        .cnt = bar_2_TILE_COUNT,
198
+        .off = SPR_HEALTH_2
199
+    },
200
+    { // SPR_POWER_3
201
+        .ms = bar_3_metasprites,
202
+        .ti = bar_3_tiles,
203
+        .pa = NULL,
204
+        .pa_i = OAMF_CGB_PAL6,
205
+        .cnt = bar_3_TILE_COUNT,
206
+        .off = SPR_HEALTH_3
207
+    },
208
+    { // SPR_POWER_4
209
+        .ms = bar_4_metasprites,
210
+        .ti = bar_4_tiles,
211
+        .pa = NULL,
212
+        .pa_i = OAMF_CGB_PAL6,
213
+        .cnt = bar_4_TILE_COUNT,
214
+        .off = SPR_HEALTH_4
215
+    },
216
+    { // SPR_POWER_5
217
+        .ms = bar_5_metasprites,
218
+        .ti = bar_5_tiles,
219
+        .pa = NULL,
220
+        .pa_i = OAMF_CGB_PAL6,
221
+        .cnt = bar_5_TILE_COUNT,
222
+        .off = SPR_HEALTH_5
223
+    },
224
+    { // SPR_POWER_6
225
+        .ms = bar_6_metasprites,
226
+        .ti = bar_6_tiles,
227
+        .pa = NULL,
228
+        .pa_i = OAMF_CGB_PAL6,
229
+        .cnt = bar_6_TILE_COUNT,
230
+        .off = SPR_HEALTH_6
231
+    },
232
+    { // SPR_POWER_7
233
+        .ms = bar_7_metasprites,
234
+        .ti = bar_7_tiles,
235
+        .pa = NULL,
236
+        .pa_i = OAMF_CGB_PAL6,
237
+        .cnt = bar_7_TILE_COUNT,
238
+        .off = SPR_HEALTH_7
239
+    },
240
+    { // SPR_POWER_8
241
+        .ms = bar_8_metasprites,
242
+        .ti = bar_8_tiles,
243
+        .pa = NULL,
244
+        .pa_i = OAMF_CGB_PAL6,
245
+        .cnt = bar_8_TILE_COUNT,
246
+        .off = SPR_HEALTH_8
247
+    }
248
+};

+ 46
- 0
src/sprite_data.h View File

@@ -0,0 +1,46 @@
1
+/*
2
+ * sprite_data.h
3
+ * Duality
4
+ *
5
+ * Copyright (C) 2025 Thomas Buck <thomas@xythobuz.de>
6
+ *
7
+ * Based on examples from gbdk-2020:
8
+ * https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/cross-platform/metasprites/src/metasprites.c
9
+ *
10
+ * This program is free software: you can redistribute it and/or modify
11
+ * it under the terms of the GNU General Public License as published by
12
+ * the Free Software Foundation, either version 3 of the License, or
13
+ * (at your option) any later version.
14
+ *
15
+ * This program is distributed in the hope that it will be useful,
16
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
+ * GNU General Public License for more details.
19
+ *
20
+ * See <http://www.gnu.org/licenses/>.
21
+ */
22
+
23
+#ifndef __SPRITE__DATA_H
24
+#define __SPRITE__DATA_H
25
+
26
+#include <gbdk/platform.h>
27
+#include <gbdk/metasprites.h>
28
+#include <stdint.h>
29
+
30
+#include "sprites.h"
31
+
32
+// Metasprite tiles are loaded into VRAM starting at tile number 0
33
+#define TILE_NUM_START 0
34
+
35
+struct sprites {
36
+    const metasprite_t * const * ms;
37
+    const uint8_t * ti;
38
+    const palette_color_t * pa;
39
+    uint8_t pa_i;
40
+    uint8_t cnt;
41
+    uint8_t off;
42
+};
43
+
44
+extern struct sprites metasprites[SPRITE_COUNT];
45
+
46
+#endif // __SPRITE__DATA_H

+ 14
- 254
src/sprites.c View File

@@ -20,247 +20,7 @@
20 20
  * See <http://www.gnu.org/licenses/>.
21 21
  */
22 22
 
23
-#include <gbdk/platform.h>
24
-#include <gbdk/metasprites.h>
25
-
26
-#include "sprites.h"
27
-
28
-#include "rockshp_0.h"
29
-#include "rockshp_90.h"
30
-#include "thrust_0.h"
31
-#include "thrust_90.h"
32
-#include "light.h"
33
-#include "dark.h"
34
-#include "shoot.h"
35
-#include "bar_1.h"
36
-#include "bar_2.h"
37
-#include "bar_3.h"
38
-#include "bar_4.h"
39
-#include "bar_5.h"
40
-#include "bar_6.h"
41
-#include "bar_7.h"
42
-#include "bar_8.h"
43
-
44
-// Metasprite tiles are loaded into VRAM starting at tile number 0
45
-#define TILE_NUM_START 0
46
-
47
-struct sprites {
48
-    const metasprite_t * const * ms;
49
-    const uint8_t * ti;
50
-    const palette_color_t * pa;
51
-    uint8_t pa_i;
52
-    uint8_t cnt;
53
-    uint8_t off;
54
-};
55
-
56
-const palette_color_t power_palettes[4] = {
57
-  //RGB8(  0,  0,  0), RGB8(240,  0,  0), RGB8(196,  0,  0), RGB8(116,  0,  0)
58
-    RGB8(  0,  0,  0), RGB8(  0,240,  0), RGB8(  0,196,  0), RGB8(  0,116,  0)
59
-
60
-};
61
-
62
-static struct sprites metasprites[SPRITE_COUNT] = {
63
-    { // SPR_SHIP_0
64
-        .ms = rockshp_0_metasprites,
65
-        .ti = rockshp_0_tiles,
66
-        .pa = rockshp_0_palettes,
67
-        .pa_i = OAMF_CGB_PAL0,
68
-        .cnt = rockshp_0_TILE_COUNT,
69
-        .off = TILE_NUM_START
70
-    },
71
-    { // SPR_SHIP_90
72
-        .ms = rockshp_90_metasprites,
73
-        .ti = rockshp_90_tiles,
74
-        .pa = NULL,
75
-        .pa_i = OAMF_CGB_PAL0,
76
-        .cnt = rockshp_90_TILE_COUNT,
77
-        .off = TILE_NUM_START
78
-    },
79
-    { // SPR_THRUST_0
80
-        .ms = thrust_0_metasprites,
81
-        .ti = thrust_0_tiles,
82
-        .pa = thrust_0_palettes,
83
-        .pa_i = OAMF_CGB_PAL1,
84
-        .cnt = thrust_0_TILE_COUNT,
85
-        .off = TILE_NUM_START
86
-    },
87
-    { // SPR_THRUST_90
88
-        .ms = thrust_90_metasprites,
89
-        .ti = thrust_90_tiles,
90
-        .pa = NULL,
91
-        .pa_i = OAMF_CGB_PAL1,
92
-        .cnt = thrust_90_TILE_COUNT,
93
-        .off = TILE_NUM_START
94
-    },
95
-    { // SPR_LIGHT
96
-        .ms = light_metasprites,
97
-        .ti = light_tiles,
98
-        .pa = light_palettes,
99
-        .pa_i = OAMF_CGB_PAL2,
100
-        .cnt = light_TILE_COUNT,
101
-        .off = TILE_NUM_START
102
-    },
103
-    { // SPR_DARK
104
-        .ms = dark_metasprites,
105
-        .ti = dark_tiles,
106
-        .pa = dark_palettes,
107
-        .pa_i = OAMF_CGB_PAL3,
108
-        .cnt = dark_TILE_COUNT,
109
-        .off = TILE_NUM_START
110
-    },
111
-    { // SPR_SHOT
112
-        .ms = shoot_metasprites,
113
-        .ti = shoot_tiles,
114
-        .pa = shoot_palettes,
115
-        .pa_i = OAMF_CGB_PAL4,
116
-        .cnt = shoot_TILE_COUNT,
117
-        .off = TILE_NUM_START
118
-    },
119
-    { // SPR_SHOT_LIGHT
120
-        .ms = shoot_metasprites,
121
-        .ti = shoot_tiles,
122
-        .pa = NULL,
123
-        .pa_i = OAMF_CGB_PAL2,
124
-        .cnt = shoot_TILE_COUNT,
125
-        .off = SPR_SHOT
126
-    },
127
-    { // SPR_SHOT_DARK
128
-        .ms = shoot_metasprites,
129
-        .ti = shoot_tiles,
130
-        .pa = NULL,
131
-        .pa_i = OAMF_CGB_PAL3,
132
-        .cnt = shoot_TILE_COUNT,
133
-        .off = SPR_SHOT
134
-    },
135
-    { // SPR_HEALTH_1
136
-        .ms = bar_1_metasprites,
137
-        .ti = bar_1_tiles,
138
-        .pa = bar_1_palettes,
139
-        .pa_i = OAMF_CGB_PAL5,
140
-        .cnt = bar_1_TILE_COUNT,
141
-        .off = TILE_NUM_START
142
-    },
143
-    { // SPR_HEALTH_2
144
-        .ms = bar_2_metasprites,
145
-        .ti = bar_2_tiles,
146
-        .pa = NULL,
147
-        .pa_i = OAMF_CGB_PAL5,
148
-        .cnt = bar_2_TILE_COUNT,
149
-        .off = TILE_NUM_START
150
-    },
151
-    { // SPR_HEALTH_3
152
-        .ms = bar_3_metasprites,
153
-        .ti = bar_3_tiles,
154
-        .pa = NULL,
155
-        .pa_i = OAMF_CGB_PAL5,
156
-        .cnt = bar_3_TILE_COUNT,
157
-        .off = TILE_NUM_START
158
-    },
159
-    { // SPR_HEALTH_4
160
-        .ms = bar_4_metasprites,
161
-        .ti = bar_4_tiles,
162
-        .pa = NULL,
163
-        .pa_i = OAMF_CGB_PAL5,
164
-        .cnt = bar_4_TILE_COUNT,
165
-        .off = TILE_NUM_START
166
-    },
167
-    { // SPR_HEALTH_5
168
-        .ms = bar_5_metasprites,
169
-        .ti = bar_5_tiles,
170
-        .pa = NULL,
171
-        .pa_i = OAMF_CGB_PAL5,
172
-        .cnt = bar_5_TILE_COUNT,
173
-        .off = TILE_NUM_START
174
-    },
175
-    { // SPR_HEALTH_6
176
-        .ms = bar_6_metasprites,
177
-        .ti = bar_6_tiles,
178
-        .pa = NULL,
179
-        .pa_i = OAMF_CGB_PAL5,
180
-        .cnt = bar_6_TILE_COUNT,
181
-        .off = TILE_NUM_START
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
-    },
191
-    { // SPR_HEALTH_8
192
-        .ms = bar_8_metasprites,
193
-        .ti = bar_8_tiles,
194
-        .pa = NULL,
195
-        .pa_i = OAMF_CGB_PAL5,
196
-        .cnt = bar_8_TILE_COUNT,
197
-        .off = TILE_NUM_START
198
-    },
199
-    { // SPR_POWER_1
200
-        .ms = bar_1_metasprites,
201
-        .ti = bar_1_tiles,
202
-        .pa = power_palettes,
203
-        .pa_i = OAMF_CGB_PAL6,
204
-        .cnt = bar_1_TILE_COUNT,
205
-        .off = SPR_HEALTH_1
206
-    },
207
-    { // SPR_POWER_2
208
-        .ms = bar_2_metasprites,
209
-        .ti = bar_2_tiles,
210
-        .pa = NULL,
211
-        .pa_i = OAMF_CGB_PAL6,
212
-        .cnt = bar_2_TILE_COUNT,
213
-        .off = SPR_HEALTH_2
214
-    },
215
-    { // SPR_POWER_3
216
-        .ms = bar_3_metasprites,
217
-        .ti = bar_3_tiles,
218
-        .pa = NULL,
219
-        .pa_i = OAMF_CGB_PAL6,
220
-        .cnt = bar_3_TILE_COUNT,
221
-        .off = SPR_HEALTH_3
222
-    },
223
-    { // SPR_POWER_4
224
-        .ms = bar_4_metasprites,
225
-        .ti = bar_4_tiles,
226
-        .pa = NULL,
227
-        .pa_i = OAMF_CGB_PAL6,
228
-        .cnt = bar_4_TILE_COUNT,
229
-        .off = SPR_HEALTH_4
230
-    },
231
-    { // SPR_POWER_5
232
-        .ms = bar_5_metasprites,
233
-        .ti = bar_5_tiles,
234
-        .pa = NULL,
235
-        .pa_i = OAMF_CGB_PAL6,
236
-        .cnt = bar_5_TILE_COUNT,
237
-        .off = SPR_HEALTH_5
238
-    },
239
-    { // SPR_POWER_6
240
-        .ms = bar_6_metasprites,
241
-        .ti = bar_6_tiles,
242
-        .pa = NULL,
243
-        .pa_i = OAMF_CGB_PAL6,
244
-        .cnt = bar_6_TILE_COUNT,
245
-        .off = SPR_HEALTH_6
246
-    },
247
-    { // SPR_POWER_7
248
-        .ms = bar_7_metasprites,
249
-        .ti = bar_7_tiles,
250
-        .pa = NULL,
251
-        .pa_i = OAMF_CGB_PAL6,
252
-        .cnt = bar_7_TILE_COUNT,
253
-        .off = SPR_HEALTH_7
254
-    },
255
-    { // SPR_POWER_8
256
-        .ms = bar_8_metasprites,
257
-        .ti = bar_8_tiles,
258
-        .pa = NULL,
259
-        .pa_i = OAMF_CGB_PAL6,
260
-        .cnt = bar_8_TILE_COUNT,
261
-        .off = SPR_HEALTH_8
262
-    },
263
-};
23
+#include "sprite_data.h"
264 24
 
265 25
 void spr_init(void) {
266 26
     uint8_t off = TILE_NUM_START;
@@ -279,11 +39,11 @@ void spr_init(void) {
279 39
     }
280 40
 }
281 41
 
282
-void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off, uint8_t *hiwater) {
42
+void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off, uint8_t frame, uint8_t *hiwater) {
283 43
     switch (flip) {
284 44
         case FLIP_Y:
285 45
             *hiwater += move_metasprite_flipy(
286
-                    metasprites[sprite].ms[0], metasprites[sprite].off,
46
+                    metasprites[sprite].ms[frame], metasprites[sprite].off,
287 47
                     metasprites[sprite].pa_i, *hiwater,
288 48
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
289 49
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
@@ -291,7 +51,7 @@ void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip, int8_t x_off, int8_t y
291 51
 
292 52
         case FLIP_XY:
293 53
             *hiwater += move_metasprite_flipxy(
294
-                    metasprites[sprite].ms[0], metasprites[sprite].off,
54
+                    metasprites[sprite].ms[frame], metasprites[sprite].off,
295 55
                     metasprites[sprite].pa_i, *hiwater,
296 56
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
297 57
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
@@ -299,7 +59,7 @@ void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip, int8_t x_off, int8_t y
299 59
 
300 60
         case FLIP_X:
301 61
             *hiwater += move_metasprite_flipx(
302
-                    metasprites[sprite].ms[0], metasprites[sprite].off,
62
+                    metasprites[sprite].ms[frame], metasprites[sprite].off,
303 63
                     metasprites[sprite].pa_i, *hiwater,
304 64
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
305 65
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
@@ -308,7 +68,7 @@ void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip, int8_t x_off, int8_t y
308 68
         case FLIP_NONE:
309 69
         default:
310 70
             *hiwater += move_metasprite_ex(
311
-                    metasprites[sprite].ms[0], metasprites[sprite].off,
71
+                    metasprites[sprite].ms[frame], metasprites[sprite].off,
312 72
                     metasprites[sprite].pa_i, *hiwater,
313 73
                     DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
314 74
                     DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
@@ -319,30 +79,30 @@ void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip, int8_t x_off, int8_t y
319 79
 void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater) {
320 80
     switch (rot) {
321 81
         case ROT_0:
322
-            spr_draw(SPR_SHIP_0, FLIP_NONE, 0, 0, hiwater);
82
+            spr_draw(SPR_SHIP_0, FLIP_NONE, 0, 0, 0, hiwater);
323 83
             if (moving) {
324
-                spr_draw(SPR_THRUST_0, FLIP_NONE, 0, SHIP_OFF, hiwater);
84
+                spr_draw(SPR_THRUST_0, FLIP_NONE, 0, SHIP_OFF, 0, hiwater);
325 85
             }
326 86
             break;
327 87
 
328 88
         case ROT_90:
329
-            spr_draw(SPR_SHIP_90, FLIP_NONE, 0, 0, hiwater);
89
+            spr_draw(SPR_SHIP_90, FLIP_NONE, 0, 0, 0, hiwater);
330 90
             if (moving) {
331
-                spr_draw(SPR_THRUST_90, FLIP_NONE, -SHIP_OFF, 0, hiwater);
91
+                spr_draw(SPR_THRUST_90, FLIP_NONE, -SHIP_OFF, 0, 0, hiwater);
332 92
             }
333 93
             break;
334 94
 
335 95
         case ROT_180:
336
-            spr_draw(SPR_SHIP_0, FLIP_Y, 0, 0, hiwater);
96
+            spr_draw(SPR_SHIP_0, FLIP_Y, 0, 0, 0, hiwater);
337 97
             if (moving) {
338
-                spr_draw(SPR_THRUST_0, FLIP_Y, 0, -SHIP_OFF, hiwater);
98
+                spr_draw(SPR_THRUST_0, FLIP_Y, 0, -SHIP_OFF, 0, hiwater);
339 99
             }
340 100
             break;
341 101
 
342 102
         case ROT_270:
343
-            spr_draw(SPR_SHIP_90, FLIP_X, 0, 0, hiwater);
103
+            spr_draw(SPR_SHIP_90, FLIP_X, 0, 0, 0, hiwater);
344 104
             if (moving) {
345
-                spr_draw(SPR_THRUST_90, FLIP_X, SHIP_OFF, 0, hiwater);
105
+                spr_draw(SPR_THRUST_90, FLIP_X, SHIP_OFF, 0, 0, hiwater);
346 106
             }
347 107
             break;
348 108
 

+ 1
- 1
src/sprites.h View File

@@ -72,7 +72,7 @@ enum SPRITE_ROT {
72 72
 };
73 73
 
74 74
 void spr_init(void);
75
-void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off, uint8_t *hiwater);
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);
76 76
 void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater);
77 77
 
78 78
 #endif // __SPRITES_H__

Loading…
Cancel
Save