Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

//////////////////////////////////////////////////////////////////////////
//                              LevelupEffect.h
//
//      Does the level up effect, from the bouncing "LEVEL UP!" text to
//      the stats display and weird transition effects.
//////////////////////////////////////////////////////////////////////////


#ifndef __LEVELUP_EFFECT_H__
#define __LEVELUP_EFFECT_H__

#include "SexyAppFramework/Common.h"
#include "SexyAppFramework/Rect.h"

namespace Sexy
{

        class Graphics;


//////////////////////////////////////////////////////////////////////////
//      Represents a letter that bounces, used for the "LEVEL UP!" text.
//////////////////////////////////////////////////////////////////////////
struct BouncyChar
{
        SexyString              mChar;                          // The character bouncing
        bool                    mDone;                          // Completed bouncing yet?
        float                   mX, mY;                        
        float                   mBounceSpeed;           // How fast up or down it's bouncing, affected by "gravity"
        float                   mOldBounceSpeed;        // The base value that mBounceSpeed started at. Gets reduced over time.

        BouncyChar(SexyString t, float x, float y, float s)
        {mChar = t; mX = x; mY = y; mBounceSpeed = mOldBounceSpeed = s; mDone = false;}
};

//////////////////////////////////////////////////////////////////////////
//      Contains stat info to display after completing a level.
//////////////////////////////////////////////////////////////////////////
struct LevelupStats
{
        int             mPopulationEaten;
        int             mPercentComplete;
        int             mLevelCompleted;

        // Always 3 strings per planet:
        // Planet name, exports, population (comma delimited)
        std::vector<SexyString> mPlanetsEaten;
       
};

class LevelupEffect
{

        private:

                // States that the level up effect goes through
                enum
                {
                        LEVELUP_TEXT,                   // Displaying the bouncy LEVEL UP! text
                        CURTAIN_IN,                             // Moving the black "curtain" inward to cover up the level
                        CURTAIN_OUT,                    // Moving the red "curtain" out after above to reveal the stats
                        SHOWING_STATS,                  // Displaying level stats
                        COVERING_STATS,                 // Doing the weird transitionary cover-up screen after clicking to continue
                        FADE_OUT_STATS                  // Fading out the above screen
                };
               
                std::vector<BouncyChar> mText;                  // The letters that spell LEVEL UP!, as BouncyChar structures
                LevelupStats    mStats;                                 // Stat info to display
                bool                    mActive;                                // If true, means we're doing the level up sequence
                bool                    mDone;                                  // If done, means all finished and the next level can actually begin
                bool                    mStartNextLevel;                // When true, indicates that the board should set up the next level so that it'll be there when we fade out

                int                             mHue;                                   // For hue/saturation/luminence crazy weird flashing effect
                int                             mCurtainX;                              // X location of the black/red curtain edge (for the left curtain, the right is the same size)
                int                             mState;                                 // One of the above nums

                // When doing the COVERING_STATS phase, this is how wide 1/2 of the filled in part of the screen is. The other half
                // is the same size.
                int                             mCoverWidth;                   
                int                             mStripHeight;                   // For the above, we make strips quickly appear, alternating up/down filling

                // Indicates whether the strips are increasing Y (so strip comes from top) or decreasing
                // (so strip comes from bottom)
                int                             mStripSizeChange;
                int                             mFadeOutAlpha;                  // Alpha amount for the final fade out effect

                //////////////////////////////////////////////////////////////////////////
                //      Function: Init
                //
                //      Purpose: Sets up and initializes/resets all variables.
                //////////////////////////////////////////////////////////////////////////             
                void    Init();

        public:

                LevelupEffect();

                //////////////////////////////////////////////////////////////////////////
                //      Function: Update
                //      Parameters:
                //              theFrac -       Value from Board::UpdateF, used for smooth motion
                //
                //////////////////////////////////////////////////////////////////////////             
                void    Update(float theFrac);

                //////////////////////////////////////////////////////////////////////////
                //      Draw
                //////////////////////////////////////////////////////////////////////////             
                void    Draw(Graphics* g);

                //////////////////////////////////////////////////////////////////////////
                //      Function: Activate
                //      Parameters:
                //              ls      -       A stat structure containing the info for the past level
                //
                //      Purpose: Begins the level up sequence
                //////////////////////////////////////////////////////////////////////////             
                void    Activate(LevelupStats ls);

                //////////////////////////////////////////////////////////////////////////
                //      Function: DoneViewingStats
                //
                //      Purpose: Called by Board when the user clicks the mouse button,
                //      indicating that they want the stats screen to go away and have the
                //      next level begin.
                //////////////////////////////////////////////////////////////////////////             
                void    DoneViewingStats();

                //////////////////////////////////////////////////////////////////////////
                //      Function: StartNextLevel
                //      Returns: true or false, indicating if the next level can be started.
                //
                //      Purpose: Called by the Board's Update method, this returns true
                //      when the board should initialize the next level, so that when the
                //      level up effect fades out, the next level will appear underneath it.
                //      When the function returns true, it automatically sets internal variables
                //      so that the next time the function is called, it will return false,
                //      preventing the Board from accidentally initializing the same level
                //      multiple times. After the next call to Activate, it is allowed to
                //      return true again.
                //
                //      Once the screen is totally filled after closing the stats display,
                //      the Board is allowed to init the next level.
                //////////////////////////////////////////////////////////////////////////             
                bool    StartNextLevel();

                //////////////////////////////////////////////////////////////////////////
                //      Function: IsDone
                //      Returns: true or false indicating if the entire sequence is done
                //
                //      Purpose: Used to let the board know when playing of the next level
                //      can begin.
                //////////////////////////////////////////////////////////////////////////             
                bool    IsDone()                {return mDone;}

                //////////////////////////////////////////////////////////////////////////
                //      Function: IsActive
                //      Returns: true or false indicating if the sequence is running or not
                //////////////////////////////////////////////////////////////////////////             
                bool    IsActive()              {return mActive;}

                //////////////////////////////////////////////////////////////////////////
                //      Function: ShowingStats
                //      Returns: true or false indicating if the stats display is visible
                //////////////////////////////////////////////////////////////////////////
                bool    ShowingStats()  {return mState == SHOWING_STATS;}              

                //////////////////////////////////////////////////////////////////////////
                //      Function: HideBoard
                //      Returns: true or false indicating whether or not the board should
                //      hide all of its display stuff, except for the starfield which always
                //      displays.
                //////////////////////////////////////////////////////////////////////////             
                bool    HideBoard()             {return (mState == SHOWING_STATS) || (mState == CURTAIN_OUT) || (mState == COVERING_STATS);}

                //////////////////////////////////////////////////////////////////////////
                //      Function: HidePlanets
                //      Returns: true or false indicating if just the planets should be
                //      hidden.
                //
                //      Purpose: Used to hide the planets but still allow the rest of the
                //      game board to display. Used during the transtion to the stats
                //      display screen.
                //////////////////////////////////////////////////////////////////////////             
                bool    HidePlanets()   {return IsActive() && (HideBoard() || (mState == LEVELUP_TEXT) || (mState == CURTAIN_IN));}
};


}

#endif //__LEVELUP_EFFECT_H__