diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 07c08df..c659985 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -10,6 +10,22 @@ "cStandard": "c17", "cppStandard": "c++17", "intelliSenseMode": "linux-clang-x64" + }, + { + "name": "Arduino", + "includePath": [ + "${workspaceFolder}/**", + "/home/bd/.arduino15/packages/arduino/hardware/avr/1.8.6/libraries/Wire/src", + "/home/bd/Arduino/libraries/Adafruit_SSD1306", + "/home/bd/Arduino/libraries/Adafruit_GFX_Library", + "/home/bd/Arduino/libraries/Adafruit_BusIO", + "/home/bd/.arduino15/packages/arduino/hardware/avr/1.8.6/libraries/SPI/src" + ], + "forcedInclude": [], + "intelliSenseMode": "gcc-x64", + "compilerPath": "/usr/bin/avr-gcc", + "cStandard": "c11", + "cppStandard": "c++17" } ], "version": 4 diff --git a/strontgame.ino b/strontgame.ino index 0db39d2..bf461a8 100644 --- a/strontgame.ino +++ b/strontgame.ino @@ -34,30 +34,111 @@ const unsigned long updateInterval = 1000; // ms void drawBars() { // Draw yellow background for status area display.fillRect(0, 0, SCREEN_WIDTH, YELLOW_BAR_HEIGHT, SSD1306_WHITE); - // Draw Food bar label (F) + // Draw Food bar label display.setTextColor(SSD1306_BLACK); - display.setCursor(BAR_LABEL_X, FOOD_BAR_Y); - display.print("F"); - // Draw Poop bar label (P) - display.setCursor(BAR_LABEL_X, POOP_BAR_Y); - display.print("P"); + display.setTextSize(1); + display.setCursor(BAR_X, FOOD_BAR_Y); + display.print("FOOD"); + // Draw Poop bar label + display.setCursor(BAR_X, POOP_BAR_Y); + display.print("POOP"); // Draw Food bar - int foodBarLen = (food * BAR_WIDTH) / MAX_FOOD; - display.fillRect(BAR_X, FOOD_BAR_Y, foodBarLen, BAR_HEIGHT, SSD1306_BLACK); - display.drawRect(BAR_X, FOOD_BAR_Y, BAR_WIDTH, BAR_HEIGHT, SSD1306_BLACK); + int foodBarLen = (food * (BAR_WIDTH - 30)) / MAX_FOOD; // leave space for label + display.fillRect(BAR_X + 34, FOOD_BAR_Y, foodBarLen, BAR_HEIGHT, SSD1306_BLACK); + display.drawRect(BAR_X + 34, FOOD_BAR_Y, BAR_WIDTH - 30, BAR_HEIGHT, SSD1306_BLACK); // Draw Poop bar - int poopBarLen = (poop * BAR_WIDTH) / MAX_POOP; - display.fillRect(BAR_X, POOP_BAR_Y, poopBarLen, BAR_HEIGHT, SSD1306_BLACK); - display.drawRect(BAR_X, POOP_BAR_Y, BAR_WIDTH, BAR_HEIGHT, SSD1306_BLACK); + int poopBarLen = (poop * (BAR_WIDTH - 30)) / MAX_POOP; + display.fillRect(BAR_X + 34, POOP_BAR_Y, poopBarLen, BAR_HEIGHT, SSD1306_BLACK); + display.drawRect(BAR_X + 34, POOP_BAR_Y, BAR_WIDTH - 30, BAR_HEIGHT, SSD1306_BLACK); + display.setTextSize(1); +} + +void drawStickFigure(int frame) { + // Draw a simple stick figure in the blue area (below yellow bar) + int baseY = 24; + int centerX = SCREEN_WIDTH / 2; + // Head + display.drawCircle(centerX, baseY, 6, SSD1306_WHITE); + // Body + display.drawLine(centerX, baseY + 6, centerX, baseY + 24, SSD1306_WHITE); + // Arms (simple animation) + if (frame % 2 == 0) { + display.drawLine(centerX, baseY + 10, centerX - 10, baseY + 18, SSD1306_WHITE); + display.drawLine(centerX, baseY + 10, centerX + 10, baseY + 18, SSD1306_WHITE); + } else { + display.drawLine(centerX, baseY + 10, centerX - 14, baseY + 14, SSD1306_WHITE); + display.drawLine(centerX, baseY + 10, centerX + 14, baseY + 14, SSD1306_WHITE); + } + // Legs + display.drawLine(centerX, baseY + 24, centerX - 10, baseY + 40, SSD1306_WHITE); + display.drawLine(centerX, baseY + 24, centerX + 10, baseY + 40, SSD1306_WHITE); +} + +void drawStinkyPoop() { + // Draw a simple stinky poop in the blue area + int baseY = 32; + int centerX = SCREEN_WIDTH / 2; + // Poop base + display.fillCircle(centerX, baseY + 16, 8, SSD1306_WHITE); + display.fillCircle(centerX, baseY + 8, 6, SSD1306_WHITE); + display.fillCircle(centerX, baseY, 4, SSD1306_WHITE); + // Stink lines + display.drawLine(centerX - 6, baseY - 4, centerX - 6, baseY - 12, SSD1306_WHITE); + display.drawLine(centerX, baseY - 6, centerX, baseY - 16, SSD1306_WHITE); + display.drawLine(centerX + 6, baseY - 4, centerX + 6, baseY - 12, SSD1306_WHITE); } void drawGameOver(const char* message) { display.clearDisplay(); - display.setTextColor(SSD1306_WHITE); - display.setCursor(0, 24); + // Draw yellow status bar with game over message + display.fillRect(0, 0, SCREEN_WIDTH, YELLOW_BAR_HEIGHT, SSD1306_WHITE); + display.setTextColor(SSD1306_BLACK); display.setTextSize(1); - display.println("GAME OVER!"); - display.println(message); + display.setCursor(2, 0); + display.print("GAME OVER!"); + display.setCursor(2, 8); + display.print(message); + // Draw relevant icon in blue area + if (strcmp(message, "Poop explosion!") == 0) { + drawStinkyPoop(); + } else if (strcmp(message, "Starved!") == 0) { + // Draw a sad stick figure + int baseY = 32; + int centerX = SCREEN_WIDTH / 2; + display.drawCircle(centerX, baseY, 6, SSD1306_WHITE); + display.drawLine(centerX, baseY + 6, centerX, baseY + 24, SSD1306_WHITE); + display.drawLine(centerX, baseY + 10, centerX - 10, baseY + 18, SSD1306_WHITE); + display.drawLine(centerX, baseY + 10, centerX + 10, baseY + 18, SSD1306_WHITE); + display.drawLine(centerX, baseY + 24, centerX - 10, baseY + 40, SSD1306_WHITE); + display.drawLine(centerX, baseY + 24, centerX + 10, baseY + 40, SSD1306_WHITE); + // Sad mouth (simple frown) + display.drawLine(centerX - 3, baseY + 6, centerX + 3, baseY + 6, SSD1306_WHITE); + } else if (strcmp(message, "Overate! Exploded!") == 0) { + // Draw a stick figure with a big belly + int baseY = 32; + int centerX = SCREEN_WIDTH / 2; + display.drawCircle(centerX, baseY, 6, SSD1306_WHITE); + display.drawLine(centerX, baseY + 6, centerX, baseY + 24, SSD1306_WHITE); + display.drawLine(centerX, baseY + 10, centerX - 10, baseY + 18, SSD1306_WHITE); + display.drawLine(centerX, baseY + 10, centerX + 10, baseY + 18, SSD1306_WHITE); + display.drawLine(centerX, baseY + 24, centerX - 10, baseY + 40, SSD1306_WHITE); + display.drawLine(centerX, baseY + 24, centerX + 10, baseY + 40, SSD1306_WHITE); + // Big belly + display.drawCircle(centerX, baseY + 18, 8, SSD1306_WHITE); + } else if (strcmp(message, "Constipation!") == 0) { + // Draw a stick figure with a pained face + int baseY = 32; + int centerX = SCREEN_WIDTH / 2; + display.drawCircle(centerX, baseY, 6, SSD1306_WHITE); + display.drawLine(centerX, baseY + 6, centerX, baseY + 24, SSD1306_WHITE); + display.drawLine(centerX, baseY + 10, centerX - 10, baseY + 18, SSD1306_WHITE); + display.drawLine(centerX, baseY + 10, centerX + 10, baseY + 18, SSD1306_WHITE); + display.drawLine(centerX, baseY + 24, centerX - 10, baseY + 40, SSD1306_WHITE); + display.drawLine(centerX, baseY + 24, centerX + 10, baseY + 40, SSD1306_WHITE); + // Pained mouth (zigzag) + display.drawLine(centerX - 2, baseY + 5, centerX, baseY + 7, SSD1306_WHITE); + display.drawLine(centerX, baseY + 7, centerX + 2, baseY + 5, SSD1306_WHITE); + } display.display(); } @@ -130,6 +211,10 @@ void loop() { // Redraw bars display.clearDisplay(); drawBars(); + // Animate stick figure in blue area + static int frame = 0; + drawStickFigure(frame); + frame = (frame + 1) % 2; display.display(); - delay(50); + delay(100); }