home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / WD_SRC.ZIP / SOURCE / LASTWOLF.CPP < prev    next >
C/C++ Source or Header  |  1995-01-30  |  10KB  |  449 lines

  1. #include "..\Source\LastWolf.hpp"
  2.  
  3.  
  4. int mike_new_handler( size_t t );
  5. void OnExit();
  6.  
  7. extern Fixed topY, bottomY;
  8.  
  9.  
  10. void main(int argc, char *argv[])
  11. {
  12.     BspCommandLine commandLine;
  13.  
  14.     WORD sizeSpeed = 4;
  15.     WORD moveSpeed = 15;
  16.  
  17.     char screenMessage[256];
  18.  
  19.     WORD frames=0;
  20.     BOOL bMessageOn=TRUE, bFrontAndBack = FALSE;
  21.     
  22.     WORD allTextureLength = 64;
  23.     WORD i;
  24.     
  25. #ifdef DOS
  26.     // Stuff for the mouse.
  27.     WORD mouseX, mouseY;
  28.     WORD lastX=0, lastY=0;
  29.     BOOL bButton1, bButton2;
  30.  
  31.     lastX = 320;
  32.     lastY = 200/2;
  33.  
  34.     m_SetMousePos( 320, 200/2 );
  35. #endif
  36.     
  37.     _set_new_handler( mike_new_handler );
  38.     atexit( OnExit );
  39.     
  40.     curLevel.pLines = new CLineArray;
  41.     curLevel.pPoints = new CPointArray;
  42.     
  43.     player.xPos=0;
  44.     player.yPos=0;
  45.     player.facingAngle=0;
  46.  
  47.     bBlackAndWhite=FALSE;
  48.  
  49.     ProcessCommandLine( argc, argv, &commandLine );
  50.  
  51.     curLevel.pRootLine = GenerateBspTree( &commandLine, curLevel.pLines, curLevel.pPoints );
  52.     if( curLevel.pRootLine == NULL )
  53.     {
  54.         printf("\a");
  55.         return;
  56.     }
  57.  
  58.  
  59.     s_Init();
  60.     s_MinX = 0;
  61.     s_MaxX = s_Width;
  62.     s_MinY = 0;
  63.     s_MaxY = s_Height;
  64.     s_DrawWidth = s_Width;
  65.     s_DrawHeight = s_Height;
  66.  
  67.     dr_InitTables();
  68.     dr_GenerateLookups();
  69.  
  70. #ifdef DOS
  71. #ifndef PALETTE_MAPS
  72.     if( commandLine.bLoadDoomTextures )
  73.         s_SetPalette( curLevel.palette );
  74. #endif
  75. #endif
  76.     
  77.     t_StartTimer();
  78.  
  79.     // Keep looping and drawing...
  80.     while(1)
  81.     {
  82.         if( kbhit() )
  83.         {
  84.             switch( toupper(getch()) )
  85.             {
  86.                 case '?':
  87.                     bFrontAndBack = !bFrontAndBack;
  88.                     s_Clear(0);
  89.                     s_Draw();
  90.                     s_Clear(0);
  91.                     s_Draw();
  92.                        break;
  93.                     
  94.                 case '/':
  95.                     if( curLevel.idCurSky == curLevel.idSky1 )
  96.                         curLevel.idCurSky = curLevel.idSky2;
  97.                     else if( curLevel.idCurSky == curLevel.idSky2 )
  98.                         curLevel.idCurSky = curLevel.idSky3;
  99.                     else if( curLevel.idCurSky == curLevel.idSky3 )
  100.                         curLevel.idCurSky = curLevel.idSky1;
  101.                     break;                    
  102.                     
  103.                 case '0':
  104.                     ResetVideoMode(0);
  105.                     dr_GenerateLookups();
  106.                     break;
  107.                     
  108.                 case '1':
  109.                     ResetVideoMode(1);
  110.                     dr_GenerateLookups();
  111.                     break;
  112.                     
  113.                 case '2':
  114.                     ResetVideoMode(2);
  115.                     dr_GenerateLookups();
  116.                     break;
  117.                     
  118.                 case '3':
  119.                     ResetVideoMode(3);
  120.                     dr_GenerateLookups();
  121.                     break;
  122.                     
  123.                 case '4':
  124.                     ResetVideoMode(4);
  125.                     dr_GenerateLookups();
  126.                     break;
  127.                 
  128.                 case 'T':
  129.                     // Reset the fps calculations.
  130.                     timeCount=0;
  131.                     frames=0;
  132.                     break;    
  133.                 
  134.                 case 'Z':
  135.                     allTextureLength -= 3;
  136.                     for( i=0; i < curLevel.pLines->NumElements(); i++ )
  137.                         curLevel.pLines->GetLine(i)->SetTextureXLength(allTextureLength);
  138.                     break;
  139.                                     
  140.                 case 'X':
  141.                     allTextureLength += 3;
  142.                     for( i=0; i < curLevel.pLines->NumElements(); i++ )
  143.                         curLevel.pLines->GetLine(i)->SetTextureXLength(allTextureLength);
  144.                     break;
  145.                                     
  146.                 case 'M':
  147.                     bMessageOn = !bMessageOn;
  148.                     break;
  149.                 
  150.                 case '-':
  151.                     if( s_MinX != (s_Width/2)-50 )
  152.                     {
  153.                         s_MinX += sizeSpeed;
  154.                         s_MaxX -= sizeSpeed;
  155.                         s_MinY += sizeSpeed;
  156.                         s_MaxY -= sizeSpeed;
  157.                         
  158.                         s_DrawWidth = s_MaxX - s_MinX;
  159.                         s_DrawHeight = s_MaxY - s_MinY;
  160.                         
  161.                         s_Clear(0);
  162.                         s_Draw();
  163.                         s_Clear(0);
  164.                         s_Draw();
  165.                     
  166.                         dr_GenerateLookups();
  167.                     }
  168.                     break;    
  169.                 
  170.                 case '+':
  171.                     if( s_MaxX != s_Width )
  172.                     {
  173.                         s_MinX -= sizeSpeed;
  174.                         s_MaxX += sizeSpeed;
  175.                         s_MinY -= sizeSpeed;
  176.                         s_MaxY += sizeSpeed;
  177.                         
  178.                         s_DrawWidth = s_MaxX - s_MinX;
  179.                         s_DrawHeight = s_MaxY - s_MinY;
  180.                         
  181.                         s_Clear(0);
  182.                         s_Draw();
  183.                         s_Clear(0);
  184.                         s_Draw();
  185.                     
  186.                         dr_GenerateLookups();
  187.                     }
  188.                     break;    
  189.                 
  190.                 case 'V':
  191.                     break;
  192.                 
  193.                 case ';':
  194.                     zFadeOut -= 10;
  195.                     if( zFadeOut < 10 )
  196.                         zFadeOut = 10;
  197.                     break;
  198.                 
  199.                 case ''':
  200.                     zFadeOut += 10;
  201.                     break;
  202.                 
  203.                 case '[':
  204.                     ++parallaxMap;
  205.                     if( parallaxMap == (nPaletteMaps-1) )
  206.                         parallaxMap = 0;
  207.                     break;
  208.                 
  209.                 case ']':
  210.                     --parallaxMap;
  211.                     if( parallaxMap == 0 )
  212.                         parallaxMap = nPaletteMaps-2;
  213.                     break;
  214.                     
  215.                 case 'U':
  216.                     topY += FIXED_ONE;
  217.                     bottomY += FIXED_ONE;
  218.                     break;
  219.                 
  220.                 case 'I':
  221.                     topY -= FIXED_ONE;
  222.                     bottomY -= FIXED_ONE;
  223.                     break;
  224.                 
  225.                 case 'H':
  226.                     topY += FIXED_ONE;
  227.                     break;
  228.                 
  229.                 case 'J':
  230.                     topY -= FIXED_ONE;
  231.                     break;
  232.                     
  233.                 case 'A':
  234.                     player.xPos -= W_UNFIX(SAFE_SIN(player.facingAngle + HALF_PI) * moveSpeed);
  235.                     player.yPos -= W_UNFIX(SAFE_COS(player.facingAngle + HALF_PI) * moveSpeed);
  236.                     
  237.                     #ifndef DOS
  238.                         printf("Moving left.\n");
  239.                     #endif
  240.                     
  241.                     break;
  242.                 
  243.                 case 'S':
  244.                     player.xPos -= W_UNFIX(SAFE_SIN(player.facingAngle) * moveSpeed);
  245.                     player.yPos -= W_UNFIX(SAFE_COS(player.facingAngle) * moveSpeed);
  246.                     
  247.                     #ifndef DOS
  248.                         printf("Moving back.\n");
  249.                     #endif
  250.                     
  251.                     break;
  252.  
  253.                 case 'D':
  254.                     player.xPos -= W_UNFIX(SAFE_SIN(player.facingAngle - HALF_PI) * moveSpeed);
  255.                     player.yPos -= W_UNFIX(SAFE_COS(player.facingAngle - HALF_PI) * moveSpeed);
  256.                     
  257.                     #ifndef DOS
  258.                         printf("Moving right.\n");
  259.                     #endif
  260.                     
  261.                     break;
  262.  
  263.                 case 'W':
  264.                     player.xPos += W_UNFIX(SAFE_SIN(player.facingAngle) * moveSpeed);
  265.                     player.yPos += W_UNFIX(SAFE_COS(player.facingAngle) * moveSpeed);
  266.                     
  267.                     #ifndef DOS
  268.                         printf("Moving forward.\n");
  269.                     #endif
  270.                     
  271.                     break;
  272.                 
  273.                 case 'R':
  274.                     player.facingAngle = (player.facingAngle + 10) & ANGLE_MASK;
  275.                     
  276.                     #ifndef DOS
  277.                         printf("Rotating right.\n");
  278.                     #endif
  279.                     
  280.                     break;
  281.  
  282.                 case 'F':
  283.                     player.facingAngle = (player.facingAngle - 10) & ANGLE_MASK;
  284.                     
  285.                     #ifndef DOS
  286.                         printf("Rotating left.\n");
  287.                     #endif
  288.                     
  289.                     break;
  290.                 
  291.                 case '.':
  292.                     ++moveSpeed;
  293.                     break;
  294.                 
  295.                 case ',':
  296.                     --moveSpeed;
  297.                     break;
  298.                 
  299.                 case 'P':
  300.                     bDisplayProjectionPoints = !bDisplayProjectionPoints;
  301.                     break;
  302.                 
  303.                 case 'B':
  304.                     bBlackAndWhite = !bBlackAndWhite;
  305.                     
  306.                     #ifndef DOS
  307.                         printf("Switching black&white toggle.\n");
  308.                     #endif
  309.                     
  310.                     break;
  311.                 
  312.                 case 'Q':
  313.                     goto QUIT;
  314.                     break;
  315.             }
  316.             
  317.         }
  318.  
  319.  
  320. #ifdef DOS
  321.            m_GetMousePos( &mouseX, &mouseY, &bButton1, &bButton2 );
  322.            
  323.            // Change their rotation based on X.
  324.            player.facingAngle = (player.facingAngle - (lastX - mouseX)) & ANGLE_MASK;
  325.            
  326.            // Move them based on Y.
  327.         player.xPos += W_UNFIX(SAFE_SIN(player.facingAngle) * (lastY-mouseY) );
  328.         player.yPos += W_UNFIX(SAFE_COS(player.facingAngle) * (lastY-mouseY) );
  329.            
  330.            lastX = mouseX;
  331.            lastY = mouseY;
  332.            
  333.            // If button 1 is down, move them forward.
  334.            if( bButton1 )
  335.           {
  336.             player.xPos += W_UNFIX(SAFE_SIN(player.facingAngle) * moveSpeed);
  337.             player.yPos += W_UNFIX(SAFE_COS(player.facingAngle) * moveSpeed);
  338.         }           
  339.            
  340.            // Put the mouse in the center if it's off the screen.
  341.            if( mouseX >= (320*2-3) || mouseX == 0 || mouseY >= (200-3) || mouseY == 0 )
  342.            {
  343.                lastX = 320;
  344.             lastY = 200/2;
  345.  
  346.             m_SetMousePos( 320, 200/2 );
  347.         }
  348. #endif
  349.             
  350.         if( bFrontAndBack )
  351.         {
  352.             // Front.
  353.             s_MinX = 0;
  354.             s_MaxX = s_Width;
  355.             s_MinY = 0;
  356.             s_MaxY = s_Height/2 - 1;
  357.                         
  358.             s_DrawWidth = s_MaxX - s_MinX;
  359.             s_DrawHeight = s_MaxY - s_MinY;
  360.                     
  361.             dr_DrawScreen();
  362.             s_DrawRegion( s_MinX, s_MinY, s_MaxX, s_MaxY, s_MinX, s_MinY );
  363.  
  364.             // Back.
  365.             player.facingAngle = (player.facingAngle + PI) & ANGLE_MASK;
  366.  
  367.             dr_DrawScreen();
  368.             s_DrawRegion( s_MinX, s_MinY, s_MaxX, s_MaxY, s_MinX, s_Height / 2 + 1 );
  369.  
  370.             player.facingAngle = (player.facingAngle + PI) & ANGLE_MASK;
  371.         }
  372.         else
  373.         {
  374.             dr_DrawScreen();
  375.  
  376.             // If the screen is small, draw a border.
  377.             if( s_DrawWidth != s_Width )
  378.             {
  379.                 dr_DrawLine( s_MinX, s_MinY, s_MaxX, s_MinY, s_Width, s_Height, 30 );
  380.                 dr_DrawLine( s_MinX, s_MinY, s_MinX, s_MaxY, s_Width, s_Height, 30 );
  381.                 dr_DrawLine( s_MaxX, s_MinY, s_MaxX, s_MaxY, s_Width, s_Height, 30 );
  382.                 dr_DrawLine( s_MinX, s_MaxY, s_MaxX, s_MaxY, s_Width, s_Height, 30 );
  383.             }
  384.             
  385.             if( bMessageOn )
  386.             {
  387.                 sprintf( screenMessage, "FPS: %d  W: %d  H: %d", (WORD)((float)frames / ((float)timeCount/ 182.0F)), s_MaxX-s_MinX, s_MaxY-s_MinY );
  388.                 s_BlitString( s_MinX+5, s_MaxY-20, 35, screenMessage, TRUE );
  389.     
  390.                 sprintf( screenMessage, "X:   %d  Y: %d  A: %d", player.xPos, player.yPos, player.facingAngle );
  391.                 s_BlitString( s_MinX+5, s_MaxY-10, 35, screenMessage, TRUE );
  392.             }
  393.         }
  394.     
  395.             if( s_MaxX == s_Width )
  396.                 s_Draw();
  397.             else
  398.                 s_DrawRegion( s_MinX-1, s_MinY-1, s_MaxX+1, s_MaxY+1, s_MinX, s_MinY );
  399.             
  400.             ++frames;
  401.     }
  402.  
  403.  
  404. QUIT:;
  405.     
  406.     t_EndTimer();
  407.  
  408.     curLevel.pLines->UnAllocateElements();
  409.     curLevel.pPoints->UnAllocateElements();
  410.     
  411.     delete curLevel.pLines;
  412.     delete curLevel.pPoints;    
  413.  
  414.     if( commandLine.bLoadDoomTextures )
  415.         tx_UnloadTextures();
  416.     
  417.  
  418.     s_Clear(0);
  419.     s_Draw();
  420.     s_UnInit(TRUE);
  421.  
  422.     printf( "FPS = %f", (float)frames / ((float)timeCount/60));
  423.     printf("\n\n");
  424. }
  425.  
  426.                                                                                                                      
  427.  
  428.  
  429. int mike_new_handler( size_t t )
  430. {
  431.     char errorMessage[256];
  432.     
  433.     s_UnInit(TRUE);
  434.     
  435.     sprintf(errorMessage, "\n\nError allocating %d bytes!\n\n", t );
  436.     puts(errorMessage);
  437.     
  438.     return 0;
  439. }
  440.  
  441.  
  442.  
  443. void OnExit()
  444. {
  445.     s_UnInit(FALSE);
  446. }
  447.  
  448.  
  449.