#include <Arduino.h>
#include <game.h>
#include <vector>
bool snakeInit = false;
bool snakeGameOver = false;
int sX[50], sY[50];
int sLength = 3;
int sDir = 1;
int foodX, foodY;
unsigned long lastSnakeFrame = 0;
bool unPause = false;
uint32_t lastTrackSecond = 999;
unsigned long lastButtonPress = 0;
const unsigned long buttonCooldown = 200;
int screenSaverDirection = -1;
int screenSaverX = 64;
int screenSaverY = 32;
int gamePick = 0;
String gameList[2] = {"Snake", "Flappy Bird"};
std::vector<String> mp3List;
int mp3Pick = 0;
static const unsigned char PROGMEM menu_icons[] = {0x00,0x00,0x07,0xe0,0x00,0x00,0x00,0x00,0x00,0x03,0xf8,0x00,0x00,0x00,0x00,0x3f,0xff,0xe0,0x00,0x00,0x00,0x00,0x0f,0xfe,0x0f,0xfe,0x00,0x00,0x0f,0xff,0xf8,0x20,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x03,0xf0,0x00,0x0f,0xc0,0x07,0xe0,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x18,0x00,0x08,0x3f,0xf8,0x20,0x00,0x00,0x00,0x00,0x61,0x80,0x00,0x00,0x0c,0x00,0x0f,0xc0,0x00,0x20,0x00,0x00,0x00,0x00,0x41,0x80,0x00,0x06,0x04,0x00,0x08,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x41,0x80,0x00,0x06,0x04,0x00,0x08,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xcf,0xf0,0x00,0x30,0x06,0x00,0x08,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x8f,0xf0,0x00,0x30,0xc2,0x00,0x08,0x00,0x00,0x40,0x00,0x00,0x00,0x01,0x81,0x80,0x00,0x00,0xc2,0x00,0x08,0x00,0x00,0x40,0x00,0x00,0x00,0x01,0x01,0x80,0x00,0x06,0x03,0x00,0x10,0x00,0x00,0x40,0x00,0x00,0x00,0x01,0x01,0x80,0x00,0x06,0x01,0x00,0x10,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x03,0xff,0x80,0x01,0x80,0x10,0x00,0x00,0x40,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x80,0x00,0xc0,0x10,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x0c,0x00,0xc0,0x00,0x40,0x10,0x00,0x00,0x40,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x40,0x00,0x60,0x10,0x00,0x03,0xc0,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x20,0x00,0x20,0x10,0x00,0x03,0xc0,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x30,0x00,0x20,0xf0,0x00,0x03,0xc0,0x00,0x00,0x00,0x10,0x00,0x30,0x00,0x18,0x00,0x60,0xf0,0x00,0x03,0xc0,0x00,0x00,0x00,0x18,0x00,0x20,0x00,0x0c,0x00,0x40,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0xc0,0x00,0x06,0x00,0x40,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x01,0x80,0x00,0x02,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xfe,0x00,0x00,0x03,0xc1,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00};
int menuOption = 0;
int menuX = 0;
enum sysState {screenSaver, menu, mp3Select, gameSelect, mp3Playing, runningGame};
sysState state = screenSaver;
void snake() {
if (snakeInit == false) {
sLength = 3;
sDir = 1;
sX[0] = 16; sY[0] = 8;
sX[1] = 15; sY[1] = 8;
sX[2] = 14; sY[2] = 8;
foodX = random(2, 30);
foodY = random(2, 14);
snakeGameOver = false;
snakeInit = true;
}
if (BTNU_pressed && sDir != 2) sDir = 0;
if (BTNR_pressed && sDir != 3) sDir = 1;
if (BTND_pressed && sDir != 0) sDir = 2;
if (BTNL_pressed && sDir != 1) sDir = 3;
if (millis() - lastSnakeFrame > 80 && !snakeGameOver) {
for (int i = sLength - 1; i > 0; i--) {
sX[i] = sX[i - 1];
sY[i] = sY[i - 1];
}
if (sDir == 0) sY[0]--;
if (sDir == 1) sX[0]++;
if (sDir == 2) sY[0]++;
if (sDir == 3) sX[0]--;
if (sX[0] < 0 || sX[0] >= 32 || sY[0] < 0 || sY[0] >= 16) snakeGameOver = true;
for (int i = 1; i < sLength; i++) {
if (sX[0] == sX[i] && sY[0] == sY[i]) snakeGameOver = true;
}
if (sX[0] == foodX && sY[0] == foodY) {
if (sLength < 50) sLength++;
foodX = random(1, 31);
foodY = random(1, 15);
}
lastSnakeFrame = millis();
}
if (snakeGameOver && BTNOK_pressed) {
snakeInit = false;
}
display.clearDisplay();
if (snakeGameOver) {
display.setTextColor(1);
display.setTextSize(1);
display.setCursor(38, 28);
display.print("GAME OVER");
display.setCursor(20, 40);
display.print("Press OK to retry");
} else {
display.drawRect(foodX * 4, foodY * 4, 4, 4, 1);
for (int i = 0; i < sLength; i++) {
display.fillRect(sX[i] * 4, sY[i] * 4, 4, 4, 1);
}
}
display.display();
}
void flappyBird(){
dsiplay.clearDisplay();
display.setTextSize(1);
display.print("didnt get around to this");
}
void updateGamePick(){
if(BTND_pressed == true && gamePick > 0){
gamePick--;
}
if(BTNU_pressed == true && gamePick < 1){
gamePick++;
}
}
void updateMp3Pick(){
}
void drawScreenSaver(){
display.clearDisplay();
display.fillCircle(screenSaverX, screenSaverY, 5, 1);
display.display();
}
void drawMenu(void) {
display.clearDisplay();
display.setTextColor(1);
display.setTextWrap(false);
display.setCursor(24, 10);
display.print("MP3");
display.drawRect(menuX, 0, 64, 64, 1);
display.setCursor(81, 9);
display.print("Games");
display.drawBitmap(17, 24, menu_icons, 107, 24, 1);
display.display();
}
void drawMp3Select(){
display.clearDisplay();
display.fillRect(18, 29, 92, 7, 1);
display.setTextSize(1);
display.setTextColor(0);
display.setCursor(19, 29);
display.print("No Songs Found");
display.drawTriangle(64, 59, 80, 43, 48, 43, 1);
display.drawTriangle(64, 4, 80, 20, 48, 20, 1);
display.setCursor(1,1);
display.setTextColor(1);
display.println("Songs: 0");
display.display();
}
void drawGameSelect(){
display.clearDisplay();
display.fillRect(18, 29, 92, 7, 1);
display.setTextColor(0);
display.setCursor(19, 29);
display.print(gameList[gamePick]);
display.drawTriangle(64, 59, 80, 43, 48, 43, 1);
display.drawTriangle(64, 4, 80, 20, 48, 20, 1);
display.display();
}
void draw_polygon_6(void) {
display.drawLine(40, 38, 40, 50, 1);
display.drawLine(40, 50, 30, 44, 1);
display.drawLine(30, 44, 40, 38, 1);
}
void draw_polygon_7(void) {
display.drawLine(83, 38, 83, 38, 1);
display.drawLine(83, 38, 83, 50, 1);
display.drawLine(83, 50, 93, 44, 1);
display.drawLine(93, 44, 83, 38, 1);
}
void draw_polygon_8(void) {
display.drawLine(56, 36, 56, 52, 1);
display.drawLine(56, 52, 71, 44, 1);
display.drawLine(71, 44, 56, 36, 1);
}
void drawplay(void) {
uint32_t currentSeconds = 0;
display.clearDisplay();
display.setTextColor(1);
display.setTextSize(2);
display.setTextWrap(false);
display.setCursor(0, 4);
display.print("No Song");
display.drawLine(96, 38, 96, 50, 1);
display.drawLine(28, 38, 28, 50, 1);
draw_polygon_6();
draw_polygon_7();
draw_polygon_8();
display.setTextSize(1);
display.setCursor(1, 21);
display.println(String(currentSeconds / 60) + ":" + String(currentSeconds % 60));
display.display();
}
void drawpause(void) {
uint32_t currentSeconds = 0;
display.clearDisplay();
display.setTextColor(1);
display.setTextSize(2);
display.setTextWrap(false);
display.setCursor(0, 2);
display.print("No Song");
display.drawLine(96, 38, 96, 50, 1);
display.drawLine(28, 38, 28, 50, 1);
draw_polygon_6();
draw_polygon_7();
display.drawRect(68, 37, 2, 17, 1);
display.drawRect(58, 37, 2, 17, 1);
display.setTextSize(1);
display.setCursor(1, 21);
display.print(currentSeconds);
display.display();
}
void determineScreenDirection(){
if(screenSaverDirection == -1 && screenSaverX <= 32){
screenSaverDirection = 1;
}
if(screenSaverDirection == 1 && screenSaverX >= 96){
screenSaverDirection = -1;
}
screenSaverX = screenSaverX + screenSaverDirection;
}
void setup(){
Serial.begin(115200);
screenSetup();
}
void loop(){
updateButtons();
determineScreenDirection();
if(BTNH_pressed == true){
state = menu;
lastTrackSecond = 999;
snakeInit = false;
}
if (state == screenSaver) {
drawScreenSaver();
}
else if (state == menu) {
drawMenu();
}
else if (state == mp3Select) {
drawMp3Select();
}
else if (state == gameSelect) {
drawGameSelect();
}
else if (state == mp3Playing) {
uint32_t currentSeconds = 0;
if (currentSeconds != lastTrackSecond) {
if (unPause == false){
drawplay();
} else if (unPause == true){
drawpause();
}
lastTrackSecond = currentSeconds;
}
}
switch(state) {
case screenSaver:
if (BTNOK_pressed) {
state = menu;
lastButtonPress = millis();
}
break;
case menu:
if (millis() - lastButtonPress >= buttonCooldown) {
if (menuOption == 0) {
if (BTNL_pressed || BTNR_pressed) {
menuX = 64;
menuOption = 1;
lastButtonPress = millis();
} else if (BTNOK_pressed) {
state = mp3Select;
lastButtonPress = millis();
}
} else if (menuOption == 1) {
if (BTNL_pressed || BTNR_pressed) {
menuX = 0;
menuOption = 0;
lastButtonPress = millis();
} else if (BTNOK_pressed) {
state = gameSelect;
lastButtonPress = millis();
}
}
}
break;
case mp3Select:
break;
case mp3Playing:
if (millis() - lastButtonPress >= buttonCooldown) {
if (BTNOK_pressed) {
unPause = !unPause;
lastButtonPress = millis();
}
}
break;
case gameSelect:
if (millis() - lastButtonPress >= buttonCooldown) {
if (BTNOK_pressed) {
state = runningGame;
lastButtonPress = millis();
}
else if (BTND_pressed || BTNU_pressed) {
updateGamePick();
lastButtonPress = millis();
}
}
break;
case runningGame:
if (gamePick == 0) {
snake();
} else if (gamePick == 1) {
flappyBird();
}
break;
}
}