summaryrefslogblamecommitdiffstats
path: root/src/core/Frontend_PS2.cpp
blob: a76ac27916435fac594bdb66db6adb189b997f4d (plain) (tree)
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869












































                                                                                                                                                   
                                                                                 






























































































































































                                                                                                                                                                                         












                                                               












































                                                                           
                
 























                                        
 



                                                  
 








                                                                             
                

















                                                                                               
 



                                                
                                                        



















                                                                                          

                   
 




































































































































































































































































































































































































































































































































                                                                                                                                                             
 



                                 
 


                                                          
                                            
                                                
 




                                                          
 





                                                                 
 

                                                                    
 
                                                                   
 

                                                                            
 

                                                                      
 

                                                          
 

                                                              
 

                                                                
 

                                                                          
 

                                      
 




                                                                 
 

                                                                 
 

                                                                    
 


                                                                   
 

                                                                            
 

                                                                      
 

                                                            
 

                                                              
 

                                                                 
 

                                                                          
 

                                      
 




                                                                 
 

                                                                 
 

                                                                    
 

                                                                            
 

                                                                      
 

                                                            
 

                                                              
 

                                                                 
 

                                                                          
 

                                      
 



                                                                 
 

                                                                    
 

                                                                   
 

                                                                            
 

                                                                      
 

                                                           
 

                                                              
 

                                                                 
 

                                                                          
 

                                      
 



                                                                 
 

                                                                    
 

                                                                   
 

                                                                            
 

                                                                      
 

                                                           
 

                                                              
 

                                                                 
 

                                                                          
 











                                              
 
                                               
 






                                                                          
 

                                                                         
 



                                                                                          
 





                                                                                           
                                                                  

                                                                     
 
                                                                 
 

                                                                                                                                                          
 

                                                                                                                          
 
                                                                      
 

                                  
 























                                                                                                                
 

                                                     
 
                                    
 

                                                                                                        
                                                                                                                                                                 
 
                            
 
                                       
 

                                                                                                                                                                                                     
 
                                                                      
 
                                                                      
 
                                                                                               
 

                                                                                                                     
 



                                                                                                         
                                                         
                            
 
                                                                        
 
                                                                                                             
 
                                                                 
 

                                       

                                                                                    
                 
 
                                                                    
 
                                                                     
 
                                                                
 




                                                                                                                   
                                                     
 
                                                                       
                                                     
 
                                                                      
 
                                                                           
 
                                                                                                                                                 
                                                    
 
                                            
                                                                           
 
                                             
                                                                            
 
                                             
                                                                            
 
                                               
                                                                              
 
                                                
                                                                               
 
                                                    
                                                                                   
 
                                                       
                                                                                      
 
                                                                   
 


                                                 
                                                                                
                 
 





                                                       
 
                                                 
                                                                                
 
                                                 
                                                                                
 
                                                 
                                                                                
 
                                                 
                                                                                
 


                                                                                  
                                                           
                                                     
                                                         
                                                     
 

                                                                       
 













                                                             
 





                                                                                    
                                                                               
                                                  
 
                                
 

                                                                                                  
 



                                                                            
 


                                                                             
 
                                                                                                        
 











                                                     

                                                                                         






                                                                          
 
                                                                         
 




                                                                                                      
                                                                        






                                                                        
 


























                                                                            
 

                                                         
 







                                      
 


                                         
 
                          
 

                                           

                                                                                                                                                                  

                 
 


                                                                                                                        
 
                          
 

                            
 



                                                                                                            
 

                                                                                                              
 
                                                                      
 








                                                                                         
 



                                                                                                                          
 
                                                                
 





                                                                                                  
                                                                                                  

                 
 

                                     
 

































                                                                                                            
                                    
 





















































                                                                                                    
 




                                           
 



                                             
 



































































































                                                                                                                                                       
 



                                                                                                                  
 








                                                                                                                  
 




                                                                                                                                                     
 







                                                                                                                                                               
 


                                              
 


                              
 










                                                                            
 


















                                                                                                                                   
 

                              
 



































                                                                                                                                           
 


                              
 












                                                                                    
 









                                                                  
 




                                                              
 







                                           
 




                                                            
 


                                                  
 




                                                                                        
 


                                                                                                                                             
 




                                                                                                                                                                                                                      
 














                                                                                   
                                                                                                                                                              
 







                                                                                    
 

                                  
 
                                                                             
 
                     
 
                                                                                                                                               
 









                                                                  
 




                                                                                                                    

 










                                                                
 




                                                                  
                                                                                   




                                                                   
 

                                                                              
 







                                                                            
 


                                                               
 







                                                                                                                                                                                                
 





                                                                                                                                                                                                
 






                                                 
 
                                                                                                


                                                                                                             
 
                         
 
                                                                
 

                                 

                                                  


                             
 














                                                                                                                                             
 















                                                                                                   
 
                                                     
 
                                      
 


                                                
 







                                                                                                                                                                                                                
 





                                                                                                                                                                                                                
 





                                                                                                                                 
 






                                                                               
 

                                                             
 



                                                                                     
 
                                                
 










                                                                          
 

                                                               
 








                                                               

 





                                                                            
 





                                              
 

                               
 





                                                             
 



                                                                                     
 











                                                                                              
 
































                                                                                                                                                
 




                                                                                                           
 






                                                                                           
 
                                                     
 
                                                                                                  
 


                                                                                                                                   
 




                                                                                                            
 





                                                                                 
 



                                                                                              
 



                                                                                                    
 







                                                                                              
 


                                                                                                     
 




                                                                                                            
 














                                                                               
 




                                                               
 





                                                                                                        
 

                                                                                                    
 

                                                                                                      
 

                                                                                                        
 

















                                                                                                           
 










                                                                           
 



















                                                                             
 







                                                                        
 





                                                                                           
 





                                                                                             
 
















                                                                             
 

                                                   
 







                                                                     
 














                                                                               
 



                                                   
 







                                                                       
 





                                                                                       
 





                                                                                           
 






                                                          
 




                                                   
 






                                                           
 




                                                   
 





                                                                                                                                     
 
















                                                                                                                                                                             
 




                                                                                       
                                                                                                     

                            
                                                                                             












                                                                                                      
 



                                                                                                                    
                                                                                                           

                                         
 

                                      
 



                                                                            
 
                                                                                             
 

                                      
 




                                                                  
 






                                                                                                              
                                                                                                                     





                                                                                                           
                                                                                                                     







                                                                                                          
                                                                                                                             





                                                                                                               
                                                                                                                             

                                                    
                                                                                                                     

                                         
 













                                                   
 




                                                                                       
                                                                                                     

                            
                                                                                             












                                                                                                      
 



                                                                                                                    
                                                                                                           

                                         
 

                                      
 



                                                                             
 
                                                                                             
 

                                      
 




                                                                   
 






                                                                                                              
                                                                                                                     





                                                                                                           
                                                                                                                     







                                                                                                          
                                                                                                                             





                                                                                                               
                                                                                                                             

                                                    
                                                                                                                     

                                         
 













                                                
 




                                                                                       
                                                                                                     

                            
                                                                                             







                                              
 



                                                                          
 
                                                                                             

                                      
 




                                                                
 




                                                                                                  
                                                                                                                     





                                                                                                       
                                                                                                                     

                                            
                                                                                                             
                                 
 













                                                  
 




                                                                                       
                                                                                                     

                            
                                                                                             







                                              
 



                                                                            
 
                                                                                             
 

                                      
 




                                                                  
 




                                                                                                  
                                                                                                                     





                                                                                                       
                                                                                                                     

                                            
                                                                                                             












                                                             
 




                                                     
                                                                                               
                                                                                                                                                      
                                                                                               







                                                                       
 

                                                                               
                                                                                                           
                                                      
 







                                                                                                  
                                                                                                                           

                                                            
                                                                                                                       















                                                                
 

                                                                       
                                                                                                   
                                              
 







                                                                                          
                                                                                                                   

                                                    
                                                                                                               














                                                                          
 
                                                                                 














                                                                                          
 






















                                                                                                                          
 
                                                                                                         

                                              
 











                                                                                                                 
 




                                                                                                                 
                                                                                                                                 
 

                                                              
 

                                                        
                                                                                                                         






                                                                                    
 


                                                              
                                         
                                                                                                  
 







                                                                                                                         
 


                                                                           
 




                                                                                                    
 
                                                                                                         



















                                                                                             
 




                                                                         
 





                                                                                          
 



                                                                         
                         















                                                                          
 






                                  
 






                                                                                  
 





                                               
 



                    
#include "common.h"
#ifdef PS2_MENU
#include "platform.h"
#include "main.h"
#include "Timer.h"
#include "Pad.h"
#include "Sprite2d.h"
#include "Text.h"
#include "Font.h"
#include "Hud.h"
#include "MBlur.h"
#include "DMAudio.h"
#include "Streaming.h"
#include "Camera.h"
#include "Credits.h"
#include "General.h"
#include "TxdStore.h"
#include "FileMgr.h"
#include "Messages.h"
#include "Frontend_PS2.h"
#include "Stats.h"
#include "Game.h"
#include "World.h"
#include "PlayerInfo.h"
#include "FrontendControls.h"
#include "MemoryCard.h"

#define CRect_SZ(x, y, w, h) CRect(x, y, x+w, y+h)

wchar MemoryCard_FileNames[8][100+1];
CMenuManager FrontEndMenuManager;

// TEMP: put into header
bool DoRWStuffStartOfFrame_Horizon(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha);
bool DoRWStuffStartOfFrame(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha);
void DoRWStuffEndOfFrame(void);


#define SCRW SCREEN_WIDTH
#define SCRH SCREEN_HEIGHT
//#define X SCREEN_STRETCH_X
//#define Y SCREEN_STRETCH_Y
#define X SCREEN_SCALE_X
#define Y SCREEN_SCALE_Y

#define YF(x) Y(float(x)*(float(DEFAULT_SCREEN_HEIGHT)/float(SCREEN_HEIGHT_PAL)))
//#define X(x) ((x)/640.0f*SCRW)
//#define Y(y) ((y)/448.0f*SCRH)


static float MENU_TEXT_SIZE_X = 0.644f;
static float MENU_TEXT_SIZE_Y = 0.84f;	//0.96f;
float BUTTONTAB_TEXT_SIZE_X = 0.35f;
float BUTTONTAB_TEXT_SIZE_Y = 0.7f; //0.8f;
float PANEL_TEXT_SIZE_X = 0.8f;
float PANEL_TEXT_SIZE_Y = 1.2f;	//0.96f/0.7f;	//??
float MEMCARD_ACCESS_MSG_SIZE_X = 0.84f;
float MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;	//1.28f;

CRGBA SELECTED_TEXT_COLOR(255, 182, 48, 255);
CRGBA BACKGROUND_SPLASH_COLOR(48, 48, 48, 255);

CVector2D CONTR_DESCR_NEW_TEXTSCALE(0.4564f, 0.63f);	// 0.72
CVector2D CONFIGS_NEW_TEXTSCALE(0.49f, 0.7f);	// 0.8
CVector2D AUDIO_OUTPUT_POS(0.0f, 0.0f);
CVector2D AUDIO_RSTATION_POS(154.0f, 0.0f);
CVector2D DISPLAY_BRIGHTNESS_POS(0.0f, 0.0f);

CRGBA TEXT_COLOR(150, 110, 30, 255);
CRGBA PAD_TEXT_COLOR(200, 200, 200, 255);
CRGBA CRIM_RATING_TEXT_COLOR(255, 182, 48, 255);
CRGBA SCROLL_TEXT_COLOR(150, 110, 30, 255);
CRGBA TITLE_TEXT_COLOR(170, 130, 50, 255);
CRGBA TEXT_SHADOW_COLOR(0, 0, 0, 255);
CVector2D SHADOW_VECTOR(1.0f, 1.0f);
CRGBA SLIDER_RIGHT_COLOR(20, 94, 136, 255);
CRGBA SLIDER_LEFT_COLOR(86, 196, 255, 255);
CRGBA MENU_SELECTED_COLOR(255, 212, 88, 255);
CRGBA rgbaATC(96, 96, 96, 255);	// active text color. not constant

float BUTTONTAB_TEXT_X_SCALES[NUM_PAGES] = { 1.0f };
float PANEL_TEXT_X_SCALES[NUM_PAGES] = { 1.0f };

int32 MemoryCardSlotSelected;
uint32 TimeToStopPadShaking;
bool bFrontEnd_ReloadObrTxtGxt;

bool bMemoryCardStartUpMenus_ExitNow;

extern CMenuPage MenuPage_SaveBasic;
CMenuPage *pActiveMenuPage;
CMenuPage *pMenuSave = &MenuPage_SaveBasic;
bool bMemoryCardSpecialZone;
bool bIgnoreTriangleButton;
bool gErrorSampleTriggered;

bool gMusicPlaying;

CMenuPage MenuPage_Stats;
 CMenuLineLister MenuStats_1;
 CMenuPictureAndText MenuStats_2;	// criminal rating
CMenuPage MenuPage_Briefs;
 CMenuPictureAndText MenuBriefs_1;
 CMenuDummy MenuBriefs_2;
CMenuPage MenuPage_SaveBasic;
 CMenuMultiChoiceTriggered MenuSaveB_1;	// "Load Game", "Delete Game", "New Game"
CMenuPage MenuPage_SaveNewGame;
 CMenuPictureAndText MenuSaveNG_1;	// "Load Game", "Delete Game", "New Game"
 CMenuMultiChoiceTriggered MenuSaveNG_2;	// "No", "Yes"
CMenuPage MenuPage_SaveLoadGame;
 CMenuPictureAndText MenuSaveLG_1;	// "Load Game", "Delete Game", "New Game"
 CMenuMultiChoiceTwoLinesTriggered MenuSaveLG_2;	// save games
CMenuPage MenuPage_SaveDeleteGame;
 CMenuPictureAndText MenuSaveDG_1;	// "Load Game", "Delete Game", "New Game"
 CMenuMultiChoiceTwoLinesTriggered MenuSaveDG_2;	// save games
CMenuPage MenuPage_Controls;
 CMenuPictureAndText MenuControls_3; // controller images
 CMenuPictureAndText MenuControls_6;
 CMenuPictureAndText MenuControls_4;
 CMenuPictureAndText MenuControls_7;
 CMenuMultiChoiceTriggeredAlways MenuControls_1; // "Configuration:" "Setup1", "Setup2", "Setup3", "Setup4"
 CMenuMultiChoiceTriggered MenuControls_2; // "Controller Display:" "On Foot", "In Car"
 CMenuOnOffTriggered MenuControls_5; // "Vibration:"
CMenuPageAnyMove MenuPage_Audio;
 CMenuSliderTriggered MenuAudio_1;	// "Music Volume"
 CMenuMultiChoiceTriggered MenuAudio_4;	// "Output:" "Stereo", "Mono"
 CMenuSliderTriggered MenuAudio_2;	// "SFX Volume"
 CMenuMultiChoicePicturedTriggeredAnyMove MenuAudio_3; // "Radio station select:"
CMenuPage MenuPage_Display;
 CMenuSlider MenuDisplay_1;	// "Brightness"
#ifdef GTA_PC
 CMenuOnOffTriggered MenuDisplay_2;	// "Trails:"
#else
 CMenuOnOff MenuDisplay_2;	// "Trails:"
#endif
 CMenuOnOff MenuDisplay_3;	// "Subtitles:"
 CMenuOnOff MenuDisplay_4;	// "Wide Screen:"
CMenuPage MenuPage_Language;
 CMenuMultiChoiceTriggered MenuLanguage_1;	// "English", "French", "German", "Italian", "Spanish"

CMenuPage MenuPageSaveZone_SaveGame;
 CMenuMultiChoiceTriggered MenuSaveZoneSG_1;	// "Save game", "Cancel"
CMenuPage MenuPageSaveZone_SaveSlots;
 CMenuMultiChoiceTwoLinesTriggered MenuSaveZoneSSL_1;	// "Cancel"
CMenuPage MenuPageSaveZone_SavedSuccessfully;
 CMenuPictureAndText MenuSaveZoneSS_1;	// "Game saved successfully!" "Your saved filename is:"
 CMenuMultiChoiceTriggered MenuSaveZoneSS_2;	// "Quit"
