diff --git a/linecreator/create_line.py b/linecreator/create_line.py index 5fda2e1..30f1246 100644 --- a/linecreator/create_line.py +++ b/linecreator/create_line.py @@ -69,19 +69,19 @@ def process_npet_file(origFp, eggFp, outputName): charaReductionTime = int(matches[0][11], 16) charaMinWeight = int(matches[0][12], 16) - destFp.write(charaId.to_bytes(1, "big")) + destFp.write(charaId.to_bytes(1, "little")) destFp.write(charaName) - destFp.write(charaHp.to_bytes(1, "big")) - destFp.write(charaBp.to_bytes(1, "big")) - destFp.write(charaAp.to_bytes(1, "big")) - destFp.write(charaStage.to_bytes(1, "big")) - destFp.write(charaAttribute.to_bytes(1, "big")) - destFp.write(charaAttackSprite.to_bytes(1, "big")) - destFp.write(charaSleepTime.to_bytes(4, "big")) - destFp.write(charaWakeupTime.to_bytes(4, "big")) - destFp.write(charaEvolutionTime.to_bytes(4, "big")) - destFp.write(charaReductionTime.to_bytes(2, "big")) - destFp.write(charaMinWeight.to_bytes(1, "big")) + destFp.write(charaHp.to_bytes(1, "little")) + destFp.write(charaBp.to_bytes(1, "little")) + destFp.write(charaAp.to_bytes(1, "little")) + destFp.write(charaStage.to_bytes(1, "little")) + destFp.write(charaAttribute.to_bytes(1, "little")) + destFp.write(charaAttackSprite.to_bytes(1, "little")) + destFp.write(charaSleepTime.to_bytes(4, "little")) + destFp.write(charaWakeupTime.to_bytes(4, "little")) + destFp.write(charaEvolutionTime.to_bytes(4, "little")) + destFp.write(charaReductionTime.to_bytes(2, "little")) + destFp.write(charaMinWeight.to_bytes(1, "little")) logging.info(f"Añadiendo nueva entrada con nombre {matches[0][1]}") diff --git a/src/buttons/buttons.cpp b/src/buttons/buttons.cpp index 09783e4..3973448 100644 --- a/src/buttons/buttons.cpp +++ b/src/buttons/buttons.cpp @@ -39,6 +39,18 @@ uint8_t buttons_getPressedButtons() { (k4_prev == HIGH && k4_current == LOW) ); + if (retV == K4_PRESSED) { + tft.fillScreen(TFT_BLACK); + xPos++; + if (xPos > 1) { + yPos++; + xPos = 0; + if (yPos > 1) { + yPos = 0; + } + } + } + if (retV != 0) { tone(SPK_PIN, BEEP_FREQ_HZ, BEEP_LEN_MS); lastPressedButtonTime = esp_timer_get_time(); @@ -51,7 +63,5 @@ uint8_t buttons_getPressedButtons() { k3_prev = k3_current; k4_prev = k4_current; - delay(15); - return retV; } diff --git a/src/defs/chara_data.h b/src/defs/chara_data.h index ef3d143..4b3cd51 100644 --- a/src/defs/chara_data.h +++ b/src/defs/chara_data.h @@ -15,10 +15,11 @@ struct CharacterData { uint8_t age; uint8_t poopNumber; - uint8_t careMistakes; - uint8_t effort; - uint8_t overfeed; - uint8_t sleepDisturbances; + uint8_t careMistakes = 0; + uint8_t effort = 0; + uint8_t overfeed = 0; + uint8_t sleepDisturbances = 0; + uint8_t injuries = 0; uint16_t stageTotalBattled; uint16_t stageTotalWon; @@ -27,7 +28,7 @@ struct CharacterData { uint16_t charaTotalWon; int32_t sleepCareMistakeCounter = 0; - int32_t evoLeftTimer; + int32_t changeTimerLeft; int16_t hungerCareMistakeTimer; int16_t strengthCareMistakeTimer; @@ -38,11 +39,17 @@ struct CharacterData { bool careMistakeCallLight = false; bool overfeedHappened = false; + uint32_t sleepTime; + uint32_t wakeupTime; + bool sleepy = false; bool asleep = false; bool injured = false; bool dead = false; bool traited = true; + + // Usado para recalcular cuantos dias van a tardar en recuperarse, max 5 pls + uint8_t dynamicSleepDists; // Obtained from structure uint8_t idChara; @@ -56,10 +63,10 @@ struct CharacterData { uint8_t stage; uint8_t attribute; - uint32_t sleepTime; - uint32_t wakeupTime; + uint32_t initialSleepTime; + uint32_t initialWakeupTime; - uint32_t evoTime; + uint32_t initialChangeTimer; uint16_t initialStatsReductionTime = 600; uint8_t minWeight; diff --git a/src/defs/defs.h b/src/defs/defs.h index b606295..4de8dec 100644 --- a/src/defs/defs.h +++ b/src/defs/defs.h @@ -113,6 +113,8 @@ #define EMPTY_HEART_ICON 10 #define CLEANER_ICON 11 +#define SECONDS_IN_DAY 86400 + // STANDARD VPET PARAMETER (CARE MISTAKES) #define CARE_MISTAKE_COUNTER_MAX 60 #define SLEEP_CARE_MISTAKE_COUNTER_MAX 60 @@ -132,6 +134,8 @@ #define K4_PRESSED 1 #define NONE_PRESSED 0 +#define SCALE_FACTOR 3 + #define CHARA_COUNT_IN_DEVICE 5 extern int screenKey; @@ -179,4 +183,12 @@ extern Line_t** currentLine; extern struct SpriteData mainCharacterSprites; +// ALTAMENTE TEMPORAL +extern int xPos; +extern int yPos; + +#include + +extern TFT_eSPI tft; + #endif \ No newline at end of file diff --git a/src/display/display.cpp b/src/display/display.cpp index 394f40a..c7caaca 100644 --- a/src/display/display.cpp +++ b/src/display/display.cpp @@ -1,8 +1,11 @@ #include "display.h" +int xPos = 0; +int yPos = 0; + void tft_initDisplay(TFT_eSPI &tft, uint16_t color) { tft.init(); - tft.setRotation(0); + tft.setRotation(1); tft.fillScreen(color); } @@ -15,7 +18,7 @@ void tft_initScreenBuffer(TFT_eSprite &buffer, uint16_t color) { } void tft_drawBuffer(TFT_eSprite &buffer) { - buffer.pushSprite(0, 0); + buffer.pushSprite(xPos * -80, yPos * -112); } void tft_clearBuffer(TFT_eSprite &buffer, uint16_t color) { diff --git a/src/draw/draw_sprites.cpp b/src/draw/draw_sprites.cpp index 589ac90..2766864 100644 --- a/src/draw/draw_sprites.cpp +++ b/src/draw/draw_sprites.cpp @@ -2,6 +2,9 @@ #include "defs/sprite_data.h" +#define BUFFER_X 239 +#define BUFFER_Y 239 + const char* TAG_D = "[DRAW]"; void draw_drawSprite( @@ -39,10 +42,10 @@ void draw_drawSpriteCentered( TFT_eSprite &buffer, TFT_eSprite &spr, struct SpriteData* spriteData, uint8_t spriteNumber, uint8_t factor, bool flipped, int y ) { - int x = (TFT_WIDTH - (spriteData->spriteWidth * factor)) / 2; + int x = (BUFFER_X - (spriteData->spriteWidth * factor)) / 2; int new_y; if (y == -1) { - new_y = (TFT_HEIGHT - (spriteData->spriteHeight * factor)) / 2; + new_y = (BUFFER_Y - (spriteData->spriteHeight * factor)) / 2; } else { new_y = y; } diff --git a/src/main.cpp b/src/main.cpp index 4025b0e..eb59045 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -59,9 +59,11 @@ uint8_t eggNumber = 0; // Tasks TaskHandle_t secondLoop = NULL; +TaskHandle_t readSteps = NULL; void loop2(); void secondCoreTask(void*); +void loop_readSteps(void*); void setup() { Serial.begin(115200); @@ -175,15 +177,18 @@ void loop() { menu_drawDeathScreen(composite, bg, sprite, &menuElementsData, &uiElementsData); break; } + + if (screenKey == IDLE_SCREEN || screenKey == OFF_SCREEN) { + steps_countSteps(); + } } void loop2() { - steps_countSteps(); buttons_checkInactivity(); vpet_runVpetTasks(); getLocalTime(&timeInfo, 50); - dayUnixTime = mktime(&timeInfo) % 86400; + dayUnixTime = mktime(&timeInfo) % SECONDS_IN_DAY; } void secondCoreTask(void*) { diff --git a/src/menu/clock_screen.cpp b/src/menu/clock_screen.cpp index e3cb672..6fe7165 100644 --- a/src/menu/clock_screen.cpp +++ b/src/menu/clock_screen.cpp @@ -53,7 +53,7 @@ void menu_drawClockEdit(TFT_eSprite &composite, TFT_eSprite &bg) { // Es un dia random, nada significativo, ya pondre mas adelante que tenga dia del año rtc.setTime(0, clockMinuteCount, clockHourCount, 1, 11, 2024); getLocalTime(&timeInfo, 50); - dayUnixTime = mktime(&timeInfo) % 86400; + dayUnixTime = mktime(&timeInfo) % SECONDS_IN_DAY; coldBoot = false; diff --git a/src/menu/egg_select_screen.cpp b/src/menu/egg_select_screen.cpp index 096886f..d71f581 100644 --- a/src/menu/egg_select_screen.cpp +++ b/src/menu/egg_select_screen.cpp @@ -49,6 +49,8 @@ void menu_reloadEggs(uint8_t selectedEgg) { lines_freeEggList(); + printf("[DEBUG] fileName=%s\n", fileName); + lines_getSingleLine(fileName); lines_getLineCareMistakes(fileName); diff --git a/src/menu/feeding_screen.cpp b/src/menu/feeding_screen.cpp index 605b4b9..9751c8b 100644 --- a/src/menu/feeding_screen.cpp +++ b/src/menu/feeding_screen.cpp @@ -11,6 +11,29 @@ void menu_feedingScreen( static int currentAnimationFrame = 0; uint64_t currentTime = esp_timer_get_time(); + + if (currentTime - lastUpdateTime > ANIMATION_THRESHOLD_TIME_US) { + draw_drawBackground(composite, bg, 90, 90, 3); + + tft_clearBuffer(charaSprite, TFT_TRANSPARENT); + animate_performEatingAnimation(composite, charaSprite, charaSpriteData); + + tft_clearBuffer(charaSprite, TFT_TRANSPARENT); + draw_drawSprite(composite, charaSprite, 24, 120, uiSpriteData, item, 6); + + lastUpdateTime = currentTime; + currentAnimationFrame++; + } + + if (currentAnimationFrame > 6) { + screenKey = FOOD_SCREEN; + lastPressedButtonTime = currentTime; + currentAnimationFrame = 0; + submenuKey = -1; + } + + tft_drawBuffer(composite); + uint8_t pressedButtons = buttons_getPressedButtons(); switch (pressedButtons) { case 8: @@ -24,26 +47,4 @@ void menu_feedingScreen( default: break; } - - if (currentTime - lastUpdateTime > ANIMATION_THRESHOLD_TIME_US) { - draw_drawBackground(composite, bg, 90, 90, 3); - - tft_clearBuffer(charaSprite, TFT_TRANSPARENT); - animate_performEatingAnimation(composite, charaSprite, charaSpriteData); - - tft_clearBuffer(charaSprite, TFT_TRANSPARENT); - draw_drawSprite(composite, charaSprite, 24, 120, uiSpriteData, item, 6); - - lastUpdateTime = currentTime; - currentAnimationFrame++; - } - - if (currentAnimationFrame > 6) { - screenKey = FOOD_SCREEN; - lastPressedButtonTime = currentTime; - currentAnimationFrame = 0; - submenuKey = -1; - } - - tft_drawBuffer(composite); } \ No newline at end of file diff --git a/src/menu/food_select_screen.cpp b/src/menu/food_select_screen.cpp index d12857d..8b34f53 100644 --- a/src/menu/food_select_screen.cpp +++ b/src/menu/food_select_screen.cpp @@ -32,12 +32,14 @@ void menu_foodScreen(TFT_eSprite &composite, TFT_eSprite &bg, TFT_eSprite &mainC } if (pressedButtons == 4) { + lastUpdateTime = 0; switch(arrowPosition) { case 0: if (charaData.hunger < 8) { + charaData.hungerCareMistakeTimer = charaData.initialStatsReductionTime; + charaData.hungerCareMistakeObtained = false; charaData.weight++; charaData.hunger++; - charaData.hungerCareMistakeTimer = charaData.initialStatsReductionTime; screenKey = FEEDING_SCREEN; submenuKey = FOOD_ICON; } else { @@ -47,18 +49,20 @@ void menu_foodScreen(TFT_eSprite &composite, TFT_eSprite &bg, TFT_eSprite &mainC charaData.overfeedHappened = true; } } + return; break; case 1: if (charaData.strength < 8) { + charaData.strengthCareMistakeTimer = charaData.initialStatsReductionTime; charaData.strength++; charaData.weight += 2; - charaData.strengthCareMistakeTimer = charaData.initialStatsReductionTime; screenKey = FEEDING_SCREEN; submenuKey = PILL_ICON; } else { screenKey = REFUSING_SCREEN; } + return; break; default: diff --git a/src/menu/menu.h b/src/menu/menu.h index ef73c3e..1c132cb 100644 --- a/src/menu/menu.h +++ b/src/menu/menu.h @@ -45,4 +45,7 @@ void menu_eggHatchScreen(TFT_eSprite &composite, TFT_eSprite &bg, TFT_eSprite &s void menu_reloadEggs(uint8_t selectedEgg); void menu_drawDeathScreen(TFT_eSprite &composite, TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* uiBigSprite, struct SpriteData* uiSmallSprite); +void menu_sleepScreen_sleepAction(); +void menu_sleepScreen_recalculateSleep(); + #endif \ No newline at end of file diff --git a/src/menu/menu_screen.cpp b/src/menu/menu_screen.cpp index 85fc7d9..89d225c 100644 --- a/src/menu/menu_screen.cpp +++ b/src/menu/menu_screen.cpp @@ -17,11 +17,11 @@ void menu_drawCurrentMenuOption(TFT_eSprite &composite, TFT_eSprite &bg, TFT_eSp uint8_t pressedButtons = buttons_getPressedButtons(); switch (pressedButtons) { - case 8: + case K1_PRESSED: menuKey++; break; - case 2: + case K3_PRESSED: screenKey = IDLE_SCREEN; menuKey = STATUS_SCREEN_MENU; return; @@ -31,7 +31,8 @@ void menu_drawCurrentMenuOption(TFT_eSprite &composite, TFT_eSprite &bg, TFT_eSp break; } - if (pressedButtons == 4) { + // Separaíto mas guapito + if (pressedButtons == K2_PRESSED) { switch (menuKey) { case STATUS_SCREEN_MENU: screenKey = STATUS_SCREEN; @@ -42,10 +43,7 @@ void menu_drawCurrentMenuOption(TFT_eSprite &composite, TFT_eSprite &bg, TFT_eSp break; case SLEEP_SCREEN_MENU: - charaData.asleep = true; - vpet_computeCallLight(); - menuKey = STATUS_SCREEN; - screenKey = SLEEP_SCREEN; + menu_sleepScreen_sleepAction(); break; case POOP_SCREEN_MENU: @@ -107,3 +105,35 @@ void menu_drawCurrentMenuOption(TFT_eSprite &composite, TFT_eSprite &bg, TFT_eSp tft_drawBuffer(composite); } + +void menu_sleepScreen_sleepAction() { + if (charaData.asleep && charaData.sleepy) { + menu_sleepScreen_recalculateSleep(); + + charaData.sleepy = false; + charaData.asleep = false; + + charaData.sleepDisturbances++; + + menuKey = STATUS_SCREEN; + screenKey = IDLE_SCREEN; + + } else { + charaData.asleep = true; + + vpet_computeCallLight(); // Lo hago por cortesia, no me gusta + + menuKey = STATUS_SCREEN; + screenKey = SLEEP_SCREEN; + } +} + +void menu_sleepScreen_recalculateSleep() { + uint32_t newSleepTime = (dayUnixTime + 3600) % SECONDS_IN_DAY; + uint32_t newWakeUpTime = charaData.wakeupTime + 3600; + + charaData.sleepTime = newSleepTime; + charaData.wakeupTime = newWakeUpTime; + + charaData.dynamicSleepDists++; +} \ No newline at end of file diff --git a/src/vpet/lines/on_hatch_finished.cpp b/src/vpet/lines/on_hatch_finished.cpp index 275fd96..a3f5ec4 100644 --- a/src/vpet/lines/on_hatch_finished.cpp +++ b/src/vpet/lines/on_hatch_finished.cpp @@ -14,23 +14,24 @@ void lines_onHatchComplete() { storage_readFile(spriteFileName, &mainCharacterSprites); + // Primero los datos del bicho actual en nuestra estructura de datos de confianza charaData.hp = currentLine[currentCharacter]->characters[0].hp; charaData.bp = currentLine[currentCharacter]->characters[0].bp; charaData.ap = currentLine[currentCharacter]->characters[0].ap; charaData.stage = currentLine[currentCharacter]->characters[0].stage; charaData.attribute = currentLine[currentCharacter]->characters[0].attribute; - - charaData.sleepTime = currentLine[currentCharacter]->characters[0].sleepTime; - charaData.wakeupTime = currentLine[currentCharacter]->characters[0].wakeTime; - charaData.evoLeftTimer = currentLine[currentCharacter]->characters[0].changeTime; - charaData.evoTime = currentLine[currentCharacter]->characters[0].changeTime; - - charaData.hungerCareMistakeTimer = CARE_MISTAKE_COUNTER_MAX; - charaData.strengthCareMistakeTimer = CARE_MISTAKE_COUNTER_MAX; + + charaData.sleepTime = charaData.initialSleepTime = currentLine[currentCharacter]->characters[0].sleepTime; + charaData.wakeupTime = charaData.initialWakeupTime = currentLine[currentCharacter]->characters[0].wakeTime; + charaData.initialChangeTimer = charaData.changeTimerLeft = currentLine[currentCharacter]->characters[0].changeTime; charaData.initialStatsReductionTime = currentLine[currentCharacter]->characters[0].depleteTime; charaData.minWeight = currentLine[currentCharacter]->characters[0].minWeight; + // Luego le obligamos a que nazca con hambre + charaData.hungerCareMistakeTimer = CARE_MISTAKE_COUNTER_MAX; + charaData.strengthCareMistakeTimer = CARE_MISTAKE_COUNTER_MAX; + charaData.hatched = true; } \ No newline at end of file diff --git a/src/vpet/steps/steps.cpp b/src/vpet/steps/steps.cpp index 3538384..e3170c6 100644 --- a/src/vpet/steps/steps.cpp +++ b/src/vpet/steps/steps.cpp @@ -2,8 +2,8 @@ #include "defs/defs.h" float gravity = 0.0; -const float alpha = 0.99; -const float thresh = 0.80; +const float alpha = 0.95; +const float thresh = 0.40; uint64_t lastStepTime = esp_timer_get_time(); @@ -22,7 +22,7 @@ void steps_countSteps() { float dyn = mag - gravity; unsigned long now = esp_timer_get_time(); - if (dyn > thresh && (now - lastStepTime) > 500000) { + if (dyn > thresh && (now - lastStepTime) > 250000) { stepCounter++; lastStepTime = now; } diff --git a/src/vpet/vpet.cpp b/src/vpet/vpet.cpp index c6b3596..dd63177 100644 --- a/src/vpet/vpet.cpp +++ b/src/vpet/vpet.cpp @@ -37,6 +37,15 @@ bool vpet_evalSleep() { charaData.sleepy = false; charaData.asleep = false; + + if (charaData.dynamicSleepDists > 0) { + // Primero, el sleep time ahora está reventado, hay que restaurarlo + // fácil, simplemente recalcula a la hora de despertar + charaData.dynamicSleepDists--; + + charaData.sleepTime = (charaData.initialSleepTime + (charaData.dynamicSleepDists * 3600)) % SECONDS_IN_DAY; + charaData.wakeupTime = (charaData.initialWakeupTime + (charaData.dynamicSleepDists * 3600)) % SECONDS_IN_DAY; + } return false; @@ -44,7 +53,7 @@ bool vpet_evalSleep() { dayUnixTime < charaData.sleepTime && dayUnixTime > charaData.wakeupTime && charaData.asleep && - charaData.sleepCareMistakeCounter < 60 + charaData.sleepCareMistakeCounter < SLEEP_COUNTER_MAX // Esto se ejecuta cuando mandamos a dormir al personaje // durante el dia. // Resultado, el personaje deberia de dormir una siesta @@ -57,7 +66,7 @@ bool vpet_evalSleep() { dayUnixTime < charaData.sleepTime && dayUnixTime > charaData.wakeupTime && charaData.asleep && - charaData.sleepCareMistakeCounter >= 60 + charaData.sleepCareMistakeCounter >= SLEEP_COUNTER_MAX // Esto se ejecuta cuando la siesta del personaje acaba // Resultado, el personaje se despierta ) { @@ -88,7 +97,7 @@ bool vpet_evalSleep() { } else if ( charaData.sleepy && !charaData.asleep && - charaData.sleepCareMistakeCounter < 60 && + charaData.sleepCareMistakeCounter < SLEEP_COUNTER_MAX && !charaData.sleepCareMistakeObtained // Esto se ejecuta cuando el personaje debería de estar durmiendo // pero no se le ha mandado a dormir, empieza a contar para pasar @@ -100,7 +109,7 @@ bool vpet_evalSleep() { } else if ( charaData.sleepy && !charaData.asleep && - charaData.sleepCareMistakeCounter >= 60 && + charaData.sleepCareMistakeCounter >= SLEEP_COUNTER_MAX && !charaData.sleepCareMistakeObtained // Esto se ejecuta cuando el personaje deberia de estar durmiendo // pero no se le ha mandado a dormir, y el contador ya ha llegado @@ -135,75 +144,79 @@ bool vpet_evalSleep() { } void vpet_evalTimers() { - if (charaData.hungerCareMistakeTimer >= 0) { - charaData.hungerCareMistakeTimer -= 1; - } + vpet_evalHungerTimer(); + vpet_evalStrengthTimer(); +} - if (charaData.strengthCareMistakeTimer >= 0) { - charaData.strengthCareMistakeTimer -= 1; - } +void vpet_evalHungerTimer() { + if (charaData.hungerCareMistakeTimer > 0) { + charaData.hungerCareMistakeTimer--; - if ( - charaData.hungerCareMistakeTimer < 0 || - charaData.strengthCareMistakeTimer < 0 + } else if ( + charaData.hungerCareMistakeTimer <= 0 && + charaData.hunger > 0 ) { + charaData.hunger--; + if (charaData.hunger > 0) { - charaData.hunger--; + charaData.hungerCareMistakeTimer = charaData.initialStatsReductionTime; screenKey = TIMER_FINISHED_SCREEN; interruptKey = POOPING_SCREEN; + } else { + charaData.hungerCareMistakeTimer = CARE_MISTAKE_COUNTER_MAX; + screenKey = TIMER_FINISHED_SCREEN; + interruptKey = CARE_MISTAKE_SCREEN; + } + + if (charaData.poopNumber < 8) { charaData.poopNumber++; - if (charaData.hunger < 4 && charaData.overfeedHappened) { - charaData.overfeedHappened = false; - } - if (charaData.hunger > 0) { - charaData.hungerCareMistakeTimer = charaData.initialStatsReductionTime; - } else { - charaData.hungerCareMistakeTimer = CARE_MISTAKE_COUNTER_MAX; - } - } - - if (!charaData.hungerCareMistakeObtained) { - if ( - charaData.hunger == 0 && - charaData.hungerCareMistakeTimer < 0 - ) { - charaData.careMistakes++; - charaData.hungerCareMistakeObtained = true; - - } else if (charaData.hunger == 0) { - interruptKey = POOPING_SCREEN; - screenKey = TIMER_FINISHED_SCREEN; - charaData.poopNumber++; - } + } else { + charaData.injured = true; + charaData.injuries++; } - if (charaData.strength > 0) { - charaData.strength--; - if (charaData.strength > 0) { - charaData.strengthCareMistakeTimer = charaData.initialStatsReductionTime; - } else { - charaData.strengthCareMistakeTimer = CARE_MISTAKE_COUNTER_MAX; - } - } + } else if ( + charaData.hungerCareMistakeTimer <= 0 && + charaData.hunger == 0 && + !charaData.hungerCareMistakeObtained + ) { + charaData.hungerCareMistakeObtained = true; + charaData.careMistakes++; - if (!charaData.strengthCareMistakeObtained) { - if ( - charaData.strength == 0 && - charaData.strengthCareMistakeTimer < 0 - ) { - charaData.careMistakes++; - charaData.strengthCareMistakeObtained = true; - - } else if(charaData.strength == 0) { - if (interruptKey != POOPING_SCREEN) { - interruptKey = CARE_MISTAKE_SCREEN; - screenKey = TIMER_FINISHED_SCREEN; - } - } - } } } +void vpet_evalStrengthTimer() { + if (charaData.strengthCareMistakeTimer > 0) { + charaData.strengthCareMistakeTimer--; + + } else if ( + charaData.strengthCareMistakeTimer <= 0 && + charaData.strength > 0 + ) { + charaData.strength--; + if (charaData.strength > 0) { + charaData.strengthCareMistakeTimer = charaData.initialStatsReductionTime; + } else { + charaData.strengthCareMistakeTimer = CARE_MISTAKE_COUNTER_MAX; + if (interruptKey != POOPING_SCREEN) { + interruptKey = CARE_MISTAKE_SCREEN; + screenKey = TIMER_FINISHED_SCREEN; + } + } + + } else if ( + charaData.strengthCareMistakeTimer <= 0 && + charaData.strength == 0 && + !charaData.strengthCareMistakeObtained + ) { + charaData.strengthCareMistakeObtained = true; + charaData.careMistakes++; + + } +} + + void IRAM_ATTR onActionTimerDelta() { runVpetTasks = true; } @@ -214,15 +227,17 @@ void vpet_runVpetTasks() { if (!vpet_evalSleep()) { vpet_evalTimers(); } + printf("[MAIN]: Hunger timer %d, hunger %d\n", charaData.hungerCareMistakeTimer, charaData.hunger); printf("[MAIN]: Strength timer %d, strength %d\n", charaData.strengthCareMistakeTimer, charaData.strength); - printf("[MAIN]: Evo timer %d\n", charaData.evoLeftTimer); + printf("[MAIN]: Change timer %d\n", charaData.changeTimerLeft); printf("[MAIN]: RTC time is %d\n", dayUnixTime); printf("[MAIN]: Sleep counter is %d\n", charaData.sleepCareMistakeCounter); printf("[MAIN]: Care mistake count is %d\n", charaData.careMistakes); printf("[MAIN]: Is sleep care mistake tripped? %d\n", charaData.sleepCareMistakeObtained); runVpetTasks = false; + } else if (runVpetTasks && !charaData.hatched && charaData.hatching) { charaData.hatchTimer++; printf("[DEBUG] hatchTimer=%i out of hatchTimer=%i\n", charaData.hatchTimer, currentLine[currentCharacter]->hatchTime); diff --git a/src/vpet/vpet.h b/src/vpet/vpet.h index df490d6..f3e53e6 100644 --- a/src/vpet/vpet.h +++ b/src/vpet/vpet.h @@ -9,5 +9,7 @@ void vpet_computeCallLight(); bool vpet_evalSleep(); void vpet_evalTimers(); void vpet_runVpetTasks(); +void vpet_evalHungerTimer(); +void vpet_evalStrengthTimer(); #endif \ No newline at end of file