📄 consolefunctions.cc
字号:
bool noCalls = false;
bool ret = false;
if(argc >= 3 && dAtoi(argv[2]))
noCalls = true;
if(argc >= 4 && dAtoi(argv[3]) && !journal)
{
journal = true;
journalDepth = execDepth;
}
// Determine the filename we actually want...
Con::expandScriptFilename(scriptFilenameBuffer, sizeof(scriptFilenameBuffer), argv[1]);
const char *ext = dStrrchr(scriptFilenameBuffer, '.');
if(!ext)
{
// We need an extension!
Con::errorf(ConsoleLogEntry::Script, "exec: invalid script file name %s.", scriptFilenameBuffer);
execDepth--;
return false;
}
StringTableEntry scriptFileName = StringTable->insert(scriptFilenameBuffer);
// Is this a file we should compile?
bool compiled = dStricmp(ext, ".mis") && !journal && !Con::getBoolVariable("Pref::ignoreDSOs");
// If we're in a journalling mode, then we will read the script
// from the journal file.
if(journal && Game->isJournalReading())
{
char fileNameBuf[256];
bool fileRead;
U32 fileSize;
Game->getJournalStream()->readString(fileNameBuf);
Game->getJournalStream()->read(&fileRead);
if(!fileRead)
{
Con::errorf(ConsoleLogEntry::Script, "Journal script read (failed) for %s", fileNameBuf);
execDepth--;
return false;
}
Game->journalRead(&fileSize);
char *script = new char[fileSize + 1];
Game->journalRead(fileSize, script);
script[fileSize] = 0;
Con::printf("Executing (journal-read) %s.", scriptFileName);
CodeBlock *newCodeBlock = new CodeBlock();
newCodeBlock->compileExec(scriptFileName, script, noCalls, 0);
delete [] script;
execDepth--;
return true;
}
// Ok, we let's try to load and compile the script.
ResourceObject *rScr = ResourceManager->find(scriptFileName);
ResourceObject *rCom = NULL;
char nameBuffer[512];
char* script = NULL;
U32 scriptSize = 0;
U32 version;
Stream *compiledStream = NULL;
FileTime comModifyTime, scrModifyTime;
// If we're supposed to be compiling this file, check to see if there's a DSO
if(compiled)
{
dStrcpyl(nameBuffer, sizeof(nameBuffer), scriptFileName, ".dso", NULL);
rCom = ResourceManager->find(nameBuffer);
if(rCom)
rCom->getFileTimes(NULL, &comModifyTime);
if(rScr)
rScr->getFileTimes(NULL, &scrModifyTime);
}
// Let's do a sanity check to complain about DSOs in the future.
if(compiled && rCom && rScr && Platform::compareFileTimes(comModifyTime, scrModifyTime) < 0)
{
Con::warnf("exec: Warning! Found a DSO from the future! (%s)", nameBuffer);
}
// If we had a DSO, let's check to see if we should be reading from it.
if(compiled && rCom && (!rScr || Platform::compareFileTimes(comModifyTime, scrModifyTime) >= 0))
{
compiledStream = ResourceManager->openStream(nameBuffer);
// Check the version!
compiledStream->read(&version);
if(version != Con::DSOVersion)
{
Con::warnf("exec: Found an old DSO (%s, ver %d < %d), ignoring.", nameBuffer, version, Con::DSOVersion);
ResourceManager->closeStream(compiledStream);
compiledStream = NULL;
}
}
// If we're journalling, let's write some info out.
if(journal && Game->isJournalWriting())
Game->getJournalStream()->writeString(scriptFileName);
if(rScr && !compiledStream)
{
// If we have source but no compiled version, then we need to compile
// (and journal as we do so, if that's required).
Stream *s = ResourceManager->openStream(scriptFileName);
if(journal && Game->isJournalWriting())
Game->getJournalStream()->write(bool(s != NULL));
if(s)
{
scriptSize = ResourceManager->getSize(scriptFileName);
script = new char [scriptSize+1];
s->read(scriptSize, script);
if(journal && Game->isJournalWriting())
{
Game->journalWrite(scriptSize);
Game->journalWrite(scriptSize, script);
}
ResourceManager->closeStream(s);
script[scriptSize] = 0;
}
if (!scriptSize || !script)
{
delete [] script;
Con::errorf(ConsoleLogEntry::Script, "exec: invalid script file %s.", scriptFileName);
execDepth--;
return false;
}
if(compiled)
{
// compile this baddie.
Con::printf("Compiling %s...", scriptFileName);
CodeBlock *code = new CodeBlock();
code->compile(nameBuffer, scriptFileName, script);
delete code;
code = NULL;
compiledStream = ResourceManager->openStream(nameBuffer);
if(compiledStream)
{
compiledStream->read(&version);
}
else
{
// We have to exit out here, as otherwise we get double error reports.
delete [] script;
execDepth--;
return false;
}
}
}
else
{
if(journal && Game->isJournalWriting())
Game->getJournalStream()->write(bool(false));
}
if(compiledStream)
{
// Delete the script object first to limit memory used
// during recursive execs.
delete [] script;
script = 0;
// We're all compiled, so let's run it.
Con::printf("Loading compiled script %s.", scriptFileName);
CodeBlock *code = new CodeBlock;
code->read(scriptFileName, *compiledStream);
ResourceManager->closeStream(compiledStream);
code->exec(0, scriptFileName, NULL, 0, NULL, noCalls, NULL, 0);
ret = true;
}
else
if(rScr)
{
// No compiled script, let's just try executing it
// directly... this is either a mission file, or maybe
// we're on a readonly volume.
Con::printf("Executing %s.", scriptFileName);
CodeBlock *newCodeBlock = new CodeBlock();
StringTableEntry name = StringTable->insert(scriptFileName);
newCodeBlock->compileExec(name, script, noCalls, 0);
ret = true;
}
else
{
// Don't have anything.
Con::warnf(ConsoleLogEntry::Script, "Missing file: %s!", scriptFileName);
ret = false;
}
delete [] script;
execDepth--;
return ret;
}
ConsoleFunction(eval, const char *, 2, 2, "eval(consoleString)")
{
argc;
return Con::evaluate(argv[1], false, NULL);
}
//----------------------------------------------------------------
ConsoleFunction(export, void, 2, 4, "export(searchString [, fileName [,append]])")
{
const char *filename = NULL;
bool append = (argc == 4) ? dAtob(argv[3]) : false;
if (argc >= 3)
if (Con::expandScriptFilename(scriptFilenameBuffer, sizeof(scriptFilenameBuffer), argv[2]))
filename = scriptFilenameBuffer;
gEvalState.globalVars.exportVariables(argv[1], filename, append);
}
ConsoleFunction(deleteVariables, void, 2, 2, "deleteVariables(wildCard)")
{
argc;
gEvalState.globalVars.deleteVariables(argv[1]);
}
//----------------------------------------------------------------
ConsoleFunction(trace, void, 2, 2, "trace(bool)")
{
argc;
gEvalState.traceOn = dAtob(argv[1]);
Con::printf("Console trace is %s", gEvalState.traceOn ? "on." : "off.");
}
//----------------------------------------------------------------
#if defined(TORQUE_DEBUG) || defined(INTERNAL_RELEASE)
ConsoleFunction(debug, void, 1, 1, "debug()")
{
argv; argc;
Platform::debugBreak();
}
#endif
ConsoleFunctionGroupEnd( MetaScripting );
//----------------------------------------------------------------
ConsoleFunctionGroupBegin( InputManagement, "Functions that let you deal with input from scripts" );
ConsoleFunction( deactivateDirectInput, void, 1, 1, "Deactivate input. (ie, ungrab the mouse so the user can do other things." )
{
argc; argv;
if ( Input::isActive() )
Input::deactivate();
}
//--------------------------------------------------------------------------
ConsoleFunction( activateDirectInput, void, 1, 1, "Activate input. (ie, grab the mouse again so the user can play our game." )
{
argc; argv;
if ( !Input::isActive() )
Input::activate();
}
ConsoleFunctionGroupEnd( InputManagement );
//----------------------------------------------------------------
ConsoleFunctionGroupBegin( FileSystem, "Functions allowing you to search for files, read them, write them, and access their properties.");
static ResourceObject *firstMatch = NULL;
ConsoleFunction(findFirstFile, const char *, 2, 2, "(string pattern) Returns the first file in the directory system matching the given pattern.")
{
argc;
const char *fn;
firstMatch = NULL;
if(Con::expandScriptFilename(scriptFilenameBuffer, sizeof(scriptFilenameBuffer), argv[1]))
firstMatch = ResourceManager->findMatch(scriptFilenameBuffer, &fn, NULL);
if(firstMatch)
return fn;
else
return "";
}
ConsoleFunction(findNextFile, const char *, 2, 2, "(string pattern) Returns the next file matching a search begun in findFirstFile.")
{
argc;
const char *fn;
if(Con::expandScriptFilename(scriptFilenameBuffer, sizeof(scriptFilenameBuffer), argv[1]))
firstMatch = ResourceManager->findMatch(scriptFilenameBuffer, &fn, firstMatch);
else
firstMatch = NULL;
if(firstMatch)
return fn;
else
return "";
}
ConsoleFunction(getFileCount, S32, 2, 2, "(string pattern)returns the number of files in the directory tree that match the given pattern")
{
argc;
const char* fn;
U32 count = 0;
firstMatch = ResourceManager->findMatch(argv[1], &fn, NULL);
if ( firstMatch )
{
count++;
while ( 1 )
{
firstMatch = ResourceManager->findMatch(argv[1], &fn, firstMatch);
if ( firstMatch )
count++;
else
break;
}
}
return( count );
}
ConsoleFunction(getFileCRC, S32, 2, 2, "getFileCRC(filename)")
{
argc;
U32 crcVal;
Con::expandScriptFilename(scriptFilenameBuffer, sizeof(scriptFilenameBuffer), argv[1]);
if(!ResourceManager->getCrc(scriptFilenameBuffer, crcVal))
return(-1);
return(S32(crcVal));
}
ConsoleFunction(isFile, bool, 2, 2, "isFile(fileName)")
{
argc;
Con::expandScriptFilename(scriptFilenameBuffer, sizeof(scriptFilenameBuffer), argv[1]);
return bool(ResourceManager->find(scriptFilenameBuffer));
}
ConsoleFunction(isWriteableFileName, bool, 2, 2, "isWriteableFileName(fileName)")
{
argc;
// in a writeable directory?
Con::expandScriptFilename(scriptFilenameBuffer, sizeof(scriptFilenameBuffer), argv[1]);
if(!ResourceManager->isValidWriteFileName(scriptFilenameBuffer))
return(false);
// exists?
FileStream fs;
if(!fs.open(scriptFilenameBuffer, FileStream::Read))
return(true);
// writeable? (ReadWrite will create file if it does not exist)
fs.close();
if(!fs.open(scriptFilenameBuffer, FileStream::ReadWrite))
return(false);
return(true);
}
//----------------------------------------------------------------
ConsoleFunction(fileExt, const char *, 2, 2, "fileExt(fileName)")
{
argc;
const char *ret = dStrrchr(argv[1], '.');
if(ret)
return ret;
return "";
}
ConsoleFunction(fileBase, const char *, 2, 2, "fileBase(fileName)")
{
argc;
const char *path = dStrrchr(argv[1], '/');
if(!path)
path = argv[1];
else
path++;
char *ret = Con::getReturnBuffer(dStrlen(path) + 1);
dStrcpy(ret, path);
char *ext = dStrrchr(ret, '.');
if(ext)
*ext = 0;
return ret;
}
ConsoleFunction(fileName, const char *, 2, 2, "fileName(filePathName)")
{
argc;
const char *name = dStrrchr(argv[1], '/');
if(!name)
name = argv[1];
else
name++;
char *ret = Con::getReturnBuffer(dStrlen(name));
dStrcpy(ret, name);
return ret;
}
ConsoleFunction(filePath, const char *, 2, 2, "filePath(fileName)")
{
argc;
const char *path = dStrrchr(argv[1], '/');
if(!path)
return "";
U32 len = path - argv[1];
char *ret = Con::getReturnBuffer(len + 1);
dStrncpy(ret, argv[1], len);
ret[len] = 0;
return ret;
}
ConsoleFunctionGroupEnd( FileSystem );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -