static void doLevel() { uint8_t idx = 0; do { doIndicateStep(idx); delay(STEP_DURATION); stepEnd(); idx++; } while(idx < currentLevel); }
static uint8_t mainStateFunc(StateM* sm) { uint8_t retValue = 0; switch(sm->getCurrent()) { case GAME_STATE_POR: { currentLevel = 1; generateSequence(); sm->setNext(GAME_STATE_PRE_GAME); break; } case GAME_STATE_PRE_GAME: { static uint8_t leds = LOW; if(sm->isStateEntered()) { } else { if(getInput() != NO_KEY) { sm->setNext(GAME_STATE_PLAY_SEQUENCE_INIT); leds = LOW; } else if(sm->getDuration() > 500) { sm->resetEnterTime(); leds = leds ? LOW : HIGH; } digitalWrite(RED_LED_PIN, leds); digitalWrite(GREEN_LED_PIN, leds); digitalWrite(BLUE_LED_PIN, leds); digitalWrite(YELLOW_LED_PIN, leds); } break; } case GAME_STATE_PLAY_SEQUENCE_INIT: { if(sm->getDuration() > 2000) { Serial.print("Level: "); Serial.println(currentLevel); currentStep = 0; sm->setNext(GAME_STATE_PLAY_SEQUENCE_INDICATE_STEP); } break; } case GAME_STATE_PLAY_SEQUENCE_INDICATE_STEP: { doIndicateStep(currentStep); sm->setNext(GAME_STATE_PLAY_SEQUENCE_INDICATE_DELAY); break; } case GAME_STATE_PLAY_SEQUENCE_INDICATE_DELAY: { if( sm->getDuration() > STEP_DURATION ) { stepEnd(); currentStep++; if(currentStep >= currentLevel) { //All done, now handle player repeating this level sm->setNext(GAME_STATE_CHECK_SEQUENCE_PAUSE); } else { //Play next step in this sequence sm->setNext(GAME_STATE_PLAY_SEQUENCE_INDICATE_STEP); } } break; } case GAME_STATE_CHECK_SEQUENCE_PAUSE: { if( sm->getDuration() > 1000 ) { currentStep = 0; sm->setNext(GAME_STATE_CHECK_SEQUENCE); } break; } case GAME_STATE_CHECK_SEQUENCE: { if( sm->getDuration() > REPEAT_STEP_TO ) { Serial.println("Too slow!!!"); sm->setNext(GAME_STATE_GAME_OVER); } else { uint8_t playerKey = getInput(); if(playerKey != NO_KEY) { Serial.print("Key: "); Serial.println(playerKey); if(sequence[currentStep] == playerKey) { doIndicateStep(currentStep); sm->setNext(GAME_STATE_CHECK_SEQUENCE_INDICATE); } else { Serial.println("Wrong Key!!!"); Serial.print("Excpected: "); Serial.println(sequence[currentStep]); sm->setNext(GAME_STATE_GAME_OVER); } } } break; } case GAME_STATE_CHECK_SEQUENCE_INDICATE: { if( sm->getDuration() > STEP_DURATION ) { stepEnd(); currentStep++; if(currentStep >= currentLevel) { //All done, now handle player repeating this level currentLevel++; if(currentLevel > MAX_LEVEL ) { Serial.println("You won!!"); sm->setNext(GAME_STATE_GAME_OVER); } else { Serial.println("Level complete!!"); sm->setNext(GAME_STATE_PLAY_SEQUENCE_INIT); } } else { //Play next step in this sequence sm->setNext(GAME_STATE_CHECK_SEQUENCE); } } break; } case GAME_STATE_GAME_OVER: { if(sm->isStateEntered()) { indicateFail(); } else if(sm->getDuration() > 4000) { stepEnd(); sm->setNext(GAME_STATE_POR); } break; } case StateM::STATE_INVALID: default: { sm->setNext(GAME_STATE_POR); break; } } return retValue; }
void QSofaScene::reset() { SofaScene::reset(); emit stepEnd(); }
void QSofaScene::step() { SofaScene::step(_dt); emit stepEnd(); }