home *** CD-ROM | disk | FTP | other *** search
/ Revista CD Expert 51 / PCGamer51_17Demos.iso / games / CM / CyclingManagerDemoCangas.exe / CyclingManagerDemo / scripts / main.cnc < prev    next >
Text File  |  2001-07-09  |  32KB  |  987 lines

  1. //----------------------------------------------------------------------------------------------------------------//
  2. //----------------------------------------------------------------------------------------------------------------//
  3. // Page member and ID init
  4. //----------------------------------------------------------------------------------------------------------------//
  5. //----------------------------------------------------------------------------------------------------------------//
  6. func void PageInit()
  7. {
  8.     // ToolBar
  9.     Object_Intro_InitMembers ();
  10.     TitleBar_init_members();
  11.     ToolBar_init_members();
  12.     Object_Menu_Principal_InitMembers();
  13.     Page_SinglePlayer_InitMembers();
  14.     Race_InitMembers();
  15.     Page_Manager_InitMembers();
  16.     Page_Team_Roaster_InitMembers();
  17.     Page_Tactic_InitMembers();
  18.     Page_Season_Calendar_InitMembers();
  19.     Page_Classification_InitMembers();
  20.     Page_Transfert_InitMembers();
  21.     Page_MultiPlayer_InitMembers();
  22.     PageAdmin_InitMembers();    
  23.  
  24.     oPageList[PAGE_INTRO].pnew            = Object_Intro_Constructor;
  25.     oPageList[PAGE_INTRO].pdelete        = Object_Intro_Destructor;
  26.     oPageList[PAGE_INTRO].iEscapeMode    = G_iEscape_SkipIntro;
  27.  
  28.     oPageList[PAGE_ADMIN].pnew            = PageAdmin_Constructor;
  29.     oPageList[PAGE_ADMIN].pdelete        = PageAdmin_Destructor;
  30.     oPageList[PAGE_ADMIN].iEscapeMode    = G_iEscape_Login;
  31.     
  32.     oPageList[PAGE_INRACE].pnew            = Race_Constructor;
  33.     oPageList[PAGE_INRACE].pdelete        = Race_Destructor;
  34.     oPageList[PAGE_INRACE].iEscapeMode    = G_iEscape_Management;
  35.     //oPageList[PAGE_INRACE].ploaddata = Page_Race_LoadData;
  36.  
  37.     oPageList[PAGE_SINGLE].pnew            = Page_SinglePlayer_Constructor;
  38.     oPageList[PAGE_SINGLE].pdelete        = Page_SinglePlayer_Destructor;
  39.     oPageList[PAGE_SINGLE].iEscapeMode    = G_iEscape_Exit;
  40.  
  41.     oPageList[PAGE_TEAM_ROASTER].pnew            = Page_Team_Roaster_Constructor;
  42.     oPageList[PAGE_TEAM_ROASTER].pdelete        = Page_Team_Roaster_Destructor;
  43.     oPageList[PAGE_TEAM_ROASTER].iEscapeMode    = G_iEscape_Login;
  44.  
  45.     oPageList[PAGE_TACTICS].pnew        = Page_Tactic_Constructor;
  46.     oPageList[PAGE_TACTICS].pdelete        = Page_Tactic_Destructor;
  47.     oPageList[PAGE_TACTICS].iEscapeMode    = G_iEscape_Login;
  48.     oPageList[PAGE_TACTICS].psavedata    = Page_Team_Tactic_SaveData;
  49.  
  50.     oPageList[PAGE_SEASON_CALENDAR].pnew        = Page_Season_Calendar_Constructor;
  51.     oPageList[PAGE_SEASON_CALENDAR].pdelete        = Page_Season_Calendar_Destructor;
  52.     oPageList[PAGE_SEASON_CALENDAR].iEscapeMode    = G_iEscape_Login;
  53.  
  54.  
  55.     oPageList[PAGE_SEASON_CLASSIFICATION].pnew            = Page_Classification_Constructor;
  56.     oPageList[PAGE_SEASON_CLASSIFICATION].pdelete        = Page_Classification_Destructor;
  57.     oPageList[PAGE_SEASON_CLASSIFICATION].iEscapeMode    = G_iEscape_Login;
  58.  
  59.     //oPageList[PAGE_NET_CLIENT].pnew = NetClient_Constructor;
  60.     //oPageList[PAGE_NET_CLIENT].pdelete = NetClient_Destructor;
  61.  
  62.     oPageList[PAGE_MANAGER_PROFILE].pnew        = Page_Manager_Constructor;
  63.     oPageList[PAGE_MANAGER_PROFILE].pdelete        = Page_Manager_Destructor;
  64.     oPageList[PAGE_MANAGER_PROFILE].iEscapeMode    = G_iEscape_Login;
  65.  
  66.     oPageList[PAGE_TRANSFERT].pnew = Page_Transfert_Constructor;
  67.     oPageList[PAGE_TRANSFERT].pdelete = Page_Transfert_Destructor;
  68.     oPageList[PAGE_TRANSFERT].iEscapeMode    = G_iEscape_Login;
  69.  
  70.     oPageList[PAGE_MULTI].pnew        = Page_MultiPlayer_Constructor;
  71.     oPageList[PAGE_MULTI].pdelete        = Page_MultiPlayer_Destructor;
  72.     oPageList[PAGE_MULTI].iEscapeMode    = G_iEscape_Exit;
  73. }
  74.  
  75. //----------------------------------------------------------------------------------------------------------------//
  76. //----------------------------------------------------------------------------------------------------------------//
  77. //
  78. //----------------------------------------------------------------------------------------------------------------//
  79. //----------------------------------------------------------------------------------------------------------------//
  80. func void DialogInit()
  81. {
  82.     // init for each dialog box
  83.     Panel_Team_Cyclist_Info_InitMembers();
  84.     Dialog_Medical_InitMembers();
  85.     Dialog_Team_Tactic_WatchRacerList_InitMembers();
  86.     Dialog_Loading_Data_InitMembers();
  87.     Message_Box_InitMembers();
  88.     Dialog_Configuration_InitMembers();
  89.     Dialog_Stage_Infos_InitMembers();
  90.     Dialog_Transfert_InitMembers();
  91.     Dialbox_Login_InitMembers ();
  92.     Dialog_Game_Param_InitMembers();
  93.     Dialog_Credit_InitMembers();    
  94.  
  95.     // set constructors / destructors
  96.     oDialogList[DIALOG_INFO_CYCLISTS].pnew = Panel_Team_Cyclist_Info_Constructor;
  97.     oDialogList[DIALOG_INFO_CYCLISTS].pdelete = Panel_Team_Cyclist_Info_Destructor;
  98.  
  99.     oDialogList[DIALOG_STAGE_INFOS].pnew = Dialog_Stage_Infos_Constructor;
  100.     oDialogList[DIALOG_STAGE_INFOS].pdelete = Dialog_Stage_Infos_Destructor;
  101.  
  102.     oDialogList[DIALOG_TRANSFERT].pnew = Dialog_Transfert_Constructor;
  103.     oDialogList[DIALOG_TRANSFERT].pdelete = Dialog_Transfert_Destructor;
  104.  
  105.     oDialogList[DIALOG_MEDICAL].pnew = Dialog_Medical_Constructor;
  106.     oDialogList[DIALOG_MEDICAL].pdelete = Dialog_Medical_Destructor;
  107.  
  108.     oDialogList[DIALOG_TEAM_TACTIC_SURVEY].pnew = Dialog_Team_Tactic_WatchRacerList_Constructor;
  109.     oDialogList[DIALOG_TEAM_TACTIC_SURVEY].pdelete = Dialog_Team_Tactic_WatchRacerList_Destructor;
  110.  
  111.     oDialogList[DIALOG_LOADING_DATA].pnew = Dialog_Loading_Data_Constructor;
  112.     oDialogList[DIALOG_LOADING_DATA].pdelete = Dialog_Loading_Data_Destructor;
  113.  
  114.     oDialogList[DIALOG_MESSAGEBOX].pnew        = Message_Box_Constructor;
  115.     oDialogList[DIALOG_MESSAGEBOX].pdelete    = Message_Box_Destructor;
  116.     
  117.     
  118.     oDialogList[DIALOG_CONFIG].pnew        = Dialog_Configuration_Constructor;
  119.     oDialogList[DIALOG_CONFIG].pdelete    = Dialog_Configuration_Destructor;
  120.  
  121.     oDialogList[DIALOG_LOGIN].pnew        = Dialbox_Login_Constructor;
  122.     oDialogList[DIALOG_LOGIN].pdelete    = Dialbox_Login_Destructor;
  123.  
  124.     oDialogList[DIALOG_GAME_PARAM].pnew        = Dialog_Game_Param_Constructor;
  125.     oDialogList[DIALOG_GAME_PARAM].pdelete    = Dialog_Game_Param_Destructor;
  126.  
  127.     oDialogList[DIALOG_CREDITS].pnew    = Dialog_Credit_Constructor;
  128.     oDialogList[DIALOG_CREDITS].pdelete    = Dialog_Credit_Destructor;
  129. }
  130.  
  131.  
  132. //----------------------------------------------------------------------------------------------------------------//
  133. //----------------------------------------------------------------------------------------------------------------//
  134. //Manager Event func
  135. //----------------------------------------------------------------------------------------------------------------//
  136. //----------------------------------------------------------------------------------------------------------------//
  137. func i32x manager (i32x _iComponentID, i32x _iEventID)
  138. {
  139.     if (_iComponentID == -1)
  140.     {
  141.         if(_iEventID == GUI_COMPONENT_KEYDOWN )
  142.         {
  143.             if (GetLastKey() == VK_Escape)
  144.             {
  145.                 if (oManager.iWindowDialogID!=ID_NOT_CREATED) // destroy dialog 
  146.                 {
  147.                     // debug : special demo
  148.                     if(G_iDemoVersion) 
  149.                     {
  150.                         ExitNow();
  151.                     }
  152.                     
  153.                     Manager_DestroyDialog();
  154.                     return 1;
  155.                 }
  156.                 else if(oManager.iPageID != ID_NOT_CREATED) // Exit mode
  157.                 {
  158.                     if (oPageList[oManager.iPageID].iEscapeMode == G_iEscape_Management)
  159.                     {
  160.                         // debug : special demo
  161.                         if(G_iDemoVersion) 
  162.                         {
  163.                             ExitNow();
  164.                         }
  165.                         
  166.                         // Recursive call to load page news
  167.                         LowLevelLoadPage(PAGE_ADMIN);
  168.                         
  169.                         return 1;
  170.                     }
  171.                     else if (oPageList[oManager.iPageID].iEscapeMode == G_iEscape_SkipIntro)
  172.                     {
  173.                         // debug : special demo
  174.                         //special looprun
  175.                         if((G_iDemoVersion)||(G_iLoopRunVersion))
  176.                         {
  177.                             // stop video
  178.                             CallDestructor(oPageList[oManager.iPageID].pdelete);
  179.                             oManager.iWindowID = ID_NOT_CREATED;
  180.  
  181.                             LogueOffline(1,0);
  182.                         }
  183.                         else
  184.                         {        
  185.                             if (g_oGameConfig.m_iInternet==0)
  186.                             {
  187.                                 LoadPage(PAGE_SINGLE);
  188.                             }
  189.                             else
  190.                             {
  191.                                 // ** internet **
  192.                                 LoadPage(PAGE_MULTI);
  193.                             }    
  194.                         }
  195.                         return 1;
  196.                     }
  197.                 }
  198.             }
  199.             
  200.             // debug : special demo
  201.             if(G_iDebugVersion)
  202.             {
  203.                 if (GetLastKey() == VK_F1)        // Active or unactive the console
  204.                 {
  205.                     if(oManager.iConsoleID == -1)
  206.                     {
  207.                         InitConsole();
  208.                         oManager.iConsoleID = InitObject("Console",oConsole.oFunc.pcreate, oConsole.oFunc.pevent);
  209.                         SetComponentPosition(oManager.iConsoleID,300,250);
  210.                     }
  211.                     else
  212.                     {
  213.                         DeleteComponent(oManager.iConsoleID);
  214.                         oManager.iConsoleID = -1;
  215.                     }
  216.                 }
  217.             }// debug : special demo
  218.         }
  219.     }
  220.     
  221.     if (_iEventID==GUI_DESTROY_ME)
  222.     {
  223.         if (_iComponentID==oManager.iWindowDialogID)
  224.         {
  225.             Manager_DestroyDialog();
  226.         }
  227.     }
  228.     // *************************************
  229.     // Special loop
  230.     //mao debug crash with roll mouse !!!
  231.     if((G_iLoopRunVersion)&&(_iComponentID == oManager.iWindowID)&&(_iEventID == PAGE_ADMIN))
  232.     {
  233.         print("###################################### LOAD REQUEST BY PAGE : ");
  234.         println(itoa(_iComponentID));
  235.  
  236.         Manager_LoadPage(_iEventID);
  237.     }
  238.  
  239.     // **************************************
  240.     if(_iComponentID == oManager.iMenu_PrincipalID)
  241.     {
  242.         Manager_LoadPage(_iEventID);
  243.     }
  244.     
  245.     if(oManager.iPageID == PAGE_INTRO)
  246.     {
  247.         if(_iComponentID == oManager.iWindowID)
  248.         {
  249.             Manager_LoadPage(_iEventID);
  250.         }
  251.     }
  252.     
  253.     if(_iEventID == GUI_QUIT_GAME)
  254.     {
  255.         if(oManager.iPageID != ID_NOT_CREATED) // Exit mode
  256.         {
  257.             
  258.             if (oPageList[oManager.iPageID].iEscapeMode == G_iEscape_Exit)
  259.             {
  260.                 // stop podium sequence
  261.                 CreateMessageBox(GetLocalizedFromKey(1554),g_iTypeOkCancelDialog,QuitGame_MessageBoxCallback); // Confirm quit game
  262.  
  263.                 return 0;
  264.             }
  265.             else if (oPageList[oManager.iPageID].iEscapeMode == G_iEscape_Management)
  266.             {
  267.                 // debug : special demo
  268.                 if(G_iDemoVersion) 
  269.                 {
  270.                     ExitNow();
  271.                 }
  272.                 
  273.                 // Recursive call to load page news
  274.                 LowLevelLoadPage(PAGE_ADMIN);
  275.                 
  276.                 return 1;
  277.             }
  278.             else if (oPageList[oManager.iPageID].iEscapeMode == G_iEscape_Login)
  279.             {
  280.                 // debug : special demo
  281.                 if(G_iDemoVersion) 
  282.                 {
  283.                     ExitNow();
  284.                 }
  285.                 
  286.                 // disconnect from menu server to allow new login
  287.                 if (g_oMenuServer.m_oServer)
  288.                     NetClient_Disconnect(g_oMenuServer.m_oServer);
  289.                 
  290.                 // disconnect from gateway to allow new login
  291.                 if (g_oLobby.m_oServer)
  292.                     NetClient_Disconnect(g_oLobby.m_oServer);
  293.                 
  294.                 // escape from internet
  295.                 g_oGameConfig.m_iInternet=0;
  296.                 
  297.                 return 1;
  298.             }
  299.         }
  300.     }
  301.     
  302.     return 1;
  303. }
  304.  
  305.  
  306. // Quit game dialog box call back method
  307. //----------------------------------------------------------------------------------------------------------------//
  308. func void QuitGame_MessageBoxCallback(i32x _iResult)
  309. {
  310.     if(_iResult == g_iTypeOkDialog)
  311.     {
  312.         if(oManager.iWindowID != ID_NOT_CREATED)
  313.         {
  314.             CallDestructor(oPageList[oManager.iPageID].pdelete);
  315.             oManager.iWindowID = ID_NOT_CREATED;
  316.         }
  317.         
  318.         // Destroy join on local DB
  319.         vDestroyLocalDatabaseJoins();
  320.         
  321.         // delete lobby joins
  322.         DestroyGatewayJoins();
  323.         
  324.         // destroy local lobby
  325.         if (g_oGameConfig.m_iInternet == 0)
  326.         {
  327.             fnGameServer_Destroy();
  328.         }
  329.         
  330.         // debug : special demo
  331.         if(G_iDemoVersion) 
  332.         {
  333.             ExitNow();
  334.         }
  335.         
  336.         //Save local database
  337.         SaveLocalDatabase();
  338.         
  339.         if (g_oMenuServer.m_oServer)
  340.             NetClient_Disconnect(g_oMenuServer.m_oServer);
  341.         
  342.         
  343.         
  344.         DestroyWaves();
  345.         Exit();
  346.     }
  347. }
  348.  
  349. // vInitMenuBackground
  350. // Create menu background in manager object
  351. //----------------------------------------------------------------------------------------------------------------//
  352. func void vInitMenuBackground()
  353. {
  354.     if(oManager.m_cBackground == ID_NOT_CREATED)
  355.     {
  356.         // Init page background
  357.         oManager.m_cBackground = InitContainer(tBackground);
  358.         SetContainerSize(oManager.m_cBackground,800,600);    // Fill all screen with background
  359.     }
  360.  
  361.     if(oManager.m_cTopLeftBorder == ID_NOT_CREATED)
  362.     {
  363.         // Left border
  364.         oManager.m_cTopLeftBorder = InitContainer(t_panel_bordertopleft);
  365.     }
  366.     if(oManager.m_cTopLeftCenter == ID_NOT_CREATED)
  367.     {
  368.         // Left border
  369.         oManager.m_cTopLeftCenter = InitContainer(t_panel_bordertopleft);
  370.         SetContainerSprite(oManager.m_cTopLeftCenter,1,0);
  371.         SetContainerScaleY(oManager.m_cTopLeftCenter,489.0/125.0);
  372.         SetComponentPositionY(oManager.m_cTopLeftCenter,3);
  373.     }
  374.     if(oManager.m_cBottomLeftBorder == ID_NOT_CREATED)
  375.     {
  376.         oManager.m_cBottomLeftBorder = InitContainer(t_panel_borderbottomleft);
  377.         SetComponentPosition(oManager.m_cBottomLeftBorder,0,492);
  378.     }
  379.     if(oManager.m_cTitleBar == ID_NOT_CREATED)
  380.     {
  381.         oManager.m_cTitleBar = InitObject("Title Bar",oTitleBar.ofunc.pcreate,oTitleBar.ofunc.pevent);
  382.         SetComponentPosition(oManager.m_cTitleBar,oManager.iWindowPositionX,0);
  383.         Set_Title_Bar_Text(g_szNull);
  384.     }
  385.     if(oManager.iToolBar == ID_NOT_CREATED)
  386.     {
  387.         oManager.iToolBar = InitObject("Tool Bar",oToolBar.ofunc.pcreate,oToolBar.ofunc.pevent);
  388.         SetComponentPosition(oManager.iToolBar,0,574);
  389.     }
  390. }
  391.  
  392. // vDeleteMenuBackground
  393. // Delete background component inside manager 
  394. //----------------------------------------------------------------------------------------------------------------//
  395. func void vDeleteMenuBackground()
  396. {
  397.     if(oManager.m_cBackground != ID_NOT_CREATED)
  398.     {
  399.         DeleteComponent(oManager.m_cBackground);
  400.         oManager.m_cBackground = ID_NOT_CREATED;
  401.     }
  402.     if(oManager.m_cTopLeftBorder != ID_NOT_CREATED)
  403.     {
  404.         DeleteComponent(oManager.m_cTopLeftBorder);
  405.         oManager.m_cTopLeftBorder = ID_NOT_CREATED;
  406.     }
  407.     if(oManager.m_cTopLeftCenter != ID_NOT_CREATED)
  408.     {
  409.         DeleteComponent(oManager.m_cTopLeftCenter);
  410.         oManager.m_cTopLeftCenter = ID_NOT_CREATED;
  411.     }
  412.     if(oManager.m_cBottomLeftBorder != ID_NOT_CREATED)
  413.     {
  414.         DeleteComponent(oManager.m_cBottomLeftBorder);
  415.         oManager.m_cBottomLeftBorder = ID_NOT_CREATED;
  416.     }
  417.     if(oManager.m_cTitleBar != ID_NOT_CREATED)
  418.     {
  419.         DeleteComponent(oManager.m_cTitleBar);
  420.         oManager.m_cTitleBar = ID_NOT_CREATED;
  421.         oTitleBar.m_pthis = g_poNullComponent;
  422.     }
  423.     if(oManager.iToolBar != ID_NOT_CREATED)
  424.     {
  425.         DeleteComponent(oManager.iToolBar);
  426.         oManager.iToolBar = ID_NOT_CREATED;
  427.         oToolBar.m_pthis = g_poNullComponent;
  428.     }
  429. }
  430.  
  431. //----------------------------------------------------------------------------------------------------------------//
  432. //----------------------------------------------------------------------------------------------------------------//
  433. //Menu Engine Create func
  434. //----------------------------------------------------------------------------------------------------------------//
  435. //----------------------------------------------------------------------------------------------------------------//
  436. func void InitGui ()
  437. {
  438.     var i32x i;
  439.     // init NULL string
  440.     g_szNull = "";
  441.  
  442.     SetObjectSize(800,600);
  443.     
  444.     oManager.iMenu_PrincipalID=ID_NOT_CREATED;
  445. //    oManager.iStartID=ID_NOT_CREATED;
  446.  
  447.     // Init all pages
  448.     PageInit();
  449.     // init for all dialogs
  450.     DialogInit();
  451.  
  452.     oManager.pThis = GetParserComponent();
  453.  
  454.     // Init Menu Background
  455.     oManager.m_cBackground = ID_NOT_CREATED;
  456.     oManager.m_cTopLeftBorder = ID_NOT_CREATED;
  457.     oManager.m_cTopLeftCenter = ID_NOT_CREATED;
  458.     oManager.m_cBottomLeftBorder = ID_NOT_CREATED;
  459.     oManager.m_cTitleBar = ID_NOT_CREATED;
  460.     oManager.iToolBar = ID_NOT_CREATED;
  461.  
  462.     // Init page
  463.     oManager.iWindowID = CallConstructor(oPageList[oManager.iPageID].pnew);
  464.     if(oManager.iPageID != PAGE_INTRO)
  465.         SetComponentPosition(oManager.iWindowID, oManager.iWindowPositionX, oManager.iWindowPositionY);
  466.  
  467.     //Create Tool Bar
  468.     //var i32x id;
  469.     //oManager.iToolBar=InitObject("Tool Bar",oToolBar.ofunc.pcreate,oToolBar.ofunc.pevent);
  470.     //SetComponentPosition(oManager.iToolBar,130,570);
  471.     //Set_Tool_Bar_Text(g_szNull);
  472.     
  473. //    oManager.iMenu_PrincipalID = InitObject(oMenu_Principal.szName, oMenu_Principal.oFunc.pcreate, oMenu_Principal.oFunc.pevent);
  474. //    SetComponentPosition(oManager.iMenu_PrincipalID, 0, 100);
  475. }
  476.  
  477. //----------------------------------------------------------------------------------------------------------------//
  478. //----------------------------------------------------------------------------------------------------------------//
  479. //Menu Engine Init
  480. //----------------------------------------------------------------------------------------------------------------//
  481. //----------------------------------------------------------------------------------------------------------------//
  482.  
  483. func void SetLanguage(i32x _iLanguage)
  484. {
  485.     var szx szColumnName;
  486.     g_oUser.m_iLanguage = _iLanguage;
  487.     // Update global join
  488.     szColumnName = "gene_sz_";
  489.  
  490.     if(_iLanguage==LANGUAGE_ENGLISH)
  491.         szColumnName = strcat(szColumnName,"english");
  492.     if(_iLanguage==LANGUAGE_FRENCH)
  493.         szColumnName = strcat(szColumnName,"french");
  494.     if(_iLanguage==LANGUAGE_DUTCH)
  495.         szColumnName = strcat(szColumnName,"dutch");
  496.     if(_iLanguage==LANGUAGE_SPANISH)
  497.         szColumnName = strcat(szColumnName,"spanish");
  498.     if(_iLanguage==LANGUAGE_ITALIAN)
  499.         szColumnName = strcat(szColumnName,"italian");
  500.     if(_iLanguage==LANGUAGE_GERMAN)
  501.         szColumnName = strcat(szColumnName,"german");
  502.  
  503.     // Destroy old join
  504.     if(g_oLocalJoins.m_iGameMenuString>0)
  505.         Join_Destructor(g_oLocalJoins.m_iGameMenuString);
  506.     if(g_oLocalJoins.m_iLocalizedString>0)
  507.         Join_Destructor(g_oLocalJoins.m_iLocalizedString);
  508.     if(g_oLocalJoins.m_iFormattedString>0)
  509.         Join_Destructor(g_oLocalJoins.m_iFormattedString);
  510.  
  511.     // Reinit local join
  512.     g_oLocalJoins.m_iGameMenuString        = Join_Constructor(DATABASE_LOCAL,strcat("STA_game_menu.game_strID_text.STA_localized_string.",szColumnName));
  513.     g_oLocalJoins.m_iLocalizedString    = Join_Constructor(DATABASE_LOCAL,strcat("STA_localized_string.",szColumnName));
  514.     g_oLocalJoins.m_iFormattedString    = Join_Constructor(DATABASE_LOCAL,strcat("STA_formated_string.",szColumnName));
  515. }
  516.  
  517. func i32x GetLanguage()
  518. {
  519.     return g_oUser.m_iLanguage;
  520. }
  521.  
  522. func i32x Is3DDeviceInitProblem()
  523. {
  524.     var FILE    logfile;
  525.     var FILEBUF filebuf;
  526.     var szx        szLine;
  527.     var i32x i;
  528.  
  529.     logfile=fopen("device.log",3,1); // Read text mode
  530.  
  531.     if(logfile)
  532.     {
  533.         filebuf = CreateFileBuf(1024);
  534.         i = freadline(logfile,filebuf);
  535.         if(i==0)
  536.         {
  537.             szLine = GetStringFromBuf(filebuf);
  538.             if(!strcmp(szLine,"3D Device initialization Ok."))
  539.             {
  540.                 i = 0;
  541.             }
  542.             else
  543.             {
  544.                 i = 1;
  545.             }
  546.         }
  547.         DeleteFileBuf(filebuf);
  548.         fclose(logfile);
  549.     }
  550.  
  551.     // return
  552.     return i;
  553. }
  554.  
  555. func void init ()
  556. {
  557.     G_szVersion = "v1.00.004";
  558.     print("version:");println(G_szVersion);
  559.  
  560.     // Default language
  561.     SetLanguage(0);
  562.  
  563.     // Buffers init
  564.     SetSpriteBuffer(8192*2);
  565.     SetTextureBuffer(256);
  566.     SetMaterialBuffer(256);
  567.  
  568.     // Save each device into "device.log"
  569.     LogDevice3D();
  570.  
  571.     // Load last saved language
  572.     LoadLanguage();
  573.  
  574.     // Detect 3D device init problem
  575.     if(!Is3DDeviceInitProblem())
  576.     {
  577.         // Load last saved video mode
  578.         LoadVideoMode();
  579.     }
  580.     else
  581.     {
  582.         // 3D device init problem :
  583.         print("Reset video config.\n");
  584.         ResetVideoModeConfig();
  585.     }
  586.  
  587.  
  588.     // Load last saved audio settings
  589.     LoadAudio();
  590.  
  591.     // Color Set Init
  592.     Init_Color_Set(0);
  593.  
  594.     // Texture loading
  595.     Init_Textures();
  596.  
  597.  
  598.     // MenuServer settings
  599.     g_oMenuServer.m_szIP = "127.0.0.1";
  600.     g_oMenuServer.m_iPort = 1111;
  601.     g_oInRaceServer.m_szResolServerPass = g_szNull;
  602.  
  603.     // default gateway
  604.     g_oLobby.m_szIP = "127.0.0.1";
  605.     g_szInternetConfig = "";
  606.  
  607.     // inrace server
  608.     g_oInRaceServer.m_iCanStartRace = 0;
  609.     
  610.     // Make manager init here
  611.     oManager.iNotifyTransfert    = false;
  612.     oManager.szName                = "Manager";
  613.     oManager.oFunc.pcreate        = main;
  614.     oManager.oFunc.pevent        = manager;
  615.  
  616.     // Default window position
  617.     oManager.iWindowPositionX    = 143;
  618.     oManager.iWindowPositionY    = 39;
  619.     oManager.iWindowDialogID    = ID_NOT_CREATED;
  620.  
  621.     // Init query
  622.     vInitQueries();
  623.  
  624.     // Display the first page (intro)
  625.     oManager.iPageID            = PAGE_INTRO;
  626.     oManager.iConsoleID            = -1;            //Console Not Displayed
  627.  
  628.     // Create local DB join
  629.     vCreateLocalDatabaseJoins();
  630.  
  631.     g_oUser.m_szLogin = "Cyanide";
  632.     g_oUser.m_szPass = "BeCorrosive";
  633. }
  634.  
  635. func void InitInternet(szx szIP, i32x iPort, i32x iServer, szx szPseudo, szx szConfig)
  636. {
  637.     g_oGameConfig.m_iInternet = 1;
  638.     g_oGameConfig.m_iInternetServer = iServer;
  639.     g_oMenuServer.m_iPort = iPort;
  640.     g_oUser.m_szLogin = szPseudo;
  641.     g_oUser.m_szGatewayAuthorization = szPseudo;
  642.     g_szInternetConfig = szConfig;
  643.  
  644.     //g_oLobby.m_iUserPort = iPort1;
  645.     //g_oLobby.m_iGamePort = iPort2;
  646.  
  647.     
  648.     if (g_oGameConfig.m_iInternetServer)
  649.     {
  650.         // create dummy lobby
  651.         fnGameServer_Create();
  652.     }
  653.     else
  654.     {
  655.         g_oMenuServer.m_szIP = szIP;
  656.     }
  657. }
  658.  
  659. func void InitNoInternet()
  660. {
  661.     g_oGameConfig.m_iInternet = 0;
  662.  
  663.     // create local lobby
  664.     fnGameServer_Create();
  665.  
  666.     // lobby database
  667.     Database_Open(QUERY_GAME_SERVERS, "Database/Games.cdb");
  668.     CreateGatewayJoins();
  669.     g_oGatewayJoins.szIP        = Join_Constructor(QUERY_GAME_SERVERS, "Games.szIP");
  670.     g_oGatewayJoins.iPort        = Join_Constructor(QUERY_GAME_SERVERS, "Games.iPort");
  671. }
  672.  
  673. //----------------------------------------------------------------------------------------------------------------//
  674. //----------------------------------------------------------------------------------------------------------------//
  675. // Local Database joins
  676. //----------------------------------------------------------------------------------------------------------------//
  677. //----------------------------------------------------------------------------------------------------------------//
  678. func void vCreateLocalDatabaseJoins()
  679. {
  680.     var i32x iLanguage;
  681.     var szx szColumnName;
  682.  
  683.     // Create global join
  684.     iLanguage = GetLanguage();
  685.     szColumnName = "gene_sz_";
  686.  
  687.     if(iLanguage==LANGUAGE_ENGLISH)
  688.         szColumnName = strcat(szColumnName,"english");
  689.     if(iLanguage==LANGUAGE_FRENCH)
  690.         szColumnName = strcat(szColumnName,"french");
  691.     if(iLanguage==LANGUAGE_DUTCH)
  692.         szColumnName = strcat(szColumnName,"dutch");
  693.     if(iLanguage==LANGUAGE_SPANISH)
  694.         szColumnName = strcat(szColumnName,"spanish");
  695.     if(iLanguage==LANGUAGE_ITALIAN)
  696.         szColumnName = strcat(szColumnName,"italian");
  697.     if(iLanguage==LANGUAGE_GERMAN)
  698.         szColumnName = strcat(szColumnName,"german");
  699.     
  700.     // Destroy old join
  701.     if(g_oLocalJoins.m_iGameMenuString>0)
  702.         Join_Destructor(g_oLocalJoins.m_iGameMenuString);
  703.     if(g_oLocalJoins.m_iLocalizedString>0)
  704.         Join_Destructor(g_oLocalJoins.m_iLocalizedString);
  705.     if(g_oLocalJoins.m_iFormattedString>0)
  706.         Join_Destructor(g_oLocalJoins.m_iFormattedString);
  707.  
  708.     g_oLocalJoins.m_iUser_szName        = Join_Constructor(DATABASE_LOCAL,"DYN_config.user_sz_name");
  709.  
  710.     g_oLocalJoins.m_iGameMenuString        = Join_Constructor(DATABASE_LOCAL,strcat("STA_game_menu.game_strID_text.STA_localized_string.",szColumnName));
  711.     g_oLocalJoins.m_iLocalizedString    = Join_Constructor(DATABASE_LOCAL,strcat("STA_localized_string.",szColumnName));
  712.     g_oLocalJoins.m_iFormattedString    = Join_Constructor(DATABASE_LOCAL,strcat("STA_formated_string.",szColumnName));
  713.  
  714.     // gateway join
  715.     g_oLocalJoins.m_iGateway_iId        = Join_Constructor(DATABASE_LOCAL,"GAM_gateway.IDgateway");
  716.     g_oLocalJoins.m_iGateway_szIp        = Join_Constructor(DATABASE_LOCAL,"GAM_gateway.gene_sz_ip");
  717.     g_oLocalJoins.m_iGateway_iValid        = Join_Constructor(DATABASE_LOCAL,"GAM_gateway.gene_b_valid");
  718.  
  719.     // Single player Slot join
  720.     g_oLocalJoins.m_iSSlot_iId            = Join_Constructor(DATABASE_LOCAL,"GAM_slot_single.IDslot_single");
  721.     g_oLocalJoins.m_iSSlot_iDate        = Join_Constructor(DATABASE_LOCAL,"GAM_slot_single.gene_i_date");
  722.     g_oLocalJoins.m_iSSlot_iGameMode    = Join_Constructor(DATABASE_LOCAL,"GAM_slot_single.game_i_mode");
  723.     g_oLocalJoins.m_iSSlot_iStageId        = Join_Constructor(DATABASE_LOCAL,"GAM_slot_single.fkIDstage");
  724.     g_oLocalJoins.m_iSSlot_szDatabase    = Join_Constructor(DATABASE_LOCAL,"GAM_slot_single.gene_sz_database");
  725.     g_oLocalJoins.m_iSSlot_bFirstLaunch = Join_Constructor(DATABASE_LOCAL,"GAM_slot_single.gene_b_firstlaunch");
  726.     g_oLocalJoins.m_iSSlot_bGameOver    = Join_Constructor(DATABASE_LOCAL,"GAM_slot_single.gene_b_gameover");
  727.  
  728.     // Multiplayer Slot join
  729.     g_oLocalJoins.m_iMSlot_iId            = Join_Constructor(DATABASE_LOCAL,"GAM_slot_multi.IDslot_multi");
  730.     g_oLocalJoins.m_iMSlot_iDate        = Join_Constructor(DATABASE_LOCAL,"GAM_slot_multi.gene_i_date");
  731.     g_oLocalJoins.m_iMSlot_iGameMode    = Join_Constructor(DATABASE_LOCAL,"GAM_slot_multi.game_i_mode");
  732.     g_oLocalJoins.m_iMSlot_iStageId        = Join_Constructor(DATABASE_LOCAL,"GAM_slot_multi.fkIDstage");
  733.     g_oLocalJoins.m_iMSlot_szDatabase    = Join_Constructor(DATABASE_LOCAL,"GAM_slot_multi.gene_sz_database");
  734.     g_oLocalJoins.m_iMSlot_bFirstLaunch = Join_Constructor(DATABASE_LOCAL,"GAM_slot_multi.gene_b_firstlaunch");
  735.     g_oLocalJoins.m_iMSlot_szName        = Join_Constructor(DATABASE_LOCAL,"GAM_slot_multi.gene_sz_name");
  736.     g_oLocalJoins.m_iMSlot_szPass        = Join_Constructor(DATABASE_LOCAL,"GAM_slot_multi.gene_sz_password");
  737.     g_oLocalJoins.m_iMSlot_bGameOver    = Join_Constructor(DATABASE_LOCAL,"GAM_slot_multi.gene_b_gameover");
  738.  
  739.     // Stage join 
  740.     g_oLocalJoins.m_iStage_iId            = Join_Constructor(DATABASE_LOCAL,"STA_stage.IDstage");
  741.     g_oLocalJoins.m_iStage_szRelief        = Join_Constructor(DATABASE_LOCAL,"STA_stage.gene_sz_relief");
  742.     g_oLocalJoins.m_iStage_iType        = Join_Constructor(DATABASE_LOCAL,"STA_stage.gene_i_time_trial");
  743.     g_oLocalJoins.m_iStage_iNameId        = Join_Constructor(DATABASE_LOCAL,"STA_stage.gene_strID_stage_name");
  744.     g_oLocalJoins.m_iStage_iRaceId        = Join_Constructor(DATABASE_LOCAL,"STA_stage.fkIDrace");
  745.     g_oLocalJoins.m_iStage_iRaceNameId    = Join_Constructor(DATABASE_LOCAL,"STA_stage.fkIDrace.STA_race.gene_strID_race_name");
  746.     g_oLocalJoins.m_iStage_fLength        = Join_Constructor(DATABASE_LOCAL,"STA_stage.gene_f_distance");
  747.     g_oLocalJoins.m_iStage_iDay            = Join_Constructor(DATABASE_LOCAL,"STA_stage.gene_i_day");
  748.     g_oLocalJoins.m_iStage_iNumber        = Join_Constructor(DATABASE_LOCAL,"STA_stage.gene_i_stage_number");
  749.  
  750.     // Race join
  751.     g_oLocalJoins.m_iRace_iId            = Join_Constructor(DATABASE_LOCAL,"STA_race.IDrace");
  752.     g_oLocalJoins.m_iRace_iNameId        = Join_Constructor(DATABASE_LOCAL,"STA_race.gene_strID_race_name");
  753.     g_oLocalJoins.m_iRace_iStageNumber    = Join_Constructor(DATABASE_LOCAL,"STA_race.gene_i_number_stages");
  754.     g_oLocalJoins.m_iRace_iDay            = Join_Constructor(DATABASE_LOCAL,"STA_race.gene_i_date");
  755.     g_oLocalJoins.m_iRace_iCountryId    = Join_Constructor(DATABASE_LOCAL,"STA_race.fkIDcountry");
  756.     g_oLocalJoins.m_iRace_iUciClassStrId= Join_Constructor(DATABASE_LOCAL,"STA_race.fkIDUCI_class.STA_UCI_class.gene_strID_UCI_class");
  757.  
  758.     // Country join
  759.     g_oLocalJoins.m_iCountry_iTgaId        = Join_Constructor(DATABASE_LOCAL,"STA_country.gene_tgaID_flag");
  760.     // Tga join
  761.     g_oLocalJoins.m_iTga_szDirectory    = Join_Constructor(DATABASE_LOCAL,"STA_TGA.fkIDdirectory.STA_directory.game_sz_directory");
  762.     g_oLocalJoins.m_iTga_szName            = Join_Constructor(DATABASE_LOCAL,"STA_TGA.gene_sz_TGA");
  763. }
  764.  
  765. func void vDestroyLocalDatabaseJoins()
  766. {
  767.     // Tga  join
  768.     if(g_oLocalJoins.m_iTga_szDirectory>0)
  769.     {
  770.         Join_Destructor(g_oLocalJoins.m_iTga_szDirectory);
  771.         g_oLocalJoins.m_iTga_szDirectory = 0;
  772.     }
  773.     if(g_oLocalJoins.m_iTga_szName>0)
  774.     {
  775.         Join_Destructor(g_oLocalJoins.m_iTga_szName);
  776.         g_oLocalJoins.m_iTga_szName = 0;
  777.     }
  778.     // Localized string join
  779.     if(g_oLocalJoins.m_iGameMenuString>0)
  780.     {
  781.         Join_Destructor(g_oLocalJoins.m_iGameMenuString);
  782.         g_oLocalJoins.m_iGameMenuString = 0;
  783.     }
  784.     if(g_oLocalJoins.m_iLocalizedString>0)
  785.     {
  786.         Join_Destructor(g_oLocalJoins.m_iLocalizedString);
  787.         g_oLocalJoins.m_iLocalizedString = 0;
  788.     }
  789.     if(g_oLocalJoins.m_iFormattedString>0)
  790.     {
  791.         Join_Destructor(g_oLocalJoins.m_iFormattedString);
  792.         g_oLocalJoins.m_iFormattedString = 0;
  793.     }
  794.  
  795.     if(g_oLocalJoins.m_iUser_szName>0)
  796.     {
  797.         Join_Destructor(g_oLocalJoins.m_iUser_szName);
  798.         g_oLocalJoins.m_iUser_szName = 0;
  799.     }
  800.  
  801.     // gateway join
  802.     if(g_oLocalJoins.m_iGateway_iId>0)
  803.     {
  804.         Join_Destructor(g_oLocalJoins.m_iGateway_iId);
  805.         g_oLocalJoins.m_iGateway_iId = 0;
  806.     }
  807.     if(g_oLocalJoins.m_iGateway_szIp>0)
  808.     {
  809.         Join_Destructor(g_oLocalJoins.m_iGateway_szIp);
  810.         g_oLocalJoins.m_iGateway_szIp = 0;
  811.     }
  812.     if(g_oLocalJoins.m_iGateway_iValid>0)
  813.     {
  814.         Join_Destructor(g_oLocalJoins.m_iGateway_iValid);
  815.         g_oLocalJoins.m_iGateway_iValid = 0;
  816.     }
  817.  
  818.     // Single player slot
  819.     if(g_oLocalJoins.m_iSSlot_iId>0)
  820.     {
  821.         Join_Destructor(g_oLocalJoins.m_iSSlot_iId);
  822.         g_oLocalJoins.m_iSSlot_iId = 0;
  823.     }
  824.     if(g_oLocalJoins.m_iSSlot_iDate>0)
  825.     {
  826.         Join_Destructor(g_oLocalJoins.m_iSSlot_iDate);
  827.         g_oLocalJoins.m_iSSlot_iDate = 0;
  828.     }
  829.     if(g_oLocalJoins.m_iSSlot_iGameMode>0)
  830.     {
  831.         Join_Destructor(g_oLocalJoins.m_iSSlot_iGameMode);
  832.         g_oLocalJoins.m_iSSlot_iGameMode = 0;
  833.     }
  834.     if(g_oLocalJoins.m_iSSlot_iStageId>0)
  835.     {
  836.         Join_Destructor(g_oLocalJoins.m_iSSlot_iStageId);
  837.         g_oLocalJoins.m_iSSlot_iStageId = 0;
  838.     }
  839.     if(g_oLocalJoins.m_iSSlot_szDatabase>0)
  840.     {
  841.         Join_Destructor(g_oLocalJoins.m_iSSlot_szDatabase);
  842.         g_oLocalJoins.m_iSSlot_szDatabase = 0;
  843.     }
  844.     if(g_oLocalJoins.m_iSSlot_bFirstLaunch>0)
  845.     {
  846.         Join_Destructor(g_oLocalJoins.m_iSSlot_bFirstLaunch);
  847.         g_oLocalJoins.m_iSSlot_bFirstLaunch = 0;
  848.     }
  849.     if(g_oLocalJoins.m_iSSlot_bGameOver)
  850.     {
  851.         Join_Destructor(g_oLocalJoins.m_iSSlot_bGameOver);
  852.         g_oLocalJoins.m_iSSlot_bGameOver = 0;
  853.     }
  854.  
  855.     // Multiplayer slot
  856.     if(g_oLocalJoins.m_iMSlot_iId>0)
  857.     {
  858.         Join_Destructor(g_oLocalJoins.m_iMSlot_iId);
  859.         g_oLocalJoins.m_iMSlot_iId = 0;
  860.     }
  861.     if(g_oLocalJoins.m_iMSlot_iDate>0)
  862.     {
  863.         Join_Destructor(g_oLocalJoins.m_iMSlot_iDate);
  864.         g_oLocalJoins.m_iMSlot_iDate = 0;
  865.     }
  866.     if(g_oLocalJoins.m_iMSlot_iGameMode>0)
  867.     {
  868.         Join_Destructor(g_oLocalJoins.m_iMSlot_iGameMode);
  869.         g_oLocalJoins.m_iMSlot_iGameMode = 0;
  870.     }
  871.     if(g_oLocalJoins.m_iMSlot_iStageId>0)
  872.     {
  873.         Join_Destructor(g_oLocalJoins.m_iMSlot_iStageId);
  874.         g_oLocalJoins.m_iMSlot_iStageId = 0;
  875.     }
  876.     if(g_oLocalJoins.m_iMSlot_szDatabase>0)
  877.     {
  878.         Join_Destructor(g_oLocalJoins.m_iMSlot_szDatabase);
  879.         g_oLocalJoins.m_iMSlot_szDatabase = 0;
  880.     }
  881.     if(g_oLocalJoins.m_iMSlot_bFirstLaunch>0)
  882.     {
  883.         Join_Destructor(g_oLocalJoins.m_iMSlot_bFirstLaunch);
  884.         g_oLocalJoins.m_iMSlot_bFirstLaunch = 0;
  885.     }
  886.     if(g_oLocalJoins.m_iMSlot_szName>0)
  887.     {
  888.         Join_Destructor(g_oLocalJoins.m_iMSlot_szName);
  889.         g_oLocalJoins.m_iMSlot_szName = 0;
  890.     }
  891.     if(g_oLocalJoins.m_iMSlot_szPass>0)
  892.     {
  893.         Join_Destructor(g_oLocalJoins.m_iMSlot_szPass);
  894.         g_oLocalJoins.m_iMSlot_szPass = 0;
  895.     }
  896.     if(g_oLocalJoins.m_iMSlot_bGameOver)
  897.     {
  898.         Join_Destructor(g_oLocalJoins.m_iMSlot_bGameOver);
  899.         g_oLocalJoins.m_iMSlot_bGameOver = 0;
  900.     }
  901.  
  902.     // Stage join
  903.     if(g_oLocalJoins.m_iStage_szRelief>0)
  904.     {
  905.         Join_Destructor(g_oLocalJoins.m_iStage_szRelief);
  906.         g_oLocalJoins.m_iStage_szRelief = 0;
  907.     }
  908.     if(g_oLocalJoins.m_iStage_iId>0)
  909.     {
  910.         Join_Destructor(g_oLocalJoins.m_iStage_iId);
  911.         g_oLocalJoins.m_iStage_iId = 0;
  912.     }
  913.     if(g_oLocalJoins.m_iStage_iType>0)
  914.     {
  915.         Join_Destructor(g_oLocalJoins.m_iStage_iType);
  916.         g_oLocalJoins.m_iStage_iType = 0;
  917.     }
  918.     if (g_oLocalJoins.m_iStage_iNameId)
  919.     {
  920.         Join_Destructor(g_oLocalJoins.m_iStage_iNameId);
  921.         g_oLocalJoins.m_iStage_iNameId = 0;
  922.     }
  923.     if (g_oLocalJoins.m_iStage_iRaceId)
  924.     {
  925.         Join_Destructor(g_oLocalJoins.m_iStage_iRaceId);
  926.         g_oLocalJoins.m_iStage_iRaceId = 0;
  927.     }
  928.     if (g_oLocalJoins.m_iStage_iRaceNameId)
  929.     {
  930.         Join_Destructor(g_oLocalJoins.m_iStage_iRaceNameId);
  931.         g_oLocalJoins.m_iStage_iRaceNameId = 0;
  932.     }
  933.     if (g_oLocalJoins.m_iStage_fLength)
  934.     {
  935.         Join_Destructor(g_oLocalJoins.m_iStage_fLength);
  936.         g_oLocalJoins.m_iStage_fLength = 0;
  937.     }
  938.     if (g_oLocalJoins.m_iStage_iDay)
  939.     {
  940.         Join_Destructor(g_oLocalJoins.m_iStage_iDay);
  941.         g_oLocalJoins.m_iStage_iDay = 0;
  942.     }
  943.     if (g_oLocalJoins.m_iStage_iNumber)
  944.     {
  945.         Join_Destructor(g_oLocalJoins.m_iStage_iNumber);
  946.         g_oLocalJoins.m_iStage_iNumber = 0;
  947.     }
  948.     // Country join
  949.     if (g_oLocalJoins.m_iCountry_iTgaId)
  950.     {
  951.         Join_Destructor(g_oLocalJoins.m_iCountry_iTgaId);
  952.         g_oLocalJoins.m_iCountry_iTgaId = 0;
  953.     }
  954.  
  955.     // Race join 
  956.     if(g_oLocalJoins.m_iRace_iId>0)
  957.     {
  958.         Join_Destructor(g_oLocalJoins.m_iRace_iId);
  959.         g_oLocalJoins.m_iRace_iId = 0;
  960.     }
  961.     if(g_oLocalJoins.m_iRace_iNameId>0)
  962.     {
  963.         Join_Destructor(g_oLocalJoins.m_iRace_iNameId);
  964.         g_oLocalJoins.m_iRace_iNameId = 0;
  965.     }
  966.     if(g_oLocalJoins.m_iRace_iStageNumber>0)
  967.     {
  968.         Join_Destructor(g_oLocalJoins.m_iRace_iStageNumber);
  969.         g_oLocalJoins.m_iRace_iStageNumber = 0;
  970.     }
  971.     if(g_oLocalJoins.m_iRace_iDay>0)
  972.     {
  973.         Join_Destructor(g_oLocalJoins.m_iRace_iDay);
  974.         g_oLocalJoins.m_iRace_iDay = 0;
  975.     }
  976.     if(g_oLocalJoins.m_iRace_iCountryId>0)
  977.     {
  978.         Join_Destructor(g_oLocalJoins.m_iRace_iCountryId);
  979.         g_oLocalJoins.m_iRace_iCountryId = 0;
  980.     }
  981.     if(g_oLocalJoins.m_iRace_iUciClassStrId>0)
  982.     {
  983.         Join_Destructor(g_oLocalJoins.m_iRace_iUciClassStrId);
  984.         g_oLocalJoins.m_iRace_iUciClassStrId = 0;
  985.     }
  986. }
  987.