#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
// OLED display width and height
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Define the pins for the buttons
const int resetButtonPin = 2;
const int rollButtonPin = 3;
// Abilities
const char* abilities[] = {"IMMORTAL", "SKIP OPPO", "SIMUL COUNTER", "SHOOTING", "LASER", "TORNADO", "DOMAIN EXPANSION"};
const int numAbilities = sizeof(abilities) / sizeof(abilities[0]);
bool chosenAbilities[numAbilities];
// Initialize OLED display
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
// Initialize display
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for(;;); // Don't proceed, loop forever
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.display();
// Initialize buttons with internal pull-up resistors
pinMode(resetButtonPin, INPUT_PULLUP);
pinMode(rollButtonPin, INPUT_PULLUP);
// Initialize abilities state
resetAbilities();
}
void resetAbilities() {
for (int i = 0; i < numAbilities; i++) {
chosenAbilities[i] = false;
}
display.clearDisplay();
display.setCursor(0, 0);
display.print("RESETTING...");
display.display();
}
void displayCenteredText(const char* text) {
int16_t x1, y1;
uint16_t width, height;
display.getTextBounds(text, 0, 0, &x1, &y1, &width, &height);
display.setCursor((SCREEN_WIDTH - width) / 2, (SCREEN_HEIGHT - height) / 2);
display.print(text);
}
void rollAbility() {
// Ultra-fast cycling effect for 2 seconds
unsigned long startTime = millis();
while (millis() - startTime < 2000) {
display.clearDisplay();
int abilityIndex = random(numAbilities);
displayCenteredText(abilities[abilityIndex]);
display.display();
delay(1); // Light-speed cycling
}
int abilityIndex;
do {
abilityIndex = random(numAbilities);
} while (chosenAbilities[abilityIndex]);
chosenAbilities[abilityIndex] = true;
display.clearDisplay();
displayCenteredText(abilities[abilityIndex]);
display.display();
}
void loop() {
if (digitalRead(resetButtonPin) == LOW) {
resetAbilities();
delay(500); // Debounce delay
}
if (digitalRead(rollButtonPin) == LOW) {
rollAbility();
delay(500); // Debounce delay
}
}