ToyActionParser.h 5.48 KB
//
//  ToyActionParser.h
//  SteveMaggieCpp
//
//  Created by Katarzyna Kalinowska-Górska on 26.05.2017.
//
//

#ifndef ToyActionParser_h
#define ToyActionParser_h

#include <stdio.h>
#include "cocos2d.h"
#include "json/document.h"
#include "TouchHandlerTypes.h"
#include "ToyScenarioObject.h"
#include "ToyRepeatedActionScheduler.h"
#include "ToySimpleValue.h"

class ActionParseDelegate {

    public:
        virtual ToyScenarioObject* getObjectByName(std::string objectName) = 0;
        virtual ToyScenarioObject* getDefaultObjectForAction(std::string actionType) = 0;
        virtual ToyScenarioObject* getDefaultObjectForConditionCheck() = 0;
        virtual void addNewObject(std::string objectName, ToyScenarioObject* newObject) = 0;
        virtual std::string getDefaultSoundsPath() = 0;
        virtual std::string getAlternativeSoundsPath() = 0;
        virtual std::string getToyValueStorageContainerName() = 0;
        virtual void runAction(cocos2d::Action* action) = 0;
        virtual void actionFinished(const rapidjson::Value& jsonActionObject) = 0;
        virtual void runInstantly(std::function<void()> actionFunction) = 0;
        virtual void runCompletingAction(cocos2d::Action* action) = 0;
        virtual void cancelAllCompletingActions() = 0;
        virtual void schedule(std::function<void(float)> callback, std::string key, float delay) = 0;
        virtual void scheduleOnce(std::function<void(float)> callback, float delay, std::string key) = 0;
        virtual void unschedule(std::string key) = 0;
        virtual void newTouchHandler(std::string key, TouchHandlerFunction touchHandler, TouchHandlerType touchType) = 0;
        virtual void removeTouchHandler(std::string key, TouchHandlerType touchType) = 0;
        virtual long long getLastScreenTouchTime() = 0;
        virtual int getLoopActionCounter(std::string loopId) = 0;
        virtual int addNewLoopActionCounter(std::string loopId, int timesRepeated) = 0;
        virtual int decrementLoopActionCounter(std::string loopId) = 0;
        virtual void deleteLoopActionCounter(std::string loopId) = 0;
        virtual void setLastActionIndex(int index) = 0;
        virtual unsigned int removeStoredSoundId(std::string soundPath) = 0;
        virtual void storeSoundId(std::string soundPath, unsigned int newSoundId) = 0;
};

class ToyActionParser {

    public:

        //TODO: actually this DEFINITELY should not be a singleton
        static ToyActionParser& getInstance()
        {
            static ToyActionParser instance;
            return instance;
        };

        ToyActionParser(){
            _valueStorage = new (std::nothrow) rapidjson::Document();
        };
    
        ~ToyActionParser(){
            if(_valueStorage){
                delete _valueStorage;
            }
        }

        cocos2d::Action* parseJSONAction(const rapidjson::Value& jsonActionObject, ActionParseDelegate* parseDelegate, bool notifyDelegateWhenFinished = true);
        void cleanUp(ActionParseDelegate* delegate);
    
        static std::vector<cocos2d::Node*> convertToNodeArray(std::vector<ToyScenarioObject*> objects);
        static cocos2d::Node* convertToNode(ToyScenarioObject* object);
    
        ToyScenarioObject* parseObject(std::string objectName, ActionParseDelegate* parseDelegate);
        std::vector<ToyScenarioObject*> parseObjects(const rapidjson::Value& objectJsonArray, ActionParseDelegate* parseDelegate);
        std::vector<ToyScenarioObject*> parseObjectOrObjects(const rapidjson::Value& jsonObject, std::string objectKey, std::string objectsKey, ActionParseDelegate* parseDelegate);
    
        friend class ToySimpleActionParser;
        friend class ToyBlockingActionParser;
        friend class DynamicObjectMapper;
        friend class ToyRepeatedActionScheduler;
        
    protected:
    
        rapidjson::Document* _valueStorage;

    
        cocos2d::Action* parseConditionalAction(const rapidjson::Value& jsonActionObject, ActionParseDelegate* parseDelegate, bool notifyDelegateWhenFinished);
        cocos2d::Action* parseRandomAction(const rapidjson::Value& jsonActionObject, ActionParseDelegate* parseDelegate, bool notifyDelegateWhenFinished);
        cocos2d::Action* parseSequenceAction(const rapidjson::Value& jsonActionObject, ActionParseDelegate* parseDelegate, bool notifyDelegateWhenFinished);
        cocos2d::Action* parseSpawnAction(const rapidjson::Value& jsonActionObject, ActionParseDelegate* parseDelegate, bool notifyDelegateWhenFinished);
        cocos2d::Action* parseLoopAction(const rapidjson::Value& jsonActionObject, ActionParseDelegate* parseDelegate, bool notifyDelegateWhenFinished);
        cocos2d::Action* embedFunctionInAction(std::function<void()> actionFunction, const rapidjson::Value& jsonActionObject, ActionParseDelegate* parseDelegate, bool notifyDelegateWhenFinished);
        bool checkCondition(std::string condition, ActionParseDelegate* parseDelegate);
        bool checkExpression(std::string leftValue, std::string rightValue, std::string operatorString);
        std::vector<ToyScenarioObject*> prepareObjectsForAction(const rapidjson::Value& jsonActionObject, ActionParseDelegate* parseDelegate);
        void parseAndRunActions(const rapidjson::Value& actionsArray, ActionParseDelegate* parseDelegate, bool notifyDelegateWhenFinished);
        void parseAndRunAction(const rapidjson::Value& action, ActionParseDelegate* parseDelegate, bool notifyDelegateWhenFinished);
        bool checkLateCondition(const rapidjson::Value& jsonActionObject, ActionParseDelegate* parseDelegate);
};

#endif /* ToyActionParser_h */