예제 #1
0
void EngineStage::activatePerformSingleTap(float x, float y)
{
    switch (stageState)
    {
        case STAGE_STATE_INIT:
            break;
        case STAGE_STATE_RUNNING:
        {
            std::string queryGUI = hud->queryButtons(Vector2(x, y));
            
            if (queryGUI == "powerup1")
                player->performPowerUp("TractorBeam");
            else if (queryGUI == "powerup2")
                player->performPowerUp("Shields");
            else if (queryGUI == "powerup3")
                player->performPowerUp("TimeWarp");
            else if (queryGUI == "toggle1")
            {
                if (tunnel && tunnel->isMultiCollectionTask())
                {
                    // Bad hack but
                    // Don't show 3-Back for multi-collection tasks of 1 or less.
                    if (player->getLevelRequestRow() > 0)
                        player->setToggleBack(0);
                    tunnel->respondToToggleCheat();
                }
            }
            else if (queryGUI == "toggle2")
            {
                if (tunnel && tunnel->isMultiCollectionTask())
                {
                    player->setToggleBack(1);
                    tunnel->respondToToggleCheat();
                }
            }
            else if (queryGUI == "toggle3")
            {
                if (tunnel && tunnel->isMultiCollectionTask())
                {
                    player->setToggleBack(2);
                    tunnel->respondToToggleCheat();
                }
            }
            else if (queryGUI == "toggle4")
            {
                if (tunnel && tunnel->isMultiCollectionTask())
                {
                    player->setToggleBack(3);
                    tunnel->respondToToggleCheat();
                }
            }
            else if (queryGUI == "pause")
            {
                setPause(true);
                stageState = STAGE_STATE_PROMPT;
            }
            break;
        }
        case STAGE_STATE_PAUSE:
        {
            std::string queryGUI = hud->queryButtons(Vector2(x, y));
            
            if (queryGUI == "toggle1")
            {
                if (tunnel && tunnel->isMultiCollectionTask())
                {
                    // Bad hack but
                    // Don't show 3-Back for multi-collection tasks of 1 or less.
                    if (player->getLevelRequestRow() > 0)
                        player->setToggleBack(0);
                    tunnel->respondToToggleCheat();
                }
            }
            else if (queryGUI == "toggle2")
            {
                if (tunnel && tunnel->isMultiCollectionTask())
                {
                    player->setToggleBack(1);
                    tunnel->respondToToggleCheat();
                }
            }
            else if (queryGUI == "toggle3")
            {
                if (tunnel && tunnel->isMultiCollectionTask())
                {
                    player->setToggleBack(2);
                    tunnel->respondToToggleCheat();
                }
            }
            else if (queryGUI == "toggle4")
            {
                if (tunnel && tunnel->isMultiCollectionTask())
                {
                    player->setToggleBack(3);
                    tunnel->respondToToggleCheat();
                }
            }
            else if (queryGUI == "pause")
            {
                setPause(true);
                stageState = STAGE_STATE_PROMPT;
            }
            else if (queryGUI == "go")
            {
                stageState = STAGE_STATE_RUNNING;
                setPause(false);
            }
            break;
        }
        case STAGE_STATE_PROMPT:
        {
            std::string queryGUI = hud->queryButtons(Vector2(x, y));
            
            if (queryGUI == "resume")
            {
                // If game hasn't started yet, go back to init prompt
                // Otherwise, go to gameplay
                if (hud->isGoButtonActive())
                {
                    stageState = STAGE_STATE_PAUSE;
                    if (player->hasTriggeredStartup() && player->getStartMusicTimer() <= 0.0)
                        player->playMusic();
                }
                else if (!tunnel->needsCleaning())
                {
                    setPause(false);
                    stageState = STAGE_STATE_RUNNING;
                }
            }
            else if (queryGUI == "next")
            {
                LevelSet* levels = player->getLevels();
                int row = player->getLevelRequestRow();
                int col = player->getLevelRequestCol();
                int level = levels->getLevelNo(row, col);
                int nlevel = ((level + 1) % NUM_TASKS) != 5 ? level + 1 : level + 2;
                if (player->isLevelAvailable(nlevel))
                {
                    row = levels->getLevelRow(nlevel);
                    col = levels->getLevelCol(nlevel);
                    player->setLevelRequest(row, col);
                    stageState = STAGE_STATE_INIT;
                    
                    setPause(false);
                    OgreFramework::getSingletonPtr()->m_pSoundMgr->stopAllSounds();
                }
            }
            else if (queryGUI == "restart")
            {
                stageState = STAGE_STATE_INIT;
                
                setPause(false);
                OgreFramework::getSingletonPtr()->m_pSoundMgr->stopAllSounds();
            }
            else if (queryGUI == "levelselect")
            {
                stageState = STAGE_STATE_DONE;
                
                setPause(false);
                OgreFramework::getSingletonPtr()->m_pSoundMgr->stopAllSounds();
            }
            break;
        }
        case STAGE_STATE_DONE:
            break;
    }
}
예제 #2
0
void HudStage::update(float elapsed)
{
    std::string GUIToggleNumber = "General/GUIToggleTextNumber";
    toggle1TextArt->setMaterialName(GUIToggleNumber + Util::toStringInt(tunnel->getNBack() % 10));
    toggle2TextArt->setMaterialName(GUIToggleNumber + Util::toStringInt(Util::clamp((tunnel->getNBack() - 1) % 10, 0, tunnel->getNBack())));
    toggle3TextArt->setMaterialName(GUIToggleNumber + Util::toStringInt(Util::clamp((tunnel->getNBack() - 2) % 10, 0, tunnel->getNBack())));
    // toggle4 is always n-back 0
    
    if (!tunnel->needsCleaning())
        resumeButtonBackground->setMaterialName("General/ResumeButtonRound");
    else
        resumeButtonBackground->setMaterialName("General/ResumeButtonRoundGRAY");
    
    LevelSet* levels = player->getLevels();
    int levelRow = player->getLevelRequestRow();
    int levelCol = player->getLevelRequestCol();
    int level = levels->getLevelNo(levelRow, levelCol);
    if (player->isLevelAvailable(level + 1))
        nextButtonBackground->setMaterialName("General/NextButtonRound");
    else
        nextButtonBackground->setMaterialName("General/NextButtonRoundGRAY");
    
    if( player->winFlag ) {
        setOverlay(3, true);
        
        tunnel->addToTimePenalty(2.0f);
        float timeLeft = tunnel->getStageTime() - tunnel->getTotalElapsed() - tunnel->getTimePenalty();
        
        if( timeLeft < 0.0f && timeLeft > -1.0f) player->setScore(player->getScore()+100.0f);
        else if( timeLeft > 0.0f ) player->setScore(player->getScore()+200.0f);
        
        label2->setColour(ColourValue(1.0,1.0,0.0));
        label5->setColour(ColourValue(1.0,1.0,0.0));
        
        label2->setCaption(Util::toStringInt(timeLeft));
        endTallyTimeLabel->setCaption("Time  " + Util::toStringInt(timeLeft));
        
        label5->setCaption(Util::toStringInt(player->getScore()));
        
        endTallyScoreLabel->setCaption(Util::toStringInt(player->getScore()) + "  Score");
        
        if( timeLeft <= 0.0f ) {
            label2->setCaption("0");
            endTallyTimeLabel->setCaption("Time  0");
            tunnel->setCleaning(true);
            player->winFlag = false;
        }
        
        return;
    }
    if( tunnel->isDone() ) return;
    
    
    float timeLeft = fmax(tunnel->getStageTime() - tunnel->getTotalElapsed() - tunnel->getTimePenalty(), 0.0f);

    label1->setCaption(globals.messageBig);
    Ogre::ColourValue fontColor = timeLeft <= 0.0 ? ColourValue(1.0, 0.0, 0.0) : ColourValue(1.0, 1.0, 1.0);
    label2->setColour(fontColor);
    label2->setCaption(Util::toStringInt(timeLeft));

    if (tunnel->getMode() == STAGE_MODE_RECESS)
        label3->setCaption(Util::toStringInt(tunnel->getPercentComplete() * 100) + "%");
    else
        label3->setCaption("");
    
    label4->setCaption(Util::toStringInt(player->getBaseSpeed()));
    if (player->hasTriggeredStartup())
    {
        speedSlider->setBallDestination(player->getBaseSpeed());
        speedSlider->update(elapsed);
    }
    speedSlider->adjust();
    
    label5->setCaption(Util::toStringInt(player->getScore()));
    label6->setCaption(globals.message);
    label7->setCaption("");
    
    if( player->isPowerUpActive("TimeWarp") ) {
        TimeWarp* t = (TimeWarp*)player->getPowerUpPtr("TimeWarp");
        
        if( t->zoomIn == 0 ) {
            setOverlay(2, false);
            timeWarpLabel->setCharHeight(0.05 * FONT_SZ_MULT);
            timeWarpContainer->setPosition(0.50, 0.15);
        }
        else if( t->zoomIn == 1 ) {
            setOverlay(2, true);
            timeWarpLabel->setCharHeight(timeWarpLabel->getCharHeight()-0.0005 * FONT_SZ_MULT);
            //timeWarpContainer->setPosition(timeWarpContainer->getLeft()+0.001 * FONT_SZ_MULT, timeWarpContainer->getTop()+0.0005 * FONT_SZ_MULT);
        }
        else {
            setOverlay(2, true);
            label2->setColour(ColourValue(1.0,1.0,0.0));
            label2->setCharHeight(0.030 * FONT_SZ_MULT);
        }
        
        std::string val;
        if( t->currentTimeVal < 10 ) val = " "+Util::toStringInt(t->currentTimeVal);
        else val = Util::toStringInt(t->currentTimeVal);
        
        timeWarpLabel->setCaption("+" + val + " Seconds");
    }
    else {
        setOverlay(2, false);
        label2->setColour(ColourValue(1.0,1.0,1.0));
        label2->setCharHeight(0.025 * FONT_SZ_MULT);
    }
    
    
    // Set Progress Bar indicator position for the appropriate mode
    float barWidth = barHP->getWidth();
    if (tunnel->getMode() == STAGE_MODE_PROFICIENCY)
    {
        float HPRange = globals.HPPositiveLimit - globals.HPNegativeLimit + 1;
        //indicator->setPosition(barHP->getLeft() + barWidth * player->getProgress(), indicator->getTop());
        indicator->setPosition(barHP->getLeft() + barWidth * (player->getHP() - globals.HPNegativeLimit) / HPRange, indicator->getTop());
    }
    
    switch (player->getToggleBack())
    {
        case 0:
            toggleIndicator->setPosition(0.897, 0.31);
            break;
        case 1:
            toggleIndicator->setPosition(0.897, 0.43);
            break;
        case 2:
            toggleIndicator->setPosition(0.897, 0.55);
            break;
        case 3:
            toggleIndicator->setPosition(0.897, 0.67);
            break;
    }
    
    if (player->isPowerUpAvailable("TractorBeam"))
        buttons[BUTTON_POWERUP1].backgroundRef->setMaterialName("General/GUIPowerupButton2");
    else
        buttons[BUTTON_POWERUP1].backgroundRef->setMaterialName("General/GUIPowerupButtonBlank");
    if (player->isPowerUpAvailable("Shields"))
        buttons[BUTTON_POWERUP2].backgroundRef->setMaterialName("General/GUIPowerupButton0");
    else
        buttons[BUTTON_POWERUP2].backgroundRef->setMaterialName("General/GUIPowerupButtonBlank");
    if (player->isPowerUpAvailable("TimeWarp"))
        buttons[BUTTON_POWERUP3].backgroundRef->setMaterialName("General/GUIPowerupButton1");
    else
        buttons[BUTTON_POWERUP3].backgroundRef->setMaterialName("General/GUIPowerupButtonBlank");
    
    std::vector<CollectionCriteria> criterias = tunnel->getCollectionCriteria();
    for (int i = 0; i < collectionBar.size(); ++i)
    {
        if (i < criterias.size())
        {
            std::string scoreName = "General/GUICollection";
            
            // For togglebacks
            //if (criterias[i].nback <= 0)
            //    scoreName += Util::toStringInt(0);
            //else
            //    scoreName += Util::toStringInt(Util::clamp(3 - (tunnel->getNBack() - criterias[i].nback), 0, 3));
            
            // For just a single n-back and task
            switch (tunnel->getPhase())
            {
                case 'A':
                    scoreName += "0";
                    break;
                case 'B':
                    scoreName += "1";
                    break;
                case 'C':
                    scoreName += "2";
                    break;
                case 'D':
                    scoreName += "3";
                    break;
                default:
                    scoreName += "0";
                    break;
            }
            
            if (criterias[i].collected)
                scoreName += "Filled";
            else
                scoreName += "Blank";
            collectionBar[i]->setMaterialName(scoreName);
        }
        else
        {
            collectionBar[i]->setMaterialName("General/GUICollectionGreyed");
        }
    }
}