00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "ScriptManager.h"
00020
00021 #ifdef __COMPILE_WITH_ANGELSCRIPT__
00022
00023 #include "../core/GameManager.h"
00024
00025
00026 #include "vendor/angelscript/scriptstdstring.h"
00027
00028 #include "vendor/irrlicht/asIrrlicht.h"
00029
00030 #include "assets/asProcessors.h"
00031 #include "components/asComponents.h"
00032
00033 #include "core/asAssetGroup.h"
00034 #include "core/asAssetManager.h"
00035 #include "core/asAssetProcessor.h"
00036 #include "core/asDataStack.h"
00037 #include "core/asDataStore.h"
00038 #include "core/asEntity.h"
00039 #include "core/asEntityComponent.h"
00040 #include "core/asEntityManager.h"
00041 #include "core/asEventManager.h"
00042 #include "core/asGameManager.h"
00043 #include "core/asGameState.h"
00044
00045 #include "scripting/asScript.h"
00046 #include "scripting/asScriptManager.h"
00047
00048 #include "sound/asSoundManager.h"
00049
00050 void scriptGlobalEcho(const std::string& in);
00051
00052
00053
00054 ScriptManager::ScriptManager()
00055 {
00056 }
00057
00058
00059 ScriptManager::~ScriptManager()
00060 {
00061 }
00062
00063
00064 void ScriptManager::init()
00065 {
00066
00067 pEngine = asCreateScriptEngine(ANGELSCRIPT_VERSION);
00068
00069 RegisterStdString(pEngine);
00070 pEngine->SetMessageCallback(asFUNCTION(asMessageCallback), 0, asCALL_CDECL);
00071
00072
00073 pEngine->RegisterTypedef("c8", "int8");
00074 pEngine->RegisterTypedef("f32", "float");
00075 pEngine->RegisterTypedef("f64", "double");
00076 pEngine->RegisterTypedef("s16", "int16");
00077 pEngine->RegisterTypedef("s32", "int");
00078 pEngine->RegisterTypedef("u16", "uint16");
00079 pEngine->RegisterTypedef("u32", "uint");
00080 pEngine->RegisterTypedef("u8", "uint8");
00081
00082
00083 pEngine->RegisterInterface("IHasSlots");
00084
00085
00086 bindIrrlicht(pEngine);
00087
00088
00089 bindAssetGroup(pEngine);
00090 bindAssetManager(pEngine);
00091 bindAssetProcessor(pEngine);
00092
00093 bindDataStack(pEngine);
00094 bindDataStore(pEngine);
00095
00096 bindEntity(pEngine);
00097 bindEntityComponent(pEngine);
00098 bindEntityManager(pEngine);
00099
00100 bindEventManager(pEngine);
00101
00102 #ifdef __COMPILE_WITH_SFML_AUDIO__
00103 bindSoundManager(pEngine);
00104 #endif // __COMPILE_WITH_SFML_AUDIO__
00105
00106 bindScript(pEngine);
00107 bindScriptManager(pEngine);
00108
00109 bindAssetProcessors(pEngine);
00110 bindComponents(pEngine);
00111
00112 bindGameState(pEngine);
00113 bindGameManager(pEngine);
00114
00115 bindGlobals();
00116 }
00117
00118
00119 void ScriptManager::clear()
00120 {
00121
00122 removeScripts();
00123
00124
00125 mScriptSections.clear();
00126
00127
00128 pEngine->Release();
00129 }
00130
00131
00132 void ScriptManager::grab()
00133 {
00134
00135 }
00136
00137
00138 void ScriptManager::drop()
00139 {
00140
00141 }
00142
00143
00144 asIScriptEngine* ScriptManager::getEngine() const
00145 {
00146 return pEngine;
00147 }
00148
00149
00150 bool ScriptManager::addScript(Script *script)
00151 {
00152
00153 if(script == NULL)
00154 return false;
00155
00156
00157 if(getScript(script->getName()))
00158 return false;
00159
00160
00161 mScripts.push_back(script);
00162 script->grab();
00163
00164 return true;
00165 }
00166
00167
00168 bool ScriptManager::addScriptSection(const std::string &name, const std::string §ion)
00169 {
00170
00171 if(mScriptSections.find(name) != mScriptSections.end())
00172 return false;
00173
00174
00175 mScriptSections[name] = section;
00176
00177 return true;
00178 }
00179
00180
00181 void ScriptManager::addScriptSectionsToScript(Script *script)
00182 {
00183
00184 if(script == NULL)
00185 return;
00186
00187
00188 asIScriptModule *module = script->getModule();
00189 std::map<std::string, std::string>::iterator it;
00190
00191 for(it = mScriptSections.begin(); it != mScriptSections.end(); it++)
00192 module->AddScriptSection((it->first).c_str(), (it->second).c_str());
00193 }
00194
00195
00196 Script* ScriptManager::createScript(const std::string &name, bool grab)
00197 {
00198
00199 if(grab && getScript(name))
00200 return NULL;
00201
00202
00203 Script *script = new Script(name);
00204
00205 if(grab)
00206 {
00207 mScripts.push_back(script);
00208 script->grab();
00209 }
00210
00211 return script;
00212 }
00213
00214
00215 Script* ScriptManager::createScriptFromFile(const std::string &fileName, bool grab)
00216 {
00217
00218 IFileSystem *fileSystem = GameManager::Instance()->getDevice()->getFileSystem();
00219
00220
00221 core::stringw wFilename = core::stringw(fileName.c_str());
00222 std::string fileBase = (fileSystem->getFileBasename(wFilename)).c_str();
00223
00224
00225 if(grab && getScript(fileBase))
00226 return NULL;
00227
00228
00229 Script *script = new Script(fileBase);
00230
00231 bool success = script->loadScript(fileName);
00232
00233 if(!success)
00234 {
00235 printf("-- : Error : cannot find file : %s\n", fileName.c_str());
00236 return NULL;
00237 }
00238
00239 if(grab)
00240 {
00241 mScripts.push_back(script);
00242 script->grab();
00243 }
00244
00245 return script;
00246 }
00247
00248
00249 Script* ScriptManager::createScriptFromFile(IReadFile *file, bool grab)
00250 {
00251
00252 if(grab && getScript( (file->getFileName()).c_str() ))
00253 return NULL;
00254
00255
00256 Script *script = new Script( (file->getFileName()).c_str() );
00257 script->loadScript(file);
00258
00259 if(grab)
00260 {
00261 mScripts.push_back(script);
00262 script->grab();
00263 }
00264
00265 return script;
00266 }
00267
00268
00269 Script* ScriptManager::getScript(const u32 id)
00270 {
00271 for(u32 i = 0; i < mScripts.size(); i++)
00272 {
00273 if(mScripts[i]->getID() == id)
00274 return mScripts[i];
00275 }
00276
00277 return NULL;
00278 }
00279
00280
00281 Script* ScriptManager::getScript(const std::string &name)
00282 {
00283 for(u32 i = 0; i < mScripts.size(); i++)
00284 {
00285 if(mScripts[i]->getName() == name)
00286 return mScripts[i];
00287 }
00288
00289 return NULL;
00290 }
00291
00292
00293 void ScriptManager::removeScripts()
00294 {
00295 for(u32 i = 0; i < mScripts.size(); i++)
00296 mScripts[i]->drop();
00297
00298 mScripts.clear();
00299 }
00300
00301
00302 void ScriptManager::removeScriptSections()
00303 {
00304 mScriptSections.clear();
00305 }
00306
00307
00308 bool ScriptManager::removeScript(Script *script)
00309 {
00310
00311 if(script == NULL)
00312 return false;
00313
00314
00315 vector<Script*>::iterator it;
00316
00317 for(it = mScripts.begin(); it < mScripts.end(); it++)
00318 {
00319 Script *scr = *it;
00320
00321 if(scr == script)
00322 {
00323 scr->drop();
00324 mScripts.erase(it);
00325 return true;
00326 }
00327 }
00328
00329
00330 return false;
00331 }
00332
00333
00334 bool ScriptManager::removeScript(const u32 id)
00335 {
00336
00337 vector<Script*>::iterator it;
00338
00339 for(it = mScripts.begin(); it < mScripts.end(); it++)
00340 {
00341 Script *scr = *it;
00342
00343 if(scr->getID() == id)
00344 {
00345 scr->drop();
00346 mScripts.erase(it);
00347 return true;
00348 }
00349 }
00350
00351
00352 return false;
00353 }
00354
00355
00356 bool ScriptManager::removeScript(const std::string &name)
00357 {
00358
00359 vector<Script*>::iterator it;
00360
00361 for(it = mScripts.begin(); it < mScripts.end(); it++)
00362 {
00363 Script *scr = *it;
00364
00365 if(scr->getName() == name)
00366 {
00367 scr->drop();
00368 mScripts.erase(it);
00369 return true;
00370 }
00371 }
00372
00373
00374 return false;
00375 }
00376
00377
00378 bool ScriptManager::removeScriptSection(const std::string &name)
00379 {
00380
00381 std::map<std::string, std::string>::iterator it;
00382 it = mScriptSections.find(name);
00383
00384 if(it != mScriptSections.end())
00385 {
00386 mScriptSections.erase(it);
00387 return true;
00388 }
00389
00390
00391 return false;
00392 }
00393
00395 void ScriptManager::bindGlobals()
00396 {
00397 int r;
00398
00399
00400 r = pEngine->RegisterGlobalFunction("void echo(string &in)",
00401 asFUNCTION(asEcho), asCALL_CDECL); assert(r >= 0);
00402
00403 }
00404
00405
00406
00407
00408 void asMessageCallback(const asSMessageInfo *msg, void *param)
00409 {
00410 const char *type = "ERR ";
00411 if(msg->type == asMSGTYPE_WARNING)
00412 type = "WARN";
00413 else if(msg->type == asMSGTYPE_INFORMATION)
00414 type = "INFO";
00415 printf("%s (Line %d, Column %d) : %s : %s\n", msg->section, msg->row, msg->col, type, msg->message);
00416 }
00417
00418
00419 void asEcho(const std::string& in)
00420 {
00421 printf("%s", in.c_str());
00422 fflush(stdout);
00423 }
00424
00425 #endif // __COMPILE_WITH_ANGELSCRIPT__
00426
00427