636 lines
17 KiB
C#
636 lines
17 KiB
C#
function optionsDlg::setPane(%this, %pane)
|
|
{
|
|
OptAudioPane.setVisible(false);
|
|
OptGraphicsPaneMac.setVisible(false);
|
|
OptGraphicsPane.setVisible(false);
|
|
OptNetworkPane.setVisible(false);
|
|
OptControlsPane.setVisible(false);
|
|
if(%pane $= "Graphics")
|
|
{
|
|
if($platform $= "windows")
|
|
OptGraphicsPane.setVisible(true);
|
|
else
|
|
{
|
|
OptGraphicsPaneMac.setVisible(true);
|
|
if ($platform $= "x86UNIX")
|
|
StencilShadowsButtonMac.setVisible(true);
|
|
}
|
|
}
|
|
else
|
|
("Opt" @ %pane @ "Pane").setVisible(true);
|
|
OptControlsPane.showMappings();
|
|
%par = OptBoxFrame.getGroup();
|
|
|
|
RootGroup.add(OptBoxFrame);
|
|
RootGroup.add("Opt" @ %pane @ "Tab");
|
|
%par.add(OptBoxFrame);
|
|
%par.add("Opt" @ %pane @ "Tab");
|
|
}
|
|
|
|
function OptGraphicsPane::setMode(%this, %mode)
|
|
{
|
|
$pref::Video::fullScreen = (%mode $= "Full");
|
|
}
|
|
|
|
function OptGraphicsPane::setDriver(%this, %driver)
|
|
{
|
|
$pref::Video::displayDevice = %driver;
|
|
}
|
|
|
|
function OptionsDlg::onWake(%this)
|
|
{
|
|
if ($platform $= "x86UNIX")
|
|
// enable stencil shadows button text on unix
|
|
OptGfxText.setText("<font:DomCasualD:32><just:right>Screen Resolution:\n\nScreen Style:\n\nColor Depth:\n\nStencil Shadows:\n\n");
|
|
else
|
|
OptGfxText.setText("<font:DomCasualD:32><just:right>Screen Resolution:\n\nScreen Style:\n\nColor Depth:\n\n");
|
|
|
|
%this.setPane("Graphics");
|
|
%buffer = getDisplayDeviceList();
|
|
%count = getFieldCount( %buffer );
|
|
|
|
OptGfxResSelectWU.clear();
|
|
OptGfxResSelectNS.clear();
|
|
|
|
OptGfxResSelectWU.setText(getResolution());
|
|
OptGfxResSelectNS.setText(getResolution());
|
|
|
|
%resList = getResolutionList($pref::Video::displayDevice);
|
|
for(%resIndex = 0; (%res = getField(%resList, %resIndex)) !$= ""; %resIndex++) {
|
|
OptGfxResSelectWU.add(%res, %resIndex);
|
|
OptGfxResSelectNS.add(%res, %resIndex);
|
|
if(getResolution() $= %res) {
|
|
OptGfxResSelectWU.setSelected(%resIndex);
|
|
OptGfxResSelectNS.setSelected(%resIndex);
|
|
}
|
|
}
|
|
|
|
%isOgl = $pref::Video::displayDevice $= "OpenGL";
|
|
OptGfxOpenGL.setValue(%isOgl);
|
|
OptGfxD3D.setValue(!%isOgl);
|
|
|
|
OptGfxFull.setValue($pref::Video::fullScreen);
|
|
OptGfxWindow.setValue(!$pref::Video::fullScreen);
|
|
OptGfxFullMac.setValue($pref::Video::fullScreen);
|
|
OptGfxWindowMac.setValue(!$pref::Video::fullScreen);
|
|
|
|
OptGraphicsDriverMenu.clear();
|
|
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, "" );
|
|
}
|
|
|
|
function OptionsDlg::onSleep(%this)
|
|
{
|
|
// write out the control config into the fps/config.cs file
|
|
moveMap.save( "~/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 optionsDlg::applyGraphics( %this )
|
|
{
|
|
// %newDriver = OptGraphicsDriverMenu.getText();
|
|
// %newRes = OptGraphicsResolutionMenu.getText();
|
|
// %newBpp = OptGraphicsBPPMenu.getText();
|
|
// %newFullScreen = OptGraphicsFullscreenToggle.getValue();
|
|
pauseMusic();
|
|
%newReso = OptGfxResSelectWU.getTextById(OptGfxResSelectWU.getSelected());
|
|
if($platform $= "macos") {
|
|
%newReso = OptGfxResSelectNS.getTextById(OptGfxResSelectNS.getSelected());
|
|
}
|
|
if ($pref::Video::displayDevice !$= getDisplayDeviceName())
|
|
{
|
|
setDisplayDevice( $pref::Video::displayDevice,
|
|
firstWord( %newReso ),
|
|
getWord( %newReso, 1 ),
|
|
getWord( %newReso, 2),
|
|
$pref::Video::fullScreen );
|
|
//OptionsDlg::deviceDependent( %this );
|
|
}
|
|
else if(%newReso !$= getResolution())
|
|
{
|
|
setScreenMode( firstWord( %newReso ),
|
|
getWord( %newReso, 1 ),
|
|
getWord( %newReso, 2),
|
|
$pref::Video::fullScreen );
|
|
}
|
|
else if($pref::Video::fullScreen != isFullScreen())
|
|
toggleFullScreen();
|
|
resumeMusic();
|
|
}
|
|
|
|
|
|
|
|
$RemapCount = 0;
|
|
$RemapName[$RemapCount] = "Move Forward";
|
|
$RemapCmd[$RemapCount] = "moveforward";
|
|
$RemapCount++;
|
|
$RemapName[$RemapCount] = "Move Backward";
|
|
$RemapCmd[$RemapCount] = "movebackward";
|
|
$RemapCount++;
|
|
$RemapName[$RemapCount] = "Move Left";
|
|
$RemapCmd[$RemapCount] = "moveleft";
|
|
$RemapCount++;
|
|
$RemapName[$RemapCount] = "Move Right";
|
|
$RemapCmd[$RemapCount] = "moveright";
|
|
$RemapCount++;
|
|
$RemapName[$RemapCount] = "Jump";
|
|
$RemapCmd[$RemapCount] = "jump";
|
|
$RemapCount++;
|
|
$RemapName[$RemapCount] = "Use PowerUp";
|
|
$RemapCmd[$RemapCount] = "mouseFire";
|
|
$RemapCount++;
|
|
$RemapName[$RemapCount] = "Rotate Camera Left";
|
|
$RemapCmd[$RemapCount] = "turnLeft";
|
|
$RemapCount++;
|
|
$RemapName[$RemapCount] = "Rotate Camera Right";
|
|
$RemapCmd[$RemapCount] = "turnRight";
|
|
$RemapCount++;
|
|
$RemapName[$RemapCount] = "Rotate Camera Up";
|
|
$RemapCmd[$RemapCount] = "panUp";
|
|
$RemapCount++;
|
|
$RemapName[$RemapCount] = "Rotate Camera Down";
|
|
$RemapCmd[$RemapCount] = "panDown";
|
|
$RemapCount++;
|
|
$RemapName[$RemapCount] = "Free Look";
|
|
$RemapCmd[$RemapCount] = "freelook";
|
|
$RemapCount++;
|
|
|
|
|
|
function restoreDefaultMappings()
|
|
{
|
|
moveMap.delete();
|
|
exec( "~/client/scripts/default.bind.cs" );
|
|
OptRemapList.fillList();
|
|
}
|
|
|
|
function getMapDisplayName( %device, %action, %fullText )
|
|
{
|
|
if ( %device $= "keyboard" )
|
|
{
|
|
if(%action $= "space")
|
|
return "Space Bar";
|
|
return( upperFirst(%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 );
|
|
if(%fullText)
|
|
{
|
|
if(%instance < 2)
|
|
{
|
|
if(%mods $= "")
|
|
%mods = "the ";
|
|
if($platform $= "macos" && %instance == 0)
|
|
return %mods @ "Mouse Button";
|
|
if(%instance == 0)
|
|
return %mods @ "Left Mouse Button";
|
|
return %mods @ "Right Mouse Button";
|
|
}
|
|
else
|
|
return( %mods @ "Mouse Button " @ ( %instance + 1 ) );
|
|
|
|
}
|
|
else
|
|
{
|
|
if(%instance < 2)
|
|
{
|
|
if($platform $= "macos" && %instance == 0)
|
|
return %mods @ "Mouse Button";
|
|
if(%instance == 0)
|
|
return %mods @ "Left Mouse";
|
|
return %mods @ "Right Mouse";
|
|
}
|
|
else
|
|
return( %mods @ "Mouse Btn. " @ ( %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( %cmd TAB %mapString );
|
|
}
|
|
|
|
function OptRemapList::fillList( %this )
|
|
{
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
function OptControlsPane::showMappings()
|
|
{
|
|
for ( %i = 0; %i < $RemapCount; %i++ )
|
|
{
|
|
%str = buildFullMapString(%i);
|
|
%ctrl = nameToId("remap_" @ getField(%str, 0));
|
|
%ctrl.setText(getField(%str, 1));
|
|
}
|
|
}
|
|
|
|
function OptControlsPane::remap(%this, %ctrl, %name )
|
|
{
|
|
OptRemapText.setText( "<just:center><font:DomCasualD:24>Press a new key or button for \"" @ %name @ "\"" );
|
|
OptRemapInputCtrl.ctrl = %ctrl;
|
|
OptRemapInputCtrl.nameText = %name;
|
|
Canvas.pushDialog( RemapDlg );
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function redoMapping( %device, %action, %cmd)
|
|
{
|
|
//%actionMap.bind( %device, %action, $RemapCmd[%newIndex] );
|
|
moveMap.bind( %device, %action, %cmd );
|
|
OptControlsPane.showMappings();
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
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;
|
|
}
|
|
}
|
|
if(%action $= "")
|
|
return;
|
|
|
|
%cmd = %this.ctrl;
|
|
%name = %this.nameText;
|
|
|
|
// 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 );
|
|
OptControlsPane.showMappings();
|
|
}
|
|
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 @ "\");", "" );
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Audio
|
|
function OptAudioUpdate()
|
|
{
|
|
// set the driver text
|
|
%text = "Vendor: " @ alGetString("AL_VENDOR") @
|
|
"\nVersion: " @ alGetString("AL_VERSION") @
|
|
"\nRenderer: " @ alGetString("AL_RENDERER");
|
|
|
|
// don't display the extensions on linux. there's too many of them and
|
|
// they mess up the control
|
|
if ($platform $= "x86UNIX")
|
|
%text = %text @ "\nExtensions: (See Console) ";
|
|
else
|
|
%text = %text @ "\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.wav"));
|
|
alxPlay($AudioTestHandle);
|
|
}
|
|
}
|
|
|
|
function OptAudioUpdateChannelVolume(%channel)
|
|
{
|
|
if (%channel < 1 || %channel > 8)
|
|
return;
|
|
|
|
alxSetChannelVolume(%channel, $pref::Audio::channelVolume[%channel]);
|
|
if (!alxIsPlaying($AudioTestHandle) && %channel == 1)
|
|
{
|
|
$AudioTestHandle = alxCreateSource("AudioChannel"@%channel, expandFilename("~/data/sound/testing.wav"));
|
|
alxPlay($AudioTestHandle);
|
|
}
|
|
}
|
|
|
|
|
|
function OptAudioDriverList::onSelect( %this, %id, %text )
|
|
{
|
|
if (%text $= "")
|
|
return;
|
|
|
|
if ($pref::Audio::driver $= %text)
|
|
return;
|
|
|
|
$pref::Audio::driver = %text;
|
|
OpenALInit();
|
|
}
|
|
|