From f1777016b8c42161857ae42eaee375ef31f2de26 Mon Sep 17 00:00:00 2001 From: Areloch Date: Mon, 17 Jun 2019 02:30:45 -0500 Subject: [PATCH] GFX card profile config file logging moved to debug only WIP mode of guiSliderCtrl to be a filled rectangle instead of a textured UI Fixed bug with guiTextEditCtrl losing focus updating history passing malformed strings Updated WIP options menu Editor/Project settings WIP Updated editor theme to be consistent, and feed off the editor settings Updated popup menus to reference renamed profiles Added more in-progress modules for examples/stress testing --- Engine/source/gfx/gfxCardProfile.cpp | 5 + Engine/source/gui/controls/guiSliderCtrl.cpp | 44 +- Engine/source/gui/controls/guiSliderCtrl.h | 3 + .../source/gui/controls/guiTextEditCtrl.cpp | 2 +- Engine/source/gui/editor/popupMenu.cpp | 2 +- Engine/source/postFx/postEffect.cpp | 2 +- Templates/BaseGame/game/core/Core.cs | 3 + .../lighting/scripts/advancedLighting_Init.cs | 6 - .../advanced/gl/reflectionProbeP.glsl | 162 ++ .../advanced/gl/reflectionProbeV.glsl | 32 + Templates/BaseGame/game/core/settings.xml | 13 + .../pbr/levels/PbrMatTest.postfxpreset.cs | 53 + .../ui/art/optionsMenuSliderBitmapArray.png | Bin 0 -> 2247 bytes .../game/data/ui/art/slider - Copy.png | Bin 0 -> 908 bytes .../guis/graphicsMenuSettingsSlider.taml | 4 +- .../game/data/ui/scripts/optionsMenu.cs | 72 +- .../BaseGame/game/data/ui/scripts/profiles.cs | 7 + .../assetBrowser/_assetImportConfigs.xml | 34 + .../tools/assetBrowser/guis/assetBrowser.gui | 12 +- .../tools/assetBrowser/guis/assetImport.gui | 6 +- .../tools/assetBrowser/guis/editAsset.gui | 2 +- .../tools/assetBrowser/guis/editModule.gui | 2 +- .../game/tools/assetBrowser/guis/newAsset.gui | 2 +- .../BaseGame/game/tools/assetBrowser/main.cs | 1 + .../convexEditor/convexEditorToolbar.ed.gui | 2 +- .../editorClasses/gui/images/rollout.png | Bin 586 -> 6247 bytes .../gui/panels/navPanelProfiles.ed.cs | 51 - .../game/tools/gui/editorSettingsWindow.ed.cs | 217 ++- .../BaseGame/game/tools/gui/images/button.png | Bin 1153 -> 2944 bytes .../BaseGame/game/tools/gui/images/tab.png | Bin 495 -> 4142 bytes .../BaseGame/game/tools/gui/images/window.png | Bin 861 -> 5308 bytes .../messageBoxOKCancelDetailsDlg.ed.gui | 2 +- .../BaseGame/game/tools/gui/profiles.ed.cs | 381 ++-- .../game/tools/guiEditor/gui/guiEditor.ed.gui | 6 +- .../guiEditor/scripts/guiEditorCanvas.ed.cs | 2 +- .../tools/navEditor/NavEditorSettingsTab.gui | 2 +- Templates/BaseGame/game/tools/settings.xml | 264 +-- .../shapeEditor/gui/ShapeEditorToolbar.ed.gui | 2 +- .../tools/worldEditor/gui/EditorGui.ed.gui | 4 +- .../tools/worldEditor/gui/ToolsToolbar.ed.gui | 4 +- .../worldEditor/gui/WorldEditorToolbar.ed.gui | 12 +- .../gui/WorldEditorTreeWindow.ed.gui | 1 + .../gui/guiWorldEditorCreatorWindow.ed.gui | 1 + .../tools/worldEditor/scripts/lightViz.cs | 7 - .../tools/worldEditor/scripts/menus.ed.cs | 13 +- Templates/Modules/AI_Guard/AI_Guard.cs | 16 + Templates/Modules/AI_Guard/AI_Guard.module | 15 + .../AI_Guard/Datablocks/aiPlayerDatablocks.cs | 53 + .../AI_Guard/Datablocks/aiPlayerMarker.cs | 16 + .../Modules/AI_Guard/Scripts/aiPlayer.cs | 1639 +++++++++++++++++ .../Modules/AI_Guard/Scripts/guardTrigger.cs | 34 + Templates/Modules/PostFXPack/PostFXPack.cs | 9 + .../Modules/PostFXPack/PostFXPack.module | 15 + .../Modules/PostFXPack/Scripts/postFX.cs | 25 + .../Modules/PostFXPack/Scripts/postFXPack.cs | 351 ++++ .../PostFXPack/Shaders/blackAndWhiteP.hlsl | 21 + .../PostFXPack/Shaders/blurredVisionP.hlsl | 29 + .../Shaders/chromaticAberrationP.hlsl | 24 + .../PostFXPack/Shaders/crossStitchP.hlsl | 39 + .../PostFXPack/Shaders/dreamviewP.hlsl | 30 + .../PostFXPack/Shaders/edgeDetectionP.hlsl | 48 + .../PostFXPack/Shaders/lensCircleP.hlsl | 14 + .../PostFXPack/Shaders/monochromeP.hlsl | 13 + .../Modules/PostFXPack/Shaders/negativeP.hlsl | 11 + .../PostFXPack/Shaders/nightVision2P.hlsl | 48 + .../Modules/PostFXPack/Shaders/pixelateP.hlsl | 21 + .../PostFXPack/Shaders/posterisationP.hlsl | 17 + .../Modules/PostFXPack/Shaders/rgbP.hlsl | 16 + .../Modules/PostFXPack/Shaders/zoomBlurP.hlsl | 25 + .../Scripts/RPGDialogEditor/defaults.cs | 5 + .../Scripts/RPGDialogEditor/editorMain.cs | 1378 ++++++++++++++ .../RPGDialogEditor/ingameRPGDialogEditor.cs | 57 + .../RPGDialog/Scripts/RPGDialogEditor/main.cs | 68 + .../Scripts/RPGDialogEditor/prefs.cs | 5 + .../RPGDialogEditor/ui/EditAnswerGui.gui | 131 ++ .../RPGDialogEditor/ui/EditQuestionGui.gui | 161 ++ .../RPGDialogEditor/ui/EditorOpeningGui.gui | 108 ++ .../ui/MainEditorScreenGui.gui | 265 +++ .../RPGDialogEditor/ui/NewScriptPopup.gui | 115 ++ .../RPGDialogEditor/ui/SetPathsPopup.gui | 169 ++ .../Scripts/RPGDialogEditor/ui/background.jpg | Bin 0 -> 152215 bytes .../Scripts/RPGDialogEditor/ui/box.png | Bin 0 -> 6836 bytes .../Scripts/RPGDialogEditor/ui/title.png | Bin 0 -> 85872 bytes .../RPGDialog/Scripts/client/RPGDialog.cs | 205 +++ .../Scripts/client/RPGDialogAudioProfiles.cs | 21 + .../RPGDialog/Scripts/server/RPGDialog.cs | 341 ++++ Templates/Modules/RPGDialog/gui/RPGDialog.gui | 156 ++ Templates/Modules/RPGDialog/gui/dla/test.dla | 3 + Templates/Modules/RPGDialog/gui/dla/test2.dla | 1 + Templates/Modules/RPGDialog/gui/dlq/test.dlq | 3 + Templates/Modules/RPGDialog/gui/dlq/test2.dlq | 1 + .../Modules/RPGDialog/gui/portraits/test.png | Bin 0 -> 2400 bytes .../RPGDialog/gui/portraits/unknown.png | Bin 0 -> 1680 bytes Templates/Modules/RPGDialog/sounds/test.wav | Bin 0 -> 25818 bytes Templates/Modules/RPGDialog/sounds/test2.wav | Bin 0 -> 21870 bytes .../Datablocks/LifelikeEffectsPackExec.cs | 21 + .../Datablocks/LifelikeEmitters.cs | 410 +++++ .../Datablocks/LifelikeExp_ComplexLarge.cs | 238 +++ .../Datablocks/LifelikeExp_ComplexSmall.cs | 238 +++ .../Datablocks/LifelikeExp_FirebombLarge.cs | 319 ++++ .../Datablocks/LifelikeExp_FirebombSmall.cs | 319 ++++ .../Datablocks/LifelikeExp_Flak.cs | 196 ++ .../Datablocks/LifelikeExp_Flashbang.cs | 238 +++ .../Datablocks/LifelikeExp_GroundHitLarge.cs | 208 +++ .../Datablocks/LifelikeExp_GroundHitSmall.cs | 204 ++ .../Datablocks/LifelikeExp_SimpleLarge.cs | 202 ++ .../Datablocks/LifelikeExp_SimpleSmall.cs | 203 ++ .../RealisticVFX/Images/dirtBlast1.png | Bin 0 -> 404142 bytes .../RealisticVFX/Images/dirtDebris.png | Bin 0 -> 140585 bytes .../Modules/RealisticVFX/Images/ember1.png | Bin 0 -> 2725 bytes .../Modules/RealisticVFX/Images/fireball.png | Bin 0 -> 411347 bytes .../Modules/RealisticVFX/Images/fireblast.png | Bin 0 -> 100358 bytes .../Modules/RealisticVFX/Images/flame1.png | Bin 0 -> 66602 bytes .../RealisticVFX/Images/invisibledebris.dts | Bin 0 -> 669 bytes .../RealisticVFX/Images/pointBurst.png | Bin 0 -> 274786 bytes .../Modules/RealisticVFX/Images/smoke1.png | Bin 0 -> 336797 bytes .../Modules/RealisticVFX/Images/smoke2.png | Bin 0 -> 368406 bytes .../Modules/RealisticVFX/Images/spark1.png | Bin 0 -> 37267 bytes .../Modules/RealisticVFX/Images/spark2.png | Bin 0 -> 1515 bytes .../Modules/RealisticVFX/Images/spark3.png | Bin 0 -> 44810 bytes .../Modules/RealisticVFX/RealisticVFX.cs | 23 + .../Modules/RealisticVFX/RealisticVFX.module | 15 + .../Images/512_forestgreen_lines.png | Bin 0 -> 10553 bytes .../512_forestgreen_lines_ALBEDO.asset.taml | 9 + .../TestGrids/Images/Grid_512_black.png | Bin 0 -> 6315 bytes .../Images/Grid_512_black_ALBEDO.asset.taml | 9 + .../TestGrids/Images/Grid_512_blue.png | Bin 0 -> 6592 bytes .../Images/Grid_512_blue_ALBEDO.asset.taml | 9 + .../TestGrids/Images/Grid_512_forestgreen.png | Bin 0 -> 3938 bytes .../Grid_512_forestgreen_ALBEDO.asset.taml | 9 + .../TestGrids/Images/Grid_512_green.png | Bin 0 -> 6622 bytes .../Images/Grid_512_green_ALBEDO.asset.taml | 9 + .../TestGrids/Images/Grid_512_grey.png | Bin 0 -> 4128 bytes .../Images/Grid_512_grey_ALBEDO.asset.taml | 9 + .../TestGrids/Images/Grid_512_grey_base.png | Bin 0 -> 1878 bytes .../Grid_512_grey_base_ALBEDO.asset.taml | 9 + .../TestGrids/Images/Grid_512_orange.png | Bin 0 -> 6295 bytes .../Images/Grid_512_orange_ALBEDO.asset.taml | 9 + .../Images/Grid_512_orange_lines.png | Bin 0 -> 88595 bytes .../Grid_512_orange_lines_ALBEDO.asset.taml | 9 + .../Modules/TestGrids/Images/Grid_512_red.png | Bin 0 -> 6632 bytes .../Images/Grid_512_red_ALBEDO.asset.taml | 9 + Templates/Modules/TestGrids/TestGrids.cs | 8 + Templates/Modules/TestGrids/TestGrids.module | 15 + .../Modules/TestGrids/art/Grid_512_black.png | Bin 0 -> 6315 bytes .../Modules/TestGrids/art/Grid_512_blue.png | Bin 0 -> 6592 bytes .../TestGrids/art/Grid_512_forestgreen.png | Bin 0 -> 3938 bytes .../art/Grid_512_forestgreen_lines.png | Bin 0 -> 10553 bytes .../Modules/TestGrids/art/Grid_512_green.png | Bin 0 -> 6622 bytes .../Modules/TestGrids/art/Grid_512_grey.png | Bin 0 -> 4128 bytes .../TestGrids/art/Grid_512_grey_base.png | Bin 0 -> 1878 bytes .../Modules/TestGrids/art/Grid_512_orange.png | Bin 0 -> 6295 bytes .../TestGrids/art/Grid_512_orange_lines.png | Bin 0 -> 88595 bytes .../Modules/TestGrids/art/Grid_512_red.png | Bin 0 -> 6632 bytes Templates/Modules/TestGrids/art/materials.cs | 91 + .../512_forestgreen_lines.asset.taml | 9 + .../materials/512_forestgreen_lines.cs | 7 + .../materials/Grid_512_black.asset.taml | 9 + .../TestGrids/materials/Grid_512_black.cs | 7 + .../materials/Grid_512_blue.asset.taml | 9 + .../TestGrids/materials/Grid_512_blue.cs | 7 + .../materials/Grid_512_forestgreen.asset.taml | 9 + .../materials/Grid_512_forestgreen.cs | 7 + .../materials/Grid_512_green.asset.taml | 9 + .../TestGrids/materials/Grid_512_green.cs | 7 + .../materials/Grid_512_grey.asset.taml | 9 + .../TestGrids/materials/Grid_512_grey.cs | 7 + .../materials/Grid_512_grey_base.asset.taml | 9 + .../TestGrids/materials/Grid_512_grey_base.cs | 7 + .../materials/Grid_512_orange.asset.taml | 9 + .../TestGrids/materials/Grid_512_orange.cs | 7 + .../Grid_512_orange_lines.asset.taml | 9 + .../materials/Grid_512_orange_lines.cs | 7 + .../materials/Grid_512_red.asset.taml | 9 + .../TestGrids/materials/Grid_512_red.cs | 7 + Templates/Modules/gameUI/GUIs/playGui.cs | 120 ++ Templates/Modules/gameUI/GUIs/playGui.gui | 50 + Templates/Modules/gameUI/gameUI.cs | 14 + Templates/Modules/gameUI/gameUI.module | 15 + 179 files changed, 10144 insertions(+), 415 deletions(-) create mode 100644 Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeP.glsl create mode 100644 Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeV.glsl create mode 100644 Templates/BaseGame/game/core/settings.xml create mode 100644 Templates/BaseGame/game/data/pbr/levels/PbrMatTest.postfxpreset.cs create mode 100644 Templates/BaseGame/game/data/ui/art/optionsMenuSliderBitmapArray.png create mode 100644 Templates/BaseGame/game/data/ui/art/slider - Copy.png create mode 100644 Templates/BaseGame/game/tools/assetBrowser/_assetImportConfigs.xml create mode 100644 Templates/Modules/AI_Guard/AI_Guard.cs create mode 100644 Templates/Modules/AI_Guard/AI_Guard.module create mode 100644 Templates/Modules/AI_Guard/Datablocks/aiPlayerDatablocks.cs create mode 100644 Templates/Modules/AI_Guard/Datablocks/aiPlayerMarker.cs create mode 100644 Templates/Modules/AI_Guard/Scripts/aiPlayer.cs create mode 100644 Templates/Modules/AI_Guard/Scripts/guardTrigger.cs create mode 100644 Templates/Modules/PostFXPack/PostFXPack.cs create mode 100644 Templates/Modules/PostFXPack/PostFXPack.module create mode 100644 Templates/Modules/PostFXPack/Scripts/postFX.cs create mode 100644 Templates/Modules/PostFXPack/Scripts/postFXPack.cs create mode 100644 Templates/Modules/PostFXPack/Shaders/blackAndWhiteP.hlsl create mode 100644 Templates/Modules/PostFXPack/Shaders/blurredVisionP.hlsl create mode 100644 Templates/Modules/PostFXPack/Shaders/chromaticAberrationP.hlsl create mode 100644 Templates/Modules/PostFXPack/Shaders/crossStitchP.hlsl create mode 100644 Templates/Modules/PostFXPack/Shaders/dreamviewP.hlsl create mode 100644 Templates/Modules/PostFXPack/Shaders/edgeDetectionP.hlsl create mode 100644 Templates/Modules/PostFXPack/Shaders/lensCircleP.hlsl create mode 100644 Templates/Modules/PostFXPack/Shaders/monochromeP.hlsl create mode 100644 Templates/Modules/PostFXPack/Shaders/negativeP.hlsl create mode 100644 Templates/Modules/PostFXPack/Shaders/nightVision2P.hlsl create mode 100644 Templates/Modules/PostFXPack/Shaders/pixelateP.hlsl create mode 100644 Templates/Modules/PostFXPack/Shaders/posterisationP.hlsl create mode 100644 Templates/Modules/PostFXPack/Shaders/rgbP.hlsl create mode 100644 Templates/Modules/PostFXPack/Shaders/zoomBlurP.hlsl create mode 100644 Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/defaults.cs create mode 100644 Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/editorMain.cs create mode 100644 Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ingameRPGDialogEditor.cs create mode 100644 Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/main.cs create mode 100644 Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/prefs.cs create mode 100644 Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/EditAnswerGui.gui create mode 100644 Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/EditQuestionGui.gui create mode 100644 Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/EditorOpeningGui.gui create mode 100644 Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/MainEditorScreenGui.gui create mode 100644 Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/NewScriptPopup.gui create mode 100644 Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/SetPathsPopup.gui create mode 100644 Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/background.jpg create mode 100644 Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/box.png create mode 100644 Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/title.png create mode 100644 Templates/Modules/RPGDialog/Scripts/client/RPGDialog.cs create mode 100644 Templates/Modules/RPGDialog/Scripts/client/RPGDialogAudioProfiles.cs create mode 100644 Templates/Modules/RPGDialog/Scripts/server/RPGDialog.cs create mode 100644 Templates/Modules/RPGDialog/gui/RPGDialog.gui create mode 100644 Templates/Modules/RPGDialog/gui/dla/test.dla create mode 100644 Templates/Modules/RPGDialog/gui/dla/test2.dla create mode 100644 Templates/Modules/RPGDialog/gui/dlq/test.dlq create mode 100644 Templates/Modules/RPGDialog/gui/dlq/test2.dlq create mode 100644 Templates/Modules/RPGDialog/gui/portraits/test.png create mode 100644 Templates/Modules/RPGDialog/gui/portraits/unknown.png create mode 100644 Templates/Modules/RPGDialog/sounds/test.wav create mode 100644 Templates/Modules/RPGDialog/sounds/test2.wav create mode 100644 Templates/Modules/RealisticVFX/Datablocks/LifelikeEffectsPackExec.cs create mode 100644 Templates/Modules/RealisticVFX/Datablocks/LifelikeEmitters.cs create mode 100644 Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_ComplexLarge.cs create mode 100644 Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_ComplexSmall.cs create mode 100644 Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_FirebombLarge.cs create mode 100644 Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_FirebombSmall.cs create mode 100644 Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_Flak.cs create mode 100644 Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_Flashbang.cs create mode 100644 Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_GroundHitLarge.cs create mode 100644 Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_GroundHitSmall.cs create mode 100644 Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_SimpleLarge.cs create mode 100644 Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_SimpleSmall.cs create mode 100644 Templates/Modules/RealisticVFX/Images/dirtBlast1.png create mode 100644 Templates/Modules/RealisticVFX/Images/dirtDebris.png create mode 100644 Templates/Modules/RealisticVFX/Images/ember1.png create mode 100644 Templates/Modules/RealisticVFX/Images/fireball.png create mode 100644 Templates/Modules/RealisticVFX/Images/fireblast.png create mode 100644 Templates/Modules/RealisticVFX/Images/flame1.png create mode 100644 Templates/Modules/RealisticVFX/Images/invisibledebris.dts create mode 100644 Templates/Modules/RealisticVFX/Images/pointBurst.png create mode 100644 Templates/Modules/RealisticVFX/Images/smoke1.png create mode 100644 Templates/Modules/RealisticVFX/Images/smoke2.png create mode 100644 Templates/Modules/RealisticVFX/Images/spark1.png create mode 100644 Templates/Modules/RealisticVFX/Images/spark2.png create mode 100644 Templates/Modules/RealisticVFX/Images/spark3.png create mode 100644 Templates/Modules/RealisticVFX/RealisticVFX.cs create mode 100644 Templates/Modules/RealisticVFX/RealisticVFX.module create mode 100644 Templates/Modules/TestGrids/Images/512_forestgreen_lines.png create mode 100644 Templates/Modules/TestGrids/Images/512_forestgreen_lines_ALBEDO.asset.taml create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_black.png create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_black_ALBEDO.asset.taml create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_blue.png create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_blue_ALBEDO.asset.taml create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_forestgreen.png create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_forestgreen_ALBEDO.asset.taml create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_green.png create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_green_ALBEDO.asset.taml create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_grey.png create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_grey_ALBEDO.asset.taml create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_grey_base.png create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_grey_base_ALBEDO.asset.taml create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_orange.png create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_orange_ALBEDO.asset.taml create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_orange_lines.png create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_orange_lines_ALBEDO.asset.taml create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_red.png create mode 100644 Templates/Modules/TestGrids/Images/Grid_512_red_ALBEDO.asset.taml create mode 100644 Templates/Modules/TestGrids/TestGrids.cs create mode 100644 Templates/Modules/TestGrids/TestGrids.module create mode 100644 Templates/Modules/TestGrids/art/Grid_512_black.png create mode 100644 Templates/Modules/TestGrids/art/Grid_512_blue.png create mode 100644 Templates/Modules/TestGrids/art/Grid_512_forestgreen.png create mode 100644 Templates/Modules/TestGrids/art/Grid_512_forestgreen_lines.png create mode 100644 Templates/Modules/TestGrids/art/Grid_512_green.png create mode 100644 Templates/Modules/TestGrids/art/Grid_512_grey.png create mode 100644 Templates/Modules/TestGrids/art/Grid_512_grey_base.png create mode 100644 Templates/Modules/TestGrids/art/Grid_512_orange.png create mode 100644 Templates/Modules/TestGrids/art/Grid_512_orange_lines.png create mode 100644 Templates/Modules/TestGrids/art/Grid_512_red.png create mode 100644 Templates/Modules/TestGrids/art/materials.cs create mode 100644 Templates/Modules/TestGrids/materials/512_forestgreen_lines.asset.taml create mode 100644 Templates/Modules/TestGrids/materials/512_forestgreen_lines.cs create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_black.asset.taml create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_black.cs create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_blue.asset.taml create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_blue.cs create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_forestgreen.asset.taml create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_forestgreen.cs create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_green.asset.taml create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_green.cs create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_grey.asset.taml create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_grey.cs create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_grey_base.asset.taml create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_grey_base.cs create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_orange.asset.taml create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_orange.cs create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_orange_lines.asset.taml create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_orange_lines.cs create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_red.asset.taml create mode 100644 Templates/Modules/TestGrids/materials/Grid_512_red.cs create mode 100644 Templates/Modules/gameUI/GUIs/playGui.cs create mode 100644 Templates/Modules/gameUI/GUIs/playGui.gui create mode 100644 Templates/Modules/gameUI/gameUI.cs create mode 100644 Templates/Modules/gameUI/gameUI.module diff --git a/Engine/source/gfx/gfxCardProfile.cpp b/Engine/source/gfx/gfxCardProfile.cpp index c223aca11..066dd3b3a 100644 --- a/Engine/source/gfx/gfxCardProfile.cpp +++ b/Engine/source/gfx/gfxCardProfile.cpp @@ -41,17 +41,22 @@ void GFXCardProfiler::loadProfileScript(const char* aScriptName) void *data = NULL; U32 dataSize = 0; + Torque::FS::ReadFile( scriptName.c_str(), data, dataSize, true ); if(data == NULL) { +#if TORQUE_DEBUG Con::warnf(" - No card profile %s exists", scriptName.c_str()); +#endif return; } const char *script = static_cast(data); +#if TORQUE_DEBUG Con::printf(" - Loaded card profile %s", scriptName.c_str()); +#endif Con::evaluate(script, false, NULL); delete[] script; diff --git a/Engine/source/gui/controls/guiSliderCtrl.cpp b/Engine/source/gui/controls/guiSliderCtrl.cpp index ad9316216..d84d6311b 100644 --- a/Engine/source/gui/controls/guiSliderCtrl.cpp +++ b/Engine/source/gui/controls/guiSliderCtrl.cpp @@ -89,6 +89,7 @@ IMPLEMENT_CALLBACK( GuiSliderCtrl, onMouseDragged, void, (), (), GuiSliderCtrl::GuiSliderCtrl() : mRange( 0., 1.f ), mTicks( 10 ), + mRenderTicks(true), mSnap( false ), mValue( 0.5f ), mThumbSize( 8, 20 ), @@ -98,7 +99,9 @@ GuiSliderCtrl::GuiSliderCtrl() mDisplayValue( false ), mMouseOver( false ), mDepressed( false ), - mMouseDragged( false ) + mMouseDragged( false ), + mUseFillBar(false), + mFillBarColor(ColorI(255,255,255)) { } @@ -117,6 +120,12 @@ void GuiSliderCtrl::initPersistFields() addProtectedField( "value", TypeF32, Offset( mValue, GuiSliderCtrl ), _setValue, defaultProtectedGetFn, "The value corresponding to the current slider position." ); + addField("useFillBar", TypeBool, Offset(mUseFillBar, GuiSliderCtrl), + "Whether to render the tick marks."); + addField("fillBarColor", TypeColorI, Offset(mFillBarColor, GuiSliderCtrl), + "Whether to render the tick marks."); + addField("renderTicks", TypeBool, Offset(mRenderTicks, GuiSliderCtrl), + "Whether to render the tick marks."); endGroup( "Slider" ); @@ -365,9 +374,18 @@ void GuiSliderCtrl::onRender(Point2I offset, const RectI &updateRect) GFXDrawUtil* drawUtil = GFX->getDrawUtil(); + if (mUseFillBar) + { + + drawUtil->drawRectFill(RectI(offset.x, offset.y, getWidth() * mValue, getHeight()), mFillBarColor); + + renderChildControls(offset, updateRect); + return; + } + if( mHasTexture ) { - if(mTicks > 0) + if(mTicks > 0 && mRenderTicks) { // TODO: tick marks should be positioned based on the bitmap dimensions. Point2I mid(ext.x, ext.y/2); @@ -443,11 +461,14 @@ void GuiSliderCtrl::onRender(Point2I offset, const RectI &updateRect) PrimBuild::vertex2i( pos.x + mid.x, pos.y + mid.y ); // tick marks - for( U32 t = 0; t <= ( mTicks + 1 ); t++ ) + if (mRenderTicks) { - S32 x = (S32)( F32( mid.x - 1 ) / F32( mTicks + 1 ) * F32( t ) ); - PrimBuild::vertex2i( pos.x + x, pos.y + mid.y - mShiftPoint ); - PrimBuild::vertex2i( pos.x + x, pos.y + mid.y + mShiftPoint ); + for (U32 t = 0; t <= (mTicks + 1); t++) + { + S32 x = (S32)(F32(mid.x - 1) / F32(mTicks + 1) * F32(t)); + PrimBuild::vertex2i(pos.x + x, pos.y + mid.y - mShiftPoint); + PrimBuild::vertex2i(pos.x + x, pos.y + mid.y + mShiftPoint); + } } PrimBuild::end(); } @@ -462,11 +483,14 @@ void GuiSliderCtrl::onRender(Point2I offset, const RectI &updateRect) PrimBuild::vertex2i( pos.x + mid.x, pos.y + mid.y ); // tick marks - for( U32 t = 0; t <= ( mTicks + 1 ); t++ ) + if (mRenderTicks) { - S32 y = (S32)( F32( mid.y - 1 ) / F32( mTicks + 1 ) * F32( t ) ); - PrimBuild::vertex2i( pos.x + mid.x - mShiftPoint, pos.y + y ); - PrimBuild::vertex2i( pos.x + mid.x + mShiftPoint, pos.y + y ); + for (U32 t = 0; t <= (mTicks + 1); t++) + { + S32 y = (S32)(F32(mid.y - 1) / F32(mTicks + 1) * F32(t)); + PrimBuild::vertex2i(pos.x + mid.x - mShiftPoint, pos.y + y); + PrimBuild::vertex2i(pos.x + mid.x + mShiftPoint, pos.y + y); + } } PrimBuild::end(); mDisplayValue = false; diff --git a/Engine/source/gui/controls/guiSliderCtrl.h b/Engine/source/gui/controls/guiSliderCtrl.h index 9a70c512e..a8f8b667c 100644 --- a/Engine/source/gui/controls/guiSliderCtrl.h +++ b/Engine/source/gui/controls/guiSliderCtrl.h @@ -39,6 +39,7 @@ class GuiSliderCtrl : public GuiControl Point2F mRange; U32 mTicks; + bool mRenderTicks; bool mSnap; F32 mValue; RectI mThumb; @@ -51,6 +52,8 @@ class GuiSliderCtrl : public GuiControl bool mMouseOver; bool mMouseDragged; bool mHasTexture; + bool mUseFillBar; + ColorI mFillBarColor; enum { diff --git a/Engine/source/gui/controls/guiTextEditCtrl.cpp b/Engine/source/gui/controls/guiTextEditCtrl.cpp index 65bb331a6..076eddc90 100644 --- a/Engine/source/gui/controls/guiTextEditCtrl.cpp +++ b/Engine/source/gui/controls/guiTextEditCtrl.cpp @@ -1246,7 +1246,7 @@ void GuiTextEditCtrl::onLoseFirstResponder() //execute the validate command if( mValidateCommand.isNotEmpty() ) - evaluate( mValidateCommand ); + evaluate( mValidateCommand.c_str() ); onValidate_callback(); diff --git a/Engine/source/gui/editor/popupMenu.cpp b/Engine/source/gui/editor/popupMenu.cpp index 9aef352ca..2c9765f09 100644 --- a/Engine/source/gui/editor/popupMenu.cpp +++ b/Engine/source/gui/editor/popupMenu.cpp @@ -286,7 +286,7 @@ void PopupMenu::showPopup(GuiCanvas *owner, S32 x /* = -1 */, S32 y /* = -1 */) Sim::findObject("PopUpMenuControl", backgroundCtrl); GuiControlProfile* profile; - Sim::findObject("GuiMenubarProfile", profile); + Sim::findObject("ToolsGuiMenuBarProfile", profile); if (!profile) return; diff --git a/Engine/source/postFx/postEffect.cpp b/Engine/source/postFx/postEffect.cpp index 2d1285102..3209192d4 100644 --- a/Engine/source/postFx/postEffect.cpp +++ b/Engine/source/postFx/postEffect.cpp @@ -1703,7 +1703,7 @@ void PostEffect::setShaderConst(const String &name, const F32 &val) void PostEffect::setShaderConst(const String& name, const int& val) { - PROFILE_SCOPE(PostEffect_SetShaderConst_Float); + PROFILE_SCOPE(PostEffect_SetShaderConst_Int); EffectConstTable::Iterator iter = mEffectConsts.find(name); if (iter == mEffectConsts.end()) diff --git a/Templates/BaseGame/game/core/Core.cs b/Templates/BaseGame/game/core/Core.cs index 99efdd706..af6f97b8a 100644 --- a/Templates/BaseGame/game/core/Core.cs +++ b/Templates/BaseGame/game/core/Core.cs @@ -27,6 +27,9 @@ function CoreModule::onCreate(%this) ModuleDatabase.LoadExplicit( "Core_GameObjects" ); ModuleDatabase.LoadExplicit( "Core_ClientServer" ); + new Settings(ProjectSettings) { file = "core/settings.xml"; }; + ProjectSettings.read(); + %prefPath = getPrefpath(); if ( isFile( %prefPath @ "/clientPrefs.cs" ) ) exec( %prefPath @ "/clientPrefs.cs" ); diff --git a/Templates/BaseGame/game/core/lighting/scripts/advancedLighting_Init.cs b/Templates/BaseGame/game/core/lighting/scripts/advancedLighting_Init.cs index c7d357bb8..b34da6d84 100644 --- a/Templates/BaseGame/game/core/lighting/scripts/advancedLighting_Init.cs +++ b/Templates/BaseGame/game/core/lighting/scripts/advancedLighting_Init.cs @@ -47,18 +47,12 @@ function onActivateAdvancedLM() // Enable the offscreen target so that AL will work // with MSAA back buffers and for HDR rendering. AL_FormatToken.enable(); - - // Activate Deferred Shading - AL_DeferredShading.enable(); } function onDeactivateAdvancedLM() { // Disable the offscreen render target. AL_FormatToken.disable(); - - // Deactivate Deferred Shading - AL_DeferredShading.disable(); } function setAdvancedLighting() diff --git a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeP.glsl b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeP.glsl new file mode 100644 index 000000000..fee0b8783 --- /dev/null +++ b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeP.glsl @@ -0,0 +1,162 @@ +//----------------------------------------------------------------------------- +// 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. +//----------------------------------------------------------------------------- +#include "../../../gl/hlslCompat.glsl" +#include "shadergen:/autogenConditioners.h" +#include "farFrustumQuad.glsl" +#include "../../../gl/torque.glsl" +#include "../../../gl/lighting.glsl" +#line 27 + +in vec4 pos; +in vec4 wsEyeDir; +in vec4 ssPos; +in vec4 vsEyeDir; + +uniform sampler2D deferredBuffer; +uniform sampler2D colorBuffer; +uniform sampler2D matInfoBuffer; +uniform samplerCube cubeMap; +uniform samplerCube irradianceCubemap; +uniform sampler2D BRDFTexture; +uniform float cubeMips; + +uniform vec4 rtParams0; + +uniform vec3 probeWSPos; +uniform vec3 probeLSPos; +uniform vec4 vsFarPlane; + +uniform float radius; +uniform vec2 attenuation; + +uniform mat4 worldToObj; +uniform mat4 cameraToWorld; + +uniform vec3 eyePosWorld; +uniform vec3 bbMin; +uniform vec3 bbMax; + +uniform float useSphereMode; + +// Box Projected IBL Lighting +// Based on: http://www.gamedev.net/topic/568829-box-projected-cubemap-environment-mapping/ +// and https://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/ +vec3 boxProject(vec3 wsPosition, vec3 reflectDir, vec3 boxWSPos, vec3 boxMin, vec3 boxMax) +{ + vec3 nrdir = reflectDir; + vec3 offset = wsPosition; + vec3 plane1vec = (boxMax - offset) / nrdir; + vec3 plane2vec = (boxMin - offset) / nrdir; + + vec3 furthestPlane = max(plane1vec, plane2vec); + float dist = min(min(furthestPlane.x, furthestPlane.y), furthestPlane.z); + vec3 posonbox = offset + nrdir * dist; + + return posonbox - boxWSPos; +} + +vec3 iblBoxSpecular(vec3 normal, vec3 wsPos, float roughness, vec3 surfToEye, + sampler2D brdfTexture, + samplerCube radianceCube, + vec3 boxPos, + vec3 boxMin, + vec3 boxMax) +{ + float ndotv = clamp(dot(normal, surfToEye), 0.0, 1.0); + + // BRDF + vec2 brdf = textureLod(brdfTexture, vec2(roughness, ndotv),0).xy; + + // Radiance (Specular) + float maxmip = pow(cubeMips+1,2); + float lod = roughness*maxmip; + vec3 r = reflect(surfToEye, normal); + vec3 cubeR = normalize(r); + cubeR = boxProject(wsPos, cubeR, boxPos, boxMin, boxMax); + + vec3 radiance = textureLod(radianceCube, cubeR, lod).xyz * (brdf.x + brdf.y); + + return radiance; +} + +float defineBoxSpaceInfluence(vec3 surfPosWS, vec3 probePos, float radius, float atten) +{ + vec3 surfPosLS = tMul( worldToObj, vec4(surfPosWS,1.0)).xyz; + + vec3 boxMinLS = probePos-(vec3(1,1,1)*radius); + vec3 boxMaxLS = probePos+(vec3(1,1,1)*radius); + + float boxOuterRange = length(boxMaxLS - boxMinLS); + float boxInnerRange = boxOuterRange / atten; + + vec3 localDir = vec3(abs(surfPosLS.x), abs(surfPosLS.y), abs(surfPosLS.z)); + localDir = (localDir - boxInnerRange) / (boxOuterRange - boxInnerRange); + + return max(localDir.x, max(localDir.y, localDir.z)) * -1; +} +out vec4 OUT_col; + +void main() +{ + + // Compute scene UV + vec2 uvScene = getUVFromSSPos( ssPos.xyz/ssPos.w, rtParams0 ); + + //eye ray WS/LS + vec3 vsEyeRay = getDistanceVectorToPlane( -vsFarPlane.w, vsEyeDir.xyz, vsFarPlane ); + vec3 wsEyeRay = tMul(cameraToWorld, vec4(vsEyeRay, 0)).xyz; + + //unpack normal and linear depth + vec4 normDepth = deferredUncondition(deferredBuffer, uvScene); + + //create surface + Surface surface = createSurface( normDepth, colorBuffer, matInfoBuffer, + uvScene, eyePosWorld, wsEyeRay, cameraToWorld); + float blendVal = 1.0; + if(useSphereMode>0) + { + vec3 L = probeWSPos - surface.P; + blendVal = 1.0-length(L)/radius; + clip(blendVal); + } + else + { + float tempAttenVal = 3.5; + blendVal = defineBoxSpaceInfluence(surface.P, probeWSPos, radius, tempAttenVal); + clip(blendVal); + float compression = 0.05; + blendVal=(1.0-compression)+blendVal*compression; + } + //render into the bound space defined above + vec3 surfToEye = normalize(surface.P - eyePosWorld); + vec3 irradiance = textureLod(irradianceCubemap, surface.N,0).xyz; + vec3 specular = iblBoxSpecular(surface.N, surface.P, surface.roughness, surfToEye, BRDFTexture, cubeMap, probeWSPos, bbMin, bbMax); + vec3 F = FresnelSchlickRoughness(surface.NdotV, surface.f0, surface.roughness); + specular *= F; + //energy conservation + vec3 kD = vec3(1.0) - F; + kD *= 1.0 - surface.metalness; + //final diffuse color + vec3 diffuse = kD * irradiance * surface.baseColor.rgb; + + OUT_col = vec4(diffuse + specular * surface.ao, blendVal); +} diff --git a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeV.glsl b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeV.glsl new file mode 100644 index 000000000..5d48e6613 --- /dev/null +++ b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeV.glsl @@ -0,0 +1,32 @@ +#include "shadergen:/autogenConditioners.h" +#include "../../torque.hlsl" + +// This is the shader input +struct Vert +{ + float4 position : POSITION; + float2 uv0 : TEXCOORD0; + float3 wsEyeRay : TEXCOORD1; +}; + +// This is the shader output data. +struct Conn +{ + float4 position : POSITION; + float2 uv0 : TEXCOORD0; + float3 wsEyeRay : TEXCOORD1; +}; + +// Render Target Paramaters +float4 rtParams0; + +Conn main(Vert IN, + uniform float4x4 modelView : register(C0)) +{ + Conn OUT; + OUT.position = IN.position; + OUT.uv0 = viewportCoordToRenderTarget( IN.uv0, rtParams0 ); + OUT.wsEyeRay = IN.wsEyeRay; + return OUT; +} + diff --git a/Templates/BaseGame/game/core/settings.xml b/Templates/BaseGame/game/core/settings.xml new file mode 100644 index 000000000..7e6bf5e0b --- /dev/null +++ b/Templates/BaseGame/game/core/settings.xml @@ -0,0 +1,13 @@ + + + + + core/ + + + + + a + + + diff --git a/Templates/BaseGame/game/data/pbr/levels/PbrMatTest.postfxpreset.cs b/Templates/BaseGame/game/data/pbr/levels/PbrMatTest.postfxpreset.cs new file mode 100644 index 000000000..e9c5e50fc --- /dev/null +++ b/Templates/BaseGame/game/data/pbr/levels/PbrMatTest.postfxpreset.cs @@ -0,0 +1,53 @@ +$PostFXManager::Settings::ColorCorrectionRamp = "core/postFX/images/null_color_ramp.png"; +$PostFXManager::Settings::DOF::BlurCurveFar = "35.2804"; +$PostFXManager::Settings::DOF::BlurCurveNear = "15.3488"; +$PostFXManager::Settings::DOF::BlurMax = "0.897196"; +$PostFXManager::Settings::DOF::BlurMin = "0.261682"; +$PostFXManager::Settings::DOF::EnableAutoFocus = "1"; +$PostFXManager::Settings::DOF::EnableDOF = ""; +$PostFXManager::Settings::DOF::FocusRangeMax = "200.943"; +$PostFXManager::Settings::DOF::FocusRangeMin = "60.7571"; +$PostFXManager::Settings::EnableDOF = "1"; +$PostFXManager::Settings::EnabledSSAO = "1"; +$PostFXManager::Settings::EnableHDR = "1"; +$PostFXManager::Settings::EnableLightRays = "0"; +$PostFXManager::Settings::EnablePostFX = "1"; +$PostFXManager::Settings::EnableSSAO = "1"; +$PostFXManager::Settings::EnableVignette = "1"; +$PostFXManager::Settings::HDR::adaptRate = "2.08"; +$PostFXManager::Settings::HDR::blueShiftColor = "1.05 0.97 1.27"; +$PostFXManager::Settings::HDR::brightPassThreshold = "0.842105"; +$PostFXManager::Settings::HDR::enableBloom = 1; +$PostFXManager::Settings::HDR::enableBlueShift = 0; +$PostFXManager::Settings::HDR::enableToneMapping = "0"; +$PostFXManager::Settings::HDR::gaussMean = "0.378947"; +$PostFXManager::Settings::HDR::gaussMultiplier = "0.0529101"; +$PostFXManager::Settings::HDR::gaussStdDev = "0.380952"; +$PostFXManager::Settings::HDR::keyValue = "0.423469"; +$PostFXManager::Settings::HDR::minLuminace = "0.0204082"; +$PostFXManager::Settings::HDR::whiteCutoff = "0.30102"; +$PostFXManager::Settings::LightRays::brightScalar = 0.75; +$PostFXManager::Settings::LightRays::decay = 1; +$PostFXManager::Settings::LightRays::density = 0.94; +$PostFXManager::Settings::LightRays::numSamples = 40; +$PostFXManager::Settings::LightRays::weight = 5.65; +$PostFXManager::Settings::SSAO::blurDepthTol = 0.001; +$PostFXManager::Settings::SSAO::blurNormalTol = 0.95; +$PostFXManager::Settings::SSAO::lDepthMax = 2; +$PostFXManager::Settings::SSAO::lDepthMin = 0.2; +$PostFXManager::Settings::SSAO::lDepthPow = 0.2; +$PostFXManager::Settings::SSAO::lNormalPow = 2; +$PostFXManager::Settings::SSAO::lNormalTol = -0.5; +$PostFXManager::Settings::SSAO::lRadius = 1; +$PostFXManager::Settings::SSAO::lStrength = 10; +$PostFXManager::Settings::SSAO::overallStrength = 2; +$PostFXManager::Settings::SSAO::quality = "2"; +$PostFXManager::Settings::SSAO::sDepthMax = 1; +$PostFXManager::Settings::SSAO::sDepthMin = 0.1; +$PostFXManager::Settings::SSAO::sDepthPow = 1; +$PostFXManager::Settings::SSAO::sNormalPow = 1; +$PostFXManager::Settings::SSAO::sNormalTol = 0; +$PostFXManager::Settings::SSAO::sRadius = 0.1; +$PostFXManager::Settings::SSAO::sStrength = 6; +$PostFXManager::Settings::Vignette::VMax = 0.85391; +$PostFXManager::Settings::Vignette::VMin = 0.2; diff --git a/Templates/BaseGame/game/data/ui/art/optionsMenuSliderBitmapArray.png b/Templates/BaseGame/game/data/ui/art/optionsMenuSliderBitmapArray.png new file mode 100644 index 0000000000000000000000000000000000000000..bd41c15b7a53ec6e612b28c09b65978ca37000e1 GIT binary patch literal 2247 zcmV;&2srnNP)W&blM4peLP7w7 z|KIit?E(a4{|iyTvh1Jon@lD*HZ~}V`g0k;vnYz%+S-!KR+7Z(?MdV2c%`*9r4qkWpD z*Vfj2J|BW0dc9tyQl&i_%(uBGPoCVpd$*#ZqQAety}iA-xVR9vkW41MUN1?K>+9TL;1_o?48w5dtK!B#{{N8>r7<4!se!m|@Q3OHw@*C#+J`f0y zB z^|rRQ>h=2k7D^a~4F&@Y!yb<(6biZBZU6uZhe0Bdn3gp50s;Vjs!ypLaGY)2G0V#^|dcEW0?s+vpECz3IgEQz`1khj?HG1$z&}pEf+6dY;0^)DwX-2Vx(Xo!2Z_O z*7xt@?{LeMn^|&Hd`z~@!$jS_h!T{xpZoanVeXk@o@q3i3l}bQcXu0&Mu`(l zIu{g0xm+&0-JVD!gf=|+QbR!y#4xP6x%teQGdp+g4242-b949a-zP~jze5uQK^l#w zyu4g4mnRa5P$)!_B*QR5zEvufb#-+FK>z?SGcz+kKfkfDkw?unnM|&%ti0!sZ!R3Lt+ilT)@rq$ zK7G2atxd1jrwM@^IKc1sbKM0109viqY&H`FvHg(z_PO@|!Gi}W)j`T6&*Oq+SuXWg zR#pH2APB;2HfuB*(Rzj`4%jwNa;-&ocemAQS~=%Cyoh3%>moy$y29JWp6FS1CZ+NB9VwnrPAy5oSc%ryU1og*GWF33r>FU zcsxr>OR-oCMbV0iicGuBWfGP+Pl^Fxo0wHxTx>R*D=I27@tZLF(kJvn&>iUa!wx3(9Gd7v>_FOa=l0r_;$XmIzA7 z48Z2*=EB0lt5>f^Mn+OaU)($?SW1*EW(m(QiL@-t1x?f8aMvSwllZ zPfw3H5mDIg8HOQAl9L>yiCKWuNj^o(t*xzBu3V|DtxfM#JdJUb5RFEKG!ZZ#YrT8- z&f#!?Ah>7Go*OrA96NTb5dVZ}n)dm8tE;OJ1eKMQNf5K7P4Y*N9^J8H$I#Hw%a<=F zCnxLc>y1WZ8YxA*aRfmO27^kanw_0pTU+yZJjrCTrlyAPWeIOMBM73?>Gtp6-`(AP z{P^+QHv=B#2qLyc^uw+H$#E zb8~a`_4NjWA@>sWJ1x82?qD!zGMTEXs?q?EfrPnNT@VCGlQ=}}o@H5y#VzNDn>0-) zlS#Q;p5ec_WETv>tgo*}qfs2kQ4~!p)qw2Z$GL@c!LlsFFfy5pPpSd`K2QI%>tFPu V?)q1$s0{!B002ovPDHLkV1nhyLI(f< literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/ui/art/slider - Copy.png b/Templates/BaseGame/game/data/ui/art/slider - Copy.png new file mode 100644 index 0000000000000000000000000000000000000000..92fee1e9c13401f0b9fb319b14ebd267b7c1c8a0 GIT binary patch literal 908 zcmV;719SX|P)BsNz zeu<3YC~{d@T`O@7=Bqd8zh+r&1N$TtpK!GELCNikCSDYg%%{_tjFWkfZXnes>n;@ zqR|aj)!gZHXh8b=y;^A;kRu8#6pO{!Mvtd3L02hDKJM?<79kE%E?3>4B+0?(MwHD# znh=bupw`5N2ruq9KZs6u_7))i@#~}<;40XaEJtI*eV$Cj55Bf2ineZ<81cX|$A?-K ziRQ$vUFqvirBbh8IBB!lrWT$p@_Epw4{y{Jk<89s7(yreE_ZXgJAlQLOs#F|`{D~e zk1JU{!ht}*1pQDv9-m=Z)*TLqIgIfHJjnm+Zki*YSv0N&+<5q!9OI!(a(m|ZDWCi2 z+7hQAJOK~#FZBQBsFq0$xe508a5Ng7>+0%qd%a%d^ZA(i`uZ`3VWtE40bY>a7M7V# zB!+jkHs_9=>37>2j-V5r7a4n=; z!uTf4JA}`P;v1uD=Z~Jdb2XVYA zW9_{!_Y>&<@ydWoCaW7|c%=l304u9lXbBBDP18sKV$fMbp11YLDqKf%e#(kCvbjnH z0IY2MSwNH|Nr;Cm_2f`8%fP&(pfq1j&P&EykrGAGkevASCV(r$>yDU`^BZRlB!U6C zWJs>$^wwoAh)RXbi7W=16Mq@GgpA26$sz+uYE0GPzMbJE%h#`yBRq)9| zM)ez$XR{;UB9VaZPe36jlnmZKpDj2gSsD4W{t>WPgB5pU{)$x*B(ajOltDF2!h9-! iq)BbrE0*;C1Q-Ck2#=cQD4UW100001gDw+ literal 0 HcmV?d00001 diff --git a/Templates/BaseGame/game/data/ui/scripts/guis/graphicsMenuSettingsSlider.taml b/Templates/BaseGame/game/data/ui/scripts/guis/graphicsMenuSettingsSlider.taml index 4bbc1c982..74a428114 100644 --- a/Templates/BaseGame/game/data/ui/scripts/guis/graphicsMenuSettingsSlider.taml +++ b/Templates/BaseGame/game/data/ui/scripts/guis/graphicsMenuSettingsSlider.taml @@ -89,7 +89,9 @@ isContainer="false" internalName="slider" canSave="true" - canSaveDynamicFields="false" /> + canSaveDynamicFields="false" + renderTicks="false" + useFillBar="true" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Templates/BaseGame/game/tools/assetBrowser/guis/assetBrowser.gui b/Templates/BaseGame/game/tools/assetBrowser/guis/assetBrowser.gui index 48f049782..20500af05 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/guis/assetBrowser.gui +++ b/Templates/BaseGame/game/tools/assetBrowser/guis/assetBrowser.gui @@ -323,7 +323,7 @@ minExtent = "64 64"; horizSizing = "relative"; vertSizing = "height"; - profile = "GuiDefaultProfile"; + profile = "ToolsGuiDefaultProfile"; visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; @@ -345,7 +345,7 @@ minExtent = "16 16"; horizSizing = "right"; vertSizing = "bottom"; - profile = "GuiDefaultProfile"; + profile = "ToolsGuiDefaultProfile"; visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; @@ -414,7 +414,7 @@ minExtent = "8 2"; horizSizing = "right"; vertSizing = "bottom"; - profile = "GuiDefaultProfile"; + profile = "ToolsGuiDefaultProfile"; visible = "1"; active = "1"; command = "AssetBrowser.showFilterPopup();"; @@ -530,7 +530,7 @@ minExtent = "16 16"; horizSizing = "right"; vertSizing = "bottom"; - profile = "GuiDefaultProfile"; + profile = "ToolsGuiDefaultProfile"; visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; @@ -657,7 +657,7 @@ minExtent = "8 2"; horizSizing = "right"; vertSizing = "bottom"; - profile = "GuiDefaultProfile"; + profile = "ToolsGuiDefaultProfile"; visible = "1"; active = "1"; command = "AssetBrowser.toggleTagFilterPopup();"; @@ -798,7 +798,7 @@ minExtent = "8 2"; horizSizing = "right"; vertSizing = "bottom"; - profile = "GuiDefaultProfile"; + profile = "ToolsGuiDefaultProfile"; visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; diff --git a/Templates/BaseGame/game/tools/assetBrowser/guis/assetImport.gui b/Templates/BaseGame/game/tools/assetBrowser/guis/assetImport.gui index f337c946f..d7e82723c 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/guis/assetImport.gui +++ b/Templates/BaseGame/game/tools/assetBrowser/guis/assetImport.gui @@ -85,7 +85,7 @@ minExtent = "8 2"; horizSizing = "width"; vertSizing = "height"; - profile = "GuiScrollProfile"; + profile = "ToolsGuiScrollProfile"; visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; @@ -243,7 +243,7 @@ minExtent = "8 2"; horizSizing = "width"; vertSizing = "height"; - profile = "GuiScrollProfile"; + profile = "ToolsGuiScrollProfile"; visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; @@ -574,7 +574,7 @@ minExtent = "8 2"; horizSizing = "width"; vertSizing = "height"; - profile = "GuiScrollProfile"; + profile = "ToolsGuiScrollProfile"; visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; diff --git a/Templates/BaseGame/game/tools/assetBrowser/guis/editAsset.gui b/Templates/BaseGame/game/tools/assetBrowser/guis/editAsset.gui index 45d411f20..483fe0d80 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/guis/editAsset.gui +++ b/Templates/BaseGame/game/tools/assetBrowser/guis/editAsset.gui @@ -66,7 +66,7 @@ minExtent = "8 2"; horizSizing = "right"; vertSizing = "bottom"; - profile = "GuiScrollProfile"; + profile = "Tools"; visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; diff --git a/Templates/BaseGame/game/tools/assetBrowser/guis/editModule.gui b/Templates/BaseGame/game/tools/assetBrowser/guis/editModule.gui index 90ff639dd..dbe060f62 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/guis/editModule.gui +++ b/Templates/BaseGame/game/tools/assetBrowser/guis/editModule.gui @@ -66,7 +66,7 @@ minExtent = "8 2"; horizSizing = "right"; vertSizing = "bottom"; - profile = "GuiScrollProfile"; + profile = "ToolsGuiScrollProfile"; visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; diff --git a/Templates/BaseGame/game/tools/assetBrowser/guis/newAsset.gui b/Templates/BaseGame/game/tools/assetBrowser/guis/newAsset.gui index 09fcb997d..379d6a521 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/guis/newAsset.gui +++ b/Templates/BaseGame/game/tools/assetBrowser/guis/newAsset.gui @@ -196,7 +196,7 @@ minExtent = "8 2"; horizSizing = "right"; vertSizing = "bottom"; - profile = "GuiScrollProfile"; + profile = "ToolsGuiScrollProfile"; visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; diff --git a/Templates/BaseGame/game/tools/assetBrowser/main.cs b/Templates/BaseGame/game/tools/assetBrowser/main.cs index c5272e44a..394cd47f6 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/main.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/main.cs @@ -22,6 +22,7 @@ if( !isObject( ToolsGuiDefaultNonModalProfile ) ) new GuiControlProfile (ToolsGuiDefaultNonModalProfile : ToolsGuiDefaultProfile) { + opaque = false; modal = false; }; diff --git a/Templates/BaseGame/game/tools/convexEditor/convexEditorToolbar.ed.gui b/Templates/BaseGame/game/tools/convexEditor/convexEditorToolbar.ed.gui index bd76a265e..2e737c942 100644 --- a/Templates/BaseGame/game/tools/convexEditor/convexEditorToolbar.ed.gui +++ b/Templates/BaseGame/game/tools/convexEditor/convexEditorToolbar.ed.gui @@ -114,7 +114,7 @@ canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "1"; - Profile = "menubarProfile"; + Profile = "ToolsMenubarProfile"; HorizSizing = "width"; VertSizing = "bottom"; Position = "195 0"; diff --git a/Templates/BaseGame/game/tools/editorClasses/gui/images/rollout.png b/Templates/BaseGame/game/tools/editorClasses/gui/images/rollout.png index 8ce3f635fdf971502ed0c61f6766d3eef48874f0..39f7caa7eeed7189cd4acac772b33c4c0c47a12a 100644 GIT binary patch literal 6247 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 hRR3Vgj1`x82O}Z4ec diff --git a/Templates/BaseGame/game/tools/editorClasses/gui/panels/navPanelProfiles.ed.cs b/Templates/BaseGame/game/tools/editorClasses/gui/panels/navPanelProfiles.ed.cs index 4f7b12867..2b690ff79 100644 --- a/Templates/BaseGame/game/tools/editorClasses/gui/panels/navPanelProfiles.ed.cs +++ b/Templates/BaseGame/game/tools/editorClasses/gui/panels/navPanelProfiles.ed.cs @@ -28,7 +28,6 @@ singleton GuiControlProfile (NavPanelProfile) category = "Editor"; }; - singleton GuiControlProfile (NavPanel : NavPanelProfile) { bitmap = "./navPanel"; @@ -64,53 +63,3 @@ singleton GuiControlProfile (NavPanelYellow : NavPanelProfile) bitmap = "./navPanel_yellow"; category = "Editor"; }; -singleton GuiControlProfile (menubarProfile : NavPanelProfile) -{ - bitmap = "./menubar"; - category = "Editor"; - - fillColor = "48 48 48"; - fontColor = "215 215 215"; - fontColorHL = "150 150 150"; - borderColor = "34 34 34"; -}; -singleton GuiControlProfile (editorMenubarProfile : NavPanelProfile) -{ - bitmap = "./editor-menubar"; - category = "Editor"; -}; -singleton GuiControlProfile (editorMenu_wBorderProfile : NavPanelProfile) -{ - bitmap = "./menu-fullborder"; - category = "Editor"; -}; -singleton GuiControlProfile (inspectorStyleRolloutProfile : NavPanelProfile) -{ - bitmap = "./inspector-style-rollout"; - category = "Editor"; -}; -singleton GuiControlProfile (inspectorStyleRolloutListProfile : NavPanelProfile) -{ - bitmap = "./inspector-style-rollout-list"; - category = "Editor"; -}; -singleton GuiControlProfile (inspectorStyleRolloutDarkProfile : NavPanelProfile) -{ - bitmap = "./inspector-style-rollout-dark"; - category = "Editor"; -}; -singleton GuiControlProfile (inspectorStyleRolloutInnerProfile : NavPanelProfile) -{ - bitmap = "./inspector-style-rollout_inner"; - category = "Editor"; -}; -singleton GuiControlProfile (inspectorStyleRolloutNoHeaderProfile : NavPanelProfile) -{ - bitmap = "./inspector-style-rollout-noheader"; - category = "Editor"; -}; -singleton GuiControlProfile (IconDropdownProfile : NavPanelProfile) -{ - bitmap = "./icon-dropdownbar"; - category = "Editor"; -}; diff --git a/Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.cs b/Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.cs index 373739be3..ba15100ee 100644 --- a/Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.cs +++ b/Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.cs @@ -22,19 +22,31 @@ function ESettingsWindow::startup( %this ) { + new ArrayObject(EditorSettingsPageList); + new ArrayObject(GameSettingsPageList); + + %this.addEditorSettingsPage("Axis", "Axis Gizmo"); + %this.addEditorSettingsPage("General", "General Settings"); + %this.addEditorSettingsPage("Camera", "Camera Settings"); + %this.addEditorSettingsPage("SceneEditor", "Scene Editor"); + %this.addEditorSettingsPage("ShapeEditor", "Shape Editor"); + %this.addEditorSettingsPage("NavEditor", "Navigation Editor"); + %this.addEditorSettingsPage("Theme", "Theme"); + + %this.addGameSettingsPage("GameGeneral", "General"); + %this.addGameSettingsPage("Gameplay", "Gameplay"); + %this.addGameSettingsPage("Paths", "Paths"); + %this.addGameSettingsPage("UI", "UI"); + %this.addGameSettingsPage("LevelDefaults", "Level Defaults"); + %this.addGameSettingsPage("GameOptions", "Game Options"); + %this.addGameSettingsPage("AssetManagement", "Asset Management"); + + %this.mode = "Editor"; } function ESettingsWindow::onWake( %this ) { - new ArrayObject(SettingsPageList); - %this.addSettingsPage("Axis", "Axis Gizmo"); - %this.addSettingsPage("General", "General Settings"); - %this.addSettingsPage("Camera", "Camera Settings"); - %this.addSettingsPage("SceneEditor", "Scene Editor"); - %this.addSettingsPage("ShapeEditor", "Shape Editor"); - %this.addSettingsPage("NavEditor", "Navigation Editor"); - ESettingsWindowList.setSelectedById( 1 ); } function ESettingsWindow::hideDialog( %this ) @@ -47,7 +59,6 @@ function ESettingsWindow::ToggleVisibility() if ( ESettingsWindow.visible ) { ESettingsWindow.setVisible(false); - EditorSettings.write(); } else { @@ -59,19 +70,50 @@ function ESettingsWindow::ToggleVisibility() ESettingsWindowList.setSelectedById( 1 ); } -/*function ESettingsWindow::addTabPage( %this, %page ) +function ESettingsWindow::toggleProjectSettings(%this) { - ESettingsWindowTabBook.add( %page ); - ESettingsWindowList.addRow( ESettingsWindowTabBook.getSelectedPage(), %page.text ); - ESettingsWindowList.sort(0); -}*/ - -function ESettingsWindow::addSettingsPage(%this, %settingsPageName, %settingsPageText) -{ - SettingsPageList.add(%settingsPageName, %settingsPageText); + %this.ToggleVisibility(); - ESettingsWindowList.addRow( SettingsPageList.count(), %settingsPageText ); + %count = GameSettingsPageList.count(); + for(%i=0; %i < %count; %i++) + { + %settingsPageText = GameSettingsPageList.getValue(%i); + ESettingsWindowList.addRow( %i, %settingsPageText ); + } ESettingsWindowList.sort(0); + + ESettingsWindowList.setSelectedById( 1 ); + + %this.mode = "Project"; + ESettingsWindow.text = "Game Project Settings"; +} + +function ESettingsWindow::toggleEditorSettings(%this) +{ + %this.ToggleVisibility(); + + %count = EditorSettingsPageList.count(); + for(%i=0; %i < %count; %i++) + { + %settingsPageText = EditorSettingsPageList.getValue(%i); + ESettingsWindowList.addRow( %i, %settingsPageText ); + } + ESettingsWindowList.sort(0); + + ESettingsWindowList.setSelectedById( 1 ); + + %this.mode = "Editor"; + ESettingsWindow.text = "Editor Settings"; +} + +function ESettingsWindow::addEditorSettingsPage(%this, %settingsPageName, %settingsPageText) +{ + EditorSettingsPageList.add(%settingsPageName, %settingsPageText); +} + +function ESettingsWindow::addGameSettingsPage(%this, %settingsPageName, %settingsPageText) +{ + GameSettingsPageList.add(%settingsPageName, %settingsPageText); } //----------------------------------------------------------------------------- @@ -79,10 +121,49 @@ function ESettingsWindow::addSettingsPage(%this, %settingsPageName, %settingsPag function ESettingsWindowList::onSelect( %this, %id, %text ) { SettingsInspector.clearFields(); - %pageName = SettingsPageList.getKey(SettingsPageList.getIndexFromValue(%text)); + + if(ESettingsWindow.mode $= "Editor") + %pageName = EditorSettingsPageList.getKey(EditorSettingsPageList.getIndexFromValue(%text)); + else + %pageName = GameSettingsPageList.getKey(GameSettingsPageList.getIndexFromValue(%text)); + eval("ESettingsWindow.get" @ %pageName @ "Settings();"); } +//Read/write field functions +function SettingsInspector::addSettingsField(%this, %settingsFieldName, %labelText, %fieldType, %tooltip, %fieldData) +{ + %moddedSettingsFieldName = strreplace(%settingsFieldName, "/", "-"); + + if(ESettingsWindow.mode $= "Editor") + %this.addCallbackField(%moddedSettingsFieldName, %labelText, %fieldType, "", EditorSettings.value(%settingsFieldName), %fieldData, "changeEditorSetting"); + else + %this.addCallbackField(%moddedSettingsFieldName, %labelText, %fieldType, "", ProjectSettings.value(%settingsFieldName), %fieldData, "changeEditorSetting"); +} + +function SettingsInspector::changeEditorSetting(%this, %varName, %value) +{ + %varName = strreplace(%varName, "-", "/"); + + echo("Set " @ %varName @ " to be " @ %value); + + if(ESettingsWindow.mode $= "Editor") + EditorSettings.setValue(%varName, %value); + else + ProjectSettings.setValue(%varName, %value); + + //%id = ESettingsWindowList.getSelectedRow(); + //ESettingsWindowList.setSelectedRow(%id); + + if(ESettingsWindow.mode $= "Editor") + %success = EditorSettings.write(); + else + %success = ProjectSettings.write(); +} + +// +// COMMON EDITOR SETTINGS +// function ESettingsWindow::getAxisSettings(%this) { SettingsInspector.startGroup("Gizmo"); @@ -182,21 +263,89 @@ function ESettingsWindow::getShapeEditorSettings(%this) SettingsInspector.endGroup(); } -//Read/write field functions -function SettingsInspector::addSettingsField(%this, %settingsFieldName, %labelText, %fieldType, %tooltip, %fieldData) +function ESettingsWindow::getThemeSettings(%this) { - %moddedSettingsFieldName = strreplace(%settingsFieldName, "/", "-"); - %this.addCallbackField(%moddedSettingsFieldName, %labelText, %fieldType, "", EditorSettings.value(%settingsFieldName), %fieldData, "changeEditorSetting"); -} + SettingsInspector.startGroup("Colors"); + SettingsInspector.addSettingsField("Theme/headerColor", "Headerbar Color", "ColorI", ""); + SettingsInspector.addSettingsField("Theme/windowBackgroundColor", "Window Background Color", "ColorI", ""); + + SettingsInspector.addSettingsField("Theme/tabsColor", "Tabs Color", "ColorI", ""); + SettingsInspector.addSettingsField("Theme/tabsHLColor", "Tabs Highlight Color", "ColorI", ""); + SettingsInspector.addSettingsField("Theme/tabsSELColor", "Tabs Selected Color", "ColorI", ""); + + SettingsInspector.addSettingsField("Theme/dividerDarkColor", "Divider Dark Color", "ColorI", ""); + SettingsInspector.addSettingsField("Theme/dividerMidColor", "Divider Mid Color", "ColorI", ""); + SettingsInspector.addSettingsField("Theme/dividerLightColor", "Divider Light Color", "ColorI", ""); + + SettingsInspector.addSettingsField("Theme/headerTextColor", "Header Text Color", "ColorI", ""); + + SettingsInspector.addSettingsField("Theme/fieldTextColor", "Field Text Color", "ColorI", ""); + SettingsInspector.addSettingsField("Theme/fieldTextHLColor", "Field Text Highlight Color", "ColorI", ""); + SettingsInspector.addSettingsField("Theme/fieldTextSELColor", "Field Text Selected Color", "ColorI", ""); + + SettingsInspector.addSettingsField("Theme/fieldBGColor", "Field Background Color", "ColorI", ""); + SettingsInspector.addSettingsField("Theme/fieldBGHLColor", "Field Background Highlight Color", "ColorI", ""); + SettingsInspector.addSettingsField("Theme/fieldBGSELColor", "Field Background Selected Color", "ColorI", ""); + + SettingsInspector.addSettingsField("Theme/tooltipBGColor", "Tooltip Background Color", "ColorI", ""); + SettingsInspector.addSettingsField("Theme/tooltipTextColor", "Tooltip Text Highlight Color", "ColorI", ""); + SettingsInspector.addSettingsField("Theme/tooltipDivColor", "Tooltip Divider Color", "ColorI", ""); + SettingsInspector.endGroup(); +} +// +// COMMON GAME SETTINGS +// +function ESettingsWindow::getGameGeneralSettings(%this) +{ + SettingsInspector.startGroup("General"); + SettingsInspector.addSettingsField("General/ProjectName", "Project Name", "string", ""); + SettingsInspector.endGroup(); +} -function SettingsInspector::changeEditorSetting(%this, %varName, %value) +function ESettingsWindow::getPathsSettings(%this) { - %varName = strreplace(%varName, "-", "/"); + SettingsInspector.startGroup("Paths"); + SettingsInspector.addSettingsField("Paths/splashImagePath", "Splash Image", "filename", ""); + SettingsInspector.addSettingsField("Paths/iconImagePath", "Icon Image", "filename", ""); + SettingsInspector.addSettingsField("Paths/missingTexturePath", "Missing Texture Image", "filename", ""); + SettingsInspector.addSettingsField("Paths/noMaterialPath", "No Material Image", "filename", ""); + SettingsInspector.addSettingsField("Paths/errorMaterialMath", "Error Material Image", "filename", ""); + SettingsInspector.endGroup(); +} + +function ESettingsWindow::getUISettings(%this) +{ + SettingsInspector.startGroup("UI"); + SettingsInspector.addSettingsField("UI/playGUIName", "Play GUI Name", "string", ""); + SettingsInspector.addSettingsField("UI/mainMenuName", "Main Menu GUI Name", "string", ""); + SettingsInspector.endGroup(); +} + +function ESettingsWindow::getAssetManagementSettings(%this) +{ + SettingsInspector.startGroup("Modules"); + SettingsInspector.addSettingsField("AssetManagement/Modules/coreModulePath", "Core Module Path", "string", ""); + SettingsInspector.addSettingsField("AssetManagement/Modules/gameDataModulePath", "Game Data Module Path", "string", ""); + SettingsInspector.addSettingsField("AssetManagement/Modules/moduleExtension", "Module Extension", "string", ""); + SettingsInspector.endGroup(); - echo("Set " @ %varName @ " to be " @ %value); - - EditorSettings.setValue(%varName, %value); - - %id = ESettingsWindowList.getSelectedRow(); - ESettingsWindowList.setSelectedRow(%id); -} \ No newline at end of file + SettingsInspector.startGroup("Assets"); + SettingsInspector.addSettingsField("AssetManagement/Assets/assetExtension", "Asset Extension", "string", ""); + SettingsInspector.addSettingsField("AssetManagement/Assets/datablockCaching", "Cache Datablocks", "bool", ""); + //SettingsInspector.addSettingsField("AssetManagement/Assets/moduleExtension", "Module Extension", "string", ""); + SettingsInspector.endGroup(); +} + +function ESettingsWindow::getGameplaySettings(%this) +{ + SettingsInspector.startGroup("Game Modes"); + SettingsInspector.addSettingsField("Gameplay/GameModes/defaultModeName", "Default Gamemode Name", "string", ""); + SettingsInspector.endGroup(); +} + +function ESettingsWindow::getGameOptionsSettings(%this) +{ + SettingsInspector.startGroup("Game Modes"); + SettingsInspector.addSettingsField("Gameplay/GameModes/defaultModeName", "Default Gamemode Name", "string", ""); + SettingsInspector.endGroup(); +} \ No newline at end of file diff --git a/Templates/BaseGame/game/tools/gui/images/button.png b/Templates/BaseGame/game/tools/gui/images/button.png index 1c7361e25e5f19d68d0029199ada0b836793d137..79c3e391b039259875611f9e86eff774afd1f0f7 100644 GIT binary patch delta 2938 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 delta 1133 zcmV-z1d{uJ7l8?oBYyxHbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$ zBS}O-RCwC#SUXP}K@c9FPYw^8m%%oMfKd_!DTF2uT7E!iNEt<0)D@a$l(zpqg%($>2F^?<-zaw4^2%?<=58M^0X0) zgiXbfhkTren1pZc@9&59HZL3>9n!a9uN8(P5BaLafC_wFU0rZ?c6O;XBMYWQE6v8GkC&RCUY?k0YNsT4tK4n*?LNiEs(ZY-L*@bB{qhhI4Vw0{%?~)AKjE zgrlP)+B>*0-+0_nSAPS$pm63X21`)RTS8vpe4rTkKsiqVw?%n_ZOos)jn~@+^G@SN zG)e^<8}q{B{At8(jI6J(Lv2kBagw4sOVJ6#k%xRWHh)qDqcbxzkV>baqqCC|vDXU2 zk%xSoN1b>oyQXJnXMso|DwAJ}^{W7M%U zpy1kVHXB&2){D2zVkzOt3`8j_vG5A69MVuTlgg&HidbOI5-RG%$}hp3(>ORd2u`OH zs;jHvX>Tw5Tw2l*wfOk>c=0qw5{bl>-Wrd`OMml1I2?w}&CL=YXocZ8d1>iKX5Z&_X_yIzo4y?||gejfVNUfUS%a=B=|pytv-Ucmc5K5T7mrDWD? z8{)WIeSLj5P%q5S%|Sf&hl1N%n>wK%5P6O~VZA`LNrl5{mBfcs65yo@)X**&DG-Ey zp??L^buD1Y#VE;GZodWWxlx)F;j)IJ>2)eDP;kK#L?)P*Tnh$X;6%6q3(P%@>12|E z*lUI1qSJ`=f)69jGP%ZKs8|+U^B9giu3qrTYP}G|Fr`MCVy{y|aGcE53&C4ZFT8s5 z0Y=`xc9OA|i0#>nm!a>A3(vJg4$oqA8-E%5x{G-~6Bd*=<0K3Bx${ZZ% z6fhhM@ED1WN-h^6N)z}YdE2~gqz15GD!Jknz~iA|-^;eqRz<+8RIXTX;5>6~DCn36 z4<8kQhQ`KFa(`dv11%o@{fjzQ7MXnIe}UX7C{KZTcjdcXxV{2&PNU21DFXL9I%Yx} z(Wve;YVn=zEqWU9JIJ1#oaiEtQA9$?o}Pjl8|jA>KS-w_o6TNI!6|uJDn&CDtvV!( zuH-=^mE6xJ{_apB_F7?hI-SZQALk+VPk;dcQd{ugkdaD=00000NkvXXu0mjfl*|)v diff --git a/Templates/BaseGame/game/tools/gui/images/tab.png b/Templates/BaseGame/game/tools/gui/images/tab.png index 76080d74d1a508f68e6d04bc88b9eb806f4b50b2..b7b7c98717c835e4a540ec7c93c26af799ce5f53 100644 GIT binary patch delta 4125 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 KRjpC64gVLSU(8$p literal 495 zcmeAS@N?(olHy`uVBq!ia0vp^&Oltj!3HE(mix;BDVAa<&kznEsNqQI0P;BtJR*x3 z82FBWFymBhK53w!WQl7;NpOBzNqJ&XDnogBxn5>oc5!lIL8@MUQTpt6Hc|`>j5(ez zjv*Cu-rh3Ix*H(iaB=yAxf)&z-_&asCLV9y+jgHr)bC|<%}j;a{k+e&FemL$5N%#| z-7tY3%xAKZ@(^>(;+s``z+w#{JVzjpoJ2{d+BGZ&$tYy-$yT@(~V0CtQ>o z`$O}~Hs`~W|I}7V*+2hz?f0CrE${ce=R1_%A(+%6q3DK#D*wGtp6~wbT37kI*BvdE zrADqhR#8zSvwzxCh!NXz2^(>Hn=HbJKZ-K@Bym~?cFGTD3z?R~*+Tf-ML_N&|J$pP V&L^+VKL(5(22WQ%mvv4FO#q@{v@!qy diff --git a/Templates/BaseGame/game/tools/gui/images/window.png b/Templates/BaseGame/game/tools/gui/images/window.png index 4d264bb24044980f1968e62d94032d57a08243c1..9aff5d276027ca3e67a5877fd8cd2c7930720a75 100644 GIT binary patch literal 5308 zcmZu#WlS7ex5c5jOQ8(z#oZkSDKIz`O0nWlY@om(#a&yVxa&{~!{8KYkzyUR*g$a` ziaWgCmv{5!OWxYqYvru$>^~sTp%DQ!RY8AM@o)R%;r!(Qtt<~T zG*X{;MrOXC*I*_uZ%;>OHwPx)KraU-hX7~CzatCvxz65fGRcvTr<6WeD5jMD88;8X z!9o&y&FV~}nb`(Q9tSQ~*4D3U#2QtjH$9KbTcKC+2$8Gz1cVg^~E-xE?i5fstOahUz}!Lkey&s*PVpJi;ixUoPigK9qg zVCBDjNFjDPc|im_8oGZbc3HGVqW>9CL6aS(^e_wTLUajr-tlbzirRr z^K2b!NjM@m%pE{p6@~+fg8bW4{)O{hskf{i(K`^2J(7fBl$0weQ@Mi6iG z05oVCHNvQiKU{ztJ`Gxv^}%K~{4i7Pf}4`T<|lyi=7yOYrZ7*qN#?BA4HfX(-#L-i z&Fe2!S+}^_iD?MqM@-vOnY*u1D5Jkd*Zh-vay7h!}6Bp zH(nYX--EJWsrTYSvu1qd{-BoX?%O;O!sP7Dh2)|7LS~t~7Goqh;qE(MZz%es|!fg%dAr#6|yCk7{VY8(Uu`G3B4&jAHYOBkd7j1eZ*HtKusb&?*A| ziCi5>-7HoiO}R{hW!V8LdV9bMc2S+l>Whi)f=RVRX<;=d!oWYL=|h+cJgOXt45n>% zfD*Oc6>hzO;qf(;gkA~nid5iXE+8zP^c=;IqG`>WTpv->T%{F0c64UdcP*d6d-@u+ z$MXdGe?mmaRkC#%do8KcGdBp$hMK~#+4NpNx;a#^riD|cY8J<4ytI19X{*y&vuG@M zUP7$z6cqL&zB%n(uE#T%Y#d5Z-y8T1UUh~NzOsz>Ue&45Z$m3wCl3X7AyQ&J!jVes5r3TG@Bn$zF$nVJW zph=>f3TQkPP&r>P+QwV6nMwVi>*^nL<{dD5@Bz`QDj}T3jRYZYH-jxO{O+hQ4<(Ka zT=KWqpH+97@vV-0jS&-}Ae`OJ#^+xvQX!MxVZhGgQ$NnhDKbEsBeOGq@tjCT{RZYZ zI3=RNMIUq%bKNOa=d+E|$ua`TncjWmDWlkZ1Mv;t?btcHB4Dw7IXziQ7clTSL2IM+ z7lllBLxJv^v5~cCfg4I{_RDJ~*q17DdhOpyKCF9QU(43#&WjuI#^S-Sg$X3<^}rkQ zmJi-mAkuUnyXI;Asu?Z&Q2(YSP{y1r8j=SdJVgW->Tk>K3l(Nu4`W!v7-nrC&SO}I z^&Qd>dkTu4Y>l6c790B5M7Jmw=VsO#ek)n6+1!8bAO93az^jNf$6-<;bbG zIqBz^CR~6oW+q;uDh3m@G-2eLoYMb7iVXvf?aU<)y`<Y-75P^-8 zfh(oP9GcFAQ=}FpDR2h<%%9^DX@2dA-g@-#Ur99JsWxNn#?}@L$&=)G8UfTGv)lc` zQStG&Zcx;TB90$g|A6YLRn@u?z`KkZg?~n@>rSHHMJie!CzDu)Api5A@Domb(LiuY za1UrLLRSbgB^U^{diIkJ&&OYkU3g^Jd~-IbsilPzv0lNGX8m4uGbDaBj&?}Wx(KYY zWx3R^08wD3SjWU;A3@TNXOO7ea~=i9SF(fF3*5o=&#XZK3|^ykmUp z&j&UVn?Bw8=gaiU=5!kt|P`i*Z!-d6Xafapoll+xF6F?2fjY$#Vtra z8(5zWNrfBe+O8z`6!Ik5HW8qY{yd>im-2EZJj2{4c%FkQ5zrFX7d1%>b3Ya=U?KD9 zL%M99x$|B&g^h%d4|JOf<0uqq5BxSDncx^Zdc8#hj*(;Cl|+y#-T)y+0?FI`)t69g z0X>xrm4vv=7;a{Rw#K(n{MrbOYJu0~6|*0sQi`Y?StJY3?{g-DM~6V69zt^+bgf=+ zZCoWL+=5Fj8DbO}cs}&(nct%ym*2V5>h*5!`_&XMt8f*Oxd7!j_GvtN`#N%eLG;f? zB8x(F<@;QVp2j>61U(szIkg0?au2#aL<6rO#dz!wieA>GlOWD?51ZqAzp}*W`PSZW zql>Yo$(;y0WDugHcm zO|^@95UeWqBBmo$yL8I7ZGWGvD;!LEG}_Pmxhg5%Vbg=47QRrCQ-w z`-SGHjE7HaDbEqOA8by%mSovp8Tq$dGKky`DO0GnVokjrjX-`3G?e;NHKpDWG&ACM z)d*Le8b**Z+hylX&kWJ%E(b2ey%j6*sI5qvFMXqi3AN{*oFKhzo)J_0BqCtGc>~yU zH)Xw($E|ne3DC+w)U_ct!mc9lp!%AiKI)@(LotY6)+h$8#o&M{gCs;Cd%CE=obu?vl#AN?ymk4GUZ?0{$tp*gyH0M zWd?vY&B}*@2smetZNYC_Kt3kKU&yant_~r3s`SklQ>`T*iM&coY7qW6+;8V~n zSnem=RKsWD-tDSQIsn1^q@RiG?SbyIWo+KqX>@-2mP3s?Ea{m-=Se?LbQEP)g+0P| z4g2*=b9ATTzwR|H$u&}v9T&E$Cn-AuPo-%_`hHQudTOl(b4p)i)cQ8BaS3`wAG6TfRgs?w zQWXXS$RMNLSE4blLg@QZA3W1|z`nIaZOO@xoEP3f(z@g-j+E~9(;?wRPoe^20Ywkk zQ&$m2g^TpJiDec60v)9W+4A3IN<#)t=yW|^{duZe_-66(drcyAwWpEibmOql^!!)7 z#@KSoD2x+Ka*r}UJ@?%dmE-P)Vbk{BM9TxLKjJ?pvb6q=B;W_2#G4H#56XmvW~fHk zhB5DH5&%xs+Mn`%Glra%AZq7!wlDUjd!)oaJ^0?;Mq9rb3vDT$gN**eKZ9k$EvoFw z_bYn_^PC@DXIc(t^alge?e-JrilnE*B=k3oM6xVG&Z0FpuM0k%NO)k7mtl_tdP*Dr_l}+&T%;9Pt<- zK8H6~!PU+t^`q}Uyw8f0C#65tp~iJRqU!uZ)*zfXJ4Lq;tcS;4hvel54=*YfNvKk1j>b6n-1RYB=GU-WmJT!*6qqO<8M8m zR;J*y|JC#)w zoBoja+RH3xU3TD?0>1RWxH!r&2~~h9c=wEmg}wiq3gOslYpDL!zqnTE2>mNhyfn>y z(9nnn{%Q0qUSj&cCay0~R}FU^hYUkXl*YIgj)sOI4OCS!3RpP&)$2lGK>7XnXo<~p za)HI_N%+!mh4CpG^cxEvzt$ymCQD#-{0w`^WT1SuJVoCqGKciQBQ^4ZO!%@D$Tl5o zHe4d|*p$;ogR+I>`Lt~(w{5t1%^OpT%=E*EMo6zJ)W9#qZk zcQu6IP^ujxmYZHwo^~!C761_evfW~z#-bff254VRKgaAt3@W5fgD?AQY9J2k#>Vbo z1>Z}_r%4yCpU~9|g0;Bi(#lBtsyhJ97WJ8+cf8J%9`M>ZbjV|AlPv!a(9|h`@M^n8(2TwL2VSIUk}Iy4RQ;oP1=fG| bK%MWfG^ro4<0R$g{&9h7FI1t*HWB{=9-9^C literal 861 zcmeAS@N?(olHy`uVBq!ia0vp^4nSPS!3HENyr$*>DVAa<&kznEsNqQI0P;BtJR*x3 z82FBWFymBhK53w!WQl7;NpOBzNqJ&XDnogBxn5>oc5!lIL8@MUQTpt6Hc|`>Ot(B; z978JRyq&u@?{a`d+x_=fZte;;l;G41>f1btJHai)!-FTZJT2i7+l`F;hOHciPLexW z*jhexDoM;@oN62W=(FLI_Dk}C(v!kZ{+zdT+v~-4RW&l#mpi*Mx*qbF?8vpkMB=yp z<5zt<^=|%T{##cc9y*`l#!Oi&(TRusmVeHR6!Q7ELrSqld{xwzsI}>D%YIuk@US)C zo_z9&gGwd%@n|{QmF9KXZJmxK#eH{xH?QF+`wRI;Y_-lXMGf z0{4cE3^|NuVhy?njxlXuy%E8%jbZi^<{P&YCOdvJ+u;b}OLHF(OGswC!IY!J5Z%xV z(&TB^u$R|NG9|wmzajIUZ)KXp)4pTs^R0CrlMPoZF*kgyh{+C^`#E}T*jvNZDnHLN zV49BANht^3r>=e-^!?AW - - Grid_512_Orange + + 72 70 68 255 + 234 232 230 255 + 100 98 96 255 + 96 94 92 255 + 59 58 57 255 + 50 49 48 255 + 72 70 68 255 + 50 49 48 255 + 240 240 240 255 + 59 58 57 255 + 236 234 232 255 + 50 49 48 255 + 37 36 35 255 + 178 175 172 255 + 43 43 43 255 + 17 16 15 255 + 255 255 255 255 + 32 31 30 255 + + + tools/gui + 1024 768 + + http://www.garagegames.com/products/torque-3d/documentation/user + ../../../Documentation/Torque 3D - Script Manual.chm + ../../../Documentation/Official Documentation.html + + + 1 + 2 + 8 + 1 + 1 + 1 + 0 + 1 + + + 1 + 1 + + + 0 + 0 + 0 + + + Categorized + + + 0 + + + + 0 + 1 + 0.8 + 100 + 0.8 + 15 + 0 + + 0 + 0 + 0 + 500 + 10 10 10 + 255 255 255 20 + + + + 0 + 50 + AssetWork_Debug.exe + 40 + screenCenter + 6 + 1 + WorldEditorInspectorPlugin + + 255 255 0 255 + 255 0 0 255 + 255 255 255 255 + 255 255 0 255 + 0 0 255 255 + 0 255 0 255 + 100 100 100 255 + + + 1 + 100 + 0 + 0 + 0 + 1 + 2 + + + 1 + 0 + 255 + 20 + 8 + + + 50 50 50 255 + 215 215 215 255 + 48 48 48 255 + 255 255 255 255 + 180 180 180 255 + + + tools/worldEditor/images/DefaultHandle + tools/worldEditor/images/SelectHandle + tools/worldEditor/images/LockedHandle + + + 1 + 1 + 1 + 1 + 1 + + + 51 51 51 100 + 0 + 255 255 255 100 + 1 + 102 102 102 100 + + + ../../../Documentation/Official Documentation.html + ../../../Documentation/Torque 3D - Script Manual.chm + http://www.garagegames.com/products/torque-3d/documentation/user + http://www.garagegames.com/products/torque-3d/forums + + + + AIPlayer data/FPSGameplay/levels @@ -14,125 +152,7 @@ - - screenCenter - 0 - WorldEditorInspectorPlugin - 1 - 40 - AssetWork_Debug.exe - 6 - 50 - - 255 255 255 255 - 100 100 100 255 - 255 255 0 255 - 255 255 0 255 - 0 0 255 255 - 255 0 0 255 - 0 255 0 255 - - - 48 48 48 255 - 255 255 255 255 - 215 215 215 255 - 180 180 180 255 - 50 50 50 255 - - - 100 - 0 - 0 - 0 - 1 - 2 - 1 - - - 51 51 51 100 - 102 102 102 100 - 1 - 255 255 255 100 - 0 - - - tools/worldEditor/images/DefaultHandle - tools/worldEditor/images/SelectHandle - tools/worldEditor/images/LockedHandle - - - http://www.garagegames.com/products/torque-3d/forums - ../../../Documentation/Official Documentation.html - ../../../Documentation/Torque 3D - Script Manual.chm - http://www.garagegames.com/products/torque-3d/documentation/user - - - 1 - 0 - 255 - 20 - 8 - - - 1 - 1 - 1 - 1 - 1 - - - - 0.8 - 100 - 0.8 - 15 - 0 - 0 - 1 - - 0 - 255 255 255 20 - 0 - 10 10 10 - 0 - 500 - - - - tools/gui - 1024 768 - - 0 - 0 - 0 - - - http://www.garagegames.com/products/torque-3d/documentation/user - ../../../Documentation/Torque 3D - Script Manual.chm - ../../../Documentation/Official Documentation.html - - - 1 - 1 - 8 - 1 - 1 - 2 - 1 - 0 - - - 0 - - - 1 - 1 - - - Categorized - - - - AIPlayer + + Grid_512_Orange diff --git a/Templates/BaseGame/game/tools/shapeEditor/gui/ShapeEditorToolbar.ed.gui b/Templates/BaseGame/game/tools/shapeEditor/gui/ShapeEditorToolbar.ed.gui index 0435e3837..ccaaf03fb 100644 --- a/Templates/BaseGame/game/tools/shapeEditor/gui/ShapeEditorToolbar.ed.gui +++ b/Templates/BaseGame/game/tools/shapeEditor/gui/ShapeEditorToolbar.ed.gui @@ -25,7 +25,7 @@ canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "1"; - Profile = "menubarProfile"; + Profile = "ToolsMenubarProfile"; HorizSizing = "width"; VertSizing = "bottom"; Position = "0 0"; diff --git a/Templates/BaseGame/game/tools/worldEditor/gui/EditorGui.ed.gui b/Templates/BaseGame/game/tools/worldEditor/gui/EditorGui.ed.gui index f860bdd42..33433fa68 100644 --- a/Templates/BaseGame/game/tools/worldEditor/gui/EditorGui.ed.gui +++ b/Templates/BaseGame/game/tools/worldEditor/gui/EditorGui.ed.gui @@ -23,7 +23,7 @@ canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "1"; - Profile = "menubarProfile"; + Profile = "ToolsMenubarProfile"; HorizSizing = "width"; VertSizing = "bottom"; Position = "0 0"; @@ -313,7 +313,7 @@ canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "1"; - Profile = "menubarProfile"; + Profile = "ToolsMenubarProfile"; HorizSizing = "width"; VertSizing = "top"; Position = "0 578"; diff --git a/Templates/BaseGame/game/tools/worldEditor/gui/ToolsToolbar.ed.gui b/Templates/BaseGame/game/tools/worldEditor/gui/ToolsToolbar.ed.gui index f57c39be7..1f15e5310 100644 --- a/Templates/BaseGame/game/tools/worldEditor/gui/ToolsToolbar.ed.gui +++ b/Templates/BaseGame/game/tools/worldEditor/gui/ToolsToolbar.ed.gui @@ -4,7 +4,7 @@ Enabled = "0"; internalName = "ToolsToolbar"; isContainer = "1"; - Profile = "editorMenubarProfile"; + Profile = "ToolsMenubarProfile"; HorizSizing = "right"; VertSizing = "bottom"; Position = "0 31"; @@ -20,7 +20,7 @@ canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "1"; - Profile = "ToolsGuiDefaultProfile"; + Profile = "ToolsMenubarProfile"; HorizSizing = "width"; VertSizing = "bottom"; position = "4 3"; diff --git a/Templates/BaseGame/game/tools/worldEditor/gui/WorldEditorToolbar.ed.gui b/Templates/BaseGame/game/tools/worldEditor/gui/WorldEditorToolbar.ed.gui index 79f34211d..95e48baaf 100644 --- a/Templates/BaseGame/game/tools/worldEditor/gui/WorldEditorToolbar.ed.gui +++ b/Templates/BaseGame/game/tools/worldEditor/gui/WorldEditorToolbar.ed.gui @@ -4,7 +4,7 @@ internalName = "WorldEditorToolbar"; Enabled = "1"; isContainer = "1"; - Profile = "ToolsGuiDefaultProfile"; + Profile = "ToolsMenubarProfile"; HorizSizing = "right"; VertSizing = "bottom"; Position = "306 0"; @@ -21,7 +21,7 @@ canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "1"; - Profile = "ToolsGuiDefaultProfile"; + Profile = "ToolsMenubarProfile"; HorizSizing = "width"; VertSizing = "bottom"; Position = "0 3"; @@ -83,7 +83,7 @@ new GuiControl(SnapToBar){ isContainer = "1"; - profile = "ToolsGuiDefaultProfile"; + profile = "ToolsMenubarProfile"; Position = "116 3"; Extent = "123 27"; Padding = "4"; @@ -296,7 +296,7 @@ new GuiControl(ToggleButtonBar){ isContainer = "1"; - profile = "ToolsGuiDefaultProfile"; + profile = "ToolsMenubarProfile"; Position = "313 3"; Extent = "65 27"; @@ -377,7 +377,7 @@ new GuiControl(ToggleNodeBar){ isContainer = "1"; - profile = "ToolsGuiDefaultProfile"; + profile = "ToolsMenubarProfile"; Position = "386 3"; Extent = "63 27"; @@ -441,7 +441,7 @@ new GuiControl(PrefabBar){ isContainer = "1"; - profile = "ToolsGuiDefaultProfile"; + profile = "ToolsMenubarProfile"; Position = "386 3"; Extent = "63 27"; visible = true; diff --git a/Templates/BaseGame/game/tools/worldEditor/gui/WorldEditorTreeWindow.ed.gui b/Templates/BaseGame/game/tools/worldEditor/gui/WorldEditorTreeWindow.ed.gui index cae52e378..92966857f 100644 --- a/Templates/BaseGame/game/tools/worldEditor/gui/WorldEditorTreeWindow.ed.gui +++ b/Templates/BaseGame/game/tools/worldEditor/gui/WorldEditorTreeWindow.ed.gui @@ -274,6 +274,7 @@ canSave = "1"; Visible = "1"; tooltipprofile = "ToolsGuiToolTipProfile"; + profile = "ToolsGuiScrollProfile"; hovertime = "1000"; Docking = "Client"; Margin = "0 0 0 0"; diff --git a/Templates/BaseGame/game/tools/worldEditor/gui/guiWorldEditorCreatorWindow.ed.gui b/Templates/BaseGame/game/tools/worldEditor/gui/guiWorldEditorCreatorWindow.ed.gui index 03a3d6d8a..31652d293 100644 --- a/Templates/BaseGame/game/tools/worldEditor/gui/guiWorldEditorCreatorWindow.ed.gui +++ b/Templates/BaseGame/game/tools/worldEditor/gui/guiWorldEditorCreatorWindow.ed.gui @@ -79,6 +79,7 @@ canSave = "1"; Visible = "1"; tooltipprofile = "ToolsGuiToolTipProfile"; + profile = "ToolsGuiScrollProfile"; hovertime = "1000"; Docking = "Client"; Margin = "0 0 0 0"; diff --git a/Templates/BaseGame/game/tools/worldEditor/scripts/lightViz.cs b/Templates/BaseGame/game/tools/worldEditor/scripts/lightViz.cs index 574063460..1b2e5de3d 100644 --- a/Templates/BaseGame/game/tools/worldEditor/scripts/lightViz.cs +++ b/Templates/BaseGame/game/tools/worldEditor/scripts/lightViz.cs @@ -51,13 +51,11 @@ function toggleColorBufferViz( %enable ) } else if ( %enable ) { - AL_DeferredShading.disable(); AL_ColorBufferVisualize.enable(); } else if ( !%enable ) { AL_ColorBufferVisualize.disable(); - AL_DeferredShading.enable(); } } @@ -360,12 +358,7 @@ function toggleBackbufferViz( %enable ) if ( %enable $= "" ) { $AL_BackbufferVisualizeVar = AL_DeferredShading.isEnabled() ? true : false; - AL_DeferredShading.toggle(); } - else if ( %enable ) - AL_DeferredShading.disable(); - else if ( !%enable ) - AL_DeferredShading.enable(); } function toggleColorBlindnessViz( %enable ) diff --git a/Templates/BaseGame/game/tools/worldEditor/scripts/menus.ed.cs b/Templates/BaseGame/game/tools/worldEditor/scripts/menus.ed.cs index 7f87df251..43bb65ea4 100644 --- a/Templates/BaseGame/game/tools/worldEditor/scripts/menus.ed.cs +++ b/Templates/BaseGame/game/tools/worldEditor/scripts/menus.ed.cs @@ -116,7 +116,7 @@ function EditorGui::buildMenus(%this) extent = Canvas.extent.x SPC "20"; minExtent = "320 20"; horizSizing = "width"; - profile = "GuiMenuBarProfile"; + profile = "ToolsGuiMenuBarProfile"; }; // File Menu @@ -185,11 +185,12 @@ function EditorGui::buildMenus(%this) Item[9] = "Select..." TAB "" TAB "EditorGui.toggleObjectSelectionsWindow();"; item[10] = "-"; item[11] = "Audio Parameters..." TAB "" TAB "EditorGui.toggleSFXParametersWindow();"; - item[12] = "Editor Settings..." TAB "" TAB "ESettingsWindow.ToggleVisibility();"; - item[13] = "Snap Options..." TAB "" TAB "ESnapOptions.ToggleVisibility();"; - item[14] = "-"; - item[15] = "Game Options..." TAB "" TAB "Canvas.pushDialog(optionsDlg);"; - item[16] = "PostEffect Manager" TAB "" TAB "Canvas.pushDialog(PostFXManager);"; + item[12] = "Editor Settings..." TAB "" TAB "ESettingsWindow.toggleEditorSettings();"; + item[13] = "Game Settings..." TAB "" TAB "ESettingsWindow.toggleProjectSettings();"; + item[14] = "Snap Options..." TAB "" TAB "ESnapOptions.ToggleVisibility();"; + item[15] = "-"; + item[16] = "Game Options..." TAB "" TAB "Canvas.pushDialog(optionsDlg);"; + item[17] = "PostEffect Manager" TAB "" TAB "Canvas.pushDialog(PostFXManager);"; }; %this.menuBar.insert(%editMenu); diff --git a/Templates/Modules/AI_Guard/AI_Guard.cs b/Templates/Modules/AI_Guard/AI_Guard.cs new file mode 100644 index 000000000..abbf83314 --- /dev/null +++ b/Templates/Modules/AI_Guard/AI_Guard.cs @@ -0,0 +1,16 @@ +function AI_Guard::onCreate(%this) +{ + exec("./Scripts/aiPlayer.cs"); + exec("./Scripts/guardTrigger.cs"); + + if(isObject(DatablockFilesList)) + { + DatablockFilesList.add( "data/AI_Guard/Datablocks/aiPlayerDatablocks.cs" ); + DatablockFilesList.add( "data/AI_Guard/Datablocks/aiPlayerMarker.cs" ); + } +} + +function AI_Guard::onDestroy(%this) +{ +} + diff --git a/Templates/Modules/AI_Guard/AI_Guard.module b/Templates/Modules/AI_Guard/AI_Guard.module new file mode 100644 index 000000000..dab279ed2 --- /dev/null +++ b/Templates/Modules/AI_Guard/AI_Guard.module @@ -0,0 +1,15 @@ + + + diff --git a/Templates/Modules/AI_Guard/Datablocks/aiPlayerDatablocks.cs b/Templates/Modules/AI_Guard/Datablocks/aiPlayerDatablocks.cs new file mode 100644 index 000000000..d998140db --- /dev/null +++ b/Templates/Modules/AI_Guard/Datablocks/aiPlayerDatablocks.cs @@ -0,0 +1,53 @@ +// aiPlayerDatablocks.cs +// breaks out the datablocks for aiguard.cs to make them easier to edit. +// also manages the trigger controller + +////////////////////////////////////// +// +// TRIGGER CONTROLLER +// This code handles the placing and behavior of aiSoldierTriggers +///////////////////////////////////////// + +datablock TriggerData(guardTrigger) +{ + tickPeriodMS = 100; +}; + +//////////////////////////////////////// +//This is the default datablock for the Guard. +//I changed the stock datablock name from those used in AIPLAYER.CS +//I did this to allow me to create different classes of bots with their own +//thinking and reaction routines for each class. +/////////////////////////////////// +// +//You can specifiy as many datablocks as you have characters. +//The first variable after PlayerData must be a unique name. The second variable (after the semicolon) +//must be a valid body type. + +datablock PlayerData(DemoPlayer : DefaultPlayerData) +{ + maxDamage = 100; + + maxForwardSpeed = 14; + maxBackwardSpeed = 13; + maxSideSpeed = 13; + + //The art used by this datablock + shapeFile = "data/Soldier/Shapes/soldier_Rigged.DAE";//"art/shapes/actors/Soldier/soldier_rigged.DAE"; + + //Set the bot's inventory so it can use different weapons + maxInv[Rifle] = 1; + maxInv[BulletAmmo] = 1000; + maxInv[RocketLauncher] = 1; + maxInv[RocketLauncherAmmo] = 1000; + maxInv[GrenadeLauncher] = 1; + maxInv[GrenadeLauncherAmmo] = 1000; + + maxInvRifle = "1"; + maxInvBulletAmmo = "1000"; + maxInvGrenadeLauncher = "1"; + maxInvGrenadeLauncherAmmo = "1000"; + maxInvRocketLauncher = "1"; + maxInvRocketLauncherAmmo = "1000"; +}; + diff --git a/Templates/Modules/AI_Guard/Datablocks/aiPlayerMarker.cs b/Templates/Modules/AI_Guard/Datablocks/aiPlayerMarker.cs new file mode 100644 index 000000000..71014097b --- /dev/null +++ b/Templates/Modules/AI_Guard/Datablocks/aiPlayerMarker.cs @@ -0,0 +1,16 @@ +//The AIPlayer marker is placed in the map during edit mode. When the map is loaded the +//marker is replaced by a guard player. (Assuming that the $AI_GUARD_ENABLED variable is set +//to true.) The marker is hidden or not depending on the value set in $AI_GUARD_MARKER_HIDE. +//The AIPlayer marker can use a dynamic variable - set during map creation - called 'respawn' +//Creating and setting the 'respawn' variable will override the default value set in +//$AI_GUARD_DEFAULTRESPAWN. This allows more freedom in determining which bots respawn and which do not. + +datablock StaticShapeData(AIPlayerMarker) +{ + // Mission editor category, this datablock will show up in the + // specified category under the "shapes" root category. + category = "AIMarker"; + + // Basic Item properties + shapeFile = "data/Soldier/Shapes/soldier_Rigged.DAE";//"art/shapes/actors/Soldier/soldier_rigged.DAE"; +}; \ No newline at end of file diff --git a/Templates/Modules/AI_Guard/Scripts/aiPlayer.cs b/Templates/Modules/AI_Guard/Scripts/aiPlayer.cs new file mode 100644 index 000000000..1a9adad3a --- /dev/null +++ b/Templates/Modules/AI_Guard/Scripts/aiPlayer.cs @@ -0,0 +1,1639 @@ +//The aiPlayer.cs file creates a guard-style bot that can also be pathed. +//The guard uses a simple state machine to control it's actions. + +//The bots actions are as follows: +//Dead: The bot stops all activity and is dead. +//Guarding: When guarding the bot scans for new targets, and when one is found it switches to 'Attacking' +//Attacking: The guard tries to close with the target while firing and checking for target updates. +//Holding: When the bot loses a target it will go into a holding pattern. While holding the bot's FOV +// is enhanced. The bot holds for a set number of cycles before changing it's action state to +// 'Returning' +//Returning: The bot tries to return to it's original position. While returning the guard looks for new targets +// and checks it motion relattive to it's last movement to determine if it is stuck. +// If it is stuck the bot tries to move is a random direction to try and clear the obstacle. +// (Not always a foolproof solution, but in a simple environment it works well enough.) +//Defending: When a bot takes damage it's status is set to defending. The bot sidesteps and then +// goes into a holding pattern. This does two things. It enhances the bots FOV and it scans for +// targets. Plus it will have the bot return to it's original position if there is no +// perceivable threat in range. +//NoTarget This is set when the bot loses sight or perception of it's targets. This is used to help +// clear the bots aim and other housekeeping functions + +//The following are global variables used to set the guards basic settings. +$AI_GUARD_ENABLED = true; //Whether Guard bots are loaded during mission loading. +$AI_GUARD_MARKER_HIDE = true; //Turns marker hiding on or off - useful when editing maps. +$AI_GUARD_WEAPON = "Lurker"; //Which weapon do you want the guard to use +$AI_GUARD_ENDLESS_AMMO = true; //When set to true the guard will replenish its ammo perpetually +$AI_GUARD_WEAPON_USES_AMMO = true; //Set this to false for energy weapons that do not use ammo +$AI_GUARD_SIDESTEP = 20; //This value helps determine how far a bot sidesteps when he is stuck. + //The computer picks a random number between 1 and $AI_GUARD_SIDESTEP + //The value is then subtracted by half it's value to create a left/right + //and forward/back component. So the effective range is really -10 to +10 + //with the default setting of 20 +$AI_GUARD_DETECT_ITEM_RANGE = 50; //Sets how far around itself a bot will look for items to pick up +$AI_GUARD_HOLDCNT_MAX = 10; //The number of think cycles that the bot will 'hold' for before trying to + //return to his post. +$AI_GUARD_FIREDELAY = 1000; //How long the bot waits between firing bursts. +$AI_GUARD_ENHANCED_FOV_TIME = 2000; //How long the bots field of vision is enhanced to 360 for. +$AI_GUARD_FOV = 200; //The guards field of vision +$AI_GUARD_ENHANCED_DEFENDING_TIME = 5000; //How long the bot gets a 360 FOV and a longer detect distance for after being sniped. +$AI_GUARD_ENHANCED_DEFENDING_DISTANCE = 100; //Detect distance after being sniped. +$AI_GUARD_DETECT_DISTANCE = 50; //The range at which a guardbot will start reacting to a client target +$AI_GUARD_IGNORE_DISTANCE = 40; //The range at which the bot ignores a client and will not fire on it. +$AI_GUARD_MAX_DISTANCE = 5; //The bot will stop and try to stay at this distance or less from the player. +$AI_GUARD_RANGED_MAX_DISTANCE = 15; //Bots flagged as ranged will stop and try to stay at this distance or less from the player. +$AI_GUARD_MAX_PACE = 12; //The maximum range the mobs pace away from their guard point. (works like AI_GUARD_SIDESTEP) +$AI_GUARD_MIN_PACE = 1.5; //The minimum range the mobs pace away from their guard point. +$AI_GUARD_PACE_SPEED = 0.5; //Set the speed of the mob while pacing (1.0 is 100%, 0.5 is 50%) +$AI_GUARD_PACE_TIME = 4; //Sets how many think cycles the bot has to travel to it's location (or stand at + //it's location if it's already there) before getting another one to move to, random between 1 and this number. +$AI_GUARD_LOS_TIME = 100; //The amount of time after the bot loses sight of player that it will get their position. + //This helps the bot turn sharp corners. Set it to 1 or 0 if you don't want the bot to cheat. +$AI_GUARD_LOS_BYPASS = 3; //The distance at which positions will not have line of sight tests done on them. + //This is needed because the bot can not see the area around its feet. +$AI_GUARD_CORNERING = 0.8; //How close the bot will attempt to take corners. If the bot is having problems with corners, + //adjust this value, $AI_GUARD_LOS_TIME and $AI_GUARD_LOS_BYPASS as needed (will vary based on run speed). +$AI_GUARD_SCANTIME = 500; //The quickest time between think cycles. +$AI_GUARD_MAX_ATTENTION = 10; //This number and $AI_GUARD_SCANTIME are multiplied to set the delay in the + //thinking loop. Used to free up processor time on bots out of the mix. +$AI_GUARD_CREATION_DELAY = 3000; //How long a bot waits after creation before his think cycles are controlled by + //his attention rate. (Used to help free up think cycles on bots while misison + //finishes loading. +$AI_GUARD_TRIGGER_DOWN = 100; //How long the bot holds down the trigger when firing. Use longer pulses for + //pray and spray type weapons. +$AI_GUARD_DEFAULTRESPAWN = true; //Controls whether guards respawn automatically or not if their marker does not have + //dynamic 'respawn' variable set in it. +$AI_GUARD_RESPAWN_DELAY = 18000; //Determines how long a bot goes in between death and respawning. +$AI_GUARD_ENHANCEFOV_CHANCE = 25; //There is a 1 in x chance that guard will see 360 deg vision to prevent it + //from being snuck up on. +$AI_GUARD_SEEK_HEALTH_LVL = 65; //This sets at what damage level a bot will attempt to look for a health pack nearby. +$AI_GUARD_CHAR_TYPE = DemoPlayer; //This is the default datablock that is spawned as the bot unless another is specified on the node + +//The onReachDestination function is responsible for setting the bots 'action' +//state to the appropriate setting depending on what action the bot was following +//to reach the destination. +function DemoPlayer::onReachDestination(%this, %obj) +{ + //Picks an appropriate set of actions based on the bots 'action' variable + switch$(%obj.action) + { + //If the bot is attacking when it reaches it's target it will go into a hold. + case "Attacking": + %obj.action="Holding"; + //If the bot is returning it has two possible scenarios for reaching a destination + //The first case is the the bot sidestepped and has reached it's sidestep location. + //If that is the case, then the bot goes into a quick hold. (Which sets the bot to + //only hold for 1 cycle before returning to his post.) + //The other alternative is that the bot has returned as is back at it's original position. + //If this is the case, then the bot's transform is set to match that of it's marker's + //transformation. + //This will cause a snapping into position - but it ensures that your guard always faces the + //direction you want it to when it returns to it's post. + //(It also helps to make sure that your markers are set as close to the ground as possible. + //Otherwise your bots will hop up and drop from the sky when they return to post.) + case "Returning": + //If the bot is pathed have it move to the next node on its path + if (%obj.path !$= "") + { + //Check if the bot's guarding + if (%obj.doesGuard $= "guard") + { + if (%obj.returningPos == %obj.marker.getposition()) + { + %obj.moveToNextNode(%this.returningPath); + } + else + { + %obj.path = ""; + %obj.doesGuard = ""; + } + } + else + %obj.moveToNextNode(%this.returningPath); + } + else + { + if (%obj.doesGuard $= "guard") + %basedist = vectorDist(%obj.getposition(), %obj.marker.getposition()); + else + %basedist = vectorDist(%obj.getposition(), %obj.returningPos); + //if the bot is close to his original position then set it's action to + //Guarding and set it to it's original facing and position. + if(%basedist < 1.0) + { + %obj.action = "Guarding"; + //Set the bots returning position to its marker if it's guarding + if (%obj.doesGuard $= "guard") + %obj.settransform(%obj.marker.gettransform()); + else + %obj.settransform(%obj.returningTrans); + %obj.clearaim(); + } + //if the bot is away from his post, then he must have gotten here + //as a result of sidestepping so set him to do a quick hold to scan + //for targets then return to post. + else + { + //Sets holdcnt to 1 less than the max. Ensures that the bot only holds for 1 cycle. + //before trying to return. + %obj.holdcnt=$AI_GUARD_HOLDCNT_MAX-1; + %obj.action="Holding"; + } + } + //The bot was defending and sidestepped. So set him to 'hold' to check for targets + //and to prepare to return to post if no targets are found. + case "Defending": + %obj.action = "Holding"; + + case "RetrievingItem": + %obj.holdcnt=$AI_GUARD_HOLDCNT_MAX-1; + %obj.action="Holding"; + } +} + +//The OnDamage function sets the bots action to 'Dead' and starts the respawn process +//if called for. +function DemoPlayer::OnDamage(%this, %obj, %delta) +{ + if (%obj.action !$="GetHealth") + { + if (%obj.action !$= "Attacking" && %obj.action !$= "Defending" && %obj.getstate() !$="Dead") + { + %obj.enhancedefending(%obj); + } + %obj.action = "Defending"; + } + + if(%obj.getstate() $="Dead") + %obj.action="Dead"; + + if(%obj.getState() $= "Dead" && %obj.respawn == true) + { + //%obj.delaybeforerespawn(%obj.botname, %obj.marker); + %this.player = 0; + } +} + +//The delay before respawn function is set to wait a specified duration before +//respawning an AIPlayer +function AIPlayer::DelayBeforeRespawn(%this, %name, %marker) +{ + %this.respawntrigger = %this.schedule($AI_GUARD_RESPAWN_DELAY,"spawn", %name, %marker); +} + +//The LoadEntities function replaces the markers placed in the map with the AI bots during the +//mission loading. +function AIPlayer::LoadEntities() +{ + //Check to see if the AIPlayers are to be loaded. + if ($AI_GUARD_ENABLED == true) + { + echo("Loading Guard entities..."); + //This performs a search for all items within the radius from the starting point. + //All of the items that match "AIPlayerMarker" trigger a bot to be placed at the + //position of the marker found. + %position = "0 0 0"; + %radius = 100000.0; + InitContainerRadiusSearch(%position, %radius, $TypeMasks::StaticObjectType); + %i=0; + while ((%targetObject = containerSearchNext()) != 0) + { + if(%targetobject.getclassname() $= "StaticShape") + { + if (%targetobject.getDataBlock().getName() $= "AIPlayerMarker") + { + %i++; + + // Let's check to see if the marker specifies a datablock. + // if so, we spawn that datablock model instead of the default + if (%targetObject.block $= "") + { + %block = $AI_GUARD_CHAR_TYPE; + } + else + { + %block = %targetObject.block; + } + %player = AIPlayer::spawnAtMarker("Guard" @ %i, %targetobject, %block); + } + } + } + } + else + { + echo("Guard entities disabled..."); + } + + //This determines whether to hide or not hide the markers during mission loading. + //It's helpful to have the markers visible when editing the map and fine tuning the bot + //placement. + //This search is identical to the one above, only it hides the markers if found. + if ($AI_GUARD_MARKER_HIDE == true) + { + echo("Hiding Guard markers..."); + %position = "0 0 0"; + %radius = 100000.0; + InitContainerRadiusSearch(%position, %radius, $TypeMasks::StaticObjectType); + while ((%targetObject = containerSearchNext()) != 0) + { + if(%targetobject.getclassname() $= "StaticShape") + { + if (%targetobject.getDataBlock().getName() $= "AIPlayerMarker") + %targetobject.setAllMeshesHidden(true); + } + } + } +} + +function AIPlayer::spawnByGroup(%spawnGroup) +{ + echo ("spawning group " @ %spawnGroup); + + //echo("Loading soldiers!"); + + //This performs a search for all items within the radius from the starting point. + //All of the items that match "AIPlayerMarker" trigger a bot to be placed at the + //position of the marker found. + + %position = "0 0 0"; + %radius = 100000.0; + InitContainerRadiusSearch(%position, %radius, $TypeMasks::StaticObjectType); + %i=0; + while ((%targetObject = containerSearchNext()) != 0) + { + if(%targetobject.getclassname() $= "StaticShape") + { + if (%targetobject.getDataBlock().getName() $= "AIPlayerMarker") + { + %i++; + echo("target's spawn is " @ %targetObject.spawnGroup); + if (%targetObject.spawnGroup $= %spawnGroup) + { + // we're in the correct spawn group! + + // Let's check to see if the marker specifies a datablock. + // if so, we spawn that datablock model instead of the default + if (%targetObject.block $= "") + { + %block = $AI_GUARD_CHAR_TYPE; + } + else + { + %block = %targetObject.block; + } + + // let's spawn some bad guys! + %player = AIPlayer::spawnAtMarker("Guard" @ %i, %targetobject, %block); + } + } + } + } + //This determines whether to hide or not hide the markers during mission loading. + //It's helpful to have the markers visible when editing the map and fine tuning the bot + //placement. + //This search is identical to the one above, only it hides the markers if found. + if ($AI_GUARD_MARKER_HIDE == true) + { + echo("Hiding Guard markers..."); + %position = "0 0 0"; + %radius = 100000.0; + InitContainerRadiusSearch(%position, %radius, $TypeMasks::StaticObjectType); + while ((%targetObject = containerSearchNext()) != 0) + { + if(%targetobject.getclassname() $= "StaticShape") + { + if (%targetobject.getDataBlock().getName() $= "AIPlayerMarker") + { + if (%targetObject.spawnGroup $= %spawnGroup) + %targetobject.setAllMeshesHidden(true); + } + } + } + } +} + +//This function sets the bots aim to the current target, and 'pulls' the trigger +//of the weapon of the bot to begin the firing sequence. +function AIPlayer::openfire(%this, %obj, %tgt) +{ + //If the bot is dead or the target is dead then let's bail out of here. + if (%obj.getState() $= "Dead" || %tgt.player.getstate() $="Dead") + { + %obj.firing = false; + %obj.NoTarget(); + } + else + { + //We've got two live ones. So let's kill something. + //The firing variable is set while firing and is cleared at the end of the delay cycle. + //This is done to allow the use of a firing delay - and prevent a bot from firing again + //prematurely. + if(!%obj.firing) + { + //Gets the range to target - rtt + %rtt=vectorDist(%obj.getposition(), %tgt.player.getposition()); + + //If the target is within our ignore distance then we will attack. + if(%rtt < $AI_GUARD_IGNORE_DISTANCE) + { + if(%obj.fireLater <= 0 && %obj.getAimLocation() != %tgt.player.getposition()) //Fix for premature firing + { + %obj.fireLater++; + return; + } + //Sets the firing variable to true + %obj.firing = true; + + if($AI_GUARD_WEAPON_USES_AMMO) + { + if($AI_GUARD_ENDLESS_AMMO == true) + { + %obj.incinventory(%obj.botWeapon @"Ammo",100); + } + } + + //'Pulls' the trigger on the bot gun. + %obj.setImageTrigger(0,true); + //This sets a delay of $AI_GUARD_TRIGGER_DOWN length to hold the trigger down for. + %this.trigger = %this.schedule($AI_GUARD_TRIGGER_DOWN,"ceasefire", %obj); + } + else + { + //There was a target when openfire was called, but now they're out of range so + //we have no target. Call NoTarget to clear the bots aim. + %obj.NoTarget(%obj); + } + } + } +} + +//This simply clears the bots aim to have it look forward relative to it's movement. +function AIPlayer::NoTarget(%this, %obj) +{ + %obj.clearaim(); +} + +//Ceasefire is called by the openfire function after the set delay to +//hold the trigger down is met. +function AIPlayer::ceasefire(%this, %obj) +{ + //Turns off the trigger, or lets off of it. + %obj.setImageTrigger(0,false); + //This sets the delay between when we let off the trigger and how soon it will + //be before we allow the bot to fire again. + %this.ceasefiretrigger = %this.schedule($AI_GUARD_FIREDELAY,"delayfire", %obj); +} + +//delayfire is called to clear the firing variable. Clearing this allows +//the bot to fire again in the openfire function. +function AIPlayer::delayfire(%this, %obj) +{ + //this is the end of the firing cycle + %obj.firing = false; +} + + +//----------------------------------------------------------------------------- +// AIPlayer static functions +//----------------------------------------------------------------------------- + +//This is the spawn function for the bot. +function AIPlayer::spawn(%this, %name, %obj, %block) +{ + if (%obj.block $= "") + { + %block = $AI_GUARD_CHAR_TYPE; + } + else + { + %block = %obj.block; + } + + // Create the demo player object + %player = new AIPlayer() { + dataBlock = %block; + + //The marker is the AIPlayer marker object that the guard is associated with. + //The marker object is kept with the player data because it's location, and + //dynamic variable values are used in several functions. This also allows the addition + //of future dynamic variables without having to change the spawn/respawn functions to + //access them. + marker = %obj; + botname = %name; + //Sets the bot's field of vision + fov = $AI_GUARD_FOV; + //Sets the bot's detect distance + detdis = $AI_GUARD_DETECT_DISTANCE; + //Sets the bot's returning position and transform + returningPos = %obj.getposition(); + returningTrans = %obj.gettransform(); + //Sets the bot not to return to a path as soon as it is loaded + //The pathed bots will go to there paths at another point + returningPath = 0; + //Fix for premature firing + fireLater = 0; + //Sets the bot's pacing + pace = $AI_GUARD_PACE_TIME; + //The pathname variable is a dynamic variable set during map editing. + //This allows the designer to attach each bot to a seperate path + path = %obj.pathname; + //Is the bot using a ranged weapon + weapRange = %obj.range; + //Does the bot return to its spawn point + doesGuard = %obj.doesReturn; + //Sets whether the bot is AI or not + isbot=true; + //Thinking variables + //Firing tells whether or not we're in the midst of a firing sequence. + firing = false; + //The 'action' variable holds the state of the bot - which controls how it + //thinks. + holdcnt = $AI_GUARD_HOLDCNT_MAX-1; + action = "Holding"; + //The bots starting attention level is set to half of it's range. + attentionlevel = $AI_GUARD_MAX_ATTENTION/2; + + //Oldpos holds the position of the bot at the end of it's last 'think' cycle + //This is used to help determine if a bot is stuck or not. + oldpos = %obj.getposition(); + //Added for bots use different weapons + botWeapon = $AI_GUARD_WEAPON; + }; + + MissionCleanup.add(%player); + + // if the field is not blank, set the weapon variable to the weapon + // otherwise, use default. + if (%obj.Weapon !$= "") + { + %player.botWeapon = %obj.Weapon; + } + + //Sets the name displayed in the hud above the bot. Commented out be default. + //%player.setShapeName(%name); + //is called to set the bots beginning inventory. + %player.EquipBot(%player); + //Sets the bot's initial position to that of it's marker. + %player.setTransform(%obj.gettransform()); + + //The following cluster of if-thens sets whether the bot will respawn or not + //based on it's markers dynamic variable - or the default respawn variable setting. + if (%obj.respawn $= "" ) + { + %player.respawn=$AI_GUARD_DEFAULTRESPAWN; + } + else + { + if (%obj.respawn == true) + %player.respawn=true; + else + %player.respawn=false; + } + + if (%obj.pathname !$= "") + { + %player.schedule($AI_GUARD_CREATION_DELAY,"followPath", %obj.pathname, -1); + } + + //Sets the bot to begin thinking after waiting the length of $AI_GUARD_CREATION_DELAY + %player.schedule($AI_GUARD_CREATION_DELAY,"Think", %player); + + return %player; +} + +//This sets the bots beginning equipment and inventory +function AIPlayer::EquipBot(%this, %obj) +{ + echo("equipingBot"); + //This adds a weapon to the bots inventory. + %obj.incinventory(%obj.botWeapon,1); + //This mounts the weapon on the bot. + %obj.mountImage(%obj.botWeapon @ "Image",0); + echo(%obj.botWeapon); + %obj.use(%obj.botWeapon); + if($AI_GUARD_WEAPON_USES_AMMO == true) + { + //This sets the bots beginning inventory of ammo. + %obj.setInventory(%obj.botWeapon @ "Ammo",100); + } +} + +//The EnhanceFOV function temporarily gives the bot a 360 degree field of vision +//This is used to emulate the bot looking around at different times. Namely when +//'Holding'. +function AIPlayer::EnhanceFOV(%this, %obj) +{ + //Is the botFOV already 360 degrees? If not then we'll set it, and set the schedule to + //turn it back off. + if (%obj.fov != 360) + { + //Sets the field of vision to 360 deg. + %obj.fov = 360; + //Starts the timer to disable the enhanced FOV + %this.fovtrigger = %this.schedule($AI_GUARD_ENHANCED_FOV_TIME, "restorefov", %obj); +} +} + +//Restore FOV sets the bot's FOV back to it's regular default setting. +function AIPlayer::restoreFOV(%this, %obj) +{ + %obj.fov = $AI_GUARD_FOV; +} + +//Enhances the defending mob's FOV and detect distance after being hit. +function AIPlayer::EnhanceDefending(%this, %obj) +{ + if (%obj.detdis == $AI_GUARD_DETECT_DISTANCE) + { + %obj.detdis = $AI_GUARD_ENHANCED_DEFENDING_DISTANCE; + %this.distancetrigger = %this.schedule($AI_GUARD_ENHANCED_DEFENDING_TIME, "restoreDefending", %obj); + } + + %obj.fov = 360; + %this.fovtrigger = %this.schedule($AI_GUARD_ENHANCED_DEFENDING_TIME, "restorefov", %obj); +} + +//Restores the defending mob's detect distance. +function AIPlayer::restoreDefending(%this, %obj) +{ + %obj.detdis = $AI_GUARD_DETECT_DISTANCE; +} + +//Spawn at marker is called by LoadEntities, and calls the spawn function to +//create the bots and place them at their starting positions. +function AIPlayer::spawnAtMarker(%name, %obj, %block) +{ + if (!isObject(%obj)) + return; + %player = AIPlayer::spawn(%this, %name, %obj, %block); + return %player; +} + +//AITargeting + +//Return the angle of a vector in relation to world origin +function AIPlayer::getAngleofVector(%this, %vec) +{ + %vector = VectorNormalize(%vec); + %vecx = getWord(%vector,0); + %vecy = getWord(%vector,1); + if(%vecx >= 0 && %vecy >= 0) + %quad = 1; + else + if(%vecx >= 0 && %vecy < 0) + %quad = 2; + else + if(%vecx < 0 && %vecy < 0) + %quad = 3; + else + %quad = 4; + %angle = mATan(%vecy/%vecx, -1); + %degangle = mRadToDeg(%angle); + switch(%quad) + { + case 1: + %angle = %degangle-90; + case 2: + %angle = %degangle+270; + case 3: + %angle = %degangle+90; + case 4: + %angle = %degangle+450; + } + if (%angle < 0) %angle = %angle + 360; + return %angle; +} + +//This is another function taken from code off of garagegames. +//The only mods I made to it was to add the extra check to ensure that the +//angle is within the 0-360 range. +function AIPlayer::check2DAngletoItem(%this, %obj, %item) +{ + %eyeVec = VectorNormalize(%this.getEyeVector()); + %eyeangle = %this.getAngleofVector(%eyeVec); + %posVec = VectorSub(%item.getPosition(), %obj.getPosition()); + %posangle = %this.getAngleofVector(%posVec); + %angle = %posangle - %eyeAngle; + %angle = %angle ? %angle : %angle * -1; + if (%angle < 0) %angle = %angle + 360; + return %angle; +} + +//This is another function taken from code off of garagegames. +//The only mods I made to it was to add the extra check to ensure that the +//angle is within the 0-360 range. +function AIPlayer::check2DAngletoTarget(%this, %obj, %tgt) +{ + %eyeVec = VectorNormalize(%this.getEyeVector()); + %eyeangle = %this.getAngleofVector(%eyeVec); + %posVec = VectorSub(%tgt.player.getPosition(), %obj.getPosition()); + %posangle = %this.getAngleofVector(%posVec); + %angle = %posangle - %eyeAngle; + %angle = %angle ? %angle : %angle * -1; + if (%angle < 0) %angle = %angle + 360; + return %angle; +} + +//The 'Think' function is the brains of the bot. +//The bot performs certain actions based on what it's current 'action' state is. +//The bot thinks on a scheduled basis. How fast the bot 'thinks' is determined by +//the bots attention level and its default scan time. (There are a few cases in the think +//function below where the schedule is shortened - but only to make the 'thinking' more +//realistic and to cut down on duplicating chunks of code. + +function AIPlayer::Think(%this, %obj) +{ + //This cancels the current schedule - just to make sure that things are kept neat and tidy. + cancel(%this.ailoop); + + //If the bot is dead, then there's no need to think or do anything. So let's bail out. + if (!%obj || %obj.getstate() $="Dead") + return; + + %prevaction=%obj.action; + + if (%obj.action !$="RetrievingItem" && %obj.action !$="Dead") + { + if (%obj.getdamagelevel() > $AI_GUARD_SEEK_HEALTH_LVL) + { + %this.enhancefov(%obj); + %hlth= %this.getclosestiteminsightandrange(%obj, "HealthPatch"); + + if(%hlth > 0) + { + %obj.action="GetHealth"; + } + + if($AI_GUARD_WEAPON_USES_AMMO == true) + { + if(%obj.getInventory(%obj.botWeapon @ "Ammo") == 0) + { + %this.enhancefov(%obj); + %ammostr = %obj.botWeapon @ "Ammo"; + %i_ammo= %this.getclosestiteminsightandrange(%obj, %ammostr ); + if(%i_ammo > 0) + { + %obj.action="GetAmmo"; + } + } + } + } + + //The switch$ takes the value of the bots action variable and then chooses what code to run + //according to what value it is. + switch$(%obj.action) + { + //The bot is 'dead' so lets clear his aim, and turn off his firing variable. + case "Dead": + %obj.clearaim(); + %obj.firing = false; + + //This is the bots default position. While guarding the bot will only do 2 things. + //The first is that the bot will run a random check to see if it can enhance it's fov. + //This is thrown in to prevent bots from having a perpetual blind spot, but still limits + //their field of vision for the majority of the time. + //The other thing the bot does is to check for nearby targets. If found the bot goes into attack mode. + case "Guarding": + //The bot will enhance it's FOV if it picks a 1 from a range of 1 to $AI_GUARD_ENHANCEFOV_CHANCE + %chance = getRandom(($AI_GUARD_ENHANCEFOV_CHANCE-1)) +1; + if (%chance == 1 ) + %this.enhancefov(%obj); + + %obj.fireLater = 0; + %obj.lostest = 0; + + //The bot checks for the nearest valid target if any. + %tgtid = %this.GetClosestHumanInSightandRange(%obj); + //If %tgtid >= 0 then a target is in sight and range. + if(%tgtid >= 0) + { + //Set the bots action to 'Attacking' and set it to attack quickly. + %obj.action = "Attacking"; + //This is one instance where the bots thinking is sped up to enable the bot + //to react more quickly as seems appropriate. + %this.ailoop=%this.schedule(100,"Think" , %obj); + } + else + { + //Check if the bot's pathed and if not, pace if it's time to pace + if (%obj.path $= "") + { + if(%obj.pace == 0) + { + %obj.pace = getRandom(($AI_GUARD_PACE_TIME-1)) +1; + %this.pacing(%obj); + } + else + { + %obj.pace--; + } + } + //There are no targets so continue guarding and call the scheduler to have the bot think + //at it's regular interval + %this.ailoop=%this.schedule($AI_GUARD_SCANTIME * %obj.attentionlevel ,"Think" , %obj); + } + + //The bot has been told that there is a target in sight and range and is set to attack it. + //While attacking the bot's attention level is kept at it's lowest value (Quickest thinking) + //The bot looks for the nearest target in sight. If the target is found the bot will aim at the + //target, set it's move destination to the position of the target, and then openfire on the target. + case "Attacking": + //Set the bot's move speed back to normal + %obj.setMoveSpeed(1.0); + //Maintain a low attention value to keep the bot thinking quickly while attacking. + %obj.attentionlevel=1; + //Get the id of the nearest valid target + %tgtid = %this.GetClosestHumanInSightandRange(%obj); + //If %tgtid>0 then there is a valid target + if(%tgtid >=0) + { + //Make sure that we keep ourself in attack mode since we have a target in sight. + %obj.action = "Attacking"; + //Get the current player object from the client value set in %tgtid + %tgt = ClientGroup.getobject(%tgtid); + //Set the bot to aim at the target. + //(The code uses the VectorAdd to adjust the aim of the bot to correct for the + //bot trying to shoot at the targets feet.) + %obj.setAimObject(%tgt.player, "0 0 1"); + + %dest = %tgt.player.getposition(); + + %basedist = vectorDist(%obj.getposition(), %dest); + + //Check if the bot is flagged as using a ranged weapon, then check if the bot is already close + //enough to the target or needs to be closer + if (%obj.weapRange $= "ranged") + { + if(%basedist > $AI_GUARD_RANGED_MAX_DISTANCE) + { + %this.moveDestinationA = %dest; + %this.dontMoveAlongTheWall(%obj); + } + } + //Check if the bot is already close enough to the target or needs to be closer + else + { + if(%basedist > $AI_GUARD_MAX_DISTANCE) + { + %this.moveDestinationA = %dest; + %this.dontMoveAlongTheWall(%obj); + } + } + //Tells the bot to start shooting the target. + %obj.openfire(%obj, %tgt); + //Tells the scheduler to have us think again + %this.ailoop=%this.schedule($AI_GUARD_SCANTIME * %obj.attentionlevel ,"Think" , %obj); + } + else + { + //There was no target found, so set our action to NoTarget. + %obj.action="NoTarget"; + //Again this sets the scheduler to have us think quickly to have the bot + //react to the loss of it's attack target + %this.ailoop=%this.schedule(100 ,"Think" , %obj); + } + + //When a bot loses it's target, or when the bot reaches it's destination as the result of + //a sidestep the bot will go into a 'hold' + //During a hold the bot will have enhanced FOV (to emulate scanning around for targets.) + //The bot will look for targets in range and attack if found. + //If no target is found the bot will increase it's holdcnt by 1. When the bot reaches it's + //maximum holdcnt value it will attempt to return to it's base position. + case "Holding": + //Set the bot's move speed back to normal + %obj.setMoveSpeed(1.0); + //Enhance the bot's FOV + %this.enhancefov(%obj); + //Checks for targets - (See the above code for full details of this section of code) + %tgtid = %this.GetClosestHumanInSightandRange(%obj); + if(%tgtid >=0) + { + %obj.holdcnt=0; + %obj.action = "Attacking"; + %this.ailoop=%this.schedule(100,"Think" , %obj); + } + else + { + //There was no target found, so we need to have the bot continue to 'hold' + //for a little bit before doing anything else. + + //Increase the holdcnt variable by one + %obj.holdcnt++; + %obj.fireLater = 0; + + %basedist = vectorDist(%this.getposition(), %this.moveDestinationA); + if (%basedist > 0.5) + %this.dontMoveAlongTheWall(%obj); + + //Check to see if we've passed our threshold of waiting + if (%obj.holdcnt > $AI_GUARD_HOLDCNT_MAX) + { + //Set holdcnt back to 0 for the next time we need it. + %obj.holdcnt=0; + + //Set the bot to return to where it last saw the player if it's not pathed + if (%obj.path $= "") + { + //Reset returning positions for guard bots + if (%obj.doesGuard $= "guard") + { + %obj.returningPos = %obj.marker.getposition(); + %obj.returningTrans = %obj.marker.gettransform(); + } + + %this.moveDestinationA = %obj.returningPos; + %this.dontMoveAlongTheWall(%obj); + } + //Set the bot to return to its path since it is pathed + else + { + if (%obj.returningPath != 0) + { + if (%obj.doesGuard $= "guard") + { + %this.moveDestinationA = %obj.returningPos; + %this.dontMoveAlongTheWall(%obj); + } + else + { + %this.movtrigg = %this.schedule(100, "followPath", %obj.path, -1); + } + } + else + { + %obj.returningPath = 1; + } + } + + //Set the bot action to 'Returning' + %obj.action="Returning"; + //Sets the bots oldpos to that of the position it's returning to + //This is done this way due to the fact that we've been holding + //and our position hasn't been changing. So we want to be sure that + //our bot doesn't think that it's stuck as soon as it tries to return. + %obj.oldpos = %obj.returningPos; + //We've waited long enough, so let's quickthink and go into 'Return' mode + %this.ailoop=%this.schedule(100, "Think" , %obj); + } + else + { + //Start the bot moving to its return point while it's still in holding mode + %this.moveDestinationA = %obj.returningPos; + %this.dontMoveAlongTheWall(%obj); + + %obj.clearaim(); + %this.ailoop=%this.schedule($AI_GUARD_SCANTIME * %obj.attentionlevel ,"Think" , %obj); + } + } + + //In Return mode the bot will do the following. + //It looks for the nearest target in sight and will attack it. + //It does not check for people sneaking up behind it, nor does it enhance it's FOV. + //If a target is found the bot will attack. + //If no target is found, the bot is still in the process of returning so we check to see + //if the bot is stuck. Stuck in the case means that the bot hase moved a distance of less than + //1 unit since the last time it thought. + //If the bot is stuck, sidestep is called to have the bot try to move a different direction + //The bot is then set to go into 'Holding' but with it's holdcnt set to 1 less than it's maximum. + //This essentially means that the bot will sidestep, and go into hold for one cycle in which to check + //targets and then try to return again if there is nothing to attack. + //If the bot is not stuck and there are no targets, then the bots aim is set to point towards it's + //destination of it's spawn point. (This is done to prevent the bot from pointing to the position + //of it's last sidestep while returning.) + case "Returning": + //Set the bot's move speed back to normal + %obj.setMoveSpeed(1.0); + //The next line can be commented out if desired. I chose to put it in so that the + //bots would try to return in a timely manner rather than having them wait too long + //between thinks to see if they were stuck. + %obj.attentionlevel=$AI_GUARD_MAX_ATTENTION/2; + + //The next few lines again have the bot check for a target and attack if need be. + %tgtid = %this.GetClosestHumanInSightandRange(%obj); + if(%tgtid >=0) + { + %obj.action = "Attacking"; + %this.ailoop=%this.schedule(100,"Think" , %obj); + } + else + { + //There was no target so we're still returning. So now check for a pathed or stuck bot + //This gets a value depicting the distance from the bots last known move point + %movedist=vectorDist(%obj.getposition(), %obj.oldpos); + //If the bot hasn't moved more than 1 unit we're probably stuck. + //Remember - this is only checked for while returning - not guarding + if (%movedist <1.0) + { + //Set our holdcnt to 1 less than the maximum so we only hold for 1 cycle + %obj.holdcnt=$AI_GUARD_HOLDCNT_MAX-1; + //Call sidestep to pick a new move destination near the bot + %this.sidestep(%obj); + } + else + { + //Check to make sure the bot is not pathed + if (%obj.path $= "") + { + //We're returning and we're not stuck. So make sure we're looking the direction we're running. + //Check if the bot is guarding + if (%obj.doesGuard $= "guard") + { + %obj.setAimLocation(%obj.marker.getposition()); + } + else + { + %obj.setAimLocation(%obj.returningPos); + } + } + } + } + //Set our oldpos to match our current position so that next time we cycle through + //we'll know if we're going anywhere or not + %obj.oldpos = %obj.getposition(); + //Scedhule ourselves to think at our regular interval + %this.ailoop = %this.schedule($AI_GUARD_SCANTIME * %obj.attentionlevel, "Think", %obj); + + //When a bot takes damage his state is set to defending. + //A bot that is defending will have it's attention set to it's lowest level + //It will sidestep to try to avoid the danger, and to throw some randomness into it's + //movement. The bot will then go into a quick hold of 1 count. + case "Defending": + //Set the bot's move speed back to normal + %obj.setMoveSpeed(1.0); + //Set the hldcnt to 1 less than the max + %obj.holdcnt=$AI_GUARD_HOLDCNT_MAX-1; + //Set the bot to it's highest awareness + %obj.attentionlevel=1; + //Sidestep to a random position + %this.sidestep(%obj); + //Set our action to 'Holding' + %obj.action="Holding"; + //Set a quick think schedule to start us looking for targets quickly. + %this.ailoop=%this.schedule(100 ,"Think" , %obj); + + //NoTarget is set when a bot loses it's target while attacking. + //It causes a bot's firing variable to be reset, sets the holdcnt to 0 + //so that when we go into a hold we will do so for the full duration + case "NoTarget": + //Clear the firing variable + %obj.firing = false; + //Clear holdcnt + %obj.holdcnt=0; + //Set our action to 'Holding' + %obj.action = "Holding"; + //Quick think to start us looking for our lost target. + %this.ailoop=%this.schedule(100 ,"Think" , %obj); + + case "GetHealth": + %hlth= %this.getclosestiteminsightandrange(%obj, "HealthPatch"); + if(%hlth > 0) + { + %obj.action="RetrievingItem"; + %dest=%hlth.getposition(); + %obj.setmovedestination(%dest); + %this.enhancefov(%obj); + } + else + { + %obj.action=%prevaction; + } + %this.ailoop=%this.schedule(100 ,"Think" , %obj); + + case "GetAmmo": + %ammostr = %obj.botWeapon @"Ammo"; + %i_ammo= %this.getclosestiteminsightandrange(%obj, %ammostr ); + if(%i_ammo > 0) + { + %obj.action="RetrievingItem"; + %dest=%i_ammo.getposition(); + %obj.setmovedestination(%dest); + %this.enhancefov(%obj); + } + else + { + %obj.action=%prevaction; + } + + %this.ailoop=%this.schedule(100 ,"Think" , %obj); + + case "RetrievingItem": + %obj.setMoveSpeed(1.0); + %obj.attentionlevel=$AI_GUARD_MAX_ATTENTION/2; + %tgtid = %this.GetClosestHumanInSightandRange(%obj); + if(%tgtid >=0) + { + %obj.action = "RetrievingItem"; + %obj.attentionlevel=1; + %tgtid = %this.GetClosestHumanInSightandRange(%obj); + if(%tgtid >=0) + { + %tgt = ClientGroup.getobject(%tgtid); + %obj.setAimObject(%tgt.player, "0 0 1"); + %obj.openfire(%obj, %tgt); + } + else + { + %obj.firing = false; + } + } + else + { + %movedist=vectorDist(%obj.getposition(), %obj.oldpos); + if (%movedist <1.0) + { + %obj.holdcnt=$AI_GUARD_HOLDCNT_MAX-1; + + %this.sidestep(%obj); + } + else + { + %obj.setaimlocation(%obj.getmovedestination()); + } + } + %obj.oldpos=%obj.getposition(); + %this.ailoop=%this.schedule($AI_GUARD_SCANTIME * %obj.attentionlevel ,"Think" , %obj); + + default: + %obj.action="Holding"; + %this.ailoop=%this.schedule(100 ,"Think" , %obj); + } + } + //If you want to see the bots thinking processes in action then uncomment the + //line below. It will then set the hud above the bot to show it's current + //action/attention level/damage/ammo + //(Used during testing, but kind of fun to watch when you have + //several bots on the map at a time to see how things are working out.) + + //%objname= %obj.action @ ":"@ %this.attentionlevel @ ":" @ %obj.getdamagelevel() @ ":" @ %obj.getInventory(%obj.botWeapon @ "Ammo") ; + //%obj.setshapename(%objname); + + //Clear aim if attention hits max. + if (%this.attentionlevel == $AI_GUARD_MAX_ATTENTION) + %obj.clearaim(); +} + +//Causes AIPlayer to slowly pace around their current location +function AIPlayer::Pacing(%this, %obj) +{ + //%xrand and %yrand are set to be a random number that is equal to -1/2$AI_GUARD_MAX_PACE and +1/2$AI_GUARD_MAX_PACE + %xrand = getRandom(1,$AI_GUARD_MAX_PACE)-$AI_GUARD_MAX_PACE/2; + %yrand = getRandom(1,$AI_GUARD_MAX_PACE)-$AI_GUARD_MAX_PACE/2; + + while(%xrand > -$AI_GUARD_MIN_PACE && %xrand < $AI_GUARD_MIN_PACE) + { + %xrand = getRandom(1,$AI_GUARD_MAX_PACE)-$AI_GUARD_MAX_PACE/2; + } + while(%yrand > -$AI_GUARD_MIN_PACE && %yrand < $AI_GUARD_MIN_PACE) + { + %yrand = getRandom(1,$AI_GUARD_MAX_PACE)-$AI_GUARD_MAX_PACE/2; + } + + //%newloc is first set to the bots current position + %newLoc = %obj.getTransform(); + + //Set the bots returning position to its marker if it's guarding + if (%obj.doesGuard $= "guard") + %obj.returningPos = %obj.marker.getposition(); + + //If the is away from its returning position, go back to it so it doesn't wander too far away + %basedist = vectorDist(%obj.getposition(), %obj.returningPos); + if(%basedist > $AI_GUARD_MIN_PACE) + { + %newLoc = %obj.returningTrans; + } + else + { + //Word(0) of %newloc (which is the x value) is set to equal it's original value plus the value + //of %xrand. The -/+ aspect of this equivalates to a left/right direction. + %newLoc = setWord(%newLoc, 0, (getWord(%newLoc, 0) + (%xrand))); + //Word(1) of %newloc (which is the y value) is set to equal it's original value plus the value + //of %yrand. The -/+ aspect of this equivalates to a forward/back direction. + %newLoc = setWord(%newLoc, 1, (getWord(%newLoc, 1) + (%yrand))); + + %basedist = vectorDist(%obj.getposition(), %newLoc); + //If the target location is very close, don't preform a line of sight test + if(%basedist > $AI_GUARD_LOS_BYPASS) + { + //Line of sight test for the position the bot wants to pace to + %eyeTrans = %obj.getEyeTransform(); + %eyeEnd = %newLoc; + %searchResult = containerRayCast(%eyeTrans, %eyeEnd, $TypeMasks::PlayerObjectType | $TypeMasks::StaticTSObjectType | + $TypeMasks::TerrainObjectType | $TypeMasks::ItemObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::StaticObjectType, %obj); + %foundObject = getword(%searchResult,0); + + if (%foundObject > 0) + { + %this.pacing(%obj); + return; + } + } + } + //Set the bot to move at a different speed than normal while pacing + %obj.setMoveSpeed($AI_GUARD_PACE_SPEED); + //Set the bot to look in the direction that it is moving. + %obj.setaimlocation(%newLoc); + //Set the bot to move towards the new position. + %obj.setMoveDestination(%newLoc); +} + +//Sidestep is used to find a random spot near the bot and attempt to have them move towards it. +function AIPlayer::SideStep(%this, %obj) +{ + //%xrand and %yrand are set to be a random number that is equal to -1/2$AI_GUARD_SIDESTEP and +1/2$AI_GUARD_SIDESTEP + %xrand = getRandom(1,$AI_GUARD_SIDESTEP)-$AI_GUARD_SIDESTEP/2; + %yrand = getRandom(1,$AI_GUARD_SIDESTEP)-$AI_GUARD_SIDESTEP/2; + //%newloc is first set to the bots current position + %newLoc = %obj.getTransform(); + //Word(0) of %newloc (which is the x value) is set to equal it's original value plus the value + //of %xrand. The -/+ aspect of this equivalates to a left/right direction. + %newLoc = setWord(%newLoc, 0, (getWord(%newLoc, 0) + (%xrand))); + //Word(1) of %newloc (which is the y value) is set to equal it's original value plus the value + //of %yrand. The -/+ aspect of this equivalates to a forward/back direction. + %newLoc = setWord(%newLoc, 1, (getWord(%newLoc, 1) + (%yrand))); + + //If the bot is pathed, get ready to move to the correct node + if (%obj.path !$= "") + { + if (%this.returningPath == 1) + { + %this.returningPath = 2; + } + } + + //If there's a target, keep aiming at it while sidestepping + %tgtid = %this.GetClosestHumanInSightandRange(%obj); + if(%tgtid >= 0) + { + %tgt = ClientGroup.getobject(%tgtid); + %obj.setAimObject(%tgt.player, "0 0 1"); + + %basedist = vectorDist(%obj.getposition(), %newLoc); + //If the target location is very close and we have a target player, don't preform a line of sight test + if(%basedist > $AI_GUARD_LOS_BYPASS) + { + //Line of sight test for the position the bot wants to sidestep to + %eyeTrans = %obj.getEyeTransform(); + %eyeEnd = %newLoc; + %searchResult = containerRayCast(%eyeTrans, %eyeEnd, $TypeMasks::PlayerObjectType | $TypeMasks::StaticTSObjectType | + $TypeMasks::TerrainObjectType | $TypeMasks::ItemObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::StaticObjectType, %obj); + %foundObject = getword(%searchResult,0); + + if (%foundObject > 0) + { + %this.sidestep(%obj); + return; + } + } + } + //There is no target + else + { + //Line of sight test for the position the bot wants to sidstep to + %eyeTrans = %obj.getEyeTransform(); + %eyeEnd = %newLoc; + %searchResult = containerRayCast(%eyeTrans, %eyeEnd, $TypeMasks::PlayerObjectType | $TypeMasks::StaticTSObjectType | + $TypeMasks::TerrainObjectType | $TypeMasks::ItemObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::StaticObjectType, %obj); + %foundObject = getword(%searchResult,0); + + if (%foundObject > 0) + { + %this.sidestep(%obj); + return; + } + //Set the bot to look in the direction that it is moving. + else + { + %obj.setaimlocation(%newloc); + } + } + //Set the bot to move towards the new position. + %obj.setMoveDestination(%newLoc); +} + +function AIPlayer::CheckLOStoItem(%this, %obj, %item) +{ + %basedist = vectorDist(%obj.getposition(), %item.getposition()); + //If the target item is very close, don't preform a line of sight test + if(%basedist > $AI_GUARD_LOS_BYPASS) + { + %eyeTrans = %obj.getEyeTransform(); + //%eyeEnd = %item.getposition(); + %eyeEnd = %item.getWorldBoxCenter(); + %searchResult = containerRayCast(%eyeTrans, %eyeEnd, $TypeMasks::TerrainObjectType | + $TypeMasks::InteriorObjectType | $TypeMasks::ItemObjectType | $TypeMasks::PlayerObjectType | + $TypeMasks::StaticTSObjectType | $TypeMasks::StaticObjectType , %obj); + %foundObject = getword(%searchResult,0); + + if(%foundObject == %item) + { + return true; + } + else + { + return false; + } + } + else + { + return true; + } +} + +//This is another function taken from code found on garagegames. +//It checks to see if there are any static objects blocking the view +//from the AIPlayer to the target. +function AIPlayer::CheckLOS(%this, %obj, %tgt) +{ + %eyeTrans = %obj.getEyeTransform(); + %eyeEnd = %tgt.player.getEyeTransform(); + %searchResult = containerRayCast(%eyeTrans, %eyeEnd, $TypeMasks::PlayerObjectType | $TypeMasks::StaticTSObjectType | + $TypeMasks::TerrainObjectType | $TypeMasks::ItemObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::StaticObjectType, %obj); + %foundObject = getword(%searchResult,0); + + if (%foundObject > 0) + { + if(%foundObject.getType() & $TypeMasks::PlayerObjectType) + { + //Get the target's location and set it as the bot's return point + %obj.returningPos = %tgt.player.getposition(); + %obj.returningTrans = %tgt.player.gettransform(); + %obj.lostest = 1; + return true; + } + else + { + //If the bot just lost sight of the player, get the player's position a short time after that + if(%obj.lostest == 1) + { + %obj.lostest = 0; + %this.lostrigger = %this.schedule($AI_GUARD_LOS_TIME,"getnewguardposition", %obj, %tgt); + } + return false; + } + } +} + +//Get the player's position a short time after sight is lost +function AIPlayer::GetNewGuardPosition(%this, %obj, %tgt) +{ + %obj.returningPos = %tgt.player.getposition(); + %obj.returningTrans = %tgt.player.gettransform(); +} + +function AIPlayer::GetClosestHumanInSightandRange(%this, %obj) +{ + %dist=0; + %index = -1; //sets the initial index value to -1 The index is the id number of the nearest + //human target found + %botpos = %this.getposition(); //The bots current position + %count = ClientGroup.getCount(); //The number of clients to check + + //The for-next loop cycles through all of the valid clients + for(%i=0; %i < %count; %i++) + { + %client = ClientGroup.getobject(%i); //Get the client info for the client at index %i + + //If the client is invalid then the function bails out returning a -1 value, for no target found. + if (%client.player !$= "" && %client.player > 0) + { + //The following line just changes the %client to %tgt to make it easier to follow the code below + %tgt = %client; + + %playpos = %client.player.getposition(); //Assigns the player position to a variable + + %tempdist = vectorDist(%playpos, %botpos); //Determine the distance from the bot to the target + + //The first test we perform is to see if the target is within the bots range + //Is target in range? If not bail out of checking to see if its in view. + if (%tempdist <= %obj.detdis) + { + + //Lower attentionlevel to increase response time... + %this.attentionlevel--; + + //Prevent the attention level from dropping below 1 + if(%this.attentionlevel < 1) %this.attentionlevel = 1; + + //The second check is to see if the target is within the FOV of the bot. + //Is the target within the fov field of vision of the bot? + if(%this.Istargetinview(%obj, %tgt, %obj.fov)) + { + + //Lower attentionlevel to increase response time... + %this.attentionlevel--; + + //Prevent the attention level from dropping below 1 + if(%this.attentionlevel < 1) %this.attentionlevel = 1; + + //The third check we run is to see if there is anything blocking the + //target from the bot. + if(%this.CheckLOS(%obj, %tgt)) + { + //We lower the bots attention level again, to further increase it's + //response time, this effectively means that the bot will respnd faster to + //objects that are both in range and in plain sight. + %this.attentionlevel--; + + //Prevent the attention level from dropping below 1 + if(%this.attentionlevel < 1) %this.attentionlevel = 1; + + //If there is a current target, then check the distance to the new target as + //compared to the current set target. If the new target is closest, then set + //the index and tempdistance to the new target. + if(%tempdist < %dist || %dist == 0) + { + %dist = %tempdist; + %index = %i; + } + } + } + } + } + else + { + //If there are no targets in view, then the bots attention will slowly lapse and increase + //This will slow down how fast the bot thinks and how often it checks for threats. + %this.attentionlevel = %this.attentionlevel + 0.5; + if(%this.attentionlevel > $AI_GUARD_MAX_ATTENTION) %this.attentionlevel = $AI_GUARD_MAX_ATTENTION; + } + } + + return %index; +} + +function AIPlayer::GetClosestItemInSightandRange(%this, %obj, %itemname) +{ + %dist=0; + %index = -1; + %botpos = %this.getposition(); + InitContainerRadiusSearch(%botpos, $AI_GUARD_DETECT_ITEM_RANGE, $TypeMasks::ItemObjectType); + while ((%item = containerSearchNext()) != 0) + { + if (%item.getDataBlock().getName() $= %itemname) + { + %itempos = %item.getposition(); + %tempdist = vectorDist(%itempos, %botpos); + + if(%this.IsIteminview(%obj, %item, %obj.fov)) + { + if(%this.CheckLOStoItem(%obj, %item)) + { + if(%tempdist < %dist || %dist == 0) + { + %dist = %tempdist; + %index = %item; + } + } + } + } + } + return %index; +} + +//This function checks to see if the target supplied is within the bots FOV +function AIPlayer::IsItemInView(%this, %obj, %item, %fov) +{ + %ang = %this.check2dangletoitem(%obj, %item); + %visleft = 360 - (%fov/2); + %visright = %fov/2; + if (%ang > %visleft || %ang < %visright) + { + return true; + } + else + { + return false; + } +} + +//This function checks to see if the target supplied is within the bots FOV +function AIPlayer::IsTargetInView(%this, %obj, %tgt, %fov) +{ + %ang = %this.check2dangletotarget(%obj, %tgt); + %visleft = 360 - (%fov/2); + %visright = %fov/2; + if (%ang > %visleft || %ang < %visright) + { + return true; + } + else + { + return false; + } +} + +//Check if the location the bot is moving to is in sight. +//And if it's not, move somwhere that is in sight (if there's a better place). +function AIPlayer::dontMoveAlongTheWall(%this, %obj) +{ + //Save the original destination to another variable for later use + %this.moveDestinationB = %this.moveDestinationA; + + if (%this.checkMovementLos(%obj)) + { + return; + } + else + { + //Word(0) of %this.moveDestinationB (which is the x value) is set to equal the value of %this.moveDestinationA's Word(0). + %this.moveDestinationB = setWord(%this.moveDestinationB, 0, (getWord(%this.moveDestinationA, 0))); + //Word(1) of %this.moveDestinationB (which is the y value) is set to equal the value of %this.getposition()'s Word(1). + %this.moveDestinationB = setWord(%this.moveDestinationB, 1, (getWord(%this.getposition(), 1))); + + if (%this.checkMovementLos(%obj)) + { + //Add AI_GUARD_CORNERING's value to the destination's value + %this.moveDestinationB = setWord(%this.moveDestinationB, 0, (getWord(%this.moveDestinationA, 0) + $AI_GUARD_CORNERING)); + %this.moveDestinationB = setWord(%this.moveDestinationB, 1, (getWord(%this.getposition(), 1) + $AI_GUARD_CORNERING)); + + if (%this.checkMovementLos(%obj)) + { + return; + } + else + { + //Or else subtracts AI_GUARD_CORNERING's value from the destination's value + %this.moveDestinationB = setWord(%this.moveDestinationB, 0, (getWord(%this.moveDestinationA, 0) - $AI_GUARD_CORNERING)); + %this.moveDestinationB = setWord(%this.moveDestinationB, 1, (getWord(%this.getposition(), 1) - $AI_GUARD_CORNERING)); + %obj.setmovedestination(%this.moveDestinationB); + } + } + else + { + //Word(0) of %this.moveDestinationB (which is the x value) is set to equal the value of %this.getposition()'s Word(0). + %this.moveDestinationB = setWord(%this.moveDestinationB, 0, (getWord(%this.getposition(), 0))); + //Word(1) of %this.moveDestinationB (which is the y value) is set to equal the value of %this.moveDestinationA's Word(1). + %this.moveDestinationB = setWord(%this.moveDestinationB, 1, (getWord(%this.moveDestinationA, 1))); + + if (%this.checkMovementLos(%obj)) + { + //Add AI_GUARD_CORNERING's value to the destination's value + %this.moveDestinationB = setWord(%this.moveDestinationB, 0, (getWord(%this.getposition(), 0) + $AI_GUARD_CORNERING)); + %this.moveDestinationB = setWord(%this.moveDestinationB, 1, (getWord(%this.moveDestinationA, 1) + $AI_GUARD_CORNERING)); + + if (%this.checkMovementLos(%obj)) + { + return; + } + else + { + //Or else subtracts AI_GUARD_CORNERING's value from the destination's value + %this.moveDestinationB = setWord(%this.moveDestinationB, 0, (getWord(%this.getposition(), 0) - $AI_GUARD_CORNERING)); + %this.moveDestinationB = setWord(%this.moveDestinationB, 1, (getWord(%this.moveDestinationA, 1) - $AI_GUARD_CORNERING)); + %obj.setmovedestination(%this.moveDestinationB); + } + } + else + { + %obj.setmovedestination(%this.moveDestinationA); + } + } + } +} + +//Line of sight test for the position the bot wants to move to +function AIPlayer::checkMovementLos(%this, %obj) +{ + %eyeTrans = %obj.getEyeTransform(); + %eyeEnd = %this.moveDestinationB; + %searchResult = containerRayCast(%eyeTrans, %eyeEnd, $TypeMasks::StaticTSObjectType | $TypeMasks::TerrainObjectType | + $TypeMasks::ItemObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::StaticObjectType, %obj); + %foundObject = getword(%searchResult,0); + + if (%foundObject == 0) + { + //Check to make sure the bot isn't already extremly close to its dstination + %basedist = vectorDist(%obj.getposition(), %this.moveDestinationB); + + if (%basedist > 0.5) + { + %obj.setmovedestination(%this.moveDestinationB); + return true; + } + else + { + return false; + } + } + + else + { + return false; + } +} + +// Gets the closest player to object. Used by the trigger to determine if a player triggered it. +function AIPlayer::GetClosestPlayer(%this, %obj) +{ + %dist=0; + %index = -1; //sets the initial index value to -1 The index is the id number of the nearest + //human target found + %botpos = %this.getposition(); //The bots current position + %count = ClientGroup.getCount(); //The number of clients to check + + //The for-next loop cycles through all of the valid clients + for(%i=0; %i < %count; %i++) + { + %client = ClientGroup.getobject(%i); //Get the client info for the client at index %i + + //If the client is invalid then the function bails out returning a -1 value, for no + //target found. + if (%client.player !$= "" && %client.player > 0) + { + %index = %client.player; + } + } +} + +//----------------------------------------------------------------------------- +// Pathed AI Functions +//----------------------------------------------------------------------------- + +//Start the bot following a path +function AIPlayer::followPath(%this, %path, %node, %obj) +{ + //Check if the bot is pathed + if (!isObject(%path)) + { + %this.path = ""; + return; + } + + %dist = 0; + %tempdist = 0; + %index = -1; + %botpos = %this.getposition(); + %count = %path.getCount(); + //Cycle through all nodes on this path and set the closest node as the bot's current location + while ((%node = %count) != 0) + { + %nodepos = %this.path.getObject(%count - 1).getposition(); + %tempdist = vectorDist(%nodepos, %botpos); + + if(%tempdist < %dist || %dist == 0) + { + %dist = %tempdist; + %index = %node; + } + %count--; + } + %index = %index - 1; + %this.moveToNode(%index); + + if (%index > %path.getCount() - 1) + { + %this.targetNode = %path.getCount() - 1; + } + else + { + %this.targetNode = %index; + } +} + +function AIPlayer::moveToNextNode(%this, %obj) +{ + //See if the bot just sidesteped + if (%this.returningPath == 2) + { + //Set returningPath back to 1 for other functions + %this.returningPath = 1; + %this.moveToNode(%this.currentNode); + return; + } + + //See where the bot is and where it should be going + if (%this.targetNode < 0 || %this.currentNode < %this.targetNode) + { + if (%this.currentNode < %this.path.getCount() - 1) + { + %this.moveToNode(%this.currentNode + 1); + } + else + { + %this.moveToNode(0); + } + } + else + { + if (%this.currentNode == 0) + { + %this.moveToNode(%this.path.getCount() - 1); + } + else + { + %this.moveToNode(%this.currentNode - 1); + } + } +} + +function AIPlayer::moveToNode(%this, %index, %obj) +{ + //Move to the given path node index + %this.currentNode = %index; + %node = %this.path.getObject(%index); + %this.setMoveDestination(%node.getTransform()); + %this.targetNode = %this.currentNode + 1; + + //Make the bot face the node it's moving to + %this.setAimLocation(%this.path.getObject(%this.currentNode).getposition()); +} diff --git a/Templates/Modules/AI_Guard/Scripts/guardTrigger.cs b/Templates/Modules/AI_Guard/Scripts/guardTrigger.cs new file mode 100644 index 000000000..e72de4a20 --- /dev/null +++ b/Templates/Modules/AI_Guard/Scripts/guardTrigger.cs @@ -0,0 +1,34 @@ + +function guardTrigger::onEnterTrigger(%this, %trigger, %obj) +{ + echo(%trigger @ " has been triggered!"); + // we've been triggered. Now check to see if the player triggered the trigger + // we don't want other enemies to keep spawing more enemies! + %tgtid = AIPlayer::GetClosestPlayer(%trigger); + //echo("nearest human is " @ %tgtid); + // check to see if the player triggered this. + if (%tgtid == %obj) + { + // if triggerMany is set, then we shouldn't do anything. (or do something different.) + // if you want a trigger to always spawn an enemy, set the trigger's triggerMany value to "true" + // default behavior is to trigger once. + if (!%trigger.triggerMany && !%trigger.doneOnce) + { + + // set the spawnGroup variable to pass on to the spawn function + %spawnGroup = %trigger.spawnGroup; + + // let the game know we've already been triggered once. + %trigger.doneOnce = true; + + // spawn the group + AIPlayer::spawnByGroup(%spawnGroup); + + } + else + { + // we've been triggered before. Don't do anything + // If you wanted to do something different, this is where you would put it. + } + } +} \ No newline at end of file diff --git a/Templates/Modules/PostFXPack/PostFXPack.cs b/Templates/Modules/PostFXPack/PostFXPack.cs new file mode 100644 index 000000000..0e3b875fc --- /dev/null +++ b/Templates/Modules/PostFXPack/PostFXPack.cs @@ -0,0 +1,9 @@ +function PostFXPack::onCreate(%this) +{ + exec("./Scripts/postFXPack.cs"); +} + +function PostFXPack::onDestroy(%this) +{ +} + diff --git a/Templates/Modules/PostFXPack/PostFXPack.module b/Templates/Modules/PostFXPack/PostFXPack.module new file mode 100644 index 000000000..d783cd18d --- /dev/null +++ b/Templates/Modules/PostFXPack/PostFXPack.module @@ -0,0 +1,15 @@ + + + diff --git a/Templates/Modules/PostFXPack/Scripts/postFX.cs b/Templates/Modules/PostFXPack/Scripts/postFX.cs new file mode 100644 index 000000000..317845636 --- /dev/null +++ b/Templates/Modules/PostFXPack/Scripts/postFX.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. +//----------------------------------------------------------------------------- + +//***************************************************************************** +// Shaders ( For Custom Materials ) +//***************************************************************************** diff --git a/Templates/Modules/PostFXPack/Scripts/postFXPack.cs b/Templates/Modules/PostFXPack/Scripts/postFXPack.cs new file mode 100644 index 000000000..ad1a22e72 --- /dev/null +++ b/Templates/Modules/PostFXPack/Scripts/postFXPack.cs @@ -0,0 +1,351 @@ +// PIXELATE +$Pixelate::PixelWidth = 10.0; +$Pixelate::PixelHeight = 10.0; +singleton ShaderData( PixelateShader ) +{ + DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl"; + DXPixelShaderFile = "shaders/common/postFx/Library/pixelateP.hlsl"; + pixVersion = 2.0; +}; + +singleton PostEffect( PixelatePostEffect ) +{ + isEnabled = false; + allowReflectPass = false; + renderTime = "PFXAfterBin"; + renderBin = "GlowBin"; + shader = PixelateShader; + stateBlock = PFX_DefaultStateBlock; + texture[0] = "$backBuffer"; + renderPriority = 10; +}; + +function PixelatePostEffect::setShaderConsts(%this) +{ + %this.setShaderConst("$pixel_w", $Pixelate::PixelWidth); + %this.setShaderConst("$pixel_h", $Pixelate::PixelHeight); + %this.setShaderConst("$sizeX",getWord($pref::Video::mode, 0)); + %this.setShaderConst("$sizeY",getWord($pref::Video::mode, 1)); +} + +// BLURRED VISION +$BlurredVisionIntensity = 1.0; +singleton ShaderData( BlurredVisionShader ) +{ + DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl"; + DXPixelShaderFile = "shaders/common/postFx/Library/blurredVisionP.hlsl"; + pixVersion = 2.0; +}; + +singleton PostEffect( BlurredVisionPostEffect ) +{ + isEnabled = false; + allowReflectPass = false; + renderTime = "PFXAfterBin"; + renderBin = "GlowBin"; + shader = BlurredVisionShader; + stateBlock = PFX_DefaultStateBlock; + texture[0] = "$backBuffer"; + renderPriority = 10; +}; + +function BlurredVisionPostEffect::setShaderConsts(%this) +{ + %this.setShaderConst("$BlurredVisionIntensity", $BlurredVisionIntensity); +} + +// DREAM VIEW +$DreamViewIntensity = 1.0; +singleton ShaderData( DreamViewShader ) +{ + DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl"; + DXPixelShaderFile = "shaders/common/postFx/Library/dreamviewP.hlsl"; + pixVersion = 2.0; +}; + +singleton PostEffect( DreamViewPostEffect ) +{ + isEnabled = false; + allowReflectPass = false; + renderTime = "PFXAfterBin"; + renderBin = "GlowBin"; + shader = DreamViewShader; + stateBlock = PFX_DefaultStateBlock; + texture[0] = "$backBuffer"; + renderPriority = 10; +}; + +function DreamViewPostEffect::setShaderConsts(%this) +{ + %this.setShaderConst("$DreamViewIntensity", $DreamViewIntensity); +} + +// CROSS STITCH +$CrossStichPostEffect::StitchingSize = 6.0; +$CrossStichPostEffect::Invert = 0; +singleton ShaderData( CrossStitchShader ) +{ + DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl"; + DXPixelShaderFile = "shaders/common/postFx/Library/crossStitchP.hlsl"; + pixVersion = 3.0; +}; + +singleton PostEffect( CrossStitchPostEffect ) +{ + isEnabled = false; + allowReflectPass = false; + renderTime = "PFXAfterBin"; + renderBin = "GlowBin"; + shader = CrossStitchShader; + stateBlock = PFX_DefaultStateBlock; + texture[0] = "$backBuffer"; + renderPriority = 10; +}; + +function CrossStitchPostEffect::setShaderConsts(%this) +{ + %this.setShaderConst( "$time", ($Sim::time - %this.timeStart) ); + %this.setShaderConst("$sizeX",getWord($pref::Video::mode, 0)); + %this.setShaderConst("$sizeY",getWord($pref::Video::mode, 1)); + %this.setShaderConst("$stitching_size", $CrossStichPostEffect::StitchingSize); + %this.setShaderConst("$invert", $CrossStichPostEffect::Invert); +} + +// POSTERISATION +$PosterisationPostEffect::Gamma = 0.6; +$PosterisationPostEffect::NumColors = 4.0; +singleton ShaderData( PosterisationShader ) +{ + DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl"; + DXPixelShaderFile = "shaders/common/postFx/Library/posterisationP.hlsl"; + pixVersion = 2.0; +}; + +singleton PostEffect( PosterisationPostEffect ) +{ + isEnabled = false; + allowReflectPass = false; + renderTime = "PFXAfterBin"; + renderBin = "GlowBin"; + shader = PosterisationShader; + stateBlock = PFX_DefaultStateBlock; + texture[0] = "$backBuffer"; + renderPriority = 10; +}; + +function PosterisationPostEffect::setShaderConsts(%this) +{ + %this.setShaderConst("$gamma", $PosterisationPostEffect::Gamma); + %this.setShaderConst("$numColors", $PosterisationPostEffect::NumColors); +} + +// NIGHT VISION 2 +$NightVisionPostEffect::LuminanceThreshold = 0.2; +$NightVisionPostEffect::ColorAmplification = 4.0; + +singleton ShaderData( NightVision2Shader ) +{ + DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl"; + DXPixelShaderFile = "shaders/common/postFx/Library/nightVision2P.hlsl"; + pixVersion = 2.0; +}; + +singleton PostEffect( NightVision2Fx ) +{ + isEnabled = false; + allowReflectPass = false; + renderTime = "PFXAfterBin"; + renderBin = "GlowBin"; + shader = NightVision2Shader; + stateBlock = PFX_DefaultStateBlock; + texture[0] = "$backBuffer"; + renderPriority = 10; +}; + +function NightVision2Fx::setShaderConsts(%this) +{ + %this.setShaderConst("$luminanceThreshold", $NightVisionPostEffect::LuminanceThreshold); + %this.setShaderConst("$colorAmplification", $NightVisionPostEffect::ColorAmplification); +} + +// LENS CIRCLE +$LensCirclePostEffect::RadiusX = 0.6; +$LensCirclePostEffect::RadiusY = 0.2; + +singleton ShaderData( LensCircleShader ) +{ + DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl"; + DXPixelShaderFile = "shaders/common/postFx/Library/lensCircleP.hlsl"; + pixVersion = 2.0; +}; + +singleton PostEffect( LensCirclePostEffect ) +{ + isEnabled = false; + allowReflectPass = false; + renderTime = "PFXAfterBin"; + renderBin = "GlowBin"; + shader = LensCircleShader; + stateBlock = PFX_DefaultStateBlock; + texture[0] = "$backBuffer"; + renderPriority = 10; +}; + +function LensCirclePostEffect::setShaderConsts(%this) +{ + %this.setShaderConst("$radiusX", $LensCirclePostEffect::RadiusX); + %this.setShaderConst("$radiusY", $LensCirclePostEffect::RadiusY); +} + +// CHROMATIC ABERRATION +$ChromaticAberrationPostEffect::Intensity = 0.3; +singleton ShaderData( ChromaticAberrationShader ) +{ + DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl"; + DXPixelShaderFile = "shaders/common/postFx/Library/chromaticAberrationP.hlsl"; + pixVersion = 2.0; +}; + +singleton PostEffect( ChromaticAberrationPostEffect ) +{ + isEnabled = false; + allowReflectPass = false; + renderTime = "PFXAfterBin"; + renderBin = "GlowBin"; + shader = ChromaticAberrationShader; + stateBlock = PFX_DefaultStateBlock; + texture[0] = "$backBuffer"; + renderPriority = 10; +}; + +function ChromaticAberrationPostEffect::setShaderConsts(%this) +{ + %this.setShaderConst("$intensity", $ChromaticAberrationPostEffect::Intensity); +} + +// RGB +$RGBPostEffect::RedLevel = 1.0; +$RGBPostEffect::GreenLevel = 1.0; +$RGBPostEffect::BlueLevel = 1.0; +singleton ShaderData( RGBShader ) +{ + DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl"; + DXPixelShaderFile = "shaders/common/postFx/Library/rgbP.hlsl"; + pixVersion = 2.0; +}; + +singleton PostEffect( RGBPostEffect ) +{ + isEnabled = false; + allowReflectPass = false; + renderTime = "PFXAfterBin"; + renderBin = "GlowBin"; + shader = RGBShader; + stateBlock = PFX_DefaultStateBlock; + texture[0] = "$backBuffer"; + renderPriority = 10; +}; + +function RGBPostEffect::setShaderConsts(%this) +{ + %this.setShaderConst("$redLevel", $RGBPostEffect::RedLevel); + %this.setShaderConst("$greenLevel", $RGBPostEffect::GreenLevel); + %this.setShaderConst("$blueLevel", $RGBPostEffect::BlueLevel); +} + +// ZOOM BLUR +$ZoomBlur::Amount = 0.99; +$ZoomBlur::Samples = 6; + +singleton ShaderData( ZoomBlurShader ) +{ + DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl"; + DXPixelShaderFile = "shaders/common/postFx/Library/zoomBlurP.hlsl"; + samplerNames[0] = "$inputTex"; + pixVersion = 3.0; +}; + +singleton PostEffect( ZoomBlurPostEffect ) +{ + renderTime = "PFXAfterDiffuse"; + shader = ZoomBlurShader; + stateBlock = PFX_DefaultStateBlock; + texture[0] = "$backBuffer"; +}; + +function ZoomBlurPostEffect::setShaderConsts(%this) +{ + %this.setShaderConst("$amount", $ZoomBlur::Amount); + %this.setShaderConst("$samples", $ZoomBlur::Samples); +} + +// NEGATIVE +singleton ShaderData( NegativeShader ) +{ + DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl"; + DXPixelShaderFile = "shaders/common/postFx/Library/negativeP.hlsl"; + pixVersion = 2.0; +}; + +singleton PostEffect( NegativePostEffect ) +{ + renderTime = "PFXAfterDiffuse"; + shader = NegativeShader; + stateBlock = PFX_DefaultStateBlock; + texture[0] = "$backBuffer"; +}; + +// BLACK AND WHITE +singleton ShaderData( BlackAndWhiteShader ) +{ + DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl"; + DXPixelShaderFile = "shaders/common/postFx/Library/blackAndWhiteP.hlsl"; + pixVersion = 2.0; +}; + +singleton PostEffect( BlackAndWhitePostEffect ) +{ + renderTime = "PFXAfterDiffuse"; + shader = BlackAndWhiteShader; + stateBlock = PFX_DefaultStateBlock; + texture[0] = "$backBuffer"; +}; + +// MONOCHROME +singleton ShaderData( MonochromeShader ) +{ + DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl"; + DXPixelShaderFile = "shaders/common/postFx/Library/monochromeP.hlsl"; + pixVersion = 2.0; +}; + +singleton PostEffect( MonochromePostEffect ) +{ + renderTime = "PFXAfterDiffuse"; + shader = MonochromeShader; + stateBlock = PFX_DefaultStateBlock; + texture[0] = "$backBuffer"; +}; + +// EDGE DETECTION +$EdgeDetection::Threshold = 0.01; + +singleton ShaderData( EdgeDetectionShader ) +{ + DXVertexShaderFile = "shaders/common/postFx/postFxV.hlsl"; + DXPixelShaderFile = "shaders/common/postFx/Library/edgeDetectionP.hlsl"; + pixVersion = 2.0; +}; + +singleton PostEffect( EdgeDetectionPostEffect ) +{ + renderTime = "PFXAfterDiffuse"; + shader = EdgeDetectionShader; + stateBlock = PFX_DefaultStateBlock; + texture[0] = "$backBuffer"; +}; + +function EdgeDetectionPostEffect::setShaderConsts(%this) +{ + %this.setShaderConst("$threshold", $EdgeDetection::Threshold); +} \ No newline at end of file diff --git a/Templates/Modules/PostFXPack/Shaders/blackAndWhiteP.hlsl b/Templates/Modules/PostFXPack/Shaders/blackAndWhiteP.hlsl new file mode 100644 index 000000000..a4f57579d --- /dev/null +++ b/Templates/Modules/PostFXPack/Shaders/blackAndWhiteP.hlsl @@ -0,0 +1,21 @@ +#include "shaders/common/postFx/postFx.hlsl" +#include "../../torque.hlsl" + +TORQUE_UNIFORM_SAMPLER2D(backBuffer, 0); + +float4 main(PFXVertToPix IN) : TORQUE_TARGET0 +{ + float4 base = TORQUE_TEX2D(backBuffer, IN.uv0); + base.a = 1.0f; + + base.rgb = (base.r + base.g + base.b) / 3.0f; + + if (base.r < 0.5) + base.r = 0.0f; + else + base.r = 1.0f; + + base.gb = base.r; + + return base; +} \ No newline at end of file diff --git a/Templates/Modules/PostFXPack/Shaders/blurredVisionP.hlsl b/Templates/Modules/PostFXPack/Shaders/blurredVisionP.hlsl new file mode 100644 index 000000000..01015dad2 --- /dev/null +++ b/Templates/Modules/PostFXPack/Shaders/blurredVisionP.hlsl @@ -0,0 +1,29 @@ +#include "shaders/common/postFx/postFx.hlsl" +#include "shadergen:/autogenConditioners.h" +#include "../../torque.hlsl" + +TORQUE_UNIFORM_SAMPLER2D(backBuffer, 0); +uniform float BlurredVisionIntensity; + +float4 main(PFXVertToPix IN) : TORQUE_TARGET0 +{ + float4 base = TORQUE_TEX2D(backBuffer, IN.uv0); + + base += TORQUE_TEX2D(backBuffer, IN.uv0+(0.001 * BlurredVisionIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0+(0.003 * BlurredVisionIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0+(0.005 * BlurredVisionIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0+(0.007 * BlurredVisionIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0+(0.009 * BlurredVisionIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0+(0.011 * BlurredVisionIntensity)); + + base += TORQUE_TEX2D(backBuffer, IN.uv0-(0.001 * BlurredVisionIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0-(0.003 * BlurredVisionIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0-(0.005 * BlurredVisionIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0-(0.007 * BlurredVisionIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0-(0.009 * BlurredVisionIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0-(0.011 * BlurredVisionIntensity)); + + base = base / 15.0; // 9.5 + + return base; +} \ No newline at end of file diff --git a/Templates/Modules/PostFXPack/Shaders/chromaticAberrationP.hlsl b/Templates/Modules/PostFXPack/Shaders/chromaticAberrationP.hlsl new file mode 100644 index 000000000..7515c4295 --- /dev/null +++ b/Templates/Modules/PostFXPack/Shaders/chromaticAberrationP.hlsl @@ -0,0 +1,24 @@ +#include "shaders/common/postFx/postFx.hlsl" +#include "shadergen:/autogenConditioners.h" + +uniform float accumTime; +TORQUE_UNIFORM_SAMPLER2D(backBuffer, 0); +uniform float intensity; + +float4 main(PFXVertToPix IN) : TORQUE_TARGET0 +{ + float2 coords = IN.uv0; + float2 uv = IN.uv0; + + coords = (coords - 0.5) * 2.0; + + float coordDot = dot(coords, coords); + + float2 uvG = uv - TORQUE_TEX2D(backBuffer, IN.uv0).xy * intensity * coords * coordDot; + + float4 base = TORQUE_TEX2D(backBuffer, IN.uv0); + + base.g = TORQUE_TEX2D(backBuffer, uvG).g; + + return base; +} \ No newline at end of file diff --git a/Templates/Modules/PostFXPack/Shaders/crossStitchP.hlsl b/Templates/Modules/PostFXPack/Shaders/crossStitchP.hlsl new file mode 100644 index 000000000..857a109d4 --- /dev/null +++ b/Templates/Modules/PostFXPack/Shaders/crossStitchP.hlsl @@ -0,0 +1,39 @@ +#include "shaders/common/postFx/postFx.hlsl" +#include "shadergen:/autogenConditioners.h" + +TORQUE_UNIFORM_SAMPLER2D(backBuffer, 0); +uniform float time; +uniform float sizeX; // rt_w +uniform float sizeY; // rt_h +uniform float stitching_size = 6.0; +uniform int invert = 0; + +float4 main(PFXVertToPix IN) : TORQUE_TARGET0 +{ + float4 base = float4(0.0, 0.0, 0.0, 0.0); + float size = stitching_size; + float2 cPos = IN.uv0 * float2(sizeX, sizeY); + float2 tlPos = floor(cPos / float2(size, size)); + tlPos *= size; + int remX = int(cPos.x % size); + int remY = int(cPos.y % size); + if (remX == 0 && remY == 0) + tlPos = cPos; + float2 blPos = tlPos; + blPos.y += (size - 1.0); + if ((remX == remY) || (((int(cPos.x) - int(blPos.x)) == (int(blPos.y) - int(cPos.y))))) + { + if (invert == 1) + base = float4(0.2, 0.15, 0.05, 1.0); + else + base = TORQUE_TEX2D(backBuffer, tlPos * float2(1.0/sizeX, 1.0/sizeY)) * 1.4; + } + else + { + if (invert == 1) + base = TORQUE_TEX2D(backBuffer, tlPos * float2(1.0/sizeX, 1.0/sizeY)) * 1.4; + else + base = float4(0.0, 0.0, 0.0, 1.0); + } + return base; +} \ No newline at end of file diff --git a/Templates/Modules/PostFXPack/Shaders/dreamviewP.hlsl b/Templates/Modules/PostFXPack/Shaders/dreamviewP.hlsl new file mode 100644 index 000000000..7fc201571 --- /dev/null +++ b/Templates/Modules/PostFXPack/Shaders/dreamviewP.hlsl @@ -0,0 +1,30 @@ +#include "shaders/common/postFx/postFx.hlsl" +#include "shadergen:/autogenConditioners.h" +#include "../../torque.hlsl" + +TORQUE_UNIFORM_SAMPLER2D(backBuffer, 0); +uniform float DreamViewIntensity; + +float4 main(PFXVertToPix IN) : TORQUE_TARGET0 +{ + float4 base = TORQUE_TEX2D(backBuffer, IN.uv0); + + base += TORQUE_TEX2D(backBuffer, IN.uv0+(0.001 * DreamViewIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0+(0.003 * DreamViewIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0+(0.005 * DreamViewIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0+(0.007 * DreamViewIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0+(0.009 * DreamViewIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0+(0.011 * DreamViewIntensity)); + + base += TORQUE_TEX2D(backBuffer, IN.uv0-(0.001 * DreamViewIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0-(0.003 * DreamViewIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0-(0.005 * DreamViewIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0-(0.007 * DreamViewIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0-(0.009 * DreamViewIntensity)); + base += TORQUE_TEX2D(backBuffer, IN.uv0-(0.011 * DreamViewIntensity)); + + base.rgb = (base.r + base.g + base.b)/3.0; + base = base / 9.5; + + return base; +} \ No newline at end of file diff --git a/Templates/Modules/PostFXPack/Shaders/edgeDetectionP.hlsl b/Templates/Modules/PostFXPack/Shaders/edgeDetectionP.hlsl new file mode 100644 index 000000000..f871526b3 --- /dev/null +++ b/Templates/Modules/PostFXPack/Shaders/edgeDetectionP.hlsl @@ -0,0 +1,48 @@ +#include "shaders/common/postFx/postFx.hlsl" +#include "../../torque.hlsl" + +TORQUE_UNIFORM_SAMPLER2D(backBuffer, 0); +uniform float threshold; + +float4 main(PFXVertToPix IN) : TORQUE_TARGET0 +{ + float4 base = TORQUE_TEX2D(backBuffer, IN.uv0); + + const int NUM = 9; + + const float2 c[NUM] = + { + float2(-0.0078125, 0.0078125), + float2( 0.00 , 0.0078125), + float2( 0.0078125, 0.0078125), + float2(-0.0078125, 0.00 ), + float2( 0.0, 0.0), + float2( 0.0078125, 0.007 ), + float2(-0.0078125,-0.0078125), + float2( 0.00 , -0.0078125), + float2( 0.0078125,-0.0078125), + }; + + int i; + float3 col[NUM]; + + for (i=0; i < NUM; i++) + { + col[i] = TORQUE_TEX2D(backBuffer, IN.uv0 + 0.2*c[i]); + } + + float3 rgb2lum = float3(0.30, 0.59, 0.11); + float lum[NUM]; + for (i = 0; i < NUM; i++) + { + lum[i] = dot(col[i].xyz, rgb2lum); + } + + float x = lum[2]+ lum[8]+2*lum[5]-lum[0]-2*lum[3]-lum[6]; + float y = lum[6]+2*lum[7]+ lum[8]-lum[0]-2*lum[1]-lum[2]; + float edge =(x*x + y*y < threshold)? 1.0:0.0; + + base.rgb *= edge; + + return base; +} \ No newline at end of file diff --git a/Templates/Modules/PostFXPack/Shaders/lensCircleP.hlsl b/Templates/Modules/PostFXPack/Shaders/lensCircleP.hlsl new file mode 100644 index 000000000..6729b9833 --- /dev/null +++ b/Templates/Modules/PostFXPack/Shaders/lensCircleP.hlsl @@ -0,0 +1,14 @@ +#include "shaders/common/postFx/postFx.hlsl" +#include "shadergen:/autogenConditioners.h" + +TORQUE_UNIFORM_SAMPLER2D(backBuffer, 0); +uniform float radiusX; +uniform float radiusY; + +float4 main(PFXVertToPix IN) : TORQUE_TARGET0 +{ + float4 base = TORQUE_TEX2D(backBuffer, IN.uv0); + float dist = distance(IN.uv0, float2(0.5,0.5)); + base.rgb *= smoothstep(radiusX, radiusY, dist); + return base; +} \ No newline at end of file diff --git a/Templates/Modules/PostFXPack/Shaders/monochromeP.hlsl b/Templates/Modules/PostFXPack/Shaders/monochromeP.hlsl new file mode 100644 index 000000000..6332c6cd8 --- /dev/null +++ b/Templates/Modules/PostFXPack/Shaders/monochromeP.hlsl @@ -0,0 +1,13 @@ +#include "shaders/common/postFx/postFx.hlsl" +#include "../../torque.hlsl" + +TORQUE_UNIFORM_SAMPLER2D(backBuffer, 0); + +float4 main(PFXVertToPix IN) : TORQUE_TARGET0 +{ + float4 base = TORQUE_TEX2D(backBuffer, IN.uv0); + + base.rgb = (base.r + base.g + base.b) / 3.0f; + + return base; +} \ No newline at end of file diff --git a/Templates/Modules/PostFXPack/Shaders/negativeP.hlsl b/Templates/Modules/PostFXPack/Shaders/negativeP.hlsl new file mode 100644 index 000000000..c16aeb50d --- /dev/null +++ b/Templates/Modules/PostFXPack/Shaders/negativeP.hlsl @@ -0,0 +1,11 @@ +#include "shaders/common/postFx/postFx.hlsl" +#include "../../torque.hlsl" + +TORQUE_UNIFORM_SAMPLER2D(backBuffer, 0); + +float4 main(PFXVertToPix IN) : TORQUE_TARGET0 +{ + float4 base = TORQUE_TEX2D(backBuffer, IN.uv0); + base.a = 0; + return float4(1.0f, 1.0f, 1.0f, 1.0f) - base; +} \ No newline at end of file diff --git a/Templates/Modules/PostFXPack/Shaders/nightVision2P.hlsl b/Templates/Modules/PostFXPack/Shaders/nightVision2P.hlsl new file mode 100644 index 000000000..1a863b6b0 --- /dev/null +++ b/Templates/Modules/PostFXPack/Shaders/nightVision2P.hlsl @@ -0,0 +1,48 @@ +#include "shaders/common/postFx/postFx.hlsl" +#include "shadergen:/autogenConditioners.h" + +uniform float accumTime; +TORQUE_UNIFORM_SAMPLER2D(backBuffer, 0); +uniform float luminanceThreshold; // 0.2 +uniform float colorAmplification; // 4.0 + +float4 main(PFXVertToPix IN) : TORQUE_TARGET0 +{ + float speed = 100; + float Yres = 1024; + float brightness = 0.2; + + float4 finalColor = float4(1.0, 1.0, 1.0, 1.0); + + float2 uv; + uv.x = 0.4 * sin(accumTime * 50.0); + uv.y = 0.4 * cos(accumTime * 50.0); + //float m = TORQUE_TEX2D(maskTex, gl_TexCoord[0].st).r; + //vec3 n = texture2D(noiseTex, (gl_TexCoord[0].st*3.5) + uv).rgb; + float3 c = TORQUE_TEX2D(backBuffer, IN.uv0).rgb; + + float lum = dot(float3(0.30, 0.59, 0.11), c); + if (lum < luminanceThreshold) + c *= colorAmplification; + + float3 visionColor = float3(0.1, 0.95, 0.2); + finalColor.rgb = c * visionColor; + + // add noise + float noise = IN.uv0.x * IN.uv0.y * accumTime * speed; + noise = fmod(noise, 10) * fmod(noise, 100); + noise = fmod(noise, 0.01); + + float3 color = finalColor.rgb; + color = color + color * saturate(noise.xxx * 200); + + // add banding + float sin,cos; + sincos(IN.uv0.y * Yres, sin, cos); + color += color * float3(sin, cos, sin) * brightness; + + finalColor.rgb = color; + + return finalColor; + +} \ No newline at end of file diff --git a/Templates/Modules/PostFXPack/Shaders/pixelateP.hlsl b/Templates/Modules/PostFXPack/Shaders/pixelateP.hlsl new file mode 100644 index 000000000..7a4d8bb84 --- /dev/null +++ b/Templates/Modules/PostFXPack/Shaders/pixelateP.hlsl @@ -0,0 +1,21 @@ +#include "shaders/common/postFx/postFx.hlsl" +#include "shadergen:/autogenConditioners.h" + +TORQUE_UNIFORM_SAMPLER2D(backBuffer, 0); +uniform float pixel_w; +uniform float pixel_h; +uniform float sizeX; +uniform float sizeY; + +float4 main(PFXVertToPix IN) : TORQUE_TARGET0 +{ + float2 uv = IN.uv0; + + float3 base = float3(1.0, 0.0, 0.0); + float dx = pixel_w * (1.0 / sizeX); + float dy = pixel_h * (1.0 / sizeY); + float2 coord = float2(dx*floor(uv.x/dx), dy*floor(uv.y/dy)); + base = TORQUE_TEX2D(backBuffer, coord).rgb; + + return float4(base, 1.0); +} \ No newline at end of file diff --git a/Templates/Modules/PostFXPack/Shaders/posterisationP.hlsl b/Templates/Modules/PostFXPack/Shaders/posterisationP.hlsl new file mode 100644 index 000000000..8235b5d38 --- /dev/null +++ b/Templates/Modules/PostFXPack/Shaders/posterisationP.hlsl @@ -0,0 +1,17 @@ +#include "shaders/common/postFx/postFx.hlsl" +#include "shadergen:/autogenConditioners.h" + +TORQUE_UNIFORM_SAMPLER2D(backBuffer, 0); +uniform float gamma; +uniform float numColors; + +float4 main(PFXVertToPix IN) : TORQUE_TARGET0 +{ + float3 base = TORQUE_TEX2D(backBuffer, IN.uv0).rgb; + base = pow(base, float3(gamma, gamma, gamma)); + base = base * numColors; + base = floor(base); + base = base / numColors; + base = pow(base, float3(1.0/gamma, 1.0/gamma, 1.0/gamma)); + return float4(base, 1.0); +} \ No newline at end of file diff --git a/Templates/Modules/PostFXPack/Shaders/rgbP.hlsl b/Templates/Modules/PostFXPack/Shaders/rgbP.hlsl new file mode 100644 index 000000000..1dc2b33d7 --- /dev/null +++ b/Templates/Modules/PostFXPack/Shaders/rgbP.hlsl @@ -0,0 +1,16 @@ +#include "shaders/common/postFx/postFx.hlsl" +#include "shadergen:/autogenConditioners.h" + +TORQUE_UNIFORM_SAMPLER2D(backBuffer, 0); +uniform float redLevel; +uniform float greenLevel; +uniform float blueLevel; + +float4 main(PFXVertToPix IN) : TORQUE_TARGET0 +{ + float4 base = TORQUE_TEX2D(backBuffer, IN.uv0); + base.r *= redLevel; + base.g *= greenLevel; + base.b *= blueLevel; + return base; +} \ No newline at end of file diff --git a/Templates/Modules/PostFXPack/Shaders/zoomBlurP.hlsl b/Templates/Modules/PostFXPack/Shaders/zoomBlurP.hlsl new file mode 100644 index 000000000..9a7211c4b --- /dev/null +++ b/Templates/Modules/PostFXPack/Shaders/zoomBlurP.hlsl @@ -0,0 +1,25 @@ +#include "shaders/common/postFx/postFx.hlsl" +#include "../../torque.hlsl" + +uniform float amount; +uniform float samples; +TORQUE_UNIFORM_SAMPLER2D(backBuffer, 0); + +float4 main(PFXVertToPix IN) : TORQUE_TARGET0 +{ + float b = 0; + + float4 base = TORQUE_TEX2D(backBuffer, IN.uv0); + float2 uv = IN.uv0; + + [loop] for (int i = 1; i <= samples; i++) + { + uv -= b; + uv *= amount; + b = (1-(1*pow(abs(amount), i))) / 2; + uv += b; + base += TORQUE_TEX2DLOD(backBuffer, float4(uv.x, uv.y, 0, 0)); + } + + return base / (samples + 1); +} \ No newline at end of file diff --git a/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/defaults.cs b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/defaults.cs new file mode 100644 index 000000000..70e31c0fb --- /dev/null +++ b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/defaults.cs @@ -0,0 +1,5 @@ +$RPGDialogEditorPref::ActionPath = "art/dialogs/dla/"; +$RPGDialogEditorPref::QuestionPath = "art/dialogs/dlq/"; +$RPGDialogEditorPref::PortraitsPath = "art/dialogs/portraits/"; +$RPGDialogEditorPref::mainMod="art"; +$RPGDialogEditorPref::MaxOptions = 100; diff --git a/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/editorMain.cs b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/editorMain.cs new file mode 100644 index 000000000..28ffbecb7 --- /dev/null +++ b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/editorMain.cs @@ -0,0 +1,1378 @@ +function QuestionText::onURL(%this, %url) +{ + if(firstword(%url)!$="RPGDialog" && firstword(%url)!$="RPGDialogLink") + { + gotoWebPage( %url ); + } + else if(firstword(%url)$="RPGDialogLink") + { + editQuestionLink(restwords(%url)); + } +} + +function initSaveAsPhase1() +{ + getSaveFilename("*.dlq", initSaveAsPhase2,$RPGDialog::currentDLQ); +} + +function initSaveAsPhase2(%QuestionFile) +{ + if(strPos(strlwr(%QuestionFile),".dlq")>=0) + { + $RPGDialog::SaveAsDLQ=%QuestionFile; + if(!isFile(%QuestionFile)) + { + schedule(20,0,"getSaveFilename","*.dla",initSaveAsPhase3,$RPGDialog::currentDLA); + } + else + { + MessageBoxYesNo("Warning","File already exists, overwrite?","schedule(20,0,getSaveFilename,\"*.dla\",initSaveAsPhase3,$RPGDialog::currentDLA);","schedule(20,0,getSaveFilename,\"*.dlq\",initSaveAsPhase2,$RPGDialog::currentDLQ);"); + } + } + else + { + MessageBoxOK("Error","File must have .dlq extension"); + } +} + +function initSaveAsPhase3(%ActionFile) +{ + %testFileName=$RPGDialog::SaveAsDLQ; + while(%i<=20) + { + %nextPos=strPos(%testFileName,"/"); + if(%nextPos<0) + { + %testFileName=getSubStr(%testFileName,0,strPos(%testFileName,".dlq"))@".dla"; + %i=21; + } + else + { + %testFileName=getSubStr(%testFileName,%nextPos+1,strLen(%testFileName)); + } + %i++; + } + + if(strPos(strlwr(%ActionFile),".dla")>=0) + { + if(strPos(%ActionFile,%testFileName)>=0) + { + $RPGDialog::SaveAsDLA=%ActionFile; + if(!isFile(%ActionFile)) + { + initSaveAsPhase4(); + } + else + { + MessageBoxYesNo("Warning","File already exists, overwrite?","initSaveAsPhase4();","schedule(20,0,getSaveFilename,\"*.dla\",initSaveAsPhase3,$RPGDialog::currentDLA);"); + } + } + else + { + MessageBoxOK("Error","Dla and Dlq filenames must be equal, but may be stored in different folders."); + } + } + else + { + MessageBoxOK("Error","File must have .dla extension"); + } +} + +function initSaveAsPhase4() +{ + $RPGDialog::currentDLQ=$RPGDialog::SaveAsDLQ; + $RPGDialog::currentDLA=$RPGDialog::SaveAsDLA; + saveScript(); +} + +function initNewScript() +{ + NewScriptQuestion.setvalue($RPGDialogEditorPref::QuestionPath@"new.dlq"); + NewScriptAction.setvalue($RPGDialogEditorPref::ActionPath@"new.dla"); + Canvas.pushDialog(NewScriptPopup); +} + +function newScript() +{ + %QuestionFile=NewScriptQuestion.getvalue(); + %ActionFile=NewScriptAction.getvalue(); + + %testFileName=%QuestionFile; + while(%i<=20) + { + %nextPos=strPos(%testFileName,"/"); + if(%nextPos<0) + { + %testFileName=getSubStr(%testFileName,0,strPos(%testFileName,".dlq"))@".dla"; + %i=21; + } + else + { + %testFileName=getSubStr(%testFileName,%nextPos+1,strLen(%testFileName)); + } + %i++; + } + + if(strPos(%ActionFile,%testFileName)>=0) + { + %extensionCheck=strPos(%QuestionFile,".dlq"); + if(%extensionCheck<0) + { + %QuestionFile=%QuestionFile@".dlq"; + } + + %extensionCheck=strPos(%ActionFile,".dla"); + if(%extensionCheck<0) + { + %ActionFile=%ActionFile@".dla"; + } + + if(!isFile(%QuestionFile)) + { + if(!isFile(%ActionFile)) + { + Canvas.popDialog(NewScriptPopup); + + if(TextScript.getvalue()!$="Current Q. Script:") + { + for(%i=1;%i<=$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0];%i++) + { + (Answer@%i).delete(); + (Action@%i).delete(); + (editAnswer@%i@Button).delete(); + (moveAnswer@%i@UpButton).delete(); + (moveAnswer@%i@DownButton).delete(); + } + } + + deleteVariables("$RPGDialog::*");//delete all obsolete globals and reset the 2 that are needed. + $RPGDialog::currentDLQ=%QuestionFile; + $RPGDialog::currentDLA=%ActionFile; + TextScript.settext("Current Q. Script: "@$RPGDialog::currentDLQ); + TextScript2.settext("Current A. Script: "@$RPGDialog::currentDLA); + TextQuestionNumber.settext("Question: 0/0"); + QuestionText.settext(""); + Canvas.setContent(MainEditorScreenGui); + } + else + MessageBoxOK("Error","Cannot create question script file"); + } + else + { + MessageBoxOK("Error","Cannot create action script file"); + } + } + else + { + MessageBoxOK("Error","Dla and Dlq filenames must be equal, but may be stored in different folders."); + } +} + +function LoadScript(%qScriptName) +{ + $RPGDialog::currentDLQ=%qScriptName; + %aScriptName=strReplace(%qScriptName,".dlq",".dla"); + $RPGDialog::currentDLA=%aScriptName; + if(!isFile(%aScriptName)) + { + %path=%qScriptName; + while(%i<=20) + { + %nextPos=strPos(%path,"/"); + if(%nextPos<0) + { + %aScriptFileName=getSubStr(%path,0,strPos(%path,".dlq"))@".dla"; + %i=21; + } + else + { + %path=getSubStr(%path,%nextPos+1,strLen(%path)); + } + %i++; + } + %aScriptName=$RPGDialogEditorPref::ActionPath@%aScriptFileName; + $RPGDialog::currentDLA=%aScriptName; + if(!isFile(%aScriptName)) + { + MessageBoxOK("Error","Couldn't find "@%aScriptFileName@" on the default dla folder nor on the same directory as the dlq."); + } + } + if(TextScript.getvalue()!$="Current Q. Script:") + { + for(%i=1;%i<=$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0];%i++) + { + (Answer@%i).delete(); + (Action@%i).delete(); + (editAnswer@%i@Button).delete(); + (moveAnswer@%i@UpButton).delete(); + (moveAnswer@%i@DownButton).delete(); + } + } + + deleteVariables("$RPGDialog::*");//delete all obsolete globals and reset the 2 that are needed. + $RPGDialog::currentDLQ=%qScriptName; + $RPGDialog::currentDLA=%aScriptName; + + %file = new FileObject(); + if(isfile(%qScriptName) && %file.openForRead(%qScriptName)) + { + while(!%file.isEOF()) + { + $RPGDialog::Questions++; + + %line=%file.readLine(); + %answerStart=strPos(%line,""); + %question=getSubStr(%line,0,%answerStart); + %soundStart=strPos(%question, "~Sound:"); + if(%soundStart>=0) + { + $RPGDialog::QuestionSound[$RPGDialog::Questions]=getSubStr(%question,%soundStart+7,strLen(%question)); + %question=getSubStr(%question, 0, %soundStart); + } + $RPGDialog::Question[$RPGDialog::Questions]=%question; + + %lineLinks=%line; + %i=1; + while(%i<=$RPGDialogEditorPref::MaxOptions) + { + %QuestionLinkHeaderSize=strlen(""); + %QuestionLinkStart=strpos(%lineLinks,""); + %lineLinks=getSubStr(%lineLinks,%QuestionLinkStart+%QuestionLinkHeaderSize,strlen(%lineLinks)); + %QuestionLinkEnd=strpos(%lineLinks,""); + + if(%QuestionLinkStart<0||%QuestionLinkEnd<0) + { + %i=$RPGDialogEditorPref::MaxOptions+1; + } + else + { + $RPGDialog::QuestionLink[$RPGDialog::Questions,%i]=getSubStr(%lineLinks,0,%QuestionLinkEnd); + $RPGDialog::QuestionLink[$RPGDialog::Questions,0]=%i;//use this to store how many answers are avaible for this question link. + %i++; + } + } + + %i=1; + while(%i<=$RPGDialogEditorPref::MaxOptions) + { + %AnswerHeaderSize=strlen(""); + %AnswerStart=strpos(%line,""); + %line=getSubStr(%line,%AnswerStart+%AnswerHeaderSize,strlen(%line)); + %AnswerEnd=strpos(%line,""); + + if(%AnswerStart<0||%AnswerEnd<0) + { + %i=$RPGDialogEditorPref::MaxOptions+1; + } + else + { + $RPGDialog::Answer[$RPGDialog::Questions,%i]=getSubStr(%line,0,%AnswerEnd); + $RPGDialog::Answer[$RPGDialog::Questions,0]=%i;//use this to store how many answers are avaible for this question. + %i++; + } + } + + } + } + %file.close(); + if(isfile(%aScriptName) && %file.openForRead(%aScriptName)) + { + while(!%file.isEOF()) + { + %Actions++; + %line=%line2=%file.readLine(); + + %i=1; + while(%i<=$RPGDialogEditorPref::MaxOptions) + { + %ActionHeaderSize=strlen(""); + %ActionStart=strpos(%line,""); + %line=getSubStr(%line,%ActionStart+%ActionHeaderSize,strlen(%line)); + %ActionEnd=strpos(%line,"")+5; + + if(%ActionStart<0||%ActionEnd<0) + { + %i=$RPGDialogEditorPref::MaxOptions+1; + } + else + { + $RPGDialog::QuestionLinkAction[%Actions,%i]=getSubStr(%line,0,%ActionEnd); + $RPGDialog::QuestionLinkAction[%Actions,0]=%i;//use this to store how many actions are avaible for this question. + %i++; + } + } + + %i=1; + while(%i<=$RPGDialogEditorPref::MaxOptions) + { + %ActionHeaderSize=strlen("<"@%i@">"); + %ActionStart=strpos(%line2,"<"@%i@">"); + %line2=getSubStr(%line2,%ActionStart+%ActionHeaderSize,strlen(%line2)); + %ActionEnd=strpos(%line2,"")+5; + + if(%ActionStart<0||%ActionEnd<0) + { + %i=$RPGDialogEditorPref::MaxOptions+1; + } + else + { + $RPGDialog::Action[%Actions,%i]=getSubStr(%line2,0,%ActionEnd); + $RPGDialog::Action[%Actions,0]=%i;//use this to store how many actions are avaible for this question. + %i++; + } + } + } + if($RPGDialog::Questions>0) + { + $RPGDialog::CurrentQuestion=1; + TextQuestionNumber.settext("Question: 1/"@$RPGDialog::Questions); + QuestionText.settext($RPGDialog::Question[1]); + } + else + { + $RPGDialog::CurrentQuestion=0; + TextQuestionNumber.settext("Question: 0/0"); + QuestionText.settext(""); + } + TextScript.settext("Current Q. Script: "@$RPGDialog::currentDLQ); + TextScript2.settext("Current A. Script: "@$RPGDialog::currentDLA); + + for(%i=1;%i<=$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0];%i++) + { + OptionsControl.add(new GuiMLTextCtrl(Answer@%i) + { + profile = "GuiMLTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "2 2"; + extent = "390 40"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + lineSpacing = "2"; + allowColorChars = "1"; + maxChars = "-1"; + }); + + OptionsControl.add(new GuiMLTextCtrl(Action@%i) + { + profile = "GuiMLTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "400 2"; + extent = "300 14"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + lineSpacing = "2"; + allowColorChars = "1"; + maxChars = "-1"; + }); + + OptionsControl.add(new GuiButtonCtrl(editAnswer@%i@Button) + { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "700 2"; + extent = "54 15"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Edit A."@%i; + groupNum = "-1"; + buttonType = "PushButton"; + command = "EditAnswer("@%i@");"; + }); + OptionsControl.add(new GuiButtonCtrl(moveAnswer@%i@UpButton) + { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "700 17"; + extent = "21 15"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Up"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "MoveAnswerUp("@%i@");"; + }); + if(%i==1) + (moveAnswer@%i@UpButton).setvisible(0); + else + (moveAnswer@%i@UpButton).setvisible(1); + OptionsControl.add(new GuiButtonCtrl(moveAnswer@%i@DownButton) + { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "721 17"; + extent = "33 15"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Down"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "MoveAnswerDown("@%i@");"; + }); + if(%i==$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0]) + (moveAnswer@%i@DownButton).setvisible(0); + else + (moveAnswer@%i@DownButton).setvisible(1); + + (Answer@%i).settext($RPGDialog::Answer[$RPGDialog::CurrentQuestion,%i]); + (Action@%i).settext($RPGDialog::Action[$RPGDialog::CurrentQuestion,%i]); + } + Canvas.setContent(MainEditorScreenGui); + RefreshOptions(); + } + %file.close(); + %file.delete(); +} + +function SaveScript() +{ + %qScriptName=$RPGDialog::currentDLQ; + %aScriptName=$RPGDialog::currentDLA; + + %file = new FileObject(); + if(%file.openForWrite(%qScriptName)) + { + for(%i=1;%i<=$RPGDialog::Questions;%i++) + { + if($RPGDialog::QuestionSound[%i]!$="") + { + %line=$RPGDialog::Question[%i]@"~Sound:"@$RPGDialog::QuestionSound[%i]@""; + } + else + { + %line=$RPGDialog::Question[%i]@""; + } + + for(%f=1;%f<=$RPGDialog::Answer[%i,0];%f++) + { + %line=%line@""@$RPGDialog::Answer[%i,%f]@"
"; + } + %file.writeLine(%line); + } + } + %file.close(); + if(%file.openForWrite(%aScriptName)) + { + for(%i=1;%i<=$RPGDialog::Questions;%i++) + { + %line=""; + for(%f=1;%f<=$RPGDialog::QuestionLinkAction[%i,0];%f++) + { + %line=%line@""@$RPGDialog::QuestionLinkAction[%i,%f]; + } + + for(%f=1;%f<=$RPGDialog::Action[%i,0];%f++) + { + %line=%line@"<"@%f@">"@$RPGDialog::Action[%i,%f]; + } + %file.writeLine(%line); + } + } + %file.close(); + %file.delete(); +} + +function NextQuestion() +{ + if($RPGDialog::CurrentQuestion<$RPGDialog::Questions) + { + $RPGDialog::CurrentQuestion++; + QuestionText.settext($RPGDialog::Question[$RPGDialog::CurrentQuestion]); + TextQuestionNumber.settext("Question: "@$RPGDialog::CurrentQuestion@"/"@$RPGDialog::Questions); + + for(%i=1;%i<=$RPGDialog::Answer[$RPGDialog::CurrentQuestion-1,0];%i++) + { + (Answer@%i).delete(); + (Action@%i).delete(); + (editAnswer@%i@Button).delete(); + (moveAnswer@%i@UpButton).delete(); + (moveAnswer@%i@DownButton).delete(); + } + + for(%i=1;%i<=$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0];%i++) + { + OptionsControl.add(new GuiMLTextCtrl(Answer@%i) + { + profile = "GuiMLTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "2 2"; + extent = "390 40"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + lineSpacing = "2"; + allowColorChars = "1"; + maxChars = "-1"; + }); + + OptionsControl.add(new GuiMLTextCtrl(Action@%i) + { + profile = "GuiMLTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "400 2"; + extent = "300 40"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + lineSpacing = "2"; + allowColorChars = "1"; + maxChars = "-1"; + }); + + OptionsControl.add(new GuiButtonCtrl(editAnswer@%i@Button) + { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "700 2"; + extent = "54 15"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Edit A."@%i; + groupNum = "-1"; + buttonType = "PushButton"; + command = "EditAnswer("@%i@");"; + }); + OptionsControl.add(new GuiButtonCtrl(moveAnswer@%i@UpButton) + { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "700 17"; + extent = "21 15"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Up"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "MoveAnswerUp("@%i@");"; + }); + if(%i==1) + (moveAnswer@%i@UpButton).setvisible(0); + else + (moveAnswer@%i@UpButton).setvisible(1); + OptionsControl.add(new GuiButtonCtrl(moveAnswer@%i@DownButton) + { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "721 17"; + extent = "33 15"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Down"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "MoveAnswerDown("@%i@");"; + }); + if(%i==$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0]) + (moveAnswer@%i@DownButton).setvisible(0); + else + (moveAnswer@%i@DownButton).setvisible(1); + + (Answer@%i).settext($RPGDialog::Answer[$RPGDialog::CurrentQuestion,%i]); + (Action@%i).settext($RPGDialog::Action[$RPGDialog::CurrentQuestion,%i]); + } + RefreshOptions(); + } +} + +function PreviousQuestion() +{ + if($RPGDialog::CurrentQuestion>1) + { + $RPGDialog::CurrentQuestion--; + QuestionText.settext($RPGDialog::Question[$RPGDialog::CurrentQuestion]); + TextQuestionNumber.settext("Question: "@$RPGDialog::CurrentQuestion@"/"@$RPGDialog::Questions); + + for(%i=1;%i<=$RPGDialog::Answer[$RPGDialog::CurrentQuestion+1,0];%i++) + { + (Answer@%i).delete(); + (Action@%i).delete(); + (editAnswer@%i@Button).delete(); + (moveAnswer@%i@UpButton).delete(); + (moveAnswer@%i@DownButton).delete(); + } + + for(%i=1;%i<=$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0];%i++) + { + OptionsControl.add(new GuiMLTextCtrl(Answer@%i) + { + profile = "GuiMLTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "2 2"; + extent = "390 40"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + lineSpacing = "2"; + allowColorChars = "1"; + maxChars = "-1"; + }); + + OptionsControl.add(new GuiMLTextCtrl(Action@%i) + { + profile = "GuiMLTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "400 2"; + extent = "300 40"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + lineSpacing = "2"; + allowColorChars = "1"; + maxChars = "-1"; + }); + + OptionsControl.add(new GuiButtonCtrl(editAnswer@%i@Button) + { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "700 2"; + extent = "54 15"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Edit A."@%i; + groupNum = "-1"; + buttonType = "PushButton"; + command = "EditAnswer("@%i@");"; + }); + OptionsControl.add(new GuiButtonCtrl(moveAnswer@%i@UpButton) + { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "700 17"; + extent = "21 15"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Up"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "MoveAnswerUp("@%i@");"; + }); + if(%i==1) + (moveAnswer@%i@UpButton).setvisible(0); + else + (moveAnswer@%i@UpButton).setvisible(1); + OptionsControl.add(new GuiButtonCtrl(moveAnswer@%i@DownButton) + { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "721 17"; + extent = "33 15"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Down"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "MoveAnswerDown("@%i@");"; + }); + if(%i==$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0]) + (moveAnswer@%i@DownButton).setvisible(0); + else + (moveAnswer@%i@DownButton).setvisible(1); + + (Answer@%i).settext($RPGDialog::Answer[$RPGDialog::CurrentQuestion,%i]); + (Action@%i).settext($RPGDialog::Action[$RPGDialog::CurrentQuestion,%i]); + } + RefreshOptions(); + } +} + +function GotoQuestion(%Question) +{ + if(%Question<=$RPGDialog::Questions && %Question>0) + { + for(%i=1;%i<=$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0];%i++) + { + if((Answer@%i).extent!$="") + (Answer@%i).delete(); + if((Action@%i).extent!$="") + (Action@%i).delete(); + if((editAnswer@%i@Button).extent!$="") + (editAnswer@%i@Button).delete(); + if((moveAnswer@%i@UpButton).extent!$="") + (moveAnswer@%i@UpButton).delete(); + if((moveAnswer@%i@DownButton).extent!$="") + (moveAnswer@%i@DownButton).delete(); + } + + $RPGDialog::CurrentQuestion=%Question; + QuestionText.settext($RPGDialog::Question[$RPGDialog::CurrentQuestion]); + TextQuestionNumber.settext("Question: "@$RPGDialog::CurrentQuestion@"/"@$RPGDialog::Questions); + + for(%i=1;%i<=$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0];%i++) + { + OptionsControl.add(new GuiMLTextCtrl(Answer@%i) + { + profile = "GuiMLTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "2 2"; + extent = "390 40"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + lineSpacing = "2"; + allowColorChars = "1"; + maxChars = "-1"; + }); + + OptionsControl.add(new GuiMLTextCtrl(Action@%i) + { + profile = "GuiMLTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "400 2"; + extent = "300 40"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + lineSpacing = "2"; + allowColorChars = "1"; + maxChars = "-1"; + }); + + OptionsControl.add(new GuiButtonCtrl(editAnswer@%i@Button) + { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "700 2"; + extent = "54 15"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Edit A."@%i; + groupNum = "-1"; + buttonType = "PushButton"; + command = "EditAnswer("@%i@");"; + }); + OptionsControl.add(new GuiButtonCtrl(moveAnswer@%i@UpButton) + { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "700 17"; + extent = "21 15"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Up"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "MoveAnswerUp("@%i@");"; + }); + if(%i==1) + (moveAnswer@%i@UpButton).setvisible(0); + else + (moveAnswer@%i@UpButton).setvisible(1); + OptionsControl.add(new GuiButtonCtrl(moveAnswer@%i@DownButton) + { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "721 17"; + extent = "33 15"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Down"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "MoveAnswerDown("@%i@");"; + }); + if(%i==$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0]) + (moveAnswer@%i@DownButton).setvisible(0); + else + (moveAnswer@%i@DownButton).setvisible(1); + + (Answer@%i).settext($RPGDialog::Answer[$RPGDialog::CurrentQuestion,%i]); + (Action@%i).settext($RPGDialog::Action[$RPGDialog::CurrentQuestion,%i]); + } + RefreshOptions(); + } +} + +function RefreshOptions() +{ + for(%i=1;%i<=$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0];%i++) + { + %ActionText=(Action1).gettext(); + %ActionText=strReplace(%ActionText,"",""); + Action1.settext(%ActionText); + if(%i>1) + { + (Answer@%i).resize(2, + 2+(restWords((Answer@(%i-1)).getPosition()))+42, + firstWord((Answer@%i).getExtent()), + restWords((Answer@%i).getExtent())); + %ActionText=(Action@%i).gettext(); + %ActionText=strReplace(%ActionText,"",""); + (Action@%i).settext(%ActionText); + (Action@%i).resize(400, + restWords((Answer@%i).getPosition()), + firstWord((Action@%i).getExtent()), + restWords((Action@%i).getExtent())); + + (editAnswer@%i@Button).resize(700, + restWords((Answer@%i).getPosition()), + firstWord((editAnswer@%i@Button).getExtent()), + restWords((editAnswer@%i@Button).getExtent())); + + (moveAnswer@%i@UpButton).resize(700, + restWords((Answer@%i).getPosition())+17, + firstWord((moveAnswer@%i@UpButton).getExtent()), + restWords((moveAnswer@%i@UpButton).getExtent())); + + (moveAnswer@%i@DownButton).resize(721, + restWords((Answer@%i).getPosition())+17, + firstWord((moveAnswer@%i@DownButton).getExtent()), + restWords((moveAnswer@%i@DownButton).getExtent())); + } + + OptionsControl.resize(firstWord(OptionsControl.getPosition()), + restWords(OptionsControl.getPosition()), + firstWord(OptionsControl.getExtent()), + restWords((moveAnswer@%i@DownButton).getPosition())+restWords((moveAnswer@%i@DownButton).GetExtent())); + } + (moveAnswer@$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0]@DownButton).setvisible(0); +} + +function setDefaultQuestionPath(%Path) +{ + $RPGDialogEditorPref::QuestionPath=%path; +} + +function setDefaultActionPath(%Path) +{ + $RPGDialogEditorPref::ActionPath=%path; +} + +function savePrefs() +{ + echo("Exporting editor prefs"); + export("$RPGDialogEditorPref::*", "~/prefs.cs", False); +} + +function editQuestion() +{ + if($RPGDialog::Questions>0) + { + QuestionEdit.settext($RPGDialog::Question[$RPGDialog::CurrentQuestion]); + $RPGDialog::NewQuestion=false; + PopulateSoundList($RPGDialog::QuestionSound[$RPGDialog::CurrentQuestion]); + Canvas.setContent(EditQuestionGui); + } +} + +function newQuestion() +{ + QuestionEdit.settext(""); + $RPGDialog::NewQuestion=true; + PopulateSoundList($RPGDialog::QuestionSound[$RPGDialog::CurrentQuestion]); + Canvas.setContent(EditQuestionGui); +} + +function newAnswer() +{ + if($RPGDialog::Questions>0) + { + AnswerEdit.settext(""); + ActionEdit.settext(""); + $RPGDialog::NewAnswer=true; + Canvas.setContent(EditAnswerGui); + } +} + +function confirmQuestionEdit() +{ + if(!$RPGDialog::NewQuestion) + { + $RPGDialog::Question[$RPGDialog::CurrentQuestion]=QuestionEdit.gettext(); + QuestionText.settext($RPGDialog::Question[$RPGDialog::CurrentQuestion]); + + $RPGDialog::QuestionSound[$RPGDialog::CurrentQuestion]=QuestionEditSound.getValue(); + + Canvas.setContent(MainEditorScreenGui); + } + else + { + $RPGDialog::Questions++; + + $RPGDialog::Question[$RPGDialog::Questions]=QuestionEdit.gettext(); + + $RPGDialog::Answer[$RPGDialog::Questions,0]=1; + $RPGDialog::Action[$RPGDialog::Questions,0]=1; + + $RPGDialog::Answer[$RPGDialog::Questions,1]="Continue..."; + $RPGDialog::Action[$RPGDialog::Questions,1]="CloseQuestion()"; + + $RPGDialog::QuestionSound[$RPGDialog::CurrentQuestion]=QuestionEditSound.getValue(); + + GotoQuestion($RPGDialog::Questions); + Canvas.setContent(MainEditorScreenGui); + } + $RPGDialog::NewQuestion=false; +} + +function cancelQuestionEdit() +{ + for(%i=1;%i<=$RPGDialog::QuestionLink[$RPGDialog::Questions+1,0];%i++) + { + $RPGDialog::QuestionLink[$RPGDialog::Questions+1,%i]=""; + $RPGDialog::QuestionLinkAction[$RPGDialog::Questions+1,%i]=""; + } + $RPGDialog::QuestionLink[$RPGDialog::Questions+1,0]=0; + $RPGDialog::QuestionLinkAction[$RPGDialog::Questions+1,0]=0; + $RPGDialog::NewQuestion=false; + Canvas.setContent(MainEditorScreenGui); +} + +function deleteQuestion() +{ + if($RPGDialog::Questions>0) + { + $RPGDialog::Messages=""; + while($RPGDialog::Answer[$RPGDialog::CurrentQuestion,0]!=0) + { + deleteAnswer(1); + } + + for(%i=1;%i<$RPGDialog::CurrentQuestion;%i++) //Process actions that are before the question being deleted and update them as necessary + { + for(%f=1;%f<=$RPGDialog::QuestionLink[%i,0];%f++) + { + $RPGDialog::QuestionLinkAction[%i,%f]=updateAction($RPGDialog::QuestionLinkAction[%i,%f],%i,"Question Link "@%f); + } + + for(%f=1;%f<=$RPGDialog::Answer[%i,0];%f++) + { + $RPGDialog::Action[%i,%f]=updateAction($RPGDialog::Action[%i,%f],%i,"Answer "@%f); + } + } + + for(%i=$RPGDialog::CurrentQuestion;%i<$RPGDialog::Questions;%i++) //Now process the questions, answer and actions that are after the question being deleted, moving them to their new place and updating the actions as necessary. + { + $RPGDialog::Question[%i]=$RPGDialog::Question[%i+1]; + $RPGDialog::QuestionSound[%i]=$RPGDialog::QuestionSound[%i+1]; + $RPGDialog::QuestionLink[%i,0]=$RPGDialog::QuestionLink[%i+1]; + $RPGDialog::QuestionLinkAction[%i,0]=$RPGDialog::QuestionLink[%i+1]; + $RPGDialog::Answer[%i,0]=$RPGDialog::Answer[%i+1,0]; + $RPGDialog::Action[%i,0]=$RPGDialog::Action[%i+1,0]; + + for(%f=1;%f<=$RPGDialog::Answer[%i,0];%f++) + { + $RPGDialog::Answer[%i,%f]=$RPGDialog::Answer[%i+1,%f]; + $RPGDialog::Action[%i,%f]=updateAction($RPGDialog::Action[%i+1,%f],%i,"Answer "@%f); + } + + for(%f=1;%f<=$RPGDialog::QuestionLink[%i,0];%f++) + { + $RPGDialog::QuestionLink[%i,%f]=$RPGDialog::QuestionLink[%i+1,%f]; + $RPGDialog::QuestionLinkAction[%i,%f]=updateAction($RPGDialog::QuestionLinkAction[%i+1,%f],%i,"Question Link "@%f); + } + } + $RPGDialog::Questions--; + + if($RPGDialog::CurrentQuestion>$RPGDialog::Questions) + $RPGDialog::CurrentQuestion--; + + if($RPGDialog::Messages!$="") + MessageBoxOK("Warning",$RPGDialog::Messages); + + GotoQuestion($RPGDialog::CurrentQuestion); + } +} + +function updateAction(%action,%currentQuestion,%currentAnswer) +{ + %command=getSubStr(%action,0,strPos(%action,"(")); + %args=getSubStr(%action,strPos(%action,"(")+1,strLen(%action)); + + %i=1; + while(%i<=1000) //just a max number of args to prevent the program from going into an infinite loop if something goes wrong. + { + if(strPos(%args,",")>=0) + { + %arg[%i]=getSubStr(%args,0,strPos(%args,",")); + %args=getSubStr(%args,strPos(%args,",")+1,strLen(%args)); + } + else + { + %arg[%i]=getSubStr(%args,0,strPos(%args,")")); + %arg[0]=%i; //use arg[0] to store how many args are avaible + %i=1001; + } + %i++; + } + + switch$(%command) + { + case "GotoQuestion": + if(%arg[1]==$RPGDialog::CurrentQuestion) + { + %arg[1]="QUESTION DELETED"; + warn("Question "@%currentQuestion@"/"@%currentAnswer@" needs updating!"); + $RPGDialog::Messages=$RPGDialog::Messages@"Question "@%currentQuestion@"/"@%currentAnswer@" needs updating!\n"; + } + else if(%arg[1]>%currentQuestion) + %arg[1]--; + + case "ChangeStartQuestion": + if(%arg[1]==$RPGDialog::CurrentQuestion) + { + %arg[1]="QUESTION DELETED"; + warn("Question "@%currentQuestion@"/"@%currentAnswer@" needs updating!"); + $RPGDialog::Messages=$RPGDialog::Messages@"Question "@%currentQuestion@"/"@%currentAnswer@" needs updating!\n"; + } + else if(%arg[1]>%currentQuestion) + %arg[1]--; + + case "ChangeStartQuestionAndOpen": + if(%arg[1]==$RPGDialog::CurrentQuestion) + { + %arg[1]="QUESTION DELETED"; + warn("Question "@%currentQuestion@"/"@%currentAnswer@" needs updating!"); + $RPGDialog::Messages=$RPGDialog::Messages@"Question "@%currentQuestion@"/"@%currentAnswer@" needs updating!\n"; + } + else if(%arg[1]>%currentQuestion) + %arg[1]--; + + case "ChangeStartQuestionAndGoto": + if(%arg[1]==$RPGDialog::CurrentQuestion) + { + %arg[1]="QUESTION DELETED"; + warn("Question "@%currentQuestion@"/"@%currentAnswer@" needs updating!"); + $RPGDialog::Messages=$RPGDialog::Messages@"Question "@%currentQuestion@"/"@%currentAnswer@" needs updating!\n"; + } + else if(%arg[1]>%currentQuestion) + %arg[1]--; + + if(%arg[2]==$RPGDialog::CurrentQuestion) + { + %arg[2]="QUESTION DELETED"; + warn("Question "@%currentQuestion@"/"@%currentAnswer@" needs updating!"); + $RPGDialog::Messages=$RPGDialog::Messages@"Question "@%currentQuestion@"/"@%currentAnswer@" needs updating!\n"; + } + else if(%arg[2]>%currentQuestion) + %arg[2]--; + + case "ChangePortraitAndGoto": + if(%arg[2]==$RPGDialog::CurrentQuestion) + { + %arg[2]="QUESTION DELETED"; + warn("Question "@%currentQuestion@"/"@%currentAnswer@" needs updating!"); + $RPGDialog::Messages=$RPGDialog::Messages@"Question "@%currentQuestion@"/"@%currentAnswer@" needs updating!\n"; + } + else if(%arg[2]>%currentQuestion) + %arg[2]--; + } + + if(%arg[0]>0) + { + %args=%arg[1]; + for(%i=2;%i<=%arg[0];%i++) + { + %args=%args@","@%arg[%i]; + } + } + else + %args=""; + + return(%command@"("@%args@")"); +} + +function editAnswer(%answerNumber) +{ + %ActionText=$RPGDialog::Action[$RPGDialog::CurrentQuestion,%answerNumber]; + %ActionText=strReplace(%ActionText,"",""); + AnswerEdit.settext($RPGDialog::Answer[$RPGDialog::CurrentQuestion,%answerNumber]); + ActionEdit.settext(%ActionText); + $RPGDialog::EditAnswerNumber=%answerNumber; + Canvas.setContent(EditAnswerGui); +} + +function moveAnswerUp(%answerNumber) +{ + if(%answerNumber>1 && $RPGDialog::Answer[$RPGDialog::CurrentQuestion,0]>1) + { + %tempAnswer=$RPGDialog::Answer[$RPGDialog::CurrentQuestion,%answerNumber]; + %tempAction=$RPGDialog::Action[$RPGDialog::CurrentQuestion,%answerNumber]; + + $RPGDialog::Answer[$RPGDialog::CurrentQuestion,%answerNumber]=$RPGDialog::Answer[$RPGDialog::CurrentQuestion,%answerNumber-1]; + $RPGDialog::Action[$RPGDialog::CurrentQuestion,%answerNumber]=$RPGDialog::Action[$RPGDialog::CurrentQuestion,%answerNumber-1]; + + $RPGDialog::Answer[$RPGDialog::CurrentQuestion,%answerNumber-1]=%tempAnswer; + $RPGDialog::Action[$RPGDialog::CurrentQuestion,%answerNumber-1]=%tempAction; + + (Answer@%answerNumber).settext($RPGDialog::Answer[$RPGDialog::CurrentQuestion,%answerNumber]); + (Action@%answerNumber).settext($RPGDialog::Action[$RPGDialog::CurrentQuestion,%answerNumber]); + (Answer@%answerNumber-1).settext($RPGDialog::Answer[$RPGDialog::CurrentQuestion,%answerNumber-1]); + (Action@%answerNumber-1).settext($RPGDialog::Action[$RPGDialog::CurrentQuestion,%answerNumber-1]); + RefreshOptions(); + } +} + +function moveAnswerDown(%answerNumber) +{ + if(%answerNumber<$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0] && $RPGDialog::Answer[$RPGDialog::CurrentQuestion,0]>1) + { + %tempAnswer=$RPGDialog::Answer[$RPGDialog::CurrentQuestion,%answerNumber]; + %tempAction=$RPGDialog::Action[$RPGDialog::CurrentQuestion,%answerNumber]; + + $RPGDialog::Answer[$RPGDialog::CurrentQuestion,%answerNumber]=$RPGDialog::Answer[$RPGDialog::CurrentQuestion,%answerNumber+1]; + $RPGDialog::Action[$RPGDialog::CurrentQuestion,%answerNumber]=$RPGDialog::Action[$RPGDialog::CurrentQuestion,%answerNumber+1]; + + $RPGDialog::Answer[$RPGDialog::CurrentQuestion,%answerNumber+1]=%tempAnswer; + $RPGDialog::Action[$RPGDialog::CurrentQuestion,%answerNumber+1]=%tempAction; + + (Answer@%answerNumber).settext($RPGDialog::Answer[$RPGDialog::CurrentQuestion,%answerNumber]); + (Action@%answerNumber).settext($RPGDialog::Action[$RPGDialog::CurrentQuestion,%answerNumber]); + (Answer@%answerNumber+1).settext($RPGDialog::Answer[$RPGDialog::CurrentQuestion,%answerNumber+1]); + (Action@%answerNumber+1).settext($RPGDialog::Action[$RPGDialog::CurrentQuestion,%answerNumber+1]); + RefreshOptions(); + } +} + +function editQuestionLink(%questionLinkNumber) +{ + AnswerEdit.settext($RPGDialog::QuestionLink[$RPGDialog::CurrentQuestion,%questionLinkNumber]); + ActionEdit.settext($RPGDialog::QuestionLinkAction[$RPGDialog::CurrentQuestion,%questionLinkNumber]); + $RPGDialog::EditAnswerNumber="QL"@%questionLinkNumber; + + Canvas.setContent(EditAnswerGui); +} + +function confirmAnswerEdit() +{ + %QuestionLinkCheck=getSubStr($RPGDialog::EditAnswerNumber,0,2); + if(%QuestionLinkCheck$="QL") + { + if(AnswerEdit.gettext()!$="") + { + %QuestionLinkNumber=getSubStr($RPGDialog::EditAnswerNumber,2,strLen($RPGDialog::EditAnswerNumber)); + %questionText=strReplace(QuestionText.gettext(),$RPGDialog::QuestionLink[$RPGDialog::CurrentQuestion,%questionLinkNumber],AnswerEdit.gettext()); + $RPGDialog::QuestionLink[$RPGDialog::CurrentQuestion,%QuestionLinkNumber]=AnswerEdit.gettext(); + %ActionText=ActionEdit.getvalue(); + %ActionText=%ActionText@""; + $RPGDialog::QuestionLinkAction[$RPGDialog::CurrentQuestion,%QuestionLinkNumber]=%ActionText; + $RPGDialog::Question[$RPGDialog::CurrentQuestion]=%questionText; + QuestionText.setText(%questionText); + GotoQuestion($RPGDialog::CurrentQuestion); + Canvas.setContent(MainEditorScreenGui); + } + else //if new value is blank then delete question link + { + MessageBoxYesNo( "Delete Question Link", "Do you really want to delete this question link?", "deleteAnswer("@$RPGDialog::EditAnswerNumber@");", ""); + } + } + else + { + if(!$RPGDialog::NewAnswer) + { + if(AnswerEdit.gettext()!$="") + { + $RPGDialog::Answer[$RPGDialog::CurrentQuestion,$RPGDialog::EditAnswerNumber]=AnswerEdit.gettext(); + %ActionText=ActionEdit.getvalue(); + %ActionText=%ActionText@""; + $RPGDialog::Action[$RPGDialog::CurrentQuestion,$RPGDialog::EditAnswerNumber]=%ActionText; + (Answer@$RPGDialog::EditAnswerNumber).settext($RPGDialog::Answer[$RPGDialog::CurrentQuestion,$RPGDialog::EditAnswerNumber]); + (Action@$RPGDialog::EditAnswerNumber).settext($RPGDialog::Action[$RPGDialog::CurrentQuestion,$RPGDialog::EditAnswerNumber]); + + RefreshOptions(); + Canvas.setContent(MainEditorScreenGui); + } + else //if new value is blank then delete answer + { + MessageBoxYesNo( "Delete Answer", "Do you really want to delete this answer?", "deleteAnswer("@$RPGDialog::EditAnswerNumber@");", ""); + } + } + else + { + $RPGDialog::Answer[$RPGDialog::CurrentQuestion,0]++; + $RPGDialog::Action[$RPGDialog::CurrentQuestion,0]++; + + $RPGDialog::Answer[$RPGDialog::CurrentQuestion,$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0]]=AnswerEdit.gettext(); + $RPGDialog::Action[$RPGDialog::CurrentQuestion,$RPGDialog::Action[$RPGDialog::CurrentQuestion,0]]=ActionEdit.getvalue(); + + $RPGDialog::NewAnswer=false; + + GotoQuestion($RPGDialog::CurrentQuestion); + Canvas.setContent(MainEditorScreenGui); + } + } + $RPGDialog::EditAnswerNumber=0; +} + +function deleteAnswer(%AnswerNumber) +{ + %QuestionLinkCheck=getSubStr(%AnswerNumber,0,2); + if(%QuestionLinkCheck$="QL") + { + %QuestionLinkNumber=getSubStr(%AnswerNumber,2,strLen(%AnswerNumber)); + %QuestionLink=$RPGDialog::Question[$RPGDialog::CurrentQuestion]; + %QuestionLinkStart=strpos(%QuestionLink,""); + %QuestionLink=getSubStr(%QuestionLink,%QuestionLinkStart,strlen(%QuestionLink)); + %QuestionLinkEnd=strpos(%QuestionLink,"")+4; + + %Answer=getSubStr(%QuestionLink,0,%QuestionLinkEnd); + %Question=strReplace($RPGDialog::Question[$RPGDialog::CurrentQuestion],%Answer,""); + + for(%i=%QuestionLinkNumber;%i<=$RPGDialog::QuestionLink[$RPGDialog::CurrentQuestion,0];%i++) + { + $RPGDialog::QuestionLink[$RPGDialog::CurrentQuestion,%i]=$RPGDialog::QuestionLink[$RPGDialog::CurrentQuestion,%i+1]; + $RPGDialog::QuestionLinkAction[$RPGDialog::CurrentQuestion,%i]=$RPGDialog::QuestionLinkAction[$RPGDialog::CurrentQuestion,%i+1]; + %Question=strReplace(%Question,"",""); + } + + $RPGDialog::QuestionLink[$RPGDialog::CurrentQuestion,0]--; + $RPGDialog::QuestionLinkAction[$RPGDialog::CurrentQuestion,0]--; + $RPGDialog::Question[$RPGDialog::CurrentQuestion]=%Question; + } + else + { + for(%i=%answerNumber;%i<$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0];%i++) + { + $RPGDialog::Answer[$RPGDialog::CurrentQuestion,%i]=$RPGDialog::Answer[$RPGDialog::CurrentQuestion,%i+1]; + $RPGDialog::Action[$RPGDialog::CurrentQuestion,%i]=$RPGDialog::Action[$RPGDialog::CurrentQuestion,%i+1]; + } + + (Answer@$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0]).delete(); + (Action@$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0]).delete(); + (editAnswer@$RPGDialog::Answer[$RPGDialog::CurrentQuestion,0]@Button).delete(); + + $RPGDialog::Answer[$RPGDialog::CurrentQuestion,0]--; + $RPGDialog::Action[$RPGDialog::CurrentQuestion,0]--; + } + RefreshOptions(); + Canvas.setContent(MainEditorScreenGui); +} + +function PopulateActionList() +{ + %file = new FileObject(); + if(isfile($RPGDialogEditorPref::MainMod@"/server/scripts/core/RPGDialog.cs") && %file.openForRead($RPGDialogEditorPref::MainMod@"/server/scripts/core/RPGDialog.cs")) + { + while(!%file.isEOF()) + { + %i++; + %line=%file.readLine(); + if(strPos(%line,"//")>=0) + { + ActionList.addrow(%i,getSubStr(%line,14,strLen(%line)),%i); + } + } + } + %file.close(); + %file.delete(); +} + +function PopulateQuestionOptionsList() +{ + QuestionOptionsList.addrow(1,"New Question Link",1); + QuestionOptionsList.addrow(2,"<>",2); + QuestionOptionsList.addrow(3,"<>",3); +} + +function PopulateSoundList(%value) +{ + QuestionEditSound.clear(); + QuestionEditSound.add(%value,1); + QuestionEditSound.setSelected(1); + %file = new FileObject(); + if(isfile($RPGDialogEditorPref::MainMod@"/client/scripts/RPGDialogAudioProfiles.cs") && %file.openForRead($RPGDialogEditorPref::MainMod@"/client/scripts/RPGDialogAudioProfiles.cs")) + { + %i=2; + while(!%file.isEOF()) + { + %line=%file.readLine(); + if(strPos(%line,"new AudioProfile(")>=0) + { + %start=strPos(%line,"(")+1; + %end=strPos(%line,")")-%start; + QuestionEditSound.add(getSubStr(%line,%start,%end),%i); + } + %i++; + } + } + %file.close(); + %file.delete(); +} + + +function ActionList::onSelect(%this) +{ + %text=ActionEdit.getvalue()@%this.getRowTextById(%this.getSelectedID()); + ActionEdit.settext(%text); +} + +function QuestionOptionsList::onSelect(%this) +{ + if(%this.getSelectedID()==1) + { + %text=%this.getRowTextById(%this.getSelectedID()); + if($RPGDialog::NewQuestion) + { + $RPGDialog::QuestionLink[$RPGDialog::Questions+1,0]++; + $RPGDialog::QuestionLinkAction[$RPGDialog::Questions+1,0]++; + $RPGDialog::QuestionLink[$RPGDialog::Questions+1,$RPGDialog::QuestionLink[$RPGDialog::Questions+1,0]]="New Question Link"; + $RPGDialog::QuestionLinkAction[$RPGDialog::Questions+1,$RPGDialog::QuestionLinkAction[$RPGDialog::Questions+1,0]]="CloseDialog()"; + %text=strReplace(%text,"#",$RPGDialog::QuestionLink[$RPGDialog::CurrentQuestion+1,0]); + } + else + { + $RPGDialog::QuestionLink[$RPGDialog::CurrentQuestion,0]++; + $RPGDialog::QuestionLinkAction[$RPGDialog::CurrentQuestion,0]++; + $RPGDialog::QuestionLink[$RPGDialog::CurrentQuestion,$RPGDialog::QuestionLink[$RPGDialog::CurrentQuestion,0]]="New Question Link"; + $RPGDialog::QuestionLinkAction[$RPGDialog::CurrentQuestion,$RPGDialog::QuestionLinkAction[$RPGDialog::CurrentQuestion,0]]="CloseDialog()"; + %text=strReplace(%text,"#",$RPGDialog::QuestionLink[$RPGDialog::CurrentQuestion,0]); + } + QuestionEdit.addtext(%text@" ",true); + return; + } + %text=%this.getRowTextById(%this.getSelectedID()); + QuestionEdit.addtext(%text,true); +} + +function initSetPaths() +{ + MainMod.setValue($RPGDialogEditorPref::mainMod); + QuestionScriptPath.setValue($RPGDialogEditorPref::QuestionPath); + ActionScriptPath.setValue($RPGDialogEditorPref::ActionPath); + PortraitsPath.setValue($RPGDialogEditorPref::PortraitsPath); + Canvas.pushDialog(SetPathsPopup); +} + +function SetPaths() +{ + $RPGDialogEditorPref::mainMod=MainMod.getValue(); + $RPGDialogEditorPref::QuestionPath=QuestionScriptPath.getValue(); + $RPGDialogEditorPref::ActionPath=ActionScriptPath.getValue(); + $RPGDialogEditorPref::PortraitsPath=PortraitsPath.getValue(); + echo("Exporting RPGDialog editor prefs"); + export("$RPGDialogEditorPref::*", "~/RPGDialogEditor/prefs.cs", False); + Canvas.popDialog(SetPathsPopup); +} diff --git a/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ingameRPGDialogEditor.cs b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ingameRPGDialogEditor.cs new file mode 100644 index 000000000..a5179c75b --- /dev/null +++ b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ingameRPGDialogEditor.cs @@ -0,0 +1,57 @@ +//----------------------------------------------------------------------------- +// Torque Game Engine +// +// Copyright (c) 2001 GarageGames.Com +// Portions Copyright (c) 2001 by Sierra Online, Inc. +//----------------------------------------------------------------------------- + +function initRPGDialogEditor() +{ + exec("~/scripts/RPGDialogEditor/ui/MainEditorScreenGui.gui"); + exec("~/scripts/RPGDialogEditor/ui/EditQuestionGui.gui"); + exec("~/scripts/RPGDialogEditor/ui/EditAnswerGui.gui"); + exec("~/scripts/RPGDialogEditor/ui/NewScriptPopup.gui"); + exec("~/scripts/RPGDialogEditor/ui/SetPathsPopup.gui"); + exec("~/scripts/RPGDialogEditor/ui/EditorOpeningGui.gui"); + + exec("~/scripts/RPGDialogEditor/defaults.cs"); + exec("~/scripts/RPGDialogEditor/prefs.cs"); + exec("~/scripts/RPGDialogEditor/editorMain.cs"); + + PopulateActionList(); + PopulateQuestionOptionsList(); + GlobalActionMap.bind(keyboard, "f5", toggleRPGDialogEditor); +} + +function openRPGDialogEditor() +{ + $GuiBeforeRPGDialogEditor=Canvas.getContent(); + if(TextScript.getvalue()$="Current Q. Script:") + Canvas.setContent(EditorOpeningGui); + else + Canvas.setContent(MainEditorScreenGui); + Canvas.setCursor("DefaultCursor"); +} + +function closeRPGDialogEditor() +{ + Canvas.setContent($GuiBeforeRPGDialogEditor); + Canvas.setCursor("DefaultCursor"); +} + + +function toggleRPGDialogEditor(%val) +{ + if (%val) + { + if (Canvas.getContent() == MainEditorScreenGui.getId() || + Canvas.getContent() == EditQuestionGui.getId() || + Canvas.getContent() == EditAnswerGui.getId() || + Canvas.getContent() == EditorOpeningGui.getId()) + closeRPGDialogEditor(); + else + openRPGDialogEditor(); + } +} + + diff --git a/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/main.cs b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/main.cs new file mode 100644 index 000000000..902794676 --- /dev/null +++ b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/main.cs @@ -0,0 +1,68 @@ +//----------------------------------------------------------------------------- +// Torque Game Engine +// +// Copyright (c) 2001 GarageGames.Com +// Portions Copyright (c) 2001 by Sierra Online, Inc. +//----------------------------------------------------------------------------- + +function initEditor() +{ + exec("~/scripts/RPGDialogEditor/ui/MainEditorScreenGui.gui"); + exec("~/scripts/RPGDialogEditor/ui/EditQuestionGui.gui"); + exec("~/scripts/RPGDialogEditor/ui/EditAnswerGui.gui"); + exec("~/scripts/RPGDialogEditor/ui/NewScriptPopup.gui"); + exec("~/scripts/RPGDialogEditor/ui/SetPathsPopup.gui"); + exec("~/scripts/RPGDialogEditor/ui/EditorOpeningGui.gui"); + + exec("~/scripts/RPGDialogEditor/defaults.cs"); + exec("~/scripts/RPGDialogEditor/prefs.cs"); + exec("~/scripts/RPGDialogEditor/editorMain.cs"); +} + +function startEditor() +{ + // The client mod has already set it's own content, but we'll + // just load something new. + Canvas.setContent(EditorOpeningGui); + Canvas.setCursor("DefaultCursor"); + PopulateActionList(); + PopulateQuestionOptionsList(); +} + + +//----------------------------------------------------------------------------- +// Package overrides to initialize the mod. +// This module currently loads on top of the client mod, but it probably +// doesn't need to. Should look into having disabling the client and +// doing our own canvas init. + +package RPGDialogEditor { + +function onStart() +{ + Parent::onStart(); + echo("\n--------- Initializing MOD: RPGDialogEditor ---------"); + + if (!isObject(Canvas)) { + // If the parent onStart didn't open a canvas, then we're + // probably not running as a mod. We'll have to do the work + // ourselves. + initCanvas("RPGDialog Editor"); + } + initEditor(); + startEditor(); +} + +function onExit() +{ + echo("Exporting RPGDialog editor prefs"); + export("$RPGDialogEditorPref::*", "~/prefs.cs", False); + + if(isEventPending($RPGDialog::RefreshSchedule)) + cancel($RPGDialog::RefreshSchedule); + + Parent::onExit(); +} + +}; // package end. +activatePackage(RPGDialogEditor); diff --git a/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/prefs.cs b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/prefs.cs new file mode 100644 index 000000000..2b24ab4d1 --- /dev/null +++ b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/prefs.cs @@ -0,0 +1,5 @@ +$RPGDialogEditorPref::ActionPath = "art/dialogs/dla/"; +$RPGDialogEditorPref::mainMod = "art"; +$RPGDialogEditorPref::MaxOptions = 100; +$RPGDialogEditorPref::PortraitsPath = "art/dialogs/portraits/"; +$RPGDialogEditorPref::QuestionPath = "art/dialogs/dlq/"; diff --git a/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/EditAnswerGui.gui b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/EditAnswerGui.gui new file mode 100644 index 000000000..f407f11bc --- /dev/null +++ b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/EditAnswerGui.gui @@ -0,0 +1,131 @@ +new GuiChunkedBitmapCtrl(EditAnswerGui) { + 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 GuiScrollCtrl(AnswerEditScroll) { + profile = "GuiScrollProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "40 50"; + extent = "480 500"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + willFirstRespond = "1"; + hScrollBar = "alwaysOff"; + vScrollBar = "dynamic"; + constantThumbHeight = "0"; + childMargin = "2 2"; + + new GuiMLTextEditCtrl(AnswerEdit) { + profile = "GuiMLTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "0 2"; + extent = "450 500"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + lineSpacing = "2"; + allowColorChars = "1"; + maxChars = "-1"; + }; + }; + + new GuiTextEditCtrl(ActionEdit) { + profile = "GuiTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "40 20"; + extent = "711 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + lineSpacing = "2"; + allowColorChars = "0"; + maxChars = "-1"; + }; + + new GuiButtonCtrl(AnswerEditConfirmButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "523 530"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "OK"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "confirmAnswerEdit();"; + }; + new GuiButtonCtrl(AnswerEditCancelButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "598 530"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Cancel"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "Canvas.setContent(MainEditorScreenGui);"; + }; + new GuiButtonCtrl(AnswerEditDeleteButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "673 530"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Delete"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "MessageBoxYesNo( \"Delete Answer\", \"Do you really want to delete this answer?\", \"deleteAnswer(\"@$RPGDialog::EditAnswerNumber@\");\", \"\");"; + }; + new GuiScrollCtrl(ActionListScroll) { + profile = "GuiScrollProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "521 50"; + extent = "230 476"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + willFirstRespond = "1"; + hScrollBar = "dynamic"; + vScrollBar = "dynamic"; + constantThumbHeight = "0"; + childMargin = "2 2"; + + new GuiTextListCtrl(ActionList) { + profile = "GuiTextListProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "0 0"; + extent = "196 401"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + enumerate = "0"; + resizeCell = "1"; + columns = "0"; + fitParentWidth = "0"; + clipColumnText = "0"; + }; + }; +}; diff --git a/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/EditQuestionGui.gui b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/EditQuestionGui.gui new file mode 100644 index 000000000..5b333050a --- /dev/null +++ b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/EditQuestionGui.gui @@ -0,0 +1,161 @@ +new GuiChunkedBitmapCtrl(EditQuestionGui) { + 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 GuiScrollCtrl(QuestionEditScroll) { + profile = "GuiScrollProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "40 50"; + extent = "480 500"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + willFirstRespond = "1"; + hScrollBar = "alwaysOff"; + vScrollBar = "dynamic"; + constantThumbHeight = "0"; + childMargin = "2 2"; + + new GuiMLTextEditCtrl(QuestionEdit) { + profile = "GuiMLTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "0 2"; + extent = "450 500"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + lineSpacing = "2"; + allowColorChars = "1"; + maxChars = "-1"; + }; + }; + new GuiButtonCtrl(QuestionEditConfirmButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "523 530"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "OK"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "confirmQuestionEdit();"; + }; + new GuiButtonCtrl(QuestionEditCancelButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "598 530"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Cancel"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "cancelQuestionEdit();"; + }; + new GuiButtonCtrl(QuestionEditClearButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "673 530"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Clear"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "QuestionEdit.settext(\"\");QuestionEditSound.setValue(\"\");"; + }; + new GuiScrollCtrl(QuestionOptionsScroll) { + profile = "GuiScrollProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "521 83"; + extent = "230 443"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + willFirstRespond = "1"; + hScrollBar = "dynamic"; + vScrollBar = "dynamic"; + constantThumbHeight = "0"; + childMargin = "2 2"; + + new GuiTextListCtrl(QuestionOptionsList) { + profile = "GuiTextListProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "0 0"; + extent = "196 401"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + enumerate = "0"; + resizeCell = "1"; + columns = "0"; + fitParentWidth = "0"; + clipColumnText = "0"; + }; + }; + new GuiTextCtrl() { + profile = "GuiTextProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "524 46"; + extent = "50 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Sound Profile:"; + maxLength = "255"; + }; + new GuiPopUpMenuCtrl(QuestionEditSound) { + profile = "GuiPopUpMenuProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "521 62"; + extent = "135 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + maxLength = "255"; + historySize = "0"; + password = "0"; + tabComplete = "0"; + sinkAllKeyEvents = "0"; + maxPopupHeight = "500"; + }; + + new GuiButtonCtrl(QuestionEditRemoveSound) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "660 62"; + extent = "90 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Remove Sound"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "QuestionEditSound.setValue(\"\");"; + }; + + +}; diff --git a/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/EditorOpeningGui.gui b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/EditorOpeningGui.gui new file mode 100644 index 000000000..961a92000 --- /dev/null +++ b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/EditorOpeningGui.gui @@ -0,0 +1,108 @@ +//--- OBJECT WRITE BEGIN --- +new GuiChunkedBitmapCtrl(EditorOpeningGui) { + profile = "GuiContentProfile"; + horizSizing = "width"; + vertSizing = "height"; + position = "0 0"; + extent = "640 480"; + minExtent = "8 8"; + visible = "1"; + bitmap = "./background"; + useVariable = "0"; + tile = "0"; + helpTag = "0"; + + new GuiBitmapCtrl() { + profile = "GuiDefaultProfile"; + horizSizing = "center"; + vertSizing = "bottom"; + position = "78 10"; + extent = "484 160"; + minExtent = "8 2"; + visible = "1"; + bitmap = "./title"; + wrap = "0"; + helpTag = "0"; + }; + new GuiBitmapCtrl() { + profile = "GuiDefaultProfile"; + horizSizing = "center"; + vertSizing = "center"; + position = "248 147"; + extent = "143 186"; + minExtent = "8 2"; + visible = "1"; + bitmap = "./box"; + wrap = "0"; + helpTag = "0"; + + new GuiButtonCtrl(NewScriptButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "36 47"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + command = "initNewScript();"; + text = "New Script"; + groupNum = "-1"; + buttonType = "PushButton"; + helpTag = "0"; + }; + new GuiButtonCtrl(LoadScriptButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "36 66"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + command = "getLoadFilename(\"*.dlq\", LoadScript);"; + text = "Load Script..."; + groupNum = "-1"; + buttonType = "PushButton"; + helpTag = "0"; + }; + new GuiButtonCtrl(SetPathsButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "36 85"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + command = "initSetPaths();"; + text = "Set Paths..."; + groupNum = "-1"; + buttonType = "PushButton"; + helpTag = "0"; + }; + new GuiButtonCtrl(QuitButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "36 117"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + command = "MessageBoxYesNo( \"Quit Editor\", \"Do you really want to quit the editor?\", \"if($GuiBeforeRPGDialogEditor==0)quit();else closeRPGDialogEditor();\", \"\");"; + text = "Quit"; + groupNum = "-1"; + buttonType = "PushButton"; + helpTag = "0"; + }; + new GuiTextCtrl(Version) { + profile = "GuiTextProfile"; + horizSizing = "center"; + vertSizing = "bottom"; + position = "58 18"; + extent = "26 18"; + minExtent = "8 2"; + visible = "1"; + text = "V.1.3"; + maxLength = "255"; + }; + }; +}; +//--- OBJECT WRITE END --- diff --git a/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/MainEditorScreenGui.gui b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/MainEditorScreenGui.gui new file mode 100644 index 000000000..9f8d900b0 --- /dev/null +++ b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/MainEditorScreenGui.gui @@ -0,0 +1,265 @@ +//--- OBJECT WRITE BEGIN --- +new GuiChunkedBitmapCtrl(MainEditorScreenGui) { + 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 GuiTextCtrl(TextScript) { + profile = "GuiTextProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "162 21"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Current Q. Script:"; + maxLength = "255"; + }; + + new GuiTextCtrl(TextScript2) { + profile = "GuiTextProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "162 33"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Current A. Script:"; + maxLength = "255"; + }; + + new GuiTextCtrl(TextQuestionNumber) { + profile = "GuiTextProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "162 208"; + extent = "46 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Question: 0/0"; + maxLength = "255"; + }; + new GuiButtonCtrl(NewScriptButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "85 52"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "New Script"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "initNewScript();"; + }; + new GuiButtonCtrl(LoadScriptButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "85 71"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Load Script..."; + groupNum = "-1"; + buttonType = "PushButton"; + command = "getLoadFilename(\"*.dlq\", LoadScript);"; + }; + new GuiButtonCtrl(NextQuestionButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "610 212"; + extent = "29 16"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Next"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "NextQuestion();"; + }; + new GuiButtonCtrl(PreviousQuestionButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "579 212"; + extent = "29 16"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Prev."; + groupNum = "-1"; + buttonType = "PushButton"; + command = "PreviousQuestion();"; + }; + + new GuiScrollCtrl(QuestionScroll) { + profile = "GuiScrollProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "160 50"; + extent = "480 160"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + willFirstRespond = "1"; + hScrollBar = "alwaysOff"; + vScrollBar = "dynamic"; + constantThumbHeight = "0"; + childMargin = "4 2"; + + new GuiMLTextCtrl(QuestionText) { + profile = "GuiMLTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "4 2"; + extent = "478 116"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + lineSpacing = "2"; + allowColorChars = "1"; + maxChars = "-1"; + }; + }; + new GuiScrollCtrl(OptionsScroll) { + profile = "GuiScrollProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "10 250"; + extent = "780 300"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + willFirstRespond = "1"; + hScrollBar = "alwaysOff"; + vScrollBar = "alwaysOn"; + constantThumbHeight = "0"; + childMargin = "2 2"; + + new GuiControl(OptionsControl) { + profile = "GuiDefaultProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "4 2"; + extent = "770 290"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + }; + }; + new GuiButtonCtrl(editQuestionButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "642 123"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Edit Question"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "EditQuestion();"; + }; + new GuiButtonCtrl(newQuestionButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "642 51"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "New Question"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "newQuestion();"; + }; + new GuiButtonCtrl(newAnswerButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "715 230"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "New Answer"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "newAnswer();"; + }; + new GuiButtonCtrl(DeleteQuestionButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "642 76"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Del. Question"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "if($RPGDialog::Questions>0) MessageBoxYesNo( \"Delete Question\", \"Do you really want to delete this question?\", \"deleteQuestion();\", \"\");"; + }; + new GuiButtonCtrl(QuitButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "85 192"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Quit"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "MessageBoxYesNo( \"Quit Editor\", \"Do you really want to quit the editor?\", \"if($GuiBeforeRPGDialogEditor==0)quit();else closeRPGDialogEditor();\", \"\");"; + }; + new GuiButtonCtrl(SaveScriptButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "85 103"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Save Script"; + groupNum = "-1"; + buttonType = "PushButton"; + command = "SaveScript();"; + }; + new GuiButtonCtrl(SaveScriptAsButton) { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "85 122"; + extent = "73 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Save As..."; + groupNum = "-1"; + buttonType = "PushButton"; + command = "InitSaveAsPhase1();"; + }; + +}; +//--- OBJECT WRITE END --- diff --git a/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/NewScriptPopup.gui b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/NewScriptPopup.gui new file mode 100644 index 000000000..37b269141 --- /dev/null +++ b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/NewScriptPopup.gui @@ -0,0 +1,115 @@ +//--- OBJECT WRITE BEGIN --- +new GuiControl(NewScriptPopup) { + profile = "GuiDefaultProfile"; + horizSizing = "center"; + vertSizing = "center"; + position = "0 0"; + extent = "640 480"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + + new GuiWindowCtrl() { + profile = "GuiWindowProfile"; + horizSizing = "center"; + vertSizing = "center"; + position = "220 146"; + extent = "200 188"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "New Dialog Script"; + maxLength = "255"; + resizeWidth = "1"; + resizeHeight = "1"; + canMove = "0"; + canClose = "0"; + canMinimize = "0"; + canMaximize = "0"; + minSize = "50 50"; + + new GuiTextCtrl() { + profile = "GuiTextProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "20 28"; + extent = "50 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Question Script:"; + maxLength = "255"; + }; + new GuiTextEditCtrl(NewScriptQuestion) { + profile = "GuiTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "20 44"; + extent = "160 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + maxLength = "255"; + historySize = "0"; + password = "0"; + tabComplete = "0"; + sinkAllKeyEvents = "0"; + }; + new GuiTextCtrl() { + profile = "GuiTextProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "20 68"; + extent = "30 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Action Script:"; + maxLength = "255"; + }; + new GuiTextEditCtrl(NewScriptAction) { + profile = "GuiTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "20 84"; + extent = "160 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + maxLength = "255"; + historySize = "0"; + password = "0"; + tabComplete = "0"; + sinkAllKeyEvents = "0"; + }; + new GuiButtonCtrl() { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "56 156"; + extent = "40 16"; + minExtent = "8 2"; + visible = "1"; + command = "NewScript();"; + helpTag = "0"; + text = "Create"; + groupNum = "-1"; + buttonType = "PushButton"; + }; + new GuiButtonCtrl() { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "104 156"; + extent = "40 16"; + minExtent = "8 2"; + visible = "1"; + command = "Canvas.popDialog(NewScriptPopup);"; + helpTag = "0"; + text = "Cancel"; + groupNum = "-1"; + buttonType = "PushButton"; + }; + }; +}; +//--- OBJECT WRITE END --- diff --git a/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/SetPathsPopup.gui b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/SetPathsPopup.gui new file mode 100644 index 000000000..549bc6a8e --- /dev/null +++ b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/SetPathsPopup.gui @@ -0,0 +1,169 @@ +//--- OBJECT WRITE BEGIN --- +new GuiControl(SetPathsPopup) { + profile = "GuiDefaultProfile"; + horizSizing = "center"; + vertSizing = "center"; + position = "0 0"; + extent = "640 480"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + + new GuiWindowCtrl() { + profile = "GuiWindowProfile"; + horizSizing = "center"; + vertSizing = "center"; + position = "220 146"; + extent = "200 228"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Paths"; + maxLength = "255"; + resizeWidth = "1"; + resizeHeight = "1"; + canMove = "0"; + canClose = "0"; + canMinimize = "0"; + canMaximize = "0"; + minSize = "50 50"; + + new GuiTextCtrl() { + profile = "GuiTextProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "20 24"; + extent = "67 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Main Mod Folder:"; + maxLength = "255"; + }; + new GuiTextEditCtrl(MainMod) { + profile = "GuiTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "20 40"; + extent = "160 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + maxLength = "255"; + historySize = "0"; + password = "0"; + tabComplete = "0"; + sinkAllKeyEvents = "0"; + }; + new GuiTextCtrl() { + profile = "GuiTextProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "20 64"; + extent = "101 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Question Script Path:"; + maxLength = "255"; + }; + new GuiTextEditCtrl(QuestionScriptPath) { + profile = "GuiTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "20 80"; + extent = "160 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + maxLength = "255"; + historySize = "0"; + password = "0"; + tabComplete = "0"; + sinkAllKeyEvents = "0"; + }; + new GuiTextCtrl() { + profile = "GuiDefaultProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "20 104"; + extent = "89 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Action Script Path:"; + maxLength = "255"; + }; + new GuiTextEditCtrl(ActionScriptPath) { + profile = "GuiTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "20 120"; + extent = "160 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + maxLength = "255"; + historySize = "0"; + password = "0"; + tabComplete = "0"; + sinkAllKeyEvents = "0"; + }; + new GuiTextCtrl() { + profile = "GuiTextProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "20 144"; + extent = "67 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + text = "Portraits Path:"; + maxLength = "255"; + }; + new GuiTextEditCtrl(PortraitsPath) { + profile = "GuiTextEditProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "20 160"; + extent = "160 18"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + maxLength = "255"; + historySize = "0"; + password = "0"; + tabComplete = "0"; + sinkAllKeyEvents = "0"; + }; + new GuiButtonCtrl() { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "56 192"; + extent = "40 16"; + minExtent = "8 2"; + visible = "1"; + command = "SetPaths();"; + helpTag = "0"; + text = "Set"; + groupNum = "-1"; + buttonType = "PushButton"; + }; + new GuiButtonCtrl() { + profile = "GuiButtonProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "104 192"; + extent = "40 16"; + minExtent = "8 2"; + visible = "1"; + command = "Canvas.popDialog(SetPathsPopup);"; + helpTag = "0"; + text = "Cancel"; + groupNum = "-1"; + buttonType = "PushButton"; + }; + }; +}; +//--- OBJECT WRITE END --- diff --git a/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/background.jpg b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca263137c25280364594542b283182d07abc1d84 GIT binary patch literal 152215 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

&P*cD!zkh~?9->Rvl09a1^x_#)7q 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

admwKC$hAMCJ@HcRXBnH*zT-{9x$) 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 ${W`~hwDqy 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 NgkdhyHNvo;|JkNs#ykK3 literal 0 HcmV?d00001 diff --git a/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/box.png b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/box.png new file mode 100644 index 0000000000000000000000000000000000000000..d358d77abfe34063c97e6f2de24809b0adf3a234 GIT binary patch literal 6836 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 literal 0 HcmV?d00001 diff --git a/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/title.png b/Templates/Modules/RPGDialog/Scripts/RPGDialogEditor/ui/title.png new file mode 100644 index 0000000000000000000000000000000000000000..0947ba52f48e15370f04a014f37807b850eff0d8 GIT binary patch literal 85872 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 z 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 e<}#P3L;fG(0) + $Pref::RPGDialog::MaxOptions=$RPGDialogEditorPref::MaxOptions; + +function getQuestion(%questionFile,%questionNumber) +{ + %file = new FileObject(); + if(isFile($Pref::RPGDialog::Client::QuestionPath@%questionFile@".dlq") && %file.openForRead($Pref::RPGDialog::Client::QuestionPath@%questionFile@".dlq")) + { + for(%i=1;%i<%questionNumber;%i++) + { + %file.readLine(); + if(%file.isEOF()) + return ""; + } + %question=%file.readLine(); + } + else if(isFile($RPGDialogEditorPref::QuestionPath@%questionFile@".dlq") && %file.openForRead($RPGDialogEditorPref::QuestionPath@%questionFile@".dlq")) + { + for(%i=1;%i<%questionNumber;%i++) + { + %file.readLine(); + if(%file.isEOF()) + return ""; + } + %question=%file.readLine(); + } + %file.close(); + %file.delete(); + return %question; +} + +function clientCmdCloseRPGDialog() +{ + Canvas.popDialog(RPGDialog); + RPGDialogQuestion.settext(""); + RPGDialogAnswer.settext(""); +} + +function clientCmdRPGDialogMessage(%sender,%senderName,%portrait,%npcFile,%questionNumber,%playerName) +{ + $RPGDialog::Sender=%sender; + $RPGDialog::questionNumber=%questionNumber; + onRPGDialogMessage(%npcFile,%questionNumber,%senderName,%portrait,%playerName); +} + +function onRPGDialogMessage(%npcFile,%questionNumber,%senderName,%portrait,%playerName) +{ + if(%portrait!$="" && isFile($RPGDialogEditorPref::PortraitsPath@%portrait)) + { + RPGDialogPortrait.setbitmap($RPGDialogEditorPref::PortraitsPath@%portrait); + } + else + { + RPGDialogPortrait.setbitmap($RPGDialogEditorPref::PortraitsPath@"unknown.png"); + } + + if(%npcFile!$="") + { + %QuestionAnswer=GetQuestion(%npcfile,%questionNumber); + + if(%QuestionAnswer!$="") + { + %AnswerStart=strPos(%QuestionAnswer,""); + %question=getSubStr(%QuestionAnswer,0,%AnswerStart); + %answer=getSubStr(%QuestionAnswer,%AnswerStart+13,strLen(%QuestionAnswer)); + } + else + { + %question="ERROR::Invalid Question!!\nnpcFile = "@%npcFile@"\nquestionNumber = "@%questionNumber; + } + } + + if (%question!$="") + { + %question=strreplace(%question,"<>",%senderName); + %question=strreplace(%question,"<>",%playerName); + + + if ((%soundStart = playRPGDialogSound(%question)) != -1) + %question = getSubStr(%question, 0, %soundStart); + + RPGDialogQuestion.settext(%question); + ChatHud.addLine($Pref::RPGDialog::ChatHudQuestionColor@%senderName@": "@StripMLControlChars(%question)); + } + + if (%answer!$="") + { + %answer=strReplace(%answer,"<>",%senderName); + %answer=strReplace(%answer,"<>",%playerName); + %answer=strReplace(%answer,"
","\n"); + + %line=%answer; + %i=1; + while(%i<=$Pref::RPGDialog::MaxOptions) //lets number the options + { + %Start=strpos(%line,""); + + if(%Start<0) + { + %i=$Pref::RPGDialog::MaxOptions+1; + } + else + { + %line=getSubStr(%line,%Start,strlen(%line)); + %End=strpos(%line,"
")+4; + %line=getSubStr(%line,%End,strlen(%line)); + %answer=strReplace(%answer,""," "@%i@" - "); + %i++; + } + } + + + RPGDialogAnswer.settext(%answer); + } + else + { + RPGDialogAnswer.settext("Continue..."); + } + RPGDialogAnswer.Visible=true; + + Canvas.pushDialog(RPGDialog); +} + +function RPGDialogAnswer::onURL(%this, %url) +{ +//same as RPGDialogQuestion::onURL, so just forward the call +RPGDialogQuestion::onURL(%this, %url); +} + +function RPGDialogQuestion::onURL(%this, %url) +{ + if(firstword(%url)!$="RPGDialog" && firstword(%url)!$="RPGDialogLink" && firstword(%url)!$="RPGDialogNoAnswer") + { + gotoWebPage( %url ); + } + else if(firstword(%url)$="RPGDialogLink") + { + %Answers=%this.gettext(); + %AnswerHeaderSize=strlen(""); + %AnswerStart=strpos(%Answers,"")+%AnswerHeaderSize; + %Answers=getSubStr(%Answers,%AnswerStart,strLen(%Answers)); + %AnswerEnd=strPos(%Answers,"")+4; + + ChatHud.addLine($Pref::RPGDialog::ChatHudAnswerColor@"You: "@StripMLControlChars(getSubStr(%Answers,0,%AnswerEnd))); + + CommandToServer('RPGDialogAnswer', $RPGDialog::Sender, $RPGDialog::questionNumber, "QL"@restwords(%url)); + + Canvas.popDialog(RPGDialog); + RPGDialogQuestion.settext(""); + RPGDialogAnswer.settext(""); + } + else if(firstword(%url)$="RPGDialogNoAnswer") + { + Canvas.popDialog(RPGDialog); + RPGDialogQuestion.settext(""); + RPGDialogAnswer.settext(""); + } + else + { + %Answers=%this.gettext(); + %Answers=strReplace(%Answers,restwords(%url)@" - ",""); + %AnswerHeaderSize=strlen(""); + %AnswerStart=strpos(%Answers,"")+%AnswerHeaderSize; + %Answers=getSubStr(%Answers,%AnswerStart,strLen(%Answers)); + %AnswerEnd=strpos(%Answers,"")+4; + + ChatHud.addLine($Pref::RPGDialog::ChatHudAnswerColor@"You: "@StripMLControlChars(getSubStr(%Answers,0,%AnswerEnd))); + + CommandToServer('RPGDialogAnswer', $RPGDialog::Sender, $RPGDialog::questionNumber, restwords(%url)); + + Canvas.popDialog(RPGDialog); + RPGDialogQuestion.settext(""); + RPGDialogAnswer.settext(""); + } +} + +function playRPGDialogSound(%message) +{ + // Search for wav tag marker. + %soundStart = strstr(%message, "~Sound:"); + if (%soundStart == -1) { + return -1; + } + + if(alxIsPlaying($RPGDialogSoundHandle)) + alxStop($RPGDialogSoundHandle); + + %sound = getSubStr(%message, %soundStart + 7, strLen(%message)); + $RPGDialogSoundHandle = alxPlay(%sound); + + return %soundStart; +} + +function SelectAnswer(%Number) +{ + if(strPos(RPGDialogAnswer.getText(),"")>=0) + RPGDialogAnswer.onURL("RPGDialog "@%Number); + else + OutOfRPGDialogFunction(%Number); +} \ No newline at end of file diff --git a/Templates/Modules/RPGDialog/Scripts/client/RPGDialogAudioProfiles.cs b/Templates/Modules/RPGDialog/Scripts/client/RPGDialogAudioProfiles.cs new file mode 100644 index 000000000..ddace2c60 --- /dev/null +++ b/Templates/Modules/RPGDialog/Scripts/client/RPGDialogAudioProfiles.cs @@ -0,0 +1,21 @@ +new SFXDescription(DialogSound) +{ + volume = 1.2; + isLooping= false; + is3D = false; + type = $MessageAudioType; +}; + +new SFXProfile(test) +{ + filename = "art/dialogs/sounds/test.wav"; + description = "DialogSound"; + preload = false; +}; + +new SFXProfile(test2) +{ + filename = "art/dialogs/sounds/test2.wav"; + description = "DialogSound"; + preload = false; +}; diff --git a/Templates/Modules/RPGDialog/Scripts/server/RPGDialog.cs b/Templates/Modules/RPGDialog/Scripts/server/RPGDialog.cs new file mode 100644 index 000000000..979a22d29 --- /dev/null +++ b/Templates/Modules/RPGDialog/Scripts/server/RPGDialog.cs @@ -0,0 +1,341 @@ +//----------------------------------------------------------------------------- +// RPGDialog - Presents the player with a question and several answers to select from +// Created by Nelson A. K. Gonsalves +//----------------------------------------------------------------------------- + +function getAction(%actionFile,%questionNumber) +{ + %file = new FileObject(); + if(isFile($Pref::Server::RPGDialog::ActionPath@%actionFile@".dla") && %file.openForRead($Pref::Server::RPGDialog::ActionPath@%actionFile@".dla")) + { + for(%i=1;%i<%questionNumber;%i++) + { + %file.readLine(); + if(%file.isEOF()) + return ""; + } + %action=%file.readLine(); + } + else if(isFile($RPGDialogEditorPref::ActionPath@%actionFile@".dla") && %file.openForRead($RPGDialogEditorPref::ActionPath@%actionFile@".dla")) + { + for(%i=1;%i<%questionNumber;%i++) + { + %file.readLine(); + if(%file.isEOF()) + return ""; + } + %action=%file.readLine(); + } + + %file.close(); + %file.delete(); + return %action; +} + +function RPGDialogMessageClient(%client,%sender,%npcFile,%questionNumber) +{ + %senderName=%sender.getshapename(); + %portrait=%sender.RPGDialogPortrait; + %playerName=%client.player.getshapename(); + + %sender.RPGDialogBusy=true; + %sender.RPGDialogTalkingTo=%client; + %sender.setAimObject(%client.player); + + commandToClient(%client,'RPGDialogMessage',%sender,%senderName,%portrait,%npcFile,%questionNumber,%playerName); + + CheckRPGDialogStatus(%client,%sender); +} + +function serverCmdRPGDialogAnswer(%client,%sender,%questionNumber,%answerNumber) +{ + if(%client==%sender.RPGDialogTalkingTo) + { + %npcFile=%sender.RPGDialogScript; + + %Actions=GetAction(%npcFile,%questionNumber); + + if(%Actions!$="") + { + %ActionHeaderSize=strlen("<"@%answerNumber@">"); + %ActionStart=strPos(%Actions,"<"@%answerNumber@">")+%ActionHeaderSize; + %Actions=getSubStr(%Actions,%ActionStart,strlen(%Actions)); + %ActionEnd=strPos(%Actions,""); + + if(%ActionEnd==-1) + return; + + %Actions=getSubStr(%Actions,0,%ActionEnd); + + while(%Actions!$="") + { + %ParamStart=strPos(%Actions,"(")+1; + %ParamEnd=strPos(%Actions,")")-%ParamStart; + %Param=getSubStr(%Actions,%ParamStart,%ParamEnd); + + %Action=getSubStr(%Actions,0,%ParamStart-1); + if(%Param!$="") + { + eval(%Action@"("@%Param@","@%client@","@%sender@",\""@%npcFile@"\");"); + } + else + { + eval(%Action@"("@%client@","@%sender@",\""@%npcFile@"\");"); + } + %Actions=getSubStr(%Actions,strlen(%Action)+%ParamEnd+2,strlen(%Actions)); + } + } + else + { + echo("ERROR::Invalid Question/Answer!!\nnpcFile = "@%npcFile@"\nquestionNumber = "@%questionNumber); + } + } +} + +function serverCmdRPGDialogRay(%client) +{ + %StartPos=%client.player.gettransform(); + %Eye = %client.player.getEyeVector(); + %EndPos = vectorScale(%Eye, -1); + %EndPos = vectorsub(%StartPos,%EndPos); + + InitContainerRadiusSearch(%EndPos, 2.5, $TypeMasks::PlayerObjectType); + + %rayCast=ContainerSearchNext(); + while(%rayCast != 0 ) + { + if(%rayCast.RPGDialogScript!$="") + { + if(!%rayCast.RPGDialogBusy) + { + RPGDialogMessageClient(%client, %rayCast, %rayCast.RPGDialogScript,%rayCast.RPGDialogStartQuestion); //start dialog. + return; + } + else + { + if(IsRPGDialogBusy(%rayCast)) + { + if(%client!=%raycast.RPGDialogTalkingTo) + { + messageClient(%client, '', %rayCast.RPGDialogBusyText, %raycast.RPGDialogTalkingTo.player.getShapeName()); + return; + } + else + return; + } + else + { + RPGDialogMessageClient(%client, %rayCast, %rayCast.RPGDialogScript,%rayCast.RPGDialogStartQuestion); //start dialog. + return; + } + } + } + %rayCast=ContainerSearchNext(); + } +} + +function IsRPGDialogBusy(%AiPlayerID) +{ + InitContainerRadiusSearch(%AiPlayerID.getTransform(), 5, $TypeMasks::PlayerObjectType); + %rayCastBusyCheck=ContainerSearchNext(); + while(%rayCastBusyCheck != 0 ) + { + if(%rayCastBusyCheck==(%AiPlayerID.RPGDialogTalkingTo).player) + { + return(true); + } + %rayCastBusyCheck=ContainerSearchNext(); + } + return(false); +} + +function CheckRPGDialogStatus(%Client,%Sender) //Checks if the player has moved since he started the dialog, moving too far from the sender will cancel the dialog +{ + InitContainerRadiusSearch(%Sender.getTransform(), 5, $TypeMasks::PlayerObjectType); + %rayCast=ContainerSearchNext(); + while(%rayCast != 0 ) + { + if(%rayCast==%Client.player) + { + schedule(1000,0,"CheckRPGDialogStatus",%Client,%Sender); + return; + } + %rayCast=ContainerSearchNext(); + } + CommandToClient(%client,'CloseRPGDialog'); + %Sender.RPGDialogBusy=false; + %Sender.RPGDialogTalkingTo=0; + %Sender.clearAim(); +} + +function SpawnTestNPC() +{ + %player = AIPlayer::spawn("a test NPC","359.973 304.759 217.766"); + %player.RPGDialogScript = "Test"; + %player.RPGDialogPortrait = "Test.png"; + %player.RPGDialogStartQuestion = 1; + %player.RPGDialogBusy = false; + %player.RPGDialogBusyText = 'Sorry but I\'m busy talking to %1 right now.'; + %player.RPGDialogTalkingTo = 0; + + return %player; +} + +function SpawnNPC(%Name,%Script,%Portrait,%startQuestion,%location) +{ + %player = AIPlayer::spawn(%Name,%location); + %player.RPGDialogScript = %Script; + %player.RPGDialogPortrait = %Portrait; + %player.RPGDialogStartQuestion = %startQuestion; + %player.RPGDialogBusy = false; + %player.RPGDialogBusyText = 'Sorry but I\'m busy talking to %1 right now.'; + %player.RPGDialogTalkingTo = 0; + + return %player; +} + +//------------------------------------------------------------------------------ +// RPGDialog Script Functions - functions bellow are made to be used by the +// dialog scripts. +// The commented out lines that start with are used when populating the action +// list on the RPGDialog Editor. +//------------------------------------------------------------------------------ + +//GotoQuestion(QuestionNumber) +function GotoQuestion(%questionNumber,%client,%sender,%npcFile) +{ + RPGDialogMessageClient(%client, %sender, %npcFile, %questionNumber); +} + +//CloseDialog() +function CloseDialog(%client,%sender,%npcFile) +{ + //sendind nothing to the client will close the dialog without anything else happening + %sender.RPGDialogBusy=false; + %sender.RPGDialogTalkingTo=0; +} + +//MoveTo(Position) +function MoveTo(%position,%client,%sender,%npcFile) +{ + %sender.setAimLocation(%position); + %sender.setMoveDestination(%position); + CloseDialog(%client,%sender,%npcFile); +} + +//KillPlayer() +function KillPlayer(%client,%sender,%npcFile) +{ + %client.player.kill("Sudden"); + CloseDialog(%client,%sender,%npcFile); +} + +//KillSender() +function KillSender(%client,%sender,%npcFile) +{ + %sender.kill("Sudden"); + CloseDialog(%client,%sender,%npcFile); +} + +//DamagePlayer(Amount) +function DamagePlayer(%DamageAmount,%client,%sender,%npcFile) +{ + %client.player.damage(0, %sender.getposition(), %damageAmount, "Sudden"); + CloseDialog(%client,%sender,%npcFile); +} + +//DamageSender(Amount) +function DamageSender(%DamageAmount,%client,%sender,%npcFile) +{ + %sender.damage(0, %sender.getposition(), %damageAmount, "Sudden"); + CloseDialog(%client,%sender,%npcFile); +} + +//TeleportPlayer(Position) +function TeleportPlayer(%Pos,%client,%sender,%npcFile) +{ + %client.player.setTransform(%Pos); + CloseDialog(%client,%sender,%npcFile); +} + +//TeleportSender(Position) +function TeleportSender(%Pos,%client,%sender,%npcFile) +{ + %sender.setTransform(%Pos); + CloseDialog(%client,%sender,%npcFile); +} + +//RenamePlayer(NewName) +function RenamePlayer(%NewName,%client,%sender,%npcFile) +{ + messageAllExcept(%client, -1, 'MsgPlayerRenamed', '\c1%1 is now known as %2.',%client.player.getshapeName(),%NewName); + messageClient(%client, 'MsgPlayerRenamed', '\c1You are now known as %1.',%NewName); + %client.player.setshapeName(%NewName); + CloseDialog(%client,%sender,%npcFile); +} + +//RenameSender(NewName) +function RenameSender(%NewName,%client,%sender,%npcFile) +{ + messageAll('MsgAIRenamed','\c1%1 is now known as %2.',%sender.getshapename(),%NewName); + %sender.setshapeName(%NewName); + CloseDialog(%client,%sender,%npcFile); +} + +//ChangeStartQuestion(QuestionNumber) +function ChangeStartQuestion(%NewQuestion,%client,%sender,%npcFile) +{ + %sender.RPGDialogStartQuestion=%NewQuestion; + CloseDialog(%client,%sender,%npcFile); +} + +//ChangeStartQuestionAndOpen(QuestionNumber) +function ChangeStartQuestionAndOpen(%NewQuestion,%client,%sender,%npcFile) +{ + %sender.RPGDialogStartQuestion=%NewQuestion; + RPGDialogMessageClient(%client, %sender, %sender.RPGDialogScript,%NewQuestion); +} + +//ChangeStartQuestionAndGoto(StartQuestion,GotoQuestion) +function ChangeStartQuestionAndGoto(%NewStartQuestion,%GoTo,%client,%sender,%npcFile) +{ + %sender.RPGDialogStartQuestion=%NewQuestion; + RPGDialogMessageClient(%client, %sender, %sender.RPGDialogScript,%GoTo); +} + +//ChangeScript(ScriptName,QuestionNumber) +function ChangeScript(%NewScript,%StartQuestion,%client,%sender,%npcFile) +{ + if(%NewScript!$="" && isFile($RPGDialogEditorPref::ActionPath@%NewScript@".dla")) + { + %sender.RPGDialogScript=%NewScript; + %sender.RPGDialogStartQuestion=%StartQuestion; + CloseDialog(%client,%sender,%npcFile); + } +} + +//ChangeScriptAndOpen(ScriptName,QuestionNumber) +function ChangeScriptAndOpen(%NewScript,%StartQuestion,%client,%sender,%npcFile) +{ + + if(%NewScript!$="" && isFile($RPGDialogEditorPref::ActionPath@%NewScript@".dla")) + { + %sender.RPGDialogScript=%NewScript; + %sender.RPGDialogStartQuestion=%StartQuestion; + RPGDialogMessageClient(%client, %sender, %NewScript,%StartQuestion); + } +} + +//ChangePortrait(NewPortrait) +function ChangePortrait(%NewPortrait,%client,%sender,%npcFile) +{ + %sender.RPGDialogPortrait=%NewPortrait; + CloseDialog(%client,%sender,%npcFile); +} + +//ChangePortraitAndGoto(NewPortrait,QuestionNumber) +function ChangePortraitAndGoto(%NewPortrait,%QuestionNumber,%client,%sender,%npcFile) +{ + %sender.RPGDialogPortrait=%NewPortrait; + RPGDialogMessageClient(%client, %sender, %sender.RPGDialogScript,%QuestionNumber); +} diff --git a/Templates/Modules/RPGDialog/gui/RPGDialog.gui b/Templates/Modules/RPGDialog/gui/RPGDialog.gui new file mode 100644 index 000000000..41ebf9258 --- /dev/null +++ b/Templates/Modules/RPGDialog/gui/RPGDialog.gui @@ -0,0 +1,156 @@ +new GuiControlProfile ("RPGDialogQuestionProfile") +{ + fontType = "Arial Bold"; + fontSize = 16; + fontColor = "44 172 181"; + fontColorLink = "255 96 96"; + fontColorLinkHL = "0 0 255"; + autoSizeWidth = true; + autoSizeHeight = true; +}; + +new GuiControlProfile ("RPGDialogAnswerProfile") +{ + fontType = "Arial Bold"; + fontSize = 16; + fontColor = "44 172 181"; + fontColorLink = "255 96 96"; + fontColorLinkHL = "0 0 255"; + autoSizeWidth = true; + autoSizeHeight = true; +}; + +new GuiControlProfile ("RPGDialogScrollProfile") +{ + opaque = false; + border = false; + borderColor = "0 255 0"; + bitmap = "./demoScroll"; + hasBitmapArray = true; +}; + +new GuiControlProfile ("RPGDialogBorderProfile") +{ + bitmap = "./chatHudBorderArray"; + hasBitmapArray = true; + opaque = false; +}; + +//--- OBJECT WRITE BEGIN --- +new GuiControl(RPGDialog) { + profile = "GuiModelessDialogProfile"; + horizSizing = "width"; + vertSizing = "height"; + position = "0 0"; + extent = "640 480"; + minExtent = "8 8"; + visible = "1"; + helpTag = "0"; + + new GuiControl() { + profile = "GuiDefaultProfile"; + horizSizing = "center"; + vertSizing = "relative"; + position = "120 260"; + extent = "400 220"; + minExtent = "8 8"; + visible = "1"; + helpTag = "0"; + + new GuiBitmapBorderCtrl(RPGDialogBorder) { + profile = "ChatHudBorderProfile"; + horizSizing = "width"; + vertSizing = "height"; + position = "0 0"; + extent = "400 220"; + minExtent = "8 8"; + visible = "1"; + helpTag = "0"; + useVariable = "0"; + tile = "0"; + + new GuiBitmapCtrl(RPGDialogBackground) { + profile = "GuiDefaultProfile"; + horizSizing = "width"; + vertSizing = "height"; + position = "8 8"; + extent = "384 212"; + minExtent = "8 8"; + visible = "1"; + helpTag = "0"; + bitmap = "./hudfill.png"; + wrap = "0"; + }; + new GuiScrollCtrl(RPGDialogScrollQuestion) { + profile = "RPGDialogScrollProfile"; + horizSizing = "width"; + vertSizing = "bottom"; + position = "89 8"; + extent = "303 94"; + minExtent = "8 8"; + visible = "1"; + helpTag = "0"; + willFirstRespond = "1"; + hScrollBar = "alwaysOff"; + vScrollBar = "dynamic"; + constantThumbHeight = "0"; + childMargin = "0 0"; + + new GuiMLTextCtrl(RPGDialogQuestion) { + profile = "RPGDialogQuestionProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "1 1"; + extent = "283 16"; + minExtent = "8 8"; + visible = "1"; + helpTag = "0"; + lineSpacing = "0"; + allowColorChars = "0"; + maxChars = "-1"; + }; + }; + new GuiScrollCtrl(RPGDialogScrollAnswer) { + profile = "RPGDialogScrollProfile"; + horizSizing = "width"; + vertSizing = "height"; + position = "8 100"; + extent = "384 110"; + minExtent = "8 8"; + visible = "1"; + helpTag = "0"; + willFirstRespond = "1"; + hScrollBar = "alwaysOff"; + vScrollBar = "dynamic"; + constantThumbHeight = "0"; + childMargin = "0 0"; + + new GuiMLTextCtrl(RPGDialogAnswer) { + profile = "RPGDialogAnswerProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "1 1"; + extent = "364 14"; + minExtent = "8 8"; + visible = "0"; + helpTag = "0"; + lineSpacing = "2"; + allowColorChars = "0"; + maxChars = "-1"; + }; + }; + new GuiBitmapCtrl(RPGDialogPortrait) { + profile = "GuiDefaultProfile"; + horizSizing = "right"; + vertSizing = "bottom"; + position = "8 8"; + extent = "80 94"; + minExtent = "8 2"; + visible = "1"; + helpTag = "0"; + wrap = "0"; + }; + }; + }; +}; +//--- OBJECT WRITE END --- diff --git a/Templates/Modules/RPGDialog/gui/dla/test.dla b/Templates/Modules/RPGDialog/gui/dla/test.dla new file mode 100644 index 000000000..749cb5ca6 --- /dev/null +++ b/Templates/Modules/RPGDialog/gui/dla/test.dla @@ -0,0 +1,3 @@ +GotoQuestion(2)<1>KillPlayer()<2>MoveTo("0 0 0")<3>TeleportPlayer("0 0 500")<4>TeleportPlayer("0 0 500")TeleportSender("0 0 600")<5>DamagePlayer(20)<6>GotoQuestion(3)<7>CloseDialog() +<1>RenameSender("Something Else")<2>GotoQuestion(1)<3>RenamePlayer("Something Else") +<1>ChangeStartQuestion(3)<2>ChangePortrait("unknown.png")<3>ChangePortraitAndGoto("unknown.png",3)<4>ChangeScript("test2",1)<5>ChangeScriptAndOpen("test2",1)<6>GotoQuestion(1)<7>ChangeStartQuestionAndOpen(1) diff --git a/Templates/Modules/RPGDialog/gui/dla/test2.dla b/Templates/Modules/RPGDialog/gui/dla/test2.dla new file mode 100644 index 000000000..a1947ca0d --- /dev/null +++ b/Templates/Modules/RPGDialog/gui/dla/test2.dla @@ -0,0 +1 @@ +<1>ChangeScript("test",1)<2>ChangeScriptAndOpen("test",3)<3>CloseDialog() diff --git a/Templates/Modules/RPGDialog/gui/dlq/test.dlq b/Templates/Modules/RPGDialog/gui/dlq/test.dlq new file mode 100644 index 000000000..d187d9e74 --- /dev/null +++ b/Templates/Modules/RPGDialog/gui/dlq/test.dlq @@ -0,0 +1,3 @@ +Hello <>, I'm <>, What do you want me to do? ~Sound:testKill me, please.
Run to the center of the world!
Teleport me!
Teleport us!
Damage me!
Something Else...
Nothing, see ya!
+Yes, I'm <>, do you want me to change my name to something else?Yes, please.
Nope...
Change my name instead!
+...~Sound:test2Change your start question to this question.
Change your portrait!
Change your portrait and come back to this question!
Change your script...
Change your script and open it
Go back to the first question.
Go back to the first question and set it as default.
diff --git a/Templates/Modules/RPGDialog/gui/dlq/test2.dlq b/Templates/Modules/RPGDialog/gui/dlq/test2.dlq new file mode 100644 index 000000000..9038037a1 --- /dev/null +++ b/Templates/Modules/RPGDialog/gui/dlq/test2.dlq @@ -0,0 +1 @@ +Hello <>, I'm <>, and this is the test2 script. What do you want to do?
Go back to the other script, please.
Change your script and open it on the 3rd question.
Nothing, see you later.
diff --git a/Templates/Modules/RPGDialog/gui/portraits/test.png b/Templates/Modules/RPGDialog/gui/portraits/test.png new file mode 100644 index 0000000000000000000000000000000000000000..763f933a89726a8d70cb44faa6a2f4ccbb22d68a GIT binary patch literal 2400 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 N^7je$u2?7d`9CpK?|T3M literal 0 HcmV?d00001 diff --git a/Templates/Modules/RPGDialog/sounds/test.wav b/Templates/Modules/RPGDialog/sounds/test.wav new file mode 100644 index 0000000000000000000000000000000000000000..fe0ee4b65c1bc307224c5383f3145c7d1ce041fa GIT binary patch literal 25818 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 U?q8WbmjC?Szw+oTrdMA1U!$UJCjbBd literal 0 HcmV?d00001 diff --git a/Templates/Modules/RealisticVFX/Datablocks/LifelikeEffectsPackExec.cs b/Templates/Modules/RealisticVFX/Datablocks/LifelikeEffectsPackExec.cs new file mode 100644 index 000000000..dd55efecd --- /dev/null +++ b/Templates/Modules/RealisticVFX/Datablocks/LifelikeEffectsPackExec.cs @@ -0,0 +1,21 @@ +//----------------------------------------------------------------------------- +// Lifelike Effects Pack Exec File +// +// This file executes all the scripts associated with the pack. +// Thanks for your support! +// +// Copyright Adam deGrandis 2012 +//----------------------------------------------------------------------------- + +exec ("./LifelikeEmitters.cs"); +exec ("./LifelikeExp_ComplexLarge.cs"); +exec ("./LifelikeExp_ComplexSmall.cs"); +exec ("./LifelikeExp_SimpleLarge.cs"); +exec ("./LifelikeExp_SimpleSmall.cs"); +exec ("./LifelikeExp_GroundHitLarge.cs"); +exec ("./LifelikeExp_GroundHitSmall.cs"); +exec ("./LifelikeExp_FirebombLarge.cs"); +exec ("./LifelikeExp_FirebombSmall.cs"); +exec ("./LifelikeExp_Flak.cs"); +exec ("./LifelikeExp_Flashbang.cs"); + diff --git a/Templates/Modules/RealisticVFX/Datablocks/LifelikeEmitters.cs b/Templates/Modules/RealisticVFX/Datablocks/LifelikeEmitters.cs new file mode 100644 index 000000000..58f37d58f --- /dev/null +++ b/Templates/Modules/RealisticVFX/Datablocks/LifelikeEmitters.cs @@ -0,0 +1,410 @@ +//----------------------------------------------------------------------------- +// Lifelike Effects Pack - Ambient Particle Emitters +// Copyright Adam deGrandis 2012 +// +// This file houses all the ambient emitters in the Lifelike Effects Pack. +// Thanks for your support! +// +//----------------------------------------------------------------------------- +//exec ("art/datablocks/LifelikeEffectsPack/LifelikeEmitters.cs"); + +//----------------------------------------------------------------------------- +// Smoke +//----------------------------------------------------------------------------- + +datablock ParticleData(LifelikeSmokeLargeBlackParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/smoke1"; + + gravityCoefficient = -0.2; + inheritedVelFactor = 0.00; + lifetimeMS = 4000; + lifetimeVarianceMS = 250; + spinRandomMin = -30; + spinRandomMax = 30; + + sizes[0] = 2; + sizes[1] = 4; + sizes[2] = 12; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; + + colors[0] = "0.1 0.1 0 0.1"; + colors[1] = "0.7 0.7 0.6 1"; + colors[2] = "1 0.9 0.8 0.0"; + + windCoefficient = 1; + +}; + +datablock ParticleEmitterData(LifelikeSmokeLargeBlackEmitter) +{ + ejectionPeriodMS = 130; + periodVarianceMS = 50; + ejectionVelocity = 1.0; + velocityVariance = 0.0; + thetaMin = 0.0; + thetaMax = 90.0; + phiReferenceVel = 0; + phiVariance = 360; + particles = LifelikeSmokeLargeBlackParticle; + blendStyle = "NORMAL"; + ejectionOffset = 0.5; +}; + + +datablock ParticleData(LifelikeSmokeSmallBlackParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/smoke1"; + + gravityCoefficient = -0.1; + lifetimeMS = 2000; + lifetimeVarianceMS = 500; + spinRandomMin = -30; + spinRandomMax = 30; + + sizes[0] = 1; + sizes[1] = 2; + sizes[2] = 3; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; + + colors[0] = "0.1 0.1 0 0.1"; + colors[1] = "0.7 0.7 0.6 0.5"; + colors[2] = "1 0.9 0.8 0.0"; + + windCoefficient = 1; + +}; + +datablock ParticleEmitterData(LifelikeSmokeSmallBlackEmitter) +{ + ejectionPeriodMS = 150; + periodVarianceMS = 50; + ejectionVelocity = 1.0; + velocityVariance = 0.0; + thetaMin = 0.0; + thetaMax = 50.0; + phiReferenceVel = 0; + phiVariance = 360; + particles = LifelikeSmokeSmallBlackParticle; + blendStyle = "NORMAL"; + ejectionOffset = 0.1; +}; + + + + +datablock ParticleData(LifelikeSmokeLargeWhiteParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/smoke2"; + + gravityCoefficient = -0.2; + inheritedVelFactor = 0.00; + lifetimeMS = 4000; + lifetimeVarianceMS = 250; + spinRandomMin = -30; + spinRandomMax = 30; + + sizes[0] = 2; + sizes[1] = 4; + sizes[2] = 12; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; + + colors[0] = "0.1 0.1 0 0.1"; + colors[1] = "0.7 0.7 0.6 1"; + colors[2] = "1 0.9 0.8 0.0"; + + windCoefficient = 1; + +}; + +datablock ParticleEmitterData(LifelikeSmokeLargeWhiteEmitter) +{ + ejectionPeriodMS = 130; + periodVarianceMS = 50; + ejectionVelocity = 1.0; + velocityVariance = 0.0; + thetaMin = 0.0; + thetaMax = 90.0; + phiReferenceVel = 0; + phiVariance = 360; + particles = LifelikeSmokeLargeWhiteParticle; + blendStyle = "NORMAL"; + ejectionOffset = 0.5; +}; + + +datablock ParticleData(LifelikeSmokeSmallWhiteParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/smoke2"; + + gravityCoefficient = -0.1; + lifetimeMS = 2000; + lifetimeVarianceMS = 500; + spinRandomMin = -30; + spinRandomMax = 30; + + sizes[0] = 1; + sizes[1] = 2; + sizes[2] = 3; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; + + colors[0] = "0.1 0.1 0 0.1"; + colors[1] = "0.7 0.7 0.6 0.5"; + colors[2] = "1 0.9 0.8 0.0"; + + windCoefficient = 1; + +}; + +datablock ParticleEmitterData(LifelikeSmokeSmallWhiteEmitter) +{ + ejectionPeriodMS = 150; + periodVarianceMS = 50; + ejectionVelocity = 1.0; + velocityVariance = 0.0; + thetaMin = 0.0; + thetaMax = 70.0; + phiReferenceVel = 0; + phiVariance = 360; + particles = LifelikeSmokeSmallWhiteParticle; + blendStyle = "NORMAL"; + ejectionOffset = 0.1; +}; + + + +//----------------------------------------------------------------------------- +// Fire +//----------------------------------------------------------------------------- + + +datablock ParticleData(LifelikeFireSmallParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/flame1"; + gravityCoefficient = "-0.2"; + lifetimeMS = 1000; + lifetimeVarianceMS = 200; + useInvAlpha = true; + spinRandomMin = -140.0; + spinRandomMax = 140.0; + + sizes[0] = "0.5"; + sizes[1] = "1"; + sizes[2] = "0.7"; + + colors[0] = "0.8 0.6 1 0.5"; + colors[1] = "0.8 0.4 0 1"; + colors[2] = "0.8 0.4 0 0"; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; +}; + + +datablock ParticleEmitterData(LifelikeFireSmallEmitter) +{ + ejectionPeriodMS = 70; + periodVarianceMS = 30; + + ejectionVelocity = 0.3; + velocityVariance = 0.2; + + thetaMin = 0.0; + thetaMax = 70.0; + + ejectionOffset = 0.15; + + particles = "LifelikeFireSmallParticle"; + blendStyle = "ADDITIVE"; +}; + + + +datablock ParticleData(LifelikeFireBigParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/flame1"; + gravityCoefficient = "-0.2"; + lifetimeMS = 1400; + lifetimeVarianceMS = 500; + useInvAlpha = true; + spinRandomMin = -140.0; + spinRandomMax = 140.0; + + sizes[0] = "1"; + sizes[1] = "2"; + sizes[2] = "1.5"; + + colors[0] = "0.8 0.6 1 0.5"; + colors[1] = "0.8 0.4 0 0.9"; + colors[2] = "0.8 0.4 0 0"; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFireBigEmitter) +{ + ejectionPeriodMS = 70; + periodVarianceMS = 30; + + ejectionVelocity = 0.5; + velocityVariance = 0.0; + + thetaMin = 0.0; + thetaMax = 70.0; + + ejectionOffset = 0.5; + + particles = LifelikeFireBigParticle; + blendStyle = "ADDITIVE"; +}; + + + +//----------------------------------------------------------------------------- +// Embers +//----------------------------------------------------------------------------- + + +datablock ParticleData(LifelikeEmbersSmallParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/ember1"; + gravityCoefficient = "-0.2"; + lifetimeMS = 1500; + lifetimeVarianceMS = 200; + useInvAlpha = true; + spinRandomMin = -140.0; + spinRandomMax = 140.0; + + sizes[0] = "0.5"; + sizes[1] = "1"; + sizes[2] = "0.7"; + + colors[0] = "1 0.9 0.8 0.5"; + colors[1] = "1 0.9 0.8 1"; + colors[2] = "0.8 0.4 0 0"; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeEmbersSmallEmitter) +{ + ejectionPeriodMS = 70; + periodVarianceMS = 30; + + ejectionVelocity = 0.3; + velocityVariance = 0.2; + + thetaMin = 0.0; + thetaMax = 70.0; + + ejectionOffset = 0.15; + + particles = LifelikeEmbersSmallParticle; + blendStyle = "ADDITIVE"; +}; + + +datablock ParticleData(LifelikeEmbersBigParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/ember1"; + gravityCoefficient = "-0.2"; + lifetimeMS = 2000; + lifetimeVarianceMS = 500; + useInvAlpha = true; + spinRandomMin = -140.0; + spinRandomMax = 140.0; + + sizes[0] = "1"; + sizes[1] = "2"; + sizes[2] = "1.5"; + + colors[0] = "1 0.9 0.8 0.5"; + colors[1] = "1 0.9 0.8 1"; + colors[2] = "0.8 0.4 0 0"; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeEmbersBigEmitter) +{ + ejectionPeriodMS = 70; + periodVarianceMS = 30; + + ejectionVelocity = 0.5; + velocityVariance = 0.0; + + thetaMin = 0.0; + thetaMax = 70.0; + + ejectionOffset = 0.5; + + particles = LifelikeEmbersBigParticle; + blendStyle = "ADDITIVE"; +}; + + + +//----------------------------------------------------------------------------- +// Special +//----------------------------------------------------------------------------- + +datablock ParticleData(LifelikeFlareSmokeParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/smoke2"; + + gravityCoefficient = -0.2; + inheritedVelFactor = 0.00; + lifetimeMS = 4000; + lifetimeVarianceMS = 250; + spinRandomMin = -30; + spinRandomMax = 30; + + sizes[0] = 2; + sizes[1] = 4; + sizes[2] = 12; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; + + colors[0] = "1 0.1 0.1 0.1"; + colors[1] = "1 0.3 0.3 1"; + colors[2] = "1 0.6 0.6 0.0"; + + windCoefficient = 1; + +}; + +datablock ParticleEmitterData(LifelikeFlareSmokeEmitter) +{ + ejectionPeriodMS = 130; + periodVarianceMS = 50; + ejectionVelocity = 1.0; + velocityVariance = 0.0; + thetaMin = 0.0; + thetaMax = 90.0; + phiReferenceVel = 0; + phiVariance = 360; + particles = LifelikeFlareSmokeParticle; + blendStyle = "NORMAL"; + ejectionOffset = 0.5; +}; \ No newline at end of file diff --git a/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_ComplexLarge.cs b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_ComplexLarge.cs new file mode 100644 index 000000000..0940da9df --- /dev/null +++ b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_ComplexLarge.cs @@ -0,0 +1,238 @@ +//----------------------------------------------------------------------------- +// Lifelike Effects Pack - Large Complex Explosion +// Copyright Adam deGrandis 2012 +// +// Thanks for your support! +// +//----------------------------------------------------------------------------- +//exec ("art/datablocks/LifelikeEffectsPack/LifelikeExp_ComplexLarge.cs"); + + +//----------------------------------------------------------------------------- +// Emitters +//----------------------------------------------------------------------------- + +datablock ParticleData(LifelikeComplexLargeSmokeParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/smoke1"; + gravityCoefficient = -0.05; + lifetimeMS = 3300; + lifetimeVarianceMS = 200; + spinRandomMin = -50.0; + spinRandomMax = 50.0; + + colors[0] = "0.1 0.1 0 1"; + colors[1] = "0.7 0.7 0.6 1"; + colors[2] = "1 0.9 0.8 0.0"; + + sizes[0] = 4; + sizes[1] = 8; + sizes[2] = 12; + + times[0] = 0.0; + times[1] = 0.1; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeComplexLargeSmokeEmitter) +{ + ejectionPeriodMS = 10; + periodVarianceMS = 5; + ejectionVelocity = 2; + velocityVariance = 0; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 2; + particles = "LifelikeComplexLargeSmokeParticle"; + blendStyle = "NORMAL"; +}; + + +datablock ParticleData(LifelikeComplexLargeFireballParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/fireball"; + gravityCoefficient = -0.3; + lifetimeMS = 700; + lifetimeVarianceMS = 100; + spinRandomMin = -100.0; + spinRandomMax = 100.0; + + colors[0] = "1 0.9 0.8 1"; + colors[1] = "0.8 0.4 0.0 1"; + colors[2] = "0.8 0.4 0.0 0"; + + sizes[0] = 1; + sizes[1] = 7; + sizes[2] = 4; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeComplexLargeFireballEmitter) +{ + ejectionPeriodMS = 5; + periodVarianceMS = 3; + ejectionVelocity = 3; + velocityVariance = 2; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 3; + + particles = "LifelikeComplexLargeFireballParticle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(LifelikeComplexLargeGlowParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/flame1"; + gravityCoefficient = -0.3; + lifetimeMS = 400; + lifetimeVarianceMS = 100; + spinRandomMin = -200.0; + spinRandomMax = 200.0; + + colors[0] = "0.9 0.8 1 0.4"; + colors[1] = "0.8 0.4 0.0 0.1"; + colors[2] = "0.8 0.4 0.0 0"; + + sizes[0] = 7; + sizes[1] = 11; + sizes[2] = 5; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeComplexLargeGlowEmitter) +{ + ejectionPeriodMS = 20; + periodVarianceMS = 5; + ejectionVelocity = 3; + velocityVariance = 2; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + particles = "LifelikeComplexLargeGlowParticle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(LifelikeComplexLargeSparks2Particle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/spark2"; + dragCoefficient = 4; + gravityCoefficient = 1; + lifetimeMS = 1500; + lifetimeVarianceMS = 500; + spinRandomMin = -0.0; + spinRandomMax = 0.0; + + colors[0] = "1 1 1 0.0"; + colors[1] = "1.0 0.9 0.8 1"; + colors[2] = "0.9 0.8 0.7 0"; + + sizes[0] = 4.0; + sizes[1] = 3.0; + sizes[2] = 1.0; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeComplexLargeSparks2Emitter) +{ + ejectionPeriodMS = 2; + periodVarianceMS = 1; + ejectionVelocity = 70.0; + velocityVariance = 10.0; + ejectionOffset = 0; + thetaMin = 0; + thetaMax = 70; + phiReferenceVel = 0; + phiVariance = 360; + particles = "LifelikeComplexLargeSparks2Particle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(LifelikeComplexLargeSparks1Particle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/spark3"; + lifetimeMS = 350; + lifetimeVarianceMS = 20; + useInvAlpha = false; + + colors[0] = "1.0 0.9 0.8 1"; + colors[1] = "1.0 0.9 0.8 1"; + colors[2] = "0.8 0.4 0 0.0"; + + sizes[0] = 2; + sizes[1] = 7; + sizes[2] = 12; + + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeComplexLargeSparks1Emitter) +{ + ejectionPeriodMS = 20; + periodVarianceMS = 5; + ejectionVelocity = 35; + velocityVariance = 10; + thetaMin = 0; + thetaMax = 70; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0; + orientOnVelocity = true; + orientParticles = true; + particles = "LifelikeComplexLargeSparks1Particle"; + blendStyle = "ADDITIVE"; +}; + + + +//----------------------------------------------------------------------------- +// Explosions +//----------------------------------------------------------------------------- + + +datablock ExplosionData(LifelikeComplexLargeExplosion) +{ + //soundProfile = YourSoundDatablock; + lifeTimeMS = 200; + + // Volume + particleEmitter = LifelikeComplexLargeGlowEmitter; + particleDensity = 40; + particleRadius = 2; + + // Point emission + emitter[0] = LifelikeComplexLargeSmokeEmitter; + emitter[1] = LifelikeComplexLargeFireballEmitter; + emitter[2] = LifelikeComplexLargeSparks1Emitter; + emitter[3] = LifelikeComplexLargeSparks2Emitter; + + 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 = "1 0.9 0.8"; + lightEndColor = "0.8 0.4 0.0"; + lightStartBrightness = 2.0; + lightEndBrightness = 0.0; + +}; \ No newline at end of file diff --git a/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_ComplexSmall.cs b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_ComplexSmall.cs new file mode 100644 index 000000000..693090c14 --- /dev/null +++ b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_ComplexSmall.cs @@ -0,0 +1,238 @@ +//----------------------------------------------------------------------------- +// Lifelike Effects Pack - Small Complex Explosion +// Copyright Adam deGrandis 2012 +// +// Thanks for your support! +// +//----------------------------------------------------------------------------- +//exec ("art/datablocks/LifelikeEffectsPack/LifelikeExp_ComplexSmall.cs"); + + +//----------------------------------------------------------------------------- +// Emitters +//----------------------------------------------------------------------------- + +datablock ParticleData(LifelikeComplexSmallSmokeParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/smoke1"; + gravityCoefficient = -0.02; + lifetimeMS = 2000; + lifetimeVarianceMS = 200; + spinRandomMin = -50.0; + spinRandomMax = 50.0; + + colors[0] = "0.1 0.1 0 1"; + colors[1] = "0.7 0.7 0.6 1"; + colors[2] = "1 0.9 0.8 0.0"; + + sizes[0] = 2; + sizes[1] = 4; + sizes[2] = 6; + + times[0] = 0.0; + times[1] = 0.1; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeComplexSmallSmokeEmitter) +{ + ejectionPeriodMS = 15; + periodVarianceMS = 5; + ejectionVelocity = 1; + velocityVariance = 0; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0.7; + particles = "LifelikeComplexSmallSmokeParticle"; + blendStyle = "NORMAL"; +}; + + +datablock ParticleData(LifelikeComplexSmallFireballParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/fireball"; + gravityCoefficient = -0.3; + lifetimeMS = 500; + lifetimeVarianceMS = 100; + spinRandomMin = -100.0; + spinRandomMax = 100.0; + + colors[0] = "1 0.9 0.8 1"; + colors[1] = "0.8 0.4 0.0 1"; + colors[2] = "0.8 0.4 0.0 0"; + + sizes[0] = 1; + sizes[1] = 4; + sizes[2] = 2; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeComplexSmallFireballEmitter) +{ + ejectionPeriodMS = 10; + periodVarianceMS = 3; + ejectionVelocity = 2; + velocityVariance = 1; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 1.3; + + particles = "LifelikeComplexSmallFireballParticle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(LifelikeComplexSmallGlowParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/flame1"; + gravityCoefficient = -0.3; + lifetimeMS = 400; + lifetimeVarianceMS = 100; + spinRandomMin = -200.0; + spinRandomMax = 200.0; + + colors[0] = "0.9 0.8 1 0.4"; + colors[1] = "0.8 0.4 0.0 0.1"; + colors[2] = "0.8 0.4 0.0 0"; + + sizes[0] = 3; + sizes[1] = 6; + sizes[2] = 2; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeComplexSmallGlowEmitter) +{ + ejectionPeriodMS = 20; + periodVarianceMS = 5; + ejectionVelocity = 3; + velocityVariance = 2; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + particles = "LifelikeComplexSmallGlowParticle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(LifelikeComplexSmallSparks2Particle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/spark2"; + dragCoefficient = 4; + gravityCoefficient = 1; + lifetimeMS = 1000; + lifetimeVarianceMS = 200; + spinRandomMin = -0.0; + spinRandomMax = 0.0; + + colors[0] = "1 1 1 0.5"; + colors[1] = "1.0 0.9 0.8 1"; + colors[2] = "0.9 0.8 0.7 0"; + + sizes[0] = 2.0; + sizes[1] = 1.5; + sizes[2] = 0.5; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeComplexSmallSparks2Emitter) +{ + ejectionPeriodMS = 10; + periodVarianceMS = 1; + ejectionVelocity = 40.0; + velocityVariance = 10.0; + ejectionOffset = 0; + thetaMin = 0; + thetaMax = 70; + phiReferenceVel = 0; + phiVariance = 360; + particles = "LifelikeComplexSmallSparks2Particle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(LifelikeComplexSmallSparks1Particle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/spark3"; + lifetimeMS = 300; + lifetimeVarianceMS = 20; + useInvAlpha = false; + + colors[0] = "1.0 0.9 0.8 1"; + colors[1] = "1.0 0.9 0.8 1"; + colors[2] = "0.8 0.4 0 0.0"; + + sizes[0] = 1; + sizes[1] = 3.5; + sizes[2] = 6; + + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeComplexSmallSparks1Emitter) +{ + ejectionPeriodMS = 20; + periodVarianceMS = 5; + ejectionVelocity = 17; + velocityVariance = 5; + thetaMin = 0; + thetaMax = 70; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0; + orientOnVelocity = true; + orientParticles = true; + particles = "LifelikeComplexSmallSparks1Particle"; + blendStyle = "ADDITIVE"; +}; + + + +//----------------------------------------------------------------------------- +// Explosions +//----------------------------------------------------------------------------- + + +datablock ExplosionData(LifelikeComplexSmallExplosion) +{ + //soundProfile = YourSoundDatablock; + lifeTimeMS = 130; + + // Volume + particleEmitter = LifelikeComplexSmallGlowEmitter; + particleDensity = 20; + particleRadius = 1.2; + + // Point emission + emitter[0] = LifelikeComplexSmallSmokeEmitter; + emitter[1] = LifelikeComplexSmallFireballEmitter; + emitter[2] = LifelikeComplexSmallSparks1Emitter; + emitter[3] = LifelikeComplexSmallSparks2Emitter; + + shakeCamera = true; + camShakeFreq = "10.0 11.0 9.0"; + camShakeAmp = "20.0 20.0 20.0"; + camShakeDuration = 1.5; + camShakeRadius = 5.0; + + lightStartRadius = 10.0; + lightEndRadius = 0.0; + lightStartColor = "1 0.9 0.8"; + lightEndColor = "0.8 0.4 0.0"; + lightStartBrightness = 2.0; + lightEndBrightness = 0.0; + +}; \ No newline at end of file diff --git a/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_FirebombLarge.cs b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_FirebombLarge.cs new file mode 100644 index 000000000..3304d5bed --- /dev/null +++ b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_FirebombLarge.cs @@ -0,0 +1,319 @@ +//----------------------------------------------------------------------------- +// Lifelike Effects Pack - Large Firebomb Explosion +// Copyright Adam deGrandis 2012 +// +// Thanks for your support! +// +//----------------------------------------------------------------------------- +//exec ("art/datablocks/LifelikeEffectsPack/LifelikeExp_FirebombLarge.cs"); + + +//----------------------------------------------------------------------------- +// Emitters +//----------------------------------------------------------------------------- + + +datablock ParticleData(LifelikeFirebombLargeSmokeParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/smoke2"; + gravityCoefficient = -0.1; + lifetimeMS = 1500; + lifetimeVarianceMS = 500; + spinRandomMin = -50.0; + spinRandomMax = 50.0; + + colors[0] = "0.1 0.1 0.1 1"; + colors[1] = "0.8 0.7 0.6 1"; + colors[2] = "1 0.9 0.8 0"; + + sizes[0] = 4; + sizes[1] = 9; + sizes[2] = 12; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFirebombLargeSmokeEmitter) +{ + ejectionPeriodMS = 25; + periodVarianceMS = 5; + ejectionVelocity = 2; + velocityVariance = 1; + thetaMin = 0; + thetaMax = 90; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 2; + particles = "LifelikeFirebombLargeSmokeParticle"; + blendStyle = "NORMAL"; +}; + +datablock ParticleData(LifelikeFirebombLargeFireBlastParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/fireblast"; + lifetimeMS = 250; + lifetimeVarianceMS = 50; + + colors[0] = "1 0.9 0.8 0"; + colors[1] = "0.8 0.4 0 1"; + colors[2] = "0.8 0.4 0 0"; + + sizes[0] = 2; + sizes[1] = 15; + sizes[2] = 2; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFirebombLargeFireBlastEmitter) +{ + ejectionPeriodMS = 10; + periodVarianceMS = 2; + ejectionVelocity = 50; + velocityVariance = 10; + thetaMin = 0; + thetaMax = 70; + phiReferenceVel = 0; + phiVariance = 360; + orientOnVelocity = true; + orientParticles = true; + particles = "LifelikeFirebombLargeFireBlastParticle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(LifelikeFirebombLargeSparks1Particle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/spark1"; + lifetimeMS = 300; + lifetimeVarianceMS = 20; + gravityCoefficient = 0; + + colors[0] = "1.0 0.9 0.8 0.4"; + colors[1] = "1.0 0.9 0.8 1"; + colors[2] = "0.8 0.4 0 0.0"; + + sizes[0] = 6; + sizes[1] = 4; + sizes[2] = 1; + + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFirebombLargeSparks1Emitter) +{ + ejectionPeriodMS = 7; + periodVarianceMS = 2; + ejectionVelocity = 40; + velocityVariance = 30; + thetaMin = 0; + thetaMax = 90; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0; + orientOnVelocity = true; + orientParticles = true; + particles = "LifelikeFirebombLargeSparks1Particle"; + blendStyle = "ADDITIVE"; +}; + + +datablock ParticleData(LifelikeFirebombLargeGlowParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/flame1"; + gravityCoefficient = -0.3; + lifetimeMS = 400; + lifetimeVarianceMS = 100; + spinRandomMin = -200.0; + spinRandomMax = 200.0; + + colors[0] = "0.9 0.8 1 0.4"; + colors[1] = "0.8 0.4 0.0 0.1"; + colors[2] = "0.8 0.4 0.0 0"; + + sizes[0] = 7; + sizes[1] = 11; + sizes[2] = 5; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFirebombLargeGlowEmitter) +{ + ejectionPeriodMS = 20; + periodVarianceMS = 5; + ejectionVelocity = 3; + velocityVariance = 2; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + + particles = "LifelikeFirebombLargeGlowParticle"; + blendStyle = "ADDITIVE"; +}; + + +datablock ParticleData(LifelikeFirebombLargeFireballParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/flame1"; + gravityCoefficient = -0.3; + lifetimeMS = 700; + lifetimeVarianceMS = 100; + spinRandomMin = -100.0; + spinRandomMax = 100.0; + + colors[0] = "1 0.9 0.8 1"; + colors[1] = "0.8 0.4 0.0 1"; + colors[2] = "0.8 0.4 0.0 0"; + + sizes[0] = 1; + sizes[1] = 7; + sizes[2] = 4; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFirebombLargeFireballEmitter) +{ + ejectionPeriodMS = 7; + periodVarianceMS = 3; + ejectionVelocity = 3; + velocityVariance = 2; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 3; + + particles = "LifelikeFirebombLargeFireballParticle"; + blendStyle = "ADDITIVE"; +}; + + + +//----------------------------------------------------------------------------- +// Debris +//----------------------------------------------------------------------------- + +datablock ParticleData(LifelikeFirebombLargeDebrisTrailParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/flame1"; + + gravityCoefficient = -0.2; + lifetimeMS = 500; + lifetimeVarianceMS = 300; + spinRandomMin = -300; + spinRandomMax = 300; + + sizes[0] = 1; + sizes[1] = 3; + sizes[2] = 1; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; + + colors[0] = "1 0.9 0.8 1"; + colors[1] = "0.8 0.4 0 0.5"; + colors[2] = "0.8 0.4 0 0"; + +}; + +datablock ParticleEmitterData(LifelikeFirebombLargeDebrisTrailEmitter) +{ + ejectionPeriodMS = 20; + periodVarianceMS = 10; + ejectionVelocity = 5; + velocityVariance = 2; + thetaMin = 0; + thetaMax = 10; + phiReferenceVel = 0; + phiVariance = 360; + + particles = "LifelikeFirebombLargeDebrisTrailParticle"; + blendStyle = "ADDITIVE"; + ejectionOffset = "2"; +}; + +datablock DebrisData(LifelikeFirebombLargeDebris) +{ + shapeFile = "art/shapes/particles/LifelikeEffectsPack/invisibledebris.dts"; + emitters[0] = LifelikeFirebombLargeDebrisTrailEmitter; + elasticity = 0.4; + friction = 0.25; + numBounces = 1; + bounceVariance = 0; + explodeOnMaxBounce = false; + staticOnMaxBounce = false; + snapOnMaxBounce = false; + minSpinSpeed = 100; + maxSpinSpeed = 200; + render2D = false; + lifetime = 2; + lifetimeVariance = 1; + velocity = 30; + velocityVariance = 10; + fade = false; + useRadiusMass = false; + baseRadius = 0.3; + gravModifier = 3.0; + terminalVelocity = 50; + ignoreWater = false; +}; + + +//----------------------------------------------------------------------------- +// Explosions +//----------------------------------------------------------------------------- + + + +datablock ExplosionData(LifelikeFirebombLargeExplosion) +{ + //soundProfile = YourSoundDatablock; + lifeTimeMS = 150; + + // Volume + particleEmitter = LifelikeFirebombLargeGlowEmitter; + particleDensity = 5; + particleRadius = 3; + + // Point emission + emitter[0] = LifelikeFirebombLargeSmokeEmitter; + emitter[1] = LifelikeFirebombLargeFireballEmitter; + emitter[2] = LifelikeFirebombLargeFireBlastEmitter; + emitter[3] = LifelikeFirebombLargeSparks1Emitter; + + // Debris + debris = LifelikeFirebombLargeDebris; + debrisThetaMin = 10; + debrisThetaMax = 60; + debrisNum = 4; + debrisNumVariance = 2; + debrisVelocity = 25; + debrisVelocityVariance = 5; + + 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 = "1 0.9 0.8"; + lightEndColor = "0.8 0.4 0.0"; + lightStartBrightness = 2.0; + lightEndBrightness = 0.0; + +}; \ No newline at end of file diff --git a/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_FirebombSmall.cs b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_FirebombSmall.cs new file mode 100644 index 000000000..88493fdc0 --- /dev/null +++ b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_FirebombSmall.cs @@ -0,0 +1,319 @@ +//----------------------------------------------------------------------------- +// Lifelike Effects Pack - Small Firebomb Explosion +// Copyright Adam deGrandis 2012 +// +// Thanks for your support! +// +//----------------------------------------------------------------------------- +//exec ("art/datablocks/LifelikeEffectsPack/LifelikeExp_FirebombSmall.cs"); + + +//----------------------------------------------------------------------------- +// Emitters +//----------------------------------------------------------------------------- + + +datablock ParticleData(LifelikeFirebombSmallSmokeParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/smoke2"; + gravityCoefficient = -0.05; + lifetimeMS = 1500; + lifetimeVarianceMS = 500; + spinRandomMin = -50.0; + spinRandomMax = 50.0; + + colors[0] = "0.1 0.1 0.1 1"; + colors[1] = "0.8 0.7 0.6 1"; + colors[2] = "1 0.9 0.8 0"; + + sizes[0] = 2; + sizes[1] = 4.5; + sizes[2] = 6; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFirebombSmallSmokeEmitter) +{ + ejectionPeriodMS = 30; + periodVarianceMS = 5; + ejectionVelocity = 2; + velocityVariance = 1; + thetaMin = 0; + thetaMax = 90; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 1; + particles = "LifelikeFirebombSmallSmokeParticle"; + blendStyle = "NORMAL"; +}; + +datablock ParticleData(LifelikeFirebombSmallFireBlastParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/fireblast"; + lifetimeMS = 250; + lifetimeVarianceMS = 50; + + colors[0] = "1 0.9 0.8 0.5"; + colors[1] = "0.8 0.4 0 1"; + colors[2] = "0.8 0.4 0 0"; + + sizes[0] = 1; + sizes[1] = 8; + sizes[2] = 1; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFirebombSmallFireBlastEmitter) +{ + ejectionPeriodMS = 10; + periodVarianceMS = 2; + ejectionVelocity = 20; + velocityVariance = 10; + thetaMin = 0; + thetaMax = 70; + phiReferenceVel = 0; + phiVariance = 360; + orientOnVelocity = true; + orientParticles = true; + particles = "LifelikeFirebombSmallFireBlastParticle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(LifelikeFirebombSmallSparks1Particle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/spark1"; + lifetimeMS = 300; + lifetimeVarianceMS = 20; + gravityCoefficient = 0; + + colors[0] = "1.0 0.9 0.8 0.4"; + colors[1] = "1.0 0.9 0.8 1"; + colors[2] = "0.8 0.4 0 0.0"; + + sizes[0] = 3; + sizes[1] = 2; + sizes[2] = 1; + + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFirebombSmallSparks1Emitter) +{ + ejectionPeriodMS = 12; + periodVarianceMS = 2; + ejectionVelocity = 20; + velocityVariance = 15; + thetaMin = 0; + thetaMax = 90; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0; + orientOnVelocity = true; + orientParticles = true; + particles = "LifelikeFirebombSmallSparks1Particle"; + blendStyle = "ADDITIVE"; +}; + + +datablock ParticleData(LifelikeFirebombSmallGlowParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/flame1"; + gravityCoefficient = -0.3; + lifetimeMS = 400; + lifetimeVarianceMS = 100; + spinRandomMin = -200.0; + spinRandomMax = 200.0; + + colors[0] = "0.9 0.8 1 0.4"; + colors[1] = "0.8 0.4 0.0 0.1"; + colors[2] = "0.8 0.4 0.0 0"; + + sizes[0] = 3; + sizes[1] = 6; + sizes[2] = 2; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFirebombSmallGlowEmitter) +{ + ejectionPeriodMS = 20; + periodVarianceMS = 5; + ejectionVelocity = 3; + velocityVariance = 2; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + + particles = "LifelikeFirebombSmallGlowParticle"; + blendStyle = "ADDITIVE"; +}; + + +datablock ParticleData(LifelikeFirebombSmallFireballParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/flame1"; + gravityCoefficient = -0.15; + lifetimeMS = 700; + lifetimeVarianceMS = 100; + spinRandomMin = -200.0; + spinRandomMax = 200.0; + + colors[0] = "1 0.9 0.8 1"; + colors[1] = "0.8 0.4 0.0 1"; + colors[2] = "0.8 0.4 0.0 0"; + + sizes[0] = 1; + sizes[1] = 4; + sizes[2] = 3; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFirebombSmallFireballEmitter) +{ + ejectionPeriodMS = 14; + periodVarianceMS = 3; + ejectionVelocity = 3; + velocityVariance = 2; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 1.5; + + particles = "LifelikeFirebombSmallFireballParticle"; + blendStyle = "ADDITIVE"; +}; + + + +//----------------------------------------------------------------------------- +// Debris +//----------------------------------------------------------------------------- + +datablock ParticleData(LifelikeFirebombSmallDebrisTrailParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/flame1"; + + gravityCoefficient = -0.2; + lifetimeMS = 500; + lifetimeVarianceMS = 300; + spinRandomMin = -300; + spinRandomMax = 300; + + sizes[0] = 0.5; + sizes[1] = 1.5; + sizes[2] = 0.5; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; + + colors[0] = "1 0.9 0.8 1"; + colors[1] = "0.8 0.4 0 0.5"; + colors[2] = "0.8 0.4 0 0"; + +}; + +datablock ParticleEmitterData(LifelikeFirebombSmallDebrisTrailEmitter) +{ + ejectionPeriodMS = 20; + periodVarianceMS = 10; + ejectionVelocity = 5; + velocityVariance = 2; + thetaMin = 0; + thetaMax = 10; + phiReferenceVel = 0; + phiVariance = 360; + + particles = "LifelikeFirebombSmallDebrisTrailParticle"; + blendStyle = "ADDITIVE"; + ejectionOffset = "1"; +}; + +datablock DebrisData(LifelikeFirebombSmallDebris) +{ + shapeFile = "art/shapes/particles/LifelikeEffectsPack/invisibledebris.dts"; + emitters[0] = LifelikeFirebombSmallDebrisTrailEmitter; + elasticity = 0.4; + friction = 0.25; + numBounces = 1; + bounceVariance = 0; + explodeOnMaxBounce = false; + staticOnMaxBounce = false; + snapOnMaxBounce = false; + minSpinSpeed = 100; + maxSpinSpeed = 200; + render2D = false; + lifetime = 2; + lifetimeVariance = 1; + velocity = 10; + velocityVariance = 4; + fade = false; + useRadiusMass = false; + baseRadius = 0.3; + gravModifier = 3.0; + terminalVelocity = 50; + ignoreWater = false; +}; + + +//----------------------------------------------------------------------------- +// Explosions +//----------------------------------------------------------------------------- + + + +datablock ExplosionData(LifelikeFirebombSmallExplosion) +{ + //soundProfile = YourSoundDatablock; + lifeTimeMS = 120; + + // Volume + particleEmitter = LifelikeFirebombSmallGlowEmitter; + particleDensity = 5; + particleRadius = 1.5; + + // Point emission + emitter[0] = LifelikeFirebombSmallSmokeEmitter; + emitter[1] = LifelikeFirebombSmallFireballEmitter; + emitter[2] = LifelikeFirebombSmallFireBlastEmitter; + emitter[3] = LifelikeFirebombSmallSparks1Emitter; + + // Debris + debris = LifelikeFirebombSmallDebris; + debrisThetaMin = 10; + debrisThetaMax = 60; + debrisNum = 4; + debrisNumVariance = 2; + debrisVelocity = 15; + debrisVelocityVariance = 5; + + shakeCamera = true; + camShakeFreq = "10.0 11.0 9.0"; + camShakeAmp = "20.0 20.0 20.0"; + camShakeDuration = 1.5; + camShakeRadius = 5.0; + + lightStartRadius = 10.0; + lightEndRadius = 0.0; + lightStartColor = "1 0.9 0.8"; + lightEndColor = "0.8 0.4 0.0"; + lightStartBrightness = 2.0; + lightEndBrightness = 0.0; + +}; \ No newline at end of file diff --git a/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_Flak.cs b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_Flak.cs new file mode 100644 index 000000000..473c21619 --- /dev/null +++ b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_Flak.cs @@ -0,0 +1,196 @@ +//----------------------------------------------------------------------------- +// Lifelike Effects Pack - Flak Explosion +// Copyright Adam deGrandis 2012 +// +// Thanks for your support! +// +//----------------------------------------------------------------------------- +//exec ("art/datablocks/LifelikeEffectsPack/LifelikeExp_Flak.cs"); + + +//----------------------------------------------------------------------------- +// Emitters +//----------------------------------------------------------------------------- + + +datablock ParticleData(LifelikeFlakPointBurstParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/PointBurst"; + lifetimeMS = 150; + spinRandomMin = -50.0; + spinRandomMax = 50.0; + + colors[0] = "1.0 0.9 0.8 1"; + colors[1] = "1 0.6 0.2 1"; + colors[2] = "0.8 0.4 0.0 0.0"; + + sizes[0] = 1; + sizes[1] = 8; + sizes[2] = 2; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFlakPointBurstEmitter) +{ + ejectionPeriodMS = 40; + periodVarianceMS = 5; + ejectionVelocity = 0.1; + velocityVariance = 0; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + particles = "LifelikeFlakPointBurstParticle"; + blendStyle = "ADDITIVE"; +}; + + +datablock ParticleData(LifelikeFlakSmokeParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/smoke1"; + lifetimeMS = 3300; + lifetimeVarianceMS = 200; + spinRandomMin = -50.0; + spinRandomMax = 50.0; + + colors[0] = "0.5 0.4 0.1 0"; + colors[1] = "0.7 0.7 0.6 1"; + colors[2] = "1 0.9 0.8 0.0"; + + sizes[0] = 3; + sizes[1] = 5; + sizes[2] = 6; + + times[0] = 0.0; + times[1] = 0.05; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFlakSmokeEmitter) +{ + ejectionPeriodMS = 20; + periodVarianceMS = 5; + ejectionVelocity = 1; + thetaMin = 0; + thetaMax = 180; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 2; + particles = "LifelikeFlakSmokeParticle"; + blendStyle = "NORMAL"; +}; + + + +datablock ParticleData(LifelikeFlakSparksParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/spark1"; + lifetimeMS = 100; + lifetimeVarianceMS = 50; + + colors[0] = "1.0 0.9 0.8 1"; + colors[1] = "1.0 0.9 0.8 1"; + colors[2] = "0.8 0.4 0 0.0"; + + sizes[0] = 1; + sizes[1] = 3; + sizes[2] = 1; + + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFlakSparksEmitter) +{ + ejectionPeriodMS = 10; + periodVarianceMS = 5; + ejectionVelocity = 35; + velocityVariance = 10; + thetaMin = 0; + thetaMax = 180; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0; + orientOnVelocity = true; + orientParticles = true; + particles = "LifelikeFlakSparksParticle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(LifelikeFlakHazeParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/flame1"; + lifetimeMS = 2500; + lifetimeVarianceMS = 500; + spinRandomMin = -50.0; + spinRandomMax = 50.0; + + colors[0] = "0.4 0.3 0.1 0"; + colors[1] = "0.1 0.1 0.1 0.7"; + colors[2] = "0.1 0.1 0.1 0"; + + sizes[0] = 2; + sizes[1] = 3; + sizes[2] = 4; + + times[0] = 0.0; + times[1] = 0.1; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFlakHazeEmitter) +{ + ejectionPeriodMS = 20; + periodVarianceMS = 5; + ejectionVelocity = 0; + velocityVariance = 0; + thetaMin = 0; + thetaMax = 180; + phiReferenceVel = 0; + phiVariance = 360; + ejectionOffset = 1; + + particles = "LifelikeFlakHazeParticle"; + blendStyle = "NORMAL"; +}; + + + +//----------------------------------------------------------------------------- +// Explosions +//----------------------------------------------------------------------------- + + +datablock ExplosionData(LifelikeFlakExplosion) +{ + //soundProfile = YourSoundDatablock; + lifeTimeMS = 100; + + // Volume + particleEmitter = LifelikeFlakHazeEmitter; + particleDensity = 30; + particleRadius = 1; + + // Point emission + emitter[0] = LifelikeFlakSmokeEmitter; + emitter[1] = LifelikeFlakPointBurstEmitter; + emitter[2] = LifelikeFlakSparksEmitter; + + shakeCamera = true; + camShakeFreq = "10.0 11.0 9.0"; + camShakeAmp = "20.0 20.0 20.0"; + camShakeDuration = 1.5; + camShakeRadius = 10.0; + + lightStartRadius = 10.0; + lightEndRadius = 0.0; + lightStartColor = "1 0.9 0.8"; + lightEndColor = "0.8 0.4 0.0"; + lightStartBrightness = 2.0; + lightEndBrightness = 0.0; + +}; \ No newline at end of file diff --git a/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_Flashbang.cs b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_Flashbang.cs new file mode 100644 index 000000000..707c79019 --- /dev/null +++ b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_Flashbang.cs @@ -0,0 +1,238 @@ +//----------------------------------------------------------------------------- +// Lifelike Effects Pack - Flashbang Explosion +// Copyright Adam deGrandis 2012 +// +// Thanks for your support! +// +//----------------------------------------------------------------------------- +//exec ("art/datablocks/LifelikeEffectsPack/LifelikeExp_Flashbang.cs"); + + +//----------------------------------------------------------------------------- +// Emitters +//----------------------------------------------------------------------------- + + +datablock ParticleData(LifelikeFlashbangPointBurstParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/PointBurst"; + lifetimeMS = 350; + lifetimeVarianceMS = 0; + spinRandomMin = -20.0; + spinRandomMax = 20.0; + + colors[0] = "1.0 0.9 0.8 1"; + colors[1] = "1.0 0.9 0.8 0.2"; + colors[2] = "1.0 0.9 0.8 0.0"; + + sizes[0] = 2; + sizes[1] = 5; + sizes[2] = 1; + + times[0] = 0.0; + times[1] = 0.1; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFlashbangPointBurstEmitter) +{ + ejectionPeriodMS = 60; + periodVarianceMS = 5; + ejectionVelocity = 0; + velocityVariance = 0; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0; + particles = "LifelikeFlashbangPointBurstParticle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(LifelikeFlashbangSmokeParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/flame1"; + gravityCoefficient = -0.02; + lifetimeMS = 1500; + lifetimeVarianceMS = 200; + spinRandomMin = -100.0; + spinRandomMax = 100.0; + + colors[0] = "0.5 0.5 0.5 0.5"; + colors[1] = "1 1 1 0.3"; + colors[2] = "1 1 1 0.0"; + + sizes[0] = 2; + sizes[1] = 3; + sizes[2] = 5; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFlashbangSmokeEmitter) +{ + ejectionPeriodMS = 10; + periodVarianceMS = 2; + ejectionVelocity = 1; + velocityVariance = 0; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 1; + particles = "LifelikeFlashbangSmokeParticle"; + blendStyle = "NORMAL"; +}; + + + +datablock ParticleData(LifelikeFlashbangGlowParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/flame1"; + gravityCoefficient = -0.3; + lifetimeMS = 400; + lifetimeVarianceMS = 100; + spinRandomMin = -200.0; + spinRandomMax = 200.0; + + colors[0] = "0.9 0.8 1 0.4"; + colors[1] = "0.9 0.8 1 0.1"; + colors[2] = "0.9 0.8 1 0"; + + sizes[0] = 3; + sizes[1] = 6; + sizes[2] = 2; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFlashbangGlowEmitter) +{ + ejectionPeriodMS = 30; + periodVarianceMS = 5; + ejectionVelocity = 3; + velocityVariance = 2; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + particles = "LifelikeFlashbangGlowParticle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(LifelikeFlashbangSparks2Particle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/spark2"; + dragCoefficient = 4; + gravityCoefficient = 1; + lifetimeMS = 1000; + lifetimeVarianceMS = 200; + spinRandomMin = -0.0; + spinRandomMax = 0.0; + + colors[0] = "1 1 1 0.5"; + colors[1] = "1.0 0.9 0.8 1"; + colors[2] = "0.9 0.8 0.7 0"; + + sizes[0] = 2.0; + sizes[1] = 1.5; + sizes[2] = 0.5; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFlashbangSparks2Emitter) +{ + ejectionPeriodMS = 6; + periodVarianceMS = 1; + ejectionVelocity = 30.0; + velocityVariance = 10.0; + ejectionOffset = 0; + thetaMin = 0; + thetaMax = 70; + phiReferenceVel = 0; + phiVariance = 360; + particles = "LifelikeFlashbangSparks2Particle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(LifelikeFlashbangSparks1Particle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/spark3"; + lifetimeMS = 200; + lifetimeVarianceMS = 20; + useInvAlpha = false; + + colors[0] = "1.0 0.9 0.8 1"; + colors[1] = "1.0 0.9 0.8 1"; + colors[2] = "1.0 0.9 0.8 0.0"; + + sizes[0] = 1; + sizes[1] = 3.5; + sizes[2] = 6; + + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeFlashbangSparks1Emitter) +{ + ejectionPeriodMS = 20; + periodVarianceMS = 5; + ejectionVelocity = 17; + velocityVariance = 5; + thetaMin = 0; + thetaMax = 70; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0; + orientOnVelocity = true; + orientParticles = true; + particles = "LifelikeFlashbangSparks1Particle"; + blendStyle = "ADDITIVE"; +}; + + + +//----------------------------------------------------------------------------- +// Explosions +//----------------------------------------------------------------------------- + + +datablock ExplosionData(LifelikeFlashbangExplosion) +{ + //soundProfile = YourSoundDatablock; + lifeTimeMS = 70; + + // Volume + particleEmitter = LifelikeFlashbangGlowEmitter; + particleDensity = 10; + particleRadius = 2; + + // Point emission + emitter[0] = LifelikeFlashbangSmokeEmitter; + emitter[1] = LifelikeFlashbangPointBurstEmitter; + emitter[2] = LifelikeFlashbangSparks1Emitter; + emitter[3] = LifelikeFlashbangSparks2Emitter; + + shakeCamera = true; + camShakeFreq = "10.0 11.0 9.0"; + camShakeAmp = "20.0 20.0 20.0"; + camShakeDuration = 1.5; + camShakeRadius = 3.0; + + lightStartRadius = 10.0; + lightEndRadius = 0.0; + lightStartColor = "1 0.9 0.8"; + lightEndColor = "1 0.9 0.8"; + lightStartBrightness = 2.0; + lightEndBrightness = 0.0; + +}; \ No newline at end of file diff --git a/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_GroundHitLarge.cs b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_GroundHitLarge.cs new file mode 100644 index 000000000..834321a24 --- /dev/null +++ b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_GroundHitLarge.cs @@ -0,0 +1,208 @@ +//----------------------------------------------------------------------------- +// Lifelike Effects Pack - Large Ground Explosion +// Copyright Adam deGrandis 2012 +// +// Thanks for your support! +// +//----------------------------------------------------------------------------- +//exec ("art/datablocks/LifelikeEffectsPack/LifelikeExp_GroundHitLarge.cs"); + + +//----------------------------------------------------------------------------- +// Emitters +//----------------------------------------------------------------------------- + + +datablock ParticleData(LifelikeGroundHitLargePointBurstParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/PointBurst"; + lifetimeMS = 350; + lifetimeVarianceMS = 0; + spinRandomMin = -20.0; + spinRandomMax = 20.0; + + colors[0] = "1.0 0.9 0.8 1"; + colors[1] = "0.8 0.4 0.0 0.2"; + colors[2] = "0.8 0.4 0.0 0.0"; + + sizes[0] = 8; + sizes[1] = 25; + sizes[2] = 2; + + times[0] = 0.0; + times[1] = 0.1; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeGroundHitLargePointBurstEmitter) +{ + ejectionPeriodMS = 40; + periodVarianceMS = 5; + ejectionVelocity = 0; + velocityVariance = 0; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0; + particles = "LifelikeGroundHitLargePointBurstParticle"; + blendStyle = "ADDITIVE"; +}; + + +datablock ParticleData(LifelikeGroundHitLargeSmokeParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/smoke2"; + gravityCoefficient = 0.5; + lifetimeMS = 3000; + lifetimeVarianceMS = 500; + spinRandomMin = -50.0; + spinRandomMax = 50.0; + + colors[0] = "0.3 0.2 0.1 0"; + colors[1] = "0.6 0.5 0.4 1"; + colors[2] = "0.6 0.5 0.4 0"; + + sizes[0] = 4; + sizes[1] = 14; + sizes[2] = 25; + + times[0] = 0.0; + times[1] = 0.1; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeGroundHitLargeSmokeEmitter) +{ + ejectionPeriodMS = 15; + periodVarianceMS = 5; + ejectionVelocity = 10; + velocityVariance = 5; + thetaMin = 0; + thetaMax = 50; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0; + particles = "LifelikeGroundHitLargeSmokeParticle"; + blendStyle = "NORMAL"; +}; + + +datablock ParticleData(LifelikeGroundHitLargeDirtDebrisParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/dirtDebris"; + //dragCoefficient = 4; + gravityCoefficient = 3; + lifetimeMS = 1500; + lifetimeVarianceMS = 500; + spinRandomMin = -40.0; + spinRandomMax = 40.0; + + colors[0] = "1 1 1 1"; + colors[1] = "1.0 0.9 0.8 1"; + colors[2] = "0.9 0.8 0.7 0"; + + sizes[0] = 5; + sizes[1] = 10; + sizes[2] = 14; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeGroundHitLargeDirtDebrisEmitter) +{ + ejectionPeriodMS = 10; + periodVarianceMS = 1; + ejectionVelocity = 30.0; + velocityVariance = 10.0; + ejectionOffset = 0; + thetaMin = 0; + thetaMax = 40; + phiReferenceVel = 0; + phiVariance = 360; + particles = "LifelikeGroundHitLargeDirtDebrisParticle"; + blendStyle = "NORMAL"; +}; + + +datablock ParticleData(LifelikeGroundHitLargeDirtBlastParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/dirtBlast1"; + lifetimeMS = 850; + lifetimeVarianceMS = 50; + gravityCoefficient = 1; + + colors[0] = "0.6 0.5 0.4 1"; + colors[1] = "0.6 0.5 0.4 1"; + colors[2] = "0.6 0.5 0.4 0"; + + sizes[0] = 5; + sizes[1] = 30; + sizes[2] = 30; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeGroundHitLargeDirtBlastEmitter) +{ + ejectionPeriodMS = 20; + periodVarianceMS = 2; + ejectionVelocity = 20; + velocityVariance = 2; + thetaMin = 0; + thetaMax = 50; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0; + orientOnVelocity = true; + orientParticles = true; + particles = "LifelikeGroundHitLargeDirtBlastParticle"; + blendStyle = "NORMAL"; +}; + + + +//----------------------------------------------------------------------------- +// Explosions +//----------------------------------------------------------------------------- + + + +datablock ExplosionData(LifelikeGroundHitLargeExplosion) +{ + //soundProfile = YourSoundDatablock; + lifeTimeMS = 200; + + // Volume + particleEmitter = LifelikeGroundHitLargeSmokeEmitter; + particleDensity = 5; + particleRadius = 3; + + // Point emission + emitter[0] = LifelikeGroundHitLargeSmokeEmitter; + emitter[1] = LifelikeGroundHitLargePointBurstEmitter; + emitter[2] = LifelikeGroundHitLargeDirtBlastEmitter; + emitter[3] = LifelikeGroundHitLargeDirtDebrisEmitter; + + // Sub explosion objects + //subExplosion[0] = LifelikeGroundHitLargeExplosion; + + + 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 = "1 0.9 0.8"; + lightEndColor = "0.8 0.4 0.0"; + lightStartBrightness = 2.0; + lightEndBrightness = 0.0; + +}; \ No newline at end of file diff --git a/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_GroundHitSmall.cs b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_GroundHitSmall.cs new file mode 100644 index 000000000..d2f796e87 --- /dev/null +++ b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_GroundHitSmall.cs @@ -0,0 +1,204 @@ +//----------------------------------------------------------------------------- +// Lifelike Effects Pack - Small Ground Explosion +// Copyright Adam deGrandis 2012 +// +// Thanks for your support! +// +//----------------------------------------------------------------------------- +//exec ("art/datablocks/LifelikeEffectsPack/LifelikeExp_GroundHitSmall.cs"); + + +//----------------------------------------------------------------------------- +// Emitters +//----------------------------------------------------------------------------- + + +datablock ParticleData(LifelikeGroundHitSmallPointBurstParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/PointBurst"; + lifetimeMS = 350; + lifetimeVarianceMS = 0; + spinRandomMin = -20.0; + spinRandomMax = 20.0; + + colors[0] = "1.0 0.9 0.8 1"; + colors[1] = "0.8 0.4 0.0 0.2"; + colors[2] = "0.8 0.4 0.0 0.0"; + + sizes[0] = 4; + sizes[1] = 13; + sizes[2] = 1; + + times[0] = 0.0; + times[1] = 0.1; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeGroundHitSmallPointBurstEmitter) +{ + ejectionPeriodMS = 60; + periodVarianceMS = 5; + ejectionVelocity = 0; + velocityVariance = 0; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0; + particles = "LifelikeGroundHitSmallPointBurstParticle"; + blendStyle = "ADDITIVE"; +}; + + +datablock ParticleData(LifelikeGroundHitSmallSmokeParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/smoke2"; + gravityCoefficient = 0.5; + lifetimeMS = 1500; + lifetimeVarianceMS = 500; + spinRandomMin = -50.0; + spinRandomMax = 50.0; + + colors[0] = "0.3 0.2 0.1 0"; + colors[1] = "0.6 0.5 0.4 1"; + colors[2] = "0.6 0.5 0.4 0"; + + sizes[0] = 2; + sizes[1] = 7; + sizes[2] = 12.5; + + times[0] = 0.0; + times[1] = 0.1; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeGroundHitSmallSmokeEmitter) +{ + ejectionPeriodMS = 40; + periodVarianceMS = 5; + ejectionVelocity = 6; + velocityVariance = 3; + thetaMin = 0; + thetaMax = 50; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0; + particles = "LifelikeGroundHitSmallSmokeParticle"; + blendStyle = "NORMAL"; +}; + + +datablock ParticleData(LifelikeGroundHitSmallDirtDebrisParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/dirtDebris"; + //dragCoefficient = 4; + gravityCoefficient = 3; + lifetimeMS = 1200; + lifetimeVarianceMS = 500; + spinRandomMin = -40.0; + spinRandomMax = 40.0; + + colors[0] = "1 1 1 1"; + colors[1] = "1.0 0.9 0.8 1"; + colors[2] = "0.9 0.8 0.7 0"; + + sizes[0] = 2; + sizes[1] = 5; + sizes[2] = 7; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeGroundHitSmallDirtDebrisEmitter) +{ + ejectionPeriodMS = 10; + periodVarianceMS = 1; + ejectionVelocity = 20.0; + velocityVariance = 7.0; + ejectionOffset = 0; + thetaMin = 0; + thetaMax = 40; + phiReferenceVel = 0; + phiVariance = 360; + particles = "LifelikeGroundHitSmallDirtDebrisParticle"; + blendStyle = "NORMAL"; +}; + + +datablock ParticleData(LifelikeGroundHitSmallDirtBlastParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/dirtBlast1"; + lifetimeMS = 800; + lifetimeVarianceMS = 50; + gravityCoefficient = 1; + + colors[0] = "0.6 0.5 0.4 1"; + colors[1] = "0.6 0.5 0.4 1"; + colors[2] = "0.6 0.5 0.4 0"; + + sizes[0] = 1; + sizes[1] = 10; + sizes[2] = 13; + + times[0] = 0.0; + times[1] = 0.2; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(LifelikeGroundHitSmallDirtBlastEmitter) +{ + ejectionPeriodMS = 30; + periodVarianceMS = 2; + ejectionVelocity = 13; + velocityVariance = 2; + thetaMin = 0; + thetaMax = 50; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0; + orientOnVelocity = true; + orientParticles = true; + particles = "LifelikeGroundHitSmallDirtBlastParticle"; + blendStyle = "NORMAL"; +}; + + + +//----------------------------------------------------------------------------- +// Explosions +//----------------------------------------------------------------------------- + + + +datablock ExplosionData(LifelikeGroundHitSmallExplosion) +{ + //soundProfile = YourSoundDatablock; + lifeTimeMS = 150; + + // Volume + particleEmitter = LifelikeGroundHitSmallSmokeEmitter; + particleDensity = 10; + particleRadius = 1.5; + + // Point emission + emitter[0] = LifelikeGroundHitSmallSmokeEmitter; + emitter[1] = LifelikeGroundHitSmallPointBurstEmitter; + emitter[2] = LifelikeGroundHitSmallDirtBlastEmitter; + emitter[3] = LifelikeGroundHitSmallDirtDebrisEmitter; + + shakeCamera = true; + camShakeFreq = "10.0 11.0 9.0"; + camShakeAmp = "20.0 20.0 20.0"; + camShakeDuration = 1.5; + camShakeRadius = 10.0; + + lightStartRadius = 10.0; + lightEndRadius = 0.0; + lightStartColor = "1 0.9 0.8"; + lightEndColor = "0.8 0.4 0.0"; + lightStartBrightness = 2.0; + lightEndBrightness = 0.0; + +}; \ No newline at end of file diff --git a/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_SimpleLarge.cs b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_SimpleLarge.cs new file mode 100644 index 000000000..005a0430a --- /dev/null +++ b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_SimpleLarge.cs @@ -0,0 +1,202 @@ +//----------------------------------------------------------------------------- +// Lifelike Effects Pack - Large Simple Explosion +// Copyright Adam deGrandis 2012 +// +// Thanks for your support! +// +//----------------------------------------------------------------------------- +//exec ("art/datablocks/LifelikeEffectsPack/LifelikeExp_SimpleLarge.cs"); + + +//----------------------------------------------------------------------------- +// Emitters +//----------------------------------------------------------------------------- + + +datablock ParticleData(SimpleLargeSmokeParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/smoke1"; + dragCoeffiecient = 0.0; + gravityCoefficient = -0.05; + inheritedVelFactor = 0.0; + constantAcceleration = 0.0; + lifetimeMS = 3300; + lifetimeVarianceMS = 200; + spinRandomMin = -50.0; + spinRandomMax = 50.0; + + colors[0] = "0.1 0.1 0.1 1"; + colors[1] = "0.7 0.7 0.6 1"; + colors[2] = "1 0.9 0.8 0.0"; + + sizes[0] = 4; + sizes[1] = 8; + sizes[2] = 12; + + times[0] = 0.0; + times[1] = 0.1; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(SimpleLargeSmokeEmitter) +{ + ejectionPeriodMS = 20; + periodVarianceMS = 5; + ejectionVelocity = 2; + velocityVariance = 0; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 2; + particles = "SimpleLargeSmokeParticle"; + blendStyle = "NORMAL"; +}; + +datablock ParticleData(SimpleLargeSparksParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/spark1"; + lifetimeMS = 250; + lifetimeVarianceMS = 20; + + colors[0] = "1.0 0.9 0.8 0.2"; + colors[1] = "1.0 0.9 0.8 1"; + colors[2] = "0.8 0.4 0 0.0"; + + sizes[0] = 1; + sizes[1] = 3; + sizes[2] = 1; + + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(SimpleLargeSparksEmitter) +{ + ejectionPeriodMS = 10; + periodVarianceMS = 5; + ejectionVelocity = 25; + velocityVariance = 10; + thetaMin = 0; + thetaMax = 70; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0; + orientOnVelocity = true; + orientParticles = true; + particles = "SimpleLargeSparksParticle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(SimpleLargeFireballParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/fireball"; + gravityCoefficient = -0.1; + lifetimeMS = 500; + lifetimeVarianceMS = 100; + spinRandomMin = -100.0; + spinRandomMax = 100.0; + + colors[0] = "1 0.9 0.8 1"; + colors[1] = "0.9 0.5 0.1 1"; + colors[2] = "0.8 0.4 0.0 0"; + + sizes[0] = 1; + sizes[1] = 7; + sizes[2] = 6; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(SimpleLargeFireballEmitter) +{ + ejectionPeriodMS = 10; + periodVarianceMS = 3; + ejectionVelocity = 3; + velocityVariance = 2; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 2.5; + + particles = "SimpleLargeFireballParticle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(SimpleLargeGlowParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/flame1"; + gravityCoefficient = -0.3; + lifetimeMS = 400; + lifetimeVarianceMS = 100; + spinRandomMin = -200.0; + spinRandomMax = 200.0; + + colors[0] = "0.9 0.8 1 0.4"; + colors[1] = "0.8 0.4 0.0 0.1"; + colors[2] = "0.8 0.4 0.0 0"; + + sizes[0] = 7; + sizes[1] = 11; + sizes[2] = 5; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(SimpleLargeGlowEmitter) +{ + ejectionPeriodMS = 40; + periodVarianceMS = 5; + ejectionVelocity = 3; + velocityVariance = 2; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + + particles = "SimpleLargeGlowParticle"; + blendStyle = "ADDITIVE"; +}; + + + +//----------------------------------------------------------------------------- +// Explosions +//----------------------------------------------------------------------------- + + +datablock ExplosionData(LifelikeSimpleLargeExplosion) +{ + //soundProfile = YourSoundDatablock; + lifeTimeMS = 125; + + // Volume + particleEmitter = SimpleLargeGlowEmitter; + particleDensity = 20; + particleRadius = 2; + + // Point emission + emitter[0] = SimpleLargeSmokeEmitter; + emitter[1] = SimpleLargeFireballEmitter; + emitter[2] = SimpleLargeSparksEmitter; + + 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 = "1 0.9 0.8"; + lightEndColor = "0.8 0.4 0.0"; + lightStartBrightness = 2.0; + lightEndBrightness = 0.0; + +}; \ No newline at end of file diff --git a/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_SimpleSmall.cs b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_SimpleSmall.cs new file mode 100644 index 000000000..e9ffdea4a --- /dev/null +++ b/Templates/Modules/RealisticVFX/Datablocks/LifelikeExp_SimpleSmall.cs @@ -0,0 +1,203 @@ +//----------------------------------------------------------------------------- +// Lifelike Effects Pack - Small Simple Explosion +// Copyright Adam deGrandis 2012 +// +// Thanks for your support! +// +//----------------------------------------------------------------------------- +//exec ("art/datablocks/LifelikeEffectsPack/LifelikeExp_SimpleSmall.cs"); + + +//----------------------------------------------------------------------------- +// Emitters +//----------------------------------------------------------------------------- + + + +datablock ParticleData(SimpleSmallSmokeParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/smoke1"; + dragCoeffiecient = 0.0; + gravityCoefficient = -0.02; + inheritedVelFactor = 0.0; + constantAcceleration = 0.0; + lifetimeMS = 3300; + lifetimeVarianceMS = 200; + spinRandomMin = -50.0; + spinRandomMax = 50.0; + + colors[0] = "0.1 0.1 0.1 1"; + colors[1] = "0.7 0.7 0.6 1"; + colors[2] = "1 0.9 0.8 0.0"; + + sizes[0] = 2; + sizes[1] = 4; + sizes[2] = 6; + + times[0] = 0.0; + times[1] = 0.1; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(SimpleSmallSmokeEmitter) +{ + ejectionPeriodMS = 20; + periodVarianceMS = 5; + ejectionVelocity = 1; + velocityVariance = 0; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0.7; + particles = "SimpleSmallSmokeParticle"; + blendStyle = "NORMAL"; +}; + +datablock ParticleData(SimpleSmallSparksParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/spark1"; + lifetimeMS = 200; + lifetimeVarianceMS = 20; + + colors[0] = "1.0 0.9 0.8 0.2"; + colors[1] = "1.0 0.9 0.8 1"; + colors[2] = "0.8 0.4 0 0.0"; + + sizes[0] = 0.5; + sizes[1] = 2; + sizes[2] = 0.5; + + times[0] = 0.0; + times[1] = 0.5; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(SimpleSmallSparksEmitter) +{ + ejectionPeriodMS = 10; + periodVarianceMS = 5; + ejectionVelocity = 20; + velocityVariance = 10; + thetaMin = 0; + thetaMax = 70; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 0; + orientOnVelocity = true; + orientParticles = true; + particles = "SimpleSmallSparksParticle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(SimpleSmallFireballParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/fireball"; + gravityCoefficient = -0.1; + lifetimeMS = 500; + lifetimeVarianceMS = 100; + spinRandomMin = -100.0; + spinRandomMax = 100.0; + + colors[0] = "1 0.9 0.8 1"; + colors[1] = "0.9 0.5 0.1 1"; + colors[2] = "0.8 0.4 0.0 0"; + + sizes[0] = 1; + sizes[1] = 4; + sizes[2] = 3; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(SimpleSmallFireballEmitter) +{ + ejectionPeriodMS = 10; + periodVarianceMS = 3; + ejectionVelocity = 2; + velocityVariance = 1; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + ejectionoffset = 1; + + particles = "SimpleSmallFireballParticle"; + blendStyle = "ADDITIVE"; +}; + +datablock ParticleData(SimpleSmallGlowParticle) +{ + textureName = "art/shapes/particles/LifelikeEffectsPack/flame1"; + gravityCoefficient = -0.3; + lifetimeMS = 400; + lifetimeVarianceMS = 100; + spinRandomMin = -200.0; + spinRandomMax = 200.0; + + colors[0] = "0.9 0.8 1 0.4"; + colors[1] = "0.8 0.4 0.0 0.1"; + colors[2] = "0.8 0.4 0.0 0"; + + sizes[0] = 3; + sizes[1] = 6; + sizes[2] = 2; + + times[0] = 0.0; + times[1] = 0.3; + times[2] = 1.0; +}; + +datablock ParticleEmitterData(SimpleSmallGlowEmitter) +{ + ejectionPeriodMS = 40; + periodVarianceMS = 5; + ejectionVelocity = 3; + velocityVariance = 2; + thetaMin = 0; + thetaMax = 120; + phiReferenceVel = 0; + phiVariance = 360; + + particles = "SimpleSmallGlowParticle"; + blendStyle = "ADDITIVE"; +}; + + + +//----------------------------------------------------------------------------- +// Explosions +//----------------------------------------------------------------------------- + + +datablock ExplosionData(LifelikeSimpleSmallExplosion) +{ + //soundProfile = YourSoundDatablock; + lifeTimeMS = 125; + + // Volume + particleEmitter = SimpleSmallGlowEmitter; + particleDensity = 20; + particleRadius = 1; + + // Point emission + emitter[0] = SimpleSmallSmokeEmitter; + emitter[1] = SimpleSmallFireballEmitter; + emitter[2] = SimpleSmallSparksEmitter; + + shakeCamera = true; + camShakeFreq = "10.0 11.0 9.0"; + camShakeAmp = "20.0 20.0 20.0"; + camShakeDuration = 1.5; + camShakeRadius = 5.0; + + lightStartRadius = 10.0; + lightEndRadius = 0.0; + lightStartColor = "1 0.9 0.8"; + lightEndColor = "0.8 0.4 0.0"; + lightStartBrightness = 2.0; + lightEndBrightness = 0.0; + +}; \ No newline at end of file diff --git a/Templates/Modules/RealisticVFX/Images/dirtBlast1.png b/Templates/Modules/RealisticVFX/Images/dirtBlast1.png new file mode 100644 index 0000000000000000000000000000000000000000..26bb7ce34d6bb902e60013ec99bc41da533869be GIT binary patch literal 404142 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

    3MjNG)y@X153t?$Sj`ktt>iHq}%@QYn6X93`*Mb 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