|
@@ -32,6 +32,8 @@
|
32
|
32
|
#include "light.h"
|
33
|
33
|
#include "dark.h"
|
34
|
34
|
#include "shoot.h"
|
|
35
|
+#include "health.h"
|
|
36
|
+#include "power.h"
|
35
|
37
|
|
36
|
38
|
// Metasprite tiles are loaded into VRAM starting at tile number 0
|
37
|
39
|
#define TILE_NUM_START 0
|
|
@@ -40,6 +42,7 @@ struct sprites {
|
40
|
42
|
const metasprite_t * const * ms;
|
41
|
43
|
const uint8_t * ti;
|
42
|
44
|
const palette_color_t * pa;
|
|
45
|
+ uint8_t pa_i;
|
43
|
46
|
uint8_t cnt;
|
44
|
47
|
uint8_t off;
|
45
|
48
|
};
|
|
@@ -49,64 +52,87 @@ static struct sprites metasprites[SPRITE_COUNT] = {
|
49
|
52
|
.ms = rockshp_0_metasprites,
|
50
|
53
|
.ti = rockshp_0_tiles,
|
51
|
54
|
.pa = rockshp_0_palettes,
|
|
55
|
+ .pa_i = OAMF_CGB_PAL0,
|
52
|
56
|
.cnt = rockshp_0_TILE_COUNT,
|
53
|
57
|
.off = TILE_NUM_START
|
54
|
58
|
}, {
|
55
|
59
|
.ms = rockshp_90_metasprites,
|
56
|
60
|
.ti = rockshp_90_tiles,
|
57
|
|
- .pa = rockshp_90_palettes,
|
|
61
|
+ .pa = NULL,
|
|
62
|
+ .pa_i = OAMF_CGB_PAL0,
|
58
|
63
|
.cnt = rockshp_90_TILE_COUNT,
|
59
|
64
|
.off = TILE_NUM_START
|
60
|
65
|
}, {
|
61
|
66
|
.ms = thrust_0_metasprites,
|
62
|
67
|
.ti = thrust_0_tiles,
|
63
|
68
|
.pa = thrust_0_palettes,
|
|
69
|
+ .pa_i = OAMF_CGB_PAL1,
|
64
|
70
|
.cnt = thrust_0_TILE_COUNT,
|
65
|
71
|
.off = TILE_NUM_START
|
66
|
72
|
}, {
|
67
|
73
|
.ms = thrust_90_metasprites,
|
68
|
74
|
.ti = thrust_90_tiles,
|
69
|
|
- .pa = thrust_90_palettes,
|
|
75
|
+ .pa = NULL,
|
|
76
|
+ .pa_i = OAMF_CGB_PAL1,
|
70
|
77
|
.cnt = thrust_90_TILE_COUNT,
|
71
|
78
|
.off = TILE_NUM_START
|
72
|
79
|
}, {
|
73
|
80
|
.ms = light_metasprites,
|
74
|
81
|
.ti = light_tiles,
|
75
|
82
|
.pa = light_palettes,
|
|
83
|
+ .pa_i = OAMF_CGB_PAL2,
|
76
|
84
|
.cnt = light_TILE_COUNT,
|
77
|
85
|
.off = TILE_NUM_START
|
78
|
86
|
}, {
|
79
|
87
|
.ms = dark_metasprites,
|
80
|
88
|
.ti = dark_tiles,
|
81
|
89
|
.pa = dark_palettes,
|
|
90
|
+ .pa_i = OAMF_CGB_PAL3,
|
82
|
91
|
.cnt = dark_TILE_COUNT,
|
83
|
92
|
.off = TILE_NUM_START
|
84
|
93
|
}, {
|
85
|
94
|
.ms = shoot_metasprites,
|
86
|
95
|
.ti = shoot_tiles,
|
87
|
96
|
.pa = shoot_palettes,
|
|
97
|
+ .pa_i = OAMF_CGB_PAL4,
|
88
|
98
|
.cnt = shoot_TILE_COUNT,
|
89
|
99
|
.off = TILE_NUM_START
|
|
100
|
+ }, {
|
|
101
|
+ .ms = health_metasprites,
|
|
102
|
+ .ti = health_tiles,
|
|
103
|
+ .pa = health_palettes, // RGB8(239, 0, 0), RGB8(204, 0, 0), RGB8(167, 1, 0), RGB8(116, 0, 0)
|
|
104
|
+ .pa_i = OAMF_CGB_PAL5,
|
|
105
|
+ .cnt = health_TILE_COUNT,
|
|
106
|
+ .off = TILE_NUM_START
|
|
107
|
+ }, {
|
|
108
|
+ .ms = power_metasprites,
|
|
109
|
+ .ti = power_tiles,
|
|
110
|
+ .pa = power_palettes, // RGB8( 0,236, 0), RGB8( 2,193, 1), RGB8( 5,152, 0), RGB8( 3, 98, 0)
|
|
111
|
+ .pa_i = OAMF_CGB_PAL6,
|
|
112
|
+ .cnt = power_TILE_COUNT,
|
|
113
|
+ .off = TILE_NUM_START
|
90
|
114
|
}
|
91
|
115
|
};
|
92
|
116
|
|
93
|
117
|
void spr_init(void) {
|
94
|
118
|
uint8_t off = TILE_NUM_START;
|
95
|
|
- for (int i = 0; i < (sizeof(metasprites) / sizeof(metasprites[0])); i++) {
|
|
119
|
+ for (uint8_t i = 0; i < SPRITE_COUNT; i++) {
|
96
|
120
|
metasprites[i].off = off;
|
97
|
121
|
off += metasprites[i].cnt;
|
98
|
122
|
|
99
|
|
- set_sprite_palette(OAMF_CGB_PAL0 + i, 1, metasprites[i].pa);
|
|
123
|
+ if (metasprites[i].pa != NULL) {
|
|
124
|
+ set_sprite_palette(metasprites[i].pa_i, 1, metasprites[i].pa);
|
|
125
|
+ }
|
100
|
126
|
set_sprite_data(metasprites[i].off, metasprites[i].cnt, metasprites[i].ti);
|
101
|
127
|
}
|
102
|
128
|
}
|
103
|
129
|
|
104
|
|
-void spr_draw(enum SPRITES sprite, uint8_t *hiwater, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off) {
|
|
130
|
+void spr_draw(enum SPRITES sprite, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off, uint8_t *hiwater) {
|
105
|
131
|
switch (flip) {
|
106
|
132
|
case FLIP_Y:
|
107
|
133
|
*hiwater += move_metasprite_flipy(
|
108
|
134
|
metasprites[sprite].ms[0], metasprites[sprite].off,
|
109
|
|
- OAMF_CGB_PAL0 + sprite, *hiwater,
|
|
135
|
+ metasprites[sprite].pa_i, *hiwater,
|
110
|
136
|
DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
|
111
|
137
|
DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
|
112
|
138
|
break;
|
|
@@ -114,7 +140,7 @@ void spr_draw(enum SPRITES sprite, uint8_t *hiwater, enum SPRITE_FLIP flip, int8
|
114
|
140
|
case FLIP_XY:
|
115
|
141
|
*hiwater += move_metasprite_flipxy(
|
116
|
142
|
metasprites[sprite].ms[0], metasprites[sprite].off,
|
117
|
|
- OAMF_CGB_PAL0 + sprite, *hiwater,
|
|
143
|
+ metasprites[sprite].pa_i, *hiwater,
|
118
|
144
|
DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
|
119
|
145
|
DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
|
120
|
146
|
break;
|
|
@@ -122,7 +148,7 @@ void spr_draw(enum SPRITES sprite, uint8_t *hiwater, enum SPRITE_FLIP flip, int8
|
122
|
148
|
case FLIP_X:
|
123
|
149
|
*hiwater += move_metasprite_flipx(
|
124
|
150
|
metasprites[sprite].ms[0], metasprites[sprite].off,
|
125
|
|
- OAMF_CGB_PAL0 + sprite, *hiwater,
|
|
151
|
+ metasprites[sprite].pa_i, *hiwater,
|
126
|
152
|
DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
|
127
|
153
|
DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
|
128
|
154
|
break;
|
|
@@ -131,7 +157,7 @@ void spr_draw(enum SPRITES sprite, uint8_t *hiwater, enum SPRITE_FLIP flip, int8
|
131
|
157
|
default:
|
132
|
158
|
*hiwater += move_metasprite_ex(
|
133
|
159
|
metasprites[sprite].ms[0], metasprites[sprite].off,
|
134
|
|
- OAMF_CGB_PAL0 + sprite, *hiwater,
|
|
160
|
+ metasprites[sprite].pa_i, *hiwater,
|
135
|
161
|
DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
|
136
|
162
|
DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
|
137
|
163
|
break;
|
|
@@ -141,30 +167,30 @@ void spr_draw(enum SPRITES sprite, uint8_t *hiwater, enum SPRITE_FLIP flip, int8
|
141
|
167
|
void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater) {
|
142
|
168
|
switch (rot) {
|
143
|
169
|
case ROT_0:
|
144
|
|
- spr_draw(SPR_SHIP_0, hiwater, FLIP_NONE, 0, 0);
|
|
170
|
+ spr_draw(SPR_SHIP_0, FLIP_NONE, 0, 0, hiwater);
|
145
|
171
|
if (moving) {
|
146
|
|
- spr_draw(SPR_THRUST_0, hiwater, FLIP_NONE, 0, SHIP_OFF);
|
|
172
|
+ spr_draw(SPR_THRUST_0, FLIP_NONE, 0, SHIP_OFF, hiwater);
|
147
|
173
|
}
|
148
|
174
|
break;
|
149
|
175
|
|
150
|
176
|
case ROT_90:
|
151
|
|
- spr_draw(SPR_SHIP_90, hiwater, FLIP_NONE, 0, 0);
|
|
177
|
+ spr_draw(SPR_SHIP_90, FLIP_NONE, 0, 0, hiwater);
|
152
|
178
|
if (moving) {
|
153
|
|
- spr_draw(SPR_THRUST_90, hiwater, FLIP_NONE, -SHIP_OFF, 0);
|
|
179
|
+ spr_draw(SPR_THRUST_90, FLIP_NONE, -SHIP_OFF, 0, hiwater);
|
154
|
180
|
}
|
155
|
181
|
break;
|
156
|
182
|
|
157
|
183
|
case ROT_180:
|
158
|
|
- spr_draw(SPR_SHIP_0, hiwater, FLIP_Y, 0, 0);
|
|
184
|
+ spr_draw(SPR_SHIP_0, FLIP_Y, 0, 0, hiwater);
|
159
|
185
|
if (moving) {
|
160
|
|
- spr_draw(SPR_THRUST_0, hiwater, FLIP_Y, 0, -SHIP_OFF);
|
|
186
|
+ spr_draw(SPR_THRUST_0, FLIP_Y, 0, -SHIP_OFF, hiwater);
|
161
|
187
|
}
|
162
|
188
|
break;
|
163
|
189
|
|
164
|
190
|
case ROT_270:
|
165
|
|
- spr_draw(SPR_SHIP_90, hiwater, FLIP_X, 0, 0);
|
|
191
|
+ spr_draw(SPR_SHIP_90, FLIP_X, 0, 0, hiwater);
|
166
|
192
|
if (moving) {
|
167
|
|
- spr_draw(SPR_THRUST_90, hiwater, FLIP_X, SHIP_OFF, 0);
|
|
193
|
+ spr_draw(SPR_THRUST_90, FLIP_X, SHIP_OFF, 0, hiwater);
|
168
|
194
|
}
|
169
|
195
|
break;
|
170
|
196
|
|