Let's get this up to date, i'll update the readme later on

This commit is contained in:
2026-05-27 14:30:33 +02:00
parent f1c1035c74
commit 570d7f8bc4
53 changed files with 938 additions and 897 deletions
+3 -3
View File
@@ -6,7 +6,7 @@
#include "animations/animations.h"
void menu_drawAngryScreen(
TFT_eSprite &bg, TFT_eSprite &sprite,
TFT_eSprite& bg, TFT_eSprite &sprite,
struct SpriteData* spriteData, struct SpriteData* smallUiElements
) {
uint8_t frameCounter = 0;
@@ -33,8 +33,8 @@ void menu_drawAngryScreen(
tone(SPK_PIN, 1000, 200);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
draw_drawSprite(sprite, 18, 72, smallUiElements, FIREWORKS_ICON, 6);
draw_drawSprite(sprite, 174, 72, smallUiElements, FIREWORKS_ICON, 6);
draw_drawSprite(sprite, 18, 72, smallUiElements, FIREWORKS_ICON);
draw_drawSprite(sprite, 174, 72, smallUiElements, FIREWORKS_ICON);
}
frameCounter++;
+1 -1
View File
@@ -8,7 +8,7 @@
uint64_t lastBeepTime = esp_timer_get_time();
uint8_t beepCounter = 0;
void menu_careMistakeScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* spriteData, struct SpriteData* uiSpritesBig) {
void menu_careMistakeScreen(TFT_eSprite& bg, TFT_eSprite &sprite, struct SpriteData* spriteData, struct SpriteData* uiSpritesBig) {
uint64_t currentTime = esp_timer_get_time();
uint8_t pressedButtons = buttons_getPressedButtons();
+32 -17
View File
@@ -8,18 +8,33 @@
struct SpriteData* checkerboardPattern;
void menu_createCheckerboard() {
// Build the pattern pre-scaled by SPRITE_SCALE (6) so that
// draw_drawSprite can treat it identically to SPIFFS-loaded sprites.
// Logical size: 34 wide × 1 tall → Scaled: 204 wide × 6 tall
const uint8_t SCALE = 6;
const uint8_t logicalW = 34;
const uint8_t logicalH = 1;
const uint16_t scaledW = logicalW * SCALE; // 204
const uint16_t scaledH = logicalH * SCALE; // 6
const uint32_t bufferSize = scaledW * scaledH;
checkerboardPattern = (SpriteData*) malloc(sizeof(SpriteData));
checkerboardPattern->spriteHeight = 1;
checkerboardPattern->spriteWidth = 34;
checkerboardPattern->spriteWidth = scaledW;
checkerboardPattern->spriteHeight = scaledH;
checkerboardPattern->spriteNumber = 1;
checkerboardPattern->spriteData = (uint16_t**) malloc(sizeof(uint16_t*) * checkerboardPattern->spriteNumber);
checkerboardPattern->spriteData[0] = (uint16_t*) malloc(sizeof(uint16_t) * checkerboardPattern->spriteWidth);
for (int i = 0; i < checkerboardPattern->spriteWidth; i++) {
if (i % 2 == 0) {
checkerboardPattern->spriteData[0][i] = TFT_BLACK;
} else {
checkerboardPattern->spriteData[0][i] = TFT_TRANSPARENT;
checkerboardPattern->spriteData = (uint16_t**) malloc(sizeof(uint16_t*));
checkerboardPattern->spriteData[0] = (uint16_t*) malloc(sizeof(uint16_t) * bufferSize);
uint16_t* buf = checkerboardPattern->spriteData[0];
// Fill: repeat each logical pixel as a SCALE×SCALE block across all rows
for (uint16_t row = 0; row < scaledH; row++) {
for (uint8_t col = 0; col < logicalW; col++) {
uint16_t color = (col % 2 == 0) ? TFT_BLACK : TFT_TRANSPARENT;
uint16_t* dst = buf + row * scaledW + col * SCALE;
for (uint8_t dx = 0; dx < SCALE; dx++) {
dst[dx] = color;
}
}
}
}
@@ -32,7 +47,7 @@ void menu_freeCheckerboard() {
}
// Don't worry, I hate this too
void menu_evolutionScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* mainCharacterSprites) {
void menu_evolutionScreen(TFT_eSprite& bg, TFT_eSprite &sprite, struct SpriteData* mainCharacterSprites) {
menu_createCheckerboard();
TFT_eSprite checkerboard = TFT_eSprite(&tft);
@@ -48,7 +63,7 @@ void menu_evolutionScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteDat
tone(SPK_PIN, 3500, 50);
draw_drawBackground(bg, 90, 90, 3);
draw_drawSprite(sprite, 72 + ((i % 2 == 0) * 6), 72, mainCharacterSprites, 6, 6);
draw_drawSprite(sprite, 72 + ((i % 2 == 0) * 6), 72, mainCharacterSprites, 6);
tft_drawBuffer();
@@ -59,7 +74,7 @@ void menu_evolutionScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteDat
}
draw_drawBackground(bg, 90, 90, 3);
draw_drawSprite(sprite, 72, 72, mainCharacterSprites, 7, 6);
draw_drawSprite(sprite, 72, 72, mainCharacterSprites, 7);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
@@ -70,7 +85,7 @@ void menu_evolutionScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteDat
tft_drawRectangle(18, startYPos, 204, 6, TFT_RED);
draw_drawSprite(checkerboard, 18, startYPos, checkerboardPattern, 0, 6, checkerboardShift);
draw_drawSprite(checkerboard, 18, startYPos, checkerboardPattern, 0, checkerboardShift);
tft_drawBuffer();
@@ -105,7 +120,7 @@ void menu_evolutionScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteDat
uint8_t startYPos = 72 + (i * 6);
tft_drawRectangle(18, startYPos, 204, 6, TFT_GREEN);
draw_drawSprite(checkerboard, 18, startYPos, checkerboardPattern, 0, 6, checkerboardShift);
draw_drawSprite(checkerboard, 18, startYPos, checkerboardPattern, 0, checkerboardShift);
tft_drawBuffer();
@@ -120,7 +135,7 @@ void menu_evolutionScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteDat
uint64_t currentTime = esp_timer_get_time();
if (currentTime - lastUpdateTime > 100000) {
draw_drawBackground(bg, 90, 90, 3);
draw_drawSprite(sprite, 72, 72, mainCharacterSprites, 7, 6);
draw_drawSprite(sprite, 72, 72, mainCharacterSprites, 7);
uint8_t rectHeight = (6 * i);
@@ -129,7 +144,7 @@ void menu_evolutionScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteDat
for (int j = 0; j < i; j++) {
uint8_t rectYPos = 72 + (6 * j);
draw_drawSprite(checkerboard, 18, rectYPos, checkerboardPattern, 0, 6, checkerboardShift);
draw_drawSprite(checkerboard, 18, rectYPos, checkerboardPattern, 0, checkerboardShift);
checkerboardShift = !checkerboardShift;
}
+3 -3
View File
@@ -8,7 +8,7 @@
#include "defs/defs.h"
void menu_changeCharaScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* mainSpriteData, struct SpriteData* uiSpriteData) {
void menu_changeCharaScreen(TFT_eSprite& bg, TFT_eSprite &sprite, struct SpriteData* mainSpriteData, struct SpriteData* uiSpriteData) {
vTaskSuspend(secondLoop);
uint8_t selectedChara = currentCharacter;
@@ -63,13 +63,13 @@ void menu_changeCharaScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteD
sprintf(fileName, "/chara/%02x.bin", selectedCharaData->idChara);
storage_readFile(fileName, mainSpriteData);
draw_drawSprite(sprite, 18, 72, mainSpriteData, 0, 6);
draw_drawSprite(sprite, 18, 72, mainSpriteData, 0);
} else {
tft_drawCenteredText("EMPTY", 4, 120);
}
draw_drawSprite(sprite, 174, 96, uiSpriteData, ARROW_ICON, 6);
draw_drawSprite(sprite, 174, 96, uiSpriteData, ARROW_ICON);
tft_drawBuffer();
+9 -4
View File
@@ -4,8 +4,9 @@
#include "display/display.h"
#include "buttons/buttons.h"
#include "defs/screen_defs.h"
#include "vpet/vpet/vpet.h"
void menu_drawClock(TFT_eSprite &bg) {
void menu_drawClock(TFT_eSprite& bg) {
uint8_t pressedButtons = buttons_getPressedButtons();
switch (pressedButtons) {
case K2_PRESSED:
@@ -30,7 +31,7 @@ void menu_drawClock(TFT_eSprite &bg) {
tft_drawBuffer();
}
void menu_drawClockEdit(TFT_eSprite &bg) {
void menu_drawClockEdit(TFT_eSprite& bg) {
char textBuffer[6];
static int clockHourCount = 0;
@@ -50,10 +51,14 @@ void menu_drawClockEdit(TFT_eSprite &bg) {
case K3_PRESSED:
// Es un dia random, nada significativo, ya pondre mas adelante que tenga dia del año
rtc.setTime(0, clockMinuteCount, clockHourCount, 1, 11, 2024);
srand(time(NULL));
coldBoot = false;
timeSet = true;
screenKey = CLOCK_SCREEN;
vpet_initTimer();
break;
default:
+2 -2
View File
@@ -6,7 +6,7 @@
#include "defs/sprite_data.h"
#include "vpet/lines/lines.h"
void menu_drawDeathScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* uiBigSprite, struct SpriteData* uiSmallSprite) {
void menu_drawDeathScreen(TFT_eSprite& bg, TFT_eSprite &sprite, struct SpriteData* uiBigSprite, struct SpriteData* uiSmallSprite) {
static uint8_t frameCounter = 0;
uint64_t currentTime = esp_timer_get_time();
@@ -33,7 +33,7 @@ void menu_drawDeathScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteDat
if (currentTime - lastUpdateTime > ANIMATION_THRESHOLD_TIME_US) {
draw_drawBackground(bg, 90, 90, 3);
draw_drawSprite(sprite, 72 + (6 * (frameCounter == 0)), 72, uiBigSprite, EMPTY_EGG, 6);
draw_drawSprite(sprite, 72 + (6 * (frameCounter == 0)), 72, uiBigSprite, EMPTY_EGG);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
menu_uiOverlay(sprite, uiSmallSprite);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
+3 -3
View File
@@ -9,7 +9,7 @@
#include "vpet/vpet/vpet.h"
#include "vpet/lines/lines.h"
void menu_eggHatchScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* uiBigSprite, struct SpriteData* uiSmallSprite) {
void menu_eggHatchScreen(TFT_eSprite& bg, TFT_eSprite &sprite, struct SpriteData* uiBigSprite, struct SpriteData* uiSmallSprite) {
static bool eggSpriteFrame = false;
uint8_t pressedButtons = buttons_getPressedButtons();
@@ -26,7 +26,7 @@ void menu_eggHatchScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData
if (currentTime - lastUpdateTime > ANIMATION_THRESHOLD_TIME_US) {
if (charaData[currentCharacter].hatchTimer <= currentLine[currentCharacter]->hatchTime) {
draw_drawBackground(bg, 90, 90, 3);
draw_drawSpriteCentered(sprite, &currentEgg->eggSprite, eggSpriteFrame, 6);
draw_drawSpriteCentered(sprite, &currentEgg->eggSprite, eggSpriteFrame);
eggSpriteFrame = !eggSpriteFrame;
lastUpdateTime = currentTime;
@@ -47,7 +47,7 @@ void menu_eggHatchScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData
draw_drawBackground(bg, 90, 90, 3);
draw_drawSpriteCentered(sprite, &currentEgg->eggSprite, 2, 6);
draw_drawSpriteCentered(sprite, &currentEgg->eggSprite, 2);
tft_drawBuffer();
+3 -3
View File
@@ -9,7 +9,7 @@
#include "vpet/vpet/vpet.h"
void menu_lineSwitcher(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* uiSmallSprite) {
void menu_lineSwitcher(TFT_eSprite& bg, TFT_eSprite &sprite, struct SpriteData* uiSmallSprite) {
static uint8_t eggCounter = 0;
uint8_t buttonsPressed = buttons_getPressedButtons();
@@ -36,9 +36,9 @@ void menu_lineSwitcher(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData*
draw_drawBackground(bg, 90, 90, 3);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
draw_drawSpriteCentered(sprite, &eggSelection[eggCounter].eggSprite, 0, 6);
draw_drawSpriteCentered(sprite, &eggSelection[eggCounter].eggSprite, 0);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
draw_drawSprite(sprite, 194, 96, uiSmallSprite, ARROW_ICON, 6);
draw_drawSprite(sprite, 194, 96, uiSmallSprite, ARROW_ICON);
tft_drawBuffer();
}
+2 -2
View File
@@ -5,7 +5,7 @@
#include "display/display.h"
void menu_feedingScreen(
TFT_eSprite &bg, TFT_eSprite &charaSprite,
TFT_eSprite& bg, TFT_eSprite &charaSprite,
struct SpriteData* uiSpriteData, struct SpriteData* charaSpriteData, uint8_t item
) {
static int currentAnimationFrame = 0;
@@ -19,7 +19,7 @@ void menu_feedingScreen(
animate_performEatingAnimation(charaSprite, charaSpriteData);
tft_clearBuffer(charaSprite, TFT_TRANSPARENT);
draw_drawSprite(charaSprite, 24, 120, uiSpriteData, item, 6);
draw_drawSprite(charaSprite, 24, 120, uiSpriteData, item);
lastUpdateTime = currentTime;
currentAnimationFrame++;
+78 -76
View File
@@ -1,92 +1,94 @@
#include "menu.h"
#include "display/display.h"
#include "draw/draw.h"
#include "buttons/buttons.h"
#include "defs/chara_data.h"
#include "display/display.h"
#include "draw/draw.h"
#include "menu.h"
#include "vpet/vpet/vpet.h"
void menu_foodScreen(TFT_eSprite &bg, TFT_eSprite &mainChara, struct SpriteData* spriteData) {
if (charaData[currentCharacter].sleepy) {
tone(SPK_PIN, BEEP_FREQ_HZ, BEEP_LEN_MS);
delay(100);
tone(SPK_PIN, BEEP_FREQ_HZ, BEEP_LEN_MS);
screenKey = MENU_SCREEN;
return;
}
void menu_foodScreen(TFT_eSprite &bg, TFT_eSprite &mainChara,
struct SpriteData *spriteData) {
if (charaData[currentCharacter].sleepy) {
tone(SPK_PIN, BEEP_FREQ_HZ, BEEP_LEN_MS);
delay(100);
tone(SPK_PIN, BEEP_FREQ_HZ, BEEP_LEN_MS);
screenKey = MENU_SCREEN;
static uint8_t arrowPosition = 0;
uint8_t pressedButtons = buttons_getPressedButtons();
switch (pressedButtons) {
case 8:
arrowPosition = (arrowPosition + 1) % 2;
break;
return;
}
case 2:
screenKey = MENU_SCREEN;
break;
default:
break;
}
if (pressedButtons == 4) {
lastUpdateTime = 0;
switch(arrowPosition) {
case 0:
if (charaData[currentCharacter].hunger < 8) {
charaData[currentCharacter].hungerCareMistakeTimer = charaData[currentCharacter].initialStatsReductionTime;
charaData[currentCharacter].hungerCareMistakeObtained = false;
charaData[currentCharacter].weight++;
charaData[currentCharacter].hunger++;
screenKey = FEEDING_SCREEN;
submenuKey = FOOD_ICON;
} else {
screenKey = REFUSING_SCREEN;
if (!charaData[currentCharacter].overfeedHappened) {
charaData[currentCharacter].overfeed++;
charaData[currentCharacter].overfeedHappened = true;
}
}
return;
break;
static uint8_t arrowPosition = 0;
case 1:
if (charaData[currentCharacter].strength < 8) {
charaData[currentCharacter].strengthCareMistakeTimer = charaData[currentCharacter].initialStatsReductionTime;
charaData[currentCharacter].strength++;
charaData[currentCharacter].weight += 2;
screenKey = FEEDING_SCREEN;
submenuKey = PILL_ICON;
} else {
screenKey = REFUSING_SCREEN;
}
return;
break;
default:
break;
uint8_t pressedButtons = buttons_getPressedButtons();
switch (pressedButtons) {
case 8:
arrowPosition = (arrowPosition + 1) % 2;
break;
case 2:
screenKey = MENU_SCREEN;
break;
default:
break;
}
if (pressedButtons == 4) {
lastUpdateTime = 0;
switch (arrowPosition) {
case 0:
if (charaData[currentCharacter].hunger < 8) {
charaData[currentCharacter].hungerCareMistakeTimer =
charaData[currentCharacter].initialStatsReductionTime;
charaData[currentCharacter].hungerCareMistakeObtained = false;
charaData[currentCharacter].weight++;
charaData[currentCharacter].hunger++;
screenKey = FEEDING_SCREEN;
submenuKey = FOOD_ICON;
} else {
screenKey = REFUSING_SCREEN;
if (!charaData[currentCharacter].overfeedHappened) {
charaData[currentCharacter].overfeed++;
charaData[currentCharacter].overfeedHappened = true;
}
}
return;
break;
vpet_computeCallLight();
case 1:
if (charaData[currentCharacter].strength < 8) {
charaData[currentCharacter].strengthCareMistakeTimer =
charaData[currentCharacter].initialStatsReductionTime;
charaData[currentCharacter].strength++;
charaData[currentCharacter].weight += 2;
screenKey = FEEDING_SCREEN;
submenuKey = PILL_ICON;
} else {
screenKey = REFUSING_SCREEN;
}
return;
break;
default:
break;
}
vpet_computeCallLight();
}
draw_drawBackground(bg, 90, 90, 3);
menu_foodScreen_drawEntry(mainChara, spriteData, 0, FOOD_ICON, "Meat");
menu_foodScreen_drawEntry(mainChara, spriteData, 1, PILL_ICON, "Pill");
draw_drawSprite(mainChara, 5, (arrowPosition * 34) + 5, spriteData, ARROW_ICON, 4);
draw_drawBackground(bg, 90, 90, 3);
menu_foodScreen_drawEntry(mainChara, spriteData, 0, FOOD_ICON, "Meat");
menu_foodScreen_drawEntry(mainChara, spriteData, 1, PILL_ICON, "Pill");
tft_drawBuffer();
draw_drawSprite(mainChara, 5, (arrowPosition * 34) + 5, spriteData,
ARROW_ICON);
tft_drawBuffer();
}
void menu_foodScreen_drawEntry(
TFT_eSprite &mainChara, struct SpriteData* spriteData,
uint8_t entryId, uint8_t spriteNumber, const char* textEntry
) {
tft_clearBuffer(mainChara, TFT_TRANSPARENT);
draw_drawSprite(mainChara, 45, (entryId * 34) + 5, spriteData, spriteNumber, 4);
tft_drawText(textEntry, 4, 80, (entryId * 34) + 5);
void menu_foodScreen_drawEntry(TFT_eSprite &mainChara,
struct SpriteData *spriteData, uint8_t entryId,
uint8_t spriteNumber, const char *textEntry) {
tft_clearBuffer(mainChara, TFT_TRANSPARENT);
draw_drawSprite(mainChara, 45, (entryId * 34) + 5, spriteData, spriteNumber);
tft_drawText(textEntry, 4, 80, (entryId * 34) + 5);
}
+34
View File
@@ -0,0 +1,34 @@
#include "menu.h"
#include "buttons/buttons.h"
#include "draw/draw.h"
#include "display/display.h"
void menu_drawFridgeScreen(TFT_eSprite &bg, TFT_eSprite& sprite, struct SpriteData* smallUiElements, struct SpriteData* bigUiElements) {
uint8_t pressedButtons = buttons_getPressedButtons();
switch (pressedButtons) {
case K1_PRESSED:
screenKey = MENU_SCREEN;
menuKey = STATUS_SCREEN_MENU;
break;
case K2_PRESSED:
screenKey = CLOCK_SCREEN;
break;
default:
break;
}
uint64_t currentTime = esp_timer_get_time();
if (currentTime - lastUpdateTime > ANIMATION_THRESHOLD_TIME_US) {
draw_drawBackground(bg, 90, 90, 3);
draw_drawSpriteCentered(sprite, bigUiElements, FRIDGE_DOOR);
menu_uiOverlay(sprite, bigUiElements);
lastUpdateTime = currentTime;
}
tft_drawBuffer();
}
+5 -7
View File
@@ -6,8 +6,8 @@
#include "animations/animations.h"
void menu_drawHappyScreen(
TFT_eSprite &bg, TFT_eSprite &sprite,
struct SpriteData* spriteData, struct SpriteData* smallUiElements
TFT_eSprite& bg, TFT_eSprite &sprite,
struct SpriteData* spriteData, struct SpriteData* smallUiElements, const int returnScreen
) {
uint8_t frameCounter = 0;
@@ -15,11 +15,9 @@ void menu_drawHappyScreen(
uint64_t currentTime = esp_timer_get_time();
if (currentTime - lastUpdateTime > ANIMATION_THRESHOLD_TIME_US) {
if (frameCounter > 3) {
screenKey = MAIN_SCREEN; // TODO: Change for while battling
screenKey = returnScreen; // TODO: Change for while battling
menuKey = STATUS_SCREEN;
vTaskResume(secondLoop);
return;
}
@@ -35,8 +33,8 @@ void menu_drawHappyScreen(
tone(SPK_PIN, 1000, 50);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
draw_drawSprite(sprite, 18, 72, smallUiElements, FIREWORKS_ICON, 6);
draw_drawSprite(sprite, 174, 72, smallUiElements, FIREWORKS_ICON, 6);
draw_drawSprite(sprite, 18, 72, smallUiElements, FIREWORKS_ICON);
draw_drawSprite(sprite, 174, 72, smallUiElements, FIREWORKS_ICON);
}
frameCounter++;
+1 -1
View File
@@ -13,7 +13,7 @@ void menu_drawIdleScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData
switch (pressedButtons) {
case K1_PRESSED:
screenKey = MENU_SCREEN;
menuKey = 0;
menuKey = STATUS_SCREEN_MENU;
break;
case K2_PRESSED:
+5 -1
View File
@@ -4,10 +4,14 @@
void menu_mainScreen() {
printf("[MAINSCR] on main screen\n");
lastUpdateTime = 0;
if (coldBoot) {
if (!timeSet) {
screenKey = TITLE_SCREEN;
return;
} else if (charaData[currentCharacter].frozen) {
screenKey = FROZEN_SCREEN;
return;
} else if (!charaData[currentCharacter].hatched && !charaData[currentCharacter].hatching) {
screenKey = EGG_EMPTY_SCREEN;
return;
+10 -2
View File
@@ -3,11 +3,12 @@
#include <TFT_eSPI.h>
#include "defs/defs.h"
#include "defs/sprite_data.h"
void menu_drawCurrentMenuOption(TFT_eSprite &bg, TFT_eSprite &icon, struct SpriteData* spriteData);
void menu_drawClock(TFT_eSprite &bg);
void menu_drawClockEdit(TFT_eSprite &bg);
void menu_drawTitle(TFT_eSprite &bg);
void menu_drawTitle(TFT_eSprite &bg, TFT_eSprite &composite);
void menu_drawIdleScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* spriteData, struct SpriteData* bigUiElements, struct SpriteData* smallUiElements);
void menu_offScreen();
void menu_statusScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* spriteData);
@@ -38,7 +39,7 @@ uint8_t menu_poopOverlay(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData
void menu_clearPoopScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* spriteData, struct SpriteData* bigUiElements, struct SpriteData* smallUiElements);
void menu_drawHappyScreen(
TFT_eSprite &bg, TFT_eSprite &sprite,
struct SpriteData* spriteData, struct SpriteData* smallUiElements
struct SpriteData* spriteData, struct SpriteData* smallUiElements, const int returnScreen = MAIN_SCREEN
);
void menu_lineSwitcher(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* uiSmallSprite);
void menu_eggHatchScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* uiBigSprite, struct SpriteData* uiSmallSprite);
@@ -51,8 +52,15 @@ void menu_drawAngryScreen(
TFT_eSprite &bg, TFT_eSprite &sprite,
struct SpriteData* spriteData, struct SpriteData* smallUiElements
);
void menu_drawFridgeScreen(TFT_eSprite &bg, TFT_eSprite& sprite, struct SpriteData* smallUiElements, struct SpriteData* bigUiElements);
void training_screenTraining2(
TFT_eSprite &bg, TFT_eSprite &sprite,
struct SpriteData* mainCharaData, struct SpriteData* attackSprites
);
void menu_sleepScreen_sleepAction();
void menu_sleepScreen_recalculateSleep();
void menu_freezeScreen_alternateFreeze();
#endif
+27 -7
View File
@@ -12,7 +12,7 @@
const int textXPos = 10;
const int textYPos = 180;
void menu_drawCurrentMenuOption(TFT_eSprite &bg, TFT_eSprite &icon, struct SpriteData* spriteData) {
void menu_drawCurrentMenuOption(TFT_eSprite& bg, TFT_eSprite &icon, struct SpriteData* spriteData) {
draw_drawBackground(bg, 90, 90, 3);
uint8_t pressedButtons = buttons_getPressedButtons();
@@ -40,19 +40,23 @@ void menu_drawCurrentMenuOption(TFT_eSprite &bg, TFT_eSprite &icon, struct Sprit
break;
case FOOD_SCREEN_MENU:
if (charaData[currentCharacter].frozen) { break; }
screenKey = FOOD_SCREEN;
break;
case SLEEP_SCREEN_MENU:
if (charaData[currentCharacter].frozen) { break; }
menu_sleepScreen_sleepAction();
break;
case TRAIN_SCREEN_MENU:
if (charaData[currentCharacter].frozen) { break; }
screenKey = TRAINING_SCREEN_1;
return;
break;
case POOP_SCREEN_MENU:
if (charaData[currentCharacter].frozen) { break; }
menuKey = STATUS_SCREEN;
screenKey = CLEAR_POOP_SCREEN;
return;
@@ -64,15 +68,20 @@ void menu_drawCurrentMenuOption(TFT_eSprite &bg, TFT_eSprite &icon, struct Sprit
return;
break;
case FREEZE_SCREEN_MENU:
menu_freezeScreen_alternateFreeze();
return;
break;
default:
break;
}
return;
}
draw_drawSpriteCentered(icon, spriteData, menuKey % 9, 6);
draw_drawSpriteCentered(icon, spriteData, menuKey % 10);
switch(menuKey % 10) {
switch(menuKey % 11) {
case STATUS_SCREEN_MENU:
tft_drawCenteredText("Status", 4, textYPos);
break;
@@ -108,8 +117,12 @@ void menu_drawCurrentMenuOption(TFT_eSprite &bg, TFT_eSprite &icon, struct Sprit
case SETTINGS_SCREEN_MENU:
tft_drawCenteredText("Settings", 4, textYPos);
break;
case 9:
case FREEZE_SCREEN_MENU:
tft_drawCenteredText("Freeze", 4, textYPos);
break;
case 10:
menuKey = STATUS_SCREEN_MENU;
screenKey = MAIN_SCREEN;
return;
@@ -130,7 +143,7 @@ void menu_sleepScreen_sleepAction() {
charaData[currentCharacter].sleepDisturbances++;
menuKey = STATUS_SCREEN;
menuKey = STATUS_SCREEN_MENU;
screenKey = MAIN_SCREEN;
} else {
@@ -138,11 +151,18 @@ void menu_sleepScreen_sleepAction() {
vpet_computeCallLight(); // Lo hago por cortesia, no me gusta
menuKey = STATUS_SCREEN;
menuKey = STATUS_SCREEN_MENU;
screenKey = SLEEP_SCREEN;
}
}
void menu_freezeScreen_alternateFreeze() {
charaData[currentCharacter].frozen = !charaData[currentCharacter].frozen;
menuKey = STATUS_SCREEN;
screenKey = MAIN_SCREEN;
}
void menu_sleepScreen_recalculateSleep() {
uint32_t newSleepTime = (dayUnixTime + 3600) % SECONDS_IN_DAY;
uint32_t newWakeUpTime = charaData[currentCharacter].wakeupTime + 3600;
+10 -4
View File
@@ -36,15 +36,21 @@ void menu_clearPoopScreen(
tft_clearBuffer(sprite, TFT_TRANSPARENT);
while (cleanerXPos > 18) {
draw_drawSprite(sprite, cleanerXPos, 72, smallUiElements, CLEANER_ICON, 6);
draw_drawSprite(sprite, cleanerXPos, 120, smallUiElements, CLEANER_ICON, 6);
while (cleanerXPos > 18 - 48) {
draw_drawBackgroundSection(bg, cleanerXPos + 6, 72, 48, 96);
draw_drawSprite(sprite, cleanerXPos, 72, smallUiElements, CLEANER_ICON);
draw_drawSprite(sprite, cleanerXPos, 120, smallUiElements, CLEANER_ICON);
draw_drawBackgroundSection(bg, 0, 72, 18, 96);
tft_drawBuffer();
cleanerXPos -= 6;
delay(50);
}
screenKey = HAPPY_SCREEN;
menuKey = -1;
charaData[currentCharacter].poopNumber = 0;
return;
+1 -1
View File
@@ -13,7 +13,7 @@ uint8_t menu_poopOverlay(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData
bool poopTop = false;
for (int i = 0; i < charaData[currentCharacter].poopNumber; i++) {
draw_drawSprite(sprite, poopStartX, poopStartY - (48 * poopTop), smallUiElements, POOP_ICON, 6, poopFlip);
draw_drawSprite(sprite, poopStartX, poopStartY - (48 * poopTop), smallUiElements, POOP_ICON, poopFlip);
poopStartX -= (i % 2) * 48;
poopTop = !poopTop;
}
+4 -4
View File
@@ -22,7 +22,7 @@ void menu_poopScreen(
draw_drawBackground(bg, 90, 90, 3);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
draw_drawSprite(sprite, 72 + (animationPosition * 6), 72, spriteData, 6, 6);
draw_drawSprite(sprite, 72 + (animationPosition * 6), 72, spriteData, 6);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
menu_uiOverlay(sprite, bigUiElements);
@@ -45,13 +45,13 @@ void menu_poopScreen(
draw_drawBackground(bg, 90, 90, 3);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
draw_drawSprite(sprite, 174, 120, smallUiElements, POOP_ICON, 6);
draw_drawSprite(sprite, 174, 120, smallUiElements, POOP_ICON);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
menu_uiOverlay(sprite, bigUiElements);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
draw_drawSprite(sprite, 72, 72, spriteData, 7, 6);
draw_drawSprite(sprite, 72, 72, spriteData, 7);
animationFrame++;
animationPosition = !animationPosition;
@@ -69,7 +69,7 @@ void menu_poopScreen(
screenKey = MAIN_SCREEN;
}
menuKey = 0;
menuKey = -1;
animationFrame = 0;
animationPosition = 0;
+2 -2
View File
@@ -42,10 +42,10 @@ void menu_sleepingScreen(
animate_performSleepyAnimation(sprite, mainCharaData);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
draw_drawSprite(sprite, 72, 72, bigUiElements, BED_SPRITE, 6);
draw_drawSprite(sprite, 72, 72, bigUiElements, BED_SPRITE);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
draw_drawSprite(sprite, 172, 72, smallUIElements, ZZZ_ICON, 6);
draw_drawSprite(sprite, 172, 72, smallUIElements, ZZZ_ICON);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
menu_uiOverlay(sprite, bigUiElements);
+3 -2
View File
@@ -6,6 +6,8 @@
#include "display/display.h"
#include "draw/draw.h"
#include <math.h>
void menu_statusScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* spriteData) {
tft_clearBuffer(sprite, TFT_TRANSPARENT);
@@ -23,7 +25,7 @@ void menu_statusScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData*
menu_statusScreen_drawStat(sprite, spriteData, 10, 10, "Hunger", charaData[currentCharacter].hunger);
menu_statusScreen_drawStat(sprite, spriteData, 10, 80, "Strength", charaData[currentCharacter].strength);
menu_statusScreen_drawStat(sprite, spriteData, 10, 150, "Effort", charaData[currentCharacter].effort);
menu_statusScreen_drawStat(sprite, spriteData, 10, 150, "Effort", floor(charaData[currentCharacter].effort / 4));
tft_drawBuffer();
}
@@ -43,7 +45,6 @@ void menu_statusScreen_drawStat(TFT_eSprite &sprite, struct SpriteData* spriteDa
y + 30,
spriteData,
icon,
4,
false
);
}
+3 -1
View File
@@ -4,7 +4,7 @@
#include "defs/defs.h"
#include "buttons/buttons.h"
void menu_drawTitle(TFT_eSprite &bg) {
void menu_drawTitle(TFT_eSprite &bg, TFT_eSprite &composite) {
uint8_t pressedButtons = buttons_getPressedButtons();
if (pressedButtons == 8 || pressedButtons == 4) {
screenKey = CLOCK_EDIT_SCREEN;
@@ -18,4 +18,6 @@ void menu_drawTitle(TFT_eSprite &bg) {
tft_drawCenteredText(VERSION, 2, 80);
tft_drawBuffer();
delay(200);
}
+2 -2
View File
@@ -14,7 +14,7 @@ void training_screenTraining1(
vTaskSuspend(secondLoop);
draw_drawBackground(bg, 90, 90, 3);
draw_drawSpriteCentered(sprite, mainCharaData, 11, 6);
draw_drawSpriteCentered(sprite, mainCharaData, 11);
tone(SPK_PIN, 4100, 100);
tone(SPK_PIN, 3500, 100);
@@ -24,7 +24,7 @@ void training_screenTraining1(
delay(500);
draw_drawBackground(bg, 90, 90, 3);
draw_drawSpriteCentered(sprite, mainCharaData, 0, 6);
draw_drawSpriteCentered(sprite, mainCharaData, 0);
tft_drawCenteredText("PUSH!!", 4, 190);
tft_drawBuffer();
+5
View File
@@ -7,5 +7,10 @@ void training_screenTraining1(
TFT_eSprite &bg, TFT_eSprite &sprite,
struct SpriteData* mainCharaData, struct SpriteData* attackSprites
);
void training_screenTraining2(
TFT_eSprite &bg, TFT_eSprite &sprite,
struct SpriteData* mainCharaData, struct SpriteData* attackSprites
);
#endif
+96
View File
@@ -0,0 +1,96 @@
#include "menu.h"
#include "vpet/training/training.h"
#include "defs/defs.h"
#include "defs/chara_data.h"
#include "draw/draw.h"
#include "display/display.h"
#include "buttons/buttons.h"
void training_screenTraining2(
TFT_eSprite &bg, TFT_eSprite &sprite,
struct SpriteData* mainCharaData, struct SpriteData* attackSprites
) {
vTaskSuspend(secondLoop);
draw_drawBackground(bg, 90, 90 ,3);
// Player
draw_drawSprite(sprite, 174, 72, mainCharaData, 0, false);
draw_drawBackgroundSection(bg, 222, 72, 18, 96);
// Opponent
draw_drawSprite(sprite, -30, 72, mainCharaData, 0, true);
draw_drawBackgroundSection(bg, 0, 72, 18, 96);
tft_drawBuffer();
uint64_t inactivityTimer = esp_timer_get_time();
while (true) {
uint64_t currentTime = esp_timer_get_time();
if (currentTime - lastUpdateTime > 500000) {
tone(SPK_PIN, BEEP_FREQ_HZ, BEEP_LEN_MS);
lastUpdateTime = currentTime;
}
if (currentTime - inactivityTimer > 3000000) {
screenKey = MAIN_SCREEN;
submenuKey = STATUS_SCREEN_MENU;
vTaskResume(secondLoop);
return;
}
uint8_t randomPosition = rand() % 2;
uint8_t projectilePosition = 0;
uint8_t pressedButtons = buttons_getPressedButtons();
if (pressedButtons == K1_PRESSED || pressedButtons == K2_PRESSED) {
projectilePosition = pressedButtons >> 3; // pressedButtons >> 4 == 1 => K1; != 1 => K2
printf("[TRAIN] projectilePosition=%i\n", projectilePosition);
} else if (pressedButtons == K3_PRESSED) {
screenKey = MAIN_SCREEN;
submenuKey = STATUS_SCREEN_MENU;
vTaskResume(secondLoop);
return;
}
if (pressedButtons != 0) {
inactivityTimer = esp_timer_get_time();
// Player attack
draw_drawSprite(sprite, 126, 72 + 48 * projectilePosition, attackSprites, POOP_ICON);
// Opponent attack
draw_drawSprite(sprite, 66, 72 + 48 * randomPosition, attackSprites, FOOD_ICON);
tft_drawBuffer();
if (projectilePosition != randomPosition) {
delay(500);
draw_drawBackgroundSection(bg, 126, 72 + 48 * projectilePosition, 48, 48);
draw_drawSprite(sprite, 66, 72 + 48 * projectilePosition, attackSprites, POOP_ICON);
tft_drawBuffer();
delay(500);
} else {
delay(500);
}
draw_drawBackgroundSection(bg, 66, 72, 108, 96);
if (projectilePosition != randomPosition) {
charaData[currentCharacter].strength++;
menu_drawHappyScreen(bg, sprite, mainCharaData, attackSprites);
} else {
printf("[TRAIN] Train failed\n");
menu_drawAngryScreen(bg, sprite, mainCharaData, attackSprites);
}
}
}
}
+17 -16
View File
@@ -1,22 +1,23 @@
#include "menu.h"
#include "draw/draw.h"
#include "display/display.h"
#include "defs/chara_data.h"
#include "defs/screen_defs.h"
#include "display/display.h"
#include "draw/draw.h"
#include "menu.h"
void menu_uiOverlay(TFT_eSprite &charSprite, struct SpriteData* uiElements) {
char hourBuffer[6];
void menu_uiOverlay(TFT_eSprite &charSprite, struct SpriteData *uiElements) {
char hourBuffer[6];
snprintf(hourBuffer, 6, "%02d:%02d", timeInfo.tm_hour, timeInfo.tm_min);
snprintf(hourBuffer, 6, "%02d:%02d", timeInfo.tm_hour, timeInfo.tm_min);
composite1.fillRect(0, 0, 240, 24, TFT_BLACK);
tft_drawText(hourBuffer, 2, 4, 4, TFT_WHITE);
snprintf(hourBuffer, 6, "%05d", stepCounter);
tft_drawText(hourBuffer, 2, 176, 4, TFT_WHITE);
if (charaData[currentCharacter].careMistakeCallLight) {
tft_clearBuffer(charSprite, TFT_TRANSPARENT);
draw_drawSprite(charSprite, 192, 192, uiElements, CARE_MISTAKE_CALL_LIGHT, 2);
}
composite.fillRect(0, 0, 240, 24, TFT_BLACK);
tft_drawText(hourBuffer, 2, 4, 4, TFT_WHITE);
snprintf(hourBuffer, 6, "%05d", stepCounter);
tft_drawText(hourBuffer, 2, 176, 4, TFT_WHITE);
if (charaData[currentCharacter].careMistakeCallLight) {
tft_clearBuffer(charSprite, TFT_TRANSPARENT);
// draw_drawSprite(charSprite, 192, 192, uiElements,
// CARE_MISTAKE_CALL_LIGHT, 2);
}
}