AniAdventureScene.h 8.32 KB
//
//  AniAdventureScene.h
//  SteveMaggieCpp
//
//  Created by Katarzyna Kalinowska-Górska on 18.06.2017.
//
//

#ifndef AniAdventureScene_h
#define AniAdventureScene_h

#include "AniSubGameScene.h"
#include "AniMapUtils.h"
#include "AniMiscUtils.h"
#include "AniMapLayer.h"
#include "AniGameConfigParser.h"
#include "IMapAdventureObject.h"
#include "AniBasicSteveMapCharacterController.h"
#include "AniSteveCharacter.h"
#include "AniProgressSliderNode.h"
#include "AniGardenMapController.h"
#include "AniTutorialMapControl.h"
#include "AniGameStaticCreator.h"

class AniAdventureScene : public AniSubGameScene, public IMapLayerDelegate, public IMapLayerDataSource, AniBasicSteveMapCharacterControllerDelegate, IMapCharacterSoundSource, TutorialDataSource, TutorialDelegate {

public:
    
    static std::string layoutFileForCurrentLevel(){
        return AniMiscUtils::lastLevel() == AniMiscUtils::Level::CHILD ? "graphics/game_map/baby_level/scene_layout_baby.scl" : "graphics/game_map/scene_layout.scl";
    }
    
    struct LevelConfig {
        float levelTime;
    };
    
    struct FItem {
        int itemId;
        std::string mapAdvObjectName;
        std::string soundRequest;
        std::string soundConf;
        std::string soundNo;
        std::string soundTooLate;
    };
    
    struct GameConfig {
        std::vector<LevelConfig> levelConfigs;
        std::vector<FItem> items;
    };
    
    struct AdventureGameState {
        std::vector<int> itemsOrder;
        int currentItem;
        float currentTimeSeconds;
        int score {0};
        std::vector<std::string> alreadyCollectedWrongObjects;
    };
    
        static AniAdventureScene* create(int pGameId, std::string layoutFilePath, std::function<void(GameConfig&)> gameConfigParser);
        virtual bool initWithConfiguration(int pGameId, std::string layoutFilePath, std::function<void(GameConfig&)> gameConfigParse);
        virtual void onEnter() override;
        virtual ~AniAdventureScene();
    virtual void clearGameState() override;
    void markShouldReplayTutorial() { m_replayingTutorial = true; m_shouldDisplayHintForLogLadder = true; }
    
    // map layer setup & delegate
    virtual IMapControl* initAllocMapControl() override;
    virtual IMapControlCoordinator* initAllocMapControlCoordinator() override;
    virtual IMapAdventureObjectMapper* initAllocAdventureObjectMapper() override;
    virtual std::vector<IMapCharacter*> createAutoreleasedMapCharacters() override;
    virtual std::vector<IMapCharacterController*> initAllocMapCharacterControllers() override;
    virtual IMapController* initAllocMapController(cocos2d::TMXTiledMap* p_map, IMapAdventureObjectMapper* p_mapper) override;
    
    virtual void onMapAdventureObjectEvent(IMapAdventureObject* p_object, IMapAdventureObjectEvent* event) override;
    virtual void onCharacterFinishedIntroFalling(IMapCharacter* character) override;
    
    // character controller delegate
    virtual bool isRightPickUpItem(MapAdventureObjectPickupItem* item) override;
    virtual bool isBonusPickUpItem(MapAdventureObjectPickupItem* item) override;
    virtual void onRightItemPickedUp(MapAdventureObjectPickupItem* item) override;
    virtual void onWrongItemPickUpTry(MapAdventureObjectPickupItem* item) override;
    virtual void onBonusItemPickUp(MapAdventureObjectPickupItem* item) override;
    virtual void onApproachedRotatingItem(MapAdventureObjectRotatingEnd* object) override;
    virtual void onFinishedRotatingItem(MapAdventureObjectRotatingEnd* object) override;
    virtual void onCancelledRotatingItem(MapAdventureObjectRotatingEnd* object) override;
    virtual bool shouldApproachItem(IMapAdventureObject* item, AniMapUtils::TileData pressedTileCoords) override;
    
    // IMapCharacterSoundSource
    virtual bool shouldPlayBoredSound(IMapCharacter* p_mapCharacter) override { return true; };
    
