Browse Source

Caught the main modules up to new module script file paradigm
Have initServer only get called when a server is actually started for the first time
Added utility method callGamemodeFunction to streamline exec'ing of gamemode function calls
Added onClientConnect gamemode function, called when the client establishes the connection
Added onInitialControlSet gamemode function, called when the client actively gains control in the game, to allow gamemodes to special override GUI settings or input commands
Cleaned up init'ng of the engine so stock UI module isn't required to trip configuration of the canvas
Added fallback so if nothing set the main content control for the UI after boot, we attempt to set the defined mainMenuGUI, on the chance nothing explicitly sets it on load

Areloch 6 years ago
parent
commit
99cee7f32a

+ 0 - 1
Templates/BaseGame/game/core/Core.cs

@@ -1,7 +1,6 @@
 
 function CoreModule::onCreate(%this)
 {
-   
    // ----------------------------------------------------------------------------
    // Initialize core sub system functionality such as audio, the Canvas, PostFX,
    // rendermanager, light managers, etc.

+ 5 - 5
Templates/BaseGame/game/core/clientServer/Core_ClientServer.cs

@@ -12,17 +12,17 @@
 // When a local game is started - a listen server - via calling StartGame() a server is created and then the client is
 // connected to it via createAndConnectToLocalServer().
 
-function Core_ClientServer::create( %this )
+function Core_ClientServer::onCreate( %this )
 {
    echo("\n--------- Initializing Directory: scripts ---------");
    exec( "./scripts/client/client.cs" );
    exec( "./scripts/server/server.cs" );
 
    $Game::MainScene = getScene(0);
-
-   initServer();
    
-   %dbList = new ArrayObject(DatablockFilesList);
+   new ArrayObject(DatablockFilesList);
+   
+   $Game::firstTimeServerRun = true;
 
    // Start up in either client, or dedicated server mode
    if ($Server::Dedicated)
@@ -35,7 +35,7 @@ function Core_ClientServer::create( %this )
    }
 }
 
-function Core_ClientServer::destroy( %this )
+function Core_ClientServer::onDestroy( %this )
 {
    // Ensure that we are disconnected and/or the server is destroyed.
    // This prevents crashes due to the SceneGraph being deleted before

+ 2 - 2
Templates/BaseGame/game/core/clientServer/Core_ClientServer.module

@@ -3,7 +3,7 @@
 	VersionId="1"
 	Description="Default module for the game."
 	ScriptFile="Core_ClientServer.cs"
-	CreateFunction="create"
-	DestroyFunction="destroy"
+	CreateFunction="onCreate"
+	DestroyFunction="onDestroy"
 	Group="Core">
 </ModuleDefinition>

+ 3 - 0
Templates/BaseGame/game/core/clientServer/scripts/client/connectionToServer.cs

@@ -50,6 +50,9 @@ function GameConnection::initialControlSet(%this)
       
       if (isObject(%playGUIName) && Canvas.getContent() != %playGUIName.getId())
          Canvas.setContent(%playGUIName);
+         
+      //We allow the gamemodes to step in and override the canvas setting, or do any special input overrides here
+      %hasGameMode = callGamemodeFunction("onInitialControlSet");
    }
 }
 

+ 3 - 27
Templates/BaseGame/game/core/clientServer/scripts/server/connectionToClient.cs

@@ -81,6 +81,8 @@ function GameConnection::onConnect( %this, %clientData )
 	
 	%this.connectData = %clientData;
 	
+	callGamemodeFunction("onClientConnect", %this);
+	
 	$Server::PlayerCount++;
 }
 
@@ -151,33 +153,7 @@ function GameConnection::onDrop(%client, %reason)
    
    if($missionRunning)
    {
-      %hasGameMode = 0;
-      for(%i=0; %i < %activeSceneCount; %i++)
-      {
-         if(getScene(%i).gameModeName !$= "")
-         {
-            //if the scene defines a game mode, go ahead and envoke it here
-            if(isMethod(getScene(%i).gameModeName, "onClientLeaveGame"))
-            {
-               eval(getScene(%i).gameModeName @ "::onClientLeaveGame(" @ %client @ ");" );
-               %hasGameMode = 1;
-            }
-         }
-      }
-      
-      //if none of our scenes have gamemodes, we need to kick off a default
-      if(%hasGameMode == 0)
-      {
-         %defaultModeName = ProjectSettings.value("Gameplay/GameModes/defaultModeName");
-         if(%defaultModeName !$= "")
-         {
-            if(isMethod(%defaultModeName, "onClientLeaveGame"))
-            {
-               eval(%defaultModeName @ "::onClientLeaveGame(" @ %client @ ");" );
-               %hasGameMode = 1;
-            }
-         }
-      }  
+      %hasGameMode = callGamemodeFunction("onClientLeaveGame", %client);
    }
    
    removeFromServerGuidList( %client.guid );

+ 1 - 27
Templates/BaseGame/game/core/clientServer/scripts/server/levelDownload.cs

@@ -150,33 +150,7 @@ function serverCmdMissionStartPhase3Ack(%client, %seq)
    
    %activeSceneCount = getSceneCount();
    
-   %hasGameMode = 0;
-   for(%i=0; %i < %activeSceneCount; %i++)
-   {
-      if(getScene(%i).gameModeName !$= "")
-      {
-         //if the scene defines a game mode, go ahead and envoke it here
-         if(isMethod(getScene(%i).gameModeName, "onClientEnterGame"))
-         {
-            eval(getScene(%i).gameModeName @ "::onClientEnterGame(" @ %client @ ");" );
-            %hasGameMode = 1;
-         }
-      }
-   }
-   
-   //if none of our scenes have gamemodes, we need to kick off a default
-   if(%hasGameMode == 0)
-   {
-      %defaultModeName = ProjectSettings.value("Gameplay/GameModes/defaultModeName");
-      if(%defaultModeName !$= "")
-      {
-         if(isMethod(%defaultModeName, "onClientEnterGame"))
-         {
-            eval(%defaultModeName @ "::onClientEnterGame(" @ %client @ ");" );
-            %hasGameMode = 1;
-         }
-      }
-   }
+   %hasGameMode = callGamemodeFunction("onClientEnterGame", %client);
    
    //if that also failed, just spawn a camera
    if(%hasGameMode == 0)

+ 3 - 81
Templates/BaseGame/game/core/clientServer/scripts/server/levelLoad.cs

@@ -137,33 +137,7 @@ function loadMissionStage2()
    // Go ahead and launch the game
    %activeSceneCount = getSceneCount();
    
-   %hasGameMode = 0;
-   for(%i=0; %i < %activeSceneCount; %i++)
-   {
-      if(getScene(%i).gameModeName !$= "")
-      {
-         //if the scene defines a game mode, go ahead and envoke it here
-         if(isMethod(getScene(%i).gameModeName, "onMissionStart"))
-         {
-            eval(getScene(%i).gameModeName @ "::onMissionStart();" );
-            %hasGameMode = 1;
-         }
-      }
-   }
-   
-   //if none of our scenes have gamemodes, we need to kick off a default
-   if(%hasGameMode == 0)
-   {
-      %defaultModeName = ProjectSettings.value("Gameplay/GameModes/defaultModeName");
-      if(%defaultModeName !$= "")
-      {
-         if(isMethod(%defaultModeName, "onMissionStart"))
-         {
-            eval(%defaultModeName @ "::onMissionStart();" );
-            %hasGameMode = 1;
-         }
-      }
-   }
+   %hasGameMode = callGamemodeFunction("onMissionStart");
 }
 
 function endMission()
@@ -176,33 +150,7 @@ function endMission()
    // Inform the game code we're done.
    %activeSceneCount = getSceneCount();
    
-   %hasGameMode = 0;
-   for(%i=0; %i < %activeSceneCount; %i++)
-   {
-      if(getScene(%i).gameModeName !$= "")
-      {
-         //if the scene defines a game mode, go ahead and envoke it here
-         if(isMethod(getScene(%i).gameModeName, "onMissionEnded"))
-         {
-            eval(getScene(%i).gameModeName @ "::onMissionEnded();" );
-            %hasGameMode = 1;
-         }
-      }
-   }
-   
-   //if none of our scenes have gamemodes, we need to kick off a default
-   if(%hasGameMode == 0)
-   {
-      %defaultModeName = ProjectSettings.value("Gameplay/GameModes/defaultModeName");
-      if(%defaultModeName !$= "")
-      {
-         if(isMethod(%defaultModeName, "onMissionEnded"))
-         {
-            eval(%defaultModeName @ "::onMissionEnded();" );
-            %hasGameMode = 1;
-         }
-      }
-   }
+   %hasGameMode = callGamemodeFunction("onMissionEnded");
 
    // Inform the clients
    for( %clientIndex = 0; %clientIndex < ClientGroup.getCount(); %clientIndex++ ) {
@@ -235,31 +183,5 @@ function resetMission()
    // Inform the game code we're resetting.
    %activeSceneCount = getSceneCount();
    
-   %hasGameMode = 0;
-   for(%i=0; %i < %activeSceneCount; %i++)
-   {
-      if(getScene(%i).gameModeName !$= "")
-      {
-         //if the scene defines a game mode, go ahead and envoke it here
-         if(isMethod(getScene(%i).gameModeName, "onMissionReset"))
-         {
-            eval(getScene(%i).gameModeName @ "::onMissionReset(" @ %client @ ");" );
-            %hasGameMode = 1;
-         }
-      }
-   }
-   
-   //if none of our scenes have gamemodes, we need to kick off a default
-   if(%hasGameMode == 0)
-   {
-      %defaultModeName = ProjectSettings.value("Gameplay/GameModes/defaultModeName");
-      if(%defaultModeName !$= "")
-      {
-         if(isMethod(%defaultModeName, "onMissionReset"))
-         {
-            eval(%defaultModeName @ "::onMissionReset(" @ %client @ ");" );
-            %hasGameMode = 1;
-         }
-      }
-   }
+   %hasGameMode = callGamemodeFunction("onMissionReset", %client);
 }

