Torque3D/Templates/Empty/game/main.cs

300 lines
8.3 KiB
C#

//-----------------------------------------------------------------------------
// Copyright (c) 2012 GarageGames, LLC
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
//-----------------------------------------------------------------------------
// Set the name of our application
$appName = "Empty";
// The directory it is run from
$defaultGame = "scripts";
// Set profile directory
$Pref::Video::ProfilePath = "core/profile";
$Core::windowIcon = "core/torque.png";
$Core::splashWindowImage = "art/gui/splash.png";
function createCanvas(%windowTitle)
{
if ($isDedicated)
{
GFXInit::createNullDevice();
return true;
}
// Create the Canvas
%foo = new GuiCanvas(Canvas)
{
displayWindow = $platform !$= "windows";
};
$GameCanvas = %foo;
// Set the window title
if (isObject(Canvas))
Canvas.setWindowTitle(getEngineName() @ " - " @ $appName);
return true;
}
// Display the optional commandline arguements
$displayHelp = false;
// Use these to record and play back crashes
//saveJournal("editorOnFileQuitCrash.jrn");
//playJournal("editorOnFileQuitCrash.jrn");
//------------------------------------------------------------------------------
// Check if a script file exists, compiled or not.
function isScriptFile(%path)
{
if( isFile(%path @ ".dso") || isFile(%path) )
return true;
return false;
}
//------------------------------------------------------------------------------
// Process command line arguments
exec("core/parseArgs.cs");
$isDedicated = false;
$dirCount = 2;
$userDirs = $defaultGame @ ";art;levels";
// load tools scripts if we're a tool build
if (isToolBuild())
$userDirs = "tools;" @ $userDirs;
// Parse the executable arguments with the standard
// function from core/main.cs
defaultParseArgs();
if($dirCount == 0) {
$userDirs = $defaultGame;
$dirCount = 1;
}
//-----------------------------------------------------------------------------
// Display a splash window immediately to improve app responsiveness before
// engine is initialized and main window created
if (!$isDedicated)
displaySplashWindow();
//-----------------------------------------------------------------------------
// The displayHelp, onStart, onExit and parseArgs function are overriden
// by mod packages to get hooked into initialization and cleanup.
function onStart()
{
// Default startup function
}
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.
}
function compileFiles(%pattern)
{
%path = filePath(%pattern);
%saveDSO = $Scripts::OverrideDSOPath;
%saveIgnore = $Scripts::ignoreDSOs;
$Scripts::OverrideDSOPath = %path;
$Scripts::ignoreDSOs = false;
%mainCsFile = makeFullPath("main.cs");
for (%file = findFirstFileMultiExpr(%pattern); %file !$= ""; %file = findNextFileMultiExpr(%pattern))
{
// we don't want to try and compile the primary main.cs
if(%mainCsFile !$= %file)
compile(%file, true);
}
$Scripts::OverrideDSOPath = %saveDSO;
$Scripts::ignoreDSOs = %saveIgnore;
}
if($compileAll)
{
echo(" --- Compiling all files ---");
compileFiles("*.cs");
compileFiles("*.gui");
compileFiles("*.ts");
echo(" --- Exiting after compile ---");
quit();
}
if($compileTools)
{
echo(" --- Compiling tools scritps ---");
compileFiles("tools/*.cs");
compileFiles("tools/*.gui");
compileFiles("tools/*.ts");
echo(" --- Exiting after compile ---");
quit();
}
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(
"Torque Demo command line options:\n"@
" -log <logmode> Logging behavior; see main.cs comments for details\n"@
" -game <game_name> Reset list of mods to only contain <game_name>\n"@
" <game_name> Works like the -game argument\n"@
" -dir <dir_name> Add <dir_name> to list of directories\n"@
" -console Open a separate console\n"@
" -jSave <file_name> Record a journal\n"@
" -jPlay <file_name> Play back a journal\n"@
" -help Display this help message\n"
);
}
//--------------------------------------------------------------------------
// Default to a new logfile each session.
if( !$logModeSpecified )
{
if( $platform !$= "xbox" && $platform !$= "xenon" )
setLogMode(6);
}
// Get the first dir on the list, which will be the last to be applied... this
// does not modify the list.
nextToken($userDirs, currentMod, ";");
// Execute startup scripts for each mod, starting at base and working up
function loadDir(%dir)
{
pushback($userDirs, %dir, ";");
if (isScriptFile(%dir @ "/main.cs"))
exec(%dir @ "/main.cs");
}
echo("--------- Loading DIRS ---------");
function loadDirs(%dirPath)
{
%dirPath = nextToken(%dirPath, token, ";");
if (%dirPath !$= "")
loadDirs(%dirPath);
if(exec(%token @ "/main.cs") != true)
{
error("Error: Unable to find specified directory: " @ %token );
$dirCount--;
}
}
loadDirs($userDirs);
echo("");
if($dirCount == 0) {
enableWinConsole(true);
error("Error: Unable to load any specified directories");
quit();
}
// Parse the command line arguments
echo("--------- Parsing Arguments ---------");
parseArgs();
// Either display the help message or startup the app.
if ($displayHelp) {
enableWinConsole(true);
displayHelp();
quit();
}
else {
onStart();
echo("Engine initialized...");
ModuleDatabase.scanModules( "" );
//You can also explicitly decalre some modules here to be loaded by default if they are part of your game
//Ex: ModuleDatabase.LoadExplicit( "AppCore" );
if( !$isDedicated )
{
// As we know at this point that the initial load is complete,
// we can hide any splash screen we have, and show the canvas.
// This keeps things looking nice, instead of having a blank window
closeSplashWindow();
Canvas.showWindow();
}
// Auto-load on the 360
if( $platform $= "xenon" )
{
%mission = "levels/Empty Terrain.mis";
echo("Xbox360 Autoloading level: '" @ %mission @ "'");
if ($pref::HostMultiPlayer)
%serverType = "MultiPlayer";
else
%serverType = "SinglePlayer";
createAndConnectToLocalServer( %serverType, %mission );
}
}
// Display an error message for unused arguments
for ($i = 1; $i < $Game::argc; $i++) {
if (!$argUsed[$i])
error("Error: Unknown command line argument: " @ $Game::argv[$i]);
}
// Automatically start up the appropriate eidtor, if any
if ($startWorldEditor) {
Canvas.setCursor("DefaultCursor");
Canvas.setContent(EditorChooseLevelGui);
} else if ($startGUIEditor) {
Canvas.setCursor("DefaultCursor");
Canvas.setContent(EditorChooseGUI);
}