//----------------------------------------------------------------------------- // Torque Game Engine // // Copyright (c) 2001 GarageGames.Com // Portions Copyright (c) 2001 by Sierra Online, Inc. //----------------------------------------------------------------------------- $baseMods = "common"; $userMods = "marble"; $displayHelp = false; //----------------------------------------------------------------------------- // Support functions used to manage the mod string function pushFront(%list, %token, %delim) { if (%list !$= "") return %token @ %delim @ %list; return %token; } function pushBack(%list, %token, %delim) { if (%list !$= "") return %list @ %delim @ %token; return %token; } function popFront(%list, %delim) { return nextToken(%list, unused, %delim); } function onFrameAdvance() { } //------------------------------------------------------------------------------ // Process command line arguments for ($i = 1; $i < $Game::argc ; $i++) { $arg = $Game::argv[$i]; $nextArg = $Game::argv[$i+1]; $hasNextArg = $Game::argc - $i > 1; $logModeSpecified = false; switch$ ($arg) { //-------------------- case "-log": $argUsed[$i]++; if ($hasNextArg) { // Turn on console logging if ($nextArg != 0) { // Dump existing console to logfile first. $nextArg += 4; } setLogMode($nextArg); $logModeSpecified = true; $argUsed[$i+1]++; $i++; } else error("Error: Missing Command Line argument. Usage: -log "); //-------------------- case "-mod": $argUsed[$i]++; if ($hasNextArg) { // Append the mod to the end of the current list $userMods = strreplace($userMods, $nextArg, ""); $userMods = pushFront($userMods, $nextArg, ";"); $argUsed[$i+1]++; $i++; } else error("Error: Missing Command Line argument. Usage: -mod "); //-------------------- case "-compileguis": $compileGuis = true; $argUsed[$i]++; echo("Compile guis!"); case "-compileall": $compileGuis = true; $compileScripts = true; $argUsed[$i]++; echo("Compile all!"); case "-game": $argUsed[$i]++; if ($hasNextArg) { // Remove all mods, start over with game $userMods = $nextArg; $argUsed[$i+1]++; $i++; } else error("Error: Missing Command Line argument. Usage: -game "); //-------------------- case "-show": // A useful shortcut for -mod show $userMods = strreplace($userMods, "show", ""); $userMods = pushFront($userMods, "show", ";"); $argUsed[$i]++; //-------------------- case "-console": enableWinConsole(true); $argUsed[$i]++; //-------------------- case "-jSave": $argUsed[$i]++; if ($hasNextArg) { echo("Saving event log to journal: " @ $nextArg); saveJournal($nextArg); $argUsed[$i+1]++; $i++; } else error("Error: Missing Command Line argument. Usage: -jSave "); //-------------------- case "-jPlay": $argUsed[$i]++; if ($hasNextArg) { playJournal($nextArg,false); $argUsed[$i+1]++; $i++; } else error("Error: Missing Command Line argument. Usage: -jPlay "); //-------------------- case "-jDebug": $argUsed[$i]++; if ($hasNextArg) { playJournal($nextArg,true); $argUsed[$i+1]++; $i++; } else error("Error: Missing Command Line argument. Usage: -jDebug "); //------------------- case "-help": $displayHelp = true; $argUsed[$i]++; } } //----------------------------------------------------------------------------- // The displayHelp, onStart, onExit and parseArgs function are overriden // by mod packages to get hooked into initialization and cleanup. function onStart() { // Default startup function exec("marble/client/scripts/tttimer.cs"); exec($Con::root @ "/client/scripts/MarbleSkinSelectionDlg.cs"); } function onExit() { // OnExit is called directly from C++ code, whereas onStart is // invoked at the end of this file. } function parseArgs() { // Here for mod override, the arguments have already // been parsed. } package Help { function onExit() { // Override onExit when displaying help } }; function displayHelp() { activatePackage(Help); // Notes on logmode: console logging is written to console.log. // -log 0 disables console logging. // -log 1 appends to existing logfile; it also closes the file // (flushing the write buffer) after every write. // -log 2 overwrites any existing logfile; it also only closes // the logfile when the application shuts down. (default) error( "Marble Blast command line options:\n"@ " -log Logging behavior; see main.cs comments for details\n"@ " -game Reset list of mods to only contain \n"@ " -mod Add to list of mods\n"@ " -console Open a separate console\n"@ " -show Launch the TS show tool\n"@ " -jSave Record a journal\n"@ " -jPlay Play back a journal\n"@ " -jDebug Play back a journal and issue an int3 at the end\n"@ " -help Display this help message\n" ); } //-------------------------------------------------------------------------- // Default to a new logfile each session. if (!$logModeSpecified) { setLogMode(6); } // Set the mod path which dictates which directories will be visible // to the scripts and the resource engine. $modPath = pushback($userMods, $baseMods, ";"); setModPaths($modPath); // Get the first mod on the list, which will be the last to be applied... this // does not modify the list. nextToken($modPath, currentMod, ";"); // Execute startup scripts for each mod, starting at base and working up echo("--------- Loading MODS ---------"); function loadMods(%modPath) { %modPath = nextToken(%modPath, token, ";"); if (%modPath !$= "") loadMods(%modPath); exec(%token @ "/main.cs"); } loadMods($modPath); echo(""); // Parse the command line arguments echo("--------- Parsing Arguments ---------"); parseArgs(); // Either display the help message or startup the app. if ($compileGuis) { enableWinConsole(true); activatePackage(Help); for($file = findFirstFile("*.gui"); $file !$= ""; $file = findNextFile("*.gui")) { echo($file); compile($file); } if($compileScripts) { for($file = findFirstFile("*.cs"); $file !$= ""; $file = findNextFile("*.cs")) { echo($file); compile($file); } } quit(); } else if ($displayHelp) { enableWinConsole(true); displayHelp(); quit(); } else { onStart(); echo("Engine initialized..."); } // Display an error message for unused arguments for ($i = 1; $i < $Game::argc; $i++) { if (!$argUsed[$i]) error("Error: Unkown command line argument: " @ $Game::argv[$i]); } function GuiMLTextCtrl::onURL(%this, %url) { gotoWebPage( %url ); }