|
@@ -1,8 +1,17 @@
|
|
1
|
+/*
|
|
2
|
+ * main.c
|
|
3
|
+ * Duality
|
|
4
|
+ */
|
|
5
|
+
|
1
|
6
|
#include <gbdk/platform.h>
|
2
|
7
|
#include <gbdk/metasprites.h>
|
3
|
8
|
|
4
|
|
-#include "rockshp.h"
|
5
|
9
|
#include "bg_map.h"
|
|
10
|
+#include "rockshp.h"
|
|
11
|
+#include "thrustG.h"
|
|
12
|
+#include "light.h"
|
|
13
|
+#include "dark.h"
|
|
14
|
+#include "shoot.h"
|
6
|
15
|
|
7
|
16
|
#define TILE_WIDTH 8
|
8
|
17
|
#define TILE_HEIGHT 8
|
|
@@ -30,26 +39,50 @@ uint8_t joyp = 0, old_joyp = 0;
|
30
|
39
|
#define KEY_DOWN(KEY) (joyp & (KEY))
|
31
|
40
|
#define KEY_PRESSED(KEY) ((joyp ^ old_joyp) & joyp & (KEY))
|
32
|
41
|
|
33
|
|
-const palette_color_t gray_pal[4] = { RGB8(255,255,255),
|
34
|
|
- RGB8(170,170,170),
|
35
|
|
- RGB8(85,85,85),
|
36
|
|
- RGB8(0,0,0) };
|
37
|
|
-const palette_color_t pink_pal[4] = { RGB8(255,255,255),
|
38
|
|
- RGB8(255,0,255),
|
39
|
|
- RGB8(170,0,170),
|
40
|
|
- RGB8(85,0,85) };
|
41
|
|
-const palette_color_t cyan_pal[4] = { RGB8(255,255,255),
|
42
|
|
- RGB8(85,255,255),
|
43
|
|
- RGB8(0,170,170),
|
44
|
|
- RGB8(0,85,85) };
|
45
|
|
-const palette_color_t green_pal[4] = { RGB8(255,255,255),
|
46
|
|
- RGB8(170,255,170),
|
47
|
|
- RGB8(0,170,0),
|
48
|
|
- RGB8(0,85,0) };
|
49
|
|
-
|
50
|
|
-const uint8_t pattern[] = {0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x01,0x01};
|
|
42
|
+struct sprites {
|
|
43
|
+ const metasprite_t * const * ms;
|
|
44
|
+ const uint8_t * ti;
|
|
45
|
+ const palette_color_t * pa;
|
|
46
|
+ uint8_t cnt;
|
|
47
|
+ uint8_t off;
|
|
48
|
+};
|
|
49
|
+
|
|
50
|
+struct sprites metasprites[] = {
|
|
51
|
+ {
|
|
52
|
+ .ms = rockshp_metasprites,
|
|
53
|
+ .ti = rockshp_tiles,
|
|
54
|
+ .pa = rockshp_palettes,
|
|
55
|
+ .cnt = rockshp_TILE_COUNT,
|
|
56
|
+ .off = TILE_NUM_START
|
|
57
|
+ }, {
|
|
58
|
+ .ms = thrustG_metasprites,
|
|
59
|
+ .ti = thrustG_tiles,
|
|
60
|
+ .pa = thrustG_palettes,
|
|
61
|
+ .cnt = thrustG_TILE_COUNT,
|
|
62
|
+ .off = TILE_NUM_START
|
|
63
|
+ }, {
|
|
64
|
+ .ms = light_metasprites,
|
|
65
|
+ .ti = light_tiles,
|
|
66
|
+ .pa = light_palettes,
|
|
67
|
+ .cnt = light_TILE_COUNT,
|
|
68
|
+ .off = TILE_NUM_START
|
|
69
|
+ }, {
|
|
70
|
+ .ms = dark_metasprites,
|
|
71
|
+ .ti = dark_tiles,
|
|
72
|
+ .pa = dark_palettes,
|
|
73
|
+ .cnt = dark_TILE_COUNT,
|
|
74
|
+ .off = TILE_NUM_START
|
|
75
|
+ }, {
|
|
76
|
+ .ms = shoot_metasprites,
|
|
77
|
+ .ti = shoot_tiles,
|
|
78
|
+ .pa = shoot_palettes,
|
|
79
|
+ .cnt = shoot_TILE_COUNT,
|
|
80
|
+ .off = TILE_NUM_START
|
|
81
|
+ }
|
|
82
|
+};
|
51
|
83
|
|
52
|
84
|
void main(void) {
|
|
85
|
+ disable_interrupts();
|
53
|
86
|
DISPLAY_OFF;
|
54
|
87
|
|
55
|
88
|
set_default_palette();
|
|
@@ -60,24 +93,21 @@ void main(void) {
|
60
|
93
|
set_bkg_attributes(0, 0, bg_map_MAP_ATTRIBUTES_WIDTH, bg_map_MAP_ATTRIBUTES_HEIGHT, bg_map_MAP_ATTRIBUTES);
|
61
|
94
|
set_bkg_tiles(0, 0, bg_map_WIDTH / bg_map_TILE_W, bg_map_HEIGHT / bg_map_TILE_H, bg_map_map);
|
62
|
95
|
|
|
96
|
+ // metasprites
|
|
97
|
+ uint8_t off = TILE_NUM_START;
|
|
98
|
+ for (int i = 0; i < (sizeof(metasprites) / sizeof(metasprites[0])); i++) {
|
|
99
|
+ metasprites[i].off = off;
|
|
100
|
+ off += metasprites[i].cnt;
|
63
|
101
|
|
64
|
|
- set_sprite_palette(OAMF_CGB_PAL0, 1, rockshp_palettes); //gray_pal);
|
65
|
|
- set_sprite_palette(OAMF_CGB_PAL1, 1, pink_pal);
|
66
|
|
- set_sprite_palette(OAMF_CGB_PAL2, 1, cyan_pal);
|
67
|
|
- set_sprite_palette(OAMF_CGB_PAL3, 1, green_pal);
|
68
|
|
-
|
69
|
|
- size_t i;
|
70
|
|
- num_tiles = sizeof(rockshp_tiles) >> 4;
|
71
|
|
- for(i = 0; i < num_tiles; i++)
|
72
|
|
- {
|
73
|
|
- //set_tile(i + get_tile_offset(0, 0), rockshp_tiles + (i << 4));
|
74
|
|
- set_sprite_data(i, 1, rockshp_tiles + (i << 4));
|
|
102
|
+ set_sprite_palette(OAMF_CGB_PAL0 + i, 1, metasprites[i].pa);
|
|
103
|
+ set_sprite_data(metasprites[i].off, metasprites[i].cnt, metasprites[i].ti);
|
75
|
104
|
}
|
76
|
105
|
|
77
|
106
|
SHOW_BKG;
|
78
|
107
|
SHOW_SPRITES;
|
79
|
108
|
SPRITES_8x8;
|
80
|
109
|
DISPLAY_ON;
|
|
110
|
+ enable_interrupts();
|
81
|
111
|
|
82
|
112
|
// Set initial position to the center of the screen, zero out speed
|
83
|
113
|
PosX = (DEVICE_SCREEN_PX_WIDTH / 2) << 4;
|
|
@@ -113,12 +143,13 @@ void main(void) {
|
113
|
143
|
|
114
|
144
|
// Press B button to cycle through metasprite animations
|
115
|
145
|
if (KEY_PRESSED(J_B)) {
|
116
|
|
- idx++; if (idx >= (sizeof(rockshp_metasprites) >> 1)) idx = 0;
|
|
146
|
+ idx++;
|
|
147
|
+ if (idx >= (sizeof(metasprites) / sizeof(metasprites[0]))) idx = 0;
|
117
|
148
|
}
|
118
|
149
|
|
119
|
150
|
// Press A button to cycle metasprite through Normal/Flip-Y/Flip-XY/Flip-X and sub-pals
|
120
|
151
|
if (KEY_PRESSED(J_A)) {
|
121
|
|
- rot++; rot &= 0xF;
|
|
152
|
+ rot++; rot &= 0x3;
|
122
|
153
|
}
|
123
|
154
|
|
124
|
155
|
PosX += SpdX, PosY += SpdY;
|
|
@@ -132,36 +163,35 @@ void main(void) {
|
132
|
163
|
// In this example they are called every frame to simplify the example code
|
133
|
164
|
|
134
|
165
|
// If not hidden the move and apply rotation to the metasprite
|
135
|
|
- uint8_t subpal = rot >> 2;
|
136
|
166
|
switch (rot & 0x3) {
|
137
|
167
|
case 1:
|
138
|
|
- hiwater += move_metasprite_flipy( rockshp_metasprites[idx],
|
139
|
|
- TILE_NUM_START,
|
140
|
|
- subpal,
|
|
168
|
+ hiwater += move_metasprite_flipy( metasprites[idx].ms[0],
|
|
169
|
+ metasprites[idx].off,
|
|
170
|
+ idx,
|
141
|
171
|
hiwater,
|
142
|
172
|
DEVICE_SPRITE_PX_OFFSET_X + (PosX >> 4),
|
143
|
173
|
DEVICE_SPRITE_PX_OFFSET_Y + (PosY >> 4));
|
144
|
174
|
break;
|
145
|
175
|
case 2:
|
146
|
|
- hiwater += move_metasprite_flipxy(rockshp_metasprites[idx],
|
147
|
|
- TILE_NUM_START,
|
148
|
|
- subpal,
|
|
176
|
+ hiwater += move_metasprite_flipxy(metasprites[idx].ms[0],
|
|
177
|
+ metasprites[idx].off,
|
|
178
|
+ idx,
|
149
|
179
|
hiwater,
|
150
|
180
|
DEVICE_SPRITE_PX_OFFSET_X + (PosX >> 4),
|
151
|
181
|
DEVICE_SPRITE_PX_OFFSET_Y + (PosY >> 4));
|
152
|
182
|
break;
|
153
|
183
|
case 3:
|
154
|
|
- hiwater += move_metasprite_flipx( rockshp_metasprites[idx],
|
155
|
|
- TILE_NUM_START,
|
156
|
|
- subpal,
|
|
184
|
+ hiwater += move_metasprite_flipx( metasprites[idx].ms[0],
|
|
185
|
+ metasprites[idx].off,
|
|
186
|
+ idx,
|
157
|
187
|
hiwater,
|
158
|
188
|
DEVICE_SPRITE_PX_OFFSET_X + (PosX >> 4),
|
159
|
189
|
DEVICE_SPRITE_PX_OFFSET_Y + (PosY >> 4));
|
160
|
190
|
break;
|
161
|
191
|
default:
|
162
|
|
- hiwater += move_metasprite_ex( rockshp_metasprites[idx],
|
163
|
|
- TILE_NUM_START,
|
164
|
|
- subpal,
|
|
192
|
+ hiwater += move_metasprite_ex( metasprites[idx].ms[0],
|
|
193
|
+ metasprites[idx].off,
|
|
194
|
+ idx,
|
165
|
195
|
hiwater,
|
166
|
196
|
DEVICE_SPRITE_PX_OFFSET_X + (PosX >> 4),
|
167
|
197
|
DEVICE_SPRITE_PX_OFFSET_Y + (PosY >> 4));
|