ソースを参照

Full PhysX Template for ticket #1

DavidWyand-GG 13 年 前
コミット
c9c833c56c
100 ファイル変更9381 行追加0 行削除
  1. 1 0
      Templates/Full PhysX/DeleteCachedDTSs.bat
  2. 15 0
      Templates/Full PhysX/DeleteCachedDTSs.command
  3. 6 0
      Templates/Full PhysX/DeleteDSOs.bat
  4. 19 0
      Templates/Full PhysX/DeleteDSOs.command
  5. 6 0
      Templates/Full PhysX/DeletePrefs.bat
  6. 3 0
      Templates/Full PhysX/DeletePrefs.command
  7. 85 0
      Templates/Full PhysX/buildFiles/VisualStudio 2008/projects/Torque.rc
  8. BIN
      Templates/Full PhysX/buildFiles/VisualStudio 2008/projects/torque.ico
  9. 11 0
      Templates/Full PhysX/buildFiles/VisualStudio 2010/projects/Torque.Cpp.Win32.user.props
  10. 11 0
      Templates/Full PhysX/buildFiles/VisualStudio 2010/projects/Torque.Cpp.x64.user.props
  11. 85 0
      Templates/Full PhysX/buildFiles/VisualStudio 2010/projects/Torque.rc
  12. BIN
      Templates/Full PhysX/buildFiles/VisualStudio 2010/projects/torque.ico
  13. 26 0
      Templates/Full PhysX/buildFiles/Xcode/Info.plist
  14. BIN
      Templates/Full PhysX/buildFiles/Xcode/torqueDemo.icns
  15. 67 0
      Templates/Full PhysX/buildFiles/compile.bat
  16. 23 0
      Templates/Full PhysX/buildFiles/config/project.conf
  17. 11 0
      Templates/Full PhysX/buildFiles/config/project.mac.conf
  18. 12 0
      Templates/Full PhysX/buildFiles/config/projectCode.conf
  19. 41 0
      Templates/Full PhysX/buildFiles/config/webDeploy.conf
  20. 20 0
      Templates/Full PhysX/buildFiles/config/webDeploy.mac.conf
  21. 7 0
      Templates/Full PhysX/cleanShaders.bat
  22. 4 0
      Templates/Full PhysX/cleanShaders.command
  23. BIN
      Templates/Full PhysX/game/Full PhysX.dll
  24. BIN
      Templates/Full PhysX/game/Full PhysX.exe
  25. 39 0
      Templates/Full PhysX/game/Full PhysX.torsion
  26. BIN
      Templates/Full PhysX/game/IE Full PhysX Plugin.dll
  27. BIN
      Templates/Full PhysX/game/NP Full PhysX Plugin.dll
  28. BIN
      Templates/Full PhysX/game/PhysXCooking.dll
  29. BIN
      Templates/Full PhysX/game/PhysXCore.dll
  30. BIN
      Templates/Full PhysX/game/PhysXDevice.dll
  31. BIN
      Templates/Full PhysX/game/PhysXLoader.dll
  32. 30 0
      Templates/Full PhysX/game/art/datablocks/aiPlayer.cs
  33. 42 0
      Templates/Full PhysX/game/art/datablocks/audioProfiles.cs
  34. 58 0
      Templates/Full PhysX/game/art/datablocks/datablockExec.cs
  35. 86 0
      Templates/Full PhysX/game/art/datablocks/environment.cs
  36. 85 0
      Templates/Full PhysX/game/art/datablocks/health.cs
  37. 24 0
      Templates/Full PhysX/game/art/datablocks/managedDatablocks.cs
  38. 243 0
      Templates/Full PhysX/game/art/datablocks/particles.cs
  39. 676 0
      Templates/Full PhysX/game/art/datablocks/player.cs
  40. 60 0
      Templates/Full PhysX/game/art/datablocks/rigidShape.cs
  41. 143 0
      Templates/Full PhysX/game/art/datablocks/teleporter.cs
  42. 38 0
      Templates/Full PhysX/game/art/datablocks/triggers.cs
  43. 48 0
      Templates/Full PhysX/game/art/datablocks/weapon.cs
  44. 819 0
      Templates/Full PhysX/game/art/datablocks/weapons/Lurker.cs
  45. 402 0
      Templates/Full PhysX/game/art/datablocks/weapons/NewWeaponTemplate.cs
  46. 230 0
      Templates/Full PhysX/game/art/datablocks/weapons/ProxMine.cs
  47. 364 0
      Templates/Full PhysX/game/art/datablocks/weapons/Ryder.cs
  48. 559 0
      Templates/Full PhysX/game/art/datablocks/weapons/Turret.cs
  49. 363 0
      Templates/Full PhysX/game/art/datablocks/weapons/grenade.cs
  50. 952 0
      Templates/Full PhysX/game/art/datablocks/weapons/grenadeLauncher.cs
  51. 1250 0
      Templates/Full PhysX/game/art/datablocks/weapons/rocketLauncher.cs
  52. BIN
      Templates/Full PhysX/game/art/decals/Bullet Holes/BulletHole_Glass.dds
  53. BIN
      Templates/Full PhysX/game/art/decals/Bullet Holes/BulletHole_Walls.dds
  54. BIN
      Templates/Full PhysX/game/art/decals/bullet_hole.png
  55. BIN
      Templates/Full PhysX/game/art/decals/defaultblobshadow.png
  56. 57 0
      Templates/Full PhysX/game/art/decals/managedDecalData.cs
  57. 64 0
      Templates/Full PhysX/game/art/decals/materials.cs
  58. BIN
      Templates/Full PhysX/game/art/decals/rBlast.png
  59. BIN
      Templates/Full PhysX/game/art/decals/scorch_decal.png
  60. BIN
      Templates/Full PhysX/game/art/environment/grass1.png
  61. BIN
      Templates/Full PhysX/game/art/environment/grass2.png
  62. BIN
      Templates/Full PhysX/game/art/environment/grass3.png
  63. BIN
      Templates/Full PhysX/game/art/environment/plant1.png
  64. BIN
      Templates/Full PhysX/game/art/environment/plant2.png
  65. 1 0
      Templates/Full PhysX/game/art/environment/precipitation/rain.dml
  66. BIN
      Templates/Full PhysX/game/art/environment/precipitation/rain.png
  67. BIN
      Templates/Full PhysX/game/art/environment/precipitation/water_splash.png
  68. 58 0
      Templates/Full PhysX/game/art/forest/brushes.cs
  69. 40 0
      Templates/Full PhysX/game/art/forest/managedItemData.cs
  70. 109 0
      Templates/Full PhysX/game/art/gui/CameraGui.gui
  71. 79 0
      Templates/Full PhysX/game/art/gui/StartupGui.gui
  72. BIN
      Templates/Full PhysX/game/art/gui/Torque-3D-logo-w.png
  73. BIN
      Templates/Full PhysX/game/art/gui/Torque-3D-logo.png
  74. BIN
      Templates/Full PhysX/game/art/gui/Torque-3D-logo_alt.png
  75. BIN
      Templates/Full PhysX/game/art/gui/background.png
  76. 162 0
      Templates/Full PhysX/game/art/gui/chatHud.gui
  77. 130 0
      Templates/Full PhysX/game/art/gui/controlsHelpDlg.gui
  78. 25 0
      Templates/Full PhysX/game/art/gui/customProfiles.cs
  79. BIN
      Templates/Full PhysX/game/art/gui/damageBottom.png
  80. BIN
      Templates/Full PhysX/game/art/gui/damageFront.png
  81. BIN
      Templates/Full PhysX/game/art/gui/damageLeft.png
  82. BIN
      Templates/Full PhysX/game/art/gui/damageRight.png
  83. BIN
      Templates/Full PhysX/game/art/gui/damageTop.png
  84. 175 0
      Templates/Full PhysX/game/art/gui/defaultGameProfiles.cs
  85. 73 0
      Templates/Full PhysX/game/art/gui/endGameGui.gui
  86. BIN
      Templates/Full PhysX/game/art/gui/hudfill.png
  87. 48 0
      Templates/Full PhysX/game/art/gui/hudlessGui.gui
  88. 644 0
      Templates/Full PhysX/game/art/gui/joinServerDlg.gui
  89. BIN
      Templates/Full PhysX/game/art/gui/lagIcon.png
  90. BIN
      Templates/Full PhysX/game/art/gui/logo.png
  91. 151 0
      Templates/Full PhysX/game/art/gui/mainMenuGui.gui
  92. BIN
      Templates/Full PhysX/game/art/gui/no-preview.png
  93. 423 0
      Templates/Full PhysX/game/art/gui/playGui.gui
  94. 178 0
      Templates/Full PhysX/game/art/gui/playerList.gui
  95. BIN
      Templates/Full PhysX/game/art/gui/splash.bmp
  96. BIN
      Templates/Full PhysX/game/art/gui/weaponHud/bino.png
  97. BIN
      Templates/Full PhysX/game/art/gui/weaponHud/blank.png
  98. BIN
      Templates/Full PhysX/game/art/gui/weaponHud/crossHair.png
  99. BIN
      Templates/Full PhysX/game/art/gui/weaponHud/lurker.png
  100. BIN
      Templates/Full PhysX/game/art/gui/weaponHud/mine.png

+ 1 - 0
Templates/Full PhysX/DeleteCachedDTSs.bat

@@ -0,0 +1 @@
+for /R %%a IN (*.dae) do IF EXIST "%%~pna.cached.dts" del "%%~pna.cached.dts"

+ 15 - 0
Templates/Full PhysX/DeleteCachedDTSs.command

