ironsphererpg/scripts/GameGui.cs
Jusctsch5 a5143b67f7 T2RPG: Initial commit of ironsphererpg directory
Taking everything obtained from http://ironsphererpg2.webs.com/ and dumping it in a git repo
2015-01-18 21:06:06 -06:00

1828 lines
57 KiB
C#

//------------------------------------------------------------------------------
//
// GameGui.cs
//
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
function LaunchGame( %pane )
{
if ( %pane !$= "" )
GameGui.pane = %pane;
LaunchTabView.viewTab( "GAME", GameGui, 0 );
}
//------------------------------------------------------------------------------
function GameGui::onWake( %this )
{
Canvas.pushDialog( LaunchToolbarDlg );
if ( isDemo() || $PlayingOnline )
GM_Frame.setTitle( "GAME" );
else
GM_Frame.setTitle( "LAN GAME" );
// This is essentially an "isInitialized" flag...
if ( GM_TabView.tabCount() == 0 )
{
if ( isDemo() )
{
GM_TabView.addTab( 1, "JOIN" );
GM_TabView.addTab( 2, "HOST" );
%this.pane = "Join";
}
else
{
GM_TabView.addTab( 1, "JOIN" );
GM_TabView.addTab( 2, "HOST" );
GM_TabView.addTab( 3, "WARRIOR SETUP", 1 );
queryMasterGameTypes();
}
}
switch$ ( %this.pane )
{
case "Join":
GM_TabView.setSelected( 1 );
case "Host":
GM_TabView.setSelected( 2 );
default: // "Warrior"
GM_TabView.setSelected( 3 );
}
}
//------------------------------------------------------------------------------
function GameGui::onSleep( %this )
{
%ctrl = "GM_" @ %this.pane @ "Pane";
if ( isObject( %ctrl ) )
%ctrl.onDeactivate();
// if( isObject( $dummySeq ) )
// {
// $dummySeq.delete();
// }
Canvas.popDialog(LaunchToolbarDlg);
}
//------------------------------------------------------------------------------
function GameGui::setKey( %this, %key )
{
// To avoid console error
}
//------------------------------------------------------------------------------
function GameGui::onClose( %this, %key )
{
// To avoid console error
}
//------------------------------------------------------------------------------
function GM_TabView::onAdd( %this )
{
%this.addSet( 1, "gui/shll_horztabbuttonB", "5 5 5", "50 50 0", "5 5 5" );
}
//------------------------------------------------------------------------------
function GM_TabView::onSelect( %this, %id, %text )
{
GM_JoinPane.setVisible( %id == 1 );
GM_HostPane.setVisible( %id == 2 );
GM_WarriorPane.setVisible( %id == 3 );
GM_TabFrame.setAltColor( %this.getTabSet( %id ) != 0 );
%ctrl = "GM_" @ GameGui.pane @ "Pane";
if ( isObject( %ctrl ) )
%ctrl.onDeactivate();
switch ( %id )
{
case 1: // Join
GM_JoinPane.onActivate();
case 2: // Host
GM_HostPane.onActivate();
case 3: // Warrior Setup
GM_WarriorPane.onActivate();
}
}
//------------------------------------------------------------------------------
// Join Game pane:
//------------------------------------------------------------------------------
function GM_JoinPane::onActivate( %this )
{
GameGui.pane = "Join";
if ( %this.onceOnly $= "" )
{
GM_VersionText.setText( "Version" SPC getT2VersionNumber() );
GMJ_StopBtn.setActive( false );
%this.onceOnly = 1;
if ( isDemo() )
GMJ_Browser.lastQuery = "Demo";
else
GMJ_Browser.lastQuery = $PlayingOnline ? "Master" : "LanServers";
GMJ_Browser.runQuery();
}
if ( isObject( BrowserMap ) )
{
BrowserMap.pop();
BrowserMap.delete();
}
new ActionMap( BrowserMap );
if ( !isDemo() )
BrowserMap.bindCmd( keyboard, insert, "GMJ_Browser.insertIPAddress();", "" );
BrowserMap.bindCmd( keyboard, "ctrl f", "Canvas.pushDialog( FindServerDlg );", "" );
BrowserMap.bindCmd( keyboard, F3, "GMJ_Browser.findNextServer();", "" );
BrowserMap.push();
GM_VersionText.setVisible( !isDemo() );
if ( $pref::ServerBrowser::InfoWindowOpen )
Canvas.pushDialog( ServerInfoDlg );
}
//------------------------------------------------------------------------------
function GM_JoinPane::onDeactivate( %this )
{
if ( isObject( BrowserMap ) )
{
BrowserMap.pop();
BrowserMap.delete();
}
GM_VersionText.setVisible( false );
$pref::ServerBrowser::InfoWindowOpen = GMJ_Browser.infoWindowOpen;
if ( GMJ_Browser.infoWindowOpen )
Canvas.popDialog( ServerInfoDlg );
}
//------------------------------------------------------------------------------
$BrowserColumnCount = 0;
$BrowserColumnName[0] = "Server Name";
$BrowserColumnRange[0] = "25 300";
$BrowserColumnCount++;
$BrowserColumnName[1] = "Status";
$BrowserColumnRange[1] = "25 75";
$BrowserColumnCount++;
$BrowserColumnName[2] = "Favorite";
$BrowserColumnRange[2] = "25 75";
$BrowserColumnCount++;
$BrowserColumnName[3] = "Ping";
$BrowserColumnRange[3] = "25 120";
$BrowserColumnCount++;
$BrowserColumnName[4] = "Game Type";
$BrowserColumnRange[4] = "25 200";
$BrowserColumnCount++;
$BrowserColumnName[5] = "Mission Name";
$BrowserColumnRange[5] = "25 300";
$BrowserColumnCount++;
if ( !isDemo() )
{
$BrowserColumnName[6] = "Rules Set";
$BrowserColumnRange[6] = "25 300";
$BrowserColumnCount++;
}
$BrowserColumnName[7] = "# Players (Bots)";
$BrowserColumnRange[7] = "25 150";
$BrowserColumnCount++;
$BrowserColumnName[8] = "CPU";
$BrowserColumnRange[8] = "25 120";
$BrowserColumnCount++;
$BrowserColumnName[9] = "IP Address";
$BrowserColumnRange[9] = "25 200";
$BrowserColumnCount++;
if ( !isDemo() )
{
$BrowserColumnName[10] = "Version";
$BrowserColumnRange[10] = "25 200";
$BrowserColumnCount++;
}
$BrowserColumnName[11] = "Visibility";
$BrowserColumnRange[11] = "25 120";
$BrowserColumnCount++;
//------------------------------------------------------------------------------
function GMJ_Browser::onAdd( %this )
{
// Add the Server Browser columns based on the prefs:
for ( %i = 0; %i < $BrowserColumnCount; %i++ )
{
%key = firstWord( $pref::ServerBrowser::Column[%i] );
if ( $BrowserColumnName[%key] !$= "" && $BrowserColumnRange[%key] !$= "" )
{
%width = getWord( $pref::ServerBrowser::Column[%i], 1 );
%this.addColumn( %key, $BrowserColumnName[%key], %width, firstWord( $BrowserColumnRange[%key] ), getWord( $BrowserColumnRange[%key], 1 ) );
}
}
%this.setSortColumn( $pref::ServerBrowser::SortColumnKey );
%this.setSortIncreasing( $pref::ServerBrowser::SortInc );
}
//------------------------------------------------------------------------------
function updateServerBrowser()
{
GMJ_Browser.sort();
if ( GMJ_Browser.infoWindowOpen )
ServerInfoDlg.update();
}
//------------------------------------------------------------------------------
function updateServerBrowserStatus( %text, %percentage )
{
GMJ_StatusText.setValue( %text );
if ( %percentage >= 0 && %percentage <= 1 )
{
GMJ_ProgressBar.setValue( %percentage );
if ( %percentage == 0 ) // Query is over.
GMJ_StopBtn.setActive( false );
}
}
//------------------------------------------------------------------------------
function GMJ_Browser::runQuery( %this )
{
GMJ_ProgressBar.setValue( 0 );
$JoinGameAddress = "";
GMJ_JoinBtn.setActive( false );
GMJ_RefreshServerBtn.setActive( false );
%this.clearList();
// Clear the Server Info dialog:
SI_InfoWindow.setText( "No server selected." );
SI_ContentWindow.setText( "" );
if ( %this.lastQuery $= "LanServers" )
{
GMJ_StatusText.setValue( "Querying LAN servers..." );
GMJ_FilterBtn.setActive( false );
GMJ_FilterBtn.setVisible( false );
GMJ_FilterText.setText( "LAN Servers" );
queryLanServers( $JoinGamePort );
GMJ_StopBtn.setActive( true );
}
else if ( %this.lastQuery $= "Demo" )
{
GMJ_StatusText.setValue( "Querying the master server..." );
GMJ_FilterBtn.setActive( false );
GMJ_FilterBtn.setVisible( false );
GMJ_FilterText.setText( "Demo Servers" );
queryMasterServer( $JoinGamePort );
GMJ_StopBtn.setActive( true );
}
else
{
GMJ_FilterBtn.setActive( true );
GMJ_FilterBtn.setVisible( true );
if ( $pref::ServerBrowser::activeFilter == 0 )
{
GMJ_StatusText.setValue( "Querying the master server..." );
GMJ_FilterText.setText( "All servers" );
queryMasterServer( $JoinGamePort );
GMJ_StopBtn.setActive( true );
}
else if ( $pref::ServerBrowser::activeFilter == 1 )
{
// Buddy list query:
GMJ_StatusText.setValue( "Fetching buddy list..." );
GMJ_FilterText.setText( "Buddies" );
%this.key = LaunchGui.key++;
DatabaseQueryArray( 5, 0, "", %this, %this.key );
}
else if ( $pref::ServerBrowser::activeFilter == 2 )
{
// Favorites only:
GMJ_FilterText.setText( "Favorites" );
if ( $pref::ServerBrowser::FavoriteCount <= 0 || $pref::ServerBrowser::Favorite[0] $= "" )
{
GMJ_StatusText.setValue( "No favorites found." );
MessageBoxOK( "INVALID FILTER", "You haven't marked any servers as favorites. Click the Favorites column to mark a server as a favorite." );
}
else
{
GMJ_StatusText.setValue( "Querying favorites..." );
queryFavoriteServers();
GMJ_StopBtn.setActive( true );
}
}
else
{
GMJ_StatusText.setValue( "Querying the master server..." );
%filterIndex = $pref::ServerBrowser::activeFilter - 3;
if ( $pref::ServerBrowser::Filter[%filterIndex] !$= "" )
{
%filter = $pref::ServerBrowser::Filter[%filterIndex];
GMJ_FilterText.setText( getField( %filter, 0 ) );
%rulesSet = getField( %filter, 1 );
if ( %rulesSet $= "" )
%rulesSet = "any";
%missionType = getField( %filter, 2 );
if ( %missionType $= "" )
%missionType = "any";
%maxPlayers = getField( %filter, 4 );
if ( %maxPlayers $= "" )
%maxPlayers = 255;
%maxBots = getField( %filter, 7 );
if ( %maxBots $= "" )
%maxBots = 16;
%regionMask = getField( %filter, 5 );
if ( %regionMask $= "" )
%regionMask = 4294967295;
queryMasterServer(
$JoinGamePort,
0, // Flags
%rulesSet, // Rules Set
%missionType, // Mission Type
getField( %filter, 3 ), // Min Players
%maxPlayers, // Max Players
%maxBots, // Max Bots
%regionMask, // Region Mask
getField( %filter, 6 ), // Max Ping
getField( %filter, 8 ), // Min CPU Speed
getField( %filter, 9 ) ); // Filter flags
GMJ_StopBtn.setActive( true );
}
else
{
// Filter is invalid, so fall back to the default:
$pref::ServerBrowser::activeFilter = 0;
GMJ_FilterText.setText( "All servers" );
queryMasterServer( $JoinGamePort );
GMJ_StopBtn.setActive( true );
}
}
}
}
//------------------------------------------------------------------------------
function GMJ_Browser::onDatabaseQueryResult( %this, %status, %resultString, %key )
{
if ( %this.key != %key )
return;
if ( getField( %resultString, 0 ) <= 0 )
{
GMJ_StatusText.setValue( "No buddies found." );
MessageBoxOK( "INVALID FILTER", "You have no buddies in your buddy list!" );
}
else // Prepare for the incoming buddy list:
%this.buddyList = "";
}
//------------------------------------------------------------------------------
function GMJ_Browser::onDatabaseRow( %this, %row, %isLastRow, %key )
{
if ( %this.key != %key )
return;
%buddyName = getField( %row, 0 );
%buddyGuid = getField( %row, 3 );
echo( "Got buddy: \c9\"" @ %buddyName @ "\": " @ %buddyGuid );
%this.buddyList = %this.buddyList $= "" ? %buddyGuid : %this.buddyList TAB %buddyGuid;
if ( %isLastRow )
{
GMJ_StatusText.setValue( "Querying the master server..." );
queryMasterServer(
$JoinGamePort, // Port
0, // Flags
"Any", // Rules Set
"Any", // Mission Type
0, // Min Players
255, // Max Players
16, // Max Bots
0xFFFFFFFF, // Region Mask
0, // Max Ping
0, // Min CPU Speed
0, // Filter flags
%this.buddyList );
GMJ_StopBtn.setActive( true );
%this.buddyList = "";
}
}
//------------------------------------------------------------------------------
function GMJ_Browser::onSelect( %this, %address )
{
GMJ_JoinBtn.setActive( true );
if ( !isServerQueryActive() )
GMJ_RefreshServerBtn.setActive( true );
$JoinGamePassword = "";
$JoinGameAddress = %address;
if ( %this.infoWindowOpen )
ServerInfoDlg.update();
}
//------------------------------------------------------------------------------
function GMJ_Browser::refreshSelectedServer( %this )
{
querySingleServer( $JoinGameAddress );
if ( %this.infoWindowOpen )
ServerInfoDlg.update();
}
//------------------------------------------------------------------------------
function GMJ_Browser::onSetSortKey( %this, %sortKey, %isIncreasing )
{
$pref::ServerBrowser::SortColumnKey = %sortKey;
$pref::ServerBrowser::SortInc = %isIncreasing;
}
//------------------------------------------------------------------------------
function GMJ_Browser::onColumnResize( %this, %column, %newSize, %key )
{
$pref::ServerBrowser::Column[%column] = %key SPC %newSize;
}
//------------------------------------------------------------------------------
function GMJ_Browser::onColumnRepositioned( %this, %oldColumn, %newColumn )
{
// Puke em all...
%count = %this.getNumColumns();
for ( %col = 0; %col < %count; %col++ )
$pref::ServerBrowser::Column[%col] = %this.getColumnKey( %col ) SPC %this.getColumnWidth( %col );
}
//------------------------------------------------------------------------------
function GMJ_Browser::addFavorite( %this, %name, %address )
{
//error( "** addFavorite( \"" @ %name @ "\", " @ %address @ " ) **" );
$pref::ServerBrowser::Favorite[$pref::ServerBrowser::FavoriteCount] = %name TAB %address;
$pref::ServerBrowser::FavoriteCount++;
}
//------------------------------------------------------------------------------
function GMJ_Browser::removeFavorite( %this, %address )
{
//error( "** removeFavorite( " @ %address @ " ) **" );
%foundIt = false;
for ( %i = 0; %i < $pref::ServerBrowser::FavoriteCount; %i++ )
{
if ( !%foundIt )
{
if ( getField( $pref::ServerBrowser::Favorite[%i], 1 ) $= %address )
%foundIt = true;
}
if ( %foundIt )
$pref::ServerBrowser::Favorite[%i] = $pref::ServerBrowser::Favorite[%i + 1];
}
if ( %foundIt )
$pref::ServerBrowser::FavoriteCount--;
}
//------------------------------------------------------------------------------
function GMJ_Browser::insertIPAddress( %this )
{
if ( isServerQueryActive() )
{
BrowserMap.pop();
MessageBoxOK( "ERROR", "Can't insert addresses while a query is running!", "BrowserMap.push();" );
alxPlay( InputDeniedSound, 0, 0, 0 );
return;
}
IPEntry.setText( "IP:" );
Canvas.pushDialog( EnterIPDlg );
}
//------------------------------------------------------------------------------
function EnterIPDlg::onDone( %this )
{
Canvas.popDialog( EnterIPDlg );
%address = IPEntry.getValue();
if ( getSubStr( %address, 0, 3 ) !$= "IP:" )
%address = "IP:" @ %address;
if ( strpos( %address, ":", 3 ) == -1 )
%address = %address @ ":28000";
echo( "Starting ping to server " @ %address @ "..." );
pushServerAddress( %address );
GMJ_Browser.selectRowByAddress( %address, true );
}
//------------------------------------------------------------------------------
function FindServerDlg::onWake( %this )
{
FS_SearchPattern.validate();
FS_SearchPattern.selectAll();
}
//------------------------------------------------------------------------------
function FindServerDlg::onGo( %this )
{
%pattern = FS_SearchPattern.getValue();
if ( %pattern !$= "" )
{
Canvas.popDialog( FindServerDlg );
if ( !GMJ_Browser.findServer( %pattern ) )
MessageBoxOK( "NOT FOUND", "No servers with \"" @ %pattern @ "\" in their name were found." );
}
else
alxPlay( InputDeniedSound, 0, 0, 0 );
}
//------------------------------------------------------------------------------
function FS_SearchPattern::validate( %this )
{
FS_GoBtn.setActive( %this.getValue() !$= "" );
}
//------------------------------------------------------------------------------
function ServerInfoDlg::onAdd( %this )
{
%this.headerStyle = "<font:" @ $ShellLabelFont @ ":" @ $ShellFontSize @ "><color:00DC00>";
}
//------------------------------------------------------------------------------
function ServerInfoDlg::onWake( %this )
{
GMJ_Browser.infoWindowOpen = true;
// Get the position and size from the prefs:
%res = getResolution();
%resW = firstWord( %res );
%resH = getWord( %res, 1 );
%w = firstWord( $pref::ServerBrowser::InfoWindowExtent );
if ( %w > %resW )
%w = %resW;
%h = getWord( $pref::ServerBrowser::InfoWindowExtent, 1 );
if ( %h > %resH )
%h = %resH;
%x = firstWord( $pref::ServerBrowser::InfoWindowPos );
if ( %x > %resW - %w )
%x = %resW - %w;
%y = getWord( $pref::ServerBrowser::InfoWindowPos, 1 );
if ( %y > %resH - %h )
%y = %resH - %h;
SI_Window.resize( %x, %y, %w, %h );
GMJ_InfoBtn.setActive( false );
SI_RefreshBtn.setActive( false );
%this.update();
}
//------------------------------------------------------------------------------
function ServerInfoDlg::update( %this )
{
%status = GMJ_Browser.getServerStatus();
if ( %status $= "invalid" )
{
SI_InfoWindow.setText( "No server selected." );
return;
}
%info = GMJ_Browser.getServerInfoString();
%infoText = "<tab:70><spush>" @ %this.headerStyle @ "NAME:<spop><lmargin:70>" TAB getRecord( %info, 0 )
NL "<lmargin:0><spush>" @ %this.headerStyle @ "ADDRESS:<spop><lmargin:70>" TAB getRecord( %info, 1 ) @ "<lmargin:0>";
%refreshable = false;
if ( %status $= "responded" )
{
%temp = getRecord( %info, 2 );
if ( %temp !$= "" )
%infoText = %infoText NL "<spush>" @ %this.headerStyle @ "RULES SET:<spop><lmargin:70>" TAB %temp @ "<lmargin:0>";
%temp = getRecord( %info, 3 );
if ( %temp $= "" )
%temp = "None";
%infoText = %infoText NL "<spush>" @ %this.headerStyle @ "FLAGS:<spop><lmargin:70>" TAB %temp @ "<lmargin:0>";
%temp = getRecord( %info, 4 );
if ( %temp !$= "" )
%infoText = %infoText NL "<spush>" @ %this.headerStyle @ "GAME TYPE:<spop><lmargin:70>" TAB %temp @ "<lmargin:0>";
%temp = getRecord( %info, 5 );
if ( %temp !$= "" )
%infoText = %infoText NL "<spush>" @ %this.headerStyle @ "MAP NAME:<spop><lmargin:70>" TAB %temp @ "<lmargin:0>";
%temp = getRecords( %info, 6, 10 );
if ( %temp !$= "" )
%infoText = %infoText NL "<spush>" @ %this.headerStyle @ "SERVER INFO:<spop><lmargin:10>" TAB %temp @ "<lmargin:0>";
// Fill in the content window:
%content = GMJ_Browser.getServerContentString();
echo(%content);
SI_ContentWindow.fill( %content );
%refreshable = !isServerQueryActive();
}
else
{
switch$ ( %status )
{
case "new":
%temp = "<spush><color:DCDC00>Not queried yet.<spop>";
SI_ContentWindow.setText( "Not available." );
case "querying":
%temp = "<spush><color:00DC00>Querying...<spop>";
SI_ContentWindow.setText( "Not available." );
case "updating":
%temp = "<spush><color:00DC00>Updating...<spop>";
case "timedOut":
%temp = "<spush><color:DC1A1A>Timed out.<spop>";
SI_ContentWindow.setText( "Not available." );
%refreshable = !isServerQueryActive();
}
%infoText = %infoText NL "<lmargin:0><spush>" @ %this.headerStyle @ "STATUS: <spop><lmargin:70>" TAB %temp;
}
SI_InfoWindow.setText( %infoText );
SI_InfoScroll.scrollToTop();
SI_ContentScroll.scrollToTop();
SI_RefreshBtn.setActive( %refreshable );
}
//------------------------------------------------------------------------------
function SI_ContentWindow::fill( %this, %content )
{
if ( getRecordCount( %content ) == 1 )
{
%this.setText( "" );
return;
}
%record = 0;
%teamCount = getRecord( %content, %record );
%record++;
if ( %teamCount > 1 )
{
%string = "<spush>" @ ServerInfoDlg.headerStyle @ "TEAMS<lmargin%:50>SCORE<spop>";
for ( %i = 0; %i < %teamCount; %i++ )
{
%teamEntry = getRecord( %content, %record );
%string = %string NL "<lmargin:0><clip%:50>" SPC getField( %teamEntry, 0 ) @ "</clip><lmargin%:50>" SPC getField( %teamEntry, 1 );
%record++;
}
%playerCount = getRecord( %content, %record );
%record++;
%string = %string NL "\n<lmargin:0><spush>" @ ServerInfoDlg.headerStyle @ "PLAYERS<lmargin%:40>TEAM<lmargin%:75>SCORE<spop>";
for ( %i = 0; %i < %playerCount; %i++ )
{
%playerEntry = getRecord( %content, %record );
%string = %string NL "<lmargin:0><clip%:40>" SPC getField( %playerEntry, 0 ) @ "</clip><lmargin%:40><clip%:35>"
SPC getField( %playerEntry, 1 ) @ "</clip><lmargin%:75><clip%:25>" SPC getField( %playerEntry, 2 ) @ "</clip>";
%record++;
}
}
else
{
%record++;
%playerCount = getRecord( %content, %record );
%record++;
%string = "<spush>" @ ServerInfoDlg.headerStyle @ "PLAYERS<lmargin%:60>SCORE<spop>";
for ( %i = 0; %i < %playerCount; %i++ )
{
%playerEntry = getRecord( %content, %record );
%string = %string NL "<lmargin:0><clip%:60>" SPC getField( %playerEntry, 0 ) @ "</clip><lmargin%:60>" SPC getField( %playerEntry, 2 );
%record++;
}
}
%this.setText( %string );
}
//------------------------------------------------------------------------------
function ServerInfoDlg::onSleep( %this )
{
GMJ_Browser.infoWindowOpen = false;
// Save off the Server Info Window prefs:
$pref::ServerBrowser::InfoWindowPos = SI_Window.getPosition();
$pref::ServerBrowser::InfoWindowExtent = SI_Window.getExtent();
$pref::ServerBrowser::InfoWindowBarPos = getWord( SI_InfoScroll.getExtent(), 1 );
GMJ_InfoBtn.setActive( true );
}
//------------------------------------------------------------------------------
function PasswordDlg::onWake( %this )
{
$JoinGamePassword = "";
}
//------------------------------------------------------------------------------
function PasswordDlg::accept( %this )
{
Canvas.popDialog( PasswordDlg );
JoinSelectedGame();
}
//------------------------------------------------------------------------------
function JoinSelectedGame()
{
$ServerInfo = GMJ_Browser.getServerInfoString();
JoinGame($JoinGameAddress);
}
//------------------------------------------------------------------------------
function JoinGame(%address)
{
MessagePopup( "JOINING SERVER", "CONNECTING" );
cancelServerQuery();
echo("Joining Server " @ %address);
%playerPref = $pref::Player[$pref::Player::Current];
%playerName = getField( %playerPref, 0 );
%playerRaceGender = getField( %playerPref, 1 );
%playerSkin = getField( %playerPref, 2 );
%playerVoice = getField( %playerPref, 3 );
%playerVoicePitch = getField( %playerPref, 4 );
LoadingGui.gotLoadInfo = "";
connect( %address, $JoinGamePassword, %playerName, %playerRaceGender, %playerSkin, %playerVoice, %playerVoicePitch );
}
//------------------------------------------------------------------------------
// Host Game pane:
//------------------------------------------------------------------------------
function GM_HostPane::onActivate( %this )
{
GameGui.pane = "Host";
$HostGameType = $PlayingOnline ? "Online" : "LAN";
buildMissionTypePopup( GMH_MissionType );
if ( !isDemo() )
{
GMH_BotMinSlider.setValue( $Host::MinBotDifficulty );
GMH_BotMaxSlider.setValue( $Host::MaxBotDifficulty );
GMH_BotsEnabledTgl.setValue( $Host::BotsEnabled );
GMH_BotsEnabledTgl.onAction();
//clamp and set the bot count slider
setBotCountSlider();
}
// Select the saved-off prefs:
if ( $Host::MissionType !$= "" )
{
// Find the last selected type:
for ( %type = 0; %type < $HostTypeCount; %type++ )
{
if ( $HostTypeName[%type] $= $Host::MissionType )
break;
}
if ( %type != $HostTypeCount )
{
GMH_MissionType.setSelected( %type );
GMH_MissionType.onSelect( %type, "" );
if ( $Host::Map !$= "" )
{
// Find the last selected mission:
for ( %index = 0; %index < $HostMissionCount[%type]; %index++ )
{
if ( $HostMissionFile[$HostMission[%type, %index]] $= $Host::Map )
break;
}
if ( %index != $HostMissionCount[%type] )
GMH_MissionList.setSelectedById( $HostMission[%type, %index] );
}
}
}
else
{
GMH_MissionType.setSelected( 0 );
GMH_MissionType.onSelect( 0, "" );
}
GMH_StartGameBtn.makeFirstResponder( 1 );
}
//------------------------------------------------------------------------------
function GM_HostPane::onDeactivate( %this )
{
}
//------------------------------------------------------------------------------
function buildMissionTypePopup( %popup )
{
%popup.clear();
for( %type = 0; %type < $HostTypeCount; %type++ )
%popup.add( $HostTypeDisplayName[%type], %type );
%popup.sort( true );
}
//------------------------------------------------------------------------------
function getMissionTypeDisplayNames()
{
%file = new FileObject();
for ( %type = 0; %type < $HostTypeCount; %type++ )
{
$HostTypeDisplayName[%type] = $HostTypeName[%type];
if ( %file.openForRead( "scripts/" @ $HostTypeName[%type] @ "Game.cs" ) )
{
while ( !%file.isEOF() )
{
%line = %file.readLine();
if ( getSubStr( %line, 0, 17 ) $= "// DisplayName = " )
{
$HostTypeDisplayName[%type] = getSubStr( %line, 17, 1000 );
break;
}
}
}
}
%file.delete();
}
//------------------------------------------------------------------------------
function buildMissionList()
{
%search = "missions/*.mis";
%ct = 0;
$HostTypeCount = 0;
$HostMissionCount = 0;
%fobject = new FileObject();
for( %file = findFirstFile( %search ); %file !$= ""; %file = findNextFile( %search ) )
{
%name = fileBase( %file ); // get the name
%idx = $HostMissionCount;
$HostMissionCount++;
$HostMissionFile[%idx] = %name;
$HostMissionName[%idx] = %name;
if ( !%fobject.openForRead( %file ) )
continue;
%typeList = "None";
while ( !%fobject.isEOF() )
{
%line = %fobject.readLine();
if ( getSubStr( %line, 0, 17 ) $= "// DisplayName = " )
{
// Override the mission name:
$HostMissionName[%idx] = getSubStr( %line, 17, 1000 );
}
else if ( getSubStr( %line, 0, 18 ) $= "// MissionTypes = " )
{
%typeList = getSubStr( %line, 18, 1000 );
break;
}
}
%fobject.close();
// Don't include single player missions:
if ( strstr( %typeList, "SinglePlayer" ) != -1 )
continue;
// Test to see if the mission is bot-enabled:
%navFile = "terrains/" @ %name @ ".nav";
$BotEnabled[%idx] = isFile( %navFile );
for( %word = 0; ( %misType = getWord( %typeList, %word ) ) !$= ""; %word++ )
{
for ( %i = 0; %i < $HostTypeCount; %i++ )
if ( $HostTypeName[%i] $= %misType )
break;
if ( %i == $HostTypeCount )
{
$HostTypeCount++;
$HostTypeName[%i] = %misType;
$HostMissionCount[%i] = 0;
}
// add the mission to the type
%ct = $HostMissionCount[%i];
$HostMission[%i, $HostMissionCount[%i]] = %idx;
$HostMissionCount[%i]++;
}
}
getMissionTypeDisplayNames();
%fobject.delete();
}
// One time only function call:
buildMissionList();
//------------------------------------------------------------------------------
function validateMissionAndType(%misName, %misType)
{
for ( %mis = 0; %mis < $HostMissionCount; %mis++ )
if( $HostMissionFile[%mis] $= %misName )
break;
if ( %mis == $HostMissionCount )
return false;
for ( %type = 0; %type < $HostTypeCount; %type++ )
if ( $HostTypeName[%type] $= %misType )
break;
if(%type == $hostTypeCount)
return false;
$Host::Map = $HostMissionFile[%mis];
$Host::MissionType = $HostTypeName[%type];
return true;
}
//------------------------------------------------------------------------------
// This function returns the index of the next mission in the mission list.
//------------------------------------------------------------------------------
function getNextMission( %misName, %misType )
{
// First find the index of the mission in the master list:
for ( %mis = 0; %mis < $HostMissionCount; %mis++ )
if( $HostMissionFile[%mis] $= %misName )
break;
if ( %mis == $HostMissionCount )
return "";
// Now find the index of the mission type:
for ( %type = 0; %type < $HostTypeCount; %type++ )
if ( $HostTypeName[%type] $= %misType )
break;
if ( %type == $hostTypeCount )
return "";
// Now find the mission's index in the mission-type specific sub-list:
for ( %i = 0; %i < $HostMissionCount[%type]; %i++ )
if ( $HostMission[%type, %i] == %mis )
break;
// Go BACKWARDS, because the missions are in reverse alphabetical order:
if ( %i == 0 )
%i = $HostMissionCount[%type] - 1;
else
%i--;
// If there are bots in the game, don't switch to any maps without
// a NAV file:
if ( $HostGameBotCount > 0 )
{
for ( %j = 0; %j < $HostMissionCount[%type] - 1; %j++ )
{
if ( $BotEnabled[$HostMission[%type, %i]] )
break;
if ( %i == 0 )
%i = $HostMissionCount[%type] - 1;
else
%i--;
}
}
return $HostMission[%type, %i];
}
//------------------------------------------------------------------------------
function GMH_MissionType::onSelect( %this, %id, %text )
{
// Fill the mission list:
GMH_MissionList.clear();
%lastAdded = 0;
for ( %i = 0; %i < $HostMissionCount[%id];%i++ )
{
%misId = $HostMission[%id,%i];
GMH_MissionList.addRow( %misId, $HostMissionName[%misId] );
%lastAdded = %misId;
}
GMH_MissionList.sort( 0 );
// Select the last mission added:
GMH_MissionList.setSelectedById( %lastAdded );
$Host::MissionType = $HostTypeName[%id];
if ( !isDemo() )
{
// Disable all non bot-enabled maps if bots are enabled:
if ( GMH_BotsEnabledTgl.getValue() )
GMH_BotsEnabledTgl.onAction();
}
}
//------------------------------------------------------------------------------
function GMH_MissionList::onSelect( %this, %id, %text )
{
if ( !isDemo() && GMH_BotsEnabledTgl.getValue() )
GMH_StartGameBtn.setActive( $BotEnabled[%id] );
}
//------------------------------------------------------------------------------
function tryToStartHostedGame()
{
if ( !isDemo() && GMH_BotsEnabledTgl.getValue() )
{
%selId = GMH_MissionList.getSelectedId();
if ( !$BotEnabled[%selId] )
return;
}
StartHostedGame();
}
//------------------------------------------------------------------------------
function StartHostedGame()
{
%selId = GMH_MissionList.getSelectedId();
%misFile = $HostMissionFile[%selId];
if ( !isDemo() && $Host::BotsEnabled )
{
validateMaxPlayers();
$HostGameBotCount = $Host::BotCount;
}
else
$HostGameBotCount = 0;
$ServerName = $Host::GameName;
$Host::Map = %misFile;
echo( "exporting server prefs..." );
export( "$Host::*", "prefs/ServerPrefs.cs", false );
if ( $Host::Dedicated )
{
MessageBoxYesNo( "WARNING",
"You are about to launch a dedicated server and quit Tribes 2. Do you want to continue?",
"tryToLaunchDedicatedServer(" @ $Host::PureServer @ ");" );
return;
}
//IRCClient::onJoinGame("", "");
MessagePopup( "STARTING SERVER", "Initializing..." );
Canvas.repaint();
cancelServerQuery();
setNetPort( $Host::Port );
CreateServer( $Host::Map, $Host::MissionType );
%playerPref = $pref::Player[$pref::Player::Current];
%playerName = getField( %playerPref, 0 );
%playerRaceGender = getField( %playerPref, 1 );
%playerSkin = getField( %playerPref, 2 );
%playerVoice = getField( %playerPref, 3 );
%playerVoicePitch = getField( %playerPref, 4 );
localConnect( %playerName, %playerRaceGender, %playerSkin, %playerVoice, %playerVoicePitch );
if(!$RecordDemo)
{
// demos are incompatible with local simulated net params
ServerConnection.setSimulatedNetParams($pref::Net::simPacketLoss, $pref::net::simPing * 0.5);
LocalClientConnection.setSimulatedNetParams($pref::Net::simPacketLoss, $pref::net::simPing * 0.5);
}
}
//------------------------------------------------------------------------------
function tryToLaunchDedicatedServer( %pure )
{
if ( isDemo() )
%numBots = 0;
else
%numBots = $Host::BotsEnabled ? $Host::BotCount : 0;
if ( launchDedicatedServer( $Host::MissionType, $Host::Map, %numBots, %pure ) )
quit();
else
{
error( "Failed to launch the dedicated server." );
schedule( 0, 0, MessageBoxOK, "FAILED", "Tribes 2 failed to launch the dedicated server." );
}
}
//------------------------------------------------------------------------------
function GMH_BotsEnabledTgl::onAction( %this )
{
%count = GMH_MissionList.rowCount();
if ( %this.getValue() )
{
for ( %i = 0; %i < %count; %i++ )
{
%id = GMH_MissionList.getRowId( %i );
GMH_MissionList.setRowActive( %id, $BotEnabled[%id] );
}
GMH_EnableBotsGroup.setVisible(true);
%misId = GMH_MissionList.getSelectedId();
GMH_StartGameBtn.setActive( $BotEnabled[%misId] );
}
else
{
for ( %i = 0; %i < %count; %i++ )
{
%id = GMH_MissionList.getRowId( %i );
GMH_MissionList.setRowActive( %id, true );
}
GMH_EnableBotsGroup.setVisible( false );
GMH_StartGameBtn.setActive( true );
}
}
//------------------------------------------------------------------------------
function updateMinBotDifficulty()
{
%min = GMH_BotMinSlider.getValue();
$Host::MinBotDifficulty = %min;
if ( GMH_BotMaxSlider.getValue() < %min )
GMH_BotMaxSlider.setValue( %min );
}
//------------------------------------------------------------------------------
function updateMaxBotDifficulty()
{
%max = GMH_BotMaxSlider.getValue();
$Host::MaxBotDifficulty = %max;
if ( GMH_BotMinSlider.getValue() > %max )
GMH_BotMinSlider.setValue( %max );
}
//------------------------------------------------------------------------------
function GMH_BotsEnabledTgl::onAction( %this )
{
%count = GMH_MissionList.rowCount();
if ( %this.getValue() )
{
for ( %i = 0; %i < %count; %i++ )
{
%id = GMH_MissionList.getRowId( %i );
GMH_MissionList.setRowActive( %id, $BotEnabled[%id] );
}
GMH_EnableBotsGroup.setVisible(true);
%misId = GMH_MissionList.getSelectedId();
GMH_StartGameBtn.setActive( $BotEnabled[%misId] );
}
else
{
for ( %i = 0; %i < %count; %i++ )
{
%id = GMH_MissionList.getRowId( %i );
GMH_MissionList.setRowActive( %id, true );
}
GMH_EnableBotsGroup.setVisible(false);
GMH_StartGameBtn.setActive( true );
}
}
//------------------------------------------------------------------------------
function validateMaxPlayers()
{
%maxPlayers = GMH_MaxPlayersTE.getValue();
if (%maxPlayers < 1)
%maxPlayers = 1;
if (%maxPlayers > 64)
%maxPlayers = 64;
//reset the value back into the TE
GMH_MaxPlayersTE.setValue(%maxPlayers);
if ( !isDemo() )
{
//and make sure the bot sliders reflect the changes..
setBotCountSlider();
}
}
function setBotCountSlider()
{
%maxBots = 15;
if (%maxBots > $Host::MaxPlayers - 2)
%maxBots = $Host::MaxPlayers - 2;
if ($Host::BotCount > %maxBots + 1)
$Host::BotCount = %maxBots + 1;
if (%maxBots <= 1)
%sliderValue = 0.0;
else
%sliderValue = ($Host::BotCount - 0.95) / %maxBots;
GMH_MinCombatantSlider.setValue(%sliderValue);
}
function setMinCombatants()
{
%maxBots = 16;
if (%maxBots > $Host::MaxPlayers - 1)
%maxBots = $Host::MaxPlayers - 1;
if (%maxBots <= 0)
$Host::BotCount = 0;
else
$Host::BotCount = mFloor( GMH_MinCombatantSlider.getValue() * (%maxBots - 1)) + 1;
GMH_BotCountText.setValue( "(" @ $Host::BotCount @ ")" );
}
//------------------------------------------------------------------------------
function AdvancedHostDlg::onWake( %this )
{
// Set all of the controls to the current pref states:
AH_HostPort.setText( $Host::Port );
if ( $Host::HiVisibility )
AH_HiVisibilityRdo.setValue( true );
else
AH_HiFPSRdo.setValue( true );
AH_DedicatedTgl.setValue( $Host::Dedicated );
AH_DedicatedTgl.onAction();
AH_TeamDamageTgl.setValue( $Host::TeamDamageOn );
AH_TournamentTgl.setValue( $Host::TournamentMode );
AH_AdminVoteTgl.setValue( $Host::allowAdminPlayerVotes );
AH_AllowSmurfTgl.setValue( !$Host::NoSmurfs );
AH_TimeLimit.setText( $Host::TimeLimit );
AH_AdminPassword.setText( $Host::AdminPassword );
AH_ServerInfo.setText( $Host::Info );
AH_VotePassSlider.setValue( $Host::VotePassPercent );
AH_VoteTimeSlider.setValue( $Host::VoteTime );
AH_RespawnSlider.setValue( $Host::PlayerRespawnTimeout );
AH_WarmupSlider.setValue( $Host::WarmupTime );
}
//------------------------------------------------------------------------------
function AdvancedHostDlg::accept( %this )
{
// Apply all of the changes:
$Host::Port = AH_HostPort.getValue();
$Host::HiVisibility = AH_HiVisibilityRdo.getValue();
$Host::Dedicated = AH_DedicatedTgl.getValue();
if ( $Host::Dedicated )
$Host::PureServer = AH_PureServerTgl.getValue();
$Host::TeamDamageOn = AH_TeamDamageTgl.getValue();
$Host::TournamentMode = AH_TournamentTgl.getValue();
$Host::allowAdminPlayerVotes = AH_AdminVoteTgl.getValue();
$Host::NoSmurfs = !AH_AllowSmurfTgl.getValue();
$Host::TimeLimit = AH_TimeLimit.getValue();
$Host::AdminPassword = AH_AdminPassword.getValue();
$Host::Info = AH_ServerInfo.getText();
$Host::VotePassPercent = mFloor( AH_VotePassSlider.getValue() );
$Host::VoteTime = mFloor( AH_VoteTimeSlider.getValue() );
$Host::PlayerRespawnTimeout = mFloor( AH_RespawnSlider.getValue() );
$Host::WarmupTime = mFloor( AH_WarmupSlider.getValue() );
// Save off the new prefs:
export( "$Host::*", "prefs/ServerPrefs.cs", false );
Canvas.popDialog( AdvancedHostDlg );
}
//------------------------------------------------------------------------------
function AH_DedicatedTgl::onAction( %this )
{
if ( %this.getValue() )
{
AH_PureServerTgl.setValue( $Host::PureServer );
AH_PureServerTgl.setActive( true );
}
else
{
AH_PureServerTgl.setValue( false );
AH_PureServerTgl.setActive( false );
}
}
//------------------------------------------------------------------------------
function AH_VotePassText::update( %this )
{
%this.setText( mFloor( AH_VotePassSlider.getValue() ) @ "%" );
}
//------------------------------------------------------------------------------
function AH_VoteTimeText::update( %this )
{
%this.setText( mFloor( AH_VoteTimeSlider.getValue() ) SPC "seconds" );
}
//------------------------------------------------------------------------------
function AH_RespawnText::update( %this )
{
%this.setText( mFloor( AH_RespawnSlider.getValue() ) SPC "seconds" );
}
//------------------------------------------------------------------------------
function AH_WarmupText::update( %this )
{
%this.setText( mFloor( AH_WarmupSlider.getValue() ) SPC "seconds" );
}
//------------------------------------------------------------------------------
// Warrior Setup pane:
//------------------------------------------------------------------------------
function GM_WarriorPane::onActivate( %this )
{
GameGui.pane = "Warrior";
if ( $pref::Player::Count == 0 )
%this.createNewAlias();
else
{
// Fill the warrior list:
GMW_WarriorPopup.clear();
GMW_LightRdo.setValue( true );
// First add the warrior corresponding to the player nickname:
%this.warriorIndex = -1;
if ( $PlayingOnline )
{
%warrior = getField( WONGetAuthInfo(), 0 );
for ( %i = 0; %i < $pref::Player::Count; %i++ )
{
%name = getField( $pref::Player[%i], 0 );
if ( %name $= %warrior )
{
%this.warriorIndex = %i;
GMW_WarriorPopup.add( %name, %i, 1 );
break;
}
}
}
// Add the rest of the aliases:
for ( %count = 0; %count < $pref::Player::Count; %count++ )
{
if ( $pref::Player[%count] !$= "" && %count != %this.warriorIndex )
{
%name = stripTrailingSpaces( strToPlayerName( getField( $pref::Player[%count], 0 ) ) );
GMW_WarriorPopup.add( %name, %count );
}
}
// Fill the static menus:
GMW_RaceGenderPopup.fillList();
GMW_SkinPrefPopup.fillList();
// Select the current player:
GMW_WarriorPopup.setSelected( $pref::Player::Current );
GMW_WarriorPopup.onSelect( $pref::Player::Current, "" );
if ( $pref::Player::Count > 1 && $pref::Player::Current != %this.warriorIndex )
GMW_DeleteWarriorBtn.setActive( true );
else
GMW_DeleteWarriorBtn.setActive( false );
GMW_PlayerPageBtn.setVisible( $PlayingOnline );
}
}
//------------------------------------------------------------------------------
function GM_WarriorPane::onDeactivate( %this )
{
}
//------------------------------------------------------------------------------
function GM_WarriorPane::createNewAlias( %this )
{
NW_NameEdit.setValue( "" );
NW_DoneBtn.setActive( false );
NW_CancelBtn.setVisible( $pref::Player::Count > 0 );
Canvas.pushDialog( NewWarriorDlg );
}
//------------------------------------------------------------------------------
function GM_WarriorPane::deleteWarrior( %this )
{
MessageBoxYesNo( "CONFIRM", "Are you sure you want to delete this alias?", "doDeleteWarrior();", "" );
}
//------------------------------------------------------------------------------
function doDeleteWarrior()
{
// Make sure we aren't trying to delete the default warrior (should never get this):
if ( $pref::Player::Current == GM_WarriorPane.warriorIndex )
return;
for ( %i = $pref::Player::Current; %i < $pref::Player::Count - 1; %i++ )
$pref::Player[%i] = $pref::Player[%i + 1];
$pref::Player[%i] = "";
if ( GM_WarriorPane.warriorIndex > $pref::Player::Current )
GM_WarriorPane.warriorIndex--;
$pref::Player::Count--;
if ( GM_WarriorPane.warriorIndex != -1 )
$pref::Player::Current = GM_WarriorPane.warriorIndex;
else
$pref::Player::Current = 0;
// Update the interface:
GM_WarriorPane::onActivate();
}
//------------------------------------------------------------------------------
function GM_WarriorPane::gotoPlayerPage( %this )
{
%warrior = getField( WONGetAuthInfo(), 0 );
LaunchBrowser( %warrior, "Warrior" );
}
//------------------------------------------------------------------------------
function GMW_PlayerModel::update( %this )
{
// Get the shape names:
if ( GMW_HeavyRdo.getValue() )
%armor = "heavy";
else if ( GMW_MediumRdo.getValue() )
%armor = "medium";
else
%armor = "light";
switch ( GMW_RaceGenderPopup.getSelected() )
{
case 1:
if ( %armor $= "heavy" )
%shape = %armor @ "_male";
else
%shape = %armor @ "_female";
case 2: %shape = "bioderm_" @ %armor;
default: %shape = %armor @ "_male";
}
%skin = getField( $pref::Player[$pref::Player::Current], 2 );
echo(%skin);
// if( isObject( $dummySeq ) )
// {
// $dummySeq.delete();
// }
//
// $dummySeq = new TSShapeConstructor()
// {
// baseShape = %shape @ ".dts";
// sequence0 = %shape @ "_forward.dsq dummyRun";
// };
%this.setModel( %shape, %skin );
}
//------------------------------------------------------------------------------
function GMW_WarriorPopup::onAdd( %this )
{
%this.addScheme( 1, "255 255 0", "255 255 128", "128 128 0" );
}
//------------------------------------------------------------------------------
function GMW_WarriorPopup::onSelect( %this, %id, %text )
{
// Set this as the currently selected player:
$pref::Player::Current = %id;
// Select the race/gender:
%raceGender = getField( $pref::Player[%id], 1 );
%selId = GMW_RaceGenderPopup.findText( %raceGender );
if ( %selId == -1 )
%selId = 0;
GMW_RaceGenderPopup.setSelected( %selId );
GMW_VoicePopup.fillList( %selId );
// Select the skin:
%skin = getField( $pref::Player[%id], 2 );
%baseSkin = isDynamixSkin( %skin );
GMW_SkinPrefPopup.setSelected( !%baseSkin );
GMW_SkinPopup.fillList( %selId );
%selId = -1;
for ( %i = 0; %i < GMW_SkinPopup.size(); %i++ )
{
if ( GMW_SkinPopup.realSkin[%i] !$= "" )
{
if ( %skin $= GMW_SkinPopup.realSkin[%i] )
{
%selId = %i;
break;
}
}
else if ( %skin $= GMW_SkinPopup.getTextById( %i ) )
{
%selId = %i;
break;
}
}
if ( %selId == -1 )
%selId = 0;
GMW_SkinPopup.setSelected( %selId );
GMW_SkinPopup.onSelect( %selId, GMW_SkinPopup.getTextById( %selId ) );
// Select the voice:
%voice = getField( $pref::Player[%id], 3 );
%voiceId = getSubStr( %voice, strlen( %voice ) -1, 1000 ) - 1;
GMW_VoicePopup.setSelected( %voiceId );
GMW_VoicePopup.voiceIndex = 0;
GMW_DeleteWarriorBtn.setActive( $pref::Player::Count > 1 && %id != GM_WarriorPane.warriorIndex );
}
//------------------------------------------------------------------------------
function GMW_RaceGenderPopup::fillList( %this )
{
if ( %this.size() )
return;
%this.add( "Human Male", 0 );
%this.add( "Human Female", 1 );
%this.add( "Bioderm", 2 );
}
//------------------------------------------------------------------------------
function GMW_RaceGenderPopup::onSelect( %this, %id, %text )
{
// Update the player pref:
$pref::Player[$pref::Player::Current] = setField( $pref::Player[$pref::Player::Current], 1, %this.getText() );
// Fill the skin list:
%prevSkin = GMW_SkinPopup.getText();
GMW_SkinPopup.fillList( %id );
%selId = GMW_SkinPopup.findText( %prevSkin );
if ( %selId == -1 )
%selId = 0;
GMW_SkinPopup.setSelected( %selId );
GMW_SkinPopup.onSelect( %selId, GMW_SkinPopup.getTextById( %selId ) );
// Fill the voice list:
%prevVoice = GMW_VoicePopup.getText();
GMW_VoicePopup.fillList( %id );
%selId = GMW_VoicePopup.findText( %prevVoice );
if ( %selId == -1 )
%selId = 0;
GMW_VoicePopup.setSelected( %selId );
GMW_VoicePopup.onSelect( %selId, "" );
}
//------------------------------------------------------------------------------
function GMW_SkinPrefPopup::fillList( %this )
{
if ( %this.size() )
return;
%this.add( "Dynamix Skins", 0 );
%this.add( "Custom Skins", 1 );
}
//------------------------------------------------------------------------------
function GMW_SkinPrefPopup::onSelect( %this, %id, %text )
{
%curSkin = GMW_SkinPopup.getText();
GMW_SkinPopup.fillList( GMW_RaceGenderPopup.getSelected() );
%selId = GMW_SkinPopup.findText( %curSkin );
if ( %selId == -1 )
%selId = 0;
if ( GMW_SkinPopup.size() )
{
GMW_SkinPopup.setSelected( %selId );
GMW_SkinPopup.onSelect( %selId, GMW_SkinPopup.getTextById( %selId ) );
}
}
//------------------------------------------------------------------------------
$SkinCount = 0;
$Skin[$SkinCount, name] = "Blood Eagle";
$Skin[$SkinCount, code] = "beagle";
$SkinCount++;
$Skin[$SkinCount, name] = "Diamond Sword";
$Skin[$SkinCount, code] = "dsword";
$SkinCount++;
$Skin[$SkinCount, name] = "Starwolf";
$Skin[$SkinCount, code] = "swolf";
$SkinCount++;
$Skin[$SkinCount, name] = "Phoenix";
$Skin[$SkinCount, code] = "cotp";
$SkinCount++;
$Skin[$SkinCount, name] = "Storm";
$Skin[$SkinCount, code] = "base";
$SkinCount++;
$Skin[$SkinCount, name] = "Inferno";
$Skin[$SkinCount, code] = "baseb";
$SkinCount++;
$Skin[$SkinCount, name] = "Horde";
$Skin[$SkinCount, code] = "horde";
$SkinCount++;
//------------------------------------------------------------------------------
function isDynamixSkin( %skin )
{
for ( %i = 0; %i < $SkinCount; %i++ )
{
if ( %skin $= $Skin[%i, code] )
return( true );
}
return( false );
}
//------------------------------------------------------------------------------
function GMW_SkinPopup::fillList( %this, %raceGender )
{
for ( %i = 0; %i < %this.size(); %i++ )
%this.realSkin[%i] = "";
%this.clear();
%path = "textures/skins/";
switch ( %raceGender )
{
case 0: // Human Male
%pattern = ".lmale.png";
case 1: // Human Female
%pattern = ".lfemale.png";
case 2: // Bioderm
%pattern = ".lbioderm.png";
}
%customSkins = GMW_SkinPrefPopup.getSelected();
%count = 0;
for ( %file = findFirstFile( %path @ "*" @ %pattern ); %file !$= ""; %file = findNextFile( %path @ "*" @ %pattern ) )
{
%skin = getSubStr( %file, strlen( %path ), strlen( %file ) - strlen( %path ) - strlen( %pattern ) ); // strip off the path and postfix
// Make sure this is not a bot skin:
if ( %skin !$= "basebot" && %skin !$= "basebbot" )
{
// See if this skin has an alias:
%baseSkin = false;
for ( %i = 0; %i < $SkinCount; %i++ )
{
if ( %skin $= $Skin[%i, code] )
{
%baseSkin = true;
%skin = $Skin[%i, name];
break;
}
}
if ( %customSkins != %baseSkin )
{
if ( %baseSkin )
%this.realSkin[%count] = $Skin[%i, code];
%this.add( %skin, %count );
%count++;
}
}
}
%this.sort( true );
}
//------------------------------------------------------------------------------
function GMW_SkinPopup::onSelect( %this, %id, %text )
{
// Update the player pref:
if ( %this.realSkin[%id] !$= "" )
$pref::Player[$pref::Player::Current] = setField( $pref::Player[$pref::Player::Current], 2, %this.realSkin[%id] );
else
$pref::Player[$pref::Player::Current] = setField( $pref::Player[$pref::Player::Current], 2, %text );
// Update the player model:
GMW_PlayerModel.update();
}
//------------------------------------------------------------------------------
// TRANSLATE these voice set display names:
$MaleVoiceCount = 0;
$MaleVoiceName[$MaleVoiceCount] = "Hero";
$MaleVoiceCount++;
$MaleVoiceName[$MaleVoiceCount] = "Iceman";
$MaleVoiceCount++;
$MaleVoiceName[$MaleVoiceCount] = "Rogue";
$MaleVoiceCount++;
$MaleVoiceName[$MaleVoiceCount] = "Hardcase";
$MaleVoiceCount++;
$MaleVoiceName[$MaleVoiceCount] = "Psycho";
$MaleVoiceCount++;
$FemaleVoiceCount = 0;
$FemaleVoiceName[$FemaleVoiceCount] = "Heroine";
$FemaleVoiceCount++;
$FemaleVoiceName[$FemaleVoiceCount] = "Professional";
$FemaleVoiceCount++;
$FemaleVoiceName[$FemaleVoiceCount] = "Cadet";
$FemaleVoiceCount++;
$FemaleVoiceName[$FemaleVoiceCount] = "Veteran";
$FemaleVoiceCount++;
$FemaleVoiceName[$FemaleVoiceCount] = "Amazon";
$FemaleVoiceCount++;
$DermVoiceCount = 0;
$DermVoiceName[$DermVoiceCount] = "Warrior";
$DermVoiceCount++;
$DermVoiceName[$DermVoiceCount] = "Monster";
$DermVoiceCount++;
$DermVoiceName[$DermVoiceCount] = "Predator";
$DermVoiceCount++;
//------------------------------------------------------------------------------
function GMW_VoicePopup::fillList( %this, %raceGender )
{
%this.clear();
switch ( %raceGender )
{
case 0: // Human Male
for ( %i = 0; %i < $MaleVoiceCount; %i++ )
%this.add( $MaleVoiceName[%i], %i );
case 1: // Human Female
for ( %i = 0; %i < $FemaleVoiceCount; %i++ )
%this.add( $FemaleVoiceName[%i], %i );
case 2: // Bioderm
for ( %i = 0; %i < $DermVoiceCount; %i++ )
%this.add( $DermVoiceName[%i], %i );
}
}
//------------------------------------------------------------------------------
function GMW_VoicePopup::onSelect( %this, %id, %text )
{
// Update the player pref:
switch ( GMW_RaceGenderPopup.getSelected() )
{
case 0: %base = "Male";
case 1: %base = "Fem";
case 2: %base = "Derm";
}
$pref::Player[$pref::Player::Current] = setField( $pref::Player[$pref::Player::Current], 3, %base @ ( %id + 1 ) );
%this.voiceIndex = 0;
}
//------------------------------------------------------------------------------
function GMW_VoicePitchSlider::setPitch(%this)
{
}
function GMW_VoicePopup::test( %this )
{
switch ( %this.voiceIndex )
{
case 0: %file = "gbl.hi";
case 1: %file = "gbl.brag";
case 2: %file = "gbl.woohoo";
case 3: %file = "gbl.rock";
case 4: %file = "gbl.obnoxious";
case 5: %file = "gbl.shazbot";
}
switch ( GMW_RaceGenderPopup.getSelected() )
{
case 0: %base = "Male";
case 1: %base = "Fem";
case 2: %base = "Derm";
}
GMW_VoiceTestBtn.setActive( false );
%voiceId = %this.getSelected() + 1;
%wav = "voice/" @ %base @ %voiceId @ "/" @ %file @ ".wav";
%handle = alxCreateSource( AudioGui, %wav );
//pitch the voice
//%pitchSliderVal = GMW_VoicePitchSlider.getValue();
//%pitch = getValidVoicePitch(%voiceId, %pitchSliderVal);
//if (%pitch != 1.0)
// alxSourcef(%handle, "AL_PITCH", %pitch);
alxPlay( %handle );
%delay = alxGetWaveLen( %wav );
schedule( %delay, 0, "restoreVoiceTestButton" );
if ( %this.voiceIndex == 5 )
%this.voiceIndex = 0;
else
%this.voiceIndex++;
}
//------------------------------------------------------------------------------
function restoreVoiceTestButton()
{
GMW_VoiceTestBtn.setActive( true );
}
//------------------------------------------------------------------------------
function NewWarriorDlg::createPlayer( %this )
{
%name = stripTrailingSpaces( NW_NameEdit.getValue() );
$pref::Player[$pref::Player::Count] = %name @ "\tHuman Male\tbeagle\tMale1";
$pref::Player::Current = $pref::Player::Count;
$pref::Player::Count++;
Canvas.popDialog( NewWarriorDlg );
GM_WarriorPane.onActivate(); // Refresh the warrior gui
}
//------------------------------------------------------------------------------
function NW_NameEdit::checkValidPlayerName( %this )
{
%name = %this.getValue();
%test = strToPlayerName( %name );
if ( %name !$= %test )
%this.setValue( %test );
NW_DoneBtn.setActive( strlen( stripTrailingSpaces( %test ) ) > 2 );
}
//------------------------------------------------------------------------------
function NW_NameEdit::processEnter( %this )
{
%this.checkValidPlayerName();
if ( NW_DoneBtn.isActive() )
NewWarriorDlg.createPlayer();
}