CMenuPage MenuPageSaveZone_Message;
 CMenuPictureAndText MenuSaveZoneMSG_1;	// "Save Failed! Check memory card (PS2) in MEMORY CARD slot 1 and please try again."
 CMenuMultiChoiceTriggered MenuSaveZoneMSG_2;	// "OK"
CMenuPage MenuPageSaveZone_QuestionYesNo;
 CMenuPictureAndText MenuSaveZoneQYN_1;	// "Save Failed! Check memory card (PS2) in MEMORY CARD slot 1 and please try again."
 CMenuMultiChoiceTriggered MenuSaveZoneQYN_2;	// "Yes", "No"
CMenuPage MenuPageSaveZone_FormatCard;
 CMenuMultiChoiceTriggered MenuSaveZoneFC_1;	// "Memory card (PS2) in MEMORY CARD slot 1 is unformatted. Would you like to format memory card (PS2) in MEMORY CARD slot 1?" "No" "Yes"
CMenuPage MenuPageSaveZone_ErrorFormat;
 CMenuMultiChoiceTriggered MenuSaveZoneEF_1;	// "Format Failed! Check memory card (PS2) in MEMORY CARD slot 1 and please try again." "OK"


VALIDATE_SIZE(CPlaceableText, 0x10);
VALIDATE_SIZE(CPlaceableShText, 0x20);
VALIDATE_SIZE(CPlaceableShTextTwoLines, 0x30);
VALIDATE_SIZE(CPlaceableShOption, 0x28);
VALIDATE_SIZE(CPlaceableShOptionTwoLines, 0x38);
VALIDATE_SIZE(CPlaceableSprite, 0x18);
VALIDATE_SIZE(CPlaceableShSprite, 0x34);
VALIDATE_SIZE(CMenuMultiChoice, 0x2CC);
VALIDATE_SIZE(CMenuMultiChoiceTriggered, 0x310);
VALIDATE_SIZE(CMenuMultiChoiceTwoLines, 0x3CC);
VALIDATE_SIZE(CMenuOnOff, 0x90);

#include "FrontendTriggers.h"

static const char* FrontendFilenames[][2] =
{
	{"fe2_mainpanel_ul",  "" },
	{"fe2_mainpanel_ur",  "" },
	{"fe2_mainpanel_dl",  "" },
	{"fe2_mainpanel_dr",  "" },
	{"fe2_mainpanel_dr2", "" },
	{"fe2_tabactive",     "" },
	{"fe_iconbrief",      "" },
	{"fe_iconstats",      "" },
	{"fe_iconcontrols",   "" },
	{"fe_iconsave",       "" },
	{"fe_iconaudio",      "" },
	{"fe_icondisplay",    "" },
	{"fe_iconlanguage",   "" },
	{"fe_controller",     "" },
	{"fe_controllersh",   "" },
	{"fe_arrows1",        "" },
	{"fe_arrows2",        "" },
	{"fe_arrows3",        "" },
	{"fe_arrows4",        "" },
	{"fe_radio1",         "" },
	{"fe_radio2",         "" },
	{"fe_radio3",         "" },
	{"fe_radio4",         "" },
	{"fe_radio5",         "" },
	{"fe_radio6",         "" },
	{"fe_radio7",         "" },
	{"fe_radio8",         "" },
	{"fe_radio9",         "" },
};

#ifdef CUTSCENE_BORDERS_SWITCH
bool CMenuManager::m_PrefsCutsceneBorders = true;
#endif

#ifdef MULTISAMPLING
int8 CMenuManager::m_nPrefsMSAALevel = 0;
int8 CMenuManager::m_nDisplayMSAALevel = 0;
#endif

#ifdef NO_ISLAND_LOADING
int8 CMenuManager::m_DisplayIslandLoading = ISLAND_LOADING_LOW;
int8 CMenuManager::m_PrefsIslandLoading = ISLAND_LOADING_LOW;
#endif

int32 CMenuManager::m_PrefsSfxVolume = 102;
int32 CMenuManager::m_PrefsMusicVolume = 102;
int32 CMenuManager::m_PrefsBrightness = 256;
bool CMenuManager::m_PrefsShowTrails = true;
bool CMenuManager::m_PrefsShowSubtitles = true;
bool CMenuManager::m_PrefsAllowNastyGame = true;

int32 CMenuManager::m_PrefsRadioStation = 0;
int32 CMenuManager::m_PrefsStereoMono = 0;
int8 CMenuManager::m_PrefsUseWideScreen = 0;
int32 CMenuManager::m_PrefsLanguage = 0;
CMenuManager::CONTRCONFIG CMenuManager::m_PrefsControllerConfig = CONFIG_1;
bool CMenuManager::m_PrefsUseVibration = false;


#ifdef GTA_PC
#include "PlayerSkin.h"
int32 CMenuManager::OS_Language = 0;
int8 CMenuManager::m_PrefsVsync = 1;
int8 CMenuManager::m_PrefsVsyncDisp = 1;
int8 CMenuManager::m_PrefsFrameLimiter = 1;
int8 CMenuManager::m_PrefsSpeakers;
int32 CMenuManager::m_ControlMethod = CONTROL_CLASSIC;
int8 CMenuManager::m_PrefsDMA = 1;
float CMenuManager::m_PrefsLOD = 1.0f;
char CMenuManager::m_PrefsSkinFile[256] = DEFAULT_SKIN_NAME;

#ifndef MASTER
bool CMenuManager::m_PrefsMarketing;
bool CMenuManager::m_PrefsDisableTutorials;
#endif // !MASTER

#ifdef MENU_MAP
bool  CMenuManager::bMenuMapActive;
float CMenuManager::fMapSize;
float CMenuManager::fMapCenterY;
float CMenuManager::fMapCenterX;
#endif

#endif


CMenuManager::CMenuManager(void)
{
	int32 i;

	SetSoundLevelsForMusicMenu();

	m_pageState = PAGESTATE_NORMAL;
	m_currentPage = PAGE_FIRST;
	m_newPage = PAGE_FIRST;
	m_bMenuActive = false;
	m_bSaveMenuActive = false;
	m_bRenderGameInMenu = false;
	m_bTexturesLoaded = false;
	m_nPageLeftTimer = 0;
	m_nPageRightTimer = 0;
	m_nChangePageTimer = 0;
	field_18 = 0;
	m_fade = 255;
	m_someAlpha = 255;
	m_position.x = 0.0f;
	m_position.y = 0.0f;
	m_nSlidingDir = SLIDE_TO_BOTTOM;
	m_nStartPauseTimer = 0;
	m_nEndPauseTimer = 0;
	m_bInitialised = false;
	m_bWantToUpdateContent = false;
	field_3C = 0;
	m_bInSaveZone = false;

	for(i = 0; i < NUM_PAGES; i++){
		BUTTONTAB_TEXT_X_SCALES[i] = 1.0f;
		PANEL_TEXT_X_SCALES[i] = 1.0f;
	}

#ifdef GTA_PC
	TheCamera.m_bUseMouse3rdPerson = m_ControlMethod == CONTROL_STANDARD;
	CMBlur::BlurOn = m_PrefsShowTrails;
#endif
}

void
CMenuManager::LoadAllTextures(void)
{
	int32 i;

	if(m_bTexturesLoaded)
		return;

	DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_STARTING, 0);
	DMAudio.Service();
	DoRWStuffStartOfFrame(0, 0, 0, 0, 0, 0, 255);
	RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
	CSprite2d *splash = LoadSplash(nil);
	if(splash)
		splash->Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
	else // doesn't exist!!
		CHud::Sprites[19].Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
	RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERMIPNEAREST);
	DoRWStuffEndOfFrame();

	CFileMgr::SetDir("");
	CFileMgr::SetDir("");

	CTimer::Stop();
	CStreaming::MakeSpaceFor(60*1024);
	CStreaming::ImGonnaUseStreamingMemory();
	CGame::TidyUpMemory(false, true);
	int32 slot = CTxdStore::FindTxdSlot("frontend");
	if(slot == -1)
		slot = CTxdStore::AddTxdSlot("frontend");
	printf("LOAD frontend\n");
	CTxdStore::LoadTxd(slot, "MODELS/FRONTEND.TXD");
	CTxdStore::SetCurrentTxd(slot);
	CStreaming::IHaveUsedStreamingMemory();
	CTimer::Update();

	for(i = 0; i < NUM_SPRIRES; i++)
	{
		m_sprites[i].SetTexture(FrontendFilenames[i][0], FrontendFilenames[i][1]);
		m_sprites[i].SetAddressing(rwTEXTUREADDRESSBORDER);
	}

	m_bTexturesLoaded = true;
}

void
CMenuManager::UnloadTextures(void)
{
	int32 slot;
	int32 i;

	if ( !m_bTexturesLoaded )
		return;

	slot = CTxdStore::FindTxdSlot("frontend");
#ifdef FIX_BUGS
	for(i = 0; i < NUM_SPRIRES; i++)
		m_sprites[i].Delete();
#endif

	printf("REMOVE frontend\n");
	CTxdStore::RemoveTxd(slot);
	m_bTexturesLoaded = false;
}

void
CMenuManager::InitialiseMenusOnce(void)
{
	if(m_bInitialised)
		return;
	m_bInitialised = true;

	InitialiseChangedLanguageSettings();

	// Normal menu
	MenuPage_Stats.Initialise();
	MenuPage_Briefs.Initialise();
	MenuPage_SaveBasic.Initialise();
	MenuPage_SaveNewGame.Initialise();
	MenuPage_SaveLoadGame.Initialise();
	MenuPage_SaveDeleteGame.Initialise();
	MenuPage_Controls.Initialise();
	MenuPage_Audio.Initialise();
	MenuPage_Display.Initialise();
	MenuPage_Language.Initialise();

	// Save menu
	MenuPageSaveZone_SaveGame.Initialise();
	MenuPageSaveZone_SaveSlots.Initialise();
	MenuPageSaveZone_SavedSuccessfully.Initialise();
	MenuPageSaveZone_Message.Initialise();
	MenuPageSaveZone_QuestionYesNo.Initialise();
	MenuPageSaveZone_FormatCard.Initialise();
	MenuPageSaveZone_ErrorFormat.Initialise();

	/* Stats */

	MenuStats_1.ResetNumberOfTextLines();
	MenuStats_1.SetPosition(X(75.0f), Y(70.0f));
	MenuStats_1.m_width = X(480.0f);
	MenuStats_1.m_height = Y(274.0f);
	MenuStats_1.field_10E8 = 0;	// unknown
	MenuStats_1.m_lineSpacing = Y(20.0f);
	MenuStats_1.m_scrollSpeed = 1.0f;
	MenuStats_1.SetLinesColor(SCROLL_TEXT_COLOR);
	MenuStats_1.ResetNumberOfTextLines();
	MenuPage_Stats.AddMenu(&MenuStats_1);
	MenuStats_2.SetPosition(X(75.0f), Y(50.0f));
	MenuStats_2.SetTextsColor(CRIM_RATING_TEXT_COLOR);
	MenuPage_Stats.AddMenu(&MenuStats_2);
	MenuPage_Stats.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_Stats.ActivatePage();


	CVector2D saveGameTextScale(X(0.49f), Y(0.7f));
	CVector2D defaultTextScale(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));

	/* Basic Load/Delete/New Game */

	MenuSaveB_1.m_numOptions = 0;
	MenuSaveB_1.SetPosition(X(220.0f), Y(110.0f));
	MenuSaveB_1.AddOption(TheText.Get("FES_LGA"), 0.0f, Y(20.0f), TriggerSave_LoadGameSelect, false, true);
	MenuSaveB_1.AddOption(TheText.Get("FES_DGA"), 0.0f, Y(40.0f), TriggerSave_DeleteGameSelect, false, true);
	MenuSaveB_1.AddOption(TheText.Get("FES_NGA"), 0.0f, Y(60.0f), TriggerSave_NewGameSelectYes, false, true);
	MenuSaveB_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuPage_SaveBasic.AddMenu(&MenuSaveB_1);
	MenuPage_SaveBasic.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_SaveBasic.ActivatePage();

	/* New Game - but unused */

	MenuSaveNG_1.m_numTexts = 0;
	MenuSaveNG_1.SetPosition(X(220.0f), Y(110.0f));
	MenuSaveNG_1.AddText(TheText.Get("FES_LGA"), 0.0f, Y(20.0f), TEXT_COLOR, true);
	MenuSaveNG_1.AddText(TheText.Get("FES_DGA"), 0.0f, Y(40.0f), TEXT_COLOR, true);
	MenuSaveNG_1.AddText(TheText.Get("FES_NGA"), 0.0f, Y(60.0f), SELECTED_TEXT_COLOR, true);
	MenuPage_SaveNewGame.AddMenu(&MenuSaveNG_1);
	MenuSaveNG_2.m_numOptions = 0;
	MenuSaveNG_2.SetPosition(X(250.0f), Y(170.0f));
	MenuSaveNG_2.AddOption(TheText.Get("FEM_NO"), 0.0f, 0.0f, TriggerSave_BackToMainMenu, false, false);
	MenuSaveNG_2.AddOption(TheText.Get("FEM_YES"), 0.0f, Y(20.0f), TriggerSave_NewGameSelectYes, false, false);
	MenuSaveNG_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveNG_2.m_defaultCancel = TriggerSave_BackToMainMenu;
	MenuPage_SaveNewGame.AddMenu(&MenuSaveNG_2);
	MenuPage_SaveNewGame.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_SaveNewGame.ActivatePage();

	/* Load Game */

	MenuSaveLG_1.m_numTexts = 0;
	MenuSaveLG_1.SetPosition(X(220.0f),  Y(110.0f));
	MenuSaveLG_1.AddText(TheText.Get("FES_LGA"), 0.0f, Y(20.0f), SELECTED_TEXT_COLOR, true);
	MenuSaveLG_1.AddText(TheText.Get("FES_DGA"), 0.0f, Y(40.0f), TEXT_COLOR, true);
	MenuSaveLG_1.AddText(TheText.Get("FES_NGA"), 0.0f, Y(60.0f), TEXT_COLOR, true);
	MenuPage_SaveLoadGame.AddMenu(&MenuSaveLG_1);
	MenuSaveLG_2.m_numOptions = 0;
	MenuSaveLG_2.SetPosition(X(250.0f),  Y(60.0f));
	MenuSaveLG_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveLG_2.m_defaultCancel = TriggerSave_BackToMainMenuTwoLines;
	MenuSaveLG_2.SetNewOldTextScale(true, saveGameTextScale, defaultTextScale, false);
	MenuPage_SaveLoadGame.AddMenu(&MenuSaveLG_2);
	MenuPage_SaveLoadGame.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_SaveLoadGame.ActivatePage();

	/* Delete Game */

	MenuSaveDG_1.m_numTexts = 0;
	MenuSaveDG_1.SetPosition(X(220.0f),  Y(110.0f));
	MenuSaveDG_1.AddText(TheText.Get("FES_LGA"), 0.0f, Y(20.0f), TEXT_COLOR, true);
	MenuSaveDG_1.AddText(TheText.Get("FES_DGA"), 0.0f, Y(40.0f), SELECTED_TEXT_COLOR, true);
	MenuSaveDG_1.AddText(TheText.Get("FES_NGA"), 0.0f, Y(60.0f), TEXT_COLOR, true);
	MenuPage_SaveDeleteGame.AddMenu(&MenuSaveDG_1);
	MenuSaveDG_2.m_numOptions = 0;
	MenuSaveDG_2.SetPosition(X(250.0f),  Y(60.0f));
	MenuSaveDG_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveDG_2.m_defaultCancel = TriggerSave_BackToMainMenuTwoLines;
	MenuSaveDG_2.SetNewOldTextScale(true, saveGameTextScale, defaultTextScale, false);
	MenuPage_SaveDeleteGame.AddMenu(&MenuSaveDG_2);
	MenuPage_SaveDeleteGame.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_SaveDeleteGame.ActivatePage();


	CVector2D briefsTextScale(X(0.525f), Y(0.7f));
	CVector2D defaultTextScale1(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));

	/* Briefs */

	MenuBriefs_1.m_numTexts = 0;
	MenuBriefs_1.SetPosition(X(60.0f), Y(60.0f));
	MenuBriefs_1.SetTextsColor(TEXT_COLOR);
	MenuBriefs_1.SetNewOldTextScale(true, briefsTextScale, defaultTextScale1);
	MenuBriefs_1.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x), X(600.0f));
	MenuPage_Briefs.AddMenu(&MenuBriefs_1);
	MenuPage_Briefs.AddMenu(&MenuBriefs_2);
	MenuPage_Briefs.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_Briefs.ActivatePage();


	CVector2D defaultTextScale2(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
	CVector2D defaultTextScale3(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
	CVector2D CONTR_DESCR_NEW_TEXTSCALE_scaled(X(CONTR_DESCR_NEW_TEXTSCALE.x), Y(CONTR_DESCR_NEW_TEXTSCALE.y));
	CVector2D CONFIGS_NEW_TEXTSCALE_scaled(X(CONFIGS_NEW_TEXTSCALE.x), Y(CONFIGS_NEW_TEXTSCALE.y));

	/* Controls */

	MenuControls_3.m_numTexts = 0;
	MenuControls_3.m_numSprites = 0;
	MenuControls_3.SetPosition(X(170.0f), Y(88.0f));
	MenuControls_3.AddPicture(&m_sprites[FE_CONTROLLER],
		&m_sprites[FE_CONTROLLERSH],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_3.AddPicture(&m_sprites[FE_ARROWS1],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_3.SetNewOldTextScale(true, CONTR_DESCR_NEW_TEXTSCALE_scaled, defaultTextScale2);
	InitialiseTextsInMenuControllerOnFoot(&MenuControls_3, CMenuManager::m_PrefsControllerConfig);
	MenuControls_3.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuControls_3.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x), X(600.0f));
	MenuPage_Controls.AddMenu(&MenuControls_3);

	MenuControls_6.m_numTexts = 0;
	MenuControls_6.m_numSprites = 0;
	MenuControls_6.SetPosition(X(170.0f), Y(88.0f));
	MenuControls_6.AddPicture(&m_sprites[FE_CONTROLLER],
		&m_sprites[FE_CONTROLLERSH],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_6.AddPicture(&m_sprites[FE_ARROWS3],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_6.SetNewOldTextScale(true, CONTR_DESCR_NEW_TEXTSCALE_scaled, defaultTextScale2);
	InitialiseTextsInMenuControllerOnFoot(&MenuControls_6, CMenuManager::CONFIG_2);
	MenuControls_6.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuControls_6.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x), X(600.0f));

	MenuControls_4.m_numTexts = 0;
	MenuControls_4.m_numSprites = 0;
	MenuControls_4.SetPosition(X(170.0f), Y(88.0f));
	MenuControls_4.AddPicture(&m_sprites[FE_CONTROLLER],
		&m_sprites[FE_CONTROLLERSH],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_4.AddPicture(&m_sprites[FE_ARROWS2],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_4.SetNewOldTextScale(true, CONTR_DESCR_NEW_TEXTSCALE_scaled, defaultTextScale2);
	InitialiseTextsInMenuControllerInCar(&MenuControls_4, CMenuManager::m_PrefsControllerConfig);
	MenuControls_4.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuControls_4.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x), X(600.0f));

	MenuControls_7.m_numTexts = 0;
	MenuControls_7.m_numSprites = 0;
	MenuControls_7.SetPosition(X(170.0f), Y(88.0f));
	MenuControls_7.AddPicture(&m_sprites[FE_CONTROLLER],
		&m_sprites[FE_CONTROLLERSH],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_7.AddPicture(&m_sprites[FE_ARROWS4],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_7.SetNewOldTextScale(true, CONTR_DESCR_NEW_TEXTSCALE_scaled, defaultTextScale2);
	InitialiseTextsInMenuControllerInCar(&MenuControls_7, CMenuManager::CONFIG_2);
	MenuControls_7.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuControls_7.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x), X(600.0f));

	MenuControls_1.m_numOptions = 0;
	MenuControls_1.SetPosition(X(284.0f), Y(290.0f));
	MenuControls_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, SELECTED_TEXT_COLOR);
	MenuControls_1.SetNewOldTextScale(true, CONFIGS_NEW_TEXTSCALE_scaled, defaultTextScale3, false);
	MenuControls_1.AddTitle(TheText.Get("FEC_CCF"), 0.0f, 0.0f, true);
	MenuControls_1.AddOption(TheText.Get("FEC_CF1"), X(15.0f), Y(2.0f), TriggerControls_ContrConfig, false, false);
	MenuControls_1.AddOption(TheText.Get("FEC_CF2"), X(85.0f), Y(2.0f), TriggerControls_ContrConfig, false, false);
	MenuControls_1.AddOption(TheText.Get("FEC_CF3"), X(155.0f), Y(2.0f), TriggerControls_ContrConfig, false, false);
	MenuControls_1.AddOption(TheText.Get("FEC_CF4"), X(225.0f), Y(2.0f), TriggerControls_ContrConfig, false, false);
	MenuPage_Controls.AddMenu(&MenuControls_1);
	MenuControls_1.m_alwaysTrigger = (CMenuMultiChoiceTriggered::Trigger)TriggerControls_DrawContrConfig;
	MenuControls_1.m_alwaysHighlightTrigger = (CMenuMultiChoiceTriggered::Trigger)TriggerControls_DrawHNContrConfig;
	MenuControls_1.m_alwaysNormalTrigger = (CMenuMultiChoiceTriggered::Trigger)TriggerControls_DrawHNContrConfig;

	MenuControls_2.m_numOptions = 0;
	MenuControls_2.SetPosition(X(284.0f), Y(310.0f));
	MenuControls_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, SELECTED_TEXT_COLOR);
	MenuControls_2.SetNewOldTextScale(true, CONFIGS_NEW_TEXTSCALE_scaled, defaultTextScale3, false);
	MenuControls_2.AddTitle(TheText.Get("FEC_CDP"), 0.0f, 0.0f, true);
	MenuControls_2.AddOption(TheText.Get("FEC_ONF"), X(15.0f), Y(2.0f), (CMenuMultiChoiceTriggered::Trigger)TriggerControls_ContrDisplay, false, false);
	MenuControls_2.AddOption(TheText.Get("FEC_INC"), X(105.0f), Y(2.0f), (CMenuMultiChoiceTriggered::Trigger)TriggerControls_ContrDisplay, false, false);
	MenuPage_Controls.AddMenu(&MenuControls_2);
	MenuControls_2.m_bTwoState = true;
	MenuControls_2.SetMenuSelection(0);

	MenuControls_5.SetPosition(X(284.0f), Y(330.0f));
	MenuControls_5.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR);
	MenuControls_5.SetNewOldTextScale(true, CONFIGS_NEW_TEXTSCALE_scaled, defaultTextScale3, false);
	MenuControls_5.AddTitle(TheText.Get("FEC_VIB"), false, 0.0f, 0.0f, true);
	MenuControls_5.SetOptionPosition(X(15.0f), Y(2.0f), TriggerControls_Vibrations, false);
	MenuPage_Controls.AddMenu(&MenuControls_5);
	MenuPage_Controls.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_Controls.ActivatePage();


	/* Audio */

	CVector2D audioOutputScale(X(0.49f), Y(0.63f));
	CVector2D defaultTextScale4(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));

	FEC_MOVETAB movetab;
	MenuAudio_1.SetPosition(X(70.0f), Y(80.0f));
	MenuAudio_1.SetColors(TEXT_COLOR, TEXT_COLOR, SLIDER_LEFT_COLOR, SLIDER_RIGHT_COLOR);
	MenuAudio_1.AddTitle(TheText.Get("FEA_MUS"), 0.0f, 0.0f);
	MenuAudio_1.AddTickBox(X(15.0f), Y(20.0f), X(150.0f), Y(5.0f), Y(45.0f), TriggerAudio_MusicVolume, TriggerAudio_MusicVolumeAlways);
	movetab.right = 1;
	movetab.left = 2;
	movetab.down = 3;
	movetab.up = 3;
	MenuPage_Audio.AddMenu(&MenuAudio_1, &movetab);

	MenuAudio_4.m_numOptions = 0;
	MenuAudio_4.SetPosition(X(280.0f), Y(80.0f));
	MenuAudio_4.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, SELECTED_TEXT_COLOR);
	MenuAudio_4.SetNewOldTextScale(true, audioOutputScale, defaultTextScale4, false);
	MenuAudio_4.AddTitle(TheText.Get("FEA_OUT"), X(AUDIO_OUTPUT_POS.x), Y(AUDIO_OUTPUT_POS.y), false);
	MenuAudio_4.AddOption(TheText.Get("FEA_ST"), X(-15.0f), Y(30.0f), TriggerAudio_StereoMono, false, false);
	MenuAudio_4.AddOption(TheText.Get("FEA_MNO"), X(55.0f), Y(30.0f), TriggerAudio_StereoMono, false, false);
	movetab.right = 2;
	movetab.left = 0;
	movetab.down = 3;
	movetab.up = 3;
	MenuPage_Audio.AddMenu(&MenuAudio_4, &movetab);
	MenuAudio_4.m_bTwoState = true;

	MenuAudio_2.SetPosition(X(410.0f), Y(80.0f));
	MenuAudio_2.SetColors(TEXT_COLOR, TEXT_COLOR, SLIDER_LEFT_COLOR, SLIDER_RIGHT_COLOR);
	MenuAudio_2.AddTitle(TheText.Get("FEA_SFX"), 0.0f, 0.0f);
	MenuAudio_2.AddTickBox(X(5.0f), Y(20.0f), X(150.0f), Y(5.0f), Y(45.0f), TriggerAudio_SfxVolume, TriggerAudio_SfxVolumeAlways);
	movetab.right = 0;
	movetab.left = 1;
	movetab.down = 3;
	movetab.up = 3;
	MenuPage_Audio.AddMenu(&MenuAudio_2, &movetab);

	MenuAudio_3.m_numOptions = 0;
	MenuAudio_3.SetPosition(X(50.0f), Y(170.0f));
	MenuAudio_3.SetColors(TITLE_TEXT_COLOR, CRGBA(64, 64, 64, 255), CRGBA(250, 250, 250, 255));
	MenuAudio_3.AddTitle(TheText.Get("FEA_RSS"), X(AUDIO_RSTATION_POS.x), Y(AUDIO_RSTATION_POS.y), false);
	// first row
	movetab.right = 1;
	movetab.left = 4;
	movetab.down = 5;
	movetab.up = 5;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO1], &movetab, 0.0f, Y(18.0f),
		CVector2D(X(96.0f), YF(72.0f)), TriggerAudio_RadioStation, false);
	movetab.right = 2;
	movetab.left = 0;
	movetab.down = 6;
	movetab.up = 6;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO2], &movetab, X(106.0f), Y(20.0f),
		CVector2D(X(79.2f), YF(81.0f)), TriggerAudio_RadioStation, false);
	movetab.right = 3;
	movetab.left = 1;
	movetab.down = 7;
	movetab.up = 7;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO5], &movetab, X(210.0f), Y(20.0f),
		CVector2D(X(86.4f), YF(72.0f)), TriggerAudio_RadioStation, false);
	movetab.right = 4;
	movetab.left = 2;
	movetab.down = 8;
	movetab.up = 8;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO7], &movetab, X(324.0f), Y(5.0f),
		CVector2D(X(115.2f), YF(102.0f)), TriggerAudio_RadioStation, false);
	movetab.right = 0;
	movetab.left = 3;
	movetab.down = 8;
	movetab.up = 8;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO8], &movetab, X(446.0f), Y(5.0f),
		CVector2D(X(102.96f), YF(101.4f)), TriggerAudio_RadioStation, false);
	// second row
	movetab.right = 6;
	movetab.left = 8;
	movetab.down = 0;
	movetab.up = 0;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO3], &movetab, X(60.0f), Y(96.0f),
		CVector2D(X(87.36f), YF(85.8f)), TriggerAudio_RadioStation, false);
	movetab.right = 7;
	movetab.left = 5;
	movetab.down = 1;
	movetab.up = 1;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO4], &movetab, X(130.0f), Y(72.0f),
		CVector2D(X(129.6f), YF(129.0f)), TriggerAudio_RadioStation, false);
	movetab.right = 8;
	movetab.left = 6;
	movetab.down = 2;
	movetab.up = 2;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO6], &movetab, X(284.0f), Y(108.0f),
		CVector2D(X(60.0f), YF(60.0f)), TriggerAudio_RadioStation, false);
	movetab.right = 5;
	movetab.left = 7;
	movetab.down = 3;
	movetab.up = 3;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO9], &movetab, X(404.0f), Y(85.0f),
		CVector2D(X(81.12f), YF(101.4f)), TriggerAudio_RadioStation, false);
	movetab.right = 2;
	movetab.left = 0;
	movetab.down = 1;
	movetab.up = 1;
	MenuPage_Audio.AddMenu(&MenuAudio_3, &movetab);
	MenuPage_Audio.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_Audio.ActivatePage();


	/* Display */

	MenuDisplay_1.SetPosition(X(240.0f), Y(140.0f));
	MenuDisplay_1.SetColors(TEXT_COLOR, TEXT_COLOR, SLIDER_LEFT_COLOR, SLIDER_RIGHT_COLOR);
	MenuDisplay_1.m_style = 0;	// ticks
	MenuDisplay_1.AddTitle(TheText.Get("FED_BRI"), X(DISPLAY_BRIGHTNESS_POS.x), Y(DISPLAY_BRIGHTNESS_POS.y));
	MenuDisplay_1.AddTickBox(X(-30.0f), Y(20.0f), X(200.0f), Y(40.0f), Y(40.0f));
	MenuPage_Display.AddMenu(&MenuDisplay_1);
	MenuDisplay_2.SetPosition(X(290.0f), Y(240.0f));
	MenuDisplay_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR);
	MenuDisplay_2.AddTitle(TheText.Get("FED_TRA"), false, 0.0f, 0.0f, true);
#ifdef GTA_PC
	MenuDisplay_2.SetOptionPosition(X(40.0f), 0.0f, TriggerDisplay_Trails, false);
#else
	MenuDisplay_2.SetOptionPosition(X(40.0f), 0.0f, false);