+ 5 - 4
Templates/BaseGame/game/core/clientServer/scripts/server/server.cs

@@ -126,6 +126,11 @@ function createAndConnectToLocalServer( %serverType, %level )
 /// Specify the level to load on the server
 function createServer(%serverType, %level)
 {
+   if($Game::firstTimeServerRun == true)
+   {
+      initServer();
+      $Game::firstTimeServerRun = false;
+   }
    // Increase the server session number.  This is used to make sure we're
    // working with the server session we think we are.
    $Server::Session++;
@@ -197,12 +202,8 @@ function onServerCreated()
 
    physicsStartSimulation("server");
    
-   %cnt = DatablockFilesList.count();
-
    loadDatablockFiles( DatablockFilesList, true );
    
-   %cnt = DatablockFilesList.count();
-   
    // Keep track of when the game started
    $Game::StartTime = $Sim::Time;
 

+ 29 - 0
Templates/BaseGame/game/core/rendering/Core_Rendering.cs

@@ -20,4 +20,33 @@ function Core_Rendering::onCreate(%this)
 
 function Core_Rendering::onDestroy(%this)
 {
+}
+
+function Core_Rendering::initClient(%this)
+{
+   // Start rendering and stuff.
+   initRenderManager();
+   initLightingSystems("Advanced Lighting"); 
+
+   //load prefs
+   %prefPath = getPrefpath();
+   if ( isFile( %prefPath @ "/clientPrefs.cs" ) )
+      exec( %prefPath @ "/clientPrefs.cs" );
+   else
+      exec("data/defaults.cs");
+   
+   configureCanvas();
+   
+   //Autodetect settings if it's our first time
+   if($pref::Video::autoDetect)
+      GraphicsMenu.Autodetect();
+
+   postFXInit();
+   
+   closeSplashWindow();
+   
+   // 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
+   Canvas.showWindow();
 }

+ 1 - 0
Templates/BaseGame/game/core/utility/Core_Utility.cs

@@ -7,6 +7,7 @@ function Core_Utility::onCreate(%this)
    exec("./scripts/gameObjectManagement.cs");
    exec("./scripts/persistanceManagement.cs");
    exec("./scripts/module.cs");
+   exec("./scripts/scene.cs");
 }
 
 function Core_Utility::onDestroy(%this)

+ 36 - 0
Templates/BaseGame/game/core/utility/scripts/scene.cs

@@ -0,0 +1,36 @@
+function callGamemodeFunction(%gameModeFuncName, %data)
+{
+   if(%data !$= "")
+      %data = "\""@%data@"\"";
+      
+   %hasGameMode = 0;
+   for(%i=0; %i < %activeSceneCount; %i++)
+   {
+      if(getScene(%i).gameModeName !$= "")
+      {
+         //if the scene defines a game mode, go ahead and envoke it here
+         if(isMethod(getScene(%i).gameModeName, %gameModeFuncName))
+         {
+            
+            eval(getScene(%i).gameModeName @ "::"@%gameModeFuncName@"("@%data@");" );
+            %hasGameMode = 1;
+         }
+      }
+   }
+   
+   //if none of our scenes have gamemodes, we need to kick off a default
+   if(%hasGameMode == 0)
+   {
+      %defaultModeName = ProjectSettings.value("Gameplay/GameModes/defaultModeName");
+      if(%defaultModeName !$= "")
+      {
+         if(isMethod(%defaultModeName, %gameModeFuncName))
+         {
+            eval(%defaultModeName @ "::"@%gameModeFuncName@"("@%data@");" );
+            %hasGameMode = 1;
+         }
+      }
+   }  
+   
+   return %hasGameMode;
+}

+ 1 - 1
Templates/BaseGame/game/data/ExampleModule/ExampleModule.cs

@@ -31,7 +31,7 @@ function ExampleModule::onDestroy(%this)
 //Are called during the startup, shut down, and resetting of any and all active gamemodes, as informed by the loaded scenes
 //when the game server is processed.
 //These callbacks are activated in core/clientServer/scripts/server/levelLoad.cs
-function FPSGameplay::initServer(%this)
+function ExampleModule::initServer(%this)
 {
    //This script contains our ExampleGameMode logic
    exec("./scripts/ExampleGamemodeScript.cs");

+ 29 - 7
Templates/BaseGame/game/data/ExampleModule/scripts/ExampleGamemodeScript.cs

@@ -82,14 +82,10 @@ function ExampleGameMode::onGameDurationEnd()
       ExampleGameMode::onMissionEnded();
 }
 
