forked from alexxsxnchez/BrickBreaker
-
Notifications
You must be signed in to change notification settings - Fork 0
/
program.ino
119 lines (107 loc) · 2.81 KB
/
program.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
void programInit() {
newMode(MENU);
}
void newMode(state newMode){
OrbitOledClear();
gameMode = newMode;
switch(gameMode) {
case MENU:
menuInit();
break;
case GAME:
gameInit();
break;
case GAME_OVER:
gameOverInit();
break;
case GAME_WIN:
gameWinInit();
break;
case STATS:
statsInit();
break;
}
}
void menuInit() {
OrbitOledMoveTo(50, 10);
OrbitOledDrawString("PLAY");
OrbitOledMoveTo(46, 21);
OrbitOledDrawString("STATS");
OrbitOledUpdate();
delay(DEBOUNCE_DELAY);
}
void gameOverInit() {
OrbitOledMoveTo(50, 10);
OrbitOledDrawString("GAME");
OrbitOledMoveTo(50, 20);
OrbitOledDrawString("OVER");
OrbitOledUpdate();
flashLED(RED_LED, LED_FLASH_AMOUNT);
delay(STATE_DELAY);
newMode(MENU);
}
void gameWinInit() {
OrbitOledMoveTo(40, 10);
OrbitOledDrawString("YOU WIN!");
OrbitOledUpdate();
flashLED(GREEN_LED, LED_FLASH_AMOUNT);
delay(STATE_DELAY);
uint32_t currentGamesWon = getValue(GAMES_WON_ADDRESS);
currentGamesWon++;
updateValue(currentGamesWon, GAMES_WON_ADDRESS); // update the stats stored in the EEPROM
newMode(MENU);
}
// helper function for drawInt
int getDigits(int n) {
if(n == 0) {
return 1;
}
int digits = 0;
while(n > 0) {
n /= 10;
digits++;
}
return digits;
}
void drawInt(uint32_t num, int y) {
if(num > 999) {
num = 999; // cap the stat at three digits
}
char str[MAX_DIGITS];
char *string = itoa(num, str, 10);
if(num == 0) {
OrbitOledMoveTo(OLED_WIDTH - 7, y);
OrbitOledDrawChar(string[0]);
return;
}
//bool havePrintedNonZero = false;
int digits = getDigits(num);
for(int i = 1; i <= digits; i++) {
OrbitOledMoveTo(OLED_WIDTH - 7 * i, y); // right Justified Print
char digit = string[digits - i];
OrbitOledDrawChar(digit);
}
}
void statsInit() {
uint32_t livesLost = getValue(LIVES_LOST_ADDRESS);
uint32_t gamesWon = getValue(GAMES_WON_ADDRESS);
uint32_t bricksBroken = getValue(BRICKS_BROKEN_ADDRESS);
OrbitOledMoveTo(0, 3);
OrbitOledDrawString("Lives Lost:");
drawInt(livesLost, 3);
OrbitOledMoveTo(0, 13);
OrbitOledDrawString("Games Won:");
drawInt(gamesWon, 13);
OrbitOledMoveTo(0, 23);
OrbitOledDrawString("Bricks Broke:");
drawInt(bricksBroken, 23);
OrbitOledUpdate();
delay(DEBOUNCE_DELAY);
}
void resetStats() {
updateValue(0, LIVES_LOST_ADDRESS);
updateValue(0, BRICKS_BROKEN_ADDRESS);
updateValue(0, GAMES_WON_ADDRESS);
OrbitOledClear();
statsInit();
}