construction-mod/scripts/OptionsDlg.cs
2025-06-05 12:37:16 +02:00

2764 lines
88 KiB
C#

//------------------------------------------------------------------------------
//
// OptionsDlg.cs
//
//------------------------------------------------------------------------------
$max_screenerror = 25;
$min_TSScreenError = 2;
$max_TSScreenError = 20;
$min_TSDetailAdjust = 0.6;
$max_TSDetailAdjust = 1.0;
//------------------------------------------------------------------------------
function OptionsDlg::onWake( %this )
{
OP_VideoPane.setVisible( false );
OP_GraphicsPane.setVisible( false );
OP_TexturesPane.setVisible( false );
OP_SoundPane.setVisible( false );
OP_VoicePane.setVisible( false );
OP_ControlsPane.setVisible( false );
OP_NetworkPane.setVisible( false );
OP_GamePane.setVisible( false );
OP_VideoTab.setValue( false );
OP_GraphicsTab.setValue( false );
OP_TexturesTab.setValue( false );
OP_SoundTab.setValue( false );
OP_VoiceTab.setValue( false );
OP_ControlsTab.setValue( false );
OP_NetworkTab.setValue( false );
OP_GameTab.setValue( false );
// Initialize the Video Pane controls:
// First the Video Driver menu:
%buffer = getDisplayDeviceList();
%count = getFieldCount( %buffer );
for ( %i = 0; %i < %count; %i++ )
OP_VideoDriverMenu.add( getField( %buffer, %i ), %i );
// Select the current device:
OP_FullScreenTgl.setValue( $pref::Video::fullScreen );
%selId = OP_VideoDriverMenu.findText( $pref::Video::displayDevice );
if ( %selId == -1 )
%selId = 0; // How did THAT happen?
OP_VideoDriverMenu.setSelected( %selId );
OP_VideoDriverMenu.onSelect( %selId, "" );
OP_FullScreenTgl.onAction();
OP_ApplyBtn.setActive( false );
// Initialize the Graphics Options controls:
OptionsDlg::deviceDependent( %this );
// Radeon cards don't switch color depth good until they release their beta drivers which fix this problem.
if( $RadeonRenderer == true )
OP_BPPMenu.setActive( false );
OP_GammaSlider.setValue( $pref::OpenGL::gammaCorrection );
OP_GammaSlider.setActive( $Video::setGammaCorrectionSupported );
OP_TerrainSlider.setValue( $max_screenerror - $pref::Terrain::screenError );
OP_ShapeSlider.setValue( ( $max_TSScreenError - $pref::TS::screenError ) / ( $max_TSScreenError - $min_TSScreenError ) );
OP_ShadowSlider.setValue( $pref::Shadows );
OP_InteriorDetailSlider.setValue( $pref::Interior::detailAdjust );
OP_VisibleDistanceSlider.setValue( $pref::VisibleDistanceMod );
OP_ParticleDensitySlider.setValue( 4.0 - $pref::ParticleDensity );
OP_DynamicLightSlider.setValue( 100 - $pref::Interior::DynamicLightsClipPix );
updateDynamicLightSliderState();
OP_SkyDetailMenu.init();
if ( !$pref::SkyOn )
%selId = 5;
else if ( $pref::numCloudLayers >= 0 && $pref::numCloudLayers < 4 )
%selId = 4 - $pref::numCloudLayers;
else
%selId = 1;
OP_SkyDetailMenu.setSelected( %selId );
OP_SkyDetailMenu.setText( OP_SkyDetailMenu.getTextById( %selId ) );
OP_PlayerRenderMenu.init();
%selId = $pref::Player::renderMyPlayer | ( $pref::Player::renderMyItems << 1 );
OP_PlayerRenderMenu.setSelected( %selId );
OP_VertexLightTgl.setValue( $pref::Interior::VertexLighting );
// Initialize the Textures Options controls:
OP_TerrainTexSlider.setValue( 6 - $pref::Terrain::texDetail );
// We're using the noDrawArraysAlpha variable here because we've already
// gone gold (hard to add a new profiling variable). But the Voodoo2/3/3500
// cards that have the 256x256 texture limitation (in OpenGL) also have the
// noDrawArraysAlpha hack on...so that works out nice
%mipRange = $pref::OpenGL::noDrawArraysAlpha ? 4.0 : 5.0;
OP_ShapeTexSlider.setValue( (5 - $pref::OpenGL::mipReduction) / %mipRange );
OP_BuildingTexSlider.setValue( (5 - $pref::OpenGL::interiorMipReduction) / %mipRange );
OP_SkyTexSlider.setValue( (5 - $pref::OpenGL::skyMipReduction) / %mipRange );
if ( !isDemo() )
OP_HiResSkinTgl.setValue( $pref::use512PlayerSkins );
// Initialize the Sound Options controls:
// provider menu
%count = alxGetContexti(ALC_PROVIDER_COUNT);
for(%i = 0; %i < %count; %i++)
OP_AudioProviderMenu.add(alxGetContextstr(ALC_PROVIDER_NAME, %i), %i);
%selId = alxGetContexti(ALC_PROVIDER);
OP_AudioProviderMenu.setSelected(%selId);
OP_AudioResetProvider.setActive(false);
// environment provider: disable and uncheck if not an environment provider
%envProvider = audioIsEnvironmentProvider(alxGetContextstr(ALC_PROVIDER_NAME, %selId));
if(!%envProvider)
OP_AudioEnvironmentTgl.setValue(false);
OP_AudioEnvironmentTgl.setActive(%envProvider);
// speaker menu
%count = alxGetContexti(ALC_SPEAKER_COUNT);
for(%i = 0; %i < %count; %i++)
OP_AudioSpeakerMenu.add(alxGetContextstr(ALC_SPEAKER_NAME, %i), %i);
%selId = alxGetContexti(ALC_SPEAKER);
OP_AudioSpeakerMenu.setSelected(%selId);
OP_AudioSpeakerMenu.onSelect(%selId, "");
OP_AudioFrequencyMenu.init();
OP_AudioBitRateMenu.init();
OP_AudioChannelsMenu.init();
// don't allow changing of of mixer settings while in a game...
%active = !isObject(ServerConnection);
OP_AudioFrequencyMenu.setActive(%active);
// Changing these audio settings doesn't help Linux performance
if ( $platform $= "linux" )
{
OP_AudioBitRateMenu.setActive(false);
OP_AudioChannelsMenu.setActive(false);
}
else
{
OP_AudioBitRateMenu.setActive(%active);
OP_AudioChannelsMenu.setActive(%active);
}
// only allow for disable
if(!%active)
OP_AudioEnvironmentTgl.setActive(%active);
OP_AudioProviderMenu.setActive(%active);
OP_AudioSpeakerMenu.setActive(%active);
OP_MasterVolumeSlider.setValue( $pref::Audio::masterVolume );
OP_EffectsVolumeSlider.setValue( $pref::Audio::effectsVolume );
OP_VoiceBindVolumeSlider.setValue( $pref::Audio::radioVolume );
OP_GuiVolumeSlider.setValue( $pref::Audio::guiVolume );
OP_MusicTgl.onAction();
OP_MusicVolumeSlider.setValue( $pref::Audio::musicVolume );
// Initialize the Voice Settings controls:
OP_MicrophoneEnabledTgl.onAction();
OP_MicrophoneVolumeSlider.setValue( $pref::Audio::voiceVolume );
OP_InputBoostSlider.setValue( $pref::Audio::captureGainScale );
OP_VoiceListenMenu.init();
OP_VoiceSendMenu.init();
OP_VoiceCodecInfo.init();
updateInputBoost();
// Initialize the Control Options controls:
OP_ControlGroupMenu.init();
if ( isJoystickDetected() )
{
OP_JoystickTgl.setValue( $pref::Input::JoystickEnabled );
OP_JoystickTgl.setActive( true );
OP_ConfigureJoystickBtn.setActive( $pref::Input::JoystickEnabled );
}
else
{
OP_JoystickTgl.setValue( false );
OP_JoystickTgl.setActive( false );
$pref::Input::JoystickEnabled = false;
OP_ConfigureJoystickBtn.setActive( false );
}
// Initialize the Network Options controls:
OP_NetworkDisplayHud.init();
if( !OP_NetworkPresetsMenu.size() )
OP_NetworkPresetsMenu.init();
OP_PacketRateSlider.setValue( $pref::Net::PacketRateToClient );
OP_PacketSizeSlider.setValue( $pref::Net::PacketSize );
OP_UpdateRateSlider.setValue( $pref::Net::PacketRateToServer );
if ( !OP_MasterServerMenu.size() )
OP_MasterServerMenu.init();
%selId = OP_MasterServerMenu.findText( $pref::Net::DisplayOnMaster );
if ( %selId == -1 )
%selId = 1;
OP_MasterServerMenu.setSelected( %selId );
if ( !OP_RegionMenu.size() )
OP_RegionMenu.init();
OP_RegionMenu.setSelected( $pref::Net::RegionMask );
// Initialize the Game Options controls:
OP_ZoomSpeedSlider.setValue( 500 - $pref::Player::zoomSpeed );
OP_LaunchScreenMenu.init();
%selId = OP_LaunchScreenMenu.findText( $pref::Shell::LaunchGui );
if ( %selId == -1 )
%selId = 1;
OP_LaunchScreenMenu.setText( OP_LaunchScreenMenu.getTextById( %selId ) );
OP_LaunchScreenMenu.setSelected( %selId );
// Hide controls that are not relevant to the demo:
if ( isDemo() )
{
OP_MasterServerTxt.setVisible( false );
OP_MasterServerMenu.setVisible( false );
OP_CheckEmailTgl.setVisible( false );
OP_ChatDisconnectTgl.setVisible( false );
OP_EditChatMenuBtn.setVisible( false );
OP_LaunchScreenTxt.setVisible( false );
OP_LaunchScreenMenu.setVisible( false );
}
%this.setPane( %this.pane );
}
//------------------------------------------------------------------------------
function OptionsDlg::deviceDependent( %this )
{
if ( $SwapIntervalSupported )
{
OP_VSyncTgl.setValue( $pref::Video::disableVerticalSync );
OP_VSyncTgl.setActive( true );
}
else
{
OP_VSyncTgl.setValue( false );
OP_VSyncTgl.setActive( false );
}
if ( isDemo() )
{
OP_TexQualityMenu.setText( "Palletized" );
OP_TexQualityMenu.setActive( false );
}
else
{
OP_TexQualityMenu.init();
if ( $pref::OpenGL::forcePalettedTexture )
{
$pref::OpenGL::force16bittexture = false;
%selId = 1;
}
else if ( $pref::OpenGL::force16bittexture )
%selId = 2;
else
%selId = 3;
OP_TexQualityMenu.setSelected( %selId );
}
OP_CompressMenu.init();
if ( $TextureCompressionSupported && !$pref::OpenGL::disableARBTextureCompression )
{
OP_CompressLabel.setVisible( true );
OP_CompressLabel_Disabled.setVisible( false );
OP_CompressMenu.setActive( true );
if ( !$pref::OpenGL::allowCompression )
OP_CompressMenu.setSelected( 1 );
else if ( $pref::OpenGL::compressionHint $= "GL_NICEST" )
OP_CompressMenu.setSelected( 3 );
else
OP_CompressMenu.setSelected( 2 );
}
else
{
OP_CompressLabel_Disabled.setVisible( true );
OP_CompressLabel.setVisible( false );
OP_CompressMenu.setActive( false );
OP_CompressMenu.setText( "None" );
}
if ( $FogCoordSupported )
{
OP_IntTexturedFogTgl.setValue( $pref::Interior::TexturedFog );
OP_IntTexturedFogTgl.setActive( true );
}
else
{
OP_IntTexturedFogTgl.setValue( true );
OP_IntTexturedFogTgl.setActive( false );
}
OP_AnisotropySlider.setValue( $pref::OpenGL::anisotropy );
OP_AnisotropySlider.setActive( $AnisotropySupported );
if ( $AnisotropySupported )
{
OP_AnisotropyLabel.setVisible( true );
OP_AnisotropyLabel_Disabled.setVisible( false );
}
else
{
OP_AnisotropyLabel_Disabled.setVisible( true );
OP_AnisotropyLabel.setVisible( false );
}
OP_EnvMapTgl.setValue($pref::environmentMaps);
OP_EnvMapTgl.setActive($pref::OpenGL::allowTexGen);
}
//------------------------------------------------------------------------------
function OptionsDlg::onSleep( %this )
{
OP_VideoDriverMenu.clear();
OP_ResMenu.clear();
OP_BPPMenu.clear();
OP_AudioProviderMenu.clear();
OP_AudioSpeakerMenu.clear();
OP_NetworkDisplayHud.uninit();
if ( %this.resetAudio )
{
echo( "Resetting the audio driver..." );
audioSetDriver( "none" );
audioSetDriver( $pref::Audio::activeDriver );
%this.resetAudio = "";
// Play the shell hum: (all sources are gone)
if($HudHandle[shellScreen] $= "")
alxStop($HudHandle[shellScreen]);
$HudHandle[shellScreen] = alxPlay(ShellScreenHumSound, 0, 0, 0);
}
if ( isObject( ServerConnection ) && isTextureFlushRequired() )
MessageBoxYesNo( "WARNING", "You have made changes that require Tribes 2 to flush the texture cache. "
@ "Doing this while the game is running can take a long time. "
@ "Do you wish to continue?",
"OptionsDlg.saveSettings();", "returnFromSettings();" );
else
%this.saveSettings();
}
//------------------------------------------------------------------------------
function isTextureFlushRequired()
{
if ( $pref::Interior::VertexLighting != OP_VertexLightTgl.getValue() )
return( true );
// We're using the noDrawArraysAlpha variable here because we've already
// gone gold (hard to add a new profiling variable). But the Voodoo2/3/3500
// cards that have the 256x256 texture limitation (in OpenGL) also have the
// noDrawArraysAlpha hack on...so that works out nice
%mipRange = $pref::OpenGL::noDrawArraysAlpha ? 4 : 5;
if ( $pref::OpenGL::mipReduction != 5 - mFloor( OP_ShapeTexSlider.getValue() * %mipRange ) )
return( true );
if ( $pref::OpenGL::interiorMipReduction != 5 - mFloor( OP_BuildingTexSlider.getValue() * %mipRange ) )
return( true );
if ( $pref::OpenGL::skyMipReduction != 5 - mFloor( OP_SkyTexSlider.getValue() * %mipRange ) )
return( true );
if ( $AnisotropySupported && $pref::OpenGL::anisotropy != OP_AnisotropySlider.getValue() )
return( true );
if ( !isDemo() )
{
%id = OP_TexQualityMenu.getSelected();
if ( $pref::OpenGL::forcePalettedTexture )
{
if ( %id != 1 )
return( true );
}
else if ( $pref::OpenGL::force16bittexture )
{
if ( %id != 2 )
return( true );
}
else if ( %id != 3 )
return( true );
}
if ( $TextureCompressionSupported && !$pref::OpenGL::disableARBTextureCompression )
{
%id = OP_CompressMenu.getSelected();
if ( $pref::OpenGL::allowCompression )
{
if ( $pref::OpenGL::compressionHint $= "GL_FASTEST" )
{
if ( %id != 2 )
return( true );
}
else if ( $pref::OpenGL::compressionHint $= "GL_NICEST" )
{
if ( %id != 3 )
return( true );
}
else if ( %id == 1 )
return( true );
}
else if ( %id > 1 )
return( true );
}
return( false );
}
//------------------------------------------------------------------------------
function returnFromSettings()
{
// to unpause singlePlayerGame when returning from options
if ( isObject( Game ) )
Game.OptionsDlgSleep();
}
//------------------------------------------------------------------------------
function OptionsDlg::saveSettings( %this )
{
// Save off any prefs that don't auto-update:
%flushTextures = false;
if ( $SwapIntervalSupported && OP_VSyncTgl.getValue() != $pref::Video::disableVerticalSync )
{
$pref::Video::disableVerticalSync = OP_VSyncTgl.getValue();
setVerticalSync( !$pref::Video::disableVerticalSync );
}
%temp = OP_SkyDetailMenu.getSelected();
if ( %temp == 5 )
$pref::SkyOn = false;
else
{
$pref::SkyOn = true;
$pref::numCloudLayers = ( 4 - %temp );
}
if ( $FogCoordSupported )
$pref::Interior::TexturedFog = OP_IntTexturedFogTgl.getValue();
if ( $pref::Interior::VertexLighting != OP_VertexLightTgl.getValue() )
{
$pref::Interior::VertexLighting = OP_VertexLightTgl.getValue();
%flushTextures = true;
}
%temp = OP_PlayerRenderMenu.getSelected();
$pref::Player::renderMyPlayer = %temp & 1;
$pref::Player::renderMyItems = %temp & 2;
if ( !isDemo() )
{
switch ( OP_TexQualityMenu.getSelected() )
{
case 1: // 8-bit
if ( !$pref::OpenGL::forcePalettedTexture || $pref::OpenGL::force16bittexture )
{
$pref::OpenGL::forcePalettedTexture = true;
$pref::OpenGL::force16bittexture = false;
%flushTextures = true;
}
case 2: // 16-bit
if ( $pref::OpenGL::forcePalettedTexture || !$pref::OpenGL::force16bittexture )
{
$pref::OpenGL::forcePalettedTexture = false;
$pref::OpenGL::force16bittexture = true;
%flushTextures = true;
}
case 3: // 32-bit
if ( $pref::OpenGL::forcePalettedTexture || $pref::OpenGL::force16bittexture )
{
$pref::OpenGL::forcePalettedTexture = false;
$pref::OpenGL::force16bittexture = false;
%flushTextures = true;
}
}
OP_TexQualityMenu.clear();
}
$pref::Terrain::texDetail = 6 - mFloor( OP_TerrainTexSlider.getValue() );
// We're using the noDrawArraysAlpha variable here because we've already
// gone gold (hard to add a new profiling variable). But the Voodoo2/3/3500
// cards that have the 256x256 texture limitation (in OpenGL) also have the
// noDrawArraysAlpha hack on...so that works out nice
%mipRange = $pref::OpenGL::noDrawArraysAlpha ? 4 : 5;
%temp = 5 - mFloor( OP_ShapeTexSlider.getValue() * %mipRange );
if ( $pref::OpenGL::mipReduction != %temp )
{
$pref::OpenGL::mipReduction = %temp;
setOpenGLMipReduction( $pref::OpenGL::mipReduction );
%flushTextures = true;
}
%temp = 5 - mFloor( OP_BuildingTexSlider.getValue() * %mipRange );
if ( $pref::OpenGL::interiorMipReduction != %temp )
{
$pref::OpenGL::interiorMipReduction = %temp;
setOpenGLInteriorMipReduction( $pref::OpenGL::interiorMipReduction );
%flushTextures = true;
}
%temp = 5 - mFloor( OP_SkyTexSlider.getValue() * %mipRange );
if ( $pref::OpenGL::skyMipReduction != %temp )
{
$pref::OpenGL::skyMipReduction = %temp;
setOpenGLSkyMipReduction( $pref::OpenGL::skyMipReduction );
%flushTextures = true;
}
if ( $TextureCompressionSupported && !$pref::OpenGL::disableARBTextureCompression )
{
%temp = OP_CompressMenu.getSelected();
if ( $pref::OpenGL::allowCompression )
{
switch ( %temp )
{
case 2:
if ( $pref::OpenGL::compressionHint !$= "GL_FASTEST" )
{
$pref::OpenGL::compressionHint = "GL_FASTEST";
setOpenGLTextureCompressionHint( $pref::OpenGL::compressionHint );
%flushTextures = true;
}
case 3:
if ( $pref::OpenGL::compressionHint !$= "GL_NICEST" )
{
$pref::OpenGL::compressionHint = "GL_NICEST";
setOpenGLTextureCompressionHint( $pref::OpenGL::compressionHint );
%flushTextures = true;
}
default: // None
$pref::OpenGL::allowCompression = false;
%flushTextures = true;
}
}
else if ( %temp > 1 )
{
$pref::OpenGL::allowCompression = true;
if ( %temp == 3 )
$pref::OpenGL::compressionHint = "GL_NICEST";
else
$pref::OpenGL::compressionHint = "GL_FASTEST";
setOpenGLTextureCompressionHint( $pref::OpenGL::compressionHint );
%flushTextures = true;
}
}
OP_CompressMenu.clear();
if ( $AnisotropySupported )
{
%temp = OP_AnisotropySlider.getValue();
if ( $pref::OpenGL::anisotropy != %temp )
{
$pref::OpenGL::anisotropy = %temp;
setOpenGLAnisotropy( $pref::OpenGL::anisotropy );
%flushTextures = true;
}
}
if ( !isDemo() )
{
if ( OP_HiResSkinTgl.getValue() != $pref::use512PlayerSkins )
{
$pref::use512PlayerSkins = OP_HiResSkinTgl.getValue();
if ( Canvas.getContent() == GameGui.getId() && GM_WarriorPane.isVisible() )
GMW_PlayerModel.update();
}
}
$pref::Terrain::screenError = $max_screenerror - mFloor( OP_TerrainSlider.getValue() );
$pref::TS::screenError = $max_TSScreenError - mFloor( OP_ShapeSlider.getValue() * ( $max_TSScreenError - $min_TSScreenError ) );
$pref::TS::detailAdjust = $min_TSDetailAdjust + OP_ShapeSlider.getValue() * ( $max_TSDetailAdjust - $min_TSDetailAdjust );
$pref::Shadows = OP_ShadowSlider.getValue();
$pref::ParticleDensity = 4.0 - OP_ParticleDensitySlider.getValue();
%val = 100 - OP_DynamicLightSlider.getValue();
$pref::Interior::DynamicLightsClipPix = $pref::Terrain::DynamicLightsClipPix = %val;
$pref::Interior::DynamicLightsFadePix = $pref::Terrain::DynamicLightsFadePix = 2 * %val;
setShadowDetailLevel( $pref::Shadows );
$pref::Interior::detailAdjust = OP_InteriorDetailSlider.getValue();
$pref::VisibleDistanceMod = OP_VisibleDistanceSlider.getValue();
$pref::Audio::musicVolume = OP_MusicVolumeSlider.getValue();
$pref::Audio::masterVolume = OP_MasterVolumeSlider.getValue();
$pref::Audio::effectsVolume = OP_EffectsVolumeSlider.getValue();
alxSetChannelVolume( $EffectAudioType, $pref::Audio::effectsVolume );
$pref::Audio::voiceVolume = OP_MicrophoneVolumeSlider.getValue();
alxSetChannelVolume( $VoiceAudioType, $pref::Audio::voiceVolume );
$pref::Audio::radioVolume = OP_VoiceBindVolumeSlider.getValue();
alxSetChannelVolume( $ChatAudioType, $pref::Audio::radioVolume );
$pref::Audio::guiVolume = OP_GuiVolumeSlider.getValue();
alxSetChannelVolume( $GuiAudioType, $pref::Audio::guiVolume);
$pref::Audio::captureGainScale = OP_InputBoostSlider.getValue();
if ( !$missionRunning )
MusicPlayer.stop();
if ( $pref::Audio::enableVoiceCapture )
{
%reinit = false;
%selId = OP_VoiceListenMenu.getSelected();
if ( $pref::Audio::decodingMask != %selId )
{
$pref::Audio::decodingMask = %selId;
%reinit = true;
}
%selId = OP_VoiceSendMenu.getSelected();
if ( $pref::Audio::encodingLevel != %selId )
{
$pref::Audio::encodingLevel = %selId;
%reinit = true;
}
if ( %reinit )
{
alxCaptureDestroy();
alxCaptureInit();
// If in a game, let the server know about the altered settings:
if ( isObject( ServerConnection ) )
commandToServer( 'SetVoiceInfo', $pref::Audio::voiceChannels, $pref::Audio::decodingMask, $pref::Audio::encodingLevel );
}
}
updateNetworkSettings();
$pref::Player::zoomSpeed = 500 - mFloor( OP_ZoomSpeedSlider.getValue() );
setZoomSpeed( $pref::Player::zoomSpeed );
$pref::Shell::LaunchGui = OP_LaunchScreenMenu.getText();
export( "$pref::*", "prefs/ClientPrefs.cs", false );
saveActiveMapFile();
if ( %flushTextures )
{
// Give the Options Dialog a chance to go away:
OptionsDlg.schedule( 0, doTextureFlush );
}
returnFromSettings();
}
//------------------------------------------------------------------------------
function OptionsDlg::doTextureFlush( %this )
{
MessagePopup( "PLEASE WAIT", "Flushing texture cache...\nThis may take a while" );
Canvas.repaint();
flushTextureCache();
CloseMessagePopup();
}
//------------------------------------------------------------------------------
function OptionsDlg::setPane( %this, %pane )
{
if((%this.pane $= "Sound") && !$missionRunning)
MusicPlayer.stop();
if ( %this.pane !$= "None" )
{
%paneCtrl = "OP_" @ %this.pane @ "Pane";
%paneCtrl.setVisible( false );
%tabCtrl = "OP_" @ %this.pane @ "Tab";
%tabCtrl.setValue( false );
}
%paneCtrl = "OP_" @ %pane @ "Pane";
%paneCtrl.setVisible( true );
%tabCtrl = "OP_" @ %pane @ "Tab";
%tabCtrl.setValue( true );
%this.pane = %pane;
}
//------------------------------------------------------------------------------
function OptionsDlg::applyGraphicChanges( %this )
{
%newDriver = OP_VideoDriverMenu.getText();
%newRes = OP_ResMenu.getText();
%newBpp = OP_BPPMenu.getText();
%newFullScreen = OP_FullScreenTgl.getValue();
if ( %newDriver !$= $pref::Video::displayDevice )
{
setDisplayDevice( %newDriver, firstWord( %newRes ), getWord( %newRes, 1 ), %newBpp, %newFullScreen );
OptionsDlg::deviceDependent( %this );
}
else
setScreenMode( firstWord( %newRes ), getWord( %newRes, 1 ), %newBpp, %newFullScreen );
OP_ApplyBtn.updateState();
}
//------------------------------------------------------------------------------
function OP_VideoDriverMenu::onSelect( %this, %id, %text )
{
// Attempt to keep the same res and bpp settings:
if ( OP_ResMenu.size() > 0 )
%prevRes = OP_ResMenu.getText();
else
%prevRes = getWords( $pref::Video::resolution, 0, 1 );
// Check if this device is full-screen only:
if ( isDeviceFullScreenOnly( %this.getText() ) )
{
OP_FullScreenTgl.setValue( true );
OP_FullScreenTgl.setActive( false );
OP_FullScreenTgl.onAction();
}
else
OP_FullScreenTgl.setActive( true );
if ( OP_FullScreenTgl.getValue() )
{
if ( OP_BPPMenu.size() > 0 )
%prevBPP = OP_BPPMenu.getText();
else
%prevBPP = getWord( $pref::Video::resolution, 2 );
}
// Fill the resolution and bit depth lists:
OP_ResMenu.init( %this.getText(), OP_FullScreenTgl.getValue() );
OP_BPPMenu.init( %this.getText() );
// Try to select the previous settings:
%selId = OP_ResMenu.findText( %prevRes );
if ( %selId == -1 )
%selId = 0;
OP_ResMenu.setSelected( %selId );
if ( OP_FullScreenTgl.getValue() )
{
%selId = OP_BPPMenu.findText( %prevBPP );
if ( %selId == -1 )
%selId = 0;
OP_BPPMenu.setSelected( %selId );
OP_BPPMenu.setText( OP_BPPMenu.getTextById( %selId ) );
}
else
OP_BPPMenu.setText( "Default" );
OP_ApplyBtn.updateState();
}
//------------------------------------------------------------------------------
function OP_ResMenu::init( %this, %device, %fullScreen )
{
%this.clear();
%resList = getResolutionList( %device );
%resCount = getFieldCount( %resList );
%deskRes = getDesktopResolution();
%count = 0;
for ( %i = 0; %i < %resCount; %i++ )
{
%res = getWords( getField( %resList, %i ), 0, 1 );
if ( !%fullScreen )
{
if ( firstWord( %res ) >= firstWord( %deskRes ) )
continue;
if ( getWord( %res, 1 ) >= getWord( %deskRes, 1 ) )
continue;
}
// Only add to list if it isn't there already:
if ( %this.findText( %res ) == -1 )
{
%this.add( %res, %count );
%count++;
}
}
}
//------------------------------------------------------------------------------
function OP_ResMenu::onSelect( %this, %id, %text )
{
OP_ApplyBtn.updateState();
}
//------------------------------------------------------------------------------
function OP_BPPMenu::init( %this, %device )
{
%this.clear();
if ( %device $= "Voodoo2" )
%this.add( "16", 0 );
else
{
%resList = getResolutionList( %device );
%resCount = getFieldCount( %resList );
%count = 0;
for ( %i = 0; %i < %resCount; %i++ )
{
%bpp = getWord( getField( %resList, %i ), 2 );
// Only add to list if it isn't there already:
if ( %this.findText( %bpp ) == -1 )
{
%this.add( %bpp, %count );
%count++;
}
}
}
}
//------------------------------------------------------------------------------
function OP_BPPMenu::onSelect( %this, %id, %text )
{
OP_ApplyBtn.updateState();
}
//------------------------------------------------------------------------------
function OP_FullScreenTgl::onAction( %this )
{
// Attempt to maintain current settings:
%selId = OP_ResMenu.getSelected();
if ( %selId == -1 )
%selId = 0;
%prevRes = OP_ResMenu.getTextById( %selId );
OP_ResMenu.init( OP_VideoDriverMenu.getText(), %this.getValue() );
%selId = OP_ResMenu.findText( %prevRes );
if ( %selId == -1 )
%selId = 0;
OP_ResMenu.setSelected( %selId );
if ( %this.getValue() )
{
%selId = OP_BPPMenu.findText( getWord( $pref::Video::resolution, 2 ) );
if ( %selId == - 1 )
%selId = 0;
OP_BPPMenu.setSelected( %selId );
OP_BPPMenu.setText( OP_BPPMenu.getTextById( %selId ) );
OP_BPPMenu.setActive( true );
}
else
{
OP_BPPMenu.setText( "Default" );
OP_BPPMenu.setActive( false );
}
OP_ApplyBtn.updateState();
}
//------------------------------------------------------------------------------
function OP_ApplyBtn::updateState( %this )
{
%active = false;
if ( OP_VideoDriverMenu.getText() !$= $pref::Video::displayDevice )
%active = true;
else if ( OP_ResMenu.getText() !$= getWords( $pref::Video::resolution, 0, 1 ) )
%active = true;
else if ( OP_FullScreenTgl.getValue() != $pref::Video::fullScreen )
%active = true;
else if ( OP_FullScreenTgl.getValue() )
{
if ( OP_BPPMenu.getText() !$= getWord( $pref::Video::resolution, 2 ) )
%active = true;
}
%this.setActive( %active );
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Graphics Settings:
//
function updateGammaCorrection()
{
$pref::OpenGL::gammaCorrection = OP_GammaSlider.getValue();
videoSetGammaCorrection( $pref::OpenGL::gammaCorrection );
}
//------------------------------------------------------------------------------
function updateTerrainDetail()
{
$pref::Terrain::screenError = $max_screenerror - mFloor( OP_TerrainSlider.getValue());
if ( OP_TerrainSlider.getValue() != $max_screenerror - $pref::Terrain::screenError )
OP_TerrainSlider.setValue( $max_screenerror - $pref::Terrain::screenError );
}
//------------------------------------------------------------------------------
function updateDynamicLightSliderState()
{
%on = $pref::Interior::DynamicLights || $pref::Terrain::dynamicLights;
OP_DynamicLightText.setVisible( %on );
OP_DynamicLightText_Disabled.setVisible( !%on );
OP_DynamicLightSlider.setActive( %on );
}
//------------------------------------------------------------------------------
function OP_SkyDetailMenu::init( %this )
{
%this.clear();
%this.add( "Full Sky", 1 );
%this.add( "Two Cloud Layers", 2 );
%this.add( "One Cloud Layer", 3 );
%this.add( "Sky Box Only", 4 );
%this.add( "No Sky", 5 );
}
//------------------------------------------------------------------------------
function OP_PlayerRenderMenu::init( %this )
{
%this.clear();
%this.add( "Player and Items", 3 );
%this.add( "Player only", 1 );
%this.add( "Items only", 2 );
%this.add( "Neither Player nor Items", 0 );
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Texture Settings:
//
function OP_CompressMenu::init( %this )
{
%this.clear();
%this.add( "None", 1 );
%this.add( "Fastest", 2 );
%this.add( "Nicest", 3 );
}
//------------------------------------------------------------------------------
function OP_TexQualityMenu::init( %this )
{
%this.clear();
if ( $PalettedTextureSupported )
%this.add( "Palletized", 1 );
%this.add( "16 bit", 2 );
%this.add( "32 bit", 3 );
}
//------------------------------------------------------------------------------
function OP_TexQualityMenu::onSelect( %this, %id, %text )
{
if ( %id == 1 )
{
// Disable these with palletized textures by default:
OP_EnvMapTgl.setValue( false );
//OP_EnvMapTgl.setActive( false );
OP_IntEnvMapTgl.setValue( false );
//OP_IntEnvMapTgl.setActive( false );
}
// else
// {
// OP_EnvMapTgl.setActive( true );
// OP_IntEnvMapTgl.setActive( true );
// }
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Audio Settings:
//
function setAudioProvider(%idx)
{
alxContexti(ALC_PROVIDER, %idx);
$pref::Audio::provider = alxGetContextstr(ALC_PROVIDER_NAME, %idx);
%active = audioIsEnvironmentProvider($pref::Audio::provider);
// unset tgl if cannot be environment provider
if(!%active)
OP_AudioEnvironmentTgl.setValue(false);
OP_AudioEnvironmentTgl.setActive(%active);
audioUpdateProvider($pref::Audio::provider);
OP_AudioProviderMenu.setSelected(%idx);
}
//------------------------------------------------------------------------------
function OP_AudioEnvironmentTgl::onAction(%this)
{
alxEnableEnvironmental(%this.getValue());
}
//------------------------------------------------------------------------------
function OP_AudioProviderMenu::onSelect(%this, %id, %text)
{
if(%id != $Audio::originalProvider)
{
if(!%this.seenWarning)
{
MessageBoxOK("Warning", "Changing sound drivers may result in incompatibilities and game oddities. If you experience such oddities, hit \"Reset\" to restore defaults.", "");
%this.seenWarning = true;
}
OP_AudioResetProvider.setActive(true);
}
setAudioProvider(%id);
}
//------------------------------------------------------------------------------
function OP_AudioResetProvider::onAction(%this)
{
setAudioProvider($Audio::originalProvider);
%this.setActive(false);
}
//------------------------------------------------------------------------------
function OP_AudioSpeakerMenu::onSelect(%this, %id, %text)
{
alxContexti(ALC_SPEAKER, %id);
$pref::Audio::speakerType = alxGetContextstr(ALC_SPEAKER_NAME, %id);
}
//------------------------------------------------------------------------------
function OP_AudioFrequencyMenu::init( %this )
{
%this.clear();
%this.add( "11 KHz", 0 );
%this.add( "22 KHz", 1 );
%this.add( "44 KHz", 2 );
switch ( $pref::Audio::frequency )
{
case 11025: %this.setSelected( 0 );
case 22050: %this.setSelected( 1 );
default: %this.setSelected( 2 );
}
}
//------------------------------------------------------------------------------
function OP_AudioFrequencyMenu::onSelect( %this, %id, %text )
{
switch ( %id )
{
case 0: %newVal = 11025;
case 1: %newVal = 22050;
default: %newVal = 44100;
}
if ( $pref::Audio::frequency != %newVal )
{
$pref::Audio::frequency = %newVal;
OptionsDlg.resetAudio = true;
}
}
//------------------------------------------------------------------------------
function OP_AudioBitRateMenu::init( %this )
{
%this.clear();
%this.add( "8 bit", 0 );
%this.add( "16 bit", 1 );
if ( $pref::Audio::sampleBits == 8 )
%this.setSelected( 0 );
else
%this.setSelected( 1 );
}
//------------------------------------------------------------------------------
function OP_AudioBitRateMenu::onSelect( %this, %id, %text )
{
%newVal = %id == 0 ? 8 : 16;
if ( $pref::Audio::sampleBits != %newVal )
{
$pref::Audio::sampleBits = %newVal;
OptionsDlg.resetAudio = true;
}
}
//------------------------------------------------------------------------------
function OP_AudioChannelsMenu::init( %this )
{
%this.clear();
%this.add( "One", 0 );
%this.add( "Two", 1 );
if ( $pref::Audio::channels == 1 )
%this.setSelected( 0 );
else
%this.setSelected( 1 );
}
//------------------------------------------------------------------------------
function OP_AudioChannelsMenu::onSelect( %this, %id, %text )
{
%newVal = %id == 0 ? 1 : 2;
if ( $pref::Audio::channels != %newVal )
{
$pref::Audio::channels = %newVal;
OptionsDlg.resetAudio = true;
}
}
//------------------------------------------------------------------------------
function OP_MusicTgl::onAction( %this )
{
%on = %this.getValue();
OP_MusicVolumeLabel.setVisible( %on );
OP_MusicVolumeLabel_Disabled.setVisible( !%on );
OP_MusicVolumeSlider.setActive( %on );
$pref::Audio::musicEnabled = %on;
if ( %on )
MusicPlayer.play();
else
MusicPlayer.stop();
}
//------------------------------------------------------------------------------
function updateMusicVolume()
{
%volume = OP_MusicVolumeSlider.getValue();
alxSetChannelVolume( $MusicAudioType, %volume );
}
//------------------------------------------------------------------------------
function updateGuiVolume()
{
%volume = OP_GuiVolumeSlider.getValue();
alxSetChannelVolume( $GuiAudioType, %volume );
}
//------------------------------------------------------------------------------
function updateMasterVolume()
{
%volume = OP_MasterVolumeSlider.getValue();
alxListenerf( AL_GAIN_LINEAR, %volume );
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Voice Settings:
//
function OP_MicrophoneEnabledTgl::onAction( %this )
{
%on = %this.getValue();
OP_RecordTestBtn.setActive( %on );
OP_MicVolumeLabel.setVisible( %on );
OP_MicVolumeLabel_Disabled.setVisible( !%on );
OP_MicrophoneVolumeSlider.setActive( %on );
OP_InputBoostLabel.setVisible( %on );
OP_InputBoostLabel_Disabled.setVisible( !%on );
OP_InputBoostSlider.setActive( %on );
OP_InputBoostPercentTxt.setVisible( %on );
OP_VoiceListenLabel.setVisible( %on );
OP_VoiceListenLabel_Disabled.setVisible( !%on );
OP_VoiceListenMenu.setActive( %on );
OP_VoiceSendLabel.setVisible( %on );
OP_VoiceSendLabel_Disabled.setVisible( !%on );
OP_VoiceSendMenu.setActive( %on );
if(%on != alxIsEnabled("capture"))
{
if(%on)
alxCaptureInit();
else
alxCaptureDestroy();
}
}
//------------------------------------------------------------------------------
function updateInputBoost()
{
%val = OP_InputBoostSlider.getValue();
alxSetCaptureGainScale( %val );
%val = mFloor(%val * 100);
OP_InputBoostPercentTxt.setValue(%val @ "%");
}
//------------------------------------------------------------------------------
function OP_RecordTestBtn::onAction( %this )
{
alxCaptureStart(true);
}
//------------------------------------------------------------------------------
function localCaptureStart( %method )
{
if(%method $= "record")
{
OP_RecordTestBtn.setActive(false);
OP_RecordTestBtn.setValue(">> Recording <<");
}
else
{
OP_RecordTestBtn.setActive(false);
OP_RecordTestBtn.setValue(">> Playing <<");
}
}
//------------------------------------------------------------------------------
function localCaptureStop( %method )
{
if(%method $= "play")
{
OP_RecordTestBtn.setActive(true);
OP_RecordTestBtn.setValue("Test Record");
}
}
//------------------------------------------------------------------------------
function OP_VoiceListenMenu::init( %this )
{
%this.clear();
%this.add( "<NONE>", 0 );
if ( $platform !$= "linux" ) {
%this.add( ".v12", 1 );
%this.add( ".v12 - .v24", 3 );
%this.add( ".v12 - .v29", 7 );
}
if ( $platform $= "linux" ) {
%this.add( "GSM" , 8 );
}
switch ( $pref::Audio::decodingMask )
{
case 0 or 3 or 7 or 8:
%this.setSelected( $pref::Audio::decodingMask );
default:
%this.setSelected( 1 );
}
}
//------------------------------------------------------------------------------
function OP_VoiceSendMenu::init( %this )
{
%this.clear();
if ( $platform !$= "linux" ) {
%this.add( ".v12", 0 );
%this.add( ".v24", 1 );
%this.add( ".v29", 2 );
}
if ( $platform $= "linux" ) {
%this.add( "GSM", 3 );
}
%this.setSelected($pref::Audio::encodingLevel);
}
function OP_VoiceCodecInfo::init( %this )
{
%headerStyle = "<font:" @ $ShellLabelFont @ ":" @ $ShellFontSize @ "><color:00DC00>";
if ( $platform $= "linux" ) {
%displayText = "<spush>" @ %headerStyle @ "Voice Codec Information:<spop>" NL
"\n" @
" GSM: fixed bitrate codec (6.6 kbits/sec linux only)" NL
"\n" @
"<bitmap:bullet_2><lmargin:24>" @
"Setting your codec levels too high can have adverse" @
" affects on network performance." @
"<lmargin:0>";
} else {
%displayText = "<spush>" @ %headerStyle @ "Voice Codec Information:<spop>" NL
"\n" @
" .v12: variable bitrate codec (~1.2 kbits/sec win only)" NL
" .v24: fixed bitrate codec (2.4 kbits/sec win only)" NL
" .v29: fixed bitrate codec (2.9 kbits/sec win only)" NL
"\n" @
"<bitmap:bullet_2><lmargin:24>" @
"Setting your codec levels too high can have adverse" @
" affects on network performance." @
"<lmargin:0>";
}
%this.setText(%displayText);
%this.setActive(false);
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Driver Info dialog:
//
function DriverInfoDlg::onWake( %this )
{
%headerStyle = "<font:" @ $ShellLabelFont @ ":" @ $ShellFontSize @ "><color:00DC00>";
%infoString = getVideoDriverInfo();
%displayText = "<spush>" @ %headerStyle @ "VENDOR:<spop>" NL
" " @ getField( %infoString, 0 ) NL
"<spush>" @ %headerStyle @ "RENDERER:<spop>" NL
" " @ getField( %infoString, 1 ) NL
"<spush>" @ %headerStyle @ "VERSION<spop> " @ getField( %infoString, 2 ) NL
"\n" @
"<spush>" @ %headerStyle @ "SUPPORTED OPENGL EXTENSIONS:<spop><lmargin:5><just:center>" NL
getField( %infoString, 3 );
DriverInfoText.setText( %displayText );
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Control remapper section:
//
$RemapCount = 0;
$RemapName[$RemapCount] = "Forward";
$RemapCmd[$RemapCount] = "moveforward";
$RemapCount++;
$RemapName[$RemapCount] = "Backward";
$RemapCmd[$RemapCount] = "movebackward";
$RemapCount++;
$RemapName[$RemapCount] = "Strafe Left";
$RemapCmd[$RemapCount] = "moveleft";
$RemapCount++;
$RemapName[$RemapCount] = "Strafe Right";
$RemapCmd[$RemapCount] = "moveright";
$RemapCount++;
$RemapName[$RemapCount] = "Turn Left";
$RemapCmd[$RemapCount] = "turnLeft";
$RemapCount++;
$RemapName[$RemapCount] = "Turn Right";
$RemapCmd[$RemapCount] = "turnRight";
$RemapCount++;
$RemapName[$RemapCount] = "Look Up";
$RemapCmd[$RemapCount] = "panUp";
$RemapCount++;
$RemapName[$RemapCount] = "Look Down";
$RemapCmd[$RemapCount] = "panDown";
$RemapCount++;
$RemapName[$RemapCount] = "Jump";
$RemapCmd[$RemapCount] = "jump";
$RemapCount++;
$RemapName[$RemapCount] = "Jet Pack";
$RemapCmd[$RemapCount] = "mouseJet";
$RemapCount++;
$RemapName[$RemapCount] = "Fire Weapon";
$RemapCmd[$RemapCount] = "mouseFire";
$RemapCount++;
$RemapName[$RemapCount] = "Zoom";
$RemapCmd[$RemapCount] = "toggleZoom";
$RemapCount++;
$RemapName[$RemapCount] = "Cycle Zoom Level";
$RemapCmd[$RemapCount] = "setZoomFOV";
$RemapCount++;
$RemapName[$RemapCount] = "Weapon Slot One";
$RemapCmd[$RemapCount] = "useFirstWeaponSlot";
$RemapCount++;
$RemapName[$RemapCount] = "Weapon Slot Two";
$RemapCmd[$RemapCount] = "useSecondWeaponSlot";
$RemapCount++;
$RemapName[$RemapCount] = "Weapon Slot Three";
$RemapCmd[$RemapCount] = "useThirdWeaponSlot";
$RemapCount++;
$RemapName[$RemapCount] = "Weapon Slot Four";
$RemapCmd[$RemapCount] = "useFourthWeaponSlot";
$RemapCount++;
$RemapName[$RemapCount] = "Weapon Slot Five";
$RemapCmd[$RemapCount] = "useFifthWeaponSlot";
$RemapCount++;
$RemapName[$RemapCount] = "Weapon Slot Six";
$RemapCmd[$RemapCount] = "useSixthWeaponSlot";
$RemapCount++;
$RemapName[$RemapCount] = "Blaster";
$RemapCmd[$RemapCount] = "useBlaster";
$RemapCount++;
$RemapName[$RemapCount] = "Plasma Rifle";
$RemapCmd[$RemapCount] = "usePlasma";
$RemapCount++;
$RemapName[$RemapCount] = "Chaingun";
$RemapCmd[$RemapCount] = "useChaingun";
$RemapCount++;
$RemapName[$RemapCount] = "Spinfusor";
$RemapCmd[$RemapCount] = "useDisc";
$RemapCount++;
$RemapName[$RemapCount] = "Grenade Launcher";
$RemapCmd[$RemapCount] = "useGrenadeLauncher";
$RemapCount++;
$RemapName[$RemapCount] = "Laser Rifle";
$RemapCmd[$RemapCount] = "useSniperRifle";
$RemapCount++;
$RemapName[$RemapCount] = "ELF Projector";
$RemapCmd[$RemapCount] = "useELFGun";
$RemapCount++;
$RemapName[$RemapCount] = "Fusion Mortar";
$RemapCmd[$RemapCount] = "useMortar";
$RemapCount++;
$RemapName[$RemapCount] = "Missile Launcher";
$RemapCmd[$RemapCount] = "useMissileLauncher";
$RemapCount++;
$RemapName[$RemapCount] = "Shocklance";
$RemapCmd[$RemapCount] = "useShockLance";
$RemapCount++;
$RemapName[$RemapCount] = "Targeting Laser";
$RemapCmd[$RemapCount] = "useTargetingLaser";
$RemapCount++;
$RemapName[$RemapCount] = "Previous Weapon";
$RemapCmd[$RemapCount] = "prevWeapon";
$RemapCount++;
$RemapName[$RemapCount] = "Next Weapon";
$RemapCmd[$RemapCount] = "nextWeapon";
$RemapCount++;
$RemapName[$RemapCount] = "Throw Grenade";
$RemapCmd[$RemapCount] = "throwGrenade";
$RemapCount++;
$RemapName[$RemapCount] = "Place Mine";
$RemapCmd[$RemapCount] = "placeMine";
$RemapCount++;
$RemapName[$RemapCount] = "Use Pack";
$RemapCmd[$RemapCount] = "useBackpack";
$RemapCount++;
$RemapName[$RemapCount] = "Use Health Kit";
$RemapCmd[$RemapCount] = "useRepairKit";
$RemapCount++;
$RemapName[$RemapCount] = "Deploy Beacon";
$RemapCmd[$RemapCount] = "placeBeacon";
$RemapCount++;
$RemapName[$RemapCount] = "Inventory";
$RemapCmd[$RemapCount] = "toggleInventoryHud";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 1";
$RemapCmd[$RemapCount] = "selectFavorite1";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 2";
$RemapCmd[$RemapCount] = "selectFavorite2";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 3";
$RemapCmd[$RemapCount] = "selectFavorite3";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 4";
$RemapCmd[$RemapCount] = "selectFavorite4";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 5";
$RemapCmd[$RemapCount] = "selectFavorite5";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 6";
$RemapCmd[$RemapCount] = "selectFavorite6";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 7";
$RemapCmd[$RemapCount] = "selectFavorite7";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 8";
$RemapCmd[$RemapCount] = "selectFavorite8";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 9";
$RemapCmd[$RemapCount] = "selectFavorite9";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 10";
$RemapCmd[$RemapCount] = "selectFavorite10";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 11";
$RemapCmd[$RemapCount] = "selectFavorite11";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 12";
$RemapCmd[$RemapCount] = "selectFavorite12";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 13";
$RemapCmd[$RemapCount] = "selectFavorite13";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 14";
$RemapCmd[$RemapCount] = "selectFavorite14";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 15";
$RemapCmd[$RemapCount] = "selectFavorite15";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 16";
$RemapCmd[$RemapCount] = "selectFavorite16";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 17";
$RemapCmd[$RemapCount] = "selectFavorite17";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 18";
$RemapCmd[$RemapCount] = "selectFavorite18";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 19";
$RemapCmd[$RemapCount] = "selectFavorite19";
$RemapCount++;
$RemapName[$RemapCount] = "Favorite 20";
$RemapCmd[$RemapCount] = "selectFavorite20";
$RemapCount++;
$RemapName[$RemapCount] = "Select Energy Pack";
$RemapCmd[$RemapCount] = "quickPackEnergyPack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Repair Pack";
$RemapCmd[$RemapCount] = "quickPackRepairPack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Shield Pack";
$RemapCmd[$RemapCount] = "quickPackShieldPack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Cloaking Pack";
$RemapCmd[$RemapCount] = "quickPackCloakPack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Sensor Jammer";
$RemapCmd[$RemapCount] = "quickPackJammerPack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Ammo Pack";
$RemapCmd[$RemapCount] = "quickPackAmmoPack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Satchel Charge";
$RemapCmd[$RemapCount] = "quickPackSatchelCharge";
$RemapCount++;
$RemapName[$RemapCount] = "Select Inv Station";
$RemapCmd[$RemapCount] = "quickPackDeployableStation";
$RemapCount++;
$RemapName[$RemapCount] = "Select Spider Turret";
$RemapCmd[$RemapCount] = "quickPackIndoorTurret";
$RemapCount++;
$RemapName[$RemapCount] = "Select Landspike Turret";
$RemapCmd[$RemapCount] = "quickPackOutdoorTurret";
$RemapCount++;
$RemapName[$RemapCount] = "Select Motion Sensor";
$RemapCmd[$RemapCount] = "quickPackMotionSensor";
$RemapCount++;
$RemapName[$RemapCount] = "Select Deploy Pulse";
$RemapCmd[$RemapCount] = "quickPackPulse";
$RemapCount++;
$RemapName[$RemapCount] = "Select Plasma Barrel";
$RemapCmd[$RemapCount] = "quickPackPlasmaBarrel";
$RemapCount++;
$RemapName[$RemapCount] = "Select Missile Barrel";
$RemapCmd[$RemapCount] = "quickPackMissileBarrel";
$RemapCount++;
$RemapName[$RemapCount] = "Select AA Barrel";
$RemapCmd[$RemapCount] = "quickPackAABarrel";
$RemapCount++;
$RemapName[$RemapCount] = "Select Mortar Barrel";
$RemapCmd[$RemapCount] = "quickPackMortarBarrel";
$RemapCount++;
$RemapName[$RemapCount] = "Select Elf Barrel";
$RemapCmd[$RemapCount] = "quickPackElfBarrel";
$RemapCount++;
$RemapName[$RemapCount] = "Select Grenade";
$RemapCmd[$RemapCount] = "quickPackGrenade";
$RemapCount++;
$RemapName[$RemapCount] = "Select Flash Grenade";
$RemapCmd[$RemapCount] = "quickPackFlashGrenade";
$RemapCount++;
$RemapName[$RemapCount] = "Select Concussion";
$RemapCmd[$RemapCount] = "quickPackConcussionGrenade";
$RemapCount++;
$RemapName[$RemapCount] = "Select Camera";
$RemapCmd[$RemapCount] = "quickPackCameraGrenade";
$RemapCount++;
$RemapName[$RemapCount] = "Select Flare Grenade";
$RemapCmd[$RemapCount] = "quickPackFlareGrenade";
$RemapCount++;
$RemapName[$RemapCount] = "Command Circuit";
$RemapCmd[$RemapCount] = "toggleCommanderMap";
$RemapCount++;
$RemapName[$RemapCount] = "Toggle Task List";
$RemapCmd[$RemapCount] = "toggleTaskListDlg";
$RemapCount++;
$RemapName[$RemapCount] = "Accept Task";
$RemapCmd[$RemapCount] = "fnAcceptTask";
$RemapCount++;
$RemapName[$RemapCount] = "Decline Task";
$RemapCmd[$RemapCount] = "fnDeclineTask";
$RemapCount++;
$RemapName[$RemapCount] = "Task Completed";
$RemapCmd[$RemapCount] = "fnTaskCompleted";
$RemapCount++;
$RemapName[$RemapCount] = "Reset Task List";
$RemapCmd[$RemapCount] = "fnResetTaskList";
$RemapCount++;
$RemapName[$RemapCount] = "Vote Yes";
$RemapCmd[$RemapCount] = "voteYes";
$RemapCount++;
$RemapName[$RemapCount] = "Vote No";
$RemapCmd[$RemapCount] = "voteNo";
$RemapCount++;
$RemapName[$RemapCount] = "Voice Chat Menu";
$RemapCmd[$RemapCount] = "activateChatMenuHud";
$RemapCount++;
$RemapName[$RemapCount] = "Global Chat";
$RemapCmd[$RemapCount] = "ToggleMessageHud";
$RemapCount++;
$RemapName[$RemapCount] = "Team Chat";
$RemapCmd[$RemapCount] = "TeamMessageHud";
$RemapCount++;
$RemapName[$RemapCount] = "Resize Chat Hud";
$RemapCmd[$RemapCount] = "resizeChatHud";
$RemapCount++;
$RemapName[$RemapCount] = "Toggle Microphone";
$RemapCmd[$RemapCount] = "voiceCapture";
$RemapCount++;
$RemapName[$RemapCount] = "Toggle Help Text";
$RemapCmd[$RemapCount] = "toggleHelpGui";
$RemapCount++;
$RemapName[$RemapCount] = "Score Screen";
$RemapCmd[$RemapCount] = "toggleScoreScreen";
$RemapCount++;
$RemapName[$RemapCount] = "Free Look";
$RemapCmd[$RemapCount] = "toggleFreeLook";
$RemapCount++;
$RemapName[$RemapCount] = "Exterior View";
$RemapCmd[$RemapCount] = "toggleFirstPerson";
$RemapCount++;
$RemapName[$RemapCount] = "Drop Weapon";
$RemapCmd[$RemapCount] = "throwWeapon";
$RemapCount++;
$RemapName[$RemapCount] = "Drop Pack";
$RemapCmd[$RemapCount] = "throwPack";
$RemapCount++;
$RemapName[$RemapCount] = "Drop Flag";
$RemapCmd[$RemapCount] = "throwFlag";
$RemapCount++;
$RemapName[$RemapCount] = "Suicide";
$RemapCmd[$RemapCount] = "suicide";
$RemapCount++;
$RemapName[$RemapCount] = "Toggle Personal Wypts";
$RemapCmd[$RemapCount] = "toggleHudWaypoints";
$RemapCount++;
$RemapName[$RemapCount] = "Toggle Mission Wypts";
$RemapCmd[$RemapCount] = "toggleHudMarkers";
$RemapCount++;
$RemapName[$RemapCount] = "Toggle Beacons";
$RemapCmd[$RemapCount] = "toggleHudTargets";
$RemapCount++;
$RemapName[$RemapCount] = "Toggle Commands";
$RemapCmd[$RemapCount] = "toggleHudCommands";
$RemapCount++;
$RemapName[$RemapCount] = "Construction Tool";
$RemapCmd[$RemapCount] = "useConstructionTool";
$RemapCount++;
// Construction
$RemapName[$RemapCount] = "Select Light Support Beam";
$RemapCmd[$RemapCount] = "quickPackLightSupportBeam";
$RemapCount++;
$RemapName[$RemapCount] = "Select Light Walkway";
$RemapCmd[$RemapCount] = "quickPackLightWalkway";
$RemapCount++;
$RemapName[$RemapCount] = "Select Light Blast Wall";
$RemapCmd[$RemapCount] = "quickPackLightBlastWall";
$RemapCount++;
$RemapName[$RemapCount] = "Select Medium Support Beam";
$RemapCmd[$RemapCount] = "quickPackMediumSupportBeam";
$RemapCount++;
$RemapName[$RemapCount] = "Select Medium Floor";
$RemapCmd[$RemapCount] = "quickPackMediumFloor";
$RemapCount++;
//$RemapName[$RemapCount] = "Select Disc Turret";
//$RemapCmd[$RemapCount] = "quickPackDiscTurret";
//$RemapCount++;
$RemapName[$RemapCount] = "Select Large Inventory Station";
$RemapCmd[$RemapCount] = "quickPackLargeInventoryStation";
$RemapCount++;
$RemapName[$RemapCount] = "Select Generator Pack";
$RemapCmd[$RemapCount] = "quickPackGeneratorPack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Solar Panel Pack";
$RemapCmd[$RemapCount] = "quickPackSolarPanelPack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Switch Pack";
$RemapCmd[$RemapCount] = "quickPackSwitchPack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Medium Sensor Pack";
$RemapCmd[$RemapCount] = "quickPackMediumSensorPack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Large Sensor Pack";
$RemapCmd[$RemapCount] = "quickPackLargeSensorPack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Teleport Pad";
$RemapCmd[$RemapCount] = "quickPackTeleportPad";
$RemapCount++;
$RemapName[$RemapCount] = "Select Deployable Turret Base";
$RemapCmd[$RemapCount] = "quickPackDeployableTurretBase";
$RemapCount++;
$RemapName[$RemapCount] = "Select Energizer";
$RemapCmd[$RemapCount] = "quickPackEnergizer";
$RemapCount++;
$RemapName[$RemapCount] = "Select Tree Pack";
$RemapCmd[$RemapCount] = "quickPackTreePack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Crate Pack";
$RemapCmd[$RemapCount] = "quickPackCratePack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Decoration Pack";
$RemapCmd[$RemapCount] = "quickPackDecorationPack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Light Pack";
$RemapCmd[$RemapCount] = "quickPackLightPack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Tripwire Pack";
$RemapCmd[$RemapCount] = "quickPackTripwirePack";
$RemapCount++;
$RemapName[$RemapCount] = "Select Logo Projector Pack";
$RemapCmd[$RemapCount] = "quickPackLogoProjectorPack";
$RemapCount++;
//$RemapName[$RemapCount] = "Select Laser Turret";
//$RemapCmd[$RemapCount] = "quickPackLaserTurret";
//$RemapCount++;
$RemapName[$RemapCount] = "Select Missile Rack Turret";
$RemapCmd[$RemapCount] = "quickPackMissileRackTurret";
$RemapCount++;
$RemapName[$RemapCount] = "Select Force Field";
$RemapCmd[$RemapCount] = "quickPackForceField";
$RemapCount++;
$RemapName[$RemapCount] = "Select Gravity Field";
$RemapCmd[$RemapCount] = "quickPackGravityField";
$RemapCount++;
$RemapName[$RemapCount] = "Select Jump Pad";
$RemapCmd[$RemapCount] = "quickPackJumpPad";
$RemapCount++;
$RemapName[$RemapCount] = "Select Escape Pod";
$RemapCmd[$RemapCount] = "quickPackEscapePod";
$RemapCount++;
$RemapName[$RemapCount] = "Pack Setting: Fwd";
$RemapCmd[$RemapCount] = "cyclePackFwd";
$RemapCount++;
$RemapName[$RemapCount] = "Pack Setting: Back";
$RemapCmd[$RemapCount] = "cyclePackBack";
$RemapCount++;
$RemapName[$RemapCount] = "Pack Setting: FFwd";
$RemapCmd[$RemapCount] = "cyclePackFFwd";
$RemapCount++;
$RemapName[$RemapCount] = "Pack Setting: FBack";
$RemapCmd[$RemapCount] = "cyclePackFBack";
$RemapCount++;
$RemapName[$RemapCount] = "Emote: Sit Down";
$RemapCmd[$RemapCount] = "emoteSitDown";
$RemapCount++;
$RemapName[$RemapCount] = "Emote: Squat";
$RemapCmd[$RemapCount] = "emoteSquat";
$RemapCount++;
$RemapName[$RemapCount] = "Emote: Jig";
$RemapCmd[$RemapCount] = "emoteJig";
$RemapCount++;
$RemapName[$RemapCount] = "Emote: Lie Down";
$RemapCmd[$RemapCount] = "emoteLieDown";
$RemapCount++;
$RemapName[$RemapCount] = "Emote: Heart Attack";
$RemapCmd[$RemapCount] = "emoteHeartAttack";
$RemapCount++;
$RemapName[$RemapCount] = "Emote: Sucker Punched";
$RemapCmd[$RemapCount] = "emoteSuckerPunched";
$RemapCount++;
$quickPackExtrasBind = true;
// End Construction
if ( !isDemo() )
{
$RemapName[$RemapCount] = "Start Demo Record";
$RemapCmd[$RemapCount] = "startRecordingDemo";
$RemapCount++;
$RemapName[$RemapCount] = "Stop Demo Record";
$RemapCmd[$RemapCount] = "stopRecordingDemo";
$RemapCount++;
}
$RemapName[$RemapCount] = "Chat Page Up";
$RemapCmd[$RemapCount] = "pageMessageHudUp";
$RemapCount++;
$RemapName[$RemapCount] = "Chat Page Down";
$RemapCmd[$RemapCount] = "pageMessageHudDown";
$RemapCount++;
$RemapName[$RemapCount] = "Toggle Net Meter";
$RemapCmd[$RemapCount] = "toggleNetDisplayHud";
$RemapCount++;
$ObsRemapCount = 0;
$ObsRemapName[$ObsRemapCount] = "Move Up";
$ObsRemapCmd[$ObsRemapCount] = "moveup";
$ObsRemapCount++;
$ObsRemapName[$ObsRemapCount] = "Move Down";
$ObsRemapCmd[$ObsRemapCount] = "movedown";
$ObsRemapCount++;
$ObsRemapName[$ObsRemapCount] = "Toggle Observer Mode";
$ObsRemapCmd[$ObsRemapCount] = "jump";
$ObsRemapCount++;
$ObsRemapName[$ObsRemapCount] = "Spawn/Previous";
$ObsRemapCmd[$ObsRemapCount] = "mouseFire";
$ObsRemapCount++;
$ObsRemapName[$ObsRemapCount] = "Cycle Camera/Next";
$ObsRemapCmd[$ObsRemapCount] = "mouseJet";
$ObsRemapCount++;
//------------------------------------------------------------------------------
function restoreDefaultMappings()
{
moveMap.delete();
exec( "scripts/controlDefaults.cs" );
$pref::Input::ActiveConfig = "MyConfig";
OP_RemapList.fillList();
}
//------------------------------------------------------------------------------
function isMapFile( %file )
{
%fObject = new FileObject();
if ( !%fObject.openForRead( %file ) )
return( false );
while ( !%fObject.isEOF() )
{
%line = %fObject.readLine();
if ( %line $= "// Tribes 2 Input Map File" )
{
%fObject.close();
return( true );
}
}
%fObject.close();
return( false );
}
//------------------------------------------------------------------------------
function isValidMapFileSaveName( %file )
{
if (isDemo())
%basePath = "demo_base/";
else
%basePath = "base/";
if ( !isWriteableFileName( %basePath @ %file ) )
return( false );
if ( isFile( %file ) )
return( isMapFile( %file ) );
return( true );
}
//------------------------------------------------------------------------------
function loadMapFile( %filename )
{
exec( "prefs/" @ %filename @ ".cs" );
$pref::Input::ActiveConfig = %filename;
OP_RemapList.fillList();
}
//------------------------------------------------------------------------------
function saveActiveMapFile()
{
if ( isValidMapFileSaveName( "prefs/" @ $pref::Input::ActiveConfig @ ".cs" ) )
saveMapFile( $pref::Input::ActiveConfig );
else
ShellGetSaveFilename( "SAVE CONTROL CONFIG", "prefs/*.cs", "isMapFile", "saveMapFile", "" );
}
//------------------------------------------------------------------------------
function saveMapFile( %filename )
{
if ( strcspn( %filename, "\\/?*\"\'<>|" ) < strlen( %filename ) )
{
MessageBoxOK( "SAVE FAILED", "Filenames may not contain any of the following characters:" NL "\\ / ? * < > \" \' |",
"ShellGetSaveFilename( \"SAVE CONTROL CONFIG\", \"prefs/*.cs\", \"isMapFile\", \"saveMapFile\", $pref::Input::ActiveConfig );" );
return;
}
if (isDemo())
%basePath = "demo_base/";
else
%basePath = "base/";
%mapFile = "prefs/" @ %filename @ ".cs";
if ( !isWriteableFileName( %basePath @ %mapFile ) )
{
MessageBoxOK( "SAVE FAILED", "That is not a writeable file name. Please choose another file name.",
"ShellGetSaveFilename( \"SAVE CONTROL CONFIG\", \"prefs/*.cs\", \"isMapFile\", \"saveMapFile\", $pref::Input::ActiveConfig );" );
return;
}
if ( isFile( %mapFile ) && !isMapFile( %mapFile ) )
{
MessageBoxOK( "SAVE FAILED", "A file of that name already exists and is not an input configuration file. Please choose another file name.",
"ShellGetSaveFilename( \"SAVE CONTROL CONFIG\", \"prefs/*.cs\", \"isMapFile\", \"saveMapFile\", $pref::Input::ActiveConfig );" );
return;
}
moveMap.save( %mapFile );
// Append the observer action map:
observerMap.save( %mapFile, true );
// Write out the console toggle key:
%fObject = new FileObject();
if ( %fObject.openForAppend( %mapFile ) )
{
%bind = GlobalActionMap.getBinding( "toggleConsole" );
if ( %bind !$= "" )
{
%fObject.writeLine( "GlobalActionMap.bind(keyboard, \"" @ getField( %bind, 1 ) @ "\", toggleConsole);" );
%fObject.close();
}
}
%fObject.delete();
$pref::Input::ActiveConfig = %filename;
}
//------------------------------------------------------------------------------
function getMapDisplayName( %device, %action )
{
if ( %device $= "keyboard" )
return( %action );
else if ( strstr( %device, "mouse" ) != -1 )
{
// Substitute "mouse" for "button" in the action string:
%pos = strstr( %action, "button" );
if ( %pos != -1 )
{
%mods = getSubStr( %action, 0, %pos );
%object = getSubStr( %action, %pos, 1000 );
%instance = getSubStr( %object, strlen( "button" ), 1000 );
return( %mods @ "mouse" @ ( %instance + 1 ) );
}
else
error( "Mouse input object other than button passed to getDisplayMapName!" );
}
else if ( strstr( %device, "joystick" ) != -1 )
{
// Substitute "joystick" for "button" in the action string:
%pos = strstr( %action, "button" );
if ( %pos != -1 )
{
%mods = getSubStr( %action, 0, %pos );
%object = getSubStr( %action, %pos, 1000 );
%instance = getSubStr( %object, strlen( "button" ), 1000 );
return( %mods @ "joystick" @ ( %instance + 1 ) );
}
else
{
%pos = strstr( %action, "pov" );
if ( %pos != -1 )
{
%wordCount = getWordCount( %action );
%mods = %wordCount > 1 ? getWords( %action, 0, %wordCount - 2 ) @ " " : "";
%object = getWord( %action, %wordCount - 1 );
switch$ ( %object )
{
case "upov": %object = "POV1 up";
case "dpov": %object = "POV1 down";
case "lpov": %object = "POV1 left";
case "rpov": %object = "POV1 right";
case "upov2": %object = "POV2 up";
case "dpov2": %object = "POV2 down";
case "lpov2": %object = "POV2 left";
case "rpov2": %object = "POV2 right";
default: %object = "??";
}
return( %mods @ %object );
}
else
error( "Unsupported Joystick input object passed to getDisplayMapName!" );
}
}
return( "??" );
}
//------------------------------------------------------------------------------
function buildFullMapString( %index )
{
switch$ ( OP_ControlsPane.group )
{
case "Observer":
%actionMap = observerMap;
%name = $ObsRemapName[%index];
%cmd = $ObsRemapCmd[%index];
default:
%actionMap = moveMap;
%name = $RemapName[%index];
%cmd = $RemapCmd[%index];
}
%temp = %actionMap.getBinding( %cmd );
%device = getField( %temp, 0 );
%object = getField( %temp, 1 );
if ( %device !$= "" && %object !$= "" )
%mapString = getMapDisplayName( %device, %object );
else
%mapString = "";
return( %name TAB %mapString );
}
//------------------------------------------------------------------------------
function OP_ControlGroupMenu::init( %this )
{
%selId = %this.getSelected();
%this.clear();
%this.add( "Main", 0 );
%this.add( "Observer", 1 );
%this.setSelected( %selId );
%this.onSelect( %selId, %this.getTextById( %selId ) );
}
//------------------------------------------------------------------------------
function OP_ControlGroupMenu::onSelect( %this, %id, %text )
{
OP_ControlsPane.group = %text;
OP_RemapList.fillList();
}
//------------------------------------------------------------------------------
function OP_RemapList::fillList( %this )
{
switch$ ( OP_ControlsPane.group )
{
case "Observer": %count = $ObsRemapCount;
default: %count = $RemapCount;
}
%this.clear();
for ( %i = 0; %i < %count; %i++ )
%this.addRow( %i, buildFullMapString( %i ) );
// Set the console key:
%bind = GlobalActionMap.getBinding( "toggleConsole" );
OP_ConsoleKeyBtn.setValue( getField( %bind, 1 ) );
}
//------------------------------------------------------------------------------
function OP_RemapList::onDeleteKey( %this, %rowId )
{
switch$ ( OP_ControlsPane.group )
{
case "Observer":
%actionMap = observerMap;
%cmd = $ObsRemapCmd[%rowId];
default:
%actionMap = moveMap;
%cmd = $RemapCmd[%rowId];
}
clearMapping( %actionMap, %cmd );
%this.setRowById( %rowId, buildFullMapString( %rowId ) );
}
//------------------------------------------------------------------------------
function OP_RemapList::doRemap( %this )
{
%selId = %this.getSelectedId();
switch$ ( OP_ControlsPane.group )
{
case "Observer": %name = $ObsRemapName[%selId];
default: %name = $RemapName[%selId];
}
RemapFrame.setTitle( "REMAP \"" @ %name @ "\"" );
RemapInputCtrl.mode = "move";
RemapInputCtrl.index = %selId;
Canvas.pushDialog( RemapDlg );
}
//------------------------------------------------------------------------------
function OP_ConsoleKeyBtn::doRemap( %this )
{
RemapFrame.setTitle( "REMAP \"Toggle Console\"" );
RemapInputCtrl.mode = "consoleKey";
RemapInputCtrl.index = 0;
Canvas.pushDialog( RemapDlg );
}
//------------------------------------------------------------------------------
function RemapDlg::onWake( %this )
{
$enableDirectInput = "1";
activateDirectInput();
if ( RemapInputCtrl.mode $= "consoleKey" )
RemapText.setText( "<just:center>Press a key to assign it to this action" NL "or Esc to cancel..." );
else
RemapText.setText( "<just:center>Press a key or button to assign it to this action" NL "or Esc to cancel..." );
}
//------------------------------------------------------------------------------
function RemapDlg::onSleep( %this )
{
$enableDirectInput = "1";
deactivateDirectInput();
}
//------------------------------------------------------------------------------
function findRemapCmdIndex( %command )
{
switch$ ( OP_ControlsPane.group )
{
case "Observer":
for ( %i = 0; %i < $ObsRemapCount; %i++ )
{
if ( %command $= $ObsRemapCmd[%i] )
return( %i );
}
default:
for ( %i = 0; %i < $RemapCount; %i++ )
{
if ( %command $= $RemapCmd[%i] )
return( %i );
}
}
return( -1 );
}
//------------------------------------------------------------------------------
function clearMapping( %actionMap, %cmd )
{
%fullMapString = %actionMap.getBinding( %cmd );
%mapCount = getRecordCount( %fullMapString );
for ( %i = 0; %i < %mapCount; %i++ )
{
%temp = getRecord( %fullMapString, %i );
%actionMap.unbind( getField( %temp, 0 ), getField( %temp, 1 ) );
}
}
//------------------------------------------------------------------------------
function redoMapping( %actionMap, %device, %action, %cmd, %oldIndex, %newIndex )
{
//%actionMap.bind( %device, %action, $RemapCmd[%newIndex] );
%actionMap.bind( %device, %action, %cmd );
OP_RemapList.setRowById( %oldIndex, buildFullMapString( %oldIndex ) );
OP_RemapList.setRowById( %newIndex, buildFullMapString( %newIndex ) );
}
//------------------------------------------------------------------------------
function redoConsoleMapping( %action, %oldIndex )
{
moveMap.unbind( "keyboard", %action );
GlobalActionMap.bind( "keyboard", %action, "toggleConsole" );
OP_ConsoleKeyBtn.setValue( %action );
OP_RemapList.setRowById( %oldIndex, buildFullMapString( %oldIndex ) );
}
//------------------------------------------------------------------------------
function RemapInputCtrl::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;
}
}
if ( %this.mode $= "consoleKey" )
{
if ( %device !$= "keyboard" )
{
MessageBoxOK( "REMAP FAILED", "This command can only be bound to keys on the keyboard!" );
return;
}
%prevMap = GlobalActionMap.getCommand( %device, %action );
if ( %prevMap !$= "" )
{
MessageBoxOK( "REMAP FAILED", "\"" @ getMapDisplayName( %device, %action ) @ "\" is already bound to a non-remappable command!" );
return;
}
%mvMap = moveMap.getCommand( %device, %action );
if ( %mvMap $= "" )
{
GlobalActionMap.bind( %device, %action, "toggleConsole" );
OP_ConsoleKeyBtn.setValue( %action );
}
else
{
%mapName = getMapDisplayName( %device, %action );
%mvMapIndex = findRemapCmdIndex( %mvMap );
if ( %mvMapIndex == -1 )
MessageBoxOK( "REMAP FAILED", "\"" @ %mapName @ "\" is already bound to a non-remappable command!" );
else
MessageBoxYesNo( "WARNING", "\"" @ %mapName @ "\" is already bound to \""
@ $RemapName[%mvMapIndex] @ "\"!"
NL "Do you want to undo this mapping?",
"redoConsoleMapping(\"" @ %action @ "\", " @ %mvMapIndex @ ");", "" );
return;
}
}
else
{
switch$ ( OP_ControlsPane.group )
{
case "Observer":
%actionMap = observerMap;
%cmd = $ObsRemapCmd[%this.index];
%name = $ObsRemapName[%this.index];
default:
%actionMap = moveMap;
%cmd = $RemapCmd[%this.index];
%name = $RemapName[%this.index];
}
// First check to see if the given action is already mapped:
%prevMap = %actionMap.getCommand( %device, %action );
if ( %prevMap !$= %cmd )
{
if ( %prevMap $= "" )
{
%actionMap.bind( %device, %action, %cmd );
OP_RemapList.setRowById( %this.index, buildFullMapString( %this.index ) );
}
else
{
%mapName = getMapDisplayName( %device, %action );
%prevMapIndex = findRemapCmdIndex( %prevMap );
if ( %prevMapIndex == -1 )
MessageBoxOK( "REMAP FAILED", "\"" @ %mapName @ "\" is already bound to a non-remappable command!" );
else
{
switch$ ( OP_ControlsPane.group )
{
case "Observer":
%prevCmdName = $ObsRemapName[%prevMapIndex];
default:
%prevCmdName = $RemapName[%prevMapIndex];
}
MessageBoxYesNo( "WARNING",
"\"" @ %mapName @ "\" is already bound to \""
@ %prevCmdName @ "\"!\nDo you want to undo this mapping?",
"redoMapping(" @ %actionMap @ ", " @ %device @ ", \"" @ %action @ "\", \"" @ %cmd @ "\", " @ %prevMapIndex @ ", " @ %this.index @ ");", "" );
}
return;
}
}
}
}
//------------------------------------------------------------------------------
function OP_JoystickTgl::onAction( %this )
{
%on = %this.getValue();
if ( %on )
enableJoystick();
else
disableJoystick();
OP_ConfigureJoystickBtn.setActive( %on );
}
//------------------------------------------------------------------------------
function MouseConfigDlg::onWake( %this )
{
MouseXSlider.setValue( moveMap.getScale( mouse, xaxis ) / 2 );
MouseYSlider.setValue( moveMap.getScale( mouse, yaxis ) / 2 );
InvertMouseTgl.setValue( moveMap.isInverted( mouse, yaxis ) );
MouseZActionMenu.clear();
MouseZActionMenu.add( "Nothing", 1 );
MouseZActionMenu.add( "Cycle Weapon", 2 );
MouseZActionMenu.add( "Next Weapon Only", 3 );
// MouseZActionMenu.add( "Cycle Zoom Level", 4 );
%bind = moveMap.getCommand( "mouse", "zaxis" );
%selId = 1;
switch$ ( %bind )
{
case "cycleWeaponAxis":
%selId = 2;
case "cycleNextWeaponOnly":
%selId = 3;
}
MouseZActionMenu.setSelected( %selId );
}
//------------------------------------------------------------------------------
function MouseConfigDlg::onOK( %this )
{
%xSens = MouseXSlider.getValue() * 2;
%ySens = MouseYSlider.getValue() * 2;
moveMap.bind( mouse, xaxis, "S", %xSens, "yaw" );
%yFlags = InvertMouseTgl.getValue() ? "SI" : "S";
moveMap.bind( mouse, yaxis, %yFlags, %ySens, "pitch" );
switch ( MouseZActionMenu.getSelected() )
{
case 2:
moveMap.bind( mouse, zaxis, cycleWeaponAxis );
case 3:
moveMap.bind( mouse, zaxis, cycleNextWeaponOnly );
default:
moveMap.unbind( mouse, zaxis );
}
Canvas.popDialog( MouseConfigDlg );
}
//------------------------------------------------------------------------------
function MouseXSlider::sync( %this )
{
%thisValue = %this.getValue();
MouseXText.setValue( "(" @ getSubStr( %thisValue, 0, 4 ) @ ")" );
if ( $pref::Input::LinkMouseSensitivity )
{
if ( MouseYSlider.getValue() != %thisValue )
MouseYSlider.setValue( %thisValue );
}
}
//------------------------------------------------------------------------------
function MouseYSlider::sync( %this )
{
%thisValue = %this.getValue();
MouseYText.setValue( "(" @ getSubStr( %thisValue, 0, 4 ) @ ")" );
if ( $pref::Input::LinkMouseSensitivity )
{
if ( MouseXSlider.getValue() != %thisValue )
MouseXSlider.setValue( %thisValue );
}
}
//------------------------------------------------------------------------------
// Joystick Config dialog:
//------------------------------------------------------------------------------
$JoyRemapCount = 0;
$JoyRemapName[$JoyRemapCount] = "Look Up/Down";
$JoyRemapCmd[$JoyRemapCount] = "joyPitch";
$JoyRemapCount++;
$JoyRemapName[$JoyRemapCount] = "Turn Left/Right";
$JoyRemapCmd[$JoyRemapCount] = "joyYaw";
$JoyRemapCount++;
$JoyRemapName[$JoyRemapCount] = "Move Forward/Backward";
$JoyRemapCmd[$JoyRemapCount] = "joystickMoveY";
$JoyRemapCount++;
$JoyRemapName[$JoyRemapCount] = "Strafe Left/Right";
$JoyRemapCmd[$JoyRemapCount] = "joystickMoveX";
$JoyRemapCount++;
$JoyRemapName[$JoyRemapCount] = "Cycle Weapon";
$JoyRemapCmd[$JoyRemapCount] = "cycleWeaponAxis";
$JoyRemapCount++;
//------------------------------------------------------------------------------
function JoystickConfigDlg::onWake( %this )
{
// Add all of the axis tabs:
%temp = getJoystickAxes( 0 );
%tryCount = getField( %temp, 0 );
$JoyAxisCount = 0;
for ( %i = 0; %i < %tryCount; %i++ )
{
%type = getField( %temp, %i + 1 );
switch$ ( %type )
{
case "X": %tabName = "X Axis"; %tabType = "xaxis";
case "Y": %tabName = "Y Axis"; %tabType = "yaxis";
case "Z": %tabName = "Z Axis"; %tabType = "zaxis";
case "R": %tabName = "R Axis"; %tabType = "rxaxis";
case "U": %tabName = "U Axis"; %tabType = "ryaxis";
case "V": %tabName = "V Axis"; %tabType = "rzaxis";
case "S": %tabName = "Slider"; %tabType = "slider";
case "L": %tabName = "Slider 2"; %tabType = "slider2";
default: %tabName = "";
}
if ( %tabName !$= "" )
{
$JoyAxisTab[$JoyAxisCount] = new ShellTabButton() {
profile = "ShellTabProfile";
horizSizing = "right";
vertSizing = "bottom";
position = "29" SPC ( 52 + ( %i * 30 ) );
extent = "100 38";
minExtent = "48 38";
visible = "1";
command = "JoystickConfigDlg.setPane(" @ %i @ ");";
helpTag = "0";
text = %tabName;
type = %tabType;
};
$JoyAxisCount++;
JoystickConfigFrame.add( $JoyAxisTab[%i] );
}
}
// Fill the action menu:
JoyAxisActionMenu.clear();
for ( %i = 0; %i < $JoyRemapCount; %i++ )
JoyAxisActionMenu.add( $JoyRemapName[%i], %i );
JoyAxisActionMenu.add( "Nothing", 255 );
// Select the first axis:
%this.setPane( %this.pane );
}
//------------------------------------------------------------------------------
function JoystickConfigDlg::onSleep( %this )
{
// Save the current pane's settings:
bindJoystickAxis( %this.pane, JoyAxisActionMenu.getSelected() );
for ( %i = 0; %i < $JoyAxisCount; %i++ )
{
JoystickConfigFrame.remove( $JoyAxisTab[%i] );
$JoyAxisTab[%i].delete();
}
}
//------------------------------------------------------------------------------
function JoystickConfigDlg::setPane( %this, %pane )
{
if ( %this.pane != %pane )
{
// Save the previous axes' settings:
bindJoystickAxis( %this.pane, JoyAxisActionMenu.getSelected() );
%this.pane = %pane;
}
for ( %i = 0; %i < $joyAxisCount; %i++ )
$JoyAxisTab[%i].setValue( %i == %pane );
// Update the config controls:
%axisType = $JoyAxisTab[%pane].type;
%bind = moveMap.getCommand( "joystick", %axisType );
if ( %bind !$= "" )
{
for ( %i = 0; %i < $JoyRemapCount; %i++ )
{
if ( $JoyRemapCmd[%i] $= %bind )
{
JoyAxisActionMenu.setSelected( %i );
JoyAxisActionMenu.setText( $JoyRemapName[%i] );
JoyAxisActionMenu.onSelect( %i, "" );
break;
}
}
if ( %i == $JoyRemapCount )
{
JoyAxisActionMenu.setSelected( 255 ); // 255 is the code for "Nothing"
JoyAxisActionMenu.onSelect( 255, "" );
}
%scale = moveMap.getScale( "joystick", %axisType );
JoyAxisSlider.setValue( %scale / 100 );
%deadZone = moveMap.getDeadZone( "joystick", %axisType );
if ( %deadZone $= "0 0" )
DeadZoneSlider.setValue( 0.0 );
else
DeadZoneSlider.setValue( abs( firstWord( %deadZone ) ) / %scale );
InvertJoyAxisTgl.setValue( moveMap.isInverted( "joystick", %axisType ) );
//JoyAxisRelativeTgl.setValue( moveMap.isRelativeAxis( "joystick", %axisType ) );
}
else
{
JoyAxisActionMenu.setSelected( 255 ); // 255 is the code for "Nothing"
JoyAxisActionMenu.onSelect( 255, "" );
JoyAxisSlider.setValue( 0.5 );
DeadZoneSlider.setValue( 0.0 );
InvertJoyAxisTgl.setValue( false );
//JoyAxisRelativeTgl.setValue( %axisType $= "slider" );
}
}
//------------------------------------------------------------------------------
function JoyAxisActionMenu::onSelect( %this, %id, %text )
{
%on = ( %id < $JoyRemapCount );
JoyAxisSlider.setActive( %on );
JoySensText.setVisible( %on );
DeadZoneSlider.setActive( %on );
DeadZoneText.setVisible( %on );
InvertJoyAxisTgl.setActive( %on );
//JoyAxisRelativeTgl.setActive( %on );
}
//------------------------------------------------------------------------------
function JoySensText::update( %this )
{
%this.setValue( "(" @ getSubStr( JoyAxisSlider.getValue(), 0, 4 ) @ ")" );
}
//------------------------------------------------------------------------------
function DeadZoneText::update( %this )
{
%val = DeadZoneSlider.getValue();
%percent = %val * 100;
%temp = strstr( %percent, "." );
if ( %temp != -1 )
%percent = getSubStr( %percent, 0, %temp );
%this.setValue( "(" @ %percent @ "%)" );
}
//------------------------------------------------------------------------------
function bindJoystickAxis( %axisIndex, %cmdIndex )
{
%cmd = $JoyRemapCmd[%cmdIndex];
%axis = $JoyAxisTab[%axisIndex].type;
if ( %cmdIndex > $JoyRemapCount )
{
// Make sure the axis is unbound:
moveMap.unbind( "joystick", %axis );
return;
}
%sens = JoyAxisSlider.getValue() * 100;
%delta = DeadZoneSlider.getValue() * %sens;
%flags = "S";
if ( InvertJoyAxisTgl.getValue() )
%flags = %flags @ "I";
// if ( JoyAxisRelativeTgl.getValue() )
// %flags = %flags @ "L";
if ( %delta > 0 )
{
%deadZone = "-" @ %delta SPC %delta;
moveMap.bind( "joystick", %axis, %flags @ "D", %deadZone, %sens, %cmd );
}
else
moveMap.bind( "joystick", %axis, %flags, %sens, %cmd );
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Network Settings:
//
function updateNetworkSettings()
{
$pref::Net::PacketRateToClient = mFloor( OP_PacketRateSlider.getValue() );
$pref::Net::PacketSize = mFloor( OP_PacketSizeSlider.getValue() );
$pref::Net::PacketRateToServer = mFloor( OP_UpdateRateSlider.getValue() );
// check the max rate:
if ( isObject( ServerConnection ) )
ServerConnection.checkMaxRate();
if ( isObject( ClientGroup ) )
{
%count = ClientGroup.getCount();
for ( %i = 0; %i < %count; %i++ )
{
%cl = ClientGroup.getObject( %i );
%cl.checkMaxRate();
}
}
}
function OP_NetworkDisplayHud::init(%this)
{
%this.getPrefs();
%this.textHeight = 14;
%this.textOffset = 2;
if(!%this.infoCallback)
{
%this.textProfile = 0;
return;
}
// profile for the text fields
%this.textProfile = new GuiControlProfile()
{
fontType = $ShellButtonFont;
fontSize = $ShellButtonFontSize;
autoSizeWidth = true;
autoSizeHeight = true;
fontColors[6] = "128 128 128";
};
%yOffset = %this.textOffset;
for(%i = 0; %i < 6; %i++)
{
// set the text color
%this.textProfile.fontColors[%i] = %this.fieldColors[%i];
// create the text field
%this.textField[%i] = new GuiTextCtrl()
{
profile = %this.textProfile;
horizSizing = "right";
vertSizing = "bottom";
position = "20 " @ %yOffset;
extent = "190 " @ %this.textHeight;
visible = "1";
};
// create the toggle field
%this.toggleField[%i] = new GuiTextCtrl()
{
profile = ShellActiveTextProfile;
horizSizing = "right";
vertSizing = "bottom";
position = "5 " @ %yOffset;
extent = "15 " @ %this.textHeight;
visible = "1";
};
// create a mouse object
%this.mouseField[%i] = new GuiMouseEventCtrl(NetworkDisplayMouseCtrl)
{
profile = GuiDefaultProfile;
horizSizing = "right";
vertSizing = "bottom";
position = "10 " @ %yOffset;
extent = "200 " @ %this.textHeight;
visible = "1";
fieldIndex = %i;
};
OP_NetworkDisplayTextFrame.add(%this.textField[%i]);
OP_NetworkDisplayTextFrame.add(%this.toggleField[%i]);
OP_NetworkDisplayTextFrame.add(%this.mouseField[%i]);
%yOffset += (%this.textHeight + %this.textOffset);
}
%this.infoUpdate(0, 0, 0, 0, 0, 0);
}
function NetworkDisplayMouseCtrl::onMouseDown(%this)
{
%b = OP_NetworkDisplayHud.renderField[%this.fieldIndex];
OP_NetworkDisplayHud.renderField[%this.fieldIndex] = !%b;
OP_NetworkDisplayHud.updateToggles();
}
function OP_NetworkDisplayHud::uninit(%this)
{
if(!%this.infoCallback)
return;
if(isObject(%this.textProfile))
%this.textProfile.delete();
for(%i = 0; %i < 6; %i++)
{
if(isObject(%this.textField[%i]))
%this.textField[%i].delete();
if(isObject(%this.toggleField[%i]))
%this.toggleField[%i].delete();
if(isObject(%this.mouseField[%i]))
%this.mouseField[%i].delete();
}
}
function OP_NetworkDisplayHud::updateToggles(%this)
{
// update the toggles
$pref::Net::graphFields = 0;
for(%i = 0; %i < 6; %i++)
{
$pref::Net::graphFields |= %this.renderField[%i] << %i;
%this.toggleField[%i].setText(%this.renderField[%i] ? "+" : "-");
}
}
function OP_NetworkDisplayHud::infoUpdate(%this, %ping, %packetLoss, %sendPackets, %sendBytes, %receivePackets, %receiveBytes)
{
%this.updateToggles();
// set the text
%this.textField[0].setText("\c0Ping: " @ mFormatFloat(%ping, "%4.0f") @ "ms");
%this.textField[1].setText("\c1Packet Loss: " @ mFormatFloat(%packetLoss, "%3.0f") @ "%");
%this.textField[2].setText("\c2Send Packets: " @ mFormatFloat(%sendPackets, "%2.1f") @ "pps");
%this.textField[3].setText("\c3Send Bytes: " @ mFormatFloat(%sendBytes, "%5.0f") @ "bps");
%this.textField[4].setText("\c4Receive Packets: " @ mFormatFloat(%receivePackets, "%2.1f") @ "pps");
%this.textField[5].setText("\c5Receive Bytes: " @ mFormatFloat(%receiveBytes, "%5.0f") @ "bps");
}
// "<name><packet rate><update rate><packet size>"
// [1,32] [8,32] [100,450]
$NetworkPresetCount = 0;
$NetworkPreset[$NetworkPresetCount] = "28.8 Modem\t12\t16\t200"; $NetworkPresetCount++;
$NetworkPreset[$NetworkPresetCount] = "56K Modem\t16\t20\t240"; $NetworkPresetCount++;
$NetworkPreset[$NetworkPresetCount] = "DSL\t20\t24\t350"; $NetworkPresetCount++;
$NetworkPreset[$NetworkPresetCount] = "Cable\t24\t24\t400"; $NetworkPresetCount++;
$NetworkPreset[$NetworkPresetCount] = "T1/LAN\t32\t32\t450"; $NetworkPresetCount++;
function OP_NetworkPresetsMenu::init( %this )
{
%this.clear();
for(%i = 0; %i < $NetworkPresetCount; %i++)
%this.add( getField($NetworkPreset[%i], 0), %i);
// don't update settings on init (only update when values change)
%this.updateSettings = false;
%this.setSelected($pref::Net::Preset);
%this.updateSettings = true;
}
function OP_NetworkPresetsMenu::onSelect( %this, %id, %text )
{
OP_PacketRateSlider.setValue( getField($NetworkPreset[%id], 1) );
OP_UpdateRateSlider.setValue( getField($NetworkPreset[%id], 2) );
OP_PacketSizeSlider.setValue( getField($NetworkPreset[%id], 3) );
if(%this.updateSettings)
updateNetworkSettings();
$pref::Net::Preset = %id;
}
//------------------------------------------------------------------------------
function OP_MasterServerMenu::init( %this )
{
%this.clear();
// You can change these strings, but NOT THE IDS!
%this.add( "Always", 1 );
%this.add( "When Not Full", 2 );
%this.add( "Never", 3 );
}
//------------------------------------------------------------------------------
function OP_MasterServerMenu::onSelect( %this, %id, %text )
{
switch( %id )
{
case 2:
$pref::Net::DisplayOnMaster = "NotFull";
case 3:
$pref::Net::DisplayOnMaster = "Never";
default:
$pref::Net::DisplayOnMaster = "Always";
}
}
//------------------------------------------------------------------------------
function OP_RegionMenu::init( %this )
{
%this.clear();
%this.add( "North America East", 1 );
%this.add( "North America West", 2 );
%this.add( "South America", 4 );
%this.add( "Australia", 8 );
%this.add( "Asia", 16 );
%this.add( "Europe", 32 );
}
//------------------------------------------------------------------------------
function OP_RegionMenu::onSelect( %this, %id, %text )
{
$pref::Net::RegionMask = %id;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Game Settings:
//
function OP_LaunchScreenMenu::init( %this )
{
%this.clear();
%this.add( "Game", 1 );
%this.add( "Email", 4 );
%this.add( "Chat", 5 );
%this.add( "Browser", 6 );
}
//------------------------------------------------------------------------------
function toggleInvertYAxis()
{
// Catch the case where this is toggled in-game while in a vehicle:
if ( isObject( passengerKeys ) )
{
%bind = passengerKeys.getBinding( pitch );
if ( %bind !$= "" )
{
%device = getField( %bind, 0 );
%action = getField( %bind, 1 );
%flags = $pref::Vehicle::InvertYAxis ? "SDI" : "SD";
%deadZone = passengerKeys.getDeadZone( %device, %action );
%scale = passengerKeys.getScale( %device, %action );
passengerKeys.bind( %device, %action, %flags, %deadZone, %scale, pitch );
}
}
}
//------------------------------------------------------------------------------
function toggleImmersion()
{
MessageBoxOK( "Force Feedback", "This will take effect the next time you start Tribes 2." );
}
//------------------------------------------------------------------------------
function toggleVehicleTeleportPref()
{
// If we are in a game, let the server know we've changed;
if ( isObject( ServerConnection ) )
commandToServer( 'EnableVehicleTeleport', $pref::Vehicle::pilotTeleport );
}