-//This is called when a client enters the game server. It's used to spawn a player object
-//set up any client-specific properties such as saved configs, values, their name, etc
-//These callbacks are activated in core/clientServer/scripts/server/levelDownload.cs
-function ExampleGameMode::onClientEnterGame(%client)
+//This is called to actually spawn a control object for the player to utilize
+//A player character, spectator camera, etc.
+function ExampleGameMode::spawnControlObject(%client)
 {
-   //Set the player name based on the client's connection data
-   %client.setPlayerName(%client.connectData);
-
    //In this example, we just spawn a camera
    if (!isObject(%client.camera))
    {
@@ -116,6 +112,25 @@ function ExampleGameMode::onClientEnterGame(%client)
    }
 }
 
+//This is called when the client has initially established a connection to the game server
+//It's used for setting up anything ahead of time for the client, such as loading in client-passed
+//config stuffs, saved data or the like that should be handled BEFORE the client has actually entered
+//the game itself
+function ExampleGameMode::onClientConnect(%client)
+{
+}
+
+//This is called when a client enters the game server. It's used to spawn a player object
+//set up any client-specific properties such as saved configs, values, their name, etc
+//These callbacks are activated in core/clientServer/scripts/server/levelDownload.cs
+function ExampleGameMode::onClientEnterGame(%client)
+{
+   //Set the player name based on the client's connection data
+   %client.setPlayerName(%client.connectData);
+   
+   ExampleGameMode::spawnControlObject(%client);
+}
+
 //This is called when the player leaves the game server. It's used to clean up anything that
 //was spawned or setup for the client when it connected, in onClientEnterGame
 //These callbacks are activated in core/clientServer/scripts/server/levelDownload.cs
@@ -124,5 +139,12 @@ function ExampleGameMode::onClientLeaveGame(%client)
    // Cleanup the camera
    if (isObject(%client.camera))
       %client.camera.delete();
+}
 
+//This is called when the player has connected and finaly setup is done and control is handed
+//over to the client. It allows a point to special-case setting the client's canvas content
+//(Such as a gamemode-specific GUI) or setting up gamemode-specific keybinds/control schemes
+function ExampleGameMode::onInitialControlSet()
+{
+   
 }

+ 11 - 2
Templates/BaseGame/game/data/Kork/Kork.cs

@@ -1,10 +1,19 @@
 function Kork::onCreate(%this)
 {
-
 }
 
 function Kork::onDestroy(%this)
 {
-
 }
 
+function Kork::initServer(%this){}
+
+function Kork::onCreateGameServer(%this){}
+
+function Kork::onDestroyGameServer(%this){}
+
+function Kork::initClient(%this){}
+
+function Kork::onCreateClientConnection(%this){}
+
+function Kork::onDestroyClientConnection(%this){}

+ 11 - 2
Templates/BaseGame/game/data/SpaceOrc/SpaceOrc.cs

@@ -1,10 +1,19 @@
 function SpaceOrc::onCreate(%this)
 {
-
 }
 
 function SpaceOrc::onDestroy(%this)
 {
-
 }
 
+function SpaceOrc::initServer(%this){}
+
+function SpaceOrc::onCreateGameServer(%this){}
+
+function SpaceOrc::onDestroyGameServer(%this){}
+
+function SpaceOrc::initClient(%this){}
+
+function SpaceOrc::onCreateClientConnection(%this){}
+
+function SpaceOrc::onDestroyClientConnection(%this){}

+ 11 - 2
Templates/BaseGame/game/data/StaticShapeTest/StaticShapeTest.cs

@@ -1,10 +1,19 @@
 function StaticShapeTest::onCreate(%this)
 {
-
 }
 
 function StaticShapeTest::onDestroy(%this)
 {
-
 }
 
+function StaticShapeTest::initServer(%this){}
+
+function StaticShapeTest::onCreateGameServer(%this){}
+
+function StaticShapeTest::onDestroyGameServer(%this){}
+
+function StaticShapeTest::initClient(%this){}
+
+function StaticShapeTest::onCreateClientConnection(%this){}
+
+function StaticShapeTest::onDestroyClientConnection(%this){}

+ 20 - 10
Templates/BaseGame/game/data/gameUI/gameUI.cs

@@ -1,14 +1,24 @@
-function gameUI::create( %this )
+function gameUI::onCreate(%this)
 {
-   if (!$Server::Dedicated)
-   {
-      //guis
-      exec("./GUIs/playGui.gui");
-      exec("./GUIs/playGui.cs");
-   }
 }
 
-function gameUI::destroy( %this )
+function gameUI::onDestroy(%this)
 {
-   
-}
+}
+
+function gameUI::initServer(%this){}
+
+function gameUI::onCreateGameServer(%this){}
+
+function gameUI::onDestroyGameServer(%this){}
+
+function gameUI::initClient(%this)
+{
+   //guis
+   exec("./GUIs/playGui.gui");
+   exec("./GUIs/playGui.cs");
+}
+
+function gameUI::onCreateClientConnection(%this){}
+
+function gameUI::onDestroyClientConnection(%this){}

+ 4 - 9
Templates/BaseGame/game/data/ui/UI.cs