#endif
	MenuDisplay_2.m_bTwoState = true;
	MenuPage_Display.AddMenu(&MenuDisplay_2);
	MenuDisplay_3.SetPosition(X(290.0f), Y(260.0f));
	MenuDisplay_3.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR);
	MenuDisplay_3.AddTitle(TheText.Get("FED_SUB"), false, 0.0f, 0.0f, true);
	MenuDisplay_3.SetOptionPosition(X(40.0f), 0.0f, false);
	MenuDisplay_3.m_bTwoState = true;
	MenuPage_Display.AddMenu(&MenuDisplay_3);
	MenuDisplay_4.SetPosition(X(290.0f), Y(280.0f));
	MenuDisplay_4.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR);
	MenuDisplay_4.AddTitle(TheText.Get("FED_WIS"), false, 0.0f, 0.0f, true);
	MenuDisplay_4.SetOptionPosition(X(40.0f), 0.0f, false);
	MenuDisplay_4.m_bTwoState = true;
	MenuPage_Display.AddMenu(&MenuDisplay_4);
	MenuPage_Display.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_Display.ActivatePage();


	/* Language */
	MenuLanguage_1.m_numOptions = 0;
	MenuLanguage_1.SetPosition(X(288.0f), Y(160.0f));
	MenuLanguage_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, SELECTED_TEXT_COLOR);
	MenuLanguage_1.AddOption(TheText.Get("FEL_ENG"), 0.0f, 0.0f, TriggerLanguage_Language, false, false);
	MenuLanguage_1.AddOption(TheText.Get("FEL_FRE"), 0.0f, Y(20.0f), TriggerLanguage_Language, false, false);
	MenuLanguage_1.AddOption(TheText.Get("FEL_GER"), 0.0f, Y(40.0f), TriggerLanguage_Language, false, false);
	MenuLanguage_1.AddOption(TheText.Get("FEL_ITA"), 0.0f, Y(60.0f), TriggerLanguage_Language, false, false);
	MenuLanguage_1.AddOption(TheText.Get("FEL_SPA"), 0.0f, Y(80.0f), TriggerLanguage_Language, false, false);
	MenuPage_Language.AddMenu(&MenuLanguage_1);
	MenuPage_Language.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_Language.ActivatePage();


	/*
	 * Save zone menu
	 */

	CVector2D saveGameTextScale2(X(0.49f), Y(0.7f));
	CVector2D defaultTextScale5(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));

	/* Save game */

	MenuSaveZoneSG_1.m_numOptions = 0;
	MenuSaveZoneSG_1.SetPosition(X(200.0f), Y(100.0f));
	MenuSaveZoneSG_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveZoneSG_1.AddOption(TheText.Get("FESZ_SA"), 0.0f, Y(20.0f), TriggerSaveZone_SaveGameSelect, false, false);
	MenuSaveZoneSG_1.AddOption(TheText.Get("FESZ_CA"), 0.0f, Y(40.0f), TriggerSaveZone_QuitMenu, false, false);
	MenuSaveZoneSG_1.m_defaultCancel = TriggerSaveZone_QuitMenu;
	MenuPageSaveZone_SaveGame.AddMenu(&MenuSaveZoneSG_1);
	MenuSaveZoneSG_1.SetMenuSelection(1);
	MenuPageSaveZone_SaveGame.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPageSaveZone_SaveGame.ActivatePage();

	/* Select slot */

	MenuSaveZoneSSL_1.m_numOptions = 0;
	MenuSaveZoneSSL_1.SetPosition(X(160.0f), Y(100.0f));
	MenuSaveZoneSSL_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveZoneSSL_1.AddOption(TheText.Get("FESZ_CA"), 0.0f, 0.0f, TriggerSaveZone_BackToMainMenuTwoLines, false, false);
	MenuSaveZoneSSL_1.SetNewOldTextScale(true, saveGameTextScale2, defaultTextScale5, true);
	MenuPageSaveZone_SaveSlots.AddMenu(&MenuSaveZoneSSL_1);
	MenuSaveZoneSSL_1.SetMenuSelection(0);
	MenuPageSaveZone_SaveSlots.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPageSaveZone_SaveSlots.ActivatePage();

	/* Save successful */

	MenuSaveZoneSS_1.m_numTexts = 0;
	MenuSaveZoneSS_1.SetPosition(X(200.0f), Y(100.0f));
	MenuSaveZoneSS_1.AddText(TheText.Get("FESZ_L1"), X(-40.0f), 0.0f, TITLE_TEXT_COLOR, false);
	MenuSaveZoneSS_1.AddText(TheText.Get("FESZ_L2"), X(-40.0f), Y(20.0f), TITLE_TEXT_COLOR, false);
	// twice this line?
	MenuSaveZoneSS_1.AddText(TheText.Get("FESZ_L2"), X(-40.0f), Y(40.0f), TEXT_COLOR, false);
	MenuPageSaveZone_SavedSuccessfully.AddMenu(&MenuSaveZoneSS_1);
	MenuSaveZoneSS_2.m_numOptions = 0;
	MenuSaveZoneSS_2.SetPosition(X(200.0f), Y(170.0f));
	MenuSaveZoneSS_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveZoneSS_2.AddOption(TheText.Get("FESZ_QU"), X(60.0f), 0.0f, TriggerSaveZone_QuitMenu, false, false);
	MenuPageSaveZone_SavedSuccessfully.AddMenu(&MenuSaveZoneSS_2);
	MenuPageSaveZone_SavedSuccessfully.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPageSaveZone_SavedSuccessfully.ActivatePage();


	MenuSaveZoneMSG_1.m_numTexts = 0;
	MenuSaveZoneMSG_1.SetPosition(X(170.0f), Y(130.0f));
	MenuSaveZoneMSG_1.AddText(TheText.Get("FESZ_SR"), X(-40.0f), 0.0f, TEXT_COLOR, false);
	MenuSaveZoneMSG_1.SetTextsColor(TEXT_COLOR);
	MenuSaveZoneMSG_1.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x-20.0f), X(580.0f));
	MenuPageSaveZone_Message.AddMenu(&MenuSaveZoneMSG_1);
	MenuSaveZoneMSG_2.m_numOptions = 0;
	MenuSaveZoneMSG_2.SetPosition(X(170.0f), Y(180.0f));
	MenuSaveZoneMSG_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(40.0f), 0.0f, TriggerSaveZone_QuitMenu, false, false);
	MenuPageSaveZone_Message.AddMenu(&MenuSaveZoneMSG_2);
	MenuPageSaveZone_Message.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPageSaveZone_Message.ActivatePage();


	MenuSaveZoneQYN_1.m_numTexts = 0;
	MenuSaveZoneQYN_1.SetPosition(X(170.0f), Y(130.0f));
	MenuSaveZoneQYN_1.AddText(TheText.Get("FESZ_SR"), X(-40.0f), 0.0f, TEXT_COLOR, false);
	MenuSaveZoneQYN_1.SetTextsColor(TEXT_COLOR);
	MenuSaveZoneQYN_1.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x-20.0f), X(580.0f));
	MenuPageSaveZone_QuestionYesNo.AddMenu(&MenuSaveZoneQYN_1);
	MenuSaveZoneQYN_2.m_numOptions = 0;
	MenuSaveZoneQYN_2.SetPosition(X(170.0f), Y(180.0f));
	MenuSaveZoneQYN_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_YES"), X(80.0f), 0.0f, TriggerSaveZone_QuitMenu, false, false);
	MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_NO"), X(80.0f), Y(20.0f), TriggerSaveZone_QuitMenu, false, false);
	MenuPageSaveZone_QuestionYesNo.AddMenu(&MenuSaveZoneQYN_2);
	MenuPageSaveZone_QuestionYesNo.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPageSaveZone_QuestionYesNo.ActivatePage();

	/* Format card */

	MenuSaveZoneFC_1.m_numOptions = 0;
	MenuSaveZoneFC_1.SetPosition(X(200.0f), Y(100.0f));
	MenuSaveZoneFC_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveZoneFC_1.AddTitle(TheText.Get("FESZ_FM"), X(-100.0f), 0.0f, false);
	MenuSaveZoneFC_1.AddOption(TheText.Get("FEM_NO"), X(40.0f), Y(95.0f), TriggerSaveZone_BackToMainMenu, false, false);
	MenuSaveZoneFC_1.AddOption(TheText.Get("FEM_YES"), X(40.0f), Y(75.0f), TriggerSaveZone_FormatCardSelect, false, false);
	MenuSaveZoneFC_1.m_defaultCancel = TriggerSaveZone_FormatCardSelect;
	MenuPageSaveZone_FormatCard.AddMenu(&MenuSaveZoneFC_1);
	MenuPageSaveZone_FormatCard.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPageSaveZone_FormatCard.ActivatePage();

	/* Format error */

	MenuSaveZoneEF_1.m_numOptions = 0;
	MenuSaveZoneEF_1.SetPosition(X(200.0f), Y(100.0f));
	MenuSaveZoneEF_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveZoneEF_1.AddTitle(TheText.Get("FESZ_FF"), X(-40.0f), 0.0f, false);
	MenuSaveZoneEF_1.AddOption(TheText.Get("FESZ_OK"), X(70.0f), Y(20.0f), TriggerSaveZone_FormatFailedOK, false, false);
	MenuPageSaveZone_ErrorFormat.AddMenu(&MenuSaveZoneEF_1);
	MenuPageSaveZone_ErrorFormat.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPageSaveZone_ErrorFormat.ActivatePage();

	pActiveMenuPage = &MenuPage_Stats;
	pActiveMenuPage->ActivatePage();

	InitialiseMenuContents();

	m_bWantToUpdateContent = false;
}

void
CMenuManager::InitialiseChangedLanguageSettings(void)
{
	if ( bFrontEnd_ReloadObrTxtGxt )
	{
		bFrontEnd_ReloadObrTxtGxt = false;

		CTimer::Stop();
		TheText.Unload();
		TheText.Load();
		CTimer::Update();

		FrontEndMenuManager.AnaliseMenuContents();
		CGame::frenchGame = false;
		CGame::germanGame = false;
		if ( m_PrefsAllowNastyGame )
			CGame::nastyGame = true;

		for ( int32 i = 0; i < NUM_PAGES; i++ )
		{
			BUTTONTAB_TEXT_X_SCALES[i] = 1.0f;
			PANEL_TEXT_X_SCALES[i] = 1.0f;
		}

		switch ( m_PrefsLanguage )
		{
			case LANGUAGE_AMERICAN:
			{
				MENU_TEXT_SIZE_X = 0.644f;
				MENU_TEXT_SIZE_Y = 0.84f;//0.96f;

				BUTTONTAB_TEXT_SIZE_X = 0.35f;
				BUTTONTAB_TEXT_SIZE_Y = 0.7f;//0.8f;

				BUTTONTAB_TEXT_X_SCALES[6] = 0.94f;

				CONTR_DESCR_NEW_TEXTSCALE.x = 0.4564f;
				CONTR_DESCR_NEW_TEXTSCALE.y = 0.63f;//0.72f;

				CONFIGS_NEW_TEXTSCALE.x = 0.49f;
				CONFIGS_NEW_TEXTSCALE.y = 0.7f;//0.8f;

				AUDIO_OUTPUT_POS.x = 0.0f;
				AUDIO_OUTPUT_POS.y = 0.0f;

				AUDIO_RSTATION_POS.x = 154.0f;
				AUDIO_RSTATION_POS.y = 0.0f;

				DISPLAY_BRIGHTNESS_POS.x = 0.0f;
				DISPLAY_BRIGHTNESS_POS.y = 0.0f;

				MEMCARD_ACCESS_MSG_SIZE_X = 0.84f;
				MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;//1.28f;

				break;
			}

			case LANGUAGE_FRENCH:
			{
				CGame::frenchGame = true;
				if ( m_PrefsAllowNastyGame )
					CGame::nastyGame = false;

				MENU_TEXT_SIZE_X = 0.504f;
				MENU_TEXT_SIZE_Y = 0.84f;//0.96f;

				BUTTONTAB_TEXT_SIZE_X = 0.32f;
				BUTTONTAB_TEXT_SIZE_Y = 0.7f;//0.8f;

				BUTTONTAB_TEXT_X_SCALES[0] = 0.84f;
				BUTTONTAB_TEXT_X_SCALES[3] = 0.84f;
				PANEL_TEXT_X_SCALES[1] = 0.8f;

				CONTR_DESCR_NEW_TEXTSCALE.x = 0.385f;
				CONTR_DESCR_NEW_TEXTSCALE.y = 0.63f;//0.72f;

				CONFIGS_NEW_TEXTSCALE.x = 0.455f;
				CONFIGS_NEW_TEXTSCALE.y = 0.7f;//0.8f;

				AUDIO_OUTPUT_POS.x = -15.0f;
				AUDIO_OUTPUT_POS.y = 0.0f;

				AUDIO_RSTATION_POS.x = 184.0f;
				AUDIO_RSTATION_POS.y = 0.0f;

				DISPLAY_BRIGHTNESS_POS.x = 20.0f;
				DISPLAY_BRIGHTNESS_POS.y = 0.0f;

				MEMCARD_ACCESS_MSG_SIZE_X = 0.84f;
				MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;//1.28f;

				break;
			}

			case LANGUAGE_GERMAN:
			{
				CGame::germanGame = true;
				if ( m_PrefsAllowNastyGame )
					CGame::nastyGame = false;

				MENU_TEXT_SIZE_X = 0.546f;
				MENU_TEXT_SIZE_Y = 0.84f;//0.96f;

				BUTTONTAB_TEXT_SIZE_X = 0.32f;
				BUTTONTAB_TEXT_SIZE_Y = 0.7f;//0.8f;

				CONTR_DESCR_NEW_TEXTSCALE.x = 0.35f;
				CONTR_DESCR_NEW_TEXTSCALE.y = 0.63f;//0.72f;

				CONFIGS_NEW_TEXTSCALE.x = 0.434f;
				CONFIGS_NEW_TEXTSCALE.y = 0.7f;//0.8f;

				AUDIO_OUTPUT_POS.x = -15.0f;
				AUDIO_OUTPUT_POS.y = 0.0f;

				AUDIO_RSTATION_POS.x = 154.0f;
				AUDIO_RSTATION_POS.y = 0.0f;

				DISPLAY_BRIGHTNESS_POS.x = 20.0f;
				DISPLAY_BRIGHTNESS_POS.y = 0.0f;

				MEMCARD_ACCESS_MSG_SIZE_X = 0.7f;
				MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;//1.28f;

				break;
			}

			case LANGUAGE_ITALIAN:
			{
				MENU_TEXT_SIZE_X = 0.574f;
				MENU_TEXT_SIZE_Y = 0.84f;//0.96f;

				BUTTONTAB_TEXT_SIZE_X = 0.32f;
				BUTTONTAB_TEXT_SIZE_Y = 0.7f;//0.8f;

				BUTTONTAB_TEXT_X_SCALES[0] = 0.86f;
				PANEL_TEXT_X_SCALES[1] = 0.9f;

				CONTR_DESCR_NEW_TEXTSCALE.x = 0.385f;
				CONTR_DESCR_NEW_TEXTSCALE.y = 0.63f;//0.72f;

				CONFIGS_NEW_TEXTSCALE.x = 0.42f;
				CONFIGS_NEW_TEXTSCALE.y = 0.7f;//0.8f;

				AUDIO_OUTPUT_POS.x = 10.0f;
				AUDIO_OUTPUT_POS.y = 0.0f;

				AUDIO_RSTATION_POS.x = 194.0f;
				AUDIO_RSTATION_POS.y = 0.0f;

				DISPLAY_BRIGHTNESS_POS.x = 10.0f;
				DISPLAY_BRIGHTNESS_POS.y = 0.0f;

				MEMCARD_ACCESS_MSG_SIZE_X = 0.84f;
				MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;//1.28f;

				break;
			}

			case LANGUAGE_SPANISH:
			{
				MENU_TEXT_SIZE_X = 0.546f;
				MENU_TEXT_SIZE_Y = 0.84f;//0.96f;

				BUTTONTAB_TEXT_SIZE_X = 0.35f;
				BUTTONTAB_TEXT_SIZE_Y = 0.7f;//0.8f;

				BUTTONTAB_TEXT_X_SCALES[0] = 0.78f;
				PANEL_TEXT_X_SCALES[1] = 0.95f;

				CONTR_DESCR_NEW_TEXTSCALE.x = 0.364f;
				CONTR_DESCR_NEW_TEXTSCALE.y = 0.63f;//0.72f;

				CONFIGS_NEW_TEXTSCALE.x = 0.455f;
				CONFIGS_NEW_TEXTSCALE.y = 0.7f;//0.8f;

				AUDIO_OUTPUT_POS.x = 10.0f;
				AUDIO_OUTPUT_POS.y = 0.0f;

				AUDIO_RSTATION_POS.x = 124.0f;
				AUDIO_RSTATION_POS.y = 0.0f;

				DISPLAY_BRIGHTNESS_POS.x = 30.0f;
				DISPLAY_BRIGHTNESS_POS.y = 0.0f;

				MEMCARD_ACCESS_MSG_SIZE_X = 0.84f;
				MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;//1.28f;

				break;
			}
		}
	}
}

