home *** CD-ROM | disk | FTP | other *** search
/ WarCraft 2000 - Nuclear Epidemic / W2000.nrg / SOURCE.War2000 / Interface.cpp < prev    next >
C/C++ Source or Header  |  1998-11-13  |  63KB  |  1,935 lines

  1. #include "ddini.h"
  2. #include "ResFile.h"
  3. #include "FastDraw.h"
  4. #include "mgraph.h"
  5. #include "mouse.h"
  6. #include "menu.h"
  7. #include "MapDiscr.h"
  8. #include "multipl.h"
  9. #include "fog.h"
  10. #include "walls.h"
  11. #include "Nature.h"
  12. #include <time.h>
  13. #include "Nucl.h"
  14. #include "TopZones.h"
  15. #include "Megapolis.h"
  16. #include "Dialogs.h"
  17. #include "fonts.h"
  18. #include "dpchat.h"
  19. #include "dplobby.h"
  20. #include "GSound.h"
  21. #include <assert.h>
  22. int time1,time2,time3,time4,time5;
  23. extern int time8;
  24. void processMLoadGame();
  25. extern char GameName[128];
  26. bool ContinueGame;
  27. extern word rpos;
  28. char CurrentMap[64];
  29. void CBar(int x,int y,int Lx,int Ly,byte c);
  30. void PrepareEditMedia(byte myid);
  31. extern bool EditMapMode;
  32. extern int RES[8][8];
  33. extern byte mapPos[16];
  34. void PreLoadExtendedMap(char* s);
  35. void PostLoadExtendedMap(char* s);
  36. void InitGame();
  37. int nsmaplx;
  38. int nsmaply;
  39. int GameMode;
  40. extern int LastKey;
  41. extern bool KeyPressed;
  42. void MFix();
  43. SQPicture MainMenuGround;
  44. SQPicture Panel1;
  45. SQPicture r128x20e;
  46. SQPicture r128x20p;
  47. SQPicture r80x20e;
  48. SQPicture r80x20p;
  49. SQPicture w106x28d;
  50. SQPicture r106x28e;
  51. SQPicture r106x28p;
  52. SQPicture w164x28d;
  53. SQPicture r164x28e;
  54. SQPicture r164x28p;
  55. SQPicture w224x28d;
  56. SQPicture r224x28e;
  57.  
  58. SQPicture sb_up_e;
  59. SQPicture sb_up_p;
  60. SQPicture sb_up_d;
  61.  
  62. SQPicture sb_dn_e;
  63. SQPicture sb_dn_p;
  64. SQPicture sb_dn_d;
  65.  
  66. SQPicture sb_lf_e;
  67. SQPicture sb_lf_p;
  68. SQPicture sb_lf_d;
  69.  
  70. SQPicture sb_ri_e;
  71. SQPicture sb_ri_p;
  72. SQPicture sb_ri_d;
  73.  
  74. SQPicture sb_vbar;
  75. SQPicture sb_vbare;
  76. SQPicture sb_hbar;
  77. SQPicture sb_hbare;
  78.  
  79. SQPicture sb_btn;
  80.  
  81. SQPicture chk1_on;
  82. SQPicture chk1_off;
  83. SQPicture chk2_on;
  84. SQPicture chk2_off;
  85.  
  86. SQPicture w160x160;
  87. SQPicture w160x256;
  88. SQPicture y288x256;
  89. SQPicture y352x352;
  90. SQPicture y288x128;
  91. SQPicture w288x256;
  92. SQPicture w352x352;
  93. SQPicture w288x128;
  94.  
  95. RLCTable TPassive;
  96. RLCTable TActive;
  97. RLCTable TDisable;
  98. RLCFont FPassive;
  99. RLCFont FActive;
  100. RLCFont FDisable;
  101. extern bool CheapMode;
  102. int PanelLx;
  103. int PanelLy;
  104. bool MultiplayerStart;
  105. bool GameNeedToDraw;
  106. extern bool ChoosePosition;
  107. extern word NPlayers;
  108. void CloseMPL();
  109. void IBEnumeratePlayers(InputBox** IB);
  110. void LBEnumerateSessions(ListBox* LB);
  111. void AnalyseMessages();
  112. bool CreateNamedSession(char* Name);
  113. bool InGame;
  114. bool JoinNameToSession(int ns,char* Name);
  115. void FreeDDObjects( void );
  116. bool StartIGame();
  117. byte MyRace;
  118. extern LPDIRECTPLAY3A        lpDirectPlay3A;
  119. extern word PlayerMenuMode;
  120. extern LPVOID lplpConnectionBuffer[16];
  121. void PlayVideo();
  122. bool ProcessMessages(){
  123.     MSG         msg;
  124.     while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
  125.         if (msg.message == WM_QUIT)
  126.         {
  127.             //FreeDDObjects();
  128.             //PostQuitMessage(msg.wParam);
  129.             return true;
  130.         }
  131.         TranslateMessage(&msg);
  132.         DispatchMessage(&msg);
  133.     }
  134.     return false;
  135. };
  136.  
  137. char PlName[64];
  138. void ProcessHelp();
  139. void InitDialogs(){
  140.     unsigned long dws=20;
  141.     GetComputerName(PlName,&dws);
  142.     LoadRLC("fpassive.rlc",&TPassive);
  143.     LoadRLC("factive.rlc",&TActive);
  144.     LoadRLC("fdisable.rlc",&TDisable);
  145.     RegisterRLCFont(&FPassive,TPassive,0);
  146.     RegisterRLCFont(&FActive,TActive,0);
  147.     RegisterRLCFont(&FDisable,TDisable,0);
  148.     MainMenuGround.LoadPicture("zast.bpx");
  149.     Panel1.LoadPicture("panel1.bpx");
  150.     PanelLx=Panel1.PicPtr[0];
  151.     PanelLy=Panel1.PicPtr[1];
  152.     //SQPicture r128x20e;
  153.     r128x20p.LoadPicture("r128x20p.bpx");
  154.     r128x20e.LoadPicture("r128x20e.bpx");
  155.     r80x20e.LoadPicture("r80x20e.bpx");
  156.     r80x20p.LoadPicture("r80x20p.bpx");
  157.     w106x28d.LoadPicture("w106x28d.bpx");
  158.     r106x28e.LoadPicture("r106x28e.bpx");
  159.     r106x28p.LoadPicture("r106x28p.bpx");
  160.     w164x28d.LoadPicture("w164x28d.bpx");
  161.     r164x28e.LoadPicture("r164x28e.bpx");
  162.     r164x28p.LoadPicture("r164x28p.bpx");
  163.     w224x28d.LoadPicture("w224x28d.bpx");
  164.     r224x28e.LoadPicture("r224x28e.bpx");
  165.  
  166.     sb_up_e.LoadPicture("sb_up_e.bpx");
  167.     sb_up_p.LoadPicture("sb_up_p.bpx");
  168.     sb_up_d.LoadPicture("sb_up_d.bpx");
  169.  
  170.     sb_dn_e.LoadPicture("sb_dn_e.bpx");
  171.     sb_dn_p.LoadPicture("sb_dn_p.bpx");
  172.     sb_dn_d.LoadPicture("sb_dn_d.bpx");
  173.  
  174.     sb_lf_e.LoadPicture("sb_lf_e.bpx");
  175.     sb_lf_p.LoadPicture("sb_lf_p.bpx");
  176.     sb_lf_d.LoadPicture("sb_lf_d.bpx");
  177.  
  178.     sb_ri_e.LoadPicture("sb_ri_e.bpx");
  179.     sb_ri_p.LoadPicture("sb_ri_p.bpx");
  180.     sb_ri_d.LoadPicture("sb_ri_d.bpx");
  181.  
  182.     sb_vbar.LoadPicture("sb_vbar.bpx");
  183.     sb_vbare.LoadPicture("sb_vbare.bpx");
  184.     sb_hbar.LoadPicture("sb_hbar.bpx");
  185.     sb_hbare.LoadPicture("sb_hbare.bpx");
  186.  
  187.     sb_btn.LoadPicture("sb_btn.bpx");
  188.  
  189.     chk1_on.LoadPicture("chk1_on.bpx");
  190.     chk1_off.LoadPicture("chk1_off.bpx");
  191.     chk2_on.LoadPicture("chk2_on.bpx");
  192.     chk2_off.LoadPicture("chk2_off.bpx");
  193.  
  194.     w160x160.LoadPicture("w160x160.bpx");
  195.     w160x256.LoadPicture("w160x256.bpx");
  196.  
  197.     y288x256.LoadPicture("y288x256.bpx");
  198.     y352x352.LoadPicture("y352x352.bpx");
  199.     y288x128.LoadPicture("y288x128.bpx");
  200.     w288x256.LoadPicture("w288x256.bpx");
  201.     w352x352.LoadPicture("w352x352.bpx");
  202.     w288x128.LoadPicture("w288x128.bpx");
  203. };
  204. static int ItemChoose;
  205.  
  206. bool MMItemChoose(SimpleDialog* SD){
  207.     ItemChoose=SD->UserParam;
  208.     Lpressed=false;
  209.     return true;
  210. };
  211. #define mcmExit        0xFF
  212. #define mcmSingle    0xF1
  213. #define mcmMulti    0xF2
  214. #define mcmVideo    0xF3
  215. #define mcmResume    0xF4
  216. #define mcmOk        0xF5
  217. #define mcmCancel    0xF6
  218. #define mcmLoad        0xF7
  219. #define mcmSave        0xF8
  220. #define mcmHost        0xF9
  221. #define mcmJoin        0xFA
  222. #define mcmRefresh    0xFB
  223. #define mcmEdit        0xFC
  224. #define mcmAll        0xFD
  225. #define mcmGraph    0xE0
  226. #define mcmSound    0xE1
  227. #define mcmSpeed    0xE2
  228. #define mcmSnWeapon 0xE3
  229. #define mcmSnBirth    0xE4
  230. #define mcmSnOrder    0xE5
  231. #define mcmSnAttack 0xE6
  232. #define mcmOptions    0xE7
  233. #define mcmHelp        0xE8
  234. void InstallMap(ListBox* LB,WIN32_FIND_DATA* FD){
  235.     LB->AddItem(FD->cFileName,0);
  236. };
  237. void CreateMapsList(ListBox* LB){
  238.     WIN32_FIND_DATA FD;
  239.     HANDLE HF=FindFirstFile("*.wm",&FD);
  240.     if(HF!=INVALID_HANDLE_VALUE){
  241.         InstallMap(LB,&FD);
  242.         while(FindNextFile(HF,&FD))InstallMap(LB,&FD);
  243.     };
  244. };
  245. void InstallNewMap(ListBox* LB,WIN32_FIND_DATA* FD){
  246.     LB->AddItem(FD->cFileName,0);
  247. };
  248. void CreateNewMapsList(ListBox* LB){
  249.     WIN32_FIND_DATA FD;
  250.     HANDLE HF=FindFirstFile("*.wm",&FD);
  251.     if(HF!=INVALID_HANDLE_VALUE){
  252.         InstallMap(LB,&FD);
  253.         while(FindNextFile(HF,&FD))InstallMap(LB,&FD);
  254.     };
  255. };
  256. //----------------Graphics menu----------------//
  257. bool InitScreen();
  258. int OldSizeX;
  259. int OldSizeY;
  260. extern LPDIRECTDRAW            lpDD;
  261. bool CheckMode(){
  262.     ContinueGame=false;
  263.     DialogsSystem GMM(smapx+(nsmaplx<<4)-(288>>1),smapy+(nsmaply<<4)-(288>>1));
  264.     Picture* PIC1=GMM.addPicture(NULL,0,0,&y288x256,&y288x256,&y288x256);
  265.     TextButton* Mess=GMM.addTextButton(PIC1,288>>1,30,"═ε≡∞αδⁿφε ?",&FActive,&FPassive,&FDisable,1);
  266.     TextButton* OkBtn=GMM.addTextButton(PIC1,(288>>1)-60,180,"─α",&FActive,&FPassive,&FDisable,1);
  267.     TextButton* CancelBtn=GMM.addTextButton(PIC1,(288>>1)+60,180,"═σ≥",&FActive,&FPassive,&FDisable,1);
  268.     OkBtn->UserParam=mcmOk;
  269.     OkBtn->OnUserClick=&MMItemChoose;
  270.     CancelBtn->UserParam=mcmCancel;
  271.     CancelBtn->OnUserClick=&MMItemChoose;
  272.     int time=GetTickCount();
  273.     ItemChoose=-1;
  274.     do{
  275.         ProcessMessages();
  276.         GMM.ProcessDialogs();
  277.         GMM.RefreshView();
  278.     }while(ItemChoose==-1&&GetTickCount()-time<8000);
  279.     if(ItemChoose==mcmOk)return true;
  280.     else return false;
  281.  
  282. };
  283. void GSSetup800();
  284. void DrawAllScreen();
  285. extern int COPYSizeX;
  286. extern int RealLx;
  287. extern int RealLy;
  288. void SERROR(){
  289.     PlayEffect(0,0,0);
  290.     int time=GetTickCount();
  291.     do{}while(GetTickCount()-time<1000);
  292. };
  293. void SERROR1(){
  294.     PlayEffect(1,0,0);
  295.     int time=GetTickCount();
  296.     do{}while(GetTickCount()-time<1000);
  297. };
  298. void SERROR2(){
  299.     PlayEffect(2,0,0);
  300.     int time=GetTickCount();
  301.     do{}while(GetTickCount()-time<1000);
  302. };
  303. bool SetGameDisplayMode(int SizeX,int SizeY){
  304.     RealLx=SizeX;
  305.     RealLy=SizeY;
  306.     FreeDDObjects();
  307.     InitScreen();
  308.     GSSetup800();
  309.     DrawAllScreen();
  310.     if(CheckMode())return true;
  311.     else{
  312.         RealLx=OldSizeX;
  313.         RealLy=OldSizeY;
  314.         FreeDDObjects();
  315.         InitScreen();
  316.         GSSetup800();
  317.         DrawAllScreen();
  318.         return false;
  319.     };
  320.     return false;
  321. };
  322. bool ProcessGraphics(int x,int y){
  323.     ItemChoose=-1;
  324.     DialogsSystem MMenu(x,y);
  325.     Picture* PIC=MMenu.addPicture(NULL,0,0,&Panel1,&Panel1,&Panel1);
  326.     BpxTextButton* OkBtn=MMenu.addBpxTextButton(PIC,60,190,"╙╤╥└═╬┬╚╥▄",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  327.     TextButton* BTN1=MMenu.addTextButton(PIC,PanelLx>>1,30,"╨σµΦ∞",&FActive,&FPassive,&FDisable,1);
  328.     OkBtn->UserParam=mcmOk;
  329.     OkBtn->OnUserClick=&MMItemChoose;
  330.     BpxTextButton* ExitBtn=MMenu.addBpxTextButton(PIC,60,220,"┬█╒╬─",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  331.     ExitBtn->UserParam=mcmExit;
  332.     ExitBtn->OnUserClick=&MMItemChoose;
  333.     CheckBox* mode800=MMenu.addCheckBox(PIC,70,70,"800x600",1,0,&chk2_on,&chk2_off,&f16x16w,&f16x16g);    
  334.     CheckBox* mode1024=MMenu.addCheckBox(PIC,70,100,"1024x768",1,0,&chk2_on,&chk2_off,&f16x16w,&f16x16g);    
  335.     CheckBox* mode1152=MMenu.addCheckBox(PIC,70,130,"1152x864",1,0,&chk2_on,&chk2_off,&f16x16w,&f16x16g);    
  336.     CheckBox* mode1280=MMenu.addCheckBox(PIC,70,160,"1280x1024",1,0,&chk2_on,&chk2_off,&f16x16w,&f16x16g);    
  337.     if(RealLx==800)mode800->State=true;
  338.     if(RealLx==1024)mode1024->State=true;
  339.     if(RealLx==1152)mode1152->State=true;
  340.     if(RealLx==1280)mode1280->State=true;
  341.     do{
  342.         ProcessMessages();
  343.         MMenu.MarkToDraw();
  344.         MMenu.ProcessDialogs();
  345.         MMenu.RefreshView();
  346.     }while(ItemChoose==-1);
  347.     if(ItemChoose==mcmOk){
  348.         if((RealLx==800&&mode800->State)||
  349.            (RealLx==1024&&mode1024->State)||
  350.            (RealLx==1152&&mode1152->State)||
  351.            (RealLx==1280&&mode1280->State))return false;
  352.         //Set mode
  353.         OldSizeX=RealLx;
  354.         OldSizeY=RealLy;
  355.         int msizex=800,msizey=600;
  356.         if(mode1024->State){
  357.             msizex=1024;
  358.             msizey=768;
  359.         };
  360.         if(mode1152->State){
  361.             msizex=1152;
  362.             msizey=864;
  363.         };
  364.         if(mode1280->State){
  365.             msizex=1280;
  366.             msizey=1024;
  367.         };
  368.         if(SetGameDisplayMode(msizex,msizey)){
  369.             ContinueGame=true;
  370.             return true;
  371.         };
  372.     };
  373.     return false;
  374. };
  375. //-----------------Speed menu------------------//
  376. int FPSTime;
  377. void ProcessSpeed(int x,int y){
  378.     ItemChoose=-1;
  379.     DialogsSystem MMenu(x,y);
  380.     Picture* PIC=MMenu.addPicture(NULL,0,0,&Panel1,&Panel1,&Panel1);
  381.     BpxTextButton* ExitBtn=MMenu.addBpxTextButton(PIC,60,220,"┬█╒╬─",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  382.     ExitBtn->UserParam=mcmExit;
  383.     ExitBtn->OnUserClick=&MMItemChoose;
  384.     if(FPSTime>100)FPSTime=100;
  385.     if(FPSTime<0)FPSTime=0;
  386.     VScrollBar* HB=MMenu.addHScrollBar(PIC,40,100,100,100-FPSTime,&sb_lf_d,&sb_lf_e,&sb_lf_p,&sb_ri_d,&sb_ri_e,&sb_ri_p,&sb_hbare,&sb_hbar,&sb_btn);
  387.     MMenu.addTextButton(PIC,PanelLx>>1,20,"╤Ωε≡ε±≥ⁿ Φπ≡√",&FActive,&FPassive,&FDisable,1);
  388.     MMenu.addTextButton(PIC,50,95+30,"╠Φφ.",&FActive,&FPassive,&FDisable,1);
  389.     MMenu.addTextButton(PIC,235,95+30,"╠αΩ±.",&FActive,&FPassive,&FDisable,1);
  390.     do{
  391.         ProcessMessages();
  392.         MMenu.MarkToDraw();
  393.         MMenu.ProcessDialogs();
  394.         MMenu.RefreshView();
  395.     }while(ItemChoose==-1);
  396.     FPSTime=100-HB->SPos;
  397. };
  398. //----------------SOUND----------------
  399. int WarSound;
  400. int WorkSound;
  401. int OrderSound;
  402. int MidiSound;
  403. void ProcessSound(int x,int y){
  404.     ItemChoose=-1;
  405.     DialogsSystem MMenu(x,y);
  406.     Picture* PIC=MMenu.addPicture(NULL,0,0,&Panel1,&Panel1,&Panel1);
  407.     BpxTextButton* ExitBtn=MMenu.addBpxTextButton(PIC,60,220,"┬█╒╬─",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  408.     ExitBtn->UserParam=mcmExit;
  409.     ExitBtn->OnUserClick=&MMItemChoose;
  410.     if(FPSTime>100)FPSTime=100;
  411.     if(FPSTime<0)FPSTime=0;
  412.     if(WarSound>0)WarSound=0;
  413.     if(OrderSound>0)OrderSound=0;
  414.     if(WorkSound>0)WorkSound=0;
  415.     if(WarSound<-1000)WarSound=-1000;
  416.     if(WorkSound<-1000)WorkSound=-1000;
  417.     if(OrderSound<-1000)OrderSound=-1000;
  418.     if(MidiSound<-1000)MidiSound=-1000;
  419.     MMenu.addTextButton(PIC,PanelLx>>1,20,"├≡ε∞Ωε±≥ⁿ",&FActive,&FPassive,&FDisable,1);
  420.     MMenu.addTextButton(PIC,PanelLx>>1,60,"╟Γ≤ΩΦ ΓεΘφ√",&f16x16w,&f16x16w,&f16x16w,1);
  421.     VScrollBar* HB1=MMenu.addHScrollBar(PIC,40,80,1000,1000+WarSound,&sb_lf_d,&sb_lf_e,&sb_lf_p,&sb_ri_d,&sb_ri_e,&sb_ri_p,&sb_hbare,&sb_hbar,&sb_btn);
  422.     MMenu.addTextButton(PIC,PanelLx>>1,110,"╨αßε≥α",&f16x16w,&f16x16w,&f16x16w,1);
  423.     VScrollBar* HB2=MMenu.addHScrollBar(PIC,40,130,1000,1000+WorkSound,&sb_lf_d,&sb_lf_e,&sb_lf_p,&sb_ri_d,&sb_ri_e,&sb_ri_p,&sb_hbare,&sb_hbar,&sb_btn);
  424.     MMenu.addTextButton(PIC,PanelLx>>1,160,"╬≥Γσ≥ φα ∩≡ΦΩατ",&f16x16w,&f16x16w,&f16x16w,1);
  425.     VScrollBar* HB3=MMenu.addHScrollBar(PIC,40,180,1000,1000+OrderSound,&sb_lf_d,&sb_lf_e,&sb_lf_p,&sb_ri_d,&sb_ri_e,&sb_ri_p,&sb_hbare,&sb_hbar,&sb_btn);
  426.     do{
  427.         ProcessMessages();
  428.         MMenu.MarkToDraw();
  429.         MMenu.ProcessDialogs();
  430.         MMenu.RefreshView();
  431.         if(HB1->SPos-1000!=WarSound)PlayEffect(2,(rand()&1024)-512,HB1->SPos-1000);
  432.         if(HB2->SPos-1000!=WorkSound)PlayEffect(0,(rand()&1024)-512,HB2->SPos-1000);
  433.         if(HB3->SPos-1000!=OrderSound)PlayEffect(9,(rand()&1024)-512,HB3->SPos-1000);
  434.         WarSound=HB1->SPos-1000;
  435.         WorkSound=HB2->SPos-1000;
  436.         OrderSound=HB3->SPos-1000;
  437.     }while(ItemChoose==-1);
  438. };
  439. //-----------------Options menu----------------//
  440. void ProcessOptions(int x,int y){
  441.     ItemChoose=-1;
  442.     DialogsSystem MMenu(x,y);
  443.     Picture* PIC=MMenu.addPicture(NULL,0,0,&Panel1,&Panel1,&Panel1);
  444.     BpxTextButton* ExitBtn=MMenu.addBpxTextButton(PIC,60,220,"┬█╒╬─",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  445.     ExitBtn->UserParam=mcmExit;
  446.     ExitBtn->OnUserClick=&MMItemChoose;
  447.     TextButton* BTN1=MMenu.addTextButton(PIC,PanelLx>>1,30,"├≡α⌠ΦΩα",&FActive,&FPassive,&FDisable,1);
  448.     BTN1->UserParam=mcmGraph;
  449.     BTN1->OnUserClick=&MMItemChoose;
  450.     TextButton* BTN2=MMenu.addTextButton(PIC,PanelLx>>1,70,"╟Γ≤Ω",&FActive,&FPassive,&FDisable,1);
  451.     BTN2->UserParam=mcmSound;
  452.     BTN2->OnUserClick=&MMItemChoose;
  453.     TextButton* BTN4=MMenu.addTextButton(PIC,PanelLx>>1,110,"╤Ωε≡ε±≥ⁿ",&FActive,&FPassive,&FDisable,1);
  454.     BTN4->UserParam=mcmEdit;
  455.     BTN4->OnUserClick=&MMItemChoose;
  456.     ItemChoose=-1;
  457.     do{
  458.         ProcessMessages();
  459.         MMenu.ProcessDialogs();
  460.         MMenu.RefreshView();
  461.     }while(ItemChoose==-1);
  462.     if(ItemChoose==mcmGraph){
  463.         ProcessGraphics(x,y);
  464.     };
  465.     if(ItemChoose==mcmEdit){
  466.         ProcessSpeed(x,y);
  467.     };
  468.     if(ItemChoose==mcmSound){
  469.         ProcessSound(x,y);
  470.     };
  471. };
  472. //-----------------SINGLE PLAYER---------------//
  473. void UnLoading();
  474. static byte Ntn[8];
  475. bool NatChoose(SimpleDialog* SD){
  476.     BpxTextButton* TB=(BpxTextButton*)SD;
  477.     char* qq=TB->Message;
  478.     if(qq[0]=='╬')strcpy(TB->Message,"╦▐─╚");
  479.     else strcpy(TB->Message,"╬╨╩╚");
  480.     SD->NeedToDraw=true;
  481.     Lpressed=true;
  482.     return true;
  483. };    
  484. int coorX[8];
  485. int coorY[8];
  486. void setCoor(){
  487.     for(int i=0;i<8;i++){
  488.         coorX[i]=-1;
  489.         coorY[i]=-1;
  490.     };
  491. };
  492. void chooseCoor(int* xx,int* yy){
  493.     int x,y;
  494.     do{
  495.         x=div(int(rando())*(msx-16),32768).quot;
  496.         y=div(int(rando())*(msy-16),32768).quot;
  497.         //checking for distance from enemy
  498.         bool ok=true;
  499.         for(int j=0;j<8;j++){
  500.             if(coorX[j]!=-1&&abs(coorX[j]-x)+abs(coorY[j]-y)<25)ok=false;
  501.         };
  502.         if(ok){
  503.             //checking for empty space
  504.             for(int dx=0;dx<16;dx++)
  505.                 for(int dy=0;dy<16;dy++)
  506.                     if(LLock[y+dy][x+dx]){
  507.                         ok=false;
  508.                         goto hhh;
  509.                     };
  510. hhh:        if(ok){
  511.                 *xx=x;
  512.                 *yy=y;
  513.                 return;
  514.             };
  515.         };
  516.     }while(true);
  517. };
  518. void LoadNation(char* fn,byte msk,byte NIndex);
  519. extern City CITY[8];
  520. void processSinglePlayer(){
  521.     int mmlx=MainMenuGround.PicPtr[0];
  522.     int mmly=MainMenuGround.PicPtr[1];
  523.     //MainMenuGround.Draw((RSCRSizeX-mmlx)>>1,(RSCRSizeY-mmly)>>1);
  524.     DialogsSystem DSY(((RealLx-352)>>1)-130,((RSCRSizeY-352)>>1)+64);
  525.     //choose map
  526.     Picture* Pic=DSY.addPicture(NULL,352+20,0,&y288x256,&y288x256,&y288x256);
  527.     DSY.addTextButton(Pic,352+(352>>1)-10,20,"┬√ßσ≡Φ≥σ Ωα≡≥≤",&FActive,&FPassive,&FDisable,1);
  528.     ListBox* LB=DSY.addListBox(Pic,352+60-15,60,6,&r224x28e,&f16x16g,&f16x16w,NULL);
  529.     VScrollBar* VS=DSY.addVScrollBar(Pic,LB->x-DSY.BaseX+LB->oneLx-1,1+LB->y-DSY.BaseY,1000,4,&sb_up_d,&sb_up_e,&sb_up_p,&sb_dn_d,&sb_dn_e,&sb_dn_p,&sb_vbare,&sb_vbar,&sb_btn);
  530.     VS->SPos=0;
  531.     LB->VS=VS;
  532.     //choose opponents
  533.     Picture* PIC=DSY.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  534.     //DSY.addTextButton(PIC,352>>1,20,"┬√ßσ≡Φ≥σ ∩≡ε≥ΦΓφΦΩεΓ",&FActive,&FPassive,&FDisable,1);
  535.     //CheckBox* CHME[8];        //choose my nation
  536.     CheckBox* CHTHEM[8];    //choose enabled nation
  537.     BpxTextButton* NCH[8];    //choose nation
  538.     int y=30;
  539.     DSY.addTextButton(Pic,30+40,y-10,"┬√:",&FActive,&FActive,&FActive,1);
  540.     DSY.addTextButton(Pic,95+70,y+28,"╧╨╬╥╚┬═╚╩╚:",&FPassive,&FPassive,&FPassive,1);
  541.     NCH[0]=DSY.addBpxTextButton(PIC,110,y-8,"╬╨╩╚",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  542.     NCH[0]->OnUserClick=&NatChoose;
  543.     y+=60;
  544.     for(int i=1;i<8;i++){
  545.         CHTHEM[i]=DSY.addCheckBox(PIC,70,y,"",0,1,&chk1_on,&chk1_off,&f16x16w,&f16x16g);    
  546.         //if(!i)CHME[i]=DSY.addCheckBox(PIC,90,y,"",1,1,&chk2_on,&chk2_off,&f16x16w,&f16x16g);    
  547.         //else CHME[i]=DSY.addCheckBox(PIC,90,y,"",1,0,&chk2_on,&chk2_off,&f16x16w,&f16x16g);    
  548.         NCH[i]=DSY.addBpxTextButton(PIC,110,y,"╬╨╩╚",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  549.         y+=30;
  550.         NCH[i]->OnUserClick=&NatChoose;
  551.     };
  552.     BpxTextButton* OkBtn=DSY.addBpxTextButton(PIC,10,y+10,"OK",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  553.     OkBtn->UserParam=mcmOk;
  554.     OkBtn->OnUserClick=&MMItemChoose;
  555.     BpxTextButton* CancelBtn=DSY.addBpxTextButton(PIC,180,y+10,"╬╥╠┼═└",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  556.     CancelBtn->UserParam=mcmCancel;
  557.     CancelBtn->OnUserClick=&MMItemChoose;
  558.     //Create list of maps
  559.     CreateMapsList(LB);
  560.     ItemChoose=-1;
  561.     do{
  562.         /*
  563.         //rando();
  564.         for(i=0;i<8;i++){
  565.             if(!CHTHEM[i]->State){
  566.                 //CHME[i]->Enabled=false;
  567.                 NCH[i]->Enabled=false;
  568.                 //CHME[i]->NeedToDraw=true;
  569.                 NCH[i]->NeedToDraw=true;
  570.             }else{
  571.                 //CHME[i]->Enabled=true;
  572.                 NCH[i]->Enabled=true;
  573.                 CHME[i]->NeedToDraw=true;
  574.                 NCH[i]->NeedToDraw=true;
  575.             };
  576.         };
  577.         for(i=0;i<8;i++){
  578.             if(CHME[i]->State&&!CHME[i]->Enabled){
  579.                 for(int j=0;j<8;j++)CHME[j]->State=false;
  580.                 for(j=0;j<8;j++){
  581.                     if(CHME[(i+j)&7]->Enabled){
  582.                         CHME[(i+j)&7]->State=true;
  583.                         goto uuu;
  584.                     };
  585.                 };
  586. uuu:;
  587.             };
  588.         };
  589.         bool cc=false;
  590.         for(i=0;i<8;i++)if(CHME[i]->State)cc=true;
  591.         int nc=0;
  592.         int cp=-1;
  593.         for(i=0;i<8;i++){
  594.             if(CHTHEM[i]->State){
  595.                 nc++;
  596.                 cp=i;
  597.             };
  598.         };
  599.         if(nc==1)CHME[cp]->State=true;
  600.         OkBtn->Enabled=cc;*/
  601.         if(LB->CurItem==-1)OkBtn=false;
  602.         OkBtn->NeedToDraw=true;
  603.         DSY.MarkToDraw();
  604.         ProcessMessages();
  605.         DSY.ProcessDialogs();
  606.         DSY.RefreshView();
  607.     }while(ItemChoose==-1);
  608.     if(ItemChoose==mcmOk){
  609.         //setCoor();
  610.         UnLoading();
  611.         PreLoadExtendedMap((LB->GetItem(LB->CurItem))->Message);
  612.         MyNation=0;
  613.         memcpy(&RESRC[0][0],&RES[0][0],sizeof RES);
  614.         for(i=0;i<8;i++){
  615.             byte mss=254;
  616.             if(!i)mss=1;
  617.             if(NCH[i]->Message[0]=='╬')
  618.                 LoadNation("orcs.nds",mss,i);
  619.             else LoadNation("PEOPLES.nds",mss,i);
  620.             //if(CHME[i]->State)MyNation=i;
  621.             int xx,yy;
  622.             //chooseCoor(&xx,&yy);
  623.             xx=mapPos[i*2];
  624.             yy=mapPos[i*2+1];
  625.             CITY[i].CreateCity(xx+4,yy+4,i);
  626.             if((!i)||CHTHEM[i]->State){
  627.                 //coorX[i]=xx;
  628.                 //coorY[i]=yy;
  629.                 NATIONS[i].CreateTerrainAt(xx,yy,1);
  630.                 if(i==MyNation){
  631.                     mapx=xx-(smaplx>>1);
  632.                     mapy=yy-(smaply>>1);
  633.                     if(mapx<1)mapx=1;
  634.                     if(mapy<1)mapy=1;
  635.                     if(mapx+smaplx>=msx)mapx=msx-smaplx-1;
  636.                     if(mapy+smaply>=msy)mapy=msy-smaply-1;
  637.                 };
  638.                 if(i)CITY[i].IntellectEnabled=true;
  639.             };
  640.         };
  641.         PostLoadExtendedMap((LB->GetItem(LB->CurItem))->Message);
  642.         CheapMode=false;
  643.         InitGame();
  644.         ItemChoose=mcmSingle;
  645.         InitExplosions();
  646.         PrepareToGame();
  647.     };
  648. };
  649. //-----------------WAITING FOR OPPONENTS(HOST)-------------------//
  650. bool processHostConnection(){
  651.     DialogsSystem DSY((RealLx-352)>>1,RSCRSizeY-352-120);
  652.     //choose map
  653.     Picture* Pic=DSY.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  654.     DSY.addTextButton(Pic,352>>1,20,"╞Σσ∞ ±ε∩σ≡φΦΩεΓ...",&FActive,&FPassive,&FDisable,1);
  655.     char GamersNames[8][32];
  656.     int yy=60;
  657.     InputBox* IBN[8];
  658.     for(int i=0;i<8;i++){
  659.         GamersNames[i][0]=0;
  660.         IBN[i]=DSY.addInputBox(Pic,65,yy,GamersNames[i],20,&r224x28e,&f16x16w,&f16x16g);
  661.         yy+=28;
  662.     };
  663.     BpxTextButton* OkBtn=DSY.addBpxTextButton(Pic,10,314,"═α≈α≥ⁿ Φπ≡≤",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  664.     OkBtn->UserParam=mcmJoin;
  665.     OkBtn->OnUserClick=&MMItemChoose;
  666.     BpxTextButton* CancelBtn=DSY.addBpxTextButton(Pic,180,314,"╬╥╠┼═└",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  667.     CancelBtn->UserParam=mcmCancel;
  668.     CancelBtn->OnUserClick=&MMItemChoose;
  669.     ItemChoose=-1;
  670.     PlayerMenuMode=true;
  671.     do{
  672.         ProcessMessages();
  673.         AnalyseMessages();
  674.         OkBtn->NeedToDraw=true;
  675.         if(NPlayers>1)OkBtn->Enabled=true;
  676.         else OkBtn->Enabled=false;
  677.         IBEnumeratePlayers(IBN);
  678.         DSY.MarkToDraw();
  679.         DSY.ProcessDialogs();
  680.         DSY.RefreshView();
  681.     }while(ItemChoose==-1&&PlayerMenuMode);
  682.     if(ItemChoose==mcmCancel){
  683.         CloseMPL();
  684.     }else{
  685.         if(ItemChoose==mcmJoin){
  686.             StartIGame();
  687.             return true;
  688.         };
  689.     };
  690.     return false;
  691. };
  692. //-----------------WAITING FOR OPPONENTS(JOIN)-------------------//
  693. bool processJoinConnection(){
  694.     DialogsSystem DSY((RealLx-352)>>1,RSCRSizeY-352-120);
  695.     //choose map
  696.     Picture* Pic=DSY.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  697.     DSY.addTextButton(Pic,352>>1,20,"╞Σσ∞ ±ε∩σ≡φΦΩεΓ...",&FActive,&FPassive,&FDisable,1);
  698.     char GamersNames[8][32];
  699.     int yy=60;
  700.     InputBox* IBN[8];
  701.     for(int i=0;i<8;i++){
  702.         GamersNames[i][0]=0;
  703.         IBN[i]=DSY.addInputBox(Pic,65,yy,GamersNames[i],20,&r224x28e,&f16x16w,&f16x16g);
  704.         yy+=28;
  705.     };
  706.     //BpxTextButton* OkBtn=DSY.addBpxTextButton(Pic,10,314,"═α≈α≥ⁿ Φπ≡≤",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  707.     //OkBtn->UserParam=mcmJoin;
  708.     //OkBtn->OnUserClick=&MMItemChoose;
  709.     BpxTextButton* CancelBtn=DSY.addBpxTextButton(Pic,180,314,"╬╥╠┼═└",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  710.     CancelBtn->UserParam=mcmCancel;
  711.     CancelBtn->OnUserClick=&MMItemChoose;
  712.     ItemChoose=-1;
  713.     PlayerMenuMode=1;
  714.     do{
  715.         ProcessMessages();
  716.         AnalyseMessages();
  717.         IBEnumeratePlayers(IBN);
  718.         DSY.MarkToDraw();
  719.         DSY.ProcessDialogs();
  720.         DSY.RefreshView();
  721.     }while(ItemChoose==-1&&PlayerMenuMode);
  722.     if(ItemChoose==mcmCancel){
  723.         CloseMPL();
  724.     }else{
  725.         if(!PlayerMenuMode)return true;
  726.     };
  727.     return false;
  728. };
  729. //--------------------JOIN  TO SESSION---------------------//
  730. bool processJoinGame(){
  731.     DialogsSystem DSY((RealLx-352)>>1,RSCRSizeY-352-120);
  732.     //choose map
  733.     Picture* Pic=DSY.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  734.     DSY.addTextButton(Pic,352>>1,20,"┬√ßσ≡Φ≥σ Φπ≡≤",&FActive,&FPassive,&FDisable,1);
  735.     ListBox* LB=DSY.addListBox(Pic,60,90,6,&r224x28e,&f16x16g,&f16x16w,NULL);
  736.     VScrollBar* VS=DSY.addVScrollBar(Pic,LB->x-DSY.BaseX+LB->oneLx-1,1+LB->y-DSY.BaseY,1000,4,&sb_up_d,&sb_up_e,&sb_up_p,&sb_dn_d,&sb_dn_e,&sb_dn_p,&sb_vbare,&sb_vbar,&sb_btn);
  737.     LB->VS=VS;
  738.     BpxTextButton* OkBtn=DSY.addBpxTextButton(Pic,10,314,"╧≡Φ±εσΣΦφΦ≥ⁿ± ",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  739.     OkBtn->UserParam=mcmJoin;
  740.     OkBtn->OnUserClick=&MMItemChoose;
  741.     BpxTextButton* CancelBtn=DSY.addBpxTextButton(Pic,180,314,"╬╥╠┼═└",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  742.     CancelBtn->UserParam=mcmCancel;
  743.     CancelBtn->OnUserClick=&MMItemChoose;
  744.     BpxTextButton* RefreshBtn=DSY.addBpxTextButton(Pic,10+90,314-40,"╬ßφεΓΦ≥ⁿ ±∩Φ±εΩ",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  745.     RefreshBtn->UserParam=mcmRefresh;
  746.     RefreshBtn->OnUserClick=&MMItemChoose;
  747.     LBEnumerateSessions(LB);
  748.     do{
  749.         ItemChoose=-1;
  750.         do{
  751.             ProcessMessages();
  752.             OkBtn->NeedToDraw=true;
  753.             if(LB->CurItem==-1)OkBtn->Enabled=false;
  754.             else OkBtn->Enabled=true;
  755.             DSY.MarkToDraw();
  756.             DSY.ProcessDialogs();
  757.             DSY.RefreshView();
  758.             if(ItemChoose==mcmRefresh){
  759.                 LBEnumerateSessions(LB);
  760.                 ItemChoose=-1;
  761.             };
  762.         }while(ItemChoose==-1);
  763.         if(ItemChoose==mcmJoin&&LB->CurItem!=-1){
  764.             JoinNameToSession(LB->CurItem,PlName);
  765.             if(processJoinConnection())return true;
  766.         };
  767.     }while(ItemChoose!=mcmCancel);
  768.     return false;
  769. };
  770. //--------------------HOST THE SESSION---------------------//
  771. bool processHostGame(){
  772.     DialogsSystem DSY((RealLx-352)>>1,RSCRSizeY-352-120);
  773.     //choose map
  774.     Picture* Pic=DSY.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  775.     DSY.addTextButton(Pic,352>>1,20,"┬√ßσ≡Φ≥σ Ωα≡≥≤",&FActive,&FPassive,&FDisable,1);
  776.     ListBox* LB=DSY.addListBox(Pic,60,90,6,&r224x28e,&f16x16g,&f16x16w,NULL);
  777.     VScrollBar* VS=DSY.addVScrollBar(Pic,LB->x-DSY.BaseX+LB->oneLx-1,1+LB->y-DSY.BaseY,1000,4,&sb_up_d,&sb_up_e,&sb_up_p,&sb_dn_d,&sb_dn_e,&sb_dn_p,&sb_vbare,&sb_vbar,&sb_btn);
  778.     LB->VS=VS;
  779.     CreateMapsList(LB);
  780.     BpxTextButton* OkBtn=DSY.addBpxTextButton(Pic,10,314,"╤╬╟─└╥▄ ╚├╨╙",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  781.     OkBtn->UserParam=mcmHost;
  782.     OkBtn->OnUserClick=&MMItemChoose;
  783.     BpxTextButton* CancelBtn=DSY.addBpxTextButton(Pic,180,314,"╬╥╠┼═└",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  784.     CancelBtn->UserParam=mcmCancel;
  785.     CancelBtn->OnUserClick=&MMItemChoose;
  786.     ItemChoose=-1;
  787.     do{
  788.         do{
  789.             ProcessMessages();
  790.             DSY.MarkToDraw();
  791.             DSY.ProcessDialogs();
  792.             DSY.RefreshView();
  793.         }while(ItemChoose==-1);
  794.         if(ItemChoose==mcmHost&&LB->CurItem!=-1){
  795.             strcpy(CurrentMap,(LB->GetItem(LB->CurItem))->Message);
  796.             if(CreateNamedSession(PlName))
  797.             if(processHostConnection())return true;
  798.         };
  799.     }while(ItemChoose!=mcmCancel);
  800.     return false;
  801. };
  802. //--------------------MULTIPLAYER GAME---------------------//
  803. char SaveFileName[128];
  804. void processMultiplayer(){
  805.     sprintf(SaveFileName,"Save %d",GetTickCount());
  806.     CreateMultiplaterInterface();
  807.     if(!lpDirectPlay3A)return;
  808.     if FAILED(lpDirectPlay3A->InitializeConnection(
  809.         lplpConnectionBuffer[0],0)) return;
  810.     //Multiplayer interface is now created
  811.     DialogsSystem DSY((RealLx-352)>>1,RSCRSizeY-352-120);
  812.     Picture* PIC=DSY.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  813.     TextButton* BTN1=DSY.addTextButton(PIC,352>>1,20,"╚π≡α ∩ε ±σ≥Φ (IPX)",&FActive,&FPassive,&FDisable,1);
  814.     BpxTextButton* HostBtn=DSY.addBpxTextButton(PIC,10,280,"╤ετΣα≥ⁿ Φπ≡≤",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  815.     HostBtn->UserParam=mcmHost;
  816.     HostBtn->OnUserClick=&MMItemChoose;
  817.     BpxTextButton* JoinBtn=DSY.addBpxTextButton(PIC,180,280,"╧≡Φ±εσΣΦφΦ≥ⁿ± ",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  818.     JoinBtn->UserParam=mcmJoin;
  819.     JoinBtn->OnUserClick=&MMItemChoose;
  820.     BpxTextButton* CancelBtn=DSY.addBpxTextButton(PIC,180-90,315,"╬╥╠┼═└",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  821.     CancelBtn->UserParam=mcmCancel;
  822.     CancelBtn->OnUserClick=&MMItemChoose;
  823.     TextButton* BTN2=DSY.addTextButton(PIC,(352>>1)-130+20,90-8-20,"Φ∞ :",&FActive,&FPassive,&FDisable,1);
  824.     InputBox* IB=DSY.addInputBox(PIC,80+20,92-8-20,PlName,20,&r224x28e,&f16x16w,&f16x16g);
  825.     TextButton* BTN8=DSY.addTextButton(PIC,(352>>1),200,"└Γ≥ε±ε⌡≡αφσφΦσ",&FActive,&FPassive,&FDisable,1);
  826.     InputBox* SavN=DSY.addInputBox(PIC,70,240,SaveFileName,20,&r224x28e,&f16x16w,&f16x16g);
  827.     CheckBox* ORCS=DSY.addCheckBox(PIC,100,120," ╬≡ΩΦ",1,1,&chk2_on,&chk2_off,&FActive,&FPassive);
  828.     CheckBox* PEOP=DSY.addCheckBox(PIC,100,160," ╦■ΣΦ",1,0,&chk2_on,&chk2_off,&FActive,&FPassive);
  829.     do{
  830.         ItemChoose=-1;
  831.         do{
  832.             ProcessMessages();
  833.             DSY.MarkToDraw();
  834.             DSY.ProcessDialogs();
  835.             DSY.RefreshView();
  836.         }while(ItemChoose==-1);
  837.         if(ORCS->State)MyRace=0;
  838.         if(PEOP->State)MyRace=1;
  839.         if(ItemChoose==mcmHost){
  840.             if(processHostGame())return;
  841.         }else if(ItemChoose==mcmJoin)if(processJoinGame())return;
  842.     }while(ItemChoose!=mcmCancel);
  843. };
  844. //--------------------RESOURCE EDITOR----------------------//
  845. int ProcessResEdit(){
  846.     //ContinueGame=false;
  847.     DialogsSystem GMM(smapx+(nsmaplx<<4)-(352>>1),smapy+(nsmaply<<4)-(352>>1));
  848.     Picture* PIC1=GMM.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  849.     TextButton* ExitBtn=GMM.addTextButton(PIC1,352>>1,30,"╨┼╤╙╨╤█",&FActive,&FPassive,&FDisable,1);
  850.     char XX[12];
  851.     char GoldST[22];
  852.     char WoodST[22];
  853.     char OilST[22];
  854.     itoa(RES[MyNation][1],GoldST,10);
  855.     itoa(RES[MyNation][2],WoodST,10);
  856.     itoa(RES[MyNation][3],OilST,10);
  857.     strcpy(XX,"╚π≡εΩ ");
  858.     itoa(MyNation+1,&XX[6],10);
  859.     TextButton* PLID=GMM.addTextButton(PIC1,352>>1,30+40,XX,&FActive,&FPassive,&FDisable,1);
  860.     TextButton* GoldBtn=GMM.addTextButton(PIC1,40,30+80,"Gold:",&f16x16w,&f16x16w,&f16x16w,1);
  861.     InputBox* GoldIB=GMM.addInputBox(PIC1,90,30+80,GoldST,20,&r224x28e,&f16x16w,&f16x16g);
  862.     TextButton* WoodBtn=GMM.addTextButton(PIC1,40,30+120,"Wood:",&f16x16w,&f16x16w,&f16x16w,1);
  863.     InputBox* WoodIB=GMM.addInputBox(PIC1,90,30+120,WoodST,20,&r224x28e,&f16x16w,&f16x16g);
  864.     TextButton* OilBtn=GMM.addTextButton(PIC1,40,30+160,"Oil:",&f16x16w,&f16x16w,&f16x16w,1);
  865.     InputBox* OilIB=GMM.addInputBox(PIC1,90,30+160,OilST,20,&r224x28e,&f16x16w,&f16x16g);
  866.     BpxTextButton* OkBtn=
  867.     GMM.addBpxTextButton(PIC1,((352-164)>>1)-85,280,"OK",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  868.     BpxTextButton* CancelBtn=
  869.     GMM.addBpxTextButton(PIC1,((352-164)>>1)+85,280,"╬╥╠┼═└",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  870.     OkBtn->UserParam=mcmOk;
  871.     OkBtn->OnUserClick=&MMItemChoose;
  872.     CancelBtn->UserParam=mcmCancel;
  873.     CancelBtn->OnUserClick=&MMItemChoose;
  874.     BpxTextButton* AllBtn=
  875.     GMM.addBpxTextButton(PIC1,((352-164)>>1)+85,315,"─╦▀ ┬╤┼╒",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  876.     AllBtn->UserParam=mcmAll;
  877.     AllBtn->OnUserClick=&MMItemChoose;
  878.     
  879. stg:
  880.     ItemChoose=-1;
  881.     do{
  882.         GMM.MarkToDraw();
  883.         RES[MyNation][1]=atoi(GoldST);
  884.         RES[MyNation][2]=atoi(WoodST);
  885.         RES[MyNation][3]=atoi(OilST);
  886.         ProcessMessages();
  887.         GMM.ProcessDialogs();
  888.         GMM.RefreshView();
  889.     }while(ItemChoose==-1);
  890.     if(ItemChoose==mcmAll){
  891.         int G=RES[MyNation][1];
  892.         int W=RES[MyNation][2];
  893.         int O=RES[MyNation][3];
  894.         for(int i=0;i<8;i++){
  895.             RES[i][1]=G;
  896.             RES[i][2]=W;
  897.             RES[i][3]=O;
  898.         };
  899.     };
  900.     return ItemChoose;    
  901. };
  902. //---------------------------------------------------------//
  903. int processMainMenu(){
  904. MMStart:
  905.     InGame=false;
  906.     GameMode=1;
  907.     SetRLCWindow(0,0,RealLx,RSCRSizeY,SCRSizeX);
  908.     NPlayers=1;
  909.     MultiplayerStart=false;
  910.     ItemChoose=-1;
  911.     CBar(0,0,RealLx,RSCRSizeY,0);
  912.     LoadPalette("015w.pal");
  913.     int mmlx=MainMenuGround.PicPtr[0];
  914.     int mmly=MainMenuGround.PicPtr[1];
  915.     MainMenuGround.Draw((RealLx-mmlx)>>1,(RSCRSizeY-mmly)>>1);
  916.     PlayerMenuMode=1;
  917.     FlipPages();
  918.     DialogsSystem MMenu((RealLx-PanelLx)>>1,RSCRSizeY-PanelLy-80);
  919.     Picture* PIC=MMenu.addPicture(NULL,0,0,&Panel1,&Panel1,&Panel1);
  920.     BpxTextButton* ExitBtn=MMenu.addBpxTextButton(PIC,60,220,"┬█╒╬─",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  921.     ExitBtn->UserParam=mcmExit;
  922.     ExitBtn->OnUserClick=&MMItemChoose;
  923.     TextButton* BTN1=MMenu.addTextButton(PIC,PanelLx>>1,30,"╬ΣΦφε≈φα  Φπ≡α",&FActive,&FPassive,&FDisable,1);
  924.     BTN1->UserParam=mcmSingle;
  925.     BTN1->OnUserClick=&MMItemChoose;
  926.     TextButton* BTN2=MMenu.addTextButton(PIC,PanelLx>>1,65,"╚π≡α ∩ε ±σ≥Φ",&FActive,&FPassive,&FDisable,1);
  927.     BTN2->UserParam=mcmMulti;
  928.     BTN2->OnUserClick=&MMItemChoose;
  929.     TextButton* BTNL=MMenu.addTextButton(PIC,PanelLx>>1,100,"╟απ≡≤τΦ≥ⁿ Φπ≡≤",&FActive,&FPassive,&FDisable,1);
  930.     BTNL->UserParam=mcmLoad;
  931.     BTNL->OnUserClick=&MMItemChoose;
  932.     TextButton* BTN4=MMenu.addTextButton(PIC,PanelLx>>1,135,"╨σΣαΩ≥ε≡ Ωα≡≥√",&FActive,&FPassive,&FDisable,1);
  933.     BTN4->UserParam=mcmEdit;
  934.     BTN4->OnUserClick=&MMItemChoose;
  935.     TextButton* BTN3=MMenu.addTextButton(PIC,PanelLx>>1,170,"┬ΦΣσε",&FActive,&FPassive,&FDisable,1);
  936.     BTN3->UserParam=mcmVideo;
  937.     BTN3->OnUserClick=&MMItemChoose;
  938.     do{
  939.         ProcessMessages();
  940.         MMenu.ProcessDialogs();
  941.         MMenu.RefreshView();
  942.     }while(ItemChoose==-1);
  943.     if(ItemChoose==mcmSingle)processSinglePlayer();
  944.     if(ItemChoose==mcmEdit){
  945.         PrepareEditMedia(0);
  946.         ItemChoose=mcmSingle;
  947.     };
  948.     if(ItemChoose==mcmLoad){
  949.         processMLoadGame();
  950.     };
  951.     if(ItemChoose==mcmVideo){
  952.         PlayVideo();
  953.         goto MMStart;
  954.     };
  955.     if(ItemChoose==mcmMulti)processMultiplayer();
  956.     GameMode=0;
  957.     return ItemChoose;
  958. };
  959. //--------------=< G A M E   S C R E E N >=------------//
  960. extern int PrpX;
  961. extern int PrpY;
  962. extern int PrpNx;
  963. extern int PrpNy;
  964. extern int AblX;
  965. extern int AblY;
  966. extern int AblNx;
  967. extern int AblNy;
  968. extern int IconLx;
  969. //extern int IconLx;
  970. extern int IconLy;
  971. DialogsSystem GSYS(0,0);
  972. SimpleDialog* GVPort;
  973. SimpleDialog* MiniVPort;
  974. SimpleDialog* AblVPort;
  975. SimpleDialog* PrpVPort;
  976. Picture* Pan1;
  977. Picture* Pan2;
  978. Picture* Pan3;
  979. ColoredBar* Pan4;
  980. ColoredBar* Pan5;
  981. bool GameExit;
  982. int MenuType;
  983. bool MakeMenu;
  984.  
  985. int NNames;
  986. char* names[128];
  987. char* fnames[128];
  988. int   serials[128];
  989. void ClearNames(){
  990.     for(int i=0;i<128;i++)names[i]=NULL;
  991.     NNames=0;
  992. };
  993. void FreeNames(){
  994.     for(int i=0;i<128;i++)if(names[i]){
  995.         free(names[i]);
  996.         free(fnames[i]);
  997.         names[i]=NULL;
  998.         fnames[i]=NULL;
  999.     };
  1000.     NNames=0;
  1001. };
  1002. void ErrorBox(char* str){
  1003.     DialogsSystem DSY(smapx+(nsmaplx<<4)-(288>>1),smapy+(nsmaply<<4)-(128>>1));
  1004.     Picture* PIC1=DSY.addPicture(NULL,0,0,&w288x128,&w288x128,&w288x128);
  1005.     DSY.addTextButton(PIC1,288>>1,30,str,&f16x16w,&f16x16w,&f16x16w,1);
  1006.     BpxTextButton* OkBtn=DSY.addBpxTextButton(PIC1,(288-164)>>1,80,"OK",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1007.     OkBtn->UserParam=mcmOk;
  1008.     OkBtn->OnUserClick=&MMItemChoose;
  1009.     do{
  1010.         ProcessMessages();
  1011.         DSY.ProcessDialogs();
  1012.         DSY.RefreshView();
  1013.     }while(ItemChoose==-1);
  1014. };
  1015. extern int sfVersion;
  1016. void InstallName(ListBox* LB,WIN32_FIND_DATA* FD){
  1017.     ResFile ff1=RReset(FD->cFileName);
  1018.     char nam[128];
  1019.     if(!IOresult()){
  1020.         int sig,lap;
  1021.         RBlockRead(ff1,&sig,4);
  1022.         if(sig=='WSF2'){
  1023.             RBlockRead(ff1,&sig,4);
  1024.             RBlockRead(ff1,&lap,4);
  1025.             if(sig==sfVersion&&NNames<128){
  1026.                 int nlen=0;
  1027.                 RBlockRead(ff1,&nlen,2);
  1028.                 nlen=0;
  1029.                 RBlockRead(ff1,&nlen,1);
  1030.                 RBlockRead(ff1,nam,nlen);
  1031.                 RClose(ff1);
  1032.                 LB->AddItem(nam,NNames);
  1033.                 names[NNames]=new char[strlen(nam)+1];
  1034.                 fnames[NNames]=new char[strlen(FD->cFileName)+1];
  1035.                 serials[NNames]=lap;
  1036.                 strcpy(names[NNames],nam);
  1037.                 strcpy(fnames[NNames],FD->cFileName);
  1038.                 NNames++;
  1039.             }else RClose(ff1);
  1040.         }else RClose(ff1);
  1041.     };
  1042. };
  1043. void CreateGamesList(ListBox* LB){
  1044.     WIN32_FIND_DATA FD;
  1045.     ClearNames();
  1046.     HANDLE HF=FindFirstFile("*.sav",&FD);
  1047.     if(HF!=INVALID_HANDLE_VALUE){
  1048.         InstallName(LB,&FD);
  1049.         while(FindNextFile(HF,&FD))InstallName(LB,&FD);
  1050.     };
  1051. };
  1052. //----------------LOAD GAME--------------//
  1053. void CmdLoadNetworkGame(byte NI,int ID,char* Name);
  1054. void LoadGame(char* fnm);
  1055. void ProcessGLoadGame(){
  1056.     DialogsSystem DSY(smapx+(nsmaplx<<4)-(352>>1),smapy+(nsmaply<<4)-(352>>1));
  1057.     Picture* PIC1=DSY.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  1058.     TextButton* LoadBtn=DSY.addTextButton(PIC1,352>>1,30,"╟└├╨╙╟╚╥▄ ╚├╨╙",&FActive,&FPassive,&FDisable,1);
  1059.     ListBox* LB=DSY.addListBox(PIC1,60,100,6,&r224x28e,&f16x16g,&f16x16w,NULL);
  1060.     VScrollBar* VS=DSY.addVScrollBar(PIC1,LB->x-DSY.BaseX+LB->oneLx-1,1+LB->y-DSY.BaseY,1000,4,&sb_up_d,&sb_up_e,&sb_up_p,&sb_dn_d,&sb_dn_e,&sb_dn_p,&sb_vbare,&sb_vbar,&sb_btn);
  1061.     LB->VS=VS;
  1062.     BpxTextButton* OkBtn=DSY.addBpxTextButton(PIC1,10,315,"OK",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1063.     OkBtn->UserParam=mcmOk;
  1064.     OkBtn->OnUserClick=&MMItemChoose;
  1065.     BpxTextButton* CancelBtn=DSY.addBpxTextButton(PIC1,180,315,"╬╥╠┼═└",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1066.     CancelBtn->UserParam=mcmCancel;
  1067.     CancelBtn->OnUserClick=&MMItemChoose;
  1068.     CreateGamesList(LB);
  1069.     ItemChoose=-1;
  1070.     do{
  1071.         DSY.MarkToDraw();
  1072.         ProcessMessages();
  1073.         if(LB->CurItem==-1)OkBtn->Enabled=false;
  1074.         else OkBtn->Enabled=true;
  1075.         DSY.ProcessDialogs();
  1076.         DSY.RefreshView();
  1077.     }while(ItemChoose==-1);
  1078.     if(ItemChoose==mcmOk&&LB->CurItem!=-1){
  1079.         CmdLoadNetworkGame(MyNation,serials[LB->CurItem],names[LB->CurItem]);
  1080.         //LoadGame(fnames[LB->CurItem]);
  1081.         ContinueGame=true;
  1082.     };
  1083.     FreeNames();
  1084. };
  1085. void processMLoadGame(){
  1086.     DialogsSystem DSY((RealLx-352)>>1,RealLy-352-80);
  1087.     Picture* PIC1=DSY.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  1088.     TextButton* LoadBtn=DSY.addTextButton(PIC1,352>>1,30,"╟└├╨╙╟╚╥▄ ╚├╨╙",&FActive,&FPassive,&FDisable,1);
  1089.     ListBox* LB=DSY.addListBox(PIC1,60,100,6,&r224x28e,&f16x16g,&f16x16w,NULL);
  1090.     VScrollBar* VS=DSY.addVScrollBar(PIC1,LB->x-DSY.BaseX+LB->oneLx-1,1+LB->y-DSY.BaseY,1000,4,&sb_up_d,&sb_up_e,&sb_up_p,&sb_dn_d,&sb_dn_e,&sb_dn_p,&sb_vbare,&sb_vbar,&sb_btn);
  1091.     LB->VS=VS;
  1092.     BpxTextButton* OkBtn=DSY.addBpxTextButton(PIC1,10,315,"OK",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1093.     OkBtn->UserParam=mcmOk;
  1094.     OkBtn->OnUserClick=&MMItemChoose;
  1095.     BpxTextButton* CancelBtn=DSY.addBpxTextButton(PIC1,180,315,"╬╥╠┼═└",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1096.     CancelBtn->UserParam=mcmCancel;
  1097.     CancelBtn->OnUserClick=&MMItemChoose;
  1098.     CreateGamesList(LB);
  1099.     ItemChoose=-1;
  1100.     do{
  1101.         DSY.MarkToDraw();
  1102.         ProcessMessages();
  1103.         if(LB->CurItem==-1)OkBtn->Enabled=false;
  1104.         else OkBtn->Enabled=true;
  1105.         DSY.ProcessDialogs();
  1106.         DSY.RefreshView();
  1107.     }while(ItemChoose==-1);
  1108.     if(ItemChoose==mcmOk&&LB->CurItem!=-1){
  1109.         LoadGame(fnames[LB->CurItem]);
  1110.         ContinueGame=true;
  1111.         ItemChoose=mcmSingle;
  1112.         PrepareToGame();
  1113.     };
  1114.     FreeNames();
  1115. };
  1116. //----------------SAVE GAME--------------//
  1117. void CmdSaveNetworkGame(byte NI,int ID,char* Name);
  1118. bool CheckName(char* str){
  1119.     for(int i=0;i<NNames;i++)if(strstr(names[i],str))return false;
  1120.     return true;
  1121. };
  1122. bool ChangeNation;
  1123. bool MultiTvar;
  1124. extern int FogMode;
  1125. void EnterChat(){
  1126.     char passw[128];
  1127.     passw[0]=0;
  1128.     ItemChoose=-1;
  1129.     DialogsSystem DSY(smapx+(nsmaplx<<4)-(288>>1),smapy+(nsmaply<<4)-(128>>1));
  1130.     Picture* PIC1=DSY.addPicture(NULL,0,0,&y288x128,&y288x128,&y288x128);
  1131.     TextButton* LoadBtn=DSY.addTextButton(PIC1,288>>1,5,"╧└╨╬╦▄:",&FActive,&FPassive,&FDisable,1);
  1132.     InputBox* IB=DSY.addInputBox(PIC1,30,45,passw,20,&r224x28e,&f16x16w,&f16x16g);
  1133.     IB->Active=true;
  1134.     //BpxTextButton* CancelBtn=DSY.addBpxTextButton(PIC1,120,90,"╬╥╠┼═└",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1135.     //CancelBtn->UserParam=mcmCancel;
  1136.     //CancelBtn->OnUserClick=&MMItemChoose;
  1137.     BpxTextButton* OkBtn=DSY.addBpxTextButton(PIC1,55,90,"OK",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1138.     OkBtn->UserParam=mcmOk;
  1139.     OkBtn->OnUserClick=&MMItemChoose;
  1140.     KeyPressed=false;
  1141.     do{
  1142.         DSY.MarkToDraw();
  1143.         ProcessMessages();
  1144.         if(KeyPressed&&LastKey==13){
  1145.             ItemChoose=mcmOk;
  1146.             KeyPressed=false;
  1147.         };
  1148.         DSY.ProcessDialogs();
  1149.         DSY.RefreshView();
  1150.     }while(ItemChoose==-1);
  1151.     if(ItemChoose==mcmOk){
  1152.         if(!strcmp(passw,"IZMENA"))ChangeNation=!ChangeNation;
  1153.         if(!strcmp(passw,"MULTITVAR"))MultiTvar=!MultiTvar;
  1154.         if(!strcmp(passw,"SUPERVIZOR"))FogMode=!FogMode;
  1155.     };
  1156. };
  1157. void SaveGame(char* fnm,char* Messtr,int ID);
  1158. void ProcessGSaveGame(){
  1159.     DialogsSystem DSY(smapx+(nsmaplx<<4)-(352>>1),smapy+(nsmaply<<4)-(352>>1));
  1160.     Picture* PIC1=DSY.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  1161.     TextButton* LoadBtn=DSY.addTextButton(PIC1,352>>1,30,"╤╬╒╨└═╚╥▄ ╚├╨╙",&FActive,&FPassive,&FDisable,1);
  1162.     InputBox* IB=DSY.addInputBox(PIC1,60,75,GameName,20,&r224x28e,&f16x16w,&f16x16g);
  1163.     ListBox* LB=DSY.addListBox(PIC1,60,120,6,&r224x28e,&f16x16g,&f16x16w,NULL);
  1164.     VScrollBar* VS=DSY.addVScrollBar(PIC1,LB->x-DSY.BaseX+LB->oneLx-1,1+LB->y-DSY.BaseY,1000,4,&sb_up_d,&sb_up_e,&sb_up_p,&sb_dn_d,&sb_dn_e,&sb_dn_p,&sb_vbare,&sb_vbar,&sb_btn);
  1165.     LB->VS=VS;
  1166.     BpxTextButton* OkBtn=DSY.addBpxTextButton(PIC1,10,315,"OK",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1167.     OkBtn->UserParam=mcmOk;
  1168.     OkBtn->OnUserClick=&MMItemChoose;
  1169.     BpxTextButton* CancelBtn=DSY.addBpxTextButton(PIC1,180,315,"╬╥╠┼═└",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1170.     CancelBtn->UserParam=mcmCancel;
  1171.     CancelBtn->OnUserClick=&MMItemChoose;
  1172.     CreateGamesList(LB);
  1173.     ItemChoose=-1;
  1174.     do{
  1175.         DSY.MarkToDraw();
  1176.         ProcessMessages();
  1177.         if(strlen(IB->Str))OkBtn->Enabled=true;
  1178.         else OkBtn->Enabled=false;
  1179.         DSY.ProcessDialogs();
  1180.         DSY.RefreshView();
  1181.     }while(ItemChoose==-1);
  1182.     if(ItemChoose=mcmOk){
  1183.         CmdSaveNetworkGame(MyNation,GetTickCount(),IB->Str);
  1184.         ContinueGame=true;
  1185. /*        else{
  1186.             for(int j=0;j<NNames;j++){
  1187.                 if(!strcmp(names[j],IB->Str))goto jhg;
  1188.             };
  1189. jhg:        if(j<NNames){
  1190.                 //record already exists
  1191.                 SaveGame(names[j],IB->Str,0);
  1192.                 strcpy(GameName,names[j]);
  1193.             }else{
  1194.                 //new record
  1195.                 //discovery for new name
  1196.                 char XX[128];
  1197.                 strcpy(GameName,IB->Str);
  1198.                 for(j=0;j<9999;j++){
  1199.                     strcpy(XX,"save");
  1200.                     itoa(j,&XX[4],10);
  1201.                     strcat(XX,".sav");
  1202.                     if(CheckName(XX)){
  1203.                         SaveGame(XX,GameName,0);
  1204.                         goto qqwer;
  1205.                     };
  1206.                 };
  1207.             };
  1208.         };*/
  1209.     };
  1210. qqwer:
  1211.     FreeNames();
  1212. };
  1213. //----------------SAVE MAP--------------//
  1214. void NormalName(char* s){
  1215.     if(!strstr(s,".wm")){
  1216.         strcat(s,".wm");
  1217.     };
  1218. };
  1219. bool LBCLICK(SimpleDialog* SD){
  1220.     ListBox* LB=(ListBox*)SD;
  1221.     if(LB->CurItem!=-1){
  1222.         strcpy(GameName,(LB->GetItem(LB->CurItem))->Message);
  1223.     };
  1224.     return false;
  1225. };
  1226. void SaveExtendedMap(char* fnm);
  1227. void ProcessGSaveMap(){
  1228.     DialogsSystem DSY(smapx+(nsmaplx<<4)-(352>>1),smapy+(nsmaply<<4)-(352>>1));
  1229.     Picture* PIC1=DSY.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  1230.     TextButton* LoadBtn=DSY.addTextButton(PIC1,352>>1,30,"╤╬╒╨└═╚╥▄ ╩└╨╥╙",&FActive,&FPassive,&FDisable,1);
  1231.     InputBox* IB=DSY.addInputBox(PIC1,60,75,GameName,20,&r224x28e,&f16x16w,&f16x16g);
  1232.     ListBox* LB=DSY.addListBox(PIC1,60,120,6,&r224x28e,&f16x16g,&f16x16w,NULL);
  1233.     LB->OnUserClick=&LBCLICK;
  1234.     VScrollBar* VS=DSY.addVScrollBar(PIC1,LB->x-DSY.BaseX+LB->oneLx-1,1+LB->y-DSY.BaseY,1000,4,&sb_up_d,&sb_up_e,&sb_up_p,&sb_dn_d,&sb_dn_e,&sb_dn_p,&sb_vbare,&sb_vbar,&sb_btn);
  1235.     LB->VS=VS;
  1236.     BpxTextButton* OkBtn=DSY.addBpxTextButton(PIC1,10,315,"OK",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1237.     OkBtn->UserParam=mcmOk;
  1238.     OkBtn->OnUserClick=&MMItemChoose;
  1239.     BpxTextButton* CancelBtn=DSY.addBpxTextButton(PIC1,180,315,"╬╥╠┼═└",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1240.     CancelBtn->UserParam=mcmCancel;
  1241.     CancelBtn->OnUserClick=&MMItemChoose;
  1242.     CreateNewMapsList(LB);
  1243.     ItemChoose=-1;
  1244.     do{
  1245.         ProcessMessages();
  1246.         if(strlen(IB->Str))OkBtn->Enabled=true;
  1247.         else OkBtn->Enabled=false;
  1248.         DSY.ProcessDialogs();
  1249.         DSY.RefreshView();
  1250.     }while(ItemChoose==-1);
  1251.     if(ItemChoose=mcmOk){
  1252.         NormalName(GameName);
  1253.         SaveExtendedMap(GameName);
  1254.     };
  1255. //qqwer:
  1256.     //FreeNames();
  1257. };
  1258. //----------------LOAD Map--------------//
  1259. void PreLoadExtendedMap(char* fnm);
  1260. void PostLoadExtendedMap(char* fnm);
  1261. void ProcessGLoadMap(){
  1262.     DialogsSystem DSY(smapx+(nsmaplx<<4)-(352>>1),smapy+(nsmaply<<4)-(352>>1));
  1263.     Picture* PIC1=DSY.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  1264.     TextButton* LoadBtn=DSY.addTextButton(PIC1,352>>1,30,"╟└├╨╙╟╚╥▄ ╩└╨╥╙",&FActive,&FPassive,&FDisable,1);
  1265.     ListBox* LB=DSY.addListBox(PIC1,60,100,6,&r224x28e,&f16x16g,&f16x16w,NULL);
  1266.     VScrollBar* VS=DSY.addVScrollBar(PIC1,LB->x-DSY.BaseX+LB->oneLx-1,1+LB->y-DSY.BaseY,1000,4,&sb_up_d,&sb_up_e,&sb_up_p,&sb_dn_d,&sb_dn_e,&sb_dn_p,&sb_vbare,&sb_vbar,&sb_btn);
  1267.     LB->VS=VS;
  1268.     BpxTextButton* OkBtn=DSY.addBpxTextButton(PIC1,10,315,"OK",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1269.     OkBtn->UserParam=mcmOk;
  1270.     OkBtn->OnUserClick=&MMItemChoose;
  1271.     BpxTextButton* CancelBtn=DSY.addBpxTextButton(PIC1,180,315,"╬╥╠┼═└",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1272.     CancelBtn->UserParam=mcmCancel;
  1273.     CancelBtn->OnUserClick=&MMItemChoose;
  1274.     CreateNewMapsList(LB);
  1275.     ItemChoose=-1;
  1276.     do{
  1277.         DSY.MarkToDraw();
  1278.         ProcessMessages();
  1279.         if(LB->CurItem==-1)OkBtn->Enabled=false;
  1280.         else OkBtn->Enabled=true;
  1281.         DSY.ProcessDialogs();
  1282.         DSY.MarkToDraw();
  1283.         DSY.RefreshView();
  1284.     }while(ItemChoose==-1);
  1285.     if(ItemChoose==mcmOk&&LB->CurItem!=-1){
  1286.         UnLoading();
  1287.         PreLoadExtendedMap((LB->GetItem(LB->CurItem))->Message);
  1288.         MyNation=0;
  1289.         for(int i=0;i<8;i++){
  1290.             LoadNation("orcs.nds",1<<i,i);
  1291.             int xx,yy;
  1292.             //chooseCoor(&xx,&yy);
  1293.             CITY[i].CreateCity(4,4,i);
  1294.             //if(i<NPlayers){
  1295.             //    coorX[i]=xx;
  1296.             //    coorY[i]=yy;
  1297.             //    NATIONS[i].CreateTerrainAt(xx,yy,1);
  1298.             //};
  1299.         };
  1300.         //ItemChoose=mcmSingle;
  1301.         //MultiplayerStart=true;
  1302.         InitExplosions();
  1303.         PostLoadExtendedMap((LB->GetItem(LB->CurItem))->Message);
  1304.         CheapMode=false;
  1305.         ContinueGame=true;
  1306.         for(i=0;i<8;i++){
  1307.             RESRC[i][1]=100000000;
  1308.             RESRC[i][2]=100000000;
  1309.             RESRC[i][3]=100000000;
  1310.         };
  1311.     };
  1312.     //FreeNames();
  1313. };
  1314. //-----------------OPTIONS---------------//
  1315. void ProcessGOptions(){
  1316. };    
  1317.  
  1318. //---------------------------------------//
  1319. void NewMap(int szX,int szY);
  1320. extern byte mapPos[16];
  1321. void CreateNewMap(int SizeX,int SizeY){
  1322.     UnLoading();
  1323.     NewMap(SizeX,SizeY);
  1324.     MyNation=0;
  1325.     for(int i=0;i<8;i++){
  1326.         LoadNation("orcs.nds",1<<i,i);
  1327.         int xx,yy;
  1328.         chooseCoor(&xx,&yy);
  1329.         mapPos[i*2]=xx;
  1330.         mapPos[i*2+1]=yy;
  1331.         CITY[i].CreateCity(xx+4,yy+4,i);
  1332.         if(i<NPlayers){
  1333.             coorX[i]=xx;
  1334.             coorY[i]=yy;
  1335.             NATIONS[i].CreateTerrainAt(xx,yy,1);
  1336.             if(i==MyNation){
  1337.                 mapx=xx-(smaplx>>1);
  1338.                 mapy=yy-(smaply>>1);
  1339.                 if(mapx<1)mapx=1;
  1340.                 if(mapy<1)mapy=1;
  1341.                 if(mapx+smaplx>=msx)mapx=msx-smaplx-1;
  1342.                 if(mapy+smaply>=msy)mapy=msy-smaply-1;
  1343.             };
  1344.         };
  1345.     };
  1346.     ItemChoose=mcmSingle;
  1347.     InitExplosions();
  1348. };
  1349. //--------Choose units Dialog------------//
  1350. void ChooseUnit(){
  1351.     DialogsSystem DSY(smapx+(nsmaplx<<4)-(352>>1),smapy+(nsmaply<<4)-(352>>1));
  1352.     Picture* PIC1=DSY.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  1353.     TextButton* LoadBtn=DSY.addTextButton(PIC1,352>>1,30,"┬█┴╬╨ ╬┴┌┼╩╥└",&FActive,&FPassive,&FDisable,1);
  1354.     ListBox* LB=DSY.addListBox(PIC1,60,100,6,&r224x28e,&f16x16g,&f16x16w,NULL);
  1355.     VScrollBar* VS=DSY.addVScrollBar(PIC1,LB->x-DSY.BaseX+LB->oneLx-1,1+LB->y-DSY.BaseY,1000,4,&sb_up_d,&sb_up_e,&sb_up_p,&sb_dn_d,&sb_dn_e,&sb_dn_p,&sb_vbare,&sb_vbar,&sb_btn);
  1356.     LB->VS=VS;
  1357.     BpxTextButton* OkBtn=DSY.addBpxTextButton(PIC1,10,315,"OK",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1358.     OkBtn->UserParam=mcmOk;
  1359.     OkBtn->OnUserClick=&MMItemChoose;
  1360.     BpxTextButton* CancelBtn=DSY.addBpxTextButton(PIC1,180,315,"╬╥╠┼═└",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1361.     CancelBtn->UserParam=mcmCancel;
  1362.     CancelBtn->OnUserClick=&MMItemChoose;
  1363.     LB->AddItem("╤≥σφα",4096);
  1364.     LB->AddItem("├≡αφ≥",0);
  1365.     LB->AddItem("╧Φταφ≥",1);
  1366.     LB->AddItem("╩α≥α∩≤δⁿ≥α",2);
  1367.     LB->AddItem("╬π≡",3);
  1368.     LB->AddItem("╥≡εδδⁿ",4);
  1369.     LB->AddItem("╩εδΣ≤φ",5);
  1370.     LB->AddItem("├φε∞√",7);
  1371.     LB->AddItem("╥αφΩσ≡",9);
  1372.     LB->AddItem("╥≡αφ±∩ε≡≥",10);
  1373.     LB->AddItem("╠ε≡±ΩεΘ Σⁿ Γεδ",11);
  1374.     LB->AddItem("─µαππσ≡φα≤≥",12);
  1375.     LB->AddItem("╫σ≡σ∩α⌡α",13);
  1376.     LB->AddItem("╨ατΓσΣΩα",14);
  1377.     LB->AddItem("─≡αΩεφ",15);
  1378.     LB->AddItem("╤Ωσδσ≥",18);
  1379.     LB->AddItem("├αΣΩΦΘ Σσ∞εφ",19);
  1380.     LB->AddItem("╘σ≡∞α",20);
  1381.     LB->AddItem("┴α≡αΩ",21);
  1382.     LB->AddItem("═╦╬ δεΩα≥ε≡",22);
  1383.     LB->AddItem("╤∞ε≥≡εΓα  ßα°φ ",23);
  1384.     LB->AddItem("╒α≡≈σΓφ  επ≡εΓ",24);
  1385.     LB->AddItem("╦αßε≡α≥ε≡Φ  αδ⌡Φ∞ΦΩεΓ",25);
  1386.     LB->AddItem("├φστΣε Σ≡αΩεφεΓ",26);
  1387.     LB->AddItem("┬σ≡⌠ⁿ",27);
  1388.     LB->AddItem("╓σφ≥≡ πε≡εΣα",28);
  1389.     LB->AddItem("╤δσ±α≡φα ",29);
  1390.     LB->AddItem("╦Φ≥σΘφ√Θ ÷σ⌡",30);
  1391.     LB->AddItem("═╚╚ ∞απΦΦ",31);
  1392.     LB->AddItem("╩≤τφΦ÷α",32);
  1393.     LB->AddItem("╬≈Φ±≥. ταΓεΣ",33);
  1394.     LB->AddItem("═σ⌠≥ φα  ∩δα≥⌠ε≡∞α",34);
  1395.     LB->AddItem("╓Φ≥αΣσδⁿ",35);
  1396.     LB->AddItem("╩≡σ∩ε±≥ⁿ",36);
  1397.     LB->AddItem("╤≥ε≡εµσΓα  ßα°φ ",37);
  1398.     LB->AddItem("┬εε≡≤µσφφα  ßα°φ ",38);
  1399.     LB->AddItem("╥σδσ∩ε≡≥",39);
  1400.     LB->AddItem("╥α≡σδΩα",40);
  1401.     LB->AddItem("╧≡ε≥ΦΓε Σσ≡Ωα",41);
  1402.     LB->AddItem("┴σ≡≥α",42);
  1403.     LB->AddItem("▀Σσ≡Ωα",43);
  1404.     ItemChoose=-1;
  1405.     do{
  1406.         ProcessMessages();
  1407.         if(LB->CurItem==-1)OkBtn->Enabled=false;
  1408.         else OkBtn->Enabled=true;
  1409.         LB->NeedToDraw=true;
  1410.         VS->NeedToDraw=true;
  1411.         DSY.ProcessDialogs();
  1412.         LB->NeedToDraw=true;
  1413.         VS->NeedToDraw=true;
  1414.         DSY.RefreshView();
  1415.     }while(ItemChoose==-1);
  1416.     if(ItemChoose==mcmOk&&LB->CurItem!=-1){
  1417.         int choo=(LB->GetItem(LB->CurItem))->Param1;
  1418.         if(choo==4096)BuildWall=true;
  1419.         else Creator=choo;
  1420.         ContinueGame=true;
  1421.     };
  1422. };
  1423. //------MAIN MENU IN MAP EDITOR----------//
  1424. int ProcessGMapEditMainMenu(){
  1425.     ContinueGame=false;
  1426.     DialogsSystem GMM(smapx+(nsmaplx<<4)-(352>>1),smapy+(nsmaply<<4)-(352>>1));
  1427.     Picture* PIC1=GMM.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  1428.     TextButton* ExitBtn=GMM.addTextButton(PIC1,352>>1,30,"┬╬╟┬╨└╥ ┬ ╠┼═▐",&FActive,&FPassive,&FDisable,1);
  1429.     TextButton* SaveBtn=GMM.addTextButton(PIC1,352>>1,30+40,"╤╬╒╨└═╚╥▄ ╩└╨╥╙",&FActive,&FPassive,&FDisable,1);
  1430.     SaveBtn->UserParam=mcmSave;
  1431.     SaveBtn->OnUserClick=&MMItemChoose;
  1432.     TextButton* LoadBtn=GMM.addTextButton(PIC1,352>>1,30+80,"╟└├╨╙╟╚╥▄ ╩└╨╥╙",&FActive,&FPassive,&FDisable,1);
  1433.     LoadBtn->UserParam=mcmLoad;
  1434.     LoadBtn->OnUserClick=&MMItemChoose;
  1435.     TextButton* NewBtn=GMM.addTextButton(PIC1,352>>1,30+120,"═╬┬└▀ ╩└╨╥└",&FActive,&FPassive,&FDisable,1);
  1436.     TextButton* HelpBtn=GMM.addTextButton(PIC1,352>>1,30+160,"╧╬╠╬┘▄",&FActive,&FPassive,&FDisable,1);
  1437.     ExitBtn->UserParam=mcmExit;
  1438.     ExitBtn->OnUserClick=&MMItemChoose;
  1439.     BpxTextButton* ResumeBtn=
  1440.         GMM.addBpxTextButton(PIC1,(352-164)>>1,300,"╧╨╬─╬╦╞╚╥▄",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1441.     ResumeBtn->UserParam=mcmResume;
  1442.     ResumeBtn->OnUserClick=&MMItemChoose;
  1443. stg:
  1444.     ItemChoose=-1;
  1445.     do{
  1446.         ProcessMessages();
  1447.         GMM.ProcessDialogs();
  1448.         GMM.RefreshView();
  1449.     }while(ItemChoose==-1);
  1450.     if(ItemChoose==mcmLoad){
  1451.         ProcessGLoadMap();
  1452.         GMM.MarkToDraw();
  1453.         if(!ContinueGame)goto stg;
  1454.     };
  1455.     if(ItemChoose==mcmSave){
  1456.         ProcessGSaveMap();
  1457.         GMM.MarkToDraw();
  1458.         if(!ContinueGame)goto stg;
  1459.     };
  1460.     return ItemChoose;    
  1461. }; 
  1462. //----------MAIN MENU IN GAME------------//
  1463. int ProcessGMainMenu(){
  1464.     ContinueGame=false;
  1465.     GameMode=2;
  1466.     bool MIMOD=MiniMode;
  1467.     int mmmx=mapx;
  1468.     int mmmy=mapy;
  1469.     ClearMiniMode();
  1470.     DialogsSystem GMM(smapx+(nsmaplx<<4)-(352>>1),smapy+(nsmaply<<4)-(352>>1));
  1471.     Picture* PIC1=GMM.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  1472.     TextButton* ExitBtn=GMM.addTextButton(PIC1,352>>1,30,"╧╨┼╨┬└╥▄ ╚├╨╙",&FActive,&FPassive,&FDisable,1);
  1473.     ExitBtn->UserParam=mcmExit;
  1474.     ExitBtn->OnUserClick=&MMItemChoose;
  1475.     TextButton* SaveBtn=GMM.addTextButton(PIC1,352>>1,30+40,"╤╬╒╨└═╚╥▄ ╚├╨╙",&FActive,&FPassive,&FDisable,1);
  1476.     SaveBtn->UserParam=mcmSave;
  1477.     SaveBtn->OnUserClick=&MMItemChoose;
  1478.     TextButton* LoadBtn=GMM.addTextButton(PIC1,352>>1,30+80,"╟└├╨╙╟╚╥▄ ╚├╨╙",&FActive,&FPassive,&FDisable,1);
  1479.     LoadBtn->UserParam=mcmLoad;
  1480.     LoadBtn->OnUserClick=&MMItemChoose;
  1481.     TextButton* OptionsBtn=GMM.addTextButton(PIC1,352>>1,30+120,"╧└╨└╠┼╥╨█",&FActive,&FPassive,&FDisable,1);
  1482.     OptionsBtn->UserParam=mcmOptions;
  1483.     OptionsBtn->OnUserClick=&MMItemChoose;
  1484.     TextButton* HelpBtn=GMM.addTextButton(PIC1,352>>1,30+160,"╧╬╠╬┘▄",&FActive,&FPassive,&FDisable,1);
  1485.     HelpBtn->UserParam=mcmHelp;
  1486.     HelpBtn->OnUserClick=&MMItemChoose;
  1487.     BpxTextButton* ResumeBtn=
  1488.         GMM.addBpxTextButton(PIC1,(352-164)>>1,300,"╧╨╬─╬╦╞╚╥▄",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1489.     ResumeBtn->UserParam=mcmResume;
  1490.     ResumeBtn->OnUserClick=&MMItemChoose;
  1491. stg:
  1492.     ItemChoose=-1;
  1493.     do{
  1494.         ProcessMessages();
  1495.         GMM.ProcessDialogs();
  1496.         GMM.RefreshView();
  1497.     }while(ItemChoose==-1);
  1498.     if(ItemChoose==mcmLoad){
  1499.         ProcessGLoadGame();
  1500.         GMM.MarkToDraw();
  1501.         if(!ContinueGame)goto stg;
  1502.     };
  1503.     if(ItemChoose==mcmSave){
  1504.         ProcessGSaveGame();
  1505.         GMM.MarkToDraw();
  1506.         if(!ContinueGame)goto stg;
  1507.     };
  1508.     if(ItemChoose==mcmOptions){
  1509.         ProcessOptions(smapx+(nsmaplx<<4)-(288>>1),smapy+(nsmaply<<4)-(288>>1));
  1510.         ContinueGame=true;
  1511.         ItemChoose=mcmResume;
  1512.     };
  1513.     if(ItemChoose==mcmHelp){
  1514.         ProcessHelp();
  1515.     };
  1516.     if(MIMOD)SetMiniMode();
  1517.     mapx=mmmx;
  1518.     mapy=mmmy;
  1519.     GameMode=0;
  1520.     return ItemChoose;    
  1521. };
  1522. //---------------------------------------//
  1523. extern int HintX;
  1524. extern int HintY;
  1525. void GSSetup800(){
  1526.     CBar(0,0,SCRSizeX,SCRSizeY,0);
  1527.     int PanelLx=160;
  1528.     int P1Ly=160;
  1529.     int P2Ly=160;//2
  1530.     int P3Ly=256;//3
  1531.     IconLx=48;
  1532.     IconLy=40;
  1533.     MiniMode=false;
  1534.     Shifter=5;
  1535.     Multip=0;
  1536.     smapx=PanelLx;
  1537.     smapy=0;
  1538.     smaplx=(RealLx-PanelLx)>>5;
  1539.     smaply=RSCRSizeY>>5;
  1540.     nsmaplx=smaplx;
  1541.     nsmaply=smaply;
  1542.     HintX=smapx+4;
  1543.     HintY=smapy+(smaply<<5)-30;
  1544.     minix=(PanelLx-(msx>>1))>>1;
  1545.     miniy=(P1Ly-(msy>>1))>>1;
  1546.     PrpNx=div(PanelLx,IconLx).quot;
  1547.     PrpNy=div(P2Ly,IconLy).quot;
  1548.     PrpX=(PanelLx-IconLx*PrpNx)>>1;
  1549.     PrpY=P1Ly+((P2Ly-IconLy*PrpNy)>>1);
  1550.     AblNx=PrpNx;
  1551.     AblNy=div(P3Ly,IconLy).quot;
  1552.     AblX=PrpX;
  1553.     AblY=P1Ly+P2Ly+((P3Ly-AblNy*IconLy)>>1);
  1554.     GSYS.~DialogsSystem();
  1555.     GVPort=GSYS.addViewPort(smapx,smapy,smaplx<<5,smaply<<5);
  1556.     Pan1=GSYS.addPicture(NULL,0,0,&w160x160,&w160x160,&w160x160);
  1557.     Pan2=GSYS.addPicture(NULL,0,P1Ly,&w160x160,&w160x160,&w160x160);
  1558.     Pan3=GSYS.addPicture(NULL,0,P1Ly+P2Ly,&w160x256,&w160x256,&w160x256);
  1559.     //Pan2=GSYS.addPicture(NULL,0,P1Ly,&w160x256,&w160x256,&w160x256);
  1560.     //Pan3=GSYS.addPicture(NULL,0,P1Ly+P2Ly,&w160x160,&w160x160,&w160x160);
  1561.     MiniVPort=GSYS.addViewPort(minix,miniy,msx>>1,msy>>1);
  1562.     AblVPort=GSYS.addViewPort(AblX,AblY,AblNx*IconLx,AblNy*IconLy);
  1563.     PrpVPort=GSYS.addViewPort(PrpX,PrpY,PrpNx*IconLx,PrpNy*IconLy);
  1564.     //Pan4=GSYS.addColoredBar(0,P1Ly+P2Ly+P3Ly,PanelLx,(RSCRSizeY&(1023-31))-P1Ly-P1Ly-P3Ly,0);
  1565.     //if((smaply<<5)<RSCRSizeY)
  1566.     //    Pan5=GSYS.addColoredBar(PanelLx,smaply<<5,
  1567.     //        RSCRSizeX-PanelLx,RSCRSizeY&31,0);
  1568.     //else Pan5=NULL;
  1569.     LoadPalette("darkw.pal");
  1570. };
  1571. void GFieldShow();
  1572. void GMiniShow();
  1573. void CopyToScreen(int x,int y,int Lx,int Ly);
  1574. void DrawAllScreen(){
  1575.     //COUNTER++;
  1576.     GFieldShow();
  1577.     Pan1->OnDraw(Pan1);
  1578.     GMiniShow();
  1579.     Pan2->OnDraw(Pan2);
  1580.     ShowProp();
  1581.     Pan3->OnDraw(Pan3);
  1582.     ShowAbility();
  1583.     //Pan4->OnDraw(Pan4);
  1584.     if(Pan5)Pan5->OnDraw(Pan5);
  1585.     CopyToScreen(0,0,RealLx,RSCRSizeY);
  1586.     HandleMouse(mouseX,mouseY);
  1587.     MFix();
  1588. };
  1589. void FastScreenProcess(){
  1590. //    SERROR2();
  1591.     GFieldShow();
  1592.     ProcessMessages();
  1593.     GMiniShow();
  1594.     Pan2->OnDraw(Pan2);
  1595.     Pan3->OnDraw(Pan3);
  1596.     ShowProp();
  1597.     ShowAbility();
  1598.     Pan1->NeedToDraw=false;
  1599.     GSYS.ProcessDialogs();
  1600.     Pan1->NeedToDraw=false;
  1601.     Pan2->NeedToDraw=false;
  1602.     Pan3->NeedToDraw=false;
  1603.     GVPort->NeedToDraw=true;
  1604.     MiniVPort->NeedToDraw=true;
  1605.     AblVPort->NeedToDraw=true;
  1606.     PrpVPort->NeedToDraw=true;
  1607.     HandleMouse(mouseX,mouseY);
  1608.     MFix();
  1609. //    SERROR2();
  1610.     int time0=GetTickCount();
  1611.     GSYS.RefreshView();
  1612.     time8=GetTickCount()-time0;
  1613. //    SERROR1();
  1614. };
  1615. void HandleAntiNuc();
  1616. void PreDrawGameProcess();
  1617. void PostDrawGameProcess();
  1618. void IAmLeft();
  1619. void PlayGame(){
  1620.     GSSetup800();
  1621.     InitGame();
  1622.     DrawAllScreen();
  1623.     GameNeedToDraw=false;
  1624.     GameExit=false;
  1625.     MakeMenu=false;
  1626.     InGame=true;
  1627.     do{
  1628.         time1=GetTickCount();
  1629.         ProcessMessages();
  1630.         time2=GetTickCount()-time1;
  1631.         if(bActive){
  1632.             GameMode=0;
  1633.             PreDrawGameProcess();
  1634.             time3=GetTickCount()-time1-time2;
  1635.             ProcessMessages();
  1636.             if(GameNeedToDraw){
  1637.                 //COUNTER++;
  1638.                 DrawAllScreen();
  1639.                 GameNeedToDraw=false;
  1640.             }else FastScreenProcess();
  1641.             time4=GetTickCount()-time1-time2-time3;
  1642.             //DrawAllScreen();
  1643.             //DrawAllScreen();
  1644.             ProcessMessages();
  1645.             PostDrawGameProcess();
  1646.             time5=GetTickCount()-time1-time2-time3-time4;
  1647.             if(MakeMenu){
  1648.                 switch(MenuType){
  1649.                 case 1:    if(ProcessGMainMenu()==mcmExit){
  1650.                             GameExit=true;
  1651.                             ShutdownMultiplayer();
  1652.                             //IAmLeft();
  1653.                         };
  1654.                         break;
  1655.                 case 2: ChooseUnit();
  1656.                         break;
  1657.                 case 3: EnterChat();
  1658.                         break;
  1659.                 case 4: ProcessHelp();
  1660.                         break;
  1661.                 };
  1662.                 MakeMenu=false;
  1663.             };
  1664.         }else GameNeedToDraw=true;
  1665.     }while(!GameExit);
  1666. };
  1667. void DrawAllEditScreen(){
  1668.     GFieldShow();
  1669.     Pan1->OnDraw(Pan1);
  1670.     GMiniShow();
  1671.     Pan2->OnDraw(Pan2);
  1672.     ShowProp();
  1673.     Pan3->OnDraw(Pan3);
  1674.     ShowAbility();
  1675.     //Pan4->OnDraw(Pan4);
  1676.     if(Pan5)Pan5->OnDraw(Pan5);
  1677.     CopyToScreen(0,0,RealLx,RSCRSizeY);
  1678. };
  1679. void FastEditScreenProcess(){
  1680.     GFieldShow();
  1681.     ProcessMessages();
  1682.     GMiniShow();
  1683.     Pan2->OnDraw(Pan2);
  1684.     Pan3->OnDraw(Pan3);
  1685.     ShowProp();
  1686.     ShowAbility();
  1687.     Pan1->NeedToDraw=false;
  1688.     GSYS.ProcessDialogs();
  1689.     Pan1->NeedToDraw=false;
  1690.     Pan2->NeedToDraw=false;
  1691.     Pan3->NeedToDraw=false;
  1692.     GVPort->NeedToDraw=true;
  1693.     MiniVPort->NeedToDraw=true;
  1694.     AblVPort->NeedToDraw=true;
  1695.     PrpVPort->NeedToDraw=true;
  1696.     HandleMouse(mouseX,mouseY);
  1697.     MFix();
  1698.     GSYS.RefreshView();
  1699. };
  1700. void EditGame(){
  1701.     GSSetup800();
  1702.     DrawAllEditScreen();
  1703.     GameNeedToDraw=false;
  1704.     GameExit=false;
  1705.     MakeMenu=false;
  1706.     do{
  1707.         ProcessMessages();
  1708.         if(bActive){
  1709.             //SERROR2();
  1710.             PreDrawGameProcess();
  1711.             //SERROR1();
  1712.             ProcessMessages();
  1713.             if(GameNeedToDraw){
  1714.                 DrawAllScreen();
  1715.                 GameNeedToDraw=false;
  1716.             }else FastScreenProcess();
  1717.             //DrawAllScreen();
  1718.             //SERROR();
  1719.             ProcessMessages();
  1720.         PostDrawGameProcess();
  1721.             if(MakeMenu){
  1722.                 switch(MenuType){
  1723.                 case 1:    if(ProcessGMapEditMainMenu()==mcmExit)GameExit=true;
  1724.                         break;
  1725.                 case 2: ChooseUnit();
  1726.                         break;
  1727.                 case 3: ProcessResEdit();
  1728.                         break;
  1729.                 };
  1730.                 MakeMenu=false;
  1731.             };
  1732.         }else GameNeedToDraw=true;
  1733.     }while(!GameExit);
  1734. };
  1735. //--------------ALL GAME IS IN THIS PROCEDURE!-------------//
  1736. void AllGame(){
  1737. stgame:
  1738.     int mret=processMainMenu();
  1739.     if(mret==mcmExit)return;
  1740.     if(mret==mcmSingle){
  1741.         if(EditMapMode)EditGame();
  1742.         else PlayGame();
  1743.         goto stgame;
  1744.     }else goto stgame;
  1745. };
  1746. extern int PLNAT[8];
  1747. void PrepareGameMedia(byte myid){
  1748.         rpos=0;
  1749.         setCoor();
  1750.         UnLoading();
  1751.         PreLoadExtendedMap(CurrentMap);
  1752.         memcpy(&RESRC[0][0],&RES[0][0],sizeof RES);
  1753.         MyNation=0;
  1754.         for(int i=0;i<8;i++){
  1755.             if(!PLNAT[i])
  1756.                 LoadNation("orcs.nds",1<<i,i);
  1757.             else LoadNation("PEOPLES.nds",1<<i,i);
  1758.             MyNation=myid;
  1759.             int xx,yy;
  1760.             xx=mapPos[i*2];
  1761.             yy=mapPos[i*2+1];
  1762.             //chooseCoor(&xx,&yy);
  1763.             CITY[i].CreateCity(xx+4,yy+4,i);
  1764.             if(i<NPlayers){
  1765.                 //coorX[i]=xx;
  1766.                 //coorY[i]=yy;
  1767.                 NATIONS[i].CreateTerrainAt(xx+5,yy+5,1);
  1768.                 if(i==MyNation){
  1769.                     mapx=xx-(smaplx>>1);
  1770.                     mapy=yy-(smaply>>1);
  1771.                     if(mapx<1)mapx=1;
  1772.                     if(mapy<1)mapy=1;
  1773.                     if(mapx+smaplx>=msx)mapx=msx-smaplx-1;
  1774.                     if(mapy+smaply>=msy)mapy=msy-smaply-1;
  1775.                 };
  1776.             };
  1777.         };
  1778.         PostLoadExtendedMap(CurrentMap);
  1779.         CheapMode=false;
  1780.         ItemChoose=mcmSingle;
  1781.         MultiplayerStart=true;
  1782.         InitExplosions();
  1783.         PrepareToGame();
  1784.         InitGame();
  1785. };
  1786. void PrepareEditMedia(byte myid){
  1787.         rpos=0;
  1788.         setCoor();
  1789.         UnLoading();
  1790.         NewMap(240,240);
  1791.         MyNation=0;
  1792.         for(int i=0;i<8;i++){
  1793.             if(!PLNAT[i])
  1794.                 LoadNation("orcs.nds",1<<i,i);
  1795.             else LoadNation("PEOPLES.nds",1<<i,i);
  1796.             MyNation=myid;
  1797.             int xx,yy;
  1798.             chooseCoor(&xx,&yy);
  1799.             CITY[i].CreateCity(xx+4,yy+4,i);
  1800.             if(i<NPlayers){
  1801.                 coorX[i]=xx;
  1802.                 coorY[i]=yy;
  1803.                 NATIONS[i].CreateTerrainAt(xx,yy,1);
  1804.                 if(i==MyNation){
  1805.                     mapx=xx-(smaplx>>1);
  1806.                     mapy=yy-(smaply>>1);
  1807.                     if(mapx<1)mapx=1;
  1808.                     if(mapy<1)mapy=1;
  1809.                     if(mapx+smaplx>=msx)mapx=msx-smaplx-1;
  1810.                     if(mapy+smaply>=msy)mapy=msy-smaply-1;
  1811.                 };
  1812.             };
  1813.         };
  1814.         ItemChoose=mcmSingle;
  1815.         //MultiplayerStart=true;
  1816.         InitExplosions();
  1817.         PrepareToEdit();
  1818.         ItemChoose=mcmSingle;
  1819.         InitGame();
  1820. };
  1821. void RedrawGameBackground(){
  1822.     if(GameMode==1){//main menu
  1823.         int mmlx=MainMenuGround.PicPtr[0];
  1824.         int mmly=MainMenuGround.PicPtr[1];
  1825.         MainMenuGround.Draw((RealLx-mmlx)>>1,(RSCRSizeY-mmly)>>1);
  1826.         FlipPages();
  1827.     }else{
  1828.         DrawAllScreen();        
  1829.     };
  1830. };
  1831. void ProcessHelp(){
  1832.     ItemChoose=-1;
  1833.     DialogsSystem GMM(smapx+(nsmaplx<<4)-(352>>1),smapy+(nsmaply<<4)-(352>>1));
  1834.     Picture* PIC1=GMM.addPicture(NULL,0,0,&y352x352,&y352x352,&y352x352);
  1835.     BpxTextButton* OkBtn=GMM.addBpxTextButton(PIC1,352>>1,320,"O≥∞σφα",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1836.     OkBtn->UserParam=mcmOk;
  1837.     OkBtn->OnUserClick=&MMItemChoose;
  1838.     TextViewer* TV=GMM.addTextViewer(PIC1,20,20,320,320,"help.txt",&f16x16w);
  1839.     do{
  1840.         ProcessMessages();
  1841.         if(KeyPressed&&(LastKey==13||LastKey==27)){
  1842.             KeyPressed=false;
  1843.             ItemChoose=mcmOk;
  1844.         };
  1845.         GMM.MarkToDraw();
  1846.         GMM.ProcessDialogs();
  1847.         GMM.RefreshView();
  1848.     }while(ItemChoose==-1);
  1849.     ContinueGame=true;
  1850. };
  1851.  
  1852.  
  1853.  
  1854.  
  1855.  
  1856.  
  1857.  
  1858.  
  1859.  
  1860.  
  1861.  
  1862.  
  1863.  
  1864.  
  1865.  
  1866.  
  1867.  
  1868.  
  1869.  
  1870.  
  1871. void xMainMenu(){
  1872.     DialogsSystem MMenu((RSCRSizeX-PanelLx)>>1,RSCRSizeY-PanelLy-80);
  1873.     Picture* PIC=MMenu.addPicture(NULL,0,0,&Panel1,&Panel1,&Panel1);
  1874.     //MMenu.addBpxTextButton(PanelLx>>1,30,"╬ΣΦφε≈φα  Φπ≡α",&FActive,&FPassive,&FDisable,&r164x28p,&r164x28e,&w164x28d);
  1875.     //MMenu.addBpxTextButton(PanelLx>>1,60,"╚π≡α ∩ε ±σ≥Φ",&FActive,&FPassive,&FDisable,&r164x28p,&r164x28e,&w164x28d);
  1876.     //MMenu.addBpxTextButton(PanelLx>>1,90,"┬ΦΣσε",&FActive,&FPassive,&FDisable,&r164x28p,&r164x28e,&w164x28d);
  1877.     BpxTextButton* ExitBtn=MMenu.addBpxTextButton(PIC,60,220,"┬█╒╬─",&f16x16g,&f16x16y,&f16x16y,&r164x28p,&r164x28e,&w164x28d);
  1878.     MMenu.addTextButton(PIC,PanelLx>>1,30,"╬ΣΦφε≈φα  Φπ≡α",&FActive,&FPassive,&FDisable,1);
  1879.     MMenu.addTextButton(PIC,PanelLx>>1,70,"╚π≡α ∩ε ±σ≥Φ",&FActive,&FPassive,&FDisable,1);
  1880.     MMenu.addTextButton(PIC,PanelLx>>1,110,"┬ΦΣσε",&FActive,&FPassive,&FDisable,1);
  1881.     //TextButton* ExitBtn=MMenu.addTextButton(PanelLx>>1,150,"┬√⌡εΣ",&FActive,&FPassive,&FDisable,1);
  1882.     
  1883.     MMenu.addHScrollBar(PIC,80,10,10,4,&sb_lf_d,&sb_lf_e,&sb_lf_p,&sb_ri_d,&sb_ri_e,&sb_ri_p,&sb_hbare,&sb_hbar,&sb_btn);
  1884.     ListBox* LB=MMenu.addListBox(PIC,200,100,6,&r224x28e,&f16x16g,&f16x16w,NULL);
  1885.     VScrollBar* VS=MMenu.addVScrollBar(PIC,LB->x-MMenu.BaseX+LB->oneLx-1,1+LB->y-MMenu.BaseY,1000,4,&sb_up_d,&sb_up_e,&sb_up_p,&sb_dn_d,&sb_dn_e,&sb_dn_p,&sb_vbare,&sb_vbar,&sb_btn);
  1886.     LB->VS=VS;
  1887.     char uuu[128];
  1888.     char uuu1[128];
  1889.     uuu[0]=0;
  1890.     MMenu.addInputBox(PIC,5,-65,uuu,20,&r224x28e,&f16x16w,&f16x16g);
  1891.     MMenu.addInputBox(PIC,5,-195,uuu1,20,&r224x28e,&f16x16w,&f16x16g);
  1892.     MMenu.addCheckBox(PIC,-100,0," Item1",1,1,&chk2_on,&chk2_off,&f16x16w,&f16x16g);
  1893.     MMenu.addCheckBox(PIC,-100,30," Item2",1,0,&chk2_on,&chk2_off,&f16x16w,&f16x16g);
  1894.     MMenu.addCheckBox(PIC,-100,60," Item3",1,0,&chk2_on,&chk2_off,&f16x16w,&f16x16g);
  1895.     MMenu.addCheckBox(PIC,-100,90," Item4",1,0,&chk2_on,&chk2_off,&f16x16w,&f16x16g);
  1896.  
  1897.     MMenu.addCheckBox(PIC,-200,0," Item1",2,1,&chk2_on,&chk2_off,&f16x16w,&f16x16g);
  1898.     MMenu.addCheckBox(PIC,-200,30," Item2",2,0,&chk2_on,&chk2_off,&f16x16w,&f16x16g);
  1899.     MMenu.addCheckBox(PIC,-200,60," Item3",2,0,&chk2_on,&chk2_off,&f16x16w,&f16x16g);
  1900.     MMenu.addCheckBox(PIC,-200,90," Item4",2,0,&chk2_on,&chk2_off,&f16x16w,&f16x16g);
  1901.  
  1902.     MMenu.addCheckBox(PIC,-100,200," xItem1",0,1,&chk1_on,&chk1_off,&f16x16w,&f16x16g);
  1903.     MMenu.addCheckBox(PIC,-100,230," xItem2",0,1,&chk1_on,&chk1_off,&f16x16w,&f16x16g);
  1904.     MMenu.addCheckBox(PIC,-100,260," xItem3",0,1,&chk1_on,&chk1_off,&f16x16w,&f16x16g);
  1905.     MMenu.addCheckBox(PIC,-100,290," xItem4",0,1,&chk1_on,&chk1_off,&f16x16w,&f16x16g);
  1906.     LB->AddItem("save1",0);
  1907.     LB->AddItem("save2",1);
  1908.     LB->AddItem("save3",0);
  1909.     LB->AddItem("save4",1);
  1910.     LB->AddItem("save5",0);
  1911.     LB->AddItem("save6",1);
  1912.     LB->AddItem("save7",0);
  1913.     LB->AddItem("save8",1);
  1914.     LB->AddItem("save9",0);
  1915.     LB->AddItem("save10",1);
  1916.     LB->AddItem("save11",0);
  1917.     LB->AddItem("save12",1);
  1918.     LB->AddItem("save13",0);
  1919.     LB->AddItem("save14",1);
  1920.     //ExitBtn->OnClick=&OnExit;
  1921.     LoadPalette("015w.pal");
  1922.     MainMenuGround.Draw(0,0);
  1923.     FlipPages();
  1924.     do{
  1925.         //MainMenuGround.Draw(0,0);
  1926.         ProcessMessages();
  1927.         MMenu.ProcessDialogs();
  1928.         //ShowMPtr();
  1929.         //if(DDDebug)FlipPages();
  1930.         MMenu.RefreshView();
  1931.         for(int uu=0;uu<1000000;uu++)ProcessMessages();
  1932.         //FlipPages();
  1933.  
  1934.     }while(true);
  1935. };