From d3ba8e8e4456d0258d4cebad0325d9831350196a Mon Sep 17 00:00:00 2001 From: thecelloman Date: Mon, 18 Mar 2013 10:02:05 -0400 Subject: [PATCH] Remove unused and (partially) unworking UnifiedShell. --- Templates/Empty/game/core/main.cs | 2 - .../game/core/scripts/client/recordings.cs | 9 +- .../core/unifiedShell/GamepadButtonsGui.cs | 95 ----- .../core/unifiedShell/GamepadButtonsGui.gui | 222 ---------- .../game/core/unifiedShell/MainMenuGui.cs | 105 ----- .../game/core/unifiedShell/MainMenuGui.gui | 72 ---- .../game/core/unifiedShell/ObjectPickerGui.cs | 172 -------- .../core/unifiedShell/ObjectPickerGui.gui | 82 ---- .../game/core/unifiedShell/OptionsGui.cs | 380 ------------------ .../game/core/unifiedShell/OptionsGui.gui | 104 ----- .../unifiedShell/images/gamepad_button_a.png | Bin 2388 -> 0 bytes .../unifiedShell/images/gamepad_button_b.png | Bin 2389 -> 0 bytes .../unifiedShell/images/gamepad_button_x.png | Bin 2403 -> 0 bytes .../unifiedShell/images/gamepad_button_y.png | Bin 2190 -> 0 bytes .../unifiedShell/images/listMenuArray.png | Bin 30773 -> 0 bytes .../Empty/game/core/unifiedShell/main.cs | 40 -- .../Empty/game/core/unifiedShell/profiles.cs | 79 ---- Templates/Empty/game/scripts/client/init.cs | 6 +- Templates/Full/game/core/main.cs | 2 - .../game/core/scripts/client/recordings.cs | 9 +- .../core/unifiedShell/GamepadButtonsGui.cs | 95 ----- .../core/unifiedShell/GamepadButtonsGui.gui | 222 ---------- .../game/core/unifiedShell/MainMenuGui.cs | 105 ----- .../game/core/unifiedShell/MainMenuGui.gui | 72 ---- .../game/core/unifiedShell/ObjectPickerGui.cs | 172 -------- .../core/unifiedShell/ObjectPickerGui.gui | 82 ---- .../Full/game/core/unifiedShell/OptionsGui.cs | 380 ------------------ .../game/core/unifiedShell/OptionsGui.gui | 104 ----- .../unifiedShell/images/gamepad_button_a.png | Bin 2388 -> 0 bytes .../unifiedShell/images/gamepad_button_b.png | Bin 2389 -> 0 bytes .../unifiedShell/images/gamepad_button_x.png | Bin 2403 -> 0 bytes .../unifiedShell/images/gamepad_button_y.png | Bin 2190 -> 0 bytes .../unifiedShell/images/listMenuArray.png | Bin 30773 -> 0 bytes Templates/Full/game/core/unifiedShell/main.cs | 40 -- .../Full/game/core/unifiedShell/profiles.cs | 79 ---- Templates/Full/game/scripts/client/init.cs | 6 +- .../game/scripts/client/serverConnection.cs | 2 - 37 files changed, 6 insertions(+), 2732 deletions(-) delete mode 100644 Templates/Empty/game/core/unifiedShell/GamepadButtonsGui.cs delete mode 100644 Templates/Empty/game/core/unifiedShell/GamepadButtonsGui.gui delete mode 100644 Templates/Empty/game/core/unifiedShell/MainMenuGui.cs delete mode 100644 Templates/Empty/game/core/unifiedShell/MainMenuGui.gui delete mode 100644 Templates/Empty/game/core/unifiedShell/ObjectPickerGui.cs delete mode 100644 Templates/Empty/game/core/unifiedShell/ObjectPickerGui.gui delete mode 100644 Templates/Empty/game/core/unifiedShell/OptionsGui.cs delete mode 100644 Templates/Empty/game/core/unifiedShell/OptionsGui.gui delete mode 100644 Templates/Empty/game/core/unifiedShell/images/gamepad_button_a.png delete mode 100644 Templates/Empty/game/core/unifiedShell/images/gamepad_button_b.png delete mode 100644 Templates/Empty/game/core/unifiedShell/images/gamepad_button_x.png delete mode 100644 Templates/Empty/game/core/unifiedShell/images/gamepad_button_y.png delete mode 100644 Templates/Empty/game/core/unifiedShell/images/listMenuArray.png delete mode 100644 Templates/Empty/game/core/unifiedShell/main.cs delete mode 100644 Templates/Empty/game/core/unifiedShell/profiles.cs delete mode 100644 Templates/Full/game/core/unifiedShell/GamepadButtonsGui.cs delete mode 100644 Templates/Full/game/core/unifiedShell/GamepadButtonsGui.gui delete mode 100644 Templates/Full/game/core/unifiedShell/MainMenuGui.cs delete mode 100644 Templates/Full/game/core/unifiedShell/MainMenuGui.gui delete mode 100644 Templates/Full/game/core/unifiedShell/ObjectPickerGui.cs delete mode 100644 Templates/Full/game/core/unifiedShell/ObjectPickerGui.gui delete mode 100644 Templates/Full/game/core/unifiedShell/OptionsGui.cs delete mode 100644 Templates/Full/game/core/unifiedShell/OptionsGui.gui delete mode 100644 Templates/Full/game/core/unifiedShell/images/gamepad_button_a.png delete mode 100644 Templates/Full/game/core/unifiedShell/images/gamepad_button_b.png delete mode 100644 Templates/Full/game/core/unifiedShell/images/gamepad_button_x.png delete mode 100644 Templates/Full/game/core/unifiedShell/images/gamepad_button_y.png delete mode 100644 Templates/Full/game/core/unifiedShell/images/listMenuArray.png delete mode 100644 Templates/Full/game/core/unifiedShell/main.cs delete mode 100644 Templates/Full/game/core/unifiedShell/profiles.cs diff --git a/Templates/Empty/game/core/main.cs b/Templates/Empty/game/core/main.cs index 21ada8231..f8ff3e8f1 100644 --- a/Templates/Empty/game/core/main.cs +++ b/Templates/Empty/game/core/main.cs @@ -75,8 +75,6 @@ function onStart() exec("./scripts/client/core.cs"); initializeCore(); - exec("./unifiedShell/main.cs"); - exec("./scripts/client/client.cs"); exec("./scripts/server/server.cs"); diff --git a/Templates/Empty/game/core/scripts/client/recordings.cs b/Templates/Empty/game/core/scripts/client/recordings.cs index ad03d3dc4..14f1a45d3 100644 --- a/Templates/Empty/game/core/scripts/client/recordings.cs +++ b/Templates/Empty/game/core/scripts/client/recordings.cs @@ -129,14 +129,7 @@ function demoPlaybackComplete() // handling functionality. clientEndMission(); - if ( $UseUnifiedShell ) - { - if (isObject( UnifiedMainMenuGui )) - Canvas.setContent( UnifiedMainMenuGui ); - else if (isObject( MainMenuGui )) - Canvas.setContent( MainMenuGui ); - } - else if (isObject( MainMenuGui )) + if (isObject( MainMenuGui )) Canvas.setContent( MainMenuGui ); Canvas.pushDialog(RecordingsDlg); diff --git a/Templates/Empty/game/core/unifiedShell/GamepadButtonsGui.cs b/Templates/Empty/game/core/unifiedShell/GamepadButtonsGui.cs deleted file mode 100644 index d14a2419e..000000000 --- a/Templates/Empty/game/core/unifiedShell/GamepadButtonsGui.cs +++ /dev/null @@ -1,95 +0,0 @@ -//----------------------------------------------------------------------------- -// 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. -//----------------------------------------------------------------------------- - -//------------------------------------------------------------------------------ -// global vars -//------------------------------------------------------------------------------ - -$BUTTON_A = 0; -$BUTTON_B = 1; -$BUTTON_X = 2; -$BUTTON_Y = 3; - -//------------------------------------------------------------------------------ -// GamepadButtonsGui methods -//------------------------------------------------------------------------------ - -/// Callback when this control wakes up. All buttons are set to invisible and -/// disabled. -function GamepadButtonsGui::onWake(%this) -{ - %this.setButton($BUTTON_A); - %this.setButton($BUTTON_B); - %this.setButton($BUTTON_X); - %this.setButton($BUTTON_Y); -} - -/// Sets the command and text for the specified button. If %text and %command -/// are left empty, the button will be disabled and hidden. -/// Note: This command is not executed when the A button is pressed. That -/// command is executed directly from the GuiGameList___Ctrl. This command is -/// for the graphical hint and to allow a mouse equivalent. -/// -/// \param %button (constant) The button to set. See: $BUTTON_A, _B, _X, _Y -/// \param %text (string) The text to display next to the A button graphic. -/// \param %command (string) The command executed when the A button is pressed. -function GamepadButtonsGui::setButton(%this, %button, %text, %command) -{ - switch (%button) - { - case $BUTTON_A : - %labelCtrl = ButtonALabel; - %buttonCtrl = ButtonAButton; - %imgCtrl = ButtonAImg; - - case $BUTTON_B : - %labelCtrl = ButtonBLabel; - %buttonCtrl = ButtonBButton; - %imgCtrl = ButtonBImg; - - case $BUTTON_X : - %labelCtrl = ButtonXLabel; - %buttonCtrl = ButtonXButton; - %imgCtrl = ButtonXImg; - - case $BUTTON_Y : - %labelCtrl = ButtonYLabel; - %buttonCtrl = ButtonYButton; - %imgCtrl = ButtonYImg; - - default: - error("GamepadButtonsGui::setButton(" @ %button @ ", " @ %text @ ", " @ %command @ "). No valid button was specified. Please pass one of the $BUTTON_ globals for this parameter."); - return ""; - } - - %set = (! ((%text $= "") && (%command $= ""))); - %labelCtrl.setText(%text); - %labelCtrl.setActive(%set); - %labelCtrl.setVisible(%set); - - %buttonCtrl.Command = %command; - %buttonCtrl.setActive(%set); - %buttonCtrl.setVisible(%set); - - %imgCtrl.setActive(%set); - %imgCtrl.setVisible(%set); -} diff --git a/Templates/Empty/game/core/unifiedShell/GamepadButtonsGui.gui b/Templates/Empty/game/core/unifiedShell/GamepadButtonsGui.gui deleted file mode 100644 index cd66ed22c..000000000 --- a/Templates/Empty/game/core/unifiedShell/GamepadButtonsGui.gui +++ /dev/null @@ -1,222 +0,0 @@ -//------------------------------------------------------------------------------ -// Torque Engine -// Copyright (C) GarageGames.com, Inc. -//------------------------------------------------------------------------------ - -//--- OBJECT WRITE BEGIN --- -%guiContent = new GuiControl(GamepadButtonsGui) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "1"; - Profile = "GamepadDefaultProfile"; - HorizSizing = "center"; - VertSizing = "center"; - position = "0 0"; - Extent = "464 112"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - - new GuiBitmapCtrl(ButtonBImg) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "GamepadDefaultProfile"; - HorizSizing = "left"; - VertSizing = "relative"; - position = "416 16"; - Extent = "32 32"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - bitmap = "core/unifiedShell/images/gamepad_button_b"; - wrap = "0"; - }; - new GuiTextCtrl(ButtonBLabel) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "GamepadButtonTextRight"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "248 16"; - Extent = "160 32"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - text = "Button B Label"; - maxLength = "1024"; - }; - new GuiButtonBaseCtrl(ButtonBButton) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "GamepadDefaultProfile"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "248 16"; - Extent = "200 32"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - text = "Button"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - }; - new GuiBitmapCtrl(ButtonAImg) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "GamepadDefaultProfile"; - HorizSizing = "left"; - VertSizing = "relative"; - position = "400 64"; - Extent = "32 32"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - bitmap = "core/unifiedShell/images/gamepad_button_a"; - wrap = "0"; - }; - new GuiTextCtrl(ButtonALabel) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "GamepadButtonTextRight"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "232 64"; - Extent = "160 32"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - text = "Button B Label"; - maxLength = "1024"; - }; - new GuiButtonBaseCtrl(ButtonAButton) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "GamepadDefaultProfile"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "232 64"; - Extent = "200 32"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - text = "Button"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - }; - new GuiBitmapCtrl(ButtonXImg) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "GamepadDefaultProfile"; - HorizSizing = "right"; - VertSizing = "relative"; - position = "32 64"; - Extent = "32 32"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - bitmap = "core/unifiedShell/images/gamepad_button_x"; - wrap = "0"; - }; - new GuiTextCtrl(ButtonXLabel) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "GamepadButtonTextLeft"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "72 64"; - Extent = "160 32"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - text = "Button X Label"; - maxLength = "1024"; - }; - new GuiButtonBaseCtrl(ButtonXButton) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "GamepadDefaultProfile"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "32 64"; - Extent = "200 32"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - text = "Button"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - }; - new GuiBitmapCtrl(ButtonYImg) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "GamepadDefaultProfile"; - HorizSizing = "right"; - VertSizing = "relative"; - position = "16 16"; - Extent = "32 32"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - bitmap = "core/unifiedShell/images/gamepad_button_y"; - wrap = "0"; - }; - new GuiTextCtrl(ButtonYLabel) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "GamepadButtonTextLeft"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "55 16"; - Extent = "164 32"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - text = "Button Y Label"; - maxLength = "1024"; - }; - new GuiButtonBaseCtrl(ButtonYButton) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "GamepadDefaultProfile"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "16 16"; - Extent = "208 32"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - text = "Button"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - }; -}; -//--- OBJECT WRITE END --- diff --git a/Templates/Empty/game/core/unifiedShell/MainMenuGui.cs b/Templates/Empty/game/core/unifiedShell/MainMenuGui.cs deleted file mode 100644 index 5e3725b32..000000000 --- a/Templates/Empty/game/core/unifiedShell/MainMenuGui.cs +++ /dev/null @@ -1,105 +0,0 @@ -//----------------------------------------------------------------------------- -// 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. -//----------------------------------------------------------------------------- - -//------------------------------------------------------------------------------ -// ListMenu methods -//------------------------------------------------------------------------------ - -/// Callback when this gui is added to the sim. -function ListMenu::onAdd(%this) -{ - %this.addRow("Play Game", "onSinglePlayer", 0); - - // Defunct for now - //%this.addRow("Select Model", "onSelectModel", 4, -15); - - // No need for video options on Xbox 360 - if ( $platform $= "xenon" ) - %this.addRow("Exit Game", "onQuit", 4, -15); - else - { - %this.addRow("Setup", "onOptions", 4, -15); - %this.addRow("Exit Game", "onQuit", 6, -15); - } -} - -//------------------------------------------------------------------------------ -// MainMenuButtonHolder methods -//------------------------------------------------------------------------------ - -function MainMenuButtonHolder::onWake(%this) -{ - %this.add(GamepadButtonsGui); - - GamepadButtonsGui.setButton($BUTTON_A, "Go", ListMenu.CallbackOnA); -} - -//------------------------------------------------------------------------------ -// global methods -//------------------------------------------------------------------------------ - -/// Callback from the shell button for triggering single player. -function onSinglePlayer() -{ - echo("Default implementation. Override onSinglePlayer() to add game specific functionality"); - - if ( isObject( LoadingGui ) ) - { - Canvas.setContent("LoadingGui"); - LoadingProgress.setValue(1); - LoadingProgressTxt.setValue("LOADING MISSION FILE"); - Canvas.repaint(); - } - - // Grab the specified default level - %mission = $DefaultLevelFile; - - // If the default level isn't loaded attempt a fallback - if ( %mission $= "" ) - %mission = "levels/default.mis"; - - %serverType = $AutoLoadLevelMode; - - if ( %serverType $= "" ) - %serverType = "SinglePlayer"; - - createAndConnectToLocalServer( %serverType, %mission ); -} - -/// Callback from the shell button to bring up the object picker. -function onSelectModel() -{ - Canvas.setContent(ObjectPickerGui); -} - -/// Callback from the shell button to bring up the options gui. -function onOptions() -{ - Canvas.setContent(OptionsGui); -} - -/// Callback from the shell "quit" button. -function onQuit() -{ - echo("Default implementation. Override onQuit() to add game specific functionality"); - quit(); -} diff --git a/Templates/Empty/game/core/unifiedShell/MainMenuGui.gui b/Templates/Empty/game/core/unifiedShell/MainMenuGui.gui deleted file mode 100644 index a5404196b..000000000 --- a/Templates/Empty/game/core/unifiedShell/MainMenuGui.gui +++ /dev/null @@ -1,72 +0,0 @@ -//------------------------------------------------------------------------------ -// Torque Engine -// Copyright (C) GarageGames.com, Inc. -//------------------------------------------------------------------------------ - -//--- OBJECT WRITE BEGIN --- -%guiContent = singleton GuiChunkedBitmapCtrl(UnifiedMainMenuGui) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "1"; - Profile = "GuiContentProfile"; - HorizSizing = "width"; - VertSizing = "height"; - Position = "0 0"; - Extent = "800 600"; - MinExtent = "8 8"; - canSave = "1"; - Visible = "1"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - bitmap = "art/gui/background"; - useVariable = "0"; - tile = "0"; - - new GuiControl() { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "1"; - Profile = "GuiDefaultProfile"; - HorizSizing = "center"; - VertSizing = "center"; - position = "0 0"; - Extent = "640 480"; - MinExtent = "8 8"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - - new GuiControl(MainMenuButtonHolder) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "1"; - Profile = "GamepadDefaultProfile"; - HorizSizing = "center"; - VertSizing = "bottom"; - position = "88 340"; - Extent = "464 112"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - }; - - singleton GuiGameListMenuCtrl(ListMenu) { - canSaveDynamicFields = "0"; - isContainer = "0"; - Profile = "DefaultListMenuProfile"; - HorizSizing = "center"; - VertSizing = "bottom"; - position = "160 64"; - Extent = "320 240"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - CallbackOnA = "ListMenu.activateRow();"; - DebugRender = false; - }; - - }; -}; -//--- OBJECT WRITE END --- diff --git a/Templates/Empty/game/core/unifiedShell/ObjectPickerGui.cs b/Templates/Empty/game/core/unifiedShell/ObjectPickerGui.cs deleted file mode 100644 index 275f988d4..000000000 --- a/Templates/Empty/game/core/unifiedShell/ObjectPickerGui.cs +++ /dev/null @@ -1,172 +0,0 @@ -//----------------------------------------------------------------------------- -// 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. -//----------------------------------------------------------------------------- - -//------------------------------------------------------------------------------ -// global vars -//------------------------------------------------------------------------------ - -$PICKER::ROW_OBJECT = 0; ///< The row used to pick ojbects -$PICKER::ROW_MOUNT = 1; ///< The row used to pick the mounted object - -$PICKER::MODEL["Default"] = getWorkingDirectory() @ "/art/shapes/players/SpaceOrc/SpaceOrc.dts"; - -$PICKER::WEAPON["Default"] = getWorkingDirectory() @ "/art/shapes/weapons/SwarmGun/swarmgun.dts"; -$PICKER::WEAPON["Rocket Launcher"] = getWorkingDirectory() @ "/art/shapes/weapons/SwarmGun/swarmgun.dts"; - -//------------------------------------------------------------------------------ -// PickerMenu methods -//------------------------------------------------------------------------------ - -/// Callback when this gui is added to the sim. -function PickerMenu::onAdd(%this) -{ - %this.addRow("Model", "Default", true, "onModelChange"); - %this.addRow("Weapon", "Default", true, "onMountChange"); -} - -/// Callback when the control wakes up. -function PickerMenu::onWake(%this) -{ - // For now PlayerDatasGroup is currently being populated - // by loadPlayerPickerData() which is implemented in - // <$defaultGame>/client/init.cs - - %this.modelList = ""; - - if (isObject(PlayerDatasGroup)) - { - for (%i = 0; %i < PlayerDatasGroup.getCount(); %i++) - { - %obj = PlayerDatasGroup.getObject(%i); - %name = %obj.getName(); - - %name = strreplace(%name, "Data", ""); - echo(%name); - $PICKER::MODEL[%name] = %obj.shapeFile; - - %this.modelList = %this.modelList @ %name @ "\t"; - } - } - - %this.setOptions($PICKER::ROW_OBJECT, %this.modelList); - - %this.setOptions($PICKER::ROW_MOUNT, "Default\tRocket Launcher"); - - // Initialize the currently selected object here - if ($pref::Player:PlayerDB $= "") - $pref::Player:PlayerDB = getField(%this.modelList, 0) @ "Data"; - - %db = strreplace($pref::Player:PlayerDB, "Data", ""); - - //PickerObjectView.setModel($PICKER::MODEL[%db]); - - if ($pref::Player:Weapon $= "") - $pref::Player:Weapon = "Default"; - - - PickerObjectView.setMount($PICKER::WEAPON[$pref::Player:Weapon],0); - PickerObjectView.setOrbitDistance(3); - - %this.selectOption($PICKER::ROW_OBJECT, %db); - %this.selectOption($PICKER::ROW_MOUNT, $pref::Player:Weapon); -} - -function PickerMenu::setPlayer(%this) -{ - %selected = PickerMenu.getCurrentOption($PICKER::ROW_OBJECT); - - if (%selected $= "Default") - %selected = "DefaultPlayer"; - - $pref::Player:PlayerDB = %selected @ "Data"; - - %selected = PickerMenu.getCurrentOption($PICKER::ROW_MOUNT); - - $pref::Player:Weapon = %selected; - - Canvas.setContent(UnifiedMainMenuGui); -} - -//------------------------------------------------------------------------------ -// callbacks from PickerMenu -//------------------------------------------------------------------------------ - -/// Callback when the primary object model is changed. -/// -/// \param %direction (string) "LEFT" or "RIGHT" indicating the direction the -/// option changed. -function onModelChange(%direction) -{ - %selected = PickerMenu.getCurrentOption($PICKER::ROW_OBJECT); - PickerObjectView.setModel($PICKER::MODEL[%selected]); - PickerObjectView.setOrbitDistance(3); - PickerInfoDisplay.update(); -} - -/// Callback when the mounted object model is changed. -/// -/// \param %direction (string) "LEFT" or "RIGHT" indicating the direction the -/// option changed. -function onMountChange(%direction) -{ - %selected = PickerMenu.getCurrentOption($PICKER::ROW_MOUNT); - PickerObjectView.setMount($PICKER::WEAPON[%selected],0); - $pref::Player:Weapon = %selected; - - PickerInfoDisplay.update(); -} - -//------------------------------------------------------------------------------ -// PickerInfoDisplay methods -//------------------------------------------------------------------------------ - -/// Updates the information display to show information about the currently -/// selected objects. -function PickerInfoDisplay::update(%this) -{ - %objectName = PickerMenu.getCurrentOption($PICKER::ROW_OBJECT); - %mountName = PickerMenu.getCurrentOption($PICKER::ROW_MOUNT); - %this.setText(""); - %this.addText("", false); - %this.addText("Selected Objects
", false); - %this.addText("Object:" TAB %objectName @ "
", false); - %this.addText("Mounted Object:" TAB %mountName @ "
", false); - %this.forceReflow(); -} - -/// Callback when this control wakes up -function PickerInfoDisplay::onWake(%this) -{ - %this.update(); -} - -//------------------------------------------------------------------------------ -// PickerButtonHolder methods -//------------------------------------------------------------------------------ - -function PickerButtonHolder::onWake(%this) -{ - %this.add(GamepadButtonsGui); - - GamepadButtonsGui.setButton($BUTTON_A, "Accept", PickerMenu.CallbackOnA); - GamepadButtonsGui.setButton($BUTTON_B, "Go Back", PickerMenu.CallbackOnB); -} diff --git a/Templates/Empty/game/core/unifiedShell/ObjectPickerGui.gui b/Templates/Empty/game/core/unifiedShell/ObjectPickerGui.gui deleted file mode 100644 index e431b5781..000000000 --- a/Templates/Empty/game/core/unifiedShell/ObjectPickerGui.gui +++ /dev/null @@ -1,82 +0,0 @@ -//------------------------------------------------------------------------------ -// Torque Engine -// Copyright (C) GarageGames.com, Inc. -//------------------------------------------------------------------------------ - -//--- OBJECT WRITE BEGIN --- -%guiContent = new GuiControl(ObjectPickerGui) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "1"; - Profile = "GuiDefaultProfile"; - HorizSizing = "width"; - VertSizing = "height"; - position = "0 0"; - Extent = "640 480"; - MinExtent = "8 8"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - - new GuiBitmapCtrl(PickerBackground) { - canSaveDynamicFields = "1"; - isContainer = "0"; - Profile = "GuiDefaultProfile"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "0 0"; - Extent = "640 480"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - bitmap = getWorkingDirectory() @ "/art/skies/skybox_1.jpg"; - wrap = "0"; - }; - new GuiGameListOptionsCtrl(PickerMenu) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "DefaultOptionsMenuProfile"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "20 185"; - Extent = "320 186"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - CallbackOnA = "PickerMenu.setPlayer();"; - CallbackOnB = "Canvas.setContent(UnifiedMainMenuGui);"; - hovertime = "1000"; - DebugRender = false; - }; - new GuiMLTextCtrl(PickerInfoDisplay) { - Profile = "GuiDefaultProfile"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "350 185"; - Extent = "240 56"; - }; - new GuiObjectView(PickerObjectView) { - Profile = "GuiDefaultProfile"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "230 0"; - Extent = "180 180"; - }; - new GuiControl(PickerButtonHolder) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "1"; - Profile = "GamepadDefaultProfile"; - HorizSizing = "center"; - VertSizing = "top"; - position = "88 368"; - Extent = "464 112"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - }; -}; -//--- OBJECT WRITE END --- diff --git a/Templates/Empty/game/core/unifiedShell/OptionsGui.cs b/Templates/Empty/game/core/unifiedShell/OptionsGui.cs deleted file mode 100644 index 2a946bc8f..000000000 --- a/Templates/Empty/game/core/unifiedShell/OptionsGui.cs +++ /dev/null @@ -1,380 +0,0 @@ -//----------------------------------------------------------------------------- -// 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. -//----------------------------------------------------------------------------- - -//------------------------------------------------------------------------------ -// global vars -//------------------------------------------------------------------------------ - -$OPTIONS_MENU::NO_DEVICE = -1; ///< Indicates there is no specified device -$OPTIONS_MENU::ROW_GFXDEVICE = 0; ///< Row to choose gfx device -$OPTIONS_MENU::ROW_GFXRES = 1; ///< Row to choose gfx resolution -$OPTIONS_MENU::ROW_FULLSCREEN = 2; ///< Row to choose fullscreen or not -$OPTIONS_MENU::ROW_VOLUME = 3; ///< Row to set audio volume -$OPTIONS_MENU::ROW_AA = 4; ///< Row to set AA - -//------------------------------------------------------------------------------ -// OptionsMenu methods -//------------------------------------------------------------------------------ - -/// Callback when this gui is added to the sim. -function OptionsMenu::onAdd(%this) -{ - %deviceList = %this.getGfxDeviceList(); - %this.addRow("Adapter", %deviceList, true, "onGfxDeviceChange", 0, 0, false); - - %resList = %this.getGfxResList(isFullScreen()); - %this.addRow("Resolution", %resList, false, "", 0, -15); - - %yesNoList = "Yes\tNo"; - %this.addRow("Fullscreen", %yesNoList, true, "onFullscreenChange", 0, -15); - - %volumeList = %this.getSfxVolumeList(); - %this.addRow("Volume", %volumeList, false, "onVolumeChange", 0, -15, false); - - %aaList = %this.getAAList(); - %this.addRow("Antialias", %aaList, false, "", 0, -15); -} - -/// Callback when the control wakes up. -function OptionsMenu::onWake(%this) -{ - %this.loadPrefs(); -} - -/// Initializes each row on this control to reflect the state of saved prefs. -function OptionsMenu::loadPrefs(%this) -{ - // init the display adapter chooser - %this.selectOption($OPTIONS_MENU::ROW_GFXDEVICE, $pref::Video::displayDevice); - OptionsInfoDisplay.displayGfxDevice(); - - // init the display resolution chooser - %currRes = getWords($pref::Video::mode, $WORD::RES_X, $WORD::RES_Y); - %this.selectOption($OPTIONS_MENU::ROW_GFXRES, %currRes); - - // init the fullscreen chooser - %fullscreen = (isFullScreen()) ? "Yes" : "No"; - %this.selectOption($OPTIONS_MENU::ROW_FULLSCREEN, %fullscreen); - - // init the master volume - %volume = mRoundByFive($pref::Audio::masterVolume * 100); - %this.selectOption($OPTIONS_MENU::ROW_VOLUME, %volume); - - %currAA = getWord($pref::Video::mode, $WORD::AA); - %this.selectOption($OPTIONS_MENU::ROW_AA, %currAA); -} - -/// Gets a tab separated list of all the graphics devices available. The list -/// will not include the null device by default but you may request to have the -/// null device included. Devices are listed by type. -/// -/// \param %includeNull (bool) [optional] Specify true to include the null -/// device in the list. Default is false. -/// \return (string) A tab separated list of the avilable graphics devices. -function OptionsMenu::getGfxDeviceList(%this, %includeNull) -{ - %count = GFXInit::getAdapterCount(); - %list = ""; - for (%i = 0; %i < %count; %i++) - { - %type = GFXInit::getAdapterType(%i); - if ((%includeNull) || (%type !$= "NullDevice")) - { - %list = %list TAB %type; - } - } - return trim(%list); -} - -/// Gets a tab separated list of available graphics resolutions. The resolutions -/// will be those available for the settings currently shown on the options -/// screen. -/// -/// \param %fullscreen (bool) Specify true to get a list of all resolutions or -/// false to prune out resolutions that won't fit nicely on the desktop. -/// \return (string) A tab separated list of available graphics resolutions. -function OptionsMenu::getGfxResList(%this, %fullscreen) -{ - %type = %this.getCurrentOption($OPTIONS_MENU::ROW_GFXDEVICE); - %adapter = getGfxDeviceIndex(%type); - - %deskRes = getDesktopResolution(); - %deskResX = firstWord(%deskRes); - %deskResY = getWord(%deskRes, 1); - - %list = ""; - %count = GFXInit::getAdapterModeCount(%adapter); - for (%i = 0; %i < %count; %i++) - { - %rawRes = GFXInit::getAdapterMode(%adapter, %i); - %resX = firstWord(%rawRes); - %resY = getWord(%rawRes, 1); - if (%fullscreen || ((%resX < %deskResX) && (%resY < %deskResY))) - { - %res = %resX SPC %resY; - if (! listHasElement(%list, %res)) - { - %list = %list TAB %res; - } - } - } - - return trim(%list); -} - -/// Refreshes the list of resolutions on the control taking into account the -/// displayed settings for device and fullscreen. -function OptionsMenu::refreshResolutions(%this) -{ - %oldRes = %this.getCurrentOption($OPTIONS_MENU::ROW_GFXRES); - %fullscreen = (%this.getCurrentOption($OPTIONS_MENU::ROW_FULLSCREEN) $= "Yes"); - %newResList = %this.getGfxResList(%fullscreen); - %this.setOptions($OPTIONS_MENU::ROW_GFXRES, %newResList); - %this.selectOption($OPTIONS_MENU::ROW_GFXRES, %oldRes); -} - -/// Builds a list of volume increments suitable for listing on the volume -/// control. List will be from 0 to 100, incrementing by 5. -function OptionsMenu::getSfxVolumeList(%this) -{ - %start = 0; - %end = 100; - %inc = 5; - - %list = ""; - for (%i = %start; %i <= %end; %i += %inc) - { - %list = %list TAB %i; - } - - return trim(%list); -} - -function OptionsMenu::getAAList(%this) -{ - %type = %this.getCurrentOption($OPTIONS_MENU::ROW_GFXDEVICE); - %adapter = getGfxDeviceIndex(%type); - - %list = ""; - %count = GFXInit::getAdapterModeCount(%adapter); - %maxAA = 0; - for (%i = 0; %i < %count; %i++) - { - %rawRes = GFXInit::getAdapterMode(%adapter, %i); - %aa = getWord(%rawRes, $WORD::AA); - if (%aa > %maxAA) - %maxAA = %aa; - } - - %list = ""; - for (%i = 0; %i <= %maxAA; %i++) - { - %list = %list TAB %i; - } - return trim(%list); -} - -//------------------------------------------------------------------------------ -// OptionsButtonHolder methods -//------------------------------------------------------------------------------ - -function OptionsButtonHolder::onWake(%this) -{ - %this.add(GamepadButtonsGui); - - GamepadButtonsGui.setButton($BUTTON_A, "Apply Changes", OptionsMenu.CallbackOnA); - GamepadButtonsGui.setButton($BUTTON_B, "Go Back", OptionsMenu.CallbackOnB); - GamepadButtonsGui.setButton($BUTTON_Y, "Revert Options", OptionsMenu.CallbackOnY); -} - -//------------------------------------------------------------------------------ -// OptionsInfoDisplay methods -//------------------------------------------------------------------------------ - -/// Updates the control to display information on the display device selected on -/// the control for choosing a display device. -function OptionsInfoDisplay::displayGfxDevice(%this) -{ - %type = OptionsMenu.getCurrentOption($OPTIONS_MENU::ROW_GFXDEVICE); - %index = getGfxDeviceIndex(%type); - if (%index != $OPTIONS_MENU::NO_DEVICE) - { - %name = GFXInit::getAdapterName(%index); - %shader = GFXInit::getAdapterShaderModel(%index); - } - else - { - %name = "No valid device of that type"; - %shader = "NA"; - } - %this.setText(""); - %this.addText("", false); - %this.addText("Graphics Device
", false); - %this.addText("Type:" TAB %type @ "
", false); - %this.addText("Device:" TAB %name @ "
", false); - %this.addText("Shader:" TAB %shader @ "
", false); - %this.forceReflow(); -} - -//------------------------------------------------------------------------------ -// callbacks from OptionsMenu -//------------------------------------------------------------------------------ - -/// Callback when the graphics device is changed. This will refresh the lists of -/// resolutions and other related settings. -/// -/// \param %direction (string) "LEFT" or "RIGHT" indicating the direction the -/// option changed. -function onGfxDeviceChange(%direction) -{ - OptionsInfoDisplay.displayGfxDevice(); - $ThisControl.refreshResolutions(); -} - -/// Callback when the fullscreen setting is changed. Refreshes the list of -/// resolutions to reflect what is available. -/// -/// \param %direction (string) "LEFT" or "RIGHT" indicating the direction the -/// option changed. -function onFullscreenChange(%direction) -{ - $ThisControl.refreshResolutions(); -} - -/// Callback when the volume setting is changed. -/// -/// \param %direction (string) "LEFT" or "RIGHT" indicating the direction the -/// option changed. -function onVolumeChange(%direction) -{ - %volume = (OptionsMenu.getCurrentOption($OPTIONS_MENU::ROW_VOLUME) / 100); - sfxSetMasterVolume(%volume); - // TODO: play sample audio blip for user feedback -} - -//------------------------------------------------------------------------------ -// global methods -//------------------------------------------------------------------------------ - -/// Applies the options that have been set. -function applyOptions() -{ - // set the audio options - %rawVolume = OptionsMenu.getCurrentOption($OPTIONS_MENU::ROW_VOLUME); - $pref::Audio::masterVolume = %rawVolume / 100; - - // set the new video mode. - %newRes = OptionsMenu.getCurrentOption($OPTIONS_MENU::ROW_GFXRES); - %newFs = (OptionsMenu.getCurrentOption($OPTIONS_MENU::ROW_FULLSCREEN) $= "Yes"); - %newBpp = "32"; - %rate = getWord($pref::Video::mode, $WORD::REFRESH); - %aa = OptionsMenu.getCurrentOption($OPTIONS_MENU::ROW_AA); - - // even though pref is set by "setVideoMode" we must set it here to handle - // the case of a restart to apply new driver settings - $pref::Video::mode = %newRes SPC %newFs SPC %newBpp SPC %rate SPC %aa; - - // check if Torque will require a restart for the new driver - %oldDriver = $pref::Video::displayDevice; - $pref::Video::displayDevice = OptionsMenu.getCurrentOption($OPTIONS_MENU::ROW_GFXDEVICE); - if (%oldDriver !$= $pref::Video::displayDevice) - { - MessageBoxOKCancel("Change Video Device Now?", - "Changing your video device requires Torque to be restarted. Selecting \"Ok\" will restart Torque with the new settings. Selecting \"Cancel\" will keep the new video settings and apply them next time you restart Torque.", - "restartInstance();", ""); - } - - $pref::Video::mode = %newRes SPC %newFs SPC %newBpp SPC %rate SPC %aa; - configureCanvas(); -} - -/// Reverts all options to the saved preferences. -function revertOptions() -{ - OptionsMenu.loadPrefs(); -} - -/// Looks up the system index of the gfx device from the type. -/// -/// \param %type (string) A string representing the system type of the adapter. -/// \return (int) The index of the adapter if it is found or if there is no -/// device with that type it returns $OPTIONS_MENU::NO_DEVICE -function getGfxDeviceIndex(%type) -{ - %count = GFXInit::getAdapterCount(); - for (%i = 0; %i < %count; %i++) - { - %otherType = GFXInit::getAdapterType(%i); - if (%type $= %otherType) - { - return %i; - } - } - - return $OPTIONS_MENU::NO_DEVICE; -} - -/// Determines if the list contains the given element. -/// -/// \return (bool) True if the element is found in the list, false if it is not. -function listHasElement(%list, %element) -{ - %count = getFieldCount(%list); - for (%i = 0; %i < %count; %i++) - { - %word = getField(%list, %i); - if (%word $= %element) - { - return true; - } - } - - return false; -} - -/// Rounds %n to the nearest whole integer ending in a multiple of five. -/// -/// \param %n (int or float) The number to round. -/// \return (int) %n rounded to the nearest multiple of five. -function mRoundByFive(%n) -{ - return (mFloor((%n + 2.5) / 5) * 5); -} - -/// Determines if the saved preferences indicate running in fullscreen mode. -/// -/// \return (bool) True if the preferences are saved to run in fullscreen or -/// false if saved to run windowed. -function isFullScreen() -{ - %fullscreen = getWord($pref::Video::mode, $WORD::FULLSCREEN); - return (%fullscreen $= "true"); -} - -/// Sets the preference for fullscreen to the indicated value. -/// -/// \param %bool (bool) Specify true to set the preference to fullscreen, false -/// to set it to windowed. -function setFullScreen(%bool) -{ - $pref::Video::resolution = setWord($pref::Video::mode, $WORD::FULLSCREEN, (%bool ? "true" : "false")); -} diff --git a/Templates/Empty/game/core/unifiedShell/OptionsGui.gui b/Templates/Empty/game/core/unifiedShell/OptionsGui.gui deleted file mode 100644 index eadee1d16..000000000 --- a/Templates/Empty/game/core/unifiedShell/OptionsGui.gui +++ /dev/null @@ -1,104 +0,0 @@ -//------------------------------------------------------------------------------ -// Torque Engine -// Copyright (C) GarageGames.com, Inc. -//------------------------------------------------------------------------------ - -//--- OBJECT WRITE BEGIN --- -%guiContent = new GuiControl(OptionsGui) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "1"; - Profile = "GuiDefaultProfile"; - HorizSizing = "width"; - VertSizing = "height"; - position = "0 0"; - Extent = "640 480"; - MinExtent = "8 8"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - - new GuiMLTextCtrl(OptionsInfoDisplay) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "GuiDefaultProfile"; - HorizSizing = "center"; - VertSizing = "bottom"; - position = "160 25"; - Extent = "320 70"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - lineSpacing = "2"; - allowColorChars = "0"; - maxChars = "-1"; - }; - new GuiBitmapCtrl(OptionsMenuBackground) { - canSaveDynamicFields = "1"; - Enabled = "1"; - isContainer = "0"; - Profile = "GuiDefaultProfile"; - HorizSizing = "width"; - VertSizing = "height"; - position = "0 0"; - Extent = "640 480"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - bitmap = getWorkingDirectory() @ "/art/skies/skybox_1.jpg"; - wrap = "0"; - }; - - new GuiControl() { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "1"; - Profile = "GuiDefaultProfile"; - HorizSizing = "center"; - VertSizing = "center"; - position = "0 0"; - Extent = "640 480"; - MinExtent = "8 8"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - - new GuiControl(OptionsButtonHolder) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "1"; - Profile = "GamepadDefaultProfile"; - HorizSizing = "center"; - VertSizing = "top"; - position = "88 380"; - Extent = "464 112"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - }; - - new GuiGameListOptionsCtrl(OptionsMenu) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "DefaultOptionsMenuProfile"; - HorizSizing = "center"; - VertSizing = "bottom"; - position = "160 0"; - Extent = "320 240"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - CallbackOnA = "applyOptions();"; - CallbackOnB = "Canvas.setContent(UnifiedMainMenuGui);"; - CallbackOnY = "revertOptions();"; - hovertime = "1000"; - DebugRender = false; - }; - }; -}; -//--- OBJECT WRITE END --- diff --git a/Templates/Empty/game/core/unifiedShell/images/gamepad_button_a.png b/Templates/Empty/game/core/unifiedShell/images/gamepad_button_a.png deleted file mode 100644 index 9bd0d6f613e237c5f5c1a7f7e15e382fdb3b2f3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2388 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 Hu0mjfp@XFC diff --git a/Templates/Empty/game/core/unifiedShell/images/gamepad_button_x.png b/Templates/Empty/game/core/unifiedShell/images/gamepad_button_x.png deleted file mode 100644 index dc898296d8d51005ba81ddb8c9010f1d25c5646f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2403 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 QvH$=807*qoM6N<$g4mV;00000 diff --git a/Templates/Empty/game/core/unifiedShell/images/listMenuArray.png b/Templates/Empty/game/core/unifiedShell/images/listMenuArray.png deleted file mode 100644 index f31eeb7536c8686d119e953836fd3673cb16a4ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30773 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�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/client/init.cs - - %this.modelList = ""; - - if (isObject(PlayerDatasGroup)) - { - for (%i = 0; %i < PlayerDatasGroup.getCount(); %i++) - { - %obj = PlayerDatasGroup.getObject(%i); - %name = %obj.getName(); - - %name = strreplace(%name, "Data", ""); - echo(%name); - $PICKER::MODEL[%name] = %obj.shapeFile; - - %this.modelList = %this.modelList @ %name @ "\t"; - } - } - - %this.setOptions($PICKER::ROW_OBJECT, %this.modelList); - - %this.setOptions($PICKER::ROW_MOUNT, "Default\tRocket Launcher"); - - // Initialize the currently selected object here - if ($pref::Player:PlayerDB $= "") - $pref::Player:PlayerDB = getField(%this.modelList, 0) @ "Data"; - - %db = strreplace($pref::Player:PlayerDB, "Data", ""); - - //PickerObjectView.setModel($PICKER::MODEL[%db]); - - if ($pref::Player:Weapon $= "") - $pref::Player:Weapon = "Default"; - - - PickerObjectView.setMount($PICKER::WEAPON[$pref::Player:Weapon],0); - PickerObjectView.setOrbitDistance(3); - - %this.selectOption($PICKER::ROW_OBJECT, %db); - %this.selectOption($PICKER::ROW_MOUNT, $pref::Player:Weapon); -} - -function PickerMenu::setPlayer(%this) -{ - %selected = PickerMenu.getCurrentOption($PICKER::ROW_OBJECT); - - if (%selected $= "Default") - %selected = "DefaultPlayer"; - - $pref::Player:PlayerDB = %selected @ "Data"; - - %selected = PickerMenu.getCurrentOption($PICKER::ROW_MOUNT); - - $pref::Player:Weapon = %selected; - - Canvas.setContent(UnifiedMainMenuGui); -} - -//------------------------------------------------------------------------------ -// callbacks from PickerMenu -//------------------------------------------------------------------------------ - -/// Callback when the primary object model is changed. -/// -/// \param %direction (string) "LEFT" or "RIGHT" indicating the direction the -/// option changed. -function onModelChange(%direction) -{ - %selected = PickerMenu.getCurrentOption($PICKER::ROW_OBJECT); - PickerObjectView.setModel($PICKER::MODEL[%selected]); - PickerObjectView.setOrbitDistance(3); - PickerInfoDisplay.update(); -} - -/// Callback when the mounted object model is changed. -/// -/// \param %direction (string) "LEFT" or "RIGHT" indicating the direction the -/// option changed. -function onMountChange(%direction) -{ - %selected = PickerMenu.getCurrentOption($PICKER::ROW_MOUNT); - PickerObjectView.setMount($PICKER::WEAPON[%selected],0); - $pref::Player:Weapon = %selected; - - PickerInfoDisplay.update(); -} - -//------------------------------------------------------------------------------ -// PickerInfoDisplay methods -//------------------------------------------------------------------------------ - -/// Updates the information display to show information about the currently -/// selected objects. -function PickerInfoDisplay::update(%this) -{ - %objectName = PickerMenu.getCurrentOption($PICKER::ROW_OBJECT); - %mountName = PickerMenu.getCurrentOption($PICKER::ROW_MOUNT); - %this.setText(""); - %this.addText("", false); - %this.addText("Selected Objects
", false); - %this.addText("Object:" TAB %objectName @ "
", false); - %this.addText("Mounted Object:" TAB %mountName @ "
", false); - %this.forceReflow(); -} - -/// Callback when this control wakes up -function PickerInfoDisplay::onWake(%this) -{ - %this.update(); -} - -//------------------------------------------------------------------------------ -// PickerButtonHolder methods -//------------------------------------------------------------------------------ - -function PickerButtonHolder::onWake(%this) -{ - %this.add(GamepadButtonsGui); - - GamepadButtonsGui.setButton($BUTTON_A, "Accept", PickerMenu.CallbackOnA); - GamepadButtonsGui.setButton($BUTTON_B, "Go Back", PickerMenu.CallbackOnB); -} diff --git a/Templates/Full/game/core/unifiedShell/ObjectPickerGui.gui b/Templates/Full/game/core/unifiedShell/ObjectPickerGui.gui deleted file mode 100644 index e431b5781..000000000 --- a/Templates/Full/game/core/unifiedShell/ObjectPickerGui.gui +++ /dev/null @@ -1,82 +0,0 @@ -//------------------------------------------------------------------------------ -// Torque Engine -// Copyright (C) GarageGames.com, Inc. -//------------------------------------------------------------------------------ - -//--- OBJECT WRITE BEGIN --- -%guiContent = new GuiControl(ObjectPickerGui) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "1"; - Profile = "GuiDefaultProfile"; - HorizSizing = "width"; - VertSizing = "height"; - position = "0 0"; - Extent = "640 480"; - MinExtent = "8 8"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - - new GuiBitmapCtrl(PickerBackground) { - canSaveDynamicFields = "1"; - isContainer = "0"; - Profile = "GuiDefaultProfile"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "0 0"; - Extent = "640 480"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - bitmap = getWorkingDirectory() @ "/art/skies/skybox_1.jpg"; - wrap = "0"; - }; - new GuiGameListOptionsCtrl(PickerMenu) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "DefaultOptionsMenuProfile"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "20 185"; - Extent = "320 186"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - CallbackOnA = "PickerMenu.setPlayer();"; - CallbackOnB = "Canvas.setContent(UnifiedMainMenuGui);"; - hovertime = "1000"; - DebugRender = false; - }; - new GuiMLTextCtrl(PickerInfoDisplay) { - Profile = "GuiDefaultProfile"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "350 185"; - Extent = "240 56"; - }; - new GuiObjectView(PickerObjectView) { - Profile = "GuiDefaultProfile"; - HorizSizing = "relative"; - VertSizing = "relative"; - position = "230 0"; - Extent = "180 180"; - }; - new GuiControl(PickerButtonHolder) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "1"; - Profile = "GamepadDefaultProfile"; - HorizSizing = "center"; - VertSizing = "top"; - position = "88 368"; - Extent = "464 112"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - }; -}; -//--- OBJECT WRITE END --- diff --git a/Templates/Full/game/core/unifiedShell/OptionsGui.cs b/Templates/Full/game/core/unifiedShell/OptionsGui.cs deleted file mode 100644 index 2a946bc8f..000000000 --- a/Templates/Full/game/core/unifiedShell/OptionsGui.cs +++ /dev/null @@ -1,380 +0,0 @@ -//----------------------------------------------------------------------------- -// 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. -//----------------------------------------------------------------------------- - -//------------------------------------------------------------------------------ -// global vars -//------------------------------------------------------------------------------ - -$OPTIONS_MENU::NO_DEVICE = -1; ///< Indicates there is no specified device -$OPTIONS_MENU::ROW_GFXDEVICE = 0; ///< Row to choose gfx device -$OPTIONS_MENU::ROW_GFXRES = 1; ///< Row to choose gfx resolution -$OPTIONS_MENU::ROW_FULLSCREEN = 2; ///< Row to choose fullscreen or not -$OPTIONS_MENU::ROW_VOLUME = 3; ///< Row to set audio volume -$OPTIONS_MENU::ROW_AA = 4; ///< Row to set AA - -//------------------------------------------------------------------------------ -// OptionsMenu methods -//------------------------------------------------------------------------------ - -/// Callback when this gui is added to the sim. -function OptionsMenu::onAdd(%this) -{ - %deviceList = %this.getGfxDeviceList(); - %this.addRow("Adapter", %deviceList, true, "onGfxDeviceChange", 0, 0, false); - - %resList = %this.getGfxResList(isFullScreen()); - %this.addRow("Resolution", %resList, false, "", 0, -15); - - %yesNoList = "Yes\tNo"; - %this.addRow("Fullscreen", %yesNoList, true, "onFullscreenChange", 0, -15); - - %volumeList = %this.getSfxVolumeList(); - %this.addRow("Volume", %volumeList, false, "onVolumeChange", 0, -15, false); - - %aaList = %this.getAAList(); - %this.addRow("Antialias", %aaList, false, "", 0, -15); -} - -/// Callback when the control wakes up. -function OptionsMenu::onWake(%this) -{ - %this.loadPrefs(); -} - -/// Initializes each row on this control to reflect the state of saved prefs. -function OptionsMenu::loadPrefs(%this) -{ - // init the display adapter chooser - %this.selectOption($OPTIONS_MENU::ROW_GFXDEVICE, $pref::Video::displayDevice); - OptionsInfoDisplay.displayGfxDevice(); - - // init the display resolution chooser - %currRes = getWords($pref::Video::mode, $WORD::RES_X, $WORD::RES_Y); - %this.selectOption($OPTIONS_MENU::ROW_GFXRES, %currRes); - - // init the fullscreen chooser - %fullscreen = (isFullScreen()) ? "Yes" : "No"; - %this.selectOption($OPTIONS_MENU::ROW_FULLSCREEN, %fullscreen); - - // init the master volume - %volume = mRoundByFive($pref::Audio::masterVolume * 100); - %this.selectOption($OPTIONS_MENU::ROW_VOLUME, %volume); - - %currAA = getWord($pref::Video::mode, $WORD::AA); - %this.selectOption($OPTIONS_MENU::ROW_AA, %currAA); -} - -/// Gets a tab separated list of all the graphics devices available. The list -/// will not include the null device by default but you may request to have the -/// null device included. Devices are listed by type. -/// -/// \param %includeNull (bool) [optional] Specify true to include the null -/// device in the list. Default is false. -/// \return (string) A tab separated list of the avilable graphics devices. -function OptionsMenu::getGfxDeviceList(%this, %includeNull) -{ - %count = GFXInit::getAdapterCount(); - %list = ""; - for (%i = 0; %i < %count; %i++) - { - %type = GFXInit::getAdapterType(%i); - if ((%includeNull) || (%type !$= "NullDevice")) - { - %list = %list TAB %type; - } - } - return trim(%list); -} - -/// Gets a tab separated list of available graphics resolutions. The resolutions -/// will be those available for the settings currently shown on the options -/// screen. -/// -/// \param %fullscreen (bool) Specify true to get a list of all resolutions or -/// false to prune out resolutions that won't fit nicely on the desktop. -/// \return (string) A tab separated list of available graphics resolutions. -function OptionsMenu::getGfxResList(%this, %fullscreen) -{ - %type = %this.getCurrentOption($OPTIONS_MENU::ROW_GFXDEVICE); - %adapter = getGfxDeviceIndex(%type); - - %deskRes = getDesktopResolution(); - %deskResX = firstWord(%deskRes); - %deskResY = getWord(%deskRes, 1); - - %list = ""; - %count = GFXInit::getAdapterModeCount(%adapter); - for (%i = 0; %i < %count; %i++) - { - %rawRes = GFXInit::getAdapterMode(%adapter, %i); - %resX = firstWord(%rawRes); - %resY = getWord(%rawRes, 1); - if (%fullscreen || ((%resX < %deskResX) && (%resY < %deskResY))) - { - %res = %resX SPC %resY; - if (! listHasElement(%list, %res)) - { - %list = %list TAB %res; - } - } - } - - return trim(%list); -} - -/// Refreshes the list of resolutions on the control taking into account the -/// displayed settings for device and fullscreen. -function OptionsMenu::refreshResolutions(%this) -{ - %oldRes = %this.getCurrentOption($OPTIONS_MENU::ROW_GFXRES); - %fullscreen = (%this.getCurrentOption($OPTIONS_MENU::ROW_FULLSCREEN) $= "Yes"); - %newResList = %this.getGfxResList(%fullscreen); - %this.setOptions($OPTIONS_MENU::ROW_GFXRES, %newResList); - %this.selectOption($OPTIONS_MENU::ROW_GFXRES, %oldRes); -} - -/// Builds a list of volume increments suitable for listing on the volume -/// control. List will be from 0 to 100, incrementing by 5. -function OptionsMenu::getSfxVolumeList(%this) -{ - %start = 0; - %end = 100; - %inc = 5; - - %list = ""; - for (%i = %start; %i <= %end; %i += %inc) - { - %list = %list TAB %i; - } - - return trim(%list); -} - -function OptionsMenu::getAAList(%this) -{ - %type = %this.getCurrentOption($OPTIONS_MENU::ROW_GFXDEVICE); - %adapter = getGfxDeviceIndex(%type); - - %list = ""; - %count = GFXInit::getAdapterModeCount(%adapter); - %maxAA = 0; - for (%i = 0; %i < %count; %i++) - { - %rawRes = GFXInit::getAdapterMode(%adapter, %i); - %aa = getWord(%rawRes, $WORD::AA); - if (%aa > %maxAA) - %maxAA = %aa; - } - - %list = ""; - for (%i = 0; %i <= %maxAA; %i++) - { - %list = %list TAB %i; - } - return trim(%list); -} - -//------------------------------------------------------------------------------ -// OptionsButtonHolder methods -//------------------------------------------------------------------------------ - -function OptionsButtonHolder::onWake(%this) -{ - %this.add(GamepadButtonsGui); - - GamepadButtonsGui.setButton($BUTTON_A, "Apply Changes", OptionsMenu.CallbackOnA); - GamepadButtonsGui.setButton($BUTTON_B, "Go Back", OptionsMenu.CallbackOnB); - GamepadButtonsGui.setButton($BUTTON_Y, "Revert Options", OptionsMenu.CallbackOnY); -} - -//------------------------------------------------------------------------------ -// OptionsInfoDisplay methods -//------------------------------------------------------------------------------ - -/// Updates the control to display information on the display device selected on -/// the control for choosing a display device. -function OptionsInfoDisplay::displayGfxDevice(%this) -{ - %type = OptionsMenu.getCurrentOption($OPTIONS_MENU::ROW_GFXDEVICE); - %index = getGfxDeviceIndex(%type); - if (%index != $OPTIONS_MENU::NO_DEVICE) - { - %name = GFXInit::getAdapterName(%index); - %shader = GFXInit::getAdapterShaderModel(%index); - } - else - { - %name = "No valid device of that type"; - %shader = "NA"; - } - %this.setText(""); - %this.addText("", false); - %this.addText("Graphics Device
", false); - %this.addText("Type:" TAB %type @ "
", false); - %this.addText("Device:" TAB %name @ "
", false); - %this.addText("Shader:" TAB %shader @ "
", false); - %this.forceReflow(); -} - -//------------------------------------------------------------------------------ -// callbacks from OptionsMenu -//------------------------------------------------------------------------------ - -/// Callback when the graphics device is changed. This will refresh the lists of -/// resolutions and other related settings. -/// -/// \param %direction (string) "LEFT" or "RIGHT" indicating the direction the -/// option changed. -function onGfxDeviceChange(%direction) -{ - OptionsInfoDisplay.displayGfxDevice(); - $ThisControl.refreshResolutions(); -} - -/// Callback when the fullscreen setting is changed. Refreshes the list of -/// resolutions to reflect what is available. -/// -/// \param %direction (string) "LEFT" or "RIGHT" indicating the direction the -/// option changed. -function onFullscreenChange(%direction) -{ - $ThisControl.refreshResolutions(); -} - -/// Callback when the volume setting is changed. -/// -/// \param %direction (string) "LEFT" or "RIGHT" indicating the direction the -/// option changed. -function onVolumeChange(%direction) -{ - %volume = (OptionsMenu.getCurrentOption($OPTIONS_MENU::ROW_VOLUME) / 100); - sfxSetMasterVolume(%volume); - // TODO: play sample audio blip for user feedback -} - -//------------------------------------------------------------------------------ -// global methods -//------------------------------------------------------------------------------ - -/// Applies the options that have been set. -function applyOptions() -{ - // set the audio options - %rawVolume = OptionsMenu.getCurrentOption($OPTIONS_MENU::ROW_VOLUME); - $pref::Audio::masterVolume = %rawVolume / 100; - - // set the new video mode. - %newRes = OptionsMenu.getCurrentOption($OPTIONS_MENU::ROW_GFXRES); - %newFs = (OptionsMenu.getCurrentOption($OPTIONS_MENU::ROW_FULLSCREEN) $= "Yes"); - %newBpp = "32"; - %rate = getWord($pref::Video::mode, $WORD::REFRESH); - %aa = OptionsMenu.getCurrentOption($OPTIONS_MENU::ROW_AA); - - // even though pref is set by "setVideoMode" we must set it here to handle - // the case of a restart to apply new driver settings - $pref::Video::mode = %newRes SPC %newFs SPC %newBpp SPC %rate SPC %aa; - - // check if Torque will require a restart for the new driver - %oldDriver = $pref::Video::displayDevice; - $pref::Video::displayDevice = OptionsMenu.getCurrentOption($OPTIONS_MENU::ROW_GFXDEVICE); - if (%oldDriver !$= $pref::Video::displayDevice) - { - MessageBoxOKCancel("Change Video Device Now?", - "Changing your video device requires Torque to be restarted. Selecting \"Ok\" will restart Torque with the new settings. Selecting \"Cancel\" will keep the new video settings and apply them next time you restart Torque.", - "restartInstance();", ""); - } - - $pref::Video::mode = %newRes SPC %newFs SPC %newBpp SPC %rate SPC %aa; - configureCanvas(); -} - -/// Reverts all options to the saved preferences. -function revertOptions() -{ - OptionsMenu.loadPrefs(); -} - -/// Looks up the system index of the gfx device from the type. -/// -/// \param %type (string) A string representing the system type of the adapter. -/// \return (int) The index of the adapter if it is found or if there is no -/// device with that type it returns $OPTIONS_MENU::NO_DEVICE -function getGfxDeviceIndex(%type) -{ - %count = GFXInit::getAdapterCount(); - for (%i = 0; %i < %count; %i++) - { - %otherType = GFXInit::getAdapterType(%i); - if (%type $= %otherType) - { - return %i; - } - } - - return $OPTIONS_MENU::NO_DEVICE; -} - -/// Determines if the list contains the given element. -/// -/// \return (bool) True if the element is found in the list, false if it is not. -function listHasElement(%list, %element) -{ - %count = getFieldCount(%list); - for (%i = 0; %i < %count; %i++) - { - %word = getField(%list, %i); - if (%word $= %element) - { - return true; - } - } - - return false; -} - -/// Rounds %n to the nearest whole integer ending in a multiple of five. -/// -/// \param %n (int or float) The number to round. -/// \return (int) %n rounded to the nearest multiple of five. -function mRoundByFive(%n) -{ - return (mFloor((%n + 2.5) / 5) * 5); -} - -/// Determines if the saved preferences indicate running in fullscreen mode. -/// -/// \return (bool) True if the preferences are saved to run in fullscreen or -/// false if saved to run windowed. -function isFullScreen() -{ - %fullscreen = getWord($pref::Video::mode, $WORD::FULLSCREEN); - return (%fullscreen $= "true"); -} - -/// Sets the preference for fullscreen to the indicated value. -/// -/// \param %bool (bool) Specify true to set the preference to fullscreen, false -/// to set it to windowed. -function setFullScreen(%bool) -{ - $pref::Video::resolution = setWord($pref::Video::mode, $WORD::FULLSCREEN, (%bool ? "true" : "false")); -} diff --git a/Templates/Full/game/core/unifiedShell/OptionsGui.gui b/Templates/Full/game/core/unifiedShell/OptionsGui.gui deleted file mode 100644 index eadee1d16..000000000 --- a/Templates/Full/game/core/unifiedShell/OptionsGui.gui +++ /dev/null @@ -1,104 +0,0 @@ -//------------------------------------------------------------------------------ -// Torque Engine -// Copyright (C) GarageGames.com, Inc. -//------------------------------------------------------------------------------ - -//--- OBJECT WRITE BEGIN --- -%guiContent = new GuiControl(OptionsGui) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "1"; - Profile = "GuiDefaultProfile"; - HorizSizing = "width"; - VertSizing = "height"; - position = "0 0"; - Extent = "640 480"; - MinExtent = "8 8"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - - new GuiMLTextCtrl(OptionsInfoDisplay) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "GuiDefaultProfile"; - HorizSizing = "center"; - VertSizing = "bottom"; - position = "160 25"; - Extent = "320 70"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - lineSpacing = "2"; - allowColorChars = "0"; - maxChars = "-1"; - }; - new GuiBitmapCtrl(OptionsMenuBackground) { - canSaveDynamicFields = "1"; - Enabled = "1"; - isContainer = "0"; - Profile = "GuiDefaultProfile"; - HorizSizing = "width"; - VertSizing = "height"; - position = "0 0"; - Extent = "640 480"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - bitmap = getWorkingDirectory() @ "/art/skies/skybox_1.jpg"; - wrap = "0"; - }; - - new GuiControl() { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "1"; - Profile = "GuiDefaultProfile"; - HorizSizing = "center"; - VertSizing = "center"; - position = "0 0"; - Extent = "640 480"; - MinExtent = "8 8"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - - new GuiControl(OptionsButtonHolder) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "1"; - Profile = "GamepadDefaultProfile"; - HorizSizing = "center"; - VertSizing = "top"; - position = "88 380"; - Extent = "464 112"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - }; - - new GuiGameListOptionsCtrl(OptionsMenu) { - canSaveDynamicFields = "0"; - Enabled = "1"; - isContainer = "0"; - Profile = "DefaultOptionsMenuProfile"; - HorizSizing = "center"; - VertSizing = "bottom"; - position = "160 0"; - Extent = "320 240"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - CallbackOnA = "applyOptions();"; - CallbackOnB = "Canvas.setContent(UnifiedMainMenuGui);"; - CallbackOnY = "revertOptions();"; - hovertime = "1000"; - DebugRender = false; - }; - }; -}; -//--- OBJECT WRITE END --- diff --git a/Templates/Full/game/core/unifiedShell/images/gamepad_button_a.png b/Templates/Full/game/core/unifiedShell/images/gamepad_button_a.png deleted file mode 100644 index 9bd0d6f613e237c5f5c1a7f7e15e382fdb3b2f3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2388 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 Hu0mjfp@XFC diff --git a/Templates/Full/game/core/unifiedShell/images/gamepad_button_x.png b/Templates/Full/game/core/unifiedShell/images/gamepad_button_x.png deleted file mode 100644 index dc898296d8d51005ba81ddb8c9010f1d25c5646f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2403 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 QvH$=807*qoM6N<$g4mV;00000 diff --git a/Templates/Full/game/core/unifiedShell/images/listMenuArray.png b/Templates/Full/game/core/unifiedShell/images/listMenuArray.png deleted file mode 100644 index f31eeb7536c8686d119e953836fd3673cb16a4ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30773 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�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