@@ -12,24 +12,19 @@
 // When a local game is started - a listen server - via calling StartGame() a server is created and then the client is
 // connected to it via createAndConnectToLocalServer().
 
-function UI::create( %this )
+function UI::onCreate( %this )
 {
-   if ($Server::Dedicated)
-      return;
-   
-   // Use our prefs to configure our Canvas/Window
-   configureCanvas();
 }
 
-function UI::destroy( %this )
+function UI::onDestroy( %this )
 {
 }
 
 function UI::initServer(%this){}
 
-function UI::onCreateServer(%this){}
+function UI::onCreateGameServer(%this){}
 
-function UI::onDestroyServer(%this){}
+function UI::onDestroyGameServer(%this){}
 
 function UI::initClient(%this)
 {

+ 2 - 2
Templates/BaseGame/game/data/ui/UI.module

@@ -3,7 +3,7 @@
 	VersionId="1"
 	Description="Module that implements the menus for the game."
 	ScriptFile="UI.cs"
-	CreateFunction="create"
-	DestroyFunction="destroy"
+	CreateFunction="onCreate"
+	DestroyFunction="onDestroy"
 	Group="Game">
 </ModuleDefinition>

+ 7 - 30
Templates/BaseGame/game/main.cs.in

@@ -28,37 +28,14 @@ ModuleDatabase.LoadGroup( "Game" );
 //Finally, initialize the client/server structure
 ModuleDatabase.LoadExplicit( "Core_ClientServer" );
 
-if( !$isDedicated )
+//If nothing else set a main menu, try to do so now
+if(!isObject(Canvas.getContent()))
 {
-   // Start rendering and stuff.
-   initRenderManager();
-   initLightingSystems("Advanced Lighting"); 
-
-   //load prefs
-   %prefPath = getPrefpath();
-   if ( isFile( %prefPath @ "/clientPrefs.cs" ) )
-      exec( %prefPath @ "/clientPrefs.cs" );
-   else
-      exec("data/defaults.cs");
-   
-   configureCanvas();
-   
-   //Autodetect settings if it's our first time
-   if($pref::Video::autoDetect)
-      GraphicsMenu.Autodetect();
-
-   postFXInit();
-   
-   closeSplashWindow();
-   
-   // 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
-   Canvas.showWindow();
-}
-else
-{
-   closeSplashWindow();
+   %mainMenuGUI = ProjectSettings.value("UI/mainMenuName");
+   if (isObject( %mainMenuGUI ))
+      Canvas.setContent( %mainMenuGUI );
 }
 
+closeSplashWindow();
+
 echo("Engine initialized...");

+ 115 - 115
Templates/BaseGame/game/tools/settings.xml

@@ -1,183 +1,172 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <EditorSettings>
-    <Group name="LevelInformation">
-        <Setting name="levelsDirectory">data/FPSGameplay/levels</Setting>
-        <Group name="levels">
-            <Group name="PbrMatTest.mis">
-                <Setting name="cameraSpeed">5</Setting>
-            </Group>
-            <Group name="BlankRoom.mis">
-                <Setting name="cameraSpeed">25</Setting>
-            </Group>
-        </Group>
+    <Group name="Theme">
+        <Setting name="fieldTextSELColor">240 240 240 255</Setting>
+        <Setting name="fieldBGSELColor">100 98 96 255</Setting>
+        <Setting name="dividerLightColor">96 94 92 255</Setting>
+        <Setting name="headerColor">50 49 48 255</Setting>
+        <Setting name="tabsSELColor">59 58 57 255</Setting>
+        <Setting name="tabsHLColor">50 49 48 255</Setting>
+        <Setting name="fieldTextHLColor">234 232 230 255</Setting>
+        <Setting name="windowBackgroundColor">32 31 30 255</Setting>
+        <Setting name="headerTextColor">236 234 232 255</Setting>
+        <Setting name="fieldBGColor">59 58 57 255</Setting>
+        <Setting name="tooltipBGColor">43 43 43 255</Setting>
+        <Setting name="fieldTextColor">178 175 172 255</Setting>
+        <Setting name="dividerMidColor">50 49 48 255</Setting>
+        <Setting name="dividerDarkColor">17 16 15 255</Setting>
+        <Setting name="tooltipDividerColor">72 70 68 255</Setting>
+        <Setting name="fieldBGHLColor">72 70 68 255</Setting>
+        <Setting name="tooltipTextColor">255 255 255 255</Setting>
+        <Setting name="tabsColor">37 36 35 255</Setting>
     </Group>
     <Group name="AxisGizmo">
-        <Setting name="rotationSnap">15</Setting>
-        <Setting name="mouseScaleScalar">0.8</Setting>
-        <Setting name="renderWhenUsed">0</Setting>
+        <Setting name="axisGizmoMaxScreenLen">100</Setting>
         <Setting name="snapRotations">0</Setting>
+        <Setting name="rotationSnap">15</Setting>
         <Setting name="mouseRotateScalar">0.8</Setting>
+        <Setting name="mouseScaleScalar">0.8</Setting>
         <Setting name="renderInfoText">1</Setting>
-        <Setting name="axisGizmoMaxScreenLen">100</Setting>
+        <Setting name="renderWhenUsed">0</Setting>
         <Group name="Grid">
+            <Setting name="renderPlane">0</Setting>
             <Setting name="gridColor">255 255 255 20</Setting>
-            <Setting name="snapToGrid">0</Setting>
             <Setting name="planeDim">500</Setting>
-            <Setting name="renderPlane">0</Setting>
-            <Setting name="gridSize">10 10 10</Setting>
             <Setting name="renderPlaneHashes">0</Setting>
-        </Group>
-    </Group>
-    <Group name="TerrainEditor">
-        <Setting name="currentAction">lowerHeight</Setting>
-        <Group name="Brush">
-            <Setting name="brushSoftness">1</Setting>
-            <Setting name="brushType">ellipse</Setting>
-            <Setting name="maxBrushSize">40 40</Setting>
-            <Setting name="brushPressure">1</Setting>
-            <Setting name="brushSize">40 40</Setting>
-        </Group>
-        <Group name="ActionValues">
-            <Setting name="noiseFactor">1</Setting>
-            <Setting name="adjustHeightVal">10</Setting>
-            <Setting name="SlopeMinAngle">0</Setting>
-            <Setting name="SlopeMaxAngle">90</Setting>
-            <Setting name="softSelectDefaultFilter">1.000000 0.833333 0.666667 0.500000 0.333333 0.166667 0.000000</Setting>
-            <Setting name="softSelectFilter">1.000000 0.833333 0.666667 0.500000 0.333333 0.166667 0.000000</Setting>
-            <Setting name="smoothFactor">0.1</Setting>
-            <Setting name="scaleVal">1</Setting>
-            <Setting name="softSelectRadius">50</Setting>
-            <Setting name="setHeightVal">100</Setting>
+            <Setting name="snapToGrid">0</Setting>
+            <Setting name="gridSize">10 10 10</Setting>
         </Group>
     </Group>
     <Group name="WorldEditor">
+        <Setting name="undoLimit">40</Setting>
+        <Setting name="orthoFOV">50</Setting>
         <Setting name="displayType">6</Setting>
+        <Setting name="forceLoadDAE">0</Setting>
         <Setting name="orthoShowGrid">1</Setting>
-        <Setting name="undoLimit">40</Setting>
-        <Setting name="dropType">screenCenter</Setting>
         <Setting name="torsionPath">AssetWork_Debug.exe</Setting>
-        <Setting name="forceLoadDAE">0</Setting>
-        <Setting name="orthoFOV">50</Setting>
+        <Setting name="dropType">screenCenter</Setting>
         <Setting name="currentEditor">WorldEditorInspectorPlugin</Setting>
+        <Group name="Grid">
+            <Setting name="gridOriginColor">255 255 255 100</Setting>
+            <Setting name="gridColor">102 102 102 100</Setting>
+            <Setting name="gridSnap">0</Setting>
+            <Setting name="gridSize">1</Setting>
+            <Setting name="gridMinorColor">51 51 51 100</Setting>
+        </Group>
         <Group name="Docs">
-            <Setting name="documentationReference">../../../Documentation/Torque 3D - Script Manual.chm</Setting>
+            <Setting name="documentationURL">http://www.garagegames.com/products/torque-3d/documentation/user</Setting>
             <Setting name="forumURL">http://www.garagegames.com/products/torque-3d/forums</Setting>
             <Setting name="documentationLocal">../../../Documentation/Official Documentation.html</Setting>
-            <Setting name="documentationURL">http://www.garagegames.com/products/torque-3d/documentation/user</Setting>
+            <Setting name="documentationReference">../../../Documentation/Torque 3D - Script Manual.chm</Setting>
         </Group>
         <Group name="Color">
-            <Setting name="objSelectColor">255 0 0 255</Setting>
             <Setting name="popupBackgroundColor">100 100 100 255</Setting>
+            <Setting name="objMouseOverColor">0 255 0 255</Setting>
+            <Setting name="objMouseOverSelectColor">0 0 255 255</Setting>
             <Setting name="dragRectColor">255 255 0 255</Setting>
             <Setting name="selectionBoxColor">255 255 0 255</Setting>
+            <Setting name="objSelectColor">255 0 0 255</Setting>
             <Setting name="objectTextColor">255 255 255 255</Setting>
-            <Setting name="objMouseOverColor">0 255 0 255</Setting>
-            <Setting name="objMouseOverSelectColor">0 0 255 255</Setting>
+        </Group>
+        <Group name="Theme">
+            <Setting name="windowTitleFontHLColor">255 255 255 255</Setting>
+            <Setting name="windowTitleBGNAColor">180 180 180 255</Setting>
+            <Setting name="windowTitleBGHLColor">48 48 48 255</Setting>
+            <Setting name="windowTitleFontColor">215 215 215 255</Setting>
+            <Setting name="windowTitleBGColor">50 50 50 255</Setting>
+        </Group>
+        <Group name="ObjectIcons">
+            <Setting name="fadeIconsEndDist">20</Setting>
+            <Setting name="fadeIconsStartAlpha">255</Setting>
+            <Setting name="fadeIconsEndAlpha">0</Setting>
+            <Setting name="fadeIcons">1</Setting>
+            <Setting name="fadeIconsStartDist">8</Setting>
         </Group>
         <Group name="Render">
-            <Setting name="renderSelectionBox">1</Setting>
             <Setting name="showMousePopupInfo">1</Setting>
-            <Setting name="renderObjText">1</Setting>
-            <Setting name="renderObjHandle">1</Setting>
             <Setting name="renderPopupBackground">1</Setting>
-        </Group>
-        <Group name="Grid">
-            <Setting name="gridOriginColor">255 255 255 100</Setting>
-            <Setting name="gridSize">1</Setting>
-            <Setting name="gridColor">102 102 102 100</Setting>
-            <Setting name="gridMinorColor">51 51 51 100</Setting>
-            <Setting name="gridSnap">0</Setting>
+            <Setting name="renderSelectionBox">1</Setting>
+            <Setting name="renderObjHandle">1</Setting>
+            <Setting name="renderObjText">1</Setting>
         </Group>
         <Group name="Tools">
-            <Setting name="dropAtScreenCenterMax">100</Setting>
-            <Setting name="dropAtScreenCenterScalar">1</Setting>
             <Setting name="snapGround">0</Setting>
-            <Setting name="boundingBoxCollision">0</Setting>
-            <Setting name="snapSoftSize">2</Setting>
             <Setting name="snapSoft">0</Setting>
+            <Setting name="dropAtScreenCenterScalar">1</Setting>
+            <Setting name="boundingBoxCollision">0</Setting>
             <Setting name="objectsUseBoxCenter">1</Setting>
-        </Group>
-        <Group name="Theme">
-            <Setting name="windowTitleBGColor">50 50 50 255</Setting>
-            <Setting name="windowTitleBGNAColor">180 180 180 255</Setting>
-            <Setting name="windowTitleFontColor">215 215 215 255</Setting>
-            <Setting name="windowTitleFontHLColor">255 255 255 255</Setting>
-            <Setting name="windowTitleBGHLColor">48 48 48 255</Setting>
+            <Setting name="dropAtScreenCenterMax">100</Setting>
+            <Setting name="snapSoftSize">2</Setting>
         </Group>
         <Group name="Images">
-            <Setting name="defaultHandle">tools/worldEditor/images/DefaultHandle</Setting>
-            <Setting name="selectHandle">tools/worldEditor/images/SelectHandle</Setting>
             <Setting name="lockedHandle">tools/worldEditor/images/LockedHandle</Setting>
-        </Group>
-        <Group name="ObjectIcons">
-            <Setting name="fadeIconsEndDist">20</Setting>
-            <Setting name="fadeIconsStartDist">8</Setting>
-            <Setting name="fadeIcons">1</Setting>
-            <Setting name="fadeIconsEndAlpha">0</Setting>
-            <Setting name="fadeIconsStartAlpha">255</Setting>
+            <Setting name="selectHandle">tools/worldEditor/images/SelectHandle</Setting>
+            <Setting name="defaultHandle">tools/worldEditor/images/DefaultHandle</Setting>
         </Group>
     </Group>
     <Group name="GuiEditor">
-        <Setting name="previewResolution">1024 768</Setting>
         <Setting name="lastPath">tools/gui</Setting>
-        <Group name="Snapping">
-            <Setting name="snap2Grid">0</Setting>
-            <Setting name="snapToCanvas">1</Setting>
-            <Setting name="snapToGuides">1</Setting>
-            <Setting name="snapToCenters">1</Setting>
-            <Setting name="snapToControls">1</Setting>
-            <Setting name="snap2GridSize">8</Setting>
-            <Setting name="sensitivity">2</Setting>
-            <Setting name="snapToEdges">1</Setting>
-        </Group>
+        <Setting name="previewResolution">1024 768</Setting>
         <Group name="Rendering">
-            <Setting name="drawGuides">1</Setting>
             <Setting name="drawBorderLines">1</Setting>
+            <Setting name="drawGuides">1</Setting>
         </Group>
         <Group name="Help">
-            <Setting name="documentationURL">http://www.garagegames.com/products/torque-3d/documentation/user</Setting>
-            <Setting name="documentationReference">../../../Documentation/Torque 3D - Script Manual.chm</Setting>
             <Setting name="documentationLocal">../../../Documentation/Official Documentation.html</Setting>
+            <Setting name="documentationReference">../../../Documentation/Torque 3D - Script Manual.chm</Setting>
+            <Setting name="documentationURL">http://www.garagegames.com/products/torque-3d/documentation/user</Setting>
+        </Group>
+        <Group name="Snapping">
+            <Setting name="snapToGuides">1</Setting>
+            <Setting name="snapToControls">1</Setting>
+            <Setting name="snapToEdges">1</Setting>
+            <Setting name="snapToCanvas">1</Setting>
+            <Setting name="snapToCenters">1</Setting>
+            <Setting name="sensitivity">2</Setting>
+            <Setting name="snap2Grid">0</Setting>
+            <Setting name="snap2GridSize">8</Setting>
         </Group>
         <Group name="Selection">
             <Setting name="fullBox">0</Setting>
         </Group>
         <Group name="EngineDevelopment">
             <Setting name="toggleIntoEditor">0</Setting>
-            <Setting name="showEditorGuis">0</Setting>
             <Setting name="showEditorProfiles">0</Setting>
+            <Setting name="showEditorGuis">0</Setting>
         </Group>
         <Group name="Library">
             <Setting name="viewType">Categorized</Setting>
         </Group>
     </Group>
+    <Group name="TerrainEditor">
+        <Setting name="currentAction">lowerHeight</Setting>
+        <Group name="ActionValues">
+            <Setting name="SlopeMinAngle">0</Setting>
+            <Setting name="noiseFactor">1</Setting>
+            <Setting name="setHeightVal">100</Setting>
+            <Setting name="softSelectFilter">1.000000 0.833333 0.666667 0.500000 0.333333 0.166667 0.000000</Setting>
+            <Setting name="scaleVal">1</Setting>
+            <Setting name="softSelectRadius">50</Setting>
+            <Setting name="smoothFactor">0.1</Setting>
+            <Setting name="softSelectDefaultFilter">1.000000 0.833333 0.666667 0.500000 0.333333 0.166667 0.000000</Setting>
+            <Setting name="adjustHeightVal">10</Setting>
+            <Setting name="SlopeMaxAngle">90</Setting>
+        </Group>
+        <Group name="Brush">
+            <Setting name="maxBrushSize">40 40</Setting>
+            <Setting name="brushSize">40 40</Setting>
+            <Setting name="brushType">ellipse</Setting>
+            <Setting name="brushPressure">1</Setting>
+            <Setting name="brushSoftness">1</Setting>
+        </Group>
+    </Group>
     <Group name="RiverEditor">
         <Setting name="DefaultNormal">0 0 1</Setting>
         <Setting name="DefaultWidth">10</Setting>
-        <Setting name="SelectedSplineColor">0 255 0 255</Setting>
-        <Setting name="HoverSplineColor">255 0 0 255</Setting>
         <Setting name="HoverNodeColor">255 255 255 255</Setting>
+        <Setting name="SelectedSplineColor">0 255 0 255</Setting>
         <Setting name="DefaultDepth">5</Setting>
-    </Group>
-    <Group name="Theme">
-        <Setting name="tooltipBGColor">43 43 43 255</Setting>
-        <Setting name="tooltipTextColor">255 255 255 255</Setting>
-        <Setting name="fieldTextSELColor">240 240 240 255</Setting>
-        <Setting name="fieldBGHLColor">72 70 68 255</Setting>
-        <Setting name="fieldBGColor">59 58 57 255</Setting>
-        <Setting name="fieldTextHLColor">234 232 230 255</Setting>
-        <Setting name="tabsColor">37 36 35 255</Setting>
-        <Setting name="dividerMidColor">50 49 48 255</Setting>
-        <Setting name="headerColor">50 49 48 255</Setting>
-        <Setting name="fieldBGSELColor">100 98 96 255</Setting>
-        <Setting name="windowBackgroundColor">32 31 30 255</Setting>
-        <Setting name="dividerLightColor">96 94 92 255</Setting>
-        <Setting name="dividerDarkColor">17 16 15 255</Setting>
-        <Setting name="fieldTextColor">178 175 172 255</Setting>
-        <Setting name="tooltipDividerColor">72 70 68 255</Setting>
-        <Setting name="headerTextColor">236 234 232 255</Setting>
-        <Setting name="tabsHLColor">50 49 48 255</Setting>
-        <Setting name="tabsSELColor">59 58 57 255</Setting>
+        <Setting name="HoverSplineColor">255 0 0 255</Setting>
     </Group>
     <Group name="ConvexEditor">
         <Setting name="materialName">Grid_512_Orange</Setting>
@@ -185,4 +174,15 @@
     <Group name="NavEditor">
         <Setting name="SpawnClass">AIPlayer</Setting>
     </Group>
+    <Group name="LevelInformation">
+        <Setting name="levelsDirectory">data/FPSGameplay/levels</Setting>
+        <Group name="levels">
+            <Group name="PbrMatTest.mis">
+                <Setting name="cameraSpeed">5</Setting>
+            </Group>
+            <Group name="BlankRoom.mis">
+                <Setting name="cameraSpeed">25</Setting>
+            </Group>
+        </Group>
+    </Group>
 </EditorSettings>