Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions include/core/context-manager.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#pragma once

#include <Preferences.h>

#include "engine/layer.h"
#include "engine/state-manager.h"
#include "player/controller.h"
Expand All @@ -22,6 +24,7 @@ namespace SystemCore
Player::Controller controller;
Lights::LedStrip leds;
Display::OledDisplay display;
Preferences memory;
Display::MenuTileNavigation menuNav;

void navigateMainMenu();
Expand Down
18 changes: 15 additions & 3 deletions include/engine/state-manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
#include "games/demo/state.h"
#include "scenes/canvas/state.h"

namespace SystemCore
{
// forward declaration because of ContextManager/OledDisplay circular dependency
class ContextManager;
}

namespace Engine
{
enum class SystemState
Expand Down Expand Up @@ -51,9 +57,14 @@ namespace Engine
class StateManager
{
public:
StateManager() : systemState{SystemState::Initialize},
userMainMenuChoice{MainMenuSelection::Games},
userGameChoice{GameSelection::Recall} {}
StateManager(SystemCore::ContextManager *ctx) : contextManager{ctx},
phaseEvasionGameState{ctx},
recallGameState{ctx},
systemState{SystemState::Initialize},
userMainMenuChoice{MainMenuSelection::Games},
userGameChoice{GameSelection::Recall}
{
}

bool displayShouldUpdate = true;
bool displayIsVisible = true;
Expand Down Expand Up @@ -85,6 +96,7 @@ namespace Engine
Scenes::Canvas::SceneState &getCanvasSceneState() { return canvasSceneState; }

private:
SystemCore::ContextManager *contextManager;
SystemState systemState;

MainMenuSelection userMainMenuChoice;
Expand Down
2 changes: 2 additions & 0 deletions include/games/phase-evasion/driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ namespace Games::PhaseEvasion
{
public:
Driver(SystemCore::ContextManager *ctx);
~Driver() { state.reset(); }
void nextEvent() override;
static constexpr uint16_t playerOffset = 25;
static constexpr uint16_t playerWidth = 5;
Expand Down Expand Up @@ -41,6 +42,7 @@ namespace Games::PhaseEvasion
float gameOverPhaseOffset = 0.0f;

void getUpdates();
void checkIfHighScore();
void renderPlayer();
void renderFlare();
void renderGem();
Expand Down
17 changes: 15 additions & 2 deletions include/games/phase-evasion/state.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

#include <cstdint>

namespace SystemCore
{
class ContextManager;
}

namespace Games::PhaseEvasion
{
enum class Actions
Expand All @@ -16,11 +21,19 @@ namespace Games::PhaseEvasion
class GameState
{
public:
GameState() : highScore{0}, flaresEvaded{0}, gemsCaptured{0} {}
GameState(SystemCore::ContextManager *ctx) : contextManager{ctx}, highScore{0}, flaresEvaded{0}, gemsCaptured{0} {}
uint16_t flaresEvaded;
uint16_t gemsCaptured;
uint16_t highScore;
Actions current = Actions::Startup;
void reset() { highScore = flaresEvaded = gemsCaptured = 0; }
static constexpr const char *memoryKeyName = "phase-high";

void reset();
uint16_t calculateTotalScore() const;
void checkHighScore();
void updateHighScore();

private:
SystemCore::ContextManager *contextManager;
};
}
1 change: 1 addition & 0 deletions include/games/recall/driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ namespace Games::Recall
{
public:
Driver(SystemCore::ContextManager *ctx);
~Driver() { state.reset(); }
void nextEvent() override;

private:
Expand Down
15 changes: 13 additions & 2 deletions include/games/recall/state.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

#include <cstdint>

namespace SystemCore
{
class ContextManager;
}

namespace Games::Recall
{
enum class Actions
Expand All @@ -17,11 +22,17 @@ namespace Games::Recall
class GameState
{
public:
GameState() : highScore{0}, round{0} {}
GameState(SystemCore::ContextManager *ctx);
uint16_t highScore;
uint16_t round;
Actions current = Actions::Startup;
static constexpr const char *memoryKeyName = "recall-high";

void reset();
void incrementScore();
void updateHighScore();

void reset() { highScore = round = 0; }
private:
SystemCore::ContextManager *contextManager;
};
}
8 changes: 4 additions & 4 deletions platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@ framework = arduino

build_type = debug
build_unflags = -std=gnu++11
build_flags = -g -DVIRTUALIZATION -std=gnu++17
build_flags = -g -DVIRTUALIZATION -std=gnu++2a

[env:debug]
platform = espressif32
board = upesy_wroom
framework = arduino
build_type = debug
build_unflags = -std=gnu++11
build_flags = -g -DDEBUG -std=gnu++17
build_flags = -g -DDEBUG -std=gnu++2a

[env:release]
platform = espressif32
Expand All @@ -43,7 +43,7 @@ framework = arduino
lib_ignore = debug-fastled
build_type = release
build_unflags = -std=gnu++11
build_flags = -Os -DRELEASE -std=gnu++17
build_flags = -Os -DRELEASE -std=gnu++2a

[env:native]
platform = native
Expand All @@ -53,4 +53,4 @@ build_flags =
-I.pio/libdeps/native/googletest/googletest/include/gtest
-I.pio/libdeps/native/googletest/googlemock/include/gmock
-pthread
-std=gnu++17
-std=gnu++2a
2 changes: 1 addition & 1 deletion src/core/context-manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

namespace SystemCore
{
ContextManager::ContextManager() : display{this}, menuNav{this} {}
ContextManager::ContextManager() : display{this}, stateManager{this}, menuNav{this} {}

ContextManager::~ContextManager()
{
Expand Down
20 changes: 13 additions & 7 deletions src/display/display.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,35 +171,41 @@ namespace Display

void OledDisplay::drawRecallGameHud()
{
const auto recallState = contextManager->stateManager.getRecallGameState();
const auto round = recallState.round;
const auto highScore = recallState.highScore;

display.clearDisplay();
drawHeader("Recall");

display.setCursor(0, 16);
display.print("Round: ");
display.print(contextManager->stateManager.getRecallGameState().round + 1);
display.printf("Round: %u", round + 1);
display.setCursor(0, 24);
display.print("High Score: -");
display.printf("High Score: %u", highScore + 1);

display.display();
}

void OledDisplay::drawPhaseEvasionGameHud()
{
const auto flaresEvaded = contextManager->stateManager.getPhaseEvasionGameState().flaresEvaded;
const auto gemsCaptured = contextManager->stateManager.getPhaseEvasionGameState().gemsCaptured;
const auto phaseEvasionState = contextManager->stateManager.getPhaseEvasionGameState();
const auto flaresEvaded = phaseEvasionState.flaresEvaded;
const auto gemsCaptured = phaseEvasionState.gemsCaptured;
const auto totalScore = phaseEvasionState.calculateTotalScore();
const auto highScore = phaseEvasionState.highScore;

display.clearDisplay();
drawHeader("Phase Evasion");

display.setCursor(0, 16);
display.printf("Flares: %u", flaresEvaded);
display.setCursor(DISPLAY_WIDTH / 2 + 4, 16);
display.printf("Total: %u", (flaresEvaded + (2 * gemsCaptured)));
display.printf("Total: %u", totalScore);

display.setCursor(0, 24);
display.printf(" Gems: %u", gemsCaptured);
display.setCursor(DISPLAY_WIDTH / 2 + 4, 24);
display.printf(" High: %u", (flaresEvaded + (2 * gemsCaptured)));
display.printf(" High: %u", highScore);

display.display();
}
Expand Down
8 changes: 4 additions & 4 deletions src/display/menu-navigation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Display
Engine::SystemState currentState = contextManager->stateManager.current();

uint16_t displayIndex = SystemCore::Configuration::numLeds - 1;
float inactiveSelectionDimmingScale = currentState == Engine::SystemState::MenuHome ? 1.0f : 0.3f;
float inactiveSelectionDimmingScale = currentState == Engine::SystemState::MenuHome ? 1.0f : 0.6f;
constexpr float center = (menuTileWidth - 1) / 2.0f;
constexpr double sigma = 3.0f;

Expand All @@ -20,7 +20,7 @@ namespace Display
for (uint16_t i = 0; i < menuTileWidth; ++i)
{
float x = i - center;
float blend = std::exp(-(x * x) / (2 * sigma * sigma)); // computed gaussian curve
float blend = std::exp(-(x * x) / (4 * sigma * sigma)); // computed gaussian curve

if (modeIdx == static_cast<uint8_t>(modeSelected))
contextManager->leds.buffer[displayIndex] = Lights::Color{Lights::ColorCode::ThemeGreen} * inactiveSelectionDimmingScale * blend;
Expand All @@ -41,15 +41,15 @@ namespace Display
uint8_t sceneSelected = static_cast<uint8_t>(contextManager->stateManager.getUserSceneChoice());

displayIndex = 0;
inactiveSelectionDimmingScale = (currentState == Engine::SystemState::MenuGames || currentState == Engine::SystemState::MenuScenes) ? 1.0f : 0.3f;
inactiveSelectionDimmingScale = (currentState == Engine::SystemState::MenuGames || currentState == Engine::SystemState::MenuScenes) ? 1.0f : 0.6f;
uint8_t gamesOrScenesAvailable = modeSelected == Engine::MainMenuSelection::Games ? numGames : numScenes;

for (uint8_t modeIdx = 0; modeIdx < gamesOrScenesAvailable; ++modeIdx)
{
for (size_t i = 0; i < menuTileWidth; ++i)
{
float x = i - center;
float blend = std::exp(-(x * x) / (2 * sigma * sigma));
float blend = std::exp(-(x * x) / (4 * sigma * sigma));

if (currentState == Engine::SystemState::MenuGames && modeIdx == gameSelected)
contextManager->leds.buffer[displayIndex] = Lights::Color{Lights::ColorCode::ThemeBlue} * blend;
Expand Down
8 changes: 8 additions & 0 deletions src/engine/engine.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <cmath>

#include <FastLED.h>
#include <Preferences.h>
#include "engine/engine.h"
#include "lights/color.h"
#include "display/menu-navigation.h"
Expand Down Expand Up @@ -108,6 +109,13 @@ namespace Engine
lastRender = micros();
log("Startup process completed. Transitioning to Main Menu");
}

#ifdef RELEASE
contextManager.memory.begin("lumenlab", false);
#else
contextManager.memory.begin("lumenlab-dev", false);
#endif

randomSeed(esp_random());
}

Expand Down
1 change: 1 addition & 0 deletions src/engine/state-manager.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "engine/state-manager.h"
#include "core/context-manager.h"

namespace Engine
{
Expand Down
14 changes: 12 additions & 2 deletions src/games/phase-evasion/driver.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include <Preferences.h>
#include "games/phase-evasion/driver.h"
#include "player/controller.h"
#include "logger.h"
Expand Down Expand Up @@ -25,6 +26,7 @@ namespace Games::PhaseEvasion
if (isReady())
{
state.current = Actions::ActiveGame;
state.reset();
log("Starting new game.");
}
break;
Expand All @@ -34,6 +36,7 @@ namespace Games::PhaseEvasion
assessDifficulty();
checkCollision();
checkGemCapture();
checkIfHighScore();
renderFlare();
renderGem();
renderPlayer();
Expand Down Expand Up @@ -194,6 +197,12 @@ namespace Games::PhaseEvasion
}
}

void Driver::checkIfHighScore()
{
GameState state = contextManager->stateManager.getPhaseEvasionGameState();
state.checkHighScore();
}

void Driver::muzzleFlash()
{
for (uint16_t i = 0; i < SystemCore::Configuration::numLeds; ++i)
Expand Down Expand Up @@ -227,8 +236,6 @@ namespace Games::PhaseEvasion

if (contextManager->controller.wasPressed(::Player::ControllerButton::Start))
{
state.current = Actions::Startup;
state.reset();
contextManager->stateManager.displayShouldUpdate = true;
reset();
windDownTimer.wait(windDownLength);
Expand All @@ -244,6 +251,9 @@ namespace Games::PhaseEvasion
gem.wait(gemRespawnDelay);
flareManager.reset();
player.setPosition(static_cast<uint16_t>(0));
state.current = Actions::Startup;
state.reset();
contextManager->stateManager.displayShouldUpdate = true;
wait(500);
}
}
1 change: 1 addition & 0 deletions src/games/phase-evasion/flare-manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ namespace Games::PhaseEvasion
{
uint16_t colorIndex = static_cast<uint16_t>(esp_random()) % arraySize(Lights::colorPalette);
flare->activate(Lights::colorPalette[colorIndex], speed);
logf("Flare dispatched: %u", colorIndex);
return;
}
++flare;
Expand Down
33 changes: 33 additions & 0 deletions src/games/phase-evasion/state.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#include "games/phase-evasion/state.h"
#include "core/context-manager.h"
#include "logger.h"

namespace Games::PhaseEvasion
{
void GameState::reset()
{
flaresEvaded = gemsCaptured = 0;
highScore = contextManager->memory.getUInt(memoryKeyName);
}

uint16_t GameState::calculateTotalScore() const
{
return flaresEvaded + (2 * gemsCaptured);
}

void GameState::checkHighScore()
{
if (calculateTotalScore() > highScore)
{
updateHighScore();
contextManager->stateManager.displayShouldUpdate = true;
}
}

void GameState::updateHighScore()
{
highScore = calculateTotalScore();
contextManager->memory.putUInt(memoryKeyName, highScore);
logf("High score updated: %u", highScore);
}
}
Loading