00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
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
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
00052 typedef struct
00053 {
00054 int32 Action;
00055 int32 wParam;
00056 int32 lParam;
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
00083 int32 KeyLut[256];
00084 geBoolean MouseInvert = GE_FALSE;
00085 int32 MenuBotCount = 1;
00086
00087 #define GMENU_MAX_DISPLAY_MODES 20
00088
00089
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;
00125 }
00126
00127
00128 int MyGetKeyNameText( int lParam, char *KeyText, int Size)
00129 {
00130
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
00150
00151
00152
00154 static geBoolean GMenu_SetKeyMapping(
00155 int32 Identifier,
00156 int32 wParam,
00157 int32 lParam )
00158 {
00159 int32 i;
00160
00161
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
00173 assert( 0 );
00174 return GE_FALSE;
00175
00176 }
00177
00178
00179
00181
00182
00183
00184
00185
00187 static int32 GMenu_GetKeyLParam(
00188 int32 Identifier )
00189 {
00190 int32 i;
00191
00192
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 }
00202
00203 static int32 GMenu_GetOriginalKeyMapping(
00204 int32 Identifier )
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 }
00217
00218
00219
00220
00222
00223
00224
00225
00226
00228 geBoolean GMenu_IsAMenuActive(
00229 void )
00230 {
00231 if ( ActiveMenu == NULL )
00232 {
00233 return GE_FALSE;
00234 }
00235 else
00236 {
00237 return GE_TRUE;
00238 }
00239
00240 }
00241
00243
00244
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)
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
00351
00352
00353
00355 extern geVFile * MainFS;
00356 geBoolean GMenu_Create(
00357 geEngine *Engine,
00358 ModeList *List,
00359 int ListLength,
00360 int ListSelection)
00361 {
00362
00363
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
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
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
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
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
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
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
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
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
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
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
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
00564 static char Name[256];
00565
00566 if (!strstr(HostInit.UserLevel,"Levels\\"))
00567 assert(0);
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
00576 TextItem.Text = "The Mine";
00577 TextItem.TextLength = strlen( TextItem.Text );
00578 Menu_AddItem( SingleMapMenu, Menu_ItemText, GMenu_SinglePlayerGame1, &TextItem );
00579
00580
00581 TextItem.Text = "Physics Mania";
00582 TextItem.TextLength = strlen( TextItem.Text );
00583 Menu_AddItem( SingleMapMenu, Menu_ItemText, GMenu_SinglePlayerGame2, &TextItem );
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
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
00605 TextItem.Text = "Start Game";
00606 TextItem.TextLength = strlen( TextItem.Text );
00607 Menu_AddItem( BotsMenu, Menu_ItemText, GMenu_Bots, &TextItem );
00608
00609
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
00625 TextItem.Text = "The Mine";
00626 TextItem.TextLength = strlen( TextItem.Text );
00627 Menu_AddItem( SingleMapMenu, Menu_ItemText, GMenu_SinglePlayerGame1, &TextItem );
00628
00629
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
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
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
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
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
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
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
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
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
00760
00761
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
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
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
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
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
00863 ActiveMenu = MainMenu;
00864 return GE_TRUE;
00865
00866 ExitWithError:
00867 {
00868 GMenu_DestroyAllData();
00869 return GE_FALSE;
00870 }
00871
00872 }
00873
00874
00875
00877
00879 void GMenu_DestroyAllData(void)
00880 {
00881
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
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
00960
00961
00962
00964 void GMenu_Destroy(
00965 void )
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 }
00991
00992
00993
00995
00996
00997
00998
00999
01001 geBoolean GMenu_Draw(
01002 void )
01003 {
01004
01005
01006 if ( ActiveMenu == NULL )
01007 {
01008 return GE_FALSE;
01009 }
01010 Menu_Draw( ActiveMenu );
01011
01012
01013 return GE_TRUE;
01014
01015 }
01016
01018
01019
01020
01021
01022
01024 int32 GMenu_Key(
01025 int32 wParam,
01026 int32 lParam )
01027 {
01028
01029
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
01038 if ( NameChangeIdentifier != -1 )
01039 {
01040
01041
01042 geBoolean Change;
01043 char TempString[MENU_MAXSTRINGSIZE];
01044
01045
01046
01047
01048
01049
01050
01051 Change = Menu_GetStringText( ActiveMenu, NameChangeIdentifier, TempString );
01052 assert( Change == GE_TRUE );
01053
01054
01055 if ( wParam == VK_RETURN || wParam == VK_ESCAPE )
01056 {
01057
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
01074 if ( wParam == VK_BACK )
01075 {
01076
01077
01078 int32 Size;
01079
01080
01081 Size = strlen( TempString );
01082 if ( Size < 2 )
01083 {
01084 return Result;
01085 }
01086
01087
01088 TempString[Size-2] = 0x40;
01089 TempString[Size-1] = '\0';
01090 }
01091
01092 else
01093 {
01094
01095
01096 int32 Size;
01097
01098
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
01110 Change = Menu_SetStringText( ActiveMenu, NameChangeIdentifier, TempString );
01111 assert( Change == GE_TRUE );
01112
01113
01114 return Result;
01115 }
01116
01117 else if ( ControlChangeIdentifier != -1 )
01118 {
01119
01120
01121 geBoolean Change;
01122 char KeyText[64];
01123
01124
01125 if ( wParam == VK_ESCAPE )
01126 {
01127 return Result;
01128 }
01129
01130 MyGetKeyNameText( lParam, KeyText, sizeof( KeyText ) );
01131
01132
01133 Change = Menu_SetFieldText( ActiveMenu, ControlChangeIdentifier, KeyText );
01134 assert( Change == GE_TRUE );
01135
01136
01137 KeyLut[GMenu_GetOriginalKeyMapping(ControlChangeIdentifier)] = wParam;
01138 GMenu_SetKeyMapping( ControlChangeIdentifier, wParam, lParam );
01139
01140
01141 Change = Menu_FlagField( ActiveMenu, ControlChangeIdentifier, GE_FALSE );
01142 assert( Change == GE_TRUE );
01143 ControlChangeIdentifier = -1;
01144 return Result;
01145 }
01146
01147
01148 if ( wParam == VK_ESCAPE )
01149 {
01150
01151
01152 int32 MenuIdentifier;
01153
01154
01155 if ( ActiveMenu == NULL )
01156 {
01157 MenuIdentifier = GMenu_NoMenu;
01158 }
01159 else
01160 {
01161 MenuIdentifier = Menu_GetIdentifier( ActiveMenu );
01162 }
01163
01164
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
01212 if ( ActiveMenu == NULL )
01213 {
01214 return Result;
01215 }
01216
01217
01218 Identifier = Menu_Key( ActiveMenu, wParam );
01219
01220
01221 switch ( wParam )
01222 {
01223
01224
01225 case VK_LEFT:
01226 case VK_RIGHT:
01227 {
01228 switch ( Identifier )
01229 {
01230
01231
01232 case GMenu_Volume:
01233 {
01234
01235
01236 float Percent;
01237
01238
01239 Percent = Menu_GetSliderPercent( ActiveMenu, Identifier );
01240 assert( Percent >= 0.0f );
01241 assert( Percent <= 1.0f );
01242
01243
01244 if ( Percent != VolumePercent )
01245 {
01246 VolumePercent = Percent;
01247 VolumePercent *= 0.4f;
01248 VolumePercent += 0.6f;
01249
01250 if (SoundSys)
01251 geSound_SetMasterVolume(SoundSys, VolumePercent);
01252 }
01253 break;
01254 }
01255
01256 case GMenu_BotSlider:
01257 {
01258
01259 float Percent;
01260 char NewString[32];
01261 Menu_T *PiggyBackMenu = NULL;
01262
01263 if (ActiveMenu == OptionsMenu)
01264 PiggyBackMenu = BotsMenu;
01265 else
01266 if (ActiveMenu == BotsMenu)
01267 PiggyBackMenu = OptionsMenu;
01268
01269
01270 Percent = Menu_GetSliderPercent( ActiveMenu, Identifier );
01271 assert( Percent >= 0.0f );
01272 assert( Percent <= 1.0f );
01273
01274
01275
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
01289 Menu_SetSliderText(PiggyBackMenu, Identifier, NewString);
01290 Menu_SetSliderPercent(PiggyBackMenu, Identifier, Percent);
01291 }
01292 break;
01293 }
01294
01295
01296 case GMenu_Brightness:
01297 {
01298 float Percent;
01299
01300
01301 Percent = Menu_GetSliderPercent( ActiveMenu, Identifier );
01302 assert( Percent >= 0.0f );
01303 assert( Percent <= 1.0f );
01304
01305 UserGamma = Percent * GAMMA_MAXIMUM;
01306
01307
01308 if (SaveEngine)
01309 geEngine_SetGamma(SaveEngine, UserGamma );
01310 break;
01311 }
01312 }
01313 break;
01314 }
01315
01316
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;
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
01463
01464 Menu_FlagString( ActiveMenu, Identifier, GE_TRUE );
01465 NameChangeIdentifier = Identifier;
01466
01467
01468
01469
01470
01471
01472
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
01508 break;
01509 }
01510 else
01511 {
01512 ChangingDisplayMode = GE_TRUE;
01513 ActiveMenu = NULL;
01514 }
01515 break;
01516 }
01517 }
01518
01519 break;
01520 }
01521 }
01522
01523 OldIdentifier = Identifier;
01524
01525
01526 return Result;
01527
01528 }