Browse Source

add music repeat option and music debug menu

Thomas B 1 month ago
parent
commit
33f411a680
8 changed files with 134 additions and 49 deletions
  1. 87
    7
      src/main.c
  2. 5
    4
      src/main.h
  3. 9
    1
      src/maps.c
  4. 26
    37
      src/sound.c
  5. 3
    0
      src/sound.h
  6. 1
    0
      src/sound_game.c
  7. 1
    0
      src/sound_menu.c
  8. 2
    0
      src/sound_over.c

+ 87
- 7
src/main.c View File

@@ -44,13 +44,15 @@ enum debug_flag debug_flags = 0;
44 44
 #endif
45 45
 
46 46
 uint8_t debug_menu_index = 0;
47
+uint8_t debug_special_value = 0;
47 48
 
48 49
 BANKREF(main)
49 50
 
50 51
 const struct debug_entry debug_entries[DEBUG_ENTRY_COUNT] = {
51
-    { .name = "marker", .flag = DBG_MARKER },
52
-    { .name = "invuln", .flag = DBG_GOD_MODE },
53
-    { .name = "cl score", .flag = DBG_CLEAR_SCORE },
52
+    { .name = "marker",   .flag = DBG_MARKER,      .max = 1 },
53
+    { .name = "invuln",   .flag = DBG_GOD_MODE,    .max = 1 },
54
+    { .name = "music",    .flag = DBG_NONE,        .max = 3 },
55
+    { .name = "cl score", .flag = DBG_CLEAR_SCORE, .max = 1 },
54 56
 };
55 57
 