@@ -0,0 +1,15 @@
+#!/bin/sh
+
+cd "`dirname "$0"`"
+
+for i in $(find . -type f \( -iname "*.dae" \))
+do
+	len=$((${#i} - 4))
+   file=${i:0:$len}.cached.dts
+   if [ -e $file ]
+   then
+   	echo "Removing ${file}"
+   	rm $file
+   fi
+done
+

+ 6 - 0
Templates/Full PhysX/DeleteDSOs.bat

@@ -0,0 +1,6 @@
+for /R %%a IN (*.cs) do IF EXIST "%%a.dso" del "%%a.dso"
+for /R %%a IN (*.cs) do IF EXIST "%%a.edso" del "%%a.edso"
+for /R %%a IN (*.gui) do IF EXIST "%%a.dso" del "%%a.dso"
+for /R %%a IN (*.gui) do IF EXIST "%%a.edso" del "%%a.edso"
+for /R %%a IN (*.ts) do IF EXIST "%%a.dso" del "%%a.dso"
+for /R %%a IN (*.ts) do IF EXIST "%%a.edso" del "%%a.edso"

+ 19 - 0
Templates/Full PhysX/DeleteDSOs.command

@@ -0,0 +1,19 @@
+#!/bin/sh
+
+cd "`dirname "$0"`"
+
+for i in $(find . -type f \( -iname "*.cs" \))
+do
+   file=${i}.dso
+   if [ -e $file ]
+   then
+   	echo "Removing ${file}"
+   	rm $file
+   fi
+   file=${i}.edso
+   if [ -e $file ]
+   then
+   	echo "Removing ${file}"
+      rm $file
+   fi
+done

+ 6 - 0
Templates/Full PhysX/DeletePrefs.bat

@@ -0,0 +1,6 @@
+del /s prefs.cs
+del /s config.cs
+del /s banlist.cs
+del /s config.cs.dso
+del /s prefs.cs.dso
+del /s banlist.cs.dso

+ 3 - 0
Templates/Full PhysX/DeletePrefs.command

@@ -0,0 +1,3 @@
+#!/bin/sh
+
+find "`dirname "$0"`" -type f \( -name "prefs.cs" -or -name "config.cs" -or -name "banlist.cs" -or -name "prefs.cs.dso" -or -name "config.cs.dso" -or -name "banlist.cs.dso" \) -exec rm {} \;

+ 85 - 0
Templates/Full PhysX/buildFiles/VisualStudio 2008/projects/Torque.rc

@@ -0,0 +1,85 @@
+//Microsoft Developer Studio generated resource script.
+//
+#define IDI_ICON1                       103
+#define IDI_ICON2                       107
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        108
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1000
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "windows.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_ICON1               ICON    DISCARDABLE     "torque.ico"
+IDI_ICON2               ICON    DISCARDABLE     "torque.ico"
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "#include ""windows.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+

BIN
Templates/Full PhysX/buildFiles/VisualStudio 2008/projects/torque.ico


+ 11 - 0
Templates/Full PhysX/buildFiles/VisualStudio 2010/projects/Torque.Cpp.Win32.user.props

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ExecutablePath>$(DXSDK_DIR)\Utilities\bin\x86;$(ExecutablePath)</ExecutablePath>
+    <IncludePath>$(DXSDK_DIR)\Include;$(IncludePath)</IncludePath>
+    <ReferencePath>$(ReferencePath)</ReferencePath>
+    <LibraryPath>$(DXSDK_DIR)\Lib\x86;$(LibraryPath)</LibraryPath>
+    <SourcePath>$(SourcePath)</SourcePath>
+    <ExcludePath>$(ExcludePath)</ExcludePath>
+  </PropertyGroup>
+</Project>

+ 11 - 0
Templates/Full PhysX/buildFiles/VisualStudio 2010/projects/Torque.Cpp.x64.user.props

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ExecutablePath>$(DXSDK_DIR)\Utilities\bin\x64;$(ExecutablePath)</ExecutablePath>
+    <IncludePath>$(DXSDK_DIR)\Include;$(IncludePath)</IncludePath>
+    <ReferencePath>$(ReferencePath)</ReferencePath>
+    <LibraryPath>$(DXSDK_DIR)\Lib\x64;$(LibraryPath)</LibraryPath>
+    <SourcePath>$(SourcePath)</SourcePath>
+    <ExcludePath>$(ExcludePath)</ExcludePath>
+  </PropertyGroup>
+</Project>

+ 85 - 0
Templates/Full PhysX/buildFiles/VisualStudio 2010/projects/Torque.rc

@@ -0,0 +1,85 @@
+//Microsoft Developer Studio generated resource script.
+//
+#define IDI_ICON1                       103
+#define IDI_ICON2                       107
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        108
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1000
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "windows.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_ICON1               ICON    DISCARDABLE     "torque.ico"
+IDI_ICON2               ICON    DISCARDABLE     "torque.ico"
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "#include ""windows.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+

BIN
Templates/Full PhysX/buildFiles/VisualStudio 2010/projects/torque.ico


+ 26 - 0
Templates/Full PhysX/buildFiles/Xcode/Info.plist

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIconFile</key>
+	<string>torqueDemo</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.garagegames.${EXECUTABLE_NAME}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleSignature</key>
+	<string>GG3d</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>NSMainNibFile</key>
+	<string>mainMenu</string>
+	<key>NSPrincipalClass</key>
+	<string>macApplication</string>
+</dict>
+</plist>

BIN
Templates/Full PhysX/buildFiles/Xcode/torqueDemo.icns


+ 67 - 0
Templates/Full PhysX/buildFiles/compile.bat

@@ -0,0 +1,67 @@
+@echo off
+SETLOCAL
+
+REM Handle our optional parameters
+SET COMPILER=%1
+SET CONFIG=%2
+
+IF NOT DEFINED COMPILER SET COMPILER=VS2008
+IF NOT DEFINED CONFIG   SET CONFIG=Release
+
+REM Setting up some variables
+
+REM Detecting the correct Program Files
+IF DEFINED PROGRAMFILES(X86) SET PROGRAMROOT=%ProgramFiles(x86)%
+IF NOT DEFINED PROGRAMROOT   SET PROGRAMROOT=%ProgramFiles%
+
+REM First the defaults (set up for VS2008 by default)
+SET ENVVAR="%PROGRAMROOT%\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"
+SET BUILDCMD=devenv.com
+SET OPTIONS=/useenv /build "%CONFIG%|Win32"
+SET BUILDDIR="VisualStudio 2008"
+
+REM Handle the non-defaults
+IF %COMPILER% == VS2010 SET ENVVAR="%PROGRAMROOT%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
+
+IF EXIST "%PROGRAMROOT%\Xoreax\IncrediBuild\BuildConsole.exe" SET BUILDCMD="%PROGRAMROOT%\Xoreax\IncrediBuild\BuildConsole.exe"
+IF EXIST "%PROGRAMROOT%\Xoreax\IncrediBuild\BuildConsole.exe" SET OPTIONS=/build "%CONFIG%|Win32"
+
+IF %COMPILER% == VS2010 SET BUILDDIR="VisualStudio 2010"
+
+
+echo Building all solutions under %COMPILER% with the %CONFIG% configuration
+
+echo Initializing %COMPILER% environment variables...
+call %ENVVAR%
+
+echo Initializing the DirectX SDK environment variables...
+
+IF "%DXSDK_DIR%" == "" goto error_no_DXSDK_DIR
+call "%DXSDK_DIR%Utilities\Bin\dx_setenv.cmd" x86
+
+echo Moving to our build directory
+cd %BUILDDIR%
+
+echo      - Building
+for %%a in (*.sln) do %BUILDCMD% "%%a" %OPTIONS% & IF ERRORLEVEL 1 goto error_compile
+
+REM It is just polite for a batch file to leave you in the same dir you started in
+cd ..
+
+REM We were successful in everything so go to the end
+goto :end
+
+:error_no_DXSDK_DIR
+@echo ERROR: DXSDK_DIR variable is not set. Make sure the DirectX SDK is installed properly.
+@goto end_error
+
+:error_compile
+@echo ERROR: There was an error compiling a solution in %CD%
+@goto end_error
+
+:end_error
+ENDLOCAL
+EXIT /B 1
+
+:end
+ENDLOCAL

+ 23 - 0
Templates/Full PhysX/buildFiles/config/project.conf

@@ -0,0 +1,23 @@
+<?php
+
+// Set this true to enable hifi networking instead of standard.
+// In general ... hifi is designed to better deal with fast
+// moving players in close proximity to each other, such as
+// a racing game.
+$TORQUE_HIFI_NET = false;
+
+// Configure Torque 3D
+Torque3D::beginConfig( "win32", "Full PhysX" );
+
+    // Include Web Deployment module
+    includeModule( 'webDeploy' );
+    
+    // Include PhysX physics over Torque's.
+    includeModule( 'physx' );
+        
+    // Enable for optional minidump debugging support
+    // addProjectDefine( 'TORQUE_MINIDUMP' );
+        
+Torque3D::endConfig();
+
+?>

+ 11 - 0
Templates/Full PhysX/buildFiles/config/project.mac.conf

@@ -0,0 +1,11 @@
+<?php
+
+// Configure Torque 3D
+Torque3D::beginConfig( "mac", "Full PhysX" );
+
+    // Include Web Deployment module
+    includeModule( 'webDeploy' );
+        
+Torque3D::endConfig();
+
+?>

+ 12 - 0
Templates/Full PhysX/buildFiles/config/projectCode.conf

@@ -0,0 +1,12 @@
+<?php
+
+   // This file is used to add your project specific code to the Torque 3D Game Engine
+   
+   // by default we add the project's source folders recursively
+   addSrcDir('../source', true);
+
+   // Here is an example of how to include your project specific code 
+   // In this case all the code in the "custom" folder in your project's source directory would be added
+   // addSrcDir('../source/custom');
+
+?>

+ 41 - 0
Templates/Full PhysX/buildFiles/config/webDeploy.conf

@@ -0,0 +1,41 @@
+<?php
+
+class WebDeploymentWindows
+{
+
+    public static $plugin = "WebFullPhysXTemplate";
+
+    //------ NP plugin settings
+
+    // The plugin MUST begin with NP for Firefox to recognize it
+    // setup in project.conf
+    public static $npPluginName = "";
+    
+    public static $company = "My Game Company";
+	public static $companyKey = "mygamecompany";
+	public static $productName = "My Web Game";
+	public static $version = "1.0";
+	public static $description = "My Web Game Plugin";
+        
+    // Before you should specify a unique MIME type for your game    
+    public static $mimeType = "x-fullphysxtemplateplugin";
+    
+    //------ ActiveX plugin settings
+    
+    // setup in project.conf
+    public static $axPluginName = "";
+    
+    // Before shipping the UUID should be changed to unique numbers for your game
+    
+    // This UUID is used by CLSID in object tag in your site's html
+    public static $axWebGameLibUUID = "D62D1B36-253D-4218-B033-5ACE0B42B8BF";
+
+    // Other UUID used by registry
+    public static $axAppUUID = "AB7615A3-A918-488B-B128-96DD62D0AE36";
+    public static $axWebGameUUID = "5240D24D-FBCE-4AF2-99FC-4C7AD4318E91";
+    public static $axWebGameCtrlUUID = "FC143328-E29C-4BC4-8C83-618FEB562532";
+    
+    
+};
+
+?>

+ 20 - 0
Templates/Full PhysX/buildFiles/config/webDeploy.mac.conf

@@ -0,0 +1,20 @@
+<?php
+
+class WebDeploymentOSX
+{
+
+    // setup in project.conf
+    public static $safariPluginName = ""; 
+    
+    public static $identifier = "com.mygamecompany.fullphysxtemplateplugin";
+
+    public static $description = "Full PhysX Template Plugin";
+    
+    public static $version = "1.0";
+        
+    // Before you should specify a unique MIME type for your game
+    public static $mimeType = "x-fullphysxtemplateplugin";
+    
+};
+
+?>

+ 7 - 0
Templates/Full PhysX/cleanShaders.bat

@@ -0,0 +1,7 @@
+REM Delete procedural shaders
+
+del /q /a:-R game\shaders\procedural\*.*
+
+REM Delete dumped shader disassembly files
+
+del /q /s /a:-R *_dis.txt

+ 4 - 0
Templates/Full PhysX/cleanShaders.command

@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cd "`dirname "$0"`"
+rm -rf game/shaders/procedural/*.*

BIN
Templates/Full PhysX/game/Full PhysX.dll


BIN
Templates/Full PhysX/game/Full PhysX.exe


+ 39 - 0
Templates/Full PhysX/game/Full PhysX.torsion

@@ -0,0 +1,39 @@
+<TorsionProject>
+<Name>Full PhysX</Name>
+<WorkingDir/>
+<EntryScript>main.cs</EntryScript>
+<DebugHook>dbgSetParameters( #port#, "#password#", true );</DebugHook>
+<Mods>
+<Folder>core</Folder>
+<Folder>scripts</Folder>
+<Folder>art</Folder>
+<Folder>levels</Folder>
+<Folder>shaders</Folder>
+<Folder>tools</Folder>
+</Mods>
+<ScannerExts>cs; gui</ScannerExts>
+<Configs>
+<Config>
+<Name>Release</Name>
+<Executable>Full PhysX.exe</Executable>
+<Arguments/>
+<HasExports>true</HasExports>
+<Precompile>true</Precompile>
+<InjectDebugger>true</InjectDebugger>
+<UseSetModPaths>false</UseSetModPaths>
+</Config>
+<Config>
+<Name>Debug</Name>
+<Executable>Full PhysX_DEBUG.exe</Executable>
+<Arguments/>
+<HasExports>true</HasExports>
+<Precompile>true</Precompile>
+<InjectDebugger>true</InjectDebugger>
+<UseSetModPaths>false</UseSetModPaths>
+</Config>
+</Configs>
+<SearchURL/>
+<SearchProduct>Full PhysX</SearchProduct>
+<SearchVersion>HEAD</SearchVersion>
+<ExecModifiedScripts>true</ExecModifiedScripts>
+</TorsionProject>

BIN
Templates/Full PhysX/game/IE Full PhysX Plugin.dll


BIN
Templates/Full PhysX/game/NP Full PhysX Plugin.dll


BIN
Templates/Full PhysX/game/PhysXCooking.dll


BIN
Templates/Full PhysX/game/PhysXCore.dll


BIN
Templates/Full PhysX/game/PhysXDevice.dll


BIN
Templates/Full PhysX/game/PhysXLoader.dll


+ 30 - 0
Templates/Full PhysX/game/art/datablocks/aiPlayer.cs

@@ -0,0 +1,30 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// Demo Pathed AIPlayer.
+//-----------------------------------------------------------------------------
+
+datablock PlayerData(DemoPlayer : DefaultPlayerData)
+{
+   shootingDelay = 2000;
+};

+ 42 - 0
Templates/Full PhysX/game/art/datablocks/audioProfiles.cs

@@ -0,0 +1,42 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+// Always declare audio Descriptions (the type of sound) before Profiles (the
+// sound itself) when creating new ones.
+
+// ----------------------------------------------------------------------------
+// Now for the profiles - these are the usable sounds
+// ----------------------------------------------------------------------------
+
+datablock SFXProfile(ThrowSnd)
+{
+   filename = "art/sound/throw";
+   description = AudioClose3d;
+   preload = false;
+};
+
+datablock SFXProfile(OOBWarningSnd)
+{
+   filename = "art/sound/orc_pain";
+   description = "AudioLoop2D";
+   preload = false;
+};

+ 58 - 0
Templates/Full PhysX/game/art/datablocks/datablockExec.cs

@@ -0,0 +1,58 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+// Load up all datablocks.  This function is called when
+// a server is constructed.
+
+// Do the sounds first -- later scripts/datablocks may need them
+exec("./audioProfiles.cs");
+
+// Do the various effects next -- later scripts/datablocks may need them
+exec("./particles.cs");
+
+exec("./environment.cs");
+exec("./triggers.cs");
+
+// Add a rigid example
+exec("./rigidShape.cs");
+
+exec("./health.cs");
+
+// Load our supporting weapon datablocks
+exec("./weapon.cs");
+
+// Load the weapon datablocks
+exec("./weapons/grenadeLauncher.cs");
+exec("./weapons/grenade.cs");
+exec("./weapons/rocketLauncher.cs");
+exec("./weapons/Lurker.cs");
+exec("./weapons/Ryder.cs");
+exec("./weapons/ProxMine.cs");
+exec("./weapons/Turret.cs");
+
+exec("./teleporter.cs");
+
+// Load the default player datablocks
+exec("./player.cs");
+
+// Load our other player datablocks
+exec("./aiPlayer.cs");

+ 86 - 0
Templates/Full PhysX/game/art/datablocks/environment.cs

@@ -0,0 +1,86 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+// ENVIROMENTAL EFFECTS GO HERE (PRECIPITATION - LIGHTNING)
+
+// ----------------------------------------------------------------------------
+// Rain
+// ----------------------------------------------------------------------------
+
+datablock SFXProfile(HeavyRainSound)
+{
+   filename = "art/sound/environment/amb";
+   description = AudioLoop2d;
+};
+
+datablock PrecipitationData(HeavyRain)
+{
+   soundProfile = "HeavyRainSound";
+
+   dropTexture = "art/environment/precipitation/rain";
+   splashTexture = "art/environment/precipitation/water_splash";
+   dropSize = 0.35;
+   splashSize = 0.1;
+   useTrueBillboards = false;
+   splashMS = 500;
+};
+
+// ----------------------------------------------------------------------------
+// Lightning
+// ----------------------------------------------------------------------------
+
+// When setting up thunder sounds for lightning it should be known that:
+// - strikeSound is a 3d sound
+// - thunderSounds[n] are 2d sounds
+
+datablock SFXProfile(ThunderCrash1Sound)
+{
+   filename = "art/sound/environment/thunder1";
+   description = Audio2d;
+};
+
+datablock SFXProfile(ThunderCrash2Sound)
+{
+   filename = "art/sound/environment/thunder2";
+   description = Audio2d;
+};
+
+datablock SFXProfile(ThunderCrash3Sound)
+{
+   filename = "art/sound/environment/thunder3";
+   description = Audio2d;
+};
+
+datablock SFXProfile(ThunderCrash4Sound)
+{
+   filename = "art/sound/environment/thunder4";
+   description = Audio2d;
+};
+
+
+datablock LightningData(DefaultStorm)
+{
+   thunderSounds[0] = ThunderCrash1Sound;
+   thunderSounds[1] = ThunderCrash2Sound;
+   thunderSounds[2] = ThunderCrash3Sound;
+   thunderSounds[3] = ThunderCrash4Sound;
+};

+ 85 - 0
Templates/Full PhysX/game/art/datablocks/health.cs

@@ -0,0 +1,85 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+// Inventory items.  These objects rely on the item & inventory support
+// system defined in item.cs and inventory.cs
+
+//-----------------------------------------------------------------------------
+// Health kits can be added to your inventory and used to heal up.
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// Audio profiles
+//-----------------------------------------------------------------------------
+datablock SFXProfile(HealthUseSound)
+{
+   filename = "art/sound/health_mono_01";
+   description = AudioClose3d;
+   preload = true;
+};
+
+//-----------------------------------------------------------------------------
+// Health Kits cannot be picked up and are not meant to be added to
+// inventory.  Health is applied automatically when an objects collides
+// with a patch.
+//-----------------------------------------------------------------------------
+
+datablock ItemData(HealthKitSmall)
+{
+   // Mission editor category, this datablock will show up in the
+   // specified category under the "shapes" root category.
+   category = "Health";
+
+   className = "HealthPatch";
+
+   // Basic Item properties
+   shapeFile = "art/shapes/items/kit/healthkit.dts";
+   mass = 2;
+   friction = 1;
+   elasticity = 0.3;
+   emap = true;
+
+   // Dynamic properties defined by the scripts
+   pickupName = "a small health kit";
+   repairAmount = 50;
+};
+
+// This is the "health patch" dropped by a dying player.
+datablock ItemData(HealthKitPatch)
+{
+   // Mission editor category, this datablock will show up in the
+   // specified category under the "shapes" root category.
+   category = "Health";
+
+   className = "HealthPatch";
+
+   // Basic Item properties
+   shapeFile = "art/shapes/items/patch/healthpatch.dts";
+   mass = 2;
+   friction = 1;
+   elasticity = 0.3;
+   emap = true;
+
+   // Dynamic properties defined by the scripts
+   pickupName = "a health patch";
+   repairAmount = 50;
+};

+ 24 - 0
Templates/Full PhysX/game/art/datablocks/managedDatablocks.cs

@@ -0,0 +1,24 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+// This is the default save location for any Datablocks created in the
+// Datablock Editor (this script is executed from onServerCreated())

+ 243 - 0
Templates/Full PhysX/game/art/datablocks/particles.cs

@@ -0,0 +1,243 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+datablock ParticleEmitterNodeData(DefaultEmitterNodeData)
+{
+   timeMultiple = 1;
+};
+
+// Smoke
+
+datablock ParticleData(Smoke)
+{
+   textureName          = "art/shapes/particles/smoke";
+   dragCoefficient      = 0.3;
+   gravityCoefficient   = -0.2;   // rises slowly
+   inheritedVelFactor   = 0.00;
+   lifetimeMS           = 3000;
+   lifetimeVarianceMS   = 250;
+   useInvAlpha          = true;
+   spinRandomMin        = -30.0;
+   spinRandomMax        = 30.0;
+
+   sizes[0]      = 1.5;
+   sizes[1]      = 2.75;
+   sizes[2]      = 6.5;
+
+   times[0]      = 0.0;
+   times[1]      = 0.5;
+   times[2]      = 1.0;
+};
+
+datablock ParticleEmitterData(SmokeEmitter)
+{
+   ejectionPeriodMS = 400;
+   periodVarianceMS = 5;
+
+   ejectionVelocity = 0.0;
+   velocityVariance = 0.0;
+
+   thetaMin         = 0.0;
+   thetaMax         = 90.0;
+
+   particles        = Smoke;
+};
+
+datablock ParticleEmitterNodeData(SmokeEmitterNode)
+{
+   timeMultiple = 1;
+};
+
+// Ember
+
+datablock ParticleData(EmberParticle)
+{
+   textureName          = "art/shapes/particles/ember";
+   dragCoefficient      = 0.0;
+   windCoefficient      = 0.0;
+   gravityCoefficient   = -0.05;   // rises slowly
+   inheritedVelFactor   = 0.00;
+   lifetimeMS           = 5000;
+   lifetimeVarianceMS   = 0;
+   useInvAlpha          = false;
+   spinRandomMin        = -90.0;
+   spinRandomMax        = 90.0;
+   spinSpeed            = 1;
+
+   colors[0]     = "1.000000 0.800000 0.000000 0.800000";
+   colors[1]     = "1.000000 0.700000 0.000000 0.800000";
+   colors[2]     = "1.000000 0.000000 0.000000 0.200000";
+
+   sizes[0]      = 0.05;
+   sizes[1]      = 0.1;
+   sizes[2]      = 0.05;
+
+   times[0]      = 0.0;
+   times[1]      = 0.5;
+   times[2]      = 1.0;
+};
+
+datablock ParticleEmitterData(EmberEmitter)
+{
+   ejectionPeriodMS = 100;
+   periodVarianceMS = 0;
+
+   ejectionVelocity = 0.75;
+   velocityVariance = 0.00;
+   ejectionOffset   = 2.0;
+
+   thetaMin         = 1.0;
+   thetaMax         = 100.0;
+
+   particles        = "EmberParticle";
+};
+
+datablock ParticleEmitterNodeData(EmberNode)
+{
+   timeMultiple = 1;
+};
+
+// Fire
+
+datablock ParticleData(FireParticle)
+{
+   textureName          = "art/shapes/particles/smoke";
+   dragCoefficient      = 0.0;
+   windCoefficient      = 0.0;
+   gravityCoefficient   = -0.05;   // rises slowly
+   inheritedVelFactor   = 0.00;
+   lifetimeMS           = 5000;
+   lifetimeVarianceMS   = 1000;
+   useInvAlpha          = false;
+   spinRandomMin        = -90.0;
+   spinRandomMax        = 90.0;
+   spinSpeed            = 1.0;
+
+   colors[0]     = "0.2 0.2 0.0 0.2";
+   colors[1]     = "0.6 0.2 0.0 0.2";
+   colors[2]     = "0.4 0.0 0.0 0.1";
+   colors[3]     = "0.1 0.04 0.0 0.3";
+
+   sizes[0]      = 0.5;
+   sizes[1]      = 4.0;
+   sizes[2]      = 5.0;
+   sizes[3]      = 6.0;
+
+   times[0]      = 0.0;
+   times[1]      = 0.1;
+   times[2]      = 0.2;
+   times[3]      = 0.3;
+};
+
+datablock ParticleEmitterData(FireEmitter)
+{
+   ejectionPeriodMS = 50;
+   periodVarianceMS = 0;
+
+   ejectionVelocity = 0.55;
+   velocityVariance = 0.00;
+   ejectionOffset   = 1.0;
+
+
+   thetaMin         = 1.0;
+   thetaMax         = 100.0;
+
+   particles        = "FireParticle";
+};
+
+datablock ParticleEmitterNodeData(FireNode)
+{
+   timeMultiple = 1;
+};
+
+// Torch Fire
+
+datablock ParticleData(TorchFire1)
+{
+   textureName          = "art/shapes/particles/smoke";
+   dragCoefficient      = 0.0;
+   gravityCoefficient   = -0.3;   // rises slowly
+   inheritedVelFactor   = 0.00;
+   lifetimeMS           = 500;
+   lifetimeVarianceMS   = 250;
+   useInvAlpha          = false;
+   spinRandomMin        = -30.0;
+   spinRandomMax        = 30.0;
+   spinSpeed            = 1;
+
+   colors[0]     = "0.6 0.6 0.0 0.1";
+   colors[1]     = "0.8 0.6 0.0 0.1";
+   colors[2]     = "0.0 0.0 0.0 0.1";
+
+   sizes[0]      = 0.5;
+   sizes[1]      = 0.5;
+   sizes[2]      = 2.4;
+
+   times[0]      = 0.0;
+   times[1]      = 0.5;
+   times[2]      = 1.0;
+};
+
+datablock ParticleData(TorchFire2)
+{
+   textureName          = "art/shapes/particles/smoke";
+   dragCoefficient      = 0.0;
+   gravityCoefficient   = -0.5;   // rises slowly
+   inheritedVelFactor   = 0.00;
+   lifetimeMS           = 800;
+   lifetimeVarianceMS   = 150;
+   useInvAlpha          = false;
+   spinRandomMin        = -30.0;
+   spinRandomMax        = 30.0;
+   spinSpeed            = 1;
+
+   colors[0]     = "0.8 0.6 0.0 0.1";
+   colors[1]     = "0.6 0.6 0.0 0.1";
+   colors[2]     = "0.0 0.0 0.0 0.1";
+
+   sizes[0]      = 0.3;
+   sizes[1]      = 0.3;
+   sizes[2]      = 0.3;
+
+   times[0]      = 0.0;
+   times[1]      = 0.5;
+   times[2]      = 1.0;
+};
+
+datablock ParticleEmitterData(TorchFireEmitter)
+{
+   ejectionPeriodMS = 15;
+   periodVarianceMS = 5;
+
+   ejectionVelocity = 0.25;
+   velocityVariance = 0.10;
+
+   thetaMin         = 0.0;
+   thetaMax         = 45.0;
+
+   particles        = "TorchFire1" TAB "TorchFire2";
+};
+
+datablock ParticleEmitterNodeData(TorchFireEmitterNode)
+{
+   timeMultiple = 1;
+};

+ 676 - 0
Templates/Full PhysX/game/art/datablocks/player.cs

@@ -0,0 +1,676 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+// Player Audio Profiles
+//----------------------------------------------------------------------------
+
+datablock SFXProfile(DeathCrySound)
+{
+   fileName = "art/sound/orc_death";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock SFXProfile(PainCrySound)
+{
+   fileName = "art/sound/orc_pain";
+   description = AudioClose3d;
+   preload = true;
+};
+
+//----------------------------------------------------------------------------
+
+datablock SFXProfile(FootLightSoftSound)
+{
+   filename    = "art/sound/lgtStep_mono_01";
+   description = AudioClosest3d;
+   preload = true;
+};
+
+datablock SFXProfile(FootLightHardSound)
+{
+   filename    = "art/sound/hvystep_ mono_01";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock SFXProfile(FootLightMetalSound)
+{
+   filename    = "art/sound/metalstep_mono_01";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock SFXProfile(FootLightSnowSound)
+{
+   filename    = "art/sound/snowstep_mono_01";
+   description = AudioClosest3d;
+   preload = true;
+};
+
+datablock SFXProfile(FootLightShallowSplashSound)
+{
+   filename    = "art/sound/waterstep_mono_01";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock SFXProfile(FootLightWadingSound)
+{
+   filename    = "art/sound/waterstep_mono_01";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock SFXProfile(FootLightUnderwaterSound)
+{
+   filename    = "art/sound/waterstep_mono_01";
+   description = AudioClosest3d;
+   preload = true;
+};
+
+//----------------------------------------------------------------------------
+// Splash
+//----------------------------------------------------------------------------
+
+datablock ParticleData(PlayerSplashMist)
+{
+   dragCoefficient      = 2.0;
+   gravityCoefficient   = -0.05;
+   inheritedVelFactor   = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS           = 400;
+   lifetimeVarianceMS   = 100;
+   useInvAlpha          = false;
+   spinRandomMin        = -90.0;
+   spinRandomMax        = 500.0;
+   textureName          = "art/shapes/actors/common/splash";
+   colors[0]     = "0.7 0.8 1.0 1.0";
+   colors[1]     = "0.7 0.8 1.0 0.5";
+   colors[2]     = "0.7 0.8 1.0 0.0";
+   sizes[0]      = 0.5;
+   sizes[1]      = 0.5;
+   sizes[2]      = 0.8;
+   times[0]      = 0.0;
+   times[1]      = 0.5;
+   times[2]      = 1.0;
+};
+
+datablock ParticleEmitterData(PlayerSplashMistEmitter)
+{
+   ejectionPeriodMS = 5;
+   periodVarianceMS = 0;
+   ejectionVelocity = 3.0;
+   velocityVariance = 2.0;
+   ejectionOffset   = 0.0;
+   thetaMin         = 85;
+   thetaMax         = 85;
+   phiReferenceVel  = 0;
+   phiVariance      = 360;
+   overrideAdvance = false;
+   lifetimeMS       = 250;
+   particles = "PlayerSplashMist";
+};
+
+
+datablock ParticleData(PlayerBubbleParticle)
+{
+   dragCoefficient      = 0.0;
+   gravityCoefficient   = -0.50;
+   inheritedVelFactor   = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS           = 400;
+   lifetimeVarianceMS   = 100;
+   useInvAlpha          = false;
+   textureName          = "art/shapes/actors/common/splash";
+   colors[0]     = "0.7 0.8 1.0 0.4";
+   colors[1]     = "0.7 0.8 1.0 0.4";
+   colors[2]     = "0.7 0.8 1.0 0.0";
+   sizes[0]      = 0.1;
+   sizes[1]      = 0.3;
+   sizes[2]      = 0.3;
+   times[0]      = 0.0;
+   times[1]      = 0.5;
+   times[2]      = 1.0;
+};
+
+datablock ParticleEmitterData(PlayerBubbleEmitter)
+{
+   ejectionPeriodMS = 1;
+   periodVarianceMS = 0;
+   ejectionVelocity = 2.0;
+   ejectionOffset   = 0.5;
+   velocityVariance = 0.5;
+   thetaMin         = 0;
+   thetaMax         = 80;
+   phiReferenceVel  = 0;
+   phiVariance      = 360;
+   overrideAdvance = false;
+   particles = "PlayerBubbleParticle";
+};
+
+datablock ParticleData(PlayerFoamParticle)
+{
+   dragCoefficient      = 2.0;
+   gravityCoefficient   = -0.05;
+   inheritedVelFactor   = 0.1;
+   constantAcceleration = 0.0;
+   lifetimeMS           = 600;
+   lifetimeVarianceMS   = 100;
+   useInvAlpha          = false;
+   spinRandomMin        = -90.0;
+   spinRandomMax        = 500.0;
+   textureName          = "art/shapes/particles/millsplash01";
+   colors[0]     = "0.7 0.8 1.0 0.20";
+   colors[1]     = "0.7 0.8 1.0 0.20";
+   colors[2]     = "0.7 0.8 1.0 0.00";
+   sizes[0]      = 0.2;
+   sizes[1]      = 0.4;
+   sizes[2]      = 1.6;
+   times[0]      = 0.0;
+   times[1]      = 0.5;
+   times[2]      = 1.0;
+};
+
+datablock ParticleEmitterData(PlayerFoamEmitter)
+{
+   ejectionPeriodMS = 10;
+   periodVarianceMS = 0;
+   ejectionVelocity = 3.0;
+   velocityVariance = 1.0;
+   ejectionOffset   = 0.0;
+   thetaMin         = 85;
+   thetaMax         = 85;
+   phiReferenceVel  = 0;
+   phiVariance      = 360;
+   overrideAdvance = false;
+   particles = "PlayerFoamParticle";
+};
+
+
+datablock ParticleData( PlayerFoamDropletsParticle )
+{
+   dragCoefficient      = 1;
+   gravityCoefficient   = 0.2;
+   inheritedVelFactor   = 0.2;
+   constantAcceleration = -0.0;
+   lifetimeMS           = 600;
+   lifetimeVarianceMS   = 0;
+   textureName          = "art/shapes/actors/common/splash";
+   colors[0]     = "0.7 0.8 1.0 1.0";
+   colors[1]     = "0.7 0.8 1.0 0.5";
+   colors[2]     = "0.7 0.8 1.0 0.0";
+   sizes[0]      = 0.8;
+   sizes[1]      = 0.3;
+   sizes[2]      = 0.0;
+   times[0]      = 0.0;
+   times[1]      = 0.5;
+   times[2]      = 1.0;
+};
+
+datablock ParticleEmitterData( PlayerFoamDropletsEmitter )
+{
+   ejectionPeriodMS = 7;
+   periodVarianceMS = 0;
+   ejectionVelocity = 2;
+   velocityVariance = 1.0;
+   ejectionOffset   = 0.0;
+   thetaMin         = 60;
+   thetaMax         = 80;
+   phiReferenceVel  = 0;
+   phiVariance      = 360;
+   overrideAdvance = false;
+   orientParticles  = true;
+   particles = "PlayerFoamDropletsParticle";
+};
+
+datablock ParticleData( PlayerWakeParticle )
+{
+   textureName          = "art/shapes/particles/wake";
+   dragCoefficient     = "0.0";
+   gravityCoefficient   = "0.0";
+   inheritedVelFactor   = "0.0";
+   lifetimeMS           = "2500";
+   lifetimeVarianceMS   = "200";
+   windCoefficient = "0.0";
+   useInvAlpha = "1";
+   spinRandomMin = "30.0";
+   spinRandomMax = "30.0";
+
+   animateTexture = true;
+   framesPerSec = 1;
+   animTexTiling = "2 1";
+   animTexFrames = "0 1";
+
+   colors[0]     = "1 1 1 0.1";
+   colors[1]     = "1 1 1 0.7";
+   colors[2]     = "1 1 1 0.3";
+   colors[3]     = "0.5 0.5 0.5 0";
+
+   sizes[0]      = "1.0";
+   sizes[1]      = "2.0";
+   sizes[2]      = "3.0";
+   sizes[3]      = "3.5";
+
+   times[0]      = "0.0";
+   times[1]      = "0.25";
+   times[2]      = "0.5";
+   times[3]      = "1.0";
+};
+
+datablock ParticleEmitterData( PlayerWakeEmitter )
+{
+   ejectionPeriodMS = "200";
+   periodVarianceMS = "10";
+
+   ejectionVelocity = "0";
+   velocityVariance = "0";
+
+   ejectionOffset   = "0";
+
+   thetaMin         = "89";
+   thetaMax         = "90";
+
+   phiReferenceVel  = "0";
+   phiVariance      = "1";
+
+   alignParticles = "1";
+   alignDirection = "0 0 1";
+
+   particles = "PlayerWakeParticle";
+};
+
+datablock ParticleData( PlayerSplashParticle )
+{
+   dragCoefficient      = 1;
+   gravityCoefficient   = 0.2;
+   inheritedVelFactor   = 0.2;
+   constantAcceleration = -0.0;
+   lifetimeMS           = 600;
+   lifetimeVarianceMS   = 0;
+   colors[0]     = "0.7 0.8 1.0 1.0";
+   colors[1]     = "0.7 0.8 1.0 0.5";
+   colors[2]     = "0.7 0.8 1.0 0.0";
+   sizes[0]      = 0.5;
+   sizes[1]      = 0.5;
+   sizes[2]      = 0.5;
+   times[0]      = 0.0;
+   times[1]      = 0.5;
+   times[2]      = 1.0;
+};
+
+datablock ParticleEmitterData( PlayerSplashEmitter )
+{
+   ejectionPeriodMS = 1;
+   periodVarianceMS = 0;
+   ejectionVelocity = 3;
+   velocityVariance = 1.0;
+   ejectionOffset   = 0.0;
+   thetaMin         = 60;
+   thetaMax         = 80;
+   phiReferenceVel  = 0;
+   phiVariance      = 360;
+   overrideAdvance = false;
+   orientParticles  = true;
+   lifetimeMS       = 100;
+   particles = "PlayerSplashParticle";
+};
+
+datablock SplashData(PlayerSplash)
+{
+   numSegments = 15;
+   ejectionFreq = 15;
+   ejectionAngle = 40;
+   ringLifetime = 0.5;
+   lifetimeMS = 300;
+   velocity = 4.0;
+   startRadius = 0.0;
+   acceleration = -3.0;
+   texWrap = 5.0;
+
+   texture = "art/shapes/particles/millsplash01";
+
+   emitter[0] = PlayerSplashEmitter;
+   emitter[1] = PlayerSplashMistEmitter;
+
+   colors[0] = "0.7 0.8 1.0 0.0";
+   colors[1] = "0.7 0.8 1.0 0.3";
+   colors[2] = "0.7 0.8 1.0 0.7";
+   colors[3] = "0.7 0.8 1.0 0.0";
+   times[0] = 0.0;
+   times[1] = 0.4;
+   times[2] = 0.8;
+   times[3] = 1.0;
+};
+
+//----------------------------------------------------------------------------
+// Foot puffs
+//----------------------------------------------------------------------------
+
+datablock ParticleData(LightPuff)
+{
+   dragCoefficient      = 2.0;
+   gravityCoefficient   = -0.01;
+   inheritedVelFactor   = 0.6;
+   constantAcceleration = 0.0;
+   lifetimeMS           = 800;
+   lifetimeVarianceMS   = 100;
+   useInvAlpha          = true;
+   spinRandomMin        = -35.0;
+   spinRandomMax        = 35.0;
+   colors[0]     = "1.0 1.0 1.0 1.0";
+   colors[1]     = "1.0 1.0 1.0 0.0";
+   sizes[0]      = 0.1;
+   sizes[1]      = 0.8;
+   times[0]      = 0.3;
+   times[1]      = 1.0;
+};
+
+datablock ParticleEmitterData(LightPuffEmitter)
+{
+   ejectionPeriodMS = 35;
+   periodVarianceMS = 10;
+   ejectionVelocity = 0.2;
+   velocityVariance = 0.1;
+   ejectionOffset   = 0.0;
+   thetaMin         = 20;
+   thetaMax         = 60;
+   phiReferenceVel  = 0;
+   phiVariance      = 360;
+   overrideAdvance = false;
+   useEmitterColors = true;
+   particles = "LightPuff";
+};
+
+//----------------------------------------------------------------------------
+// Liftoff dust
+//----------------------------------------------------------------------------
+
+datablock ParticleData(LiftoffDust)
+{
+   dragCoefficient      = 1.0;
+   gravityCoefficient   = -0.01;
+   inheritedVelFactor   = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS           = 1000;
+   lifetimeVarianceMS   = 100;
+   useInvAlpha          = true;
+   spinRandomMin        = -90.0;
+   spinRandomMax        = 500.0;
+   colors[0]     = "1.0 1.0 1.0 1.0";
+   sizes[0]      = 1.0;
+   times[0]      = 1.0;
+   textureName = "art/shapes/particles/dustParticle";
+};
+
+datablock ParticleEmitterData(LiftoffDustEmitter)
+{
+   ejectionPeriodMS = 5;
+   periodVarianceMS = 0;
+   ejectionVelocity = 2.0;
+   velocityVariance = 0.0;
+   ejectionOffset   = 0.0;
+   thetaMin         = 90;
+   thetaMax         = 90;
+   phiReferenceVel  = 0;
+   phiVariance      = 360;
+   overrideAdvance = false;
+   useEmitterColors = true;
+   particles = "LiftoffDust";
+};
+
+//----------------------------------------------------------------------------
+
+datablock DecalData(PlayerFootprint)
+{
+   size = 0.4;
+   material = CommonPlayerFootprint;
+};
+
+datablock DebrisData( PlayerDebris )
+{
+   explodeOnMaxBounce = false;
+
+   elasticity = 0.15;
+   friction = 0.5;
+
+   lifetime = 4.0;
+   lifetimeVariance = 0.0;
+
+   minSpinSpeed = 40;
+   maxSpinSpeed = 600;
+
+   numBounces = 5;
+   bounceVariance = 0;
+
+   staticOnMaxBounce = true;
+   gravModifier = 1.0;
+
+   useRadiusMass = true;
+   baseRadius = 1;
+
+   velocity = 20.0;
+   velocityVariance = 12.0;
+};
+
+// ----------------------------------------------------------------------------
+// This is our default player datablock that all others will derive from.
+// ----------------------------------------------------------------------------
+
+datablock PlayerData(DefaultPlayerData)
+{
+   renderFirstPerson = false;
+
+   computeCRC = false;
+
+   // Third person shape
+   shapeFile = "art/shapes/actors/Soldier/soldier_rigged.dae";
+   cameraMaxDist = 3;
+   allowImageStateAnimation = true;
+
+   // First person arms
+   imageAnimPrefixFP = "soldier";
+   shapeNameFP[0] = "art/shapes/actors/Soldier/FP/FP_SoldierArms.DAE";
+
+   canObserve = 1;
+   cmdCategory = "Clients";
+
+   cameraDefaultFov = 55.0;
+   cameraMinFov = 5.0;
+   cameraMaxFov = 65.0;
+
+   debrisShapeName = "art/shapes/actors/common/debris_player.dts";
+   debris = playerDebris;
+   
+   throwForce = 30;
+
+   aiAvoidThis = 1;
+
+   minLookAngle = "-1.4";
+   maxLookAngle = "0.9";
+   maxFreelookAngle = 3.0;
+
+   mass = 120;
+   drag = 1.3;
+   maxdrag = 0.4;
+   density = 1.1;
+   maxDamage = 100;
+   maxEnergy =  60;
+   repairRate = 0.33;
+   energyPerDamagePoint = 75;
+
+   rechargeRate = 0.256;
+
+   runForce = 4320;
+   runEnergyDrain = 0;
+   minRunEnergy = 0;
+   maxForwardSpeed = 8;
+   maxBackwardSpeed = 6;
+   maxSideSpeed = 6;
+
+   sprintForce = 4320;
+   sprintEnergyDrain = 0;
+   minSprintEnergy = 0;
+   maxSprintForwardSpeed = 14;
+   maxSprintBackwardSpeed = 8;
+   maxSprintSideSpeed = 6;
+   sprintStrafeScale = 0.25;
+   sprintYawScale = 0.05;
+   sprintPitchScale = 0.05;
+   sprintCanJump = true;
+
+   crouchForce = 405;
+   maxCrouchForwardSpeed = 4.0;
+   maxCrouchBackwardSpeed = 2.0;
+   maxCrouchSideSpeed = 2.0;
+
+   maxUnderwaterForwardSpeed = 8.4;
+   maxUnderwaterBackwardSpeed = 7.8;
+   maxUnderwaterSideSpeed = 7.8;
+
+   jumpForce = "747";
+   jumpEnergyDrain = 0;
+   minJumpEnergy = 0;
+   jumpDelay = "15";
+   airControl = 0.3;
+
+   fallingSpeedThreshold = -6.0;
+
+   landSequenceTime = 0.33;
+   transitionToLand = false;
+   recoverDelay = 0;
+   recoverRunForceScale = 0;
+
+   minImpactSpeed = 10;
+   minLateralImpactSpeed = 20;
+   speedDamageScale = 0.4;
+
+   boundingBox = "0.65 0.75 1.85";
+   crouchBoundingBox = "0.65 0.75 1.3";
+   swimBoundingBox = "1 2 2";
+   pickupRadius = 1;
+
+   // Damage location details
+   boxHeadPercentage       = 0.83;
+   boxTorsoPercentage      = 0.49;
+   boxHeadLeftPercentage         = 0.30;
+   boxHeadRightPercentage        = 0.60;
+   boxHeadBackPercentage         = 0.30;
+   boxHeadFrontPercentage        = 0.60;
+
+   // Foot Prints
+   decalOffset = 0.25;
+
+   footPuffEmitter = "LightPuffEmitter";
+   footPuffNumParts = 10;
+   footPuffRadius = "0.25";
+
+   dustEmitter = "LightPuffEmitter";
+
+   splash = PlayerSplash;
+   splashVelocity = 4.0;
+   splashAngle = 67.0;
+   splashFreqMod = 300.0;
+   splashVelEpsilon = 0.60;
+   bubbleEmitTime = 0.4;
+   splashEmitter[0] = PlayerWakeEmitter;
+   splashEmitter[1] = PlayerFoamEmitter;
+   splashEmitter[2] = PlayerBubbleEmitter;
+   mediumSplashSoundVelocity = 10.0;
+   hardSplashSoundVelocity = 20.0;
+   exitSplashSoundVelocity = 5.0;
+
+   // Controls over slope of runnable/jumpable surfaces
+   runSurfaceAngle  = 38;
+   jumpSurfaceAngle = 80;
+   maxStepHeight = 0.35;  //two meters
+   minJumpSpeed = 20;
+   maxJumpSpeed = 30;
+
+   horizMaxSpeed = 68;
+   horizResistSpeed = 33;
+   horizResistFactor = 0.35;
+
+   upMaxSpeed = 80;
+   upResistSpeed = 25;
+   upResistFactor = 0.3;
+
+   footstepSplashHeight = 0.35;
+
+   //NOTE:  some sounds commented out until wav's are available
+
+   // Footstep Sounds
+   FootSoftSound        = FootLightSoftSound;
+   FootHardSound        = FootLightHardSound;
+   FootMetalSound       = FootLightMetalSound;
+   FootSnowSound        = FootLightSnowSound;
+   FootShallowSound     = FootLightShallowSplashSound;
+   FootWadingSound      = FootLightWadingSound;
+   FootUnderwaterSound  = FootLightUnderwaterSound;
+
+   //FootBubblesSound     = FootLightBubblesSound;
+   //movingBubblesSound   = ArmorMoveBubblesSound;
+   //waterBreathSound     = WaterBreathMaleSound;
+
+   //impactSoftSound      = ImpactLightSoftSound;
+   //impactHardSound      = ImpactLightHardSound;
+   //impactMetalSound     = ImpactLightMetalSound;
+   //impactSnowSound      = ImpactLightSnowSound;
+
+   //impactWaterEasy      = ImpactLightWaterEasySound;
+   //impactWaterMedium    = ImpactLightWaterMediumSound;
+   //impactWaterHard      = ImpactLightWaterHardSound;
+
+   groundImpactMinSpeed    = "45";
+   groundImpactShakeFreq   = "4.0 4.0 4.0";
+   groundImpactShakeAmp    = "1.0 1.0 1.0";
+   groundImpactShakeDuration = 0.8;
+   groundImpactShakeFalloff = 10.0;
+
+   //exitingWater         = ExitingWaterLightSound;
+
+   observeParameters = "0.5 4.5 4.5";
+   class = "armor";
+
+   cameraMinDist = "0";
+   DecalData = "PlayerFootprint";
+
+   // Allowable Inventory Items
+   mainWeapon = Lurker;
+
+   maxInv[Lurker] = 1;
+   maxInv[LurkerClip] = 20;
+
+   maxInv[LurkerGrenadeLauncher] = 1;
+   maxInv[LurkerGrenadeAmmo] = 20;
+
+   maxInv[Ryder] = 1;
+   maxInv[RyderClip] = 10;
+
+   maxInv[ProxMine] = 5;
+
+   maxInv[DeployableTurret] = 5;
+
+   // available skins (see materials.cs in model folder)
+   availableSkins =  "base	DarkBlue	DarkGreen	LightGreen	Orange	Red	Teal	Violet	Yellow";
+};

+ 60 - 0
Templates/Full PhysX/game/art/datablocks/rigidShape.cs

@@ -0,0 +1,60 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+datablock RigidShapeData( BouncingBoulder )
+{	
+   category = "RigidShape";
+	
+   shapeFile = "art/shapes/rocks/boulder.dts";
+   emap = true;
+
+   // Rigid Body
+   mass = 200;
+   massCenter = "0 0 0";    // Center of mass for rigid body
+   massBox = "0 0 0";         // Size of box used for moment of inertia,
+                              // if zero it defaults to object bounding box
+   drag = 0.2;                // Drag coefficient
+   bodyFriction = 0.2;
+   bodyRestitution = 0.1;
+   minImpactSpeed = 5;        // Impacts over this invoke the script callback
+   softImpactSpeed = 5;       // Play SoftImpact Sound
+   hardImpactSpeed = 15;      // Play HardImpact Sound
+   integration = 4;           // Physics integration: TickSec/Rate
+   collisionTol = 0.1;        // Collision distance tolerance
+   contactTol = 0.1;          // Contact velocity tolerance
+   
+   minRollSpeed = 10;
+   
+   maxDrag = 0.5;
+   minDrag = 0.01;
+
+   triggerDustHeight = 1;
+   dustHeight = 10;
+
+   dragForce = 0.05;
+   vertFactor = 0.05;
+
+   normalForce = 0.05;
+   restorativeForce = 0.05;
+   rollForce = 0.05;
+   pitchForce = 0.05;
+};

+ 143 - 0
Templates/Full PhysX/game/art/datablocks/teleporter.cs

@@ -0,0 +1,143 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// DefaultTrigger is used by the mission editor.  This is also an example
+// of trigger methods and callbacks.
+
+// A 3D sound played by the server at the location of the 
+// teleporter after an object has teleported.
+datablock SFXProfile(TeleportEntrance)  
+{  
+   fileName = "art/sound/orc_pain"; 
+   description = AudioDefault3D;  
+   preload = true;
+}; 
+
+// The 2D sound played by the client after a teleport.
+datablock SFXProfile(TeleportSound)  
+{  
+   fileName = "art/sound/orc_death"; 
+   description = Audio2D;  
+   preload = true;  
+};
+
+// Particles to use for the emitter at the teleporter
+datablock ParticleData(TeleporterParticles)
+{
+   lifetimeMS = "750";
+   lifetimeVarianceMS = "100";
+   textureName = "art/shapes/particles/Streak.png";
+   useInvAlpha = "0";
+   gravityCoefficient = "-1";
+   spinSpeed = "0";
+   spinRandomMin = "0";
+   spinRandomMax = "0";
+   colors[0]     = "0.0980392 0.788235 0.92549 1";
+   colors[1]     = "0.0627451 0.478431 0.952941 1";
+   colors[2]     = "0.0509804 0.690196 0.964706 1";
+   sizes[0]      = "1";
+   sizes[1]      = "1";
+   sizes[2]      = "1";
+   times[0]      = 0.0;
+   times[1]      = "0.415686";
+   times[2]      = "0.74902";
+   animTexName = "art/shapes/particles/Streak.png";
+   inheritedVelFactor = "0.0998043";
+   constantAcceleration = "-2";
+   colors[3] = "0.694118 0.843137 0.945098 0";
+   sizes[3] = "1";
+};
+
+// Particle Emitter to be played when a teleport occours.
+datablock ParticleEmitterData(TeleportEmitter)
+{
+   ejectionPeriodMS = "25";
+   periodVarianceMS = "2";
+   ejectionVelocity = "0.25";
+   velocityVariance = "0.1";
+   ejectionOffset   = "0.25";
+   thetaMin         = "90";
+   thetaMax         = "90";
+   phiReferenceVel  = 0;
+   phiVariance      = 360;
+   overrideAdvance = false;
+   lifetimeMS       = "1000";
+   particles = "TeleporterParticles";
+   blendStyle = "ADDITIVE";
+};
+
+// Ignore the name "explosion" for this. An Explosion in T3D
+// is really an effect that plays a SFXProfile, particle emitters,
+// point light, debris, and camera shake. Things normally associated with
+// an explosion, such as damage and pushback, are calculated outside of the
+// explosion object itself. Because of this, we use an ExplosionDatablock to 
+// attach visual effects to our teleporter.
+datablock ExplosionData(EntranceEffect)
+{
+   soundProfile = TeleportEntrance;
+
+   particleEmitter = "TeleportEmitter";
+   
+   lifeTimeMS = "288";
+
+   lightStartRadius = "0";
+   lightEndRadius = "2.82353";
+   lightStartColor = "0.992126 0.992126 0.992126 1";
+   lightEndColor = "0 0.102362 0.992126 1";
+   lightStartBrightness = "0.784314";
+   lightEndBrightness = "4";
+   lightNormalOffset = "0";
+   emitter[0] = "RocketSplashEmitter";
+   times[0] = "0.247059";
+   particleRadius = "0.1";
+   particleDensity = "10";
+   playSpeed = "1";
+};
+
+datablock TriggerData(TeleporterTrigger : DefaultTrigger)
+{
+   // Amount of time, in milliseconds, to wait before allowing another
+   // object to use this teleportat.
+	teleporterCooldown = 0;
+	
+	// Amount to scale the object's exit velocity. Larger values will
+	// propel the object with greater force.
+	exitVelocityScale = 0;
+	
+	// If true, the object will be oriented to the front
+	// of the exit teleporter. Otherwise the player will retain their original
+	// orientation.
+	reorientPlayer = true;
+	
+	// If true, the teleporter will only trigger if the object
+	// enters the front of the teleporter.
+	oneSided = false;
+	
+	// Effects to play at the entrance of the teleporter.
+	entranceEffect = EntranceEffect;
+	exiteffect = EntranceEffect;
+	
+	// 2D Sound to play for the client being teleported.
+	teleportSound = TeleportSound;
+	
+};

+ 38 - 0
Templates/Full PhysX/game/art/datablocks/triggers.cs

@@ -0,0 +1,38 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// DefaultTrigger is used by the mission editor.  This is also an example
+// of trigger methods and callbacks.
+
+datablock TriggerData(DefaultTrigger)
+{
+   // The period is value is used to control how often the console
+   // onTriggerTick callback is called while there are any objects
+   // in the trigger.  The default value is 100 MS.
+   tickPeriodMS = 100;
+};
+
+datablock TriggerData(ClientTrigger : DefaultTrigger)
+{
+   clientSide = true;
+};

+ 48 - 0
Templates/Full PhysX/game/art/datablocks/weapon.cs

@@ -0,0 +1,48 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+// This file contains 'generic' datablocks usable by all weapon class items.
+
+// ----------------------------------------------------------------------------
+// Audio profiles
+// ----------------------------------------------------------------------------
+
+datablock SFXProfile(WeaponUseSound)
+{
+   filename = "art/sound/weapons/weapon_switch";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock SFXProfile(WeaponPickupSound)
+{
+   filename = "art/sound/weapons/Weapon_pickup";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock SFXProfile(AmmoPickupSound)
+{
+   filename = "art/sound/weapons/Ammo_pickup";
+   description = AudioClose3d;
+   preload = true;
+};

+ 819 - 0
Templates/Full PhysX/game/art/datablocks/weapons/Lurker.cs

@@ -0,0 +1,819 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------
+// Sounds
+//--------------------------------------------------------------------------
+datablock SFXProfile(LurkerFireSound)
+{
+   filename = "art/sound/weapons/wpn_lurker_fire";
+   description = AudioClose3D;
+   preload = true;
+};
+
+datablock SFXProfile(LurkerReloadSound)
+{
+   filename = "art/sound/weapons/wpn_lurker_reload";
+   description = AudioClose3D;
+   preload = true;
+};
+
+datablock SFXProfile(LurkerIdleSound)
+{
+   filename = "art/sound/weapons/wpn_lurker_idle";
+   description = AudioClose3D;
+   preload = true;
+};
+
+datablock SFXProfile(LurkerSwitchinSound)
+{
+   filename = "art/sound/weapons/wpn_lurker_switchin";
+   description = AudioClose3D;
+   preload = true;
+};
+
+datablock SFXProfile(LurkerGrenadeFireSound)
+{
+   filename = "art/sound/weapons/wpn_lurker_grenadelaunch";
+   description = AudioClose3D;
+   preload = true;
+};
+
+datablock SFXPlayList(LurkerFireSoundList)
+{
+   // Use a looped description so the list playback will loop.
+   description = AudioClose3D;
+
+   track[ 0 ] = LurkerFireSound;
+};
+
+/*datablock SFXProfile(BulletImpactSound)
+{
+   filename = "art/sound/CT_fx/weapons/SCARFIRE";
+   description = AudioClose3D;
+   preload = true;
+};*/
+
+// ----------------------------------------------------------------------------
+// Particles
+// ----------------------------------------------------------------------------
+datablock ParticleData(GunFireSmoke)
+{
+   textureName          = "art/shapes/particles/smoke";
+   dragCoefficient      = 0;
+   gravityCoefficient   = "-1";
+   windCoefficient      = 0;
+   inheritedVelFactor   = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS           = 500;
+   lifetimeVarianceMS   = 200;
+   spinRandomMin = -180.0;
+   spinRandomMax =  180.0;
+   useInvAlpha   = true;
+
+   colors[0]     = "0.795276 0.795276 0.795276 0.692913";
+   colors[1]     = "0.866142 0.866142 0.866142 0.346457";
+   colors[2]     = "0.897638 0.834646 0.795276 0";
+
+   sizes[0]      = "0.399805";
+   sizes[1]      = "1.19941";
+   sizes[2]      = "1.69993";
+
+   times[0]      = 0.0;
+   times[1]      = "0.498039";
+   times[2]      = 1.0;
+   animTexName = "art/shapes/particles/smoke";
+};
+
+datablock ParticleEmitterData(GunFireSmokeEmitter)
+{
+   ejectionPeriodMS = 20;
+   periodVarianceMS = 10;
+   ejectionVelocity = "0";
+   velocityVariance = "0";
+   thetaMin         = "0";
+   thetaMax         = "0";
+   lifetimeMS       = 250;
+   particles = "GunFireSmoke";
+   blendStyle = "NORMAL";
+   softParticles = "0";
+   originalName = "GunFireSmokeEmitter";
+   alignParticles = "0";
+   orientParticles = "0";
+};
+
+datablock ParticleData(BulletDirtDust)
+{
+   textureName          = "art/shapes/particles/impact";
+   dragCoefficient      = "1";
+   gravityCoefficient   = "-0.100122";
+   windCoefficient      = 0;
+   inheritedVelFactor   = 0.0;
+   constantAcceleration = "-0.83";
+   lifetimeMS           = 800;
+   lifetimeVarianceMS   = 300;
+   spinRandomMin = -180.0;
+   spinRandomMax =  180.0;
+   useInvAlpha   = true;
+
+   colors[0]     = "0.496063 0.393701 0.299213 0.692913";
+   colors[1]     = "0.692913 0.614173 0.535433 0.346457";
+   colors[2]     = "0.897638 0.84252 0.795276 0";
+
+   sizes[0]      = "0.997986";
+   sizes[1]      = "2";
+   sizes[2]      = "2.5";
+
+   times[0]      = 0.0;
+   times[1]      = "0.498039";
+   times[2]      = 1.0;
+   animTexName = "art/shapes/particles/impact";
+};
+
+datablock ParticleEmitterData(BulletDirtDustEmitter)
+{
+   ejectionPeriodMS = 20;
+   periodVarianceMS = 10;
+   ejectionVelocity = "1";
+   velocityVariance = 1.0;
+   thetaMin         = 0.0;
+   thetaMax         = 180.0;
+   lifetimeMS       = 250;
+   particles = "BulletDirtDust";
+   blendStyle = "NORMAL";
+};
+
+//-----------------------------------------------------------------------------
+// Explosion
+//-----------------------------------------------------------------------------
+datablock ExplosionData(BulletDirtExplosion)
+{
+   soundProfile = BulletImpactSound;
+   lifeTimeMS = 65;
+
+   // Volume particles
+   particleEmitter = BulletDirtDustEmitter;
+   particleDensity = 4;
+   particleRadius = 0.3;
+
+   // Point emission
+   emitter[0] = BulletDirtSprayEmitter;
+   emitter[1] = BulletDirtSprayEmitter;
+   emitter[2] = BulletDirtRocksEmitter;
+};
+
+//--------------------------------------------------------------------------
+// Shell ejected during reload.
+//-----------------------------------------------------------------------------
+datablock DebrisData(BulletShell)
+{
+   shapeFile = "art/shapes/weapons/RifleShell/RifleShell.DAE";
+   lifetime = 6.0;
+   minSpinSpeed = 300.0;
+   maxSpinSpeed = 400.0;
+   elasticity = 0.65;
+   friction = 0.05;
+   numBounces = 5;
+   staticOnMaxBounce = true;
+   snapOnMaxBounce = false;
+   ignoreWater = true;
+   fade = true;
+};
+
+//-----------------------------------------------------------------------------
+// Projectile Object
+//-----------------------------------------------------------------------------
+datablock LightDescription( BulletProjectileLightDesc )
+{
+   color  = "0.0 0.5 0.7";
+   range = 3.0;
+};
+
+datablock ProjectileData( BulletProjectile )
+{
+   projectileShapeName = "";
+
+   directDamage        = 5;
+   radiusDamage        = 0;
+   damageRadius        = 0.5;
+   areaImpulse         = 0.5;
+   impactForce         = 1;
+
+   explosion           = BulletDirtExplosion;
+   decal               = BulletHoleDecal;
+
+   muzzleVelocity      = 120;
+   velInheritFactor    = 1;
+
+   armingDelay         = 0;
+   lifetime            = 992;
+   fadeDelay           = 1472;
+   bounceElasticity    = 0;
+   bounceFriction      = 0;
+   isBallistic         = false;
+   gravityMod          = 1;
+};
+
+function BulletProjectile::onCollision(%this,%obj,%col,%fade,%pos,%normal)
+{
+   // Apply impact force from the projectile.
+   
+   // Apply damage to the object all shape base objects
+   if ( %col.getType() & $TypeMasks::GameBaseObjectType )
+      %col.damage(%obj,%pos,%this.directDamage,"BulletProjectile");
+}
+
+
+//-----------------------------------------------------------------------------
+// Ammo Item
+//-----------------------------------------------------------------------------
+datablock ItemData(LurkerClip)
+{
+   // Mission editor category
+   category = "AmmoClip";
+
+   // Add the Ammo namespace as a parent.  The ammo namespace provides
+   // common ammo related functions and hooks into the inventory system.
+   className = "AmmoClip";
+
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/Lurker/TP_Lurker.DAE";
+   mass = 1;
+   elasticity = 0.2;
+   friction = 0.6;
+
+   // Dynamic properties defined by the scripts
+   pickUpName = "Lurker clip";
+   count = 1;
+   maxInventory = 10;
+};
+
+datablock ItemData(LurkerAmmo)
+{
+   // Mission editor category
+   category = "Ammo";
+
+   // Add the Ammo namespace as a parent.  The ammo namespace provides
+   // common ammo related functions and hooks into the inventory system.
+   className = "Ammo";
+
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/Lurker/TP_Lurker.DAE";
+   mass = 1;
+   elasticity = 0.2;
+   friction = 0.6;
+
+   // Dynamic properties defined by the scripts
+   pickUpName = "Lurker ammo";
+   maxInventory = 30;
+   clip = LurkerClip;
+};
+
+//--------------------------------------------------------------------------
+// Weapon Item.  This is the item that exists in the world, i.e. when it's
+// been dropped, thrown or is acting as re-spawnable item.  When the weapon
+// is mounted onto a shape, the LurkerWeaponImage is used.
+//-----------------------------------------------------------------------------
+datablock ItemData(Lurker)
+{
+   // Mission editor category
+   category = "Weapon";
+
+   // Hook into Item Weapon class hierarchy. The weapon namespace
+   // provides common weapon handling functions in addition to hooks
+   // into the inventory system.
+   className = "Weapon";
+
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/Lurker/TP_Lurker.DAE";
+   mass = 1;
+   elasticity = 0.2;
+   friction = 0.6;
+   emap = true;
+
+   // Dynamic properties defined by the scripts
+   PreviewImage = 'lurker.png';
+   pickUpName = "Lurker rifle";
+   description = "Lurker";
+   image = LurkerWeaponImage;
+   reticle = "crossHair";
+};
+
+
+datablock ShapeBaseImageData(LurkerWeaponImage)
+{
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/Lurker/TP_Lurker.DAE";
+   shapeFileFP = "art/shapes/weapons/Lurker/FP_Lurker.DAE";
+   emap = true;
+
+   imageAnimPrefix = "Rifle";
+   imageAnimPrefixFP = "Rifle";
+
+   // Specify mount point & offset for 3rd person, and eye offset
+   // for first person rendering.
+   mountPoint = 0;
+   firstPerson = true;
+   useEyeNode = true;
+   animateOnServer = true;
+
+   // When firing from a point offset from the eye, muzzle correction
+   // will adjust the muzzle vector to point to the eye LOS point.
+   // Since this weapon doesn't actually fire from the muzzle point,
+   // we need to turn this off.
+   correctMuzzleVector = true;
+
+   // Add the WeaponImage namespace as a parent, WeaponImage namespace
+   // provides some hooks into the inventory system.
+   class = "WeaponImage";
+   className = "WeaponImage";
+
+   // Projectiles and Ammo.
+   item = Lurker;
+   ammo = LurkerAmmo;
+   clip = LurkerClip;
+   
+   projectile = BulletProjectile;
+   projectileType = Projectile;
+   projectileSpread = "0.005";
+
+   altProjectile = GrenadeLauncherProjectile;
+   altProjectileSpread = "0.02";
+
+   casing = BulletShell;
+   shellExitDir        = "1.0 0.3 1.0";
+   shellExitOffset     = "0.15 -0.56 -0.1";
+   shellExitVariance   = 15.0;
+   shellVelocity       = 3.0;
+
+   // Weapon lights up while firing
+   lightType = "WeaponFireLight";
+   lightColor = "0.992126 0.968504 0.708661 1";
+   lightRadius = "4";
+   lightDuration = "100";
+   lightBrightness = 2;
+
+   // Shake camera while firing.
+   shakeCamera = false;
+   camShakeFreq = "0 0 0";
+   camShakeAmp = "0 0 0";
+
+   // Images have a state system which controls how the animations
+   // are run, which sounds are played, script callbacks, etc. This
+   // state system is downloaded to the client so that clients can
+   // predict state changes and animate accordingly.  The following
+   // system supports basic ready->fire->reload transitions as
+   // well as a no-ammo->dryfire idle state.
+
+   useRemainderDT = true;
+
+   // Initial start up state
+   stateName[0]                     = "Preactivate";
+   stateTransitionOnLoaded[0]       = "Activate";
+   stateTransitionOnNoAmmo[0]       = "NoAmmo";
+
+   // Activating the gun.  Called when the weapon is first
+   // mounted and there is ammo.
+   stateName[1]                     = "Activate";
+   stateTransitionGeneric0In[1]     = "SprintEnter";
+   stateTransitionOnTimeout[1]      = "Ready";
+   stateTimeoutValue[1]             = 0.5;
+   stateSequence[1]                 = "switch_in";
+   stateSound[1]                    = LurkerSwitchinSound;
+
+   // Ready to fire, just waiting for the trigger
+   stateName[2]                     = "Ready";
+   stateTransitionGeneric0In[2]     = "SprintEnter";
+   stateTransitionOnMotion[2]       = "ReadyMotion";
+   stateTransitionOnTimeout[2]      = "ReadyFidget";
+   stateTimeoutValue[2]             = 10;
+   stateWaitForTimeout[2]           = false;
+   stateScaleAnimation[2]           = false;
+   stateScaleAnimationFP[2]         = false;
+   stateTransitionOnNoAmmo[2]       = "NoAmmo";
+   stateTransitionOnTriggerDown[2]  = "Fire";
+   stateSequence[2]                 = "idle";
+
+   // Same as Ready state but plays a fidget sequence
+   stateName[3]                     = "ReadyFidget";
+   stateTransitionGeneric0In[3]     = "SprintEnter";
+   stateTransitionOnMotion[3]       = "ReadyMotion";
+   stateTransitionOnTimeout[3]      = "Ready";
+   stateTimeoutValue[3]             = 6;
+   stateWaitForTimeout[3]           = false;
+   stateTransitionOnNoAmmo[3]       = "NoAmmo";
+   stateTransitionOnTriggerDown[3]  = "Fire";
+   stateSequence[3]                 = "idle_fidget1";
+   stateSound[3]                    = LurkerIdleSound;
+
+   // Ready to fire with player moving
+   stateName[4]                     = "ReadyMotion";
+   stateTransitionGeneric0In[4]     = "SprintEnter";
+   stateTransitionOnNoMotion[4]     = "Ready";
+   stateWaitForTimeout[4]           = false;
+   stateScaleAnimation[4]           = false;
+   stateScaleAnimationFP[4]         = false;
+   stateSequenceTransitionIn[4]     = true;
+   stateSequenceTransitionOut[4]    = true;
+   stateTransitionOnNoAmmo[4]       = "NoAmmo";
+   stateTransitionOnTriggerDown[4]  = "Fire";
+   stateSequence[4]                 = "run";
+
+   // Fire the weapon. Calls the fire script which does
+   // the actual work.
+   stateName[5]                     = "Fire";
+   stateTransitionGeneric0In[5]     = "SprintEnter";
+   stateTransitionOnTimeout[5]      = "NewRound";
+   stateTimeoutValue[5]             = 0.15;
+   stateFire[5]                     = true;
+   stateRecoil[5]                   = "";
+   stateAllowImageChange[5]         = false;
+   stateSequence[5]                 = "fire";
+   stateScaleAnimation[5]           = false;
+   stateSequenceNeverTransition[5]  = true;
+   stateSequenceRandomFlash[5]      = true;        // use muzzle flash sequence
+   stateScript[5]                   = "onFire";
+   stateSound[5]                    = LurkerFireSoundList;
+   stateEmitter[5]                  = GunFireSmokeEmitter;
+   stateEmitterTime[5]              = 0.025;
+
+   // Put another round into the chamber if one is available
+   stateName[6]                     = "NewRound";
+   stateTransitionGeneric0In[6]     = "SprintEnter";
+   stateTransitionOnNoAmmo[6]       = "NoAmmo";
+   stateTransitionOnTimeout[6]      = "Ready";
+   stateWaitForTimeout[6]           = "0";
+   stateTimeoutValue[6]             = 0.05;
+   stateAllowImageChange[6]         = false;
+   stateEjectShell[6]               = true;
+
+   // No ammo in the weapon, just idle until something
+   // shows up. Play the dry fire sound if the trigger is
+   // pulled.
+   stateName[7]                     = "NoAmmo";
+   stateTransitionGeneric0In[7]     = "SprintEnter";
+   stateTransitionOnMotion[7]       = "NoAmmoMotion";
+   stateTransitionOnAmmo[7]         = "ReloadClip";
+   stateTimeoutValue[7]             = 0.1;   // Slight pause to allow script to run when trigger is still held down from Fire state
+   stateScript[7]                   = "onClipEmpty";
+   stateSequence[7]                 = "idle";
+   stateScaleAnimation[7]           = false;
+   stateScaleAnimationFP[7]         = false;
+   stateTransitionOnTriggerDown[7]  = "DryFire";
+   
+   stateName[8]                     = "NoAmmoMotion";
+   stateTransitionGeneric0In[8]     = "SprintEnter";
+   stateTransitionOnNoMotion[8]     = "NoAmmo";
+   stateWaitForTimeout[8]           = false;
+   stateScaleAnimation[8]           = false;
+   stateScaleAnimationFP[8]         = false;
+   stateSequenceTransitionIn[8]     = true;
+   stateSequenceTransitionOut[8]    = true;
+   stateTransitionOnTriggerDown[8]  = "DryFire";
+   stateTransitionOnAmmo[8]         = "ReloadClip";
+   stateSequence[8]                 = "run";
+
+   // No ammo dry fire
+   stateName[9]                     = "DryFire";
+   stateTransitionGeneric0In[9]     = "SprintEnter";
+   stateTransitionOnAmmo[9]         = "ReloadClip";
+   stateWaitForTimeout[9]           = "0";
+   stateTimeoutValue[9]             = 0.7;
+   stateTransitionOnTimeout[9]      = "NoAmmo";
+   stateScript[9]                   = "onDryFire";
+   stateSound[9]                    = MachineGunDryFire;
+
+   // Play the reload clip animation
+   stateName[10]                     = "ReloadClip";
+   stateTransitionGeneric0In[10]     = "SprintEnter";
+   stateTransitionOnTimeout[10]      = "Ready";
+   stateWaitForTimeout[10]           = true;
+   stateTimeoutValue[10]             = 3.0;
+   stateReload[10]                   = true;
+   stateSequence[10]                 = "reload";
+   stateShapeSequence[10]            = "Reload";
+   stateScaleShapeSequence[10]       = true;
+   stateSound[10]                    = LurkerReloadSound;
+
+   // Start Sprinting
+   stateName[11]                    = "SprintEnter";
+   stateTransitionGeneric0Out[11]   = "SprintExit";
+   stateTransitionOnTimeout[11]     = "Sprinting";
+   stateWaitForTimeout[11]          = false;
+   stateTimeoutValue[11]            = 0.5;
+   stateWaitForTimeout[11]          = false;
+   stateScaleAnimation[11]          = false;
+   stateScaleAnimationFP[11]        = false;
+   stateSequenceTransitionIn[11]    = true;
+   stateSequenceTransitionOut[11]   = true;
+   stateAllowImageChange[11]        = false;
+   stateSequence[11]                = "sprint";
+
+   // Sprinting
+   stateName[12]                    = "Sprinting";
+   stateTransitionGeneric0Out[12]   = "SprintExit";
+   stateWaitForTimeout[12]          = false;
+   stateScaleAnimation[12]          = false;
+   stateScaleAnimationFP[12]        = false;
+   stateSequenceTransitionIn[12]    = true;
+   stateSequenceTransitionOut[12]   = true;
+   stateAllowImageChange[12]        = false;
+   stateSequence[12]                = "sprint";
+   
+   // Stop Sprinting
+   stateName[13]                    = "SprintExit";
+   stateTransitionGeneric0In[13]    = "SprintEnter";
+   stateTransitionOnTimeout[13]     = "Ready";
+   stateWaitForTimeout[13]          = false;
+   stateTimeoutValue[13]            = 0.5;
+   stateSequenceTransitionIn[13]    = true;
+   stateSequenceTransitionOut[13]   = true;
+   stateAllowImageChange[13]        = false;
+   stateSequence[13]                = "sprint";
+};
+
+//--------------------------------------------------------------------------
+// Lurker Grenade Launcher
+//--------------------------------------------------------------------------
+
+datablock ItemData(LurkerGrenadeAmmo)
+{
+   // Mission editor category
+   category = "Ammo";
+
+   // Add the Ammo namespace as a parent.  The ammo namespace provides
+   // common ammo related functions and hooks into the inventory system.
+   className = "Ammo";
+
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/Lurker/TP_Lurker.DAE";
+   mass = 1;
+   elasticity = 0.2;
+   friction = 0.6;
+
+   // Dynamic properties defined by the scripts
+   pickUpName = "Lurker grenade ammo";
+   maxInventory = 20;
+};
+
+datablock ItemData(LurkerGrenadeLauncher)
+{
+   // Mission editor category
+   category = "Weapon";
+
+   // Hook into Item Weapon class hierarchy. The weapon namespace
+   // provides common weapon handling functions in addition to hooks
+   // into the inventory system.
+   className = "Weapon";
+
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/Lurker/TP_Lurker.DAE";
+   mass = 1;
+   elasticity = 0.2;
+   friction = 0.6;
+   emap = true;
+
+   // Dynamic properties defined by the scripts
+   PreviewImage = 'lurker.png';
+   pickUpName = "a Lurker grenade launcher";
+   description = "Lurker Grenade Launcher";
+   image = LurkerGrenadeLauncherImage;
+   reticle = "crossHair";
+};
+
+datablock ShapeBaseImageData(LurkerGrenadeLauncherImage)
+{
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/Lurker/TP_Lurker.DAE";
+   shapeFileFP = "art/shapes/weapons/Lurker/FP_Lurker.DAE";
+   emap = true;
+
+   imageAnimPrefix = "Rifle";
+   imageAnimPrefixFP = "Rifle";
+
+   // Specify mount point & offset for 3rd person, and eye offset
+   // for first person rendering.
+   mountPoint = 0;
+   firstPerson = true;
+   useEyeNode = true;
+   animateOnServer = true;
+
+   // When firing from a point offset from the eye, muzzle correction
+   // will adjust the muzzle vector to point to the eye LOS point.
+   // Since this weapon doesn't actually fire from the muzzle point,
+   // we need to turn this off.
+   correctMuzzleVector = true;
+
+   // Add the WeaponImage namespace as a parent, WeaponImage namespace
+   // provides some hooks into the inventory system.
+   class = "WeaponImage";
+   className = "WeaponImage";
+
+   // Projectiles and Ammo.
+   item = LurkerGrenadeLauncher;
+   ammo = LurkerGrenadeAmmo;
+
+   projectile = GrenadeLauncherProjectile;
+   projectileType = Projectile;
+   projectileSpread = "0.02";
+
+   // Weapon lights up while firing
+   lightType = "WeaponFireLight";
+   lightColor = "0.992126 0.968504 0.708661 1";
+   lightRadius = "4";
+   lightDuration = "100";
+   lightBrightness = 2;
+
+   // Shake camera while firing.
+   shakeCamera = false;
+   camShakeFreq = "0 0 0";
+   camShakeAmp = "0 0 0";
+
+   // Images have a state system which controls how the animations
+   // are run, which sounds are played, script callbacks, etc. This
+   // state system is downloaded to the client so that clients can
+   // predict state changes and animate accordingly.  The following
+   // system supports basic ready->fire->reload transitions as
+   // well as a no-ammo->dryfire idle state.
+
+   useRemainderDT = true;
+
+   // Initial start up state
+   stateName[0]                     = "Preactivate";
+   stateTransitionOnLoaded[0]       = "Activate";
+   stateTransitionOnNoAmmo[0]       = "NoAmmo";
+
+   // Activating the gun.  Called when the weapon is first
+   // mounted and there is ammo.
+   stateName[1]                     = "Activate";
+   stateTransitionGeneric0In[1]     = "SprintEnter";
+   stateTransitionOnTimeout[1]      = "Ready";
+   stateTimeoutValue[1]             = 0.5;
+   stateSequence[1]                 = "switch_in";
+   stateSound[1]                    = LurkerSwitchinSound;
+
+   // Ready to fire, just waiting for the trigger
+   stateName[2]                     = "Ready";
+   stateTransitionGeneric0In[2]     = "SprintEnter";
+   stateTransitionOnMotion[2]       = "ReadyMotion";
+   stateTransitionOnTimeout[2]      = "ReadyFidget";
+   stateTimeoutValue[2]             = 10;
+   stateWaitForTimeout[2]           = false;
+   stateScaleAnimation[2]           = false;
+   stateScaleAnimationFP[2]         = false;
+   stateTransitionOnNoAmmo[2]       = "NoAmmo";
+   stateTransitionOnTriggerDown[2]  = "Fire";
+   stateSequence[2]                 = "idle";
+
+   // Same as Ready state but plays a fidget sequence
+   stateName[3]                     = "ReadyFidget";
+   stateTransitionGeneric0In[3]     = "SprintEnter";
+   stateTransitionOnMotion[3]       = "ReadyMotion";
+   stateTransitionOnTimeout[3]      = "Ready";
+   stateTimeoutValue[3]             = 6;
+   stateWaitForTimeout[3]           = false;
+   stateTransitionOnNoAmmo[3]       = "NoAmmo";
+   stateTransitionOnTriggerDown[3]  = "Fire";
+   stateSequence[3]                 = "idle_fidget1";
+   stateSound[3]                    = LurkerIdleSound;
+
+   // Ready to fire with player moving
+   stateName[4]                     = "ReadyMotion";
+   stateTransitionGeneric0In[4]     = "SprintEnter";
+   stateTransitionOnNoMotion[4]     = "Ready";
+   stateWaitForTimeout[4]           = false;
+   stateScaleAnimation[4]           = false;
+   stateScaleAnimationFP[4]         = false;
+   stateSequenceTransitionIn[4]     = true;
+   stateSequenceTransitionOut[4]    = true;
+   stateTransitionOnNoAmmo[4]       = "NoAmmo";
+   stateTransitionOnTriggerDown[4]  = "Fire";
+   stateSequence[4]                 = "run";
+
+   // Fire the weapon. Calls the fire script which does
+   // the actual work.
+   stateName[5]                     = "Fire";
+   stateTransitionGeneric0In[5]     = "SprintEnter";
+   stateTransitionOnTimeout[5]      = "NewRound";
+   stateTimeoutValue[5]             = 1.2;
+   stateFire[5]                     = true;
+   stateRecoil[5]                   = "";
+   stateAllowImageChange[5]         = false;
+   stateSequence[5]                 = "fire_alt";
+   stateScaleAnimation[5]           = true;
+   stateSequenceNeverTransition[5]  = true;
+   stateSequenceRandomFlash[5]      = true;        // use muzzle flash sequence
+   stateScript[5]                   = "onFire";
+   stateSound[5]                    = LurkerGrenadeFireSound;
+   stateEmitter[5]                  = GunFireSmokeEmitter;
+   stateEmitterTime[5]              = 0.025;
+   stateEjectShell[5]               = true;
+
+   // Put another round into the chamber
+   stateName[6]                     = "NewRound";
+   stateTransitionGeneric0In[6]     = "SprintEnter";
+   stateTransitionOnNoAmmo[6]       = "NoAmmo";
+   stateTransitionOnTimeout[6]      = "Ready";
+   stateWaitForTimeout[6]           = "0";
+   stateTimeoutValue[6]             = 0.05;
+   stateAllowImageChange[6]         = false;
+
+   // No ammo in the weapon, just idle until something
+   // shows up. Play the dry fire sound if the trigger is
+   // pulled.
+   stateName[7]                     = "NoAmmo";
+   stateTransitionGeneric0In[7]     = "SprintEnter";
+   stateTransitionOnMotion[7]       = "NoAmmoReadyMotion";
+   stateTransitionOnAmmo[7]         = "ReloadClip";
+   stateTimeoutValue[7]             = 0.1;   // Slight pause to allow script to run when trigger is still held down from Fire state
+   stateScript[7]                   = "onClipEmpty";
+   stateSequence[7]                 = "idle";
+   stateScaleAnimation[7]           = false;
+   stateScaleAnimationFP[7]         = false;
+   stateTransitionOnTriggerDown[7]  = "DryFire";
+   
+   stateName[8]                     = "NoAmmoReadyMotion";
+   stateTransitionGeneric0In[8]     = "SprintEnter";
+   stateTransitionOnNoMotion[8]     = "NoAmmo";
+   stateWaitForTimeout[8]           = false;
+   stateScaleAnimation[8]           = false;
+   stateScaleAnimationFP[8]         = false;
+   stateSequenceTransitionIn[8]     = true;
+   stateSequenceTransitionOut[8]    = true;
+   stateTransitionOnAmmo[8]         = "ReloadClip";
+   stateTransitionOnTriggerDown[8]  = "DryFire";
+   stateSequence[8]                 = "run";
+
+   // No ammo dry fire
+   stateName[9]                     = "DryFire";
+   stateTransitionGeneric0In[9]     = "SprintEnter";
+   stateTimeoutValue[9]             = 1.0;
+   stateTransitionOnTimeout[9]      = "NoAmmo";
+   stateScript[9]                   = "onDryFire";
+
+   // Play the reload clip animation
+   stateName[10]                     = "ReloadClip";
+   stateTransitionGeneric0In[10]     = "SprintEnter";
+   stateTransitionOnTimeout[10]      = "Ready";
+   stateWaitForTimeout[10]           = true;
+   stateTimeoutValue[10]             = 3.0;
+   stateReload[10]                   = true;
+   stateSequence[10]                 = "reload";
+   stateShapeSequence[10]            = "Reload";
+   stateScaleShapeSequence[10]       = true;
+
+   // Start Sprinting
+   stateName[11]                    = "SprintEnter";
+   stateTransitionGeneric0Out[11]   = "SprintExit";
+   stateTransitionOnTimeout[11]     = "Sprinting";
+   stateWaitForTimeout[11]          = false;
+   stateTimeoutValue[11]            = 0.5;
+   stateWaitForTimeout[11]          = false;
+   stateScaleAnimation[11]          = false;
+   stateScaleAnimationFP[11]        = false;
+   stateSequenceTransitionIn[11]    = true;
+   stateSequenceTransitionOut[11]   = true;
+   stateAllowImageChange[11]        = false;
+   stateSequence[11]                = "sprint";
+
+   // Sprinting
+   stateName[12]                    = "Sprinting";
+   stateTransitionGeneric0Out[12]   = "SprintExit";
+   stateWaitForTimeout[12]          = false;
+   stateScaleAnimation[12]          = false;
+   stateScaleAnimationFP[12]        = false;
+   stateSequenceTransitionIn[12]    = true;
+   stateSequenceTransitionOut[12]   = true;
+   stateAllowImageChange[12]        = false;
+   stateSequence[12]                = "sprint";
+   
+   // Stop Sprinting
+   stateName[13]                    = "SprintExit";
+   stateTransitionGeneric0In[13]    = "SprintEnter";
+   stateTransitionOnTimeout[13]     = "Ready";
+   stateWaitForTimeout[13]          = false;
+   stateTimeoutValue[13]            = 0.5;
+   stateSequenceTransitionIn[13]    = true;
+   stateSequenceTransitionOut[13]   = true;
+   stateAllowImageChange[13]        = false;
+   stateSequence[13]                = "sprint";
+};

+ 402 - 0
Templates/Full PhysX/game/art/datablocks/weapons/NewWeaponTemplate.cs

@@ -0,0 +1,402 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------
+// Sounds
+//--------------------------------------------------------------------------
+// Added for Lesson 5 - Adding Weapons - 23 Sep 11
+datablock SFXProfile(WeaponTemplateFireSound)
+{
+   filename = "art/sound/weapons/wpn_fire";
+   description = AudioClose3D;
+   preload = true;
+};
+
+datablock SFXProfile(WeaponTemplateReloadSound)
+{
+   filename = "art/sound/weapons/wpn_reload";
+   description = AudioClose3D;
+   preload = true;
+};
+
+datablock SFXProfile(WeaponTemplateSwitchinSound)
+{
+   filename = "art/sound/weapons/wpn_switchin";
+   description = AudioClose3D;
+   preload = true;
+};
+
+datablock SFXProfile(WeaponTemplateIdleSound)
+{
+   filename = "art/sound/weapons/wpn_idle";
+   description = AudioClose3D;
+   preload = true;
+};
+
+datablock SFXProfile(WeaponTemplateGrenadeSound)
+{
+   filename = "art/sound/weapons/wpn_grenadelaunch";
+   description = AudioClose3D;
+   preload = true;
+};
+
+datablock SFXProfile(WeaponTemplateMineSwitchinSound)
+{
+   filename = "art/sound/weapons/wpn_mine_switchin";
+   description = AudioClose3D;
+   preload = true;
+};
+//-----------------------------------------------------------------------------
+// Added 28 Sep 11
+datablock LightDescription( BulletProjectileLightDesc )
+{
+   color  = "0.0 0.5 0.7";
+   range = 3.0;
+};
+
+datablock ProjectileData( BulletProjectile )
+{
+   projectileShapeName = "";
+
+   directDamage        = 5;
+   radiusDamage        = 0;
+   damageRadius        = 0.5;
+   areaImpulse         = 0.5;
+   impactForce         = 1;
+
+   explosion           = BulletDirtExplosion;
+   decal               = BulletHoleDecal;
+
+   muzzleVelocity      = 120;
+   velInheritFactor    = 1;
+
+   armingDelay         = 0;
+   lifetime            = 992;
+   fadeDelay           = 1472;
+   bounceElasticity    = 0;
+   bounceFriction      = 0;
+   isBallistic         = false;
+   gravityMod          = 1;
+};
+
+function BulletProjectile::onCollision(%this,%obj,%col,%fade,%pos,%normal)
+{
+   // Apply impact force from the projectile.
+   
+   // Apply damage to the object all shape base objects
+   if ( %col.getType() & $TypeMasks::GameBaseObjectType )
+      %col.damage(%obj,%pos,%this.directDamage,"BulletProjectile");
+}
+//-----------------------------------------------------------------------------
+
+datablock ProjectileData( WeaponTemplateProjectile )
+{
+   projectileShapeName              = "";
+
+   directDamage                     = 5;
+   radiusDamage                     = 0;
+   damageRadius                     = 0.5;
+   areaImpulse                      = 0.5;
+   impactForce                      = 1;
+
+   muzzleVelocity                   = 120;
+   velInheritFactor                 = 1;
+
+   armingDelay                      = 0;
+   lifetime                         = 992;
+   fadeDelay                        = 1472;
+   bounceElasticity                 = 0;
+   bounceFriction                   = 0;
+   isBallistic                      = false;
+   gravityMod                       = 1;
+};
+
+function WeaponTemplateProjectile::onCollision(%this,%obj,%col,%fade,%pos,%normal)
+{
+   // Apply impact force from the projectile.
+   
+   // Apply damage to the object all shape base objects
+   if ( %col.getType() & $TypeMasks::GameBaseObjectType )
+      %col.damage(%obj,%pos,%this.directDamage,"WeaponTemplateProjectile");
+}
+
+//-----------------------------------------------------------------------------
+// Ammo Item
+//-----------------------------------------------------------------------------
+datablock ItemData(WeaponTemplateAmmo)
+{
+   // Mission editor category
+   category                         = "Ammo";
+
+   // Add the Ammo namespace as a parent.  The ammo namespace provides
+   // common ammo related functions and hooks into the inventory system.
+   className                        = "Ammo";
+
+   // Basic Item properties
+   shapeFile                        = "";
+   mass                             = 1;
+   elasticity                       = 0.2;
+   friction                         = 0.6;
+
+   // Dynamic properties defined by the scripts
+   pickUpName                       = "";
+   maxInventory                     = 1000;
+};
+
+//--------------------------------------------------------------------------
+// Weapon Item.  This is the item that exists in the world, i.e. when it's
+// been dropped, thrown or is acting as re-spawnable item.  When the weapon
+// is mounted onto a shape, the NewWeaponTemplate is used.
+//-----------------------------------------------------------------------------
+datablock ItemData(WeaponTemplateItem)
+{
+   // Mission editor category
+   category                         = "Weapon";
+
+   // Hook into Item Weapon class hierarchy. The weapon namespace
+   // provides common weapon handling functions in addition to hooks
+   // into the inventory system.
+   className                        = "Weapon";
+
+   // Basic Item properties
+   shapeFile                        = "";
+   mass                             = 1;
+   elasticity                       = 0.2;
+   friction                         = 0.6;
+   emap                             = true;
+
+   // Dynamic properties defined by the scripts
+   pickUpName                       = "A basic weapon";
+   description                      = "Weapon";
+   image                            = WeaponTemplateImage;
+   reticle                          = "crossHair";
+};
+
+datablock ShapeBaseImageData(WeaponTemplateImage)
+{
+   // FP refers to first person specific features
+   
+   // Defines what art file to use.
+   shapeFile = "art/shapes/weapons/Lurker/TP_Lurker.DAE";
+   shapeFileFP = "art/shapes/weapons/Lurker/FP_Lurker.DAE";
+   
+   // Whether or not to enable environment mapping
+   //emap                           = true;
+
+   //imageAnimPrefixFP              = "";
+
+   // Specify mount point & offset for 3rd person, and eye offset
+   // for first person rendering.
+   mountPoint                       = 0;
+   //firstPerson                    = true;
+   //eyeOffset                      = "0.001 -0.05 -0.065";
+   
+   // When firing from a point offset from the eye, muzzle correction
+   // will adjust the muzzle vector to point to the eye LOS point.
+   // Since this weapon doesn't actually fire from the muzzle point,
+   // we need to turn this off.
+   //correctMuzzleVector            = true;
+
+   // Add the WeaponImage namespace as a parent, WeaponImage namespace
+   // provides some hooks into the inventory system.
+   class                            = "WeaponImage";
+   className                        = "WeaponImage";
+
+   // Projectiles and Ammo.
+   item                             = WeaponTemplateItem;
+   ammo                             = WeaponTemplateAmmo;
+
+   //projectile                     = BulletProjectile;
+   //projectileType                 = Projectile;
+   //projectileSpread               = "0.005";
+   
+   // Properties associated with the shell casing that gets ejected during firing
+   //casing = BulletShell;
+   //shellExitDir                   = "1.0 0.3 1.0";
+   //shellExitOffset                = "0.15 -0.56 -0.1";
+   //shellExitVariance              = 15.0;
+   //shellVelocity                  = 3.0;
+
+   // Properties associated with a light that occurs when the weapon fires
+   //lightType                      = "";
+   //lightColor                     = "0.992126 0.968504 0.708661 1";
+   //lightRadius                    = "4";
+   //lightDuration                  = "100";
+   //lightBrightness                = 2;
+
+   // Properties associated with shaking the camera during firing
+   //shakeCamera                    = false;
+   //camShakeFreq                   = "0 0 0";
+   //camShakeAmp                    = "0 0 0";
+
+   // Images have a state system which controls how the animations
+   // are run, which sounds are played, script callbacks, etc. This
+   // state system is downloaded to the client so that clients can
+   // predict state changes and animate accordingly.  The following
+   // system supports basic ready->fire->reload transitions as
+   // well as a no-ammo->dryfire idle state.
+
+   // If true, allow multiple timeout transitions to occur within a single tick
+   // useful if states have a very small timeout
+   //useRemainderDT = true;
+
+   // Initial start up state
+   stateName[0]                     = "Preactivate";
+   stateTransitionOnLoaded[0]       = "Activate";
+   stateTransitionOnNoAmmo[0]       = "NoAmmo";
+
+   // Activating the gun.  Called when the weapon is first
+   // mounted and there is ammo.
+   stateName[1]                     = "Activate";
+   stateTransitionGeneric0In[1]     = "SprintEnter";
+   stateTransitionOnTimeout[1]      = "Ready";
+   stateTimeoutValue[1]             = 0.5;
+   stateSequence[1]                 = "switch_in";
+
+   // Ready to fire, just waiting for the trigger
+   stateName[2]                     = "Ready";
+   stateTransitionGeneric0In[2]     = "SprintEnter";
+   stateTransitionOnMotion[2]       = "ReadyMotion";
+   stateTransitionOnTimeout[2]      = "ReadyFidget";
+   stateTimeoutValue[2]             = 10;
+   stateWaitForTimeout[2]           = false;
+   stateScaleAnimation[2]           = false;
+   stateScaleAnimationFP[2]         = false;
+   stateTransitionOnNoAmmo[2]       = "NoAmmo";
+   stateTransitionOnTriggerDown[2]  = "Fire";
+   stateSequence[2]                 = "idle";
+
+   // Same as Ready state but plays a fidget sequence
+   stateName[3]                     = "ReadyFidget";
+   stateTransitionGeneric0In[3]     = "SprintEnter";
+   stateTransitionOnMotion[3]       = "ReadyMotion";
+   stateTransitionOnTimeout[3]      = "Ready";
+   stateTimeoutValue[3]             = 6;
+   stateWaitForTimeout[3]           = false;
+   stateTransitionOnNoAmmo[3]       = "NoAmmo";
+   stateTransitionOnTriggerDown[3]  = "Fire";
+   stateSequence[3]                 = "idle_fidget1";
+
+   // Ready to fire with player moving
+   stateName[4]                     = "ReadyMotion";
+   stateTransitionGeneric0In[4]     = "SprintEnter";
+   stateTransitionOnNoMotion[4]     = "Ready";
+   stateWaitForTimeout[4]           = false;
+   stateScaleAnimation[4]           = false;
+   stateScaleAnimationFP[4]         = false;
+   stateSequenceTransitionIn[4]     = true;
+   stateSequenceTransitionOut[4]    = true;
+   stateTransitionOnNoAmmo[4]       = "NoAmmo";
+   stateTransitionOnTriggerDown[4]  = "Fire";
+   stateSequence[4]                 = "run";
+
+   // Fire the weapon. Calls the fire script which does
+   // the actual work.
+   stateName[5]                     = "Fire";
+   stateTransitionGeneric0In[5]     = "SprintEnter";
+   stateTransitionOnTimeout[5]      = "Reload";
+   stateTimeoutValue[5]             = 0.15;
+   stateFire[5]                     = true;
+   stateRecoil[5]                   = "";
+   stateAllowImageChange[5]         = false;
+   stateSequence[5]                 = "fire";
+   stateScaleAnimation[5]           = false;
+   stateSequenceNeverTransition[5]  = true;
+   stateSequenceRandomFlash[5]      = true;        // use muzzle flash sequence
+   stateScript[5]                   = "onFire";
+   stateSound[5]                    = WeaponTemplateFireSound;
+   stateEmitter[5]                  = GunFireSmokeEmitter;
+   stateEmitterTime[5]              = 0.025;
+
+   // Play the reload animation, and transition into
+   stateName[6]                     = "Reload";
+   stateTransitionGeneric0In[6]     = "SprintEnter";
+   stateTransitionOnNoAmmo[6]       = "NoAmmo";
+   stateTransitionOnTimeout[6]      = "Ready";
+   stateWaitForTimeout[6]           = "0";
+   stateTimeoutValue[6]             = 0.05;
+   stateAllowImageChange[6]         = false;
+   //stateSequence[6]                 = "reload";
+   stateEjectShell[6]               = true;
+
+   // No ammo in the weapon, just idle until something
+   // shows up. Play the dry fire sound if the trigger is
+   // pulled.
+   stateName[7]                     = "NoAmmo";
+   stateTransitionGeneric0In[7]     = "SprintEnter";
+   stateTransitionOnAmmo[7]         = "ReloadClip";
+   stateScript[7]                   = "onClipEmpty";
+
+   // No ammo dry fire
+   stateName[8]                     = "DryFire";
+   stateTransitionGeneric0In[8]     = "SprintEnter";
+   stateTimeoutValue[8]             = 1.0;
+   stateTransitionOnTimeout[8]      = "NoAmmo";
+   stateScript[8]                   = "onDryFire";
+
+   // Play the reload clip animation
+   stateName[9]                     = "ReloadClip";
+   stateTransitionGeneric0In[9]     = "SprintEnter";
+   stateTransitionOnTimeout[9]      = "Ready";
+   stateWaitForTimeout[9]           = true;
+   stateTimeoutValue[9]             = 3.0;
+   stateReload[9]                   = true;
+   stateSequence[9]                 = "reload";
+   stateShapeSequence[9]            = "Reload";
+   stateScaleShapeSequence[9]       = true;
+
+   // Start Sprinting
+   stateName[10]                    = "SprintEnter";
+   stateTransitionGeneric0Out[10]   = "SprintExit";
+   stateTransitionOnTimeout[10]     = "Sprinting";
+   stateWaitForTimeout[10]          = false;
+   stateTimeoutValue[10]            = 0.5;
+   stateWaitForTimeout[10]          = false;
+   stateScaleAnimation[10]          = false;
+   stateScaleAnimationFP[10]        = false;
+   stateSequenceTransitionIn[10]    = true;
+   stateSequenceTransitionOut[10]   = true;
+   stateAllowImageChange[10]        = false;
+   stateSequence[10]                = "sprint";
+
+   // Sprinting
+   stateName[11]                    = "Sprinting";
+   stateTransitionGeneric0Out[11]   = "SprintExit";
+   stateWaitForTimeout[11]          = false;
+   stateScaleAnimation[11]          = false;
+   stateScaleAnimationFP[11]        = false;
+   stateSequenceTransitionIn[11]    = true;
+   stateSequenceTransitionOut[11]   = true;
+   stateAllowImageChange[11]        = false;
+   stateSequence[11]                = "sprint";
+   
+   // Stop Sprinting
+   stateName[12]                    = "SprintExit";
+   stateTransitionGeneric0In[12]    = "SprintEnter";
+   stateTransitionOnTimeout[12]     = "Ready";
+   stateWaitForTimeout[12]          = false;
+   stateTimeoutValue[12]            = 0.5;
+   stateSequenceTransitionIn[12]    = true;
+   stateSequenceTransitionOut[12]   = true;
+   stateAllowImageChange[12]        = false;
+   stateSequence[12]                = "sprint";
+};

+ 230 - 0
Templates/Full PhysX/game/art/datablocks/weapons/ProxMine.cs

@@ -0,0 +1,230 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+datablock SFXProfile( MineArmedSound )
+{
+   filename = "art/sound/weapons/mine_armed";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock SFXProfile( MineSwitchinSound )
+{
+   filename = "art/sound/weapons/wpn_proximitymine_switchin";
+   description = AudioClose3D;
+   preload = true;
+};
+
+datablock SFXProfile( MineTriggeredSound )
+{
+   filename = "art/sound/weapons/mine_trigger";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock ProximityMineData( ProxMine )
+{
+   // ShapeBaseData fields
+   category = "Weapon";
+   shapeFile = "art/shapes/weapons/ProxMine/TP_ProxMine.DAE";
+   explosion = GrenadeLauncherExplosion;
+
+   // ItemData fields
+   sticky = true;
+   mass = 2;
+   elasticity = 0.2;
+   friction = 0.6;
+   simpleServerCollision = false;
+
+   // ProximityMineData fields
+   armingDelay = 3.5;
+   armingSound = MineArmedSound;
+
+   autoTriggerDelay = 0;
+   triggerOnOwner = true;
+   triggerRadius = 3.0;
+   triggerDelay = 0.45;
+   triggerSound = MineTriggeredSound;
+
+   explosionOffset = 0.1;
+   
+   // dynamic fields
+   pickUpName = "a proximity mine";
+   description = "Proximity Mine";
+   maxInventory = 20;
+   image = ProxMineImage;
+
+   previewImage = 'mine.png';
+   reticle = 'blank';
+   zoomReticle = 'blank';
+
+   damageType = "MineDamage";   // type of damage applied to objects in radius
+   radiusDamage = 300;           // amount of damage to apply to objects in radius
+   damageRadius = 8;            // search radius to damage objects when exploding
+   areaImpulse = 2000;          // magnitude of impulse to apply to objects in radius
+};
+
+datablock ShapeBaseImageData( ProxMineImage )
+{
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/ProxMine/TP_ProxMine.DAE";
+   shapeFileFP = "art/shapes/weapons/ProxMine/FP_ProxMine.DAE";
+
+   imageAnimPrefix = "ProxMine";
+   imageAnimPrefixFP = "ProxMine";
+
+   // Specify mount point & offset for 3rd person, and eye offset
+   // for first person rendering.
+   mountPoint = 0;
+   firstPerson = true;
+   useEyeNode = true;
+
+   // When firing from a point offset from the eye, muzzle correction
+   // will adjust the muzzle vector to point to the eye LOS point.
+   // Since this weapon doesn't actually fire from the muzzle point,
+   // we need to turn this off.
+   correctMuzzleVector = false;
+
+   // Add the WeaponImage namespace as a parent, WeaponImage namespace
+   // provides some hooks into the inventory system.
+   class = "WeaponImage";
+   className = "WeaponImage";
+
+   // Projectiles and Ammo.
+   item = ProxMine;
+
+   // Shake camera while firing.
+   shakeCamera = false;
+   camShakeFreq = "0 0 0";
+   camShakeAmp = "0 0 0";
+
+   // Images have a state system which controls how the animations
+   // are run, which sounds are played, script callbacks, etc. This
+   // state system is downloaded to the client so that clients can
+   // predict state changes and animate accordingly.  The following
+   // system supports basic ready->fire->reload transitions as
+   // well as a no-ammo->dryfire idle state.
+
+   // Initial start up state
+   stateName[0]                     = "Preactivate";
+   stateTransitionOnLoaded[0]       = "Activate";
+   stateTransitionOnNoAmmo[0]       = "Activate";
+
+   // Activating the gun.  Called when the weapon is first
+   // mounted and there is ammo.
+   stateName[1]                     = "Activate";
+   stateTransitionGeneric0In[1]     = "SprintEnter";
+   stateTransitionOnTimeout[1]      = "Ready";
+   stateTimeoutValue[1]             = 3.0;
+   stateSequence[1]                 = "switch_in";
+   stateShapeSequence[1]            = "Reload";
+   stateSound[1]                    = MineSwitchinSound;
+
+   // Ready to fire, just waiting for the trigger
+   stateName[2]                     = "Ready";
+   stateTransitionGeneric0In[2]     = "SprintEnter";
+   stateTransitionOnMotion[2]       = "ReadyMotion";
+   stateTransitionOnTriggerDown[2]  = "Fire";
+   stateScaleAnimation[2]           = false;
+   stateScaleAnimationFP[2]         = false;
+   stateSequence[2]                 = "idle";
+
+   // Ready to fire with player moving
+   stateName[3]                     = "ReadyMotion";
+   stateTransitionGeneric0In[3]     = "SprintEnter";
+   stateTransitionOnNoMotion[3]     = "Ready";
+   stateScaleAnimation[3]           = false;
+   stateScaleAnimationFP[3]         = false;
+   stateSequenceTransitionIn[3]     = true;
+   stateSequenceTransitionOut[3]    = true;
+   stateTransitionOnTriggerDown[3]  = "Fire";
+   stateSequence[3]                 = "run";
+
+   // Wind up to throw the ProxMine
+   stateName[4]                     = "Fire";
+   stateTransitionGeneric0In[4]     = "SprintEnter";
+   stateTransitionOnTimeout[4]      = "Fire2";
+   stateTimeoutValue[4]             = 0.8;
+   stateFire[4]                     = true;
+   stateRecoil[4]                   = "";
+   stateAllowImageChange[4]         = false;
+   stateSequence[4]                 = "Fire";
+   stateSequenceNeverTransition[4]  = true;
+   stateShapeSequence[4]            = "Fire";
+
+   // Throw the actual mine
+   stateName[5]                     = "Fire2";
+   stateTransitionGeneric0In[5]     = "SprintEnter";
+   stateTransitionOnTriggerUp[5]    = "Reload";
+   stateTimeoutValue[5]             = 0.7;
+   stateAllowImageChange[5]         = false;
+   stateSequenceNeverTransition[5]  = true;
+   stateSequence[5]                 = "fire_release";
+   stateShapeSequence[5]            = "Fire_Release";
+   stateScript[5]                   = "onFire";
+
+   // Play the reload animation, and transition into
+   stateName[6]                     = "Reload";
+   stateTransitionGeneric0In[6]     = "SprintEnter";
+   stateTransitionOnTimeout[6]      = "Ready";
+   stateWaitForTimeout[6]           = true;
+   stateTimeoutValue[6]             = 3.0;
+   stateSequence[6]                 = "switch_in";
+   stateShapeSequence[6]            = "Reload";
+   stateSound[6]                    = MineSwitchinSound;
+
+   // Start Sprinting
+   stateName[7]                     = "SprintEnter";
+   stateTransitionGeneric0Out[7]    = "SprintExit";
+   stateTransitionOnTimeout[7]      = "Sprinting";
+   stateWaitForTimeout[7]           = false;
+   stateTimeoutValue[7]             = 0.25;
+   stateWaitForTimeout[7]           = false;
+   stateScaleAnimation[7]           = true;
+   stateScaleAnimationFP[7]         = true;
+   stateSequenceTransitionIn[7]     = true;
+   stateSequenceTransitionOut[7]    = true;
+   stateAllowImageChange[7]         = false;
+   stateSequence[7]                 = "run2sprint";
+
+   // Sprinting
+   stateName[8]                     = "Sprinting";
+   stateTransitionGeneric0Out[8]    = "SprintExit";
+   stateWaitForTimeout[8]           = false;
+   stateScaleAnimation[8]           = false;
+   stateScaleAnimationFP[8]         = false;
+   stateSequenceTransitionIn[8]     = true;
+   stateSequenceTransitionOut[8]    = true;
+   stateAllowImageChange[8]         = false;
+   stateSequence[8]                 = "sprint";
+   
+   // Stop Sprinting
+   stateName[9]                     = "SprintExit";
+   stateTransitionGeneric0In[9]     = "SprintEnter";
+   stateTransitionOnTimeout[9]      = "Ready";
+   stateWaitForTimeout[9]           = false;
+   stateTimeoutValue[9]             = 0.5;
+   stateSequenceTransitionIn[9]     = true;
+   stateSequenceTransitionOut[9]    = true;
+   stateAllowImageChange[9]         = false;
+   stateSequence[9]                 = "sprint2run";
+};

+ 364 - 0
Templates/Full PhysX/game/art/datablocks/weapons/Ryder.cs

@@ -0,0 +1,364 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------
+// Sounds
+//--------------------------------------------------------------------------
+
+datablock SFXProfile(RyderFireSound)
+{
+   filename = "art/sound/weapons/wpn_Ryder_fire";
+   description = AudioClose3D;
+   preload = true;
+};
+
+datablock SFXProfile(RyderReloadSound)
+{
+   filename = "art/sound/weapons/wpn_Ryder_reload";
+   description = AudioClose3D;
+   preload = true;
+};
+
+datablock SFXProfile(RyderSwitchinSound)
+{
+   filename = "art/sound/weapons/wpn_Ryder_switchin";
+   description = AudioClose3D;
+   preload = true;
+};
+
+// ----------------------------------------------------------------------------
+// Particles
+// ----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// Explosion
+//-----------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------
+// Shell ejected during reload.
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// Projectile Object
+//-----------------------------------------------------------------------------
+
+
+//-----------------------------------------------------------------------------
+// Ammo Item
+//-----------------------------------------------------------------------------
+datablock ItemData(RyderClip)
+{
+   // Mission editor category
+   category = "AmmoClip";
+
+   // Add the Ammo namespace as a parent.  The ammo namespace provides
+   // common ammo related functions and hooks into the inventory system.
+   className = "AmmoClip";
+
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/Ryder/TP_Ryder.DAE";
+   mass = 1;
+   elasticity = 0.2;
+   friction = 0.6;
+
+   // Dynamic properties defined by the scripts
+   pickUpName = "Ryder clip";
+   count = 1;
+   maxInventory = 10;
+};
+
+datablock ItemData(RyderAmmo)
+{
+   // Mission editor category
+   category = "Ammo";
+
+   // Add the Ammo namespace as a parent.  The ammo namespace provides
+   // common ammo related functions and hooks into the inventory system.
+   className = "Ammo";
+
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/Ryder/TP_Ryder.DAE";
+   mass = 1;
+   elasticity = 0.2;
+   friction = 0.6;
+
+   // Dynamic properties defined by the scripts
+   pickUpName = "Ryder bullet";
+   maxInventory = 8;
+   clip = RyderClip;
+};
+
+//--------------------------------------------------------------------------
+// Weapon Item.  This is the item that exists in the world, i.e. when it's
+// been dropped, thrown or is acting as re-spawnable item.  When the weapon
+// is mounted onto a shape, the SoldierWeaponImage is used.
+//-----------------------------------------------------------------------------
+datablock ItemData(Ryder)
+{
+   // Mission editor category
+   category = "Weapon";
+
+   // Hook into Item Weapon class hierarchy. The weapon namespace
+   // provides common weapon handling functions in addition to hooks
+   // into the inventory system.
+   className = "Weapon";
+
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/Ryder/TP_Ryder.DAE";
+   mass = 1;
+   elasticity = 0.2;
+   friction = 0.6;
+   emap = true;
+   PreviewImage = 'ryder.png';
+
+   // Dynamic properties defined by the scripts
+   pickUpName = "Ryder pistol";
+   description = "Ryder";
+   image = RyderWeaponImage;
+   reticle = "crossHair";
+};
+
+
+datablock ShapeBaseImageData(RyderWeaponImage)
+{
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/Ryder/TP_Ryder.DAE";
+   shapeFileFP = "art/shapes/weapons/Ryder/FP_Ryder.DAE";
+   emap = true;
+
+   imageAnimPrefix = "Pistol";
+   imageAnimPrefixFP = "Pistol";
+
+   // Specify mount point & offset for 3rd person, and eye offset
+   // for first person rendering.
+   mountPoint = 0;
+   firstPerson = true;
+   useEyeNode = true;
+   animateOnServer = true;
+
+   // When firing from a point offset from the eye, muzzle correction
+   // will adjust the muzzle vector to point to the eye LOS point.
+   // Since this weapon doesn't actually fire from the muzzle point,
+   // we need to turn this off.
+   correctMuzzleVector = true;
+
+   // Add the WeaponImage namespace as a parent, WeaponImage namespace
+   // provides some hooks into the inventory system.
+   class = "WeaponImage";
+   className = "WeaponImage";
+
+   // Projectiles and Ammo.
+   item = Ryder;
+   ammo = RyderAmmo;
+   clip = RyderClip;
+
+   projectile = BulletProjectile;
+   projectileType = Projectile;
+   projectileSpread = "0.0";
+
+   altProjectile = GrenadeLauncherProjectile;
+   altProjectileSpread = "0.02";
+
+   casing = BulletShell;
+   shellExitDir        = "1.0 0.3 1.0";
+   shellExitOffset     = "0.15 -0.56 -0.1";
+   shellExitVariance   = 15.0;
+   shellVelocity       = 3.0;
+
+   // Weapon lights up while firing
+   lightType = "WeaponFireLight";
+   lightColor = "0.992126 0.968504 0.700787 1";
+   lightRadius = "4";
+   lightDuration = "100";
+   lightBrightness = 2;
+
+   // Shake camera while firing.
+   shakeCamera = false;
+   camShakeFreq = "0 0 0";
+   camShakeAmp = "0 0 0";
+
+   // Images have a state system which controls how the animations
+   // are run, which sounds are played, script callbacks, etc. This
+   // state system is downloaded to the client so that clients can
+   // predict state changes and animate accordingly.  The following
+   // system supports basic ready->fire->reload transitions as
+   // well as a no-ammo->dryfire idle state.
+
+   useRemainderDT = true;
+
+   // Initial start up state
+   stateName[0]                     = "Preactivate";
+   stateTransitionOnLoaded[0]       = "Activate";
+   stateTransitionOnNoAmmo[0]       = "NoAmmo";
+
+   // Activating the gun.  Called when the weapon is first
+   // mounted and there is ammo.
+   stateName[1]                     = "Activate";
+   stateTransitionGeneric0In[1]     = "SprintEnter";
+   stateTransitionOnTimeout[1]      = "Ready";
+   stateTimeoutValue[1]             = 1.5;
+   stateSequence[1]                 = "switch_in";
+   stateSound[1]                    = RyderSwitchinSound;
+
+   // Ready to fire, just waiting for the trigger
+   stateName[2]                     = "Ready";
+   stateTransitionGeneric0In[2]     = "SprintEnter";
+   stateTransitionOnMotion[2]       = "ReadyMotion";
+   stateScaleAnimation[2]           = false;
+   stateScaleAnimationFP[2]         = false;
+   stateTransitionOnNoAmmo[2]       = "NoAmmo";
+   stateTransitionOnTriggerDown[2]  = "Fire";
+   stateSequence[2]                 = "idle";
+
+   // Ready to fire with player moving
+   stateName[3]                     = "ReadyMotion";
+   stateTransitionGeneric0In[3]     = "SprintEnter";
+   stateTransitionOnNoMotion[3]     = "Ready";
+   stateWaitForTimeout[3]           = false;
+   stateScaleAnimation[3]           = false;
+   stateScaleAnimationFP[3]         = false;
+   stateSequenceTransitionIn[3]     = true;
+   stateSequenceTransitionOut[3]    = true;
+   stateTransitionOnNoAmmo[3]       = "NoAmmo";
+   stateTransitionOnTriggerDown[3]  = "Fire";
+   stateSequence[3]                 = "run";
+
+   // Fire the weapon. Calls the fire script which does
+   // the actual work.
+   stateName[4]                     = "Fire";
+   stateTransitionGeneric0In[4]     = "SprintEnter";
+   stateTransitionOnTimeout[4]      = "WaitForRelease";
+   stateTimeoutValue[4]             = 0.23;
+   stateWaitForTimeout[4]           = true;
+   stateFire[4]                     = true;
+   stateRecoil[4]                   = "";
+   stateAllowImageChange[4]         = false;
+   stateSequence[4]                 = "fire";
+   stateScaleAnimation[4]           = true;
+   stateSequenceNeverTransition[4]  = true;
+   stateSequenceRandomFlash[4]      = true;        // use muzzle flash sequence
+   stateScript[4]                   = "onFire";
+   stateEmitter[4]                  = GunFireSmokeEmitter;
+   stateEmitterTime[4]              = 0.025;
+   stateEjectShell[4]               = true;
+   stateSound[4]                    = RyderFireSound;
+
+   // Wait for the player to release the trigger
+   stateName[5]                     = "WaitForRelease";
+   stateTransitionGeneric0In[5]     = "SprintEnter";
+   stateTransitionOnTriggerUp[5]    = "NewRound";
+   stateTimeoutValue[5]             = 0.05;
+   stateWaitForTimeout[5]           = true;
+   stateAllowImageChange[5]         = false;
+
+   // Put another round in the chamber
+   stateName[6]                     = "NewRound";
+   stateTransitionGeneric0In[6]     = "SprintEnter";
+   stateTransitionOnNoAmmo[6]       = "NoAmmo";
+   stateTransitionOnTimeout[6]      = "Ready";
+   stateWaitForTimeout[6]           = "0";
+   stateTimeoutValue[6]             = 0.05;
+   stateAllowImageChange[6]         = false;
+
+   // No ammo in the weapon, just idle until something
+   // shows up. Play the dry fire sound if the trigger is
+   // pulled.
+   stateName[7]                     = "NoAmmo";
+   stateTransitionGeneric0In[7]     = "SprintEnter";
+   stateTransitionOnMotion[7]       = "NoAmmoMotion";
+   stateTransitionOnAmmo[7]         = "ReloadClip";
+   stateTimeoutValue[7]             = 0.1;   // Slight pause to allow script to run when trigger is still held down from Fire state
+   stateScript[7]                   = "onClipEmpty";
+   stateTransitionOnTriggerDown[7]  = "DryFire";
+   stateSequence[7]                 = "idle";
+   stateScaleAnimation[7]           = false;
+   stateScaleAnimationFP[7]         = false;
+   
+   stateName[8]                     = "NoAmmoMotion";
+   stateTransitionGeneric0In[8]     = "SprintEnter";
+   stateTransitionOnNoMotion[8]     = "NoAmmo";
+   stateWaitForTimeout[8]           = false;
+   stateScaleAnimation[8]           = false;
+   stateScaleAnimationFP[8]         = false;
+   stateSequenceTransitionIn[8]     = true;
+   stateSequenceTransitionOut[8]    = true;
+   stateTransitionOnAmmo[8]         = "ReloadClip";
+   stateTransitionOnTriggerDown[8]  = "DryFire";
+   stateSequence[8]                 = "run";
+
+   // No ammo dry fire
+   stateName[9]                     = "DryFire";
+   stateTransitionGeneric0In[9]     = "SprintEnter";
+   stateTransitionOnAmmo[9]         = "ReloadClip";
+   stateWaitForTimeout[9]           = "0";
+   stateTimeoutValue[9]             = 0.7;
+   stateTransitionOnTimeout[9]      = "NoAmmo";
+   stateScript[9]                   = "onDryFire";
+
+   // Play the reload clip animation
+   stateName[10]                     = "ReloadClip";
+   stateTransitionGeneric0In[10]     = "SprintEnter";
+   stateTransitionOnTimeout[10]      = "Ready";
+   stateWaitForTimeout[10]           = true;
+   stateTimeoutValue[10]             = 2.0;
+   stateReload[10]                   = true;
+   stateSequence[10]                 = "reload";
+   stateShapeSequence[10]            = "Reload";
+   stateScaleShapeSequence[10]       = true;
+   stateSound[10]                    = RyderReloadSound;
+
+   // Start Sprinting
+   stateName[11]                    = "SprintEnter";
+   stateTransitionGeneric0Out[11]   = "SprintExit";
+   stateTransitionOnTimeout[11]     = "Sprinting";
+   stateWaitForTimeout[11]          = false;
+   stateTimeoutValue[11]            = 0.5;
+   stateWaitForTimeout[11]          = false;
+   stateScaleAnimation[11]          = false;
+   stateScaleAnimationFP[11]        = false;
+   stateSequenceTransitionIn[11]    = true;
+   stateSequenceTransitionOut[11]   = true;
+   stateAllowImageChange[11]        = false;
+   stateSequence[11]                = "sprint";
+
+   // Sprinting
+   stateName[12]                    = "Sprinting";
+   stateTransitionGeneric0Out[12]   = "SprintExit";
+   stateWaitForTimeout[12]          = false;
+   stateScaleAnimation[12]          = false;
+   stateScaleAnimationFP[12]        = false;
+   stateSequenceTransitionIn[12]    = true;
+   stateSequenceTransitionOut[12]   = true;
+   stateAllowImageChange[12]        = false;
+   stateSequence[12]                = "sprint";
+   
+   // Stop Sprinting
+   stateName[13]                    = "SprintExit";
+   stateTransitionGeneric0In[13]    = "SprintEnter";
+   stateTransitionOnTimeout[13]     = "Ready";
+   stateWaitForTimeout[13]          = false;
+   stateTimeoutValue[13]            = 0.5;
+   stateSequenceTransitionIn[13]    = true;
+   stateSequenceTransitionOut[13]   = true;
+   stateAllowImageChange[13]        = false;
+   stateSequence[13]                = "sprint";
+};

+ 559 - 0
Templates/Full PhysX/game/art/datablocks/weapons/Turret.cs

@@ -0,0 +1,559 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+datablock SFXProfile(TargetAquiredSound)
+{
+   filename = "";
+   description = AudioClose3D;
+   preload = false;
+};
+
+datablock SFXProfile(TargetLostSound)
+{
+   filename = "";
+   description = AudioClose3D;
+   preload = false;
+};
+
+datablock SFXProfile(TurretDestroyed)
+{
+   filename = "";
+   description = AudioClose3D;
+   preload = false;
+};
+
+datablock SFXProfile(TurretThrown)
+{
+   filename = "";
+   description = AudioClose3D;
+   preload = false;
+};
+
+datablock SFXProfile(TurretFireSound)
+{
+   filename = "art/sound/turret/wpn_turret_fire";
+   description = AudioClose3D;
+   preload = true;
+};
+
+datablock SFXProfile(TurretActivatedSound)
+{
+   filename = "art/sound/turret/wpn_turret_deploy";
+   description = AudioClose3D;
+   preload = true;
+};
+
+datablock SFXProfile(TurretScanningSound)
+{
+   filename = "art/sound/turret/wpn_turret_scan";
+   description = AudioCloseLoop3D;
+   preload = true;
+};
+
+datablock SFXProfile(TurretSwitchinSound)
+{
+   filename = "art/sound/turret/wpn_turret_switchin";
+   description = AudioClose3D;
+   preload = true;
+};
+
+//-----------------------------------------------------------------------------
+// Turret Bullet Projectile
+//-----------------------------------------------------------------------------
+
+datablock ProjectileData( TurretBulletProjectile )
+{
+   projectileShapeName = "";
+
+   directDamage        = 5;
+   radiusDamage        = 0;
+   damageRadius        = 0.5;
+   areaImpulse         = 0.5;
+   impactForce         = 1;
+   
+   damageType          = "TurretDamage";  // Type of damage applied by this weapon
+
+   explosion           = BulletDirtExplosion;
+   decal               = BulletHoleDecal;
+
+   muzzleVelocity      = 120;
+   velInheritFactor    = 1;
+
+   armingDelay         = 0;
+   lifetime            = 992;
+   fadeDelay           = 1472;
+   bounceElasticity    = 0;
+   bounceFriction      = 0;
+   isBallistic         = false;
+   gravityMod          = 1;
+};
+
+function TurretBulletProjectile::onCollision(%this,%obj,%col,%fade,%pos,%normal)
+{
+   // Apply impact force from the projectile.
+   
+   // Apply damage to the object all shape base objects
+   if ( %col.getType() & $TypeMasks::GameBaseObjectType )
+      %col.damage(%obj,%pos,%this.directDamage,%this.damageType);
+}
+
+//-----------------------------------------------------------------------------
+// Turret Bullet Ammo
+//-----------------------------------------------------------------------------
+
+datablock ItemData(AITurretAmmo)
+{
+   // Mission editor category
+   category = "Ammo";
+
+   // Add the Ammo namespace as a parent.  The ammo namespace provides
+   // common ammo related functions and hooks into the inventory system.
+   className = "Ammo";
+
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/Turret/Turret_Legs.DAE";
+   mass = 1;
+   elasticity = 0.2;
+   friction = 0.6;
+
+   // Dynamic properties defined by the scripts
+   pickUpName = "turret ammo";
+};
+
+//-----------------------------------------------------------------------------
+// AI Turret Weapon
+//-----------------------------------------------------------------------------
+
+datablock ItemData(AITurretHead)
+{
+   // Mission editor category
+   category = "Weapon";
+
+   // Hook into Item Weapon class hierarchy. The weapon namespace
+   // provides common weapon handling functions in addition to hooks
+   // into the inventory system.
+   className = "Weapon";
+
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/Turret/Turret_Head.DAE";
+   mass = 1;
+   elasticity = 0.2;
+   friction = 0.6;
+   emap = true;
+
+   // Dynamic properties defined by the scripts
+   pickUpName = "an AI turret head";
+   description = "AI Turret Head";
+   image = AITurretHeadImage;
+   reticle = "crossHair";
+};
+datablock ShapeBaseImageData(AITurretHeadImage)
+{
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/Turret/Turret_Head.DAE";
+   emap = true;
+
+   // Specify mount point
+   mountPoint = 0;
+
+   // Add the WeaponImage namespace as a parent, WeaponImage namespace
+   // provides some hooks into the inventory system.
+   class = "WeaponImage";
+   className = "WeaponImage";
+
+   // Projectiles and Ammo.
+   item = AITurretHead;
+   ammo = AITurretAmmo;
+
+   projectile = TurretBulletProjectile;
+   projectileType = Projectile;
+   projectileSpread = "0.02";
+
+   casing = BulletShell;
+   shellExitDir        = "1.0 0.3 1.0";
+   shellExitOffset     = "0.15 -0.56 -0.1";
+   shellExitVariance   = 15.0;
+   shellVelocity       = 3.0;
+
+   // Weapon lights up while firing
+   lightType = "WeaponFireLight";
+   lightColor = "0.992126 0.968504 0.708661 1";
+   lightRadius = "4";
+   lightDuration = "100";
+   lightBrightness = 2;
+
+   // Shake camera while firing.
+   shakeCamera = false;
+   camShakeFreq = "0 0 0";
+   camShakeAmp = "0 0 0";
+
+   // Images have a state system which controls how the animations
+   // are run, which sounds are played, script callbacks, etc. This
+   // state system is downloaded to the client so that clients can
+   // predict state changes and animate accordingly.  The following
+   // system supports basic ready->fire->reload transitions as
+   // well as a no-ammo->dryfire idle state.
+
+   useRemainderDT = true;
+
+   // Initial start up state
+   stateName[0]                     = "Preactivate";
+   stateIgnoreLoadedForReady[0]     = false;
+   stateTransitionOnLoaded[0]       = "Activate";
+   stateTransitionOnNotLoaded[0]    = "WaitingDeployment";  // If the turret weapon is not loaded then it has not yet been deployed
+   stateTransitionOnNoAmmo[0]       = "NoAmmo";
+
+   // Activating the gun.  Called when the weapon is first
+   // mounted and there is ammo.
+   stateName[1]                     = "Activate";
+   stateTransitionGeneric0In[1]     = "Destroyed";
+   stateTransitionOnTimeout[1]      = "Ready";
+   stateTimeoutValue[1]             = 0.5;
+   stateSequence[1]                 = "Activate";
+
+   // Ready to fire, just waiting for the trigger
+   stateName[2]                     = "Ready";
+   stateTransitionGeneric0In[2]     = "Destroyed";
+   stateTransitionOnNoAmmo[2]       = "NoAmmo";
+   stateTransitionOnTriggerDown[2]  = "Fire";
+   stateSequence[2]                 = "scan";
+
+   // Fire the weapon. Calls the fire script which does
+   // the actual work.
+   stateName[3]                     = "Fire";
+   stateTransitionGeneric0In[3]     = "Destroyed";
+   stateTransitionOnTimeout[3]      = "Reload";
+   stateTimeoutValue[3]             = 0.2;
+   stateFire[3]                     = true;
+   stateRecoil[3]                   = "LightRecoil";
+   stateAllowImageChange[3]         = false;
+   stateSequence[3]                 = "fire";
+   stateSequenceRandomFlash[3]      = true;        // use muzzle flash sequence
+   stateScript[3]                   = "onFire";
+   stateSound[3]                    = TurretFireSound;
+   stateEmitter[3]                  = GunFireSmokeEmitter;
+   stateEmitterTime[3]              = 0.025;
+   stateEjectShell[3]               = true;
+
+   // Play the reload animation, and transition into
+   stateName[4]                     = "Reload";
+   stateTransitionGeneric0In[4]     = "Destroyed";
+   stateTransitionOnNoAmmo[4]       = "NoAmmo";
+   stateTransitionOnTimeout[4]      = "Ready";
+   stateWaitForTimeout[4]           = "0";
+   stateTimeoutValue[4]             = 0.0;
+   stateAllowImageChange[4]         = false;
+   stateSequence[4]                 = "Reload";
+
+   // No ammo in the weapon, just idle until something
+   // shows up. Play the dry fire sound if the trigger is
+   // pulled.
+   stateName[5]                     = "NoAmmo";
+   stateTransitionGeneric0In[5]     = "Destroyed";
+   stateTransitionOnAmmo[5]         = "Reload";
+   stateSequence[5]                 = "NoAmmo";
+   stateTransitionOnTriggerDown[5]  = "DryFire";
+
+   // No ammo dry fire
+   stateName[6]                     = "DryFire";
+   stateTransitionGeneric0In[6]     = "Destroyed";
+   stateTimeoutValue[6]             = 1.0;
+   stateTransitionOnTimeout[6]      = "NoAmmo";
+   stateScript[6]                   = "onDryFire";
+
+   // Waiting for the turret to be deployed
+   stateName[7]                     = "WaitingDeployment";
+   stateTransitionGeneric0In[7]     = "Destroyed";
+   stateTransitionOnLoaded[7]       = "Deployed";
+   stateSequence[7]                 = "wait_deploy";
+
+   // Turret has been deployed
+   stateName[8]                     = "Deployed";
+   stateTransitionGeneric0In[8]     = "Destroyed";
+   stateTransitionOnTimeout[8]      = "Ready";
+   stateWaitForTimeout[8]           = true;
+   stateTimeoutValue[8]             = 2.5;   // Same length as turret base's Deploy state
+   stateSequence[8]                 = "deploy";
+
+   // Turret has been destroyed
+   stateName[9]                     = "Destroyed";
+   stateSequence[9]                 = "destroyed";
+};
+
+//-----------------------------------------------------------------------------
+// AI Turret
+//-----------------------------------------------------------------------------
+
+datablock AITurretShapeData(AITurret)
+{
+   category = "Turrets";
+   shapeFile = "art/shapes/weapons/Turret/Turret_Legs.DAE";
+
+   maxDamage = 70;
+   destroyedLevel = 70;
+   explosion = GrenadeExplosion;
+   
+   simpleServerCollision = false;
+
+   zRotOnly = false;
+   
+   // Rotation settings
+   minPitch = 15;
+   maxPitch = 80;
+   maxHeading = 90;
+   headingRate = 50;
+   pitchRate = 50;
+
+   // Scan settings
+   maxScanPitch = 10;
+   maxScanHeading = 30;
+   maxScanDistance = 20;
+   trackLostTargetTime = 2;
+
+   maxWeaponRange = 30;
+
+   weaponLeadVelocity = 0;
+
+   // Weapon mounting
+   numWeaponMountPoints = 1;
+
+   weapon[0] = AITurretHead;
+   weaponAmmo[0] = AITurretAmmo;
+   weaponAmmoAmount[0] = 10000;
+
+   maxInv[AITurretHead] = 1;
+   maxInv[AITurretAmmo] = 10000;
+
+   // Initial start up state
+   stateName[0]                     = "Preactivate";
+   stateTransitionOnAtRest[0]       = "Scanning";
+   stateTransitionOnNotAtRest[0]    = "Thrown";
+   
+   // Scan for targets
+   stateName[1]                     = "Scanning";
+   stateScan[1]                     = true;
+   stateTransitionOnTarget[1]       = "Target";
+   stateSequence[1]                 = "scan";
+   stateScript[1]                   = "OnScanning";
+
+   // Have a target
+   stateName[2]                     = "Target";
+   stateTransitionOnNoTarget[2]     = "NoTarget";
+   stateTransitionOnTimeout[2]      = "Firing";
+   stateTimeoutValue[2]             = 2.0;
+   stateScript[2]                   = "OnTarget";
+
+   // Fire at target
+   stateName[3]                     = "Firing";
+   stateFire[3]                     = true;
+   stateTransitionOnNoTarget[3]     = "NoTarget";
+   stateScript[3]                   = "OnFiring";
+
+   // Lost target
+   stateName[4]                     = "NoTarget";
+   stateTransitionOnTimeout[4]      = "Scanning";
+   stateTimeoutValue[4]             = 2.0;
+   stateScript[4]                   = "OnNoTarget";
+
+   // Player thrown turret
+   stateName[5]                     = "Thrown";
+   stateTransitionOnAtRest[5]       = "Deploy";
+   stateSequence[5]                 = "throw";
+   stateScript[5]                   = "OnThrown";
+
+   // Player thrown turret is deploying
+   stateName[6]                     = "Deploy";
+   stateTransitionOnTimeout[6]      = "Scanning";
+   stateTimeoutValue[6]             = 2.5;
+   stateSequence[6]                 = "deploy";
+   stateScaleAnimation[6]           = true;
+   stateScript[6]                   = "OnDeploy";
+
+   // Special state that is set when the turret is destroyed.
+   // This state is set in the onDestroyed() callback.
+   stateName[7]                     = "Destroyed";
+   stateSequence[7]                 = "destroyed";
+};
+
+//-----------------------------------------------------------------------------
+// Deployable AI Turret
+//-----------------------------------------------------------------------------
+datablock AITurretShapeData(DeployableTurret : AITurret)
+{
+   // Mission editor category
+   category = "Weapon";
+
+   className = "DeployableTurretWeapon";
+
+   startLoaded = false;
+   
+   // Basic Item properties
+   mass = 1.5;
+   elasticity = 0.1;
+   friction = 0.6;
+   simpleServerCollision = false;
+
+   // Dynamic properties defined by the scripts
+   PreviewImage = 'turret.png';
+   pickUpName = "a deployable turret";
+   description = "Deployable Turret";
+   image = DeployableTurretImage;
+   reticle = "blank";
+   zoomReticle = 'blank';
+};
+
+datablock ShapeBaseImageData(DeployableTurretImage)
+{
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/Turret/TP_Turret.DAE";
+   shapeFileFP = "art/shapes/weapons/Turret/FP_Turret.DAE";
+   emap = true;
+
+   imageAnimPrefix = "Turret";
+   imageAnimPrefixFP = "Turret";
+
+   // Specify mount point & offset for 3rd person, and eye offset
+   // for first person rendering.
+   mountPoint = 0;
+   firstPerson = true;
+   useEyeNode = true;
+
+   // Don't allow a player to sprint with a turret
+   sprintDisallowed = true;
+   
+   class = "DeployableTurretWeaponImage";
+   className = "DeployableTurretWeaponImage";
+
+   // Projectiles and Ammo.
+   item = DeployableTurret;
+
+   // Shake camera while firing.
+   shakeCamera = false;
+   camShakeFreq = "0 0 0";
+   camShakeAmp = "0 0 0";
+
+   // Images have a state system which controls how the animations
+   // are run, which sounds are played, script callbacks, etc. This
+   // state system is downloaded to the client so that clients can
+   // predict state changes and animate accordingly.  The following
+   // system supports basic ready->fire->reload transitions as
+   // well as a no-ammo->dryfire idle state.
+
+   // Initial start up state
+   stateName[0]                     = "Preactivate";
+   stateTransitionOnLoaded[0]       = "Activate";
+   stateTransitionOnNoAmmo[0]       = "Activate";
+
+   // Activating the gun.  Called when the weapon is first
+   // mounted and there is ammo.
+   stateName[1]                     = "Activate";
+   stateTransitionGeneric0In[1]     = "SprintEnter";
+   stateTransitionOnTimeout[1]      = "Ready";
+   stateTimeoutValue[1]             = 0.66;
+   stateSequence[1]                 = "switch_in";
+   stateSound[1]                    = TurretSwitchinSound;
+
+   // Ready to fire, just waiting for the trigger
+   stateName[2]                     = "Ready";
+   stateTransitionGeneric0In[2]     = "SprintEnter";
+   stateTransitionOnMotion[2]       = "ReadyMotion";
+   stateTransitionOnTriggerDown[2]  = "Fire";
+   stateScaleAnimation[2]           = false;
+   stateScaleAnimationFP[2]         = false;
+   stateSequence[2]                 = "idle";
+
+   // Ready to fire with player moving
+   stateName[3]                     = "ReadyMotion";
+   stateTransitionGeneric0In[3]     = "SprintEnter";
+   stateTransitionOnNoMotion[3]     = "Ready";
+   stateScaleAnimation[3]           = false;
+   stateScaleAnimationFP[3]         = false;
+   stateSequenceTransitionIn[3]     = true;
+   stateSequenceTransitionOut[3]    = true;
+   stateTransitionOnTriggerDown[3]  = "Fire";
+   stateSequence[3]                 = "run";
+
+   // Wind up to throw the Turret
+   stateName[4]                     = "Fire";
+   stateTransitionGeneric0In[4]     = "SprintEnter";
+   stateTransitionOnTimeout[4]      = "Fire2";
+   stateTimeoutValue[4]             = 0.66;
+   stateFire[4]                     = true;
+   stateRecoil[4]                   = "";
+   stateAllowImageChange[4]         = false;
+   stateSequence[4]                 = "Fire";
+   stateSequenceNeverTransition[4]  = true;
+   stateShapeSequence[4]            = "Recoil";
+
+   // Throw the actual Turret
+   stateName[5]                     = "Fire2";
+   stateTransitionGeneric0In[5]     = "SprintEnter";
+   stateTransitionOnTriggerUp[5]    = "Reload";
+   stateTimeoutValue[5]             = 0.1;
+   stateAllowImageChange[5]         = false;
+   stateScript[5]                   = "onFire";
+   stateShapeSequence[5]            = "Fire_Release";
+
+   // Play the reload animation, and transition into
+   stateName[6]                     = "Reload";
+   stateTransitionGeneric0In[6]     = "SprintEnter";
+   stateTransitionOnTimeout[6]      = "Ready";
+   stateWaitForTimeout[6]           = true;
+   stateTimeoutValue[6]             = 0.66;
+   stateSequence[6]                 = "switch_in";
+
+   // Start Sprinting
+   stateName[7]                     = "SprintEnter";
+   stateTransitionGeneric0Out[7]    = "SprintExit";
+   stateTransitionOnTimeout[7]      = "Sprinting";
+   stateWaitForTimeout[7]           = false;
+   stateTimeoutValue[7]             = 0.25;
+   stateWaitForTimeout[7]           = false;
+   stateScaleAnimation[7]           = true;
+   stateScaleAnimationFP[7]         = true;
+   stateSequenceTransitionIn[7]     = true;
+   stateSequenceTransitionOut[7]    = true;
+   stateAllowImageChange[7]         = false;
+   stateSequence[7]                 = "sprint";
+
+   // Sprinting
+   stateName[8]                     = "Sprinting";
+   stateTransitionGeneric0Out[8]    = "SprintExit";
+   stateWaitForTimeout[8]           = false;
+   stateScaleAnimation[8]           = false;
+   stateScaleAnimationFP[8]         = false;
+   stateSequenceTransitionIn[8]     = true;
+   stateSequenceTransitionOut[8]    = true;
+   stateAllowImageChange[8]         = false;
+   stateSequence[8]                 = "sprint";
+   
+   // Stop Sprinting
+   stateName[9]                     = "SprintExit";
+   stateTransitionGeneric0In[9]     = "SprintEnter";
+   stateTransitionOnTimeout[9]      = "Ready";
+   stateWaitForTimeout[9]           = false;
+   stateTimeoutValue[9]             = 0.5;
+   stateSequenceTransitionIn[9]     = true;
+   stateSequenceTransitionOut[9]    = true;
+   stateAllowImageChange[9]         = false;
+   stateSequence[9]                 = "sprint";
+};

+ 363 - 0
Templates/Full PhysX/game/art/datablocks/weapons/grenade.cs

@@ -0,0 +1,363 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+$GrenadeUpVectorOffset = "0 0 1";
+
+
+
+//----------------------------------------------------------------------------
+// Sounds
+//----------------------------------------------------------------------------
+
+datablock SFXProfile(GrenadeExplosionSound)
+{
+   filename = "art/sound/CT_fx/weapons/GRENADELAND.wav";
+   description = AudioDefault3d;
+   preload = true;
+};
+
+//----------------------------------------------------------------------------
+// Debris
+//----------------------------------------------------------------------------
+
+datablock ParticleData(GrenadeDebrisFireParticle)
+{
+   textureName = "art/shapes/particles/impact";
+   dragCoeffiecient = 0;
+   gravityCoefficient = -1.00366;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 300;
+   lifetimeVarianceMS = 100;
+   useInvAlpha = false;
+   spinSpeed = 1;
+   spinRandomMin = -280.0;
+   spinRandomMax = 280.0;
+   colors[0] = "1 0.590551 0.188976 0.0944882";
+   colors[1] = "0.677165 0.590551 0.511811 0.496063";
+   colors[2] = "0.645669 0.645669 0.645669 0";
+   sizes[0] = 0.2;
+   sizes[1] = 0.5;
+   sizes[2] = 0.2;
+   times[0] = 0.0;
+   times[1] = 0.494118;
+   times[2] = 1.0;
+   animTexName = "art/shapes/particles/impact";
+   colors[3] = "1 1 1 0.407";
+   sizes[3] = "0.5";
+};
+
+datablock ParticleEmitterData(GrenadeDebrisFireEmitter)
+{
+   ejectionPeriodMS = 10;
+   periodVarianceMS = 0;
+   ejectionVelocity = 0;
+   velocityVariance = 0;
+   thetaMin = 0.0;
+   thetaMax = 25;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   ejectionoffset = 0.3;
+   particles = "GrenadeDebrisFireParticle";
+   orientParticles = "1";
+   blendStyle = "NORMAL";
+};
+
+datablock DebrisData(GrenadeDebris)
+{
+   shapeFile = "art/shapes/weapons/Grenade/grenadeDebris.dae";
+   emitters[0] = GrenadeDebrisFireEmitter;
+   elasticity = 0.4;
+   friction = 0.25;
+   numBounces = 3;
+   bounceVariance = 1;
+   explodeOnMaxBounce = false;
+   staticOnMaxBounce = false;
+   snapOnMaxBounce = false;
+   minSpinSpeed = 200;
+   maxSpinSpeed = 600;
+   render2D = false;
+   lifetime = 4;
+   lifetimeVariance = 1.5;
+   velocity = 15;
+   velocityVariance = 5;
+   fade = true;
+   useRadiusMass = true;
+   baseRadius = 0.3;
+   gravModifier = 1.0;
+   terminalVelocity = 20;
+   ignoreWater = false;
+};
+
+
+
+// ----------------------------------------------------------------------------
+// Explosion Particle effects
+// ----------------------------------------------------------------------------
+
+datablock ParticleData(GrenadeExpFire)
+{
+   textureName = "art/shapes/particles/fireball.png";
+   dragCoeffiecient = 0;
+   windCoeffiecient = 0.5;
+   gravityCoefficient = -1;
+   inheritedVelFactor = 0;
+   constantAcceleration = 0;
+   lifetimeMS = 1200;//3000;
+   lifetimeVarianceMS = 100;//200;
+   useInvAlpha = false;
+   spinRandomMin = 0;
+   spinRandomMax = 1;
+   spinSpeed = 1;
+   colors[0] = "0.886275 0.854902 0.733333 0.795276";
+   colors[1] = "0.356863 0.34902 0.321569 0.266";
+   colors[2] = "0.0235294 0.0235294 0.0235294 0.207";
+   sizes[0] = 1;//2;
+   sizes[1] = 5;
+   sizes[2] = 7;//0.5;
+   times[0] = 0.0;
+   times[1] = 0.25;
+   times[2] = 0.5;
+   animTexName = "art/shapes/particles/fireball.png";
+   times[3] = "1";
+   dragCoefficient = "1.99902";
+   sizes[3] = "10";
+   colors[3] = "0 0 0 0";
+};
+
+datablock ParticleEmitterData(GrenadeExpFireEmitter)
+{
+   ejectionPeriodMS = 10;
+   periodVarianceMS = 5;//0;
+   ejectionVelocity = 1;//1.0;
+   velocityVariance = 0;//0.5;
+   thetaMin = 0.0;
+   thetaMax = 45;
+   lifetimeMS = 250;
+   particles = "GrenadeExpFire";
+   blendStyle = "ADDITIVE";
+};
+
+datablock ParticleData(GrenadeExpDust)
+{
+   textureName = "art/shapes/particles/smoke.png";
+   dragCoefficient = 0.498534;
+   gravityCoefficient = 0;
+   inheritedVelFactor = 1;
+   constantAcceleration = 0.0;
+   lifetimeMS = 2000;
+   lifetimeVarianceMS = 250;
+   useInvAlpha = 0;
+   spinSpeed = 1;
+   spinRandomMin = -90.0;
+   spinRandomMax = 90.0;
+   colors[0] = "0.992126 0.992126 0.992126 0.96063";
+   colors[1] = "0.11811 0.11811 0.11811 0.929134";
+   colors[2] = "0.00392157 0.00392157 0.00392157 0.362205";
+   sizes[0] = 1.59922;
+   sizes[1] = 4.99603;
+   sizes[2] = 9.99817;
+   times[0] = 0.0;
+   times[1] = 0.494118;
+   times[2] = 1.0;
+   animTexName = "art/shapes/particles/smoke.png";
+   colors[3] = "0.996078 0.996078 0.996078 0";
+   sizes[3] = "15";
+};
+
+datablock ParticleEmitterData(GrenadeExpDustEmitter)
+{
+   ejectionPeriodMS = 5;
+   periodVarianceMS = 0;
+   ejectionVelocity = 8;
+   velocityVariance = 0.0;
+   ejectionOffset = 0.0;
+   thetaMin = 85;
+   thetaMax = 85;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvances = 0;
+   lifetimeMS = 2000;
+   particles = "GrenadeExpDust";
+   blendStyle = "NORMAL";
+};
+
+datablock ParticleData(GrenadeExpSpark)
+{
+   textureName = "art/shapes/particles/Sparkparticle";
+   dragCoefficient = 1;
+   gravityCoefficient = 0.0;
+   inheritedVelFactor = 0.2;
+   constantAcceleration = 0.0;
+   lifetimeMS = 500;
+   lifetimeVarianceMS = 250;
+   colors[0] = "0.6 0.4 0.3 1";
+   colors[1] = "0.6 0.4 0.3 1";
+   colors[2] = "1.0 0.4 0.3 0";
+   sizes[0] = 0.5;
+   sizes[1] = 0.75;
+   sizes[2] = 1;
+   times[0] = 0;
+   times[1] = 0.5;
+   times[2] = 1;
+};
+
+datablock ParticleEmitterData(GrenadeExpSparkEmitter)
+{
+   ejectionPeriodMS = 2;
+   periodVarianceMS = 0;
+   ejectionVelocity = 20;
+   velocityVariance = 10;
+   ejectionOffset = 0.0;
+   thetaMin = 0;
+   thetaMax = 120;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvances = false;
+   orientParticles = true;
+   lifetimeMS = 100;
+   particles = "GrenadeExpSpark";
+};
+
+datablock ParticleData(GrenadeExpSparks)
+{
+   textureName = "art/shapes/particles/droplet";
+   dragCoefficient = 1;
+   gravityCoefficient = 0.0;
+   inheritedVelFactor = 0.2;
+   constantAcceleration = 0.0;
+   lifetimeMS = 500;
+   lifetimeVarianceMS = 350;
+
+   colors[0] = "0.6 0.4 0.3 1.0";
+   colors[1] = "0.6 0.4 0.3 0.6";
+   colors[2] = "1.0 0.4 0.3 0.0";
+
+   sizes[0] = 0.5;
+   sizes[1] = 0.5;
+   sizes[2] = 0.75;
+
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(GrenadeExpSparksEmitter)
+{
+   ejectionPeriodMS = 2;
+   periodVarianceMS = 0;
+   ejectionVelocity = 12;
+   velocityVariance = 6.75;
+   ejectionOffset = 0.0;
+   thetaMin = 0;
+   thetaMax = 60;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvances = false;
+   orientParticles = true;
+   lifetimeMS = 100;
+   particles = "GrenadeExpSparks";
+};
+
+datablock ParticleData(GrenadeExpSmoke)
+{
+   textureName = "art/shapes/particles/smoke";
+   dragCoeffiecient = 0;
+   gravityCoefficient = -0.40293;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 800;
+   lifetimeVarianceMS = 299;
+   useInvAlpha = true;
+   spinSpeed = 1;
+   spinRandomMin = -80.0;
+   spinRandomMax = 0;
+   colors[0] = "0.8 0.8 0.8 0.4";
+   colors[1] = "0.5 0.5 0.5 0.5";
+   colors[2] = "0.75 0.75 0.75 0";
+   sizes[0] = 4.49857;
+   sizes[1] = 7.49863;
+   sizes[2] = 11.2495;
+   times[0] = 0;
+   times[1] = 0.498039;
+   times[2] = 1;
+   animTexName = "art/shapes/particles/smoke";
+   times[3] = "1";
+};
+
+datablock ParticleEmitterData(GrenadeExpSmokeEmitter)
+{
+   ejectionPeriodMS = 15;
+   periodVarianceMS = 5;
+   ejectionVelocity = 2.4;
+   velocityVariance = 1.2;
+   thetaMin = 0.0;
+   thetaMax = 180.0;
+   ejectionOffset = 1;
+   particles = "GrenadeExpSmoke";
+   blendStyle = "NORMAL";
+};
+
+
+// ----------------------------------------------------------------------------
+// Dry/Air Explosion Objects
+// ----------------------------------------------------------------------------
+
+datablock ExplosionData(GrenadeExplosion)
+{
+   soundProfile = GrenadeExplosionSound;
+   lifeTimeMS = 400; // Quick flash, short burn, and moderate dispersal
+
+   // Volume particles
+   particleEmitter = GrenadeExpFireEmitter;
+   particleDensity = 75;
+   particleRadius = 2.25;
+
+   // Point emission
+   emitter[0] = GrenadeExpDustEmitter;
+   emitter[1] = GrenadeExpSparksEmitter;
+   emitter[2] = GrenadeExpSmokeEmitter;
+
+   // Camera Shaking
+   shakeCamera = true;
+   camShakeFreq = "10.0 11.0 9.0";
+   camShakeAmp = "15.0 15.0 15.0";
+   camShakeDuration = 1.5;
+   camShakeRadius = 20;
+
+   // Exploding debris
+   debris = GrenadeDebris;
+   debrisThetaMin = 10;
+   debrisThetaMax = 60;
+   debrisNum = 4;
+   debrisNumVariance = 2;
+   debrisVelocity = 25;
+   debrisVelocityVariance = 5;
+
+   lightStartRadius = 4.0;
+   lightEndRadius = 0.0;
+   lightStartColor = "1.0 1.0 1.0";
+   lightEndColor = "1.0 1.0 1.0";
+   lightStartBrightness = 4.0;
+   lightEndBrightness = 0.0;
+   lightNormalOffset = 2.0;
+};

+ 952 - 0
Templates/Full PhysX/game/art/datablocks/weapons/grenadeLauncher.cs

@@ -0,0 +1,952 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+// GrenadeLauncher weapon.
+// This script file contains all of the necessary datablocks needed for the
+// GrenadeLauncher.  These datablocks include sound profiles, light descriptions,
+// particle effects, explosions, projectiles, items (weapon and ammo), shell
+// casings (if any), and finally the weapon image which contains the state
+// machine that determines how the weapon operates.
+
+// The various "fire" methods/modes are handled in weapons.cs through a "weapon"
+// namespace function.  This reduces duplicated code, although a unique fire
+// method could still be implemented for this weapon.
+
+// ----------------------------------------------------------------------------
+// Sound profiles
+// ----------------------------------------------------------------------------
+
+datablock SFXProfile(GrenadeLauncherReloadSound)
+{
+   filename = "art/sound/weapons/Crossbow_reload";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock SFXProfile(GrenadeLauncherFireSound)
+{
+   filename = "art/sound/weapons/relbow_mono_01";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock SFXProfile(GrenadeLauncherFireEmptySound)
+{
+   filename = "art/sound/weapons/Crossbow_firing_empty";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock SFXProfile(GrenadeLauncherExplosionSound)
+{
+   filename = "art/sound/weapons/Crossbow_explosion";
+   description = AudioDefault3d;
+   preload = true;
+};
+
+// ----------------------------------------------------------------------------
+// Lights for the projectile(s)
+// ----------------------------------------------------------------------------
+
+datablock LightDescription(GrenadeLauncherLightDesc)
+{
+   range = 1.0;
+   color = "1 1 1";
+   brightness = 2.0;
+   animationType = PulseLightAnim;
+   animationPeriod = 0.25;
+   //flareType = SimpleLightFlare0;
+};
+
+datablock LightDescription(GrenadeLauncherWaterLightDesc)
+{
+   radius = 2.0;
+   color = "1 1 1";
+   brightness = 2.0;
+   animationType = PulseLightAnim;
+   animationPeriod = 0.25;
+   //flareType = SimpleLightFlare0;
+};
+
+//----------------------------------------------------------------------------
+// Debris
+//----------------------------------------------------------------------------
+
+datablock ParticleData(GrenadeDebrisFireParticle)
+{
+   textureName = "art/shapes/particles/impact";
+   dragCoeffiecient = 0.0;
+   gravityCoefficient = -1;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 300;
+   lifetimeVarianceMS = 100;
+   useInvAlpha = false;
+   spinSpeed = 1;
+   spinRandomMin = -280.0;
+   spinRandomMax = 280.0;
+   colors[0] = "1.0 0.6 0.2 0.1";
+   colors[1] = "1.0 0.5 0 0.5";
+   colors[2] = "0.1 0.1 0.1 0.0";
+   sizes[0] = 1.0;
+   sizes[1] = 2.0;
+   sizes[2] = 1.0;
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(GrenadeDebrisFireEmitter)
+{
+   ejectionPeriodMS = 8;
+   periodVarianceMS = 4;
+   ejectionVelocity = 5.0;
+   velocityVariance = 3.0;
+   thetaMin = 0.0;
+   thetaMax = 180.0;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   ejectionoffset = 0.3;
+   particles = "GrenadeDebrisFireParticle";
+};
+
+datablock DebrisData(GrenadeDebris)
+{
+   shapeFile = "art/shapes/weapons/GrenadeLauncher/debris.dts";
+   emitters[0] = GrenadeDebrisFireEmitter;
+   elasticity = 0.4;
+   friction = 0.25;
+   numBounces = 3;
+   bounceVariance = 1;
+   explodeOnMaxBounce = false;
+   staticOnMaxBounce = false;
+   snapOnMaxBounce = false;
+   minSpinSpeed = 200;
+   maxSpinSpeed = 600;
+   render2D = false;
+   lifetime = 4;
+   lifetimeVariance = 1.5;
+   velocity = 15;
+   velocityVariance = 5;
+   fade = true;
+   useRadiusMass = true;
+   baseRadius = 0.3;
+   gravModifier = 1.0;
+   terminalVelocity = 20;
+   ignoreWater = false;
+};
+
+// ----------------------------------------------------------------------------
+// Splash effects
+// ----------------------------------------------------------------------------
+
+datablock ParticleData(GrenadeSplashMist)
+{
+   dragCoefficient = 1.0;
+   windCoefficient = 2.0;
+   gravityCoefficient = 0.3;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 600;
+   lifetimeVarianceMS = 100;
+   useInvAlpha = false;
+   spinRandomMin = -90.0;
+   spinRandomMax = 500.0;
+   spinSpeed = 1;
+
+   textureName = "art/shapes/particles/smoke";
+
+   colors[0] = "0.7 0.8 1.0 1.0";
+   colors[1] = "0.7 0.8 1.0 0.5";
+   colors[2] = "0.7 0.8 1.0 0.0";
+
+   sizes[0] = 0.2;
+   sizes[1] = 0.4;
+   sizes[2] = 0.8;
+
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(GrenadeSplashMistEmitter)
+{
+   ejectionPeriodMS = 5;
+   periodVarianceMS = 0;
+   ejectionVelocity = 3.0;
+   velocityVariance = 2.0;
+   ejectionOffset = 0.15;
+   thetaMin = 85;
+   thetaMax = 85;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvance = false;
+   lifetimeMS = 250;
+   particles = "GrenadeSplashMist";
+};
+
+datablock ParticleData(GrenadeSplashParticle)
+{
+   dragCoefficient = 1;
+   windCoefficient = 0.9;
+   gravityCoefficient = 0.3;
+   inheritedVelFactor = 0.2;
+   constantAcceleration = -1.4;
+   lifetimeMS = 600;
+   lifetimeVarianceMS = 200;
+   textureName = "art/shapes/particles/droplet";
+
+   colors[0] = "0.7 0.8 1.0 1.0";
+   colors[1] = "0.7 0.8 1.0 0.5";
+   colors[2] = "0.7 0.8 1.0 0.0";
+
+   sizes[0] = 0.5;
+   sizes[1] = 0.25;
+   sizes[2] = 0.25;
+
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(GrenadeSplashEmitter)
+{
+   ejectionPeriodMS = 4;
+   periodVarianceMS = 0;
+   ejectionVelocity = 7.3;
+   velocityVariance = 2.0;
+   ejectionOffset = 0.0;
+   thetaMin = 30;
+   thetaMax = 80;
+   phiReferenceVel = 00;
+   phiVariance = 360;
+   overrideAdvance = false;
+   orientParticles = true;
+   orientOnVelocity = true;
+   lifetimeMS = 100;
+   particles = "GrenadeSplashParticle";
+};
+
+datablock ParticleData(GrenadeSplashRingParticle)
+{
+   textureName = "art/shapes/particles/wake";
+   dragCoefficient = 0.0;
+   gravityCoefficient = 0.0;
+   inheritedVelFactor = 0.0;
+   lifetimeMS = 2500;
+   lifetimeVarianceMS = 200;
+   windCoefficient = 0.0;
+   useInvAlpha = 1;
+   spinRandomMin = 30.0;
+   spinRandomMax = 30.0;
+   spinSpeed = 1;
+
+   animateTexture = true;
+   framesPerSec = 1;
+   animTexTiling = "2 1";
+   animTexFrames = "0 1";
+
+   colors[0] = "0.7 0.8 1.0 1.0";
+   colors[1] = "0.7 0.8 1.0 0.5";
+   colors[2] = "0.7 0.8 1.0 0.0";
+
+   sizes[0] = 2.0;
+   sizes[1] = 4.0;
+   sizes[2] = 8.0;
+
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(GrenadeSplashRingEmitter)
+{
+   lifetimeMS = "100";
+   ejectionPeriodMS = 200;
+   periodVarianceMS = 10;
+   ejectionVelocity = 0;
+   velocityVariance = 0;
+   ejectionOffset = 0;
+   thetaMin = 89;
+   thetaMax = 90;
+   phiReferenceVel = 0;
+   phiVariance = 1;
+   alignParticles = 1;
+   alignDirection = "0 0 1";
+   particles = "GrenadeSplashRingParticle";
+};
+
+datablock SplashData(GrenadeSplash)
+{
+//    numSegments = 15;
+//    ejectionFreq = 15;
+//    ejectionAngle = 40;
+//    ringLifetime = 0.5;
+//    lifetimeMS = 300;
+//    velocity = 4.0;
+//    startRadius = 0.0;
+//    acceleration = -3.0;
+//    texWrap = 5.0;
+//    texture = "art/shapes/particles/splash";
+
+   emitter[0] = GrenadeSplashEmitter;
+   emitter[1] = GrenadeSplashMistEmitter;
+   emitter[2] = GrenadeSplashRingEmitter;
+
+//    colors[0] = "0.7 0.8 1.0 0.0";
+//    colors[1] = "0.7 0.8 1.0 0.3";
+//    colors[2] = "0.7 0.8 1.0 0.7";
+//    colors[3] = "0.7 0.8 1.0 0.0";
+//
+//    times[0] = 0.0;
+//    times[1] = 0.4;
+//    times[2] = 0.8;
+//    times[3] = 1.0;
+};
+
+// ----------------------------------------------------------------------------
+// Explosion Particle effects
+// ----------------------------------------------------------------------------
+
+datablock ParticleData(GrenadeExpFire)
+{
+   textureName = "art/shapes/particles/fireball";
+   dragCoeffiecient = 0;
+   windCoeffiecient = 0.5;
+   gravityCoefficient = -0.300366;
+   inheritedVelFactor = 0.299413;
+   constantAcceleration = 0.2;
+   lifetimeMS = 2000;//3000;
+   lifetimeVarianceMS = 299;//200;
+   useInvAlpha = false;
+   spinRandomMin = -80.0;
+   spinRandomMax = 0;
+   spinSpeed = 1;
+   colors[0] = "0.795276 0.393701 0 0.795276";
+   colors[1] = "0.19685 0.0944882 0 0.393701";
+   colors[2] = "0 0 0 0";
+   sizes[0] = 0.75;//2;
+   sizes[1] = 1.5;
+   sizes[2] = 3;//0.5;
+   times[0] = 0.0;
+   times[1] = 0.498039;
+   times[2] = 1.0;
+   animTexName = "art/shapes/particles/Fireball";
+   times[3] = "1";
+};
+
+datablock ParticleEmitterData(GrenadeExpFireEmitter)
+{
+   ejectionPeriodMS = 10;
+   periodVarianceMS = 5;//0;
+   ejectionVelocity = 4;//1.0;
+   velocityVariance = 1;//0.5;
+   thetaMin = 0.0;
+   thetaMax = 180.0;
+   lifetimeMS = 250;
+   particles = "GrenadeExpFire";
+};
+
+datablock ParticleData(GrenadeExpDust)
+{
+   textureName = "art/shapes/particles/smoke";
+   dragCoefficient = 1.0;
+   gravityCoefficient = -0.01;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 2500;
+   lifetimeVarianceMS = 500;
+   useInvAlpha = true;
+   spinSpeed = 1;
+   spinRandomMin = -90.0;
+   spinRandomMax = 90.0;
+   colors[0] = "0.6 0.6 0.6 0.3";
+   colors[1] = "0.6 0.6 0.6 0.3";
+   colors[2] = "0.6 0.6 0.6 0.0";
+   sizes[0] = 1.6;
+   sizes[1] = 2.0;
+   sizes[2] = 2.4;
+   times[0] = 0.0;
+   times[1] = 0.7;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(GrenadeExpDustEmitter)
+{
+   ejectionPeriodMS = 1;
+   periodVarianceMS = 0;
+   ejectionVelocity = 15;
+   velocityVariance = 0.0;
+   ejectionOffset = 0.0;
+   thetaMin = 85;
+   thetaMax = 85;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvances = false;
+   lifetimeMS = 200;
+   particles = "GrenadeExpDust";
+};
+
+datablock ParticleData(GrenadeExpSpark)
+{
+   textureName = "art/shapes/particles/ricochet";
+   dragCoefficient = 1;
+   gravityCoefficient = 0.0;
+   inheritedVelFactor = 0.2;
+   constantAcceleration = 0.0;
+   lifetimeMS = 500;
+   lifetimeVarianceMS = 250;
+   colors[0] = "0.6 0.4 0.3 1";
+   colors[1] = "0.6 0.4 0.3 1";
+   colors[2] = "1.0 0.4 0.3 0";
+   sizes[0] = 0.5;
+   sizes[1] = 0.75;
+   sizes[2] = 1;
+   times[0] = 0;
+   times[1] = 0.5;
+   times[2] = 1;
+};
+
+datablock ParticleEmitterData(GrenadeExpSparkEmitter)
+{
+   ejectionPeriodMS = 2;
+   periodVarianceMS = 0;
+   ejectionVelocity = 20;
+   velocityVariance = 10;
+   ejectionOffset = 0.0;
+   thetaMin = 0;
+   thetaMax = 120;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvances = false;
+   orientParticles = true;
+   lifetimeMS = 100;
+   particles = "GrenadeExpSpark";
+};
+
+datablock ParticleData(GrenadeExpSparks)
+{
+   textureName = "art/shapes/particles/droplet";
+   dragCoefficient = 1;
+   gravityCoefficient = 0.0;
+   inheritedVelFactor = 0.2;
+   constantAcceleration = 0.0;
+   lifetimeMS = 500;
+   lifetimeVarianceMS = 350;
+
+   colors[0] = "0.6 0.4 0.3 1.0";
+   colors[1] = "0.6 0.4 0.3 0.6";
+   colors[2] = "1.0 0.4 0.3 0.0";
+
+   sizes[0] = 0.5;
+   sizes[1] = 0.5;
+   sizes[2] = 0.75;
+
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(GrenadeExpSparksEmitter)
+{
+   ejectionPeriodMS = 2;
+   periodVarianceMS = 0;
+   ejectionVelocity = 12;
+   velocityVariance = 6.75;
+   ejectionOffset = 0.0;
+   thetaMin = 0;
+   thetaMax = 60;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvances = false;
+   orientParticles = true;
+   lifetimeMS = 100;
+   particles = "GrenadeExpSparks";
+};
+
+datablock ParticleData(GrenadeExpSmoke)
+{
+   textureName = "art/shapes/particles/smoke";
+   dragCoeffiecient = 0;
+   gravityCoefficient = -0.40293;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 800;
+   lifetimeVarianceMS = 299;
+   useInvAlpha = true;
+   spinSpeed = 1;
+   spinRandomMin = -80.0;
+   spinRandomMax = 0;
+   colors[0] = "0.8 0.8 0.8 0.4";
+   colors[1] = "0.5 0.5 0.5 0.5";
+   colors[2] = "0.75 0.75 0.75 0";
+   sizes[0] = 4.49857;
+   sizes[1] = 7.49863;
+   sizes[2] = 11.2495;
+   times[0] = 0;
+   times[1] = 0.498039;
+   times[2] = 1;
+   animTexName = "art/shapes/particles/smoke";
+   times[3] = "1";
+};
+
+datablock ParticleEmitterData(GrenadeExpSmokeEmitter)
+{
+   ejectionPeriodMS = 15;
+   periodVarianceMS = 5;
+   ejectionVelocity = 2.4;
+   velocityVariance = 1.2;
+   thetaMin = 0.0;
+   thetaMax = 180.0;
+   ejectionOffset = 1;
+   particles = "GrenadeExpSmoke";
+};
+
+// ----------------------------------------------------------------------------
+// Water Explosion
+// ----------------------------------------------------------------------------
+
+datablock ParticleData(GLWaterExpDust)
+{
+   textureName = "art/shapes/particles/steam";
+   dragCoefficient = 1.0;
+   gravityCoefficient = -0.01;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 2500;
+   lifetimeVarianceMS = 250;
+   useInvAlpha = false;
+   spinSpeed = 1;
+   spinRandomMin = -90.0;
+   spinRandomMax = 500.0;
+   colors[0] = "0.6 0.6 1.0 0.5";
+   colors[1] = "0.6 0.6 1.0 0.3";
+
+   sizes[0] = 0.25;
+   sizes[1] = 1.5;
+
+   times[0] = 0.0;
+   times[1] = 1.0;
+};
+
+datablock ParticleEmitterData(GLWaterExpDustEmitter)
+{
+   ejectionPeriodMS = 1;
+   periodVarianceMS = 0;
+   ejectionVelocity = 10;
+   velocityVariance = 0.0;
+   ejectionOffset = 0.0;
+   thetaMin = 85;
+   thetaMax = 85;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvances = false;
+   lifetimeMS = 75;
+   particles = "GLWaterExpDust";
+};
+
+datablock ParticleData(GLWaterExpSparks)
+{
+   textureName = "art/shapes/particles/spark_wet";
+   dragCoefficient = 1;
+   gravityCoefficient = 0.0;
+   inheritedVelFactor = 0.2;
+   constantAcceleration = 0.0;
+   lifetimeMS = 500;
+   lifetimeVarianceMS = 250;
+
+   colors[0] = "0.6 0.6 1.0 1.0";
+   colors[1] = "0.6 0.6 1.0 1.0";
+   colors[2] = "0.6 0.6 1.0 0.0";
+
+   sizes[0] = 0.5;
+   sizes[1] = 0.5;
+   sizes[2] = 0.75;
+
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(GLWaterExpSparkEmitter)
+{
+   ejectionPeriodMS = 2;
+   periodVarianceMS = 0;
+   ejectionVelocity = 12;
+   velocityVariance = 6.75;
+   ejectionOffset = 0.0;
+   thetaMin = 0;
+   thetaMax = 60;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvances = false;
+   orientParticles = true;
+   lifetimeMS = 100;
+   particles = "GLWaterExpSparks";
+};
+
+datablock ParticleData(GLWaterExpSmoke)
+{
+   textureName = "art/shapes/particles/smoke";
+   dragCoeffiecient = 0.4;
+   gravityCoefficient = -0.25;
+   inheritedVelFactor = 0.025;
+   constantAcceleration = -1.1;
+   lifetimeMS = 1250;
+   lifetimeVarianceMS = 0;
+   useInvAlpha = false;
+   spinSpeed = 1;
+   spinRandomMin = -200.0;
+   spinRandomMax = 200.0;
+
+   colors[0] = "0.1 0.1 1.0 1.0";
+   colors[1] = "0.4 0.4 1.0 1.0";
+   colors[2] = "0.4 0.4 1.0 0.0";
+
+   sizes[0] = 2.0;
+   sizes[1] = 6.0;
+   sizes[2] = 2.0;
+
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(GLWaterExpSmokeEmitter)
+{
+   ejectionPeriodMS = 15;
+   periodVarianceMS = 0;
+   ejectionVelocity = 6.25;
+   velocityVariance = 0.25;
+   thetaMin = 0.0;
+   thetaMax = 90.0;
+   lifetimeMS = 250;
+   particles = "GLWaterExpSmoke";
+};
+
+datablock ParticleData(GLWaterExpBubbles)
+{
+   textureName = "art/shapes/particles/millsplash01";
+   dragCoefficient = 0.0;
+   gravityCoefficient = -0.05;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 1500;
+   lifetimeVarianceMS = 250;
+   useInvAlpha = false;
+
+   spinRandomMin = -100.0;
+   spinRandomMax = 100.0;
+   spinSpeed = 1;
+
+   colors[0] = "0.7 0.8 1.0 0.0";
+   colors[1] = "0.7 0.8 1.0 0.4";
+   colors[2] = "0.7 0.8 1.0 0.0";
+
+   sizes[0] = 0.2;
+   sizes[1] = 0.4;
+   sizes[2] = 0.8;
+
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(GLWaterExpBubbleEmitter)
+{
+   ejectionPeriodMS = 5;
+   periodVarianceMS = 0;
+   ejectionVelocity = 1.0;
+   ejectionOffset = 3.0;
+   velocityVariance = 0.5;
+   thetaMin = 0;
+   thetaMax = 80;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvances = false;
+   particles = "GLWaterExpBubbles";
+};
+
+datablock ExplosionData(GrenadeLauncherWaterExplosion)
+{
+   //soundProfile = GLWaterExplosionSound;
+
+   emitter[0] = GLWaterExpDustEmitter;
+   emitter[1] = GLWaterExpSparkEmitter;
+   emitter[2] = GLWaterExpSmokeEmitter;
+   emitter[3] = GLWaterExpBubbleEmitter;
+
+   shakeCamera = true;
+   camShakeFreq = "10.0 11.0 9.0";
+   camShakeAmp = "20.0 20.0 20.0";
+   camShakeDuration = 1.5;
+   camShakeRadius = 20.0;
+
+   lightStartRadius = 20.0;
+   lightEndRadius = 0.0;
+   lightStartColor = "0.9 0.9 0.8";
+   lightEndColor = "0.6 0.6 1.0";
+   lightStartBrightness = 2.0;
+   lightEndBrightness = 0.0;
+};
+
+// ----------------------------------------------------------------------------
+// Dry/Air Explosion Objects
+// ----------------------------------------------------------------------------
+
+datablock ExplosionData(GrenadeSubExplosion)
+{
+   offset = 0.25;
+   emitter[0] = GrenadeExpSparkEmitter;
+
+   lightStartRadius = 4.0;
+   lightEndRadius = 0.0;
+   lightStartColor = "0.9 0.7 0.7";
+   lightEndColor = "0.9 0.7 0.7";
+   lightStartBrightness = 2.0;
+   lightEndBrightness = 0.0;
+};
+
+datablock ExplosionData(GrenadeLauncherExplosion)
+{
+   soundProfile = GrenadeLauncherExplosionSound;
+   lifeTimeMS = 400; // Quick flash, short burn, and moderate dispersal
+
+   // Volume particles
+   particleEmitter = GrenadeExpFireEmitter;
+   particleDensity = 75;
+   particleRadius = 2.25;
+
+   // Point emission
+   emitter[0] = GrenadeExpDustEmitter;
+   emitter[1] = GrenadeExpSparksEmitter;
+   emitter[2] = GrenadeExpSmokeEmitter;
+
+   // Sub explosion objects
+   subExplosion[0] = GrenadeSubExplosion;
+
+   // Camera Shaking
+   shakeCamera = true;
+   camShakeFreq = "10.0 11.0 9.0";
+   camShakeAmp = "15.0 15.0 15.0";
+   camShakeDuration = 1.5;
+   camShakeRadius = 20;
+
+   // Exploding debris
+   debris = GrenadeDebris;
+   debrisThetaMin = 10;
+   debrisThetaMax = 60;
+   debrisNum = 4;
+   debrisNumVariance = 2;
+   debrisVelocity = 25;
+   debrisVelocityVariance = 5;
+
+   lightStartRadius = 4.0;
+   lightEndRadius = 0.0;
+   lightStartColor = "1.0 1.0 1.0";
+   lightEndColor = "1.0 1.0 1.0";
+   lightStartBrightness = 4.0;
+   lightEndBrightness = 0.0;
+   lightNormalOffset = 2.0;
+};
+
+// ----------------------------------------------------------------------------
+// Underwater Grenade projectile trail
+// ----------------------------------------------------------------------------
+
+datablock ParticleData(GrenadeTrailWaterParticle)
+{
+   textureName = "art/shapes/particles/bubble";
+   dragCoefficient = 0.0;
+   gravityCoefficient = 0.1;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 1500;
+   lifetimeVarianceMS = 600;
+   useInvAlpha = false;
+   spinRandomMin = -100.0;
+   spinRandomMax = 100.0;
+   spinSpeed = 1;
+
+   colors[0] = "0.7 0.8 1.0 1.0";
+   colors[1] = "0.7 0.8 1.0 0.4";
+   colors[2] = "0.7 0.8 1.0 0.0";
+
+   sizes[0] = 0.05;
+   sizes[1] = 0.05;
+   sizes[2] = 0.05;
+
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(GrenadeTrailWaterEmitter)
+{
+   ejectionPeriodMS = 5;
+   periodVarianceMS = 0;
+   ejectionVelocity = 1.0;
+   ejectionOffset = 0.1;
+   velocityVariance = 0.5;
+   thetaMin = 0.0;
+   thetaMax = 80.0;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvances = false;
+   particles = GrenadeTrailWaterParticle;
+};
+
+// ----------------------------------------------------------------------------
+// Normal-fire Projectile Object
+// ----------------------------------------------------------------------------
+
+datablock ParticleData(GrenadeProjSmokeTrail)
+{
+   textureName = "art/shapes/particles/smoke";
+   dragCoeffiecient = 0.0;
+   gravityCoefficient = -0.2;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 750;
+   lifetimeVarianceMS = 250;
+   useInvAlpha = true;
+   spinRandomMin = -60;
+   spinRandomMax = 60;
+   spinSpeed = 1;
+
+   colors[0] = "0.9 0.8 0.8 0.6";
+   colors[1] = "0.6 0.6 0.6 0.9";
+   colors[2] = "0.3 0.3 0.3 0";
+
+   sizes[0] = 0.25;
+   sizes[1] = 0.5;
+   sizes[2] = 0.75;
+
+   times[0] = 0.0;
+   times[1] = 0.4;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(GrenadeProjSmokeTrailEmitter)
+{
+   ejectionPeriodMS = 10;
+   periodVarianceMS = 0;
+   ejectionVelocity = 0.75;
+   velocityVariance = 0;
+   thetaMin = 0.0;
+   thetaMax = 0.0;
+   phiReferenceVel = 90;
+   phiVariance = 0;
+   particles = "GrenadeProjSmokeTrail";
+};
+
+datablock ProjectileData(GrenadeLauncherProjectile)
+{
+   projectileShapeName = "art/shapes/weapons/GrenadeLauncher/rocket.dts";
+   directDamage = 30;
+   radiusDamage = 30;
+   damageRadius = 5;
+   areaImpulse = 2000;
+
+   explosion = GrenadeLauncherExplosion;
+   waterExplosion = GrenadeLauncherWaterExplosion;
+
+   decal = ScorchRXDecal;
+   splash = GrenadeSplash;
+
+   particleEmitter = GrenadeProjSmokeTrailEmitter;
+   particleWaterEmitter = GrenadeTrailWaterEmitter;
+
+   muzzleVelocity = 30;
+   velInheritFactor = 0.3;
+
+   armingDelay = 2000;
+   lifetime = 10000;
+   fadeDelay = 4500;
+
+   bounceElasticity = 0.4;
+   bounceFriction = 0.3;
+   isBallistic = true;
+   gravityMod = 0.9;
+
+   lightDesc = GrenadeLauncherLightDesc;
+
+   damageType = "GrenadeDamage";
+};
+
+// ----------------------------------------------------------------------------
+// Underwater Projectile
+// ----------------------------------------------------------------------------
+
+datablock ProjectileData(GrenadeWetProjectile)
+{
+   projectileShapeName = "art/shapes/weapons/GrenadeLauncher/rocket.dts";
+   directDamage = 20;
+   radiusDamage = 10;
+   damageRadius = 10;
+   areaImpulse = 2000;
+
+   explosion = GrenadeLauncherWaterExplosion;
+
+   particleEmitter = GrenadeProjSmokeTrailEmitter;
+   particleWaterEmitter = GrenadeTrailWaterEmitter;
+
+   muzzleVelocity = 10;
+   velInheritFactor = 0.3;
+
+   armingDelay = 2000;
+   lifetime = 10000;
+   fadeDelay = 4500;
+
+   bounceElasticity = 0.2;
+   bounceFriction = 0.4;
+   isBallistic = true;
+   gravityMod = 0.80;
+
+   lightDesc = GrenadeLauncherWaterLightDesc;
+
+   damageType = "GrenadeDamage";
+};
+
+// ----------------------------------------------------------------------------
+// Ammo Item
+// ----------------------------------------------------------------------------
+
+datablock ItemData(GrenadeLauncherAmmo)
+{
+   // Mission editor category
+   category = "Ammo";
+
+   // Add the Ammo namespace as a parent. The ammo namespace provides
+   // common ammo related functions and hooks into the inventory system.
+   className = "Ammo";
+
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/GrenadeLauncher/debris.dts";
+   mass = 2;
+   elasticity = 0.2;
+   friction = 0.6;
+
+   // Dynamic properties defined by the scripts
+   pickUpName = "Grenades";
+   maxInventory = 20;
+};

+ 1250 - 0
Templates/Full PhysX/game/art/datablocks/weapons/rocketLauncher.cs

@@ -0,0 +1,1250 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+// RocketLauncher weapon.
+// This script file contains all of the necessary datablocks needed for the
+// RocketLauncher.  These datablocks include sound profiles, light descriptions,
+// particle effects, explosions, projectiles, items (weapon and ammo), shell
+// casings (if any), and finally the weapon image which contains the state
+// machine that determines how the weapon operates.
+
+// The main "fire" method/mode is handled in "../scripts/server/weapons.cs"
+// through a "WeaponImage" namespace function.  This reduces duplicated code,
+// although a unique fire method could still be implemented for this weapon.
+
+// The "alt-fire" method/mode is handled in "../scripts/server/rocketlaucner.cs".
+// Alt-fire for the Rocketlauncher allows you to "charge up" the number of
+// projectiles, up to 3, that get fired.  Hold to increase the number of shots
+// and release to fire.  After three shots are loaded and in the pipe, the
+// weapon will automatically discharge on it's own.
+
+// ----------------------------------------------------------------------------
+// Sound profiles
+// ----------------------------------------------------------------------------
+
+datablock SFXProfile(RocketLauncherReloadSound)
+{
+   filename = "art/sound/weapons/Crossbow_reload";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock SFXProfile(RocketLauncherFireSound)
+{
+   filename = "art/sound/weapons/explosion_mono_01";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock SFXProfile(RocketLauncherIncLoadSound)
+{
+   filename = "art/sound/weapons/relbow_mono_01";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock SFXProfile(RocketLauncherFireEmptySound)
+{
+   filename = "art/sound/weapons/Crossbow_firing_empty";
+   description = AudioClose3d;
+   preload = true;
+};
+
+datablock SFXProfile(RocketLauncherExplosionSound)
+{
+   filename = "art/sound/weapons/Crossbow_explosion";
+   description = AudioDefault3d;
+   preload = true;
+};
+
+// ----------------------------------------------------------------------------
+// Lights for the projectile(s)
+// ----------------------------------------------------------------------------
+
+datablock LightDescription(RocketLauncherLightDesc)
+{
+   range = 4.0;
+   color = "1 1 0";
+   brightness = 5.0;
+   animationType = PulseLightAnim;
+   animationPeriod = 0.25;
+   //flareType = SimpleLightFlare0;
+};
+
+datablock LightDescription(RocketLauncherWaterLightDesc)
+{
+   radius = 2.0;
+   color = "1 1 1";
+   brightness = 5.0;
+   animationType = PulseLightAnim;
+   animationPeriod = 0.25;
+   //flareType = SimpleLightFlare0;
+};
+
+//----------------------------------------------------------------------------
+// Debris
+//----------------------------------------------------------------------------
+
+datablock ParticleData(RocketDebrisTrailParticle)
+{
+   textureName = "art/shapes/particles/impact";
+   dragCoeffiecient = 0;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 1200;//1000;
+   lifetimeVarianceMS = 299;//500;
+   useInvAlpha = true;//false;
+   spinSpeed = 1;
+   spinRandomMin = -300.0;
+   spinRandomMax = 0;
+   colors[0] = "1 0.897638 0.795276 0.4";
+   colors[1] = "0.795276 0.795276 0.795276 0.6";
+   colors[2] = "0 0 0 0";
+   sizes[0] = 0.5;//1.0;
+   sizes[1] = 2;
+   sizes[2] = 1;//1.0;
+   times[0] = 0.0;
+   times[1] = 0.498039;
+   times[2] = 1.0;
+   animTexName = "art/shapes/particles/impact";
+   times[3] = "1";
+};
+
+datablock ParticleEmitterData(RocketDebrisTrailEmitter)
+{
+   ejectionPeriodMS = 6;//8;
+   periodVarianceMS = 2;//4;
+   ejectionVelocity = 1.0;
+   velocityVariance = 0.5;
+   thetaMin = 0.0;
+   thetaMax = 180.0;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   ejectionoffset = 0.0;//0.3;
+   particles = "RocketDebrisTrailParticle";
+};
+
+datablock DebrisData(RocketDebris)
+{
+   shapeFile = "art/shapes/weapons/SwarmGun/rocket.dts";
+   emitters[0] = RocketDebrisTrailEmitter;
+   elasticity = 0.5;
+   friction = 0.5;
+   numBounces = 1;//2;
+   bounceVariance = 1;
+   explodeOnMaxBounce = true;
+   staticOnMaxBounce = false;
+   snapOnMaxBounce = false;
+   minSpinSpeed = 400;
+   maxSpinSpeed = 800;
+   render2D = false;
+   lifetime = 0.25;//0.5;//1;//2;
+   lifetimeVariance = 0.0;//0.25;//0.5;
+   velocity = 35;//30;//15;
+   velocityVariance = 10;//5;
+   fade = true;
+   useRadiusMass = true;
+   baseRadius = 0.3;
+   gravModifier = 1.0;
+   terminalVelocity = 45;
+   ignoreWater = false;
+};
+
+// ----------------------------------------------------------------------------
+// Splash effects
+// ----------------------------------------------------------------------------
+
+datablock ParticleData(RocketSplashMist)
+{
+   dragCoefficient = 1.0;
+   windCoefficient = 2.0;
+   gravityCoefficient = 0.3;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 600;
+   lifetimeVarianceMS = 100;
+   useInvAlpha = false;
+   spinRandomMin = -90.0;
+   spinRandomMax = 500.0;
+   spinSpeed = 1;
+   textureName = "art/shapes/particles/smoke";
+   colors[0] = "0.7 0.8 1.0 1.0";
+   colors[1] = "0.7 0.8 1.0 0.5";
+   colors[2] = "0.7 0.8 1.0 0.0";
+   sizes[0] = 0.2;//0.5;
+   sizes[1] = 0.4;//0.5;
+   sizes[2] = 0.8;
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(RocketSplashMistEmitter)
+{
+   ejectionPeriodMS = 5;
+   periodVarianceMS = 0;
+   ejectionVelocity = 3.0;
+   velocityVariance = 2.0;
+   ejectionOffset = 0.15;
+   thetaMin = 85;
+   thetaMax = 85;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvance = false;
+   lifetimeMS = 250;
+   particles = "RocketSplashMist";
+};
+
+datablock ParticleData(RocketSplashParticle)
+{
+   dragCoefficient = 1;
+   windCoefficient = 0.9;
+   gravityCoefficient = 0.3;
+   inheritedVelFactor = 0.2;
+   constantAcceleration = -1.4;
+   lifetimeMS = 600;
+   lifetimeVarianceMS = 200;
+   textureName = "art/shapes/particles/droplet";
+   colors[0] = "0.7 0.8 1.0 1.0";
+   colors[1] = "0.7 0.8 1.0 0.5";
+   colors[2] = "0.7 0.8 1.0 0.0";
+   sizes[0] = 0.5;
+   sizes[1] = 0.25;
+   sizes[2] = 0.25;
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(RocketSplashEmitter)
+{
+   ejectionPeriodMS = 4;
+   periodVarianceMS = 0;
+   ejectionVelocity = 7.3;
+   velocityVariance = 2.0;
+   ejectionOffset = 0.0;
+   thetaMin = 30;
+   thetaMax = 80;
+   phiReferenceVel = 00;
+   phiVariance = 360;
+   overrideAdvance = false;
+   orientParticles = true;
+   orientOnVelocity = true;
+   lifetimeMS = 100;
+   particles = "RocketSplashParticle";
+};
+
+datablock ParticleData(RocketSplashRingParticle)
+{
+   textureName = "art/shapes/particles/wake";
+   dragCoefficient = 0.0;
+   gravityCoefficient = 0.0;
+   inheritedVelFactor = 0.0;
+   lifetimeMS = 2500;
+   lifetimeVarianceMS = 200;
+   windCoefficient = 0.0;
+   useInvAlpha = 1;
+   spinRandomMin = 30.0;
+   spinRandomMax = 30.0;
+   spinSpeed = 1;
+   animateTexture = true;
+   framesPerSec = 1;
+   animTexTiling = "2 1";
+   animTexFrames = "0 1";
+   colors[0] = "0.7 0.8 1.0 1.0";
+   colors[1] = "0.7 0.8 1.0 0.5";
+   colors[2] = "0.7 0.8 1.0 0.0";
+   sizes[0] = 2.0;
+   sizes[1] = 4.0;
+   sizes[2] = 8.0;
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(RocketSplashRingEmitter)
+{
+   lifetimeMS = "100";
+   ejectionPeriodMS = 200;
+   periodVarianceMS = 10;
+   ejectionVelocity = 0;
+   velocityVariance = 0;
+   ejectionOffset = 0;
+   thetaMin = 89;
+   thetaMax = 90;
+   phiReferenceVel = 0;
+   phiVariance = 1;
+   alignParticles = 1;
+   alignDirection = "0 0 1";
+   particles = "RocketSplashRingParticle";
+};
+
+datablock SplashData(RocketSplash)
+{
+//    numSegments = 15;
+//    ejectionFreq = 15;
+//    ejectionAngle = 40;
+//    ringLifetime = 0.5;
+//    lifetimeMS = 300;
+//    velocity = 4.0;
+//    startRadius = 0.0;
+//    acceleration = -3.0;
+//    texWrap = 5.0;
+//    texture = "art/shapes/particles/splash";
+
+   emitter[0] = RocketSplashEmitter;
+   emitter[1] = RocketSplashMistEmitter;
+   emitter[2] = RocketSplashRingEmitter;
+
+//    colors[0] = "0.7 0.8 1.0 0.0";
+//    colors[1] = "0.7 0.8 1.0 0.3";
+//    colors[2] = "0.7 0.8 1.0 0.7";
+//    colors[3] = "0.7 0.8 1.0 0.0";
+//
+//    times[0] = 0.0;
+//    times[1] = 0.4;
+//    times[2] = 0.8;
+//    times[3] = 1.0;
+};
+
+// ----------------------------------------------------------------------------
+// Explosion Particle effects
+// ----------------------------------------------------------------------------
+
+datablock ParticleData(RocketExpFire)
+{
+   gravityCoefficient = "-0.50061";
+   lifetimeMS = "400";
+   lifetimeVarianceMS = "299";
+   spinSpeed = "1";
+   spinRandomMin = "-200";
+   spinRandomMax = "0";
+   textureName = "art/shapes/particles/smoke";
+   animTexName = "art/shapes/particles/smoke";
+   colors[0] = "1 0.897638 0.795276 1";
+   colors[1] = "0.795276 0.393701 0 0.6";
+   colors[2] = "0 0 0 0";
+   sizes[0] = "1.99902";
+   sizes[1] = "7.99915";
+   sizes[2] = "3.99805";
+   times[1] = "0.392157";
+   times[2] = "1";
+   times[3] = "1";
+};
+
+datablock ParticleEmitterData(RocketExpFireEmitter)
+{
+   ejectionPeriodMS = "10";
+   periodVarianceMS = "5";
+   ejectionVelocity = "3";
+   velocityVariance = "2";
+   particles = "RocketExpFire";
+   blendStyle = "NORMAL";
+};
+
+datablock ParticleData(RocketExpFireball)
+{
+   textureName = "art/shapes/particles/fireball.png";
+   lifetimeMS = "300";
+   lifetimeVarianceMS = "299";
+   spinSpeed = "1";
+   spinRandomMin = "-400";
+   spinRandomMax = "0";
+   animTexName = "art/shapes/particles/fireball.png";
+   colors[0] = "1 0.897638 0.795276 0.2";
+   colors[1] = "1 0.496063 0 0.6";
+   colors[2] = "0.0944882 0.0944882 0.0944882 0";
+   sizes[0] = "0.997986";
+   sizes[1] = "1.99902";
+   sizes[2] = "2.99701";
+   times[1] = "0.498039";
+   times[2] = "1";
+   times[3] = "1";
+   gravityCoefficient = "-1";
+};
+
+datablock ParticleEmitterData(RocketExpFireballEmitter)
+{
+   particles = "RocketExpFireball";
+   blendStyle = "ADDITIVE";
+   ejectionPeriodMS = "10";
+   periodVarianceMS = "5";
+   ejectionVelocity = "4";
+   velocityVariance = "2";
+   ejectionOffset = "2";
+   thetaMax = "120";
+};
+
+datablock ParticleData(RocketExpSmoke)
+{
+   lifetimeMS = 1200;//"1250";
+   lifetimeVarianceMS = 299;//200;//"250";
+   textureName = "art/shapes/particles/smoke";
+   animTexName = "art/shapes/particles/smoke";
+   useInvAlpha = "1";
+   gravityCoefficient = "-0.100122";
+   spinSpeed = "1";
+   spinRandomMin = "-100";
+   spinRandomMax = "0";
+   colors[0] = "0.897638 0.795276 0.692913 0.4";//"0.192157 0.192157 0.192157 0.0944882";
+   colors[1] = "0.897638 0.897638 0.897638 0.8";//"0.454902 0.454902 0.454902 0.897638";
+   colors[2] = "0.4 0.4 0.4 0";//"1 1 1 0";
+   sizes[0] = "1.99597";
+   sizes[1] = "3.99805";
+   sizes[2] = "7.99915";
+   times[1] = "0.494118";
+   times[2] = "1";
+   times[3] = "1";
+};
+
+datablock ParticleEmitterData(RocketExpSmokeEmitter)
+{
+   ejectionPeriodMS = "15";
+   periodVarianceMS = "5";
+   //ejectionOffset = "1";
+   thetaMax = "180";
+   particles = "RocketExpSmoke";
+   blendStyle = "NORMAL";
+};
+
+datablock ParticleData(RocketExpSparks)
+{
+   textureName = "art/shapes/particles/droplet.png";
+   lifetimeMS = "100";
+   lifetimeVarianceMS = "50";
+   animTexName = "art/shapes/particles/droplet.png";
+   inheritedVelFactor = "0.391389";
+   sizes[0] = "1.99902";
+   sizes[1] = "2.49954";
+   sizes[2] = "0.997986";
+   colors[0] = "1.0 0.9 0.8 0.2";
+   colors[1] = "1.0 0.9 0.8 0.8";
+   colors[2] = "0.8 0.4 0.0 0.0";
+   times[0] = "0";
+   times[1] = "0.34902";
+   times[2] = "1";
+   times[3] = "1";
+};
+
+datablock ParticleEmitterData(RocketExpSparksEmitter)
+{
+   particles = "RocketExpSparks";
+   blendStyle = "NORMAL";
+   ejectionPeriodMS = "10";
+   periodVarianceMS = "5";
+   ejectionVelocity = "60";
+   velocityVariance = "10";
+   thetaMax = "120";
+   phiReferenceVel = 0;
+   phiVariance = "360";
+   ejectionOffset = "0";
+   orientParticles = true;
+   orientOnVelocity = true;
+};
+
+datablock ParticleData(RocketExpSubFireParticles)
+{
+   textureName = "art/shapes/particles/fireball.png";
+   gravityCoefficient = "-0.202686";
+   lifetimeMS = "400";
+   lifetimeVarianceMS = "299";
+   spinSpeed = "1";
+   spinRandomMin = "-200";
+   spinRandomMax = "0";
+   animTexName = "art/shapes/particles/fireball.png";
+   colors[0] = "1 0.897638 0.795276 0.2";
+   colors[1] = "1 0.496063 0 1";
+   colors[2] = "0.0944882 0.0944882 0.0944882 0";
+   sizes[0] = "0.997986";
+   sizes[1] = "1.99902";
+   sizes[2] = "2.99701";
+   times[1] = "0.498039";
+   times[2] = "1";
+   times[3] = "1";
+};
+
+datablock ParticleEmitterData(RocketExpSubFireEmitter)
+{
+   particles = "RocketExpSubFireParticles";
+   blendStyle = "ADDITIVE";
+   ejectionPeriodMS = "10";
+   periodVarianceMS = "5";
+   ejectionVelocity = "4";
+   velocityVariance = "2";
+   thetaMax = "120";
+};
+
+datablock ParticleData(RocketExpSubSmoke)
+{
+   textureName = "art/shapes/particles/smoke";
+   gravityCoefficient = "-0.40293";
+   lifetimeMS = "800";
+   lifetimeVarianceMS = "299";
+   spinSpeed = "1";
+   spinRandomMin = "-200";
+   spinRandomMax = "0";
+   animTexName = "art/shapes/particles/smoke";
+   colors[0] = "0.4 0.35 0.3 0.393701";
+   colors[1] = "0.45 0.45 0.45 0.795276";
+   colors[2] = "0.4 0.4 0.4 0";
+   sizes[0] = "1.99902";
+   sizes[1] = "3.99805";
+   sizes[2] = "7.99915";
+   times[1] = "0.4";
+   times[2] = "1";
+   times[3] = "1";
+};
+
+datablock ParticleEmitterData(RocketExpSubSmokeEmitter)
+{
+   particles = "RocketExpSubSmoke";
+   ejectionPeriodMS = "30";
+   periodVarianceMS = "10";
+   ejectionVelocity = "2";
+   velocityVariance = "1";
+   ejectionOffset = 1;//"2";
+   blendStyle = "NORMAL";
+};
+
+// ----------------------------------------------------------------------------
+// Water Explosion
+// ----------------------------------------------------------------------------
+
+datablock ParticleData(RLWaterExpDust)
+{
+   textureName = "art/shapes/particles/steam";
+   dragCoefficient = 1.0;
+   gravityCoefficient = -0.01;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 2500;
+   lifetimeVarianceMS = 250;
+   useInvAlpha = false;
+   spinSpeed = 1;
+   spinRandomMin = -90.0;
+   spinRandomMax = 500.0;
+   colors[0] = "0.6 0.6 1.0 0.5";
+   colors[1] = "0.6 0.6 1.0 0.3";
+   sizes[0] = 0.25;
+   sizes[1] = 1.5;
+   times[0] = 0.0;
+   times[1] = 1.0;
+};
+
+datablock ParticleEmitterData(RLWaterExpDustEmitter)
+{
+   ejectionPeriodMS = 1;
+   periodVarianceMS = 0;
+   ejectionVelocity = 10;
+   velocityVariance = 0.0;
+   ejectionOffset = 0.0;
+   thetaMin = 85;
+   thetaMax = 85;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvances = false;
+   lifetimeMS = 75;
+   particles = "RLWaterExpDust";
+};
+
+datablock ParticleData(RLWaterExpSparks)
+{
+   textureName = "art/shapes/particles/spark_wet";
+   dragCoefficient = 1;
+   gravityCoefficient = 0.0;
+   inheritedVelFactor = 0.2;
+   constantAcceleration = 0.0;
+   lifetimeMS = 500;
+   lifetimeVarianceMS = 250;
+   colors[0] = "0.6 0.6 1.0 1.0";
+   colors[1] = "0.6 0.6 1.0 1.0";
+   colors[2] = "0.6 0.6 1.0 0.0";
+   sizes[0] = 0.5;
+   sizes[1] = 0.5;
+   sizes[2] = 0.75;
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(RLWaterExpSparkEmitter)
+{
+   ejectionPeriodMS = 2;
+   periodVarianceMS = 0;
+   ejectionVelocity = 12;
+   velocityVariance = 6.75;
+   ejectionOffset = 0.0;
+   thetaMin = 0;
+   thetaMax = 60;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvances = false;
+   orientParticles = true;
+   lifetimeMS = 100;
+   particles = "RLWaterExpSparks";
+};
+
+datablock ParticleData(RLWaterExpSmoke)
+{
+   textureName = "art/shapes/particles/smoke";
+   dragCoeffiecient = 0.4;
+   gravityCoefficient = -0.25;
+   inheritedVelFactor = 0.025;
+   constantAcceleration = -1.1;
+   lifetimeMS = 1250;
+   lifetimeVarianceMS = 0;
+   useInvAlpha = false;
+   spinSpeed = 1;
+   spinRandomMin = -200.0;
+   spinRandomMax = 200.0;
+   colors[0] = "0.1 0.1 1.0 1.0";
+   colors[1] = "0.4 0.4 1.0 1.0";
+   colors[2] = "0.4 0.4 1.0 0.0";
+   sizes[0] = 2.0;
+   sizes[1] = 6.0;
+   sizes[2] = 2.0;
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(RLWaterExpSmokeEmitter)
+{
+   ejectionPeriodMS = 15;
+   periodVarianceMS = 0;
+   ejectionVelocity = 6.25;
+   velocityVariance = 0.25;
+   thetaMin = 0.0;
+   thetaMax = 90.0;
+   lifetimeMS = 250;
+   particles = "RLWaterExpSmoke";
+};
+
+datablock ParticleData(RLWaterExpBubbles)
+{
+   textureName = "art/shapes/particles/millsplash01";
+   dragCoefficient = 0.0;
+   gravityCoefficient = -0.05;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 1500;
+   lifetimeVarianceMS = 250;
+   useInvAlpha = false;
+   spinRandomMin = -100.0;
+   spinRandomMax = 100.0;
+   spinSpeed = 1;
+   colors[0] = "0.7 0.8 1.0 0.0";
+   colors[1] = "0.7 0.8 1.0 0.4";
+   colors[2] = "0.7 0.8 1.0 0.0";
+   sizes[0] = 0.2;
+   sizes[1] = 0.4;
+   sizes[2] = 0.8;
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(RLWaterExpBubbleEmitter)
+{
+   ejectionPeriodMS = 5;
+   periodVarianceMS = 0;
+   ejectionVelocity = 1.0;
+   ejectionOffset = 3.0;
+   velocityVariance = 0.5;
+   thetaMin = 0;
+   thetaMax = 80;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvances = false;
+   particles = "RLWaterExpBubbles";
+};
+
+datablock ExplosionData(RocketLauncherWaterExplosion)
+{
+   //soundProfile = RLWaterExplosionSound;
+
+   emitter[0] = RLWaterExpDustEmitter;
+   emitter[1] = RLWaterExpSparkEmitter;
+   emitter[2] = RLWaterExpSmokeEmitter;
+   emitter[3] = RLWaterExpBubbleEmitter;
+
+   shakeCamera = true;
+   camShakeFreq = "10.0 11.0 9.0";
+   camShakeAmp = "20.0 20.0 20.0";
+   camShakeDuration = 1.5;
+   camShakeRadius = 20.0;
+
+   lightStartRadius = 20.0;
+   lightEndRadius = 0.0;
+   lightStartColor = "0.9 0.9 0.8";
+   lightEndColor = "0.6 0.6 1.0";
+   lightStartBrightness = 2.0;
+   lightEndBrightness = 0.0;
+};
+
+// ----------------------------------------------------------------------------
+// Dry/Air Explosion Objects
+// ----------------------------------------------------------------------------
+
+datablock ExplosionData(RocketSubExplosion)
+{
+   lifeTimeMS = 100;
+   offset = 0.4;
+   emitter[0] = RocketExpSubFireEmitter;
+   emitter[1] = RocketExpSubSmokeEmitter;
+};
+
+
+datablock ExplosionData(RocketLauncherExplosion)
+{
+   soundProfile = RocketLauncherExplosionSound;
+   lifeTimeMS = 200; // I want a quick bang and dissipation, not a slow burn-out
+
+   // Volume particles
+   particleEmitter = RocketExpSmokeEmitter;
+   particleDensity = 10;//20;
+   particleRadius = 1;//2;
+
+   // Point emission
+   emitter[0] = RocketExpFireEmitter;
+   emitter[1] = RocketExpSparksEmitter;
+   emitter[2] = RocketExpSparksEmitter;
+   emitter[3] = RocketExpFireballEmitter;
+
+   // Sub explosion objects
+   subExplosion[0] = RocketSubExplosion;
+
+   // Camera Shaking
+   shakeCamera = true;
+   camShakeFreq = "10.0 11.0 9.0";
+   camShakeAmp = "15.0 15.0 15.0";
+   camShakeDuration = 1.5;
+   camShakeRadius = 20;
+
+   // Exploding debris
+   debris = RocketDebris;
+   debrisThetaMin = 0;//10;
+   debrisThetaMax = 90;//80;
+   debrisNum = 5;
+   debrisNumVariance = 2;
+   debrisVelocity = 1;//2;
+   debrisVelocityVariance = 0.2;//0.5;
+
+   lightStartRadius = 6.0;
+   lightEndRadius = 0.0;
+   lightStartColor = "1.0 0.7 0.2";
+   lightEndColor = "0.9 0.7 0.0";
+   lightStartBrightness = 2.5;
+   lightEndBrightness = 0.0;
+   lightNormalOffset = 3.0;
+};
+
+// ----------------------------------------------------------------------------
+// Underwater Rocket projectile trail
+// ----------------------------------------------------------------------------
+
+datablock ParticleData(RocketTrailWaterParticle)
+{
+   textureName = "art/shapes/particles/bubble";
+   dragCoefficient = 0.0;
+   gravityCoefficient = 0.1;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 1500;
+   lifetimeVarianceMS = 600;
+   useInvAlpha = false;
+   spinRandomMin = -100.0;
+   spinRandomMax = 100.0;
+   spinSpeed = 1;
+
+   colors[0] = "0.7 0.8 1.0 1.0";
+   colors[1] = "0.7 0.8 1.0 0.4";
+   colors[2] = "0.7 0.8 1.0 0.0";
+
+   sizes[0] = 0.05;
+   sizes[1] = 0.05;
+   sizes[2] = 0.05;
+
+   times[0] = 0.0;
+   times[1] = 0.5;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(RocketTrailWaterEmitter)
+{
+   ejectionPeriodMS = 5;
+   periodVarianceMS = 0;
+   ejectionVelocity = 1.0;
+   ejectionOffset = 0.1;
+   velocityVariance = 0.5;
+   thetaMin = 0.0;
+   thetaMax = 80.0;
+   phiReferenceVel = 0;
+   phiVariance = 360;
+   overrideAdvances = false;
+   particles = RocketTrailWaterParticle;
+};
+
+// ----------------------------------------------------------------------------
+// Normal-fire Projectile Object
+// ----------------------------------------------------------------------------
+
+datablock ParticleData(RocketProjSmokeTrail)
+{
+   textureName = "art/shapes/particles/smoke";
+   dragCoeffiecient = 0;
+   gravityCoefficient = -0.202686;
+   inheritedVelFactor = 0.0;
+   constantAcceleration = 0.0;
+   lifetimeMS = 750;
+   lifetimeVarianceMS = 749;
+   useInvAlpha = true;
+   spinRandomMin = -60;
+   spinRandomMax = 0;
+   spinSpeed = 1;
+
+   colors[0] = "0.3 0.3 0.3 0.598425";
+   colors[1] = "0.9 0.9 0.9 0.897638";
+   colors[2] = "0.9 0.9 0.9 0";
+
+   sizes[0] = 0.247207;
+   sizes[1] = 0.497467;
+   sizes[2] = 0.747726;
+
+   times[0] = 0.0;
+   times[1] = 0.4;
+   times[2] = 1.0;
+   animTexName = "art/shapes/particles/smoke";
+   times[3] = "1";
+};
+
+datablock ParticleEmitterData(RocketProjSmokeTrailEmitter)
+{
+   ejectionPeriodMS = 1;
+   periodVarianceMS = 0;
+   ejectionVelocity = 0.75;
+   velocityVariance = 0;
+   thetaMin = 0.0;
+   thetaMax = 0.0;
+   phiReferenceVel = 90;
+   phiVariance = 0;
+   particles = "RocketProjSmokeTrail";
+};
+
+datablock ProjectileData(RocketLauncherProjectile)
+{
+   projectileShapeName = "art/shapes/weapons/SwarmGun/rocket.dts";
+   directDamage = 30;
+   radiusDamage = 30;
+   damageRadius = 5;
+   areaImpulse = 2500;
+
+   explosion = RocketLauncherExplosion;
+   waterExplosion = RocketLauncherWaterExplosion;
+
+   decal = ScorchRXDecal;
+   splash = RocketSplash;
+
+   particleEmitter = RocketProjSmokeTrailEmitter;
+   particleWaterEmitter = RocketTrailWaterEmitter;
+
+   muzzleVelocity = 100;
+   velInheritFactor = 0.3;
+
+   armingDelay = 0;
+   lifetime = 5000; //(500m / 100m/s = 5000ms)
+   fadeDelay = 4500;
+
+   bounceElasticity = 0;
+   bounceFriction = 0;
+   isBallistic = false;
+   gravityMod = 0.80;
+
+   lightDesc = RocketLauncherLightDesc;
+
+   damageType = "RocketDamage";
+};
+
+// ----------------------------------------------------------------------------
+// Underwater Projectile
+// ----------------------------------------------------------------------------
+
+datablock ProjectileData(RocketWetProjectile)
+{
+   projectileShapeName = "art/shapes/weapons/SwarmGun/rocket.dts";
+   directDamage = 20;
+   radiusDamage = 10;
+   damageRadius = 10;
+   areaImpulse = 2000;
+
+   explosion = RocketLauncherWaterExplosion;
+
+   particleEmitter = RocketProjSmokeTrailEmitter;
+   particleWaterEmitter = RocketTrailWaterEmitter;
+
+   muzzleVelocity = 20;
+   velInheritFactor = 0.3;
+
+   armingDelay = 0;
+   lifetime = 5000; //(500m / 100m/s = 5000ms)
+   fadeDelay = 4500;
+
+   bounceElasticity = 0.2;
+   bounceFriction = 0.4;
+   isBallistic = true;
+   gravityMod = 0.80;
+
+   lightDesc = RocketLauncherWaterLightDesc;
+
+   damageType = "RocketDamage";
+};
+
+// ----------------------------------------------------------------------------
+// Shell that's ejected during reload.
+// ----------------------------------------------------------------------------
+
+datablock DebrisData(RocketlauncherShellCasing)
+{
+   shapeFile = "art/shapes/weapons/SwarmGun/rocket.dts";
+   lifetime = 6.0;
+   minSpinSpeed = 300.0;
+   maxSpinSpeed = 400.0;
+   elasticity = 0.65;
+   friction = 0.05;
+   numBounces = 5;
+   staticOnMaxBounce = true;
+   snapOnMaxBounce = false;
+   fade = true;
+};
+
+// ----------------------------------------------------------------------------
+// Particle Emitter played when firing.
+// ----------------------------------------------------------------------------
+
+datablock ParticleData(RocketLauncherfiring1Particle)
+{
+   textureName = "art/shapes/particles/Fireball";
+   dragCoefficient = 100.0;
+   gravityCoefficient = -0.25;//-0.5;//0.0;
+   inheritedVelFactor = 0.25;//1.0;
+   constantAcceleration = 0.1;
+   lifetimeMS = 400;
+   lifetimeVarianceMS = 100;
+   useInvAlpha = false;
+   spinSpeed = 1;
+   spinRandomMin = -200;
+   spinRandomMax = 200;
+   colors[0] = "1 0.9 0.8 0.1";
+   colors[1] = "1 0.5 0 0.3";
+   colors[2] = "0.1 0.1 0.1 0";
+   sizes[0] = 0.2;//1;
+   sizes[1] = 0.25;//0.15;//0.75;
+   sizes[2] = 0.3;//0.1;//0.5;
+   times[0] = 0.0;
+   times[1] = 0.5;//0.294118;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(RocketLauncherfiring1Emitter)
+{
+   ejectionPeriodMS = 15;//75;
+   periodVarianceMS = 5;
+   ejectionVelocity = 1;
+   ejectionOffset = 0.0;
+   velocityVariance = 0;
+   thetaMin = 0.0;
+   thetaMax = 180;//10.0;
+   particles = "RocketLauncherfiring1Particle";
+   blendStyle = "ADDITIVE";
+};
+
+datablock ParticleData(RocketLauncherfiring2Particle)
+{
+   textureName = "art/shapes/particles/impact";
+   dragCoefficient = 100.0;
+   gravityCoefficient = -0.5;//0.0;
+   inheritedVelFactor = 0.25;//1.0;
+   constantAcceleration = 0.1;
+   lifetimeMS = 1600;//400;
+   lifetimeVarianceMS = 400;//100;
+   useInvAlpha = false;
+   spinSpeed = 1;
+   spinRandomMin = -200;
+   spinRandomMax = 200;
+   colors[0] = "0.4 0.4 0.4 0.2";
+   colors[1] = "0.4 0.4 0.4 0.1";
+   colors[2] = "0.0 0.0 0.0 0.0";
+   sizes[0] = 0.2;//1;
+   sizes[1] = 0.15;//0.75;
+   sizes[2] = 0.1;//0.5;
+   times[0] = 0.0;
+   times[1] = 0.5;//0.294118;
+   times[2] = 1.0;
+};
+
+datablock ParticleEmitterData(RocketLauncherfiring2Emitter)
+{
+   ejectionPeriodMS = 15;//75;
+   periodVarianceMS = 5;
+   ejectionVelocity = 1;
+   ejectionOffset = 0.0;
+   velocityVariance = 0;
+   thetaMin = 0.0;
+   thetaMax = 180;//10.0;
+   particles = "RocketLauncherfiring2Particle";
+   blendStyle = "NORMAL";
+};
+
+// ----------------------------------------------------------------------------
+// Ammo Item
+// ----------------------------------------------------------------------------
+
+datablock ItemData(RocketLauncherAmmo)
+{
+   // Mission editor category
+   category = "Ammo";
+
+   // Add the Ammo namespace as a parent. The ammo namespace provides
+   // common ammo related functions and hooks into the inventory system.
+   className = "Ammo";
+
+   // Basic Item properties
+   shapeFile = "art/shapes/weapons/SwarmGun/rocket.dts";
+   mass = 2;
+   elasticity = 0.2;
+   friction = 0.6;
+
+   // Dynamic properties defined by the scripts
+   pickUpName = "Rockets";
+   maxInventory = 20;
+};
+
+// ----------------------------------------------------------------------------
+// Weapon Item. This is the item that exists in the world,
+// i.e. when it's been dropped, thrown or is acting as re-spawnable item.
+// When the weapon is mounted onto a shape, the Image is used.
+// ----------------------------------------------------------------------------
+
+datablock ItemData(RocketLauncher)
+{
+   // Mission editor category
+   category = "Weapon";
+
+   // Hook into Item Weapon class hierarchy. The weapon namespace
+   // provides common weapon handling functions in addition to hooks
+   // into the inventory system.
+   className = "Weapon";
+
+   // Basic Item properties
+   shapefile = "art/shapes/weapons/SwarmGun/swarmgun.dts";
+   mass = 5;
+   elasticity = 0.2;
+   friction = 0.6;
+   emap = true;
+
+   // Dynamic properties defined by the scripts
+   pickUpName = "SwarmGun";
+   description = "RocketLauncher";
+   image = RocketLauncherImage;
+
+   // weaponHUD
+   previewImage = 'swarmer.png';
+   reticle = 'reticle_rocketlauncher';
+   zoomReticle = 'bino';
+};
+
+// ----------------------------------------------------------------------------
+// Image which does all the work. Images do not normally exist in
+// the world, they can only be mounted on ShapeBase objects.
+// ----------------------------------------------------------------------------
+
+datablock ShapeBaseImageData(RocketLauncherImage)
+{
+   // Basic Item properties
+   shapefile = "art/shapes/weapons/SwarmGun/swarmgun.dts";
+   emap = true;
+
+   // Specify mount point & offset for 3rd person, and eye offset
+   // for first person rendering.
+   mountPoint = 0;
+   offset = "0.0 0.15 0.025";
+   eyeOffset = "0.25 0.6 -0.4"; // 0.25=right/left 0.5=forward/backward, -0.5=up/down
+
+   // When firing from a point offset from the eye, muzzle correction
+   // will adjust the muzzle vector to point to the eye LOS point.
+   // Since this weapon doesn't actually fire from the muzzle point,
+   // we need to turn this off.
+   correctMuzzleVector = false;
+
+   // Add the WeaponImage namespace as a parent, WeaponImage namespace
+   // provides some hooks into the inventory system.
+   className = "WeaponImage";
+
+   // Projectile && Ammo.
+   item = RocketLauncher;
+   ammo = RocketLauncherAmmo;
+   projectile = RocketLauncherProjectile;
+   wetProjectile = RocketWetProjectile;
+   projectileType = Projectile;
+
+   // shell casings
+   casing = RocketlauncherShellCasing;
+   shellExitDir = "1.0 0.3 1.0";
+   shellExitOffset = "0.15 -0.56 -0.1";
+   shellExitVariance = 15.0;
+   shellVelocity = 3.0;
+
+   // Let there be light - NoLight, ConstantLight, PulsingLight, WeaponFireLight.
+   lightType = "WeaponFireLight";
+   lightColor = "1.0 1.0 0.9";
+   lightDuration = 200;
+   lightRadius = 10;
+
+   // Images have a state system which controls how the animations
+   // are run, which sounds are played, script callbacks, etc. This
+   // state system is downloaded to the client so that clients can
+   // predict state changes and animate accordingly. The following
+   // system supports basic ready->fire->reload transitions as
+   // well as a no-ammo->dryfire idle state.
+
+   // Initial start up state
+   stateName[0] = "Preactivate";
+   stateTransitionOnLoaded[0] = "Activate";
+   stateTransitionOnNoAmmo[0] = "NoAmmo";
+
+   // Activating the gun.
+   // Called when the weapon is first mounted and there is ammo.
+   stateName[1] = "Activate";
+   stateTransitionOnTimeout[1] = "Ready";
+   stateTimeoutValue[1] = 0.6;
+   stateSequence[1] = "Activate";
+
+   // Ready to fire, just waiting for the trigger
+   stateName[2] = "Ready";
+   stateTransitionOnNoAmmo[2] = "NoAmmo";
+   stateTransitionOnTriggerDown[2] = "CheckWet";
+   stateTransitionOnAltTriggerDown[2] = "CheckWetAlt";
+   stateSequence[2] = "Ready";
+
+   // Fire the weapon. Calls the fire script which does the actual work.
+   stateName[3] = "Fire";
+   stateTransitionOnTimeout[3] = "PostFire";
+   stateTimeoutValue[3] = 0.9;
+   stateFire[3] = true;
+   stateRecoil[3] = LightRecoil;
+   stateAllowImageChange[3] = false;
+   stateSequence[3] = "Fire";
+   stateScript[3] = "onFire";
+   stateSound[3] = RocketLauncherFireSound;
+   stateEmitter[3] = RocketLauncherfiring1Emitter;
+   stateEmitterTime[3] = 0.6;
+
+   // Check ammo
+   stateName[4] = "PostFire";
+   stateTransitionOnAmmo[4] = "Reload";
+   stateTransitionOnNoAmmo[4] = "NoAmmo";
+
+   // Play the reload animation, and transition into
+   stateName[5] = "Reload";
+   stateTransitionOnTimeout[5] = "Ready";
+   stateTimeoutValue[5] = 0.9;
+   stateAllowImageChange[5] = false;
+   stateSequence[5] = "Reload";
+   stateEjectShell[5] = false; // set to true to enable shell casing eject
+   stateSound[5] = RocketLauncherReloadSound;
+   stateEmitter[5] = RocketLauncherfiring2Emitter;
+   stateEmitterTime[5] = 2.4;
+
+   // No ammo in the weapon, just idle until something shows up.
+   // Play the dry fire sound if the trigger iS pulled.
+   stateName[6] = "NoAmmo";
+   stateTransitionOnAmmo[6] = "Reload";
+   stateSequence[6] = "NoAmmo";
+   stateTransitionOnTriggerDown[6] = "DryFire";
+
+   // No ammo dry fire
+   stateName[7] = "DryFire";
+   stateTimeoutValue[7] = 1.0;
+   stateTransitionOnTimeout[7] = "NoAmmo";
+   stateSound[7] = RocketLauncherFireEmptySound;
+
+   // Check if wet
+   stateName[8] = "CheckWet";
+   stateTransitionOnWet[8] = "WetFire";
+   stateTransitionOnNotWet[8] = "Fire";
+
+   // Check if alt wet
+   stateName[9] = "CheckWetAlt";
+   stateTransitionOnWet[9] = "WetFire";
+   stateTransitionOnNotWet[9] = "ChargeUp1";
+
+   // Wet fire
+   stateName[10] = "WetFire";
+   stateTransitionOnTimeout[10] = "PostFire";
+   stateTimeoutValue[10] = 0.9;
+   stateFire[10] = true;
+   stateRecoil[10] = LightRecoil;
+   stateAllowImageChange[10] = false;
+   stateSequence[10] = "Fire";
+   stateScript[10] = "onWetFire";
+   stateSound[10] = RocketLauncherFireSound;
+
+   // Begin "charge up", 1 in the pipe
+   stateName[11] = "ChargeUp1";
+   stateScript[11] = "readyLoad";
+   stateSound[11] = RocketLauncherIncLoadSound;
+   stateTransitionOnAltTriggerUp[11] = "AltFire";
+   stateTransitionOnTimeout[11] = "ChargeUp2";
+   stateTimeoutValue[11] = 0.8;
+   stateWaitForTimeout[11] = false;
+
+   // Charge up, 2 in the pipe
+   stateName[12] = "ChargeUp2";
+   stateScript[12] = "incLoad";
+   stateSound[12] = RocketLauncherIncLoadSound;
+   stateTransitionOnAltTriggerUp[12] = "AltFire";
+   stateTransitionOnTimeout[12] = "ChargeUp3";
+   stateTimeoutValue[12] = 0.8;
+   stateWaitForTimeout[12] = false;
+
+   // Charge up, 3 in the pipe
+   stateName[13] = "ChargeUp3";
+   stateScript[13] = "incLoad";
+   stateSound[13] = RocketLauncherIncLoadSound;
+   stateTransitionOnAltTriggerUp[13] = "AltFire";
+   stateTransitionOnTimeout[13] = "Altfire";  // lets force them to fire
+   stateTimeOutValue[13] = 1.2;
+   stateWaitForTimeout[13] = false;
+
+   // Alt-fire
+   stateName[14] = "AltFire";
+   stateTransitionOnTimeout[14] = "PostFire";
+   stateTimeoutValue[14] = 1.2;
+   stateFire[14] = true;
+   stateRecoil[14] = LightRecoil;
+   stateAllowImageChange[14] = false;
+   stateSequence[14] = "Fire";
+   stateScript[14] = "onAltFire";
+   stateSound[14] = RocketLauncherFireSound;
+   stateEmitter[14] = RocketLauncherfiring1Emitter;
+   stateEmitterTime[14] = 1.2;
+};

BIN
Templates/Full PhysX/game/art/decals/Bullet Holes/BulletHole_Glass.dds


BIN
Templates/Full PhysX/game/art/decals/Bullet Holes/BulletHole_Walls.dds


BIN
Templates/Full PhysX/game/art/decals/bullet_hole.png


BIN
Templates/Full PhysX/game/art/decals/defaultblobshadow.png


+ 57 - 0
Templates/Full PhysX/game/art/decals/managedDecalData.cs

@@ -0,0 +1,57 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+// This is the default save location for any Decal datablocks created in the
+// Decal Editor (this script is executed from onServerCreated())
+
+datablock DecalData(ScorchBigDecal)
+{
+   Material = "DECAL_scorch";
+   size = "5.0";
+   lifeSpan = "50000";
+};
+
+datablock DecalData(ScorchRXDecal)
+{
+   Material = "DECAL_RocketEXP";
+   size = "5.0";
+   lifeSpan = "20000";
+   randomize = "1";
+   texRows = "2";
+   texCols = "2";
+   clippingAngle = "80";
+   screenStartRadius = "200";
+   screenEndRadius = "100";
+};
+
+datablock DecalData(bulletHoleDecal)
+{
+   Material = "DECAL_bulletHole";
+   size = "0.25";
+   lifeSpan = "5000";
+   randomize = "1";
+   texRows = "2";
+   texCols = "2";
+   screenStartRadius = "20";
+   screenEndRadius = "5";
+   clippingAngle = "180";
+};

+ 64 - 0
Templates/Full PhysX/game/art/decals/materials.cs

@@ -0,0 +1,64 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+singleton Material(DECAL_scorch)
+{
+   baseTex[0] = "./scorch_decal.png";
+
+   translucent = true;
+   translucentBlendOp = None;
+   translucentZWrite = true;
+   alphaTest = true;
+   alphaRef = 84;
+};
+
+singleton Material(DECAL_RocketEXP)
+{
+   baseTex[0] = "art/decals/rBlast";
+
+   vertColor[0] = true;
+   translucent = true;
+   translucentBlendOp = LerpAlpha;
+   translucentZWrite = true;
+};
+
+singleton Material(DECAL_bulletHole)
+{
+   baseTex[0] = "art/decals/Bullet Holes/BulletHole_Walls.dds";
+
+   vertColor[0] = true;
+   translucent = true;
+   translucentBlendOp = LerpAlpha;
+   translucentZWrite = true;
+};
+
+singleton Material(DECAL_defaultblobshadow)
+{
+   baseTex[0] = "art/decals/defaultblobshadow";
+
+   translucent = true;
+   translucentBlendOp = LerpAlpha;
+   translucentZWrite = true;
+   alphaTest = false;
+   //alphaRef = 64;
+   //emissive[0] = "1";
+};

BIN
Templates/Full PhysX/game/art/decals/rBlast.png


BIN
Templates/Full PhysX/game/art/decals/scorch_decal.png


BIN
Templates/Full PhysX/game/art/environment/grass1.png


BIN
Templates/Full PhysX/game/art/environment/grass2.png


BIN
Templates/Full PhysX/game/art/environment/grass3.png


BIN
Templates/Full PhysX/game/art/environment/plant1.png


BIN
Templates/Full PhysX/game/art/environment/plant2.png


+ 1 - 0
Templates/Full PhysX/game/art/environment/precipitation/rain.dml

@@ -0,0 +1 @@
+rain

BIN
Templates/Full PhysX/game/art/environment/precipitation/rain.png


BIN
Templates/Full PhysX/game/art/environment/precipitation/water_splash.png


+ 58 - 0
Templates/Full PhysX/game/art/forest/brushes.cs

@@ -0,0 +1,58 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+// This is the default save location for any ForestBrush(s) created in 
+// the Forest Editor.
+// This script is executed from ForestEditorPlugin::onWorldEditorStartup().
+
+//--- OBJECT WRITE BEGIN ---
+new SimGroup(ForestBrushGroup) {
+   canSaveDynamicFields = "1";
+
+   new ForestBrush() {
+      internalName = "ExampleForestBrush";
+      canSaveDynamicFields = "1";
+
+      new ForestBrushElement() {
+         internalName = "ExampleElement";
+         canSaveDynamicFields = "1";
+         ForestItemData = "ExampleForestMesh";
+         probability = "1";
+         rotationRange = "360";
+         scaleMin = "1";
+         scaleMax = "2";
+         scaleExponent = "0.2";
+         sinkMin = "0";
+         sinkMax = "0.1";
+         sinkRadius = "0.25";
+         slopeMin = "0";
+         slopeMax = "30";
+         elevationMin = "-10000";
+         elevationMax = "10000";
+         clumpCountMin = "1";
+         clumpCountMax = "1";
+         clumpCountExponent = "1";
+         clumpRadius = "10";
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 40 - 0
Templates/Full PhysX/game/art/forest/managedItemData.cs

@@ -0,0 +1,40 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+// This is the default save location for any TSForestItemData(s) created in the
+// Forest Editor Editor (this script is executed from onServerCreated())
+
+datablock TSForestItemData(ExampleForestMesh)
+{
+   shapeFile = "art/shapes/trees/defaulttree/defaulttree.dae";
+   internalName = "ExampleForestMesh";
+   windScale = "1";
+   trunkBendScale = "0.02";
+   branchAmp = "0.05";
+   detailAmp = "0.1";
+   detailFreq = "0.2";
+   mass = "5";
+   rigidity = "20";
+   dampingCoefficient = "0.2";
+   tightnessCoefficient = "4";
+};
+

+ 109 - 0
Templates/Full PhysX/game/art/gui/CameraGui.gui

@@ -0,0 +1,109 @@
+
+
+//--- OBJECT WRITE BEGIN ---
+new GameTSCtrl(CameraGui) {
+   profile = "GuiContentProfile";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   position = "0 0";
+   extent = "640 480";
+   minExtent = "8 8";
+   visible = "1";
+   cameraZRot = "0";
+   forceFOV = "0";
+      helpTag = "0";
+      noCursor = "1";
+
+   new GuiBitmapCtrl(CenterPrintDlg) {
+      profile = "CenterPrintProfile";
+      horizSizing = "center";
+      vertSizing = "center";
+      position = "45 230";
+      extent = "550 20";
+      minExtent = "8 8";
+      visible = "0";
+      bitmap = "./hudfill";
+      wrap = "0";
+         helpTag = "0";
+
+      new GuiMLTextCtrl(CenterPrintText) {
+         profile = "CenterPrintTextProfile";
+         horizSizing = "center";
+         vertSizing = "center";
+         position = "0 0";
+         extent = "546 12";
+         minExtent = "8 8";
+         visible = "1";
+         lineSpacing = "2";
+         allowColorChars = "0";
+         maxChars = "-1";
+            helpTag = "0";
+      };
+   };
+   new GuiBitmapCtrl(BottomPrintDlg) {
+      profile = "CenterPrintProfile";
+      horizSizing = "center";
+      vertSizing = "top";
+      position = "45 375";
+      extent = "550 20";
+      minExtent = "8 8";
+      visible = "0";
+      bitmap = "./hudfill";
+      wrap = "0";
+         helpTag = "0";
+
+      new GuiMLTextCtrl(BottomPrintText) {
+         profile = "CenterPrintTextProfile";
+         horizSizing = "center";
+         vertSizing = "center";
+         position = "0 0";
+         extent = "546 12";
+         minExtent = "8 8";
+         visible = "1";
+         lineSpacing = "2";
+         allowColorChars = "0";
+         maxChars = "-1";
+            helpTag = "0";
+      };
+   };
+   new GuiBitmapCtrl(LagIcon) {
+      profile = "GuiDefaultProfile";
+      horizSizing = "right";
+      vertSizing = "bottom";
+      position = "572 3";
+      extent = "32 32";
+      minExtent = "8 8";
+      visible = "0";
+      bitmap = "./lagIcon";
+      wrap = "0";
+         helpTag = "0";
+   };
+   new GuiBitmapCtrl() {
+      profile = "GuiDefaultProfile";
+      horizSizing = "right";
+      vertSizing = "bottom";
+      position = "9 8";
+      extent = "181 169";
+      minExtent = "8 2";
+      visible = "1";
+      bitmap = "./tse_float";
+      wrap = "0";
+         helpTag = "0";
+   };
+   new GuiMLTextCtrl() {
+      profile = "GuiTitleProfile";
+      horizSizing = "left";
+      vertSizing = "bottom";
+      position = "428 5";
+      extent = "378 14";
+      minExtent = "8 2";
+      visible = "1";
+      lineSpacing = "2";
+      allowColorChars = "0";
+      maxChars = "-1";
+      text = "<color:ffffff><shadowcolor:000000><shadow:1:1><font:arial bold:14>Version: MS4.2 demo";
+         helpTag = "0";
+         allowSelection = "1";
+   };
+};
+//--- OBJECT WRITE END ---

+ 79 - 0
Templates/Full PhysX/game/art/gui/StartupGui.gui

@@ -0,0 +1,79 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiFadeinBitmapCtrl(StartupGui) {
+   canSaveDynamicFields = "0";
+   Enabled = "1";
+   isContainer = "1";
+   Profile = "GuiInputCtrlProfile";
+   HorizSizing = "right";
+   VertSizing = "bottom";
+   position = "0 0";
+   Extent = "800 600";
+   MinExtent = "8 8";
+   canSave = "1";
+   Visible = "1";
+   tooltipprofile = "GuiToolTipProfile";
+   hovertime = "1000";
+   bitmap = "";
+   wrap = "0";
+   fadeinTime = "1000";
+   waitTime = "4000";
+   fadeoutTime = "1000";
+   done = "1";
+
+   new GuiBitmapButtonCtrl() {
+      canSaveDynamicFields = "1";
+      internalName = "StartupLogo";
+      Enabled = "1";
+      isContainer = "0";
+      Profile = "GuiDefaultProfile";
+      HorizSizing = "center";
+      VertSizing = "center";
+      position = "399 302";
+      Extent = "253  253";
+      MinExtent = "8 2";
+      canSave = "1";
+      Visible = "1";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+      bitmap = "";
+      wrap = "0";
+      command = "StartupGui.click();";
+   };
+   new GuiBitmapButtonCtrl() {
+      canSaveDynamicFields = "1";
+      internalName = "StartupLogoSecondary";
+      Enabled = "1";
+      isContainer = "0";
+      Profile = "GuiDefaultProfile";
+      HorizSizing = "left";
+      VertSizing = "top";
+      position = "275 440";
+      Extent = "530 171";
+      MinExtent = "8 2";
+      canSave = "1";
+      Visible = "1";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+      bitmap = "";
+      wrap = "0";
+      command = "StartupGui.click();";
+   };
+};
+//--- OBJECT WRITE END ---
+//--- OBJECT WRITE BEGIN ---
+new GuiFadeinBitmapCtrl(BlankGui) {
+   profile = "GuiInputCtrlProfile";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   position = "0 0";
+   extent = "800 600";
+   minExtent = "8 8";
+   visible = "1";
+   helpTag = "0";
+   bitmap = "";
+   wrap = "0";
+   fadeinTime = "100";
+   waitTime   = "2000";
+   fadeoutTime = "100";
+};
+//--- OBJECT WRITE END ---

BIN
Templates/Full PhysX/game/art/gui/Torque-3D-logo-w.png


BIN
Templates/Full PhysX/game/art/gui/Torque-3D-logo.png


BIN
Templates/Full PhysX/game/art/gui/Torque-3D-logo_alt.png


BIN
Templates/Full PhysX/game/art/gui/background.png


+ 162 - 0
Templates/Full PhysX/game/art/gui/chatHud.gui

@@ -0,0 +1,162 @@
+//-----------------------------------------------------------------------------
+// Chat edit window
+//-----------------------------------------------------------------------------
+
+new GuiControl(MessageHud)
+{
+   profile = "GuiDefaultProfile";
+   horizSizing = "width";
+   vertSizing = "height";
+   position = "0 0";
+   extent = "640 480";
+   minExtent = "8 8";
+   visible = "0";
+   noCursor = true;
+
+   new GuiBitmapBorderCtrl(MessageHud_Frame) {
+      profile = "ChatHudBorderProfile";
+      horizSizing = "right";
+      vertSizing = "bottom";
+      position = "120 375";
+      extent = "400 40";
+      minExtent = "8 8";
+      visible = "1";
+
+      new GuiBitmapCtrl() {
+         profile = "GuiDefaultProfile";
+         horizSizing = "width";
+         vertSizing = "height";
+         position = "8 8";
+         extent = "384 24";
+         minExtent = "8 8";
+         visible = "1";
+         helpTag = "0";
+         bitmap = "core/art/gui/images/hudfill.png";
+         wrap = "0";
+      };
+
+      new GuiTextCtrl(MessageHud_Text)
+      {
+         profile = "ChatHudTextProfile";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         position = "14 12";
+         extent = "10 22";
+         minExtent = "8 8";
+         visible = "1";
+      };
+
+      new GuiTextEditCtrl(MessageHud_Edit)
+      {
+         profile = "ChatHudEditProfile";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         position = "0 13";
+         extent = "10 22";
+         minExtent = "8 8";
+         visible = "1";
+         altCommand = "$ThisControl.eval();";
+         escapeCommand = "MessageHud_Edit.onEscape();";
+         historySize = "5";
+         maxLength = "120";
+      };
+   };
+};
+//--- OBJECT WRITE BEGIN ---
+new GuiControl(MainChatHud) {
+   profile = "GuiModelessDialogProfile";
+   horizSizing = "width";
+   vertSizing = "height";
+   position = "0 0";
+   extent = "640 480";
+   minExtent = "8 8";
+   visible = "1";
+   helpTag = "0";
+      noCursor = "1";
+
+   new GuiControl() {
+      profile = "GuiModelessDialogProfile";
+      horizSizing = "relative";
+      vertSizing = "bottom";
+      position = "0 0";
+      extent = "400 300";
+      minExtent = "8 8";
+      visible = "1";
+      helpTag = "0";
+
+      new GuiBitmapBorderCtrl(OuterChatHud) {
+         profile = "ChatHudBorderProfile";
+         horizSizing = "width";
+         vertSizing = "bottom";
+         position = "0 0";
+         extent = "272 88";
+         minExtent = "8 8";
+         visible = "1";
+         helpTag = "0";
+            useVariable = "0";
+            tile = "0";
+
+         new GuiBitmapCtrl() {
+            profile = "GuiDefaultProfile";
+            horizSizing = "width";
+            vertSizing = "height";
+            position = "8 8";
+            extent = "256 72";
+            minExtent = "8 8";
+            visible = "1";
+            helpTag = "0";
+            bitmap = "core/art/gui/images/hudfill.png";
+            wrap = "0";
+         };
+
+         new GuiButtonCtrl(chatPageDown) {
+            profile = "GuiButtonProfile";
+            horizSizing = "left";
+            vertSizing = "top";
+            position = "220 58";
+            extent = "36 14";
+            minExtent = "8 8";
+            visible = "0";
+            helpTag = "0";
+            text = "Dwn";
+            groupNum = "-1";
+            buttonType = "PushButton";
+         };
+         new GuiScrollCtrl(ChatScrollHud) {
+            profile = "ChatHudScrollProfile";
+            horizSizing = "width";
+            vertSizing = "height";
+            position = "8 8";
+            extent = "256 72";
+            minExtent = "8 8";
+            visible = "1";
+            helpTag = "0";
+            willFirstRespond = "1";
+            hScrollBar = "alwaysOff";
+            vScrollBar = "alwaysOff";
+            lockHorizScroll = "true";
+            lockVertScroll = "false";
+            constantThumbHeight = "0";
+            childMargin = "0 0";
+
+            new GuiMessageVectorCtrl(ChatHud) {
+               profile = "ChatHudMessageProfile";
+               horizSizing = "width";
+               vertSizing = "height";
+               position = "1 1";
+               extent = "252 16";
+               minExtent = "8 8";
+               visible = "1";
+               helpTag = "0";
+               lineSpacing = "0";
+               lineContinuedIndex = "10";
+               allowedMatches[0] = "http";
+               allowedMatches[1] = "tgeserver";
+               matchColor = "0 0 255 255";
+               maxColorIndex = "5";
+            };
+         };
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 130 - 0
Templates/Full PhysX/game/art/gui/controlsHelpDlg.gui

@@ -0,0 +1,130 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(ControlsHelpDlg) {
+   position = "0 0";
+   Extent = "1024 768";
+   MinExtent = "8 8";
+   horizSizing = "right";
+   vertSizing = "bottom";
+   profile = "GuiModelessDialogProfile";
+   Visible = "1";
+   active = "1";
+   tooltipprofile = "GuiToolTipProfile";
+   hovertime = "1000";
+   isContainer = "1";
+   canSave = "1";
+   canSaveDynamicFields = "1";
+      noCursor = "1";
+
+   new GuiBitmapBorderCtrl() {
+      position = "820 -3";
+      extent = "204 680";
+      minExtent = "8 8";
+      HorizSizing = "left";
+      VertSizing = "bottom";
+      profile = "ChatHudBorderProfile";
+      Visible = "1";
+      active = "1";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "0";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiBitmapCtrl() {
+         bitmap = "art/gui/hudfill.png";
+         wrap = "0";
+         position = "8 8";
+         extent = "188 665";
+         MinExtent = "8 8";
+         horizSizing = "width";
+         vertSizing = "height";
+         profile = "GuiDefaultProfile";
+         Visible = "1";
+         active = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiMLTextCtrl(ControlsText) {
+         lineSpacing = "2";
+         allowColorChars = "0";
+         maxChars = "-1";
+         text = "This is a test";
+         useURLMouseCursor = "0";
+         position = "12 10";
+         extent = "180 652";
+         MinExtent = "8 8";
+         horizSizing = "width";
+         vertSizing = "relative";
+         profile = "HudTextNormalProfile";
+         Visible = "1";
+         active = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+   };
+};
+//--- OBJECT WRITE END ---
+
+
+function ControlsHelpDlg::onWake(%this)
+{
+   %text = "<font:Arial Bold:20>Default Control Setup\n\n"@
+
+      "<just:center><font:Arial Bold:16>MOVEMENT\n"@
+      "<just:left><font:Arial Bold:14>WASD<font:Arial Italic:14><just:right>Forward/Back/Left/Right\n"@
+      "<just:left><font:Arial Bold:14>Space<font:Arial Italic:14><just:right>Jump\n"@
+      "<just:left><font:Arial Bold:14>X<font:Arial Italic:14><just:right>Crouch\n\n"@
+
+      "<just:center><font:Arial Bold:16>VEHICLE CONTROLS\n"@
+      "<just:left><font:Arial Bold:14>W/D<font:Arial Italic:14><just:right>Drive Forward/Back\n"@
+      "<just:left><font:Arial Bold:14>Mouse Move<font:Arial Italic:14><just:right>Steer left/right\n"@
+      "<just:left><font:Arial Bold:14>Space<font:Arial Italic:14><just:right>Brake\n"@
+      "<just:left><font:Arial Bold:14>Mounting<font:Arial Italic:14><just:right>Just walk into vehicle\n"@
+      "<just:left><font:Arial Bold:14>Ctrl-F<font:Arial Italic:14><just:right>Exit car\n"@      
+      "<just:left><font:Arial Bold:14>Ctrl-X<font:Arial Italic:14><just:right>Flip Car\n\n"@
+      
+      
+      "<just:center><font:Arial Bold:16>WEAPONS\n"@
+      "<just:left><font:Arial Bold:14>Mouse L-Button<font:Arial Italic:14><just:right>Fire\n"@
+      "<just:left><font:Arial Bold:14>Mouse R-Button<font:Arial Italic:14><just:right>Alt-fire\n"@      
+      "<just:left><font:Arial Bold:14>0<font:Arial Italic:14><just:right>Unmount weapon\n"@
+      "<just:left><font:Arial Bold:14>Alt-W<font:Arial Italic:14><just:right>Throw weapon\n"@
+      "<just:left><font:Arial Bold:14>Alt-A<font:Arial Italic:14><just:right>Throw ammo\n\n"@
+
+      "<just:center><font:Arial Bold:16>VIEW CONTROL\n"@
+      "<just:left><font:Arial Bold:14>Z<font:Arial Italic:14><just:right>Toggle Zoom mode\n"@
+      "<just:left><font:Arial Bold:14>F<font:Arial Italic:14><just:right>Cycle zoom FOV\n"@
+      "<just:left><font:Arial Bold:14>Tab<font:Arial Italic:14><just:right>First/Third person camera\n"@
+      "<just:left><font:Arial Bold:14>V<font:Arial Italic:14><just:right>Vanity view\n"@
+      "<just:left><font:Arial Bold:14>Alt-C<font:Arial Italic:14><just:right>Toggle between camera/player\n\n"@
+      
+      "<just:center><font:Arial Bold:16>EDITORS\n"@
+      "<just:left><font:Arial Bold:14>F10<font:Arial Italic:14><just:right>Open GUI Editor\n"@
+      "<just:left><font:Arial Bold:14>F11<font:Arial Italic:14><just:right>Open Level Editor\n\n"@
+      
+      "<just:center><font:Arial Bold:16>MISC FUNCTIONS\n"@
+      "<just:left><font:Arial Bold:14>Alt-C<font:Arial Italic:14><just:right>Toggle between camera/player\n"@
+      "<just:left><font:Arial Bold:14>F7<font:Arial Italic:14><just:right>Drop Player At Camera\n"@      
+      "<just:left><font:Arial Bold:14>F8<font:Arial Italic:14><just:right>Drop Camera At Player\n"@
+      "<just:left><font:Arial Bold:14>U<font:Arial Italic:14><just:right>Send public chat message\n"@
+      "<just:left><font:Arial Bold:14>Ctrl-K<font:Arial Italic:14><just:right>Die\n"@
+      "<just:left><font:Arial Bold:14>Ctrl-O<font:Arial Italic:14><just:right>Open Options dialog\n"@
+      "<just:left><font:Arial Bold:14>Ctrl-H<font:Arial Italic:14><just:right>Toggle Hide HUDs\n"@
+      "<just:left><font:Arial Bold:14>Alt-P<font:Arial Italic:14><just:right>Hudless Screenshot\n"@
+      "<just:left><font:Arial Bold:16>H<font:Arial Italic:16><just:right>Hide this help HUD";
+   ControlsText.setText(%text);
+}
+
+function ControlsHelpDlg::toggle(%this)
+{
+   if (%this.isAwake())
+      Canvas.popDialog(%this);
+   else
+      Canvas.pushDialog(%this);
+}

+ 25 - 0
Templates/Full PhysX/game/art/gui/customProfiles.cs

@@ -0,0 +1,25 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// Game specific profiles are located here
+//-----------------------------------------------------------------------------

BIN
Templates/Full PhysX/game/art/gui/damageBottom.png


BIN
Templates/Full PhysX/game/art/gui/damageFront.png


BIN
Templates/Full PhysX/game/art/gui/damageLeft.png


BIN
Templates/Full PhysX/game/art/gui/damageRight.png


BIN
Templates/Full PhysX/game/art/gui/damageTop.png


+ 175 - 0
Templates/Full PhysX/game/art/gui/defaultGameProfiles.cs

@@ -0,0 +1,175 @@
+//-----------------------------------------------------------------------------
+// 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.
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// Override base controls
+//GuiMenuButtonProfile.soundButtonOver = "AudioButtonOver";
+//GuiMenuButtonProfile.soundButtonDown = "AudioButtonDown";
+
+//-----------------------------------------------------------------------------
+// Chat Hud profiles
+
+
+singleton GuiControlProfile (ChatHudEditProfile)
+{
+   opaque = false;
+   fillColor = "255 255 255";
+   fillColorHL = "128 128 128";
+   border = false;
+   borderThickness = 0;
+   borderColor = "40 231 240";
+   fontColor = "40 231 240";
+   fontColorHL = "40 231 240";
+   fontColorNA = "128 128 128";
+   textOffset = "0 2";
+   autoSizeWidth = false;
+   autoSizeHeight = true;
+   tab = true;
+   canKeyFocus = true;
+};
+
+singleton GuiControlProfile (ChatHudTextProfile)
+{
+   opaque = false;
+   fillColor = "255 255 255";
+   fillColorHL = "128 128 128";
+   border = false;
+   borderThickness = 0;
+   borderColor = "40 231 240";
+   fontColor = "40 231 240";
+   fontColorHL = "40 231 240";
+   fontColorNA = "128 128 128";
+   textOffset = "0 0";
+   autoSizeWidth = true;
+   autoSizeHeight = true;
+   tab = true;
+   canKeyFocus = true;
+};
+
+singleton GuiControlProfile ("ChatHudMessageProfile")
+{
+   fontType = "Arial";
+   fontSize = 16;
+   fontColor = "44 172 181";      // default color (death msgs, scoring, inventory)
+   fontColors[1] = "4 235 105";   // client join/drop, tournament mode
+   fontColors[2] = "219 200 128"; // gameplay, admin/voting, pack/deployable
+   fontColors[3] = "77 253 95";   // team chat, spam protection message, client tasks
+   fontColors[4] = "40 231 240";  // global chat
+   fontColors[5] = "200 200 50 200";  // used in single player game
+   // WARNING! Colors 6-9 are reserved for name coloring
+   autoSizeWidth = true;
+   autoSizeHeight = true;
+};
+
+singleton GuiControlProfile ("ChatHudScrollProfile")
+{
+   opaque = false;
+   borderThickness = 0;
+   borderColor = "0 255 0";
+   bitmap = "core/art/gui/images/scrollBar";
+   hasBitmapArray = true;
+};
+
+
+//-----------------------------------------------------------------------------
+// Core Hud profiles
+
+singleton GuiControlProfile ("HudScrollProfile")
+{
+   opaque = false;
+   border = true;
+   borderColor = "0 255 0";
+   bitmap = "core/art/gui/images/scrollBar";
+   hasBitmapArray = true;
+};
+
+singleton GuiControlProfile ("HudTextProfile")
+{
+   opaque = false;
+   fillColor = "128 128 128";
+   fontColor = "0 255 0";
+   border = true;
+   borderColor = "0 255 0";
+};
+
+singleton GuiControlProfile ("ChatHudBorderProfile")
+{
+   bitmap = "core/art/gui/images/chatHudBorderArray";
+   hasBitmapArray = true;
+   opaque = false;
+};
+
+
+//-----------------------------------------------------------------------------
+// Center and bottom print
+
+singleton GuiControlProfile ("CenterPrintProfile")
+{
+   opaque = false;
+   fillColor = "128 128 128";
+   fontColor = "0 255 0";
+   border = true;
+   borderColor = "0 255 0";
+};
+
+singleton GuiControlProfile ("CenterPrintTextProfile")
+{
+   opaque = false;
+   fontType = "Arial";
+   fontSize = 12;
+   fontColor = "0 255 0";
+};
+
+// -----------------------------------------------------------------------------
+// HUD text
+// -----------------------------------------------------------------------------
+
+singleton GuiControlProfile (HudTextNormalProfile)
+{
+   opaque = false;
+   fontType = "Arial";
+   fontSize = 14;
+   fontColor = "255 255 255";
+};
+
+singleton GuiControlProfile (HudTextItalicProfile : HudTextNormalProfile)
+{
+   fontType = "ArialItalic";
+};
+
+singleton GuiControlProfile (HudTextBoldProfile : HudTextNormalProfile)
+{
+   fontType = "ArialBold";
+};
+
+// -----------------------------------------------------------------------------
+// Numerical health text
+// -----------------------------------------------------------------------------
+
+singleton GuiControlProfile (NumericHealthProfile)
+{
+   opaque = true;
+   justify = "center";
+   fontType = "ArialBold";
+   fontSize = 32;
+   fontColor = "255 255 255";
+};

+ 73 - 0
Templates/Full PhysX/game/art/gui/endGameGui.gui

@@ -0,0 +1,73 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiChunkedBitmapCtrl(EndGameGui) {
+   profile = "GuiContentProfile";
+   horizSizing = "width";
+   vertSizing = "height";
+   position = "0 0";
+   extent = "640 480";
+   minExtent = "8 8";
+   visible = "1";
+   helpTag = "0";
+   bitmap = "./background";
+   useVariable = "0";
+   tile = "0";
+
+   new GuiControl() {
+      profile = "GuiWindowProfile";
+      horizSizing = "center";
+      vertSizing = "center";
+      position = "92 86";
+      extent = "455 308";
+      minExtent = "8 8";
+      visible = "1";
+      helpTag = "0";
+
+      new GuiTextCtrl() {
+         profile = "GuiMediumTextProfile";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         position = "101 15";
+         extent = "251 28";
+         minExtent = "8 8";
+         visible = "1";
+         helpTag = "0";
+         text = "Game Over - Final Scores:";
+         maxLength = "255";
+      };
+      new GuiScrollCtrl() {
+         profile = "GuiScrollProfile";
+         horizSizing = "width";
+         vertSizing = "height";
+         position = "5 51";
+         extent = "444 251";
+         minExtent = "8 8";
+         visible = "1";
+         helpTag = "0";
+         willFirstRespond = "1";
+         hScrollBar = "alwaysOff";
+         vScrollBar = "dynamic";
+         lockHorizScroll = "true";
+         lockVertScroll = "false";
+         constantThumbHeight = "0";
+         childMargin = "0 0";
+            defaultLineHeight = "15";
+
+         new GuiTextListCtrl(EndGameGuiList) {
+            profile = "GuiTextProfile";
+            horizSizing = "width";
+            vertSizing = "height";
+            position = "2 2";
+            extent = "440 16";
+            minExtent = "8 8";
+            visible = "1";
+            helpTag = "0";
+            enumerate = "0";
+            resizeCell = "1";
+            columns = "0 256";
+            fitParentWidth = "1";
+            clipColumnText = "0";
+         };
+      };
+   };
+};
+//--- OBJECT WRITE END ---

BIN
Templates/Full PhysX/game/art/gui/hudfill.png


+ 48 - 0
Templates/Full PhysX/game/art/gui/hudlessGui.gui

@@ -0,0 +1,48 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GameTSCtrl(HudlessPlayGui) {
+   canSaveDynamicFields = "1";
+   isContainer = "1";
+   Profile = "GuiContentProfile";
+   HorizSizing = "right";
+   VertSizing = "bottom";
+   position = "0 0";
+   Extent = "1024 768";
+   MinExtent = "8 8";
+   canSave = "1";
+   Visible = "1";
+   tooltipprofile = "GuiToolTipProfile";
+   hovertime = "1000";
+   Margin = "0 0 0 0";
+   Padding = "0 0 0 0";
+   AnchorTop = "1";
+   AnchorBottom = "0";
+   AnchorLeft = "1";
+   AnchorRight = "0";
+   cameraZRot = "0";
+   forceFOV = "0";
+      Enabled = "1";
+      helpTag = "0";
+      noCursor = "1";
+};
+//--- OBJECT WRITE END ---
+
+
+function HudlessPlayGui::onWake(%this)
+{
+   // just update the action map here
+   moveMap.push();
+}
+
+function HudlessPlayGui::onSleep(%this)
+{
+   // pop the keymaps
+   moveMap.pop();
+}
+
+function HudlessPlayGui::toggle(%this)
+{
+   if (%this.isAwake())
+      Canvas.setContent(PlayGui);
+   else
+      Canvas.setContent(HudlessPlayGui);
+}

+ 644 - 0
Templates/Full PhysX/game/art/gui/joinServerDlg.gui

@@ -0,0 +1,644 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(JoinServerDlg) {
+   canSaveDynamicFields = "0";
+   Enabled = "1";
+   isContainer = "1";
+   Profile = "GuiOverlayProfile";
+   HorizSizing = "width";
+   VertSizing = "height";
+   position = "0 0";
+   Extent = "1024 768";
+   MinExtent = "8 8";
+   canSave = "1";
+   Visible = "1";
+   tooltipprofile = "GuiToolTipProfile";
+   hovertime = "1000";
+
+   new GuiWindowCtrl() {
+      canSaveDynamicFields = "0";
+      Enabled = "1";
+      isContainer = "1";
+      Profile = "GuiWindowProfile";
+      HorizSizing = "center";
+      VertSizing = "center";
+      Position = "252 224";
+      Extent = "520 320";
+      MinExtent = "8 8";
+      canSave = "1";
+      isDecoy = "0";
+      Visible = "1";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+      Margin = "0 0 0 0";
+      Padding = "0 0 0 0";
+      AnchorTop = "1";
+      AnchorBottom = "0";
+      AnchorLeft = "1";
+      AnchorRight = "0";
+      resizeWidth = "0";
+      resizeHeight = "0";
+      canMove = "1";
+      canClose = "1";
+      canMinimize = "0";
+      canMaximize = "0";
+      minSize = "50 50";
+      EdgeSnap = "1";
+      text = "Join Server";
+      closeCommand = "Canvas.popDialog(JoinServerDlg);";
+
+      new GuiButtonCtrl(JS_queryMaster) {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "GuiButtonProfile";
+         HorizSizing = "right";
+         VertSizing = "top";
+         Position = "216 289";
+         Extent = "90 23";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         Command = "JoinServerDlg.query();";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         text = "Query Master";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+      };
+      new GuiButtonCtrl(JS_queryLan) {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "GuiButtonProfile";
+         HorizSizing = "right";
+         VertSizing = "top";
+         Position = "114 289";
+         Extent = "90 23";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         Command = "JoinServerDlg.queryLan();";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         text = "Query LAN";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+      };
+      new GuiButtonCtrl(JS_refreshServer) {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "GuiButtonProfile";
+         HorizSizing = "right";
+         VertSizing = "top";
+         Position = "318 289";
+         Extent = "90 23";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         Command = "JoinServerDlg.refresh();";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         text = "Refresh Server";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+      };
+      new GuiButtonCtrl(JS_joinServer) {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "GuiButtonProfile";
+         HorizSizing = "right";
+         VertSizing = "top";
+         Position = "420 289";
+         Extent = "90 23";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         Command = "JoinServerDlg.join();";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         text = "Join Server!";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+      };
+      new GuiScrollCtrl() {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "1";
+         Profile = "GuiScrollProfile";
+         HorizSizing = "right";
+         VertSizing = "bottom";
+         Position = "10 80";
+         Extent = "500 197";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         Margin = "0 0 0 0";
+         Padding = "0 0 0 0";
+         AnchorTop = "1";
+         AnchorBottom = "0";
+         AnchorLeft = "1";
+         AnchorRight = "0";
+         willFirstRespond = "1";
+         hScrollBar = "dynamic";
+         vScrollBar = "alwaysOn";
+         lockHorizScroll = "false";
+         lockVertScroll = "false";
+         constantThumbHeight = "0";
+         childMargin = "0 0";
+         mouseWheelScrollSpeed = "-1";
+
+         new GuiTextListCtrl(JS_serverList) {
+            canSaveDynamicFields = "0";
+            Enabled = "1";
+            isContainer = "1";
+            Profile = "GuiTextArrayProfile";
+            HorizSizing = "right";
+            VertSizing = "bottom";
+            Position = "1 1";
+            Extent = "485 8";
+            MinExtent = "8 8";
+            canSave = "1";
+            isDecoy = "0";
+            Visible = "1";
+            tooltipprofile = "GuiToolTipProfile";
+            hovertime = "1000";
+            enumerate = "0";
+            resizeCell = "1";
+            columns = "0 200 270 335 400";
+            fitParentWidth = "1";
+            clipColumnText = "0";
+            altCommand = "JoinServerDlg.join();";
+         };
+      };
+      new GuiTextEditCtrl() {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "GuiTextEditProfile";
+         HorizSizing = "right";
+         VertSizing = "bottom";
+         Position = "84 31";
+         Extent = "144 18";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         Variable = "pref::Player::Name";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         Margin = "0 0 0 0";
+         Padding = "0 0 0 0";
+         AnchorTop = "1";
+         AnchorBottom = "0";
+         AnchorLeft = "1";
+         AnchorRight = "0";
+         maxLength = "255";
+         historySize = "0";
+         password = "0";
+         tabComplete = "0";
+         sinkAllKeyEvents = "0";
+         passwordMask = "*";
+      };
+      new GuiTextCtrl() {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "GuiAutoSizeTextProfile";
+         HorizSizing = "right";
+         VertSizing = "bottom";
+         Position = "12 31";
+         Extent = "63 18";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         Margin = "0 0 0 0";
+         Padding = "0 0 0 0";
+         AnchorTop = "1";
+         AnchorBottom = "0";
+         AnchorLeft = "1";
+         AnchorRight = "0";
+         text = "Player Name:";
+         maxLength = "255";
+      };
+      new GuiTextCtrl() {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "GuiAutoSizeTextProfile";
+         HorizSizing = "right";
+         VertSizing = "bottom";
+         Position = "269 59";
+         Extent = "36 18";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         Margin = "0 0 0 0";
+         Padding = "0 0 0 0";
+         AnchorTop = "1";
+         AnchorBottom = "0";
+         AnchorLeft = "1";
+         AnchorRight = "0";
+         text = "Players";
+         maxLength = "255";
+      };
+      new GuiTextCtrl() {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "GuiAutoSizeTextProfile";
+         HorizSizing = "right";
+         VertSizing = "bottom";
+         Position = "335 59";
+         Extent = "38 18";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         Margin = "0 0 0 0";
+         Padding = "0 0 0 0";
+         AnchorTop = "1";
+         AnchorBottom = "0";
+         AnchorLeft = "1";
+         AnchorRight = "0";
+         text = "Version";
+         maxLength = "255";
+      };
+      new GuiTextCtrl() {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "GuiAutoSizeTextProfile";
+         HorizSizing = "right";
+         VertSizing = "bottom";
+         Position = "412 59";
+         Extent = "28 18";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         Margin = "0 0 0 0";
+         Padding = "0 0 0 0";
+         AnchorTop = "1";
+         AnchorBottom = "0";
+         AnchorLeft = "1";
+         AnchorRight = "0";
+         text = "Game";
+         maxLength = "255";
+      };
+      new GuiTextCtrl() {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "GuiAutoSizeTextProfile";
+         HorizSizing = "right";
+         VertSizing = "bottom";
+         Position = "212 59";
+         Extent = "20 18";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         Margin = "0 0 0 0";
+         Padding = "0 0 0 0";
+         AnchorTop = "1";
+         AnchorBottom = "0";
+         AnchorLeft = "1";
+         AnchorRight = "0";
+         text = "Ping";
+         maxLength = "255";
+      };
+      new GuiTextCtrl() {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "GuiAutoSizeTextProfile";
+         HorizSizing = "right";
+         VertSizing = "bottom";
+         Position = "12 59";
+         Extent = "63 18";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         Margin = "0 0 0 0";
+         Padding = "0 0 0 0";
+         AnchorTop = "1";
+         AnchorBottom = "0";
+         AnchorLeft = "1";
+         AnchorRight = "0";
+         text = "Server Name";
+         maxLength = "255";
+      };
+      new GuiButtonCtrl() {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "GuiButtonProfile";
+         HorizSizing = "right";
+         VertSizing = "top";
+         Position = "12 289";
+         Extent = "90 23";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         Command = "JoinServerDlg.exit();";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         text = "< Back";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+      };
+      new GuiWindowCtrl(JS_queryStatus) {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "1";
+         Profile = "GuiWindowProfile";
+         HorizSizing = "center";
+         VertSizing = "center";
+         Position = "105 135";
+         Extent = "310 50";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "0";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         resizeWidth = "0";
+         resizeHeight = "0";
+         canMove = "0";
+         canClose = "0";
+         canMinimize = "0";
+         canMaximize = "0";
+         canCollapse = "0";
+         text="Status";
+
+         new GuiButtonCtrl(JS_cancelQuery) {
+            canSaveDynamicFields = "0";
+            Enabled = "1";
+            isContainer = "0";
+            Profile = "GuiButtonProfile";
+            HorizSizing = "right";
+            VertSizing = "bottom";
+            Position = "9 25";
+            Extent = "64 20";
+            MinExtent = "8 8";
+            canSave = "1";
+            isDecoy = "0";
+            Visible = "1";
+            Command = "JoinServerDlg.cancel();";
+            tooltipprofile = "GuiToolTipProfile";
+            hovertime = "1000";
+            text = "Cancel!";
+            groupNum = "-1";
+            buttonType = "PushButton";
+            useMouseEvents = "0";
+         };
+         new GuiProgressCtrl(JS_statusBar) {
+            canSaveDynamicFields = "0";
+            Enabled = "1";
+            isContainer = "0";
+            Profile = "GuiProgressProfile";
+            HorizSizing = "right";
+            VertSizing = "bottom";
+            Position = "84 25";
+            Extent = "207 20";
+            MinExtent = "8 8";
+            canSave = "1";
+            isDecoy = "0";
+            Visible = "1";
+            tooltipprofile = "GuiToolTipProfile";
+            hovertime = "1000";
+            Margin = "0 0 0 0";
+            Padding = "0 0 0 0";
+            AnchorTop = "1";
+            AnchorBottom = "0";
+            AnchorLeft = "1";
+            AnchorRight = "0";
+            maxLength = "1024";
+         };
+         new GuiTextCtrl(JS_statusText) {
+            canSaveDynamicFields = "0";
+            Enabled = "1";
+            isContainer = "0";
+            Profile = "GuiProgressTextProfile";
+            HorizSizing = "right";
+            VertSizing = "bottom";
+            Position = "85 25";
+            Extent = "205 20";
+            MinExtent = "8 8";
+            canSave = "1";
+            isDecoy = "0";
+            Visible = "1";
+            tooltipprofile = "GuiToolTipProfile";
+            hovertime = "1000";
+            Margin = "0 0 0 0";
+            Padding = "0 0 0 0";
+            AnchorTop = "1";
+            AnchorBottom = "0";
+            AnchorLeft = "1";
+            AnchorRight = "0";
+            text = "Querying master server";
+            maxLength = "255";
+         };
+      };
+      new GuiTextCtrl(JS_status) {
+         canSaveDynamicFields = "0";
+         Profile = "GuiAutoSizeTextProfile";
+         HorizSizing = "right";
+         VertSizing = "bottom";
+         Position = "245 31";
+         Extent = "177 19";
+         MinExtent = "8 8";
+         text = "";
+         visible = "1";
+         maxLength = "255";
+      };
+   };
+};
+//--- OBJECT WRITE END ---
+
+function JoinServerDlg::onWake()
+{
+   // Double check the status. Tried setting this the control
+   // inactive to start with, but that didn't seem to work.
+   JS_joinServer.setActive(JS_serverList.rowCount() > 0);
+}   
+
+//----------------------------------------
+function JoinServerDlg::query(%this)
+{
+   queryMasterServer(
+      0,          // Query flags
+      $Client::GameTypeQuery,       // gameTypes
+      $Client::MissionTypeQuery,    // missionType
+      0,          // minPlayers
+      100,        // maxPlayers
+      0,          // maxBots
+      2,          // regionMask
+      0,          // maxPing
+      100,        // minCPU
+      0           // filterFlags
+   );
+}
+
+//----------------------------------------
+function JoinServerDlg::queryLan(%this)
+{
+   queryLANServers(
+      $pref::Net::Port,      // lanPort for local queries
+      0,          // Query flags
+      $Client::GameTypeQuery,       // gameTypes
+      $Client::MissionTypeQuery,    // missionType
+      0,          // minPlayers
+      100,        // maxPlayers
+      0,          // maxBots
+      2,          // regionMask
+      0,          // maxPing
+      100,        // minCPU
+      0           // filterFlags
+   );
+}
+
+//----------------------------------------
+function JoinServerDlg::cancel(%this)
+{
+   cancelServerQuery();
+   JS_queryStatus.setVisible(false);
+}
+
+
+//----------------------------------------
+function JoinServerDlg::join(%this)
+{
+   cancelServerQuery();
+   %index = JS_serverList.getSelectedId();
+
+   // The server info index is stored in the row along with the
+   // rest of displayed info.
+
+   if( setServerInfo( %index ) )
+   {
+      Canvas.setContent("LoadingGui");
+      LoadingProgress.setValue(1);
+      LoadingProgressTxt.setValue("WAITING FOR SERVER");
+      Canvas.repaint();
+
+      %conn = new GameConnection(ServerConnection);
+      %conn.setConnectArgs($pref::Player::Name);
+      %conn.setJoinPassword($Client::Password);
+      %conn.connect($ServerInfo::Address);
+   }
+}
+
+//----------------------------------------
+function JoinServerDlg::refresh(%this)
+{
+   cancelServerQuery();
+   %index= JS_serverList.getSelectedId();
+
+   // The server info index is stored in the row along with the
+   // rest of displayed info.
+   if( setServerInfo( %index ) )
+      querySingleServer( $ServerInfo::Address, 0 );
+}
+
+//----------------------------------------
+function JoinServerDlg::refreshSelectedServer( %this )
+{
+   querySingleServer( $JoinGameAddress, 0 );
+}
+
+//----------------------------------------
+function JoinServerDlg::exit(%this)
+{
+   cancelServerQuery();
+   
+   Canvas.popDialog(JoinServerDlg);
+}
+
+//----------------------------------------
+function JoinServerDlg::update(%this)
+{
+   // Copy the servers into the server list.
+   JS_queryStatus.setVisible(false);
+   JS_serverList.clear();
+   %sc = getServerCount();
+   for( %i = 0; %i < %sc; %i ++ ) {
+      setServerInfo(%i);
+      JS_serverList.addRow( %i,
+         $ServerInfo::Name TAB
+         $ServerInfo::Ping TAB
+         $ServerInfo::PlayerCount @ "/" @ $ServerInfo::MaxPlayers TAB
+         $ServerInfo::Version TAB
+         $ServerInfo::MissionName
+      );
+   }
+   JS_serverList.sort(0);
+   JS_serverList.setSelectedRow(0);
+   JS_serverList.scrollVisible(0);
+
+   JS_joinServer.setActive(JS_serverList.rowCount() > 0);
+} 
+
+//----------------------------------------
+function onServerQueryStatus(%status, %msg, %value)
+{
+	echo("ServerQuery: " SPC %status SPC %msg SPC %value);
+   // Update query status
+   // States: start, update, ping, query, done
+   // value = % (0-1) done for ping and query states
+   if (!JS_queryStatus.isVisible())
+      JS_queryStatus.setVisible(true);
+
+   switch$ (%status) {
+      case "start":
+         JS_joinServer.setActive(false);
+         JS_queryMaster.setActive(false);
+         JS_statusText.setText(%msg);
+         JS_statusBar.setValue(0);
+         JS_serverList.clear();
+
+      case "ping":
+         JS_statusText.setText("Ping Servers");
+         JS_statusBar.setValue(%value);
+
+      case "query":
+         JS_statusText.setText("Query Servers");
+         JS_statusBar.setValue(%value);
+
+      case "done":
+         JS_queryMaster.setActive(true);
+         JS_queryStatus.setVisible(false);
+         JS_status.setText(%msg);
+         JoinServerDlg.update();
+   }
+}

BIN
Templates/Full PhysX/game/art/gui/lagIcon.png


BIN
Templates/Full PhysX/game/art/gui/logo.png


+ 151 - 0
Templates/Full PhysX/game/art/gui/mainMenuGui.gui

@@ -0,0 +1,151 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) {
+   canSaveDynamicFields = "0";
+   Enabled = "1";
+   isContainer = "1";
+   Profile = "GuiContentProfile";
+   HorizSizing = "width";
+   VertSizing = "height";
+   Position = "0 0";
+   Extent = "1024 768";
+   MinExtent = "8 8";
+   canSave = "1";
+   isDecoy = "0";
+   Visible = "1";
+   tooltipprofile = "GuiToolTipProfile";
+   hovertime = "1000";
+   bitmap = "art/gui/background";
+   useVariable = "0";
+   tile = "0";
+
+   new GuiBitmapCtrl(MainMenuAppLogo) {
+      canSaveDynamicFields = "1";
+      Enabled = "1";
+      isContainer = "0";
+      Profile = "GuiDefaultProfile";
+      HorizSizing = "left";
+      VertSizing = "bottom";
+      Position = "540 30";
+      Extent = "443 139";
+      MinExtent = "8 2";
+      canSave = "1";
+      isDecoy = "0";
+      Visible = "1";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+      bitmap = "art/gui/Torque-3D-logo.png";
+      wrap = "0";
+   };
+   new GuiControl() {
+      canSaveDynamicFields = "0";
+      Enabled = "1";
+      isContainer = "1";
+      Profile = "GuiDefaultProfile";
+      HorizSizing = "center";
+      VertSizing = "center";
+      Position = "359 171";
+      Extent = "306 425";
+      MinExtent = "8 2";
+      canSave = "1";
+      isDecoy = "0";
+      Visible = "1";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+
+      new GuiButtonCtrl() {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "GuiMenuButtonProfile";
+         HorizSizing = "relative";
+         VertSizing = "bottom";
+         Position = "9 114";
+         Extent = "289 75";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         Command = "Canvas.pushDialog(ChooseLevelDlg);";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         text = "Play";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "1";
+      };
+      new GuiButtonCtrl() {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "GuiMenuButtonProfile";
+         HorizSizing = "relative";
+         VertSizing = "bottom";
+         Position = "9 190";
+         Extent = "289 75";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         Command = "Canvas.pushDialog(JoinServerDlg);";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         text = "Join";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+      };
+      new GuiButtonCtrl() {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "GuiMenuButtonProfile";
+         HorizSizing = "relative";
+         VertSizing = "bottom";
+         Position = "9 267";
+         Extent = "289 75";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         Command = "Canvas.pushDialog(optionsDlg);";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         text = "Options";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+
+      };
+      new GuiButtonCtrl() {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         internalName = "ExitButton";
+         isContainer = "0";
+         Profile = "GuiMenuButtonProfile";
+         HorizSizing = "relative";
+         VertSizing = "bottom";
+         Position = "9 344";
+         Extent = "289 75";
+         MinExtent = "8 8";
+         canSave = "1";
+         isDecoy = "0";
+         Visible = "1";
+         Command = "quit();";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         text = "Exit";
+         groupNum = "-1";
+         buttonType = "PushButton";
+         useMouseEvents = "0";
+      };
+   };
+};
+//--- OBJECT WRITE END ---
+
+function MainMenuGui::onWake(%this)
+{
+   if (isFunction("getWebDeployment") &&
+       getWebDeployment() &&
+       isObject(%this-->ExitButton))
+      %this-->ExitButton.setVisible(false);
+}

BIN
Templates/Full PhysX/game/art/gui/no-preview.png


+ 423 - 0
Templates/Full PhysX/game/art/gui/playGui.gui

@@ -0,0 +1,423 @@
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GameTSCtrl(PlayGui) {
+   cameraZRot = "0";
+   forceFOV = "0";
+   reflectPriority = "1";
+   Margin = "0 0 0 0";
+   Padding = "0 0 0 0";
+   AnchorTop = "1";
+   AnchorBottom = "0";
+   AnchorLeft = "1";
+   AnchorRight = "0";
+   isContainer = "1";
+   Profile = "GuiContentProfile";
+   HorizSizing = "right";
+   VertSizing = "bottom";
+   position = "0 0";
+   Extent = "1024 768";
+   MinExtent = "8 8";
+   canSave = "1";
+   Visible = "1";
+   tooltipprofile = "GuiToolTipProfile";
+   hovertime = "1000";
+   canSaveDynamicFields = "1";
+      Enabled = "1";
+      helpTag = "0";
+      noCursor = "1";
+
+   new GuiBitmapCtrl(CenterPrintDlg) {
+      bitmap = "art/gui/hudfill.png";
+      wrap = "0";
+      isContainer = "0";
+      Profile = "CenterPrintProfile";
+      HorizSizing = "center";
+      VertSizing = "center";
+      position = "237 375";
+      Extent = "550 20";
+      MinExtent = "8 8";
+      canSave = "1";
+      Visible = "0";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+      canSaveDynamicFields = "0";
+
+      new GuiMLTextCtrl(CenterPrintText) {
+         lineSpacing = "2";
+         allowColorChars = "0";
+         maxChars = "-1";
+         useURLMouseCursor = "0";
+         isContainer = "0";
+         Profile = "CenterPrintTextProfile";
+         HorizSizing = "center";
+         VertSizing = "center";
+         position = "0 0";
+         Extent = "546 12";
+         MinExtent = "8 8";
+         canSave = "1";
+         Visible = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         canSaveDynamicFields = "0";
+      };
+   };
+   new GuiBitmapCtrl(BottomPrintDlg) {
+      bitmap = "art/gui/hudfill.png";
+      wrap = "0";
+      isContainer = "0";
+      Profile = "CenterPrintProfile";
+      HorizSizing = "center";
+      VertSizing = "top";
+      position = "237 719";
+      Extent = "550 20";
+      MinExtent = "8 8";
+      canSave = "1";
+      Visible = "0";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+      canSaveDynamicFields = "0";
+
+      new GuiMLTextCtrl(BottomPrintText) {
+         lineSpacing = "2";
+         allowColorChars = "0";
+         maxChars = "-1";
+         useURLMouseCursor = "0";
+         isContainer = "0";
+         Profile = "CenterPrintTextProfile";
+         HorizSizing = "center";
+         VertSizing = "center";
+         position = "0 0";
+         Extent = "546 12";
+         MinExtent = "8 8";
+         canSave = "1";
+         Visible = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         canSaveDynamicFields = "0";
+      };
+   };
+   new GuiBitmapCtrl(LagIcon) {
+      bitmap = "art/gui/lagIcon.png";
+      wrap = "0";
+      isContainer = "0";
+      Profile = "GuiDefaultProfile";
+      HorizSizing = "right";
+      VertSizing = "bottom";
+      position = "572 3";
+      Extent = "32 32";
+      MinExtent = "8 8";
+      canSave = "1";
+      Visible = "0";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+      canSaveDynamicFields = "0";
+   };
+   new GuiShapeNameHud() {
+      fillColor = "0 0 0 0.25";
+      frameColor = "0 1 0 1";
+      textColor = "0 1 0 1";
+      showFill = "0";
+      showFrame = "0";
+      verticalOffset = "0.2";
+      distanceFade = "0.1";
+      isContainer = "0";
+      Profile = "GuiModelessDialogProfile";
+      HorizSizing = "width";
+      VertSizing = "height";
+      position = "0 0";
+      Extent = "1024 768";
+      MinExtent = "8 8";
+      canSave = "1";
+      Visible = "1";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+      canSaveDynamicFields = "0";
+   };
+   new GuiCrossHairHud(Reticle) {
+      damageFillColor = "0 1 0 1";
+      damageFrameColor = "1 0.6 0 1";
+      damageRect = "50 4";
+      damageOffset = "0 10";
+      bitmap = "art/gui/weaponHud/blank.png";
+      wrap = "0";
+      isContainer = "0";
+      Profile = "GuiModelessDialogProfile";
+      HorizSizing = "center";
+      VertSizing = "center";
+      position = "496 368";
+      Extent = "32 32";
+      MinExtent = "8 8";
+      canSave = "1";
+      Visible = "1";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+      canSaveDynamicFields = "0";
+   };
+   new GuiCrossHairHud(ZoomReticle) {
+      damageFillColor = "0 1 0 1";
+      damageFrameColor = "1 0.6 0 1";
+      damageRect = "50 4";
+      damageOffset = "0 10";
+      bitmap = "art/gui/weaponHud/bino.png";
+      wrap = "0";
+      isContainer = "0";
+      Profile = "GuiModelessDialogProfile";
+      HorizSizing = "width";
+      VertSizing = "height";
+      position = "0 0";
+      Extent = "1024 768";
+      MinExtent = "8 8";
+      canSave = "1";
+      Visible = "0";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+      canSaveDynamicFields = "0";
+   };
+   new GuiBitmapBorderCtrl(WeaponHUD) {
+      isContainer = "0";
+      Profile = "ChatHudBorderProfile";
+      HorizSizing = "right";
+      VertSizing = "top";
+      position = "78 693";
+      Extent = "124 72";
+      MinExtent = "8 8";
+      canSave = "1";
+      Visible = "1";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+      canSaveDynamicFields = "0";
+
+      new GuiBitmapCtrl() {
+         bitmap = "core/art/gui/images/hudfill.png";
+         wrap = "0";
+         isContainer = "0";
+         Profile = "GuiDefaultProfile";
+         HorizSizing = "width";
+         VertSizing = "height";
+         position = "8 8";
+         Extent = "108 56";
+         MinExtent = "8 8";
+         canSave = "1";
+         Visible = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapCtrl(PreviewImage) {
+         bitmap = "art/gui/weaponHud/blank.png";
+         wrap = "0";
+         isContainer = "0";
+         Profile = "GuiDefaultProfile";
+         HorizSizing = "width";
+         VertSizing = "height";
+         position = "8 8";
+         Extent = "108 56";
+         MinExtent = "8 2";
+         canSave = "1";
+         Visible = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextCtrl(AmmoAmount) {
+         maxLength = "255";
+         Margin = "0 0 0 0";
+         Padding = "0 0 0 0";
+         AnchorTop = "0";
+         AnchorBottom = "0";
+         AnchorLeft = "0";
+         AnchorRight = "0";
+         isContainer = "0";
+         Profile = "HudTextItalicProfile";
+         HorizSizing = "right";
+         VertSizing = "top";
+         position = "40 8";
+         Extent = "120 16";
+         MinExtent = "8 8";
+         canSave = "1";
+         Visible = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         canSaveDynamicFields = "0";
+      };
+   };
+   new GuiBitmapBorderCtrl(HealthHUD) {
+      isContainer = "0";
+      Profile = "ChatHudBorderProfile";
+      HorizSizing = "right";
+      VertSizing = "top";
+      position = "6 693";
+      Extent = "72 72";
+      MinExtent = "8 8";
+      canSave = "1";
+      Visible = "1";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+      canSaveDynamicFields = "0";
+
+      new GuiBitmapCtrl() {
+         bitmap = "core/art/gui/images/hudfill.png";
+         wrap = "0";
+         isContainer = "0";
+         Profile = "GuiDefaultProfile";
+         HorizSizing = "width";
+         VertSizing = "height";
+         position = "8 8";
+         Extent = "56 56";
+         MinExtent = "8 8";
+         canSave = "1";
+         Visible = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         canSaveDynamicFields = "0";
+      };
+      new GuiTextCtrl(numericalHealthHUD) {
+         maxLength = "255";
+         Margin = "0 0 0 0";
+         Padding = "0 0 0 0";
+         AnchorTop = "0";
+         AnchorBottom = "0";
+         AnchorLeft = "0";
+         AnchorRight = "0";
+         isContainer = "0";
+         Profile = "NumericHealthProfile";
+         HorizSizing = "center";
+         VertSizing = "center";
+         position = "0 22";
+         Extent = "72 32";
+         MinExtent = "8 8";
+         canSave = "1";
+         Visible = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         canSaveDynamicFields = "0";
+      };
+   };
+   new GuiBitmapCtrl(OOBSign) {
+      bitmap = "art/gui/playHud/missionAreaWarning.png";
+      wrap = "0";
+      isContainer = "0";
+      Profile = "GuiDefaultProfile";
+      HorizSizing = "right";
+      VertSizing = "top";
+      position = "512 693";
+      Extent = "64 64";
+      MinExtent = "8 8";
+      canSave = "1";
+      Visible = "0";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+      canSaveDynamicFields = "0";
+   };
+   new GuiControl(DamageHUD) {
+      position = "384 256";
+      extent = "256 256";
+      minExtent = "8 2";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "GuiDefaultProfile";
+      visible = "1";
+      active = "1";
+      tooltipProfile = "GuiToolTipProfile";
+      hovertime = "1000";
+      isContainer = "1";
+      canSave = "1";
+      canSaveDynamicFields = "0";
+
+      new GuiBitmapCtrl() {
+         bitmap = "art/gui/damageFront.png";
+         wrap = "0";
+         position = "0 0";
+         extent = "256 32";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "0";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         internalName = "Damage_Front";
+         hidden = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapCtrl() {
+         bitmap = "art/gui/damageTop.png";
+         wrap = "0";
+         position = "0 0";
+         extent = "256 32";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "0";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         internalName = "Damage_Top";
+         hidden = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapCtrl() {
+         bitmap = "art/gui/damageBottom.png";
+         wrap = "0";
+         position = "0 224";
+         extent = "256 32";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "0";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         internalName = "Damage_Bottom";
+         hidden = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapCtrl() {
+         bitmap = "art/gui/damageLeft.png";
+         wrap = "0";
+         position = "0 0";
+         extent = "32 256";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "0";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         internalName = "Damage_Left";
+         hidden = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+      new GuiBitmapCtrl() {
+         bitmap = "art/gui/damageRight.png";
+         wrap = "0";
+         position = "224 0";
+         extent = "32 256";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "0";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "0";
+         internalName = "Damage_Right";
+         hidden = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
+   };
+};
+//--- OBJECT WRITE END ---

+ 178 - 0
Templates/Full PhysX/game/art/gui/playerList.gui

@@ -0,0 +1,178 @@
+//-----------------------------------------------------------------------------
+// Torque Game Engine
+//
+// Copyright (c) 2001 GarageGames.Com
+//-----------------------------------------------------------------------------
+
+//--- OBJECT WRITE BEGIN ---
+%guiContent = new GuiControl(PlayerListGui) {
+   canSaveDynamicFields = "0";
+   Enabled = "1";
+   isContainer = "1";
+   Profile = "GuiModelessDialogProfile";
+   HorizSizing = "right";
+   VertSizing = "bottom";
+   Position = "0 0";
+   Extent = "1024 768";
+   MinExtent = "8 8";
+   canSave = "1";
+   Visible = "1";
+   tooltipprofile = "GuiToolTipProfile";
+   hovertime = "1000";
+   noCursor = true;
+
+   new GuiBitmapBorderCtrl() {
+      canSaveDynamicFields = "0";
+      Enabled = "1";
+      isContainer = "0";
+      Profile = "ChatHudBorderProfile";
+      HorizSizing = "center";
+      VertSizing = "center";
+      Position = "362 263";
+      Extent = "299 242";
+      MinExtent = "8 8";
+      canSave = "1";
+      Visible = "1";
+      tooltipprofile = "GuiToolTipProfile";
+      hovertime = "1000";
+
+      new GuiBitmapCtrl() {
+         canSaveDynamicFields = "0";
+         Enabled = "1";
+         isContainer = "0";
+         Profile = "ChatHudScrollProfile";
+         HorizSizing = "right";
+         VertSizing = "bottom";
+         Position = "8 8";
+         Extent = "283 226";
+         MinExtent = "8 8";
+         canSave = "1";
+         Visible = "1";
+         tooltipprofile = "GuiToolTipProfile";
+         hovertime = "1000";
+         bitmap = "art/gui/hudfill.png";
+         wrap = "0";
+
+         new GuiScrollCtrl() {
+            canSaveDynamicFields = "0";
+            Enabled = "1";
+            isContainer = "1";
+            Profile = "ChatHudScrollProfile";
+            HorizSizing = "width";
+            VertSizing = "height";
+            Position = "0 24";
+            Extent = "228 202";
+            MinExtent = "8 8";
+            canSave = "1";
+            Visible = "1";
+            tooltipprofile = "GuiToolTipProfile";
+            hovertime = "1000";
+            Margin = "0 0 0 0";
+            Padding = "0 0 0 0";
+            AnchorTop = "1";
+            AnchorBottom = "0";
+            AnchorLeft = "1";
+            AnchorRight = "0";
+            willFirstRespond = "1";
+            hScrollBar = "alwaysOff";
+            vScrollBar = "dynamic";
+            lockHorizScroll = "true";
+            lockVertScroll = "false";
+            constantThumbHeight = "0";
+            childMargin = "0 0";
+            mouseWheelScrollSpeed = "-1";
+
+            new GuiTextListCtrl(PlayerListGuiList) {
+               canSaveDynamicFields = "0";
+               Enabled = "1";
+               isContainer = "1";
+               Profile = "HudTextNormalProfile";
+               HorizSizing = "width";
+               VertSizing = "height";
+               Position = "1 1";
+               Extent = "226 9";
+               MinExtent = "8 8";
+               canSave = "1";
+               Visible = "1";
+               tooltipprofile = "GuiToolTipProfile";
+               hovertime = "1000";
+               enumerate = "0";
+               resizeCell = "1";
+               columns = "0 98 153 200";
+               fitParentWidth = "1";
+               clipColumnText = "0";
+            };
+         };
+         new GuiTextCtrl() {
+            canSaveDynamicFields = "0";
+            Enabled = "1";
+            isContainer = "0";
+            Profile = "HudTextBoldProfile";
+            HorizSizing = "right";
+            VertSizing = "bottom";
+            Position = "104 2";
+            Extent = "33 18";
+            MinExtent = "8 8";
+            canSave = "1";
+            Visible = "1";
+            tooltipprofile = "GuiToolTipProfile";
+            hovertime = "1000";
+            Margin = "0 0 0 0";
+            Padding = "0 0 0 0";
+            AnchorTop = "1";
+            AnchorBottom = "0";
+            AnchorLeft = "1";
+            AnchorRight = "0";
+            text = "Score";
+            maxLength = "255";
+         };
+         new GuiTextCtrl() {
+            canSaveDynamicFields = "0";
+            Enabled = "1";
+            isContainer = "0";
+            Profile = "HudTextBoldProfile";
+            HorizSizing = "right";
+            VertSizing = "bottom";
+            Position = "158 2";
+            Extent = "30 18";
+            MinExtent = "8 8";
+            canSave = "1";
+            Visible = "1";
+            tooltipprofile = "GuiToolTipProfile";
+            hovertime = "1000";
+            Margin = "0 0 0 0";
+            Padding = "0 0 0 0";
+            AnchorTop = "1";
+            AnchorBottom = "0";
+            AnchorLeft = "1";
+            AnchorRight = "0";
+            text = "Kills";
+            maxLength = "255";
+         };
+         new GuiTextCtrl() {
+            canSaveDynamicFields = "0";
+            Enabled = "1";
+            isContainer = "0";
+            Profile = "HudTextBoldProfile";
+            HorizSizing = "right";
+            VertSizing = "bottom";
+            Position = "206 2";
+            Extent = "37 18";
+            MinExtent = "8 8";
+            canSave = "1";
+            Visible = "1";
+            tooltipprofile = "GuiToolTipProfile";
+            hovertime = "1000";
+            Margin = "0 0 0 0";
+            Padding = "0 0 0 0";
+            AnchorTop = "1";
+            AnchorBottom = "0";
+            AnchorLeft = "1";
+            AnchorRight = "0";
+            text = "Deaths";
+            maxLength = "255";
+         };
+      };
+   };
+};
+//--- OBJECT WRITE END ---

BIN
Templates/Full PhysX/game/art/gui/splash.bmp


BIN
Templates/Full PhysX/game/art/gui/weaponHud/bino.png


BIN
Templates/Full PhysX/game/art/gui/weaponHud/blank.png


BIN
Templates/Full PhysX/game/art/gui/weaponHud/crossHair.png


BIN
Templates/Full PhysX/game/art/gui/weaponHud/lurker.png


BIN
Templates/Full PhysX/game/art/gui/weaponHud/mine.png


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません