diff --git a/Engine/source/assets/assetManager.cpp b/Engine/source/assets/assetManager.cpp index 9d925d873..30efc47db 100644 --- a/Engine/source/assets/assetManager.cpp +++ b/Engine/source/assets/assetManager.cpp @@ -210,7 +210,7 @@ bool AssetManager::addModuleDeclaredAssets( ModuleDefinition* pModuleDefinition dSprintf(extensionBuffer, sizeof(extensionBuffer), "*.%s", pDeclaredAssets->getExtension()); // Scan declared assets at location. - if ( !scanDeclaredAssets( filePathBuffer, extensionBuffer, pDeclaredAssets->getRecurse(), pModuleDefinition ) ) + if ( !scanDeclaredAssets( filePathBuffer, extensionBuffer, pDeclaredAssets->getRecurse(), pModuleDefinition ) && mEchoInfo) { // Warn. Con::warnf( "AssetManager::addModuleDeclaredAssets() - No assets found at location '%s' with extension '%s'.", filePathBuffer, pDeclaredAssets->getExtension() ); diff --git a/Engine/source/gui/buttons/guiButtonBaseCtrl.cpp b/Engine/source/gui/buttons/guiButtonBaseCtrl.cpp index e5efe0279..6477fde03 100644 --- a/Engine/source/gui/buttons/guiButtonBaseCtrl.cpp +++ b/Engine/source/gui/buttons/guiButtonBaseCtrl.cpp @@ -83,6 +83,8 @@ IMPLEMENT_CALLBACK( GuiButtonBaseCtrl, onMouseDragged, void, (), (), "pressed the left mouse button on the control and then moves the mouse over a certain distance threshold with " "the mouse button still pressed." ); +IMPLEMENT_CALLBACK(GuiButtonBaseCtrl, onHighlighted, void, (bool highlighted), (highlighted), + "Called when the status of the button being highlighted changes."); ImplementEnumType( GuiButtonType, "Type of button control.\n\n" @@ -290,6 +292,7 @@ void GuiButtonBaseCtrl::onMouseEnter(const GuiEvent &event) { mDepressed = true; mHighlighted = true; + onHighlighted_callback(true); } else { @@ -297,6 +300,7 @@ void GuiButtonBaseCtrl::onMouseEnter(const GuiEvent &event) SFX->playOnce(mProfile->getSoundButtonOverProfile()); mHighlighted = true; + onHighlighted_callback(true); } } @@ -311,6 +315,7 @@ void GuiButtonBaseCtrl::onMouseLeave(const GuiEvent &) if( isMouseLocked() ) mDepressed = false; mHighlighted = false; + onHighlighted_callback(false); } //----------------------------------------------------------------------------- diff --git a/Engine/source/gui/buttons/guiButtonBaseCtrl.h b/Engine/source/gui/buttons/guiButtonBaseCtrl.h index 60f76ea4a..e20ebb00f 100644 --- a/Engine/source/gui/buttons/guiButtonBaseCtrl.h +++ b/Engine/source/gui/buttons/guiButtonBaseCtrl.h @@ -73,6 +73,7 @@ class GuiButtonBaseCtrl : public GuiControl DECLARE_CALLBACK( void, onMouseEnter, () ); DECLARE_CALLBACK( void, onMouseLeave, () ); DECLARE_CALLBACK( void, onMouseDragged, () ); + DECLARE_CALLBACK( void, onHighlighted, (bool)); /// @} @@ -95,9 +96,18 @@ class GuiButtonBaseCtrl : public GuiControl bool getStateOn() const { return mStateOn; } void setDepressed( bool depressed ) { mDepressed = depressed; } - void resetState() {mDepressed = false; mHighlighted = false;} + void resetState() + { + mDepressed = false; + mHighlighted = false; + onHighlighted_callback(false); + } - void setHighlighted(bool highlighted) { mHighlighted = highlighted; } + void setHighlighted(bool highlighted) + { + mHighlighted = highlighted; + onHighlighted_callback(highlighted); + } bool isHighlighted() { return mHighlighted; } void acceleratorKeyPress(U32 index); diff --git a/Engine/source/gui/buttons/guiIconButtonCtrl.cpp b/Engine/source/gui/buttons/guiIconButtonCtrl.cpp index 8196d59b0..b9288ec7e 100644 --- a/Engine/source/gui/buttons/guiIconButtonCtrl.cpp +++ b/Engine/source/gui/buttons/guiIconButtonCtrl.cpp @@ -253,7 +253,7 @@ void GuiIconButtonCtrl::renderButton( Point2I &offset, const RectI& updateRect ) if (mProfile->mBorder != 0) renderFilledBorder(boundsRect, borderColor, fillColor, mProfile->mBorderThickness); else - GFX->getDrawUtil()->drawRectFill(boundsRect, mProfile->mFillColor); + GFX->getDrawUtil()->drawRectFill(boundsRect, fillColor); } } else if(mHighlighted && mActive) @@ -269,7 +269,7 @@ void GuiIconButtonCtrl::renderButton( Point2I &offset, const RectI& updateRect ) if (mProfile->mBorder != 0) renderFilledBorder(boundsRect, borderColor, fillColor, mProfile->mBorderThickness); else - GFX->getDrawUtil()->drawRectFill(boundsRect, mProfile->mFillColor); + GFX->getDrawUtil()->drawRectFill(boundsRect, fillColor); } } else @@ -388,6 +388,7 @@ void GuiIconButtonCtrl::renderButton( Point2I &offset, const RectI& updateRect ) start.x = iconRect.extent.x + mButtonMargin.x + mTextMargin; } + drawer->setBitmapModulation(fontColor); drawer->drawText( mProfile->mFont, start + offset, text, mProfile->mFontColors ); } @@ -395,6 +396,7 @@ void GuiIconButtonCtrl::renderButton( Point2I &offset, const RectI& updateRect ) { Point2I start( mTextMargin, ( getHeight() - mProfile->mFont->getHeight() ) / 2 ); + drawer->setBitmapModulation(fontColor); drawer->drawText( mProfile->mFont, start + offset, text, mProfile->mFontColors ); } @@ -408,6 +410,7 @@ void GuiIconButtonCtrl::renderButton( Point2I &offset, const RectI& updateRect ) } else start.set( ( getWidth() - textWidth ) / 2, ( getHeight() - mProfile->mFont->getHeight() ) / 2 ); + drawer->setBitmapModulation( fontColor ); drawer->drawText( mProfile->mFont, start + offset, text, mProfile->mFontColors ); } diff --git a/Engine/source/gui/core/guiControl.cpp b/Engine/source/gui/core/guiControl.cpp index 37102adf2..a5e21a984 100644 --- a/Engine/source/gui/core/guiControl.cpp +++ b/Engine/source/gui/core/guiControl.cpp @@ -218,7 +218,8 @@ GuiControl::GuiControl() : mAddGroup( NULL ), mLangTable(NULL), mFirstResponder(NULL), mHorizSizing(horizResizeRight), - mVertSizing(vertResizeBottom) + mVertSizing(vertResizeBottom), + mCategory(StringTable->EmptyString()) { mConsoleVariable = StringTable->EmptyString(); mAcceleratorKey = StringTable->EmptyString(); @@ -294,6 +295,10 @@ void GuiControl::initPersistFields() addField("accelerator", TypeString, Offset(mAcceleratorKey, GuiControl), "Key combination that triggers the control's primary action when the control is on the canvas." ); + addField("category", TypeString, Offset(mCategory, GuiControl), + "Name of the category this gui control should be grouped into for organizational purposes. Primarily for tooling."); + + endGroup( "Control" ); addGroup( "ToolTip" ); diff --git a/Engine/source/gui/core/guiControl.h b/Engine/source/gui/core/guiControl.h index e0b3c0a76..fdd987468 100644 --- a/Engine/source/gui/core/guiControl.h +++ b/Engine/source/gui/core/guiControl.h @@ -218,6 +218,8 @@ class GuiControl : public SimGroup String mAltConsoleCommand; String mTooltip; + + StringTableEntry mCategory; /// @} diff --git a/Engine/source/gui/editor/guiInspectorTypes.cpp b/Engine/source/gui/editor/guiInspectorTypes.cpp index 8da27c273..49d693523 100644 --- a/Engine/source/gui/editor/guiInspectorTypes.cpp +++ b/Engine/source/gui/editor/guiInspectorTypes.cpp @@ -40,6 +40,7 @@ #include "gui/editor/editorFunctions.h" #include "math/mEase.h" #include "math/mathTypes.h" +#include "sim/actionMap.h" //----------------------------------------------------------------------------- @@ -60,7 +61,7 @@ GuiControl* GuiInspectorTypeMenuBase::constructEditControl() GuiPopUpMenuCtrl *menu = dynamic_cast(retCtrl); // Let's make it look pretty. - retCtrl->setDataField( StringTable->insert("profile"), NULL, "GuiPopUpMenuProfile" ); + retCtrl->setDataField( StringTable->insert("profile"), NULL, "ToolsGuiPopupMenuProfile" ); _registerEditControl( retCtrl ); // Configure it to update our value when the popup is closed @@ -387,6 +388,44 @@ void GuiInspectorTypeGuiProfile::consoleInit() ConsoleBaseType::getType( TYPEID< GuiControlProfile >() )->setInspectorFieldType("GuiInspectorTypeGuiProfile"); } +//----------------------------------------------------------------------------- +// GuiInspectorTypeActionMap +//----------------------------------------------------------------------------- +IMPLEMENT_CONOBJECT(GuiInspectorTypeActionMap); + +ConsoleDocClass(GuiInspectorTypeActionMap, + "@brief Inspector field type for ActionMap\n\n" + "Editor use only.\n\n" + "@internal" +); + +void GuiInspectorTypeActionMap::_populateMenu(GuiPopUpMenuCtrl* menu) +{ + // Add the action maps to the menu. + //First add a blank entry so you can clear the action map + menu->addEntry("", 0); + + SimGroup* grp = Sim::getRootGroup(); + SimSetIterator iter(grp); + for (; *iter; ++iter) + { + ActionMap* actionMap = dynamic_cast(*iter); + if (!actionMap) + continue; + + menu->addEntry(actionMap->getName(), actionMap->getId()); + } + + menu->sort(); +} + +void GuiInspectorTypeActionMap::consoleInit() +{ + Parent::consoleInit(); + + ConsoleBaseType::getType(TYPEID< ActionMap >())->setInspectorFieldType("GuiInspectorTypeActionMap"); +} + //----------------------------------------------------------------------------- // GuiInspectorTypeCheckBox //----------------------------------------------------------------------------- diff --git a/Engine/source/gui/editor/guiInspectorTypes.h b/Engine/source/gui/editor/guiInspectorTypes.h index 31b21a186..d5cb90f93 100644 --- a/Engine/source/gui/editor/guiInspectorTypes.h +++ b/Engine/source/gui/editor/guiInspectorTypes.h @@ -186,6 +186,20 @@ public: virtual void _populateMenu( GuiPopUpMenuCtrl *menu ); }; +//----------------------------------------------------------------------------- +// GuiInspectorTypeActionMap Class +//----------------------------------------------------------------------------- +class GuiInspectorTypeActionMap : public GuiInspectorTypeMenuBase +{ +private: + typedef GuiInspectorTypeMenuBase Parent; +public: + DECLARE_CONOBJECT(GuiInspectorTypeActionMap); + static void consoleInit(); + + virtual void _populateMenu(GuiPopUpMenuCtrl* menu); +}; + //----------------------------------------------------------------------------- // GuiInspectorTypeCheckBox Class //----------------------------------------------------------------------------- diff --git a/Engine/source/gui/utility/guiInputCtrl.cpp b/Engine/source/gui/utility/guiInputCtrl.cpp index f5f41b486..31d2a2e86 100644 --- a/Engine/source/gui/utility/guiInputCtrl.cpp +++ b/Engine/source/gui/utility/guiInputCtrl.cpp @@ -64,6 +64,7 @@ GuiInputCtrl::GuiInputCtrl() mSendModifierEvents(false), mIgnoreMouseEvents(false) { + mActionmap = nullptr; } //------------------------------------------------------------------------------ @@ -80,6 +81,7 @@ void GuiInputCtrl::initPersistFields() "If true, Make events will be sent for modifier keys (Default false)."); addField("ignoreMouseEvents", TypeBool, Offset(mIgnoreMouseEvents, GuiInputCtrl), "If true, any events from mouse devices will be passed through."); + addField("actionMap", TYPEID(), Offset(mActionmap, GuiInputCtrl), "The name of an action map to push/pop on the input stack alongside the wake/sleep of this control."); endGroup("GuiInputCtrl"); Parent::initPersistFields(); @@ -103,6 +105,12 @@ bool GuiInputCtrl::onWake() if( !smDesignTime && !mIgnoreMouseEvents) mouseLock(); + + if(mActionmap != nullptr) + { + SimSet* actionMapSet = Sim::getActiveActionMapSet(); + actionMapSet->pushObject(mActionmap); + } setFirstResponder(); @@ -115,6 +123,13 @@ void GuiInputCtrl::onSleep() { Parent::onSleep(); mouseUnlock(); + + if (mActionmap != nullptr) + { + SimSet* actionMapSet = Sim::getActiveActionMapSet(); + actionMapSet->removeObject(mActionmap); + } + clearFirstResponder(); } @@ -158,6 +173,9 @@ bool GuiInputCtrl::onInputEvent( const InputEventInfo &event ) if (mIgnoreMouseEvents && event.deviceType == MouseDeviceType) return false; + if (mActionmap != nullptr) + return false; + char deviceString[32]; if ( event.action == SI_MAKE ) { diff --git a/Engine/source/gui/utility/guiInputCtrl.h b/Engine/source/gui/utility/guiInputCtrl.h index 269569693..5b87cc53f 100644 --- a/Engine/source/gui/utility/guiInputCtrl.h +++ b/Engine/source/gui/utility/guiInputCtrl.h @@ -26,6 +26,7 @@ #ifndef _GUIMOUSEEVENTCTRL_H_ #include "gui/utility/guiMouseEventCtrl.h" #endif +#include "sim/actionMap.h" /// A control that locks the mouse and reports all keyboard input events @@ -38,6 +39,8 @@ protected: bool mSendModifierEvents; bool mIgnoreMouseEvents; + ActionMap* mActionmap; + public: typedef GuiMouseEventCtrl Parent; diff --git a/Engine/source/sim/actionMap.cpp b/Engine/source/sim/actionMap.cpp index 19e56315d..2e9c3b0e7 100644 --- a/Engine/source/sim/actionMap.cpp +++ b/Engine/source/sim/actionMap.cpp @@ -729,7 +729,8 @@ bool ActionMap::nextBoundNode( const char* function, U32 &devMapIndex, U32 &node for ( U32 j = nodeIndex; j < dvcMap->nodeMap.size(); j++ ) { const Node* node = &dvcMap->nodeMap[j]; - if ( !( node->flags & Node::BindCmd ) && ( dStricmp( function, node->consoleFunction ) == 0 ) ) + if ( ( (node->flags & Node::BindCmd) && (dStricmp(function, node->makeConsoleCommand) == 0 || dStricmp(function, node->breakConsoleCommand) == 0) ) + || (!(node->flags & Node::BindCmd) && dStricmp( function, node->consoleFunction ) == 0 ) ) { devMapIndex = i; nodeIndex = j; @@ -1805,6 +1806,7 @@ bool ActionMap::handleEvent(const InputEventInfo* pEvent) for (SimSet::iterator itr = pActionMapSet->end() - 1; itr > pActionMapSet->begin(); itr--) { ActionMap* pMap = static_cast(*itr); + if (pMap->processAction(pEvent) == true) return true; } diff --git a/Templates/BaseGame/game/core/console/scripts/profiles.tscript b/Templates/BaseGame/game/core/console/scripts/profiles.tscript index 097ae7da6..98a407643 100644 --- a/Templates/BaseGame/game/core/console/scripts/profiles.tscript +++ b/Templates/BaseGame/game/core/console/scripts/profiles.tscript @@ -52,7 +52,7 @@ new GuiControlProfile(GuiConsoleTextProfile) category = "Core"; }; -$ConsoleDefaultFillColor = "12 14 19 175"; +$ConsoleDefaultFillColor = "0 0 0 175"; if(!isObject(ConsoleScrollProfile)) new GuiControlProfile(ConsoleScrollProfile : GuiScrollProfile) diff --git a/Templates/BaseGame/game/core/gui/scripts/profiles.tscript b/Templates/BaseGame/game/core/gui/scripts/profiles.tscript index 199d943eb..fe02febfa 100644 --- a/Templates/BaseGame/game/core/gui/scripts/profiles.tscript +++ b/Templates/BaseGame/game/core/gui/scripts/profiles.tscript @@ -147,25 +147,31 @@ new GuiControlProfile(GuiTextEditProfile) category = "Core"; }; -if(!isObject(GuiMenuScrollProfile)) -new GuiControlProfile(GuiMenuScrollProfile) +if(!isObject(GuiScrollProfile)) +new GuiControlProfile(GuiScrollProfile) { - opaque = true; - fontColor = $TextMediumEmphasisColor; - fontColorHL = $TextMediumEmphasisColor; - fontColorNA = $TextDisabledColor; - fontColorSEL = $TextMediumEmphasisColor; - fillColor = "40 40 40"; + opaque = "0"; + fontColor = "200 200 200 255"; + fontColorHL = "200 200 200 255"; + fontColorNA = "108 108 108 255"; + fontColorSEL = "200 200 200 255"; + fillColor = "0 0 0 0"; fillColorHL = "56 56 56"; fillColorNA = "40 40 40"; borderColor = "87 87 87"; borderColorNA = "0 0 0"; borderColorHL = "255 255 255"; - border = true; + border = "0"; bitmapAsset = "Core_GUI:scrollBar_image"; hasBitmapArray = true; category = "Core"; fontSize = 15; + fontColors[0] = "200 200 200 255"; + fontColors[1] = "200 200 200 255"; + fontColors[2] = "108 108 108 255"; + fontColors[3] = "200 200 200 255"; + fontColors[8] = "Fuchsia"; + fontColors[9] = "255 0 255 255"; }; if(!isObject(GuiOverlayProfile)) @@ -261,3 +267,24 @@ new GuiControlProfile(GuiScrollProfile) bitmapAsset = "Core_GUI:scrollBar_image"; category = "Core"; }; + +// --------------------------------------------------------------------------- +singleton GuiControlProfile( GuiInputCtrlProfile ) +{ + tab = true; + canKeyFocus = true; + category = "Core"; +}; + +singleton GuiControlProfile (GuiTextProfile) +{ + justify = "left"; + fontColor = "20 20 20"; + category = "Core"; +}; + +singleton GuiControlProfile (GuiTextRightProfile : GuiTextProfile) +{ + justify = "right"; + category = "Core"; +}; \ No newline at end of file diff --git a/Templates/BaseGame/game/core/rendering/scripts/graphicsOptions.tscript b/Templates/BaseGame/game/core/rendering/scripts/graphicsOptions.tscript index 19b7f50cd..42d6bef5f 100644 --- a/Templates/BaseGame/game/core/rendering/scripts/graphicsOptions.tscript +++ b/Templates/BaseGame/game/core/rendering/scripts/graphicsOptions.tscript @@ -1,4 +1,4 @@ -function GraphicsQualityLevel::isCurrent( %this ) +function OptionsQualityLevel::isCurrent( %this ) { // Test each pref to see if the current value // equals our stored value. @@ -15,7 +15,7 @@ function GraphicsQualityLevel::isCurrent( %this ) return true; } -function GraphicsQualityLevel::apply( %this ) +function OptionsQualityLevel::apply( %this ) { for ( %i=0; %i < %this.count(); %i++ ) { @@ -36,7 +36,7 @@ function GraphicsQualityLevel::apply( %this ) } } -function GraphicsOptionsMenuGroup::applySetting(%this, %settingName) +function OptionsSettings::applySetting(%this, %settingName) { for(%i=0; %i < %this.getCount(); %i++) { @@ -54,573 +54,1092 @@ function GraphicsOptionsMenuGroup::applySetting(%this, %settingName) } } -new SimGroup( MeshQualityGroup ) -{ - class = "GraphicsOptionsMenuGroup"; +//Primary Group(Video, Audio, Controls) +//Sub Grouping(Basic, Advanced, or Display, Graphics) + +new SimGroup(VideoSettingsGroup) +{ + class = "PrimaryOptionsGroup"; + displayName = "Video"; - new ArrayObject() + new SimGroup(VideoDisplaySettingsGroup) { - class = "GraphicsQualityLevel"; - caseSensitive = true; + class = "SubOptionsGroup"; + displayName = "Display Settings"; - displayName = "High"; - - key["$pref::TS::detailAdjust"] = 1.5; - key["$pref::TS::skipRenderDLs"] = 0; - }; - new ArrayObject( ) - { - class = "GraphicsQualityLevel"; - caseSensitive = true; + new SimGroup( VideoAPISettingsGroup ) + { + class = "OptionsSettings"; + OptionName = "Display API"; + requiresRestart = true; + }; - displayName = "Medium"; + new SimGroup( DisplayDevicesGroup ) + { + class = "OptionsSettings"; + OptionName = "Display Devices"; + }; + + new SimGroup( DisplayModeGroup ) + { + class = "OptionsSettings"; + OptionName = "Display Mode"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "Windowed"; - key["$pref::TS::detailAdjust"] = 1.0; - key["$pref::TS::skipRenderDLs"] = 0; + key["$pref::Video::deviceMode"] = 0; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "Borderless"; + + key["$pref::Video::deviceMode"] = 1; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "Fullscreen"; + + key["$pref::Video::deviceMode"] = 2; + }; + }; + + new SimGroup ( DisplayResSettingsGroup ) + { + class = "OptionsSettings"; + OptionName = "Display Resolution"; + }; + + new SimGroup ( VSyncSettingsGroup ) + { + class = "OptionsSettings"; + OptionName = "VSync"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "Off"; + + key["$pref::Video::enableVerticalSync"] = 0; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "On"; + + key["$pref::Video::enableVerticalSync"] = 1; + }; + }; + + new SimGroup ( DisplayRefreshSettingsGroup ) + { + class = "OptionsSettings"; + OptionName = "Refresh Rate"; + }; }; - new ArrayObject() + + //General quality settings + new SimGroup() { - class = "GraphicsQualityLevel"; - caseSensitive = true; + class = "SubOptionsGroup"; + displayName = "Object Quality"; - displayName = "Low"; + new SimGroup( MeshDetailSettingsGroup ) + { + class = "OptionsSettings"; + + OptionName = "Mesh Detail"; + Description = "Controls the max quality of mesh objects"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; - key["$pref::TS::detailAdjust"] = 0.75; - key["$pref::TS::skipRenderDLs"] = 0; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Lowest"; - - key["$pref::TS::detailAdjust"] = 0.5; - key["$pref::TS::skipRenderDLs"] = 1; - }; -}; - -new SimGroup( MeshDrawDistQualityGroup ) -{ - class = "GraphicsOptionsMenuGroup"; - - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "High"; - - key["$pref::useStaticObjectFade"] = false; - key["$pref::staticObjectFadeStart"] = 75; - key["$pref::staticObjectFadeEnd"] = 100; - key["$pref::staticObjectUnfadeableSize"] = 75; - - }; - new ArrayObject( ) - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Medium"; - - key["$pref::useStaticObjectFade"] = true; - key["$pref::staticObjectFadeStart"] = 75; - key["$pref::staticObjectFadeEnd"] = 100; - key["$pref::staticObjectUnfadeableSize"] = 75; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Low"; + displayName = "Lowest"; - key["$pref::useStaticObjectFade"] = true; - key["$pref::staticObjectFadeStart"] = 50; - key["$pref::staticObjectFadeEnd"] = 75; - key["$pref::staticObjectUnfadeableSize"] = 100; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Lowest"; - - key["$pref::useStaticObjectFade"] = true; - key["$pref::staticObjectFadeStart"] = 25; - key["$pref::staticObjectFadeEnd"] = 50; - key["$pref::staticObjectUnfadeableSize"] = 200; - }; -}; - -new SimGroup( TextureQualityGroup ) -{ - class = "GraphicsOptionsMenuGroup"; - - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "High"; - - key["$pref::Video::textureReductionLevel"] = 0; - key["$pref::Reflect::refractTexScale"] = 1.25; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Medium"; - - key["$pref::Video::textureReductionLevel"] = 0; - key["$pref::Reflect::refractTexScale"] = 1; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Low"; + key["$pref::TS::detailAdjust"] = 0.5; + key["$pref::TS::skipRenderDLs"] = 1; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; - key["$pref::Video::textureReductionLevel"] = 1; - key["$pref::Reflect::refractTexScale"] = 0.75; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Lowest"; - - key["$pref::Video::textureReductionLevel"] = 2; - key["$pref::Reflect::refractTexScale"] = 0.5; - }; -}; - -new SimGroup( GroundCoverDensityGroup ) -{ - class = "GraphicsOptionsMenuGroup"; - - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "High"; - - key["$pref::GroundCover::densityScale"] = 1.0; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Medium"; - - key["$pref::GroundCover::densityScale"] = 0.75; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Low"; + displayName = "Low"; + + key["$pref::TS::detailAdjust"] = 0.75; + key["$pref::TS::skipRenderDLs"] = 0; + }; + new ArrayObject( ) + { + class = "OptionsQualityLevel"; + caseSensitive = true; - key["$pref::GroundCover::densityScale"] = 0.5; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Lowest"; + displayName = "Medium"; - key["$pref::GroundCover::densityScale"] = 0.25; - }; -}; - -new SimGroup( DecalLifetimeGroup ) -{ - class = "GraphicsOptionsMenuGroup"; - - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "High"; - - key["$pref::decalMgr::enabled"] = true; - key["$pref::Decals::lifeTimeScale"] = 1; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Medium"; - - key["$pref::decalMgr::enabled"] = true; - key["$pref::Decals::lifeTimeScale"] = 0.5; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Low"; - - key["$pref::decalMgr::enabled"] = true; - key["$pref::Decals::lifeTimeScale"] = 0.25; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "None"; - - key["$pref::decalMgr::enabled"] = false; - }; -}; - -new SimGroup( TerrainQualityGroup ) -{ - class = "GraphicsOptionsMenuGroup"; - - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "High"; - - key["$pref::Terrain::lodScale"] = 0.75; - key["$pref::Terrain::detailScale"] = 1.5; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Medium"; - - key["$pref::Terrain::lodScale"] = 1.0; - key["$pref::Terrain::detailScale"] = 1.0; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Low"; + key["$pref::TS::detailAdjust"] = 1.0; + key["$pref::TS::skipRenderDLs"] = 0; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; - key["$pref::Terrain::lodScale"] = 1.5; - key["$pref::Terrain::detailScale"] = 0.75; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Lowest"; - - key["$pref::Terrain::lodScale"] = 2.0; - key["$pref::Terrain::detailScale"] = 0.5; - }; -}; + displayName = "High"; -//Shadows and Lighting -new SimGroup( ShadowQualityList ) -{ - class = "GraphicsOptionsMenuGroup"; - - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; + key["$pref::TS::detailAdjust"] = 1.5; + key["$pref::TS::skipRenderDLs"] = 0; + }; + }; - displayName = "High"; - - key["$pref::lightManager"] = "Advanced Lighting"; - key["$pref::Shadows::disable"] = false; - key["$pref::Shadows::textureScalar"] = 1.0; - key["$pref::PSSM::detailAdjustScale"] = 1.0; - key["$pref::allowLocalLightShadows"] = true; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Medium"; - - key["$pref::lightManager"] = "Advanced Lighting"; - key["$pref::Shadows::disable"] = false; - key["$pref::Shadows::textureScalar"] = 0.5; - key["$pref::PSSM::detailAdjustScale"] = 0.5; - key["$pref::allowLocalLightShadows"] = true; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Low"; + new SimGroup( MeshDrawDistQualityGroup ) + { + class = "OptionsSettings"; + OptionName = "Mesh Draw Distance"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Lowest"; + + key["$pref::useStaticObjectFade"] = true; + key["$pref::staticObjectFadeStart"] = 25; + key["$pref::staticObjectFadeEnd"] = 50; + key["$pref::staticObjectUnfadeableSize"] = 200; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Low"; - key["$pref::lightManager"] = "Advanced Lighting"; - key["$pref::Shadows::disable"] = false; - key["$pref::Shadows::textureScalar"] = 0.25; - key["$pref::PSSM::detailAdjustScale"] = 0.25; - key["$pref::allowLocalLightShadows"] = false; + key["$pref::useStaticObjectFade"] = true; + key["$pref::staticObjectFadeStart"] = 50; + key["$pref::staticObjectFadeEnd"] = 75; + key["$pref::staticObjectUnfadeableSize"] = 100; + }; + new ArrayObject( ) + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Medium"; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "None"; - - key["$pref::lightManager"] = "Advanced Lighting"; - key["$pref::Shadows::disable"] = true; - key["$pref::Shadows::textureScalar"] = 0.5; - key["$pref::allowLocalLightShadows"] = false; - }; -}; + key["$pref::useStaticObjectFade"] = true; + key["$pref::staticObjectFadeStart"] = 75; + key["$pref::staticObjectFadeEnd"] = 100; + key["$pref::staticObjectUnfadeableSize"] = 75; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "High"; -new SimGroup( ShadowDistanceList ) -{ - class = "GraphicsOptionsMenuGroup"; - - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Highest"; - - key["$pref::Shadows::drawDistance"] = 1; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "High"; - - key["$pref::Shadows::drawDistance"] = 0.75; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Medium"; + key["$pref::useStaticObjectFade"] = false; + key["$pref::staticObjectFadeStart"] = 75; + key["$pref::staticObjectFadeEnd"] = 100; + key["$pref::staticObjectUnfadeableSize"] = 75; - key["$pref::Shadows::drawDistance"] = 0.5; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Low"; + }; + }; + + new SimGroup( TextureQualityGroup ) + { + class = "OptionsSettings"; + OptionName = "Texture Quality"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Lowest"; + + key["$pref::Video::textureReductionLevel"] = 2; + key["$pref::Reflect::refractTexScale"] = 0.5; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Low"; - key["$pref::Shadows::drawDistance"] = 0.25; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Lowest"; - - key["$pref::Shadows::drawDistance"] = 0.1; - }; -}; + key["$pref::Video::textureReductionLevel"] = 1; + key["$pref::Reflect::refractTexScale"] = 0.75; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Medium"; -new SimGroup( LightingQualityList ) -{ - class = "GraphicsOptionsMenuGroup"; - - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Highest"; - - key["$pref::maximumNumOfLights"] = -1; - key["$pref::useLightFade"] = false; - key["$pref::lightFadeStart"] = 50; - key["$pref::lightFadeEnd"] = 75; - }; - - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "High"; - - key["$pref::maximumNumOfLights"] = 15; - key["$pref::useLightFade"] = true; - key["$pref::lightFadeStart"] = 50; - key["$pref::lightFadeEnd"] = 75; - }; - - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Medium"; - - key["$pref::maximumNumOfLights"] = 10; - key["$pref::useLightFade"] = true; - key["$pref::lightFadeStart"] = 25; - key["$pref::lightFadeEnd"] = 50; - }; - - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Low"; + key["$pref::Video::textureReductionLevel"] = 0; + key["$pref::Reflect::refractTexScale"] = 1; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "High"; + + key["$pref::Video::textureReductionLevel"] = 0; + key["$pref::Reflect::refractTexScale"] = 1.25; + }; + }; + + new SimGroup( GroundCoverDensityGroup ) + { + class = "OptionsSettings"; + OptionName = "Ground Cover Density"; + Description = "Density of ground cover items, such as grass"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "Lowest"; + + key["$pref::GroundCover::densityScale"] = 0.25; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "Low"; - key["$pref::maximumNumOfLights"] = 5; - key["$pref::useLightFade"] = true; - key["$pref::lightFadeStart"] = 10; - key["$pref::lightFadeEnd"] = 25; + key["$pref::GroundCover::densityScale"] = 0.5; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "Medium"; - }; -}; + key["$pref::GroundCover::densityScale"] = 0.75; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "High"; -new SimGroup( SoftShadowList ) -{ - class = "GraphicsOptionsMenuGroup"; - - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "High"; + key["$pref::GroundCover::densityScale"] = 1.0; + }; + }; + + new SimGroup( DecalLifetimeGroup ) + { + class = "OptionsSettings"; + OptionName = "Decal Life Time"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "None"; + + key["$pref::decalMgr::enabled"] = false; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Low"; + + key["$pref::decalMgr::enabled"] = true; + key["$pref::Decals::lifeTimeScale"] = 0.25; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Medium"; + + key["$pref::decalMgr::enabled"] = true; + key["$pref::Decals::lifeTimeScale"] = 0.5; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "High"; + + key["$pref::decalMgr::enabled"] = true; + key["$pref::Decals::lifeTimeScale"] = 1; + }; + }; + + new SimGroup( TerrainQualityGroup ) + { + class = "OptionsSettings"; + OptionName = "Terrain Quality"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Lowest"; + + key["$pref::Terrain::lodScale"] = 2.0; + key["$pref::Terrain::detailScale"] = 0.5; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Low"; - key["$pref::Shadows::filterMode"] = "SoftShadowHighQuality"; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Low"; - - key["$pref::Shadows::filterMode"] = "SoftShadow"; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Off"; - - key["$pref::Shadows::filterMode"] = "None"; - }; -}; + key["$pref::Terrain::lodScale"] = 1.5; + key["$pref::Terrain::detailScale"] = 0.75; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Medium"; -new SimGroup( LightDistanceList ) -{ - class = "GraphicsOptionsMenuGroup"; + key["$pref::Terrain::lodScale"] = 1.0; + key["$pref::Terrain::detailScale"] = 1.0; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "High"; + + key["$pref::Terrain::lodScale"] = 0.75; + key["$pref::Terrain::detailScale"] = 1.5; + }; + }; + }; - new ArrayObject() + //Shadows and Lighting + new SimGroup() { - class = "GraphicsQualityLevel"; - caseSensitive = true; + class = "SubOptionsGroup"; + displayName = "Lighting Quality"; - displayName = "Highest"; - - key["$pref::Lights::drawDistance"] = 1; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "High"; - - key["$pref::Lights::drawDistance"] = 0.75; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Medium"; + new SimGroup( ShadowQualityList ) + { + class = "OptionsSettings"; + OptionName = "Shadow Quality"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "None"; + + key["$pref::lightManager"] = "Advanced Lighting"; + key["$pref::Shadows::disable"] = true; + key["$pref::Shadows::textureScalar"] = 0.5; + key["$pref::allowLocalLightShadows"] = false; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Low"; + + key["$pref::lightManager"] = "Advanced Lighting"; + key["$pref::Shadows::disable"] = false; + key["$pref::Shadows::textureScalar"] = 0.25; + key["$pref::PSSM::detailAdjustScale"] = 0.25; + key["$pref::allowLocalLightShadows"] = false; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Medium"; - key["$pref::Lights::drawDistance"] = 0.5; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Low"; - - key["$pref::Lights::drawDistance"] = 0.25; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; - - displayName = "Lowest"; - - key["$pref::Lights::drawDistance"] = 0.25; - }; -}; + key["$pref::lightManager"] = "Advanced Lighting"; + key["$pref::Shadows::disable"] = false; + key["$pref::Shadows::textureScalar"] = 0.5; + key["$pref::PSSM::detailAdjustScale"] = 0.5; + key["$pref::allowLocalLightShadows"] = true; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "High"; + + key["$pref::lightManager"] = "Advanced Lighting"; + key["$pref::Shadows::disable"] = false; + key["$pref::Shadows::textureScalar"] = 1.0; + key["$pref::PSSM::detailAdjustScale"] = 1.0; + key["$pref::allowLocalLightShadows"] = true; + }; + }; -new SimGroup( ShaderQualityGroup ) -{ - class = "GraphicsOptionsMenuGroup"; + new SimGroup( ShadowDistanceList ) + { + class = "OptionsSettings"; + OptionName = "Shadow Distance"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Lowest"; + + key["$pref::Shadows::drawDistance"] = 0.1; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Low"; + + key["$pref::Shadows::drawDistance"] = 0.25; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Medium"; + + key["$pref::Shadows::drawDistance"] = 0.5; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "High"; + + key["$pref::Shadows::drawDistance"] = 0.75; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Highest"; + + key["$pref::Shadows::drawDistance"] = 1; + }; + }; + + new SimGroup( LightingQualityList ) + { + class = "OptionsSettings"; + OptionName = "Lighting Quality"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Low"; + + key["$pref::maximumNumOfLights"] = 5; + key["$pref::useLightFade"] = true; + key["$pref::lightFadeStart"] = 10; + key["$pref::lightFadeEnd"] = 25; + + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Medium"; + + key["$pref::maximumNumOfLights"] = 10; + key["$pref::useLightFade"] = true; + key["$pref::lightFadeStart"] = 25; + key["$pref::lightFadeEnd"] = 50; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "High"; + + key["$pref::maximumNumOfLights"] = 15; + key["$pref::useLightFade"] = true; + key["$pref::lightFadeStart"] = 50; + key["$pref::lightFadeEnd"] = 75; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Highest"; + + key["$pref::maximumNumOfLights"] = -1; + key["$pref::useLightFade"] = false; + key["$pref::lightFadeStart"] = 50; + key["$pref::lightFadeEnd"] = 75; + }; + }; + + new SimGroup( SoftShadowList ) + { + class = "OptionsSettings"; + OptionName = "Soft Shadowing"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Off"; + + key["$pref::Shadows::filterMode"] = "None"; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Low"; + + key["$pref::Shadows::filterMode"] = "SoftShadow"; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "High"; + + key["$pref::Shadows::filterMode"] = "SoftShadowHighQuality"; + }; + }; + + new SimGroup( LightDistanceList ) + { + class = "OptionsSettings"; + OptionName = "Lights Draw Distance"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Lowest"; + + key["$pref::Lights::drawDistance"] = 0.25; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Low"; + + key["$pref::Lights::drawDistance"] = 0.25; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Medium"; + + key["$pref::Lights::drawDistance"] = 0.5; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "High"; + + key["$pref::Lights::drawDistance"] = 0.75; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Highest"; + + key["$pref::Lights::drawDistance"] = 1; + }; + }; + }; - new ArrayObject() + new SimGroup() { - class = "GraphicsQualityLevel"; - caseSensitive = true; + class = "SubOptionsGroup"; + displayName = "Effects"; + + new SimGroup(ShaderQualityOptionsGroup) + { + class = "OptionsSettings"; + OptionName = "Shader Quality"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "Low"; + + key["$pref::Video::disablePixSpecular"] = true; + key["$pref::Video::disableNormalmapping"] = true; + key["$pref::PostFX::EnableHDRBloom"] = false; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + caseSensitive = true; + + displayName = "High"; + + key["$pref::Video::disablePixSpecular"] = false; + key["$pref::Video::disableNormalmapping"] = false; + key["$pref::PostFX::EnableHDRBloom"] = true; + }; + + }; - displayName = "High"; + new SimGroup(AnisotropicFilterOptionsGroup) + { + class = "OptionsSettings"; + OptionName = "Anisotropic Filtering"; + Description = "Amount of Anisotropic Filtering on textures, which dictates their sharpness at a distance"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "Off"; + + key["$pref::Video::defaultAnisotropy"] = 0; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "4x"; + + key["$pref::Video::defaultAnisotropy"] = 4; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "8x"; + + key["$pref::Video::defaultAnisotropy"] = 8; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "16x"; + + key["$pref::Video::defaultAnisotropy"] =16; + }; + }; - key["$pref::Video::disablePixSpecular"] = false; - key["$pref::Video::disableNormalmapping"] = false; - key["$pref::PostFX::EnableHDRBloom"] = true; - }; - new ArrayObject() - { - class = "GraphicsQualityLevel"; - caseSensitive = true; + new SimGroup(AntiAliasingOptionsGroup) + { + class = "OptionsSettings"; + OptionName = "Anti-Aliasing"; + Description = "The Anti-Aliasing Method applied to rendering"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "None"; + + key["$pref::Video::AAMode"] = "None"; + key["$pref::Video::AA"] = 0; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "FXAA"; + + key["$pref::Video::AAMode"] = "FXAA"; + key["$pref::Video::AA"] = 0; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "SMAA"; + + key["$pref::Video::AAMode"] = "SMAA"; + key["$pref::Video::AA"] = 4; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "SMAA High"; + + key["$pref::Video::AAMode"] ="SMAA High"; + key["$pref::Video::AA"] = 4; + }; + }; - displayName = "Low"; + new SimGroup(ParallaxOptionsGroup) + { + class = "OptionsSettings"; + OptionName = "Parallax"; + Description = "Whether the surface parallax shader effect is enabled"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "Off"; + + key["$pref::Video::enableParallaxMapping"] = false; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "On"; + + key["$pref::Video::enableParallaxMapping"] = true; + }; + + }; - key["$pref::Video::disablePixSpecular"] = true; - key["$pref::Video::disableNormalmapping"] = true; - key["$pref::PostFX::EnableHDRBloom"] = false; + new SimGroup(TrueWaterReflectionsOptionsGroup) + { + class = "OptionsSettings"; + OptionName = "True Water Reflections"; + Description = "Whether realtime water reflections are enabled"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "Off"; + + key["$pref::Water::enableTrueReflections"] = false; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "On"; + + key["$pref::Water::enableTrueReflections"] = true; + }; + }; + + new SimGroup(PostFXSSAOOptionsGroup) + { + class = "OptionsSettings"; + OptionName = "SSAO"; + Description = "Whether Screen-Space Ambient Occlusion is enabled"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "Off"; + + key["$pref::PostFX::EnableSSAO"] = false; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "On"; + + key["$pref::PostFX::EnableSSAO"] = true; + }; + }; + + new SimGroup(PostFXDOFOptionsGroup) + { + class = "OptionsSettings"; + OptionName = "Depth of Field"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "Off"; + + key["$pref::PostFX::EnableDOF"] = false; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "On"; + + key["$pref::PostFX::EnableDOF"] = true; + }; + }; + + new SimGroup(PostFXVignetteOptionsGroup) + { + class = "OptionsSettings"; + OptionName = "Vignette"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "Off"; + + key["$pref::PostFX::EnableVignette"] = false; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "On"; + + key["$pref::PostFX::EnableVignette"] = true; + }; + }; + + new SimGroup(PostFXLightRayOptionsGroup) + { + class = "OptionsSettings"; + OptionName = "Light Rays"; + + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "Off"; + + key["$pref::PostFX::EnableLightRays"] = false; + }; + new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = "On"; + + key["$pref::PostFX::EnableLightRays"] = true; + }; + }; }; }; +function VideoSettingsGroup::populateDisplaySettings(%this) +{ + VideoAPISettingsGroup.clear(); + DisplayDevicesGroup.clear(); + DisplayResSettingsGroup.clear(); + DisplayRefreshSettingsGroup.clear(); + + %apiList = ""; + %apiCount = GFXInit::getAdapterCount(); + for(%i=0; %i < %apiCount; %i++) + { + %api = GFXInit::getAdapterType(%i); + + if(%api !$= "NullDevice") + { + %entry = new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = %api; + key["$pref::Video::displayDevice"] = %api; + }; + + VideoAPISettingsGroup.add(%entry); + } + } + + + %numDevices = Canvas.getMonitorCount(); + + %devicesList = getDisplayDeviceList(); + + for(%i=0; %i < getFieldCount(%devicesList); %i++) + { + %device = getField(%devicesList, %i); + + %entry = new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = %device; + key["$pref::Video::displayDeviceId"] = %device; + }; + + DisplayDevicesGroup.add(%entry); + } + + %mode = getField($Video::ModeTags, $pref::Video::deviceMode); + + if(%mode !$= "Borderless") + { + %resolutionList = getScreenResolutionList($pref::Video::deviceId, $Video::Mode[%mode]); + for(%i=0; %i < getFieldCount(%resolutionList); %i++) + { + %rawResolution = getField(%resolutionList, %i); + %prettyResolution = _makePrettyResString(%rawResolution); + + %entry = new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = %prettyResolution; + key["$pref::Video::Resolution"] = %rawResolution; + }; + + DisplayResSettingsGroup.add(%entry); + } + } + + %refreshList = getScreenRefreshList($pref::Video::mode); + for(%i=0; %i < getFieldCount(%refreshList); %i++) + { + %refreshRate = getField(%refreshList, %i); + + %entry = new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = %refreshRate; + key["$pref::Video::RefreshRate"] = %refreshRate; + }; + + DisplayRefreshSettingsGroup.add(%entry); + } +} + +function DisplayDevicesGroup::onApply(%this) +{ + updateDisplayOptionsSettings(); +} + +function DisplayModeGroup::onApply(%this) +{ + updateDisplayOptionsSettings(); +} + +function DisplayResSettingsGroup::onApply(%this) +{ + updateDisplayOptionsSettings(); +} + +function VSyncSettingsGroup::onApply(%this) +{ + updateDisplayOptionsSettings(); +} + +function DisplayRefreshSettingsGroup::onApply(%this) +{ + updateDisplayOptionsSettings(); +} + +function updateDisplayOptionsSettings() +{ + //Update the display settings now + %deviceName = getDisplayDeviceName(); + %newDeviceID = getWord(%deviceName, 0) - 1; + + %deviceModeName = getField($Video::ModeTags, $pref::Video::deviceMode); + %newDeviceMode = 0; + foreach$(%modeName in $Video::ModeTags) + { + if (%deviceModeName $= %modeName) + break; + else + %newDeviceMode++; + } + + if($pref::Video::deviceMode == $Video::ModeBorderless) + { + //if we're changing to borderless, we swap to the full resolution of the desktop + $pref::Video::mode = Canvas.getBestCanvasRes($pref::Video::deviceId, $pref::Video::deviceMode); + + $pref::Video::Resolution = $pref::Video::mode.x SPC $pref::Video::mode.y; + } + + %newRes = $pref::Video::Resolution; + %newBpp = 32; // ... its not 1997 anymore. + %newFullScreen = %deviceModeName $= "Fullscreen" ? true : false; + %newRefresh = $pref::Video::RefreshRate; + %newVsync = $pref::Video::enableVerticalSync; + %newAA = $pref::Video::AA; + + // Build the final mode string. + %newMode = $pref::Video::Resolution SPC %newFullScreen SPC %newBpp SPC %newRefresh SPC %newAA; + + // Change the video mode. + if ( %newMode !$= $pref::Video::mode || %newDeviceID != $pref::Video::deviceId || + %newVsync != $pref::Video::enableVerticalSync || %newDeviceMode != $pref::Video::deviceMode) + { + //****Edge Case Hack + // If we're in fullscreen mode and switching to a different monitor at the + // same resolution and maintaining fullscreen, GFX...WindowTarget::resetMode() + // will early-out because there is no "mode change" and the monitor change + // will not get applied. Instead of modifying platform code, we're going to + // move onto the new monitor in borderless and immediately switch to FS. + if (%newFullScreen && $pref::Video::FullScreen && + ($pref::Video::Resolution $= %newRes) && ($pref::Video::deviceId != %newDeviceID)) + { + $pref::Video::deviceId = %newDeviceID; + $pref::Video::deviceMode = $Video::ModeBorderless; + %tmpModeStr = Canvas.getMonitorMode(%newDeviceID, 0); + Canvas.setVideoMode(%tmpModeStr.x, %tmpModeStr.y, false, 32, getWord(%tmpModeStr, $WORD::REFRESH), %newAA); + } + + $pref::Video::mode = %newMode; + $pref::Video::enableVerticalSync = %newVsync; + $pref::Video::deviceId = %newDeviceID; + $pref::Video::deviceMode = %newDeviceMode; + $pref::Video::Resolution = %newRes; + $pref::Video::FullScreen = %newFullScreen; + $pref::Video::RefreshRate = %newRefresh; + $pref::Video::AA = %newAA; + configureCanvas(); + } +} + +function TextureQualityGroup::onApply(%this) +{ + reloadTextures(); +} + +function PostFXSSAOOptionsGroup::onApply(%this) +{ + %currentLevel = %this.getCurrentQualityLevel(); + PostFXManager.settingsEffectSetEnabled(SSAOPostFx, %currentLevel.getKey(0)); +} + +function PostFXDOFOptionsGroup::onApply(%this) +{ + %currentLevel = %this.getCurrentQualityLevel(); + PostFXManager.settingsEffectSetEnabled(DepthOfFieldPostFX, %currentLevel.getKey(0)); +} + +function PostFXVignetteOptionsGroup::onApply(%this) +{ + %currentLevel = %this.getCurrentQualityLevel(); + PostFXManager.settingsEffectSetEnabled(vignettePostFX, %currentLevel.getKey(0)); +} + +function PostFXLightRayOptionsGroup::onApply(%this) +{ + %currentLevel = %this.getCurrentQualityLevel(); + PostFXManager.settingsEffectSetEnabled(LightRayPostFX, %currentLevel.getKey(0)); +} + function getCurrentQualityLevel(%qualityGroup) { for ( %i=0; %i < %qualityGroup.getCount(); %i++ ) { %level = %qualityGroup.getObject( %i ); if ( %level.isCurrent() ) - return %level.displayName; + return %level; } return "Custom"; @@ -652,11 +1171,6 @@ function AutodetectGraphics() %intel = ( strstr( strupr( getDisplayDeviceInformation() ), "INTEL" ) != -1 ) ? true : false; %videoMem = GFXCardProfilerAPI::getVideoMemoryMB(); - return AutodetectGraphics_Apply( %shaderVer, %intel, %videoMem ); -} - -function AutodetectGraphics_Apply(%shaderVer, %intel, %videoMem ) -{ if ( %shaderVer < 2.0 ) { echo("Your video card does not meet the minimum requirment of shader model 2.0."); @@ -680,17 +1194,14 @@ function AutodetectGraphics_Apply(%shaderVer, %intel, %videoMem ) $pref::Shadows::useShadowCaching = true; - $pref::Water::enableTrueReflections = false; - $pref::Video::enableParallaxMapping = false; - $pref::PostFX::EnableSSAO = false; - $pref::PostFX::EnableHDR = false; - $pref::PostFX::EnableDOF = false; - $pref::PostFX::EnableLightRays = false; - $pref::PostFX::EnableVignette = false; - - $pref::Video::AAMode = "None"; - $pref::Video::AA = 0; - $pref::Video::defaultAnisotropy = 0; + AnisotropicFilterOptionsGroup.applySetting("None"); + AntiAliasingOptionsGroup.applySetting("Off"); + ParallaxOptionsGroup.applySetting("Off"); + TrueWaterReflectionsOptionsGroup.applySetting("Off"); + PostFXSSAOOptionsGroup.applySetting("Off"); + PostFXDOFOptionsGroup.applySetting("Off"); + PostFXVignetteOptionsGroup.applySetting("Off"); + PostFXLightRayOptionsGroup.applySetting("Off"); } else { @@ -707,17 +1218,14 @@ function AutodetectGraphics_Apply(%shaderVer, %intel, %videoMem ) $pref::Shadows::useShadowCaching = true; - $pref::Water::enableTrueReflections = false; - $pref::Video::enableParallaxMapping = false; - $pref::PostFX::EnableSSAO = false; - $pref::PostFX::EnableHDR = false; - $pref::PostFX::EnableDOF = false; - $pref::PostFX::EnableLightRays = false; - $pref::PostFX::EnableVignette = false; - - $pref::Video::AAMode = "None"; - $pref::Video::AA = 0; - $pref::Video::defaultAnisotropy = 0; + AnisotropicFilterOptionsGroup.applySetting("None"); + AntiAliasingOptionsGroup.applySetting("Off"); + ParallaxOptionsGroup.applySetting("Off"); + TrueWaterReflectionsOptionsGroup.applySetting("Off"); + PostFXSSAOOptionsGroup.applySetting("Off"); + PostFXDOFOptionsGroup.applySetting("Off"); + PostFXVignetteOptionsGroup.applySetting("Off"); + PostFXLightRayOptionsGroup.applySetting("Off"); } } else @@ -738,17 +1246,14 @@ function AutodetectGraphics_Apply(%shaderVer, %intel, %videoMem ) //Should this default to on in ultra settings? $pref::Shadows::useShadowCaching = true; - $pref::Water::enableTrueReflections = true; - $pref::Video::enableParallaxMapping = true; - $pref::PostFX::EnableSSAO = true; - $pref::PostFX::EnableHDR = true; - $pref::PostFX::EnableDOF = true; - $pref::PostFX::EnableLightRays = true; - $pref::PostFX::EnableVignette = true; - - $pref::Video::AAMode = "SMAA High"; - $pref::Video::AA = 4; - $pref::Video::defaultAnisotropy = 16; + AnisotropicFilterOptionsGroup.applySetting("16x"); + AntiAliasingOptionsGroup.applySetting("SMAA High"); + ParallaxOptionsGroup.applySetting("On"); + TrueWaterReflectionsOptionsGroup.applySetting("On"); + PostFXSSAOOptionsGroup.applySetting("On"); + PostFXDOFOptionsGroup.applySetting("On"); + PostFXVignetteOptionsGroup.applySetting("On"); + PostFXLightRayOptionsGroup.applySetting("On"); } else if ( %videoMem > 400 || %videoMem == 0 ) { @@ -765,17 +1270,14 @@ function AutodetectGraphics_Apply(%shaderVer, %intel, %videoMem ) $pref::Shadows::useShadowCaching = true; - $pref::Water::enableTrueReflections = true; - $pref::Video::enableParallaxMapping = true; - $pref::PostFX::EnableSSAO = false; - $pref::PostFX::EnableHDR = true; - $pref::PostFX::EnableDOF = true; - $pref::PostFX::EnableLightRays = true; - $pref::PostFX::EnableVignette = true; - - $pref::Video::AAMode = "SMAA"; - $pref::Video::AA = 4; - $pref::Video::defaultAnisotropy = 4; + AnisotropicFilterOptionsGroup.applySetting("4x"); + AntiAliasingOptionsGroup.applySetting("SMAA"); + ParallaxOptionsGroup.applySetting("On"); + TrueWaterReflectionsOptionsGroup.applySetting("On"); + PostFXSSAOOptionsGroup.applySetting("Off"); + PostFXDOFOptionsGroup.applySetting("On"); + PostFXVignetteOptionsGroup.applySetting("On"); + PostFXLightRayOptionsGroup.applySetting("On"); if ( %videoMem == 0 ) echo("Torque was unable to detect available video memory. Applying 'Medium' quality."); @@ -795,31 +1297,17 @@ function AutodetectGraphics_Apply(%shaderVer, %intel, %videoMem ) $pref::Shadows::useShadowCaching = true; - $pref::Water::enableTrueReflections = true; - $pref::Video::enableParallaxMapping = true; - $pref::PostFX::EnableSSAO = false; - $pref::PostFX::EnableHDR = false; - $pref::PostFX::EnableDOF = false; - $pref::PostFX::EnableLightRays = false; - $pref::PostFX::EnableVignette = false; - - $pref::Video::AAMode = "FXAA"; - $pref::Video::AA = 0; - $pref::Video::defaultAnisotropy = 0; + AnisotropicFilterOptionsGroup.applySetting("None"); + AntiAliasingOptionsGroup.applySetting("FXAA"); + ParallaxOptionsGroup.applySetting("On"); + TrueWaterReflectionsOptionsGroup.applySetting("On"); + PostFXSSAOOptionsGroup.applySetting("Off"); + PostFXDOFOptionsGroup.applySetting("Off"); + PostFXVignetteOptionsGroup.applySetting("Off"); + PostFXLightRayOptionsGroup.applySetting("Off"); } } - //%this.refresh(); - - //%this.apply(); - - //force postFX updates - PostFXManager.settingsEffectSetEnabled(SSAOPostFx, $pref::PostFX::EnableSSAO); - PostFXManager.settingsEffectSetEnabled(HDRPostFX, $pref::PostFX::EnableHDR); - PostFXManager.settingsEffectSetEnabled(DepthOfFieldPostFX, $pref::PostFX::EnableDOF); - PostFXManager.settingsEffectSetEnabled(LightRayPostFX, $pref::PostFX::EnableLightRays); - PostFXManager.settingsEffectSetEnabled(VignettePostFX, $pref::PostFX::EnableVignette); - echo("Graphics quality settings have been auto detected."); } @@ -927,4 +1415,51 @@ function getScreenRefreshList(%resolution) %rateArray.delete(); return %returnsList; +} + +function getDisplayDeviceList() +{ + %numDevices = Canvas.getMonitorCount(); + %devicesList = ""; + for(%i = 0; %i < %numDevices; %i++) + { + %device = (%i+1) @ " - " @ Canvas.getMonitorName(%i); + if(%i==0) + %devicesList = %device; + else + %devicesList = %devicesList @ "\t" @ %device; + } + + return %devicesList; +} + +function getDisplayDeviceId(%displayDeviceName) +{ + %deviceList = getDisplayDeviceList(); + + %deviceCount = getFieldCount(%deviceList); + for(%d = 0; %d < %deviceCount; %d++) + { + %deviceName = getField(%deviceList, %d); + if(%deviceName $= %displayDeviceName) + return %d; + } + + return -1; +} + +function getDisplayDeviceName() +{ + %numDevices = Canvas.getMonitorCount(); + %devicesList = ""; + for(%i = 0; %i < %numDevices; %i++) + { + %device = (%i+1) @ " - " @ Canvas.getMonitorName(%i); + if(%i==0) + %devicesList = %device; + else + %devicesList = %devicesList @ "\t" @ %device; + } + + return getField(%devicesList, $pref::Video::deviceId); } \ No newline at end of file diff --git a/Templates/BaseGame/game/core/sfx/Core_SFX.tscript b/Templates/BaseGame/game/core/sfx/Core_SFX.tscript index f0babb90f..771048b32 100644 --- a/Templates/BaseGame/game/core/sfx/Core_SFX.tscript +++ b/Templates/BaseGame/game/core/sfx/Core_SFX.tscript @@ -7,7 +7,7 @@ function Core_SFX::onCreate(%this) exec("./scripts/audioDescriptions." @ $TorqueScriptFileExtension); exec("./scripts/audioEnvironments." @ $TorqueScriptFileExtension); exec("./scripts/audioStates." @ $TorqueScriptFileExtension); - + exec("./scripts/audioOptions." @ $TorqueScriptFileExtension); } function Core_SFX::onDestroy(%this) diff --git a/Templates/BaseGame/game/core/sfx/scripts/audioOptions.tscript b/Templates/BaseGame/game/core/sfx/scripts/audioOptions.tscript new file mode 100644 index 000000000..eb72c3f86 --- /dev/null +++ b/Templates/BaseGame/game/core/sfx/scripts/audioOptions.tscript @@ -0,0 +1,103 @@ +new SimGroup(AudioSettingsGroup) +{ + class = "PrimaryOptionsGroup"; + displayName = "Audio"; + + new SimGroup() + { + class = "SubOptionsGroup"; + displayName = "Audio Devices"; + + new SimGroup(AudioSettingsProviderGroup) + { + class = "AudioOptionsSettings"; + + OptionName = "Audio Provider"; + Description = ""; + }; + + new SimGroup(AudioSettingsDeviceGroup) + { + class = "AudioOptionsSettings"; + + OptionName = "Audio Device"; + Description = ""; + }; + }; +}; + +function AudioSettingsGroup::populateSettings(%this) +{ + AudioSettingsProviderGroup.clear(); + AudioSettingsDeviceGroup.clear(); + + %buffer = sfxGetAvailableDevices(); + %count = getRecordCount( %buffer ); + + for(%i = 0; %i < %count; %i++) + { + %record = getRecord(%buffer, %i); + %provider = getField(%record, 0); + %device = getField(%record, 1); + + //When the client is actually running, we don't care about null audo devices + if(%provider $= "null") + continue; + + //We can't have duplicate providers, so double check for uniqueness + %foundProvider = false; + foreach(%registeredProviders in AudioSettingsProviderGroup) + { + if(%registeredProviders.displayName $= %provider) + { + %foundProvider = true; + break; + } + } + + if(!%foundProvider) + { + //Provider entry + %providerEntry = new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = %provider; + key["$pref::SFX::provider"] = %provider; + }; + + AudioSettingsProviderGroup.add(%providerEntry); + } + + //Device Entry + %deviceEntry = new ArrayObject() + { + class = "OptionsQualityLevel"; + displayName = %device; + provider = %provider; //this is for filtering later, if we need to + key["$pref::SFX::device"] = %device; + }; + + AudioSettingsDeviceGroup.add(%deviceEntry); + } +} + +function AudioSettingsProviderGroup::onApply(%this) +{ + updateAudioOptionsSettings(); +} + +function AudioSettingsDeviceGroup::onApply(%this) +{ + updateAudioOptionsSettings(); +} + +function updateAudioOptionsSettings() +{ + if ( !sfxCreateDevice( $pref::SFX::provider, + $pref::SFX::device, + $pref::SFX::useHardware, + -1 ) ) + error( "Unable to create SFX device: " @ $pref::SFX::provider + SPC $pref::SFX::device + SPC $pref::SFX::useHardware ); +} \ No newline at end of file diff --git a/Templates/BaseGame/game/data/ExampleModule/scripts/client/defaultKeybinds.tscript b/Templates/BaseGame/game/data/ExampleModule/scripts/client/defaultKeybinds.tscript index cb4f84431..913b088fc 100644 --- a/Templates/BaseGame/game/data/ExampleModule/scripts/client/defaultKeybinds.tscript +++ b/Templates/BaseGame/game/data/ExampleModule/scripts/client/defaultKeybinds.tscript @@ -17,13 +17,20 @@ addKeyRemap("Ascend", "ExampleMoveMap", "keyboard", "moveup", "Makes the camera addKeyRemap("Descend", "ExampleMoveMap", "keyboard", "movedown", "Makes the camera descend"); addKeyRemap("Jump", "ExampleMoveMap", "keyboard", "jump", "Jump"); +addKeyRemap("Forward", "ExampleMoveMap", "gamepad", "gamePadMoveY", "Forward Movement"); +addKeyRemap("Backward", "ExampleMoveMap", "gamepad", "gamePadMoveY", "Backward Movement"); +addKeyRemap("Strafe Left", "ExampleMoveMap", "gamepad", "gamePadMoveX", "Left Strafing Movement"); +addKeyRemap("Strafe Right", "ExampleMoveMap", "gamepad", "gamePadMoveX", "Right Strafing Movement"); +addKeyRemap("Jump", "ExampleMoveMap", "gamepad", "jump", "Jump"); + //------------------------------------------------------------------------------ // Non-remapable binds //------------------------------------------------------------------------------ ExampleMoveMap.bind( keyboard, F2, showPlayerList ); ExampleMoveMap.bind(keyboard, "ctrl h", hideHUDs); ExampleMoveMap.bind(keyboard, "alt p", doScreenShotHudless); -ExampleMoveMap.bindCmd(keyboard, "escape", "", "Canvas.pushDialog(PauseMenu);"); +ExampleMoveMap.bindCmd(keyboard, "escape", "", "Canvas.pushDialog(GameMenu);"); +ExampleMoveMap.bindCmd(gamepad, btn_start, "Canvas.pushDialog(GameMenu);", "" ); //------------------------------------------------------------------------------ // Movement Keys diff --git a/Templates/BaseGame/game/data/UI/UI.tscript b/Templates/BaseGame/game/data/UI/UI.tscript index 3baad2bd5..027451977 100644 --- a/Templates/BaseGame/game/data/UI/UI.tscript +++ b/Templates/BaseGame/game/data/UI/UI.tscript @@ -39,21 +39,12 @@ function UI::initClient(%this) //Load UI stuff //Profiles %this.queueExec("./scripts/profiles"); - - //Navigation Utility Scripts - %this.queueExec("./scripts/menuNavigation"); - - //Now gui files - %this.queueExec("./scripts/menuInputHandling"); - + %this.queueExec("./guis/mainMenu"); %this.queueExec("./guis/mainMenu.gui"); - %this.queueExec("./guis/mainMenuButtons"); - %this.queueExec("./guis/mainMenuButtons.gui"); - - %this.queueExec("./guis/chooseLevelDlg"); - %this.queueExec("./guis/chooseLevelDlg.gui"); + %this.queueExec("./guis/ChooseLevelMenu"); + %this.queueExec("./guis/ChooseLevelMenu.gui"); %this.queueExec("./guis/joinServerMenu"); %this.queueExec("./guis/joinServerMenu.gui"); @@ -63,9 +54,10 @@ function UI::initClient(%this) %this.queueExec("./guis/optionsMenu"); %this.queueExec("./guis/optionsMenu.gui"); - %this.queueExec("./guis/pauseMenu"); - %this.queueExec("./guis/pauseMenu.gui"); + %this.queueExec("./guis/GameMenu"); + %this.queueExec("./guis/GameMenu.gui"); + %this.queueExec("./guis/remapDlg"); %this.queueExec("./guis/remapDlg.gui"); %this.queueExec("./guis/remapConfirmDlg.gui"); @@ -73,21 +65,18 @@ function UI::initClient(%this) %this.queueExec("./guis/profiler.gui"); %this.queueExec("./guis/netGraphGui.gui"); - %this.queueExec("./guis/RecordingsDlg.gui"); - - %this.queueExec("./guis/guiMusicPlayer"); - %this.queueExec("./guis/guiMusicPlayer.gui"); %this.queueExec("./guis/startupGui"); %this.queueExec("./guis/startupGui.gui"); - // Load Editor Dialogs + %this.queueExec("./guis/messageBoxDlg"); %this.queueExec("./guis/messageBoxDlg.gui"); + %this.queueExec("./guis/SystemMenu"); + %this.queueExec("./guis/SystemMenu.gui"); + //Load scripts %this.queueExec("./scripts/controlsMenu"); - %this.queueExec("./scripts/messageBoxes"); - %this.queueExec("./scripts/help"); %this.queueExec("./scripts/cursors"); if(isToolBuild()) @@ -97,3 +86,8 @@ function UI::initClient(%this) function UI::onCreateClientConnection(%this){} function UI::onDestroyClientConnection(%this){} + +function UI::registerGameMenus(%this, %menusArrayObj) +{ + %menusArrayObj.add("System", SystemMenu); +} \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/guis/ChooseLevelDlg.asset.taml b/Templates/BaseGame/game/data/UI/guis/ChooseLevelDlg.asset.taml deleted file mode 100644 index 9090ea1af..000000000 --- a/Templates/BaseGame/game/data/UI/guis/ChooseLevelDlg.asset.taml +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/Templates/BaseGame/game/data/UI/guis/ChooseLevelMenu.asset.taml b/Templates/BaseGame/game/data/UI/guis/ChooseLevelMenu.asset.taml new file mode 100644 index 000000000..7b612550f --- /dev/null +++ b/Templates/BaseGame/game/data/UI/guis/ChooseLevelMenu.asset.taml @@ -0,0 +1,5 @@ + diff --git a/Templates/BaseGame/game/data/UI/guis/ChooseLevelMenu.gui b/Templates/BaseGame/game/data/UI/guis/ChooseLevelMenu.gui new file mode 100644 index 000000000..7fb06379a --- /dev/null +++ b/Templates/BaseGame/game/data/UI/guis/ChooseLevelMenu.gui @@ -0,0 +1,96 @@ +//--- OBJECT WRITE BEGIN --- +$guiContent = new GuiControl(ChooseLevelMenu) { + extent = "1280 720"; + minExtent = "8 8"; + horizSizing = "width"; + vertSizing = "height"; + profile = "GuiMenuBackgroundProfile"; + category = "BaseUI"; + tooltipProfile = "GuiToolTipProfile"; + isContainer = "1"; + canSaveDynamicFields = "1"; + launchInEditor = "0"; + + new GuiInputCtrl(ChooseLevelInputHandler) { + ignoreMouseEvents = "1"; + ActionMap = "ChooseLevelActionMap"; + position = "-50 0"; + extent = "2186 851"; + horizSizing = "width"; + vertSizing = "height"; + profile = "GuiInputCtrlProfile"; + tooltipProfile = "GuiToolTipProfile"; + }; + + new GuiPanel(ChooseLevelTitlePanel) { + extent = "1281 60"; + horizSizing = "width"; + profile = "GuiMenuPanelProfile"; + tooltipProfile = "GuiToolTipProfile"; + + new GuiTextCtrl(ChooseLevelTitleText) { + text = "SINGLE PLAYER"; + position = "22 23"; + extent = "220 28"; + profile = "MenuHeaderText"; + tooltipProfile = "GuiToolTipProfile"; + }; + }; + new GuiPanel(ChooseLevelButtonPanel) { + position = "0 683"; + extent = "1281 40"; + horizSizing = "width"; + vertSizing = "top"; + profile = "GuiMenuPanelProfile"; + tooltipProfile = "GuiToolTipProfile"; + + new GuiIconButtonCtrl(ChooseLevelStartBtn) { + BitmapAsset = "UI:Keyboard_Black_Return_image"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + text = "Start"; + position = "1115 0"; + extent = "140 40"; + horizSizing = "left"; + vertSizing = "center"; + profile = "GuiMenuButtonProfile"; + command = "OptionsMenu.applySettings();"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiIconButtonCtrl(ChooseLevelBackBtn) { + BitmapAsset = "UI:Keyboard_Black_Escape_image"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + text = "Back"; + position = "16 0"; + extent = "140 40"; + vertSizing = "center"; + profile = "GuiMenuButtonProfile"; + command = "Canvas.popDialog();"; + tooltipProfile = "GuiToolTipProfile"; + }; + }; + new GuiScrollCtrl(LevelPreviewScroll) { + hScrollBar = "dynamic"; + vScrollBar = "alwaysOff"; + position = "0 118"; + extent = "1283 500"; + horizSizing = "width"; + vertSizing = "center"; + profile = "GuiMenuScrollProfile"; + tooltipProfile = "GuiToolTipProfile"; + + new GuiStackControl(LevelPreviewArray) { + position = "1 1"; + extent = "1280 480"; + vertSizing = "center"; + profile = "GuiMenuDefaultProfile"; + tooltipProfile = "GuiToolTipProfile"; + padding = "5"; + stackingType = "Horizontal"; + }; + }; +}; +//--- OBJECT WRITE END --- diff --git a/Templates/BaseGame/game/data/UI/guis/ChooseLevelMenu.tscript b/Templates/BaseGame/game/data/UI/guis/ChooseLevelMenu.tscript new file mode 100644 index 000000000..646a55101 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/guis/ChooseLevelMenu.tscript @@ -0,0 +1,211 @@ +//----------------------------------------------------------------------------- +// 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. +//----------------------------------------------------------------------------- + +//---------------------------------------- +function ChooseLevelMenu::onAdd( %this ) +{ + if(!isObject(ChooseLevelAssetQuery)) + new AssetQuery(ChooseLevelAssetQuery); +} + +function ChooseLevelMenu::onWake(%this) +{ + LevelPreviewArray.clear(); + + ChooseLevelAssetQuery.clear(); + AssetDatabase.findAssetType(ChooseLevelAssetQuery, "LevelAsset"); + + %count = ChooseLevelAssetQuery.getCount(); + + if(%count == 0 && !IsDirectory("tools")) + { + //We have no levels found. Prompt the user to open the editor to the default level if the tools are present + MessageBoxOK("Error", "No levels were found in any modules. Please ensure you have modules loaded that contain gameplay code and level files.", + "Canvas.popDialog(ChooseLevelMenu); if(isObject(ChooseLevelMenu.returnGui) && ChooseLevelMenu.returnGui.isMethod(\"onReturnTo\")) ChooseLevelMenu.returnGui.onReturnTo();"); + + ChooseLevelAssetQuery.delete(); + return; + } + + for(%i=0; %i < %count; %i++) + { + %assetId = ChooseLevelAssetQuery.getAsset(%i); + + if(AssetDatabase.getAssetModule(%assetId).ModuleId $= "ToolsModule") + continue; + + %levelAsset = AssetDatabase.acquireAsset(%assetId); + + %file = %levelAsset.getLevelPath(); + + if ( !isFile(%file) ) + continue; + + %levelPreviewImg = %levelAsset.getPreviewImagePath(); + + if (!isFile(%levelPreviewImg)) + %levelPreviewImg = "UI:no_preview_image"; + + %preview = new GuiContainer() { + extent = "480 480"; + levelAssetId = %assetId; + + new GuiButtonCtrl() { + position = "0 0"; + extent = "480 480"; + buttonType = "ToggleButton"; + profile = GuiMenuButtonLeftJustProfile; + horizSizing = "width"; + vertSizing = "height"; + internalName = "button"; + class = "LevelPreviewButton"; + command = "$selectedLevelAsset = " @ %assetId @ ";"; + altCommand = "ChooseLevelBegin(1);"; //allow doubleclick to quick action it + }; + + new GuiBitmapCtrl() { + position = "20 0"; + extent = "440 440"; + BitmapAsset = %levelPreviewImg; + horizSizing = "width"; + vertSizing = "bottom"; + profile = GuiNonModalDefaultProfile; + }; + + new GuiTextCtrl() { + position = "20 445"; + extent = "440 15"; + text = %levelAsset.levelName; + profile = MenuSubHeaderText; + internalName = "levelNameTxt"; + }; + + new GuiMLTextCtrl() { + position = "20 465"; + extent = "440 15"; + text = %levelAsset.levelDescription; + profile = GuiMLTextProfile; + internalName = "levelDescTxt"; + }; + }; + + LevelPreviewArray.add(%preview); + } + + // Also add the new level mission as defined in the world editor settings + // if we are choosing a level to launch in the editor. + if ( %this.launchInEditor ) + { + %this.addMissionFile( "tools/levels/DefaultEditorLevel.mis" ); + } + + //LevelList.setSelected(0); + + if(!$pref::HostMultiPlayer) + ChooseLevelTitleText.setText("SINGLE PLAYER"); + else + ChooseLevelTitleText.setText("CREATE SERVER"); + + $MenuList = LevelPreviewArray; + $MenuList.listPosition = 0; + $MenuList.syncGui(); +} + +if(!isObject( ChooseLevelActionMap ) ) +{ + new ActionMap(ChooseLevelActionMap){}; + + //Null the up/down nav so we can swap in left/right nav + ChooseLevelActionMap.bindCmd( keyboard, w, "" ); + ChooseLevelActionMap.bindCmd( keyboard, s, "" ); + ChooseLevelActionMap.bindCmd( gamepad, yaxis, "" ); + ChooseLevelActionMap.bindCmd( gamepad, upov, "" ); + ChooseLevelActionMap.bindCmd( gamepad, dpov, "" ); + + ChooseLevelActionMap.bind( keyboard, a, BaseUINavigatePrev ); + ChooseLevelActionMap.bind( keyboard, d, BaseUINavigateNext ); + ChooseLevelActionMap.bind( gamepad, xaxis, "D", "-0.23 0.23", BaseUIStickNavigate ); + ChooseLevelActionMap.bind( gamepad, lpov, BaseUINavigatePrev ); + ChooseLevelActionMap.bind( gamepad, rpov, BaseUINavigateNext ); + + ChooseLevelActionMap.bind( keyboard, Enter, ChooseLevelBegin ); + ChooseLevelActionMap.bind( gamepad, btn_a, ChooseLevelBegin ); +} + +function LevelPreviewArray::syncGUI(%this) +{ + %this.callOnChildren("setHighlighted", false); + + %btn = %this.getObject(%this.listPosition); + %btn-->button.setHighlighted(true); + + $selectedLevelAsset = %btn.levelAssetId; +} + +function ChooseLevelBegin(%val) +{ + if(%val) + { + // So we can't fire the button when loading is in progress. + if ( isObject( ServerGroup ) ) + return; + + Canvas.popDialog(); + + %entry = LevelPreviewArray.getObject(LevelPreviewArray.listPosition); + + if(!AssetDatabase.isDeclaredAsset(%entry.levelAssetId)) + { + MessageBoxOK("Error", "Selected level preview does not have a valid level asset!"); + return; + } + + // Launch the chosen level with the editor open? + if ( ChooseLevelMenu.launchInEditor ) + { + activatePackage( "BootEditor" ); + ChooseLevelMenu.launchInEditor = false; + StartGame(%entry.levelAssetId, "SinglePlayer"); + } + else + { + StartGame(%entry.levelAssetId); + } + } +} + +function ChooseLevelMenu::onSleep( %this ) +{ + // This is set from the outside, only stays true for a single wake/sleep + // cycle. + %this.launchInEditor = false; +} + +function LevelPreviewButton::onHighlighted(%this, %highlighted) +{ + %container = %this.getParent(); + + %container-->levelNameTxt.profile = %highlighted ? MenuSubHeaderTextHighlighted : MenuSubHeaderText; + %container-->levelDescTxt.profile = %highlighted ? GuiMLTextProfileHighlighted : GuiMLTextProfile; + + LevelPreviewScroll.scrollToObject(%this); +} \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/guis/GameMenu.asset.taml b/Templates/BaseGame/game/data/UI/guis/GameMenu.asset.taml new file mode 100644 index 000000000..2b9ed760a --- /dev/null +++ b/Templates/BaseGame/game/data/UI/guis/GameMenu.asset.taml @@ -0,0 +1,5 @@ + diff --git a/Templates/BaseGame/game/data/UI/guis/GameMenu.gui b/Templates/BaseGame/game/data/UI/guis/GameMenu.gui new file mode 100644 index 000000000..09cdf31e1 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/guis/GameMenu.gui @@ -0,0 +1,93 @@ +//--- OBJECT WRITE BEGIN --- +$guiContent = new GuiControl(GameMenu) { + extent = "1280 720"; + profile = "GuiDefaultProfile"; + tooltipProfile = "GuiToolTipProfile"; + isContainer = "1"; + canSaveDynamicFields = "1"; + + new GuiInputCtrl(GameMenuInputHandler) { + ignoreMouseEvents = "1"; + ActionMap = "GameMenuActionMap"; + position = "-50 0"; + extent = "50 50"; + horizSizing = "width"; + vertSizing = "height"; + profile = "GuiInputCtrlProfile"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiChunkedBitmapCtrl(GameMenuBG) { + BitmapAsset = "UI:hudfill_image"; + extent = "1280 720"; + horizSizing = "width"; + vertSizing = "height"; + profile = "GuiDefaultProfile"; + tooltipProfile = "GuiToolTipProfile"; + isContainer = "1"; + canSaveDynamicFields = "1"; + + new GuiPanel(GameMenuTitlePanel) { + extent = "1281 60"; + horizSizing = "width"; + profile = "GuiMenuPanelProfile"; + tooltipProfile = "GuiToolTipProfile"; + + new GuiStackControl(GameMenuButtonList){ + position = "40 0"; + extent = "1240 60"; + profile = GuiDefaultProfile; + stackingType = "Horizontal"; + padding = "10"; + horizSizing = "center"; + vertSizing = "center"; + }; + + new GuiControl(GameMenuNavButtonOverlay) { + extent = "1281 60"; + horizSizing = "width"; + vertSizing = "height"; + profile = GuiNonModalDefaultProfile; + + new GuiBitmapCtrl(GameMenuPrevNavIcon) { + BitmapAsset = "UI:Keyboard_Black_Q_image"; + position = "0 24"; + extent = "40 40"; + profile = GuiNonModalDefaultProfile; + vertSizing = "top"; + }; + + new GuiBitmapCtrl(GameMenuNextNavIcon) { + BitmapAsset = "UI:Keyboard_Black_E_image"; + position = "0 24"; + extent = "40 40"; + profile = GuiNonModalDefaultProfile; + vertSizing = "top"; + }; + }; + }; + }; + new GuiPanel(GameMenuButtonPanel) { + position = "0 683"; + extent = "1281 40"; + horizSizing = "width"; + vertSizing = "top"; + profile = "GuiMenuPanelProfile"; + tooltipProfile = "GuiToolTipProfile"; + + new GuiIconButtonCtrl(GameMenuBackBtn) { + BitmapAsset = "UI:Keyboard_Black_Escape_image"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + text = "Back"; + position = "16 0"; + extent = "140 40"; + vertSizing = "center"; + profile = "GuiMenuButtonProfile"; + command = "Canvas.popDialog(GameMenu);"; + tooltipProfile = "GuiToolTipProfile"; + class = "MenuInputButton"; + }; + }; +}; +//--- OBJECT WRITE END --- diff --git a/Templates/BaseGame/game/data/UI/guis/GameMenu.tscript b/Templates/BaseGame/game/data/UI/guis/GameMenu.tscript new file mode 100644 index 000000000..0b6177604 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/guis/GameMenu.tscript @@ -0,0 +1,186 @@ +function GameMenu::onAdd(%this) +{ + %this.gameMenusArray = new ArrayObject(){}; +} + +function GameMenu::onWake(%this) +{ + if($Server::ServerType $= "SinglePlayer") + { + $timescale = 0; + + sfxSetChannelVolume( $SimAudioType, $pref::SFX::channelVolume[ 0 ] ); + } + + callOnModules("registerGameMenus", "", %this.gameMenusArray); + + //Remove duplicates as needed + %this.gameMenusArray.uniqueKey(); + + GameMenuButtonList.clear(); + + %stackWidth = 0; + //process the entries and give 'em buttons on the button array + for(%i=0; %i < %this.gameMenusArray.count(); %i++) + { + %buttonText = %this.gameMenusArray.getKey(%i); + + %textWidth = GuiMenuButtonProfile.getStringWidth(%buttonText); + + %btn = new GuiButtonCtrl() { + extent = %textWidth + 80 SPC 40; + profile = GuiMenuButtonProfile; + text = %buttonText; + class = "GameMenuButton"; + command = "GameMenu.openGameMenu(\"" @ %buttonText @ "\");"; + }; + + %stackWidth += %textWidth + 40; + + GameMenuButtonList.add(%btn); + } + + GameMenuButtonList.resize(GameMenuTitlePanel.extent.x/2 - %stackWidth/2, 0, %stackWidth, GameMenuTitlePanel.extent.y); + + %this.openGameMenu("System"); + + //give a slight delay for the canvas to be fully refreshed before we sync things + %this.schedule(500, "syncGUI"); +} + +function GameMenu::onSleep(%this) +{ + if($Server::ServerType $= "SinglePlayer") + { + $timescale = 1; + sfxSetChannelVolume( $SimAudioType, $pref::SFX::channelVolume[ $SimAudioType ] ); + } + + if(isObject(%this.currentMenu)) + { + Canvas.popDialog(%this.currentMenu); + } +} + +if(!isObject( GameMenuActionMap ) ) +{ + new ActionMap(GameMenuActionMap){}; + + //We'll just use the existing BaseUI nav functions because it'd be the same logic anyways + GameMenuActionMap.bind( keyboard, w, BaseUINavigatePrev ); + GameMenuActionMap.bind( keyboard, s, BaseUINavigateNext ); + GameMenuActionMap.bind( gamepad, yaxis, "D", "-0.23 0.23", BaseUIStickNavigate ); + GameMenuActionMap.bind( gamepad, upov, BaseUINavigatePrev ); + GameMenuActionMap.bind( gamepad, dpov, BaseUINavigateNext ); + + GameMenuActionMap.bind( keyboard, Enter, BaseUIActivateSelected ); + GameMenuActionMap.bind( gamepad, btn_a, BaseUIActivateSelected ); + + GameMenuActionMap.bindCmd( keyboard, Escape, "Canvas.popDialog(GameMenu);", "" ); + GameMenuActionMap.bindCmd( gamepad, btn_b, "Canvas.popDialog(GameMenu);", "" ); + GameMenuActionMap.bindCmd( gamepad, btn_start, "Canvas.popDialog(GameMenu);", "" ); + + GameMenuActionMap.bind( keyboard, q, GameMenuPrevMenu ); + GameMenuActionMap.bind( gamepad, btn_l, GameMenuPrevMenu ); + + GameMenuActionMap.bind( keyboard, e, GameMenuNextMenu ); + GameMenuActionMap.bind( gamepad, btn_r, GameMenuNextMenu ); +} + +function GameMenu::openGameMenu(%this, %menuName) +{ + %menuIdx = %this.gameMenusArray.getIndexFromKey(%menuName); + if(%menuIdx != -1) + { + %newMenu = %this.gameMenusArray.getValue(%menuIdx); + + if(isObject(%this.currentMenu)) + Canvas.popDialog(%this.currentMenu); + + Canvas.pushDialog(%newMenu); + %this.currentMenu = %newMenu; + %this.currentMenuIdx = %menuIdx; + } + + %this.syncGui(); +} + +function openPauseMenuOptions() +{ + GameMenu.pushPage(OptionsMenu); +} + +function pauseMenuExitToMenu() +{ + MessageBoxOKCancel("Exit?", "Do you wish to exit to the Main Menu?", "escapeFromGame();", ""); +} + +function pauseMenuExitToDesktop() +{ + MessageBoxOKCancel("Exit?", "Do you wish to exit to the desktop?", "quit();", ""); +} + +function GameMenuPrevMenu(%val) +{ + if(%val) + { + %currentIdx = GameMenu.currentMenuIdx; + GameMenu.currentMenuIdx -= 1; + if(GameMenu.currentMenuIdx < 0) + GameMenu.currentMenuIdx = 0; + + if(%currentIdx == GameMenu.currentMenuIdx) + return; + + %menuName = GameMenu.gameMenusArray.getKey(GameMenu.currentMenuIdx); + + GameMenu.openGameMenu(%menuName); + } +} + +function GameMenuNextMenu(%val) +{ + if(%val) + { + %currentIdx = GameMenu.currentMenuIdx; + GameMenu.currentMenuIdx += 1; + if(GameMenu.currentMenuIdx >= GameMenu.gameMenusArray.count()) + GameMenu.currentMenuIdx = GameMenu.gameMenusArray.count()-1; + + if(%currentIdx == GameMenu.currentMenuIdx) + return; + + %menuName = GameMenu.gameMenusArray.getKey(GameMenu.currentMenuIdx); + + GameMenu.openGameMenu(%menuName); + } +} + +function GameMenu::syncGui(%this) +{ + GameMenuButtonList.callOnChildren("setHighlighted", false); + + %btn = GameMenuButtonList.getObject(%this.currentMenuIdx); + %btn.setHighlighted(true); + + %buttonPosX = %btn.position.x + GameMenuButtonList.position.x; + + GameMenuPrevNavIcon.position.x = %buttonPosX; + GameMenuNextNavIcon.position.x = %buttonPosX + %btn.extent.x - 40; + + //Update the button imagery to comply to the last input device we'd used + %device = Canvas.getLastInputDevice(); + if(%device $= "mouse") + %device = "keyboard"; + + GameMenuBackBtn.setBitmap(BaseUIActionMap.getCommandButtonBitmap(%device, "BaseUIBackOut")); + + GameMenuPrevNavIcon.setBitmap(GameMenuActionMap.getCommandButtonBitmap(%device, "GameMenuPrevMenu")); + GameMenuNextNavIcon.setBitmap(GameMenuActionMap.getCommandButtonBitmap(%device, "GameMenuNextMenu")); + + %this.schedule(500, "syncGUI"); +} + +/* + +*/ \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/guis/GuiMusicPlayer.asset.taml b/Templates/BaseGame/game/data/UI/guis/GuiMusicPlayer.asset.taml deleted file mode 100644 index 94601d7a3..000000000 --- a/Templates/BaseGame/game/data/UI/guis/GuiMusicPlayer.asset.taml +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/Templates/BaseGame/game/data/UI/guis/IODropdownDlg.asset.taml b/Templates/BaseGame/game/data/UI/guis/IODropdownDlg.asset.taml deleted file mode 100644 index d1d0c8c8e..000000000 --- a/Templates/BaseGame/game/data/UI/guis/IODropdownDlg.asset.taml +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/Templates/BaseGame/game/data/UI/guis/IODropdownDlg.ed.gui b/Templates/BaseGame/game/data/UI/guis/IODropdownDlg.ed.gui deleted file mode 100644 index 6a98fe6d7..000000000 --- a/Templates/BaseGame/game/data/UI/guis/IODropdownDlg.ed.gui +++ /dev/null @@ -1,159 +0,0 @@ -//--- OBJECT WRITE BEGIN --- -$guiContent = new GuiControl(IODropdownDlg) { - profile = "GuiDefaultProfile"; - horizSizing = "width"; - vertSizing = "height"; - position = "0 0"; - extent = "640 480"; - minExtent = "8 8"; - visible = "1"; - helpTag = "0"; - new GuiWindowCtrl(IODropdownFrame) { - canSaveDynamicFields = "0"; - Profile = "GuiWindowProfile"; - horizSizing = "center"; - vertSizing = "center"; - position = "272 77"; - extent = "256 117"; - minExtent = "256 8"; - canSave = "1"; - Visible = "1"; - hovertime = "1000"; - maxLength = "255"; - resizeWidth = "1"; - resizeHeight = "1"; - canMove = "1"; - canClose = "1"; - canMinimize = "0"; - canMaximize = "0"; - minSize = "50 50"; - text = ""; - closeCommand="IOCallback(IODropdownDlg,IODropdownDlg.cancelCallback);"; - - new GuiMLTextCtrl(IODropdownText) { - text = ""; - maxLength = "1024"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - isContainer = "0"; - profile = "GuiMLTextProfile"; - horizSizing = "center"; - vertSizing = "bottom"; - position = "9 26"; - extent = "237 16"; - minExtent = "8 8"; - canSave = "1"; - visible = "1"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - }; - new GuiBitmapBorderCtrl() { - isContainer = "0"; - profile = "GuiGroupBorderProfile"; - horizSizing = "width"; - vertSizing = "bottom"; - position = "7 51"; - extent = "243 28"; - minExtent = "0 0"; - canSave = "1"; - visible = "1"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - - new GuiTextCtrl(IOInputText) { - text = "Decal Datablock"; - maxLength = "1024"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - isContainer = "0"; - profile = "GuiTextRightProfile"; - horizSizing = "right"; - vertSizing = "bottom"; - position = "5 5"; - extent = "105 18"; - minExtent = "8 2"; - canSave = "1"; - visible = "1"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - }; - new GuiPopUpMenuCtrl(IODropdownMenu) { - maxPopupHeight = "200"; - sbUsesNAColor = "0"; - reverseTextList = "0"; - bitmapBounds = "16 16"; - maxLength = "1024"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - isContainer = "0"; - profile = "GuiPopUpMenuProfile"; - horizSizing = "width"; - vertSizing = "bottom"; - position = "115 5"; - extent = "122 18"; - minExtent = "8 2"; - canSave = "1"; - visible = "1"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - }; - }; - new GuiButtonCtrl() { - text = "OK"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - isContainer = "0"; - profile = "GuiButtonProfile"; - horizSizing = "width"; - vertSizing = "top"; - position = "7 85"; - extent = "156 24"; - minExtent = "8 8"; - canSave = "1"; - visible = "1"; - accelerator = "return"; - command = "IOCallback(IODropdownDlg,IODropdownDlg.callback);"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl() { - text = "Cancel"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - isContainer = "0"; - profile = "GuiButtonProfile"; - horizSizing = "left"; - vertSizing = "top"; - position = "170 85"; - extent = "80 24"; - minExtent = "8 8"; - canSave = "1"; - visible = "1"; - accelerator = "escape"; - command = "IOCallback(IODropdownDlg,IODropdownDlg.cancelCallback);"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - }; - }; -}; -//--- OBJECT WRITE END --- diff --git a/Templates/BaseGame/game/data/UI/guis/MainMenuButtons.asset.taml b/Templates/BaseGame/game/data/UI/guis/MainMenuButtons.asset.taml deleted file mode 100644 index 2ab6cfeef..000000000 --- a/Templates/BaseGame/game/data/UI/guis/MainMenuButtons.asset.taml +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/Templates/BaseGame/game/data/UI/guis/MainMenuButtons.gui b/Templates/BaseGame/game/data/UI/guis/MainMenuButtons.gui deleted file mode 100644 index de086ec19..000000000 --- a/Templates/BaseGame/game/data/UI/guis/MainMenuButtons.gui +++ /dev/null @@ -1,84 +0,0 @@ -//--- OBJECT WRITE BEGIN --- -$guiContent = new GuiControl(MainMenuButtons) { - extent = "1024 768"; - horizSizing = "width"; - vertSizing = "height"; - profile = "GuiNonModalDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "1"; - canSaveDynamicFields = "1"; - originalAssetName = "MainMenuButtons"; - - new GuiStackControl(MainMenuButtonList) { - padding = "15"; - dynamicSize = "0"; - position = "312 145"; - extent = "400 477"; - horizSizing = "center"; - vertSizing = "center"; - profile = "GuiDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - superClass = "MenuList"; - - new GuiButtonCtrl(MainMenuSinglePlayerBtn) { - text = "Single Player"; - extent = "400 55"; - profile = "GuiMenuButtonProfile"; - command = "openSinglePlayerMenu();"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiButtonCtrl(MainMenuCreateSrvrBtn) { - text = "Create Server"; - position = "0 70"; - extent = "400 55"; - profile = "GuiMenuButtonProfile"; - command = "openMultiPlayerMenu();"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiButtonCtrl(MainMenuJoinSrvrBtn) { - text = "Join Server"; - position = "0 140"; - extent = "400 55"; - profile = "GuiMenuButtonProfile"; - command = "openJoinServerMenu();"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiButtonCtrl(MainMenuOptionBtn) { - text = "Options"; - position = "0 210"; - extent = "400 55"; - profile = "GuiMenuButtonProfile"; - command = "openOptionsMenu();"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiButtonCtrl(MainMenuWorldEditBtn) { - text = "Open World Editor (F11)"; - position = "0 280"; - extent = "400 55"; - profile = "GuiMenuButtonProfile"; - command = "openWorldEditorBtn();"; - tooltipProfile = "GuiToolTipProfile"; - enabled = (ModuleDatabase.findModule("ToolsModule") !$= ""); - visible = (ModuleDatabase.findModule("ToolsModule") !$= ""); - }; - new GuiButtonCtrl(MainMenuGuiEditBtn) { - text = "Open GUI Editor (F10)"; - position = "0 350"; - extent = "400 55"; - profile = "GuiMenuButtonProfile"; - command = "openGUIEditorBtn();"; - tooltipProfile = "GuiToolTipProfile"; - enabled = (ModuleDatabase.findModule("ToolsModule") !$= ""); - visible = (ModuleDatabase.findModule("ToolsModule") !$= ""); - }; - new GuiButtonCtrl(MainMenuExitBtn) { - text = "Exit"; - position = "0 420"; - extent = "400 55"; - profile = "GuiMenuButtonProfile"; - command = "quit();"; - tooltipProfile = "GuiToolTipProfile"; - }; - }; -}; -//--- OBJECT WRITE END --- diff --git a/Templates/BaseGame/game/data/UI/guis/MainMenuButtons.tscript b/Templates/BaseGame/game/data/UI/guis/MainMenuButtons.tscript deleted file mode 100644 index be79f9dd3..000000000 --- a/Templates/BaseGame/game/data/UI/guis/MainMenuButtons.tscript +++ /dev/null @@ -1,116 +0,0 @@ -function MainMenuButtons::onWake(%this) -{ -} - -function MainMenuButtons::onSleep(%this) -{ -} - -//============================================================================== -// This gets called by the MainMenuGUI beacuse it, being a UINavigation classed control -// set MainMenuButtonList as it's root page. -// This is an optional function, but is called as part of the validation that the page -// CAN be opened, so it's shown here as an example -function MainMenuButtons::canOpen(%this) -{ - return true; -} - -//============================================================================== -// This gets called by the MainMenuGUI beacuse it, being a UINavigation classed control -// set MainMenuButtonList as it's root page. -// Once the page is added to the MainMenuGUI's UINavigation page stack, onOpen here is called -// Which allows us to actually do the work we need to do for display -function MainMenuButtons::onOpen(%this) -{ - //Here, we set the MainMenuButtonList - a GuiStackControl with the MenuList class - // to be the active menu list. - // This means that when the MainMenuGUI's MainMenuInputHandler receives an input - // or we have one of the buttons in the MainMenuButtonHolder be actioned, we know - // we're working/navigating this list of buttons specifically - // In practice, it sets the $activeMenuList global variable so the various menu class code - // can reference it consistently - MainMenuButtonList.setAsActiveMenuList(); - - //Because MainMenuGUI set it's MainMenuButtonHolder as the active button container, we can reference it - //by $activeMenuButtonContainer and set the menu button/accelerator prompts we need for the MainMenuButtonList - //specifically. - //In particular, being a simple list of buttons, the only one we NEED is a simple activate, so we'll - //disable all the other ones to keep them clear in case they were set by other pages at some point - $activeMenuButtonContainer-->button1.disable(); - $activeMenuButtonContainer-->button2.disable(); - $activeMenuButtonContainer-->button3.disable(); - - //Here we set the 4th button in the container - //All the buttons have the MenuInputButton class, which, like the other classes - //help keep things accessible and consistent. Here we use that class's set function to - //configure the accelerator behavior - //The first parameter sets the gamepad button to the 'A' button - //The second sets the keyboard button to Enter or Return - //Third is what the displayed text will be - //And finally we set the command when the button is clicked, or either key inputs are caught by - //our MenuInputHandler - //The menu buttons automatically detect which input device you're using and swap the display between - //gamepad or keyboard for consistent behavior - $activeMenuButtonContainer-->button4.set("btn_a", "Return", "Go", "MainMenuButtonList.activate();"); - $activeMenuButtonContainer-->button5.disable(); -} - -//Optional, as the check defaults to true, but here as an example case -function MainMenuButtons::canClose(%this) -{ - return true; -} - - -function MainMenuButtons::onClose(%this) -{ -} - -//Our actual commands when we activate the buttons -function openSinglePlayerMenu() -{ - $pref::HostMultiPlayer=false; - MainMenuGui.pushPage(ChooseLevelDlg); -} - -function openMultiPlayerMenu() -{ - $pref::HostMultiPlayer=true; - - //Here, like the other commands, we add a new page onto the stack - //In this case, we'll push the ChooseLevelDlg control onto the stack. This will - //invoke the canClose() and then onClose() functions for MainMenuButtonList - //before calling the onOpen() for ChooseLevelDlg then displaying. - MainMenuGui.pushPage(ChooseLevelDlg); -} - -function openJoinServerMenu() -{ - //Here, like the other commands, we add a new page onto the stack - //In this case, we'll push the JoinServerMenu control onto the stack. This will - //invoke the canClose() and then onClose() functions for MainMenuButtonList - //before calling the onOpen() for JoinServerMenu then displaying. - MainMenuGui.pushPage(JoinServerMenu); -} - -function openOptionsMenu() -{ - //Here, like the other commands, we add a new page onto the stack - //In this case, we'll push the OptionsMenu control onto the stack. This will - //invoke the canClose() and then onClose() functions for MainMenuButtonList - //before calling the onOpen() for OptionsMenu then displaying. - //The options menu additionally has an example of why we may want to capitalize on the - //canClose() call. - MainMenuGui.pushPage(OptionsMenu); -} - -function openWorldEditorBtn() -{ - fastLoadWorldEdit(1); -} - -function openGUIEditorBtn() -{ - fastLoadGUIEdit(1); -} \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/guis/PauseMenu.asset.taml b/Templates/BaseGame/game/data/UI/guis/PauseMenu.asset.taml deleted file mode 100644 index 08a16f03d..000000000 --- a/Templates/BaseGame/game/data/UI/guis/PauseMenu.asset.taml +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/Templates/BaseGame/game/data/UI/guis/RecordingsDlg.gui b/Templates/BaseGame/game/data/UI/guis/RecordingsDlg.gui deleted file mode 100644 index c13008f11..000000000 --- a/Templates/BaseGame/game/data/UI/guis/RecordingsDlg.gui +++ /dev/null @@ -1,230 +0,0 @@ -//--- OBJECT WRITE BEGIN --- -$guiContent = new GuiControl(recordingsDlg) { - position = "0 0"; - extent = "1024 768"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "1"; - helpTag = "0"; - - new GuiWindowCtrl() { - text = "Demo Recordings"; - resizeWidth = "0"; - resizeHeight = "0"; - canMove = "1"; - canClose = "1"; - canMinimize = "0"; - canMaximize = "0"; - canCollapse = "0"; - closeCommand = "Canvas.popDialog(recordingsDlg);"; - edgeSnap = "1"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "247 215"; - extent = "530 338"; - minExtent = "48 92"; - horizSizing = "center"; - vertSizing = "center"; - profile = "GuiWindowProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiScrollCtrl() { - willFirstRespond = "1"; - hScrollBar = "dynamic"; - vScrollBar = "alwaysOn"; - lockHorizScroll = "0"; - lockVertScroll = "0"; - constantThumbHeight = "0"; - childMargin = "0 0"; - mouseWheelScrollSpeed = "-1"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "23 60"; - extent = "484 237"; - minExtent = "32 32"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiScrollProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiTextListCtrl(RecordingsDlgList) { - columns = "0"; - fitParentWidth = "1"; - clipColumnText = "0"; - position = "1 1"; - extent = "469 32"; - minExtent = "8 20"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextArrayProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - }; - new GuiButtonCtrl(DR_CancelBtn) { - text = "Cancel"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "396 306"; - extent = "110 20"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "top"; - profile = "GuiButtonProfile"; - visible = "1"; - active = "1"; - command = "Canvas.popDialog(recordingsDlg);"; - accelerator = "escape"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl(DR_StartDemoBtn) { - text = "Play"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "25 305"; - extent = "110 20"; - minExtent = "8 8"; - horizSizing = "right"; - vertSizing = "top"; - profile = "GuiButtonProfile"; - visible = "1"; - active = "1"; - command = "StartSelectedDemo();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "During gameplay press the following keys:"; - maxLength = "1024"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "23 30"; - extent = "206 18"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Start = F3"; - maxLength = "1024"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "253 32"; - extent = "50 15"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiTextCtrl() { - text = "Stop = F4"; - maxLength = "1024"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; - position = "320 32"; - extent = "49 13"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiTextProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl(DR_DelDemoBtn) { - text = "Delete"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "210 305"; - extent = "110 20"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiButtonProfile"; - visible = "1"; - active = "1"; - command = "deleteDemoRecord();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - }; -}; -//--- OBJECT WRITE END --- - diff --git a/Templates/BaseGame/game/data/UI/guis/SystemMenu.asset.taml b/Templates/BaseGame/game/data/UI/guis/SystemMenu.asset.taml new file mode 100644 index 000000000..e5e752734 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/guis/SystemMenu.asset.taml @@ -0,0 +1,5 @@ + diff --git a/Templates/BaseGame/game/data/UI/guis/SystemMenu.gui b/Templates/BaseGame/game/data/UI/guis/SystemMenu.gui new file mode 100644 index 000000000..381762506 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/guis/SystemMenu.gui @@ -0,0 +1,52 @@ +//--- OBJECT WRITE BEGIN --- +$guiContent = new GuiControl(SystemMenu) { + extent = "1280 720"; + profile = "GuiNonModalDefaultProfile"; + tooltipProfile = "GuiToolTipProfile"; + isContainer = "1"; + canSaveDynamicFields = "1"; + + new GuiStackControl(SystemMenuButtonList) { + padding = "5"; + dynamicSize = "0"; + position = "440 263"; + extent = "400 189"; + horizSizing = "center"; + vertSizing = "center"; + profile = "GuiDefaultProfile"; + tooltipProfile = "GuiToolTipProfile"; + + new GuiButtonCtrl() { + text = "Return to Game"; + extent = "400 40"; + profile = "GuiMenuButtonProfile"; + command = "Canvas.popDialog(GameMenu);"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiButtonCtrl() { + text = "Options"; + position = "0 45"; + extent = "400 40"; + profile = "GuiMenuButtonProfile"; + command = "Canvas.pushDialog(OptionsMenu);"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiButtonCtrl() { + text = "Exit to Menu"; + position = "0 90"; + extent = "400 40"; + profile = "GuiMenuButtonProfile"; + command = "systemMenuExitToMenu();"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiButtonCtrl() { + text = "Exit to Desktop"; + position = "0 135"; + extent = "400 40"; + profile = "GuiMenuButtonProfile"; + command = "systemMenuExitToDesktop();"; + tooltipProfile = "GuiToolTipProfile"; + }; + }; +}; +//--- OBJECT WRITE END --- diff --git a/Templates/BaseGame/game/data/UI/guis/SystemMenu.tscript b/Templates/BaseGame/game/data/UI/guis/SystemMenu.tscript new file mode 100644 index 000000000..2b6b8ed27 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/guis/SystemMenu.tscript @@ -0,0 +1,37 @@ +function SystemMenu::onWake(%this) +{ + $MenuList = SystemMenuButtonList; + $MenuList.listPosition = 0; +} + +function SystemMenu::onSleep(%this) +{ + +} + +function systemMenuExitToMenu() +{ + MessageBoxOKCancel("Exit?", "Do you wish to exit to the Main Menu?", "escapeFromGame();", ""); +} + +function systemMenuExitToDesktop() +{ + MessageBoxOKCancel("Exit?", "Do you wish to exit to the desktop?", "quit();", ""); +} + +function SystemMenuButtonList::syncGUI(%this) +{ + %this.callOnChildren("setHighlighted", false); + + %btn = %this.getObject(%this.listPosition); + %btn.setHighlighted(true); + + // + //Update the button imagery to comply to the last input device we'd used + %device = Canvas.getLastInputDevice(); + if(%device $= "mouse") + %device = "keyboard"; + + //We'll call back to the GameMenu parent just to be sure everything's on the same page + GameMenu.syncGui(); +} \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/guis/chooseLevelDlg.gui b/Templates/BaseGame/game/data/UI/guis/chooseLevelDlg.gui deleted file mode 100644 index 414f1ccb3..000000000 --- a/Templates/BaseGame/game/data/UI/guis/chooseLevelDlg.gui +++ /dev/null @@ -1,106 +0,0 @@ -//--- OBJECT WRITE BEGIN --- -$guiContent = new GuiControl(ChooseLevelDlg) { - extent = "1024 768"; - minExtent = "8 8"; - horizSizing = "width"; - vertSizing = "height"; - profile = "GuiNonModalDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "1"; - canSaveDynamicFields = "1"; - Enabled = "1"; - launchInEditor = "0"; - returnGui = "MainMenuGui"; - - new GuiControl(ChooseLevelWindow) { - position = "48 56"; - extent = "928 655"; - horizSizing = "center"; - vertSizing = "center"; - profile = "GuiDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "1"; - - new GuiBitmapBarCtrl() { - BitmapAsset = "UI:panel_image"; - extent = "927 40"; - horizSizing = "width"; - profile = "GuiDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiTextCtrl(LevelSelectTitle) { - text = "SINGLE PLAYER"; - position = "22 10"; - extent = "307 28"; - profile = "MenuHeaderText"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiBitmapBarCtrl() { - BitmapAsset = "UI:panel_low_image"; - position = "0 40"; - extent = "927 618"; - horizSizing = "width"; - profile = "GuiDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiBitmapCtrl() { - BitmapAsset = "Core_Rendering:missingTexture_image"; - position = "513 71"; - extent = "400 300"; - profile = "GuiDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - internalName = "CurrentPreview"; - canSaveDynamicFields = "1"; - Enabled = "1"; - }; - new GuiTextCtrl() { - text = "Example Level"; - maxLength = "255"; - position = "514 375"; - extent = "398 27"; - minExtent = "8 8"; - profile = "MenuHeaderText"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "0"; - internalName = "LevelName"; - }; - new GuiTextCtrl() { - text = "Description:"; - maxLength = "255"; - position = "522 410"; - extent = "91 18"; - minExtent = "8 8"; - profile = "MenuSubHeaderText"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "0"; - internalName = "LevelDescriptionLabel"; - }; - new GuiMLTextCtrl() { - text = "This is placeholder text"; - position = "522 436"; - extent = "391 14"; - minExtent = "8 8"; - profile = "GuiMLWhiteTextProfile"; - tooltipProfile = "GuiToolTipProfile"; - internalName = "LevelDescription"; - }; - new GuiScrollCtrl() { - hScrollBar = "dynamic"; - vScrollBar = "dynamic"; - position = "0 40"; - extent = "450 580"; - profile = "GuiMenuScrollProfile"; - tooltipProfile = "GuiToolTipProfile"; - - new GuiGameListMenuCtrl(LevelList) { - callbackOnInputs = "1"; - position = "1 1"; - extent = "450 90"; - profile = "DefaultListMenuProfile"; - tooltipProfile = "GuiToolTipProfile"; - class = "UIMenuButtonList"; - }; - }; - }; -}; -//--- OBJECT WRITE END --- diff --git a/Templates/BaseGame/game/data/UI/guis/chooseLevelDlg.tscript b/Templates/BaseGame/game/data/UI/guis/chooseLevelDlg.tscript deleted file mode 100644 index b39db49d1..000000000 --- a/Templates/BaseGame/game/data/UI/guis/chooseLevelDlg.tscript +++ /dev/null @@ -1,210 +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. -//----------------------------------------------------------------------------- - -//---------------------------------------- -function ChooseLevelDlg::onWake( %this ) -{ - if(!isObject(LevelListEntries)) - new ArrayObject(LevelListEntries){}; - - if(!isObject(ChooseLevelAssetQuery)) - new AssetQuery(ChooseLevelAssetQuery); -} - -function ChooseLevelDlg::onOpen(%this) -{ - LevelList.clearRows(); - LevelListEntries.empty(); - - ChooseLevelWindow->CurrentPreview.setBitmap("UI:no_preview_image"); - ChooseLevelWindow->LevelDescriptionLabel.visible = false; - ChooseLevelWindow->LevelDescription.visible = false; - - ChooseLevelAssetQuery.clear(); - AssetDatabase.findAssetType(ChooseLevelAssetQuery, "LevelAsset"); - - %count = ChooseLevelAssetQuery.getCount(); - - if(%count == 0 && !IsDirectory("tools")) - { - //We have no levels found. Prompt the user to open the editor to the default level if the tools are present - MessageBoxOK("Error", "No levels were found in any modules. Please ensure you have modules loaded that contain gameplay code and level files.", - "Canvas.popDialog(ChooseLevelDlg); if(isObject(ChooseLevelDlg.returnGui) && ChooseLevelDlg.returnGui.isMethod(\"onReturnTo\")) ChooseLevelDlg.returnGui.onReturnTo();"); - - ChooseLevelAssetQuery.delete(); - return; - } - - for(%i=0; %i < %count; %i++) - { - %assetId = ChooseLevelAssetQuery.getAsset(%i); - - if(AssetDatabase.getAssetModule(%assetId).ModuleId $= "ToolsModule") - continue; - - %levelAsset = AssetDatabase.acquireAsset(%assetId); - - %file = %levelAsset.getLevelPath(); - - if ( !isFile(%file @ ".mis") && !isFile(%file @ ".mis.dso") &&!isFile(%file) ) - continue; - - // Skip our new level/mission if we arent choosing a level - // to launch in the editor. - if ( !%this.launchInEditor ) - { - %fileName = fileName(%file); - if (strstr(%fileName, "newMission.mis") > -1 || strstr(%fileName, "newLevel.mis") > -1) - continue; - } - - %this.addLevelAsset( %levelAsset ); - } - - // Also add the new level mission as defined in the world editor settings - // if we are choosing a level to launch in the editor. - if ( %this.launchInEditor ) - { - %this.addMissionFile( "tools/levels/DefaultEditorLevel.mis" ); - } - - for(%i=0; %i < LevelListEntries.count(); %i++) - { - %levelAsset = LevelListEntries.getKey(%i); - - LevelList.addRow(%levelAsset.LevelName, "", -1, -30); - } - - LevelList.setSelected(0); - LevelList.onChange(); - - if(!$pref::HostMultiPlayer) - LevelSelectTitle.setText("SINGLE PLAYER"); - else - LevelSelectTitle.setText("CREATE SERVER"); - - $activeMenuButtonContainer-->button1.disable(); - $activeMenuButtonContainer-->button2.disable(); - $activeMenuButtonContainer-->button3.disable(); - $activeMenuButtonContainer-->button4.set("btn_a", "Return", "Start Level", "ChooseLevelDlg.beginLevel();"); - $activeMenuButtonContainer-->button5.set("btn_b", "Escape", "Back", %this @ ".navigation.popPage();"); -} - -function ChooseLevelDlg::onSleep( %this ) -{ - // This is set from the outside, only stays true for a single wake/sleep - // cycle. - %this.launchInEditor = false; -} - -function ChooseLevelDlg::addMissionFile( %this, %file ) -{ - %levelName = fileBase(%file); - %levelDesc = "A Torque level"; - - %LevelInfoObject = getLevelInfo(%file); - - if (%LevelInfoObject != 0) - { - if(%LevelInfoObject.levelName !$= "") - %levelName = %LevelInfoObject.levelName; - else if(%LevelInfoObject.name !$= "") - %levelName = %LevelInfoObject.name; - - if (%LevelInfoObject.desc0 !$= "") - %levelDesc = %LevelInfoObject.desc0; - - if (%LevelInfoObject.preview !$= "") - %levelPreview = %LevelInfoObject.preview; - - %LevelInfoObject.delete(); - } - - LevelListEntries.add( %levelName TAB %file TAB %levelDesc TAB %levelPreview ); -} - -function ChooseLevelDlg::addLevelAsset( %this, %levelAsset ) -{ - LevelListEntries.add( %levelAsset ); -} - -function LevelList::onChange(%this) -{ - %index = %this.getSelectedRow(); - - %levelAsset = LevelListEntries.getKey(%index); - - // Get the name - ChooseLevelWindow->LevelName.text = %levelAsset.LevelName; - - // Get the level id - $selectedLevelAsset = %levelAsset.getAssetId(); - - // Find the preview image - %levelPreview = %levelAsset.getPreviewImagePath(); - - // Test against all of the different image formats - // This should probably be moved into an engine function - if (isFile(%levelPreview)) - ChooseLevelWindow->CurrentPreview.setBitmap(%levelPreview); - else - ChooseLevelWindow->CurrentPreview.setBitmap("UI:no_preview_image"); - - // Get the description - %levelDesc = %levelAsset.description; - - if(%levelDesc !$= "") - { - ChooseLevelWindow->LevelDescriptionLabel.setVisible(true); - ChooseLevelWindow->LevelDescription.setVisible(true); - ChooseLevelWindow->LevelDescription.setText(%levelDesc); - } - else - { - ChooseLevelWindow->LevelDescriptionLabel.setVisible(false); - ChooseLevelWindow->LevelDescription.setVisible(false); - } - -} - -// Do this onMouseUp not via Command which occurs onMouseDown so we do -// not have a lingering mouseUp event lingering in the ether. -function ChooseLevelDlg::beginLevel(%this) -{ - // So we can't fire the button when loading is in progress. - if ( isObject( ServerGroup ) ) - return; - - %this.navigation.popPage(); - - // Launch the chosen level with the editor open? - if ( ChooseLevelDlg.launchInEditor ) - { - activatePackage( "BootEditor" ); - ChooseLevelDlg.launchInEditor = false; - StartGame("", "SinglePlayer"); - } - else - { - StartGame(); - } -} diff --git a/Templates/BaseGame/game/data/UI/guis/guiMusicPlayer.gui b/Templates/BaseGame/game/data/UI/guis/guiMusicPlayer.gui deleted file mode 100644 index cfd2c3e96..000000000 --- a/Templates/BaseGame/game/data/UI/guis/guiMusicPlayer.gui +++ /dev/null @@ -1,192 +0,0 @@ -//--- OBJECT WRITE BEGIN --- -$guiContent = new GuiControl(GuiMusicPlayer) { - isContainer = "1"; - Profile = "GuiWindowProfile"; - HorizSizing = "right"; - VertSizing = "bottom"; - position = "0 0"; - Extent = "1024 768"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "1"; - superClass = "GuiMusicPlayerClass"; - - new GuiWindowCtrl() { - resizeWidth = "0"; - resizeHeight = "0"; - canMove = "1"; - canClose = "1"; - canMinimize = "1"; - canMaximize = "1"; - minSize = "50 50"; - EdgeSnap = "1"; - text = "Torque Music Player"; - Margin = "0 0 0 0"; - Padding = "0 0 0 0"; - AnchorTop = "1"; - AnchorBottom = "0"; - AnchorLeft = "1"; - AnchorRight = "0"; - isContainer = "1"; - Profile = "GuiWindowProfile"; - HorizSizing = "right"; - VertSizing = "bottom"; - position = "29 35"; - Extent = "518 377"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - closeCommand = "toggleMusicPlayer();"; - - new GuiCheckBoxCtrl(GuiMusicPlayerFadeCheckBox) { - useInactiveState = "0"; - text = "Fade"; - groupNum = "-1"; - buttonType = "ToggleButton"; - useMouseEvents = "0"; - isContainer = "0"; - Profile = "GuiCheckBoxProfile"; - HorizSizing = "right"; - VertSizing = "bottom"; - position = "457 347"; - Extent = "53 30"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - }; - new GuiCheckBoxCtrl(GuiMusicPlayerLoopCheckBox) { - useInactiveState = "0"; - text = "Loop"; - groupNum = "-1"; - buttonType = "ToggleButton"; - useMouseEvents = "0"; - isContainer = "0"; - Profile = "GuiCheckBoxProfile"; - HorizSizing = "right"; - VertSizing = "bottom"; - position = "457 330"; - Extent = "44 30"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - }; - new GuiScrollCtrl() { - willFirstRespond = "1"; - hScrollBar = "dynamic"; - vScrollBar = "alwaysOn"; - lockHorizScroll = "0"; - lockVertScroll = "0"; - constantThumbHeight = "0"; - childMargin = "0 0"; - mouseWheelScrollSpeed = "-1"; - Margin = "0 0 0 0"; - Padding = "0 0 0 0"; - AnchorTop = "1"; - AnchorBottom = "0"; - AnchorLeft = "1"; - AnchorRight = "0"; - isContainer = "1"; - Profile = "GuiScrollProfile"; - HorizSizing = "right"; - VertSizing = "bottom"; - position = "9 31"; - Extent = "500 298"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - - new GuiListBoxCtrl(GuiMusicPlayerMusicList) { - AllowMultipleSelections = "1"; - fitParentWidth = "1"; - isContainer = "0"; - Profile = "GuiListBoxProfile"; - HorizSizing = "right"; - VertSizing = "bottom"; - position = "1 1"; - Extent = "485 2"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - superClass = "GuiMusicPlayerMusicListClass"; - }; - }; - new GuiSliderCtrl(GuiMusicPlayerScrubber) { - range = "0 1"; - ticks = "10"; - value = "0"; - snap = "false"; - isContainer = "0"; - Profile = "GuiSliderProfile"; - HorizSizing = "right"; - VertSizing = "bottom"; - position = "114 343"; - Extent = "331 23"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - Command = "$thisControl.onDragComplete();"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - class = "GuiMusicPlayerScrubberClass"; - className = "GuiMusicPlayerScrubberClass"; - }; - new GuiButtonCtrl(GuiMusicPlayerStopButton) { - text = "Stop"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - isContainer = "0"; - Profile = "GuiButtonProfile"; - HorizSizing = "right"; - VertSizing = "bottom"; - position = "57 338"; - Extent = "40 30"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - Command = "GuiMusicPlayer.stop();"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - }; - new GuiButtonCtrl(GuiMusicPlayerPlayButton) { - text = "Play"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - isContainer = "0"; - Profile = "GuiButtonProfile"; - HorizSizing = "right"; - VertSizing = "bottom"; - position = "13 338"; - Extent = "40 30"; - MinExtent = "8 2"; - canSave = "1"; - Visible = "1"; - Command = "GuiMusicPlayer.play();"; - tooltipprofile = "GuiToolTipProfile"; - hovertime = "1000"; - canSaveDynamicFields = "0"; - }; - }; -}; -//--- OBJECT WRITE END --- diff --git a/Templates/BaseGame/game/data/UI/guis/guiMusicPlayer.tscript b/Templates/BaseGame/game/data/UI/guis/guiMusicPlayer.tscript deleted file mode 100644 index 2a302e635..000000000 --- a/Templates/BaseGame/game/data/UI/guis/guiMusicPlayer.tscript +++ /dev/null @@ -1,236 +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. -//----------------------------------------------------------------------------- - -// A very simple music player. -//--------------------------------------------------------------------------------------------- -// Preferences. - -$pref::GuiMusicPlayer::filePattern = "*.ogg\t*.wav"; -$pref::GuiMusicPlayer::fadeTime = "3.0"; - -//--------------------------------------------------------------------------------------------- -// Datablocks. - -singleton SFXDescription( GuiMusicPlayerStream : AudioMusic2D ) -{ - volume = 1.0; - isLooping = false; - isStreaming = true; - is3D = false; -}; -singleton SFXDescription( GuiMusicPlayerLoopingStream : AudioMusic2D ) -{ - volume = 1.0; - isLooping = true; - isStreaming = true; - is3D = false; -}; - -//--------------------------------------------------------------------------------------------- -// Functions. - -function toggleMusicPlayer() -{ - if( !GuiMusicPlayer.isAwake() ) - { - GuiMusicPlayer.setExtent( Canvas.getExtent() ); - GuiMusicPlayer.setPosition( 0, 0 ); - - Canvas.pushDialog( GuiMusicPlayer ); - } - else - Canvas.popDialog( GuiMusicPlayer ); -} - -//--------------------------------------------------------------------------------------------- -// Methods. - -function GuiMusicPlayer_onSFXSourceStatusChange( %id, %status ) -{ - if( %status $= "Stopped" ) - GuiMusicPlayer.onStop(); -} - -function GuiMusicPlayerClass::play( %this ) -{ - if( %this.status $= "Stopped" - || %this.status $= "Paused" - || %this.status $= "" ) - { - %isPlaying = true; - if( %this.status $= "Paused" && isObject( %this.sfxSource ) ) - %this.sfxSource.play(); - else - { - %sel = GuiMusicPlayerMusicList.getSelectedItem(); - if( %sel == -1 ) - %isPlaying = false; - else - { - %desc = GuiMusicPlayerStream; - if( GuiMusicPlayerLoopCheckBox.getValue() ) - %desc = GuiMusicPlayerLoopingStream; - - if( GuiMusicPlayerFadeCheckBox.getValue() ) - { - %desc.fadeInTime = $pref::GuiMusicPlayer::fadeTime; - %desc.fadeOutTime = $pref::GuiMusicPlayer::fadeTime; - } - else - { - %desc.fadeInTime = 0; - %desc.fadeOutTime = 0; - } - - %file = GuiMusicPlayerMusicList.getItemText( %sel ); - %this.sfxSource = sfxPlayOnce( %desc, %file ); - if( !%this.sfxSource ) - %isPlaying = false; - else - { - %this.sfxSource.statusCallback = "GuiMusicPlayer_onSFXSourceStatusChange"; - GuiMusicPlayer.status = "Playing"; - - GuiMusicPlayerScrubber.setActive( true ); - GuiMusicPlayerScrubber.setup( %this.sfxSource.getDuration() ); - } - } - } - - if( %isPlaying ) - { - GuiMusicPlayerPlayButton.setText( "Pause" ); - GuiMusicPlayerPlayButton.command = "GuiMusicPlayer.pause();"; - GuiMusicPlayerLoopCheckBox.setActive( false ); - GuiMusicPlayerFadeCheckBox.setActive( false ); - %this.status = "Playing"; - } - } -} - -function GuiMusicPlayerClass::stop( %this ) -{ - if( %this.status $= "Playing" - || %this.status $= "Paused" ) - { - if( isObject( %this.sfxSource ) ) - %this.sfxSource.stop( 0 ); // Stop immediately. - } -} - -function GuiMusicPlayerClass::onStop( %this ) -{ - %this.sfxSource = 0; - - GuiMusicPlayerLoopCheckBox.setActive( true ); - GuiMusicPlayerFadeCheckBox.setActive( true ); - GuiMusicPlayerScrubber.setActive( false ); - GuiMusicPlayerPlayButton.setText( "Play" ); - GuiMusicPlayerPlayButton.Command = "GuiMusicPlayer.play();"; - %this.status = "Stopped"; - - GuiMusicPlayerScrubber.setValue( 0 ); -} - -function GuiMusicPlayerClass::pause( %this ) -{ - if( %this.status $= "Playing" ) - { - if( isObject( %this.sfxSource ) ) - %this.sfxSource.pause( 0 ); - - GuiMusicPlayerPlayButton.setText( "Play" ); - GuiMusicPlayerPlayButton.command = "GuiMusicPlayer.play();"; - %this.status = "Paused"; - } -} - -function GuiMusicPlayerClass::seek( %this, %playtime ) -{ - if( ( %this.status $= "Playing" - || %this.status $= "Paused" ) - && isObject( %this.sfxSource ) ) - %this.sfxSource.setPosition( %playtime ); -} - -function GuiMusicPlayer::onWake( %this ) -{ - GuiMusicPlayerMusicList.load(); -} - -function GuiMusicPlayerMusicListClass::load( %this ) -{ - // Remove all the files currently in the list. - - %this.clearItems(); - - // Find the file matching pattern we should use. - - %filePattern = $pref::GuiMusicPlayer::filePattern; - %sfxProvider = getWord( sfxGetDeviceInfo(), 0 ); - %filePatternVarName = "$pref::GuiMusicPlayer::filePattern" @ %sfxProvider; - if( isDefined( %filePatternVarName ) ) - eval( "%filePattern = " @ %filePatternVarName @ ";" ); - - // Find all files matching the pattern. - - for( %file = findFirstFileMultiExpr( %filePattern ); - %file !$= ""; - %file = findNextFileMultiExpr( %filePattern ) ) - %this.addItem( makeRelativePath( %file, getMainDotCsDir() ) ); -} - -function GuiMusicPlayerMusicList::onDoubleClick( %this ) -{ - GuiMusicPlayer.stop(); - GuiMusicPlayer.play(); -} - -function GuiMusicPlayerScrubber::onMouseDragged( %this ) -{ - %this.isBeingDragged = true; -} - -function GuiMusicPlayerScrubberClass::setup( %this, %totalPlaytime ) -{ - %this.range = "0 " @ %totalPlaytime; - %this.ticks = %totalPlaytime / 5; // One tick per five seconds. - - %this.update(); -} - -function GuiMusicPlayerScrubberClass::update( %this ) -{ - if( GuiMusicPlayer.status $= "Playing" - && !%this.isBeingDragged ) - %this.setValue( GuiMusicPlayer.sfxSource.getPosition() ); - - if( GuiMusicPlayer.status $= "Playing" - || GuiMusicPlayer.status $= "Paused" ) - %this.schedule( 5, "update" ); -} - -function GuiMusicPlayerScrubberClass::onDragComplete( %this ) -{ - GuiMusicPlayer.seek( %this.getValue() ); - %this.isBeingDragged = false; -} diff --git a/Templates/BaseGame/game/data/UI/guis/joinServerMenu.gui b/Templates/BaseGame/game/data/UI/guis/joinServerMenu.gui index 758d1bf32..fe2575ca2 100644 --- a/Templates/BaseGame/game/data/UI/guis/joinServerMenu.gui +++ b/Templates/BaseGame/game/data/UI/guis/joinServerMenu.gui @@ -1,159 +1,160 @@ //--- OBJECT WRITE BEGIN --- $guiContent = new GuiControl(JoinServerMenu) { - extent = "1024 768"; - profile = "GuiNonModalDefaultProfile"; + extent = "1280 720"; + horizSizing = "width"; + vertSizing = "height"; + profile = "GuiMenuBackgroundProfile"; tooltipProfile = "GuiToolTipProfile"; isContainer = "1"; + canSaveDynamicFields = "1"; + + new GuiInputCtrl(JoinServerInputHandler) { + ignoreMouseEvents = "1"; + ActionMap = "JoinServerActionMap"; + position = "-50 0"; + extent = "50 50"; horizSizing = "width"; vertSizing = "height"; - canSaveDynamicFields = "0"; - - new GuiControl(JoinServerWindow) { - position = "48 56"; - extent = "928 655"; - horizSizing = "center"; - vertSizing = "center"; - profile = "GuiDefaultProfile"; + profile = "GuiInputCtrlProfile"; + tooltipProfile = "GuiToolTipProfile"; + }; + + new GuiPanel(JoinServerTitlePanel) { + extent = "1281 60"; + horizSizing = "width"; + profile = "GuiMenuPanelProfile"; tooltipProfile = "GuiToolTipProfile"; - isContainer = "1"; - new GuiBitmapBarCtrl() { - BitmapAsset = "UI:panel_image"; - extent = "927 40"; - horizSizing = "width"; - profile = "GuiDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - }; new GuiTextCtrl() { text = "JOIN SERVER"; - position = "22 10"; - extent = "207 28"; + position = "22 23"; + extent = "220 28"; profile = "MenuHeaderText"; tooltipProfile = "GuiToolTipProfile"; }; - new GuiBitmapBarCtrl() { - BitmapAsset = "UI:panel_low_image"; - position = "0 40"; - extent = "927 618"; - horizSizing = "width"; - profile = "GuiDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiTextCtrl(JS_status) { - text = "No servers found."; - maxLength = "255"; - position = "392 47"; - extent = "148 18"; - minExtent = "8 8"; + }; + new GuiContainer() { + position = "203 61"; + extent = "900 30"; + profile = GuiMenuPanelProfile; + tooltipProfile = "GuiToolTipProfile"; + horizSizing = "center"; + vertSizing = "bottom"; + + new GuiTextCtrl() { + text = "Server Details"; + position = "0 0"; + extent = "700 30"; + horizSizing = "right"; + vertSizing = "center"; profile = "MenuSubHeaderText"; tooltipProfile = "GuiToolTipProfile"; }; - new GuiTextCtrl() { - text = "Players"; - maxLength = "255"; - position = "269 67"; - extent = "36 18"; - minExtent = "8 8"; - profile = "GuiMLWhiteTextProfile"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "0"; - }; - new GuiTextCtrl() { - text = "Version"; - maxLength = "255"; - position = "335 67"; - extent = "38 18"; - minExtent = "8 8"; - profile = "GuiMLWhiteTextProfile"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "0"; - }; - new GuiTextCtrl() { - text = "Game"; - maxLength = "255"; - position = "412 67"; - extent = "28 18"; - minExtent = "8 8"; - profile = "GuiMLWhiteTextProfile"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "0"; - }; + new GuiTextCtrl() { text = "Ping"; - maxLength = "255"; - position = "212 67"; - extent = "20 18"; - minExtent = "8 8"; - profile = "GuiMLWhiteTextProfile"; + position = "700 0"; + extent = "70 30"; + horizSizing = "left"; + vertSizing = "center"; + profile = "MenuSubHeaderCenteredText"; tooltipProfile = "GuiToolTipProfile"; - isContainer = "0"; }; + new GuiTextCtrl() { - text = "Server Name"; - maxLength = "255"; - position = "12 67"; - extent = "63 18"; - minExtent = "8 8"; - profile = "GuiMLWhiteTextProfile"; + text = "Player Count"; + position = "770 0"; + extent = "130 30"; + horizSizing = "left"; + vertSizing = "center"; + profile = "MenuSubHeaderCenteredText"; tooltipProfile = "GuiToolTipProfile"; - isContainer = "0"; }; - new GuiScrollCtrl() { - hScrollBar = "dynamic"; - vScrollBar = "dynamic"; - position = "19 98"; - extent = "890 501"; - minExtent = "8 8"; - profile = "GuiMenuScrollProfile"; - tooltipProfile = "GuiToolTipProfile"; + }; + new GuiScrollCtrl() { + hScrollBar = "alwaysOff"; + vScrollBar = "dynamic"; + position = "203 91"; + extent = "900 621"; + minExtent = "8 8"; + horizSizing = "center"; + vertSizing = "height"; + profile = "GuiMenuScrollProfile"; + tooltipProfile = "GuiToolTipProfile"; - new GuiStackControl(JoinServerList) { - padding = "10"; - changeChildSizeToFit = "0"; - position = "1 1"; - extent = "888 16"; - horizSizing = "center"; - vertSizing = "center"; - profile = "GuiDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - superClass = "MenuList"; - }; + new GuiStackControl(JoinServerList) { + padding = "10"; + changeChildSizeToFit = "0"; + position = "1 1"; + extent = "888 16"; + horizSizing = "center"; + vertSizing = "center"; + profile = "GuiMenuDefaultProfile"; + tooltipProfile = "GuiToolTipProfile"; }; - new GuiControl(JS_queryStatus) { - position = "16 615"; - extent = "900 35"; - profile = "GuiDefaultProfile"; - visible = "0"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "1"; - hidden = "1"; - - new GuiProgressCtrl(JS_statusBar) { - position = "84 0"; - extent = "695 35"; - minExtent = "8 8"; - profile = "GuiProgressProfile"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "0"; - }; - new GuiButtonCtrl(JS_cancelQuery) { - text = "Cancel!"; - extent = "84 35"; - minExtent = "8 8"; - profile = "GuiMenuButtonProfile"; - command = "JoinServerDlg.cancel();"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiTextCtrl(JS_statusText) { - text = "Querying master server"; - maxLength = "255"; - position = "84 0"; - extent = "695 35"; - minExtent = "8 8"; - profile = "GuiMenuButtonProfile"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "0"; }; + new GuiPanel(JoinServerButtonPanel) { + position = "0 683"; + extent = "1281 40"; + horizSizing = "width"; + vertSizing = "top"; + profile = "GuiMenuPanelProfile"; + tooltipProfile = "GuiToolTipProfile"; + + new GuiIconButtonCtrl(JoinServerJoinBtn) { + BitmapAsset = "UI:Keyboard_Black_Return_image"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + text = "Join"; + position = "1115 0"; + extent = "140 40"; + horizSizing = "left"; + vertSizing = "center"; + profile = "GuiMenuButtonProfile"; + command = "JoinServerMenu.join();"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiIconButtonCtrl(JoinServerQLanBtn) { + BitmapAsset = "UI:Keyboard_Black_Escape_image"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + text = "Query Lan"; + position = "965 0"; + extent = "140 40"; + horizSizing = "left"; + vertSizing = "center"; + profile = "GuiMenuButtonProfile"; + command = "JoinServerMenu.queryLan();"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiIconButtonCtrl(JoinServerQServerBtn) { + BitmapAsset = "UI:Keyboard_Black_Escape_image"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + text = "Query Server"; + position = "800 0"; + extent = "160 40"; + horizSizing = "left"; + vertSizing = "center"; + profile = "GuiMenuButtonProfile"; + command = "JoinServerMenu.join();"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiIconButtonCtrl(JoinServerBackBtn) { + BitmapAsset = "UI:Keyboard_Black_Escape_image"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + text = "Back"; + position = "16 0"; + extent = "140 40"; + vertSizing = "center"; + profile = "GuiMenuButtonProfile"; + command = "Canvas.popDialog();"; + tooltipProfile = "GuiToolTipProfile"; }; }; }; diff --git a/Templates/BaseGame/game/data/UI/guis/joinServerMenu.tscript b/Templates/BaseGame/game/data/UI/guis/joinServerMenu.tscript index c4d9fff24..f612a3117 100644 --- a/Templates/BaseGame/game/data/UI/guis/joinServerMenu.tscript +++ b/Templates/BaseGame/game/data/UI/guis/joinServerMenu.tscript @@ -1,22 +1,32 @@ function JoinServerMenu::onWake(%this) { + $MenuList = JoinServerList; + JoinServerList.listPosition = 0; + + JoinServerList.syncGui(); } -function JoinServerMenu::onOpen(%this) +if(!isObject( JoinServerActionMap ) ) { - JoinServerList.setAsActiveMenuList(); - - $activeMenuButtonContainer-->button1.set("btn_y", "R", "Refresh", "JoinServerMenu.refresh();"); - $activeMenuButtonContainer-->button2.set("btn_a", "Q", "Query LAN", "JoinServerMenu.queryLan();"); - $activeMenuButtonContainer-->button3.set("btn_x", "E", "Query Online", "JoinServerMenu.query();"); - $activeMenuButtonContainer-->button4.set("btn_start", "Return", "Join", "JoinServerMenu.join();"); - $activeMenuButtonContainer-->button5.set("btn_b", "Escape", "Back", "cancelServerQuery(); " @ %this @ ".navigation.popPage();"); + new ActionMap(JoinServerActionMap){}; + + JoinServerActionMap.bindCmd( keyboard, q, "JoinServerMenu.query();" ); + JoinServerActionMap.bindCmd( gamepad, btn_x, "JoinServerMenu.query();" ); + + JoinServerActionMap.bindCmd( keyboard, e, "JoinServerMenu.queryLan();" ); + JoinServerActionMap.bindCmd( gamepad, btn_y, "JoinServerMenu.queryLan();" ); + + JoinServerActionMap.bindCmd( keyboard, Enter, "JoinServerMenu::join();" ); + JoinServerActionMap.bindCmd( gamepad, btn_a, "JoinServerMenu::join();" ); } //---------------------------------------- function JoinServerMenu::query(%this) { + //Nuke the current list and indicate we're working on a query... + JoinServerList.clear(); + queryMasterServer( 0, // Query flags $Client::GameTypeQuery, // gameTypes @@ -34,6 +44,9 @@ function JoinServerMenu::query(%this) //---------------------------------------- function JoinServerMenu::queryLan(%this) { + //Nuke the current list and indicate we're working on a query... + JoinServerList.clear(); + queryLANServers( $pref::Net::Port, // lanPort for local queries 0, // Query flags @@ -61,16 +74,14 @@ function JoinServerMenu::cancel(%this) function JoinServerMenu::join(%this) { cancelServerQuery(); - %index = JS_serverList.getSelectedId(); - - JoinGame(%index); + JoinGame(JoinServerList.listPosition); } //---------------------------------------- function JoinServerMenu::refresh(%this) { cancelServerQuery(); - %index= JoinServerList.getActiveRow(); + %index = JoinServerList.listPosition; // The server info index is stored in the row along with the // rest of displayed info. @@ -93,19 +104,19 @@ function JoinServerMenu::update(%this) %sc = getServerCount(); for( %i = 0; %i < %sc; %i ++ ) { setServerInfo(%i); - %serverBtn = new GuiButtonCtrl(){ - text = $ServerInfo::Name TAB - $ServerInfo::Ping TAB - $ServerInfo::PlayerCount @ "/" @ $ServerInfo::MaxPlayers TAB - $ServerInfo::Version TAB - $ServerInfo::MissionName; - profile = GuiJoinServerButtonProfile; - extent = JoinServerList.extent.x SPC 30; - }; - JoinServerList.add(%serverBtn); + + %serverEntry = %this.addServerEntry(); + %serverEntry-->serverNameTxt.text = $ServerInfo::Name; + %serverEntry-->serverDetailsTxt.text = $ServerInfo::MissionName @ " | v" @ $ServerInfo::Version @ " | " @ $ServerInfo::MissionType; + %serverEntry-->pingTxt.text = $ServerInfo::Ping @ " ms"; + %serverEntry-->playerCountTxt.text = $ServerInfo::PlayerCount @ "|" @ $ServerInfo::MaxPlayers; + + %serverEntry.resize(0, 0, JoinServerList.extent.x, %serverEntry.extent.y); + + JoinServerList.add(%serverEntry); } - - $activeMenuButtonContainer-->button4.setActive(JoinServerList.getCount() > 0); + + JoinServerList.syncGui(); } //---------------------------------------- @@ -115,26 +126,147 @@ function onServerQueryStatus(%status, %msg, %value) // Update query status // States: start, update, ping, query, done // value = % (0-1) done for ping and query states - if (!JS_queryStatus.isVisible()) - JS_queryStatus.setVisible(true); + //if (!JS_queryStatus.isVisible()) + // JS_queryStatus.setVisible(true); switch$ (%status) { case "start": - JS_statusText.setText(%msg); - JS_statusBar.setValue(0); + MessagePopup("", %msg, 5000); JoinServerList.clear(); case "ping": - JS_statusText.setText("Ping Servers"); - JS_statusBar.setValue(%value); + MessagePopup("", "Pinging Servers", 5000); case "query": - JS_statusText.setText("Query Servers"); - JS_statusBar.setValue(%value); + MessagePopup("", "Querying Servers", 5000); case "done": - JS_queryStatus.setVisible(false); - JS_status.setText(%msg); + MessagePopup("", %msg, 1000); JoinServerMenu.update(); } } + +function JoinServerMenu::addServerEntry(%this) +{ + %entry = new GuiContainer() { + position = "0 0"; + extent = "900 40"; + profile = GuiMenuDefaultProfile; + tooltipProfile = "GuiToolTipProfile"; + horizSizing = "width"; + vertSizing = "bottom"; + class = "JoinServerServerEntry"; + + new GuiButtonCtrl() { + profile = GuiMenuButtonProfile; + position = "0 0"; + extent = "900 40"; + horizSizing = "width"; + vertSizing = "height"; + internalName = "button"; + class = "JoinServerEntryButton"; + }; + + new GuiTextCtrl() { + position = "0 0"; + extent = "700 20"; + profile = "MenuSubHeaderText"; + tooltipProfile = "GuiToolTipProfile"; + internalName = "serverNameTxt"; + }; + new GuiTextCtrl() { + position = $optionsEntryPad SPC 17; + extent = "700 18"; + profile = "GuiMLTextProfile"; + tooltipProfile = "GuiToolTipProfile"; + internalName = "serverDetailsTxt"; + }; + + new GuiTextCtrl() { + position = "700 0"; + extent = "70 40"; + horizSizing = "left"; + vertSizing = "center"; + profile = "MenuSubHeaderCenteredText"; + tooltipProfile = "GuiToolTipProfile"; + internalName = "pingTxt"; + }; + + new GuiTextCtrl() { + position = "770 0"; + extent = "130 40"; + horizSizing = "left"; + vertSizing = "center"; + profile = "MenuSubHeaderCenteredText"; + tooltipProfile = "GuiToolTipProfile"; + internalName = "playerCountTxt"; + }; + }; + + return %entry; +} + +function JoinServerEntryButton::onHighlighted(%this, %highlighted) +{ + %container = %this.getParent(); + + %container-->serverNameTxt.profile = %highlighted ? MenuSubHeaderTextHighlighted : MenuSubHeaderText; + %container-->serverDetailsTxt.profile = %highlighted ? GuiMLTextProfileHighlighted : GuiMLTextProfile; + %container-->pingTxt.profile = %highlighted ? MenuSubHeaderCenteredTextHighlighted : MenuSubHeaderCenteredText; + %container-->playerCountTxt.profile = %highlighted ? MenuSubHeaderCenteredTextHighlighted : MenuSubHeaderCenteredText; +} + +function JoinServerMenu::addStatusEntry(%this) +{ + %entry = new GuiContainer() { + position = "0 0"; + extent = "900 40"; + profile = GuiMenuDefaultProfile; + tooltipProfile = "GuiToolTipProfile"; + horizSizing = "width"; + vertSizing = "bottom"; + class = "JoinServerStatusEntry"; + + new GuiTextCtrl() { + position = "0 0"; + extent = "730 20"; + profile = "MenuSubHeaderCenteredText"; + tooltipProfile = "GuiToolTipProfile"; + internalName = "statusTxt"; + }; + }; + + return %entry; +} + +function JoinServerStatusEntry::updateProgress(%this) +{ + %this-->statusText.text = %this-->statusText.text @ "."; //ellipses....... + + %this.schedule(500, "updateProgress"); +} + +function JoinServerList::syncGui(%this) +{ + %this.callOnChildren("setHighlighted", false); + + if(%this.listPosition < %this.getCount()) + { + %btn = %this.getObject(%this.listPosition); + %btn-->button.setHighlighted(true); + } + + // + //Update the button imagery to comply to the last input device we'd used + %device = Canvas.getLastInputDevice(); + if(%device $= "mouse") + %device = "keyboard"; + + JoinServerBackBtn.setBitmap(BaseUIActionMap.getCommandButtonBitmap(%device, "BaseUIBackOut")); + JoinServerJoinBtn.setBitmap(JoinServerActionMap.getCommandButtonBitmap(%device, "JoinServerMenu::join();")); + JoinServerQLanBtn.setBitmap(JoinServerActionMap.getCommandButtonBitmap(%device, "JoinServerMenu.queryLan();")); + JoinServerQServerBtn.setBitmap(JoinServerActionMap.getCommandButtonBitmap(%device, "JoinServerMenu.query();")); + + + JoinServerJoinBtn.setActive(JoinServerList.getCount() > 0); +} \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/guis/mainMenu.gui b/Templates/BaseGame/game/data/UI/guis/mainMenu.gui index 69ceaf317..3fc39662b 100644 --- a/Templates/BaseGame/game/data/UI/guis/mainMenu.gui +++ b/Templates/BaseGame/game/data/UI/guis/mainMenu.gui @@ -1,40 +1,38 @@ //--- OBJECT WRITE BEGIN --- -$guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) { - BitmapAsset = "UI:backgrounddark_image"; - extent = "1024 768"; +$guiContent = new GuiControl(MainMenuGui) { + extent = "1280 720"; minExtent = "8 8"; horizSizing = "width"; vertSizing = "height"; - profile = "GuiDefaultProfile"; + profile = "GuiMenuBackgroundProfile"; + category = "BaseUI"; tooltipProfile = "GuiToolTipProfile"; isContainer = "1"; - superClass = "UINavigation"; - canSaveDynamicFields = "0"; - + canSaveDynamicFields = "1"; + + new GuiInputCtrl(MainMenuInputHandler) { + ignoreMouseEvents = "1"; + ActionMap = "BaseUIActionMap"; + position = "-50 0"; + extent = "2186 851"; + horizSizing = "width"; + vertSizing = "height"; + profile = "GuiInputCtrlProfile"; + tooltipProfile = "GuiToolTipProfile"; + }; new GuiBitmapCtrl(SideBackgroundImage) { - bitmapAsset = "UI:menu_side_background_image"; - color = "255 255 255 255"; - wrap = "0"; - position = "0 0"; + BitmapAsset = "UI:menu_side_background_image"; + position = "0 -48"; extent = "900 600"; - minExtent = "8 2"; - horizSizing = "right"; vertSizing = "top"; profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; }; - new GuiBitmapCtrl(MainMenuAppLogo) { BitmapAsset = "UI:Torque_3D_logo_image"; - position = "550 30"; + position = "460 78"; extent = "360 100"; - horizSizing = "left"; + horizSizing = "center"; profile = "GuiDefaultProfile"; tooltipProfile = "GuiToolTipProfile"; canSaveDynamicFields = "1"; @@ -46,98 +44,94 @@ $guiContent = new GuiChunkedBitmapCtrl(MainMenuGui) { useModifiers = "0"; useStates = "1"; }; - new GuiControl(MainMenuButtonHolder) { - position = "143 711"; - extent = "736 40"; - horizSizing = "center"; + new GuiPanel(MainMenuButtonPanel) { + position = "0 683"; + extent = "1281 40"; + horizSizing = "width"; vertSizing = "top"; + profile = "GuiMenuPanelProfile"; + tooltipProfile = "GuiToolTipProfile"; + + new GuiIconButtonCtrl(MainMenuGoButton) { + BitmapAsset = "UI:Keyboard_Black_Return_image"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + text = "Go"; + position = "1115 0"; + extent = "140 40"; + horizSizing = "left"; + vertSizing = "center"; + profile = "GuiMenuButtonProfile"; + command = "activateSelected();"; + tooltipProfile = "GuiToolTipProfile"; + }; + }; + new GuiStackControl(MainMenuButtonList) { + padding = "5"; + dynamicSize = "0"; + position = "440 199"; + extent = "400 322"; + horizSizing = "center"; + vertSizing = "center"; profile = "GuiDefaultProfile"; tooltipProfile = "GuiToolTipProfile"; - isContainer = "1"; - class = "MenuInputButtonContainer"; - new GuiIconButtonCtrl() { - BitmapAsset = "UI:Keyboard_Black_Return_image"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - text = "Go"; - position = "11 0"; - extent = "140 40"; + new GuiButtonCtrl(MainMenuSinglePlayerBtn) { + text = "Single Player"; + extent = "400 40"; profile = "GuiMenuButtonProfile"; - command = "MainMenuButtonList.activate();"; + command = "$pref::HostMultiPlayer=false;\nCanvas.pushDialog(ChooseLevelMenu);"; tooltipProfile = "GuiToolTipProfile"; - internalName = "button1"; - class = "MenuInputButton"; }; - new GuiIconButtonCtrl() { - BitmapAsset = "UI:Keyboard_Black_Return_image"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - text = "Go"; - position = "155 0"; - extent = "140 40"; + new GuiButtonCtrl(MainMenuCreateSrvrBtn) { + text = "Create Server"; + position = "0 45"; + extent = "400 40"; profile = "GuiMenuButtonProfile"; - command = "MainMenuButtonList.activate();"; + command = "$pref::HostMultiPlayer=true;Canvas.pushDialog(ChooseLevelMenu);"; tooltipProfile = "GuiToolTipProfile"; - internalName = "button2"; - class = "MenuInputButton"; }; - new GuiIconButtonCtrl() { - BitmapAsset = "UI:Keyboard_Black_Return_image"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - text = "Go"; - position = "299 0"; - extent = "140 40"; + new GuiButtonCtrl(MainMenuJoinSrvrBtn) { + text = "Join Server"; + position = "0 90"; + extent = "400 40"; profile = "GuiMenuButtonProfile"; - command = "MainMenuButtonList.activate();"; + command = "Canvas.pushDialog(JoinServerMenu);"; tooltipProfile = "GuiToolTipProfile"; - internalName = "button3"; - class = "MenuInputButton"; }; - new GuiIconButtonCtrl() { - BitmapAsset = "UI:Keyboard_Black_Return_image"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - text = "Go"; - position = "443 0"; - extent = "140 40"; + new GuiButtonCtrl(MainMenuOptionBtn) { + text = "Options"; + position = "0 135"; + extent = "400 40"; profile = "GuiMenuButtonProfile"; - command = "MainMenuButtonList.activate();"; + command = "Canvas.pushDialog(OptionsMenu);"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiButtonCtrl(MainMenuWorldEditBtn) { + text = "Open World Editor (F11)"; + position = "0 180"; + extent = "400 40"; + profile = "GuiMenuButtonProfile"; + command = "fastLoadWorldEdit(1);"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiButtonCtrl(MainMenuGuiEditBtn) { + text = "Open GUI Editor (F10)"; + position = "0 225"; + extent = "400 40"; + profile = "GuiMenuButtonProfile"; + command = "fastLoadGUIEdit(1);"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiButtonCtrl(MainMenuExitBtn) { + text = "Exit"; + position = "0 270"; + extent = "400 40"; + profile = "GuiMenuButtonProfile"; + command = "quit();"; tooltipProfile = "GuiToolTipProfile"; - internalName = "button4"; - class = "MenuInputButton"; - }; - new GuiIconButtonCtrl() { - BitmapAsset = "UI:Keyboard_Black_Return_image"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - text = "Go"; - position = "587 0"; - extent = "140 40"; - profile = "GuiMenuButtonProfile"; - command = "MainMenuButtonList.activate();"; - tooltipProfile = "GuiToolTipProfile"; - internalName = "button5"; - class = "MenuInputButton"; }; - }; - new GuiInputCtrl(MainMenuInputHandler) { - sendAxisEvents = "1"; - sendBreakEvents = "1"; - ignoreMouseEvents = "1"; - position = "-50 0"; - extent = "10 10"; - horizSizing = "width"; - vertSizing = "height"; - profile = "GuiInputCtrlProfile"; - tooltipProfile = "GuiToolTipProfile"; - class = "MenuInputHandler"; }; }; //--- OBJECT WRITE END --- diff --git a/Templates/BaseGame/game/data/UI/guis/mainMenu.tscript b/Templates/BaseGame/game/data/UI/guis/mainMenu.tscript index ec4fa44f7..b334aeca8 100644 --- a/Templates/BaseGame/game/data/UI/guis/mainMenu.tscript +++ b/Templates/BaseGame/game/data/UI/guis/mainMenu.tscript @@ -1,52 +1,102 @@ function MainMenuGui::onAdd(%this) { - $activeControllerName = "K&M"; //default input type } function MainMenuGui::onWake(%this) { - //In the BaseUI example case, the MainMenuGUI acts as our background - //So it's a logical control to set as our UINavigation as well. So we - //set the MainMenuGUI's superClass to UINavigation to integrate it into - //that namespace to open up page navigation - - //At the same time, the MainMenuGUI control has the button holder, set to - //the MenuInputButtonContainer class, allowing us to set it as the active button - //holder here, prepping it for catching any button inputs to active commands - //Specifically, it sets the $activeMenuButtonContainer to be this, which allows - //other controls to manage what the behavior of the buttons is consistently - //without needing to worry about hardcoded names - MainMenuButtonHolder.setActive(); - - //We also have the MainMenuInputHandler, a GuiInputCtrl with the MenuInputHandler class - //This allows us to catch any input/axis event and pass it along to the active menuList - //or button containers to navigate the menus - //We set up this catch by making said control our first responder, here - MainMenuInputHandler.setFirstResponder(); - - //We also go ahead and mark for any future pages being added to the UINavigation's page stack - //to be prompted to resize when added. This isn't required, but helps keep pages formated to - //the current size of the UINavigation, which is useful when dealing with aspect ratio or resolution - //changes. - %this.resizePages = true; - //Lastly, we go ahead and display some actual navigable content up on our main menu here - //In this case, we set the MainMenuButtons as our root page, so we always come back - //to having the main menu buttons on screen if every other page is closed. - //This will ultimately call MainMenuButtons::onOpen(), so to see where the navigation - //chain continues, see that function. - %this.setRootPage(MainMenuButtons); - - %this.refreshPage(); + $MenuList = MainMenuButtonList; + $MenuList.listPosition = 0; } -function MainMenuButtonHolder::onWake(%this) +function MainMenuGui::onSleep(%this) { - //Because the blan slate MainMenuGUI doesn't have anything we need to bother with inputs on - //we just go ahead and disable all the buttons in our MainMenuButtonHolder to have - // a clean slate - %this-->button1.disable(); - %this-->button2.disable(); - %this-->button3.disable(); - %this-->button4.disable(); - %this-->button5.disable(); +} + +if(!isObject( BaseUIActionMap ) ) +{ + new ActionMap(BaseUIActionMap){}; + + BaseUIActionMap.bind( keyboard, w, BaseUINavigatePrev ); + BaseUIActionMap.bind( keyboard, s, BaseUINavigateNext ); + BaseUIActionMap.bind( gamepad, yaxis, "D", "-0.23 0.23", BaseUIStickNavigate ); + BaseUIActionMap.bind( gamepad, upov, BaseUINavigatePrev ); + BaseUIActionMap.bind( gamepad, dpov, BaseUINavigateNext ); + + BaseUIActionMap.bind( keyboard, Enter, BaseUIActivateSelected ); + BaseUIActionMap.bind( gamepad, btn_a, BaseUIActivateSelected ); + + BaseUIActionMap.bind( keyboard, Escape, BaseUIBackOut ); + BaseUIActionMap.bind( gamepad, btn_b, BaseUIBackOut ); +} + +function BaseUINavigatePrev(%val) +{ + if(%val) + { + $MenuList.listPosition -= 1; + if($MenuList.listPosition < 0) + $MenuList.listPosition = 0; + + $MenuList.syncGUI(); + } +} + +function BaseUINavigateNext(%val) +{ + if(%val) + { + $MenuList.listPosition += 1; + if($MenuList.listPosition >= $MenuList.getCount()) + $MenuList.listPosition = $MenuList.getCount()-1; + + $MenuList.syncGUI(); + } +} + +function BaseUIStickNavigate(%val) +{ + if(%val == -1) + BaseUINavigateNext(1); + else if(%val == 1) + mainMenuNavigateDown(1); +} + +function BaseUIBackOut(%val) +{ + //we can't navigate further back than the MainMenuGui + if(%val && Canvas.getObject(Canvas.getCount()-1) != MainMenuGui) + { + Canvas.popDialog(); + %topMenu = Canvas.getObject(Canvas.getCount()-1); + if(isObject(%topMenu)) + { + //re-kick the on-wake so we can be fully up to date and relevently + //contexted + %topMenu.onWake(); + } + } +} + +function MainMenuButtonList::syncGUI(%this) +{ + %this.callOnChildren("setHighlighted", false); + + %btn = %this.getObject(%this.listPosition); + %btn.setHighlighted(true); + + // + //Update the button imagery to comply to the last input device we'd used + %device = Canvas.getLastInputDevice(); + if(%device $= "mouse") + %device = "keyboard"; + + MainMenuGoButton.setBitmap(BaseUIActionMap.getCommandButtonBitmap(%device, "BaseUIActivateSelected")); +} + +function BaseUIActivateSelected() +{ + %btn = $MenuList.getObject($MenuList.listPosition); + + if(%btn.isMethod("performClick")) + %btn.performClick(); } \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/guis/messageBoxDlg.gui b/Templates/BaseGame/game/data/UI/guis/messageBoxDlg.gui index 91207adff..1923c3a11 100644 --- a/Templates/BaseGame/game/data/UI/guis/messageBoxDlg.gui +++ b/Templates/BaseGame/game/data/UI/guis/messageBoxDlg.gui @@ -1,347 +1,75 @@ //--- OBJECT WRITE BEGIN --- $guiContent = new GuiControl(MessageBoxDlg) { - position = "0 0"; - extent = "1024 768"; + extent = "1280 720"; minExtent = "8 8"; horizSizing = "width"; vertSizing = "height"; profile = "GuiOverlayProfile"; - visible = "1"; - active = "1"; tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; isContainer = "1"; - canSave = "1"; canSaveDynamicFields = "1"; helpTag = "0"; - new GuiControl(MessageBoxCtrl) { - position = "192 197"; - extent = "641 381"; - minExtent = "8 2"; + new GuiInputCtrl(MessageBoxInputHandler) { + ignoreMouseEvents = "1"; + ActionMap = "MessageBoxActionMap"; + position = "-50 0"; + extent = "2186 851"; + horizSizing = "width"; + vertSizing = "height"; + profile = "GuiInputCtrlProfile"; + tooltipProfile = "GuiToolTipProfile"; + }; + + new GuiBitmapCtrl() { + BitmapAsset = "UI:backdrop_image"; + position = "272 128"; + extent = "735 463"; + horizSizing = "center"; + vertSizing = "center"; + profile = "GuiDefaultProfile"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiControl(MessageBoxCtrl) { + position = "319 169"; + extent = "641 381"; horizSizing = "center"; vertSizing = "center"; profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - new GuiBitmapBarCtrl() { - percent = "100"; - vertical = "0"; - flipClip = "0"; - bitmapAsset = "UI:panel_image"; - color = "255 255 255 255"; - position = "0 0"; - extent = "641 40"; - minExtent = "8 2"; + new GuiPanel() { + extent = "641 381"; horizSizing = "width"; - vertSizing = "bottom"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; + vertSizing = "height"; + profile = "GuiMenuBasePanelProfile"; tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; }; new GuiTextCtrl(MessageBoxTitleText) { - text = "OPTIONS"; - maxLength = "1024"; - margin = "0 0 0 0"; - padding = "0 0 0 0"; - anchorTop = "1"; - anchorBottom = "0"; - anchorLeft = "1"; - anchorRight = "0"; position = "32 7"; extent = "577 28"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "MenuHeaderText"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiBitmapBarCtrl() { - percent = "100"; - vertical = "0"; - flipClip = "0"; - bitmapAsset = "UI:panel_low_image"; - color = "255 255 255 255"; - position = "0 40"; - extent = "641 341"; - minExtent = "8 2"; horizSizing = "width"; - vertSizing = "bottom"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; + profile = "MenuHeaderText"; tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; }; new GuiMLTextCtrl(MessageBoxText) { - lineSpacing = "2"; - allowColorChars = "0"; - maxChars = "-1"; - useURLMouseCursor = "0"; position = "81 83"; extent = "481 19"; minExtent = "8 8"; horizSizing = "center"; vertSizing = "center"; profile = "MenuMLSubHeaderText"; - visible = "1"; - active = "1"; tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; }; - new GuiControl(MessageBoxOKButtonHolder) { - position = "0 285"; - extent = "642 40"; - minExtent = "8 2"; - horizSizing = "center"; + new GuiStackControl(MessageBoxButtonHolder) { + stackingType = "Horizontal"; + position = "250 285"; + extent = "140 40"; + horizSizing = "width"; vertSizing = "top"; profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - class = "MenuInputButtonContainer"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiIconButtonCtrl() { - buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter"; - iconLocation = "Left"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - textMargin = "4"; - autoSize = "0"; - text = "Go"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "251 0"; - extent = "140 40"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "MainMenuButtonList.activateRow();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OKButton"; - class = "MenuInputButton"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - }; - new GuiControl(MessageBoxOCButtonHolder) { - position = "0 285"; - extent = "642 40"; - minExtent = "8 2"; - horizSizing = "center"; - vertSizing = "top"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - class = "MenuInputButtonContainer"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiIconButtonCtrl() { - buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter"; - iconLocation = "Left"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - textMargin = "4"; - autoSize = "0"; - text = "Go"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "171 0"; - extent = "140 40"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "MainMenuButtonList.activateRow();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "OKButton"; - class = "MenuInputButton"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiIconButtonCtrl() { - buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter"; - iconLocation = "Left"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - textMargin = "4"; - autoSize = "0"; - text = "Go"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "323 0"; - extent = "140 40"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "MainMenuButtonList.activateRow();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "CancelButton"; - class = "MenuInputButton"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - }; - new GuiControl(MessageBoxYNCButtonHolder) { - position = "0 285"; - extent = "642 40"; - minExtent = "8 2"; - horizSizing = "center"; - vertSizing = "top"; - profile = "GuiDefaultProfile"; - visible = "1"; - active = "1"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "1"; - class = "MenuInputButtonContainer"; - canSave = "1"; - canSaveDynamicFields = "0"; - - new GuiIconButtonCtrl() { - buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter"; - iconLocation = "Left"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - textMargin = "4"; - autoSize = "0"; - text = "Go"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "99 0"; - extent = "140 40"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "MainMenuButtonList.activateRow();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "yesButton"; - class = "MenuInputButton"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiIconButtonCtrl() { - buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter"; - iconLocation = "Left"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - textMargin = "4"; - autoSize = "0"; - text = "Go"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "251 0"; - extent = "140 40"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "MainMenuButtonList.activateRow();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "noButton"; - class = "MenuInputButton"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - new GuiIconButtonCtrl() { - buttonMargin = "4 4"; - iconBitmap = "data/ui/images/Inputs/Keyboard & Mouse/Keyboard_Black_Enter"; - iconLocation = "Left"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - textMargin = "4"; - autoSize = "0"; - text = "Go"; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "403 0"; - extent = "140 40"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = "MainMenuButtonList.activateRow();"; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - internalName = "CancelButton"; - class = "MenuInputButton"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; }; }; }; diff --git a/Templates/BaseGame/game/data/UI/guis/messageBoxDlg.tscript b/Templates/BaseGame/game/data/UI/guis/messageBoxDlg.tscript new file mode 100644 index 000000000..7ef43ba05 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/guis/messageBoxDlg.tscript @@ -0,0 +1,218 @@ +//----------------------------------------------------------------------------- +// 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. +//----------------------------------------------------------------------------- + +// -------------------------------------------------------------------- +// Message Sound +// -------------------------------------------------------------------- +/*new SFXDescription(MessageBoxAudioDescription) +{ + volume = 1.0; + isLooping = false; + is3D = false; + channel = $GuiAudioType; +}; + +new SFXProfile(messageBoxBeep) +{ + filename = "./messageBoxSound"; + description = MessageBoxAudioDescription; + preload = true; +};*/ + +//--------------------------------------------------------------------------------------------- +// messageCallback +// Calls a callback passed to a message box. +//--------------------------------------------------------------------------------------------- +function messageCallback(%dlg, %callback) +{ + Canvas.popDialog(%dlg); + eval(%callback); +} + +//--------------------------------------------------------------------------------------------- +// MBSetText +// Sets the text of a message box and resizes it to accomodate the new string. +//--------------------------------------------------------------------------------------------- +function MBSetText(%text, %frame, %msg) +{ + // Get the extent of the text box. + %ext = %text.getExtent(); + // Set the text in the center of the text box. + %text.setText("" @ %msg); + // Force the textbox to resize itself vertically. + %text.forceReflow(); + // Grab the new extent of the text box. + %newExtent = %text.getExtent(); + + // Get the vertical change in extent. + %deltaY = getWord(%newExtent, 1) - getWord(%ext, 1); + + // Resize the window housing the text box. + %windowPos = %frame.getPosition(); + %windowExt = %frame.getExtent(); + %frame.resize(getWord(%windowPos, 0), getWord(%windowPos, 1) - (%deltaY / 2), + getWord(%windowExt, 0), getWord(%windowExt, 1) + %deltaY); + + %frame.canMove = "0"; + //%frame.canClose = "0"; + %frame.resizeWidth = "0"; + %frame.resizeHeight = "0"; + %frame.canMinimize = "0"; + %frame.canMaximize = "0"; + + //sfxPlayOnce( messageBoxBeep ); +} + +function MessageBoxCtrl::onWake(%this) +{ + %this.callback = ""; + %this.cancelCallback = ""; +} + +//--------------------------------------------------------------------------------------------- +// Various message box display functions. Each one takes a window title, a message, and a +// callback for each button. +//--------------------------------------------------------------------------------------------- +function MessageBoxCtrl::createButton(%this, %text, %command, %bitmap) +{ + %btn = new GuiIconButtonCtrl() { + BitmapAsset = %bitmap; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + iconLocation = "Left"; + text = %text; + position = "251 0"; + extent = "140 40"; + profile = "GuiMenuButtonProfile"; + command = %command; + tooltipProfile = "GuiToolTipProfile"; + }; + + MessageBoxButtonHolder.add(%btn); + + //update positioning of the holder to be centered + MessageBoxButtonHolder.position.x = MessageBoxCtrl.extent.x/2 - MessageBoxButtonHolder.extent.x/2; + + return %btn; +} + +function MessageBoxDlg::onWake(%this) +{ + +} + +if(!isObject( MessageBoxActionMap ) ) +{ + new ActionMap(MessageBoxActionMap){}; + + MessageBoxActionMap.bind( keyboard, Enter, messageBoxYesClicked ); + MessageBoxActionMap.bind( gamepad, btn_a, messageBoxYesClicked ); + + MessageBoxActionMap.bind( keyboard, Escape, messageBoxNoClicked ); + MessageBoxActionMap.bind( gamepad, btn_b, messageBoxNoClicked ); +} + +function MessageBoxCtrl::syncGui(%this) +{ + +} + +function messageBoxYesClicked(%this) +{ + MessageCallback(MessageBoxDlg, MessageBoxDlg.callback); +} + +function messageBoxNoClicked(%this) +{ + MessageCallback(MessageBoxDlg,MessageBoxDlg.cancelCallback); +} + +//MessageBoxOK("Test", "This is a test message box", "echo(\"Uhhhhhawhat?\""); +function MessageBoxOK(%title, %message, %callback) +{ + MessageBoxButtonHolder.clear(); + + Canvas.pushDialog(MessageBoxDlg); + MessageBoxTitleText.text = %title; + + %okButton = MessageBoxCtrl.createButton("OK", "messageBoxYesClicked();"); + %bitmapAssetId = MessageBoxActionMap.getCommandButtonBitmap(Canvas.getLastInputDevice(), "messageBoxYesClicked"); + %okButton.setBitmap(%bitmapAssetId); + + MBSetText(MessageBoxText, MessageBoxCtrl, %message); + MessageBoxDlg.callback = %callback; +} + +function MessageBoxOKCancel(%title, %message, %callback, %cancelCallback, %okLabelOverride, %cancelLabelOverride) +{ + MessageBoxButtonHolder.clear(); + + Canvas.pushDialog(MessageBoxDlg); + MessageBoxTitleText.text = %title; + + if(%okLabelOverride $= "") + %okLabel = "OK"; + else + %okLabel = %okLabelOverride; + + if(%cancelLabelOverride $= "") + %cancelLabel = "Cancel"; + else + %cancelLabel = %cancelLabelOverride; + + %okButton = MessageBoxCtrl.createButton(%okLabel, "messageBoxYesClicked();"); + %bitmapAssetId = MessageBoxActionMap.getCommandButtonBitmap(Canvas.getLastInputDevice(), "messageBoxYesClicked"); + %okButton.setBitmap(%bitmapAssetId); + + %cancelButton = MessageBoxCtrl.createButton(%cancelLabel, "messageBoxNoClicked();"); + %bitmapAssetId = MessageBoxActionMap.getCommandButtonBitmap(Canvas.getLastInputDevice(), "messageBoxNoClicked"); + %cancelButton.setBitmap(%bitmapAssetId); + + MBSetText(MessageBoxText, MessageBoxCtrl, %message); + MessageBoxDlg.callback = %callback; + MessageBoxDlg.cancelCallback = %cancelCallback; +} + +function MessageBoxYesNo(%title, %message, %yesCallback, %noCallback) +{ + MessageBoxOKCancel(%title, %message, %yesCallback, %noCallback, "Yes", "No"); +} + +//--------------------------------------------------------------------------------------------- +// MessagePopup +// Displays a message box with no buttons. Disappears after %delay milliseconds. +//--------------------------------------------------------------------------------------------- +function MessagePopup(%title, %message, %delay) +{ + Canvas.pushDialog(MessageBoxDlg); + MessageBoxTitleText.text = %title; + MBSetText(MessageBoxText, MessageBoxCtrl, %message); + + if (%delay !$= "") + schedule(%delay, 0, CloseMessagePopup); +} + +function CloseMessagePopup() +{ + Canvas.popDialog(MessageBoxDlg); +} \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui b/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui index 8a85fd848..a6906986f 100644 --- a/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui +++ b/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui @@ -1,226 +1,212 @@ //--- OBJECT WRITE BEGIN --- $guiContent = new GuiControl(OptionsMenu) { - extent = "1024 768"; - profile = "GuiNonModalDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "1"; + extent = "1280 720"; + minExtent = "8 8"; horizSizing = "width"; vertSizing = "height"; + profile = "GuiMenuBackgroundProfile"; + category = "BaseUI"; + tooltipProfile = "GuiToolTipProfile"; + isContainer = "1"; canSaveDynamicFields = "0"; - new GuiControl(OptionsMenuContainer) { - position = "48 56"; - extent = "928 655"; - horizSizing = "aspectCenter"; - vertSizing = "center"; + new GuiInputCtrl(OptionsMenuInputHandler) { + ignoreMouseEvents = "1"; + ActionMap = "OptionsMenuActionMap"; + position = "-50 0"; + extent = "2186 851"; + horizSizing = "width"; + vertSizing = "height"; + profile = "GuiInputCtrlProfile"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiControl(OptionsMenuCategoryContainer) { + position = "0 60"; + extent = "1280 49"; + horizSizing = "center"; profile = "GuiDefaultProfile"; tooltipProfile = "GuiToolTipProfile"; isContainer = "1"; - new GuiBitmapBarCtrl() { - BitmapAsset = "UI:panel_low_image"; - position = "0 40"; - extent = "927 618"; + new GuiStackControl(OptionsMenuCategoryList) { + stackingType = "Horizontal"; + padding = "10"; + dynamicSize = "0"; + position = "330 0"; + extent = "650 40"; + horizSizing = "center"; + vertSizing = "center"; + profile = "GuiDefaultProfile"; + tooltipProfile = "GuiToolTipProfile"; + + new GuiButtonCtrl() { + text = "Video"; + extent = "120 40"; + profile = "GuiMenuButtonProfile"; + command = "OptionsMenu.openOptionsCategory(\"Video\");"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiButtonCtrl() { + text = "Audio"; + position = "130 0"; + extent = "120 40"; + profile = "GuiMenuButtonProfile"; + command = "OptionsMenu.openOptionsCategory(\"Audio\");"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiButtonCtrl() { + text = "Keyboard/Mouse"; + position = "260 0"; + extent = "220 40"; + profile = "GuiMenuButtonProfile"; + command = "OptionsMenu.openOptionsCategory(\"KBM\");"; + tooltipProfile = "GuiToolTipProfile"; + }; + new GuiButtonCtrl() { + text = "Controller"; + position = "480 0"; + extent = "160 40"; + profile = "GuiMenuButtonProfile"; + command = "OptionsMenu.openOptionsCategory(\"Controller\");"; + tooltipProfile = "GuiToolTipProfile"; + }; + }; + + new GuiControl(OptionsMenuNavButtonOverlay) { + extent = "1281 40"; horizSizing = "width"; + vertSizing = "height"; + profile = GuiNonModalDefaultProfile; + + new GuiBitmapCtrl(OptionsMenuPrevNavIcon) { + BitmapAsset = "UI:Keyboard_Black_Q_image"; + position = "0 10"; + extent = "40 40"; + profile = GuiNonModalDefaultProfile; + vertSizing = "top"; + }; + + new GuiBitmapCtrl(OptionsMenuNextNavIcon) { + BitmapAsset = "UI:Keyboard_Black_E_image"; + position = "0 10"; + extent = "40 40"; + profile = GuiNonModalDefaultProfile; + vertSizing = "top"; + }; + }; + }; + new GuiScrollCtrl(OptionsMenuSettingsScroll) { + hScrollBar = "alwaysOff"; + vScrollBar = "dynamic"; + position = "240 110"; + extent = "800 573"; + horizSizing = "center"; + vertSizing = "height"; + profile = "GuiMenuScrollProfile"; + tooltipProfile = "GuiToolTipProfile"; + + new GuiStackControl(VideoSettingsList) { + class = "OptionsMenuList"; + padding = "5"; + changeChildSizeToFit = "0"; + position = "0 1"; + extent = "800 200"; + horizSizing = "width"; + vertSizing = "height"; profile = "GuiDefaultProfile"; tooltipProfile = "GuiToolTipProfile"; }; - new GuiBitmapBarCtrl() { - BitmapAsset = "UI:panel_image"; - extent = "927 40"; + new GuiStackControl(AudioSettingsList) { + class = "OptionsMenuList"; + padding = "5"; + changeChildSizeToFit = "0"; + position = "0 1"; + extent = "800 200"; horizSizing = "width"; + vertSizing = "height"; profile = "GuiDefaultProfile"; + visible = "0"; tooltipProfile = "GuiToolTipProfile"; + hidden = "1"; }; + new GuiStackControl(KBMControlsList) { + class = "OptionsMenuList"; + padding = "5"; + changeChildSizeToFit = "0"; + position = "0 1"; + extent = "800 200"; + horizSizing = "width"; + vertSizing = "height"; + profile = "GuiDefaultProfile"; + visible = "0"; + tooltipProfile = "GuiToolTipProfile"; + hidden = "1"; + }; + new GuiStackControl(GamepadControlsList) { + class = "OptionsMenuList"; + padding = "5"; + changeChildSizeToFit = "0"; + position = "0 1"; + extent = "800 200"; + horizSizing = "width"; + vertSizing = "height"; + profile = "GuiDefaultProfile"; + visible = "0"; + tooltipProfile = "GuiToolTipProfile"; + hidden = "1"; + }; + }; + new GuiPanel(OptionMenuTitlePanel) { + extent = "1281 60"; + horizSizing = "width"; + profile = "GuiMenuPanelProfile"; + tooltipProfile = "GuiToolTipProfile"; + new GuiTextCtrl() { text = "OPTIONS"; - position = "22 7"; + position = "22 23"; extent = "220 28"; profile = "MenuHeaderText"; tooltipProfile = "GuiToolTipProfile"; }; - new GuiTextCtrl(OptionName) { - position = "3 606"; - extent = "293 17"; - horizSizing = "width"; - profile = "MenuSubHeaderText"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiMLTextCtrl(OptionDescription) { - text = "This is a placeholder text for an option."; - position = "3 625"; - extent = "293 14"; - horizSizing = "width"; - profile = "GuiMLTextProfile"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiSplitContainer() { - splitPoint = "250 100"; - fixedPanel = "FirstPanel"; - fixedSize = "250"; - position = "0 48"; - extent = "928 555"; - horizSizing = "width"; - profile = "GuiMenuScrollProfile"; - tooltipProfile = "GuiToolTipProfile"; - - new GuiPanel() { - docking = "Client"; - extent = "248 555"; - profile = "GuiOverlayProfile"; - tooltipProfile = "GuiToolTipProfile"; - internalName = "Panel1"; - - new GuiStackControl(OptionsMenuCategoryList) { - padding = "10"; - dynamicSize = "0"; - extent = "248 555"; - horizSizing = "width"; - vertSizing = "height"; - profile = "GuiDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - superClass = "MenuList"; - - new GuiButtonCtrl() { - text = "Display"; - extent = "248 35"; - profile = "GuiMenuButtonProfile"; - command = "populateDisplaySettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiButtonCtrl() { - text = "Graphics"; - position = "0 45"; - extent = "248 35"; - profile = "GuiMenuButtonProfile"; - command = "populateGraphicsSettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiButtonCtrl() { - text = "Audio"; - position = "0 90"; - extent = "248 35"; - profile = "GuiMenuButtonProfile"; - command = "populateAudioSettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiButtonCtrl() { - text = "Keyboard & Mouse"; - position = "0 135"; - extent = "248 35"; - profile = "GuiMenuButtonProfile"; - command = "populateKeyboardMouseSettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiButtonCtrl() { - text = "Gamepad"; - position = "0 180"; - extent = "248 35"; - profile = "GuiMenuButtonProfile"; - command = "populateGamepadSettingsList();"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiButtonCtrl() { - text = "Example Options"; - position = "0 225"; - extent = "248 35"; - profile = "GuiMenuButtonProfile"; - command = "testExampleOptions();"; - tooltipProfile = "GuiToolTipProfile"; - }; - }; - }; - new GuiPanel() { - docking = "Client"; - position = "252 0"; - extent = "676 555"; - profile = "GuiOverlayProfile"; - tooltipProfile = "GuiToolTipProfile"; - internalName = "panel2"; - - new GuiScrollCtrl(OptionsMenuSettingsScroll) { - hScrollBar = "alwaysOff"; - vScrollBar = "dynamic"; - extent = "676 554"; - horizSizing = "width"; - vertSizing = "height"; - profile = "GuiMenuScrollProfile"; - tooltipProfile = "GuiToolTipProfile"; - - new GuiStackControl(OptionsMenuSettingsList) { - padding = "5"; - changeChildSizeToFit = "0"; - position = "1 1"; - extent = "661 170"; - horizSizing = "width"; - vertSizing = "height"; - profile = "GuiDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - superClass = "MenuList"; - new GuiGameSettingsCtrl() { - PreviousBitmapAsset = "UI:previousOption_n_image"; - NextBitmapAsset = "UI:nextOption_n_image"; - columnSplit = "198"; - useMouseEvents = "1"; - extent = "661 30"; - horizSizing = "width"; - profile = "GuiMenuButtonProfile"; - tooltipProfile = "GuiToolTipProfile"; - class = "MenuOptionsButton"; - }; - new GuiGameSettingsCtrl() { - PreviousBitmapAsset = "UI:previousOption_n_image"; - NextBitmapAsset = "UI:nextOption_n_image"; - columnSplit = "198"; - useMouseEvents = "1"; - position = "0 35"; - extent = "661 30"; - horizSizing = "width"; - profile = "GuiMenuButtonProfile"; - tooltipProfile = "GuiToolTipProfile"; - class = "MenuOptionsButton"; - }; - new GuiGameSettingsCtrl() { - PreviousBitmapAsset = "UI:previousOption_n_image"; - NextBitmapAsset = "UI:nextOption_n_image"; - columnSplit = "198"; - useMouseEvents = "1"; - position = "0 70"; - extent = "661 30"; - horizSizing = "width"; - profile = "GuiMenuButtonProfile"; - tooltipProfile = "GuiToolTipProfile"; - class = "MenuOptionsButton"; - }; - new GuiGameSettingsCtrl() { - PreviousBitmapAsset = "UI:previousOption_n_image"; - NextBitmapAsset = "UI:nextOption_n_image"; - columnSplit = "198"; - useMouseEvents = "1"; - position = "0 105"; - extent = "661 30"; - horizSizing = "width"; - profile = "GuiMenuButtonProfile"; - tooltipProfile = "GuiToolTipProfile"; - class = "MenuOptionsButton"; - }; - new GuiGameSettingsCtrl() { - PreviousBitmapAsset = "UI:previousOption_n_image"; - NextBitmapAsset = "UI:nextOption_n_image"; - columnSplit = "198"; - useMouseEvents = "1"; - position = "0 140"; - extent = "661 30"; - horizSizing = "width"; - profile = "GuiMenuButtonProfile"; - tooltipProfile = "GuiToolTipProfile"; - class = "MenuOptionsButton"; - }; - }; - }; - }; }; + new GuiPanel(OptionsMenuButtonPanel) { + position = "0 683"; + extent = "1281 40"; + horizSizing = "width"; + vertSizing = "top"; + profile = "GuiMenuPanelProfile"; + tooltipProfile = "GuiToolTipProfile"; + new GuiIconButtonCtrl(OptionsMenuBackBtn) { + BitmapAsset = "UI:Keyboard_Black_Escape_image"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + text = "Back"; + position = "16 0"; + extent = "140 40"; + vertSizing = "center"; + profile = "GuiMenuButtonProfile"; + command = "tryCloseOptionsMenu();"; + tooltipProfile = "GuiToolTipProfile"; + class = "MenuInputButton"; + }; + new GuiIconButtonCtrl(OptionsMenuResetBtn) { + BitmapAsset = "UI:Keyboard_Black_Return_image"; + sizeIconToButton = "1"; + makeIconSquare = "1"; + textLocation = "Center"; + text = "Reset"; + position = "1135 0"; + extent = "140 40"; + horizSizing = "left"; + vertSizing = "center"; + profile = "GuiMenuButtonProfile"; + command = "OptionsMenu.resetSettings();"; + tooltipProfile = "GuiToolTipProfile"; + class = "MenuInputButton"; + }; }; }; //--- OBJECT WRITE END --- diff --git a/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript b/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript index a8db2ba83..93762fb81 100644 --- a/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript +++ b/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript @@ -1,53 +1,9 @@ -//options settings +$optionsEntryPad = 10; -//Screen and Display menu -//Renderer Mode -//Screen resolution -//Windowed/fullscreen(borderless?) -//VSync - -//Screen brightness -//screen brightness -//screen gamma - -//Lighting Menu -//Shadow Distance(Distance shadows are drawn to. Also affects shadowmap slices) -//Shadow Quality(Resolution of shadows rendered, setting to none disables dynamic shadows) -//Soft Shadows(Whether shadow softening is used) -//Shadow caching(If the lights enable it, shadow caching is activated) -//Light Draw Distance(How far away lights are still drawn. Doesn't impact vector lights like the sun) - -//Mesh and Textures Menu -//Draw distance(Overall draw distance) -slider -//Object draw distance(Draw distance from small/unimportant objects) -slider -//Mesh quality -//Texture quality -//Foliage draw distance -//Terrain Quality -//Decal Quality - -//Effects Menu -//Parallax -//HDR -//Light shafts -//Motion Blur -//Depth of Field -//SSAO -//AA(ModelXAmount)[defualt is FXAA] -//Anisotropic filtering - -//Keybinds - -//Camera -//horizontal mouse sensitivity -//vert mouse sensitivity -//invert vertical -//zoom mouse sensitivities(both horz/vert) -//headbob -//FOV - -$yesNoList = "No\tYes"; -$onOffList = "Off\tOn"; +$OptionsMenuCategories[0] = "Video"; +$OptionsMenuCategories[1] = "Audio"; +$OptionsMenuCategories[2] = "KBM"; +$OptionsMenuCategories[3] = "Controller"; function OptionsMenu::onAdd(%this) { @@ -56,1126 +12,952 @@ function OptionsMenu::onAdd(%this) %this.optionsCategories = new ArrayObject(); } - if(!isObject(%this.unappliedChanges)) - { - %this.unappliedChanges = new ArrayObject(OptionsMenuUnappliedChanges); - } - %this.currentCategory = ""; - addOptionsMenuCategory("Display", "populateDisplaySettingsList();"); - addOptionsMenuCategory("Graphics", "populateGraphicsSettingsList();"); - addOptionsMenuCategory("Audio", "populateAudioSettingsList();"); - addOptionsMenuCategory("Keyboard & Mouse", "populateKeyboardMouseSettingsList();"); - addOptionsMenuCategory("Gamepad", "populateGamepadSettingsList();"); - callOnModules("populateOptionsMenuCategories", "Game"); } -function OptionsMenu::onOpen(%this) +function OptionsMenu::onWake(%this) { - OptionsMenuCategoryList.clear(); + %this.populateVideoSettings(); - for(%i=0; %i < %this.optionsCategories.count(); %i++) + %this.populateAudioSettings(); + + %this.populateKBMControls(); + + %this.populateGamepadControls(); + //establish the cached prefs values here + + %this.openOptionsCategory("Video"); +} + +if(!isObject( OptionsMenuActionMap ) ) +{ + new ActionMap(OptionsMenuActionMap){}; + + OptionsMenuActionMap.bind( keyboard, Escape, tryCloseOptionsMenu); + OptionsMenuActionMap.bind( gamepad, btn_b, tryCloseOptionsMenu); + + OptionsMenuActionMap.bind( keyboard, w, OptionMenuNavigatePrev ); + OptionsMenuActionMap.bind( keyboard, s, OptionMenuNavigateNext ); + OptionsMenuActionMap.bind( gamepad, yaxis, "D", "-0.23 0.23", OptionMenuStickNavigate ); + OptionsMenuActionMap.bind( gamepad, upov, OptionMenuNavigatePrev ); + OptionsMenuActionMap.bind( gamepad, dpov, OptionMenuNavigateNext ); + + OptionsMenuActionMap.bind( keyboard, a, OptionMenuPrevSetting ); + OptionsMenuActionMap.bind( keyboard, d, OptionMenuNextSetting ); + OptionsMenuActionMap.bind( gamepad, xaxis, "D", "-0.23 0.23", OptionMenuStickChangeSetting ); + OptionsMenuActionMap.bind( gamepad, lpov, OptionMenuPrevSetting ); + OptionsMenuActionMap.bind( gamepad, lpov, OptionMenuNextSetting ); + + OptionsMenuActionMap.bind( keyboard, q, OptionsMenuPrevCategory ); + OptionsMenuActionMap.bind( gamepad, btn_l, OptionsMenuPrevCategory ); + + OptionsMenuActionMap.bind( keyboard, e, OptionsMenuNextCategory ); + OptionsMenuActionMap.bind( gamepad, btn_r, OptionsMenuNextCategory ); + + OptionsMenuActionMap.bind( keyboard, R, OptionsMenuReset ); + OptionsMenuActionMap.bind( gamepad, btn_x, OptionsMenuReset ); + + OptionsMenuActionMap.bind( keyboard, Enter, OptionsMenuActivateOption ); + OptionsMenuActionMap.bind( gamepad, btn_a, OptionsMenuActivateOption ); +} + +//============================================================================== +// This function updates all the elements in the actual lists to ensure they're +// sized, stylized and formatted correctly, as well as up to date values +function OptionsMenuList::syncGui(%this) +{ + %this.callOnChildren("setHighlighted", false); + + %btn = %this.getObject(%this.listPosition); + if(%btn.class $= "OptionsListEntry" || + %btn.class $= "OptionsListSliderEntry" || + %btn.class $= "OptionsKeybindEntry") + %btn-->button.setHighlighted(true); + + //iterate over the items and ensure that they are formatted well based on the settings selected + foreach(%option in %this) { - %catName = %this.optionsCategories.getKey(%i); - %callback = %this.optionsCategories.getValue(%i); + %container = %option-->valuesContainer; - %newCatButton = new GuiButtonCtrl() { - text = %catName; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "0 180"; - extent = "248 35"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = %callback; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - - OptionsMenuCategoryList.add(%newCatButton); + if(%option.class $= "OptionsListEntry") + { + %hasLevels = %option.optionsObject.getCount() <= 1; + + %optionObject = %option.optionsObject; + + //If it's out of range of the options, it's probably a custom value + if(%option.currentOptionIndex < %optionObject.getCount() && %option.currentOptionIndex >= 0) + { + %currentOptionLevel = %optionObject.getObject(%option.currentOptionIndex); + %currentOptionLevelTxt = %currentOptionLevel.displayName; + } + else + { + %currentOptionLevelTxt = "Custom"; + } + + %optionValTextWidth = %option-->optionValue.profile.getStringWidth(%currentOptionLevelTxt); + + %option-->optionValue.resize(%container.extent.x - %container-->prevValButton.extent.x - %optionValTextWidth - 20, 0, + %optionValTextWidth + 20, %container.extent.y); + + %option-->optionValue.text = %currentOptionLevelTxt; + + %container-->prevValButton.position.x = %option-->optionValue.position.x - 20; + %container-->nextValButton.position.x = %container.extent.x - %container-->prevValButton.extent.x; + + //if there's no alternatives, disable the left/right buttons + %container-->prevValButton.setHidden(%hasLevels); + %container-->nextValButton.setHidden(%hasLevels); + } + else if(%option.class $= "OptionsListSliderEntry") + { + } + else if(%option.class $= "OptionsKeybindEntry") + { + %bindImgAsset = getButtonBitmap(%option.device, getField(%option.keymap, 1)); + + if(%bindImgAsset $= "UI:Keyboard_Black_Blank_image") + %bindImgAsset = ""; + + %container-->bindButton.setBitmap(%bindImgAsset); + } + } +} + +function OptionsMenuList::checkForUnappliedChanges(%this) +{ + %unappliedChanges = false; + + foreach(%option in %this) + { + if(%option.class $= "OptionsListEntry") + { + if(%option.currentOptionIndex >= 0 && %option.currentOptionIndex < %option.optionsObject.getCount()) + { + %targetOptionLevel = %option.optionsObject.getObject(%option.currentOptionIndex); + + if(!%targetOptionLevel.isCurrent()) + %unappliedChanges = true; + + if(%option.optionsObject.requiresRestart) + $optionsChangeRequiresRestart = true; + } + } } - %this.unappliedChanges.empty(); - $pref::Video::displayDeviceId = ""; - - OptionsMenuCategoryList.setAsActiveMenuList(); - - $activeMenuButtonContainer-->button1.set("btn_back", "R", "Reset", "OptionsMenu.resetToDefaults();"); - $activeMenuButtonContainer-->button2.disable(); - $activeMenuButtonContainer-->button3.set("", "Space", "Apply", "OptionsMenu.apply();"); - $activeMenuButtonContainer-->button4.set("btn_a", "", "Select", "OptionsMenu.select();"); - $activeMenuButtonContainer-->button5.set("btn_b", "Escape", "Back", %this @ ".navigation.popPage();"); + return %unappliedChanges; } - -//We capitalize on the canClose test here, because we want to prompt for unapplied options changes before -//backing out. So when the UINavigation test canClose, we can see if we have unapplied settings and prompt -//that via the message box and return false. -//This gives the user a chance to choose how they wish to proceed before we allow the -//UINavigation to move away from the options menu -function OptionsMenu::canClose(%this) + +function OptionsMenuList::applyChanges(%this) { - //Another special case is us catching the 'back/pop' action by just shifting from one - //menu list to another. In this case, we check if we were on the settings list as our active MenuList - //if so, then the back/pop just moves us to the Category list as our active and we inform the - //UINavigation to not close the page - if(OptionsMenuSettingsList.isActiveMenuList()) + foreach(%option in %this) { - OptionsMenuCategoryList.setAsActiveMenuList(); - return false; + if(%option.class $= "OptionsListEntry") + { + //If it's custom or nonsensical index, there's some kind of external factor going on, so we're + //just going to skip applying it because we don't know what we'd be applying + if(%option.currentOptionIndex >= 0 && %option.currentOptionIndex < %option.optionsObject.getCount()) + { + %targetOptionLevel = %option.optionsObject.getObject(%option.currentOptionIndex); + + if(!%targetOptionLevel.isCurrent()) + %targetOptionLevel.apply(); + } + } + } +} + +function OptionsMenu::openOptionsCategory(%this, %categoryName) +{ + VideoSettingsList.setVisible(%categoryName $= "Video"); + AudioSettingsList.setVisible(%categoryName $= "Audio"); + KBMControlsList.setVisible(%categoryName $= "KBM"); + GamepadControlsList.setVisible(%categoryName $= "Controller"); + + if(%categoryName $= "Video") + { + $MenuList = VideoSettingsList; + //Find our first non-group entry + while($MenuList.getObject($MenuList.listPosition).class !$= OptionsListEntry && $MenuList.listPosition < $MenuList.getCount()) + { + $MenuList.listPosition += 1; + } + + %this.currentCatgeoryIdx = 0; + } + else if(%categoryName $= "Audio") + { + $MenuList = AudioSettingsList; + + %this.currentCatgeoryIdx = 1; + } + else if(%categoryName $= "KBM") + { + $MenuList = KBMControlsList; + + %this.currentCatgeoryIdx = 2; + } + else if(%categoryName $= "Controller") + { + $MenuList = GamepadControlsList; + + %this.currentCatgeoryIdx = 3; + } + + $MenuList.syncGui(); + %this.syncGui(); +} + +//============================================================================== +// This function updates the non-list items of the menu to be up to date and stylistically +// complaint. This ensures keybind hint buttons are presented correctly based on the current input +// device +function OptionsMenu::syncGui(%this) +{ + OptionsMenuCategoryList.callOnChildren("setHighlighted", false); + + %btn = OptionsMenuCategoryList.getObject(%this.currentCatgeoryIdx); + %btn.setHighlighted(true); + + %buttonPosX = %btn.position.x + OptionsMenuCategoryList.position.x; + + OptionsMenuPrevNavIcon.position.x = %buttonPosX - 5; + OptionsMenuNextNavIcon.position.x = %buttonPosX + %btn.extent.x - 35; + + //Update the button imagery to comply to the last input device we'd used + %device = Canvas.getLastInputDevice(); + if(%device $= "mouse") + %device = "keyboard"; + + OptionsMenuBackBtn.setBitmap(BaseUIActionMap.getCommandButtonBitmap(%device, "BaseUIBackOut")); + OptionsMenuResetBtn.setBitmap(OptionsMenuActionMap.getCommandButtonBitmap(%device, "OptionsMenuReset")); + + OptionsMenuPrevNavIcon.setBitmap(OptionsMenuActionMap.getCommandButtonBitmap(%device, "OptionsMenuPrevCategory")); + OptionsMenuNextNavIcon.setBitmap(OptionsMenuActionMap.getCommandButtonBitmap(%device, "OptionsMenuNextCategory")); +} + +//============================================================================== +// Menu navigation functions +// Primarily used by keybinds +function OptionsMenuPrevCategory(%val) +{ + if(%val) + { + %currentIdx = OptionsMenu.currentMenuIdx; + OptionsMenu.currentMenuIdx -= 1; + + OptionsMenu.currentMenuIdx = mClamp(OptionsMenu.currentMenuIdx, 0, 3); + + if(%currentIdx == OptionsMenu.currentMenuIdx) + return; + + %newCategory = $OptionsMenuCategories[OptionsMenu.currentMenuIdx]; + OptionsMenu.openOptionsCategory(%newCategory); + } +} + +function OptionsMenuNextCategory(%val) +{ + if(%val) + { + %currentIdx = OptionsMenu.currentMenuIdx; + OptionsMenu.currentMenuIdx += 1; + + OptionsMenu.currentMenuIdx = mClamp(OptionsMenu.currentMenuIdx, 0, 3); + + if(%currentIdx == OptionsMenu.currentMenuIdx) + return; + + %newCategory = $OptionsMenuCategories[OptionsMenu.currentMenuIdx]; + OptionsMenu.openOptionsCategory(%newCategory); + } +} + +function OptionMenuNavigatePrev(%val) +{ + if(%val) + { + $MenuList.listPosition -= 1; + while( $MenuList.listPosition >= 0 && ($MenuList.getObject($MenuList.listPosition).class !$= "OptionsListEntry" && + $MenuList.getObject($MenuList.listPosition).class !$= "OptionsListSliderEntry" && + $MenuList.getObject($MenuList.listPosition).class !$= "OptionsKeybindEntry")) + { + $MenuList.listPosition -= 1; + } + + if($MenuList.listPosition < 0) + $MenuList.listPosition = 0; + + $MenuList.syncGUI(); + } +} + +function OptionMenuNavigateNext(%val) +{ + if(%val) + { + $MenuList.listPosition += 1; + while($MenuList.listPosition < $MenuList.getCount() && ($MenuList.getObject($MenuList.listPosition).class !$= "OptionsListEntry" && + $MenuList.getObject($MenuList.listPosition).class !$= "OptionsListSliderEntry" && + $MenuList.getObject($MenuList.listPosition).class !$= "OptionsKeybindEntry")) + { + $MenuList.listPosition += 1; + } + + if($MenuList.listPosition >= $MenuList.getCount()) + $MenuList.listPosition = $MenuList.getCount()-1; + + $MenuList.syncGUI(); + } +} + +function OptionMenuStickNavigate(%val) +{ + if(%val == -1) + BaseUINavigateNext(1); + else if(%val == 1) + mainMenuNavigateDown(1); +} + +function OptionMenuPrevSetting(%val) +{ + if(!%val) + return; + + %option = $MenuList.getObject($MenuList.listPosition); + + if(!isObject(%option)) + return; + + if(%option.class $= "OptionsListEntry") + { + %optionObject = %option.optionsObject; + %currentOptionLevel = %optionObject.getObject(%option.currentOptionIndex); + + %option.currentOptionIndex = mClamp(%option.currentOptionIndex-1, 0, %optionObject.getCount()-1); + + %newOptionLevel = %optionObject.getObject(%option.currentOptionIndex); + + //echo("Changed option: " @ %optionObject.optionName @ " from level: " @ %currentOptionLevel.displayName @ " to level: " @ %newOptionLevel.displayName); + } + + $MenuList.syncGUI(); +} + +function OptionMenuNextSetting(%val) +{ + if(!%val) + return; + + %option = $MenuList.getObject($MenuList.listPosition); + + if(!isObject(%option) ) + return; + + if(%option.class $= "OptionsListEntry") + { + %optionObject = %option.optionsObject; + %currentOptionLevel = %optionObject.getObject(%option.currentOptionIndex); + + %option.currentOptionIndex = mClamp(%option.currentOptionIndex+1, 0, %optionObject.getCount()-1); + + %newOptionLevel = %optionObject.getObject(%option.currentOptionIndex); + + //echo("Changed option: " @ %optionObject.optionName @ " from level: " @ %currentOptionLevel.displayName @ " to level: " @ %newOptionLevel.displayName); + } + + $MenuList.syncGUI(); +} + +function OptionMenuStickChangeSetting(%val) +{ + +} + +function OptionsMenuActivateOption(%val) +{ + if(!%val) + return; + + %option = $MenuList.getObject($MenuList.listPosition); + + if(!isObject(%option)) + return; + + echo(%option.class); + + if(%option.class $= "OptionsKeybindEntry") + { + eval(%option-->button.altCommand); + } +} + +//============================================================================== +// This function utilizes the VideoSettingsGroup SimGroup to populate options. +// The object is defined in core/rendering/scripts/graphicsOptions.tscript +// A majority of the options are statically defined, but some are dynamically populated +// on refresh, like the display device or available resolution options. +// Once populated, we loop over the simgroup structure to populate our option entry +// rows in the options menu itself. +function OptionsMenu::populateVideoSettings(%this) +{ + VideoSettingsList.clear(); + + VideoSettingsGroup::populateDisplaySettings(); + + for(%i=0; %i < VideoSettingsGroup.getCount(); %i++) + { + %setting = VideoSettingsGroup.getObject(%i); + + if(%setting.class $= "SubOptionsGroup") + { + %entry = addOptionGroup(%setting.displayName); + + if(isObject(%entry)) + VideoSettingsList.add(%entry); + + for(%s=0; %s < %setting.getCount(); %s++) + { + %option = %setting.getObject(%s); + + %optionsEntry = addOptionEntry(%option); + + if(isObject(%optionsEntry)) + VideoSettingsList.add(%optionsEntry); + } + } + else if(%setting.class $= "OptionsSettings") + { + %optionsEntry = addOptionEntry(%setting); + + if(isObject(%optionsEntry)) + VideoSettingsList.add(%optionsEntry); + } + } + + //Ensure our newly templated options listings are sized right + for(%i=0; %i < VideoSettingsList.getCount(); %i++) + { + %entry = VideoSettingsList.getObject(%i); + %entry.resize(0, 0, VideoSettingsList.extent.x - 15, %entry.extent.y); //-10 for the scroll wheel pad + } +} + +//============================================================================== +// This function utilizes the AudioSettingsGroup SimGroup to populate options. +// The object is defined in core/sfx/scripts/audioOptions.tscript +// Similar to the video options, it can be a mix of static and dynamically populated +// option entries, which we then iterate over and populate the entry rows for the menu +function OptionsMenu::populateAudioSettings(%this) +{ + AudioSettingsList.clear(); + AudioSettingsGroup.populateSettings(); + + //Process the lists + for(%i=0; %i < AudioSettingsGroup.getCount(); %i++) + { + %setting = AudioSettingsGroup.getObject(%i); + + if(%setting.class $= "SubOptionsGroup") + { + %entry = addOptionGroup(%setting.displayName); + + if(isObject(%entry)) + AudioSettingsList.add(%entry); + + for(%s=0; %s < %setting.getCount(); %s++) + { + %option = %setting.getObject(%s); + + %optionsEntry = addOptionEntry(%option); + + if(isObject(%optionsEntry)) + AudioSettingsList.add(%optionsEntry); + } + } + else if(%setting.class $= "AudioOptionsSettings") + { + %optionsEntry = addOptionEntry(%setting); + + if(isObject(%optionsEntry)) + AudioSettingsList.add(%optionsEntry); + } + } + + AudioSettingsList.add(addOptionGroup("Channel Volume")); + + AudioSettingsList.add(addOptionSlider("Master Volume", "", "$pref::SFX::masterVolume", 0, 1, 0.1)); + AudioSettingsList.add(addOptionSlider("GUI Volume", "", "$pref::SFX::channelVolume[" @ $GuiAudioType @ "]", 0, 1, 0.1)); + AudioSettingsList.add(addOptionSlider("Effects Volume", "", "$pref::SFX::channelVolume[" @ $SimAudioType @ "]", 0, 1, 0.1)); + AudioSettingsList.add(addOptionSlider("Music Volume", "", "$pref::SFX::channelVolume[" @ $MusicAudioType @ "]", 0, 1, 0.1)); + + //Ensure our newly templated options listings are sized right + for(%i=0; %i < AudioSettingsList.getCount(); %i++) + { + %entry = AudioSettingsList.getObject(%i); + %entry.resize(0, 0, AudioSettingsList.extent.x - 15, %entry.extent.y); //-10 for the scroll wheel pad + } +} + +function OptionsMenu::populateKBMControls(%this) +{ + //$remapListDevice = "keyboard"; + %this.populateKeybinds("keyboard", KBMControlsList); + + %this.syncGui(); +} + +function OptionsMenu::populateGamepadControls(%this) +{ + //$remapListDevice = ; + %this.populateKeybinds("gamepad", GamepadControlsList); + + %this.syncGui(); +} + +function OptionsMenu::populateKeybinds(%this, %device, %controlsList) +{ + //%device = $remapListDevice; + + %controlsList.clear(); + + //build out our list of action maps + %actionMapCount = ActionMapGroup.getCount(); + + %actionMapList = ""; + for(%i=0; %i < %actionMapCount; %i++) + { + %actionMap = ActionMapGroup.getObject(%i); + + if(%actionMap == GlobalActionMap.getId()) + continue; + + %actionMapName = %actionMap.humanReadableName $= "" ? %actionMap.getName() : %actionMap.humanReadableName; + + //see if we have any actual listed remappable keys for this movemap. if so, drop it from the listing + %hasRemaps = false; + for ( %r = 0; %r < $RemapCount; %r++ ) + { + %testMapName = $RemapActionMap[%r].humanReadableName $= "" ? $RemapActionMap[%r].getName() : $RemapActionMap[%r].humanReadableName; + + if(%actionMapName $= %testMapName) + { + //got a match to at least one, so we're ok to continue + %hasRemaps = true; + break; + } + } + + if(!%hasRemaps) + continue; + + if(%actionMapList $= "") + %actionMapList = %actionMapName; + else + %actionMapList = %actionMapList TAB %actionMapName; + } + + //If we didn't find any valid actionMaps, then just exit out + if(%actionMapList $= "") + return; + + if($activeRemapControlSet $= "") + $activeRemapControlSet = getField(%actionMapList, 0); + + if(getFieldCount(%actionMapList) > 1) + { + for(%am = 0; %am < getFieldCount(%actionMapList); %am++) + { + %currentActionMap = getField(%actionMapList, %am); + + %actionMapGroupEntry = addOptionGroup(%currentActionMap); + %controlsList.add(%actionMapGroupEntry); + + for ( %i = 0; %i < $RemapCount; %i++ ) + { + if(%device !$= "" && %device !$= $RemapDevice[%i]) + continue; + + %actionMapName = $RemapActionMap[%i].humanReadableName $= "" ? $RemapActionMap[%i].getName() : $RemapActionMap[%i].humanReadableName; + + if(%currentActionMap !$= %actionMapName) + continue; + + %keyMap = buildFullMapString( %i, $RemapActionMap[%i], %device ); + + %description = $RemapDescription[%i]; + + %remapEntry = addActionMapEntry(%actionMapName, %device, %keyMap, %i, %description); + %controlsList.add(%remapEntry); + } + } + } + + //Ensure our newly templated options listings are sized right + for(%i=0; %i < %controlsList.getCount(); %i++) + { + %entry = %controlsList.getObject(%i); + %entry.resize(0, 0, %controlsList.extent.x - 15, %entry.extent.y); //-10 for the scroll wheel pad + } +} + +//============================================================================== +function tryCloseOptionsMenu(%val) +{ + if(!%val) + return; + + $optionsChangeRequiresRestart = false; + + %unappliedVideoChanges = VideoSettingsList.checkForUnappliedChanges(); + %unappliedAudioChanges = AudioSettingsList.checkForUnappliedChanges(); + + if(%unappliedVideoChanges || %unappliedAudioChanges) + { + MessageBoxOKCancel("Discard Changes?", "You have unapplied changes to your settings, do you wish to apply or discard them?", + "OptionsMenu.applyChangedOptions();", "Canvas.popDialog(OptionsMenu);", + "Apply", "Discard"); } else { - //Here, we're on the category list as our active, so we're actually trying to leae the page - //If we have unapplied changes, we want to prompt about them before closing the page and navigating away - //If we don't, then we can process the popPage as normal and let the OptionsMenu close - if(%this.unappliedChanges.count() != 0) - { - MessageBoxOKCancel("Discard Changes?", "You have unapplied changes to your settings, do you wish to apply or discard them?", - "OptionsMenu.apply(); MainMenuGUI.popPage();", "" @ %this @ ".unappliedChanges.empty(); " @ %this @ ".navigation.popPage();", - "Apply", "Discard"); - return false; - } + Canvas.popDialog(OptionsMenu); } - - return true; -} +} -function OptionsMenu::onClose(%this) +function OptionsMenu::applyChangedOptions(%this) { + VideoSettingsList.applyChanges(); + AudioSettingsList.applyChanges(); -} - -function OptionsMenuSettingsList::onAdd(%this) -{ -} - -function OptionsMenuSettingsList::getOptionsList(%this, %index) -{ -} - -function OptionsMenu::select(%this) -{ - if(OptionsMenuCategoryList.isActiveMenuList()) - { - OptionsMenuSettingsList.setAsActiveMenuList(); - } -} - -function OptionsMenu::apply(%this) -{ - //Now we run through our list of unapplied changes and... apply them. - %hasKeybindChanges = false; - %hasVideoChanges = false; - %hasPostFXChanges = false; - %hasAudioChanges = false; - %hasGraphicsChanges = false; - for(%i=0; %i < %this.unappliedChanges.count(); %i++) - { - %targetVar = %this.unappliedChanges.getKey(%i); - %newValue = strReplace(%this.unappliedChanges.getValue(%i), "\"", ""); - - //First, lets just check through our action map names, see if any match - %wasKeybind = false; - for(%am=0; %am < ActionMapGroup.getCount(); %am++) - { - %actionMap = ActionMapGroup.getObject(%am); - - if(%actionMap == GlobalActionMap.getId()) - continue; - - %actionMapName = %actionMap.getName(); - if(%actionMapName $= %targetVar) - { - %hasKeybindChanges = true; - %wasKeybind = true; - break; - } - } - - if(!%wasKeybind) - { - %sanitizedVar = strReplace(%targetVar, "[", ""); - %sanitizedVar = strReplace(%sanitizedVar, "]", ""); - %sanitizedVar = strReplace(%sanitizedVar, ",", "_"); - %currentValue = getVariable(%sanitizedVar); - if(%currentValue !$= %newValue) - { - setVariable(%targetVar, %newValue); - - //now, lets check for special cases that need additional handling - //for updates - if ( %targetVar $= "$pref::Video::displayDevice" ) - { - schedule(32, 0, "MessageBoxOK", "Change requires restart", "Please restart the game for a display device change to take effect."); - } - else if(startsWith(%targetVar, "$pref::PostFX::")) - { - %hasPostFXChanges = true; - } - else if(startsWith(%targetVar, "$pref::Video::")) - { - %hasVideoChanges = true; - - //if it's the resolution, it's possible we got the human-friendly - //version stored off. if so, reprocess into the usable state - if(%targetVar $= "$pref::Video::Resolution") - { - if(strpos(%newValue, " x ") != -1) - { - %newValue = strreplace(%newValue, " x ", " "); - setVariable(%targetVar, %newValue); - } - } - //This is a bit of hackery to have an intermediate variable because we display in text - //but save by index, so we take the applied name and get the index of the deviceId - else if(%targetVar $= "$pref::Video::displayDeviceId") - { - %deviceId = getDisplayDeviceId($pref::Video::displayDeviceId); - if(%deviceId == -1) - %deviceId = 0; - - $pref::Video::deviceId = %deviceId; - $pref::Video::displayDeviceId = ""; - } - } - else if(startsWith(%targetVar, "$pref::SFX::")) - { - %hasAudioChanges = true; - } - else if(startsWith(%targetVar, "$pref::Graphics::")) - { - %hasGraphicsChanges = true; - } - } - } - } - - //If we had keybind changes, go ahead and save those out - if(%hasKeybindChanges) - { - %prefPath = getPrefpath(); - - %actionMapCount = ActionMapGroup.getCount(); - - %actionMapList = ""; - %append = false; - for(%i=0; %i < %actionMapCount; %i++) - { - %actionMap = ActionMapGroup.getObject(%i); - - if(%actionMap == GlobalActionMap.getId()) - continue; - - %actionMap.save( %prefPath @ "/keybinds." @ $TorqueScriptFileExtension, %append ); - - if(%append != true) - %append = true; - } - } - - if(%hasPostFXChanges) - { - updatePostFXSettings(); - } - - if(%hasVideoChanges) - { - updateDisplaySettings(); - } - - if(%hasAudioChanges) - { - updateAudioSettings(); - } - - if(%hasGraphicsChanges) - { - updateGraphicsSettings(); - } + //$pref::SFX::masterVolume = OptionsMenuSettingsList.getValue(2); + sfxSetMasterVolume( $pref::SFX::masterVolume ); + sfxSetChannelVolume( $GuiAudioType, $pref::SFX::channelVolume[ $GuiAudioType ] ); + sfxSetChannelVolume( $SimAudioType, $pref::SFX::channelVolume[ $SimAudioType ] ); + sfxSetChannelVolume( $MusicAudioType, $pref::SFX::channelVolume[ $MusicAudioType ] ); //Finally, write our prefs to file %prefPath = getPrefpath(); export("$pref::*", %prefPath @ "/clientPrefs." @ $TorqueScriptFileExtension, false); - OptionsMenu.unappliedChanges.empty(); + Canvas.popDialog(OptionsMenu); + + if($optionsChangeRequiresRestart) + MessageBoxOK("Restart Required", "Some of your changes require the game to be restarted."); } -function OptionsMenu::resetToDefaults(%this) +function doKeyRemap( %optionEntry ) +{ + //%rowIndex = %row.remapIndex; + //%name = $RemapName[%rowIndex]; + + %name = getField(%optionEntry.keymap,0); + + RemapDlg-->OptRemapText.text = "Re-bind \"" @ %name @ "\" to..." ; + OptRemapInputCtrl.index = %optionEntry.remapIndex; + + Canvas.pushDialog( RemapDlg ); +} + +function OptionsMenu::resetSettings(%this) { MessageBoxOKCancel("", "This will set the graphical settings back to the auto-detected defaults. Do you wish to continue?", "AutodetectGraphics();", ""); } -function OptionsMenu::refresh(%this) +//============================================================================== +// Option types +function addOptionGroup(%displayName) { - //cache our scroll position so we can ensure we end up back at it after the refresh - %lastScrollPos = OptionsMenuSettingsScroll.getScrollPosition(); + %group = new GuiTextCtrl() { + text = %displayName; + position = "0 0"; + extent = "500 45"; + profile = "MenuHeaderText"; + tooltipProfile = "GuiToolTipProfile"; + }; - %cat = %this.currentCategory; - if(%this.currentCategory !$= "") - { - if(!isInt(%this.currentCategory)) - { - %this.currentCategory = getOptionsCategoryIndexByName(%this.currentCategory); - } - - if(%this.currentCategory == -1) - return; - - %category = %this.optionsCategories.getKey(%this.currentCategory); - %command = %this.optionsCategories.getValue(%this.currentCategory); - eval(%command); - } - - //now, because we reconstruct the displayed set, we'll force the mouse(if we're using it as our input) - //to be poked so we can re-track to whatever control, if any, we're over - if($activeControllerType !$= "gamepad") - { - Canvas.setCursorPos(Canvas.getCursorPos()); - } - - //restore scroll position - OptionsMenuSettingsScroll.setScrollPosition(%lastScrollPos.x, %lastScrollPos.y); + return %group; } -function OptionsMenu::getOptionVariableValue(%this, %variableName) +function optionsMenuButton::onHighlighted(%this, %highlighted) { - %unappliedPrefIndex = %this.unappliedChanges.getIndexFromKey(%variableName); - if(%unappliedPrefIndex != -1) - { - %value = %this.unappliedChanges.getValue(%unappliedPrefIndex); - return strreplace(%value, "\"", ""); - } + %container = %this.getParent(); - %sanitizedVar = strReplace(%variableName, "[", ""); - %sanitizedVar = strReplace(%sanitizedVar, "]", ""); - %sanitizedVar = strReplace(%sanitizedVar, ",", "_"); - return getVariable(%sanitizedVar); + %container-->optionName.profile = %highlighted ? MenuSubHeaderTextHighlighted : MenuSubHeaderText; + %container-->optionDescription.profile = %highlighted ? GuiMLTextProfileHighlighted : GuiMLTextProfile; + + %valuesContainer = %container-->valuesContainer; + %valuesContainer-->optionValue.profile = %highlighted ? GuiMenuTextProfileHL : GuiMenuTextProfile; + + OptionsMenuSettingsScroll.scrollToObject(%container); } -function OptionsMenuSelectButton::onVisible(%this, %state) +function addOptionEntry(%optionObj) { - //We're sorta cheating here. - //This button should only be displayed when we're in the categories list - //so whenever the status changes, such as automatically refreshing due to - //navigation events, we'll just do a quick check to ensure we're - //in the right visibility mode - if(%state && OptionsMenuSettingsList.isActiveMenuList()) + if(!isObject(%optionObj) || (%optionObj.class !$= "OptionsSettings" && %optionObj.class !$= "AudioOptionsSettings")) { - %this.setHidden(true); + error("addOptionsEntry() - attempting to create a new options entry, but was provided an invalid options object"); + return 0; } -} -// -// -// -function populateDisplaySettingsList() -{ - OptionsMenuSettingsList.clear(); - OptionsMenu.currentCategory = "Display"; + %qualityLevel = getCurrentQualityLevel(%optionObj); - if(isObject(OptionName)) - OptionName.setText(""); - if(isObject(OptionDescription)) - OptionDescription.setText(""); - - %apiList = ""; - %apiCount = GFXInit::getAdapterCount(); - %apiIdx = 0; - for(%i=0; %i < %apiCount; %i++) + if(isObject(%qualityLevel)) { - %api = GFXInit::getAdapterType(%i); - - if(%api !$= "NullDevice") - { - if(%apiIdx==0) - %apiList = %api; - else - %apiList = %apiList TAB %api; - - %apiIdx++; - } - } - - trim(%apiList); - - %displayDevice = OptionsMenu.getOptionVariableValue("$pref::Video::displayDevice"); - if(%displayDevice $= "") - %displayDevice = getDisplayDeviceType(); - - OptionsMenuSettingsList.addOptionRow("Display API", "$pref::Video::displayDevice", %apiList, false, "", true, "The display API used for rendering.", %displayDevice); - - %numDevices = Canvas.getMonitorCount(); - - %devicesList = getDisplayDeviceList(); - - if($pref::Video::displayDeviceId $= "") - $pref::Video::displayDeviceId = getField(%devicesList, $pref::Video::deviceId); - - OptionsMenuSettingsList.addOptionRow("Display Device", "$pref::Video::displayDeviceId", %devicesList, false, "", true, "The display devices the window should be on."); - - if (%numDevices > 1) - OptionsMenuSettingsList.setRowEnabled(1, true); + %qualityLevelText = %qualityLevel.displayName; + %qualityLevelIndex = %optionObj.getObjectIndex(%qualityLevel); + } else - OptionsMenuSettingsList.setRowEnabled(1, false); - - %mode = OptionsMenu.getOptionVariableValue("$pref::Video::deviceMode"); - if(isInt(%mode)) - %mode = getField($Video::ModeTags, $pref::Video::deviceMode); - OptionsMenuSettingsList.addOptionRow("Window Mode", "$pref::Video::deviceMode", $Video::ModeTags, false, "", true, "", %mode); - - if(%mode !$= "Borderless") { - %resolutionList = getScreenResolutionList($pref::Video::deviceId, $Video::Mode[%mode]); - %resolution = OptionsMenu.getOptionVariableValue("$pref::Video::Resolution"); - if(%resolution $= "") - %resolution = $pref::Video::mode; - - %resolution = _makePrettyResString(%resolution); - - OptionsMenuSettingsList.addOptionRow("Resolution", "$pref::Video::Resolution", %resolutionList, false, "", true, "Resolution of the game window", %resolution); - - // If the requested resolution could not be set, mark the control and pref as changed. - %resControl = OptionsMenuSettingsList.getObject(OptionsMenuSettingsList.getCount()-1); - if (%resControl.getCurrentOption() !$= %resolution) - %resControl.onChange(); + %qualityLevelText = %qualityLevel; + %qualityLevelIndex = %optionObj.getCount(); } - OptionsMenuSettingsList.addOptionBoolRow("VSync", "$pref::Video::enableVerticalSync", $YesNoList, false, "", true, "", ""); - - - %refreshList = getScreenRefreshList($pref::Video::mode); - OptionsMenuSettingsList.addOptionRow("Refresh Rate", "$pref::Video::RefreshRate", %refreshList, false, "", true, "", OptionsMenu.getOptionVariableValue("$pref::Video::RefreshRate")); + %optionNameHeight = 20; + if(%optionObj.Description $= "") + %optionNameHeight = 40; - //move to gameplay tab - //OptionsMenuSettingsList.addSliderRow("Field of View", "", 75, 5, "65 100", ""); - - //OptionsMenuSettingsList.addSliderRow("Brightness", "", 0.5, 0.1, "0 1", ""); - //OptionsMenuSettingsList.addSliderRow("Contrast", "", 0.5, 0.1, "0 1", ""); -} - -// -// -// -function populateGraphicsSettingsList() -{ - OptionsMenuSettingsList.clear(); - - OptionsMenu.currentCategory = "Graphics"; - - if(isObject(OptionName)) - OptionName.setText(""); - if(isObject(OptionDescription)) - OptionDescription.setText(""); - - %yesNoList = "No\tYes"; - %onOffList = "Off\tOn"; - %anisoFilter = "Off\t4\t8\t16"; - %aaTypeFilter = "None\tFXAA\tSMAA\tSMAA High"; - OptionsMenuSettingsList.addOptionQualityLevelRow("Lighting Quality", "$pref::Graphics::LightingQuality", - LightingQualityList, false, "", true, "Amount and drawdistance of local lights"); - OptionsMenuSettingsList.addOptionQualityLevelRow("Shadow Quality", "$pref::Graphics::ShadowQuality", - ShadowQualityList, false, "", true, "Shadow revolution quality"); - - %shadowQuality = OptionsMenu.getOptionVariableValue("$pref::Graphics::ShadowQuality"); - if(%shadowQuality !$= "None") - { - OptionsMenuSettingsList.addOptionQualityLevelRow("Soft Shadow Quality", "$pref::Graphics::SoftShadowQuality", - SoftShadowList, false, "", true, "Amount of softening applied to shadowmaps"); - } - - OptionsMenuSettingsList.addOptionQualityLevelRow("Mesh Quality", "$pref::Graphics::MeshQuality", - MeshQualityGroup, false, "", true, "Fidelity of rendering of mesh objects"); - OptionsMenuSettingsList.addOptionQualityLevelRow("Object Draw Distance", "$pref::Graphics::ObjectDrawDistance", - MeshDrawDistQualityGroup, false, "", true, "Dictates if and when static objects fade out in the distance"); - OptionsMenuSettingsList.addOptionQualityLevelRow("Texture Quality", "$pref::Graphics::TextureQuality", - TextureQualityGroup, false, "", true, "Fidelity of textures"); - OptionsMenuSettingsList.addOptionQualityLevelRow("Terrain Quality", "$pref::Graphics::TerrainQuality", - TerrainQualityGroup, false, "", true, "Quality level of terrain objects"); - OptionsMenuSettingsList.addOptionQualityLevelRow("Decal Lifetime", "$pref::Graphics::DecalLifetime", - DecalLifetimeGroup, false, "", true, "How long decals are rendered"); - OptionsMenuSettingsList.addOptionQualityLevelRow("Ground Cover Density", "$pref::Graphics::GroundCoverDensity", - GroundCoverDensityGroup, false, "", true, "Density of ground cover items, such as grass"); - OptionsMenuSettingsList.addOptionQualityLevelRow("Shader Quality", "$pref::Graphics::ShaderQuality", - ShaderQualityGroup, false, "", true, "Dictates the overall shader quality level, adjusting what features are enabled."); - OptionsMenuSettingsList.addOptionRow("Anisotropic Filtering", "$pref::Video::defaultAnisotropy", %anisoFilter, false, "", true, "Amount of Anisotropic Filtering on textures, which dictates their sharpness at a distance"); - - OptionsMenuSettingsList.addOptionRow("Anti-Aliasing Type", "$pref::Video::AAMode", %aaTypeFilter, false, "", true, "The Anti-Aliasing Method applied to rendering"); - - OptionsMenuSettingsList.addOptionBoolRow("Parallax", "$pref::Video::enableParallaxMapping", %onOffList, false, "", true, "Whether the surface parallax shader effect is enabled", ""); - OptionsMenuSettingsList.addOptionBoolRow("Water Reflections", "$pref::Water::enableTrueReflections", %onOffList, false, "", true, "Whether water reflections are enabled", ""); - - OptionsMenuSettingsList.addOptionBoolRow("SSAO", "$pref::PostFX::EnableSSAO", %onOffList, false, "", true, "Whether Screen-Space Ambient Occlusion is enabled"); - OptionsMenuSettingsList.addOptionBoolRow("Depth of Field", "$pref::PostFX::EnableDOF", %onOffList, false, "", true, "Whether the Depth of Field effect is enabled"); - OptionsMenuSettingsList.addOptionBoolRow("Vignette", "$pref::PostFX::EnableVignette", %onOffList, false, "", true, "Whether the vignette effect is enabled"); - OptionsMenuSettingsList.addOptionBoolRow("Light Rays", "$pref::PostFX::EnableLightRays", %onOffList, false, "", true, "Whether the light rays effect is enabled"); -} - -function updateGraphicsSettings() -{ - if($pref::Graphics::LightingQuality !$= getCurrentQualityLevel(LightingQualityList)) - LightingQualityList.applySetting($pref::Graphics::LightingQuality); - if($pref::Graphics::ShadowQuality !$= getCurrentQualityLevel(ShadowQualityList)) - ShadowQualityList.applySetting($pref::Graphics::ShadowQuality); - if($pref::Graphics::SoftShadowQuality !$= getCurrentQualityLevel(SoftShadowList)) - SoftShadowList.applySetting($pref::Graphics::SoftShadowQuality); - - if($pref::Graphics::MeshQuality !$= getCurrentQualityLevel(MeshQualityGroup)) - MeshQualityGroup.applySetting($pref::Graphics::MeshQuality); - if($pref::Graphics::ObjectDrawDistance !$= getCurrentQualityLevel(MeshDrawDistQualityGroup)) - MeshDrawDistQualityGroup.applySetting($pref::Graphics::ObjectDrawDistance); - if($pref::Graphics::TextureQuality !$= getCurrentQualityLevel(TextureQualityGroup)) - { - TextureQualityGroup.applySetting($pref::Graphics::TextureQuality); - - reloadTextures(); - } - if($pref::Graphics::TerrainQuality !$= getCurrentQualityLevel(TerrainQualityGroup)) - TerrainQualityGroup.applySetting($pref::Graphics::TerrainQuality); - if($pref::Graphics::DecalLifetime !$= getCurrentQualityLevel(DecalLifetimeGroup)) - DecalLifetimeGroup.applySetting($pref::Graphics::DecalLifetime); - if($pref::Graphics::GroundCoverDensity !$= getCurrentQualityLevel(GroundCoverDensityGroup)) - GroundCoverDensityGroup.applySetting($pref::Graphics::GroundCoverDensity); - if($pref::Graphics::ShaderQuality !$= getCurrentQualityLevel(ShaderQualityGroup)) - { - ShaderQualityGroup.applySetting($pref::Graphics::ShaderQuality); - //this has ties into postFX behaviors, so we'll force an update to it here - updatePostFXSettings(); - } -} - -function updateDisplaySettings() -{ - //Update the display settings now - %deviceName = getDisplayDeviceName(); - %newDeviceID = getWord(%deviceName, 0) - 1; - - if(!isInt($pref::Video::deviceMode)) - { - //probably saved out as the mode name, so just translate it back - for(%i=0; %i < getFieldCount($Video::ModeTags); %i++) - { - if(getField($Video::ModeTags, %i) $= $pref::Video::deviceMode) - { - $pref::Video::deviceMode = %i; - break; - } - } - } - - %deviceModeName = getField($Video::ModeTags, $pref::Video::deviceMode); - %newDeviceMode = 0; - foreach$(%modeName in $Video::ModeTags) - { - if (%deviceModeName $= %modeName) - break; - else - %newDeviceMode++; - } - - if($pref::Video::deviceMode == $Video::ModeBorderless) - { - //if we're changing to borderless, we swap to the full resolution of the desktop - $pref::Video::mode = Canvas.getBestCanvasRes($pref::Video::deviceId, $pref::Video::deviceMode); - - $pref::Video::Resolution = $pref::Video::mode.x SPC $pref::Video::mode.y; - } - - %newRes = $pref::Video::Resolution; - %newBpp = 32; // ... its not 1997 anymore. - %newFullScreen = %deviceModeName $= "Fullscreen" ? true : false; - %newRefresh = $pref::Video::RefreshRate; - %newVsync = $pref::Video::enableVerticalSync; - %newAA = $pref::Video::AA; - - // Build the final mode string. - %newMode = $pref::Video::Resolution SPC %newFullScreen SPC %newBpp SPC %newRefresh SPC %newAA; - - // Change the video mode. - if ( %newMode !$= $pref::Video::mode || %newDeviceID != $pref::Video::deviceId || - %newVsync != $pref::Video::enableVerticalSync || %newDeviceMode != $pref::Video::deviceMode) - { - //****Edge Case Hack - // If we're in fullscreen mode and switching to a different monitor at the - // same resolution and maintaining fullscreen, GFX...WindowTarget::resetMode() - // will early-out because there is no "mode change" and the monitor change - // will not get applied. Instead of modifying platform code, we're going to - // move onto the new monitor in borderless and immediately switch to FS. - if (%newFullScreen && $pref::Video::FullScreen && - ($pref::Video::Resolution $= %newRes) && ($pref::Video::deviceId != %newDeviceID)) - { - $pref::Video::deviceId = %newDeviceID; - $pref::Video::deviceMode = $Video::ModeBorderless; - %tmpModeStr = Canvas.getMonitorMode(%newDeviceID, 0); - Canvas.setVideoMode(%tmpModeStr.x, %tmpModeStr.y, false, 32, getWord(%tmpModeStr, $WORD::REFRESH), %newAA); - } - - $pref::Video::mode = %newMode; - $pref::Video::enableVerticalSync = %newVsync; - $pref::Video::deviceId = %newDeviceID; - $pref::Video::deviceMode = %newDeviceMode; - $pref::Video::Resolution = %newRes; - $pref::Video::FullScreen = %newFullScreen; - $pref::Video::RefreshRate = %newRefresh; - $pref::Video::AA = %newAA; - configureCanvas(); - } -} - -function updatePostFXSettings() -{ - PostFXManager.settingsEffectSetEnabled(SSAOPostFx, $pref::PostFX::EnableSSAO); - PostFXManager.settingsEffectSetEnabled(DepthOfFieldPostFX, $pref::PostFX::EnableDOF); - PostFXManager.settingsEffectSetEnabled(LightRayPostFX, $pref::PostFX::EnableLightRays); - PostFXManager.settingsEffectSetEnabled(vignettePostFX, $pref::PostFX::EnableVignette); -} - -// -// -// -function populateAudioSettingsList() -{ - OptionsMenuSettingsList.clear(); - - OptionsMenu.currentCategory = "Audio"; - - if(isObject(OptionName)) - OptionName.setText(""); - if(isObject(OptionDescription)) - OptionDescription.setText(""); - - %buffer = sfxGetAvailableDevices(); - %count = getRecordCount( %buffer ); - %audioDriverList = ""; - %audioProviderList = ""; - %audioDeviceList = ""; - - $currentAudioProvider = $currentAudioProvider $= "" ? $pref::SFX::provider : $currentAudioProvider; - - for(%i = 0; %i < %count; %i++) - { - %record = getRecord(%buffer, %i); - %provider = getField(%record, 0); - %device = getField(%record, 1); - - //When the client is actually running, we don't care about null audo devices - if(%provider $= "null") - continue; - - if(%audioProviderList $= "") - %audioProviderList = %provider; - else - %audioProviderList = %audioProviderList @ "\t" @ %provider; - - if(%provider $= $currentAudioProvider) - { - if(%audioDeviceList $= "") - %audioDeviceList = %device; - else - %audioDeviceList = %audioDeviceList @ "\t" @ %device; - } - } - - OptionsMenuSettingsList.addOptionRow("Audio Provider", "$pref::SFX::provider", %audioProviderList, false, "audioProviderChanged", true, ""); - OptionsMenuSettingsList.addOptionRow("Audio Device", "$pref::SFX::device", %audioDeviceList, false, "", true); - - OptionsMenuSettingsList.addSliderRow("Master Volume", "$pref::SFX::masterVolume", 0.1, "0 1", ""); - OptionsMenuSettingsList.addSliderRow("GUI Volume", "$pref::SFX::channelVolume[" @ $GuiAudioType @ "]", 0.1, "0 1", ""); - OptionsMenuSettingsList.addSliderRow("Effects Volume", "$pref::SFX::channelVolume[" @ $SimAudioType @ "]", 0.1, "0 1", ""); - OptionsMenuSettingsList.addSliderRow("Music Volume", "$pref::SFX::channelVolume[" @ $MusicAudioType @ "]", 0.1, "0 1", ""); -} - -function audioProviderChanged() -{ - //Get the option we have set for the provider - %provider = OptionsMenuSettingsList.getCurrentOption(0); - $currentAudioProvider = %provider; - - //And now refresh the list to get the correct devices - populateAudioSettingsList(); -} - -function updateAudioSettings() -{ - //$pref::SFX::masterVolume = OptionsMenuSettingsList.getValue(2); - sfxSetMasterVolume( $pref::SFX::masterVolume ); - - //$pref::SFX::channelVolume[ $GuiAudioType ] = OptionsMenuSettingsList.getValue(3); - //$pref::SFX::channelVolume[ $SimAudioType ] = OptionsMenuSettingsList.getValue(4); - //$pref::SFX::channelVolume[ $MusicAudioType ] = OptionsMenuSettingsList.getValue(5); - - sfxSetChannelVolume( $GuiAudioType, $pref::SFX::channelVolume[ $GuiAudioType ] ); - sfxSetChannelVolume( $SimAudioType, $pref::SFX::channelVolume[ $SimAudioType ] ); - sfxSetChannelVolume( $MusicAudioType, $pref::SFX::channelVolume[ $MusicAudioType ] ); - - //$pref::SFX::provider = OptionsMenuSettingsList.getCurrentOption(0); - //$pref::SFX::device = OptionsMenuSettingsList.getCurrentOption(1); - - if ( !sfxCreateDevice( $pref::SFX::provider, - $pref::SFX::device, - $pref::SFX::useHardware, - -1 ) ) - error( "Unable to create SFX device: " @ $pref::SFX::provider - SPC $pref::SFX::device - SPC $pref::SFX::useHardware ); - - if( !isObject( $AudioTestHandle ) ) - { - sfxPlay(menuButtonPressed); - } -} - -// -// -// -function populateKeyboardMouseSettingsList() -{ - OptionsMenuSettingsList.clear(); - - OptionsMenu.currentCategory = "Keyboard & Mouse"; - - if(isObject(OptionName)) - OptionName.setText(""); - if(isObject(OptionDescription)) - OptionDescription.setText(""); - - $remapListDevice = "keyboard"; - fillRemapList(); - - //OptionsMenuSettingsList.refresh(); -} - -function populateGamepadSettingsList() -{ - OptionsMenuSettingsList.clear(); - - OptionsMenu.currentCategory = "Gamepad"; - - if(isObject(OptionName)) - OptionName.setText(""); - if(isObject(OptionDescription)) - OptionDescription.setText(""); - - $remapListDevice = "gamepad"; - fillRemapList(); - - OptionsMenuSettingsList.updateStack(); -} - -// -// -// -function getDisplayDeviceList() -{ - %numDevices = Canvas.getMonitorCount(); - %devicesList = ""; - for(%i = 0; %i < %numDevices; %i++) - { - %device = (%i+1) @ " - " @ Canvas.getMonitorName(%i); - if(%i==0) - %devicesList = %device; - else - %devicesList = %devicesList @ "\t" @ %device; - } - - return %devicesList; -} - -function getDisplayDeviceId(%displayDeviceName) -{ - %deviceList = getDisplayDeviceList(); - - %deviceCount = getFieldCount(%deviceList); - for(%d = 0; %d < %deviceCount; %d++) - { - %deviceName = getField(%deviceList, %d); - if(%deviceName $= %displayDeviceName) - return %d; - } - - return -1; -} -// -// -// -function OptionsMenuList::activateRow(%this) -{ - //OptionsMenuSettingsList.setFirstResponder(); - OptionsMenuSettingsList.setAsActiveMenuList(); -} - -function OptionsMenuSettingsList::setRowEnabled(%this, %row, %status) -{ - %option = %this.getObject(%row); - if(isObject(%option)) - { - %option.setEnabled(%status); - } -} - -function OptionsMenuSettingsList::addOptionRow(%this, %label, %targetPrefVar, %optionsList, %wrapOptions, %callback, %enabled, %description, %defaultValue) -{ - if(%enabled $= "") - %enabled = true; - - %optionsRowSize = 30; - %optionColumnWidth = %this.extent.x * 0.5;//todo, calculate off longest option text? - - %option = new GuiGameSettingsCtrl() { - class = "MenuOptionsButton"; - profile = "GuiMenuButtonProfile"; + %entry = new GuiContainer() { + position = "0 0"; + extent = "800 40"; + profile = GuiMenuDefaultProfile; + tooltipProfile = "GuiToolTipProfile"; horizSizing = "width"; vertSizing = "bottom"; - position = "0 0"; - extent = %this.extent.x SPC %optionsRowSize; - columnSplit = %optionColumnWidth; - useMouseEvents = true; - previousBitmapAsset = "UI:previousOption_n_image"; - nextBitmapAsset = "UI:nextOption_n_image"; - }; - - %option.targetPrefVar = %targetPrefVar; //create a var-option association - - if(%defaultValue $= "") - { - %unappliedPrefIndex = OptionsMenu.unappliedChanges.getIndexFromKey(%targetPrefVar); - if(%unappliedPrefIndex != -1) - { - %value = OptionsMenu.unappliedChanges.getValue(%unappliedPrefIndex); - %defaultValue = strreplace(%value, "\"", ""); - } - - if(%defaultValue $= "") - { - %sanitizedVar = strReplace(%targetPrefVar, "[", ""); - %sanitizedVar = strReplace(%sanitizedVar, "]", ""); - %sanitizedVar = strReplace(%sanitizedVar, ",", "_"); - %defaultValue = getVariable(%sanitizedVar); - } - } - - /*if(%defaultValue $= "Off" || %defaultValue $= "No") - %defaultValue = "0"; - if(%defaultValue $= "On" || %defaultValue $= "Yes") - %defaultValue = "1";*/ - - %option.setListSetting(%label, %optionsList, %wrapOptions, %callback, %enabled, %description, %defaultValue); + class = "OptionsListEntry"; + optionsObject = %optionObj; + currentOptionIndex = %qualityLevelIndex; + canSave = "0"; + + new GuiButtonCtrl() { + profile = GuiMenuButtonProfile; + position = "0 0"; + extent = "800 40"; + horizSizing = "width"; + vertSizing = "height"; + internalName = "button"; + class = "optionsMenuButton"; + }; - %this.add(%option); -} - -function OptionsMenuSettingsList::addOptionQualityLevelRow(%this, %label, %targetPrefVar, %qualityLevelList, %wrapOptions, %callback, %enabled, %description, %defaultValue) -{ - if(%defaultValue $= "") - { - %unappliedPrefIndex = OptionsMenu.unappliedChanges.getIndexFromKey(%targetPrefVar); - if(%unappliedPrefIndex != -1) - { - %value = OptionsMenu.unappliedChanges.getValue(%unappliedPrefIndex); - %defaultValue = strreplace(%value, "\"", ""); - } - - if(%defaultValue $= "") - { - %sanitizedVar = strReplace(%targetPrefVar, "[", ""); - %sanitizedVar = strReplace(%sanitizedVar, "]", ""); - %sanitizedVar = strReplace(%sanitizedVar, ",", "_"); - %defaultValue = getVariable(%sanitizedVar); - } + new GuiTextCtrl() { + text = %optionObj.OptionName; + position = $optionsEntryPad SPC -1; + extent = 400 SPC %optionNameHeight; + profile = "MenuSubHeaderText"; + tooltipProfile = "GuiToolTipProfile"; + internalName = "optionName"; + }; + new GuiTextCtrl() { + text = %optionObj.Description; + position = $optionsEntryPad SPC 17; + extent = "400 18"; + profile = "GuiMLTextProfile"; + tooltipProfile = "GuiToolTipProfile"; + internalName = "optionDescription"; + }; + + new GuiContainer() { + position = "400 0"; + extent = "400 40"; + profile = GuiModelessDialogProfile; + tooltipProfile = "GuiToolTipProfile"; + horizSizing = "left"; + vertSizing = "height"; + internalName = "valuesContainer"; - if(%defaultValue $= "") - %defaultValue = getCurrentQualityLevel(%qualityLevelList); - } + new GuiButtonCtrl() { + position = "310 0"; + extent = "20 40"; + text = "<"; + profile = GuiMenuButtonProfile; + internalName = "prevValButton"; + }; + + new GuiTextCtrl() { + text = %qualityLevelText; + position = "330 0"; + extent = "50 40"; + profile = "GuiMenuTextProfile"; + tooltipProfile = "GuiToolTipProfile"; + horizSizing = "right"; + vertSizing = "center"; + internalName = "optionValue"; + }; + + new GuiButtonCtrl() { + position = "380 0"; + extent = "20 40"; + text = ">"; + profile = GuiMenuButtonProfile; + internalName = "nextValButton"; + }; + }; + }; - return %this.addOptionRow(%label, %targetPrefVar, getQualityLevels(%qualityLevelList), - %wrapOptions, %callback, %enabled, %description, %defaultValue); + return %entry; } -function OptionsMenuSettingsList::addOptionBoolRow(%this, %label, %targetPrefVar, %qualityLevelList, %wrapOptions, %callback, %enabled, %description, %defaultValue, %inverted) +function addOptionSlider(%optionName, %optionDesc, %prefName, %sliderMin, %sliderMax, %sliderTicks) { - if(%defaultValue $= "") - %defaultValue = OptionsMenu.getOptionVariableValue(%targetPrefVar); - - if(%inverted $= "") - %inverted = false; - - //Lame and hacky, but some variables are 'disabled' and some are 'enabled' - if(isInt(%defaultValue) && %inverted) - { - if(%defaultValue == 0) - %defaultValue = 1; - else - %defaultValue = 0; - } + %currentVal = getVariable(%prefName); - if(%qualityLevelList $= $yesNoList && isInt(%defaultValue)) - { - %defaultValue = convertBoolToYesNo(%defaultValue); - } - else if(%qualityLevelList $= $onOffList && isInt(%defaultValue)) - { - %defaultValue = convertBoolToOnOff(%defaultValue); - } - - return %this.addOptionRow(%label, %targetPrefVar, %qualityLevelList, - %wrapOptions, %callback, %enabled, %description, %defaultValue); -} - -function OptionsMenuSettingsList::addSliderRow(%this, %label, %targetPrefVar, %increment, %range, %callback, %enabled, %description, %defaultValue) -{ - if(%enabled $= "") - %enabled = true; + if(%currentVal $= "") + %currentVal = %sliderMin; - %optionsRowSize = 30; - %optionColumnWidth = %this.extent.x * 0.5;//todo, calculate off longest option text? - - %option = new GuiGameSettingsCtrl() { - class = "MenuOptionsButton"; - profile = "GuiMenuButtonProfile"; + %optionNameHeight = 20; + if(%optionDesc $= "") + %optionNameHeight = 40; + + %entry = new GuiContainer() { + position = "0 0"; + extent = "800 40"; + profile = GuiMenuDefaultProfile; + tooltipProfile = "GuiToolTipProfile"; horizSizing = "width"; vertSizing = "bottom"; - position = "0 0"; - extent = %this.extent.x SPC %optionsRowSize; - columnSplit = %optionColumnWidth; - useMouseEvents = true; - }; - - %option.targetPrefVar = %targetPrefVar; //create a var-option association - - if(%defaultValue $= "") - %defaultValue = OptionsMenu.getOptionVariableValue(%targetPrefVar); - - %option.setSliderSetting(%label, %defaultValue, %increment, %range, %callback, %enabled, %description); + class = "OptionsListSliderEntry"; + canSave = "0"; + + new GuiButtonCtrl() { + profile = GuiMenuButtonProfile; + position = "0 0"; + extent = "800 40"; + horizSizing = "width"; + vertSizing = "height"; + internalName = "button"; + class = "optionsMenuButton"; + }; - %this.add(%option); + new GuiTextCtrl() { + text = %optionName; + position = $optionsEntryPad SPC -1; + extent = 400 SPC %optionNameHeight; + profile = "MenuSubHeaderText"; + tooltipProfile = "GuiToolTipProfile"; + internalName = "optionName"; + }; + + new GuiTextCtrl() { + text = %optionDesc; + position = $optionsEntryPad SPC 17; + extent = "400 18"; + profile = "GuiMLTextProfile"; + tooltipProfile = "GuiToolTipProfile"; + internalName = "optionDescription"; + }; + + new GuiContainer() { + position = "400 0"; + extent = "400 40"; + profile = GuiModelessDialogProfile; + tooltipProfile = "GuiToolTipProfile"; + horizSizing = "left"; + vertSizing = "height"; + internalName = "valuesContainer"; + + new GuiSliderCtrl() { + range = %sliderMin SPC %sliderMax; + ticks = %sliderTicks; + snap = "1"; + value = %currentVal; + useFillBar = "1"; + fillBarColor = $TextMediumEmphasisColor; + renderTicks = "0"; + position = "0 10"; + extent = "300 20"; + minExtent = "8 2"; + horizSizing = "right"; + vertSizing = "center"; + profile = GuiMenuButtonProfile; + visible = "1"; + active = "1"; + command = "$thisControl.updateSliderValue();"; + tooltipProfile = "GuiToolTipProfile"; + hovertime = "1000"; + isContainer = "0"; + canSave = "1"; + canSaveDynamicFields = "0"; + class = "OptionsSliderEntrySlider"; + }; + }; + }; + + return %entry; } -function OptionsMenuSettingsList::addKeybindRow(%this, %label, %bitmapName, %callback, %enabled, %description, %remapIndex) +function OptionsSliderEntrySlider::updateSliderValue(%this) { - if(%enabled $= "") - %enabled = true; - - %optionsRowSize = 40; - %optionColumnWidth = %this.extent.x * 0.5;//todo, calculate off longest option text? - - %option = new GuiGameSettingsCtrl() { - class = "MenuOptionsButton"; - profile = "GuiMenuButtonProfile"; + //update settings value here +} + +function OptionsMenuActionMapButton::onHighlighted(%this, %highlighted) +{ + %container = %this.getParent(); + %container-->actionName.profile = %highlighted ? MenuSubHeaderTextHighlighted : MenuSubHeaderText; + + OptionsMenuSettingsScroll.scrollToObject(%container); +} + +function addActionMapEntry(%actionMap, %device, %keyMap, %index, %description) +{ + %entry = new GuiContainer() { + position = "0 0"; + extent = "800 40"; + profile = GuiMenuDefaultProfile; + tooltipProfile = "GuiToolTipProfile"; horizSizing = "width"; vertSizing = "bottom"; - position = "0 0"; - extent = %this.extent.x SPC %optionsRowSize; - columnSplit = %optionColumnWidth; - useMouseEvents = true; - }; - - %option.remapIndex = %remapIndex; - - %option.setKeybindSetting(%label, %bitmapName, %callback, %enabled, %description); - - %this.add(%option); -} - -// -function OptionsMenuCategoryList::onNavigate(%this, %index) -{ - OptionsMenu.currentCategory = %index; - %this.getObject(%index).performClick(); -} - -function convertOptionToBool(%val) -{ - if(%val $= "yes" || %val $= "on") - return 1; - else - return 0; -} - -function convertBoolToYesNo(%val) -{ - if(%val == 1) - return "Yes"; - else if(%val == 0) - return "No"; + class = "OptionsKeybindEntry"; + canSave = "0"; + actionMap = %actionMap; + device = %device; + keymap = %keyMap; + remapIndex = %index; - return %val; -} + new GuiButtonCtrl() { + profile = GuiMenuButtonProfile; + position = "0 0"; + extent = "800 40"; + horizSizing = "width"; + vertSizing = "height"; + internalName = "button"; + class = "OptionsMenuActionMapButton"; + altCommand = "doKeyRemap($thisControl.getParent());"; + }; -function convertBoolToOnOff(%val) -{ - if(%val == 1) - return "On"; - else if(%val == 0) - return "Off"; + new GuiTextCtrl() { + text = getField(%keyMap, 0); + position = $optionsEntryPad SPC -1; + extent = "400 40"; + profile = "MenuSubHeaderText"; + tooltipProfile = "GuiToolTipProfile"; + internalName = "actionName"; + }; - return %val; -} - -function getDisplayDeviceName() -{ - %numDevices = Canvas.getMonitorCount(); - %devicesList = ""; - for(%i = 0; %i < %numDevices; %i++) - { - %device = (%i+1) @ " - " @ Canvas.getMonitorName(%i); - if(%i==0) - %devicesList = %device; - else - %devicesList = %devicesList @ "\t" @ %device; - } - - return getField(%devicesList, $pref::Video::deviceId); -} -// -// -// -function MenuOptionsButton::onMouseEnter(%this) -{ - if(isObject(OptionName)) - OptionName.setText(%this.getLabel()); - if(isObject(OptionDescription)) - OptionDescription.setText(%this.getToolTip()); -} - -function MenuOptionsButton::onMouseLeave(%this) -{ - if(isObject(OptionName)) - OptionName.setText(""); - if(isObject(OptionDescription)) - OptionDescription.setText(""); -} - -function MenuOptionsButton::onHighlighted(%this, %state) -{ - MenuListButton::onHighlighted(%this, %state); -} - -function MenuOptionsButton::onChange(%this) -{ - %optionMode = %this.getMode(); - %optionName = %this.getLabel(); - %tooltipText = %this.getTooltip(); - - %targetVar = %this.targetPrefVar; - - OptionName.setText(%optionName); - OptionDescription.setText(%tooltipText); - - if(%optionMode == 0) - { - %currentValue = %this.getCurrentOption(); - if(%currentValue !$= "") - { - if(%currentValue $= "yes" || %currentValue $= "on") - %saveReadyValue = 1; - else if(%currentValue $= "no" || %currentValue $= "off") - %saveReadyValue = 0; - else - %saveReadyValue = %currentValue; + new GuiContainer() { + position = "400 3"; + extent = "400 34"; + profile = GuiModelessDialogProfile; + tooltipProfile = "GuiToolTipProfile"; + horizSizing = "left"; + vertSizing = "height"; + internalName = "valuesContainer"; - %prefIndex = OptionsMenu.unappliedChanges.getIndexFromKey(%targetVar); - if(%prefIndex == -1) - { - echo("Setting UnappliedChanges via add: key:" @ %targetVar @", value: " @ %saveReadyValue); - OptionsMenu.unappliedChanges.add(%targetVar, "\"" @ %saveReadyValue @ "\"" ); - } - else - { - echo("Setting UnappliedChanges via modify: key:" @ %targetVar @", value: " @ %saveReadyValue); - OptionsMenu.unappliedChanges.setValue("\"" @ %saveReadyValue @ "\"", %prefIndex); - } - } - } - else if(%optionMode == 1) - { - %currentValue = %this.getValue(); - - %prefIndex = OptionsMenu.unappliedChanges.getIndexFromKey(%targetVar); - if(%prefIndex == -1) - { - echo("Setting UnappliedChanges via add: key:" @ %targetVar @", value: " @ %currentValue); - OptionsMenu.unappliedChanges.add(%targetVar, "\"" @ %currentValue @ "\"" ); - } - else - { - OptionsMenu.unappliedChanges.setValue("\"" @ %currentValue @ "\"", %prefIndex); - } - } + new GuiIconButtonCtrl() { + position = "300 -10"; + extent = "98 45"; + BitmapAsset = ""; + profile = GuiRemapActionMapButtonProfile; + sizeIconToButton = true; + makeIconSquare = true; + iconLocation = "center"; + internalName = "bindButton"; + active = false; + }; + }; + }; - //Update the UI in case there's responsive logic - OptionsMenu.schedule(32, "refresh"); -} - -function OptionsMenu::onKeybindChanged(%this, %actionMap, %keybind) -{ - %prefIndex = OptionsMenu.unappliedChanges.getIndexFromKey(%actionMap); - if(%prefIndex == -1) - OptionsMenu.unappliedChanges.add(%actionMap, %keybind); - else - OptionsMenu.unappliedChanges.setValue(%keybind, %prefIndex); -} - -// -// Indicates what category the options item should be added into -// -function addOptionsMenuCategory(%categoryName, %selectCallback) -{ - //Don't add duplicates! - %index = OptionsMenu.optionsCategories.getIndexFromKey(%categoryName); - if(%index == -1) - OptionsMenu.optionsCategories.add(%categoryName, %selectCallback); -} - -function removeOptionsMenuCategory(%categoryName) -{ - %index = OptionsMenu.optionsCategories.getIndexFromKey(%categoryName); - if(%index != -1) - OptionsMenu.optionsCategories.erase(%index); -} - -function getOptionsCategoryIndexByName(%categoryName) -{ - for(%i=0; %i < OptionsMenu.optionsCategories.count(); %i++) - { - if(OptionsMenu.optionsCategories.getKey(%i) $= %categoryName) - return %i; - } - - return -1; -} - -function addListOption(%label, %description, %targetPrefVar, %optionsList, %wrapOptions, %callback, %enabled) -{ - if(%wrapOptions $= "") - %wrapOptions = false; - - if(%enabled $= "") - %enabled = true; - - OptionsMenuSettingsList.addOptionRow(%label, %targetPrefVar, %optionsList, %wrapOptions, %callback, %enabled, %description, %targetPrefVar); -} - -function addSliderOption(%label, %description, %targetPrefVar, %defaultValue, %increment, %range, %callback, %enabled) -{ - if(%enabled $= "") - %enabled = true; - - OptionsMenuSettingsList.addSliderRow(%label, %targetPrefVar, %defaultValue, %increment, %range, %callback, %enabled, %description); -} - -function addKeybindOption(%label, %description, %bitmapName, %callback, %enabled) -{ - if(%enabled $= "") - %enabled = true; - - OptionsMenuSettingsList.addSliderRow(%label, %bitmapName, %callback, %enabled, %description); -} + return %entry; +} \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/guis/pauseMenu.gui b/Templates/BaseGame/game/data/UI/guis/pauseMenu.gui deleted file mode 100644 index 59d498e28..000000000 --- a/Templates/BaseGame/game/data/UI/guis/pauseMenu.gui +++ /dev/null @@ -1,163 +0,0 @@ -//--- OBJECT WRITE BEGIN --- -$guiContent = new GuiControl(PauseMenu) { - extent = "1024 768"; - profile = "GuiDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "1"; - superClass = "UINavigation"; - canSaveDynamicFields = "1"; - - new GuiChunkedBitmapCtrl(PauseMenuBG) { - BitmapAsset = "UI:hudfill_image"; - extent = "1024 768"; - horizSizing = "width"; - vertSizing = "height"; - profile = "GuiDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "1"; - canSaveDynamicFields = "1"; - }; - new GuiInputCtrl(PauseMenuInputHandler) { - sendAxisEvents = "1"; - sendBreakEvents = "1"; - ignoreMouseEvents = "1"; - position = "-50 0"; - extent = "10 10"; - horizSizing = "width"; - vertSizing = "height"; - profile = "GuiInputCtrlProfile"; - tooltipProfile = "GuiToolTipProfile"; - class = "MenuInputHandler"; - }; - new GuiControl(PauseMenuButtons) { - position = "162 125"; - extent = "700 518"; - horizSizing = "center"; - vertSizing = "center"; - profile = "GuiDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "1"; - - new GuiStackControl(PauseMenuList) { - padding = "15"; - dynamicSize = "0"; - extent = "700 320"; - horizSizing = "center"; - vertSizing = "center"; - profile = "GuiDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - superClass = "MenuList"; - - new GuiButtonCtrl() { - text = "Options"; - extent = "700 55"; - profile = "GuiMenuButtonProfile"; - command = "openPauseMenuOptions();"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiButtonCtrl() { - text = "Exit to Menu"; - position = "0 70"; - extent = "700 55"; - profile = "GuiMenuButtonProfile"; - command = "pauseMenuExitToMenu();"; - tooltipProfile = "GuiToolTipProfile"; - }; - new GuiButtonCtrl() { - text = "Exit to Desktop"; - position = "0 140"; - extent = "700 55"; - profile = "GuiMenuButtonProfile"; - command = "pauseMenuExitToDesktop();"; - tooltipProfile = "GuiToolTipProfile"; - }; - }; - }; - new GuiControl(PauseButtonHolder) { - position = "144 711"; - extent = "736 40"; - horizSizing = "center"; - vertSizing = "top"; - profile = "GuiDefaultProfile"; - tooltipProfile = "GuiToolTipProfile"; - isContainer = "1"; - class = "MenuInputButtonContainer"; - - new GuiIconButtonCtrl() { - BitmapAsset = "UI:Keyboard_Black_Return_image"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - position = "11 0"; - extent = "140 40"; - profile = "GuiMenuButtonProfile"; - visible = "0"; - active = "0"; - tooltipProfile = "GuiToolTipProfile"; - internalName = "button1"; - class = "MenuInputButton"; - hidden = "1"; - }; - new GuiIconButtonCtrl() { - BitmapAsset = "UI:Keyboard_Black_Return_image"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - position = "155 0"; - extent = "140 40"; - profile = "GuiMenuButtonProfile"; - visible = "0"; - active = "0"; - tooltipProfile = "GuiToolTipProfile"; - internalName = "button2"; - class = "MenuInputButton"; - hidden = "1"; - }; - new GuiIconButtonCtrl() { - BitmapAsset = "UI:Keyboard_Black_Return_image"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - position = "299 0"; - extent = "140 40"; - profile = "GuiMenuButtonProfile"; - visible = "0"; - active = "0"; - tooltipProfile = "GuiToolTipProfile"; - internalName = "button3"; - class = "MenuInputButton"; - hidden = "1"; - }; - new GuiIconButtonCtrl() { - BitmapAsset = "UI:Keyboard_Black_Return_image"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - position = "443 0"; - extent = "140 40"; - profile = "GuiMenuButtonProfile"; - visible = "0"; - active = "0"; - tooltipProfile = "GuiToolTipProfile"; - internalName = "button4"; - class = "MenuInputButton"; - hidden = "1"; - }; - new GuiIconButtonCtrl() { - BitmapAsset = "UI:Keyboard_Black_Return_image"; - sizeIconToButton = "1"; - makeIconSquare = "1"; - textLocation = "Right"; - position = "587 0"; - extent = "140 40"; - profile = "GuiMenuButtonProfile"; - visible = "0"; - active = "0"; - tooltipProfile = "GuiToolTipProfile"; - internalName = "button5"; - class = "MenuInputButton"; - hidden = "1"; - }; - }; -}; -//--- OBJECT WRITE END --- diff --git a/Templates/BaseGame/game/data/UI/guis/pauseMenu.tscript b/Templates/BaseGame/game/data/UI/guis/pauseMenu.tscript deleted file mode 100644 index 0c55e625f..000000000 --- a/Templates/BaseGame/game/data/UI/guis/pauseMenu.tscript +++ /dev/null @@ -1,93 +0,0 @@ -function PauseMenu::onWake(%this) -{ - if($Server::ServerType $= "SinglePlayer") - { - $timescale = 0; - - sfxSetChannelVolume( $SimAudioType, $pref::SFX::channelVolume[ 0 ] ); - } - - PauseButtonHolder.setActive(); - PauseMenuInputHandler.setFirstResponder(); - - %this.resizePages = true; - - %this.setRootPage(PauseMenuButtons); -} - -function PauseMenuButtons::onOpen(%this) -{ - PauseMenuList.clear(); - - if($Tools::loaded && EditorIsActive()) - { - %this.addPauseMenuButton("Exit Editor", "fastLoadWorldEdit();"); - } - - %this.addPauseMenuButton("Options", "openPauseMenuOptions();"); - %this.addPauseMenuButton("Exit to Menu", "pauseMenuExitToMenu();"); - %this.addPauseMenuButton("Exit to Desktop", "pauseMenuExitToDesktop();"); - - PauseMenuList.setAsActiveMenuList(); - - $activeMenuButtonContainer-->button1.disable(); - $activeMenuButtonContainer-->button2.disable(); - $activeMenuButtonContainer-->button3.disable(); - $activeMenuButtonContainer-->button4.set("btn_a", "", "OK", "PauseMenuList.activate();"); - $activeMenuButtonContainer-->button5.set("btn_b", "Escape", "Back", "Canvas.popDialog();"); -} - -function PauseMenuButtons::addPauseMenuButton(%this, %buttonText, %buttonCallback) -{ - %newButton = new GuiButtonCtrl() { - text = %buttonText; - groupNum = "-1"; - buttonType = "PushButton"; - useMouseEvents = "0"; - position = "0 0"; - extent = "400 55"; - minExtent = "8 2"; - horizSizing = "right"; - vertSizing = "bottom"; - profile = "GuiMenuButtonProfile"; - visible = "1"; - active = "1"; - command = %buttonCallback; - tooltipProfile = "GuiToolTipProfile"; - hovertime = "1000"; - isContainer = "0"; - canSave = "1"; - canSaveDynamicFields = "0"; - }; - - PauseMenuList.add(%newButton); -} -function PauseMenu::onSleep(%this) -{ - if($Server::ServerType $= "SinglePlayer") - { - $timescale = 1; - sfxSetChannelVolume( $SimAudioType, $pref::SFX::channelVolume[ $SimAudioType ] ); - } -} - -function openPauseMenuOptions() -{ - PauseMenu.pushPage(OptionsMenu); -} - -function pauseMenuExitToMenu() -{ - MessageBoxOKCancel("Exit?", "Do you wish to exit to the Main Menu?", "escapeFromGame();", ""); -} - -function pauseMenuExitToDesktop() -{ - MessageBoxOKCancel("Exit?", "Do you wish to exit to the desktop?", "quit();", ""); -} - -function PauseButtonHolder::onWake(%this) -{ - - -} diff --git a/Templates/BaseGame/game/data/UI/guis/recordingsDlg.asset.taml b/Templates/BaseGame/game/data/UI/guis/recordingsDlg.asset.taml deleted file mode 100644 index 2b0c337b5..000000000 --- a/Templates/BaseGame/game/data/UI/guis/recordingsDlg.asset.taml +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/Templates/BaseGame/game/data/UI/guis/remapDlg.gui b/Templates/BaseGame/game/data/UI/guis/remapDlg.gui index feef7d938..ccc678df6 100644 --- a/Templates/BaseGame/game/data/UI/guis/remapDlg.gui +++ b/Templates/BaseGame/game/data/UI/guis/remapDlg.gui @@ -1,6 +1,6 @@ //--- OBJECT WRITE BEGIN --- $guiContent = new GuiControl(RemapDlg) { - extent = "1024 768"; + extent = "1280 720"; minExtent = "8 8"; profile = "GuiDefaultProfile"; tooltipProfile = "GuiToolTipProfile"; @@ -9,7 +9,7 @@ $guiContent = new GuiControl(RemapDlg) { helpTag = "0"; new GuiContainer(RemapPanel) { - position = "162 332"; + position = "290 308"; extent = "700 104"; horizSizing = "center"; vertSizing = "center"; @@ -34,26 +34,28 @@ $guiContent = new GuiControl(RemapDlg) { tooltipProfile = "GuiToolTipProfile"; isContainer = "1"; - new GuiBitmapBarCtrl() { - BitmapAsset = "UI:panel_image"; - extent = "701 40"; + new GuiBitmapCtrl() { + BitmapAsset = "UI:backdrop_image"; + position = "1 1"; + extent = "701 100"; horizSizing = "width"; + vertSizing = "height"; profile = "GuiDefaultProfile"; tooltipProfile = "GuiToolTipProfile"; }; - new GuiBitmapBarCtrl() { - BitmapAsset = "UI:panel_low_image"; - position = "0 40"; - extent = "701 341"; + new GuiPanel() { + position = "38 12"; + extent = "625 80"; horizSizing = "width"; - profile = "GuiDefaultProfile"; + vertSizing = "height"; + profile = "GuiMenuBasePanelProfile"; tooltipProfile = "GuiToolTipProfile"; }; new GuiTextCtrl() { - text = "Press escape to cancel"; + text = "Press escape or start to cancel"; maxLength = "255"; - position = "260 67"; - extent = "181 23"; + position = "252 51"; + extent = "245 23"; minExtent = "8 8"; horizSizing = "width"; vertSizing = "height"; @@ -61,9 +63,9 @@ $guiContent = new GuiControl(RemapDlg) { tooltipProfile = "GuiToolTipProfile"; }; new GuiTextCtrl() { - text = "Re-bind \"Forward\" to..."; + text = "Re-bind \"\" to..."; maxLength = "255"; - position = "259 40"; + position = "251 24"; extent = "184 23"; minExtent = "8 8"; horizSizing = "center"; diff --git a/Templates/BaseGame/game/data/UI/guis/remapDlg.tscript b/Templates/BaseGame/game/data/UI/guis/remapDlg.tscript new file mode 100644 index 000000000..107251735 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/guis/remapDlg.tscript @@ -0,0 +1,77 @@ +function OptRemapInputCtrl::onInputEvent( %this, %device, %action ) +{ + Canvas.popDialog( RemapDlg ); + + if ( %device $= "keyboard" && %action $= "escape" ) + return; + else if( %device $= "gamepad" && %action $= "btn_start" ) + return; + + %cmd = $RemapCmd[%this.index]; + %name = $RemapName[%this.index]; + %actionMap = $RemapActionMap[%this.index]; + + echo("OptRemapInputCtrl::onInputEvent() - remapping details: " @ %cmd @ ", " @ %name @ ", " @ %actionMap @ " remapped to: " @ %device @ ", " @ %action); + + // Grab the friendly display name for this action + // which we'll use when prompting the user below. + %mapName = getMapDisplayName( %device, %action ); + + // Get the current command this action is mapped to. + %prevMap = %actionMap.getCommand( %device, %action ); + + //TODO: clear all existant keybinds to a command and then bind it so we only have a single one at all times + unbindExtraActions( %cmd, %actionMap, 0 ); + unbindExtraActions( %cmd, %actionMap, 1 ); + + // If nothing was mapped to the previous command + // mapping then it's easy... just bind it. + if ( %prevMap $= "" ) + { + //unbindExtraActions( %cmd, %actionMap, 1 ); + %actionMap.bind( %device, %action, %cmd ); + + OptionsMenu.syncGui(); + return; + } + + // If the previous command is the same as the + // current then they hit the same input as what + // was already assigned. + if ( %prevMap $= %cmd ) + { + //unbindExtraActions( %cmd, %actionMap, 0 ); + %actionMap.bind( %device, %action, %cmd ); + + OptionsMenu.syncGui(); + return; + } + + // Look for the index of the previous mapping. + %prevMapIndex = findRemapCmdIndex( %prevMap ); + + // If we get a negative index then the previous + // mapping was to an item that isn't included in + // the mapping list... so we cannot unmap it. + if ( %prevMapIndex == -1 ) + { + MessageBoxOK( "Remap Failed", "\"" @ %mapName @ "\" is already bound to a non-remappable command!" ); + return; + } + + // Setup the forced remapping callback command. + %callback = "redoMapping(" @ %device @ ", " @ %actionMap @ ", \"" @ %action @ "\", \"" @ + %cmd @ "\", " @ %prevMapIndex @ ", " @ %this.index @ ");"; + + // Warn that we're about to remove the old mapping and + // replace it with another. + %prevCmdName = $RemapName[%prevMapIndex]; + //Canvas.pushDialog( RemapConfirmDlg ); + + %remapWarnText = "\"" @ %mapName @ "\" is already bound to \"" @ %prevCmdName @ "\"! Do you wish to replace this mapping?"; + %doRemapCommand = "redoMapping(" @ %device @ ", " @ %actionMap @ ", \"" @ %action @ "\", \"" @ + %cmd @ "\", " @ %prevMapIndex @ ", " @ %this.index @ ");"; + %cancelCommand = ""; + + MessageBoxYesNo( "Key already in use", %remapWarnText, %doRemapCommand, %cancelCommand ); +} \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/images/backdrop.png b/Templates/BaseGame/game/data/UI/images/backdrop.png new file mode 100644 index 000000000..e645dfe0d Binary files /dev/null and b/Templates/BaseGame/game/data/UI/images/backdrop.png differ diff --git a/Templates/BaseGame/game/data/UI/images/backdrop_image.asset.taml b/Templates/BaseGame/game/data/UI/images/backdrop_image.asset.taml new file mode 100644 index 000000000..fb9f256dc --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/backdrop_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/images/textEditFrame_image.asset.taml b/Templates/BaseGame/game/data/UI/images/textEditFrame_image.asset.taml new file mode 100644 index 000000000..86a29b170 --- /dev/null +++ b/Templates/BaseGame/game/data/UI/images/textEditFrame_image.asset.taml @@ -0,0 +1,3 @@ + diff --git a/Templates/BaseGame/game/data/UI/scripts/controlsMenu.tscript b/Templates/BaseGame/game/data/UI/scripts/controlsMenu.tscript index 95df2cebf..ef2c85df0 100644 --- a/Templates/BaseGame/game/data/UI/scripts/controlsMenu.tscript +++ b/Templates/BaseGame/game/data/UI/scripts/controlsMenu.tscript @@ -205,21 +205,6 @@ function controlSetChanged() fillRemapList(); } -function doKeyRemap( %row ) -{ - %rowIndex = %row.remapIndex; - %name = $RemapName[%rowIndex]; - - RemapDlg-->OptRemapText.text = "Re-bind \"" @ %name @ "\" to..." ; - OptRemapInputCtrl.index = %rowIndex; - Canvas.pushDialog( RemapDlg ); - - //Let the options menu know - %actionMap = $RemapActionMap[%rowIndex]; - - OptionsMenu.onKeybindChanged(%actionMap, %name); -} - function ControlsMenuRebindButton::onClick(%this) { %name = $RemapName[%this.keybindIndex]; @@ -230,89 +215,6 @@ function ControlsMenuRebindButton::onClick(%this) Canvas.pushDialog( RemapDlg ); } -function OptRemapInputCtrl::onInputEvent( %this, %device, %action ) -{ - //error( "** onInputEvent called - device = " @ %device @ ", action = " @ %action @ " **" ); - Canvas.popDialog( RemapDlg ); - - // Test for the reserved keystrokes: - if ( %device $= "keyboard" ) - { - // Cancel... - if ( %action $= "escape" ) - { - // Do nothing... - return; - } - } - - %cmd = $RemapCmd[%this.index]; - %name = $RemapName[%this.index]; - %actionMap = $RemapActionMap[%this.index]; - - // Grab the friendly display name for this action - // which we'll use when prompting the user below. - %mapName = getMapDisplayName( %device, %action ); - - // Get the current command this action is mapped to. - %prevMap = %actionMap.getCommand( %device, %action ); - - //TODO: clear all existant keybinds to a command and then bind it so we only have a single one at all times - unbindExtraActions( %cmd, %actionMap, 0 ); - unbindExtraActions( %cmd, %actionMap, 1 ); - - // If nothing was mapped to the previous command - // mapping then it's easy... just bind it. - if ( %prevMap $= "" ) - { - //unbindExtraActions( %cmd, %actionMap, 1 ); - %actionMap.bind( %device, %action, %cmd ); - - fillRemapList(); - return; - } - - // If the previous command is the same as the - // current then they hit the same input as what - // was already assigned. - if ( %prevMap $= %cmd ) - { - //unbindExtraActions( %cmd, %actionMap, 0 ); - %actionMap.bind( %device, %action, %cmd ); - - fillRemapList(); - return; - } - - // Look for the index of the previous mapping. - %prevMapIndex = findRemapCmdIndex( %prevMap ); - - // If we get a negative index then the previous - // mapping was to an item that isn't included in - // the mapping list... so we cannot unmap it. - if ( %prevMapIndex == -1 ) - { - MessageBoxOK( "Remap Failed", "\"" @ %mapName @ "\" is already bound to a non-remappable command!" ); - return; - } - - // Setup the forced remapping callback command. - %callback = "redoMapping(" @ %device @ ", " @ %actionMap @ ", \"" @ %action @ "\", \"" @ - %cmd @ "\", " @ %prevMapIndex @ ", " @ %this.index @ ");"; - - // Warn that we're about to remove the old mapping and - // replace it with another. - %prevCmdName = $RemapName[%prevMapIndex]; - Canvas.pushDialog( RemapConfirmDlg ); - - %remapWarnText = "\"" @ %mapName @ "\" is already bound to \"" @ %prevCmdName @ "\"! Do you wish to replace this mapping?"; - %doRemapCommand = "redoMapping(" @ %device @ ", " @ %actionMap @ ", \"" @ %action @ "\", \"" @ - %cmd @ "\", " @ %prevMapIndex @ ", " @ %this.index @ "); Canvas.popDialog();"; - %cancelCommand = "Canvas.popDialog();"; - - MessageBoxYesNo( "Key already in use", %remapWarnText, %doRemapCommand, %cancelCommand ); -} - function findRemapCmdIndex( %command ) { for ( %i = 0; %i < $RemapCount; %i++ ) diff --git a/Templates/BaseGame/game/data/UI/scripts/guiTreeViewCtrl.tscript b/Templates/BaseGame/game/data/UI/scripts/guiTreeViewCtrl.tscript deleted file mode 100644 index bc952dbca..000000000 --- a/Templates/BaseGame/game/data/UI/scripts/guiTreeViewCtrl.tscript +++ /dev/null @@ -1,50 +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. -//----------------------------------------------------------------------------- - -function GuiTreeViewCtrl::onDefineIcons( %this ) -{ - %icons = "core/art/gui/images/treeview/default:" @ - "core/art/gui/images/treeview/simgroup:" @ - "core/art/gui/images/treeview/simgroup_closed:" @ - "core/art/gui/images/treeview/simgroup_selected:" @ - "core/art/gui/images/treeview/simgroup_selected_closed:" @ - "core/art/gui/images/treeview/hidden:" @ - "core/art/gui/images/treeview/shll_icon_passworded_hi:" @ - "core/art/gui/images/treeview/shll_icon_passworded:" @ - "core/art/gui/images/treeview/default"; - - %this.buildIconTable(%icons); -} - -function GuiTreeViewCtrl::handleRenameObject( %this, %name, %obj ) -{ - %inspector = GuiInspector::findByObject( %obj ); - - if( isObject( %inspector ) ) - { - %field = ( %this.renameInternal ) ? "internalName" : "name"; - %inspector.setObjectField( %field, %name ); - return true; - } - - return false; -} diff --git a/Templates/BaseGame/game/data/UI/scripts/help.tscript b/Templates/BaseGame/game/data/UI/scripts/help.tscript deleted file mode 100644 index a305671af..000000000 --- a/Templates/BaseGame/game/data/UI/scripts/help.tscript +++ /dev/null @@ -1,90 +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. -//----------------------------------------------------------------------------- - -function HelpDlg::onWake(%this) -{ - HelpFileList.entryCount = 0; - HelpFileList.clear(); - for(%file = findFirstFile("*.hfl"); %file !$= ""; %file = findNextFile("*.hfl")) - { - HelpFileList.fileName[HelpFileList.entryCount] = %file; - HelpFileList.addRow(HelpFileList.entryCount, fileBase(%file)); - HelpFileList.entryCount++; - } - HelpFileList.sortNumerical(0); - for(%i = 0; %i < HelpFileList.entryCount; %i++) - { - %rowId = HelpFileList.getRowId(%i); - %text = HelpFileList.getRowTextById(%rowId); - %text = %i + 1 @ ". " @ restWords(%text); - HelpFileList.setRowById(%rowId, %text); - } - HelpFileList.setSelectedRow(0); -} - -function HelpFileList::onSelect(%this, %row) -{ - %fo = new FileObject(); - %fo.openForRead(%this.fileName[%row]); - %text = ""; - while(!%fo.isEOF()) - %text = %text @ %fo.readLine() @ "\n"; - - %fo.delete(); - HelpText.setText(%text); -} - -function getHelp(%helpName) -{ - Canvas.pushDialog(HelpDlg); - if(%helpName !$= "") - { - %index = HelpFileList.findTextIndex(%helpName); - HelpFileList.setSelectedRow(%index); - } -} - -function contextHelp() -{ - for(%i = 0; %i < Canvas.getCount(); %i++) - { - if(Canvas.getObject(%i).getName() $= HelpDlg) - { - Canvas.popDialog(HelpDlg); - return; - } - } - %content = Canvas.getContent(); - %helpPage = %content.getHelpPage(); - getHelp(%helpPage); -} - -function GuiControl::getHelpPage(%this) -{ - return %this.helpPage; -} - -function GuiMLTextCtrl::onURL(%this, %url) -{ - gotoWebPage( %url ); -} - diff --git a/Templates/BaseGame/game/data/UI/scripts/menuInputHandling.tscript b/Templates/BaseGame/game/data/UI/scripts/menuInputHandling.tscript deleted file mode 100644 index 36f96568f..000000000 --- a/Templates/BaseGame/game/data/UI/scripts/menuInputHandling.tscript +++ /dev/null @@ -1,729 +0,0 @@ -//============================================================================== -// Menu Input Buttons -// This file manages the Menu Input Buttons stuff -// Any time you have a GUI button that should be clickable AND map to a key input -// such as a gamepad button, or enter, etc, this stuff can be used -//============================================================================== -/* -Gamepad input reference for 360 controller -btn_a = A -btn_b = B -btn_x = X -btn_y = Y -btn_r = Right Bumper -btn_l = Right Bumper -upov = Dpad Up -dpov = Dpad Down -lpov = Dpad Left -rpov = Dpad Right -xaxis = Left Stick | + values = up, - values = down -yaxis = Left Stick | + values = up, - values = down -rxaxis = Right Stick | + values = up, - values = down -ryaxis = Right Stick | + values = up, - values = down -zaxis = Left Trigger -rzaxis = Right Trigger -btn_start = Start -btn_back = Back/Select -*/ - -//============================================================================== -/// Summary: -/// This is used with the main UI menu lists, when a non-axis input event is called -/// such as pressing a button -/// It is called from the engine -/// -/// \param %device (string) The name of the device the input event is coming fromt -/// \param %action (string) The specific key/input action -/// \param %state (bool) The down/up state of the event sent -function UIMenuButtonList::onInputEvent(%this, %device, %action, %state) -{ - if(%state) - $activeMenuButtonContainer.processInputs(%device, %action); -} - -//============================================================================== -/// Summary: -/// This is used with the main UI menu lists, when an axis input event is called -/// such as moving a joystick -/// It is called from the engine -/// -/// \param %device (string) The name of the device the input event is coming fromt -/// \param %action (string) The specific key/input action -/// \param %axisVal (float) The float value of the axis event -function UIMenuButtonList::onAxisEvent(%this, %device, %action, %axisVal) -{ - //Skip out of the value is too low as it could just be noise or miscalibrated defaults - if(%axisVal < 0.02) - return; - - $activeMenuButtonContainer.processAxisEvent(%device, %action); -} - -//============================================================================== -/// Summary: -/// Sets the command and text for the specified button. If %text and %command -/// are left empty, the button will be disabled and hidden. -/// -/// \param %gamepadButton (string) The button to set for when using gamepad input. See the input map reference comment at the top of the file -/// \param %keyboardButton (string) The button to set for when using keyboard/mouse input. -/// \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 MenuInputButton::set(%this, %gamepadButton, %keyboardButton, %text, %command) -{ - %this.setHidden(false); - - %set = (! ((%text $= "") && (%command $= ""))); - - %this.gamepadButton = %gamepadButton; - %this.keyboardButton = %keyboardButton; - - if(%gamepadButton $= "") - %this.gamepadValid = false; - else - %this.gamepadValid = true; - - if(%keyboardButton $= "") - %this.kbmValid = false; - else - %this.kbmValid = true; - - if((!%this.kbmValid && $activeControllerType !$= "gamepad") || - (!%this.gamepadValid && $activeControllerType $= "gamepad")) - %set = false; - - %this.setText(%text); - %this.Command = %command; - - %this.refresh(); -} - -//============================================================================== -/// Summary: -/// Disables the MenuInputButton, marking it as not to consume inputs or display -function MenuInputButton::disable(%this) -{ - %this.setText(""); - %this.Command = ""; - %this.setActive(false); - %this.setVisible(false); -} - -//============================================================================== -/// Summary: -/// Refreshes the specific button, updating it's visbility status and the displayed input image -function MenuInputButton::refresh(%this) -{ - %set = (! ((%this.text $= "") && (%this.command $= ""))); - - //Do a check so if a MenuInput is selectively bound and we're not using the - //matched input type, then we skip - if((!%this.kbmValid && $activeControllerType !$= "gamepad") || - (!%this.gamepadValid && $activeControllerType $= "gamepad")) - %set = false; - - %this.setActive(%set); - %this.setVisible(%set); - - if(!%this.isActive()) - return; - - if($activeControllerType $= "gamepad") - { - if(%this.gamepadButton !$= "") - { - %assetId = ""; - if($activeControllerName $= "PS4 Controller") - { - %assetId = "UI:PS4_"; - - if(%this.gamepadButton $= "btn_a") - %assetId = %assetId @ "Cross"; - else if(%this.gamepadButton $= "btn_b") - %assetId = %assetId @ "Circle"; - else if(%this.gamepadButton $= "btn_x") - %assetId = %assetId @ "Square"; - else if(%this.gamepadButton $= "btn_y") - %assetId = %assetId @ "Triangle"; - else if(%this.gamepadButton $= "btn_l") - %assetId = %assetId @ "L1"; - else if(%this.gamepadButton $= "zaxis") - %assetId = %assetId @ "L2"; - else if(%this.gamepadButton $= "btn_r") - %assetId = %assetId @ "R1"; - else if(%this.gamepadButton $= "rzaxis") - %assetId = %assetId @ "R2"; - else if(%this.gamepadButton $= "btn_start") - %assetId = %assetId @ "Options"; - else if(%this.gamepadButton $= "btn_back") - %assetId = %assetId @ "Share"; - } - else if($activeControllerName $= "Nintendo Switch Pro Controller") - { - %assetId = "UI:Switch_"; - - if(%this.gamepadButton $= "btn_a") - %assetId = %assetId @ "B"; - else if(%this.gamepadButton $= "btn_b") - %assetId = %assetId @ "A"; - else if(%this.gamepadButton $= "btn_x") - %assetId = %assetId @ "Y"; - else if(%this.gamepadButton $= "btn_y") - %assetId = %assetId @ "X"; - else if(%this.gamepadButton $= "btn_l") - %assetId = %assetId @ "LB"; - else if(%this.gamepadButton $= "zaxis") - %assetId = %assetId @ "LT"; - else if(%this.gamepadButton $= "btn_r") - %assetId = %assetId @ "RB"; - else if(%this.gamepadButton $= "rzaxis") - %assetId = %assetId @ "RT"; - else if(%this.gamepadButton $= "btn_start") - %assetId = %assetId @ "Plus"; - else if(%this.gamepadButton $= "btn_back") - %assetId = %assetId @ "Minus"; - } - else if($activeControllerName !$= "") - { - %assetId = "UI:Xbox_"; - - if(%this.gamepadButton $= "btn_a") - %assetId = %assetId @ "A"; - else if(%this.gamepadButton $= "btn_b") - %assetId = %assetId @ "B"; - else if(%this.gamepadButton $= "btn_x") - %assetId = %assetId @ "X"; - else if(%this.gamepadButton $= "btn_y") - %assetId = %assetId @ "Y"; - else if(%this.gamepadButton $= "btn_l") - %assetId = %assetId @ "LB"; - else if(%this.gamepadButton $= "zaxis") - %assetId = %assetId @ "LT"; - else if(%this.gamepadButton $= "btn_r") - %assetId = %assetId @ "RB"; - else if(%this.gamepadButton $= "rzaxis") - %assetId = %assetId @ "RT"; - else if(%this.gamepadButton $= "btn_start") - %assetId = %assetId @ "Menu"; - else if(%this.gamepadButton $= "btn_back") - %assetId = %assetId @ "Windows"; - } - } - } - else - { - if(%this.keyboardButton !$= "") - { - %assetId = "UI:Keyboard_Black_" @ %this.keyboardButton; - } - } - - %this.setBitmap(%assetId @ "_image"); - - return true; -} - -//============================================================================== -/// Summary: -/// Refreshes a menu input container, updating the buttons inside it -function MenuInputButtonContainer::refresh(%this) -{ - %count = %this.getCount(); - for(%i=0; %i < %count; %i++) - { - %btn = %this.getObject(%i); - - %btn.refresh(); - } -} - -//============================================================================== -/// Summary: -/// Sets the given MenuInputButtonContainer as the active one. This directs input events -/// to it's buttons, ensures it's visible, and auto-hides the old active container if it was set -function MenuInputButtonContainer::setActive(%this) -{ - if(isObject($activeMenuButtonContainer)) - $activeMenuButtonContainer.hidden = true; - - $activeMenuButtonContainer = %this; - $activeMenuButtonContainer.hidden = false; - $activeMenuButtonContainer.refresh(); -} - -//============================================================================== -/// Summary: -/// Checks the input manager for if we have a gamepad active and gets it's name -/// If we have one, also sets the active input type to gamepad -function MenuInputButtonContainer::checkGamepad(%this) -{ - %controllerName = SDLInputManager::JoystickNameForIndex(0); - - $activeControllerName = %controllerName; - - if($activeControllerName $= "") - $activeControllerType = "K&M"; - else - $activeControllerType = "gamepad"; -} - - //============================================================================== -/// Summary: -/// This is called by the earlier inputs callback that comes from the menu list -/// this allows us to first check what the input type is, and if the device is different -/// (such as going from keyboard and mouse to gamepad) we can refresh the buttons to update -/// the display -/// Then we process the input to see if it matches to any of the button maps for our -/// MenuInputButtons. If we have a match, we execute it's command. -/// -/// \param %device (string) The device that is causing the input event -/// \param %action (string) The name of the input action -function MenuInputButtonContainer::processInputs(%this, %device, %action) -{ - //check to see if our status has changed - %changed = false; - - %oldDevice = $activeControllerName; - - %deviceName = stripTrailingNumber(%device); - - if(%deviceName $= "keyboard" || %deviceName $= "mouse") - { - if($activeControllerName !$= "K&M") - %changed = true; - - $activeControllerName = "K&M"; - $activeControllerType = "K&M"; - Canvas.showCursor(); - } - else - { - if(%this.checkGamepad()) - { - Canvas.hideCursor(); - } - - if($activeControllerType !$= %oldDevice) - %changed = true; - } - - if(%changed) - %this.refresh(); - - //Now process the input for the button accelerator, if applicable - //Set up our basic buttons - for(%i=0; %i < %this.getCount(); %i++) - { - %btn = %this.getObject(%i); - - if(!%btn.isActive()) - continue; - - if($activeControllerType !$= "K&M") - { - if(%btn.gamepadButton $= %action) - { - eval(%btn.command); - } - } - else - { - if(%btn.keyboardButton $= %action) - { - eval(%btn.command); - } - } - } -} - -//============================================================================== -/// Summary: -/// This is called by the earlier inputs callback that comes from the menu list -/// this allows us to first check what the input type is, and if the device is different -/// (such as going from keyboard and mouse to gamepad) we can refresh the buttons to update -/// the display -/// -/// \param %device (string) The name of the device the input event is coming fromt -/// \param %action (string) The specific key/input action -/// \param %axisVal (float) The float value of the axis event -function MenuInputButtonContainer::processAxisEvent(%this, %device, %action, %axisVal) -{ - //check to see if our status has changed - %changed = false; - - %oldDevice = $activeControllerName; - - %deviceName = stripTrailingNumber(%device); - - if(%deviceName $= "mouse") - { - if($activeControllerName !$= "K&M") - %changed = true; - - $activeControllerName = "K&M"; - $activeControllerType = "K&M"; - Canvas.showCursor(); - } - else - { - if(%this.checkGamepad()) - { - Canvas.hideCursor(); - } - - if($activeControllerType !$= %oldDevice) - %changed = true; - } - - if(%changed) - %this.refresh(); -} - -// -// -function onSDLDeviceConnected(%sdlIndex, %deviceName, %deviceType) -{ - /*if(GamepadButtonsGui.checkGamepad()) - { - GamepadButtonsGui.hidden = false; - }*/ -} - -function onSDLDeviceDisconnected(%sdlIndex) -{ - /*if(!GamepadButtonsGui.checkGamepad()) - { - GamepadButtonsGui.hidden = true; - }*/ -} - -//============================================================================== -// Menu Input processing -// These functions manage the Menu input processing in general -// Whenever a MenuInputHandler consumes an input event, it'll process them here -// This'll let the active menu list be navigated, as well as buttons be processed -// and ultimately handled by the Input Buttons above -//============================================================================== -//============================================================================== -/// Summary: -/// This is used with the main UI menu lists, when an axis input event is called -/// such as moving a joystick -/// It is called from the engine -/// -/// \param %device (string) The name of the device the input event is coming fromt -/// \param %action (string) The specific key/input action -/// \param %axisVal (float) The float value of the axis event -function MenuInputHandler::onAxisEvent(%this, %device, %action, %value) -{ - //this is to force a refresh of the menu - if(%value == 1 || %value == -1) - $activeMenuButtonContainer.processInputs(%device, %action); - - if(startsWith(%device, "mouse")) - return; - - if((%action $= "upov" && %value > 0) || (%action $= "yaxis" && %value == -1)) - { - $activeMenuList.navigateUp(); - } - - if((%action $= "dpov" && %value > 0) || (%action $= "yaxis" && %value == 1)) - { - $activeMenuList.navigateDown(); - } - - //How we deal with the left and right navigation is dependant on the mode of the - //menu list - if($activeMenuListMode $= "Settings") - { - if((%action $= "lpov" && %value > 0) || (%action $= "xaxis" && %value == -1)) - { - echo("Options menu nudged left!"); - //$activeMenuList.navigateLeft(); - } - - if((%action $= "rpov" && %value > 0) || (%action $= "xaxis" && %value == -1)) - { - echo("Options menu nudged right!"); - //$activeMenuList.navigateRight(); - } - } - else - { - if((%action $= "lpov" && %value > 0) || (%action $= "xaxis" && %value == -1)) - { - $activeMenuList.navigateLeft(); - } - - if((%action $= "rpov" && %value > 0) || (%action $= "xaxis" && %value == -1)) - { - $activeMenuList.navigateRight(); - } - } -} - -//============================================================================== -/// Summary: -/// This is used with the main UI menu lists, when a non-axis input event is called -/// such as pressing a button -/// It is called from the engine -/// -/// \param %device (string) The name of the device the input event is coming fromt -/// \param %action (string) The specific key/input action -/// \param %state (bool) The down/up state of the event sent -function MenuInputHandler::onInputEvent(%this, %device, %action, %state) -{ - if(%action $= "upov" || %action $= "dpov" || %action $= "lpov" || %action $= "rpov") - { - %this.onAxisEvent(%device, %action, %state); - return; - } - - if(%state) - $activeMenuButtonContainer.processInputs(%device, %action); -} - -//============================================================================== -// Menu List processing -// These functions manage the navigation and activation of the Menu Lists -//============================================================================== -//============================================================================== -/// Summary: -/// Is the GUIContainer with this MenuList namespace the 'active' menulist as far -/// as UI interfaces is concerned? -function MenuList::isActiveMenuList(%this) -{ - if($activeMenuList == %this) - return true; - - return false; -} - -//============================================================================== -/// Summary: -/// Sets the GUIContainer with this MenuList namespace as the active menulist. -/// This means that any input events caught in MenuInputHandlers is directed at -/// this menu list to navigate it -/// -/// \param %startPosition (Point2F) The X and Y starting positions of the selection for this menuList -/// \param %menuMode (string) Indicates the mode/type of menuList, allowing for special behaviors depending on type -function MenuList::setAsActiveMenuList(%this, %startPosition, %menuMode) -{ - if(%startPosition $= "") - %startPosition = "0 0"; - - if(%menuMode $= "") - %menuMode = "Menu"; - - $activeMenuList = %this; - $activeMenuList.hidden = false; - $activeMenuList.ListPosition = %startPosition; - $activeMenuListMode = %menuMode; - - %this.refresh(); -} - -//============================================================================== -/// Summary: -/// Activates the currently highlighted child object -function MenuList::activate(%this) -{ - //check for a highlighted element - if($activeMenuList.ListPosition.y > -1 && $activeMenuList.ListPosition < $activeMenuList.getCount()) - { - %btn = $activeMenuList.getObject($activeMenuList.ListPosition.y); - %btn.performClick(); - } -} - -//============================================================================== -/// Summary: -/// refreshes the menuList, updating children highlight status and if there is -/// a button pointer control defined on our list, we update it's position as -/// needed -function MenuList::refresh(%this) -{ - %selectedObject = -1; - for(%i=0; %i < $activeMenuList.getCount(); %i++) - { - %btn = $activeMenuList.getObject(%i); - - %isSelected = %i == $activeMenuList.ListPosition.y; - - %btn.setHighlighted(%isSelected); - - if(%isSelected) - %selectedObject = %i; - } - - if(isObject(%this.buttonPointerCtrl)) - { - if(%selectedObject != -1) - { - %this.buttonPointerCtrl.setHidden(false); - - %buttonCenter = $activeMenuList.getObject(%selectedObject).getGlobalCenter(); - - if(%this.centerButtonPointerCtrl) - { - %this.buttonPointerCtrl.setCenter(%buttonCenter.x, %buttonCenter.y); - } - else - { - //if we're not centering, then left-justify - %this.buttonPointerCtrl.setCenter(%buttonCenter.x - $activeMenuList.getObject(%selectedObject).extent.x / 2, %buttonCenter.y); - } - } - else - { - %this.buttonPointerCtrl.setHidden(true); - } - } - - if($activeMenuList.isMethod("onNavigate")) - $activeMenuList.onNavigate($activeMenuList.ListPosition.y); - - %parent = $activeMenuList.getParent(); - if(%parent.getClassName() $= "GuiScrollCtrl") - { - %parent.scrollToObject(%selectedObject); - } -} - -//============================================================================== -/// Summary: -/// Selects the next 'up' child item in the menuList. If the current is the topmost -/// then nothing happens -function MenuList::navigateUp(%this) -{ - $activeMenuList.ListPosition.y -= 1; - if($activeMenuList.ListPosition.y < 0) - $activeMenuList.ListPosition.y = 0; - - %this.refresh(); -} - -//============================================================================== -/// Summary: -/// Selects the next 'down' child item in the menuList. If the current is the bottommost -/// then nothing happens -function MenuList::navigateDown(%this) -{ - $activeMenuList.ListPosition.y += 1; - if($activeMenuList.ListPosition.y >= $activeMenuList.getCount()) - $activeMenuList.ListPosition.y = $activeMenuList.getCount()-1; - - %this.refresh(); -} - -//============================================================================== -/// Summary: -/// Selects the next 'left' child item in the menuList. If the current item is the leftmost -/// then nothing happens -function MenuList::navigateLeft() -{ - //Atm, we're only handling specific control types, namely options entries, but - //this could readily be expanded upon to handle grids like for inventory screens - //or the like - - %btn = $activeMenuList.getObject($activeMenuList.ListPosition.y); - if(%btn.getClassName() $= "GuiGameSettingsCtrl" && %btn.isEnabled()) - { - %mode = %btn.getMode(); - if(%mode == 0) //options list - { - %optionId = %btn.getCurrentOptionIndex() - 1; - %btn.selectOptionByIndex(%optionId); - %btn.onChange(); - } - else if(%mode == 1) //slider - { - %value = %btn.getValue(); - %adjustedValue = %value - %btn.getIncrement(); - %minValue = %btn.getRange().x; - if(%adjustedValue < %minValue) - %adjustedValue = %minValue; - - %btn.setValue(%adjustedValue); - %btn.onChange(); - } - } -} - -//============================================================================== -/// Summary: -/// Selects the next 'right' child item in the menuList. If the current item is the rightmost -/// then nothing happens -function MenuList::navigateRight() -{ - %btn = $activeMenuList.getObject($activeMenuList.ListPosition.y); - if(%btn.getClassName() $= "GuiGameSettingsCtrl" && %btn.isEnabled()) - { - %mode = %btn.getMode(); - if(%mode == 0) //options list - { - %optionId = %btn.getCurrentOptionIndex() + 1; - %btn.selectOptionByIndex(%optionId); - %btn.onChange(); - } - else if(%mode == 1) //slider - { - %value = %btn.getValue(); - %adjustedValue = %value + %btn.getIncrement(); - %maxValue = %btn.getRange().y; - if(%adjustedValue > %maxValue) - %adjustedValue = %maxValue; - - %btn.setValue(%adjustedValue); - %btn.onChange(); - } - } -} - -//============================================================================== -/// Summary: -/// Gets the current vertical positionally selected child object -function MenuList::getActiveRow(%this) -{ - return $activeMenuList.ListPosition.y; -} - -//============================================================================== -/// Summary: -/// Called from the engine when a GUIButtonBase-derived class with MenuListButton namespace class -/// has its highlighting status changed. Allows us to react to this change of state and trigger refreshse -/// or other events to keep the navigation tracking up to date -/// -/// \param %state (bool) The on/off state of the button being highlighted -function MenuListButton::onHighlighted(%this, %state) -{ - echo("MenuListButton::onHighlighted() - " @ %this.internalName @ " was " @ %state @ " highlighted"); - %parentContainer = %this.getParent(); - if(%parentContainer.class $= "MenuList" || %parentContainer.superClass $= "MenuList") - { - if(isObject(%parentContainer.buttonPointerCtrl)) - { - if(%state) - { - %parentContainer.buttonPointerCtrl.setHidden(false); - - %buttonCenter = %this.getGlobalCenter(); - echo(" - button center:" @ %buttonCenter); - - if(%parentContainer.centerButtonPointerCtrl) - { - %parentContainer.buttonPointerCtrl.setGlobalCenter(%buttonCenter.x, %buttonCenter.y); - } - else - { - //if we're not centering, then left-justify - %parentContainer.buttonPointerCtrl.setGlobalCenter(%buttonCenter.x - %this.extent.x / 2, %buttonCenter.y); - } - echo(" - pointer position:" @ %parentContainer.buttonPointerCtrl.getPosition()); - } - /*else - { - %parentContainer.buttonPointerCtrl.setHidden(true); - }*/ - } - } -} \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/scripts/menuNavigation.tscript b/Templates/BaseGame/game/data/UI/scripts/menuNavigation.tscript deleted file mode 100644 index 20ff05ff7..000000000 --- a/Templates/BaseGame/game/data/UI/scripts/menuNavigation.tscript +++ /dev/null @@ -1,308 +0,0 @@ -//============================================================================== -/// Summary: -/// This function sets the root page for the navigation stack. The root page is 'below' -/// all other normal pages and cannot be popped like a normal page. -/// When we set a new root page, we first check if we have an existing root page. -/// If we do, we run the usual canClose() then onClose() function pair, then we -/// set it and call the onOpen() for the new root page. -/// -/// \param %rootPage (guiControl) The new guiControl that is being set as the root page of the navigation stack -function UINavigation::setRootPage(%this, %rootPage) -{ - if(!isObject(%this.pageStack)) - { - %this.pageStack = new ArrayObject(); - } - - if(%this.rootPage $= %rootPage) - return; - - if(isObject(%this.rootPage)) - { - %canClose = true; - if(%this.rootPage.isMethod("canClose")) - %canClose = %this.rootPage.call("canClose"); - - if(!%canClose) - return; //if we're not allowed to close, just bail out wholesale because clearly - //something is blocking changes to pages - - %this.remove(%this.rootPage); - if(%this.rootPage.isMethod("onClose")) - %this.rootPage.call("onClose"); - - %this.rootPage.navigation = ""; - } - - %this.rootPage = %rootPage; - - %this.add(%rootPage); - if(%this.resizePages) - { - %rootPage.resize(%this.position.x, %this.position.y, - %this.extent.x, %this.extent.y); - } - %rootPage.navigation = %this; - - if(%rootPage.isMethod("onOpen")) - %rootPage.call("onOpen"); -} - -//============================================================================== -/// Summary: -/// This function pushes a page onto the given UINavigation-classed GUIContainer's stack -/// The order of operations is thus: -/// 1) check to see if the new page being pushed says it can open via the canOpen() function. -/// If this method is not defined, it defaults to true, as there's no impediment to continuing -/// If this check returns false, the pushPage event cancels. -/// 2) check to see if the current page on the stack says it can close. Similar to -/// the canOpen() check on the new page, we default to true -/// If this check returns false, the pushPage event cancels. -/// 3) Call - if defined - onClose() on the current top page of the stack -/// 4) Add the new page onto the stack -/// 5) Call - if defined - onOpen() on the new page -/// 6) Finally, if we defined a callback, call that. -/// With this all run, the previous top page has done any cleanup work it needed to -/// and the new top page has been opened successfully. -/// -/// \param %newPage (guiControl) The new guiControl that is being added onto the page stack -/// \param %callback[optional]: (Evaluable string) A evalable statement to invoke when the push has been completed -function UINavigation::pushPage(%this, %newPage, %callback) -{ - if(!isObject(%this.pageStack)) - { - %this.pageStack = new ArrayObject(); - } - - //don't re-add pages - if(%this.getPageCount() != 0 && - %this.pageStack.getIndexFromKey(%newPage) != -1) - return; - - %canChange = true; - if(%newPage.isMethod("canOpen")) - %canChange = %newPage.call("canOpen"); - - if(!%canChange) - return; - - %currentPage = %this.getCurrentPage(); - if(isObject(%currentPage)) - { - if(%currentPage.isMethod("canClose")) - %canChange = %currentPage.call("canClose"); - - if(!%canChange) - return; - - if(%currentPage.isMethod("onClose")) - %currentPage.call("onClose"); - } - - %this.pageStack.push_back(%newPage); - %this.add(%newPage); - if(%this.resizePages) - { - %newPage.resize(%this.position.x, %this.position.y, - %this.extent.x, %this.extent.y); - } - - if(%newPage.isMethod("onOpen")) - %newPage.call("onOpen"); - - %newPage.navigation = %this; - - if(%callback !$= "") - eval(%callback); -} - -//============================================================================== -/// Summary: -/// This function pops the topmost page off the given UINavigation-classed GUIContainer's stack -/// The order of operations is thus: -/// 1) check to see if the top page being popped says it can close via the canClose() function. -/// If this method is not defined, it defaults to true, as there's no impediment to continuing -/// If this check returns false, the popPage event cancels. -/// 2) check to see if the previous page on the stack says it can open. Similar to -/// the canClose() check on the new page, we default to true -/// If this check returns false, the popPage event cancels. -/// 3) Call - if defined - onClose() on the current top page of the stack -/// 4) Remove the top page -/// 5) Call - if defined - onOpen() on the now topmost page -/// 6) Finally, if we defined a callback, call that. -/// With this all run, the previous top page has done any cleanup work it needed to -/// and the new top page has been opened successfully. -/// -/// \param %callback[optional] (Evaluable string) A evalable statement to invoke when the pop has been completed -function UINavigation::popPage(%this, %callback) -{ - if(%this.pageStack.count() == 0) - return; - - %currentPage = %this.getCurrentPage(); - if(isObject(%currentPage)) - { - %canChange = true; - if(%currentPage.isMethod("canClose")) - %canChange = %currentPage.call("canClose"); - - if(!%canChange) - return; - } - - %prevPage = %this.getPreviousPage(); - if(isObject(%prevPage)) - { - %canChange = true; - if(%prevPage.isMethod("canOpen")) - %canChange = %prevPage.call("canOpen"); - - if(!%canChange) - return; - } - - if(isObject(%currentPage)) - { - if(%currentPage.isMethod("onClose")) - { - %currentPage.call("onClose"); - } - - %this.pageStack.pop_back(); - %this.remove(%currentPage); - - %currentPage.navigation = ""; - } - - %newTopPage = %this.getCurrentPage(); - if(isObject(%newTopPage)) - { - if(%newTopPage.isMethod("onOpen")) - %newTopPage.call("onOpen"); - } - - if(%callback !$= "") - eval(%callback); -} - -//============================================================================== -/// Summary: -/// In order tops the topmost page in a loop until it has closed the entire stack, -/// leaving only the root page -/// -/// \param %callback[optional] (Evaluable String) A evalable statement to invoke when the pop has been completed -function UINavigation::popToRoot(%this, %callback) -{ - %pageChanged = false; - while(%this.getPageCount() != 0) - { - %currentPage = %this.getCurrentPage(); - if(isObject(%currentPage)) - { - if(%currentPage.isMethod("canClose")) - %canChange = %currentPage.call("canClose"); - - if(!%canChange) - return; - } - - %prevPage = %this.getPreviousPage(); - if(isObject(%prevPage)) - { - if(%prevPage.isMethod("canOpen")) - %canChange = %prevPage.call("canOpen"); - - if(!%canChange) - return; - } - - if(isObject(%currentPage)) - { - if(%currentPage.isMethod("onClose")) - { - %currentPage.call("onClose"); - } - - %this.pageStack.pop_back(); - %this.remove(%currentPage); - - %currentPage.navigation = ""; - } - - %newTopPage = %this.getCurrentPage(); - if(%newTopPage.isMethod("onOpen")) - %newTopPage.call("onOpen"); - - %pageChanged = true; - } - - if(%pageChanged && %callback !$= "") - eval(%callback); -} - -//============================================================================== -/// Summary: -/// Gets the current, topmost page on the stack. If no non-root pages are on the stack -/// the root page is returned -function UINavigation::getCurrentPage(%this) -{ - if(isObject(%this.pageStack) && %this.pageStack.count() != 0) - { - return %this.pageStack.getKey(%this.pageStack.count()-1); - } - else - { - if(isObject(%this.rootPage)) - return %this.rootPage; - } - - return 0; -} - -//============================================================================== -/// Summary: -/// Gets the page just under the topmost page in the stack. If there is no previous page -/// then the root page is returned -function UINavigation::getPreviousPage(%this) -{ - if(isObject(%this.pageStack) && %this.pageStack.count() > 1) - { - return %this.pageStack.getKey(%this.pageStack.count()-2); - } - else - { - if(isObject(%this.rootPage)) - return %this.rootPage; - } - - return 0; -} - -//============================================================================== -/// Summary: -/// Gets the number of pages on the stack. -function UINavigation::getPageCount(%this) -{ - %count = 0; - if(isObject(%this.pageStack)) - %count = %this.pageStack.count(); - - if(isObject(%this.rootPage)) - %count++; - - return %count; -} - -//============================================================================== -/// Summary: -/// Force the page to reprocess to ensure it's status is up to date -function UINavigation::refreshPage(%this) -{ - %page = %this.getCurrentPage(); - if(!isObject(%page)) - return; - - if(%page.isMethod("onOpen")) - %page.call("onOpen"); -} - diff --git a/Templates/BaseGame/game/data/UI/scripts/messageBoxes.tscript b/Templates/BaseGame/game/data/UI/scripts/messageBoxes.tscript deleted file mode 100644 index f1c3db40e..000000000 --- a/Templates/BaseGame/game/data/UI/scripts/messageBoxes.tscript +++ /dev/null @@ -1,341 +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. -//----------------------------------------------------------------------------- - -// -------------------------------------------------------------------- -// Message Sound -// -------------------------------------------------------------------- -/*new SFXDescription(MessageBoxAudioDescription) -{ - volume = 1.0; - isLooping = false; - is3D = false; - channel = $GuiAudioType; -}; - -new SFXProfile(messageBoxBeep) -{ - filename = "./messageBoxSound"; - description = MessageBoxAudioDescription; - preload = true; -};*/ - -//--------------------------------------------------------------------------------------------- -// messageCallback -// Calls a callback passed to a message box. -//--------------------------------------------------------------------------------------------- -function messageCallback(%dlg, %callback) -{ - Canvas.popDialog(%dlg); - eval(%callback); -} - -//--------------------------------------------------------------------------------------------- -// MBSetText -// Sets the text of a message box and resizes it to accomodate the new string. -//--------------------------------------------------------------------------------------------- -function MBSetText(%text, %frame, %msg) -{ - // Get the extent of the text box. - %ext = %text.getExtent(); - // Set the text in the center of the text box. - %text.setText("" @ %msg); - // Force the textbox to resize itself vertically. - %text.forceReflow(); - // Grab the new extent of the text box. - %newExtent = %text.getExtent(); - - // Get the vertical change in extent. - %deltaY = getWord(%newExtent, 1) - getWord(%ext, 1); - - // Resize the window housing the text box. - %windowPos = %frame.getPosition(); - %windowExt = %frame.getExtent(); - %frame.resize(getWord(%windowPos, 0), getWord(%windowPos, 1) - (%deltaY / 2), - getWord(%windowExt, 0), getWord(%windowExt, 1) + %deltaY); - - %frame.canMove = "0"; - //%frame.canClose = "0"; - %frame.resizeWidth = "0"; - %frame.resizeHeight = "0"; - %frame.canMinimize = "0"; - %frame.canMaximize = "0"; - - //sfxPlayOnce( messageBoxBeep ); -} - -function MessageBoxCtrl::onWake(%this) -{ -} - -//--------------------------------------------------------------------------------------------- -// Various message box display functions. Each one takes a window title, a message, and a -// callback for each button. -//--------------------------------------------------------------------------------------------- - -//MessageBoxOK("Test", "This is a test message box", "echo(\"Uhhhhhawhat?\""); -function MessageBoxOK(%title, %message, %callback) -{ - Canvas.pushDialog(MessageBoxDlg); - MessageBoxTitleText.text = %title; - - MessageBoxOCButtonHolder.hidden = true; - MessageBoxYNCButtonHolder.hidden = true; - MessageBoxOKButtonHolder.hidden = false; - - MessageBoxOKButtonHolder-->OKButton.set("btn_a", "Return", "OK", "MessageCallback(MessageBoxDlg,MessageBoxDlg.callback);"); - - MessageBoxCtrl.originalMenuInputContainer = $activeMenuButtonContainer; - MessageBoxOKButtonHolder.setActive(); - - MBSetText(MessageBoxText, MessageBoxCtrl, %message); - MessageBoxDlg.callback = %callback; -} - -function MessageBoxOKDlg::onSleep( %this ) -{ - %this.callback = ""; - MessageBoxCtrl.originalMenuInputContainer.setActive(); -} - -function MessageBoxOKCancel(%title, %message, %callback, %cancelCallback, %okLabelOverride, %cancelLabelOverride) -{ - Canvas.pushDialog(MessageBoxDlg); - MessageBoxTitleText.text = %title; - - MessageBoxOCButtonHolder.hidden = false; - MessageBoxYNCButtonHolder.hidden = true; - MessageBoxOKButtonHolder.hidden = true; - - if(%okLabelOverride $= "") - %okLabel = "OK"; - else - %okLabel = %okLabelOverride; - - if(%cancelLabelOverride $= "") - %cancelLabel = "Cancel"; - else - %cancelLabel = %cancelLabelOverride; - - MessageBoxOCButtonHolder-->OKButton.set("btn_a", "Return", %okLabel, "MessageCallback(MessageBoxDlg,MessageBoxDlg.callback);"); - MessageBoxOCButtonHolder-->CancelButton.set("btn_b", "Escape", %cancelLabel, "MessageCallback(MessageBoxDlg,MessageBoxDlg.cancelCallback);"); - - MessageBoxCtrl.originalMenuInputContainer = $activeMenuButtonContainer; - MessageBoxOCButtonHolder.setActive(); - - MBSetText(MessageBoxText, MessageBoxCtrl, %message); - MessageBoxDlg.callback = %callback; - MessageBoxDlg.cancelCallback = %cancelCallback; -} - -function MessageBoxOKCancelDlg::onSleep( %this ) -{ - %this.callback = ""; - MessageBoxCtrl.originalMenuInputContainer.setActive(); -} - -function MessageBoxOKCancelDetails(%title, %message, %details, %callback, %cancelCallback) -{ - if(%details $= "") - { - MBOKCancelDetailsButton.setVisible(false); - } - - MBOKCancelDetailsScroll.setVisible(false); - - MBOKCancelDetailsFrame.setText( %title ); - - Canvas.pushDialog(MessageBoxOKCancelDetailsDlg); - MBSetText(MBOKCancelDetailsText, MBOKCancelDetailsFrame, %message); - MBOKCancelDetailsInfoText.setText(%details); - - %textExtent = MBOKCancelDetailsText.getExtent(); - %textExtentY = getWord(%textExtent, 1); - %textPos = MBOKCancelDetailsText.getPosition(); - %textPosY = getWord(%textPos, 1); - - %extentY = %textPosY + %textExtentY + 65; - - MBOKCancelDetailsInfoText.setExtent(285, 128); - - MBOKCancelDetailsFrame.setExtent(300, %extentY); - - MessageBoxOKCancelDetailsDlg.callback = %callback; - MessageBoxOKCancelDetailsDlg.cancelCallback = %cancelCallback; - - MBOKCancelDetailsFrame.defaultExtent = MBOKCancelDetailsFrame.getExtent(); -} - -function MBOKCancelDetailsToggleInfoFrame() -{ - if(!MBOKCancelDetailsScroll.isVisible()) - { - MBOKCancelDetailsScroll.setVisible(true); - MBOKCancelDetailsText.forceReflow(); - %textExtent = MBOKCancelDetailsText.getExtent(); - %textExtentY = getWord(%textExtent, 1); - %textPos = MBOKCancelDetailsText.getPosition(); - %textPosY = getWord(%textPos, 1); - - %verticalStretch = %textExtentY; - - if((%verticalStretch > 260) || (%verticalStretch < 0)) - %verticalStretch = 260; - - %extent = MBOKCancelDetailsFrame.defaultExtent; - %height = getWord(%extent, 1); - - %posY = %textPosY + %textExtentY + 10; - %posX = getWord(MBOKCancelDetailsScroll.getPosition(), 0); - MBOKCancelDetailsScroll.setPosition(%posX, %posY); - MBOKCancelDetailsScroll.setExtent(getWord(MBOKCancelDetailsScroll.getExtent(), 0), %verticalStretch); - MBOKCancelDetailsFrame.setExtent(300, %height + %verticalStretch + 10); - } else - { - %extent = MBOKCancelDetailsFrame.defaultExtent; - %width = getWord(%extent, 0); - %height = getWord(%extent, 1); - MBOKCancelDetailsFrame.setExtent(%width, %height); - MBOKCancelDetailsScroll.setVisible(false); - } -} - -function MessageBoxOKCancelDetailsDlg::onSleep( %this ) -{ - %this.callback = ""; - MessageBoxCtrl.originalMenuInputContainer.setActive(); -} - -function MessageBoxYesNo(%title, %message, %yesCallback, %noCallback) -{ - Canvas.pushDialog(MessageBoxDlg); - MessageBoxTitleText.text = %title; - - MessageBoxOCButtonHolder.hidden = false; - MessageBoxYNCButtonHolder.hidden = true; - MessageBoxOKButtonHolder.hidden = true; - - MessageBoxOCButtonHolder-->OKButton.set("btn_a", "Return", "Yes", "MessageCallback(MessageBoxDlg,MessageBoxDlg.yesCallBack);"); - MessageBoxOCButtonHolder-->CancelButton.set("btn_b", "Escape", "No", "MessageCallback(MessageBoxDlg,MessageBoxDlg.noCallback);"); - - MessageBoxCtrl.originalMenuInputContainer = $activeMenuButtonContainer; - MessageBoxOCButtonHolder.setActive(); - - MBSetText(MessageBoxText, MessageBoxCtrl, %message); - MessageBoxDlg.yesCallBack = %yesCallback; - MessageBoxDlg.noCallback = %noCallback; -} - -function MessageBoxYesNoCancel(%title, %message, %yesCallback, %noCallback, %cancelCallback) -{ - Canvas.pushDialog(MessageBoxDlg); - MessageBoxTitleText.text = %title; - - MessageBoxOCButtonHolder.hidden = true; - MessageBoxYNCButtonHolder.hidden = false; - MessageBoxOKButtonHolder.hidden = true; - - MessageBoxYNCButtonHolder-->yesButton.set("btn_a", "Return", "Yes", "MessageCallback(MessageBoxDlg,MessageBoxDlg.yesCallBack);"); - MessageBoxYNCButtonHolder-->noButton.set("btn_x", "backspace", "No", "MessageCallback(MessageBoxDlg,MessageBoxDlg.noCallback);"); - MessageBoxYNCButtonHolder-->cancelButton.set("btn_b", "Escape", "No", "MessageCallback(MessageBoxDlg,MessageBoxDlg.cancelCallback);"); - - MessageBoxCtrl.originalMenuInputContainer = $activeMenuButtonContainer; - MessageBoxYNCButtonHolder.setActive(); - - MBSetText(MessageBoxText, MessageBoxCtrl, %message); - MessageBoxDlg.yesCallBack = %yesCallback; - MessageBoxDlg.noCallback = %noCallback; - MessageBoxDlg.cancelCallback = %cancelCallback; -} - -function MessageBoxDlg::onSleep( %this ) -{ - %this.callback = ""; - %this.cancelCallback = ""; - %this.yesCallback = ""; - %this.noCallback = ""; - %this.cancelCallback = ""; - MessageBoxCtrl.originalMenuInputContainer.setActive(); -} - -//--------------------------------------------------------------------------------------------- -// MessagePopup -// Displays a message box with no buttons. Disappears after %delay milliseconds. -//--------------------------------------------------------------------------------------------- -function MessagePopup(%title, %message, %delay) -{ - Canvas.pushDialog(MessageBoxDlg); - MessageBoxTitleText.text = %title; - MBSetText(MessageBoxText, MessageBoxCtrl, %message); - - if (%delay !$= "") - schedule(%delay, 0, CloseMessagePopup); -} - -function CloseMessagePopup() -{ - Canvas.popDialog(MessageBoxDlg); -} - -//--------------------------------------------------------------------------------------------- -// IODropdown -// By passing in a simgroup or simset, the user will be able to choose a child of that group -// through a guiPopupMenuCtrl -//--------------------------------------------------------------------------------------------- - -function IODropdown(%title, %message, %simgroup, %callback, %cancelCallback) -{ - IODropdownFrame.text = %title; - Canvas.pushDialog(IODropdownDlg); - MBSetText(IODropdownText, IODropdownFrame, %message); - - if(isObject(%simgroup)) - { - for(%i = 0; %i < %simgroup.getCount(); %i++) - IODropdownMenu.add(%simgroup.getObject(%i).getName()); - - } - - IODropdownMenu.sort(); - IODropdownMenu.setFirstSelected(0); - - IODropdownDlg.callback = %callback; - IODropdownDlg.cancelCallback = %cancelCallback; -} - -function IODropdownDlg::onSleep( %this ) -{ - %this.callback = ""; - %this.cancelCallback = ""; - IODropdownMenu.clear(); -} - -//The # in the function passed replaced with the output -//of the preset menu. -function IOCallback(%dlg, %callback) -{ - %id = IODropdownMenu.getSelected(); - %text = IODropdownMenu.getTextById(%id); - %callback = strreplace(%callback, "#", %text); - eval(%callback); - - Canvas.popDialog(%dlg); -} diff --git a/Templates/BaseGame/game/data/UI/scripts/profiles.tscript b/Templates/BaseGame/game/data/UI/scripts/profiles.tscript index 16d2caa45..c6c34cb9c 100644 --- a/Templates/BaseGame/game/data/UI/scripts/profiles.tscript +++ b/Templates/BaseGame/game/data/UI/scripts/profiles.tscript @@ -1,74 +1,94 @@ $TextMediumEmphasisColor = "200 200 200"; +$TextMediumEmphasisColorHL = "0 0 0"; $TextHighEmphasisColor = "224 224 224"; +$TextHighEmphasisColorHL = "0 0 0"; $TextDisabledColor = "108 108 108"; -new GuiGameListMenuProfile(DefaultListMenuProfile) +// --------------------------------------------------------------------------- +// Defaults +// --------------------------------------------------------------------------- +singleton GuiControlProfile( GuiMenuDefaultProfile ) +{ + opaque = false; + fillColor = "0 0 0 0"; + category = "BaseUI"; +}; + +singleton GuiControlProfile( GuiModelessDialogProfile : GuiMenuDefaultProfile ) +{ + modal = false; +}; + +singleton GuiControlProfile(GuiMenuBackgroundProfile) +{ + category = "BaseUI"; + opaque = true; + fillcolor = "34 34 34 255"; +}; + +singleton GuiControlProfile(GuiMenuPanelProfile) +{ + category = "BaseUI"; + opaque = true; + fillcolor = "15 15 15 255"; +}; + +singleton GuiControlProfile(GuiMenuBasePanelProfile) +{ + category = "BaseUI"; + opaque = true; + fillcolor = "40 40 40 255"; +}; + +// --------------------------------------------------------------------------- +// Text +// --------------------------------------------------------------------------- +singleton GuiControlProfile(MenuHeaderText) { fontType = "Arial Bold"; - fontSize = 20; - fontColor = $TextMediumEmphasisColor; - fontColorSEL = $TextMediumEmphasisColor; - fontColorNA = $TextDisabledColor; - fontColorHL = $TextMediumEmphasisColor; - - fillColor = "108 108 108"; - fillColorHL = "140 140 140"; - fillColorSEL = "180 180 180"; - - HitAreaUpperLeft = "16 20"; - HitAreaLowerRight = "503 74"; - IconOffset = "40 0"; - TextOffset = "100 0"; - RowSize = "500 90"; - ColumnSplit = "250"; - RightPad = "20"; - bitmap = "UI:listMenuArray_image"; - canKeyFocus = true; -}; - -new GuiControlProfile(GamepadDefaultProfile) -{ - border = 0; -}; - -new GuiControlProfile(GamepadButtonTextLeft) -{ - fontType = "Arial Bold"; - fontSize = 20; - fontColor = "255 255 255"; - justify = "left"; -}; - -new GuiControlProfile(GamepadButtonTextRight : GamepadButtonTextLeft) -{ - justify = "right"; -}; - -new GuiControlProfile(MenuHeaderText) -{ - fontType = "Arial Bold"; - fontSize = 30; + fontSize = 36; fontColor = $TextHighEmphasisColor; justify = "left"; + modal = false; + category = "BaseUI"; }; -new GuiControlProfile(MenuHeaderTextCenter) +singleton GuiControlProfile(MenuHeaderTextHighlighted : MenuHeaderText) +{ + fontColor = $TextHighEmphasisColorHL; +}; + +singleton GuiControlProfile(MenuHeaderTextCenter : MenuHeaderText) { - fontType = "Arial Bold"; - fontSize = 30; - fontColor = $TextHighEmphasisColor; justify = "center"; }; -new GuiControlProfile(MenuSubHeaderText) +singleton GuiControlProfile(MenuSubHeaderText) { fontType = "Arial Bold"; - fontSize = 20; + fontSize = 24; fontColor = $TextMediumEmphasisColor; justify = "left"; + modal = false; + category = "BaseUI"; }; -new GuiControlProfile(MenuMLSubHeaderText) +singleton GuiControlProfile(MenuSubHeaderTextHighlighted : MenuSubHeaderText) +{ + fontColor = $TextMediumEmphasisColorHL; +}; + +singleton GuiControlProfile(MenuSubHeaderCenteredText : MenuSubHeaderText) +{ + justify = "center"; +}; + +singleton GuiControlProfile(MenuSubHeaderCenteredTextHighlighted : MenuSubHeaderCenteredText) +{ + fontColor = $TextMediumEmphasisColorHL; +}; + +singleton GuiControlProfile(MenuMLSubHeaderText) { fontType = "Arial Bold"; fontSize = 20; @@ -76,482 +96,107 @@ new GuiControlProfile(MenuMLSubHeaderText) justify = "left"; autoSizeWidth = true; autoSizeHeight = true; -}; - -new GuiControlProfile(MenuMLSubHeaderTextCenter : MenuMLSubHeaderText) -{ - justify = "center"; -}; - -if( !isObject( GuiMenuButtonProfile ) ) -new GuiControlProfile( GuiMenuButtonProfile ) -{ - opaque = true; - border = true; - fontSize = 18; - fontType = "Arial Bold"; - fontColor = $TextMediumEmphasisColor; - fontColorHL = $TextMediumEmphasisColor; - fontColorNA = $TextDisabledColor; - fontColorSEL = $TextMediumEmphasisColor; - fillColor = "40 40 40"; - fillColorHL = "49 34 37"; - fillColorNA = "40 40 40"; - borderColor = "87 87 87"; - borderColorNA = "0 0 0"; - borderColorHL = "194 64 64"; - fixedExtent = false; - justify = "center"; - canKeyFocus = false; - //bitmapAsset = "UI:menu_button_image"; - hasBitmapArray = false; - soundButtonDown = "UI:buttonClick"; - soundButtonOver = "UI:buttonHover"; - category = "Core"; -}; - -if( !isObject( GuiHighlightMenuButtonProfile ) ) -new GuiControlProfile( GuiHighlightMenuButtonProfile ) -{ - opaque = true; - border = false; - fontSize = 18; - fontType = "Arial Bold"; - fontColor = "240 240 240"; - fontColorHL = "0 0 0"; - fontColorNA = "125 125 125"; - //fontColorSEL ="0 0 0"; - fixedExtent = false; - justify = "center"; - canKeyFocus = false; - bitmapAsset = "UI:selector_button_highlight_only_image"; - hasBitmapArray = false; - category = "Core"; -}; - -if( !isObject( GuiBlankMenuButtonProfile ) ) -new GuiControlProfile( GuiBlankMenuButtonProfile ) -{ - opaque = true; - border = false; - fontSize = 18; - fontType = "Arial Bold"; - fontColor = "220 220 220"; - fontColorHL = "255 255 255"; - fontColorNA = "200 200 200"; - //fontColorSEL ="0 0 0"; - fixedExtent = false; - justify = "center"; - canKeyFocus = false; - bitmapAsset = "UI:selector_button_blank_image"; - hasBitmapArray = false; - soundButtonDown = menuButtonPressed; - soundButtonOver = menuButtonHover; - category = "Core"; -}; - -if( !isObject( GuiJoinServerButtonProfile ) ) -new GuiControlProfile( GuiJoinServerButtonProfile : GuiMenuButtonProfile ) -{ - justify = "left"; -}; - -if( !isObject( GuiMenuTextProfile ) ) -new GuiControlProfile( GuiMenuTextProfile ) -{ - opaque = true; - border = false; - fontSize = 18; - fontType = "Arial Bold"; - fontColor = "240 240 240"; - fontColorHL = "0 0 0"; - fontColorNA = "125 125 125"; - fixedExtent = false; - justify = "center"; - category = "Core"; -}; - -if( !isObject( GuiSolidDefaultProfile ) ) -new GuiControlProfile (GuiSolidDefaultProfile) -{ - opaque = true; - border = true; - category = "Core"; -}; - -if( !isObject( GuiTransparentProfile ) ) -new GuiControlProfile (GuiTransparentProfile) -{ - opaque = false; - border = false; - category = "Core"; -}; - -if( !isObject( GuiGroupBorderProfile ) ) -new GuiControlProfile( GuiGroupBorderProfile ) -{ - border = false; - opaque = false; - hasBitmapArray = true; - bitmapAsset = "UI:group_border_image"; - category = "Core"; -}; - -if( !isObject( GuiTabBorderProfile ) ) -new GuiControlProfile( GuiTabBorderProfile ) -{ - border = false; - opaque = false; - hasBitmapArray = true; - bitmapAsset = "UI:tab_border_image"; - category = "Core"; -}; - -if( !isObject( GuiModelessDialogProfile ) ) -new GuiControlProfile( GuiModelessDialogProfile ) -{ modal = false; - category = "Core"; + category = "BaseUI"; }; -if( !isObject( GuiFrameSetProfile ) ) -new GuiControlProfile (GuiFrameSetProfile) +singleton GuiControlProfile(MenuMLSubHeaderTextCenter : MenuMLSubHeaderText) +{ + justify = "center"; +}; + +singleton GuiControlProfile( GuiMenuTextProfile ) { - fillcolor = "255 255 255"; - borderColor = "246 245 244"; - border = 1; opaque = true; - border = true; - category = "Core"; + border = false; + fontSize = 18; + fontType = "Arial Bold"; + fontColor = "240 240 240"; + fontColorHL = "0 0 0"; + fontColorNA = "125 125 125"; + fixedExtent = false; + justify = "center"; + category = "BaseUI"; + modal = false; }; -if( !isObject( GuiInputCtrlProfile ) ) -new GuiControlProfile( GuiInputCtrlProfile ) -{ - tab = true; - canKeyFocus = true; - category = "Core"; -}; - -if( !isObject( GuiTextProfile ) ) -new GuiControlProfile (GuiTextProfile) -{ - justify = "left"; - fontColor = "20 20 20"; - category = "Core"; -}; - -if( !isObject( GuiTextRightProfile ) ) -new GuiControlProfile (GuiTextRightProfile : GuiTextProfile) -{ - justify = "right"; - category = "Core"; -}; - -if( !isObject( GuiAutoSizeTextProfile ) ) -new GuiControlProfile (GuiAutoSizeTextProfile) +singleton GuiControlProfile( GuiMenuTextProfileHL : GuiMenuTextProfile ) { fontColor = "0 0 0"; - autoSizeWidth = true; - autoSizeHeight = true; - category = "Core"; }; -if( !isObject( GuiMediumTextProfile ) ) -new GuiControlProfile( GuiMediumTextProfile : GuiTextProfile ) -{ - fontSize = 24; - category = "Core"; -}; - -if( !isObject( GuiBigTextProfile ) ) -new GuiControlProfile( GuiBigTextProfile : GuiTextProfile ) -{ - fontSize = 36; - category = "Core"; -}; - -if( !isObject( GuiMLTextProfile ) ) -new GuiControlProfile( GuiMLTextProfile ) +singleton GuiControlProfile( GuiMLTextProfile ) { fontColor = $TextMediumEmphasisColor; fontColorHL = $TextMediumEmphasisColor; fontColorSEL = $TextMediumEmphasisColor; fontColorNA = $TextDisabledColor; + fontSize = 20; fontColorLink = "100 100 100"; fontColorLinkHL = $TextMediumEmphasisColor; autoSizeWidth = true; autoSizeHeight = true; border = false; - category = "Core"; + modal = false; + category = "BaseUI"; }; -if( !isObject( GuiMLWhiteTextProfile ) ) -new GuiControlProfile( GuiMLWhiteTextProfile ) +singleton GuiControlProfile( GuiMLTextProfileHighlighted : GuiMLTextProfile ) { - fontColor = "220 220 220"; - fontColorHL = $TextMediumEmphasisColor; - autoSizeWidth = true; - autoSizeHeight = true; - border = false; - category = "Core"; + fontColor = $TextMediumEmphasisColorHL; }; -if( !isObject( GuiTextArrayProfile ) ) -new GuiControlProfile( GuiTextArrayProfile : GuiTextProfile ) -{ - fontColor = $TextMediumEmphasisColor; - fontColorHL = $TextMediumEmphasisColor; - fontColorSEL = $TextMediumEmphasisColor; - fontColorNA = $TextDisabledColor; - - fillColor = "22 22 22 255"; - fillColorHL = "22 22 22 255"; - fillColorSEL = "56 56 56 255"; - - border = true; - borderColor ="87 87 87"; - borderColorHL = "87 87 87"; - borderColorSEL = "255 255 255"; - - category = "Core"; - canKeyFocus = true; -}; - -if( !isObject( GuiMenuTextEditProfile ) ) -new GuiControlProfile( GuiMenuTextEditProfile : GuiTextEditProfile ) -{ - fontColor = $TextMediumEmphasisColor; - fontColorHL = $TextMediumEmphasisColor; - fontColorSEL = $TextMediumEmphasisColor; - fontColorNA = $TextDisabledColor; - - fillColor = "22 22 22 255"; - fillColorHL = "22 22 22 255"; - - border = true; - borderColor ="87 87 87"; - borderColorHL = "87 87 87"; - borderColorSEL = "255 255 255"; - - category = "Core"; -}; - -// ---------------------------------------------------------------------------- -// TODO: Revisit Popupmenu -// ---------------------------------------------------------------------------- - -if( !isObject( GuiPopupMenuItemBorder ) ) -new GuiControlProfile( GuiPopupMenuItemBorder : GuiButtonProfile ) +// --------------------------------------------------------------------------- +// Interactive Controls +// --------------------------------------------------------------------------- +singleton GuiControlProfile( GuiMenuButtonProfile ) { opaque = true; - border = true; - fontColor = "0 0 0"; - fontColorHL = "0 0 0"; - fontColorNA = "255 255 255"; - fixedExtent = false; + border = false; + fontSize = 24; + fontType = "Arial Bold"; + fontColor = "200 200 200 255"; + fontColorHL = "0 0 0 255"; + fontColorNA = "108 108 108 255"; + fontColorSEL = "200 200 200 255"; + fillColor = "0 0 0 0"; + fillColorHL = "255 255 255 255"; + fillColorNA = "40 40 40"; + borderColor = "87 87 87"; + borderColorNA = "0 0 0"; + borderColorHL = "194 64 64"; + fixedExtent = 0; justify = "center"; canKeyFocus = false; - bitmapAsset = "UI:menubutton_image"; - category = "Core"; + hasBitmapArray = false; + soundButtonDown = "UI:buttonClick"; + soundButtonOver = "UI:buttonHover"; + category = "BaseUI"; + fontColors[0] = "200 200 200 255"; + fontColors[2] = "108 108 108 255"; + fontColors[3] = "200 200 200 255"; }; -if( !isObject( GuiPopUpMenuDefault ) ) -new GuiControlProfile( GuiPopUpMenuDefault : GuiDefaultProfile ) +singleton GuiControlProfile( GuiMenuButtonLeftJustProfile : GuiMenuButtonProfile ) { - opaque = true; - mouseOverSelected = true; - textOffset = "3 3"; - border = 0; - borderThickness = 0; - fixedExtent = true; - hasBitmapArray = true; - - fillColor = EditorSettings.value("Theme/fieldBGColor");//"255 255 255";//100 - fillColorHL = EditorSettings.value("Theme/fieldBGHLColor");//"91 101 116"; - fillColorSEL = EditorSettings.value("Theme/fieldBGSELColor");//"91 101 116"; - fontColor = EditorSettings.value("Theme/fieldTextColor");//"215 215 215"; - fontColorHL = EditorSettings.value("Theme/fieldTextHLColor");//"215 215 215"; - fontColorSEL = EditorSettings.value("Theme/fieldTextSELColor");//"215 215 215"; - fontColorNA = EditorSettings.value("Theme/fieldTextColor");//"215 215 215"; - borderColor = EditorSettings.value("Theme/dividerDarkColor"); - profileForChildren = GuiPopupMenuItemBorder; - category = "Core"; + justify = "Left"; }; -if( !isObject( GuiPopUpMenuProfile ) ) -new GuiControlProfile( GuiPopUpMenuProfile : GuiPopUpMenuDefault ) +singleton GuiControlProfile( GuiRemapActionMapButtonProfile : GuiMenuButtonProfile ) { - textOffset = "6 4"; - bitmapAsset = "UI:dropDown_image"; - hasBitmapArray = true; - border = 1; - profileForChildren = GuiPopUpMenuDefault; - category = "Core"; + fillColor = "18 18 18 255"; + fillColorHL = "0 0 0 255"; }; -if( !isObject( GuiTabBookProfile ) ) -new GuiControlProfile( GuiTabBookProfile ) -{ - fillColorHL = "100 100 100"; - fillColorNA = "150 150 150"; - fontColor = "30 30 30"; - fontColorHL = "0 0 0"; - fontColorNA = "50 50 50"; - fontType = "Arial"; - fontSize = 14; - justify = "center"; - bitmapAsset = "UI:tab_image"; - tabWidth = 64; - tabHeight = 24; - tabPosition = "Top"; - tabRotation = "Horizontal"; - textOffset = "0 -3"; - tab = true; - cankeyfocus = true; - category = "Core"; -}; - -if( !isObject( GuiTabPageProfile ) ) -new GuiControlProfile( GuiTabPageProfile : GuiDefaultProfile ) -{ - fontType = "Arial"; - fontSize = 10; - justify = "center"; - bitmapAsset = "UI:tab_image"; - opaque = false; - fillColor = "240 239 238"; - category = "Core"; -}; - -if( !isObject( GuiConsoleProfile ) ) -new GuiControlProfile( GuiConsoleProfile ) -{ - fontType = ($platform $= "macos") ? "Monaco" : "Lucida Console"; - fontSize = ($platform $= "macos") ? 13 : 12; - fontColor = "255 255 255"; - fontColorHL = "0 255 255"; - fontColorNA = "255 0 0"; - fontColors[6] = "100 100 100"; - fontColors[7] = "100 100 0"; - fontColors[8] = "0 0 100"; - fontColors[9] = "0 100 0"; - category = "Core"; -}; - -if( !isObject( GuiConsoleTextProfile ) ) -new GuiControlProfile( GuiConsoleTextProfile ) -{ - fontColor = "0 0 0"; - autoSizeWidth = true; - autoSizeHeight = true; - textOffset = "2 2"; - opaque = true; - fillColor = "255 255 255"; - border = true; - borderThickness = 1; - borderColor = "0 0 0"; - category = "Core"; -}; - -$ConsoleDefaultFillColor = "0 0 0 175"; - -if( !isObject( ConsoleScrollProfile ) ) -new GuiControlProfile( ConsoleScrollProfile : GuiScrollProfile ) -{ - opaque = true; - fillColor = $ConsoleDefaultFillColor; - border = 1; - //borderThickness = 0; - borderColor = "0 0 0"; - category = "Core"; -}; - -if( !isObject( ConsoleTextEditProfile ) ) -new GuiControlProfile( ConsoleTextEditProfile : GuiTextEditProfile ) -{ - fillColor = "242 241 240 255"; - fillColorHL = "255 255 255"; - category = "Core"; -}; - -//----------------------------------------------------------------------------- -// Center and bottom print -//----------------------------------------------------------------------------- - -if( !isObject( CenterPrintProfile ) ) -new GuiControlProfile ( CenterPrintProfile ) +singleton GuiControlProfile(GuiMenuScrollProfile) { opaque = false; - fillColor = "128 128 128"; - fontColor = "0 255 0"; - border = true; - borderColor = "0 255 0"; - category = "Core"; -}; - -if( !isObject( CenterPrintTextProfile ) ) -new GuiControlProfile ( CenterPrintTextProfile ) -{ - opaque = false; - fontType = "Arial"; - fontSize = 12; - fontColor = "0 255 0"; - category = "Core"; -}; - -// ---------------------------------------------------------------------------- -// Radio button control -// ---------------------------------------------------------------------------- - -if( !isObject( GuiRadioProfile ) ) -new GuiControlProfile( GuiRadioProfile ) -{ - fontSize = 14; - fillColor = "232 232 232"; - fontColor = "20 20 20"; - fontColorHL = "80 80 80"; - fixedExtent = true; - bitmapAsset = "UI:radioButton_image"; - hasBitmapArray = true; - category = "Core"; -}; - -// -// Scroll Profile -// -if(!isObject(GuiMenuScrollProfile)) -new GuiControlProfile(GuiMenuScrollProfile) -{ - opaque = false; - fillcolor = "22 22 22"; + fillcolor = "0 0 0 0"; fontColor = "200 200 200"; fontColorHL = "250 250 250"; border = false; bitmapAsset = "UI:scrollBar_image"; hasBitmapArray = true; - category = "Core"; -}; - -// Scroll -if(!isObject(GuiMenuScrollProfile)) -new GuiControlProfile(GuiMenuScrollProfile) -{ - opaque = true; - fillcolor = "128 128 128"; - fontColor = "0 0 0"; - fontColorHL = "150 150 150"; - border = true; - bitmapAsset = "UI:scrollBar_image"; - hasBitmapArray = true; - category = "Core"; -}; - -singleton GuiControlProfile(SliderBitmapGUIProfile) -{ - bitmapAsset = "UI:optionsMenuSliderBitmapArray_image"; - hasBitmapArray = true; - opaque = false; - borderColor = "0 0 0 255"; -}; + category = "BaseUI"; +}; \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/scripts/utility.tscript b/Templates/BaseGame/game/data/UI/scripts/utility.tscript index 4245651f0..a0870f54d 100644 --- a/Templates/BaseGame/game/data/UI/scripts/utility.tscript +++ b/Templates/BaseGame/game/data/UI/scripts/utility.tscript @@ -1,3 +1,25 @@ +function ActionMap::getCommandButtonBitmap(%this, %device, %command) +{ + %binding = %this.getBinding(%command); + + if(%device $= "mouse" || %device $= "") + %device = "keyboard"; + + %bindingCount = getFieldCount(%binding); + for(%i=0; %i < %bindingCount; %i+=2) + { + %mapDevice = stripTrailingNumber(getField(%binding, %i)); + if(%mapDevice $= %device) + { + %button = getField(%binding, %i+1); + break; + } + } + + %assetId = getButtonBitmap(%device, %button); + return %assetId; +} + function getButtonBitmap(%device, %button) { if(%device $= "gamepad") diff --git a/Templates/BaseGame/game/tools/VPathEditor/GUI/VPathEditor.gui b/Templates/BaseGame/game/tools/VPathEditor/GUI/VPathEditor.gui index b6315df53..e48614c5a 100644 --- a/Templates/BaseGame/game/tools/VPathEditor/GUI/VPathEditor.gui +++ b/Templates/BaseGame/game/tools/VPathEditor/GUI/VPathEditor.gui @@ -302,7 +302,7 @@ new VPathEditor(EVPathEditor) { }; new GuiPopUpMenuCtrl(EPathEditorNodeOrientationMode){ internalName = "weight"; - Profile = "GuiPopUpMenuProfile"; + Profile = "ToolsGuiPopUpMenuProfile"; HorizSizing = "right"; VertSizing = "bottom"; Position = "57 84"; @@ -385,7 +385,7 @@ new VPathEditor(EVPathEditor) { canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "1"; - Profile = "GuiTransparentProfile"; + Profile = "ToolsGuiTransparentProfile"; HorizSizing = "right"; VertSizing = "bottom"; Position = "1 1"; diff --git a/Templates/BaseGame/game/tools/VPathEditor/GUI/VPathEditorToolbar.gui b/Templates/BaseGame/game/tools/VPathEditor/GUI/VPathEditorToolbar.gui index 57651df52..5a1f0a808 100644 --- a/Templates/BaseGame/game/tools/VPathEditor/GUI/VPathEditorToolbar.gui +++ b/Templates/BaseGame/game/tools/VPathEditor/GUI/VPathEditorToolbar.gui @@ -30,7 +30,7 @@ $guiContent = new GuiControl(VPathEditorToolbar) new GuiTextCtrl() { internalName = "ToolbarLabel"; - profile = "GuiTextProfile"; + profile = "ToolsGuiTextProfile"; horizSizing = "right"; vertSizing = "bottom"; position = "2 7"; @@ -48,7 +48,7 @@ $guiContent = new GuiControl(VPathEditorToolbar) internalName = "PathTypeMenu"; Enabled = "1"; isContainer = "0"; - Profile = "GuiPopUpMenuProfile"; + Profile = "ToolsGuiPopUpMenuProfile"; HorizSizing = "right"; VertSizing = "bottom"; Position = "85 7"; diff --git a/Templates/BaseGame/game/tools/VerveEditor/GUI/GuiProfiles.tscript b/Templates/BaseGame/game/tools/VerveEditor/GUI/GuiProfiles.tscript index ada3b1a08..457e0fae2 100644 --- a/Templates/BaseGame/game/tools/VerveEditor/GUI/GuiProfiles.tscript +++ b/Templates/BaseGame/game/tools/VerveEditor/GUI/GuiProfiles.tscript @@ -79,7 +79,7 @@ singleton GuiControlProfile( VEditorTextEditProfile : VEditorDefaultProfile ) canKeyFocus = true; }; -singleton GuiControlProfile( VEditorPopupMenuProfile : GuiPopUpMenuProfile ) +singleton GuiControlProfile( VEditorPopupMenuProfile : ToolsGuiPopUpMenuProfile ) { FillColorHL = "90 90 90"; FillColorSEL = "0 0 0"; @@ -204,7 +204,7 @@ singleton GuiControlProfile( VEditorPropertyLabelProfile : VEditorTextProfile ) //----------------------------------------------------------------------------- -singleton GuiControlProfile( VEditorPreferenceLabelProfile : GuiTextProfile ) +singleton GuiControlProfile( VEditorPreferenceLabelProfile : ToolsGuiTextProfile ) { opaque = true; fillColor = "242 241 240"; diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript index 1216eaab6..a63aef2c9 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript @@ -2420,7 +2420,7 @@ function AssetBrowserPreviewButton::onMouseDragged(%this) %ctrl = new GuiDragAndDropControl() { canSaveDynamicFields = "0"; - Profile = "GuiSolidDefaultProfile"; + Profile = "ToolsGuiSolidDefaultProfile"; HorizSizing = "right"; VertSizing = "bottom"; Position = %xPos SPC %yPos; diff --git a/Templates/BaseGame/game/tools/gui/messageBoxes/IODropdownDlg.ed.gui b/Templates/BaseGame/game/tools/gui/messageBoxes/IODropdownDlg.ed.gui index e62771773..dda5498a0 100644 --- a/Templates/BaseGame/game/tools/gui/messageBoxes/IODropdownDlg.ed.gui +++ b/Templates/BaseGame/game/tools/gui/messageBoxes/IODropdownDlg.ed.gui @@ -54,7 +54,7 @@ $guiContent = new GuiControl(IODropdownDlg) { }; new GuiBitmapBorderCtrl() { isContainer = "0"; - profile = "GuiGroupBorderProfile"; + profile = "ToolsGuiGroupBorderProfile"; horizSizing = "width"; vertSizing = "bottom"; position = "7 51"; diff --git a/Templates/BaseGame/game/tools/gui/renderTargetVisualizer.ed.gui b/Templates/BaseGame/game/tools/gui/renderTargetVisualizer.ed.gui index 79007fda4..9c6b5fa15 100644 --- a/Templates/BaseGame/game/tools/gui/renderTargetVisualizer.ed.gui +++ b/Templates/BaseGame/game/tools/gui/renderTargetVisualizer.ed.gui @@ -5,7 +5,7 @@ $guiContent = new GuiControl(RenderTargetVisualizer) { minExtent = "8 2"; horizSizing = "right"; vertSizing = "bottom"; - profile = "GuiModelessDialogProfile"; + profile = "ToolsGuiModelessDialogProfile"; visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; @@ -79,7 +79,7 @@ $guiContent = new GuiControl(RenderTargetVisualizer) { minExtent = "8 2"; horizSizing = "width"; vertSizing = "bottom"; - profile = "GuiPopUpMenuProfile"; + profile = "ToolsGuiPopUpMenuProfile"; visible = "1"; active = "1"; command = "RenderTargetsList.updateTarget();"; diff --git a/Templates/BaseGame/game/tools/levels/DefaultEditorLevel.asset.taml b/Templates/BaseGame/game/tools/levels/DefaultEditorLevel.asset.taml index 5fdb84bfc..9b3fe43b3 100644 --- a/Templates/BaseGame/game/tools/levels/DefaultEditorLevel.asset.taml +++ b/Templates/BaseGame/game/tools/levels/DefaultEditorLevel.asset.taml @@ -1,10 +1,7 @@ + VersionId="1"/> diff --git a/Templates/BaseGame/game/tools/materialEditor/gui/guiMaterialPropertiesWindow.ed.gui b/Templates/BaseGame/game/tools/materialEditor/gui/guiMaterialPropertiesWindow.ed.gui index 39c431697..6f7640ea1 100644 --- a/Templates/BaseGame/game/tools/materialEditor/gui/guiMaterialPropertiesWindow.ed.gui +++ b/Templates/BaseGame/game/tools/materialEditor/gui/guiMaterialPropertiesWindow.ed.gui @@ -2619,7 +2619,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { hovertime = "1000"; new GuiContainer(){ // enable/disable - profile="GuiTransparentProfile"; + profile="ToolsGuiTransparentProfile"; isContainer = "1"; position = "0 0"; Extent = "300 24"; @@ -2652,7 +2652,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { }; new GuiContainer(){ // scale - profile="GuiTransparentProfile"; + profile="ToolsGuiTransparentProfile"; isContainer = "1"; position = "0 0"; Extent = "300 24"; @@ -2735,7 +2735,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { }; new GuiContainer(){ // direction - profile="GuiTransparentProfile"; + profile="ToolsGuiTransparentProfile"; isContainer = "1"; position = "0 0"; Extent = "300 24"; @@ -2817,7 +2817,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { }; }; new GuiContainer(){ // strength - profile="GuiTransparentProfile"; + profile="ToolsGuiTransparentProfile"; isContainer = "1"; position = "0 0"; Extent = "300 24"; @@ -2899,7 +2899,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { }; }; new GuiContainer(){ // coverage - profile="GuiTransparentProfile"; + profile="ToolsGuiTransparentProfile"; isContainer = "1"; position = "0 0"; Extent = "300 24"; @@ -2981,7 +2981,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { }; }; new GuiContainer(){ // specular - profile="GuiTransparentProfile"; + profile="ToolsGuiTransparentProfile"; isContainer = "1"; position = "0 0"; Extent = "300 24"; @@ -3063,7 +3063,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { }; }; new GuiContainer(){ // empty space - profile="GuiTransparentProfile"; + profile="ToolsGuiTransparentProfile"; isContainer = "1"; position = "0 0"; Extent = "300 10"; diff --git a/Templates/BaseGame/game/tools/navEditor/NavEditorGui.gui b/Templates/BaseGame/game/tools/navEditor/NavEditorGui.gui index cb0b0f098..a512eb327 100644 --- a/Templates/BaseGame/game/tools/navEditor/NavEditorGui.gui +++ b/Templates/BaseGame/game/tools/navEditor/NavEditorGui.gui @@ -549,7 +549,7 @@ $guiContent = new GuiNavEditorCtrl(NavEditorGui, EditorGuiGroup) { canSaveDynamicFields = "0"; Enabled = "1"; isContainer = "1"; - Profile = "GuiTransparentProfile"; + Profile = "ToolsGuiTransparentProfile"; HorizSizing = "width"; VertSizing = "height"; Position = "1 1"; diff --git a/Templates/BaseGame/game/tools/navEditor/NavEditorSettingsTab.gui b/Templates/BaseGame/game/tools/navEditor/NavEditorSettingsTab.gui index 9aafcd0b9..6cc6cbb71 100644 --- a/Templates/BaseGame/game/tools/navEditor/NavEditorSettingsTab.gui +++ b/Templates/BaseGame/game/tools/navEditor/NavEditorSettingsTab.gui @@ -14,7 +14,7 @@ $guiContent = new GuiTabPageCtrl(ENavEditorSettingsPage) { minExtent = "8 2"; horizSizing = "width"; vertSizing = "height"; - profile = "GuiSolidDefaultProfile"; + profile = "ToolsGuiSolidDefaultProfile"; visible = "1"; active = "1"; tooltipProfile = "GuiToolTipProfile"; diff --git a/Templates/BaseGame/game/tools/settings.xml b/Templates/BaseGame/game/tools/settings.xml index 3d22b0ffd..4960ec633 100644 --- a/Templates/BaseGame/game/tools/settings.xml +++ b/Templates/BaseGame/game/tools/settings.xml @@ -41,7 +41,7 @@ Edit Asset 0 1047 2200 360 + name="LastPosExt">0 976 2200 360 1 tools/RPGDialogEditor/gui 1024 768 + name="previewResolution">1280 720 https://docs.torque3d.org - - Categorized -