// // ToyActionParser.h // SteveMaggieCpp // // Created by Katarzyna Kalinowska-Górska on 26.05.2017. // // #ifndef ToyActionParser_h #define ToyActionParser_h #include #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 actionFunction) = 0; virtual void runCompletingAction(cocos2d::Action* action) = 0; virtual void cancelAllCompletingActions() = 0; virtual void schedule(std::function callback, std::string key, float delay) = 0; virtual void scheduleOnce(std::function 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 convertToNodeArray(std::vector objects); static cocos2d::Node* convertToNode(ToyScenarioObject* object); ToyScenarioObject* parseObject(std::string objectName, ActionParseDelegate* parseDelegate); std::vector parseObjects(const rapidjson::Value& objectJsonArray, ActionParseDelegate* parseDelegate); std::vector 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 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 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 */