AniMapLayer.h 5.14 KB
//
//  AniMapLayer.h
//  SteveMaggieCpp
//
//  Created by Katarzyna Kalinowska-Górska on 17.05.2017.
//
//

#ifndef AniMapLayer_h
#define AniMapLayer_h

#include "cocos2d.h"
#include "IMapImageObject.h"
#include "AniMapUtils.h"
#include "AniScenarioObject.h"
#include "IMapAdventureObjectMapper.h"
#include "IMapController.h"
#include "IMapControl.h"
#include "IMapControlCoordinator.h"
#include "IMapCharacterController.h"
#include "IMapCharacter.h"

class IMapLayerDataSource
{
public:
    // virtual initializers. All these will be deleted here in the map layer;
    virtual IMapControl* initAllocMapControl() = 0;
    virtual IMapControlCoordinator* initAllocMapControlCoordinator() = 0;
    virtual IMapAdventureObjectMapper* initAllocAdventureObjectMapper() = 0;
    virtual std::vector<IMapCharacter*> createAutoreleasedMapCharacters() = 0;
    // controller at [i] corresponds to a character at [i]
    virtual std::vector<IMapCharacterController*> initAllocMapCharacterControllers() = 0;
    virtual IMapController* initAllocMapController(cocos2d::TMXTiledMap* p_map, IMapAdventureObjectMapper* p_mapper) = 0;
};

class IMapLayerDelegate
{
public:
    virtual void onMapAdventureObjectEvent(IMapAdventureObject* p_object, IMapAdventureObjectEvent* event){};
    virtual void onCharacterFinishedIntroFalling(IMapCharacter* character) {};
};

class AniMapLayer : public cocos2d::LayerColor, public AniScenarioObject, public IMapAdventureObjectDelegate {

    public:
  
        // creating / destructing
        static AniMapLayer* create(const std::string& resFolder, const std::string& mapPath, const rapidjson::Value* objects = NULL);
        bool init(const std::string& resFolder, const std::string& mapPath, const rapidjson::Value* objects = NULL);
        virtual ~AniMapLayer();
    
        // overrides
    
        virtual void onEnter() override;
        virtual void onExit() override;
        virtual void update(float) override;
    
        // setup
    
    virtual void setup(IMapLayerDataSource* p_dataSource);
    
    virtual cocos2d::Layer* addLayer(cocos2d::TMXTiledMap* p_parentMap);
    virtual void addObjectLayers(cocos2d::TMXTiledMap* p_parentMap, const rapidjson::Value* objectsData);
    virtual void fillObjects(cocos2d::TMXTiledMap* p_parentMap, const rapidjson::Value* externalObjectsData);
    void addNewObject(IMapImageObject* m_mapImageObject); //adds to object layer
    
    virtual void reallocMapControl();
    virtual void installMapControl(IMapControl* p_newMapControl);
    
        // character- related
    
    virtual void setChooseRandomSpawnTile(bool chooseRandom);
    virtual void setSpawnTile(int col, int row);
    
        // tiles and movement-related
    
//        virtual void setColumnImpassable(int column, bool recalculateMap = true);
//        virtual void setTileImpassable(AniMapUtils::TileData tile, bool recalculateMap = true);
//        virtual void setCutRightOnColumn(int column);
    
    
        // set delegate
    
        inline void setAniMapLayerDelegate(IMapLayerDelegate* p_delegate){ m_delegate = p_delegate; }
    
    IMapController* getMapController() const {
        return m_mapController;
    }
    
// Adv object deelgate
    virtual void onMapAdventureObjectEvent(IMapAdventureObject* p_object, IMapAdventureObjectEvent* event) override;
    virtual void onOccupiedTilesDataChanged(IMapAdventureObject* p_object) override;
    virtual void onBlockedTilesDataChanged(IMapAdventureObject* p_object, std::vector<AniMapUtils::TileData> p_oldBlockedTiles, std::vector<AniMapUtils::TileData> p_newBlockedTiles) override;
    
    virtual void spawnCharacters();
    virtual void clearCharacters();
    bool fastForwardCharacterFall();
    
        // friends
    
        friend class DemoHandler;
    
protected:
    IMapLayerDelegate* m_delegate {nullptr};
    IMapLayerDataSource* m_dataSource {nullptr};
    
    IMapControl* m_mapControl {nullptr};
//    IMapControlCoordinator* m_mapControlCoordinator {nullptr};
    
// constants
    const AniMapUtils::TileData DefaultSpawnTile = AniMapUtils::TileData(0,0);
    
// map
    IMapAdventureObjectMapper* m_adventureObjectMapper;
    IMapController* m_mapController;
    void deleteMap();
    void setupDarkness(float p_alpha);
    
// characters
    std::vector<IMapCharacter*> m_mapCharacters;
    std::vector<IMapCharacterController*> m_mapCharacterControllers;
    void attachCharacterControllers();
    void attachMapControllerToCharacterControllers(IMapController* p_mapController);
    IMapCharacter* m_playerCharacter;
    
        std::string _resFolder;
        std::vector<cocos2d::Layer*> _objectLayers;
        std::map<std::string, cocos2d::Node*> _allObjects;
        int _defaultCharacterDepth;
    bool _chooseRandomSpawnTile {false};
    AniMapUtils::TileData m_spawnTile {DefaultSpawnTile};
    
        std::map<std::string, IMapImageObject*> m_mapImageObjects; //temp
        
        float _backgroundScale;
        
    
        // deletion
    void deleteMapControlObjects();
        void deleteMapAdventureObjectMapper();
    void deleteMapCharacterControllers();
    
    #ifdef DEBUG_MAP_OBJECT_DRAG_AROUND
        cocos2d::Node* _draggedObject;
    #endif
};

#endif /* AniMapLayer_h */