function OptionsDlg::onWake(%this) { OptGraphicsButton.performClick(); %buffer = getDisplayDeviceList(); %count = getFieldCount( %buffer ); OptGraphicsDriverMenu.clear(); OptScreenshotMenu.init(); OptScreenshotMenu.setValue($pref::Video::screenShotFormat); for(%i = 0; %i < %count; %i++) OptGraphicsDriverMenu.add(getField(%buffer, %i), %i); %selId = OptGraphicsDriverMenu.findText( $pref::Video::displayDevice ); if ( %selId == -1 ) %selId = 0; // How did THAT happen? OptGraphicsDriverMenu.setSelected( %selId ); OptGraphicsDriverMenu.onSelect( %selId, "" ); // Audio OptAudioUpdate(); OptAudioVolumeMaster.setValue($pref::Audio::masterVolume); OptAudioVolumeShell.setValue( $pref::Audio::channelVolume[$GuiAudioType]); OptAudioVolumeSim.setValue( $pref::Audio::channelVolume[$SimAudioType]); OptAudioDriverList.clear(); OptAudioDriverList.add("OpenAL", 1); OptAudioDriverList.add("none", 2); %selId = OptAudioDriverList.findText($pref::Audio::driver); if ( %selId == -1 ) %selId = 0; // How did THAT happen? OptAudioDriverList.setSelected( %selId ); OptAudioDriverList.onSelect( %selId, "" ); OptRemapList.fillList(); } function OptionsDlg::onSleep(%this) { // write out the control config into the demo/client/config.cs file moveMap.save( "demo/client/config.cs" ); } function OptGraphicsDriverMenu::onSelect( %this, %id, %text ) { // Attempt to keep the same res and bpp settings: if ( OptGraphicsResolutionMenu.size() > 0 ) %prevRes = OptGraphicsResolutionMenu.getText(); else %prevRes = getWords( $pref::Video::resolution, 0, 1 ); // Check if this device is full-screen only: if ( isDeviceFullScreenOnly( %this.getText() ) ) { OptGraphicsFullscreenToggle.setValue( true ); OptGraphicsFullscreenToggle.setActive( false ); OptGraphicsFullscreenToggle.onAction(); } else OptGraphicsFullscreenToggle.setActive( true ); if ( OptGraphicsFullscreenToggle.getValue() ) { if ( OptGraphicsBPPMenu.size() > 0 ) %prevBPP = OptGraphicsBPPMenu.getText(); else %prevBPP = getWord( $pref::Video::resolution, 2 ); } // Fill the resolution and bit depth lists: OptGraphicsResolutionMenu.init( %this.getText(), OptGraphicsFullscreenToggle.getValue() ); OptGraphicsBPPMenu.init( %this.getText() ); // Try to select the previous settings: %selId = OptGraphicsResolutionMenu.findText( %prevRes ); if ( %selId == -1 ) %selId = 0; OptGraphicsResolutionMenu.setSelected( %selId ); if ( OptGraphicsFullscreenToggle.getValue() ) { %selId = OptGraphicsBPPMenu.findText( %prevBPP ); if ( %selId == -1 ) %selId = 0; OptGraphicsBPPMenu.setSelected( %selId ); OptGraphicsBPPMenu.setText( OptGraphicsBPPMenu.getTextById( %selId ) ); } else OptGraphicsBPPMenu.setText( "Default" ); } function OptGraphicsResolutionMenu::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 OptGraphicsFullscreenToggle::onAction(%this) { Parent::onAction(); %prevRes = OptGraphicsResolutionMenu.getText(); // Update the resolution menu with the new options OptGraphicsResolutionMenu.init( OptGraphicsDriverMenu.getText(), %this.getValue() ); // Set it back to the previous resolution if the new mode supports it. %selId = OptGraphicsResolutionMenu.findText( %prevRes ); if ( %selId == -1 ) %selId = 0; OptGraphicsResolutionMenu.setSelected( %selId ); } function OptGraphicsBPPMenu::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 OptScreenshotMenu::init( %this ) { if( %this.findText("PNG") == -1 ) %this.add("PNG", 0); if( %this.findText("JPEG") == - 1 ) %this.add("JPEG", 1); } function optionsDlg::applyGraphics( %this ) { %newDriver = OptGraphicsDriverMenu.getText(); %newRes = OptGraphicsResolutionMenu.getText(); %newBpp = OptGraphicsBPPMenu.getText(); %newFullScreen = OptGraphicsFullscreenToggle.getValue(); $pref::Video::screenShotFormat = OptScreenshotMenu.getText(); 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 ); } $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] = "Fire Weapon"; $RemapCmd[$RemapCount] = "mouseFire"; $RemapCount++; $RemapName[$RemapCount] = "Adjust Zoom"; $RemapCmd[$RemapCount] = "setZoomFov"; $RemapCount++; $RemapName[$RemapCount] = "Toggle Zoom"; $RemapCmd[$RemapCount] = "toggleZoom"; $RemapCount++; $RemapName[$RemapCount] = "Free Look"; $RemapCmd[$RemapCount] = "toggleFreeLook"; $RemapCount++; $RemapName[$RemapCount] = "Switch 1st/3rd"; $RemapCmd[$RemapCount] = "toggleFirstPerson"; $RemapCount++; $RemapName[$RemapCount] = "Chat to Everyone"; $RemapCmd[$RemapCount] = "toggleMessageHud"; $RemapCount++; $RemapName[$RemapCount] = "Message Hud PageUp"; $RemapCmd[$RemapCount] = "pageMessageHudUp"; $RemapCount++; $RemapName[$RemapCount] = "Message Hud PageDown"; $RemapCmd[$RemapCount] = "pageMessageHudDown"; $RemapCount++; $RemapName[$RemapCount] = "Resize Message Hud"; $RemapCmd[$RemapCount] = "resizeMessageHud"; $RemapCount++; $RemapName[$RemapCount] = "Show Scores"; $RemapCmd[$RemapCount] = "showPlayerList"; $RemapCount++; $RemapName[$RemapCount] = "Animation - Wave"; $RemapCmd[$RemapCount] = "celebrationWave"; $RemapCount++; $RemapName[$RemapCount] = "Animation - Salute"; $RemapCmd[$RemapCount] = "celebrationSalute"; $RemapCount++; $RemapName[$RemapCount] = "Suicide"; $RemapCmd[$RemapCount] = "suicide"; $RemapCount++; $RemapName[$RemapCount] = "Toggle Camera"; $RemapCmd[$RemapCount] = "toggleCamera"; $RemapCount++; $RemapName[$RemapCount] = "Drop Camera at Player"; $RemapCmd[$RemapCount] = "dropCameraAtPlayer"; $RemapCount++; $RemapName[$RemapCount] = "Drop Player at Camera"; $RemapCmd[$RemapCount] = "dropPlayerAtCamera"; $RemapCount++; $RemapName[$RemapCount] = "Bring up Options Dialog"; $RemapCmd[$RemapCount] = "bringUpOptions"; $RemapCount++; function restoreDefaultMappings() { moveMap.delete(); exec( "~/scripts/default.bind.cs" ); OptRemapList.fillList(); } 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 ) { %name = $RemapName[%index]; %cmd = $RemapCmd[%index]; %temp = moveMap.getBinding( %cmd ); %device = getField( %temp, 0 ); %object = getField( %temp, 1 ); if ( %device !$= "" && %object !$= "" ) %mapString = getMapDisplayName( %device, %object ); else %mapString = ""; return( %name TAB %mapString ); } function OptRemapList::fillList( %this ) { %this.clear(); for ( %i = 0; %i < $RemapCount; %i++ ) %this.addRow( %i, buildFullMapString( %i ) ); } //------------------------------------------------------------------------------ function OptRemapList::doRemap( %this ) { %selId = %this.getSelectedId(); %name = $RemapName[%selId]; OptRemapText.setValue( "REMAP \"" @ %name @ "\"" ); OptRemapInputCtrl.index = %selId; Canvas.pushDialog( RemapDlg ); } //------------------------------------------------------------------------------ function redoMapping( %device, %action, %cmd, %oldIndex, %newIndex ) { //%actionMap.bind( %device, %action, $RemapCmd[%newIndex] ); moveMap.bind( %device, %action, %cmd ); OptRemapList.setRowById( %oldIndex, buildFullMapString( %oldIndex ) ); OptRemapList.setRowById( %newIndex, buildFullMapString( %newIndex ) ); } //------------------------------------------------------------------------------ function findRemapCmdIndex( %command ) { for ( %i = 0; %i < $RemapCount; %i++ ) { if ( %command $= $RemapCmd[%i] ) return( %i ); } return( -1 ); } 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]; // First check to see if the given action is already mapped: %prevMap = moveMap.getCommand( %device, %action ); if ( %prevMap !$= %cmd ) { if ( %prevMap $= "" ) { moveMap.bind( %device, %action, %cmd ); OptRemapList.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 { %prevCmdName = $RemapName[%prevMapIndex]; MessageBoxYesNo( "WARNING", "\"" @ %mapName @ "\" is already bound to \"" @ %prevCmdName @ "\"!\nDo you want to undo this mapping?", "redoMapping(" @ %device @ ", \"" @ %action @ "\", \"" @ %cmd @ "\", " @ %prevMapIndex @ ", " @ %this.index @ ");", "" ); } return; } } } // Audio function OptAudioUpdate() { // set the driver text %text = "Vendor: " @ alGetString("AL_VENDOR") @ "\nVersion: " @ alGetString("AL_VERSION") @ "\nRenderer: " @ alGetString("AL_RENDERER") @ "\nExtensions: " @ alGetString("AL_EXTENSIONS"); OptAudioInfo.setText(%text); } // Channel 0 is unused in-game, but is used here to test master volume. new AudioDescription(AudioChannel0) { volume = 1.0; isLooping= false; is3D = false; type = 0; }; new AudioDescription(AudioChannel1) { volume = 1.0; isLooping= false; is3D = false; type = 1; }; new AudioDescription(AudioChannel2) { volume = 1.0; isLooping= false; is3D = false; type = 2; }; new AudioDescription(AudioChannel3) { volume = 1.0; isLooping= false; is3D = false; type = 3; }; new AudioDescription(AudioChannel4) { volume = 1.0; isLooping= false; is3D = false; type = 4; }; new AudioDescription(AudioChannel5) { volume = 1.0; isLooping= false; is3D = false; type = 5; }; new AudioDescription(AudioChannel6) { volume = 1.0; isLooping= false; is3D = false; type = 6; }; new AudioDescription(AudioChannel7) { volume = 1.0; isLooping= false; is3D = false; type = 7; }; new AudioDescription(AudioChannel8) { volume = 1.0; isLooping= false; is3D = false; type = 8; }; $AudioTestHandle = 0; function OptAudioUpdateMasterVolume(%volume) { if (%volume == $pref::Audio::masterVolume) return; alxListenerf(AL_GAIN_LINEAR, %volume); $pref::Audio::masterVolume = %volume; if (!alxIsPlaying($AudioTestHandle)) { $AudioTestHandle = alxCreateSource("AudioChannel0", expandFilename("~/data/sound/testing.ogg")); alxPlay($AudioTestHandle); } } function OptAudioUpdateChannelVolume(%channel, %volume) { if (%channel < 1 || %channel > 8) return; if (%volume == $pref::Audio::channelVolume[%channel]) return; alxSetChannelVolume(%channel, %volume); $pref::Audio::channelVolume[%channel] = %volume; if (!alxIsPlaying($AudioTestHandle)) { $AudioTestHandle = alxCreateSource("AudioChannel"@%channel, expandFilename("~/data/sound/testing.ogg")); alxPlay($AudioTestHandle); } } function OptAudioDriverList::onSelect( %this, %id, %text ) { if (%text $= "") return; if ($pref::Audio::driver $= %text) return; $pref::Audio::driver = %text; OpenALInit(); }