void
CMenuManager::InitialiseMenuContents(void)
{
	if ( m_bWantToUpdateContent == false )
	{
		m_bWantToUpdateContent = true;

		m_pageState = PAGESTATE_NORMAL;

		switch ( CPad::GetPad(0)->GetMode() )
		{
			case 3: m_PrefsControllerConfig = CONFIG_4; break;
			case 2: m_PrefsControllerConfig = CONFIG_3; break;
			case 1: m_PrefsControllerConfig = CONFIG_2; break;
			case 0: m_PrefsControllerConfig = CONFIG_1; break;
		}

		MenuControls_1.SetMenuSelection(m_PrefsControllerConfig);
		MenuControls_5.SetMenuSelection(m_PrefsUseVibration);

		MenuAudio_1.SetMenuSelection(m_PrefsMusicVolume / 127.0f * 100.0f + 0.5f);
		MenuAudio_2.SetMenuSelection(m_PrefsSfxVolume   / 127.0f * 100.0f + 0.5f);
		MenuAudio_3.SetMenuSelection(m_PrefsRadioStation);
		MenuAudio_4.SetMenuSelection(m_PrefsStereoMono);

		MenuDisplay_1.SetMenuSelection(m_PrefsBrightness / 512.0f * 100.0f + 0.5f);
#ifdef PS2
		m_PrefsShowTrails = BlurOn;
#else
		m_PrefsShowTrails = CMBlur::BlurOn;
#endif
		MenuDisplay_2.SetMenuSelection(m_PrefsShowTrails);
		MenuDisplay_3.SetMenuSelection(m_PrefsShowSubtitles);
		MenuDisplay_4.SetMenuSelection(m_PrefsUseWideScreen);

		MenuLanguage_1.SetMenuSelection(m_PrefsLanguage);

		FillMenuWithMemCardFileListing(&MenuSaveLG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_LoadGameLoadGameSelect,     nil, 0, 34, 22);
		FillMenuWithMemCardFileListing(&MenuSaveDG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_DeleteGameDeleteGameSelect, nil, 0, 34, 22);

		MenuBriefs_1.m_numTexts = 0;
		MenuBriefs_1.AddText(TheText.Get("FEB_PMB"), 0.0f, 0.0f, TITLE_TEXT_COLOR, 0); // Previous Mission Briefs:

		static wchar StringsToDisplay[NUMPREVIOUSBRIEFS][256];

		CRGBA newColor;
		int32 brierY = 36;

		for ( int32 i = NUMPREVIOUSBRIEFS-1; i >= 0; i-- )
		{
			tPreviousBrief &brief = CMessages::PreviousBriefs[i];
			if (brief.m_pText)
			{
				CMessages::InsertNumberInString(brief.m_pText,
					brief.m_nNumber[0], brief.m_nNumber[1],
					brief.m_nNumber[2], brief.m_nNumber[3],
					brief.m_nNumber[4], brief.m_nNumber[5], StringsToDisplay[i]);
				CMessages::InsertStringInString(StringsToDisplay[i], brief.m_pString);

				newColor = TEXT_COLOR;
				FilterOutColorMarkersFromString(StringsToDisplay[i], newColor);

				if (newColor != TEXT_COLOR)
				{
					newColor.r /= 2;
					newColor.g /= 2;
					newColor.b /= 2;
				}
				MenuBriefs_1.AddText(StringsToDisplay[i], 0.0f, YF((float)brierY), newColor, 0);
				brierY += 54;
			}
		}

		MenuStats_1.m_scrollPosition = 0.0f;
		MenuStats_1.ResetNumberOfTextLines();

		nStatLinesIndex = 0;

		#define STAT_HEADER(str) do { MenuStats_1.AddTextLine(TheText.Get(str), nil); } while(0)
		#define STAT_PARAM(str) do { MenuStats_1.AddTextLine(nil, TheText.Get(str)); } while(0)
		#define STAT_LINE(str, left, isFloat, right) do { MenuStats_1.AddTextLine(TheText.Get(str), PrintStatLine(str, left, isFloat, right)); } while(0)

		int32 nTemp;

		STAT_HEADER("PL_STAT");

		int32 percentCompleted = (CStats::TotalProgressInGame == 0 ? 0 : CStats::ProgressMade * 100.0f / (CGame::nastyGame ? CStats::TotalProgressInGame : CStats::TotalProgressInGame - 1));
		percentCompleted = Min(percentCompleted, 100);

		STAT_LINE("PER_COM", &percentCompleted,       0, nil);

		STAT_LINE("NMISON",  &CStats::MissionsGiven,  0, nil);

		STAT_LINE("FEST_MP", &CStats::MissionsPassed, 0, &CStats::TotalNumberMissions);

		if ( CGame::nastyGame )
			STAT_LINE("FEST_RP", &CStats::NumberKillFrenziesPassed, 0, &CStats::TotalNumberKillFrenzies);

		CPlayerInfo &player = CWorld::Players[CWorld::PlayerInFocus];
		float packagesPercent = 0.0f;
		if (player.m_nTotalPackages != 0)
			packagesPercent = player.m_nCollectedPackages * 100.0f / player.m_nTotalPackages;
		int32 nPackagesPercent = packagesPercent;
		nTemp = 100;

		STAT_LINE("PERPIC", &nPackagesPercent,       0, &nTemp);

		STAT_LINE("NOUNIF", &CStats::NumberOfUniqueJumpsFound, 0, &CStats::TotalNumberOfUniqueJumps);

		STAT_LINE("DAYSPS", &CStats::DaysPassed, 0, nil);

		if ( CGame::nastyGame )
		{
			STAT_LINE("PE_WAST", &CStats::PeopleKilledByPlayer, 0, nil);
			STAT_LINE("PE_WSOT", &CStats::PeopleKilledByOthers, 0, nil);
		}

		STAT_LINE("CAR_EXP", &CStats::CarsExploded, 0, nil);

		STAT_LINE("TM_BUST", &CStats::TimesArrested, 0, nil);

		STAT_LINE("TM_DED", &CStats::TimesDied, 0, nil);

		nTemp = CStats::PedsKilledOfThisType[PEDTYPE_GANG9] + CStats::PedsKilledOfThisType[PEDTYPE_GANG8]
			+ CStats::PedsKilledOfThisType[PEDTYPE_GANG7] + CStats::PedsKilledOfThisType[PEDTYPE_GANG6]
			+ CStats::PedsKilledOfThisType[PEDTYPE_GANG5] + CStats::PedsKilledOfThisType[PEDTYPE_GANG4]
			+ CStats::PedsKilledOfThisType[PEDTYPE_GANG3] + CStats::PedsKilledOfThisType[PEDTYPE_GANG2]
			+ CStats::PedsKilledOfThisType[PEDTYPE_GANG1];
		STAT_LINE("GNG_WST", &nTemp, 0, nil);

		nTemp = CStats::PedsKilledOfThisType[PEDTYPE_CRIMINAL];
		STAT_LINE("DED_CRI", &nTemp, 0, nil);

		STAT_LINE("HEL_DST", &CStats::HelisDestroyed, 0, nil);

		STAT_LINE("KGS_EXP", &CStats::KgsOfExplosivesUsed, 0, nil);

		nTemp = (CStats::InstantHitsFiredByPlayer == 0 ? 0 : CStats::InstantHitsHitByPlayer * 100.0f / CStats::InstantHitsFiredByPlayer);
		STAT_LINE("ACCURA", &nTemp, 0, nil);

		if (CStats::ElBurroTime > 0)
			STAT_LINE("ELBURRO", &CStats::ElBurroTime, 0, nil);

		if (CStats::Record4x4One > 0)
			STAT_LINE("FEST_R1", &CStats::Record4x4One, 0, nil);

		if (CStats::Record4x4Two > 0)
			STAT_LINE("FEST_R2", &CStats::Record4x4Two, 0, nil);

		if (CStats::Record4x4Three > 0)
			STAT_LINE("FEST_R3", &CStats::Record4x4Three, 0, nil);

		if (CStats::Record4x4Mayhem > 0)
			STAT_LINE("FEST_RM", &CStats::Record4x4Mayhem, 0, nil);

		if (CStats::LongestFlightInDodo > 0)
			STAT_LINE("FEST_LF", &CStats::LongestFlightInDodo, 0, nil);

		if (CStats::TimeTakenDefuseMission > 0)
			STAT_LINE("FEST_BD", &CStats::TimeTakenDefuseMission, 0, nil);

		STAT_LINE("CAR_CRU", &CStats::CarsCrushed, 0, nil);

		if (CStats::HighestScores[0] > 0)
		{
			STAT_HEADER("FEST_BB");
			STAT_LINE("FEST_H0", &CStats::HighestScores[0], 0, nil);
		}

		int32 hs = 0;
		for ( int32 i = 1; i < 5; i++ )
			hs += CStats::HighestScores[i];

		if (hs > 0)
			STAT_HEADER("FEST_GC");

		if (CStats::HighestScores[1] > 0)
			STAT_LINE("FEST_H1", &CStats::HighestScores[1], 0, nil);

		if (CStats::HighestScores[2] > 0)
			STAT_LINE("FEST_H2", &CStats::HighestScores[2], 0, nil);

		if (CStats::HighestScores[3] > 0)
			STAT_LINE("FEST_H3", &CStats::HighestScores[3], 0, nil);

		if (CStats::HighestScores[4] > 0)
			STAT_LINE("FEST_H4", &CStats::HighestScores[4], 0, nil);

		STAT_LINE("FESTDFM", &CStats::DistanceTravelledOnFoot, 0, nil);
		STAT_LINE("FESTDCM", &CStats::DistanceTravelledInVehicle, 0, nil);
		STAT_LINE("MMRAIN", &CStats::mmRain, 0, nil);
		nTemp = (int32)CStats::MaximumJumpDistance;
		STAT_LINE("MXCARDM", &nTemp, 0, nil);
		nTemp = (int32)CStats::MaximumJumpHeight;
		STAT_LINE("MXCARJM", &nTemp, 0, nil);

		STAT_LINE("MXFLIP", &CStats::MaximumJumpFlips, 0, nil);
		STAT_LINE("MXJUMP", &CStats::MaximumJumpSpins, 0, nil);

		STAT_HEADER("BSTSTU");

		switch (CStats::BestStuntJump)
		{
			case 1:  STAT_PARAM("INSTUN"); break;
			case 2:  STAT_PARAM("PRINST"); break;
			case 3:  STAT_PARAM("DBINST"); break;
			case 4:  STAT_PARAM("DBPINS"); break;
			case 5:  STAT_PARAM("TRINST"); break;
			case 6:  STAT_PARAM("PRTRST"); break;
			case 7:  STAT_PARAM("QUINST"); break;
			case 8:  STAT_PARAM("PQUINS"); break;
			default: STAT_PARAM("NOSTUC"); break;
		}

		STAT_LINE("PASDRO", &CStats::PassengersDroppedOffWithTaxi, 0, nil);
		STAT_LINE("MONTAX", &CStats::MoneyMadeWithTaxi, 0, nil);
		STAT_LINE("FEST_LS", &CStats::LivesSavedWithAmbulance, 0, nil);
		STAT_LINE("FEST_HA", &CStats::HighestLevelAmbulanceMission, 0, nil);
		STAT_LINE("FEST_CC", &CStats::CriminalsCaught, 0, nil);
		STAT_LINE("FEST_FE", &CStats::FiresExtinguished, 0, nil);
		int32 rnd = ((CGeneral::GetRandomNumber() & 255) + 100) * 2384;
		STAT_LINE("DAYPLC", &rnd, 0, nil);

		#undef STAT_LINE

		MenuStats_2.m_numTexts = 0;
		MenuStats_2.AddText(TheText.Get("CRIMRA"), 0.0f, 0.0f, CRIM_RATING_TEXT_COLOR, 0);

		char rating[16];
		wchar urating[16];
		sprintf(rating, "  %d", CStats::FindCriminalRatingNumber());
		AsciiToUnicode(rating, urating);

		wchar *pStatLine = aStatLines[nStatLinesIndex++];
		UnicodeStrcpy(pStatLine, CStats::FindCriminalRatingString());
		UnicodeStrcat(pStatLine, urating);

		MenuStats_2.AddText(pStatLine, X(MenuStats_1.m_width), 0.0f, CRIM_RATING_TEXT_COLOR, 1);

		MenuSaveZoneSG_1.SetMenuSelection(1);
		MenuSaveZoneFC_1.SetMenuSelection(1);
	}
}


void
CMenuManager::AnaliseMenuContents(void)
{
	if ( m_bWantToUpdateContent )
	{
		m_bWantToUpdateContent = false;

		m_PrefsControllerConfig = (CONTRCONFIG)MenuControls_1.GetMenuSelection();
		switch ( m_PrefsControllerConfig )
		{
			case CONFIG_4: CPad::GetPad(0)->SetMode(3); break;
			case CONFIG_3: CPad::GetPad(0)->SetMode(2); break;
			case CONFIG_2: CPad::GetPad(0)->SetMode(1); break;
			case CONFIG_1: CPad::GetPad(0)->SetMode(0); break;
		}

		m_PrefsUseVibration = MenuControls_5.m_title.m_bSelected;

		m_PrefsMusicVolume   = float(MenuAudio_1.GetMenuSelection())/100.0f*127.0f+0.5f;
		m_PrefsSfxVolume     = float(MenuAudio_2.GetMenuSelection())/100.0f*127.0f+0.5f;
		m_PrefsRadioStation  = MenuAudio_3.GetMenuSelection();
		m_PrefsStereoMono    = MenuAudio_4.GetMenuSelection();
		m_PrefsBrightness    = float(MenuDisplay_1.GetMenuSelection()) / 100.0f*512.0f + 0.5f;
		m_PrefsShowTrails    = MenuDisplay_2.GetMenuSelection();
		m_PrefsShowSubtitles = MenuDisplay_3.GetMenuSelection();
		m_PrefsUseWideScreen = MenuDisplay_4.GetMenuSelection();
#ifdef PS2
		BlurOn               = m_PrefsShowTrails;
#else
		CMBlur::BlurOn       = m_PrefsShowTrails;
#endif

		if ( m_PrefsLanguage != MenuLanguage_1.GetMenuSelection() )
		{
			m_PrefsLanguage = MenuLanguage_1.GetMenuSelection();
			m_bInitialised = false;
			bFrontEnd_ReloadObrTxtGxt = true;
		}
	}
}

void
CMenuManager::InitialiseMenuContentsAfterLoadingGame(void)
{
	if ( MenuLanguage_1.GetMenuSelection() != m_PrefsLanguage )
	{
		m_bInitialised = false;
		bFrontEnd_ReloadObrTxtGxt = true;
	}
}

void
CMenuManager::DrawFrontEnd(void)
{
	CFont::SetAlphaFade(255.0f);
	if(m_bInSaveZone)
		DrawFrontEndSaveZone();
	else
		DrawFrontEndNormal();

	if ( MemCardAccessTriggerCaller.CanCall() )
		MemCardAccessTriggerCaller.CallTrigger();

	DisplayWarningControllerMsg();
}

void
CMenuManager::DrawFrontEndNormal(void)
{
	CSprite2d::InitPerFrame();
	CFont::InitPerFrame();

	if ( bMemoryCardSpecialZone )
	{
		static uint8 counter = 0;

		counter++;

		if ( (counter & 63 ) == 0 )
		{
			FillMenuWithMemCardFileListing(&MenuSaveLG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_LoadGameLoadGameSelect, nil, 0, 34, 22);
			FillMenuWithMemCardFileListing(&MenuSaveDG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_DeleteGameDeleteGameSelect, nil, 0, 34, 22);
		}
	}

	m_fade = 255;
	if ( m_nChangePageTimer != 0 && m_nChangePageTimer >= CTimer::GetTimeInMillisecondsPauseMode() )
		m_fade = uint32(float(m_nChangePageTimer - CTimer::GetTimeInMillisecondsPauseMode()) / 250.0f * 255.0f);

	m_someAlpha = 255;

	m_position.x = 0.0f;
	m_position.y = 0.0f;

	if ( m_nStartPauseTimer != 0 && m_nStartPauseTimer >= CTimer::GetTimeInMillisecondsPauseMode() )
	{
		float slide = float(m_nStartPauseTimer - CTimer::GetTimeInMillisecondsPauseMode()) / 800.0f;
		float alpha = 1.0f;

		if ((m_nStartPauseTimer - CTimer::GetTimeInMillisecondsPauseMode()) <= 1600)
			alpha = float(m_nStartPauseTimer - CTimer::GetTimeInMillisecondsPauseMode()) / 400.0f;

		m_someAlpha = 255 - clamp(alpha, 0.0f, 1.0f) * 255.0f;

		switch ( m_nSlidingDir )
		{
			case SLIDE_TO_RIGHT:  m_position.x =   slide * X(700.0f);  break;
			case SLIDE_TO_TOP:    m_position.y = -(slide * Y(500.0f)); break;
			case SLIDE_TO_LEFT:   m_position.x = -(slide * X(700.0f)); break;
			case SLIDE_TO_BOTTOM: m_position.y =   slide * Y(500.0f);  break;
			default:              m_position.y =   slide * Y(500.0f);  break;
		}
	}

	if ( m_nEndPauseTimer != 0 && m_nEndPauseTimer >= CTimer::GetTimeInMillisecondsPauseMode() )
	{
		float slide = float(m_nEndPauseTimer - CTimer::GetTimeInMillisecondsPauseMode()) / 800.0f;
		float alpha = float((int32)(m_nEndPauseTimer - CTimer::GetTimeInMillisecondsPauseMode()) + -266) / 533.0f;

		m_someAlpha = clamp(alpha, 0.0f, 1.0f) * 255.0f;

		switch ( m_nSlidingDir )
		{
			case SLIDE_TO_TOP:    m_position.y =   (1.0f - slide) * Y(500.0f);  break;
			case SLIDE_TO_RIGHT:  m_position.x =   (1.0f - slide) * X(700.0f);  break;
			case SLIDE_TO_LEFT:   m_position.x =   (1.0f - slide) * X(700.0f);  break;
			case SLIDE_TO_BOTTOM: m_position.y = -((1.0f - slide) * Y(500.0f)); break;
			default:              m_position.y = -((1.0f - slide) * Y(500.0f)); break;
		}
	}

	if ( m_someAlpha < 255 )
		m_fade = m_someAlpha;

	float posX, posY;

	/* Draw splash */
	RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
	CSprite2d *splash = LoadSplash(nil);
	if(splash)
		splash->Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
	else
		// doesn't exist!!
		CHud::Sprites[19].Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
	RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERMIPNEAREST);

	/* Draw main panel */
	RwRenderStateSet(rwRENDERSTATETEXTUREADDRESS, (void*)rwTEXTUREADDRESSCLAMP);
	CRGBA panelColor(255, 255, 255, m_someAlpha);
	m_sprites[FE2_MAINPANEL_UL].Draw(
		CRect(m_position.x, m_position.y, m_position.x+SCRW/2.0f, m_position.y+SCRH/2.0f),
		panelColor);
	m_sprites[FE2_MAINPANEL_UR].Draw(
		CRect(m_position.x+SCRW/2.0f, m_position.y, m_position.x+SCRW, m_position.y+SCRH/2.0f),
		panelColor);
	m_sprites[FE2_MAINPANEL_DL].Draw(
		CRect(m_position.x, m_position.y+SCRH/2.0f, m_position.x+SCRW/2.0f, m_position.y+SCRH),
		panelColor);
	m_sprites[FE2_MAINPANEL_DR].Draw(
		CRect(m_position.x+SCRW/2.0f, m_position.y+SCRH/2.0f, m_position.x+SCRW, m_position.y+SCRH),
		panelColor);

	/* Draw icon backdrop */
	CRGBA iconColor(255, 255, 255, m_fade*0.75f);
	float iconX = 48.0f;
	float iconY = 54.0f;
	float iconWidth = 540.0f;
	float iconHeight = 296.0f;
	int32 sprite = FE_ICONBRIEF;

