home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 July & August / PCWorld_2006-07-08_cd.bin / temacd / planearcade / planearcade.exe / Tank3.bmp / main.cpp < prev    next >
C/C++ Source or Header  |  2004-11-27  |  20KB  |  815 lines

  1.  
  2.  
  3. #include "main.h"
  4.  
  5. //--------------------------
  6. //Globals
  7. //--------------------------
  8. DXFONT DFont;
  9.  
  10. MODEL SkyBoxLeft;
  11. MODEL SkyBoxRight;
  12. MODEL SkyBoxFront;
  13. MODEL SkyBoxBack;
  14. MODEL SkyBoxTop;
  15.  
  16. SOUND *MenuMusic;
  17. SOUND *GameMusic;
  18. float MenuMusicTime = -1.0f;
  19. float GameMusicTime = -1.0f;
  20.  
  21. //--------------------------
  22. //Funkcie
  23. //--------------------------
  24. void InitializeScene();
  25.  
  26. void SetProjectionScene();
  27. void SetProjectionSkyBox();
  28.  
  29. void RenderLensFlares();
  30. PANEL2D Flare;
  31.  
  32. //--------------------------
  33. //HiScore tab - MD5 hash
  34. //--------------------------
  35. int TopScore = 0;
  36. void WriteScore();
  37.  
  38. char* MD5String(char* szString);
  39.  
  40. int writeHighScoreFile(char* randomNumber, char* gameCode, char* score);
  41. bool compareHash(char* hash, char* randomNumber, char* gameCode, char* score);
  42. void hashData(char* randomNumber, char* gameCode, char* score, char* finalHash);
  43.  
  44.  
  45.  
  46. //-----------------------------------------------------------------------------
  47. // Name: Render()
  48. // Desc: Draws the scene
  49. //-----------------------------------------------------------------------------
  50. VOID Render()
  51. {
  52.  
  53.     //begin
  54.     Engine.BeginScene();
  55.  
  56.     //ovladanie 
  57.     Input.RefreshKeyboard();
  58.     Input.RefreshMouse();
  59.     Input.RefreshJoystick();
  60.  
  61.     if      (Input.Mouse.X > Engine.Width)
  62.         SetCursorPos((int) Engine.Width,(int)Input.Mouse.Y);
  63.     else if (Input.Mouse.Y > Engine.Height)
  64.         SetCursorPos((int)Input.Mouse.X,(int) Engine.Height);
  65.     else if (Input.Mouse.X < 0)
  66.         SetCursorPos( 0,(int)Input.Mouse.Y);
  67.     else if (Input.Mouse.Y < 0)
  68.         SetCursorPos((int)Input.Mouse.X,0);
  69.     
  70.         
  71.  
  72.     //obnov svetla
  73.     LightManager.RefreshLights();
  74.  
  75.     ////////
  76.     //Menu//
  77.     ////////
  78.     if (Menu.EnabledMenu == true)
  79.     {
  80.         //hudba
  81.         if (GameMusicTime != -1.0f && MusicEnabled)
  82.         {
  83.             GameMusic->Stop();
  84.             GameMusicTime = -1.0f;
  85.         }
  86.         if (MenuMusicTime == -1.0f && MusicEnabled)
  87.         {
  88.             MenuMusicTime = 0.0f;
  89.         }
  90.         if (MenuMusicTime == 0.0f && MusicEnabled)
  91.         {
  92.             MenuMusic->Play(true);
  93.         }
  94.         MenuMusicTime += PowerTime(0.01f);
  95.         if (MenuMusicTime > 295.0f && MusicEnabled)
  96.         {
  97.             MenuMusicTime = 0.0f;
  98.         }
  99.         
  100.         
  101.         //skry kurzor
  102.         ShowCursor(false);
  103.  
  104.         //obnovi menu
  105.         Menu.Refresh();
  106.  
  107.     }
  108.  
  109.     /////////////
  110.     //Briefring//
  111.     /////////////
  112.     float zFPS = FPS;  //pre casovanie hudby
  113.     if (Menu.EnabledBriefring == true)
  114.     {
  115.         //zvysi FPS - zastavi hru
  116.         FPS = 160000.0f;
  117.     }
  118.         
  119.     ////////
  120.     //Svet//
  121.     ////////
  122.     if (Menu.EnabledMenu == false)
  123.     {
  124.         //hudba
  125.         if (MenuMusicTime != -1.0f && MusicEnabled )
  126.         {
  127.             MenuMusic->Stop();
  128.             MenuMusicTime = -1.0f;
  129.         }
  130.         if (GameMusicTime == -1.0f && MusicEnabled)
  131.         {
  132.             GameMusicTime = 0.0f;
  133.         }
  134.         if (GameMusicTime == 0.0f && MusicEnabled)
  135.         {
  136.             GameMusic->Play(true);
  137.         }
  138.         GameMusicTime += (1000.0f/zFPS) * 0.01f;
  139.         if (GameMusicTime > 480.0f && MusicEnabled)
  140.         {
  141.             GameMusicTime = 0.0f;
  142.         }
  143.     
  144.         //Pridavanie objektov
  145.         Level.ProccesLevel();
  146.  
  147.         //spitfire
  148.         SpitFire.Refresh();
  149.  
  150.         //nastavi projekcnu maticu pre skybox
  151.         SetProjectionSkyBox();
  152.  
  153.         //skybox
  154.         SkyBoxLeft.Pos = Camera.Pos;
  155.         SkyBoxLeft.Pos.Y = Camera.Pos.Y-200.0f;
  156.         SkyBoxLeft.Render();
  157.  
  158.         SkyBoxRight.Pos = Camera.Pos;
  159.         SkyBoxRight.Pos.Y = Camera.Pos.Y-200.0f;
  160.         SkyBoxRight.Render();
  161.  
  162.         SkyBoxFront.Pos = Camera.Pos;
  163.         SkyBoxFront.Pos.Y = Camera.Pos.Y-200.0f;
  164.         SkyBoxFront.Render();
  165.  
  166.         SkyBoxBack.Pos = Camera.Pos;
  167.         SkyBoxBack.Pos.Y = Camera.Pos.Y-200.0f;
  168.         SkyBoxBack.Render();
  169.         
  170.         SkyBoxTop.Pos = Camera.Pos;
  171.         SkyBoxTop.Pos.Y = Camera.Pos.Y-200.0f;
  172.         SkyBoxTop.Render();
  173.  
  174.         //nastavi projektcnu maticiu pre scenu
  175.         SetProjectionScene();
  176.  
  177.         //krajina
  178.         Level.Refresh();
  179.  
  180.         //renderspitfire
  181.         SpitFire.Render1();
  182.  
  183.         //explozie
  184.         Explo.Render();
  185.  
  186.         //renderspitfire - particles
  187.         SpitFire.Render2();
  188.  
  189.         //vyrenderuje flare efekty
  190.         RenderLensFlares();
  191.  
  192.         //vyrenderuj skore napisy
  193.         Score.Refresh();
  194.  
  195.         //vyrenderuje gui
  196.         Menu.DrawGui();
  197.  
  198.         //vyrenderuje mapu
  199.         Menu.DrawMap();
  200.  
  201.         //oznamy
  202.         SpitFire.DrawScreens(); 
  203.  
  204.         //skry kurzor
  205.         ShowCursor(false);
  206.  
  207.         //debug font
  208.         if (SpitFire.ShowFPS)
  209.         {
  210.             char cBuf[80];
  211.             sprintf(cBuf,"FPS: %d",iFPS);
  212.             DFont.Print(20,20,GetColor(1.0f,1.0f,0.0f,0.0f),cBuf);
  213.         }
  214.     
  215.     }
  216.  
  217.     /////////////
  218.     //Briefring//
  219.     /////////////
  220.     if (Menu.EnabledBriefring == true)
  221.     {
  222.         //zobrazi briefring
  223.         Menu.RefreshBriefring();
  224.  
  225.     }
  226.  
  227.     //!!Tento problem vystava iba pri nastaveni grafickej karty
  228.     //!!na slaby vykon, alebo je to tiez dobre kedze na zaciatku
  229.     //!!sa nacitava briefing
  230.     //!!Hack, zoberie silu
  231.     float Power;
  232.     Power = PowerTime(0.001f);
  233.  
  234.     //end
  235.     Engine.EndScene();
  236.  
  237.     //!!Hack ak stagetime == 0.0f+power FPS zvysit!!
  238.     if (Level.StageTime == 0.0f+Power && Menu.EnabledMenu == false)
  239.         FPS = 120.0f;
  240. }
  241.  
  242. //-----------------------------------------------------------------------------
  243. // Name: MsgProc()
  244. // Desc: The window's message handler
  245. //-----------------------------------------------------------------------------
  246. LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
  247. {
  248.     switch( msg )
  249.     {
  250.         case WM_DESTROY:
  251.             PostQuitMessage( 0 );
  252.             return 0;
  253.     }
  254.  
  255.     return DefWindowProc( hWnd, msg, wParam, lParam );
  256. }
  257.  
  258.  
  259.  
  260.  
  261. //-----------------------------------------------------------------------------
  262. // Name: WinMain()
  263. // Desc: The application's entry point
  264. //-----------------------------------------------------------------------------
  265. INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
  266. {
  267.     // Register the window class
  268.     WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
  269.                       GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
  270.                       WinClassName, NULL };
  271.     RegisterClassEx( &wc );
  272.  
  273.  
  274.     //zaciatok logu
  275.     LogStart();
  276.  
  277.     //info o programe
  278.     LogPrint(ProgramInfo);
  279.  
  280.     ///////////////////////
  281.     //PRECITAJ NASTAVENIA//
  282.     ///////////////////////
  283.     ReadConfigData();
  284.  
  285.     ////////////////////////
  286.     //MENITELNE NASTAVENIA//
  287.     ////////////////////////
  288.     
  289.     //SetUp Resotution
  290.     if (Resolution == 0)
  291.     {
  292.         Engine.Width = 640;
  293.         Engine.Height = 480;
  294.     }
  295.     if (Resolution == 1)
  296.     {
  297.         Engine.Width = 800;
  298.         Engine.Height = 600;
  299.     }
  300.     if (Resolution == 2)
  301.     {
  302.         Engine.Width = 1024;
  303.         Engine.Height = 768;
  304.     }
  305.  
  306.     //SetUp Engine
  307.     Engine.Windowed = false;
  308.     Engine.Format =  D3DFMT_R5G6B5;
  309.     Engine.TextureFormat = D3DFMT_A8R8G8B8;
  310.     Engine.TextureCreatingFlag = D3DPOOL_DEFAULT;
  311.     Engine.Min = 10.0f;
  312.     Engine.Max = (float)DrawDistance;
  313.     Engine.BackColor = GetColor(1.0f,1.0f,1.0f,1.0f);
  314.  
  315.     //nastav frustrum culling camery
  316.     Camera.MaxDis = (float)DrawDistance;
  317.  
  318.     //stencil tiene
  319.     if (Shadows == 0)
  320.         Engine.StencilShadows = false;
  321.     else if (Shadows == 1)
  322.         Engine.StencilShadows = true;
  323.  
  324.  
  325.     ////////////////////////////
  326.     //nastav okno pre windowed//
  327.     ////////////////////////////
  328.     if(Engine.Windowed == true)
  329.     {
  330.         hWnd = CreateWindow( WinClassName, WinClassTittle,
  331.                              WS_OVERLAPPEDWINDOW,
  332.                              100, 100,Engine.Width, Engine.Height,
  333.                              GetDesktopWindow(), NULL, wc.hInstance, NULL );
  334.     }
  335.  
  336.     //////////////////////////////
  337.     //nastav okno pre fullscreen//
  338.     //////////////////////////////
  339.     if(Engine.Windowed == false)
  340.     {
  341.          hWnd = CreateWindowEx(    WS_EX_APPWINDOW,        // Extended Style For The Window
  342.                                 WinClassName,            // Class Name
  343.                                 WinClassTittle,    // Window Title
  344.                                 WS_POPUP |            // Defined Window Style
  345.                                 WS_CLIPSIBLINGS |    // Required Window Style
  346.                                 WS_CLIPCHILDREN,    // Required Window Style
  347.                                 0, 0,                // Window Position
  348.                                 Engine.Width,        // Calculate Window Width
  349.                                 Engine.Height,        // Calculate Window Height
  350.                                 NULL,                // No Parent Window
  351.                                 NULL,                // No Menu
  352.                                 wc.hInstance,        // Instance
  353.                                 NULL);                // Dont Pass Anything To WM_CREATE
  354.     }
  355.  
  356.  
  357.     
  358.     hIns = hInst;
  359.  
  360.     
  361.     ////////////////////////////////////
  362.     //Nastavenia ktore sa nedaju menit//
  363.     ////////////////////////////////////
  364.  
  365.     //Initialize engine
  366.     Engine.Initialize();
  367.     Engine.SetZBuffer(true);
  368.     Engine.SetFilter(0,D3DTEXF_LINEAR);
  369.     Engine.SetFilter(1,D3DTEXF_LINEAR);
  370.     Engine.SetCullMode(D3DCULL_NONE);
  371.     Engine.SetShadeMode(D3DSHADE_GOURAUD);    
  372.  
  373.     Engine.SetMipMapping(0,true);
  374.     Engine.SetMipMapping(1,true);
  375.     Engine.MipMapLevels = 0;
  376.  
  377.     //directInput
  378.     Input.Initialize();
  379.  
  380.     //zvuk
  381.     InitializeSound();
  382.  
  383.     //zobrazi okno
  384.     ShowWindow( hWnd, SW_SHOWDEFAULT );
  385.     UpdateWindow( hWnd );
  386.  
  387.     //vstup do Message slucky
  388.     MSG msg;
  389.     ZeroMemory( &msg, sizeof(msg) );
  390.  
  391.     //inicializacia svetiel pre lightmanager
  392.     LightManager.Initialize(1);
  393.  
  394.     //debug font 
  395.     DFont.Create(15,FW_BOLD,"Arial");
  396.  
  397.     //editor
  398.     Editor.Initialize();
  399.  
  400.     ///////////////////////
  401.     //Inicializacia Sceny//
  402.     ///////////////////////
  403.     InitializeScene();
  404.     
  405.     ////////////////
  406.     //message loop//
  407.     ////////////////
  408.     while( msg.message!=WM_QUIT )
  409.     {
  410.        if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
  411.        {
  412.            TranslateMessage( &msg );
  413.            DispatchMessage( &msg );
  414.        }
  415.        else
  416.        {
  417.           Render();
  418.           //Editor.RefreshEditor();
  419.        }
  420.     }
  421.  
  422.     /////////////////
  423.     //Destroy sceny//
  424.     /////////////////
  425.  
  426.     //znic level
  427.     Level.Destroy();
  428.  
  429.     //vymaze svetla
  430.     LightManager.CleanUp();
  431.  
  432.     //ukonci direct Input
  433.     Input.CleanUp();
  434.  
  435.     //Hudba
  436.     if (MusicEnabled)
  437.     {
  438.         delete [] MenuMusic;
  439.         delete [] GameMusic;
  440.     }
  441.  
  442.     //ukonci zvuk
  443.     CleanUpSound();
  444.  
  445.     //Ukonci Engine
  446.     Engine.CleanUp(); 
  447.  
  448.     //zapise score
  449.     WriteScore();
  450.  
  451.     //znici okno
  452.     UnregisterClass( WinClassName, wc.hInstance );
  453.     return 0;
  454. }
  455.  
  456. //-----------------------------------------------------------------------------
  457. // Name: InitializeScene()
  458. // Desc: nastavy krajinu, svetla, ..
  459. //-----------------------------------------------------------------------------
  460. void InitializeScene()
  461. {
  462.  
  463.     //nastav menu
  464.     //---------------
  465.     Menu.Initialize();
  466.  
  467.     //skore
  468.     //-----
  469.     Score.Initialize();
  470.  
  471.     //Svetla
  472.     //------
  473.     LightManager.AddLightDir(Get3D(-1.5f,-1.0f,-1.5f),GetColor(1.6f,1.6f,1.6f,1.6f),
  474.                                                     GetColor(0.3f,0.3f,0.3f,0.3f),
  475.                                                     GetColor(1.0f,1.0f,1.0f,1.0f));
  476.  
  477.     //Hmla
  478.     //----
  479.     g_pd3dDevice->SetRenderState(D3DRS_FOGCOLOR, 0xffffffff );
  480.  
  481.     g_pd3dDevice->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_LINEAR);
  482.     g_pd3dDevice->SetRenderState(D3DRS_FOGSTART, FtoDW((float)DrawDistance*0.50f));
  483.     g_pd3dDevice->SetRenderState(D3DRS_FOGEND,   FtoDW((float)DrawDistance*0.75f));
  484.     
  485.     
  486.     //skyBox
  487.     //--------
  488.     Menu.DrawLoading(1,"Loading SkyBox");
  489.  
  490.     
  491.     SkyBoxLeft.FrustrumTest = false;
  492.     SkyBoxLeft.Lighting = false;
  493.     SkyBoxLeft.InitializeAse(1,"scene/skyboxleft.ase");
  494.     SkyBoxLeft.LoadAse(0,"scene/skyboxleft.ase");
  495.     SkyBoxLeft.LoadTexture("scene/sleft.jpg",GetColor(0.0f,0.0f,0.0f));
  496.     SkyBoxLeft.Sca = Get3D(250.0f,200.0f,250.0f);
  497.  
  498.     SkyBoxRight.FrustrumTest = false;
  499.     SkyBoxRight.Lighting = false;
  500.     SkyBoxRight.InitializeAse(1,"scene/skyboxRight.ase");
  501.     SkyBoxRight.LoadAse(0,"scene/skyboxRight.ase");
  502.     SkyBoxRight.LoadTexture("scene/sRight.jpg",GetColor(0.0f,0.0f,0.0f));
  503.     SkyBoxRight.Sca = Get3D(250.0f,200.0f,250.0f);
  504.  
  505.     SkyBoxFront.FrustrumTest = false;
  506.     SkyBoxFront.Lighting = false;
  507.     SkyBoxFront.InitializeAse(1,"scene/skyboxFront.ase");
  508.     SkyBoxFront.LoadAse(0,"scene/skyboxFront.ase");
  509.     SkyBoxFront.LoadTexture("scene/sFront.jpg",GetColor(0.0f,0.0f,0.0f));
  510.     SkyBoxFront.Sca = Get3D(250.0f,200.0f,250.0f);
  511.  
  512.     SkyBoxBack.FrustrumTest = false;
  513.     SkyBoxBack.Lighting = false;
  514.     SkyBoxBack.InitializeAse(1,"scene/skyboxBack.ase");
  515.     SkyBoxBack.LoadAse(0,"scene/skyboxBack.ase");
  516.     SkyBoxBack.LoadTexture("scene/sBack.jpg",GetColor(0.0f,0.0f,0.0f));
  517.     SkyBoxBack.Sca = Get3D(250.0f,200.0f,250.0f);
  518.  
  519.     SkyBoxTop.FrustrumTest = false;
  520.     SkyBoxTop.Lighting = false;
  521.     SkyBoxTop.InitializeAse(1,"scene/skyboxTop.ase");
  522.     SkyBoxTop.LoadAse(0,"scene/skyboxTop.ase");
  523.     SkyBoxTop.LoadTexture("scene/sTop.jpg",GetColor(0.0f,0.0f,0.0f));
  524.     SkyBoxTop.Sca = Get3D(250.0f,200.0f,250.0f);
  525.  
  526.     Flare.Create(128,128,4);
  527.     Flare.RelativeMode = true;
  528.     Flare.AddFrame("scene/lens1.jpg",GetColor(1,0,0,0));
  529.     Flare.AddFrame("scene/lens2.jpg",GetColor(1,0,0,0));
  530.     Flare.AddFrame("scene/lens3.jpg",GetColor(1,0,0,0));
  531.     Flare.AddFrame("scene/lens4.jpg",GetColor(1,0,0,0));
  532.     
  533.     //stencil
  534.     //------------
  535.     Menu.DrawLoading(1,"Initalizing StencilShadow");
  536.  
  537.     StencilShadow.Initialize();
  538.         
  539.     //modely
  540.     //------
  541.     Menu.DrawLoading(2,"Loading Models");
  542.  
  543.     ModelLib.Initialize();
  544.  
  545.     //zvuky
  546.     //-----
  547.     Menu.DrawLoading(4,"Loading Sounds");
  548.  
  549.     SoundLib.Initialize();
  550.  
  551.     //SpitFire
  552.     //--------------
  553.     Menu.DrawLoading(5,"Loading SpitFire");
  554.  
  555.     SpitFire.Initialize();
  556.  
  557.     //svet
  558.     //-----
  559.     Menu.DrawLoading(6,"Initializing World");
  560.  
  561.     Level.Initialize();
  562.     
  563.     //Particles
  564.     //------------
  565.     Menu.DrawLoading(8,"Initializing Particle Systems");
  566.  
  567.     Explo.Initialize();
  568.  
  569.     //Hudba
  570.     //---------
  571.     if (MusicEnabled == 1)
  572.     {
  573.         MenuMusic = new SOUND;
  574.         GameMusic = new SOUND;
  575.  
  576.         MenuMusic->InitialiseForMP3();
  577.         MenuMusic->LoadSound("sounds/menumusic.mp3");
  578.         GameMusic->InitialiseForMP3();
  579.         GameMusic->LoadSound("sounds/gamemusic.mp3");
  580.     }
  581.  
  582.     
  583. }
  584.  
  585.  
  586. //-----------------------------------------------------------------------------
  587. // Name: SetProjectionScene()
  588. // Desc: nastavi projekcnu maticu pre renderovanie sceny
  589. //-----------------------------------------------------------------------------
  590. void SetProjectionScene()
  591. {
  592.     D3DXMatrixPerspectiveFovLH( &matProj, 4.0f/3.0f,1.0f,Engine.Min, Engine.Max);
  593.     g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
  594. }
  595.  
  596. //-----------------------------------------------------------------------------
  597. // Name: SetProjectionSkyBox()
  598. // Desc: nastavi projekcnu maticu pre renderovanie skyboxu
  599. //-----------------------------------------------------------------------------
  600. void SetProjectionSkyBox()
  601. {
  602.     D3DXMatrixPerspectiveFovLH( &matProj, 4.0f/3.0f, 1.0f,Engine.Min, 25000);
  603.     g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
  604. }
  605.  
  606.  
  607. //-----------------------------------------------------------------------------
  608. // Name: RenderLensFlares()
  609. // Desc: renderuje lens flare efekty
  610. //-----------------------------------------------------------------------------
  611. void RenderLensFlares()
  612. {
  613.     VECTOR3D SunPosition;
  614.     SunPosition.X = Camera.Pos.X + 1000.0f;
  615.     SunPosition.Y = Camera.Pos.Y + 575.0f;
  616.     SunPosition.Z = Camera.Pos.Z + 1000.0f;
  617.  
  618.     VECTOR3D Sun = Project(SunPosition);
  619.  
  620.     if (Sun.X == -1000.0f || Sun.Y == -1000.0f)
  621.         return;
  622.  
  623.     Sun.X = (800.0f/Engine.Width)*Sun.X;
  624.     Sun.Y = (600.0f/Engine.Height)*Sun.Y;
  625.  
  626.     VECTOR3D Center = Get3D(400.0f,300.0f,0.0f);
  627.  
  628.     VECTOR3D Vector;
  629.     Vector.X = Sun.X-Center.X;
  630.     Vector.Y = Sun.Y-Center.Y;
  631.     Vector.Z = Sun.Z-Center.Z;
  632.  
  633.     float Length = Absolute(Vector);
  634.     Normalize(&Vector);
  635.  
  636.     Engine.SetBlendCustom(D3DBLEND_SRCCOLOR,D3DBLEND_ONE);
  637.  
  638.     Flare.Frame = 0.0f;
  639.     Flare.Pos.X = Center.X + Vector.X*(Length/1.0f);
  640.     Flare.Pos.Y = Center.Y + Vector.Y*(Length/1.0f);
  641.     Flare.Pos.Z = 0.0f;
  642.     Flare.Scale = 2.0f;
  643.     Flare.Render();
  644.     Flare.Render();
  645.  
  646.     Flare.Frame = 1.0f;
  647.     Flare.Pos.X = Center.X + Vector.X*(Length/2.0f);
  648.     Flare.Pos.Y = Center.Y + Vector.Y*(Length/2.0f);
  649.     Flare.Pos.Z = 0.0f;
  650.     Flare.Scale = 0.5f;
  651.     Flare.Render();
  652.     Flare.Render();
  653.  
  654.     Flare.Frame = 0.0f;
  655.     Flare.Pos.X = Center.X + Vector.X*(Length/3.0f);
  656.     Flare.Pos.Y = Center.Y + Vector.Y*(Length/3.0f);
  657.     Flare.Pos.Z = 0.0f;
  658.     Flare.Scale = 0.25f;
  659.     Flare.Render();
  660.     Flare.Render();
  661.  
  662.     Flare.Frame = 2.0f;
  663.     Flare.Pos.X = Center.X + Vector.X*(Length/8.0f);
  664.     Flare.Pos.Y = Center.Y + Vector.Y*(Length/8.0f);
  665.     Flare.Pos.Z = 0.0f;
  666.     Flare.Scale = 0.7f;
  667.     Flare.Render();
  668.     Flare.Render();
  669.  
  670.     Flare.Frame = 3.0f;
  671.     Flare.Pos.X = Center.X + Vector.X*(-Length/2.0f);
  672.     Flare.Pos.Y = Center.Y + Vector.Y*(-Length/2.0f);
  673.     Flare.Pos.Z = 0.0f;
  674.     Flare.Scale = 0.5f;
  675.     Flare.Render();
  676.     Flare.Render();
  677.  
  678.     Flare.Frame = 2.0f;
  679.     Flare.Pos.X = Center.X + Vector.X*(-Length/4.0f);
  680.     Flare.Pos.Y = Center.Y + Vector.Y*(-Length/4.0f);
  681.     Flare.Pos.Z = 0.0f;
  682.     Flare.Scale = 0.45f;
  683.     Flare.Render();
  684.     Flare.Render();
  685.  
  686.     Flare.Frame = 1.0f;
  687.     Flare.Pos.X = Center.X + Vector.X*(-Length/5.5f);
  688.     Flare.Pos.Y = Center.Y + Vector.Y*(-Length/5.5f);
  689.     Flare.Pos.Z = 0.0f;
  690.     Flare.Scale = 0.35f;
  691.     Flare.Render();
  692.     Flare.Render();
  693.  
  694.     Engine.SetBlendNone();
  695. }
  696.  
  697. //=========================================================
  698. //
  699. //
  700. // MD5 HASH
  701. //=========================================================
  702.  
  703. void WriteScore()
  704. {
  705.  
  706.     //------------------
  707.     // Nacitaj score
  708.     //------------------
  709.     int iInScore;
  710.     char InScore[80];
  711.     char InRandom[80];
  712.     char InHash[80];
  713.  
  714.     FILE *FileIn = NULL;
  715.     FileIn = fopen("models/structures/tank3destroy.bmp","r");
  716.     if (FileIn == NULL)
  717.         LogPrint("Nemozem otvorit score subor");
  718.  
  719.     fscanf(FileIn,"%s %s %s",InScore,InRandom,InHash);
  720.  
  721.     sscanf(InScore,"%d",&iInScore);
  722.  
  723.     //zisti pravdivost hashu
  724.     if (compareHash(InHash,InRandom,"PlaneArcade",InScore) == false
  725.         && iInScore != 0)
  726.     {
  727.         LogPrint("Chybn² hash");
  728.         return;
  729.     }
  730.  
  731.     fclose(FileIn);
  732.  
  733.     //porovnaj nahrate score s nacitanym score
  734.     if (TopScore <= iInScore)
  735.         return;
  736.  
  737.  
  738.     //vygeneruj hash
  739.     char OutScore[80];
  740.     char OutRandom[80];
  741.     char OutHash[80];
  742.  
  743.     sprintf(OutScore,"%d",TopScore);
  744.     sprintf(OutRandom,"%d",rand());
  745.  
  746.     //zapise do suboru nove hodnoty
  747.     hashData(OutRandom,"PlaneArcade",OutScore,OutHash);
  748.     FILE *OutFile;
  749.     OutFile = fopen("models/structures/tank3destroy.bmp","w");
  750.     fprintf(OutFile,"%s %s %s",OutScore,OutRandom,OutHash);
  751.     fclose(OutFile);
  752.  
  753.     //vygeneruje htm subor
  754.     writeHighScoreFile(OutRandom,"PlaneArcade",OutScore);
  755.  
  756.  
  757. }
  758.  
  759.  
  760. // funkce vracφ °et∞zec finalHash kter² obsahuje v²skledn² hash, ten se dß pak porovnßvat spoleΦn∞ s
  761. // hodnotami hry (skore, kod hry) a funkce compareHash jednoznaΦn∞ °ekne jestli jsou hodnoty pravdivnΘ
  762. void hashData(char* randomNumber, char* gameCode, char* score, char* finalHash)
  763. {
  764.  
  765.     char randomHash[33];    // Nßhodn² "mezi-hash" vygenerovan² z nßhodnΘho Φφsla a n∞jak²ch znak∙...
  766.     char outputTemp[255];    // V²sledn² MD5 hash vÜech dat
  767.  
  768.     // Vygeneruje nahodil² "mezi-hash" kter² nßm zv∞tÜφ nßhodu a taky ud∞lß proces prolomenφ slo₧it∞jÜφm
  769.     sprintf(randomHash, "%s", MD5String(randomNumber));
  770.  
  771.     // Do doΦasnΘ prom∞nnΘ za sebe nasklßdßme nßhodn² hash, k≤d hry(tabulky), skore a jmeno hrace
  772.     sprintf(outputTemp, "3df32%s21fds1%sF5A4f%sAd_5:", randomHash, gameCode, score);
  773.     // Hashneme tyto udaje a dostaneme tak jedinecny kod, kter² podobne
  774.     // vygenerujeme na serveru a porovname s poslanymi udaji a hashem
  775.     sprintf(finalHash, "%s", MD5String(outputTemp));
  776. }
  777.  
  778.  
  779. bool compareHash(char* hash, char* randomNumber, char* gameCode, char* score)
  780. {
  781.     char compareHash[33];    // V²sledn² MD5 hash vÜech dat
  782.     hashData(randomNumber, gameCode, score, compareHash);
  783.  
  784.     if(strcmp(hash, compareHash) == 0)
  785.         return true;
  786.     
  787.     return false;
  788. }
  789.  
  790.  
  791. int writeHighScoreFile(char* randomNumber, char* gameCode, char* score)
  792. {
  793.     char outputHash[33];    // V²sledn² MD5 hash vÜech dat
  794.     char outputTemp[255];    // V²sledn² MD5 hash vÜech dat
  795.     
  796.  
  797.     // Hashneme tyto udaje a dostaneme tak jedinecny kod, kter² podobne
  798.     // vygenerujeme na serveru a porovname s poslanymi udaji a hashem
  799.     hashData(randomNumber, gameCode, score, outputHash);
  800.  
  801.     
  802.     // V²pis ladφcφch informacφ do konzole
  803.     //printf("RAND#: %s\nRANDhash: %s\nScore: %s\nFinalHash: %s\n", randomNumber, randomHash, score,  outputHash);
  804.  
  805.     sprintf(outputTemp, "http://3dgamesdev.com/uploadscore/write.php?action=%s&game=%s&id=%s&score=%s&version=%s", outputHash, gameCode, randomNumber, score, ProgramVersion); 
  806.  
  807.     // ZapφÜeme vÜe do URL dotazu do HTML souboru
  808.     FILE* HTMLout = fopen("upload score.htm", "w");
  809.         fprintf(HTMLout, "<html><head><meta http-equiv=\"refresh\" content=\"0; url=%s\"><title>Upload score</title></head><body><h2>VyΦkejte prosφm</h2><h3>Nahrßvßm score...</h3></body></html>", outputTemp);
  810.     fclose(HTMLout);
  811.  
  812.     return 0;
  813. }
  814.  
  815.