AniSubGameScene.h 4.68 KB
//
//  AniSubGameScene.h
//  SteveAndMaggieGame
//
//  Created by Katarzyna Kalinowska-Górska on 07/05/2019.
//

#ifndef AniSubGameScene_h
#define AniSubGameScene_h

#include "AniParentScene.h"
#include "audio/include/AudioEngine.h"
#include "AniGameLifeIndicatorView.h"
#include "AniSettingsLayer.h"
#include "AniAlertUtils.h"

class AniSubGameScene : public AniParentScene
{
public:
    
    static AniSubGameScene* createPlain(std::string layoutFilePath);
    
    class GameCreator {
        public:
            virtual AniSubGameScene* createGameScene(int gameId,std::string layoutFilePath) = 0;
    };
    
    virtual void onEnter() override;
//    virtual void onExit() override;
//    virtual void onEnterTransitionDidFinish() override;
    
    
    virtual bool initWithConfiguration(std::string layoutFilePath);
    virtual ~AniSubGameScene();
    
    bool isPaused(){return m_pauseState == PauseState::PAUSED;}
    
    virtual void pauseGame() { m_pauseState = PauseState::PAUSED; }
    virtual void resumeGame() { m_pauseState = PauseState::RUNNING; }
    virtual void presentGameResumeLayer();
    
    enum class PauseState {
           RUNNING,
           PAUSED
       };
    
protected:
    
    enum class PlayState
    {
        INIT,
        PRE_PLAYING,
        PLAYING,
        CHANGING_LEVEL,
        LOST,
        WON
    };
    
    enum class ItemType : int {
        NONE = 0,
        ONE = 1,
        TWO = 2,
        THREE = 3,
        FOUR = 4
    };
    
    class Item {
    public:
        cocos2d::Sprite* sprite;
        cocos2d::Rect rect;
        ItemType type;
        
        bool operator==(const Item& item2) {
            if(sprite == nullptr || item2.sprite == nullptr){
                return false;
            }
            return sprite->getTag() == item2.sprite->getTag();
        }
        
        virtual ~Item(){
            if(sprite != nullptr){
                sprite->removeFromParent();
            }
        }
    };
    
    // state variables
    class GameState {
        public:
            PlayState playState;
        bool settingsMenuShown { false};
        bool resumeLayerShown { false};
            bool tosAcceptMenuShown;
            std::map<int, Item*> items;
            int currentLevel;
            int currentItemTypeIndex;
            std::vector<ItemType> itemTypeOrder; //the order of the types to catch (shuffled randomly at the beginning of each level)
            bool itemVanishingMode;
            float timeCount;
            float lossTimeCount;
            bool lossHalfTime;
            int wrongItemCount;
        virtual ~GameState(){}
    };
    
    PauseState m_pauseState { PauseState::RUNNING };
    GameState* gameState;
    AniSettingsLayer* m_settingsMenu;
    AniGameLifeIndicatorView* lifeIndicatorView;
    
    virtual void prepareSettingsMenu();
    virtual void showSettingsMenu(bool animated = true);
    virtual void hideSettingsMenu(bool animated = true); //TODO move all these to an interface maybe?
    virtual void hideSettingsMenuWithLevelReset() { hideSettingsMenu(); }
    virtual void hideSettingsMenuWithTutorialReset() { hideSettingsMenu(); }
    virtual void moveSettingsButtonToFront(int localZOrder);

    virtual GameState* createGameState();
    virtual void removeGameState();
    virtual void clearGameState();
    virtual void clearAllItems();
    
    virtual bool touchHandlerForWidget(std::string objectName, cocos2d::ui::Widget::TouchEventType touchEventType) override;
    virtual bool onPrevLevelButtonClicked();
    virtual bool onReplayButtonClicked();
    virtual bool onNextLevelButtonClicked();
    virtual bool onFastForwardButtonClicked();
        
    virtual void startGame(bool playIntro = true) {}
    virtual void gameWon();
    virtual void gameLost();
    virtual void resetGame();
    virtual void reloadLayoutClean() override;
    
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

        cocos2d::EventListenerKeyboard* _keyboardListener;

        void addBackButtonListener(){
            _keyboardListener = cocos2d::EventListenerKeyboard::create();
            _keyboardListener->onKeyReleased = [&](cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event){
                if(keyCode == cocos2d::EventKeyboard::KeyCode::KEY_BACK){
                if(!gameState->settingsMenuShown && !gameState->tosAcceptMenuShown){
                    pauseGame();
                    AniAlertUtils::showAppCloseConfirmDialog([&](){
                        resumeGame();
                    });
                    }
                }
            };
            cocos2d::Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(_keyboardListener, this);
        }
    #endif
};

#endif /* AniSubGameScene_h */