-
Notifications
You must be signed in to change notification settings - Fork 0
/
globals.h
154 lines (121 loc) · 3.26 KB
/
globals.h
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#ifndef GLOBAL_H
#define GLOBAL_H
Arduboy2 arduboy;
#include "Size.h"
#include <ArduboyTones.h>
ArduboyTones sound(arduboy.audio.enabled);
constexpr uint8_t tileSize{ 32 };
constexpr uint8_t borderHeight{ 8 };
constexpr uint8_t bottomBorderLimit{ HEIGHT - borderHeight };
constexpr uint8_t playerSize{ 16 };
constexpr uint8_t numberOfMatters{ 4 };
constexpr uint16_t increaseDifficultyScore { 1000 };
constexpr uint8_t numberOfSynapses{ 1 };
constexpr uint8_t synapseSize{ 8 };
constexpr uint8_t synapseMissesAllowed{ 3 };
uint8_t synapseMisses{ 0 };
constexpr uint16_t saveOffset = 164;
constexpr uint16_t startAddress = (EEPROM_STORAGE_SPACE_START + saveOffset);
constexpr uint16_t byte1Address = startAddress;
constexpr uint16_t byte2Address = (byte1Address + sizeof(uint8_t));
constexpr uint16_t dataAddress = (byte2Address + sizeof(uint8_t));
// Some more suitable letters :P
constexpr uint8_t checkByte1 = 'R';
constexpr uint8_t checkByte2 = 'B';
// Set everything being saved to EEPROM - credit goes to Pharap and filmote
struct SaveData {
bool shouldScreenFlash;
uint16_t highScore;
};
SaveData saveData { false, 0 };
void clearEEPROM()
{
EEPROM.update(byte1Address, checkByte1);
EEPROM.update(byte2Address, checkByte2);
SaveData blankSaveData { false, 0 };
EEPROM.put(dataAddress, blankSaveData);
}
void initialiseEEPROM()
{
uint8_t byte1 = EEPROM.read(byte1Address);
uint8_t byte2 = EEPROM.read(byte2Address);
if ((byte1 != checkByte1) || (byte2 != checkByte2))
{
clearEEPROM();
}
}
void loadEEPROM()
{
EEPROM.get(dataAddress, saveData);
}
void saveEEPROM()
{
EEPROM.put(dataAddress, saveData);
}
// Ground scrolling
bool moveGround{ true };
float groundX { 0 };
// Pause
bool isPaused{ false };
// Scoring
uint16_t score { 0 };
// Timing of random matter spawning
uint8_t matterLaunchDelayMin{ 30 };
uint16_t matterLaunchDelayMax{ 70 };
// Timer for launching matters
uint16_t matterLaunchCountdown = matterLaunchDelayMin;
// Timing of synapse spawning
uint8_t synapseLaunchDelayMin{ 20 };
uint16_t synapseLaunchDelayMax{ 20 };
// Timer for synapse targets
uint16_t synapseLaunchCountdown = synapseLaunchDelayMin;
// Timer to delay first spawn
uint8_t launchTimer{ 200 };
// Lookup table for spawning medium matters
int spawnCoords[16] = {
8, 9, 10, 11, 12, 13, 14, 32, 33, 34, 35, 36, 37, 38, 39, 40
};
enum class GameStatus : uint8_t {
Reset,
Introduction,
PlayGame,
GameOver,
};
GameStatus gameStatus {GameStatus::Reset}; // for production
// GameStatus gameStatus {GameStatus::PlayGame}; // for testing
enum class Size : uint8_t {
Small,
Medium,
};
struct Raspberry {
uint8_t x;
uint8_t y;
const uint8_t *image;
};
// create player
Raspberry player = {0, (HEIGHT / 2) - (playerSize / 2), raspberry};
struct Matter {
int8_t x;
int8_t y;
Size size;
bool enabled;
const uint8_t *image;
};
// create matter matters
Matter matters[numberOfMatters] = {
{0, 8, Size::Small, false, matterSmall},
{0, 8, Size::Small, false, matterSmall},
{0, 8, Size::Small, false, matterSmall},
{0, 8, Size::Small, false, matterSmall},
};
struct Synapse {
int8_t x;
int8_t y;
bool enabled;
bool hit;
const uint8_t *image;
};
Synapse synapses[numberOfSynapses] = {
{100, (HEIGHT / 2) - (synapseSize / 2), false, false, synapse}
};
#endif