#ifdef PS2_MENU_USEALLPAGEICONS
	switch(m_currentPage)
	{
	case PAGE_STATS:
		sprite = FE_ICONSTATS;
		break;
	case PAGE_LOAD:
		sprite = FE_ICONSAVE;
		break;
	case PAGE_CONTROLS:
		sprite = FE_ICONCONTROLS;
		break;
	case PAGE_BRIEFS:
		sprite = FE_ICONBRIEF;
		break;
	case PAGE_AUDIO:
		sprite = FE_ICONAUDIO;
		break;
	case PAGE_DISPLAY:
		sprite = FE_ICONDISPLAY;
		break;
	case PAGE_LANGUAGE:
		sprite = FE_ICONLANGUAGE;
		break;
	}
#else
	switch(m_currentPage)
	{
	case PAGE_STATS:
	case PAGE_LOAD:
	case PAGE_CONTROLS:
		sprite = FE_ICONSTATS;	// PS2 has the same texture for stats and brief
		//sprite = FE_ICONBRIEF;
		break;
	case PAGE_BRIEFS:
		sprite = FE_ICONBRIEF;
		break;
	case PAGE_AUDIO:
		sprite = FE_ICONAUDIO;
		break;
	case PAGE_DISPLAY:
		sprite = FE_ICONDISPLAY;
		break;
	case PAGE_LANGUAGE:
		sprite = FE_ICONLANGUAGE;
		break;
	}
#endif
	m_sprites[sprite].Draw(
		CRect_SZ(m_position.x+X(iconX), m_position.y+Y(iconY), X(iconWidth), Y(iconHeight)),
		iconColor);

	/* Overwrite tab buttons if entered page */
	bool bOverwriteTab = false;

	switch ( m_pageState )
	{
		case PAGESTATE_NORMAL:
		case PAGESTATE_HIGHLIGHTED:
			break;

		case PAGESTATE_SELECTED:
			bOverwriteTab = true;
			break;
	}

	if( bOverwriteTab )
	{
		CRGBA shadow(41, 101, 102, m_someAlpha);
		CRGBA green(40, 48, 57, m_someAlpha);
		CSprite2d::DrawRect(
			CRect_SZ(m_position.x+X(82.0f), m_position.y+Y(408.0f), X(476.0f), Y(18.0f)),
			shadow);
		CSprite2d::DrawRect(
			CRect_SZ(m_position.x+X(82.0f), m_position.y+Y(408.0f), X(476.0f), Y(5.0f)),
			green);
	}
// stats, load, briefs, controls, audio, display, language

	/* Shadow of panel on top of tab buttons */
	CRGBA panelShadow(96, 96, 96, m_someAlpha*0.375f);
	CSprite2d::DrawRect(CRect_SZ(m_position.x+X(87.0f), m_position.y+Y(408.0f), X(464.0f), Y(3.0f)), panelShadow);
	/* Draw second shadow - seems unused */
	if ( m_nChangePageTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() < m_nChangePageTimer )
	{
		posX = 0.0f;
		switch(field_18)
		{
		case PAGE_STATS: posX = 88.0f; break;
		case PAGE_LOAD: posX = 286.0f; break;	// actually controls
		case PAGE_BRIEFS: posX = 154.0f; break;	// actually load
		case PAGE_CONTROLS: posX = 220.0f; break;	// actually briefs
		case PAGE_AUDIO: posX = 352.0f; break;
		case PAGE_DISPLAY: posX = 418.0f; break;
		case PAGE_LANGUAGE: posX = 484.0f; break;
		}
		CSprite2d::DrawRect(CRect_SZ(m_position.x+X(posX), m_position.y+Y(411.0f), X(65.0f), Y(3.0f)), panelShadow);
	}

	/* Active tab */
	posX = 0.0f;
	switch(m_currentPage)
	{
	case PAGE_STATS: posX = 88.0f; break;
	case PAGE_LOAD: posX = 154.0f; break;
	case PAGE_BRIEFS: posX = 220.0f; break;
	case PAGE_CONTROLS: posX = 286.0f; break;
	case PAGE_AUDIO: posX = 352.0f; break;
	case PAGE_DISPLAY: posX = 418.0f; break;
	case PAGE_LANGUAGE: posX = 484.0f; break;
	}
	// PAL has 465 for 407 here - and actually 406 seems right
	m_sprites[FE2_TABACTIVE].Draw(CRect_SZ(m_position.x+X(posX), m_position.y+YF(465.0f), X(128.0f), Y(32.0f)), CRGBA(255, 255, 255, m_someAlpha));

	/* Draw page title */
	posX = m_position.x + X(592.0f);
	posY = m_position.y + Y(376.0f);
	CRGBA fontCol1(255, 193, 71, m_someAlpha);
	CRGBA fontCol2(0, 0, 0, m_someAlpha);
	CFont::SetFontStyle(FONT_HEADING);
	CFont::SetBackgroundOff();
	CFont::SetScale(X(PANEL_TEXT_SIZE_X), Y(PANEL_TEXT_SIZE_Y));
	CFont::SetPropOn();
	CFont::SetCentreOff();
	CFont::SetJustifyOn();
	CFont::SetRightJustifyWrap(0.0f);
	CFont::SetRightJustifyOn();
	CFont::SetBackGroundOnlyTextOn();
	CFont::SetWrapx(SCRW-X(40.0f)); // 600.0f
	const char *key = nil;
	switch(m_currentPage)
	{
	case PAGE_STATS:    key = "FEP_STA"; break;
	case PAGE_LOAD:     key = "FEP_SAV"; break;
	case PAGE_BRIEFS:   key = "FEP_BRI"; break;
	case PAGE_CONTROLS: key = "FEP_CON"; break;
	case PAGE_AUDIO:    key = "FEP_AUD"; break;
	case PAGE_DISPLAY:  key = "FEP_DIS"; break;
	case PAGE_LANGUAGE: key = "FEP_LAN"; break;
	}
	CFont::SetScale(X(PANEL_TEXT_SIZE_X*PANEL_TEXT_X_SCALES[m_currentPage]), Y(PANEL_TEXT_SIZE_Y));
	CFont::SetColor(fontCol1);
	CFont::PrintString(posX, posY, TheText.Get(key));
	CFont::SetColor(fontCol2);
	CFont::PrintString(posX-X(1.0f), posY-Y(1.0f), TheText.Get(key));
	CFont::DrawFonts();

	/* Draw controller buttons */
	CFont::SetFontStyle(FONT_BANK);
	CFont::SetBackgroundOff();
	CFont::SetScale(X(0.35f), Y(0.64f));
	CFont::SetPropOn();
	CFont::SetCentreOff();
	CFont::SetJustifyOn();
	CFont::SetRightJustifyOff();
	CFont::SetBackGroundOnlyTextOn();
	CFont::SetWrapx(SCRW-X(40.0f)); // 600.0f
	CFont::SetColor(CRGBA(16, 16, 16, m_someAlpha));
	switch(m_currentPage)
	{
		case PAGE_STATS:
			CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(360.0f), TheText.Get("FEDS_ST"));
			CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(372.0f), TheText.Get("FEDS_AM"));
			CFont::PrintString(m_position.x+X(242.0f), m_position.y+Y(360.0f), TheText.Get("FEDSSC1"));
			CFont::PrintString(m_position.x+X(242.0f), m_position.y+Y(372.0f), TheText.Get("FEDSSC2"));
			break;

		case PAGE_BRIEFS:
			CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(360.0f), TheText.Get("FEDS_ST"));
			CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(372.0f), TheText.Get("FEDS_AM"));
			break;

		case PAGE_LOAD:
		case PAGE_CONTROLS:
		case PAGE_AUDIO:
		case PAGE_DISPLAY:
		case PAGE_LANGUAGE:
		{
			CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(360.0f), TheText.Get("FEDS_SE"));
			CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(372.0f), TheText.Get("FEDS_BA"));
			CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(384.0f), TheText.Get("FEDS_ST"));

			switch ( m_pageState )
			{
				case PAGESTATE_NORMAL:
					CFont::PrintString(m_position.x+X(242.0f), m_position.y+Y(372.0f), TheText.Get("FEDS_AM")); // <>-CHANGE MENU
					break;

				case PAGESTATE_HIGHLIGHTED:
				case PAGESTATE_SELECTED:
				{
					CFont::PrintString(m_position.x+X(242.0f), m_position.y+Y(360.0f+3.5f), TheText.Get("FEA_UP")); // ;
					CFont::PrintString(m_position.x+X(242.0f), m_position.y+Y(384.0f-3.5f), TheText.Get("FEA_DO")); // =
					CFont::PrintString(m_position.x+X(242.0f-10.0f), m_position.y+Y(372.0f), TheText.Get("FEA_LE")); // <
					CFont::PrintString(m_position.x+X(242.0f+11.0f), m_position.y+Y(372.0f), TheText.Get("FEA_RI")); // >
					CFont::PrintString(m_position.x+X(242.0f+20.0f), m_position.y+Y(372.0f), TheText.Get("FEDSAS3")); // - CHANGE SELECTION

					break;
				}
			}

			break;
		}
	}

	CFont::DrawFonts();

	/* Draw tab button texts */
	CFont::SetFontStyle(FONT_BANK);
	CFont::SetBackgroundOff();
	CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X), Y(BUTTONTAB_TEXT_SIZE_Y));
	CFont::SetPropOn();
	CFont::SetCentreOn();
	CFont::SetRightJustifyOff();
	CFont::SetBackGroundOnlyTextOn();
	CFont::SetWrapx(SCRW-X(40.0f)); // 600.0f

	switch ( m_pageState )
	{
		case PAGESTATE_NORMAL:
		{
			CFont::SetColor(CRGBA(16, 16, 16, m_someAlpha));
			CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_STATS]), Y(BUTTONTAB_TEXT_SIZE_Y));
			CFont::PrintString(m_position.x+X(92.0f), m_position.y+Y(408.0f), TheText.Get("FEB_STA"));
			CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_LOAD]), Y(BUTTONTAB_TEXT_SIZE_Y));
			CFont::PrintString(m_position.x+X(158.0f), m_position.y+Y(408.0f), TheText.Get("FEB_SAV"));
			CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_BRIEFS]), Y(BUTTONTAB_TEXT_SIZE_Y));
			CFont::PrintString(m_position.x+X(224.0f), m_position.y+Y(408.0f), TheText.Get("FEB_BRI"));
			CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_CONTROLS]), Y(BUTTONTAB_TEXT_SIZE_Y));
			CFont::PrintString(m_position.x+X(290.0f), m_position.y+Y(408.0f), TheText.Get("FEB_CON"));
			CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_AUDIO]), Y(BUTTONTAB_TEXT_SIZE_Y));
			CFont::PrintString(m_position.x+X(356.0f), m_position.y+Y(408.0f), TheText.Get("FEB_AUD"));
			CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_DISPLAY]), Y(BUTTONTAB_TEXT_SIZE_Y));
			CFont::PrintString(m_position.x+X(422.0f), m_position.y+Y(408.0f), TheText.Get("FEB_DIS"));
			CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_LANGUAGE]), Y(BUTTONTAB_TEXT_SIZE_Y));
			CFont::PrintString(m_position.x+X(488.0f), m_position.y+Y(408.0f), TheText.Get("FEB_LAN"));

			break;
		}

		case PAGESTATE_HIGHLIGHTED:
		case PAGESTATE_SELECTED:
		{
			CFont::SetColor(CRGBA(16, 16, 16, m_someAlpha));
			switch(m_currentPage)
			{
			// PAL has 466 for 408...probably rounded?
			case PAGE_STATS:
				CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_STATS]), Y(BUTTONTAB_TEXT_SIZE_Y));
				CFont::PrintString(m_position.x+X(92.0f), m_position.y+Y(408.0f), TheText.Get("FEB_STA"));
				break;
			case PAGE_LOAD:
				CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_LOAD]), Y(BUTTONTAB_TEXT_SIZE_Y));
				CFont::PrintString(m_position.x+X(158.0f), m_position.y+Y(408.0f), TheText.Get("FEB_SAV"));
				break;
			case PAGE_BRIEFS:
				CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_BRIEFS]), Y(BUTTONTAB_TEXT_SIZE_Y));
				CFont::PrintString(m_position.x+X(224.0f), m_position.y+Y(408.0f), TheText.Get("FEB_BRI"));
				break;
			case PAGE_CONTROLS:
				CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_CONTROLS]), Y(BUTTONTAB_TEXT_SIZE_Y));
				CFont::PrintString(m_position.x+X(290.0f), m_position.y+Y(408.0f), TheText.Get("FEB_CON"));
				break;
			case PAGE_AUDIO:
				CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_AUDIO]), Y(BUTTONTAB_TEXT_SIZE_Y));
				CFont::PrintString(m_position.x+X(356.0f), m_position.y+Y(408.0f), TheText.Get("FEB_AUD"));
				break;
			case PAGE_DISPLAY:
				CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_DISPLAY]), Y(BUTTONTAB_TEXT_SIZE_Y));
				CFont::PrintString(m_position.x+X(422.0f), m_position.y+Y(408.0f), TheText.Get("FEB_DIS"));
				break;
			case PAGE_LANGUAGE:
				CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_LANGUAGE]), Y(BUTTONTAB_TEXT_SIZE_Y));
				CFont::PrintString(m_position.x+X(488.0f), m_position.y+Y(408.0f), TheText.Get("FEB_LAN"));
				break;
			}

			break;
		}
	}

	CFont::DrawFonts();

	pActiveMenuPage = nil;
	switch(m_currentPage)
	{
		case PAGE_STATS:	pActiveMenuPage = &MenuPage_Stats; break;
		case PAGE_LOAD:	    pActiveMenuPage = pMenuSave; break;
		case PAGE_BRIEFS:	pActiveMenuPage = &MenuPage_Briefs; break;
		case PAGE_CONTROLS:	pActiveMenuPage = &MenuPage_Controls; break;
		case PAGE_AUDIO:	pActiveMenuPage = &MenuPage_Audio; break;
		case PAGE_DISPLAY:	pActiveMenuPage = &MenuPage_Display; break;
		case PAGE_LANGUAGE:	pActiveMenuPage = &MenuPage_Language; break;
	}

	CFont::SetFontStyle(FONT_BANK);
	CFont::SetBackgroundOff();
	CFont::SetScale(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
	CFont::SetPropOn();
	CFont::SetCentreOff();
	CFont::SetJustifyOn();
	CFont::SetRightJustifyOff();
	CFont::SetBackGroundOnlyTextOn();
	CFont::SetWrapx(SCRW-X(40.0f)); // 600.0f
	CFont::SetRightJustifyWrap(X(38.0f));

	if(m_currentPage == PAGE_LANGUAGE)
	{
		CFont::SetCentreOn();
		CFont::SetCentreSize(SCRW-X(40.0f)); // 600.0f
	}

	if ( m_nEndPauseTimer != 0 )
	{
		switch ( m_currentPage )
		{
			case PAGE_LOAD:
			case PAGE_BRIEFS:
			case PAGE_CONTROLS:
				break;

			default:
				CFont::SetWrapx(X(1200.0f));
				break;
		}
	}

	if(pActiveMenuPage)
	{
		pActiveMenuPage->SetAlpha(m_fade);

		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
				pActiveMenuPage->DrawNormal(m_position.x, m_position.y);
				break;

			case PAGESTATE_HIGHLIGHTED:
				pActiveMenuPage->DrawHighlighted(CRGBA(rgbaATC.r, rgbaATC.g, rgbaATC.b, m_fade), m_position.x, m_position.y);
				break;

			case PAGESTATE_SELECTED:
				pActiveMenuPage->Draw(CRGBA(rgbaATC.r, rgbaATC.g, rgbaATC.b, m_fade), CRGBA(MENU_SELECTED_COLOR.r, MENU_SELECTED_COLOR.g, MENU_SELECTED_COLOR.b, m_fade), m_position.x, m_position.y);
				break;
		}
	}

	CFont::DrawFonts();
	CFont::DrawFonts();
	RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
	RwRenderStateSet(rwRENDERSTATETEXTUREADDRESS, (void*)rwTEXTUREADDRESSWRAP);
}

