| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #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()
- {
- }
- ScriptTarget::~ScriptTarget()
- {
- std::map<std::string, std::vector<Callback>* >::iterator iter = _callbacks.begin();
- for (; iter != _callbacks.end(); iter++)
- {
- SAFE_DELETE(iter->second);
- }
- }
- template<> void ScriptTarget::fireScriptEvent<void>(const char* eventName, ...)
- {
- va_list list;
- va_start(list, eventName);
- std::map<std::string, std::vector<Callback>* >::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<void>((*iter->second)[i].function.c_str(), _events[eventName].c_str(), &list);
- }
- }
- else
- {
- for (unsigned int i = 0; i < iter->second->size(); i++)
- {
- sc->executeFunction<void>((*iter->second)[i].function.c_str(), _events[eventName].c_str());
- }
- }
- }
- va_end(list);
- }
- template<> bool ScriptTarget::fireScriptEvent<bool>(const char* eventName, ...)
- {
- va_list list;
- va_start(list, eventName);
- std::map<std::string, std::vector<Callback>* >::iterator iter = _callbacks.find(eventName);
- if (iter != _callbacks.end() && iter->second)
- {
- ScriptController* sc = Game::getInstance()->getScriptController();
- if (_events[eventName].size() > 0)
- {
- for (unsigned int i = 0; i < iter->second->size(); i++)
- {
- if (sc->executeFunction<bool>((*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<bool>((*iter->second)[i].function.c_str(), _events[eventName].c_str()))
- {
- va_end(list);
- return true;
- }
- }
- }
- }
- va_end(list);
- return false;
- }
- void ScriptTarget::addScriptCallback(const std::string& eventName, const std::string& function)
- {
- std::map<std::string, std::vector<Callback>* >::iterator iter = _callbacks.find(eventName);
- if (iter != _callbacks.end())
- {
- if (!iter->second)
- iter->second = new std::vector<Callback>();
- // 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::removeScriptCallback(const std::string& eventName, const std::string& function)
- {
- std::map<std::string, std::vector<Callback>* >::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::addScriptEvent(const std::string& eventName, const char* argsString)
- {
- _events[eventName] = (argsString ? argsString : "");
- _callbacks[eventName] = NULL;
- }
- ScriptTarget::Callback::Callback(const std::string& function) : function(function)
- {
- }
- }
|