#include "Base.h" #include "ScriptController.h" #include "ScriptTarget.h" namespace gameplay { extern void splitURL(const std::string& url, std::string* file, std::string* id); ScriptTarget::~ScriptTarget() { std::map* >::iterator iter = _callbacks.begin(); for (; iter != _callbacks.end(); iter++) { SAFE_DELETE(iter->second); } } template<> void ScriptTarget::fireEvent(const char* eventName, ...) { va_list list; va_start(list, eventName); std::map* >::iterator iter = _callbacks.find(eventName); if (iter != _callbacks.end() && iter->second != NULL) { ScriptController* sc = Game::getInstance()->getScriptController(); if (_events[eventName].size() > 0) { for (unsigned int i = 0; i < iter->second->size(); i++) { sc->executeFunction((*iter->second)[i].function.c_str(), _events[eventName].c_str(), &list); } } else { for (unsigned int i = 0; i < iter->second->size(); i++) { sc->executeFunction((*iter->second)[i].function.c_str(), _events[eventName].c_str()); } } } va_end(list); } template<> bool ScriptTarget::fireEvent(const char* eventName, ...) { va_list list; va_start(list, eventName); std::map* >::iterator iter = _callbacks.find(eventName); if (iter != _callbacks.end()) { ScriptController* sc = Game::getInstance()->getScriptController(); if (_events[eventName].size() > 0) { for (unsigned int i = 0; i < iter->second->size(); i++) { if (sc->executeFunction((*iter->second)[i].function.c_str(), _events[eventName].c_str(), &list)) { va_end(list); return true; } } } else { for (unsigned int i = 0; i < iter->second->size(); i++) { if (sc->executeFunction((*iter->second)[i].function.c_str(), _events[eventName].c_str())) { va_end(list); return true; } } } } va_end(list); return false; } void ScriptTarget::addCallback(const std::string& eventName, const std::string& function) { std::map* >::iterator iter = _callbacks.find(eventName); if (iter != _callbacks.end()) { if (!iter->second) iter->second = new std::vector(); // Add the function to the list of callbacks. std::string functionName = Game::getInstance()->getScriptController()->loadUrl(function.c_str()); iter->second->push_back(Callback(functionName)); } else { GP_ERROR("Attempting to add a script callback for unsupported event '%s'.", eventName.c_str()); } } void ScriptTarget::removeCallback(const std::string& eventName, const std::string& function) { std::map* >::iterator iter = _callbacks.find(eventName); if (iter != _callbacks.end()) { if (!iter->second) return; std::string file; std::string id; splitURL(function, &file, &id); // Make sure the function isn't empty. if (id.size() <= 0) return; // Remove the function from the list of callbacks. for (unsigned int i = 0; i < iter->second->size(); i++) { if ((*iter->second)[i].function == id) { iter->second->erase(iter->second->begin() + i); return; } } } else { GP_ERROR("Attempting to remove a script callback for unsupported event '%s'.", eventName.c_str()); } } void ScriptTarget::addEvent(const std::string& eventName, const char* argsString) { _events[eventName] = (argsString ? argsString : ""); _callbacks[eventName] = NULL; } ScriptTarget::Callback::Callback(const std::string& function) : function(function) { } }