void
CMenuManager::DrawFrontEndSaveZone(void)
{
	if ( bMemoryCardSpecialZone )
	{
		static uint8 counter = 0;
		counter++;
		if ( counter & 63 )
		{
			FillMenuWithMemCardFileListing(&MenuSaveZoneSSL_1, TriggerSaveZone_BackToMainMenuTwoLines, TriggerSaveZone_SaveSlots, nil, 0, 34, 22);

			if ( TheMemoryCard.GetError() == CMemoryCard::ERR_NOFORMAT )
			{
				pActiveMenuPage = &MenuPageSaveZone_FormatCard;
				pActiveMenuPage->ActivatePage();
				bMemoryCardSpecialZone = false;
			}
		}
	}

	CSprite2d::InitPerFrame();
	CFont::InitPerFrame();

	RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);

	m_fade = 255;

	CSprite2d::DrawRect(CRect(X(50.0f), Y(50.0f), X(590.0f), Y(398.0f)), CRGBA(0, 0, 0, 175)); //CRect(50.0f, 57.142f, 590.0f, 454.857147f)

	CFont::SetFontStyle(FONT_BANK);
	CFont::SetBackgroundOff();
	CFont::SetScale(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
	CFont::SetPropOn();
	CFont::SetCentreOff();
	CFont::SetJustifyOn();
	CFont::SetRightJustifyOff();
	CFont::SetBackGroundOnlyTextOn();
	CFont::SetRightJustifyWrap(X(70.0f));
	CFont::SetWrapx(SCRW-X(70.0f)); // 570.0f

	if ( pActiveMenuPage )
	{
		pActiveMenuPage->SetAlpha(m_fade);
		pActiveMenuPage->Draw(CRGBA(rgbaATC.r, rgbaATC.g, rgbaATC.b, m_fade), TITLE_TEXT_COLOR, 0.0f, 0.0f);
	}


	CFont::DrawFonts();
	CFont::SetFontStyle(FONT_BANK);
	CFont::SetBackgroundOff();
	CFont::SetScale(X(0.44f), Y(0.68f)); // 0.44f, 0.777143f
	CFont::SetPropOn();
	CFont::SetCentreOff();
	CFont::SetJustifyOn();
	CFont::SetRightJustifyOff();
	CFont::SetBackGroundOnlyTextOn();
	CFont::SetWrapx(SCRW-X(40.0f)); //600.0f
	CFont::SetColor(TEXT_COLOR);

	wchar *text;
	if ( pActiveMenuPage == &MenuPageSaveZone_FormatCard
		|| pActiveMenuPage == &MenuPageSaveZone_SaveSlots
		|| pActiveMenuPage == &MenuPageSaveZone_SaveGame )
	{
		text = TheText.Get("FEDS_SB"); // / button - SELECT " button - BACK
	}
	else
	{
		text = TheText.Get("FEDS_SE"); // / button - SELECT
	}

	CFont::PrintString(X(180.0f), Y(376.0f), text); // 180.0f, 429.714294f
	CFont::DrawFonts();

	RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
}

void
CMenuManager::DrawMemoryCardStartUpMenus()
{
	CFont::SetAlphaFade(255.0f);
	bMemoryCardStartUpMenus_ExitNow = false;

	CMenuPage page; // + 0x40 data
	CMenuMultiChoiceTriggered MCMenu;
	MCMenu.SetPosition(X(320.0f), Y(150.0f)); //171.428574f

	switch ( TheMemoryCard.CheckCardStateAtGameStartUp(CARD_ONE) )
	{
		case CMemoryCard::MCSTATE_NEED_200KB: // 200KB
		{
			// There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 200KB is needed to save this application data. Do you wish to start? (YES or NO)
			MCMenu.AddTitle(TheText.Get("MCGNSP"), 0.0f, 0.0f, 0);
			break;
		}

		case CMemoryCard::MCSTATE_NEED_500KB: // 500KB
		{
			// There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 500KB is needed to save this application data. Do you wish to start? (YES or NO)
			MCMenu.AddTitle(TheText.Get("MCDNSP"), 0.0f, 0.0f, 0);
			break;
		}

		case CMemoryCard::MCSTATE_OK:
		case CMemoryCard::MCSTATE_NOCARD:
		{
			return;
			break;
		}
	}

	MCMenu.AddOption(TheText.Get("FEM_NO"),  X(30.0f),  Y(110.0f), nil, 0, 0);// 125.714294f
	MCMenu.AddOption(TheText.Get("FEM_YES"), X(-30.0f), Y(110.0f), TriggerMCSUM_Yes, 0, 0);// 125.714294f
	MCMenu.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	page.AddMenu(&MCMenu);

	MCMenu.GoFirst();

	page.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);

	CTimer::Initialise();
	CTimer::StartUserPause();

	while ( !bMemoryCardStartUpMenus_ExitNow )
	{
#ifdef GTA_PC
		HandleExit();

		if(RsGlobal.quit)
			return;
#endif

#ifdef GTA_PC
		if ( CPad::GetPad(0)->GetDPadLeftJustDown() )
			page.GoLeft();
		if ( CPad::GetPad(0)->GetDPadRightJustDown() )
			page.GoRight();
		if ( CPad::GetPad(0)->GetDPadUpJustDown() )
			page.GoDown();
		if ( CPad::GetPad(0)->GetDPadDownJustDown() )
			page.GoUp();
		if ( CPad::GetPad(0)->GetCrossJustDown() || CPad::GetPad(0)->GetEnterJustDown() || CPad::GetPad(0)->GetRightMouseJustDown() )
			page.SelectCurrentOptionUnderCursor();

		if ( CPad::GetPad(0)->GetCircleJustDown() || CPad::GetPad(0)->GetEscapeJustDown() )
			;
#else
		if ( CPad::GetPad(0)->GetDPadLeftJustDown() )
			page.GoLeft();
		if ( CPad::GetPad(0)->GetDPadRightJustDown() )
			page.GoRight();
		if ( CPad::GetPad(0)->GetDPadUpJustDown() )
			page.GoDown();
		if ( CPad::GetPad(0)->GetDPadDownJustDown() )
			page.GoUp();
		if ( CPad::GetPad(0)->GetCrossJustDown() )
			page.SelectCurrentOptionUnderCursor();
		if ( CPad::GetPad(0)->GetCircleJustDown() )
			;
#endif

		static int32 MemCardStatusWaiter = 0;

		MemCardStatusWaiter++;

		if ( MemCardStatusWaiter > 120 )
		{
			MemCardStatusWaiter = 0;

			switch ( TheMemoryCard.CheckCardStateAtGameStartUp(CARD_ONE) )
			{
				case CMemoryCard::MCSTATE_NEED_200KB:
				{
					// There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 200KB is needed to save this application data. Do you wish to start? (YES or NO)
					MCMenu.AddTitle(TheText.Get("MCGNSP"), 0.0f, 0.0f, 0);
					break;
				}

				case CMemoryCard::MCSTATE_NEED_500KB:
				{
					// There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 500KB is needed to save this application data. Do you wish to start? (YES or NO)
					MCMenu.AddTitle(TheText.Get("MCDNSP"), 0.0f, 0.0f, 0);
					break;
				}

				case CMemoryCard::MCSTATE_NOCARD:
				{
					// There is no Memory Card (PS2) in MEMORY CARD slot 1. Do you wish to start? (YES or NO)
					MCMenu.AddTitle(TheText.Get("MCSTNS"), 0.0f, 0.0f, 0);
					break;
				}

				case CMemoryCard::MCSTATE_OK:
				{
					bMemoryCardStartUpMenus_ExitNow = true;
					break;
				}
			}
		}

		DoRWStuffStartOfFrame(0, 0, 0, 0, 0, 0, 255);
		CFont::InitPerFrame();

		RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
		CSprite2d *splash = LoadSplash("splash1");
		splash->Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
		RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);

		SetRandomActiveTextlineColor(1);

		CRGBA col(rgbaATC.r, rgbaATC.g, rgbaATC.b, 255);
		CFont::SetFontStyle(FONT_BANK);
		CFont::SetBackgroundOff();
		CFont::SetScale(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
		CFont::SetPropOn();
		CFont::SetJustifyOn();
		CFont::SetRightJustifyOff();
		CFont::SetBackGroundOnlyTextOn();
		CFont::SetWrapx(SCRW-X(60.0f)); // 580.0f
		CFont::SetCentreOn();
		CFont::SetCentreSize(SCRW-X(120.0f)); // 520.0f

		MCMenu.Draw(col, TITLE_TEXT_COLOR, 0.0f, 0.0f);
		CFont::DrawFonts();

		CFont::SetFontStyle(FONT_BANK);
		CFont::SetScale(X(0.4f), Y(0.64f)); // 0.731429
		CFont::SetPropOn();
		CFont::SetCentreOff();
		CFont::SetJustifyOn();
		CFont::SetRightJustifyOff();
		CFont::SetBackGroundOnlyTextOn();
		CFont::SetWrapx(SCRW-X(60.0f)); // 580.0f
		CFont::SetColor(TEXT_COLOR);


		CPlaceableShText text;
		text.SetPosition(X(240.0f), Y(378.0f), false); // 432.000000
		text.SetColor(TEXT_COLOR);
		text.m_text = TheText.Get("FEDS_SE"); // / button - SELECT
		text.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
		text.Draw(0.0f, 0.0f);

		CFont::DrawFonts();
		DisplayWarningControllerMsg();
		DoRWStuffEndOfFrame();
		CPad::UpdatePads();
		CTimer::Update();
	}

	CTimer::EndUserPause();
	CTimer::Stop();

	for ( int32 i = 0; i < 100; i++ )
	{
#ifdef GTA_PC
		HandleExit();
#endif
		DoRWStuffStartOfFrame(0, 0, 0, 0, 0, 0, 255);

		RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
		CSprite2d *splash = LoadSplash("splash1");
		splash->Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
		RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);

		DoRWStuffEndOfFrame();
	}
}

void
CMenuManager::Process(void)
{
	if ( m_bSaveMenuActive || m_bInSaveZone || TheCamera.GetScreenFadeStatus() == FADE_0 )
	{
		InitialiseMenusOnce();
		m_bWantToRestart = false;
		WorkOutMenuState(false);

		if ( m_bMenuActive )
		{
			if ( !m_bInSaveZone )
				LoadAllTextures();
			InitialiseMenuContents();
			SetRandomActiveTextlineColor(0);
			ProcessControllerInput();
		}
		else
		{
			AnaliseMenuContents();
			pMenuSave = &MenuPage_SaveBasic;
			m_pageState = PAGESTATE_NORMAL;
			bMemoryCardSpecialZone = false;
			bIgnoreTriangleButton = false;
			UnloadTextures();
			m_bInSaveZone = false;
			m_bRenderGameInMenu = false;
			gErrorSampleTriggered = true;
		}
	}
}

void
CMenuManager::WorkOutMenuState(uint8 bExit)
{
#ifdef GTA_PC
	bool bIsStartPressed = CPad::GetPad(0)->GetStartJustDown() || (m_pageState == PAGESTATE_NORMAL && CPad::GetPad(0)->GetEscapeJustDown());
#else
	bool bIsStartPressed = CPad::GetPad(0)->GetStartJustDown();
#endif
	bool bIsCreditsOrDraw      = CCredits::AreCreditsDone() || m_bMenuActive;
	bool bIsDemoOrDraw         = m_bMenuActive || CGame::bDemoMode;

	if ( (bIsStartPressed && bIsCreditsOrDraw) || bExit || (!bIsDemoOrDraw && CPad::IsNoOrObsolete()) )
	{
		if ( m_nStartPauseTimer == 0 && m_nEndPauseTimer == 0 )
		{
			m_bMenuActive = !m_bMenuActive;

			if ( !m_bMenuActive )
			{
				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_STARTING, 0);
				DMAudio.ChangeMusicMode(MUSICMODE_GAME);
				gMusicPlaying = false;
				bMemoryCardSpecialZone = false;
				bIgnoreTriangleButton = false;

				m_bMenuActive = true;

				m_nEndPauseTimer = CTimer::GetTimeInMillisecondsPauseMode() + 800;

				if ( m_currentPage == PAGE_CONTROLS || m_currentPage == PAGE_BRIEFS || m_currentPage == PAGE_LOAD )
				{
					m_nSlidingDir = CGeneral::GetRandomNumber() & (SLIDE_MAX-1);

					switch ( m_nSlidingDir ) //m_nSlidingDir &= ~1;
					{
						case SLIDE_TO_LEFT:  m_nSlidingDir = SLIDE_TO_TOP;    break;
						case SLIDE_TO_RIGHT: m_nSlidingDir = SLIDE_TO_BOTTOM; break;
					}

					m_position.y = Y(500.0f); // 571.428589f;
				}
			}
			else
			{
				DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND);

				if ( DMAudio.GetRadioInCar() < 9 )
					m_PrefsRadioStation = DMAudio.GetRadioInCar();
				else
					m_PrefsRadioStation = CGeneral::GetRandomNumber() % 9;

				CTimer::StartUserPause();
				CPad::StopPadsShaking();
				m_nStartPauseTimer = CTimer::GetTimeInMillisecondsPauseMode() + 800;
				m_nSlidingDir = CGeneral::GetRandomNumber() & (SLIDE_MAX-1);

				switch ( m_nSlidingDir )
				{
					case SLIDE_TO_RIGHT:  m_position.y = Y(612.5f); break;
					case SLIDE_TO_LEFT:   m_position.y = Y(612.5f); break;
					case SLIDE_TO_BOTTOM: m_position.y = Y(500.0f); break;
					case SLIDE_TO_TOP:    m_position.y = Y(500.0f); break;
					default:              m_position.y = Y(500.0f); break;
				}

				if ( m_currentPage == PAGE_CONTROLS || m_currentPage == PAGE_BRIEFS )
				{
					m_nSlidingDir = CGeneral::GetRandomNumber() & (SLIDE_MAX-1);

					switch ( m_nSlidingDir ) //m_nSlidingDir &= ~1;
					{
						case SLIDE_TO_LEFT:  m_nSlidingDir = SLIDE_TO_TOP;    break;
						case SLIDE_TO_RIGHT: m_nSlidingDir = SLIDE_TO_BOTTOM; break;
					}

					m_position.y = Y(500.0f); //571.428589f
				}
			}
		}
	}

	if ( m_bSaveMenuActive && !m_bInSaveZone && !TheMemoryCard._bunk2)
	{
		m_bSaveMenuActive = false;
		m_bInSaveZone = true;
		m_bRenderGameInMenu = true;
		m_bMenuActive = true;
		CTimer::StartUserPause();
		pActiveMenuPage = &MenuPageSaveZone_SaveGame;
	}

	if ( m_pageState == PAGESTATE_NORMAL && gMusicPlaying )
	{
		DMAudio.StopFrontEndTrack();
		gMusicPlaying = false;
	}

	if ( m_nChangePageTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() >= m_nChangePageTimer )
	{
		m_nChangePageTimer = 0;
		pMenuSave = &MenuPage_SaveBasic;
		m_currentPage = m_newPage;
	}

	if ( m_nPageLeftTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() >= m_nPageLeftTimer )
		m_nPageLeftTimer = 0;

	if ( m_nPageRightTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() >= m_nPageRightTimer )
		m_nPageRightTimer = 0;

	if ( m_nStartPauseTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() >= m_nStartPauseTimer )
		m_nStartPauseTimer = 0;

	if ( m_nEndPauseTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() >= m_nEndPauseTimer )
	{
		m_nEndPauseTimer = 0;
		m_bMenuActive = false;
		m_bMenuActive = false;
		m_bInSaveZone = false;
		CTimer::EndUserPause();
	}
}

