diff --git a/game-ctrl/game.c b/game-ctrl/game.c index fc202f1..756f202 100644 --- a/game-ctrl/game.c +++ b/game-ctrl/game.c @@ -12,12 +12,13 @@ #include "buttons.h" -#define GAME_CYCLE_TIME 100 +#define GAME_CYCLE_TIME 50 #define GAMEOVER_DELAY 10 +#define MAX_LEVEL 20 static uint8_t delayFactor(uint8_t level) { - return 11 - level; + return MAX_LEVEL + 1 - level; } typedef enum { @@ -36,6 +37,7 @@ void gameExec(void *handle) { static uint8_t rowIndex; static uint8_t proceedDelay; static uint8_t level; + static uint16_t filledLines; static uint16_t score; static bool newHighScoreAchieved; @@ -46,6 +48,7 @@ void gameExec(void *handle) { canvasClear(); soundCtrl(SOUND_START); level = 1; + filledLines = 0; score = 0; newHighScoreAchieved = false; phase = e_Phase_Game; @@ -118,9 +121,9 @@ void gameExec(void *handle) { } // --- engine end --------------------------------------------------------- + bool wipedLines = false; canvasShow(); if (phase == e_Phase_Game) { - uint8_t wipeCnt = 0; for (uint8_t r = 0; r < CANVAS_HEIGHT; r++) { if (canvasIsRowFilled(r)) { score += level; @@ -131,14 +134,24 @@ void gameExec(void *handle) { displaySetValue(score); canvasWipeRow(r); canvasShow(); - wipeCnt += 1; + wipedLines = true; + filledLines += 1; } } - if (wipeCnt != 0) { - soundCtrl(SOUND_FANFARE); - } } + if (wipedLines) { + soundCtrl(SOUND_PLING); + } + + if (wipedLines && (filledLines > 0) && ((filledLines % 10) == 0)) { + if (level < MAX_LEVEL) { + level += 1; + } + soundCtrl(SOUND_FANFARE); + } + + if (isGameActive()) { displaySetValue(score); } else { diff --git a/sound-driver/Makefile b/sound-driver/Makefile index 957525a..fa14a2a 100644 --- a/sound-driver/Makefile +++ b/sound-driver/Makefile @@ -13,7 +13,7 @@ CFLAGS+= -g3 -ggdb -gdwarf-2 LDFLAGS=-mmcu=$(MCU) -L $(TOOLCHAIN_PREFIX)/include -$(ARTIFACT).elf: main.o scheduler.o spi.o spi_init.o sequencer.o melody_tetris.o melody_tusch1.o psg.o mute.o +$(ARTIFACT).elf: main.o scheduler.o spi.o spi_init.o sequencer.o melody_tetris.o melody_tusch1.o psg.o mute.o melody_pling.o $(CC) -o $@ $(LDFLAGS) $^ $(OBJDUMP) -D $(ARTIFACT).elf > $(ARTIFACT).txt diff --git a/sound-driver/melody_pling.c b/sound-driver/melody_pling.c new file mode 100644 index 0000000..6b76b56 --- /dev/null +++ b/sound-driver/melody_pling.c @@ -0,0 +1,29 @@ +#include +#include +#include "psg.h" +#include "sequencer.h" +#include "scheduler.h" + +const t_tone plingVoice1[] = { + { .octave = e_O_5, .note = e_C, .length = e_L_1_4, .legato = false, .staccato = true }, + { .octave = e_O_5, .note = e_G, .length = e_L_1_4, .legato = false, .staccato = true }, + + { .octave = e_O_Null, .note = e_Null, .length = e_L_SyncMark,.legato = false, .staccato = false }, + { .octave = e_O_Null, .note = e_Null, .length = e_L_StopMark,.legato = false, .staccato = false }, + + { .octave = e_O_Null, .note = e_Null, .length = e_L_EndMark, .legato = false, .staccato = false }, +}; + +t_melodies pling = { + .melodies = { { .chip = 1, .amplitude = 12, .tones = plingVoice1 } }, + .numOfMelodies = 1, + .pace = 200, + .slotMask = 0x02 +}; + +void playPling() { + sequencerPlayMelodies(&pling); +} + + + diff --git a/sound-driver/melody_pling.h b/sound-driver/melody_pling.h new file mode 100644 index 0000000..6a0f1f5 --- /dev/null +++ b/sound-driver/melody_pling.h @@ -0,0 +1,8 @@ +#ifndef _MELODY_PLING_H_ +#define _MELODY_PLING_H_ + + +void playPling(); + + +#endif // _MELODY_PLING_H_ diff --git a/sound-driver/melody_tetris.c b/sound-driver/melody_tetris.c index 340eb3f..30091fb 100644 --- a/sound-driver/melody_tetris.c +++ b/sound-driver/melody_tetris.c @@ -930,11 +930,18 @@ t_melodies tetrisTheme = { }; void playMelodyTetris() { + tetrisTheme.pace = 160; // reset to start value each time sequencerPlayMelodies(&tetrisTheme); } +void playMelodyTetrisFaster() { + tetrisTheme.pace += 10; + sequencerChangePace(&tetrisTheme); +} + void stopMelodyTetris() { sequencerStopMelodies(&tetrisTheme); } + diff --git a/sound-driver/melody_tetris.h b/sound-driver/melody_tetris.h index 72a43fc..f9d7394 100644 --- a/sound-driver/melody_tetris.h +++ b/sound-driver/melody_tetris.h @@ -4,6 +4,6 @@ void playMelodyTetris(); void stopMelodyTetris(); - +void playMelodyTetrisFaster(); #endif // _MELODY_TETRIS_H_ diff --git a/sound-driver/melody_tusch1.c b/sound-driver/melody_tusch1.c index 5bb2d79..a596ab2 100644 --- a/sound-driver/melody_tusch1.c +++ b/sound-driver/melody_tusch1.c @@ -3,6 +3,7 @@ #include "psg.h" #include "sequencer.h" #include "scheduler.h" +#include "melody_tetris.h" const t_tone tusch1voice1[] = { { .octave = e_O_5, .note = e_C, .length = e_L_1_4, .legato = false, .staccato = true }, @@ -79,6 +80,7 @@ t_melodies tusch1 = { void playTusch1() { sequencerPlayMelodies(&tusch1); + playMelodyTetrisFaster(); } diff --git a/sound-driver/sequencer.c b/sound-driver/sequencer.c index 8c0b7e1..9ffc25c 100644 --- a/sound-driver/sequencer.c +++ b/sound-driver/sequencer.c @@ -127,3 +127,7 @@ void sequencerStopMelodies(t_melodies *melodies) { schDel(melodies->taskId); } +void sequencerChangePace(t_melodies *melodies) { + melodies->quarterLength = 60000 / melodies->pace / SEQUENCER_PERIOD; // duration of a 1/4 tone in ms +} + diff --git a/sound-driver/sequencer.h b/sound-driver/sequencer.h index 0eb374b..bdb4fd6 100644 --- a/sound-driver/sequencer.h +++ b/sound-driver/sequencer.h @@ -64,5 +64,6 @@ typedef struct { void sequencerInit(); void sequencerPlayMelodies(t_melodies *melodies); void sequencerStopMelodies(t_melodies *melodies); +void sequencerChangePace(t_melodies *melodies); #endif // _SEQUENCER_H_ diff --git a/sound-driver/soundCodes.h b/sound-driver/soundCodes.h index b5af55c..72f4824 100644 --- a/sound-driver/soundCodes.h +++ b/sound-driver/soundCodes.h @@ -9,6 +9,6 @@ #define SOUND_FANFARE 0x10 #define SOUND_LOCK 0x20 #define SOUND_MOTION 0x40 -#define SOUND_SPEED_UP 0x80 +#define SOUND_PLING 0x80 #endif // _SOUND_CODES_H_ diff --git a/sound-driver/spi.S b/sound-driver/spi.S index c61617f..c8d4864 100644 --- a/sound-driver/spi.S +++ b/sound-driver/spi.S @@ -52,10 +52,10 @@ spiCmdHandler_7: ;; insert a call here bic #SOUND_MOTION, &cmd spiCmdHandler_8: - bit #SOUND_SPEED_UP, &cmd + bit #SOUND_PLING, &cmd jz spiCmdHandler_end - ;; insert a call here - bic #SOUND_SPEED_UP, &cmd + call #playPling + bic #SOUND_PLING, &cmd spiCmdHandler_end: ret