00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "ScriptProcessor.h"
00018
00019 #ifdef __COMPILE_WITH_ANGELSCRIPT__
00020
00021 #include <algorithm>
00022
00023 #include "../core/GameManager.h"
00024
00025
00026
00027
00028 ScriptProcessor::ScriptProcessor(AssetGroup *parent)
00029 : AssetProcessor(parent, "scripts"), mIsReloading(false)
00030 {
00031 }
00032
00033
00034 ScriptProcessor::~ScriptProcessor()
00035 {
00036 removeAssets();
00037 }
00038
00039
00040 Script* ScriptProcessor::getScript(const std::string &fileName)
00041 {
00042
00043 #ifdef WIN32
00044 std::string tmp = fileName;
00045 std::transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);
00046 std::map<std::string, Script*>::iterator itScripts = mScripts.find(tmp);
00047 #else
00048 std::map<std::string, Script*>::iterator itScripts = mScripts.find(fileName);
00049 #endif
00050
00051 if(itScripts != mScripts.end())
00052 return itScripts->second;
00053
00054
00055 #ifdef WIN32
00056 std::map<std::string, std::pair<c8*, long> >::iterator itFiles = mScriptFiles.find(tmp);
00057 #else
00058 std::map<std::string, std::pair<c8*, long> >::iterator itFiles = mScriptFiles.find(fileName);
00059 #endif
00060
00061 if(itFiles != mScriptFiles.end())
00062 {
00063
00064 IFileSystem *fileSystem = GameManager::Instance()->getDevice()->getFileSystem();
00065
00066
00067 long fSize = (itFiles->second).second;
00068 c8 *fBuffer = (itFiles->second).first;
00069
00070 IReadFile *file = fileSystem->createMemoryReadFile(fBuffer, fSize, fileName.c_str());
00071
00072
00073 Script *script = GameManager::Instance()->getScriptManager()
00074 ->createScriptFromFile(file, false);
00075
00076 mScripts[fileName] = script;
00077 script->grab();
00078
00079
00080 file->drop();
00081
00082
00083 return script;
00084 }
00085
00086
00087 return NULL;
00088 }
00089
00090
00091 bool ScriptProcessor::loadAsset(const std::string &fileName)
00092 {
00093
00094 IFileSystem *fileSystem = GameManager::Instance()->getDevice()->getFileSystem();
00095
00096
00097 std::string workingDir = (fileSystem->getWorkingDirectory()).c_str();
00098
00099 if(!fileSystem->changeWorkingDirectoryTo( (pParent->getBaseDir()).c_str() ) )
00100 return false;
00101
00102 if(!fileSystem->changeWorkingDirectoryTo("./scripts/"))
00103 return false;
00104
00105
00106 IReadFile *file = fileSystem->createAndOpenFile(fileName.c_str());
00107
00108 if(file)
00109 {
00110
00111 long fSize = file->getSize();
00112 c8 *fBuffer = new c8[fSize+1];
00113 memset(fBuffer, 0, fSize+1);
00114
00115 file->read(fBuffer, fSize);
00116
00117
00118
00119 mScriptFiles[fileName] = std::pair<c8*, long>(fBuffer, fSize);
00120 cout << "Loaded script: " << fileName << "\n";
00121
00122
00123 if(mIsReloading)
00124 {
00125 #ifdef WIN32
00126 std::string tmp = fileName;
00127 std::transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);
00128 std::map<std::string, Script*>::iterator it = mScripts.find(tmp);
00129 #else
00130 std::map<std::string, Script*>::iterator it = mScripts.find(fileName);
00131 #endif
00132
00133 if(it != mScripts.end())
00134 {
00135 file->seek(0);
00136
00137 Script *script = it->second;
00138 script->unloadScript();
00139 script->loadScript(file);
00140 }
00141 }
00142
00143
00144 file->drop();
00145 }
00146
00147
00148 fileSystem->changeWorkingDirectoryTo(workingDir.c_str());
00149
00150 return (file) ? true : false;
00151 }
00152
00153
00154 void ScriptProcessor::loadAssets()
00155 {
00156
00157 IFileSystem *fileSystem = GameManager::Instance()->getDevice()->getFileSystem();
00158
00159
00160 std::string workingDir = (fileSystem->getWorkingDirectory()).c_str();
00161
00162 if(!fileSystem->changeWorkingDirectoryTo( (pParent->getBaseDir()).c_str() ) )
00163 return;
00164
00165 if(!fileSystem->changeWorkingDirectoryTo("./scripts/"))
00166 return;
00167
00168
00169 IFileList *fileList = fileSystem->createFileList();
00170
00171 for(u32 i = 0; i < fileList->getFileCount(); i++)
00172 {
00173
00174 std::string fileName = (fileList->getFileName(i)).c_str();
00175
00176 if(fileName == ".." || fileName == ".")
00177 continue;
00178
00179
00180 IReadFile *file = fileSystem->createAndOpenFile(fileName.c_str());
00181
00182 if(file)
00183 {
00184
00185 long fSize = file->getSize();
00186 c8 *fBuffer = new c8[fSize+1];
00187 memset(fBuffer, 0, fSize+1);
00188
00189 file->read(fBuffer, fSize);
00190
00191
00192 mScriptFiles[fileName] = std::pair<c8*, long>(fBuffer, fSize);
00193 cout << "Loaded script: " << fileName << "\n";
00194
00195
00196 if(mIsReloading)
00197 {
00198 #ifdef WIN32
00199 std::string tmp = fileName;
00200 std::transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);
00201 std::map<std::string, Script*>::iterator it = mScripts.find(tmp);
00202 #else
00203 std::map<std::string, Script*>::iterator it = mScripts.find(fileName);
00204 #endif
00205
00206 if(it != mScripts.end())
00207 {
00208 file->seek(0);
00209
00210 Script *script = it->second;
00211 script->unloadScript();
00212 script->loadScript(file);
00213 }
00214 }
00215
00216
00217 file->drop();
00218 }
00219 }
00220
00221
00222 fileList->drop();
00223
00224 fileSystem->changeWorkingDirectoryTo(workingDir.c_str());
00225 }
00226
00227
00228 bool ScriptProcessor::reloadAsset(const std::string &fileName)
00229 {
00230 mIsReloading = true;
00231
00232 removeAsset(fileName);
00233 bool succeeded = loadAsset(fileName);
00234
00235 mIsReloading = false;
00236
00237 return succeeded;
00238 }
00239
00240
00241 void ScriptProcessor::reloadAssets()
00242 {
00243
00244 mIsReloading = true;
00245
00246 removeAssets();
00247 loadAssets();
00248
00249 mIsReloading = false;
00250
00251
00252
00253 std::map<std::string, Script*> newMap;
00254
00255 std::map<std::string, std::pair<c8*, long> >::iterator itFiles;
00256 for(itFiles = mScriptFiles.begin(); itFiles != mScriptFiles.end(); itFiles++)
00257 {
00258 std::map<std::string, Script*>::iterator itScripts = mScripts.find(itFiles->first);
00259
00260 if(itScripts != mScripts.end())
00261 {
00262 newMap[itScripts->first] = itScripts->second;
00263 mScripts.erase(itScripts);
00264 }
00265 }
00266
00267
00268 std::map<std::string, Script*>::iterator itScripts;
00269 for(itScripts = mScripts.begin(); itScripts != mScripts.end(); itScripts++)
00270 (itScripts->second)->drop();
00271
00272 mScripts.clear();
00273
00274
00275 mScripts = newMap;
00276 }
00277
00278
00279 bool ScriptProcessor::removeAsset(const std::string &fileName)
00280 {
00281
00282 bool succeeded = false;
00283
00284
00285 #ifdef WIN32
00286 std::string tmp = fileName;
00287 std::transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);
00288 std::map<std::string, std::pair<c8*, long> >::iterator it = mScriptFiles.find(tmp);
00289 #else
00290 std::map<std::string, std::pair<c8*, long> >::iterator it = mScriptFiles.find(fileName);
00291 #endif
00292
00293
00294 if(it != mScriptFiles.end())
00295 {
00296
00297 c8 *fBuffer = (it->second).first;
00298 delete [] fBuffer;
00299 mScriptFiles.erase(it);
00300
00301 succeeded = true;
00302 }
00303
00304
00305 if(succeeded && !mIsReloading)
00306 {
00307 #ifdef WIN32
00308 std::map<std::string, Script*>::iterator it = mScripts.find(tmp);
00309 #else
00310 std::map<std::string, Script*>::iterator it = mScripts.find(fileName);
00311 #endif
00312
00313
00314 if(it != mScripts.end())
00315 {
00316 (it->second)->drop();
00317 mScripts.erase(it);
00318 }
00319 }
00320
00321
00322 return succeeded;
00323 }
00324
00325
00326 void ScriptProcessor::removeAssets()
00327 {
00328
00329 std::map<std::string, std::pair<c8*, long> >::iterator itFiles;
00330
00331 for(itFiles = mScriptFiles.begin(); itFiles != mScriptFiles.end(); itFiles++)
00332 {
00333
00334 c8 *fBuffer = (itFiles->second).first;
00335 delete [] fBuffer;
00336 }
00337
00338
00339 mScriptFiles.clear();
00340
00341
00342 if(!mIsReloading)
00343 {
00344 std::map<std::string, Script*>::iterator itScripts;
00345
00346 for(itScripts = mScripts.begin(); itScripts != mScripts.end(); itScripts++)
00347 (itScripts->second)->drop();
00348
00349
00350 mScripts.clear();
00351 }
00352 }
00353
00354
00355 AssetProcessor* ScriptProcessor::createProcessor(AssetGroup *parent)
00356 {
00357 return new ScriptProcessor(parent);
00358 }
00359
00360 #endif // __COMPILE_WITH_ANGELSCRIPT__
00361
00362