void
CMenuManager::ProcessControllerInput(void)
{
	if ( TimeToStopPadShaking != 0 && TimeToStopPadShaking < CTimer::GetTimeInMillisecondsPauseMode() )
	{
		CPad::StopPadsShaking();
		TimeToStopPadShaking = 0;
	}

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadLeft() || CPad::GetPad(0)->GetLeft() )
#else
	if ( CPad::GetPad(0)->GetDPadLeft() )
#endif
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
			case PAGESTATE_HIGHLIGHTED:
				break;

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoLeftStill();
				break;
			}
		}
	}

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadRight() || CPad::GetPad(0)->GetRight() )
#else
	if ( CPad::GetPad(0)->GetDPadRight() )
#endif
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
			case PAGESTATE_HIGHLIGHTED:
				break;

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoRightStill();
				break;
			}
		}
	}

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadLeftJustDown() || CPad::GetPad(0)->GetLeftJustDown() )
#else
	if ( CPad::GetPad(0)->GetDPadLeftJustDown() )
#endif
		ProcessDPadLeftJustDown();

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadRightJustDown() || CPad::GetPad(0)->GetRightJustDown() )
#else
	if ( CPad::GetPad(0)->GetDPadRightJustDown() )
#endif
		ProcessDPadRightJustDown();

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadUp() || CPad::GetPad(0)->GetUp() )
#else
	if ( CPad::GetPad(0)->GetDPadUp() )
#endif
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
			{
				if ( m_currentPage == PAGE_STATS )
				{
					if ( pActiveMenuPage )
						pActiveMenuPage->GoUpStill();
				}
				break;
			}

			case PAGESTATE_HIGHLIGHTED:
				break;

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoUpStill();
				break;
			}
		}
	}

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadDown() || CPad::GetPad(0)->GetDown() )
#else
	if ( CPad::GetPad(0)->GetDPadDown() )
#endif
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
			{
				if ( m_currentPage == PAGE_STATS )
				{
					if ( pActiveMenuPage )
						pActiveMenuPage->GoDownStill();
				}

				break;
			}
			case PAGESTATE_HIGHLIGHTED:
				break;

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoDownStill();
				break;
			}
		}
	}

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadUpJustDown() || CPad::GetPad(0)->GetUpJustDown() )
#else
	if ( CPad::GetPad(0)->GetDPadUpJustDown() )
#endif
		ProcessDPadUpJustDown();

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadDownJustDown() || CPad::GetPad(0)->GetDownJustDown() )
#else
	if ( CPad::GetPad(0)->GetDPadDownJustDown() )
#endif
		ProcessDPadDownJustDown();

	if ( CPad::GetPad(0)->GetLeftShoulder1JustDown() )
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
				ProcessDPadLeftJustDown();
				break;

			case PAGESTATE_HIGHLIGHTED:
			case PAGESTATE_SELECTED:
				break;
		}
	}

	if ( CPad::GetPad(0)->GetRightShoulder1JustDown() )
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
				ProcessDPadRightJustDown();
				break;

			case PAGESTATE_HIGHLIGHTED:
			case PAGESTATE_SELECTED:
				break;
		}
	}

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetCrossJustDown() || CPad::GetPad(0)->GetEnterJustDown() || CPad::GetPad(0)->GetRightMouseJustDown() )
#else
	if ( CPad::GetPad(0)->GetCrossJustDown() )
#endif
		ProcessDPadCrossJustDown();

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetTriangleJustDown() || CPad::GetPad(0)->GetBackspaceJustDown() || (m_pageState != PAGESTATE_NORMAL && CPad::GetPad(0)->GetEscapeJustDown()) )
#else
	if ( CPad::GetPad(0)->GetTriangleJustDown() )
#endif
		ProcessDPadTriangleJustDown();
}


void
CMenuManager::ProcessDPadLeftJustDown(void)
{
	if ( m_bInSaveZone )
	{
		if ( pActiveMenuPage )
		{
			pActiveMenuPage->GoLeft();

			if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveZoneSSL_1 )
			{
				if ( MenuSaveZoneSSL_1.m_numOptions < 2 )
					;
				else
					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
			}
			else
				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
		}
	}
	else
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
			{
				if ( !bMemoryCardSpecialZone && !m_bInSaveZone )
				{
					if ( m_nChangePageTimer == 0 )
					{
						if ( --m_newPage < PAGE_FIRST ) m_newPage = PAGE_LAST;

						m_nPageLeftTimer   = CTimer::GetTimeInMillisecondsPauseMode() + 300;
						m_nPageRightTimer  = 0;
						m_nChangePageTimer = CTimer::GetTimeInMillisecondsPauseMode() + 250;
						field_18 = m_newPage;
						DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
					}
				}

				break;
			}

			case PAGESTATE_HIGHLIGHTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoLeftMenuOnPage();

				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);

				break;
			}

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
				{
					pActiveMenuPage->GoLeft();

					if ( m_currentPage == PAGE_AUDIO)
					{
						if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_1 )
							;
						else if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_2 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else if ( m_currentPage == PAGE_DISPLAY)
					{
						if ( pActiveMenuPage->m_pCurrentControl == &MenuDisplay_1 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else
					{
						if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveDG_2 )
						{
							if ( MenuSaveDG_2.m_numOptions < 2 )
								;
							else
								DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
						}
						else if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveLG_2 )
						{
							if ( MenuSaveLG_2.m_numOptions < 2 )
								;
							else
								DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
						}
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
				}

				break;
			}
		}
	}
}

void
CMenuManager::ProcessDPadRightJustDown(void)
{
	if ( m_bInSaveZone )
	{
		if ( pActiveMenuPage )
		{
			pActiveMenuPage->GoRight();

			if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveZoneSSL_1 )
			{
				if ( MenuSaveZoneSSL_1.m_numOptions < 2 )
					;
				else
					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
			}
			else
				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
		}
	}
	else
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
			{
				if ( !bMemoryCardSpecialZone && !m_bInSaveZone )
				{
					if ( m_nChangePageTimer == 0 )
					{
						if ( ++m_newPage > PAGE_LAST ) m_newPage = PAGE_FIRST;

						m_nPageLeftTimer   = 0;
						m_nPageRightTimer  = CTimer::GetTimeInMillisecondsPauseMode() + 300;
						m_nChangePageTimer = CTimer::GetTimeInMillisecondsPauseMode() + 250;
						field_18 = m_newPage;
						DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
					}
				}

				break;
			}

			case PAGESTATE_HIGHLIGHTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoRightMenuOnPage();

				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);

				break;
			}

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
				{
					pActiveMenuPage->GoRight();

					if ( m_currentPage == PAGE_AUDIO)
					{
						if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_1 )
							;
						else if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_2 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else if ( m_currentPage == PAGE_DISPLAY)
					{
						if ( pActiveMenuPage->m_pCurrentControl == &MenuDisplay_1 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else
					{
						if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveDG_2 )
						{
							if ( MenuSaveDG_2.m_numOptions < 2 )
								;
							else
								DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
						}
						else if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveLG_2 )
						{
							if ( MenuSaveLG_2.m_numOptions < 2 )
								;
							else
								DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
						}
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
				}

				break;
			}
		}
	}
}

void
CMenuManager::ProcessDPadUpJustDown(void)
{
	if ( m_bInSaveZone )
	{
		if ( pActiveMenuPage )
		{
			pActiveMenuPage->GoUp();

			if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveZoneSSL_1 )
			{
				if ( MenuSaveZoneSSL_1.m_numOptions < 2 )
					;
				else
					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
			}
			else
				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
		}
	}
	else
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
				break;

			case PAGESTATE_HIGHLIGHTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoUpMenuOnPage();

				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
				break;
			}

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
				{
					pActiveMenuPage->GoUp();

					if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveDG_2 )
					{
						if ( MenuSaveDG_2.m_numOptions < 2 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveLG_2 )
					{
						if ( MenuSaveLG_2.m_numOptions < 2 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else
						DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
				}

				break;
			}
		}
	}
}

void
CMenuManager::ProcessDPadDownJustDown(void)
{
	if ( m_bInSaveZone )
	{
		if ( pActiveMenuPage )
		{
			pActiveMenuPage->GoDown();

			if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveZoneSSL_1 )
			{
				if ( MenuSaveZoneSSL_1.m_numOptions < 2 )
					;
				else
					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
			}
			else
				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
		}
	}
	else
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
				break;

			case PAGESTATE_HIGHLIGHTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoDownMenuOnPage();

				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);

				break;
			}

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
				{
					pActiveMenuPage->GoDown();

					if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveDG_2 )
					{
						if ( MenuSaveDG_2.m_numOptions < 2 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveLG_2 )
					{
						if ( MenuSaveLG_2.m_numOptions < 2 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else
						DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
				}
				break;
			}
		}
	}
}

void
CMenuManager::ProcessDPadTriangleJustDown(void)
{
	if ( pActiveMenuPage )
	{
		pActiveMenuPage->SelectDefaultCancelAction();

		if ( m_bMenuActive || m_bInSaveZone )
		{
			if ( bIgnoreTriangleButton )
			{
				if ( m_bInSaveZone )
					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_BACK, 0);
				else if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveDG_2 || pActiveMenuPage->m_pCurrentControl == &MenuSaveLG_2 )
					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_BACK, 0);
			}
			else if ( !bIgnoreTriangleButton )
			{
				switch ( m_pageState )
				{
					case PAGESTATE_NORMAL:
						WorkOutMenuState(true);
						break;

					case PAGESTATE_HIGHLIGHTED:
						m_pageState = PAGESTATE_NORMAL;
						DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
						break;

					case PAGESTATE_SELECTED:
					{
						m_pageState = PAGESTATE_HIGHLIGHTED;
						if ( pActiveMenuPage )
						{
							if ( pActiveMenuPage->m_numControls == 1 )
							{
								m_pageState = PAGESTATE_NORMAL;
								DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
							}
							else
								DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_BACK, 0);
						}
						break;
					}
				}
			}
		}
	}
	else
	{
		if ( !bIgnoreTriangleButton )
		{
			switch ( m_pageState )
			{
				case PAGESTATE_NORMAL:
					WorkOutMenuState(false);
					break;

				case PAGESTATE_HIGHLIGHTED:
					m_pageState = PAGESTATE_NORMAL;
					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
					break;

				case PAGESTATE_SELECTED:
				{
					m_pageState = PAGESTATE_HIGHLIGHTED;
					if ( pActiveMenuPage )
					{
						if ( pActiveMenuPage->m_numControls == 1 )
						{
							m_pageState = PAGESTATE_NORMAL;
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
						}
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_BACK, 0);
					}
					break;
				}
			}
		}
	}
}

void
CMenuManager::ProcessDPadCrossJustDown(void)
{
	if ( m_bInSaveZone )
	{
		if ( pActiveMenuPage )
			pActiveMenuPage->SelectCurrentOptionUnderCursor();

		DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);
	}
	else
	{
		if ( m_currentPage != PAGE_STATS && m_currentPage != PAGE_BRIEFS)
		{
			switch ( m_pageState )
			{
				case PAGESTATE_NORMAL:
				{
					m_pageState = PAGESTATE_HIGHLIGHTED;
					if ( pActiveMenuPage )
					{
						if ( pActiveMenuPage->m_numControls == 1 )
							m_pageState = PAGESTATE_SELECTED;
					}

					switch ( m_currentPage )
					{
						case PAGE_AUDIO:
						{
							if (   pActiveMenuPage->m_pCurrentControl == &MenuAudio_1
								|| pActiveMenuPage->m_pCurrentControl == &MenuAudio_2
								|| pActiveMenuPage->m_pCurrentControl == &MenuAudio_3
								|| pActiveMenuPage->m_pCurrentControl == &MenuAudio_4 )
							{
								if ( !gMusicPlaying )
								{
									DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1);
									gMusicPlaying = true;
								}
							}
							else
							{
								DMAudio.StopFrontEndTrack();
								gMusicPlaying = false;
							}
							break;
						}
					}

					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);
					break;
				}

				case PAGESTATE_HIGHLIGHTED:
				{
					m_pageState = PAGESTATE_SELECTED;
					DoHackingMenusAtPageBrowse();
					if ( pActiveMenuPage )
					{
						if ( pActiveMenuPage->IsActiveMenuTwoState())
						{
							m_pageState = PAGESTATE_HIGHLIGHTED;
							pActiveMenuPage->ActiveMenuTwoState_SelectNextPosition();
						}
					}

					switch ( m_currentPage )
					{
						case PAGE_AUDIO:
						{
							if ( pActiveMenuPage->m_pCurrentControl != &MenuAudio_4 )
								DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);

							break;
						}

						default:
						{
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);
							DMAudio.StopFrontEndTrack();
							gMusicPlaying = false;
							break;
						}
					}
					break;
				}

				case PAGESTATE_SELECTED:
				{
					if ( pActiveMenuPage )
					{
						pActiveMenuPage->SelectCurrentOptionUnderCursor();

						switch ( m_currentPage )
						{
							case PAGE_AUDIO:
							{
								if ( pActiveMenuPage->m_pCurrentControl != &MenuAudio_3 )
									m_pageState = PAGESTATE_HIGHLIGHTED;
								break;
							}

							case PAGE_LOAD:
							case PAGE_LANGUAGE:
								break;

							default:
								m_pageState = PAGESTATE_HIGHLIGHTED;
								break;
						}
					}

					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);
					break;
				}
			}
		}
	}
}

void
CMenuManager::DoHackingMenusAtPageBrowse(void)
{
	if ( pActiveMenuPage )
	{
		switch ( m_currentPage )
		{
			case PAGE_CONTROLS:
			{
				if ( pActiveMenuPage->m_pCurrentControl == &MenuControls_1  )
				{
					int32 sel = MenuControls_1.GetMenuSelection();
					MenuControls_1.GoFirst();

					for ( int32 i = 0; i < sel; i++ )
						MenuControls_1.GoNext();
				}
				break;
			}

			case PAGE_AUDIO:
			{
				if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_3  )
				{
					int32 sel = MenuAudio_3.GetMenuSelection();
					MenuAudio_3.GoFirst();

					for ( int32 i = 0; i < sel; i++ )
						MenuAudio_3.GoNext();
				}
				break;
			}
		}
	}
}

void
CMenuManager::SetSoundLevelsForMusicMenu(void)
{
	DMAudio.SetMusicMasterVolume(m_PrefsMusicVolume);
	DMAudio.SetEffectsMasterVolume(m_PrefsSfxVolume);
}

void
CMenuManager::FilterOutColorMarkersFromString(wchar *string, CRGBA &color)
{
	wchar buf[300];
	UnicodeStrcpy(buf, string);

	wchar *src = buf;
	wchar *dst = string;
	while ( *src != '\0' )
	{
		if ( *src == '~' )
		{
			src++;

			if ( *src == 'l' )      color = CRGBA(0, 0, 0, 255);
			else if ( *src == 'p' ) color = CRGBA(255, 0, 255, 255);
			else if ( *src == 'y' ) color = CRGBA(255, 255, 0, 255);
			else if ( *src == 'w' ) color = CRGBA(255, 255, 255, 255);
			else if ( *src == 'b' ) color = CRGBA(40, 40, 255, 255);
			else if ( *src == 'g' ) color = CRGBA(40, 235, 40, 255);
			else if ( *src == 'r' ) color = CRGBA(255, 0, 0, 255);

			while ( *src++ != '~' )
				;
		}
		else
			*dst++ = *src++;
	}

	*dst = '\0';
}

#endif