Main Page | Alphabetical List | Compound List | File List | Compound Members | File Members

GMENU.C

Go to the documentation of this file.
00001 
00002 //
00003 //      GMenu.c
00004 //
00005 //      Copyright (c) 1997, Eclipse Entertainment; All rights reserved.
00006 //
00007 //      Game menu management layer.
00008 //
00009 //      History
00010 //      -------
00011 //
00012 //      Peter Siamidis  07/08/98        Created.
00013 //
00015 #define WIN32_LEAN_AND_MEAN
00016 #pragma warning ( disable : 4201 4214 )
00017 #include <windows.h>
00018 #pragma warning ( default : 4201 4214 )
00019 #include <assert.h>
00020 #include <string.h>
00021 #include "GMenu.h"
00022 #include "Menu.h"
00023 #include "ipaddr.h"
00024 #include "AutoSelect.h"
00025 
00026 #include "Errorlog.h"
00027 
00028 #include "Host.h"
00029 
00030 // this is ugly
00031 extern Host_Host                *Host;
00032 extern geSound_System   *SoundSys;
00033 extern geEngine                 *Engine;        
00034 extern geBoolean         ShowStats;
00035 extern geDriver                 *ChangeDisplaySelection;
00036 extern geBoolean                 ChangingDisplayMode;
00037 
00038 #define GMENU_VERSION           0x100
00039 
00040 #define NUM_MAPPED_KEYS         7
00041 
00042 #define GAMMA_MAXIMUM           (4.0f)
00043 
00044 #define SMALL_MENU_CUTOFF_WIDTH (512)
00045 #define SMALL_CREDITS_CUTOFF_WIDTH (640)
00046 
00047 #define GMENU_DRIVER_LEFT_EDGE (50)
00048 
00050 //      Keyboard mappings ( action, wParam, lParam )
00052 typedef struct
00053 {
00054         int32 Action;           // game action identifier
00055         int32 wParam;           // wParam from WM_KEYDOWN message
00056         int32 lParam;           // lParam from WM_KEYDOWN message
00057 } GMenu_SingleKeyMapping;
00058 
00059 static GMenu_SingleKeyMapping OriginalKeyMapping[NUM_MAPPED_KEYS] =
00060 {
00061         { GMenu_KeyShoot, VK_LBUTTON, 1 },
00062         { GMenu_KeyJump, VK_RBUTTON, 2 },
00063         { GMenu_KeyStrafeLeft, VK_LEFT, 21692417 },
00064         { GMenu_KeyStrafeRight, VK_RIGHT, 21823489 },
00065         { GMenu_KeyForward, VK_UP, 21495809 },
00066         { GMenu_KeyBackward, VK_DOWN, 22020097 },
00067         { GMenu_KeyNextWeapon, VK_CONTROL, 18677761 }
00068 };
00069 
00070 
00071 static GMenu_SingleKeyMapping KeyMapping[NUM_MAPPED_KEYS] =
00072 {
00073         { GMenu_KeyShoot, VK_LBUTTON, 1 },
00074         { GMenu_KeyJump, VK_RBUTTON, 2 },
00075         { GMenu_KeyStrafeLeft, VK_LEFT, 21692417 },
00076         { GMenu_KeyStrafeRight, VK_RIGHT, 21823489 },
00077         { GMenu_KeyForward, VK_UP, 21495809 },
00078         { GMenu_KeyBackward, VK_DOWN, 22020097 },
00079         { GMenu_KeyNextWeapon, VK_CONTROL, 18677761 }
00080 };
00081 
00082 //undone
00083 int32           KeyLut[256];
00084 geBoolean       MouseInvert = GE_FALSE;
00085 int32           MenuBotCount = 1;
00086 
00087 #define GMENU_MAX_DISPLAY_MODES 20
00088 
00089 //      Globals
00091 static Menu_T                           *MainMenu = NULL;
00092 static Menu_T                           *SingleMapMenu = NULL;
00093 static Menu_T                           *OptionsMenu = NULL;
00094 static Menu_T                           *BotsMenu = NULL;
00095 static Menu_T                           *JoinMenu = NULL;
00096 static Menu_T                           *CreateNetMenu = NULL;
00097 static Menu_T                           *ControlMenu = NULL;
00098 static Menu_T                           *ActiveMenu = NULL;
00099 static Menu_T                           *CreditsMenu = NULL;
00100 static Menu_T                           *DriverMenu = NULL;
00101 static Menu_T                           *ModeMenuList[GMENU_MAX_DISPLAY_MODES];
00102 static geBitmap                         *SliderBar = NULL;
00103 static geBitmap                         *SliderRange = NULL;
00104 static geBitmap                         *CreditsArt = NULL;
00105 static geEngine                         *SaveEngine = NULL;
00106 static float                            VolumePercent = 0.7f;
00107 static float                            BotPercent = 0.25f;
00108 
00109 float                                           UserGamma = 1.0f;
00110 
00111 
00112 
00113 Menu_T *GMenu_GetMenu(int32 Id)
00114 {
00115         switch(Id)
00116         {
00117                 case GMenu_NameEntry:
00118                         return OptionsMenu;
00119 
00120                 case GMenu_IPEntry:
00121                         return JoinMenu;
00122         }
00123 
00124         return NULL;    // Not found
00125 }
00126 
00127 
00128 int MyGetKeyNameText( int lParam, char *KeyText, int Size)
00129 {
00130         // get name of key that was pressed
00131         if ( lParam == 1 )
00132         {
00133                 strcpy( KeyText, "Left Mouse Button" );
00134         }
00135         else if ( lParam == 2 )
00136         {
00137                 strcpy( KeyText, "Right Mouse Button" );
00138         }
00139         else
00140         {
00141                 return (GetKeyNameText( lParam, KeyText, Size));
00142         }
00143 
00144         return 1;
00145 }
00146 
00148 //
00149 //      GMenu_SetKeyMapping()
00150 //
00151 //      Set a new keyboard mapping.
00152 //
00154 static geBoolean GMenu_SetKeyMapping(
00155         int32   Identifier,     // control type whose mapping will be changed
00156         int32   wParam,         // wParam
00157         int32   lParam )        // lParam
00158 {
00159         int32   i;
00160 
00161         // set new mapping
00162         for ( i = 0; i < NUM_MAPPED_KEYS; i++ )
00163         {
00164                 if ( KeyMapping[i].Action == Identifier )
00165                 {
00166                         KeyMapping[i].wParam = wParam;
00167                         KeyMapping[i].lParam = lParam;
00168                         return GE_TRUE;
00169                 }
00170         }
00171 
00172         // if we got to here then no mapping was set
00173         assert( 0 );
00174         return GE_FALSE;
00175 
00176 } // GMenu_SetKeyMapping()
00177 
00178 
00179 
00181 //
00182 //      GMenu_GetKeyLParam()
00183 //
00184 //      Gets a keys lParam mapping.
00185 //
00187 static int32 GMenu_GetKeyLParam(
00188         int32   Identifier )    // whose lParam we want
00189 {
00190         int32   i;
00191 
00192         // set new mapping
00193         for ( i = 0; i < NUM_MAPPED_KEYS; i++ )
00194         {
00195                 if ( KeyMapping[i].Action == Identifier )
00196                 {
00197                         return KeyMapping[i].lParam;
00198                 }
00199         }
00200         return -1;
00201 } // GMenu_GetKeyLParam()
00202 
00203 static int32 GMenu_GetOriginalKeyMapping(
00204         int32   Identifier )    // whose lParam we want
00205 {
00206         int32   i;
00207 
00208         for ( i = 0; i < NUM_MAPPED_KEYS; i++ )
00209         {
00210                 if ( OriginalKeyMapping[i].Action == Identifier )
00211                 {
00212                         return OriginalKeyMapping[i].wParam;
00213                 }
00214         }
00215         return -1;
00216 } // GMenu_GetOriginalKeyMapping
00217 
00218 
00219 
00220 
00222 //
00223 //      GMenu_IsAMenuActive()
00224 //
00225 //      Determines if any menu is currently active.
00226 //
00228 geBoolean GMenu_IsAMenuActive(
00229         void )  // no parameters
00230 {
00231         if ( ActiveMenu == NULL )
00232         {
00233                 return GE_FALSE;
00234         }
00235         else
00236         {
00237                 return GE_TRUE;
00238         }
00239 
00240 } // GMenu_IsAMenuActive()
00241         
00243 //
00244 //      GMenu_SetActive(geBoolean Active)
00245 //
00247 void GMenu_SetActive(geBoolean Active)
00248 {
00249         if (!Active)
00250                 ActiveMenu = NULL;
00251         else
00252                 ActiveMenu = MainMenu;
00253 }
00254 
00255 
00256 
00257 static geBoolean GMenu_BuildDisplayModeMenus(geEngine *Engine, 
00258                                                                 ModeList *List, int ListLength, int ListSelection, 
00259                                                                 int Width, int Top, int Bottom)
00260 {
00261         MenuItemChecked_T        CheckedItem;
00262         int                                      DriverNumber   = 0;
00263         int                                      i,j;
00264         int                                      DriverCount;
00265         geDriver                        *IndexTable[GMENU_MAX_DISPLAY_MODES];
00266         int                                      CountTable[GMENU_MAX_DISPLAY_MODES];
00267 
00268         assert( List != NULL );
00269         assert( ListLength >=0 );
00270         assert( ListSelection >=0 );
00271         assert( ListSelection < ListLength );
00272 
00273         DriverMenu = Menu_Create( Engine, Width, Top, Bottom, 0, 0, GMenu_DriverMenu );
00274         if ( MainMenu == NULL )
00275                 {
00276                         geErrorLog_AddString(-1,"GMenu_BuildDisplayModeMenus: Failed to create driver menu",NULL);
00277                         return GE_FALSE;
00278                 }
00279 
00280         if (ListLength==0)
00281                 return GE_TRUE;
00282 
00283         DriverNumber = 0;
00284         for (i=0; i<ListLength; i++)
00285                 {
00286                         int AlreadyAdded=0;
00287                         
00288                         for (j=0; j<i; j++)
00289                                 {
00290                                         if (List[j].Driver == List[i].Driver)   // only add one entry for each driver.
00291                                                 AlreadyAdded = 1;
00292                                 }
00293                         
00294                         if (!AlreadyAdded)
00295                                 {
00296                                         ModeMenuList[DriverNumber] = Menu_Create( Engine, Width, Top, Bottom, 0, 0, GMenu_ModeMenu+DriverNumber );
00297                                         if ( ModeMenuList[DriverNumber] == NULL )
00298                                                 {
00299                                                         geErrorLog_AddString(-1,"GMenu_BuildDisplayModeMenus: Failed to create driver menu",NULL);
00300                                                         return GE_FALSE;
00301                                                 }
00302                                         CheckedItem.NormalFont  = Font_Default;
00303                                         CheckedItem.SelectFont  = (Width<SMALL_MENU_CUTOFF_WIDTH)?Font_Small:Font_DefaultSelect;
00304                                         strncpy(CheckedItem.Label,(char *)List[i].DriverNamePtr,MENUITEM_MAX_CHECKED_LABEL-1);
00305                                         CheckedItem.LabelLength = strlen( CheckedItem.Label );
00306                                         CheckedItem.ActiveItem  = List[i].Driver == List[ListSelection].Driver;
00307                                         CheckedItem.LabelPosition = GMENU_DRIVER_LEFT_EDGE;
00308                                         Menu_AddItem( DriverMenu, Menu_ItemChecked, GMenu_Driver + DriverNumber, &CheckedItem );
00309                                         
00310                                         IndexTable[DriverNumber] = List[i].Driver;
00311                                         CountTable[DriverNumber] = 0;
00312                                         DriverNumber ++;
00313                                 }
00314                         if (DriverNumber >= GMENU_MAX_DISPLAY_MODES)
00315                                 break;
00316                 }
00317 
00318         DriverCount = DriverNumber;
00319         for (i=0; i<ListLength; i++)
00320                 {
00321                         DriverNumber = -1;
00322                         for (j=0; j<DriverCount; j++)
00323                                 {
00324                                         if (IndexTable[j] == List[i].Driver)
00325                                                 {
00326                                                         DriverNumber = j; 
00327                                                         break;
00328                                                 }
00329                                 }
00330                         assert( DriverNumber >= 0 );
00331 
00332                         CheckedItem.NormalFont  = Font_Default;
00333                         CheckedItem.SelectFont  = Font_DefaultSelect;
00334                         strncpy(CheckedItem.Label,(char *)List[i].ModeNamePtr,MENUITEM_MAX_CHECKED_LABEL-1);
00335                         CheckedItem.LabelLength = strlen( CheckedItem.Label );
00336                         CheckedItem.ActiveItem  = List[i].Mode == List[ListSelection].Mode;
00337                         CheckedItem.LabelPosition = Width/4;
00338                         CheckedItem.UserData    = (int32) i;
00339                         Menu_AddItem( ModeMenuList[DriverNumber], Menu_ItemChecked, GMenu_Mode + CountTable[DriverNumber], &CheckedItem );
00340                         (CountTable[DriverNumber])++;
00341                 }       
00342         
00343         return GE_TRUE;
00344 }
00345 
00346 
00347 
00349 //
00350 //      GMenu_Create()
00351 //
00352 //      Create all required game menus.
00353 //
00355 extern geVFile * MainFS;
00356 geBoolean GMenu_Create(
00357         geEngine          *Engine,
00358         ModeList          *List,
00359         int                        ListLength,
00360         int                        ListSelection)
00361 {
00362 
00363         // locals
00364         MenuItemText_T          TextItem;
00365         MenuItemSlider_T        SliderItem;
00366         MenuItemSlider_T        SaveSliderItem;
00367         MenuItemField_T         FieldItem;
00368         MenuItemString_T        StringItem;
00369         MenuItemGraphic_T       GraphicItem;
00370         MenuItemToggle_T        ToggleItem;
00371         char                            KeyText[64];
00372         int32                           i;
00373         int32                           Width, Top, Bottom;
00374         extern Host_Init                HostInit;
00375         geBoolean                       success;
00376 
00377         assert( List != NULL );
00378         assert( ListLength >=0 );
00379         assert( ListSelection >=0 );
00380         assert( ListSelection < ListLength );
00381 
00382         // fail if we have bad data
00383         if ( Engine == NULL )
00384         {
00385                 assert( 0 );
00386                 goto ExitWithError;
00387         }
00388 
00389         SaveEngine = Engine;
00390 
00391         if (List[ListSelection].Width<SMALL_CREDITS_CUTOFF_WIDTH)
00392                 {
00393                                 //load decal art
00394                         CreditsArt = geBitmap_CreateFromFileName(MainFS, "Bmp\\Menu\\Credits0.Bmp");
00395                         
00396                         if (!CreditsArt)
00397                         {
00398                                 geErrorLog_AddString(-1, "GMenu_Create:  geBitmap_CreateFromFile failed:", "Bmp\\Menu\\Credits0.Bmp");
00399                                 goto ExitWithError;
00400                         }
00401 
00402                         Width = List[ListSelection].Width;
00403                         Top = 0; 
00404                         Bottom = List[ListSelection].Height - 1 - 30;
00405                 }
00406         else
00407                 {
00408                         //load decal art
00409                         CreditsArt = geBitmap_CreateFromFileName(MainFS, "Bmp\\Menu\\Credits1.Bmp");
00410 
00411                         if (!CreditsArt)
00412                         {
00413                                 geErrorLog_AddString(-1, "GMenu_Create:  geBitmap_CreateFromFile failed:","Bmp\\Menu\\Credits1.Bmp");
00414                                 goto ExitWithError;
00415                         }
00416 
00417                         Width = List[ListSelection].Width;
00418                         Top = 0;
00419                         Bottom = List[ListSelection].Height - 1 - 60;
00420                 }
00421 
00422         // Add the bitmap to the world
00423         if (!geEngine_AddBitmap(Engine, CreditsArt))
00424         {
00425                 geErrorLog_AddString(-1, "GMenu_Create:  geEngine_AddBitmap failed for CreditsArt.", NULL);
00426                 goto ExitWithError;
00427         }
00428 
00429         // init keyboard lookup table
00430         for ( i = 0; i < 256; i++ )
00431         {
00432                 KeyLut[i] = i;
00433         }
00434 
00435         {
00436                 FILE    *f;
00437 
00438                 f = fopen("GMenu.Dat", "rb");
00439 
00440                 if (f)
00441                 {
00442                         int     Version;
00443 
00444                         fread(&Version, sizeof(Version), 1, f);
00445 
00446                         if (Version == GMENU_VERSION)
00447                         {
00448                                 // MLS: no error handling!
00449                                 fread(&(KeyMapping[0].Action), sizeof(KeyMapping), 1, f);
00450                                 fread(KeyLut, sizeof(KeyLut), 1, f);
00451                                 fread(&MouseInvert, sizeof(MouseInvert), 1, f);
00452                 fread(&MenuBotCount, sizeof(MenuBotCount), 1, f);
00453                                 if (MenuBotCount > 4)
00454                                         MenuBotCount = 4;
00455                         }
00456 
00457                         fclose(f);
00458                 }
00459         }
00460 
00461         // load slider art
00462         SliderBar = geBitmap_CreateFromFileName(MainFS, "Bmp\\Menu\\SliderB.Bmp");
00463         success = geBitmap_SetColorKey(SliderBar,GE_TRUE,255,GE_FALSE);
00464         assert(success);
00465 
00466         if (!SliderBar)
00467         {
00468                 geErrorLog_AddString(-1, "GMenu_Create:  geBitmap_CreateFromFile failed:","Bmp\\Menu\\SliderB.Bmp");
00469                 goto ExitWithError;
00470         }
00471 
00472         if (!geEngine_AddBitmap(Engine, SliderBar))
00473         {
00474                 geErrorLog_AddString(-1, "GMenu_Create:  geEngine_AddBitmap failed:", "Bmp\\Menu\\SliderB.Bmp");
00475                 goto ExitWithError;
00476         }
00477 
00478         SliderRange = geBitmap_CreateFromFileName(MainFS, "Bmp\\Menu\\SliderR.Bmp");
00479         success = geBitmap_SetColorKey(SliderRange,GE_TRUE,255,GE_FALSE);
00480         assert(success);
00481 
00482         if (!SliderRange)
00483         {
00484                 geErrorLog_AddString(-1, "GMenu_Create:  geBitmap_CreateFromFile failed:", "Bmp\\Menu\\SliderR.Bmp");
00485                 goto ExitWithError;
00486         }
00487 
00488         if (!geEngine_AddBitmap(Engine, SliderRange))
00489         {
00490                 geErrorLog_AddString(-1, "GMenu_Create:  geEngine_AddBitmap failed:", "Bmp\\Menu\\SliderR.Bmp");
00491                 goto ExitWithError;
00492         }
00493 
00494         // init common item data
00495         TextItem.NormalFont = Font_Default;
00496         TextItem.SelectFont = Font_DefaultSelect;
00497         SliderItem.NormalFont = Font_Default;
00498         SliderItem.SelectFont = Font_DefaultSelect;
00499         SliderItem.Range = SliderRange;
00500         SliderItem.Bar = SliderBar;
00501         SliderItem.Slack = 14;
00502         SliderItem.Percent = 0.7f;
00503     SliderItem.Increment = 0.05f;
00504         FieldItem.NormalFont = Font_Default;
00505         FieldItem.SelectFont = Font_DefaultSelect;
00506         FieldItem.AwaitingChange = GE_FALSE;
00507         StringItem.NormalFont = Font_Default;
00508         StringItem.SelectFont = Font_DefaultSelect;
00509         StringItem.AwaitingInput = GE_FALSE;
00510 
00511         //
00512         // create main menu
00513         //
00514 
00515 
00516         MainMenu = Menu_Create( Engine, Width, Top, Bottom, 0, 0, GMenu_MainMenu );
00517         if ( MainMenu == NULL )
00518         {
00519                 assert( 0 );
00520                 goto ExitWithError;
00521         }
00522 
00523 
00524         // add items to the menu
00525         TextItem.Text = "Single Player Game";
00526         TextItem.TextLength = strlen( TextItem.Text );
00527         Menu_AddItem( MainMenu, Menu_ItemText, GMenu_SinglePlayerGame, &TextItem );
00528 
00529         TextItem.Text = "Create Multi Player Game";
00530         TextItem.TextLength = strlen( TextItem.Text );
00531         Menu_AddItem( MainMenu, Menu_ItemText, GMenu_CreateMultiPlayerGame, &TextItem );
00532 
00533         TextItem.Text = "Join Multi Player Game";
00534         TextItem.TextLength = strlen( TextItem.Text );
00535         Menu_AddItem( MainMenu, Menu_ItemText, GMenu_JoinMultiPlayerGame, &TextItem );
00536 
00537         TextItem.Text = "Options";
00538         TextItem.TextLength = strlen( TextItem.Text );
00539         Menu_AddItem( MainMenu, Menu_ItemText, GMenu_Options, &TextItem );
00540 
00541         TextItem.Text = "Credits";
00542         TextItem.TextLength = strlen( TextItem.Text );
00543         Menu_AddItem( MainMenu, Menu_ItemText, GMenu_Credits, &TextItem );
00544 
00545         TextItem.Text = "Quit";
00546         TextItem.TextLength = strlen( TextItem.Text );
00547         Menu_AddItem( MainMenu, Menu_ItemText, GMenu_QuitGame, &TextItem );
00548 
00549 
00550         //
00551         // create main menu
00552         //
00553         SingleMapMenu = Menu_Create( Engine, Width, Top, Bottom, 0, 0, GMenu_SingleMapMenu );
00554         if ( SingleMapMenu == NULL )
00555         {
00556                 assert( 0 );
00557                 goto ExitWithError;
00558         }
00559 
00560 #ifdef BOT_UPDATE
00561         if (HostInit.UserLevel[0])
00562                 {
00563                 // add items to the menu
00564                 static char Name[256];
00565 
00566                 if (!strstr(HostInit.UserLevel,"Levels\\"))
00567                         assert(0); // didn't find prefix
00568 
00569                 sprintf(Name, "User Level %s", &HostInit.UserLevel[strlen("Levels\\")]);
00570                 TextItem.Text = Name;
00571                 TextItem.TextLength = strlen( TextItem.Text );
00572                 Menu_AddItem( SingleMapMenu, Menu_ItemText, GMenu_UserSinglePlayerGame, &TextItem );
00573                 }
00574 
00575         // add items to the menu
00576         TextItem.Text = "The Mine";
00577         TextItem.TextLength = strlen( TextItem.Text );
00578         Menu_AddItem( SingleMapMenu, Menu_ItemText, GMenu_SinglePlayerGame1, &TextItem );
00579 
00580         // add items to the menu
00581         TextItem.Text = "Physics Mania";
00582         TextItem.TextLength = strlen( TextItem.Text );
00583         Menu_AddItem( SingleMapMenu, Menu_ItemText, GMenu_SinglePlayerGame2, &TextItem );
00584 
00585         /*
00586         // add items to the menu
00587         TextItem.Text = "The Gallery";
00588         TextItem.TextLength = strlen( TextItem.Text );
00589         Menu_AddItem( SingleMapMenu, Menu_ItemText, GMenu_SinglePlayerGame3, &TextItem );
00590         */
00591 
00592         //
00593         // create bots menu
00594         //
00595         BotsMenu = Menu_Create( Engine, Width, Top, Bottom, 0, 0, GMenu_BotsMenu );
00596         if ( BotsMenu == NULL )
00597         {
00598                 assert( 0 );
00599                 goto ExitWithError;
00600         }
00601 
00602         
00603         
00604         // add items to the menu
00605         TextItem.Text = "Start Game";
00606         TextItem.TextLength = strlen( TextItem.Text );
00607         Menu_AddItem( BotsMenu, Menu_ItemText, GMenu_Bots, &TextItem );
00608 
00609         // add items to the menu
00610     SaveSliderItem = SliderItem;
00611     SliderItem.Increment = 1.0f/4;
00612         { //{}
00613         static char TargetText[20];
00614         SliderItem.Text = TargetText;
00615         }
00616         assert( MenuBotCount <= 99 && MenuBotCount >= 0);
00617         sprintf(SliderItem.Text, "Bots %2d \0",MenuBotCount);
00618         SliderItem.Percent = BotPercent = (MenuBotCount * SliderItem.Increment);
00619         SliderItem.TextLength = strlen( SliderItem.Text );
00620         Menu_AddItem( BotsMenu, Menu_ItemSlider, GMenu_BotSlider, &SliderItem );
00621     SliderItem = SaveSliderItem;
00622 
00623 #else
00624         // add items to the menu
00625         TextItem.Text = "The Mine";
00626         TextItem.TextLength = strlen( TextItem.Text );
00627         Menu_AddItem( SingleMapMenu, Menu_ItemText, GMenu_SinglePlayerGame1, &TextItem );
00628 
00629         // add items to the menu
00630         TextItem.Text = "Physics Mania";
00631         TextItem.TextLength = strlen( TextItem.Text );
00632         Menu_AddItem( SingleMapMenu, Menu_ItemText, GMenu_SinglePlayerGame2, &TextItem );
00633 #endif
00634 
00635 
00636 
00637         //
00638         // create options menu
00639         //
00640         OptionsMenu = Menu_Create( Engine, Width, Top, Bottom, 0, 0, GMenu_OptionsMenu );
00641         if ( OptionsMenu == NULL )
00642         {
00643                 assert( 0 );
00644                 goto ExitWithError;
00645         }
00646 
00647         // add items to the menu
00648 
00649         TextItem.Text = "Display Mode ";
00650         TextItem.TextLength = strlen(TextItem.Text);
00651         Menu_AddItem( OptionsMenu, Menu_ItemText, GMenu_DisplayMode, &TextItem );
00652 
00653         if (GMenu_BuildDisplayModeMenus(Engine,List,ListLength,ListSelection,Width,Top,Bottom)==GE_FALSE)
00654                 {
00655                         geErrorLog_AddString(-1,"Failed to build display mode menus",TextItem.Text);
00656                         goto ExitWithError;
00657                 }
00658 
00659         SliderItem.Text = "Volume ";
00660         SliderItem.TextLength = strlen( SliderItem.Text );
00661         Menu_AddItem( OptionsMenu, Menu_ItemSlider, GMenu_Volume, &SliderItem );
00662 
00663         StringItem.StringLabel = "Player Name: ";
00664         StringItem.StringLabelLength = strlen( StringItem.StringLabel );
00665         //strcpy( StringItem.StringData, PlayerName);
00666         strcpy( StringItem.StringData, "Unknown");
00667         StringItem.StringDataLength = strlen( StringItem.StringData );
00668         Menu_AddItem( OptionsMenu, Menu_ItemString, GMenu_NameEntry, &StringItem );
00669 
00670         SliderItem.Text = "Brightness ";
00671         SliderItem.TextLength = strlen( SliderItem.Text );
00672 #if 1 // <>
00673         SliderItem.Percent = UserGamma / GAMMA_MAXIMUM;
00674 #endif
00675         Menu_AddItem( OptionsMenu, Menu_ItemSlider, GMenu_Brightness, &SliderItem );
00676 
00677         TextItem.Text = "Customize Controls";
00678         TextItem.TextLength = strlen( TextItem.Text );
00679         Menu_AddItem( OptionsMenu, Menu_ItemText, GMenu_Control, &TextItem );
00680 
00681 //#ifndef BOT_UPDATE
00682     SaveSliderItem = SliderItem;
00683     SliderItem.Increment = 1.0f/4;
00684         { //{}
00685         static char TargetText2[20];
00686         SliderItem.Text = TargetText2;
00687         }
00688         assert( MenuBotCount <= 99 && MenuBotCount >= 0);
00689         sprintf(SliderItem.Text, "Bots %2d \0",MenuBotCount);
00690         SliderItem.Percent = BotPercent = (MenuBotCount * SliderItem.Increment);
00691         SliderItem.TextLength = strlen( SliderItem.Text );
00692         Menu_AddItem( OptionsMenu, Menu_ItemSlider, GMenu_BotSlider, &SliderItem );
00693     SliderItem = SaveSliderItem;
00694 //#endif
00695 
00696         ToggleItem.NormalFont = Font_Default;
00697         ToggleItem.SelectFont = Font_DefaultSelect;
00698         ToggleItem.ToggleLabel = "Frame Statistics  ";
00699         ToggleItem.ToggleLabelLength = strlen( ToggleItem.ToggleLabel );
00700         strcpy( ToggleItem.ToggleData1, "Off" );
00701         ToggleItem.ToggleData1Length = strlen( ToggleItem.ToggleData1 );
00702         strcpy( ToggleItem.ToggleData2, "On" );
00703         ToggleItem.ToggleData2Length = strlen( ToggleItem.ToggleData2 );
00704         ToggleItem.ActiveItem = ShowStats;
00705         Menu_AddItem( OptionsMenu, Menu_ItemToggle, GMenu_ShowStatistics, &ToggleItem );
00706 
00707         //
00708         // create join menu
00709         //
00710         JoinMenu = Menu_Create( Engine, Width, Top, Bottom, 0, 0, GMenu_JoinMenu );
00711         if ( JoinMenu == NULL )
00712         {
00713                 assert( 0 );
00714                 goto ExitWithError;
00715         }
00716 
00717         StringItem.StringLabel = "IP Address: ";
00718         StringItem.StringLabelLength = strlen( StringItem.StringLabel );
00719         //strcpy( StringItem.StringData, IPAddress);
00720         strcpy( StringItem.StringData, "");
00721         StringItem.StringDataLength = strlen( StringItem.StringData );
00722         Menu_AddItem( JoinMenu, Menu_ItemString, GMenu_IPEntry, &StringItem );
00723         
00724         TextItem.Text = "Connect";
00725         TextItem.TextLength = strlen( TextItem.Text );
00726         Menu_AddItem( JoinMenu, Menu_ItemText, GMenu_Connect, &TextItem );
00727 
00728         TextItem.Text = "   ";
00729         TextItem.TextLength = strlen( TextItem.Text );
00730         Menu_AddItem( JoinMenu, Menu_ItemText, 0xffff, &TextItem );
00731 
00732         TextItem.Text = "Enter an IP address";
00733         TextItem.TextLength = strlen( TextItem.Text );
00734         Menu_AddItem( JoinMenu, Menu_ItemText, 0xffff, &TextItem );
00735 
00736         TextItem.Text = "Leave blank for a LAN game";
00737         TextItem.TextLength = strlen( TextItem.Text );
00738         Menu_AddItem( JoinMenu, Menu_ItemText, 0xffff, &TextItem );
00739 
00740         //
00741         // create create menu
00742         //
00743         CreateNetMenu = Menu_Create( Engine, Width, Top, Bottom, 0, 0, GMenu_CreateMenu );
00744         if ( CreateNetMenu == NULL )
00745         {
00746                 assert( 0 );
00747                 goto ExitWithError;
00748         }
00749 
00750         StringItem.StringLabel = "IP Address: ";
00751         StringItem.StringLabelLength = strlen( StringItem.StringLabel );
00752 
00753         strcpy(StringItem.StringData, "Not available");
00754         
00755         StringItem.StringDataLength = strlen( StringItem.StringData );
00756 
00757         Menu_AddItem( CreateNetMenu, Menu_ItemString, GMenu_IPAddress, &StringItem );
00758         /*
00759         TextItem.Text = "Start Game";
00760         TextItem.TextLength = strlen( TextItem.Text );
00761         Menu_AddItem( CreateNetMenu, Menu_ItemText, GMenu_StartGame, &TextItem );
00762         */
00763         TextItem.Text = "The Mine";
00764         TextItem.TextLength = strlen( TextItem.Text );
00765         Menu_AddItem( CreateNetMenu, Menu_ItemText, GMenu_StartGame1, &TextItem );
00766 
00767         TextItem.Text = "Physics Mania";
00768         TextItem.TextLength = strlen( TextItem.Text );
00769         Menu_AddItem( CreateNetMenu, Menu_ItemText, GMenu_StartGame2, &TextItem );
00770 
00771         //
00772         // create customize control menu
00773         //
00774         ControlMenu = Menu_Create( Engine, Width, Top, Bottom, 0, 0, GMenu_ControlMenu );
00775         if ( ControlMenu == NULL )
00776         {
00777                 assert( 0 );
00778                 goto ExitWithError;
00779         }
00780 
00781         // add items to the menu
00782         FieldItem.FieldName = "Shoot  ";
00783         FieldItem.FieldNameLength = strlen( FieldItem.FieldName );
00784         MyGetKeyNameText( GMenu_GetKeyLParam( GMenu_KeyShoot ), KeyText, sizeof( KeyText ) );
00785         strcpy( FieldItem.FieldTextData, KeyText );
00786         FieldItem.FieldTextDataLength = strlen( FieldItem.FieldTextData );
00787         Menu_AddItem( ControlMenu, Menu_ItemField, GMenu_KeyShoot, &FieldItem );
00788 
00789         FieldItem.FieldName = "Jump  ";
00790         FieldItem.FieldNameLength = strlen( FieldItem.FieldName );
00791         MyGetKeyNameText( GMenu_GetKeyLParam( GMenu_KeyJump ), KeyText, sizeof( KeyText ) );
00792         strcpy( FieldItem.FieldTextData, KeyText );
00793         FieldItem.FieldTextDataLength = strlen( FieldItem.FieldTextData );
00794         Menu_AddItem( ControlMenu, Menu_ItemField, GMenu_KeyJump, &FieldItem );
00795 
00796         FieldItem.FieldName = "Strafe Left  ";
00797         FieldItem.FieldNameLength = strlen( FieldItem.FieldName );
00798         MyGetKeyNameText( GMenu_GetKeyLParam( GMenu_KeyStrafeLeft ), KeyText, sizeof( KeyText ) );
00799         strcpy( FieldItem.FieldTextData, KeyText );
00800         FieldItem.FieldTextDataLength = strlen( FieldItem.FieldTextData );
00801         Menu_AddItem( ControlMenu, Menu_ItemField, GMenu_KeyStrafeLeft, &FieldItem );
00802 
00803         FieldItem.FieldName = "Strafe Right  ";
00804         FieldItem.FieldNameLength = strlen( FieldItem.FieldName );
00805         MyGetKeyNameText( GMenu_GetKeyLParam( GMenu_KeyStrafeRight ), KeyText, sizeof( KeyText ) );
00806         strcpy( FieldItem.FieldTextData, KeyText );
00807         FieldItem.FieldTextDataLength = strlen( FieldItem.FieldTextData );
00808         Menu_AddItem( ControlMenu, Menu_ItemField, GMenu_KeyStrafeRight, &FieldItem );
00809 
00810         FieldItem.FieldName = "Forward  ";
00811         FieldItem.FieldNameLength = strlen( FieldItem.FieldName );
00812         MyGetKeyNameText( GMenu_GetKeyLParam( GMenu_KeyForward ), KeyText, sizeof( KeyText ) );
00813         strcpy( FieldItem.FieldTextData, KeyText );
00814         FieldItem.FieldTextDataLength = strlen( FieldItem.FieldTextData );
00815         Menu_AddItem( ControlMenu, Menu_ItemField, GMenu_KeyForward, &FieldItem );
00816 
00817         FieldItem.FieldName = "Backward  ";
00818         FieldItem.FieldNameLength = strlen( FieldItem.FieldName );
00819         MyGetKeyNameText( GMenu_GetKeyLParam( GMenu_KeyBackward ), KeyText, sizeof( KeyText ) );
00820         strcpy( FieldItem.FieldTextData, KeyText );
00821         FieldItem.FieldTextDataLength = strlen( FieldItem.FieldTextData );
00822         Menu_AddItem( ControlMenu, Menu_ItemField, GMenu_KeyBackward, &FieldItem );
00823 
00824         FieldItem.FieldName = "Next Weapon  ";
00825         FieldItem.FieldNameLength = strlen( FieldItem.FieldName );
00826         MyGetKeyNameText( GMenu_GetKeyLParam( GMenu_KeyNextWeapon ), KeyText, sizeof( KeyText ) );
00827         strcpy( FieldItem.FieldTextData, KeyText );
00828         FieldItem.FieldTextDataLength = strlen( FieldItem.FieldTextData );
00829         Menu_AddItem( ControlMenu, Menu_ItemField, GMenu_KeyNextWeapon, &FieldItem );
00830 
00831         ToggleItem.NormalFont = Font_Default;
00832         ToggleItem.SelectFont = Font_DefaultSelect;
00833         ToggleItem.ToggleLabel = "Mouse Invert  ";
00834         ToggleItem.ToggleLabelLength = strlen( ToggleItem.ToggleLabel );
00835         strcpy( ToggleItem.ToggleData1, "No" );
00836         ToggleItem.ToggleData1Length = strlen( ToggleItem.ToggleData1 );
00837         strcpy( ToggleItem.ToggleData2, "Yes" );
00838         ToggleItem.ToggleData2Length = strlen( ToggleItem.ToggleData2 );
00839         ToggleItem.ActiveItem = MouseInvert;
00840         Menu_AddItem( ControlMenu, Menu_ItemToggle, GMenu_MouseInvert, &ToggleItem );
00841 
00842 
00843 
00844         //
00845         // create credits menu
00846         //
00847         CreditsMenu = Menu_Create( Engine, Width, Top, Bottom, 0, 0, GMenu_CreditsMenu );
00848         if ( CreditsMenu == NULL )
00849         {
00850                 assert( 0 );
00851                 goto ExitWithError;
00852         }
00853 
00854         // add items to the menu
00855         GraphicItem.Art = CreditsArt;
00856         GraphicItem.x = 0;
00857         GraphicItem.y = 0;
00858         Menu_AddItem( CreditsMenu, Menu_ItemGraphic, GMenu_NoIdRequired, &GraphicItem );
00859 
00860 
00861 
00862         // all done
00863         ActiveMenu = MainMenu;
00864         return GE_TRUE;
00865 
00866         ExitWithError:
00867         {
00868                 GMenu_DestroyAllData();
00869                 return GE_FALSE;
00870         }
00871 
00872 } // GMenu_Create()
00873 
00874 
00875 
00877 //      GMenu_DestroyAllData
00879 void GMenu_DestroyAllData(void)
00880 {
00881         // free all decals
00882         if ( SliderBar != NULL )
00883         {
00884                 assert(SaveEngine);
00885                 geEngine_RemoveBitmap( SaveEngine, SliderBar );
00886                 geBitmap_Destroy(&SliderBar);
00887                 SliderBar = NULL;
00888         }
00889         if ( SliderRange != NULL )
00890         {
00891                 assert(SaveEngine);
00892                 geEngine_RemoveBitmap( SaveEngine, SliderRange );
00893                 geBitmap_Destroy(&SliderRange);
00894                 SliderRange = NULL;
00895         }
00896         if ( CreditsArt != NULL )
00897         {
00898                 assert(SaveEngine);
00899                 geEngine_RemoveBitmap( SaveEngine, CreditsArt );
00900                 geBitmap_Destroy(&CreditsArt);
00901                 CreditsArt = NULL;
00902         }
00903 
00904         // Destroy all menus
00905         if (MainMenu)
00906         {
00907                 assert(SaveEngine);
00908                 Menu_Destroy( &MainMenu );
00909                 MainMenu = NULL;
00910         }
00911 
00912         if (SingleMapMenu)
00913         {
00914                 assert(SaveEngine);
00915                 Menu_Destroy( &SingleMapMenu );
00916                 SingleMapMenu = NULL;
00917         }
00918 
00919         if (BotsMenu)
00920         {
00921                 assert(SaveEngine);
00922                 Menu_Destroy( &BotsMenu );
00923                 BotsMenu = NULL;
00924         }
00925 
00926         if (OptionsMenu)
00927         {
00928                 assert(SaveEngine);
00929                 Menu_Destroy( &OptionsMenu );
00930                 OptionsMenu = NULL;
00931         }
00932 
00933         if (JoinMenu)
00934         {
00935                 assert(SaveEngine);
00936                 Menu_Destroy( &JoinMenu );
00937                 JoinMenu = NULL;
00938         }
00939 
00940         if (CreateNetMenu)
00941         {
00942                 assert(SaveEngine);
00943                 Menu_Destroy( &CreateNetMenu );
00944                 CreateNetMenu = NULL;
00945         }
00946 
00947         if (ControlMenu)
00948         {
00949                 assert(SaveEngine);
00950                 Menu_Destroy( &ControlMenu );
00951                 ControlMenu = NULL;
00952         }
00953 
00954         SaveEngine = NULL;
00955 }
00956 
00958 //
00959 //      GMenu_Destroy()
00960 //
00961 //      Destroy all game menus.
00962 //
00964 void GMenu_Destroy(
00965         void )  // no parameters
00966 {
00967 
00968         {
00969                 FILE    *f;
00970 
00971                 f = fopen("GMenu.Dat", "wb");
00972 
00973                 if (f)
00974                 {
00975                         int     Version;
00976 
00977                         Version = GMENU_VERSION;
00978 
00979                         fwrite(&Version, sizeof(Version), 1, f);
00980                         fwrite(&KeyMapping[0].Action, sizeof(KeyMapping), 1, f);
00981                         fwrite(KeyLut, sizeof(KeyLut), 1, f);
00982                         fwrite(&MouseInvert, sizeof(MouseInvert), 1, f);
00983             fwrite(&MenuBotCount, sizeof(MenuBotCount), 1, f);
00984             fclose(f);
00985                 }
00986         }
00987 
00988         GMenu_DestroyAllData();
00989 
00990 } // GMenu_Destroy()
00991 
00992 
00993 
00995 //
00996 //      GMenu_Draw()
00997 //
00998 //      Draw any active game menus.
00999 //
01001 geBoolean GMenu_Draw(
01002         void )  // no parameters
01003 {
01004 
01005         // draw menu if required
01006         if ( ActiveMenu == NULL )
01007         {
01008                 return GE_FALSE;
01009         }
01010         Menu_Draw( ActiveMenu );
01011 
01012         // all done
01013         return GE_TRUE;
01014 
01015 } // GMenu_Draw()
01016 
01018 //
01019 //      GMenu_Key()
01020 //
01021 //      Send a keystroke to a menu.
01022 //
01024 int32 GMenu_Key(
01025         int32   wParam,         // wParam
01026         int32   lParam )        // lParam
01027 {
01028 
01029         // locals
01030         static int32    ControlChangeIdentifier = -1;
01031         static int32    NameChangeIdentifier = -1;
01032         static int32    Identifier = -1;
01033         static int32    OldIdentifier = -1;
01034         static int32    LastReturnIdentifier = -1;
01035         int32                   Result = GMenu_DoNothing;
01036 
01037         // if a string is waiting for input then process it
01038         if ( NameChangeIdentifier != -1 )
01039         {
01040 
01041                 // locals
01042                 geBoolean       Change;
01043                 char            TempString[MENU_MAXSTRINGSIZE];
01044 
01045                 // skip ESC
01046                 //if ( wParam == VK_ESCAPE )
01047                 //{
01048                 //      return Result;
01049                 //}
01050 
01051                 Change = Menu_GetStringText( ActiveMenu, NameChangeIdentifier, TempString );
01052                 assert( Change == GE_TRUE );
01053 
01054                 // stop name entry if enter is pressed
01055                 if ( wParam == VK_RETURN  || wParam == VK_ESCAPE )
01056                 {
01057                         // locals
01058                         int32   Size;
01059 
01060                         Size = strlen( TempString );
01061 
01062                         TempString[Size-1] = '\0';
01063 
01064                         Change = Menu_SetStringText( ActiveMenu, NameChangeIdentifier, TempString );
01065                         assert( Change == GE_TRUE );
01066 
01067                         Change = Menu_FlagString( ActiveMenu, NameChangeIdentifier, GE_FALSE );
01068                         assert( Change == GE_TRUE );
01069                         NameChangeIdentifier = -1;
01070                         return Result;
01071                 }
01072 
01073                 // delete a character...
01074                 if ( wParam == VK_BACK )
01075                 {
01076 
01077                         // locals
01078                         int32   Size;
01079 
01080                         // do nothing if there are no more characters left
01081                         Size = strlen( TempString );
01082                         if ( Size < 2 )
01083                         {
01084                                 return Result;
01085                         }
01086 
01087                         // delete as character
01088                         TempString[Size-2] = 0x40;
01089                         TempString[Size-1] = '\0';
01090                 }
01091                 // ...or add one
01092                 else
01093                 {
01094 
01095                         // locals
01096                         int32   Size;
01097 
01098                         // do nothing is there is no more room to add characters
01099                         Size = strlen( TempString );
01100                         if ( Size+2 >= sizeof( TempString ) )
01101                         {
01102                                 return Result;
01103                         }
01104                         TempString[Size-1] = (char)MapVirtualKey(wParam, 2);
01105                         TempString[Size] = 0x40;
01106                         TempString[Size+1] = '\0';
01107                 }
01108 
01109                 // set new string text
01110                 Change = Menu_SetStringText( ActiveMenu, NameChangeIdentifier, TempString );
01111                 assert( Change == GE_TRUE );
01112 
01113                 // all done
01114                 return Result;
01115         }
01116         // if a field is waiting for input then process it
01117         else if ( ControlChangeIdentifier != -1 )
01118         {
01119 
01120                 // locals
01121                 geBoolean       Change;
01122                 char            KeyText[64];
01123 
01124                 // skip ESC
01125                 if ( wParam == VK_ESCAPE )
01126                 {
01127                         return Result;
01128                 }
01129 
01130                 MyGetKeyNameText( lParam, KeyText, sizeof( KeyText ) );
01131 
01132                 // set new field text
01133                 Change = Menu_SetFieldText( ActiveMenu, ControlChangeIdentifier, KeyText );
01134                 assert( Change == GE_TRUE );
01135 
01136                 // set new key mapping
01137                 KeyLut[GMenu_GetOriginalKeyMapping(ControlChangeIdentifier)] = wParam;
01138                 GMenu_SetKeyMapping( ControlChangeIdentifier, wParam, lParam );
01139 
01140                 // all done
01141                 Change = Menu_FlagField( ActiveMenu, ControlChangeIdentifier, GE_FALSE );
01142                 assert( Change == GE_TRUE );
01143                 ControlChangeIdentifier = -1;
01144                 return Result;
01145         }
01146 
01147         // if ESC was hit then back out of the menus as required
01148         if ( wParam == VK_ESCAPE )
01149         {
01150 
01151                 // locals
01152                 int32   MenuIdentifier;
01153 
01154                 // get menu identifier
01155                 if ( ActiveMenu == NULL )
01156                 {
01157                         MenuIdentifier = GMenu_NoMenu;
01158                 }
01159                 else
01160                 {
01161                         MenuIdentifier = Menu_GetIdentifier( ActiveMenu );
01162                 }
01163 
01164                 // decide what to do based on currently active menu
01165                 switch ( MenuIdentifier )
01166                 {
01167 
01168                         case GMenu_MainMenu:
01169                         {
01170                                 ActiveMenu = NULL;
01171                                 break;
01172                         }
01173 
01174                         case GMenu_ControlMenu:
01175                         case GMenu_DriverMenu:
01176                         {
01177                                 ActiveMenu = OptionsMenu;
01178                                 break;
01179                         }
01180 
01181                         case GMenu_CreditsMenu:
01182                         {
01183                                 Host_ClientRefreshStatusBar(0);
01184                                 ActiveMenu = MainMenu;
01185                                 break;
01186                         }
01187 
01188                         case GMenu_OptionsMenu:
01189                         case GMenu_NoMenu:
01190                         case GMenu_CreateMenu:
01191                         case GMenu_SingleMapMenu:
01192                         case GMenu_JoinMenu:
01193                         {
01194                                 ActiveMenu = MainMenu;
01195                                 break;
01196                         }
01197 
01198                         default:
01199                         {
01200                                 if (MenuIdentifier>=GMenu_ModeMenu && MenuIdentifier<GMenu_ModeMenu+1000)
01201                                         ActiveMenu = DriverMenu;
01202                                 else
01203                                         ActiveMenu = MainMenu;
01204                                 break;
01205                         }
01206 
01207                 }
01208                 return Result;
01209         }
01210 
01211         // do nothing if no menu is currently active
01212         if ( ActiveMenu == NULL )
01213         {
01214                 return Result;
01215         }
01216 
01217         // send keystroke to currently active menu
01218         Identifier = Menu_Key( ActiveMenu, wParam );
01219 
01220         // process keystroke
01221         switch ( wParam )
01222         {
01223 
01224                 // process sliders
01225                 case VK_LEFT:
01226                 case VK_RIGHT:
01227                 {
01228                         switch ( Identifier )
01229                         {
01230 
01231                                 // volume slider
01232                                 case GMenu_Volume:
01233                                 {
01234 
01235                                         // locals
01236                                         float   Percent;
01237 
01238                                         // get volume percent
01239                                         Percent = Menu_GetSliderPercent( ActiveMenu, Identifier );
01240                                         assert( Percent >= 0.0f );
01241                                         assert( Percent <= 1.0f );
01242 
01243                                         // only change volume if percentage has changed
01244                                         if ( Percent != VolumePercent )
01245                                         {
01246                                                 VolumePercent = Percent;
01247                                                 VolumePercent *= 0.4f;
01248                                                 VolumePercent += 0.6f;
01249                                                 //undone, set the volume here
01250                                                 if (SoundSys)
01251                                                         geSound_SetMasterVolume(SoundSys, VolumePercent);
01252                                         }
01253                                         break;
01254                                 }
01255 
01256                                 case GMenu_BotSlider:
01257                                 {
01258                                         // locals
01259                                         float   Percent;
01260                     char NewString[32];
01261                                         Menu_T *PiggyBackMenu = NULL;
01262 
01263                                         if (ActiveMenu == OptionsMenu)
01264                                                 PiggyBackMenu = BotsMenu; //also set slider in bots menu
01265                                         else
01266                                         if (ActiveMenu == BotsMenu)
01267                                                 PiggyBackMenu = OptionsMenu; //also set slider in options menu
01268 
01269                                         // get volume percent
01270                                         Percent = Menu_GetSliderPercent( ActiveMenu, Identifier );
01271                                         assert( Percent >= 0.0f );
01272                                         assert( Percent <= 1.0f );
01273 
01274 
01275                                         // only change Bot if percentage has changed
01276                                         if ( Percent != BotPercent )
01277                                         {
01278                                                 BotPercent = Percent;
01279                                                 MenuBotCount = (int32)(BotPercent * 4.0f);
01280                                         }
01281 
01282                     sprintf(NewString, "Bots %2d ", MenuBotCount);
01283 
01284                     Menu_SetSliderText(ActiveMenu, Identifier, NewString);
01285 
01286                                         if (PiggyBackMenu)
01287                                                 {
01288                                                 // Piggy back the results
01289                             Menu_SetSliderText(PiggyBackMenu, Identifier, NewString);
01290                             Menu_SetSliderPercent(PiggyBackMenu, Identifier, Percent);
01291                                                 }
01292                                         break;
01293                                 }
01294 
01295                                 // gamma slider
01296                                 case GMenu_Brightness:
01297                                 {
01298                                         float   Percent;
01299 
01300                                         // get gamma percent
01301                                         Percent = Menu_GetSliderPercent( ActiveMenu, Identifier );
01302                                         assert( Percent >= 0.0f );
01303                                         assert( Percent <= 1.0f );
01304 
01305                                         UserGamma = Percent * GAMMA_MAXIMUM;
01306 
01307                                         // engine won't do anything unless gamma is a change
01308                                         if (SaveEngine)
01309                                                 geEngine_SetGamma(SaveEngine, UserGamma );
01310                                         break;
01311                                 }
01312                         }
01313                         break;
01314                 }
01315 
01316                 // if enter was hit then check if we need to do anything
01317                 case VK_RETURN:
01318                 {
01319                 switch ( Identifier )
01320                         {
01321                                 case GMenu_SinglePlayerGame:
01322                                 {
01323                                         ActiveMenu = SingleMapMenu;
01324                                         break;
01325                                 }
01326                                 
01327                                 case GMenu_QuitGame:
01328                                 {
01329                                         Result = Identifier;
01330                                         ActiveMenu = NULL;
01331                                         break;
01332                                 }
01333 
01334                                 case GMenu_CreateMultiPlayerGame:
01335                                 {
01336                                         geBoolean       Change;
01337                                         char            TempString[MENU_MAXSTRINGSIZE];
01338 
01339                                         ActiveMenu = CreateNetMenu;
01340 
01341                                         if (IPAddr_GetHostID(TempString))
01342                                         {
01343                                                 Change = Menu_SetStringText( ActiveMenu, GMenu_IPAddress, TempString );
01344                                         }
01345                                         else
01346                                         {
01347                                                 Change = Menu_SetStringText( ActiveMenu, GMenu_IPAddress, "Not Available");
01348                                         }
01349 
01350                                         assert(Change == GE_TRUE);
01351 
01352                                         break;
01353                                 }
01354 
01355                                 case GMenu_JoinMultiPlayerGame:
01356                                 {
01357                                         ActiveMenu = JoinMenu;
01358                                         break;
01359                                 }
01360 
01361                                 case GMenu_Connect:
01362                                 {
01363                                         Result = Identifier;
01364                                         ActiveMenu = NULL;
01365                                         break;
01366                                 }
01367 
01368 #ifdef BOT_UPDATE
01369                                 case GMenu_Bots:
01370                                 {
01371                                         switch (LastReturnIdentifier)
01372                                         {
01373                                                 case GMenu_UserSinglePlayerGame:
01374                                                 case GMenu_SinglePlayerGame1:
01375                                                 case GMenu_SinglePlayerGame2:
01376                                                 case GMenu_SinglePlayerGame3:
01377                                                         Result = LastReturnIdentifier;
01378                                                         ActiveMenu = NULL;
01379                                                         break;
01380                                                 case -1:
01381                                                         Result = GMenu_UserSinglePlayerGame;
01382                                                         ActiveMenu = NULL;
01383                                                         break;
01384                                         }
01385                                                 break;
01386                                 }
01387 
01388                                 case GMenu_UserSinglePlayerGame:
01389                                 case GMenu_SinglePlayerGame1:
01390                                 case GMenu_SinglePlayerGame2:
01391                                 case GMenu_SinglePlayerGame3:
01392                                 {
01393                                         LastReturnIdentifier = Identifier;
01394                                         Result = GMenu_DoNothing;//Identifier;
01395                                         ActiveMenu = BotsMenu;
01396                                         break;
01397                                 }
01398 
01399                                 case GMenu_StartGame:
01400                                 case GMenu_StartGame1:
01401                                 case GMenu_StartGame2:
01402                                 {
01403                                         Result = Identifier;
01404                                         ActiveMenu = NULL;
01405                                         break;
01406                                 }
01407 #else
01408                                 case GMenu_StartGame:
01409                                 case GMenu_StartGame1:
01410                                 case GMenu_StartGame2:
01411                                 case GMenu_UserSinglePlayerGame:
01412                                 case GMenu_SinglePlayerGame1:
01413                                 case GMenu_SinglePlayerGame2:
01414                                 {
01415                                         Result = Identifier;
01416                                         ActiveMenu = NULL;
01417                                         break;
01418                                 }
01419 #endif
01420 
01421                                 case GMenu_Options:
01422                                 {
01423                                         ActiveMenu = OptionsMenu;
01424                                         break;
01425                                 }
01426 
01427 
01428                                 case GMenu_Control:
01429                                 {
01430                                         ActiveMenu = ControlMenu;
01431                                         break;
01432                                 }
01433 
01434                                 case GMenu_Credits:
01435                                 {
01436                                         ActiveMenu = CreditsMenu;
01437                                         break;
01438                                 }
01439 
01440                                 case GMenu_KeyShoot:
01441                                 case GMenu_KeyJump:
01442                                 case GMenu_KeyStrafeLeft:
01443                                 case GMenu_KeyStrafeRight:
01444                                 case GMenu_KeyForward:
01445                                 case GMenu_KeyBackward:
01446                                 case GMenu_KeyNextWeapon:
01447                                 {
01448                                         Menu_FlagField( ActiveMenu, Identifier, GE_TRUE );
01449                                         ControlChangeIdentifier = Identifier;
01450                                         break;
01451                                 }
01452 
01453                                 case GMenu_NameEntry:
01454                                 {
01455                                         Menu_FlagString( ActiveMenu, Identifier, GE_TRUE );
01456                                         NameChangeIdentifier = Identifier;
01457                                         break;
01458                                 }
01459 
01460                                 case GMenu_IPEntry:
01461                                 {
01462                                         //char TempString[MENU_MAXSTRINGSIZE];
01463                                         
01464                                         Menu_FlagString( ActiveMenu, Identifier, GE_TRUE );
01465                                         NameChangeIdentifier = Identifier;
01466                                         
01467                                         /*
01468                                         assert(Menu_GetStringText( ActiveMenu, NameChangeIdentifier, TempString ));
01469                                         if (strlen(TempString) <= 0)
01470                                         {
01471                                                 strcpy(TempString, "Search Local LAN");
01472                                                 assert(Menu_SetStringText( ActiveMenu, NameChangeIdentifier, TempString ));
01473                                         }
01474                                         */
01475                                         break;
01476                                 }
01477 
01478                                 case GMenu_MouseInvert:
01479                                 {
01480                                         Menu_ToggleItem( ActiveMenu, Identifier );
01481                                         MouseInvert = !MouseInvert;
01482                                         break;
01483                                 }
01484                                 case GMenu_ShowStatistics:
01485                                 {
01486                                         Menu_ToggleItem( ActiveMenu, Identifier );
01487                                         if ( ShowStats ) ShowStats = GE_FALSE;
01488                                         else ShowStats = GE_TRUE;
01489                                         geEngine_EnableFrameRateCounter(Engine, ShowStats);             
01490                                         break;
01491                                 }
01492                                 case GMenu_DisplayMode:
01493                                 {
01494                                         ActiveMenu = DriverMenu;
01495                                         break;
01496                                 }
01497                                 default:
01498                                         if (Identifier>=GMenu_Driver && Identifier<GMenu_Mode)
01499                                                 {
01500                                                         ActiveMenu = ModeMenuList[Identifier - GMenu_Driver];
01501                                                         break;
01502                                                 }
01503                                         else if (Identifier>=GMenu_Mode && Identifier<GMenu_ModeMenu)
01504                                                 {
01505                                                         if (Menu_GetCheckedData(ActiveMenu,Identifier,(int32 *)(&ChangeDisplaySelection))==GE_FALSE)
01506                                                                 {
01507                                                                         // error
01508                                                                         break;
01509                                                                 }
01510                                                         else
01511                                                                 {
01512                                                                         ChangingDisplayMode = GE_TRUE;
01513                                                                         ActiveMenu = NULL;
01514                                                                 }
01515                                                         break;
01516                                                 }
01517                         }
01518                         // save the current id
01519                         break;
01520                 }
01521         }
01522 
01523         OldIdentifier = Identifier;
01524 
01525         // all done
01526         return Result;
01527 
01528 } // GMenu_Key()

Generated on Tue Sep 30 12:35:53 2003 for GTestAndEngine by doxygen 1.3.2