56 58
 static void highscore(uint8_t is_black) NONBANKED {
@@ -210,15 +212,17 @@ static void splash(void) NONBANKED {
210 212
     DISPLAY_ON;
211 213
     enable_interrupts();
212 214
 
213
-    snd_menu_music();
215
+    if (!(debug_flags & DBG_MENU)) {
216
+        snd_menu_music();
217
+    }
214 218
 
215 219
     while (1) {
216 220
         key_read();
217 221
 
218
-        if (key_pressed(J_LEFT)) {
222
+        if (key_pressed(J_LEFT) && (!(debug_flags & DBG_MENU))) {
219 223
             highscore(1);
220 224
             splash_win();
221
-        } else if (key_pressed(J_RIGHT)) {
225
+        } else if (key_pressed(J_RIGHT) && (!(debug_flags & DBG_MENU))) {
222 226
             highscore(0);
223 227
             splash_win();
224 228
         } else if (key_pressed(J_SELECT)) {
@@ -227,6 +231,8 @@ static void splash(void) NONBANKED {
227 231
         } else if (key_pressed(J_START)) {
228 232
             if ((key_debug() == 0) && (!(debug_flags & DBG_MENU))) {
229 233
                 debug_flags |= DBG_MENU;
234
+                snd_music_off();
235
+                snd_note_off();
230 236
                 splash_win();
231 237
             } else {
232 238
                 break;
@@ -240,12 +246,17 @@ static void splash(void) NONBANKED {
240 246
                     splash_win();
241 247
                 }
242 248
 
249
+                uint8_t switch_special = 0;
250
+
243 251
                 if (key_pressed(J_UP)) {
244 252
                     if (debug_menu_index > 0) {
245 253
                         debug_menu_index--;
246 254
                     } else {
247 255
                         debug_menu_index = DEBUG_ENTRY_COUNT - 1;
248 256
                     }
257
+                    debug_special_value = 0;
258
+                    snd_music_off();
259
+                    snd_note_off();
249 260
                     splash_win();
250 261
                 } else if (key_pressed(J_DOWN)) {
251 262
                     if (debug_menu_index < (DEBUG_ENTRY_COUNT - 1)) {
@@ -253,15 +264,84 @@ static void splash(void) NONBANKED {
253 264
                     } else {
254 265
                         debug_menu_index = 0;
255 266
                     }
267
+                    debug_special_value = 0;
268
+                    snd_music_off();
269
+                    snd_note_off();
270
+                    splash_win();
271
+                } else if (key_pressed(J_LEFT)) {
272
+                    START_ROM_BANK(BANK(main));
273
+                        if (debug_entries[debug_menu_index].flag != DBG_NONE) {
274
+                            debug_flags ^= debug_entries[debug_menu_index].flag;
275
+                        } else {
276
+                            if (debug_special_value > 0) {
277
+                                debug_special_value--;
278
+                            } else {
279
+                                debug_special_value = debug_entries[debug_menu_index].max;
280
+                            }
281
+                            switch_special = 1;
282
+                        }
283
+                    END_ROM_BANK();
284
+                    splash_win();
285
+                } else if (key_pressed(J_RIGHT)) {
286
+                    START_ROM_BANK(BANK(main));
287
+                        if (debug_entries[debug_menu_index].flag != DBG_NONE) {
288
+                            debug_flags ^= debug_entries[debug_menu_index].flag;
289
+                        } else {
290
+                            if (debug_special_value < debug_entries[debug_menu_index].max) {
291
+                                debug_special_value++;
292
+                            } else {
293
+                                debug_special_value = 0;
294
+                            }
295
+                            switch_special = 1;
296
+                        }
297
+                    END_ROM_BANK();
256 298
                     splash_win();
257 299
                 } else if (key_pressed(J_A)) {
258 300
                     START_ROM_BANK(BANK(main));
259
-                        debug_flags ^= debug_entries[debug_menu_index].flag;
301
+                        if (debug_entries[debug_menu_index].flag != DBG_NONE) {
302
+                            debug_flags ^= debug_entries[debug_menu_index].flag;
303
+                        } else {
304
+                            if (debug_special_value < debug_entries[debug_menu_index].max) {
305
+                                debug_special_value++;
306
+                            } else {
307
+                                debug_special_value = 0;
308
+                            }
309
+                            switch_special = 1;
310
+                        }
260 311
                     END_ROM_BANK();
261 312
                     splash_win();
262 313
                 } else if (key_pressed(J_B)) {
263 314
                     debug_flags &= ~DBG_MENU;
315
+                    debug_special_value = 0;
264 316
                     splash_win();
317
+                    snd_menu_music();
318
+                }
319
+
320
+                if (switch_special) {
321
+                    switch (debug_special_value) {
322
+                        case 0:
323
+                            snd_music_off();
324
+                            snd_note_off();
325
+                            break;
326
+
327
+                        case 1:
328
+                            snd_menu_music();
329
+                            snd_note_off();
330
+                            break;
331
+
332
+                        case 2:
333
+                            snd_game_music();
334
+                            snd_note_off();
335
+                            break;
336
+
337
+                        case 3:
338
+                            snd_gameover_music();
339
+                            snd_note_off();
340
+                            break;
341
+
342
+                        default:
343
+                            break;
344
+                    }
265 345
                 }
266 346
             }
267 347
         }

+ 5
- 4
src/main.h View File

@@ -27,12 +27,12 @@
27 27
 #include <stdint.h>
28 28
 
29 29
 enum debug_flag {
30
+    DBG_NONE = 0,
31
+
30 32
     DBG_MENU = (1 << 0),
31 33
     DBG_MARKER = (1 << 1),
32 34
     DBG_GOD_MODE = (1 << 2),
33 35
     DBG_CLEAR_SCORE = (1 << 3),
34
-
35
-    DBG_FLAG_COUNT = 2
36 36
 };
37 37
 
38 38
 #define DEBUG_ENTRY_NAME_LEN 8
@@ -40,15 +40,16 @@ enum debug_flag {
40 40
 struct debug_entry {
41 41
     char name[DEBUG_ENTRY_NAME_LEN + 1];
42 42
     enum debug_flag flag;
43
+    uint8_t max;
43 44
 };
44 45
 
45 46
 BANKREF_EXTERN(main)
46 47
 
47 48
 extern enum debug_flag debug_flags;
48 49
 extern uint8_t debug_menu_index;
50
+extern uint8_t debug_special_value;
49 51
 
50
-#define DEBUG_ENTRY_COUNT 3
51
-
52
+#define DEBUG_ENTRY_COUNT 4
52 53
 extern const struct debug_entry debug_entries[DEBUG_ENTRY_COUNT];
53 54
 
54 55
 #endif // __MAIN_H__

+ 9
- 1
src/maps.c View File

@@ -283,7 +283,15 @@ void win_debug(void) NONBANKED {
283 283
 
284 284
             uint8_t n_len = strlen(name_buff);
285 285
             name_buff[n_len] = ' ';
286
-            name_buff[n_len + 1] = (debug_flags & debug_entries[i].flag) ? '1' : '0';
286
+            if (debug_entries[i].flag == DBG_NONE) {
287
+                if (debug_menu_index == i) {
288
+                    name_buff[n_len + 1] = debug_special_value + '0';
289
+                } else {
290
+                    name_buff[n_len + 1] = '0';
291
+                }
292
+            } else {
293
+                name_buff[n_len + 1] = (debug_flags & debug_entries[i].flag) ? '1' : '0';
294
+            }
287 295
             name_buff[n_len + 2] = '\0';
288 296
             n_len += 2;
289 297
         END_ROM_BANK();

+ 26
- 37
src/sound.c View File

@@ -126,37 +126,12 @@ void snd_note_off(void) BANKED {
126 126
     play_note2(SILENCE);
127 127
 }
128 128
 
129
-static void play_current_note(void) NONBANKED {
130
-    if (!music) {
131
-        return;
132
-    }
133
-
134
-    START_ROM_BANK(bank);
135
-        if (music->notes) {
136
-            if (music->notes[off] != END) {
137
-                play_note(music->notes[off]);
138
-            }
139
-        }
140
-        if (music->notes2) {
141
-            if (music->notes2[off] != END) {
142
-                play_note(music->notes2[off]);
143
-            }
144
-        }
145
-        if (music->drums) {
146
-            if (music->drums[off] != dEND) {
147
-                play_drum(music->drums[off]);
148
-            }
149
-        }
150
-    END_ROM_BANK();
151
-}
152
-
153 129
 void snd_menu_music(void) BANKED {
154 130
     CRITICAL {
155 131
         music = &music_menu;
156 132
         bank = BANK(sound_menu);
157 133
         off = 0;
158 134
         last_t = timer_get();
159
-        play_current_note();
160 135
     }
161 136
 }
162 137
 
@@ -166,7 +141,6 @@ void snd_game_music(void) BANKED {
166 141
         bank = BANK(sound_game);
167 142
         off = 0;
168 143
         last_t = timer_get();
169
-        play_current_note();
170 144
     }
171 145
 }
172 146
 
@@ -176,7 +150,6 @@ void snd_gameover_music(void) BANKED {
176 150
         bank = BANK(sound_over);
177 151
         off = 0;
178 152
         last_t = timer_get();
179
-        play_current_note();
180 153
     }
181 154
 }
182 155
 
@@ -186,36 +159,52 @@ void snd_play(void) NONBANKED {
186 159
     }
187 160
 
188 161
     START_ROM_BANK(bank);
189
-    CRITICAL {
162
+
190 163
         uint16_t diff = timer_get() - last_t;
191 164
         if (diff >= music->duration) {
192
-            off++;
193
-            last_t += music->duration;
194
-
195 165
             if (music->notes) {
196 166
                 if (music->notes[off] != END) {
197 167
                     play_note(music->notes[off]);
198 168
                 } else {
199
-                    off = 0xFFFF;
169
+                    if (music->repeat != MUSIC_NO_REPEAT) {
170
+                        off = music->repeat;
171
+                    } else {
172
+                        music = NULL;
173
+                        goto end;
174
+                    }
200 175
                 }
201 176
             }
202 177
 
203
-            if (music->notes2) {
178
+            if (music && music->notes2) {
204 179
                 if (music->notes2[off] != END) {
205 180
                     play_note2(music->notes2[off]);
206 181
                 } else {
207
-                    off = 0xFFFF;
182
+                    if (music->repeat != MUSIC_NO_REPEAT) {
183
+                        off = music->repeat;
184
+                    } else {
185
+                        music = NULL;
186
+                        goto end;
187
+                    }
208 188
                 }
209 189
             }
210 190
 
211
-            if (music->drums) {
191
+            if (music && music->drums) {
212 192
                 if (music->drums[off] != dEND) {
213 193
                     play_drum(music->drums[off]);
214 194
                 } else {
215
-                    off = 0xFFFF;
195
+                    if (music->repeat != MUSIC_NO_REPEAT) {
196
+                        off = music->repeat;
197
+                    } else {
198
+                        music = NULL;
199
+                        goto end;
200
+                    }
216 201
                 }
217 202
             }
203
+
204
+            off++;
205
+            last_t += music->duration;
218 206
         }
219
-    }
207
+
208
+end:
220 209
     END_ROM_BANK();
221 210
 }

+ 3
- 0
src/sound.h View File

@@ -59,11 +59,14 @@ enum drums {
59 59
     dEND,
60 60
 };
61 61
 
62
+#define MUSIC_NO_REPEAT 0xFFFF
63
+
62 64
 struct music {
63 65
     enum notes * const notes;
64 66
     enum notes * const notes2;
65 67
     enum drums * const drums;
66 68
     uint16_t duration;
69
+    uint16_t repeat;
67 70
 };
68 71
 
69 72
 void snd_init(void) BANKED;

+ 1
- 0
src/sound_game.c View File

@@ -37,4 +37,5 @@ const struct music music_game = {
37 37
     .notes2 = NULL,
38 38
     .drums = NULL,
39 39
     .duration = 200,
40
+    .repeat = 0,
40 41
 };

+ 1
- 0
src/sound_menu.c View File

@@ -201,4 +201,5 @@ const struct music music_menu = {
201 201
     .notes2 = menu_music2,
202 202
     .drums = NULL,
203 203
     .duration = 150,
204
+    .repeat = 0,
204 205
 };

+ 2
- 0
src/sound_over.c View File

@@ -24,6 +24,7 @@
24 24
  */
25 25
 
26 26
 #include "banks.h"
27
+#include "sound.h"
27 28
 #include "sound_over.h"
28 29
 
29 30
 BANKREF(sound_over)
@@ -197,4 +198,5 @@ const struct music music_over = {
197 198
     .notes2 = over_notes2,
198 199
     .drums = over_drums,
199 200
     .duration = 120,
201
+    .repeat = MUSIC_NO_REPEAT,
200 202
 };

Loading…
Cancel
Save