// ============================================================
// MiniGames Console — ESP32-C3 Super Mini + OLED SSD1306
// Inspired by Arduboy
// ============================================================
//
// Controls:
// UP/DOWN/LEFT/RIGHT — D-pad navigation & in-game control
// MENU — Return to main menu from any game
// COLOR — Toggle display invert (normal/inverted)
//
// Games:
// 1. Snake — Classic snake, eat food, grow longer
// 2. Pong — Single player vs AI
// 3. Breakout — Brick breaker with lives
// 4. Flappy — Flappy Bird clone
//
// ============================================================
#include "config.h"
#include "input.h"
#include "display.h"
#include "menu.h"
#include "game_snake.h"
#include "game_pong.h"
#include "game_breakout.h"
#include "game_flappy.h"
// Current state
static GameState currentState = STATE_MENU;
static GameState previousState = STATE_MENU;
static unsigned long frameStart;
void setup() {
Serial.begin(115200);
Serial.println(F("MiniGames Console v1.0"));
// Seed random
randomSeed(analogRead(0) ^ micros());
// Initialize subsystems
inputInit();
displayInit();
// Show boot splash
showSplash();
// Initialize menu
menuInit();
}
void loop() {
frameStart = millis();
// ── Read buttons ──
inputUpdate();
// ── State Machine ──
GameState nextState = currentState;
switch (currentState) {
case STATE_MENU:
nextState = menuUpdate();
menuDraw();
break;
case STATE_SNAKE:
nextState = snakeUpdate();
snakeDraw();
break;
case STATE_PONG:
nextState = pongUpdate();
pongDraw();
break;
case STATE_BREAKOUT:
nextState = breakoutUpdate();
breakoutDraw();
break;
case STATE_FLAPPY:
nextState = flappyUpdate();
flappyDraw();
break;
}
// ── Handle state transitions ──
if (nextState != currentState) {
previousState = currentState;
currentState = nextState;
// Initialize new state
switch (currentState) {
case STATE_MENU:
menuInit();
break;
case STATE_SNAKE:
snakeInit();
break;
case STATE_PONG:
pongInit();
break;
case STATE_BREAKOUT:
breakoutInit();
break;
case STATE_FLAPPY:
flappyInit();
break;
}
}
// ── Frame rate limiter ──
unsigned long elapsed = millis() - frameStart;
if (elapsed < FRAME_TIME_MS) {
delay(FRAME_TIME_MS - elapsed);
}
}