    virtual std::string soundFilePathBored(IMapCharacter* p_mapCharacter) override;
    
protected:
    AniTutorialMapControl* m_tutorialMapControl {nullptr};
    AniTouchRecognizerMapControl* m_mainMapControl {nullptr};
    AniGardenMapController* m_gardenMapController {nullptr};
    AniBasicSteveMapCharacterController* m_characterController {nullptr};
    AniSteveCharacter* m_steve {nullptr};
    GameConfig gameConfig;
    AdventureGameState advGameState;
    std::vector<MapAdventureObjectPickupItem*> m_stars;
    AniGameStaticCreator gameCreator;
    
    AniMapLayer* _mapLayer;
    AniProgressSliderNode* m_progressSliderNode {nullptr};
    bool m_tutorialRunning {false};
    bool m_shouldDisplayHintForLogLadder {false};
    bool shouldPlayIntro { true};
    cocos2d::Sprite* m_finger {nullptr};

    virtual void initAfterLayoutLoad();
    virtual void prepareBgMusicButton();
    virtual void showZoomButton();
    
    virtual void startGame(bool playIntro = true) override;
    virtual void startTutorial();
//
    void spawnSteveAndStartGame();
    virtual void pauseGame() override;
    virtual void resumeGame() override;
    virtual void resetGame() override;
    virtual void gameLost() override;
    virtual bool onFastForwardButtonClicked() override;
    
    void increaseScore(int by, bool animated = true);
    void decreaseScore(int by, bool animated = true);
    
    void shuffleObjectsIfRequired();
    void stopAnimatingStars();
    void animateStars();
    
    virtual void hideSettingsMenuWithLevelReset() override;
    virtual void hideSettingsMenuWithTutorialReset() override;
    virtual void showSettingsMenu(bool animated = true) override;
    virtual void hideSettingsMenu(bool animated = true) override;
    
    inline const FItem& currentItem(){ return gameConfig.items[advGameState.itemsOrder[advGameState.currentItem]];}
    
    void nextItem();
    
    void startTimer();
    void stopTimer();
    void onSecondElapsed(float dt);
    
    void multipleStarAnimation(cocos2d::Vec2 startPosition, int count);
    void starAnimation(cocos2d::Vec2 startPosition);
    void basketShakeAnimation();
    
    bool tutorialComplete();
    void saveTutorialComplete();
    bool logLadderTutorialComplete();
    void saveLogLadderTutorialComplete();
    
    bool m_replayingTutorial {false};
    std::string tut_firstItemToFind(){ return "pickUpItem8Wolf"; };
    
    // TutorialDataSource
    virtual std::string soundPathForPhaseMove(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) override;
    virtual cocos2d::Point mapPointForMoveSteveFinger(AniTutorialMapControl* p_mapControl) override;
    virtual std::vector<AniMapUtils::TileData> mapTilesForMoveSteveEnd(AniTutorialMapControl* p_mapControl) override;
    virtual std::string soundPathForPhaseTapObject(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) override;
    virtual cocos2d::Point mapPointForTapObjectFinger(AniTutorialMapControl* p_mapControl) override;
    virtual std::string soundPathForPhaseJumpUp(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) override;
    virtual std::string soundPathForPhaseJumpDown(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) override;
    virtual std::string soundPathForPhaseJumpLeft(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) override;
    virtual std::string soundPathForPhaseJumpRight(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) override;
    virtual std::string soundPathForPhaseTickle(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) override;
    virtual std::string soundPathForPhaseMoveMap(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) override;
    virtual std::string soundPathForPhaseTapToFinishMovingMap(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) override;
    virtual std::string soundPathForTutorialFinished(AniTutorialMapControl* p_mapControl, int& soundDurationSecs) override;
    virtual cocos2d::Vec2 cancelZoomButtonPosition(AniTutorialMapControl* p_mapControl) override;
    
    // TutorialDelegate
    virtual void tutorialFinished(AniTutorialMapControl* p_mapControl) override;
    virtual bool touchHandlerForWidget(std::string objectName, cocos2d::ui::Widget::TouchEventType touchEventType) override;
    
    void displayMovingHintFinger(cocos2d::Point fromPoint, cocos2d::Point toPoint, float delay);
    void displayMovingHintFinger(cocos2d::Point fromPoint, cocos2d::Point toPoint);
    void cancelMovingHintFinger();
    void cancelZoomMode();
    void presentEndScene(float t);
};

#endif /* AniAdventureScene_h */