diff --git a/Engine/source/T3D/Scene.cpp b/Engine/source/T3D/Scene.cpp index aeed7399b..b08e59a8f 100644 --- a/Engine/source/T3D/Scene.cpp +++ b/Engine/source/T3D/Scene.cpp @@ -12,7 +12,7 @@ Scene::Scene() : mIsEditing(false), mIsDirty(false) { - + mGameModeName = StringTable->EmptyString(); } Scene::~Scene() @@ -29,6 +29,10 @@ void Scene::initPersistFields() addField("isEditing", TypeBool, Offset(mIsEditing, Scene), "", AbstractClassRep::FIELD_HideInInspectors); addField("isDirty", TypeBool, Offset(mIsDirty, Scene), "", AbstractClassRep::FIELD_HideInInspectors); endGroup("Internal"); + + addGroup("Gameplay"); + addField("gameModeName", TypeString, Offset(mGameModeName, Scene), "The name of the gamemode that this scene utilizes"); + endGroup("Gameplay"); } bool Scene::onAdd() @@ -186,6 +190,13 @@ DefineEngineFunction(getScene, Scene*, (U32 sceneId), (0), return Scene::smSceneList[sceneId]; } +DefineEngineFunction(getSceneCount, S32, (),, + "Get the number of active Scene objects that are loaded.\n" + "@return The number of active scenes") +{ + return Scene::smSceneList.size(); +} + DefineEngineFunction(getRootScene, S32, (), , "Get the root Scene object that is loaded.\n" "@return The id of the Root Scene. Will be 0 if no root scene is loaded") diff --git a/Engine/source/T3D/Scene.h b/Engine/source/T3D/Scene.h index 111044247..8d56ff7aa 100644 --- a/Engine/source/T3D/Scene.h +++ b/Engine/source/T3D/Scene.h @@ -35,6 +35,8 @@ class Scene : public NetObject, public virtual ITickable bool mIsDirty; + StringTableEntry mGameModeName; + protected: static Scene * smRootScene; @@ -76,4 +78,4 @@ public: } static Vector smSceneList; -}; \ No newline at end of file +}; diff --git a/Templates/BaseGame/game/core/Core.cs b/Templates/BaseGame/game/core/Core.cs index af6f97b8a..ae744e7a0 100644 --- a/Templates/BaseGame/game/core/Core.cs +++ b/Templates/BaseGame/game/core/Core.cs @@ -25,7 +25,6 @@ function CoreModule::onCreate(%this) ModuleDatabase.LoadExplicit( "Core_PostFX" ); ModuleDatabase.LoadExplicit( "Core_Components" ); ModuleDatabase.LoadExplicit( "Core_GameObjects" ); - ModuleDatabase.LoadExplicit( "Core_ClientServer" ); new Settings(ProjectSettings) { file = "core/settings.xml"; }; ProjectSettings.read(); diff --git a/Templates/BaseGame/game/core/clientServer/scripts/client/client.cs b/Templates/BaseGame/game/core/clientServer/scripts/client/client.cs index 590119935..6547e9915 100644 --- a/Templates/BaseGame/game/core/clientServer/scripts/client/client.cs +++ b/Templates/BaseGame/game/core/clientServer/scripts/client/client.cs @@ -20,6 +20,8 @@ function initClient() exec( %prefPath @ "/clientPrefs.cs" ); else exec( "data/defaults.cs" ); + + callOnModules("initClient"); loadMaterials(); diff --git a/Templates/BaseGame/game/core/clientServer/scripts/client/connectionToServer.cs b/Templates/BaseGame/game/core/clientServer/scripts/client/connectionToServer.cs index e5dff5e78..f0ce66672 100644 --- a/Templates/BaseGame/game/core/clientServer/scripts/client/connectionToServer.cs +++ b/Templates/BaseGame/game/core/clientServer/scripts/client/connectionToServer.cs @@ -32,18 +32,7 @@ function GameConnection::onConnectionAccepted(%this) // datablocks and objects are ghosted over. physicsInitWorld( "client" ); - //Get our modules so we can exec any specific client-side loading/handling - %modulesList = ModuleDatabase.findModules(true); - for(%i=0; %i < getWordCount(%modulesList); %i++) - { - %module = getWord(%modulesList, %i); - %moduleID = %module.ModuleId; - - if(%module.scopeSet.isMethod("onCreateClient")) - { - eval(%module.scopeSet @ ".onCreateClient();"); - } - } + callOnModules("onCreateClient", "Game"); } function GameConnection::initialControlSet(%this) @@ -141,14 +130,5 @@ function disconnectedCleanup() // We can now delete the client physics simulation. physicsDestroyWorld( "client" ); - //Get our modules so we can exec any specific client-side loading/handling - %modulesList = ModuleDatabase.findModules(true); - for(%i=0; %i < getWordCount(%modulesList); %i++) - { - %module = getWord(%modulesList, %i); - if(%module.scopeSet.isMethod("onDestroyClient")) - { - eval(%module.scopeSet @ ".onDestroyClient();"); - } - } + callOnModules("onDestroyClient", "Game"); } diff --git a/Templates/BaseGame/game/core/clientServer/scripts/server/connectionToClient.cs b/Templates/BaseGame/game/core/clientServer/scripts/server/connectionToClient.cs index 38709c971..1f6ef8598 100644 --- a/Templates/BaseGame/game/core/clientServer/scripts/server/connectionToClient.cs +++ b/Templates/BaseGame/game/core/clientServer/scripts/server/connectionToClient.cs @@ -150,7 +150,35 @@ function GameConnection::onDrop(%client, %reason) } if($missionRunning) - theLevelInfo.onClientLeaveGame(); + { + %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; + } + } + } + } removeFromServerGuidList( %client.guid ); diff --git a/Templates/BaseGame/game/core/clientServer/scripts/server/levelDownload.cs b/Templates/BaseGame/game/core/clientServer/scripts/server/levelDownload.cs index e33f80711..fac9b4530 100644 --- a/Templates/BaseGame/game/core/clientServer/scripts/server/levelDownload.cs +++ b/Templates/BaseGame/game/core/clientServer/scripts/server/levelDownload.cs @@ -148,12 +148,38 @@ function serverCmdMissionStartPhase3Ack(%client, %seq) %entity.notify("onClientConnect", %client); } - //Have any special game-play handling here - if(theLevelInfo.isMethod("onClientEnterGame")) + %activeSceneCount = getSceneCount(); + + %hasGameMode = 0; + for(%i=0; %i < %activeSceneCount; %i++) { - theLevelInfo.onClientEnterGame(%client); + 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; + } + } } - else + + //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; + } + } + } + + //if that also failed, just spawn a camera + if(%hasGameMode == 0) { //No Game mode class for the level info, so just spawn a default camera // Set the control object to the default camera diff --git a/Templates/BaseGame/game/core/clientServer/scripts/server/levelLoad.cs b/Templates/BaseGame/game/core/clientServer/scripts/server/levelLoad.cs index 32da4e9dd..ab25001ea 100644 --- a/Templates/BaseGame/game/core/clientServer/scripts/server/levelLoad.cs +++ b/Templates/BaseGame/game/core/clientServer/scripts/server/levelLoad.cs @@ -135,8 +135,35 @@ function loadMissionStage2() ClientGroup.getObject(%clientIndex).loadMission(); // Go ahead and launch the game - if(TheLevelInfo.isMethod("onMissionStart")) - TheLevelInfo.onMissionStart(); + %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; + } + } + } } function endMission() @@ -147,7 +174,35 @@ function endMission() echo("*** ENDING MISSION"); // Inform the game code we're done. - TheLevelInfo.onMissionEnded(); + %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; + } + } + } // Inform the clients for( %clientIndex = 0; %clientIndex < ClientGroup.getCount(); %clientIndex++ ) { @@ -176,6 +231,35 @@ function resetMission() $instantGroup = MissionCleanup; clearServerPaths(); - // - TheLevelInfo.onMissionReset(); + + // 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; + } + } + } } \ No newline at end of file diff --git a/Templates/BaseGame/game/core/clientServer/scripts/server/server.cs b/Templates/BaseGame/game/core/clientServer/scripts/server/server.cs index 6d82746bd..c53548127 100644 --- a/Templates/BaseGame/game/core/clientServer/scripts/server/server.cs +++ b/Templates/BaseGame/game/core/clientServer/scripts/server/server.cs @@ -52,6 +52,8 @@ function initServer() // Specify where the mission files are. $Server::MissionFileSpec = "data/levels/*.mis"; + + callOnModules("initServer"); } //----------------------------------------------------------------------------- @@ -156,17 +158,8 @@ function createServer(%serverType, %level) schedule(0,0,startHeartbeat); } - //Get our modules so we can exec any specific server-side loading/handling - %modulesList = ModuleDatabase.findModules(true); - for(%i=0; %i < getWordCount(%modulesList); %i++) - { - %module = getWord(%modulesList, %i); - if(%module.scopeSet.isMethod("onCreateServer")) - { - eval(%module.scopeSet @ ".onCreateServer();"); - } - } - + callOnModules("onCreateServer", "Game"); + // Let the game initialize some things now that the // the server has been created onServerCreated(); @@ -241,15 +234,7 @@ function destroyServer() deleteDataBlocks(); //Get our modules so we can exec any specific server-side loading/handling - %modulesList = ModuleDatabase.findModules(true); - for(%i=0; %i < getWordCount(%modulesList); %i++) - { - %module = getWord(%modulesList, %i); - if(%module.scopeSet.isMethod("onDestroyServer")) - { - eval(%module.scopeSet @ ".onDestroyServer();"); - } - } + callOnModules("onDestroyServer", "Game"); // Save any server settings %prefPath = getPrefpath(); @@ -273,8 +258,35 @@ function onServerDestroyed() echo("*** ENDING MISSION"); // Inform the game code we're done. - if(TheLevelInfo.isMethod("onMissionEnded")) - TheLevelInfo.onMissionEnded(); + %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; + } + } + } // Inform the clients for( %clientIndex = 0; %clientIndex < ClientGroup.getCount(); %clientIndex++ ) { diff --git a/Templates/BaseGame/game/core/gui/scripts/fonts/ArialItalic 14 (ansi).uft b/Templates/BaseGame/game/core/gui/scripts/fonts/ArialItalic 14 (ansi).uft index 0e9d41ff3..df3a2de7c 100644 Binary files a/Templates/BaseGame/game/core/gui/scripts/fonts/ArialItalic 14 (ansi).uft and b/Templates/BaseGame/game/core/gui/scripts/fonts/ArialItalic 14 (ansi).uft differ diff --git a/Templates/BaseGame/game/core/gui/scripts/fonts/Lucida Console 12 (ansi).uft b/Templates/BaseGame/game/core/gui/scripts/fonts/Lucida Console 12 (ansi).uft index b3a06bb07..49ab3d536 100644 Binary files a/Templates/BaseGame/game/core/gui/scripts/fonts/Lucida Console 12 (ansi).uft and b/Templates/BaseGame/game/core/gui/scripts/fonts/Lucida Console 12 (ansi).uft differ diff --git a/Templates/BaseGame/game/core/settings.xml b/Templates/BaseGame/game/core/settings.xml index 7e6bf5e0b..762cb69f7 100644 --- a/Templates/BaseGame/game/core/settings.xml +++ b/Templates/BaseGame/game/core/settings.xml @@ -5,9 +5,4 @@ core/ - - - a - - diff --git a/Templates/BaseGame/game/core/utility/Core_Utility.cs b/Templates/BaseGame/game/core/utility/Core_Utility.cs index e38d474d5..bfc09a85b 100644 --- a/Templates/BaseGame/game/core/utility/Core_Utility.cs +++ b/Templates/BaseGame/game/core/utility/Core_Utility.cs @@ -6,6 +6,7 @@ function Core_Utility::onCreate(%this) exec("./scripts/helperFunctions.cs"); exec("./scripts/gameObjectManagement.cs"); exec("./scripts/persistanceManagement.cs"); + exec("./scripts/module.cs"); } function Core_Utility::onDestroy(%this) diff --git a/Templates/BaseGame/game/core/utility/scripts/module.cs b/Templates/BaseGame/game/core/utility/scripts/module.cs new file mode 100644 index 000000000..91f869498 --- /dev/null +++ b/Templates/BaseGame/game/core/utility/scripts/module.cs @@ -0,0 +1,20 @@ +function callOnModules(%functionName, %moduleGroup) +{ + //Get our modules so we can exec any specific client-side loading/handling + %modulesList = ModuleDatabase.findModules(false); + for(%i=0; %i < getWordCount(%modulesList); %i++) + { + %module = getWord(%modulesList, %i); + + if(%moduleGroup !$= "") + { + if(%module.group !$= %moduleGroup) + continue; + } + + if(isObject(%module.scopeSet) && %module.scopeSet.isMethod(%functionName)) + { + eval(%module.scopeSet @ "." @ %functionName @ "();"); + } + } +} \ No newline at end of file diff --git a/Templates/BaseGame/game/core/utility/scripts/scene.cs b/Templates/BaseGame/game/core/utility/scripts/scene.cs new file mode 100644 index 000000000..e69de29bb diff --git a/Templates/BaseGame/game/core/utility/scripts/signalManager.cs b/Templates/BaseGame/game/core/utility/scripts/signalManager.cs new file mode 100644 index 000000000..810888905 --- /dev/null +++ b/Templates/BaseGame/game/core/utility/scripts/signalManager.cs @@ -0,0 +1,14 @@ +function SimObject::notify(%this, %signalName) +{ + +} + +function SimObject::removeNotify(%this, %signalName) +{ + +} + +function SimObject::removeNotify(%this, %signalName) +{ + +} \ No newline at end of file diff --git a/Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml b/Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml index 4bc243e71..80ad5ae94 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml +++ b/Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml @@ -1,3 +1,55 @@ + + + LOS + 1 + CollisionMesh + 1 + Col + CollisionMesh + + + 0 + 1 + TrailingNumber + 0 + Z_AXIS + 0 + 0 + 0 + + + 1.0 + 0 + 1.0 + + + _AO,_AMBIENT,_AMBIENTOCCLUSION + _NORMAL,_NORM + 1 + _SMOOTH,_SMOOTHNESS + 1 + 1.0 + _ALBEDO,_DIFFUSE,_ALB,_DIF,_COLOR,_COL + Bilinear + 1 + _ROUGH,_ROUGHNESS + _COMP,_COMPOSITE + N/A + 0 + _METAL,_MET,_METALNESS,_METALLIC + 1 + + + 1 + 1 + 1 + 1 + + + 1 + 1 + + diff --git a/Templates/BaseGame/game/tools/assetBrowser/guis/assetImport.gui b/Templates/BaseGame/game/tools/assetBrowser/guis/assetImport.gui index f3d432a3a..9f355396d 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/guis/assetImport.gui +++ b/Templates/BaseGame/game/tools/assetBrowser/guis/assetImport.gui @@ -1,7 +1,7 @@ //--- OBJECT WRITE BEGIN --- %guiContent = new GuiControl(AssetImportCtrl) { position = "0 0"; - extent = "1440 900"; + extent = "1024 768"; minExtent = "8 2"; horizSizing = "right"; vertSizing = "bottom"; @@ -296,7 +296,7 @@ anchorBottom = "0"; anchorLeft = "1"; anchorRight = "0"; - position = "140 98"; + position = "145 133"; extent = "733 502"; minExtent = "48 92"; horizSizing = "center"; @@ -625,9 +625,9 @@ anchorBottom = "0"; anchorLeft = "1"; anchorRight = "0"; - position = "524 332"; - extent = "376 50"; - minExtent = "48 92"; + position = "348 332"; + extent = "376 70"; + minExtent = "48 70"; horizSizing = "center"; vertSizing = "center"; profile = "ToolsGuiWindowProfile"; @@ -695,7 +695,7 @@ groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "0"; - position = "301 27"; + position = "301 45"; extent = "64 22"; minExtent = "8 2"; horizSizing = "left"; @@ -703,7 +703,7 @@ profile = "ToolsGuiButtonProfile"; visible = "1"; active = "1"; - command = "ImportAssetConfigEditorWindow.saveAssetOptionsConfig();"; + command = "ImportAssetConfigEditorWindow.createNewImportConfig();"; tooltipProfile = "ToolsGuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/addModuleWindow.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/addModuleWindow.cs index 036b3bee6..a5c04da64 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/addModuleWindow.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/addModuleWindow.cs @@ -75,6 +75,31 @@ function AssetBrowser_addModuleWindow::CreateNewModule(%this) //Now generate the script file for it %file = new FileObject(); + %templateFile = new FileObject(); + + %moduleTemplateCodeFilePath = AssetBrowser.templateFilesPath @ "module.cs.template"; + + if(%file.openForWrite(%moduleScriptFilePath) && %templateFile.openForRead(%moduleTemplateCodeFilePath)) + { + while( !%templateFile.isEOF() ) + { + %line = %templateFile.readline(); + %line = strreplace( %line, "@@", %newModuleName ); + + %file.writeline(%line); + echo(%line); + } + + %file.close(); + %templateFile.close(); + } + else + { + %file.close(); + %templateFile.close(); + + warnf("CreateNewModule - Something went wrong and we couldn't write the script file!"); + } if(%file.openForWrite(%moduleScriptFilePath)) { diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImport.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImport.cs index d7d5a0282..788f38bf4 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImport.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImport.cs @@ -513,7 +513,7 @@ function ImportAssetWindow::reloadImportOptionConfigs(%this) if(%xmlDoc.loadFile($AssetBrowser::importConfigsFile)) { //StateMachine element - if(!%xmlDoc.pushFirstChildElement("AssetImportConfigs")) + if(!%xmlDoc.pushFirstChildElement("AssetImportSettings")) { error("Invalid Import Configs file"); return; @@ -521,26 +521,21 @@ function ImportAssetWindow::reloadImportOptionConfigs(%this) //Config Groups %configCount = 0; - while(%xmlDoc.pushChildElement(%configCount)) + %hasGroup = %xmlDoc.pushFirstChildElement("Group"); + while(%hasGroup) { - %configName = %xmlDoc.attribute("Name"); - - %xmlDoc.popElement(); - %configCount++; + %configName = %xmlDoc.attribute("name"); ImportAssetWindow.importConfigsList.add(%configName); + ImportAssetConfigList.add(%configName); + + %hasGroup = %xmlDoc.nextSiblingElement("Group"); } - + %xmlDoc.popElement(); } - ImportAssetWindow.importConfigsList.add(%configName); - - for(%i = 0; %i < ImportAssetWindow.importConfigsList.count(); %i++) - { - %configName = ImportAssetWindow.importConfigsList.getKey(%i); - ImportAssetConfigList.add(%configName); - } + %xmlDoc.delete(); %importConfigIdx = ImportAssetWindow.activeImportConfigIndex; if(%importConfigIdx $= "") @@ -620,14 +615,14 @@ function ImportAssetWindow::processNewImportAssets(%this, %id) if(isObject(%assetItem) && %assetItem.processed == false) { - %assetConfigObj = ImportAssetWindow.activeImportConfig.clone(); - %assetConfigObj.assetIndex = %i; + //%assetConfigObj = ImportAssetWindow.activeImportConfig.clone(); + //%assetConfigObj.assetIndex = %i; //sanetize before modifying our asset name(suffix additions, etc) if(%assetItem.assetName !$= %assetItem.cleanAssetName) %assetItem.assetName = %assetItem.cleanAssetName; - %assetConfigObj.assetName = %assetItem.assetName; + //%assetConfigObj.assetName = %assetItem.assetName; if(%assetItem.assetType $= "Model") { diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImportConfig.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImportConfig.cs index e84725b6e..69f45259f 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImportConfig.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetImportConfig.cs @@ -12,6 +12,79 @@ function ImportAssetConfigList::onSelect( %this, %id, %text ) AssetBrowser.reloadImportingFiles(); } +function setupImportConfigSettingsList() +{ + if(!isObject(ImportAssetConfigSettingsList)) + { + new ArrayObject(ImportAssetConfigSettingsList); + + ImportAssetConfigSettingsList.addNewConfigSetting("Mesh/ImportMesh", "Import Mesh", "bool", "", "1", "", "ToggleImportMesh"); + ImportAssetConfigSettingsList.addNewConfigSetting("Meshes/DoUpAxisOverride", "Do Up-axis Override", "bool", "", "0", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Meshes/UpAxisOverride", "Up-axis Override", "list", "", "Z_AXIS", "X_AXIS,Y_AXIS,Z_AXIS"); + ImportAssetConfigSettingsList.addNewConfigSetting("Meshes/ScaleOverride", "Do Scale Override", "bool", "", "0", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Meshes/ScaleOverride", "Scale Override", "float", "", "1", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Meshes/IgnoreNodeScale", "Ignore Node Scale", "bool", "", "0", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Meshes/AdjustCenter", "Adjust Center", "bool", "", "0", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Meshes/AdjustFloor", "Adjust Floor", "bool", "", "0", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Meshes/CollapseSubmeshes", "Collapse Submeshes", "bool", "", "0", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Meshes/LODType", "LOD Type", "list", "", "TrailingNumber", "TrailingNumber,DetectDTS"); + //ImportAssetConfigSettingsList.addNewConfigSetting("TrailingNumber", "Trailing Number", "float", "", "2", "", "Mesh"); + ImportAssetConfigSettingsList.addNewConfigSetting("Meshes/ImportedNodes", "Imported Nodes", "command", "", "", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Meshes/IgnoreNodes", "Ignore Nodes", "command", "", "", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Meshes/ImportMeshes", "Import Meshes", "command", "", "", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Meshes/IgnoreMeshes", "Imported Meshes", "command", "", "", ""); + + //Materials + ImportAssetConfigSettingsList.addNewConfigSetting("Materials/ImportMaterials", "Import Materials", "bool", "", "1", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Materials/CreateComposites", "Create Composites", "bool", "", "1", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Materials/UseDiffuseSuffixOnOriginImage", "Use Diffuse Suffix for Origin Image", "bool", "", "1", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Materials/UseExistingMaterials", "Use Existing Materials", "bool", "", "1", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Materials/IgnoreMaterials", "Ignore Materials", "command", "", "", ""); + + //Animations + ImportAssetConfigSettingsList.addNewConfigSetting("Animations/ImportAnimations", "Import Animations", "bool", "", "1", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Animations/SeparateAnimations", "Separate Animations", "bool", "", "1", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Animations/SeparateAnimationPrefix", "Separate Animation Prefix", "string", "", "", ""); + + //Collision + ImportAssetConfigSettingsList.addNewConfigSetting("Collision/GenerateCollisions", "Generate Collisions", "bool", "", "1", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Collision/GenCollisionType", "Generate Collision Type", "list", "", "CollisionMesh", "CollisionMesh,ConvexHull"); + ImportAssetConfigSettingsList.addNewConfigSetting("Collision/CollisionMeshPrefix", "CollisionMesh Prefix", "string", "", "Col", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Collision/GenerateLOSCollisions", "Generate LOS Collisions", "bool", "", "1", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Collision/GenLOSCollisionType", "Generate LOS Collision Type", "list", "", "CollisionMesh", "CollisionMesh,ConvexHull"); + ImportAssetConfigSettingsList.addNewConfigSetting("Collision/LOSCollisionMeshPrefix", "LOS CollisionMesh Prefix", "string", "", "LOS", ""); + + //Images + ImportAssetConfigSettingsList.addNewConfigSetting("Images/ImageType", "Image Type", "list", "", "N/A", "N/A,Diffuse,Normal,Specular,Metalness,Roughness,AO,Composite,GUI"); + ImportAssetConfigSettingsList.addNewConfigSetting("Images/DiffuseTypeSuffixes", "Diffuse Type Suffixes", "command", "", "_ALBEDO,_DIFFUSE,_ALB,_DIF,_COLOR,_COL", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Images/NormalTypeSuffixes", "Normal Type Suffixes", "command", "", "_NORMAL,_NORM", ""); + + ImportAssetConfigSettingsList.addNewConfigSetting("Images/MetalnessTypeSuffixes", "Metalness Type Suffixes", "command", "", "_METAL,_MET,_METALNESS,_METALLIC", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Images/RoughnessTypeSuffixes", "Roughness Type Suffixes", "command", "", "_ROUGH,_ROUGHNESS", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Images/SmoothnessTypeSuffixes", "Smoothness Type Suffixes", "command", "", "_SMOOTH,_SMOOTHNESS", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Images/AOTypeSuffixes", "AO Type Suffixes", "command", "", "_AO,_AMBIENT,_AMBIENTOCCLUSION", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Images/CompositeTypeSuffixes", "Composite Type Suffixes", "command", "", "_COMP,_COMPOSITE", ""); + + ImportAssetConfigSettingsList.addNewConfigSetting("Images/TextureFilteringMode", "Texture Filtering Mode", "list", "", "Bilinear", "None,Bilinear,Trilinear"); + ImportAssetConfigSettingsList.addNewConfigSetting("Images/UseMips", "Use Mipmaps", "bool", "", "1", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Images/IsHDR", "Is HDR", "bool", "", "0", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Images/Scaling", "Scaling", "float", "", "1.0", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Images/Compressed", "Is Compressed", "bool", "", "1", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Images/GenerateMaterialOnImport", "Generate Material On Import", "bool", "", "1", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Images/PopulateMaterialMaps", "Populate Material Maps", "bool", "", "1", ""); + + //Sounds + ImportAssetConfigSettingsList.addNewConfigSetting("Sounds/VolumeAdjust", "Volume Adjustment", "float", "", "1.0", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Sounds/PitchAdjust", "Pitch Adjustment", "float", "", "1.0", ""); + ImportAssetConfigSettingsList.addNewConfigSetting("Sounds/Compressed", "Is Compressed", "bool", "", "0", ""); + } +} + +function ImportAssetConfigSettingsList::addNewConfigSetting(%this, %settingName, %settingFieldLabel, %type, %tooltip, %defaultValue, %fieldData) +{ + %this.add(%settingName TAB %settingFieldLabel TAB %type TAB %tooltip, %defaultValue TAB %fieldData); +} + function ImportAssetOptionsWindow::findMissingFile(%this, %assetItem) { if(%assetItem.assetType $= "Model") @@ -99,6 +172,7 @@ function ImportAssetOptionsWindow::editImportSettings(%this, %assetItem) if(%meshCount > 0) { ImportOptionsList.startGroup("Mesh"); + ImportOptionsList.addField("AutogenCollisions", "Auto-gen Collisions", "bool", "", "0", "", %assetConfigObj); ImportOptionsList.addField("CollapseSubmeshes", "Collapse Submeshes", "bool", "", "0", "", %assetConfigObj); ImportOptionsList.addField("UpAxisOverride", "Up-Axis Override", "list", "", "Z_AXIS", "Z_AXIS,Y_AXIS,X_AXIS", %assetConfigObj); @@ -194,15 +268,21 @@ function getAssetImportConfigValue(%fieldName, %defaultValue) return AssetImportSettings.value(ImportAssetWindow.activeImportConfig @ "/" @ %fieldName, %defaultValue); } -function ImportAssetConfigEditorWindow::populateConfigList(%this, %optionsObj) +function ImportAssetConfigEditorWindow::populateConfigList(%this, %configName) { - AssetImportConfigName.setText(%optionsObj.Name); + //Ensure our config list is set up + setupImportConfigSettingsList(); + + AssetImportConfigName.setText(%configName); ImportOptionsConfigList.clearFields(); - ImportOptionsConfigList.startGroup("Mesh"); - ImportOptionsConfigList.addSettingsField("Mesh/ImportMesh", "Import Mesh", "bool", "Should meshes be imported", ""); - ImportOptionsConfigList.endGroup(); + %this.populateConfigListByGroup("Meshes"); + %this.populateConfigListByGroup("Materials"); + %this.populateConfigListByGroup("Animations"); + %this.populateConfigListByGroup("Images"); + %this.populateConfigListByGroup("Collision"); + %this.populateConfigListByGroup("Sound"); /*ImportOptionsConfigList.addCallbackField("ImportMesh", "Import Mesh", "bool", "", "1", "", "ToggleImportMesh", %optionsObj); ImportOptionsConfigList.addField("DoUpAxisOverride", "Do Up-axis Override", "bool", "", "0", "", %optionsObj); @@ -283,8 +363,31 @@ function ImportAssetConfigEditorWindow::populateConfigList(%this, %optionsObj) ImportOptionsConfigList.endGroup();*/ } +function ImportAssetConfigEditorWindow::populateConfigListByGroup(%this, %groupName) +{ + ImportOptionsConfigList.startGroup(%groupName); + for(%i=0; %i < ImportAssetConfigSettingsList.count(); %i++) + { + %settingName = getField(ImportAssetConfigSettingsList.getKey(%i),0); + if(startsWith(%settingName, %groupName@"/")) + { + %labelName = getField(ImportAssetConfigSettingsList.getKey(%i), 1); + %type = getField(ImportAssetConfigSettingsList.getKey(%i), 2); + %tooltip = getField(ImportAssetConfigSettingsList.getKey(%i), 3); + + %defaultValue = getField(ImportAssetConfigSettingsList.getValue(%i), 0); + %dataValues = getField(ImportAssetConfigSettingsList.getValue(%i), 1); + ImportOptionsConfigList.addSettingsField(%settingName, %labelName, %type, %tooltip, %defaultValue, %dataValues); + } + } + ImportOptionsConfigList.endGroup(); +} + function ImportAssetConfigEditorWindow::addNewConfig(%this) { + //Ensure our list is set up + setupImportConfigSettingsList(); + ImportAssetNewConfigEditorWindow.setVisible(1); ImportAssetNewConfigEditorWindow.selectWindow(); @@ -358,6 +461,7 @@ function ImportAssetConfigEditorWindow::addNewConfig(%this) function ImportAssetConfigEditorWindow::editConfig(%this) { + //Ensure our list is set up ImportAssetConfigEditorWindow.setVisible(1); ImportAssetConfigEditorWindow.selectWindow(); @@ -366,6 +470,10 @@ function ImportAssetConfigEditorWindow::editConfig(%this) function ImportAssetConfigEditorWindow::deleteConfig(%this) { + for(%i=0; %i < %configList.count(); %i++) + { + + } ImportAssetWindow.importConfigsList.erase(ImportAssetWindow.activeImportConfigIndex); ImportAssetConfigList.setSelected(0); //update it @@ -380,11 +488,89 @@ function ImportAssetConfigEditorWindow::saveAssetOptionsConfig(%this) ImportAssetWindow.reloadImportOptionConfigs(); } -function ImportOptionsConfigList::addSettingsField(%this, %settingsFieldName, %labelText, %fieldType, %tooltip, %fieldData) +function ImportAssetConfigEditorWindow::createNewImportConfig(%this) +{ + %configName = AssetImportNewConfigName.getText(); + %configList = ImportAssetConfigSettingsList; + + AssetImportSettings.beginGroup(%configName); + + for(%i=0; %i < %configList.count(); %i++) + { + %settingName = getField(%configList.getKey(%i),0); + if(startsWith(%settingName, "Meshes/")) + { + %defaultValue = getField(%configList.getValue(%i), 0); + AssetImportSettings.setValue(%settingName, %defaultValue); + } + } + + for(%i=0; %i < %configList.count(); %i++) + { + %settingName = getField(%configList.getKey(%i),0); + if(startsWith(%settingName, "Materials/")) + { + %defaultValue = getField(%configList.getValue(%i), 0); + AssetImportSettings.setValue(%settingName, %defaultValue); + } + } + + for(%i=0; %i < %configList.count(); %i++) + { + %settingName = getField(%configList.getKey(%i),0); + if(startsWith(%settingName, "Animations/")) + { + %defaultValue = getField(%configList.getValue(%i), 0); + AssetImportSettings.setValue(%settingName, %defaultValue); + } + } + + for(%i=0; %i < %configList.count(); %i++) + { + %settingName = getField(%configList.getKey(%i),0); + if(startsWith(%settingName, "Collision/")) + { + %defaultValue = getField(%configList.getValue(%i), 0); + AssetImportSettings.setValue(%settingName, %defaultValue); + } + } + + for(%i=0; %i < %configList.count(); %i++) + { + %settingName = getField(%configList.getKey(%i),0); + if(startsWith(%settingName, "Images/")) + { + %defaultValue = getField(%configList.getValue(%i), 0); + AssetImportSettings.setValue(%settingName, %defaultValue); + } + } + + for(%i=0; %i < %configList.count(); %i++) + { + %settingName = getField(%configList.getKey(%i),0); + if(startsWith(%settingName, "Sounds/")) + { + %defaultValue = getField(%configList.getValue(%i), 0); + AssetImportSettings.setValue(%settingName, %defaultValue); + } + } + + AssetImportSettings.endGroup(); + + %success = AssetImportSettings.write(); + + ImportAssetNewConfigEditorWindow.setVisible(0); +} + +function ImportOptionsConfigList::addSettingsField(%this, %settingsFieldName, %labelText, %fieldType, %tooltip, %fieldValue, %fieldData) { %moddedSettingsFieldName = strreplace(%settingsFieldName, "/", "-"); - %this.addCallbackField(%moddedSettingsFieldName, %labelText, %fieldType, "", AssetImportSettings.value(%settingsFieldName), %fieldData, "changeEditorSetting"); + %value = AssetImportSettings.value(%settingsFieldName); + if(%value $= "") + %value = %fieldValue; + + %this.addCallbackField(%moddedSettingsFieldName, %labelText, %fieldType, "", %value, %fieldData, "changeEditorSetting"); } function ImportOptionsConfigList::changeEditorSetting(%this, %varName, %value) diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/fieldTypes.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/fieldTypes.cs index fe524ce65..6dd6a2368 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/fieldTypes.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/fieldTypes.cs @@ -90,7 +90,7 @@ function GuiInspectorVariableGroup::buildListField(%this, %fieldName, %fieldLabe if(%fieldName $= "") %editControl.setText(%fieldName); } - else + else if(isObject(%ownerObj)) { //regular variable %setCommand = %editControl @ ".setText(" @ %ownerObj @ "." @ %fieldName @ ");"; diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/templateFiles/module.cs.template b/Templates/BaseGame/game/tools/assetBrowser/scripts/templateFiles/module.cs.template new file mode 100644 index 000000000..1b6dda406 --- /dev/null +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/templateFiles/module.cs.template @@ -0,0 +1,37 @@ +function @@::onCreate(%this) +{ +} + +function @@::onDestroy(%this) +{ +} + +//This is called when the server is initially set up by the game application +function @@::initServer(%this) +{ +} + +//This is called when the server is created for an actual game/map to be played +function @@::onCreateServer(%this) +{ +} + +//This is called when the server is shut down due to the game/map being exited +function @@::onDestroyServer(%this) +{ +} + +//This is called when the client is initially set up by the game application +function @@::initClient(%this) +{ +} + +//This is called when a client connects to a server +function @@::onCreateClient(%this) +{ +} + +//This is called when a client disconnects from a server +function @@::onDestroyClient(%this) +{ +} \ No newline at end of file diff --git a/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorTreeView.ed.cs b/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorTreeView.ed.cs index 5db0e049d..881f2a752 100644 --- a/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorTreeView.ed.cs +++ b/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorTreeView.ed.cs @@ -107,15 +107,15 @@ function GuiEditorTreeView::onRightMouseDown( %this, %item, %pts, %obj ) object = %obj; }; - %popup.item[ 0 ] = "Rename" TAB "" TAB "GuiEditorTreeView.showItemRenameCtrl( GuiEditorTreeView.findItemByObjectId(" @ %popup.object @ ") );"; - %popup.item[ 1 ] = "Delete" TAB "" TAB "GuiEditor.deleteControl(" @ %popup.object @ ");"; + %popup.item[ 0 ] = "Rename" TAB "" TAB "GuiEditorTreeView.showItemRenameCtrl( GuiEditorTreeView.findItemByObjectId(" @ %obj @ ") );"; + %popup.item[ 1 ] = "Delete" TAB "" TAB "GuiEditor.deleteControl(" @ %obj @ ");"; %popup.item[ 2 ] = "-"; - %popup.item[ 3 ] = "Locked" TAB "" TAB "%this.object.setLocked( !" @ %popup.object @ ".locked); GuiEditorTreeView.update();"; - %popup.item[ 4 ] = "Hidden" TAB "" TAB "%this.object.setVisible( !" @ %popup.object @ ".isVisible() ); GuiEditorTreeView.update();"; + %popup.item[ 3 ] = "Locked" TAB "" TAB %obj @ ".setLocked( !" @ %obj @ ".locked); GuiEditorTreeView.update();"; + %popup.item[ 4 ] = "Hidden" TAB "" TAB %obj @ ".setVisible( !" @ %obj @ ".isVisible() ); GuiEditorTreeView.update();"; %popup.item[ 5 ] = "-"; - %popup.item[ 6 ] = "Add New Controls Here" TAB "" TAB "GuiEditor.setCurrentAddSet( " @ %popup.object @ ");"; - %popup.item[ 7 ] = "Add Child Controls to Selection" TAB "" TAB "GuiEditor.selectAllControlsInSet( " @ %popup.object @ ", false );"; - %popup.item[ 8 ] = "Remove Child Controls from Selection" TAB "" TAB "GuiEditor.selectAllControlsInSet( " @ %popup.object @ ", true );"; + %popup.item[ 6 ] = "Add New Controls Here" TAB "" TAB "GuiEditor.setCurrentAddSet( " @ %obj @ ");"; + %popup.item[ 7 ] = "Add Child Controls to Selection" TAB "" TAB "GuiEditor.selectAllControlsInSet( " @ %obj @ ", false );"; + %popup.item[ 8 ] = "Remove Child Controls from Selection" TAB "" TAB "GuiEditor.selectAllControlsInSet( " @ %obj @ ", true );"; %popup.checkItem( 3, %obj.locked ); %popup.checkItem( 4, !%obj.isVisible() ); diff --git a/Templates/BaseGame/game/tools/settings.xml b/Templates/BaseGame/game/tools/settings.xml index 6b444f490..c5c0f3d28 100644 --- a/Templates/BaseGame/game/tools/settings.xml +++ b/Templates/BaseGame/game/tools/settings.xml @@ -1,142 +1,145 @@ - 50 - WorldEditorInspectorPlugin - AssetWork_Debug.exe 6 + 50 + AssetWork_Debug.exe screenCenter - 40 0 + WorldEditorInspectorPlugin 1 - - ../../../Documentation/Official Documentation.html - http://www.garagegames.com/products/torque-3d/documentation/user - http://www.garagegames.com/products/torque-3d/forums - ../../../Documentation/Torque 3D - Script Manual.chm - - - 180 180 180 255 - 255 255 255 255 - 48 48 48 255 - 215 215 215 255 - 50 50 50 255 - - - 0 - 255 - 20 - 8 - 1 - - - 0 0 255 255 - 255 255 255 255 - 100 100 100 255 - 255 0 0 255 - 255 255 0 255 - 0 255 0 255 - 255 255 0 255 - - - 2 - 0 - 1 - 0 - 100 - 1 - 0 - + 40 - 1 1 - 1 - 1 + 1 1 + 1 + 1 + 1 255 255 255 100 0 51 51 51 100 102 102 102 100 - 1 + + + 255 255 0 255 + 0 255 0 255 + 0 0 255 255 + 255 255 0 255 + 255 255 255 255 + 100 100 100 255 + 255 0 0 255 + + + 1 + 0 + 100 + 1 + 0 + 2 + 0 + + + 1 + 0 + 255 + 20 + 8 + + + 215 215 215 255 + 180 180 180 255 + 255 255 255 255 + 50 50 50 255 + 48 48 48 255 tools/worldEditor/images/LockedHandle tools/worldEditor/images/DefaultHandle tools/worldEditor/images/SelectHandle + + ../../../Documentation/Official Documentation.html + http://www.garagegames.com/products/torque-3d/documentation/user + http://www.garagegames.com/products/torque-3d/forums + ../../../Documentation/Torque 3D - Script Manual.chm + + + + 100 + 0 + 15 + 0.8 + 0.8 + 1 + 0 + + 500 + 0 + 0 + 0 + 255 255 255 20 + 10 10 10 + - 178 175 172 255 - 240 240 240 255 + 96 94 92 255 32 31 30 255 255 255 255 255 - 59 58 57 255 - 50 49 48 255 - 50 49 48 255 - 43 43 43 255 + 178 175 172 255 17 16 15 255 - 72 70 68 255 - 72 70 68 255 - 50 49 48 255 - 234 232 230 255 - 100 98 96 255 236 234 232 255 - 96 94 92 255 - 37 36 35 255 + 59 58 57 255 + 100 98 96 255 + 72 70 68 255 + 72 70 68 255 + 240 240 240 255 59 58 57 255 + 234 232 230 255 + 50 49 48 255 + 37 36 35 255 + 50 49 48 255 + 50 49 48 255 + 43 43 43 255 - tools/gui 1024 768 + tools/gui + 0 0 0 - 0 - 0 1 8 1 + 0 1 1 2 1 - - http://www.garagegames.com/products/torque-3d/documentation/user - ../../../Documentation/Torque 3D - Script Manual.chm - ../../../Documentation/Official Documentation.html - - - 0 - 1 1 + + ../../../Documentation/Torque 3D - Script Manual.chm + ../../../Documentation/Official Documentation.html + http://www.garagegames.com/products/torque-3d/documentation/user + + + 0 + Categorized - - 0 - 0.8 - 1 - 100 - 15 - 0.8 - 0 - - 10 10 10 - 0 - 255 255 255 20 - 500 - 0 - 0 - + + Grid_512_Orange AIPlayer @@ -144,15 +147,12 @@ data/FPSGameplay/levels - - 5 - 25 + + 5 + - - Grid_512_Orange -