BmyFPS.cpp
上传用户:mywjrx
上传日期:2008-01-23
资源大小:703k
文件大小:119k
源码类别:

射击游戏

开发平台:

Visual C++

  1. /*
  2.  *      Windows Frame Code Was Published By Jeff Molofee 2000. 
  3.  *      The Idea of This Game Was Taken From "FPS" At GLdomain.com
  4.  * And "MD2Loader" At GameTutorials.com.
  5.  * The model "q2mdl-hueteotl" Was Taken From PlanetQuake.com.
  6.  * You Can Reach Me at: gan_kim_heng@yahoo.com.
  7.  */
  8. #include <windows.h> // Header File For Windows
  9. #include <math.h> // Math Library Header File
  10. #include <stdio.h> // Header File For Standard Input/Output
  11. #include <glgl.h> // Header File For The OpenGL32 Library
  12. #include <glglu.h> // Header File For The GLu32 Library
  13. #include <glglaux.h> // Header File For The Glaux Library
  14. #include <stdlib.h>
  15. #include <mmsystem.h>
  16. #include "main.h"
  17. #include "Md2.h"
  18. #include "resource.h"
  19. #pragma comment( lib, "opengl32.lib") // Search For OpenGL32.lib While Linking
  20. #pragma comment( lib, "glu32.lib")
  21. #pragma comment( lib, "glaux.lib")
  22. #pragma comment( lib, "winmm.lib")
  23. HDC hDC=NULL; // Private GDI Device Context
  24. HGLRC hRC=NULL; // Permanent Rendering Context
  25. HWND hWnd=NULL; // Holds Our Window Handle
  26. HINSTANCE hInstance; // Holds The Instance Of The Application
  27. GLdouble WIDTH;
  28. GLdouble HEIGHT;
  29. const CELL = 256;
  30. #define MAX_PARTICLES 45
  31. #define MAX_SHOTS_FIRED 45
  32. #define FILE_NAME  "tris.md2" // This is the 3D file we will load.
  33. #define TEXTURE_NAME "hobgoblin.bmp" // This is the image file we will load.
  34. CLoadMD2 g_LoadMd2; // This is MD2 class.  This should go in a good model class.
  35. t3DModel g_3DModel; // This holds the 3D Model info that we load in
  36. bool  gameOver = false;
  37. bool  getOut = false;
  38. int   point = 0;
  39. bool  firstTrigger  = false;
  40. bool  firstHitStatus= false;
  41. int   firstHitCount = 0;
  42. float firstTransX = CELL*4 + 20.0f;
  43. float firstTransXi  = 0.0f;
  44. float firstTransZ   = CELL*6 + 20.0f;
  45. float firstTransZi  = 0.0f;
  46. float firstRotateY  = 0.0f;
  47. float firstRotateYi = 0.0f;
  48. float firstRotateX = 0.0f;
  49. float firstRotateXi = 0.0f;
  50. float firstMult     = 0.0f;
  51. bool  secondTrigger  = false;
  52. bool  secondHitStatus= false;
  53. int   secondHitCount = 0;
  54. float secondTransX  = CELL*2 + 20.0f;
  55. float secondTransXi  = 0.0f;
  56. float secondTransZ   = CELL*5 + 20.0f;
  57. float secondTransZi  = 0.0f;
  58. float secondRotateY  = 0.0f;
  59. float secondRotateYi = 0.0f;
  60. float secondRotateX  = 0.0f;
  61. float secondRotateXi = 0.0f;
  62. float secondMult     = 0.0f;
  63. bool  thirdTrigger  = false;
  64. bool  thirdHitStatus= false;
  65. int   thirdHitCount = 0;
  66. float thirdTransX = 20.0f;
  67. float thirdTransXi  = 0.0f;
  68. float thirdTransZ   = CELL*4 + 20.0f;
  69. float thirdTransZi  = 0.0f;
  70. float thirdRotateY  = 0.0f;
  71. float thirdRotateYi = 0.0f;
  72. float thirdRotateX = 0.0f;
  73. float thirdRotateXi = 0.0f;
  74. float thirdMult     = 0.0f;
  75. bool  fourthTrigger  = false;
  76. bool  fourthHitStatus= false;
  77. int   fourthHitCount = 0;
  78. float fourthTransX  = CELL*2 + 20.0f;
  79. float fourthTransXi  = 0.0f;
  80. float fourthTransZ   = CELL*2 + 20.0f;
  81. float fourthTransZi  = 0.0f;
  82. float fourthRotateY  = 0.0f;
  83. float fourthRotateYi = 0.0f;
  84. float fourthRotateX  = 0.0f;
  85. float fourthRotateXi = 0.0f;
  86. float fourthMult     = 0.0f;
  87. bool  fifthTrigger  = false;
  88. bool  fifthHitStatus= false;
  89. int   fifthHitCount = 0;
  90. float fifthTransX = 20.0f;
  91. float fifthTransXi  = 0.0f;
  92. float fifthTransZ   = CELL*2 + 20.0f;
  93. float fifthTransZi  = 0.0f;
  94. float fifthRotateY  = 0.0f;
  95. float fifthRotateYi = 0.0f;
  96. float fifthRotateX = 0.0f;
  97. float fifthRotateXi = 0.0f;
  98. float fifthMult     = 0.0f;
  99. bool  sixthTrigger  = false;
  100. bool  sixthHitStatus= false;
  101. int   sixthHitCount = 0;
  102. float sixthTransX = CELL*2-20.0f;
  103. float sixthTransXi  = 0.0f;
  104. float sixthTransZ   = 20.0f;
  105. float sixthTransZi  = 0.0f;
  106. float sixthRotateY  = 0.0f;
  107. float sixthRotateYi = 0.0f;
  108. float sixthRotateX = 0.0f;
  109. float sixthRotateXi = 0.0f;
  110. float sixthMult     = 0.0f; 
  111. GLdouble mouse_x, mouse_y;
  112. GLdouble mouse_3d_x, mouse_3d_y;
  113. int mouse_wrap_x = 0;
  114. int mouse_wrap_y = 0;
  115. bool invert_mouse = false; // Used to invert the y-axis for the mouse
  116. GLdouble sensitivity = 32; // the higher the #, the lower mouse the sensitivity.
  117. bool  keys[256]; // Array Used For The Keyboard Routine
  118. bool  fp;
  119. bool  ip;
  120. bool  active=TRUE; // Window Active Flag Set To TRUE By Default
  121. bool  fullscreen=TRUE; // Fullscreen Flag Set To Fullscreen Mode By Default
  122.  
  123. float m16_kick = 0;
  124. float m16_kicki = 0; 
  125. bool isFire = false;
  126. bool isFireComplete = true;
  127. bool isRicochet = false;
  128. GLdouble BlankNum = 0;
  129. BOOL done=FALSE; // Bool Variable To Exit Loop
  130. bool isFPS=FALSE;
  131. GLuint texture[6];
  132. // Absolute value function(comes in handy later).
  133. inline GLdouble ABS(GLdouble A)
  134. {
  135.   if (A < 0)
  136.   A = -A; 
  137.   return A;
  138. }
  139. // Hypotenuse Function
  140. inline GLdouble Hypot(GLdouble a, GLdouble b)
  141. {
  142.   return sqrt((a*a)+(b*b));
  143. }
  144. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc
  145. GLvoid KillGLWindow(GLvoid);
  146. typedef struct // Create A Structure
  147. {
  148. GLubyte *imageData; // Image Data (Up To 32 Bits)
  149. GLuint bpp; // Image Color Depth In Bits Per Pixel.
  150. GLuint width; // Image Width
  151. GLuint height; // Image Height
  152. GLuint texID; // Texture ID Used To Select A Texture
  153. } TextureImage; // Structure Name
  154. GLuint base; // Base Display List For The Font
  155. TextureImage textures[1];
  156. bool LoadTGA(TextureImage *texture, char *filename) // Loads A TGA File Into Memory
  157. {    
  158. GLubyte TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0}; // Uncompressed TGA Header
  159. GLubyte TGAcompare[12]; // Used To Compare TGA Header
  160. GLubyte header[6]; // First 6 Useful Bytes From The Header
  161. GLuint bytesPerPixel; // Holds Number Of Bytes Per Pixel Used In The TGA File
  162. GLuint imageSize; // Used To Store The Image Size When Setting Aside Ram
  163. GLuint temp; // Temporary Variable
  164. GLuint type=GL_RGBA; // Set The Default GL Mode To RBGA (32 BPP)
  165. FILE *file = fopen(filename, "rb"); // Open The TGA File
  166. if( file==NULL || // Does File Even Exist?
  167. fread(TGAcompare,1,sizeof(TGAcompare),file)!=sizeof(TGAcompare) || // Are There 12 Bytes To Read?
  168. memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0 || // Does The Header Match What We Want?
  169. fread(header,1,sizeof(header),file)!=sizeof(header)) // If So Read Next 6 Header Bytes
  170. {
  171. if (file == NULL) // Did The File Even Exist? *Added Jim Strong*
  172. return false; // Return False
  173. else
  174. {
  175. fclose(file); // If Anything Failed, Close The File
  176. return false; // Return False
  177. }
  178. }
  179. texture->width  = header[1] * 256 + header[0]; // Determine The TGA Width (highbyte*256+lowbyte)
  180. texture->height = header[3] * 256 + header[2]; // Determine The TGA Height (highbyte*256+lowbyte)
  181.     
  182.   if( texture->width <=0 || // Is The Width Less Than Or Equal To Zero
  183. texture->height <=0 || // Is The Height Less Than Or Equal To Zero
  184. (header[4]!=24 && header[4]!=32)) // Is The TGA 24 or 32 Bit?
  185. {
  186. fclose(file); // If Anything Failed, Close The File
  187. return false; // Return False
  188. }
  189. texture->bpp = header[4]; // Grab The TGA's Bits Per Pixel (24 or 32)
  190. bytesPerPixel = texture->bpp/8; // Divide By 8 To Get The Bytes Per Pixel
  191. imageSize = texture->width*texture->height*bytesPerPixel; // Calculate The Memory Required For The TGA Data
  192. texture->imageData=(GLubyte *)malloc(imageSize); // Reserve Memory To Hold The TGA Data
  193. if( texture->imageData==NULL || // Does The Storage Memory Exist?
  194. fread(texture->imageData, 1, imageSize, file)!=imageSize) // Does The Image Size Match The Memory Reserved?
  195. {
  196. if(texture->imageData!=NULL) // Was Image Data Loaded
  197. free(texture->imageData); // If So, Release The Image Data
  198. fclose(file); // Close The File
  199. return false; // Return False
  200. }
  201. for(GLuint i=0; i<int(imageSize); i+=bytesPerPixel) // Loop Through The Image Data
  202. { // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue)
  203. temp=texture->imageData[i]; // Temporarily Store The Value At Image Data 'i'
  204. texture->imageData[i] = texture->imageData[i + 2]; // Set The 1st Byte To The Value Of The 3rd Byte
  205. texture->imageData[i + 2] = temp; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
  206. }
  207. fclose (file); // Close The File
  208. // Build A Texture From The Data
  209. glGenTextures(1, &texture[0].texID); // Generate OpenGL texture IDs
  210. glBindTexture(GL_TEXTURE_2D, texture[0].texID); // Bind Our Texture
  211. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Linear Filtered
  212. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Linear Filtered
  213. if (texture[0].bpp==24) // Was The TGA 24 Bits
  214. {
  215. type=GL_RGB; // If So Set The 'type' To GL_RGB
  216. }
  217.     gluBuild2DMipmaps(GL_TEXTURE_2D, type, texture[0].width, texture[0].height, type, GL_UNSIGNED_BYTE, texture[0].imageData);           
  218. return true; // Texture Building Went Ok, Return True
  219. }
  220. GLvoid BuildFont(GLvoid) // Build Our Font Display List
  221. {
  222. base=glGenLists(256); // Creating 256 Display Lists
  223. glBindTexture(GL_TEXTURE_2D, textures[0].texID); // Select Our Font Texture
  224. for (int loop1=0; loop1<256; loop1++) // Loop Through All 256 Lists
  225. {
  226. float cx=float(loop1%16)/16.0f; // X Position Of Current Character
  227. float cy=float(loop1/16)/16.0f; // Y Position Of Current Character
  228. glNewList(base+loop1,GL_COMPILE); // Start Building A List
  229. glBegin(GL_QUADS); // Use A Quad For Each Character
  230. glTexCoord2f(cx,1.0f-cy-0.0625f); // Texture Coord (Bottom Left)
  231. glVertex2d(0,16); // Vertex Coord (Bottom Left)
  232. glTexCoord2f(cx+0.0625f,1.0f-cy-0.0625f); // Texture Coord (Bottom Right)
  233. glVertex2i(16,16); // Vertex Coord (Bottom Right)
  234. glTexCoord2f(cx+0.0625f,1.0f-cy-0.001f); // Texture Coord (Top Right)
  235. glVertex2i(16,0); // Vertex Coord (Top Right)
  236. glTexCoord2f(cx,1.0f-cy-0.001f); // Texture Coord (Top Left)
  237. glVertex2i(0,0); // Vertex Coord (Top Left)
  238. glEnd(); // Done Building Our Quad (Character)
  239. glTranslated(14,0,0); // Move To The Right Of The Character
  240. glEndList(); // Done Building The Display List
  241. } // Loop Until All 256 Are Built
  242. }
  243. GLvoid KillFont(GLvoid) // Delete The Font From Memory
  244. {
  245. glDeleteLists(base,256); // Delete All 256 Display Lists
  246. }
  247. GLvoid glPrint(GLint x, GLint y, int set, const char *fmt, ...) // Where The Printing Happens
  248. {
  249. char text[1024]; // Holds Our String
  250. va_list ap; // Pointer To List Of Arguments
  251. if (fmt == NULL) // If There's No Text
  252. return; // Do Nothing
  253. va_start(ap, fmt); // Parses The String For Variables
  254.     vsprintf(text, fmt, ap); // And Converts Symbols To Actual Numbers
  255. va_end(ap); // Results Are Stored In Text
  256. if (set>1) // Did User Choose An Invalid Character Set?
  257. {
  258. set=1; // If So, Select Set 1 (Italic)
  259. }
  260. glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
  261. glLoadIdentity(); // Reset The Modelview Matrix
  262. glTranslated(x,y,-500); // Position The Text (0,0 - Top Left)
  263. glRotatef(180,0,0,1);
  264. glRotatef(180,0,1,0);
  265. glListBase(base-32+(128*set)); // Choose The Font Set (0 or 1)
  266. glCallLists(strlen(text),GL_UNSIGNED_BYTE, text); // Write The Text To The Screen
  267. glDisable(GL_TEXTURE_2D); // Disable Texture Mapping
  268. }
  269. AUX_RGBImageRec *LoadBMP(char *Filename) // Loads A Bitmap Image
  270. {
  271. FILE *File=NULL; // File Handle
  272. if (!Filename) // Make Sure A Filename Was Given
  273. {
  274. return NULL; // If Not Return NULL
  275. }
  276. File=fopen(Filename,"r"); // Check To See If The File Exists
  277. if (File) // Does The File Exist?
  278. {
  279. fclose(File); // Close The Handle
  280. return auxDIBImageLoad(Filename); // Load The Bitmap And Return A Pointer
  281. }
  282. return NULL; // If Load Failed Return NULL
  283. }
  284. // Create A Structure For The Timer Information
  285. struct
  286. {
  287.   __int64       frequency; // Timer Frequency
  288.   GLdouble      resolution; // Timer Resolution
  289.   unsigned long mm_timer_start;     
  290.   
  291.   // Multimedia Timer Start Value
  292.   unsigned long mm_timer_elapsed; // Multimedia Timer Elapsed Time
  293.   bool performance_timer;    
  294.   
  295.   // Using The Performance Timer?
  296.   __int64       performance_timer_start; // Performance Timer Start Value
  297.   __int64       performance_timer_elapsed; // Performance Timer Elapsed Time
  298. } timer;
  299. // Initialize Our Timer
  300. void TimerInit(void)
  301. {
  302.      memset(&timer, 0, sizeof(timer));   
  303.  // Clear Our Timer Structure
  304.      // Check To See If A Performance Counter Is Available
  305.      // If One Is Available The Timer Frequency Will Be Updated
  306.      if (!QueryPerformanceFrequency((LARGE_INTEGER *) &timer.frequency))
  307.      {
  308.           // No Performace Counter Available
  309.           timer.performance_timer = FALSE;                  // Set Performance Timer To FALSE
  310.           timer.mm_timer_start = timeGetTime();             // Use timeGetTime()
  311.           timer.resolution  = 1.0f/1000.0f;                 // Set Our Timer Resolution To .001f
  312.           timer.frequency   = 1000;                         // Set Our Timer Frequency To 1000
  313.           timer.mm_timer_elapsed = timer.mm_timer_start; // Set The Elapsed Time
  314.      }
  315.      else
  316.      {
  317.           // Performance Counter Is Available, Use It Instead Of The Multimedia Timer
  318.           // Get The Current Time And Store It In performance_timer_start
  319.           QueryPerformanceCounter((LARGE_INTEGER *) &timer.performance_timer_start);
  320.           timer.performance_timer   = TRUE;    // Set Performance Timer To TRUE
  321.           // Calculate The Timer Resolution Using The Timer Frequency
  322.           timer.resolution    = (GLdouble) (((double)1.0f)/((double)timer.frequency));
  323.           // Set The Elapsed Time To The Current Time
  324.           timer.performance_timer_elapsed = timer.performance_timer_start;
  325.      }
  326. }
  327. // Get Time In Milliseconds
  328. inline GLdouble TimerGetTime()
  329. {
  330.   __int64 time; // 'time' Will Hold A 64 Bit Integer
  331.   if (timer.performance_timer) // Are We Using The Performance Timer?
  332.   {
  333.     QueryPerformanceCounter((LARGE_INTEGER *) &time); // Current Performance Time
  334.     // Return The Time Elapsed since TimerInit was called
  335.     return ( (GLdouble) ( time - timer.performance_timer_start) * timer.resolution)*1000.0f;
  336.   }
  337.   else
  338.   {
  339.     // Return The Time Elapsed since TimerInit was called
  340.     return ( (GLdouble) ( timeGetTime() - timer.mm_timer_start) * timer.resolution)*1000.0f;
  341.   }
  342. }
  343. int LoadGLTextures() // Load Bitmap And Convert To A Texture
  344. {
  345.   int Status=FALSE; // Status Indicator
  346.   AUX_RGBImageRec *TextureImage[1]; // Create Storage Space For The Textures
  347.   memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL
  348.   if (TextureImage[0]=LoadBMP("Data/walls.bmp")) // Load Wall Texture
  349.   {
  350.     Status=TRUE; // Set The Status To TRUE
  351.     glGenTextures(1, &texture[1]); // Create One Texture
  352.     // Create MipMapped Texture
  353.     glBindTexture(GL_TEXTURE_2D, texture[1]);
  354.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  355.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  356.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);           
  357.   }
  358.   if (TextureImage[0]=LoadBMP("Data/crosshair.bmp")) // Load crossHair Texture
  359.   {
  360.     Status=TRUE; // Set The Status To TRUE
  361.     glGenTextures(1, &texture[2]); // Create One Texture
  362.     // Create MipMapped Texture
  363.     glBindTexture(GL_TEXTURE_2D, texture[2]);
  364.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  365.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  366.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);           
  367.   }
  368.   if (TextureImage[0]=LoadBMP("Data/smoke.bmp")) // Load smoke Texture
  369.   {
  370.     Status=TRUE; // Set The Status To TRUE
  371.     glGenTextures(1, &texture[3]); // Create One Texture
  372.     // Create MipMapped Texture
  373.     glBindTexture(GL_TEXTURE_2D, texture[3]);
  374.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  375.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  376.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);           
  377.   }
  378.   if (TextureImage[0]=LoadBMP("hobgoblin.bmp")) // Load model image Texture
  379.   {
  380.     Status=TRUE; // Set The Status To TRUE
  381.     glGenTextures(1, &texture[4]); // Create One Texture
  382.     // Create MipMapped Texture
  383.     glBindTexture(GL_TEXTURE_2D, texture[4]);
  384.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  385.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  386.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);           
  387.   }
  388.   if (TextureImage[0]=LoadBMP("Data/exit.bmp")) // Load exit Texture
  389.   {
  390.     Status=TRUE; // Set The Status To TRUE
  391.     glGenTextures(1, &texture[5]); // Create One Texture
  392.     // Create MipMapped Texture
  393.     glBindTexture(GL_TEXTURE_2D, texture[5]);
  394.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  395.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  396.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);           
  397.   }
  398.   if (TextureImage[0]=LoadBMP("Data/floor.bmp")) // Load Floor Texture
  399.   {
  400.     Status=TRUE; // Set The Status To TRUE
  401.     glGenTextures(1, &texture[6]); // Create One Texture
  402.     // Create MipMapped Texture
  403.     glBindTexture(GL_TEXTURE_2D, texture[6]);
  404.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  405.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  406.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);           
  407.   }
  408.   if (TextureImage[0]) // If Texture Exists
  409. {
  410.     if (TextureImage[0]->data) // If Texture Image Exists
  411.     {
  412.       free(TextureImage[0]->data); // Free The Texture Image Memory
  413.     }
  414.     free(TextureImage[0]); // Free The Image Structure
  415.   }
  416.   return Status; // Return The Status
  417. }
  418. GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Resize And Initialize The GL Window
  419. {
  420. if (height==0) // Prevent A Divide By Zero By
  421. {
  422. height=1; // Making Height Equal One
  423. }
  424. WIDTH=width;
  425. HEIGHT=height;
  426. glViewport(0,0,width,height); // Reset The Current Viewport
  427. glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
  428. glLoadIdentity(); // Reset The Projection Matrix
  429. // Calculate The Aspect Ratio Of The Window
  430. glLoadIdentity(); // Reset The Modelview Matrix
  431. gluPerspective(60.0f,(GLdouble)width/(GLdouble)height,1.0f,1250.0f);
  432. glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
  433. glLoadIdentity(); // Reset The Modelview Matrix
  434. }
  435. static GLuint ROOM[18], MODEL; // Storage For The Room Display List
  436. // Build Cube Display Lists
  437. GLvoid BuildLists()
  438. ROOM[0]=glGenLists(18); // IDENTITY[IJ=1 1], Generate 18 Different Lists
  439.     glNewList(ROOM[0],GL_COMPILE);
  440.     
  441. glBindTexture(GL_TEXTURE_2D, texture[6]); 
  442.    
  443. glBegin(GL_QUADS);//bottom
  444. glTexCoord2d(20,28);  glVertex3d(CELL*5,0,CELL*7);
  445. glTexCoord2d(20,0);  glVertex3d(CELL*5,0,0);
  446. glTexCoord2d(0,0);  glVertex3d(0,0,0);
  447. glTexCoord2d(0,28);  glVertex3d(0,0,CELL*7);
  448. glEnd();
  449. glBegin(GL_QUADS);//top
  450. glTexCoord2d(20,28);  glVertex3d(CELL*5,CELL/4,CELL*7);
  451. glTexCoord2d(20,0);  glVertex3d(CELL*5,CELL/4,0);
  452. glTexCoord2d(0,0);  glVertex3d(0,CELL/4,0);
  453. glTexCoord2d(0,28);  glVertex3d(0,CELL/4,CELL*7);
  454. glEnd(); 
  455. /////////////////////////Wall Start///////////////////////////////////
  456.  
  457. glBindTexture(GL_TEXTURE_2D, texture[1]); 
  458. glBegin(GL_QUADS);//front
  459. glTexCoord2d(4,1);  glVertex3d(CELL*5,CELL/4,CELL*6);
  460. glTexCoord2d(4,0);  glVertex3d(CELL*5,0,CELL*6);
  461. glTexCoord2d(0,0);  glVertex3d(CELL*4,0,CELL*6);
  462. glTexCoord2d(0,1);  glVertex3d(CELL*4,CELL/4,CELL*6);
  463. glEnd();
  464. glBegin(GL_QUADS);//back
  465. glTexCoord2d(4,1);  glVertex3d(CELL*5,CELL/4,CELL*7);
  466. glTexCoord2d(4,0);  glVertex3d(CELL*5,0,CELL*7);
  467. glTexCoord2d(0,0);  glVertex3d(CELL*4,0,CELL*7);
  468. glTexCoord2d(0,1);  glVertex3d(CELL*4,CELL/4,CELL*7);
  469. glEnd();
  470. glBegin(GL_QUADS);//right
  471. glTexCoord2d(4,1);  glVertex3d(CELL*5,CELL/4,CELL*7);
  472. glTexCoord2d(4,0);  glVertex3d(CELL*5,0,CELL*7);
  473. glTexCoord2d(0,0);  glVertex3d(CELL*5,0,CELL*6);
  474. glTexCoord2d(0,1);  glVertex3d(CELL*5,CELL/4,CELL*6);
  475. glEnd();
  476. /////////////////////////Wall End///////////////////////////////////
  477.     glEndList();
  478. ROOM[1]=ROOM[0]+1;//IDENTITY[IJ=2 1]
  479. glNewList(ROOM[1],GL_COMPILE);
  480.  
  481. glBegin(GL_QUADS);//back
  482. glTexCoord2d(4,1);  glVertex3d(CELL*4,CELL/4,CELL*7);
  483. glTexCoord2d(4,0);  glVertex3d(CELL*4,0,CELL*7);
  484. glTexCoord2d(0,0);  glVertex3d(CELL*3,0,CELL*7);
  485. glTexCoord2d(0,1);  glVertex3d(CELL*3,CELL/4,CELL*7);
  486. glEnd();
  487. glBegin(GL_QUADS);//right
  488. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL*7);
  489. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL*7);
  490. glTexCoord2d(0,0);  glVertex3d(CELL*3,0,CELL*6);
  491. glTexCoord2d(0,1);  glVertex3d(CELL*3,CELL/4,CELL*6);
  492. glEnd();
  493. /////////////////////////Wall End///////////////////////////////////
  494.     glEndList();
  495. ROOM[2]=ROOM[1]+1;//IDENTITY[IJ=2 2]
  496. glNewList(ROOM[2],GL_COMPILE);  
  497.  
  498. glBegin(GL_QUADS);//right
  499. glTexCoord2d(4,1);  glVertex3d(CELL*4,CELL/4,CELL*6);
  500. glTexCoord2d(4,0);  glVertex3d(CELL*4,0,CELL*6);
  501. glTexCoord2d(0,0);  glVertex3d(CELL*4,0,CELL*5);
  502. glTexCoord2d(0,1);  glVertex3d(CELL*4,CELL/4,CELL*5);
  503. glEnd();
  504. /////////////////////////Wall End///////////////////////////////////
  505.     glEndList();
  506. ROOM[3]=ROOM[2]+1;//IDENTITY[IJ=2 3]
  507. glNewList(ROOM[3],GL_COMPILE); 
  508.  
  509. glBegin(GL_QUADS);//left
  510. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL*5);
  511. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL*5);
  512. glTexCoord2d(0,0);  glVertex3d(CELL*3,0,CELL*4);
  513. glTexCoord2d(0,1);  glVertex3d(CELL*3,CELL/4,CELL*4);
  514. glEnd();  
  515. glBegin(GL_QUADS);//right
  516. glTexCoord2d(4,1);  glVertex3d(CELL*4,CELL/4,CELL*5);
  517. glTexCoord2d(4,0);  glVertex3d(CELL*4,0,CELL*5);
  518. glTexCoord2d(0,0);  glVertex3d(CELL*4,0,CELL*4);
  519. glTexCoord2d(0,1);  glVertex3d(CELL*4,CELL/4,CELL*4);
  520. glEnd();
  521. /////////////////////////Wall End///////////////////////////////////
  522.     glEndList();
  523. ROOM[4]=ROOM[3]+1;//IDENTITY[IJ=2 4]
  524. glNewList(ROOM[4],GL_COMPILE); 
  525.  
  526. glBegin(GL_QUADS);//front
  527. glTexCoord2d(4,1);  glVertex3d(CELL*4,CELL/4,CELL*3);
  528. glTexCoord2d(4,0);  glVertex3d(CELL*4,0,CELL*3);
  529. glTexCoord2d(0,0);  glVertex3d(CELL*3,0,CELL*3);
  530. glTexCoord2d(0,1);  glVertex3d(CELL*3,CELL/4,CELL*3);
  531. glEnd(); 
  532. glBegin(GL_QUADS);//right
  533. glTexCoord2d(4,1);  glVertex3d(CELL*4,CELL/4,CELL*4);
  534. glTexCoord2d(4,0);  glVertex3d(CELL*4,0,CELL*4);
  535. glTexCoord2d(0,0);  glVertex3d(CELL*4,0,CELL*3);
  536. glTexCoord2d(0,1);  glVertex3d(CELL*4,CELL/4,CELL*3);
  537. glEnd();
  538. /////////////////////////Wall End///////////////////////////////////
  539.     glEndList();
  540. ROOM[4]=ROOM[3]+1;//IDENTITY[IJ=2 4]
  541. glNewList(ROOM[4],GL_COMPILE); 
  542.  
  543. glBegin(GL_QUADS);//front
  544. glTexCoord2d(4,1);  glVertex3d(CELL*4,CELL/4,CELL*3);
  545. glTexCoord2d(4,0);  glVertex3d(CELL*4,0,CELL*3);
  546. glTexCoord2d(0,0);  glVertex3d(CELL*3,0,CELL*3);
  547. glTexCoord2d(0,1);  glVertex3d(CELL*3,CELL/4,CELL*3);
  548. glEnd(); 
  549. glBegin(GL_QUADS);//right
  550. glTexCoord2d(4,1);  glVertex3d(CELL*4,CELL/4,CELL*4);
  551. glTexCoord2d(4,0);  glVertex3d(CELL*4,0,CELL*4);
  552. glTexCoord2d(0,0);  glVertex3d(CELL*4,0,CELL*3);
  553. glTexCoord2d(0,1);  glVertex3d(CELL*4,CELL/4,CELL*3);
  554. glEnd();
  555. /////////////////////////Wall End///////////////////////////////////
  556.     glEndList();
  557. ROOM[5]=ROOM[4]+1;//IDENTITY[IJ=3 2]
  558. glNewList(ROOM[5],GL_COMPILE); 
  559.  
  560. glBegin(GL_QUADS);//front
  561. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL*5);
  562. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL*5);
  563. glTexCoord2d(0,0);  glVertex3d(CELL*2,0,CELL*5);
  564. glTexCoord2d(0,1);  glVertex3d(CELL*2,CELL/4,CELL*5);
  565. glEnd(); 
  566. glBegin(GL_QUADS);//back
  567. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL*6);
  568. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL*6);
  569. glTexCoord2d(0,0);  glVertex3d(CELL*2,0,CELL*6);
  570. glTexCoord2d(0,1);  glVertex3d(CELL*2,CELL/4,CELL*6);
  571. glEnd();
  572. /////////////////////////Wall End///////////////////////////////////
  573.     glEndList();
  574. ROOM[6]=ROOM[5]+1;//IDENTITY[IJ=3 4]
  575. glNewList(ROOM[6],GL_COMPILE); 
  576.  
  577. glBegin(GL_QUADS);//back
  578. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL*4);
  579. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL*4);
  580. glTexCoord2d(0,0);  glVertex3d(CELL*2,0,CELL*4);
  581. glTexCoord2d(0,1);  glVertex3d(CELL*2,CELL/4,CELL*4);
  582. glEnd();  
  583. /////////////////////////Wall End///////////////////////////////////
  584.     glEndList();
  585. ROOM[7]=ROOM[6]+1;//IDENTITY[IJ=3 5]
  586. glNewList(ROOM[7],GL_COMPILE); 
  587.  
  588. glBegin(GL_QUADS);//left
  589. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL*3);
  590. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL*3);
  591. glTexCoord2d(0,0);  glVertex3d(CELL*2,0,CELL*2);
  592. glTexCoord2d(0,1);  glVertex3d(CELL*2,CELL/4,CELL*2);
  593. glEnd(); 
  594. glBegin(GL_QUADS);//right
  595. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL*3);
  596. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL*3);
  597. glTexCoord2d(0,0);  glVertex3d(CELL*3,0,CELL*2);
  598. glTexCoord2d(0,1);  glVertex3d(CELL*3,CELL/4,CELL*2);
  599. glEnd();
  600. /////////////////////////Wall End///////////////////////////////////
  601.     glEndList();
  602. ROOM[8]=ROOM[7]+1;//IDENTITY[IJ=3 6]
  603. glNewList(ROOM[8],GL_COMPILE); 
  604.  
  605. glBegin(GL_QUADS);//front
  606. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL);
  607. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL);
  608. glTexCoord2d(0,0);  glVertex3d(CELL*2,0,CELL);
  609. glTexCoord2d(0,1);  glVertex3d(CELL*2,CELL/4,CELL);
  610. glEnd(); 
  611. glBegin(GL_QUADS);//left
  612. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL*2);
  613. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL*2);
  614. glTexCoord2d(0,0);  glVertex3d(CELL*2,0,CELL);
  615. glTexCoord2d(0,1);  glVertex3d(CELL*2,CELL/4,CELL);
  616. glEnd(); 
  617. glBegin(GL_QUADS);//right
  618. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL*2);
  619. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL*2);
  620. glTexCoord2d(0,0);  glVertex3d(CELL*3,0,CELL);
  621. glTexCoord2d(0,1);  glVertex3d(CELL*3,CELL/4,CELL);
  622. glEnd();
  623. /////////////////////////Wall End///////////////////////////////////
  624.     glEndList();
  625. ROOM[9]=ROOM[8]+1;//IDENTITY[IJ=4 2]
  626. glNewList(ROOM[9],GL_COMPILE); 
  627.  
  628. glBegin(GL_QUADS);//front
  629. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL*5);
  630. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL*5);
  631. glTexCoord2d(0,0);  glVertex3d(CELL,0,CELL*5);
  632. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,CELL*5);
  633. glEnd(); 
  634. glBegin(GL_QUADS);//back
  635. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL*6);
  636. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL*6);
  637. glTexCoord2d(0,0);  glVertex3d(CELL,0,CELL*6);
  638. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,CELL*6);
  639. glEnd();
  640. /////////////////////////Wall End///////////////////////////////////
  641.     glEndList();
  642. ROOM[10]=ROOM[9]+1;//IDENTITY[IJ=4 4]
  643. glNewList(ROOM[10],GL_COMPILE); 
  644.  
  645. glBegin(GL_QUADS);//front
  646. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL*3);
  647. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL*3);
  648. glTexCoord2d(0,0);  glVertex3d(CELL,0,CELL*3);
  649. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,CELL*3);
  650. glEnd(); 
  651. glBegin(GL_QUADS);//back
  652. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL*4);
  653. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL*4);
  654. glTexCoord2d(0,0);  glVertex3d(CELL,0,CELL*4);
  655. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,CELL*4);
  656. glEnd();
  657. /////////////////////////Wall End///////////////////////////////////
  658.     glEndList();
  659. ROOM[11]=ROOM[10]+1;//IDENTITY[IJ=4 6]
  660. glNewList(ROOM[11],GL_COMPILE); 
  661.  
  662. glBegin(GL_QUADS);//back
  663. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL*2);
  664. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL*2);
  665. glTexCoord2d(0,0);  glVertex3d(CELL,0,CELL*2);
  666. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,CELL*2);
  667. glEnd(); 
  668. /////////////////////////Wall End///////////////////////////////////
  669.     glEndList();
  670. ROOM[12]=ROOM[11]+1;//IDENTITY[IJ=4 7]
  671. glNewList(ROOM[12],GL_COMPILE); 
  672. glBindTexture(GL_TEXTURE_2D, texture[5]); 
  673. glBegin(GL_QUADS);//front
  674. glTexCoord2d(1,1);  glVertex3d(CELL*2-CELL*3/8,CELL/4,0);
  675. glTexCoord2d(1,0);  glVertex3d(CELL*2-CELL*3/8,0,0);
  676. glTexCoord2d(0,0);  glVertex3d(CELL+CELL*3/8,0,0);
  677. glTexCoord2d(0,1);  glVertex3d(CELL+CELL*3/8,CELL/4,0);
  678. glEnd(); 
  679.  
  680. glBindTexture(GL_TEXTURE_2D, texture[1]);
  681. glBegin(GL_QUADS);//front left
  682. glTexCoord2d(1.5,1);  glVertex3d(CELL+CELL*3/8,CELL/4,0);
  683. glTexCoord2d(1.5,0);  glVertex3d(CELL+CELL*3/8,0,0);
  684. glTexCoord2d(0,0);  glVertex3d(CELL,0,0);
  685. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,0);
  686. glEnd();
  687. glBegin(GL_QUADS);//front right
  688. glTexCoord2d(1.5,1);  glVertex3d(CELL*2,CELL/4,0);
  689. glTexCoord2d(1.5,0);  glVertex3d(CELL*2,0,0);
  690. glTexCoord2d(0,0);  glVertex3d(CELL*2-CELL*3/8,0,0);
  691. glTexCoord2d(0,1);  glVertex3d(CELL*2-CELL*3/8,CELL/4,0);
  692. glEnd();
  693. glBegin(GL_QUADS);//left
  694. glTexCoord2d(4,1);  glVertex3d(CELL,CELL/4,CELL);
  695. glTexCoord2d(4,0);  glVertex3d(CELL,0,CELL);
  696. glTexCoord2d(0,0);  glVertex3d(CELL,0,0);
  697. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,0);
  698. glEnd();  
  699. glBegin(GL_QUADS);//right
  700. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL);
  701. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL);
  702. glTexCoord2d(0,0);  glVertex3d(CELL*2,0,0);
  703. glTexCoord2d(0,1);  glVertex3d(CELL*2,CELL/4,0);
  704. glEnd();
  705. /////////////////////////Wall End///////////////////////////////////
  706.     glEndList();
  707. ROOM[13]=ROOM[12]+1;//IDENTITY[IJ=5 2]
  708. glNewList(ROOM[13],GL_COMPILE); 
  709.  
  710. glBegin(GL_QUADS);//back
  711. glTexCoord2d(4,1);  glVertex3d(CELL,CELL/4,CELL*6);
  712. glTexCoord2d(4,0);  glVertex3d(CELL,0,CELL*6);
  713. glTexCoord2d(0,0);  glVertex3d(0,0,CELL*6);
  714. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL*6);
  715. glEnd(); 
  716. glBegin(GL_QUADS);//left
  717. glTexCoord2d(4,1);  glVertex3d(0,CELL/4,CELL*6);
  718. glTexCoord2d(4,0);  glVertex3d(0,0,CELL*6);
  719. glTexCoord2d(0,0);  glVertex3d(0,0,CELL*5);
  720. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL*5);
  721. glEnd();  
  722. /////////////////////////Wall End///////////////////////////////////
  723.     glEndList();
  724. ROOM[14]=ROOM[13]+1;//IDENTITY[IJ=5 3]
  725. glNewList(ROOM[14],GL_COMPILE); 
  726.  
  727. glBegin(GL_QUADS);//front
  728. glTexCoord2d(4,1);  glVertex3d(CELL,CELL/4,CELL*4);
  729. glTexCoord2d(4,0);  glVertex3d(CELL,0,CELL*4);
  730. glTexCoord2d(0,0);  glVertex3d(0,0,CELL*4);
  731. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL*4);
  732. glEnd(); 
  733. glBegin(GL_QUADS);//left
  734. glTexCoord2d(4,1);  glVertex3d(0,CELL/4,CELL*5);
  735. glTexCoord2d(4,0);  glVertex3d(0,0,CELL*5);
  736. glTexCoord2d(0,0);  glVertex3d(0,0,CELL*4);
  737. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL*4);
  738. glEnd(); 
  739. glBegin(GL_QUADS);//right
  740. glTexCoord2d(4,1);  glVertex3d(CELL,CELL/4,CELL*5);
  741. glTexCoord2d(4,0);  glVertex3d(CELL,0,CELL*5);
  742. glTexCoord2d(0,0);  glVertex3d(CELL,0,CELL*4);
  743. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,CELL*4);
  744. glEnd();
  745. /////////////////////////Wall End///////////////////////////////////
  746.     glEndList();
  747. ROOM[15]=ROOM[14]+1;//IDENTITY[IJ=5 4]
  748. glNewList(ROOM[15],GL_COMPILE); 
  749.  
  750. glBegin(GL_QUADS);//left
  751. glTexCoord2d(4,1);  glVertex3d(0,CELL/4,CELL*4);
  752. glTexCoord2d(4,0);  glVertex3d(0,0,CELL*4);
  753. glTexCoord2d(0,0);  glVertex3d(0,0,CELL*3);
  754. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL*3);
  755. glEnd();  
  756. /////////////////////////Wall End///////////////////////////////////
  757.     glEndList();
  758. ROOM[16]=ROOM[15]+1;//IDENTITY[IJ=5 5]
  759. glNewList(ROOM[16],GL_COMPILE); 
  760.  
  761. glBegin(GL_QUADS);//left
  762. glTexCoord2d(4,1);  glVertex3d(0,CELL/4,CELL*3);
  763. glTexCoord2d(4,0);  glVertex3d(0,0,CELL*3);
  764. glTexCoord2d(0,0);  glVertex3d(0,0,CELL*2);
  765. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL*2);
  766. glEnd(); 
  767. glBegin(GL_QUADS);//right
  768. glTexCoord2d(4,1);  glVertex3d(CELL,CELL/4,CELL*3);
  769. glTexCoord2d(4,0);  glVertex3d(CELL,0,CELL*3);
  770. glTexCoord2d(0,0);  glVertex3d(CELL,0,CELL*2);
  771. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,CELL*2);
  772. glEnd();
  773. /////////////////////////Wall End///////////////////////////////////
  774.     glEndList();
  775. ROOM[17]=ROOM[16]+1;//IDENTITY[IJ=5 6]
  776. glNewList(ROOM[17],GL_COMPILE); 
  777.  
  778. glBegin(GL_QUADS);//front
  779. glTexCoord2d(4,1);  glVertex3d(CELL,CELL/4,CELL);
  780. glTexCoord2d(4,0);  glVertex3d(CELL,0,CELL);
  781. glTexCoord2d(0,0);  glVertex3d(0,0,CELL);
  782. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL);
  783. glEnd(); 
  784. glBegin(GL_QUADS);//left
  785. glTexCoord2d(4,1);  glVertex3d(0,CELL/4,CELL*2);
  786. glTexCoord2d(4,0);  glVertex3d(0,0,CELL*2);
  787. glTexCoord2d(0,0);  glVertex3d(0,0,CELL);
  788. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL);
  789. glEnd();  
  790. /////////////////////////Wall End///////////////////////////////////
  791.     glEndList(); 
  792. }
  793. GLvoid BuildLists1()
  794. {
  795. MODEL=glGenLists(1); // Generate Model Lists
  796. glNewList(MODEL,GL_COMPILE);
  797. glDisable(GL_BLEND);
  798. //////////// *** NEW *** ////////// *** NEW *** ///////////// *** NEW *** ////////////////////
  799. glBindTexture(GL_TEXTURE_2D, texture[4]);
  800. if(g_3DModel.pObject.size() > 0)
  801. {
  802. // Get the current object that we are displaying
  803. t3DObject *pObject = &g_3DModel.pObject[0];
  804. // Render lines or normal triangles mode, depending on the global variable
  805. glBegin(GL_TRIANGLES);
  806. // Go through all of the faces (polygons) of the object and draw them
  807. for(int j = 0; j < pObject->numOfFaces; j++)
  808. {
  809. // Go through each corner of the triangle and draw it.
  810. for(int whichVertex = 0; whichVertex < 3; whichVertex++)
  811. {
  812. // Get the index for each point in the face
  813. int index = pObject->pFaces[j].vertIndex[whichVertex];
  814. // Get the index for each texture coord in the face
  815. int index2 = pObject->pFaces[j].coordIndex[whichVertex];
  816. // Give OpenGL the normal for this vertex.  Notice that we put a 
  817. // - sign in front.  It appears that because of the ordering of Quake2's
  818. // polygons, we need to invert the normal
  819. glNormal3f(-pObject->pNormals[ index ].x, -pObject->pNormals[ index ].y, -pObject->pNormals[ index ].z);
  820. // Make sure there was a UVW map applied to the object or else it won't have tex coords.
  821. if(pObject->pTexVerts) 
  822. {
  823. glTexCoord2f(pObject->pTexVerts[ index2 ].x, pObject->pTexVerts[ index2 ].y);
  824. }
  825. // Pass in the current vertex of the object (Corner of current face)
  826. glVertex3f(pObject->pVerts[ index ].x, pObject->pVerts[ index ].y, pObject->pVerts[ index ].z);
  827. }
  828. }
  829. glEnd();
  830. }
  831. glEnable(GL_BLEND);
  832. glEndList();
  833. }
  834. GLdouble Time1;
  835. GLdouble Time2;
  836. GLdouble DiffTime;
  837. GLdouble StartTime;
  838. LPARAM lParam;
  839. int InitGL(GLvoid) // All Setup For OpenGL Goes Here
  840. {
  841. if (!g_LoadMd2.ImportMD2(&g_3DModel, FILE_NAME, TEXTURE_NAME)) // KEY of Clashing
  842.       return false; 
  843. if (!LoadTGA(&textures[0],"Data/Font.TGA")) // Load The Font Texture
  844. {
  845. return false; // If Loading Failed, Return False
  846. }
  847. if (!LoadGLTextures()) // Jump To Texture Loading Routine
  848.       return false;  
  849. //LPARAM lParam;
  850. SetCursorPos(322,240);
  851. float temp_mouse_x = LOWORD(lParam);
  852. float temp_mouse_y = HIWORD(lParam);
  853. SetCursorPos(320,240);
  854. BuildLists();
  855. BuildLists1();
  856. glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
  857. glClearColor(0, 0, 0, 1.0f); // Black Background
  858. glEnable(GL_DEPTH_TEST);
  859. glDepthFunc(GL_LEQUAL);
  860. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
  861. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  862. TimerInit(); //initialize timer
  863. BuildFont();   
  864. StartTime = TimerGetTime()/1000; 
  865. return TRUE; // Initialization Went OK
  866. }
  867. GLdouble xtrans2 = CELL*5-40.0f;  
  868. GLdouble ytrans2 = 7;
  869. GLdouble ztrans2 = CELL*7-40.0f;
  870. GLdouble xtrans = 0;
  871. GLdouble ztrans = 0;
  872. GLdouble yrot=0; // Y Rotation
  873. const GLdouble piover180 = 0.0174532925f;
  874. GLdouble XP=0;
  875. GLdouble ZP=0;
  876. GLdouble sceneroty;
  877. GLdouble heading;
  878. GLdouble _heading = 0;
  879. GLdouble zprot;
  880. int frames = 0;
  881. GLdouble FPS = 0;
  882. GLdouble fire_x = 0;
  883. GLdouble fire_y = 10;
  884. GLdouble fire_xp, fire_yp;
  885. GLdouble fire_z = 0;
  886. GLdouble fire_zp = 0;
  887. GLdouble fire_delay = 0;
  888. int shots_fired = 0;
  889. typedef struct // Create A Structure For Particle
  890. {
  891. GLdouble life; // Particle Life
  892. GLdouble fade; // Fade Speed
  893. GLdouble size; // Fade Speed
  894. GLdouble triangle_x1; // X vertex
  895. GLdouble triangle_x2; // X vertex
  896. GLdouble triangle_x3; // X vertex
  897. GLdouble triangle_y1; // Y vertex
  898. GLdouble triangle_y2; // Y vertex
  899. GLdouble triangle_y3; // Y vertex
  900. GLdouble triangle_z1; // Z vertex
  901. GLdouble triangle_z2; // Z vertex
  902. GLdouble triangle_z3; // Z vertex
  903. GLdouble triangle_rotate_x; // X Rotate
  904. GLdouble triangle_rotate_y; // X Rotate
  905. GLdouble triangle_rotate_z; // X Rotate
  906. GLdouble triangle_rotate_xi; // X Rotate
  907. GLdouble triangle_rotate_yi; // X Rotate
  908. GLdouble triangle_rotate_zi; // X Rotate
  909. GLdouble x; // X Position
  910. GLdouble y; // Y Position
  911. GLdouble z; // Z Position
  912. GLdouble xi; // X Direction
  913. GLdouble yi; // Y Direction
  914. GLdouble zi; // Z Direction
  915. }
  916. particles; // Particles Structure
  917. particles particle[MAX_PARTICLES][MAX_SHOTS_FIRED];
  918. // Detect collision and reflect movement if collision is detected
  919. // cx = x position; cy = y position; cz = z position;
  920. // cxi = x increment; cyi = y increment; czi = z increment;
  921. // padding = a square border around the object.  your value will be 1/2 the length of one side of the square
  922. // bounce = bounce coefficient -- 0 = no bounce; 1 = perfect bounce
  923. inline bool DetectCollision(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  924. {
  925. bool Status = false;
  926. if(ztrans2>CELL*6 && ztrans2<CELL*7 && 
  927. xtrans2>CELL*4 && xtrans2<CELL*5)
  928. if (cx > CELL*5-padding) //right
  929. {
  930. cx = CELL*5-padding; 
  931. cxi = -cxi;
  932. cxi *= bounce; 
  933. Status = true;
  934. }
  935. if (cy > CELL/4-padding) //top
  936. {
  937. cy = CELL/4-padding; 
  938. cyi = -cyi;
  939. cyi *= bounce; 
  940. Status = true;
  941. }
  942. else if (cy < 0+padding) //bottom
  943. {
  944. cy = 0+padding; 
  945. cyi = -cyi;
  946. cyi *= bounce; 
  947. Status = true;
  948. }
  949. if (cz > CELL*7-padding) //back
  950. {
  951. cz = CELL*7-padding; 
  952. czi = -czi;
  953. czi *= bounce; 
  954. Status = true;
  955. }
  956. else if (cz < CELL*6+padding) //front
  957. {
  958. cz = CELL*6+padding; 
  959. czi = -czi;
  960. czi *= bounce; 
  961. Status = true;
  962. }
  963. }
  964. else if(ztrans2>CELL*6 && ztrans2<CELL*7 && 
  965. xtrans2>CELL*3 && xtrans2<CELL*4) 
  966. {
  967. if (cx < CELL*3+padding)//left
  968. {
  969. cx = CELL*3+padding; 
  970. cxi = -cxi;
  971. cxi *= bounce; 
  972. Status = true;
  973. }
  974. if (cy > CELL/4-padding) //top
  975. {
  976. cy = CELL/4-padding; 
  977. cyi = -cyi;
  978. cyi *= bounce; 
  979. Status = true;
  980. }
  981. else if (cy < 0+padding) //bottom
  982. {
  983. cy = 0+padding; 
  984. cyi = -cyi;
  985. cyi *= bounce; 
  986. Status = true;
  987. }
  988. if (cz > CELL*7-padding) //back
  989. {
  990. cz = CELL*7-padding; 
  991. czi = -czi;
  992. czi *= bounce; 
  993. Status = true;
  994. }
  995. else if(ztrans2>CELL*5 && ztrans2<CELL*6 && 
  996. xtrans2>CELL*3 && xtrans2<CELL*4) 
  997. {
  998. if (cx > CELL*4-padding)//right
  999. {
  1000. cx = CELL*4-padding; 
  1001. cxi = -cxi;
  1002. cxi *= bounce; 
  1003. Status = true;
  1004. }
  1005. if (cy > CELL/4-padding) //top
  1006. {
  1007. cy = CELL/4-padding; 
  1008. cyi = -cyi;
  1009. cyi *= bounce; 
  1010. Status = true;
  1011. }
  1012. else if (cy < 0+padding) //bottom
  1013. {
  1014. cy = 0+padding; 
  1015. cyi = -cyi;
  1016. cyi *= bounce; 
  1017. Status = true;
  1018. }
  1019. else if(ztrans2>CELL*4 && ztrans2<CELL*5 && 
  1020. xtrans2>CELL*3 && xtrans2<CELL*4) 
  1021. {
  1022. if (cx < CELL*3+padding)//left
  1023. {
  1024. cx = CELL*3+padding; 
  1025. cxi = -cxi;
  1026. cxi *= bounce; 
  1027. Status = true;
  1028. }
  1029. else if (cx > CELL*4-padding)//right
  1030. {
  1031. cx = CELL*4-padding; 
  1032. cxi = -cxi;
  1033. cxi *= bounce; 
  1034. Status = true;
  1035. }
  1036. if (cy > CELL/4-padding) //top
  1037. {
  1038. cy = CELL/4-padding; 
  1039. cyi = -cyi;
  1040. cyi *= bounce; 
  1041. Status = true;
  1042. }
  1043. else if (cy < 0+padding) //bottom
  1044. {
  1045. cy = 0+padding; 
  1046. cyi = -cyi;
  1047. cyi *= bounce; 
  1048. Status = true;
  1049. }
  1050. }
  1051. else if(ztrans2>CELL*3 && ztrans2<CELL*4 && 
  1052. xtrans2>CELL*3 && xtrans2<CELL*4)
  1053. {
  1054. if (cx > CELL*4-padding)//right
  1055. {
  1056. cx = CELL*4-padding; 
  1057. cxi = -cxi;
  1058. cxi *= bounce; 
  1059. Status = true;
  1060. }
  1061. if (cy > CELL/4-padding) //top
  1062. {
  1063. cy = CELL/4-padding; 
  1064. cyi = -cyi;
  1065. cyi *= bounce; 
  1066. Status = true;
  1067. }
  1068. else if (cy < 0+padding) //bottom
  1069. {
  1070. cy = 0+padding; 
  1071. cyi = -cyi;
  1072. cyi *= bounce; 
  1073. Status = true;
  1074. }
  1075. if (cz < CELL*3+padding) //front
  1076. {
  1077. cz = CELL*3+padding; 
  1078. czi = -czi;
  1079. czi *= bounce; 
  1080. Status = true;
  1081. }
  1082. }
  1083. else if(ztrans2>CELL*5 && ztrans2<CELL*6 && 
  1084. xtrans2>CELL*2 && xtrans2<CELL*3)
  1085. {
  1086. if (cy > CELL/4-padding) //top
  1087. {
  1088. cy = CELL/4-padding; 
  1089. cyi = -cyi;
  1090. cyi *= bounce; 
  1091. Status = true;
  1092. }
  1093. else if (cy < 0+padding) //bottom
  1094. {
  1095. cy = 0+padding; 
  1096. cyi = -cyi;
  1097. cyi *= bounce; 
  1098. Status = true;
  1099. }
  1100. if (cz > CELL*6-padding) //back
  1101. {
  1102. cz = CELL*6-padding; 
  1103. czi = -czi;
  1104. czi *= bounce; 
  1105. Status = true;
  1106. }
  1107. else if (cz < CELL*5+padding) //front
  1108. {
  1109. cz = CELL*5+padding; 
  1110. czi = -czi;
  1111. czi *= bounce; 
  1112. Status = true;
  1113. }
  1114. }
  1115. else if(ztrans2>CELL*3 && ztrans2<CELL*4 && 
  1116. xtrans2>CELL*2 && xtrans2<CELL*3)
  1117. {
  1118. if (cy > CELL/4-padding) //top
  1119. {
  1120. cy = CELL/4-padding; 
  1121. cyi = -cyi;
  1122. cyi *= bounce; 
  1123. Status = true;
  1124. }
  1125. else if (cy < 0+padding) //bottom
  1126. {
  1127. cy = 0+padding; 
  1128. cyi = -cyi;
  1129. cyi *= bounce; 
  1130. Status = true;
  1131. }
  1132. if (cz > CELL*4-padding) //back
  1133. {
  1134. cz = CELL*4-padding; 
  1135. czi = -czi;
  1136. czi *= bounce; 
  1137. Status = true;
  1138. }
  1139. else if(ztrans2>CELL*2 && ztrans2<CELL*3 && 
  1140. xtrans2>CELL*2 && xtrans2<CELL*3)
  1141. {
  1142. if (cx < CELL*2+padding)//left
  1143. {
  1144. cx = CELL*2+padding; 
  1145. cxi = -cxi;
  1146. cxi *= bounce; 
  1147. Status = true;
  1148. }
  1149. else if (cx > CELL*3-padding)//right
  1150. {
  1151. cx = CELL*3-padding; 
  1152. cxi = -cxi;
  1153. cxi *= bounce; 
  1154. Status = true;
  1155. }
  1156. if (cy > CELL/4-padding) //top
  1157. {
  1158. cy = CELL/4-padding; 
  1159. cyi = -cyi;
  1160. cyi *= bounce; 
  1161. Status = true;
  1162. }
  1163. else if (cy < 0+padding) //bottom
  1164. {
  1165. cy = 0+padding; 
  1166. cyi = -cyi;
  1167. cyi *= bounce; 
  1168. Status = true;
  1169. }
  1170. }
  1171. else if(ztrans2>CELL && ztrans2<CELL*2 && 
  1172. xtrans2>CELL*2 && xtrans2<CELL*3)
  1173. {
  1174. if (cx < CELL*2+padding)//left
  1175. {
  1176. cx = CELL*2+padding; 
  1177. cxi = -cxi;
  1178. cxi *= bounce; 
  1179. Status = true;
  1180. }
  1181. else if (cx > CELL*3-padding)//right
  1182. {
  1183. cx = CELL*3-padding; 
  1184. cxi = -cxi;
  1185. cxi *= bounce; 
  1186. Status = true;
  1187. }
  1188. if (cy > CELL/4-padding) //top
  1189. {
  1190. cy = CELL/4-padding; 
  1191. cyi = -cyi;
  1192. cyi *= bounce; 
  1193. Status = true;
  1194. }
  1195. else if (cy < 0+padding) //bottom
  1196. {
  1197. cy = 0+padding; 
  1198. cyi = -cyi;
  1199. cyi *= bounce; 
  1200. Status = true;
  1201. }
  1202. if (cz < CELL+padding) //front
  1203. {
  1204. cz = CELL+padding; 
  1205. czi = -czi;
  1206. czi *= bounce; 
  1207. Status = true;
  1208. }
  1209. }
  1210. else if(ztrans2>CELL*5 && ztrans2<CELL*6 && 
  1211. xtrans2>CELL && xtrans2<CELL*2)
  1212. {
  1213. if (cy > CELL/4-padding) //top
  1214. {
  1215. cy = CELL/4-padding; 
  1216. cyi = -cyi;
  1217. cyi *= bounce; 
  1218. Status = true;
  1219. }
  1220. else if (cy < 0+padding) //bottom
  1221. {
  1222. cy = 0+padding; 
  1223. cyi = -cyi;
  1224. cyi *= bounce; 
  1225. Status = true;
  1226. }
  1227. if (cz > CELL*6-padding) //back
  1228. {
  1229. cz = CELL*6-padding; 
  1230. czi = -czi;
  1231. czi *= bounce; 
  1232. Status = true;
  1233. }
  1234. else if (cz < CELL*5+padding) //front
  1235. {
  1236. cz = CELL*5+padding; 
  1237. czi = -czi;
  1238. czi *= bounce; 
  1239. Status = true;
  1240. }
  1241. }
  1242. else if(ztrans2>CELL*3 && ztrans2<CELL*4 && 
  1243. xtrans2>CELL && xtrans2<CELL*2)
  1244. {
  1245. if (cy > CELL/4-padding) //top
  1246. {
  1247. cy = CELL/4-padding; 
  1248. cyi = -cyi;
  1249. cyi *= bounce; 
  1250. Status = true;
  1251. }
  1252. else if (cy < 0+padding) //bottom
  1253. {
  1254. cy = 0+padding; 
  1255. cyi = -cyi;
  1256. cyi *= bounce; 
  1257. Status = true;
  1258. }
  1259. if (cz > CELL*4-padding) //back
  1260. {
  1261. cz = CELL*4-padding; 
  1262. czi = -czi;
  1263. czi *= bounce; 
  1264. Status = true;
  1265. }
  1266. else if (cz < CELL*3+padding) //front
  1267. {
  1268. cz = CELL*3+padding; 
  1269. czi = -czi;
  1270. czi *= bounce; 
  1271. Status = true;
  1272. }
  1273. }
  1274. else if(ztrans2>CELL && ztrans2<CELL*2 && 
  1275. xtrans2>CELL && xtrans2<CELL*2)
  1276. {
  1277. if (cx > CELL*2-padding) //right
  1278. {
  1279. cx = CELL*2-padding; 
  1280. cxi = -cxi;
  1281. cxi *= bounce; 
  1282. Status = true;
  1283. }
  1284. if (cy > CELL/4-padding) //top
  1285. {
  1286. cy = CELL/4-padding; 
  1287. cyi = -cyi;
  1288. cyi *= bounce; 
  1289. Status = true;
  1290. }
  1291. else if (cy < 0+padding) //bottom
  1292. {
  1293. cy = 0+padding; 
  1294. cyi = -cyi;
  1295. cyi *= bounce; 
  1296. Status = true;
  1297. }
  1298. if (cz > CELL*2-padding) //back
  1299. {
  1300. cz = CELL*2-padding; 
  1301. czi = -czi;
  1302. czi *= bounce; 
  1303. Status = true;
  1304. }
  1305. else if(ztrans2>0 && ztrans2<CELL && 
  1306. xtrans2>CELL && xtrans2<CELL*2)
  1307. {
  1308. if (cx < CELL+padding)//left
  1309. {
  1310. cx = CELL+padding; 
  1311. cxi = -cxi;
  1312. cxi *= bounce; 
  1313. Status = true;
  1314. }
  1315. else if (cx > CELL*2-padding)//right
  1316. {
  1317. cx = CELL*2-padding; 
  1318. cxi = -cxi;
  1319. cxi *= bounce; 
  1320. Status = true;
  1321. }
  1322. if (cy > CELL/4-padding) //top
  1323. {
  1324. cy = CELL/4-padding; 
  1325. cyi = -cyi;
  1326. cyi *= bounce; 
  1327. Status = true;
  1328. }
  1329. else if (cy < 0+padding) //bottom
  1330. {
  1331. cy = 0+padding; 
  1332. cyi = -cyi;
  1333. cyi *= bounce; 
  1334. Status = true;
  1335. if (cz < 0+padding && 
  1336. (cx < CELL*1+CELL*3/8+padding || 
  1337. cx > CELL*2-CELL*3/8-padding)) //[4 7]front door
  1338. {
  1339. cz = 0+padding;
  1340. czi = -czi;
  1341. czi *= bounce; 
  1342. Status = true;
  1343. }
  1344. }
  1345. else if(ztrans2>CELL*5 && ztrans2<CELL*6 && 
  1346. xtrans2>0 && xtrans2<CELL)
  1347. {
  1348. if (cx < 0+padding) //left
  1349. {
  1350. cx = 0+padding; 
  1351. cxi = -cxi;
  1352. cxi *= bounce; 
  1353. Status = true;
  1354. }
  1355. if (cy > CELL/4-padding) //top
  1356. {
  1357. cy = CELL/4-padding; 
  1358. cyi = -cyi;
  1359. cyi *= bounce; 
  1360. Status = true;
  1361. }
  1362. else if (cy < 0+padding) //bottom
  1363. {
  1364. cy = 0+padding; 
  1365. cyi = -cyi;
  1366. cyi *= bounce; 
  1367. Status = true;
  1368. }
  1369. if (cz > CELL*6-padding) //back
  1370. {
  1371. cz = CELL*6-padding; 
  1372. czi = -czi;
  1373. czi *= bounce; 
  1374. Status = true;
  1375. }
  1376. else if(ztrans2>CELL*4 && ztrans2<CELL*5 && 
  1377. xtrans2>0 && xtrans2<CELL)
  1378. {
  1379. if (cx < 0+padding)//left
  1380. {
  1381. cx = 0+padding; 
  1382. cxi = -cxi;
  1383. cxi *= bounce; 
  1384. Status = true;
  1385. }
  1386. else if (cx > CELL-padding)//right
  1387. {
  1388. cx = CELL-padding; 
  1389. cxi = -cxi;
  1390. cxi *= bounce; 
  1391. Status = true;
  1392. }
  1393. if (cy > CELL/4-padding) //top
  1394. {
  1395. cy = CELL/4-padding; 
  1396. cyi = -cyi;
  1397. cyi *= bounce; 
  1398. Status = true;
  1399. }
  1400. else if (cy < 0+padding) //bottom
  1401. {
  1402. cy = 0+padding; 
  1403. cyi = -cyi;
  1404. cyi *= bounce; 
  1405. Status = true;
  1406. }
  1407. if (cz < CELL*4+padding) //front
  1408. {
  1409. cz = CELL*4+padding; 
  1410. czi = -czi;
  1411. czi *= bounce; 
  1412. Status = true;
  1413. }
  1414. }
  1415. else if(ztrans2>CELL*3 && ztrans2<CELL*4 && 
  1416. xtrans2>0 && xtrans2<CELL)
  1417. {
  1418. if (cx < 0+padding) //left
  1419. {
  1420. cx = 0+padding; 
  1421. cxi = -cxi;
  1422. cxi *= bounce; 
  1423. Status = true;
  1424. }
  1425. if (cy > CELL/4-padding) //top
  1426. {
  1427. cy = CELL/4-padding; 
  1428. cyi = -cyi;
  1429. cyi *= bounce; 
  1430. Status = true;
  1431. }
  1432. else if (cy < 0+padding) //bottom
  1433. {
  1434. cy = 0+padding; 
  1435. cyi = -cyi;
  1436. cyi *= bounce; 
  1437. Status = true;
  1438. }
  1439. if (cz > CELL*4-padding) //back
  1440. {
  1441. cz = CELL*4-padding; 
  1442. czi = -czi;
  1443. czi *= bounce; 
  1444. Status = true;
  1445. }
  1446. }
  1447. else if(ztrans2>CELL*2 && ztrans2<CELL*3 && 
  1448. xtrans2>0 && xtrans2<CELL)
  1449. {
  1450. if (cx < 0+padding)//left
  1451. {
  1452. cx = 0+padding; 
  1453. cxi = -cxi;
  1454. cxi *= bounce; 
  1455. Status = true;
  1456. }
  1457. else if (cx > CELL-padding)//right
  1458. {
  1459. cx = CELL-padding; 
  1460. cxi = -cxi;
  1461. cxi *= bounce; 
  1462. Status = true;
  1463. }
  1464. if (cy > CELL/4-padding) //top
  1465. {
  1466. cy = CELL/4-padding; 
  1467. cyi = -cyi;
  1468. cyi *= bounce; 
  1469. Status = true;
  1470. }
  1471. else if (cy < 0+padding) //bottom
  1472. {
  1473. cy = 0+padding; 
  1474. cyi = -cyi;
  1475. cyi *= bounce; 
  1476. Status = true;
  1477. }
  1478. }
  1479. else if(ztrans2>CELL && ztrans2<CELL*2 && 
  1480. xtrans2>0 && xtrans2<CELL)
  1481. {
  1482. if (cx < 0+padding)//left
  1483. {
  1484. cx = 0+padding; 
  1485. cxi = -cxi;
  1486. cxi *= bounce; 
  1487. Status = true;
  1488. }
  1489. if (cy > CELL/4-padding) //top
  1490. {
  1491. cy = CELL/4-padding; 
  1492. cyi = -cyi;
  1493. cyi *= bounce; 
  1494. Status = true;
  1495. }
  1496. else if (cy < 0+padding) //bottom
  1497. {
  1498. cy = 0+padding; 
  1499. cyi = -cyi;
  1500. cyi *= bounce; 
  1501. Status = true;
  1502. }
  1503. if (cz < CELL+padding) //front
  1504. {
  1505. cz = CELL+padding; 
  1506. czi = -czi;
  1507. czi *= bounce; 
  1508. Status = true;
  1509. }
  1510. }
  1511. return Status;
  1512. }
  1513. inline bool DetectPartCollision(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  1514. {
  1515. bool Status = false;
  1516. if( xtrans2 > CELL*3 && xtrans2 < CELL*5 &&
  1517. ztrans2 > CELL*6 && ztrans2 < CELL*7 ) //[11][21]
  1518. {
  1519. if (cx > CELL*5-padding) //right
  1520. {
  1521. cx = CELL*5-padding; 
  1522. cxi = -cxi;
  1523. cxi *= bounce; 
  1524. Status = true;
  1525. }
  1526. else if (cx < CELL*3+padding)//left
  1527. {
  1528. cx = CELL*3+padding; 
  1529. cxi = -cxi;
  1530. cxi *= bounce; 
  1531. Status = true;
  1532. }
  1533. if (cy > CELL/4-padding) //top
  1534. {
  1535. cy = CELL/4-padding; 
  1536. cyi = -cyi;
  1537. cyi *= bounce; 
  1538. Status = true;
  1539. }
  1540. else if (cy < 0+padding) //bottom
  1541. {
  1542. cy = 0+padding; 
  1543. cyi = -cyi;
  1544. cyi *= bounce; 
  1545. Status = true;
  1546. }
  1547. if (cz > CELL*7-padding) //back
  1548. {
  1549. cz = CELL*7-padding; 
  1550. czi = -czi;
  1551. czi *= bounce; 
  1552. Status = true;
  1553. }
  1554. else if (cz < CELL*6+padding) //front
  1555. {
  1556. cz = CELL*6+padding; 
  1557. czi = -czi;
  1558. czi *= bounce; 
  1559. Status = true;
  1560. }
  1561. }
  1562. else if( xtrans2 > 0 && xtrans2 < CELL*4 &&
  1563. ztrans2 > CELL*5 && ztrans2 < CELL*6 ) //[22][32][42][52]
  1564. {
  1565. if (cx > CELL*4-padding) //right
  1566. {
  1567. cx = CELL*4-padding; 
  1568. cxi = -cxi;
  1569. cxi *= bounce; 
  1570. Status = true;
  1571. }
  1572. else if (cx < 0+padding)//left
  1573. {
  1574. cx = 0+padding; 
  1575. cxi = -cxi;
  1576. cxi *= bounce; 
  1577. Status = true;
  1578. }
  1579. if (cy > CELL/4-padding) //top
  1580. {
  1581. cy = CELL/4-padding; 
  1582. cyi = -cyi;
  1583. cyi *= bounce; 
  1584. Status = true;
  1585. }
  1586. else if (cy < 0+padding) //bottom
  1587. {
  1588. cy = 0+padding; 
  1589. cyi = -cyi;
  1590. cyi *= bounce; 
  1591. Status = true;
  1592. }
  1593. if (cz > CELL*6-padding) //back
  1594. {
  1595. cz = CELL*6-padding; 
  1596. czi = -czi;
  1597. czi *= bounce; 
  1598. Status = true;
  1599. }
  1600. else if (cz < CELL*5+padding) //front
  1601. {
  1602. cz = CELL*5+padding; 
  1603. czi = -czi;
  1604. czi *= bounce; 
  1605. Status = true;
  1606. }
  1607. }
  1608. else if( xtrans2 > CELL*3 && xtrans2 < CELL*4 &&
  1609. ztrans2 > CELL*3 && ztrans2 < CELL*5 ) //[23][24]
  1610. {
  1611. if (cx > CELL*4-padding) //right
  1612. {
  1613. cx = CELL*4-padding; 
  1614. cxi = -cxi;
  1615. cxi *= bounce; 
  1616. Status = true;
  1617. }
  1618. else if (cx < CELL*3+padding)//left
  1619. {
  1620. cx = CELL*3+padding; 
  1621. cxi = -cxi;
  1622. cxi *= bounce; 
  1623. Status = true;
  1624. }
  1625. if (cy > CELL/4-padding) //top
  1626. {
  1627. cy = CELL/4-padding; 
  1628. cyi = -cyi;
  1629. cyi *= bounce; 
  1630. Status = true;
  1631. }
  1632. else if (cy < 0+padding) //bottom
  1633. {
  1634. cy = 0+padding; 
  1635. cyi = -cyi;
  1636. cyi *= bounce; 
  1637. Status = true;
  1638. }
  1639. if (cz > CELL*5-padding) //back
  1640. {
  1641. cz = CELL*5-padding; 
  1642. czi = -czi;
  1643. czi *= bounce; 
  1644. Status = true;
  1645. }
  1646. else if (cz < CELL*3+padding) //front
  1647. {
  1648. cz = CELL*3+padding; 
  1649. czi = -czi;
  1650. czi *= bounce; 
  1651. Status = true;
  1652. }
  1653. }
  1654. else if( xtrans2 > 0 && xtrans2 < CELL &&
  1655. ztrans2 > CELL*4 && ztrans2 < CELL*5 ) //[53]
  1656. {
  1657. if (cx > CELL-padding) //right
  1658. {
  1659. cx = CELL-padding; 
  1660. cxi = -cxi;
  1661. cxi *= bounce; 
  1662. Status = true;
  1663. }
  1664. else if (cx < 0+padding)//left
  1665. {
  1666. cx = 0+padding; 
  1667. cxi = -cxi;
  1668. cxi *= bounce; 
  1669. Status = true;
  1670. }
  1671. if (cy > CELL/4-padding) //top
  1672. {
  1673. cy = CELL/4-padding; 
  1674. cyi = -cyi;
  1675. cyi *= bounce; 
  1676. Status = true;
  1677. }
  1678. else if (cy < 0+padding) //bottom
  1679. {
  1680. cy = 0+padding; 
  1681. cyi = -cyi;
  1682. cyi *= bounce; 
  1683. Status = true;
  1684. }
  1685. if (cz > CELL*5-padding) //back
  1686. {
  1687. cz = CELL*5-padding; 
  1688. czi = -czi;
  1689. czi *= bounce; 
  1690. Status = true;
  1691. }
  1692. else if (cz < CELL*4+padding) //front
  1693. {
  1694. cz = CELL*4+padding; 
  1695. czi = -czi;
  1696. czi *= bounce; 
  1697. Status = true;
  1698. }
  1699. }
  1700. else if( xtrans2 > CELL*2 && xtrans2 < CELL*3 &&
  1701. ztrans2 > CELL && ztrans2 < CELL*4 ) //[34][35][36]
  1702. {
  1703. if (cx > CELL*3-padding) //right
  1704. {
  1705. cx = CELL*3-padding; 
  1706. cxi = -cxi;
  1707. cxi *= bounce; 
  1708. Status = true;
  1709. }
  1710. else if (cx < CELL*2+padding)//left
  1711. {
  1712. cx = CELL*2+padding; 
  1713. cxi = -cxi;
  1714. cxi *= bounce; 
  1715. Status = true;
  1716. }
  1717. if (cy > CELL/4-padding) //top
  1718. {
  1719. cy = CELL/4-padding; 
  1720. cyi = -cyi;
  1721. cyi *= bounce; 
  1722. Status = true;
  1723. }
  1724. else if (cy < 0+padding) //bottom
  1725. {
  1726. cy = 0+padding; 
  1727. cyi = -cyi;
  1728. cyi *= bounce; 
  1729. Status = true;
  1730. }
  1731. if (cz > CELL*4-padding) //back
  1732. {
  1733. cz = CELL*4-padding; 
  1734. czi = -czi;
  1735. czi *= bounce; 
  1736. Status = true;
  1737. }
  1738. else if (cz < CELL+padding) //front
  1739. {
  1740. cz = CELL+padding; 
  1741. czi = -czi;
  1742. czi *= bounce; 
  1743. Status = true;
  1744. }
  1745. }
  1746. else if( xtrans2 > CELL && xtrans2 < CELL*2 &&
  1747. ztrans2 > CELL*3 && ztrans2 < CELL*4 ) //[44]
  1748. {
  1749. if (cx > CELL*2-padding) //right
  1750. {
  1751. cx = CELL*2-padding; 
  1752. cxi = -cxi;
  1753. cxi *= bounce; 
  1754. Status = true;
  1755. }
  1756. else if (cx < CELL+padding)//left
  1757. {
  1758. cx = CELL+padding; 
  1759. cxi = -cxi;
  1760. cxi *= bounce; 
  1761. Status = true;
  1762. }
  1763. if (cy > CELL/4-padding) //top
  1764. {
  1765. cy = CELL/4-padding; 
  1766. cyi = -cyi;
  1767. cyi *= bounce; 
  1768. Status = true;
  1769. }
  1770. else if (cy < 0+padding) //bottom
  1771. {
  1772. cy = 0+padding; 
  1773. cyi = -cyi;
  1774. cyi *= bounce; 
  1775. Status = true;
  1776. }
  1777. if (cz > CELL*4-padding) //back
  1778. {
  1779. cz = CELL*4-padding; 
  1780. czi = -czi;
  1781. czi *= bounce; 
  1782. Status = true;
  1783. }
  1784. else if (cz < CELL*3+padding) //front
  1785. {
  1786. cz = CELL*3+padding; 
  1787. czi = -czi;
  1788. czi *= bounce; 
  1789. Status = true;
  1790. }
  1791. }
  1792. else if( xtrans2 > 0 && xtrans2 < CELL &&
  1793. ztrans2 > CELL && ztrans2 < CELL*4 ) //[54][55][56]
  1794. {
  1795. if (cx > CELL-padding) //right
  1796. {
  1797. cx = CELL-padding; 
  1798. cxi = -cxi;
  1799. cxi *= bounce; 
  1800. Status = true;
  1801. }
  1802. else if (cx < 0+padding)//left
  1803. {
  1804. cx = 0+padding; 
  1805. cxi = -cxi;
  1806. cxi *= bounce; 
  1807. Status = true;
  1808. }
  1809. if (cy > CELL/4-padding) //top
  1810. {
  1811. cy = CELL/4-padding; 
  1812. cyi = -cyi;
  1813. cyi *= bounce; 
  1814. Status = true;
  1815. }
  1816. else if (cy < 0+padding) //bottom
  1817. {
  1818. cy = 0+padding; 
  1819. cyi = -cyi;
  1820. cyi *= bounce; 
  1821. Status = true;
  1822. }
  1823. if (cz > CELL*4-padding) //back
  1824. {
  1825. cz = CELL*4-padding; 
  1826. czi = -czi;
  1827. czi *= bounce; 
  1828. Status = true;
  1829. }
  1830. else if (cz < CELL+padding) //front
  1831. {
  1832. cz = CELL+padding; 
  1833. czi = -czi;
  1834. czi *= bounce; 
  1835. Status = true;
  1836. }
  1837. }
  1838. else if( xtrans2 > CELL && xtrans2 < CELL*2 &&
  1839. ztrans2 > 0 && ztrans2 < CELL*2 ) //[46][47]
  1840. {
  1841. if (cx > CELL*2-padding) //right
  1842. {
  1843. cx = CELL*2-padding; 
  1844. cxi = -cxi;
  1845. cxi *= bounce; 
  1846. Status = true;
  1847. }
  1848. else if (cx < CELL+padding)//left
  1849. {
  1850. cx = CELL+padding; 
  1851. cxi = -cxi;
  1852. cxi *= bounce; 
  1853. Status = true;
  1854. }
  1855. if (cy > CELL/4-padding) //top
  1856. {
  1857. cy = CELL/4-padding; 
  1858. cyi = -cyi;
  1859. cyi *= bounce; 
  1860. Status = true;
  1861. }
  1862. else if (cy < 0+padding) //bottom
  1863. {
  1864. cy = 0+padding; 
  1865. cyi = -cyi;
  1866. cyi *= bounce; 
  1867. Status = true;
  1868. }
  1869. if (cz > CELL*2-padding) //back
  1870. {
  1871. cz = CELL*2-padding; 
  1872. czi = -czi;
  1873. czi *= bounce; 
  1874. Status = true;
  1875. }
  1876. else if (cz < 0+padding) //front
  1877. {
  1878. cz = 0+padding; 
  1879. czi = -czi;
  1880. czi *= bounce; 
  1881. Status = true;
  1882. }
  1883. }
  1884.   return Status;
  1885. }
  1886. inline void Ricochet()
  1887. {
  1888.   int i;
  1889.   
  1890.   for (i = 0; i < MAX_PARTICLES; i++)
  1891.   {
  1892.     if (i == 0)
  1893.       particle[i][shots_fired].size = 2;
  1894.     else
  1895.       particle[i][shots_fired].size = GLdouble((rand()%25)+25)/50;
  1896.     
  1897.     particle[i][shots_fired].triangle_x1 = GLdouble((rand()%50)-25)/75.f;
  1898.     particle[i][shots_fired].triangle_x2 = GLdouble((rand()%50)-25)/75.f;
  1899.     particle[i][shots_fired].triangle_x3 = GLdouble((rand()%50)-25)/75.f;
  1900.     particle[i][shots_fired].triangle_y1 = GLdouble((rand()%50)-25)/75.f;
  1901.     particle[i][shots_fired].triangle_y2 = GLdouble((rand()%50)-25)/75.f;
  1902.     particle[i][shots_fired].triangle_y3 = GLdouble((rand()%50)-25)/75.f;
  1903.     
  1904.     particle[i][shots_fired].triangle_z1 = GLdouble((rand()%50)-25)/75.f;
  1905.     particle[i][shots_fired].triangle_z2 = GLdouble((rand()%50)-25)/75.f;
  1906.     particle[i][shots_fired].triangle_z3 = GLdouble((rand()%50)-25)/75.f;
  1907.     particle[i][shots_fired].triangle_rotate_x = rand()%360;
  1908.     particle[i][shots_fired].triangle_rotate_y = rand()%360;
  1909.     particle[i][shots_fired].triangle_rotate_z = rand()%360;
  1910.     particle[i][shots_fired].triangle_rotate_xi = GLdouble((rand()%50)-25)/5;
  1911.     particle[i][shots_fired].triangle_rotate_yi = GLdouble((rand()%50)-25)/5;
  1912.     particle[i][shots_fired].triangle_rotate_zi = GLdouble((rand()%50)-25)/5;
  1913.     particle[i][shots_fired].life = 1;
  1914.     particle[i][shots_fired].fade = GLdouble(rand()%100)/5000 + .02f;
  1915.     particle[i][shots_fired].x = fire_x;
  1916.     particle[i][shots_fired].y = fire_y;
  1917.     particle[i][shots_fired].z = fire_z;
  1918.     GLdouble angle = rand()%360;
  1919.     GLdouble angle2 = rand()%360;
  1920.     GLdouble speed = GLdouble(rand()%100) / 500;
  1921.     GLdouble Hyp = Hypot(angle,angle2);
  1922.     particle[i][shots_fired].xi = sin(Hypot(angle,Hyp))*speed + fire_xp;
  1923.     particle[i][shots_fired].yi = cos(Hypot(angle,Hyp))*speed + fire_yp;
  1924.     particle[i][shots_fired].zi = cos(Hypot(angle2,Hyp))*speed + fire_zp;
  1925.   }
  1926. }
  1927. int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing
  1928. {
  1929.   glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // Clear The Screen And The Depth Buffer
  1930.   if(getOut == false && gameOver == false)
  1931.   {
  1932. XP *= 0.8f; 
  1933. ZP *= 0.8f; 
  1934. xtrans2 += XP/10;
  1935. ztrans2 += ZP/10;
  1936. xtrans = -xtrans2;
  1937. ztrans = -ztrans2;
  1938.  
  1939. DetectCollision(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  1940. zprot*=.9f;
  1941. _heading += zprot;
  1942. heading = mouse_3d_x + _heading;
  1943.     
  1944. yrot = heading;
  1945. sceneroty = 360.0f - yrot;
  1946. glLoadIdentity();
  1947. m16_kicki += -m16_kick/50;
  1948. m16_kick += m16_kicki/10;
  1949. m16_kicki *= .8f;
  1950. m16_kick *= .9f;
  1951. if (m16_kick != 0)
  1952. {
  1953. glRotated(-m16_kick,1,0,0);
  1954. glTranslatef(0,0,-m16_kick);
  1955. }
  1956. glLoadIdentity();
  1957. glRotated(mouse_3d_y,1.f,0,0);
  1958. glRotated(sceneroty,0,1.f,0); 
  1959. glTranslated(xtrans, -25 ,ztrans); // Player position
  1960. glDisable(GL_BLEND);
  1961. for(int i=0; i<18; i++)
  1962. {
  1963. glCallList(ROOM[i]);
  1964. }
  1965. glEnable(GL_BLEND);
  1966. //******************************* first ***************************************************
  1967.   if(xtrans2 > CELL*3 && xtrans2 < CELL*5 &&
  1968.   ztrans2 > CELL*6 && ztrans2 < CELL*7 )
  1969.   {   
  1970.   firstTrigger = true;
  1971.   }else
  1972.   {
  1973.   firstTrigger = false;
  1974.   if(firstHitStatus == false)//re-init
  1975.   {
  1976.   firstHitCount = 0; 
  1977.   firstTransX   = CELL*4+20.0f;
  1978.   firstTransZ   = CELL*6+20.0f;
  1979.   }
  1980.   }
  1981. if(firstTrigger == true )
  1982. {   
  1983. if(firstHitStatus == false)
  1984. {
  1985. glPushMatrix();
  1986. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** ////////////////////
  1987.   
  1988. if((xtrans2 - firstTransX) > 15) //if on the left, move towards right
  1989. {
  1990. firstTransXi += 0.001f; 
  1991. }else if((firstTransX - xtrans2) > 15) //if on the right, move towards left
  1992. {
  1993. firstTransXi -= 0.001f; 
  1994. }else
  1995. {
  1996. firstTransXi = 0.0f; 
  1997. }
  1998. firstTransX += firstTransXi;
  1999. glTranslatef(firstTransX, 0, 0);
  2000. if((ztrans2 - firstTransZ) > 15) //if on the front, move forwards 
  2001. {
  2002. firstTransZi += 0.001f; 
  2003. }else if((firstTransZ - ztrans2) > 15) //if on the back, move backwards
  2004. {
  2005. firstTransZi -= 0.001f; 
  2006. }else
  2007. {
  2008. firstTransZi = 0.0f; 
  2009. firstTransZ += firstTransZi;
  2010. glTranslatef( 0, 0, firstTransZ);
  2011. // If the monster approach to player
  2012. if( ABS(xtrans2-firstTransX) < 15 
  2013. && ABS(ztrans2-firstTransZ) < 15 )
  2014. gameOver = true;
  2015. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** //////////////////// 
  2016. firstRotateX = atan ( (ztrans2 - firstTransZ) / (xtrans2 - firstTransX + 0.5f) ) / piover180;
  2017.   
  2018. //if degree is in 3rd quadrant
  2019. if( (ztrans2 - firstTransZ) < 0.0f && (xtrans2 - firstTransX) < 0.0f ) 
  2020. {
  2021. if(firstRotateX < 15.0f)
  2022. firstMult = 135.0f;
  2023. else if(firstRotateX > 15.0f && firstRotateX < 30.0f)
  2024. firstMult = 110.0f;
  2025. else if(firstRotateX > 30.0f && firstRotateX < 45.0f)
  2026. firstMult = 85.0f;
  2027. else if(firstRotateX > 45.0f && firstRotateX < 60.0f)
  2028. firstMult = 60.0f;
  2029. else if(firstRotateX > 60.0f && firstRotateX < 75.0f)
  2030. firstMult = 35.0f;
  2031. else
  2032. firstMult = 10.0f;
  2033. }
  2034. //if degree is in 2nd quadrant(z=+;x=-)
  2035. else if( (xtrans2 - firstTransX) < 0.0f &&  (ztrans2 - firstTransZ) > 0.0f) 
  2036. {
  2037. if(firstRotateX > -15.0f)
  2038. firstMult = -165.0f;
  2039. else if(firstRotateX > -30.0f && firstRotateX < -15.0f)
  2040. firstMult = -140.0f;
  2041. else if(firstRotateX > -45.0f && firstRotateX < -30.0f)
  2042. firstMult = -115.0f;
  2043. else if(firstRotateX > -60.0f && firstRotateX < -45.0f)
  2044. firstMult = -90.0f;
  2045. else if(firstRotateX > -75.0f && firstRotateX < -60.0f)
  2046. firstMult = -65.0f;
  2047. else
  2048. firstMult = -40.0f;
  2049. //firstMult = -135.0f * firstRotateX/90.0f -150.0f;
  2050. }
  2051. //if degree is in 4th quadrant(z=-;x=+)
  2052. else if( (xtrans2 - firstTransX) > 0.0f &&  (ztrans2 - firstTransZ) < 0.0f) 
  2053. {
  2054. if(firstRotateX > -15.0f)
  2055. firstMult = 20.0f;
  2056. else if(firstRotateX > -30.0f && firstRotateX < -15.0f)
  2057. firstMult = 40.0f;
  2058. else if(firstRotateX > -45.0f && firstRotateX < -30.0f)
  2059. firstMult = 60.0f;
  2060. else if(firstRotateX > -60.0f && firstRotateX < -45.0f)
  2061. firstMult = 80.0f;
  2062. else if(firstRotateX > -75.0f && firstRotateX < -60.0f)
  2063. firstMult = 100.0f;
  2064. else
  2065. firstMult = 140.0f;
  2066. //firstMult =   -45.0f * firstRotateX/90.0f + 15.0f;
  2067. }
  2068. //if degree is in 1st quadrant
  2069. else
  2070. {
  2071. firstMult = -165.0f * firstRotateX/90.0f - 15.0f; 
  2072. }
  2073. glRotatef(firstMult + firstRotateX, 0.0f, 1.0f, 0.0f); // Face the player around the Y-Axis
  2074. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** ////////////////////
  2075. if( ( ( atan((firstTransZ - fire_z)/(firstTransX - fire_x + 0.5f)) 
  2076. - atan((ztrans2 -firstTransZ)/(xtrans2 - firstTransX + 0.5f)) < 0.0873*2 
  2077. && //10 degrees in radian
  2078. atan((firstTransZ - fire_z)/(firstTransX - fire_x + 0.5f))
  2079. - atan((ztrans2 -firstTransZ)/(xtrans2 - firstTransX + 0.5f)) > -0.0873*2 
  2080.   ) &&
  2081. isFire == true 
  2082. &&
  2083.   ( (ztrans2 > firstTransZ && firstTransZ > fire_z) ||
  2084. (ztrans2 < firstTransZ && firstTransZ < fire_z) 
  2085.   ) &&
  2086.   ( (xtrans2 > firstTransX && firstTransX > fire_x) ||
  2087. (xtrans2 < firstTransX && firstTransX < fire_x) 
  2088.   )
  2089. || //second condition
  2090. ( ( atan((firstTransZ - fire_z)/(firstTransX - fire_x + 0.5f)) 
  2091. - atan((ztrans2 -firstTransZ)/(xtrans2 - firstTransX + 0.5f)) > 0.0873*33 
  2092. || //165 degrees in radian
  2093. atan((firstTransZ - fire_z)/(firstTransX - fire_x + 0.5f))
  2094. - atan((ztrans2 -firstTransZ)/(xtrans2 - firstTransX + 0.5f)) < -0.0873*33 
  2095.    ) && //-165 degrees in radian
  2096.  isFire == true 
  2097. )
  2098.   )
  2099. {
  2100. firstHitCount += 1;
  2101. if( firstHitCount == 3)
  2102. firstHitStatus = true;
  2103. point += 10;
  2104. }
  2105. }
  2106. glTranslatef( 0, 25.0f, 0); //move the model upwards
  2107. glCallList(MODEL);
  2108. glPopMatrix();
  2109. }
  2110. else
  2111. glTranslatef( firstTransX, 15.0f, firstTransZ);
  2112. glRotatef(firstMult + firstRotateX, 0.0f, 1.0f, 0.0f);
  2113.   
  2114. if(ABS(firstRotateY) < 89.0f)
  2115. {
  2116. firstRotateYi += 0.1f;
  2117. }else
  2118. {
  2119. firstRotateYi = 0.0f;
  2120. }  
  2121. firstRotateY += firstRotateYi;  
  2122. glRotatef(firstRotateY, 1.0f, 0.0f, -1.0f);  // Fall@Rotate the object around the XZ-Axis
  2123. glCallList(MODEL);
  2124. }
  2125. }
  2126. //******************************* second ***************************************************
  2127. if(xtrans2 > 0 && xtrans2 < CELL*4 &&
  2128. ztrans2 > CELL*5 && ztrans2 < CELL*6 )
  2129. {   
  2130.   secondTrigger = true;
  2131. }else
  2132. {
  2133.   secondTrigger = false;
  2134.   if(secondHitStatus == false)//re-init
  2135.   {
  2136.   secondHitCount = 0; 
  2137.   secondTransX   = CELL*2+20.0f;
  2138.   secondTransZ   = CELL*5+20.0f;
  2139.   }
  2140. }
  2141. if(secondTrigger == true )
  2142. {   
  2143. if(secondHitStatus == false)
  2144. {
  2145. glPushMatrix();
  2146. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** ////////////////////
  2147.   
  2148. if((xtrans2 - secondTransX) > 15) //if on the left, move towards right
  2149. {
  2150. secondTransXi += 0.001f; 
  2151. }else if((secondTransX - xtrans2) > 15) //if on the right, move towards left
  2152. {
  2153. secondTransXi -= 0.001f; 
  2154. }else
  2155. {
  2156. secondTransXi = 0.0f; 
  2157. }
  2158. secondTransX += secondTransXi;
  2159. glTranslatef(secondTransX, 0, 0);
  2160. if((ztrans2 - secondTransZ) > 15) //if on the front, move forwards 
  2161. {
  2162. secondTransZi += 0.001f; 
  2163. }else if((secondTransZ - ztrans2) > 15) //if on the back, move backwards
  2164. {
  2165. secondTransZi -= 0.001f; 
  2166. }else
  2167. {
  2168. secondTransZi = 0.0f; 
  2169. secondTransZ += secondTransZi;
  2170. glTranslatef( 0, 0, secondTransZ);
  2171. // If the monster approach to player
  2172. if( ABS(xtrans2-secondTransX) < 15 
  2173. && ABS(ztrans2-secondTransZ) < 15 )
  2174. gameOver = true;
  2175. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** //////////////////// 
  2176. secondRotateX = atan ( (ztrans2 - secondTransZ) / (xtrans2 - secondTransX + 0.5f) ) / piover180;
  2177.   
  2178. //if degree is in 3rd quadrant
  2179. if( (ztrans2 - secondTransZ) < 0.0f && (xtrans2 - secondTransX) < 0.0f ) 
  2180. {
  2181. if(secondRotateX < 15.0f)
  2182. secondMult = 135.0f;
  2183. else if(secondRotateX > 15.0f && secondRotateX < 30.0f)
  2184. secondMult = 110.0f;
  2185. else if(secondRotateX > 30.0f && secondRotateX < 45.0f)
  2186. secondMult = 85.0f;
  2187. else if(secondRotateX > 45.0f && secondRotateX < 60.0f)
  2188. secondMult = 60.0f;
  2189. else if(secondRotateX > 60.0f && secondRotateX < 75.0f)
  2190. secondMult = 35.0f;
  2191. else
  2192. secondMult = 10.0f;
  2193. }
  2194. //if degree is in 2nd quadrant(z=+;x=-)
  2195. else if( (xtrans2 - secondTransX) < 0.0f &&  (ztrans2 - secondTransZ) > 0.0f) 
  2196. {
  2197. if(secondRotateX > -15.0f)
  2198. secondMult = -165.0f;
  2199. else if(secondRotateX > -30.0f && secondRotateX < -15.0f)
  2200. secondMult = -140.0f;
  2201. else if(secondRotateX > -45.0f && secondRotateX < -30.0f)
  2202. secondMult = -115.0f;
  2203. else if(secondRotateX > -60.0f && secondRotateX < -45.0f)
  2204. secondMult = -90.0f;
  2205. else if(secondRotateX > -75.0f && secondRotateX < -60.0f)
  2206. secondMult = -65.0f;
  2207. else
  2208. secondMult = -40.0f;
  2209. //secondMult = -135.0f * secondRotateX/90.0f -150.0f;
  2210. }
  2211. //if degree is in 4th quadrant(z=-;x=+)
  2212. else if( (xtrans2 - secondTransX) > 0.0f &&  (ztrans2 - secondTransZ) < 0.0f) 
  2213. {
  2214. if(secondRotateX > -15.0f)
  2215. secondMult = 20.0f;
  2216. else if(secondRotateX > -30.0f && secondRotateX < -15.0f)
  2217. secondMult = 40.0f;
  2218. else if(secondRotateX > -45.0f && secondRotateX < -30.0f)
  2219. secondMult = 60.0f;
  2220. else if(secondRotateX > -60.0f && secondRotateX < -45.0f)
  2221. secondMult = 80.0f;
  2222. else if(secondRotateX > -75.0f && secondRotateX < -60.0f)
  2223. secondMult = 100.0f;
  2224. else
  2225. secondMult = 140.0f;
  2226. //secondMult =   -45.0f * secondRotateX/90.0f + 15.0f;
  2227. }
  2228. //if degree is in 1st quadrant
  2229. else
  2230. {
  2231. secondMult = -165.0f * secondRotateX/90.0f - 15.0f; 
  2232. }
  2233.   
  2234. glRotatef(secondMult + secondRotateX, 0.0f, 1.0f, 0.0f); // Face the player around the Y-Axis
  2235. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** ////////////////////
  2236. if( ( ( atan((secondTransZ - fire_z)/(secondTransX - fire_x + 0.5f)) 
  2237. - atan((ztrans2 -secondTransZ)/(xtrans2 - secondTransX + 0.5f)) < 0.0873*2 
  2238. && //10 degrees in radian
  2239. atan((secondTransZ - fire_z)/(secondTransX - fire_x + 0.5f))
  2240. - atan((ztrans2 -secondTransZ)/(xtrans2 - secondTransX + 0.5f)) > -0.0873*2 
  2241.   ) &&
  2242. isFire == true 
  2243. &&
  2244.   ( (ztrans2 > secondTransZ && secondTransZ > fire_z) ||
  2245. (ztrans2 < secondTransZ && secondTransZ < fire_z) 
  2246.   ) &&
  2247.   ( (xtrans2 > secondTransX && secondTransX > fire_x) ||
  2248. (xtrans2 < secondTransX && secondTransX < fire_x) 
  2249.   )
  2250. || //second condition
  2251. ( ( atan((secondTransZ - fire_z)/(secondTransX - fire_x + 0.5f)) 
  2252. - atan((ztrans2 -secondTransZ)/(xtrans2 - secondTransX + 0.5f)) > 0.0873*33 
  2253. || //165 degrees in radian
  2254. atan((secondTransZ - fire_z)/(secondTransX - fire_x + 0.5f))
  2255. - atan((ztrans2 -secondTransZ)/(xtrans2 - secondTransX + 0.5f)) < -0.0873*33 
  2256.    ) && //-165 degrees in radian
  2257.  isFire == true 
  2258. )
  2259.   )
  2260. {
  2261. secondHitCount += 1;
  2262. if( secondHitCount == 3)
  2263. secondHitStatus = true;
  2264. point += 10;
  2265. }
  2266. }
  2267. glTranslatef( 0, 25.0f, 0); //move the model upwards
  2268. glCallList(MODEL);
  2269. glPopMatrix();
  2270. }
  2271. else
  2272. glTranslatef( secondTransX, 15.0f, secondTransZ);
  2273. glRotatef(secondMult + secondRotateX, 0.0f, 1.0f, 0.0f);
  2274.   
  2275. if(ABS(secondRotateY) < 89.0f)
  2276. {
  2277. secondRotateYi += 0.1f;
  2278. }else
  2279. {
  2280. secondRotateYi = 0.0f;
  2281. }  
  2282. secondRotateY += secondRotateYi;  
  2283. glRotatef(secondRotateY, 1.0f, 0.0f, -1.0f);  // Fall@Rotate the object around the XZ-Axis
  2284.  
  2285. glCallList(MODEL);
  2286. }
  2287. }
  2288. //******************************* third ***************************************************
  2289. if(xtrans2 > 0 && xtrans2 < CELL &&
  2290. ztrans2 > CELL*4 && ztrans2 < CELL*5 )
  2291. {   
  2292.   thirdTrigger = true;
  2293. }else
  2294. {
  2295.   thirdTrigger = false;
  2296.   if(thirdHitStatus == false)//re-init
  2297.   {
  2298.   thirdHitCount = 0; 
  2299.   thirdTransX   = 20.0f;
  2300.   thirdTransZ   = CELL*4+20.0f;
  2301.   }
  2302. }
  2303. if(thirdTrigger == true )
  2304. {   
  2305. if(thirdHitStatus == false)
  2306. {
  2307. glPushMatrix();
  2308. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** ////////////////////
  2309.   
  2310. if((xtrans2 - thirdTransX) > 15) //if on the left, move towards right
  2311. {
  2312. thirdTransXi += 0.001f; 
  2313. }else if((thirdTransX - xtrans2) > 15) //if on the right, move towards left
  2314. {
  2315. thirdTransXi -= 0.001f; 
  2316. }else
  2317. {
  2318. thirdTransXi = 0.0f; 
  2319. }
  2320. thirdTransX += thirdTransXi;
  2321. glTranslatef(thirdTransX, 0, 0);
  2322. if((ztrans2 - thirdTransZ) > 15) //if on the front, move forwards 
  2323. {
  2324. thirdTransZi += 0.001f; 
  2325. }else if((thirdTransZ - ztrans2) > 15) //if on the back, move backwards
  2326. {
  2327. thirdTransZi -= 0.001f; 
  2328. }else
  2329. {
  2330. thirdTransZi = 0.0f; 
  2331. thirdTransZ += thirdTransZi;
  2332. glTranslatef( 0, 0, thirdTransZ);
  2333. // If the monster approach to player
  2334. if( ABS(xtrans2-thirdTransX) < 15 
  2335. && ABS(ztrans2-thirdTransZ) < 15 )
  2336. gameOver = true;
  2337. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** //////////////////// 
  2338. thirdRotateX = atan ( (ztrans2 - thirdTransZ) / (xtrans2 - thirdTransX + 0.5f) ) / piover180;
  2339.   
  2340. //if degree is in 3rd quadrant
  2341. if( (ztrans2 - thirdTransZ) < 0.0f && (xtrans2 - thirdTransX) < 0.0f ) 
  2342. {
  2343. if(thirdRotateX < 15.0f)
  2344. thirdMult = 135.0f;
  2345. else if(thirdRotateX > 15.0f && thirdRotateX < 30.0f)
  2346. thirdMult = 110.0f;
  2347. else if(thirdRotateX > 30.0f && thirdRotateX < 45.0f)
  2348. thirdMult = 85.0f;
  2349. else if(thirdRotateX > 45.0f && thirdRotateX < 60.0f)
  2350. thirdMult = 60.0f;
  2351. else if(thirdRotateX > 60.0f && thirdRotateX < 75.0f)
  2352. thirdMult = 35.0f;
  2353. else
  2354. thirdMult = 10.0f;
  2355. }
  2356. //if degree is in 2nd quadrant(z=+;x=-)
  2357. else if( (xtrans2 - thirdTransX) < 0.0f &&  (ztrans2 - thirdTransZ) > 0.0f) 
  2358. {
  2359. if(thirdRotateX > -15.0f)
  2360. thirdMult = -165.0f;
  2361. else if(thirdRotateX > -30.0f && thirdRotateX < -15.0f)
  2362. thirdMult = -140.0f;
  2363. else if(thirdRotateX > -45.0f && thirdRotateX < -30.0f)
  2364. thirdMult = -115.0f;
  2365. else if(thirdRotateX > -60.0f && thirdRotateX < -45.0f)
  2366. thirdMult = -90.0f;
  2367. else if(thirdRotateX > -75.0f && thirdRotateX < -60.0f)
  2368. thirdMult = -65.0f;
  2369. else
  2370. thirdMult = -40.0f;
  2371. //thirdMult = -135.0f * thirdRotateX/90.0f -150.0f;
  2372. }
  2373. //if degree is in 4th quadrant(z=-;x=+)
  2374. else if( (xtrans2 - thirdTransX) > 0.0f &&  (ztrans2 - thirdTransZ) < 0.0f) 
  2375. {
  2376. if(thirdRotateX > -15.0f)
  2377. thirdMult = 20.0f;
  2378. else if(thirdRotateX > -30.0f && thirdRotateX < -15.0f)
  2379. thirdMult = 40.0f;
  2380. else if(thirdRotateX > -45.0f && thirdRotateX < -30.0f)
  2381. thirdMult = 60.0f;
  2382. else if(thirdRotateX > -60.0f && thirdRotateX < -45.0f)
  2383. thirdMult = 80.0f;
  2384. else if(thirdRotateX > -75.0f && thirdRotateX < -60.0f)
  2385. thirdMult = 100.0f;
  2386. else
  2387. thirdMult = 140.0f;
  2388. //thirdMult =   -45.0f * thirdRotateX/90.0f + 15.0f;
  2389. }
  2390. //if degree is in 1st quadrant
  2391. else
  2392. {
  2393. thirdMult = -165.0f * thirdRotateX/90.0f - 15.0f; 
  2394. }
  2395.   
  2396. glRotatef(thirdMult + thirdRotateX, 0.0f, 1.0f, 0.0f); // Face the player around the Y-Axis
  2397. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** ////////////////////
  2398. if( ( ( atan((thirdTransZ - fire_z)/(thirdTransX - fire_x + 0.5f)) 
  2399. - atan((ztrans2 -thirdTransZ)/(xtrans2 - thirdTransX + 0.5f)) < 0.0873*2 
  2400. && //10 degrees in radian
  2401. atan((thirdTransZ - fire_z)/(thirdTransX - fire_x + 0.5f))
  2402. - atan((ztrans2 -thirdTransZ)/(xtrans2 - thirdTransX + 0.5f)) > -0.0873*2 
  2403.   ) &&
  2404. isFire == true 
  2405. &&
  2406.   ( (ztrans2 > thirdTransZ && thirdTransZ > fire_z) ||
  2407. (ztrans2 < thirdTransZ && thirdTransZ < fire_z) 
  2408.   ) &&
  2409.   ( (xtrans2 > thirdTransX && thirdTransX > fire_x) ||
  2410. (xtrans2 < thirdTransX && thirdTransX < fire_x) 
  2411.   )
  2412. || //second condition
  2413. ( ( atan((thirdTransZ - fire_z)/(thirdTransX - fire_x + 0.5f)) 
  2414. - atan((ztrans2 -thirdTransZ)/(xtrans2 - thirdTransX + 0.5f)) > 0.0873*33 
  2415. || //165 degrees in radian
  2416. atan((thirdTransZ - fire_z)/(thirdTransX - fire_x + 0.5f))
  2417. - atan((ztrans2 -thirdTransZ)/(xtrans2 - thirdTransX + 0.5f)) < -0.0873*33 
  2418.    ) && //-165 degrees in radian
  2419.  isFire == true 
  2420. )
  2421.   )
  2422. {
  2423. thirdHitCount += 1;
  2424. if( thirdHitCount == 3)
  2425. thirdHitStatus = true;
  2426. point += 10;
  2427. }
  2428. }
  2429. glTranslatef( 0, 25.0f, 0); //move the model upwards
  2430. glCallList(MODEL);
  2431. glPopMatrix();
  2432. }
  2433. else
  2434. glTranslatef( thirdTransX, 15.0f, thirdTransZ);
  2435. glRotatef(thirdMult + thirdRotateX, 0.0f, 1.0f, 0.0f);
  2436.   
  2437. if(ABS(thirdRotateY) < 89.0f)
  2438. {
  2439. thirdRotateYi += 0.1f;
  2440. }else
  2441. {
  2442. thirdRotateYi = 0.0f;
  2443. }  
  2444. thirdRotateY += thirdRotateYi;  
  2445. glRotatef(thirdRotateY, 1.0f, 0.0f, -1.0f);  // Fall@Rotate the object around the XZ-Axis
  2446.  
  2447. glCallList(MODEL);
  2448. }
  2449. }
  2450. //******************************* fourth ***************************************************
  2451. if(xtrans2 > CELL*2 && xtrans2 < CELL*3 &&
  2452. ztrans2 > CELL && ztrans2 < CELL*4 )
  2453. {   
  2454.   fourthTrigger = true;
  2455. }else
  2456. {
  2457.   fourthTrigger = false;
  2458.   if(fourthHitStatus == false)//re-init
  2459.   {
  2460.   fourthHitCount = 0; 
  2461.   fourthTransX   = CELL*2+20.0f;
  2462.   fourthTransZ   = CELL*2+20.0f;
  2463.   }
  2464. }
  2465. if(fourthTrigger == true )
  2466. {   
  2467. if(fourthHitStatus == false)
  2468. {
  2469. glPushMatrix();
  2470. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** ////////////////////
  2471.   
  2472. if((xtrans2 - fourthTransX) > 15) //if on the left, move towards right
  2473. {
  2474. fourthTransXi += 0.001f; 
  2475. }else if((fourthTransX - xtrans2) > 15) //if on the right, move towards left
  2476. {
  2477. fourthTransXi -= 0.001f; 
  2478. }else
  2479. {
  2480. fourthTransXi = 0.0f; 
  2481. }
  2482. fourthTransX += fourthTransXi;
  2483. glTranslatef(fourthTransX, 0, 0);
  2484. if((ztrans2 - fourthTransZ) > 15) //if on the front, move forwards 
  2485. {
  2486. fourthTransZi += 0.001f; 
  2487. }else if((fourthTransZ - ztrans2) > 15) //if on the back, move backwards
  2488. {
  2489. fourthTransZi -= 0.001f; 
  2490. }else
  2491. {
  2492. fourthTransZi = 0.0f; 
  2493. fourthTransZ += fourthTransZi;
  2494. glTranslatef( 0, 0, fourthTransZ);
  2495. // If the monster approach to player
  2496. if( ABS(xtrans2-fourthTransX) < 15 
  2497. && ABS(ztrans2-fourthTransZ) < 15 )
  2498. gameOver = true;
  2499. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** //////////////////// 
  2500. fourthRotateX = atan ( (ztrans2 - fourthTransZ) / (xtrans2 - fourthTransX + 0.5f) ) / piover180;
  2501.   
  2502. //if degree is in 3rd quadrant
  2503. if( (ztrans2 - fourthTransZ) < 0.0f && (xtrans2 - fourthTransX) < 0.0f ) 
  2504. {
  2505. if(fourthRotateX < 15.0f)
  2506. fourthMult = 135.0f;
  2507. else if(fourthRotateX > 15.0f && fourthRotateX < 30.0f)
  2508. fourthMult = 110.0f;
  2509. else if(fourthRotateX > 30.0f && fourthRotateX < 45.0f)
  2510. fourthMult = 85.0f;
  2511. else if(fourthRotateX > 45.0f && fourthRotateX < 60.0f)
  2512. fourthMult = 60.0f;
  2513. else if(fourthRotateX > 60.0f && fourthRotateX < 75.0f)
  2514. fourthMult = 35.0f;
  2515. else
  2516. fourthMult = 10.0f;
  2517. }
  2518. //if degree is in 2nd quadrant(z=+;x=-)
  2519. else if( (xtrans2 - fourthTransX) < 0.0f &&  (ztrans2 - fourthTransZ) > 0.0f) 
  2520. {
  2521. if(fourthRotateX > -15.0f)
  2522. fourthMult = -165.0f;
  2523. else if(fourthRotateX > -30.0f && fourthRotateX < -15.0f)
  2524. fourthMult = -140.0f;
  2525. else if(fourthRotateX > -45.0f && fourthRotateX < -30.0f)
  2526. fourthMult = -115.0f;
  2527. else if(fourthRotateX > -60.0f && fourthRotateX < -45.0f)
  2528. fourthMult = -90.0f;
  2529. else if(fourthRotateX > -75.0f && fourthRotateX < -60.0f)
  2530. fourthMult = -65.0f;
  2531. else
  2532. fourthMult = -40.0f;
  2533. //fourthMult = -135.0f * fourthRotateX/90.0f -150.0f;
  2534. }
  2535. //if degree is in 4th quadrant(z=-;x=+)
  2536. else if( (xtrans2 - fourthTransX) > 0.0f &&  (ztrans2 - fourthTransZ) < 0.0f) 
  2537. {
  2538. if(fourthRotateX > -15.0f)
  2539. fourthMult = 20.0f;
  2540. else if(fourthRotateX > -30.0f && fourthRotateX < -15.0f)
  2541. fourthMult = 40.0f;
  2542. else if(fourthRotateX > -45.0f && fourthRotateX < -30.0f)
  2543. fourthMult = 60.0f;
  2544. else if(fourthRotateX > -60.0f && fourthRotateX < -45.0f)
  2545. fourthMult = 80.0f;
  2546. else if(fourthRotateX > -75.0f && fourthRotateX < -60.0f)
  2547. fourthMult = 100.0f;
  2548. else
  2549. fourthMult = 140.0f;
  2550. //fourthMult =   -45.0f * fourthRotateX/90.0f + 15.0f;
  2551. }
  2552. //if degree is in 1st quadrant
  2553. else
  2554. {
  2555. fourthMult = -165.0f * fourthRotateX/90.0f - 15.0f; 
  2556. }
  2557.   
  2558. glRotatef(fourthMult + fourthRotateX, 0.0f, 1.0f, 0.0f); // Face the player around the Y-Axis
  2559. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** ////////////////////
  2560. if( ( ( atan((fourthTransZ - fire_z)/(fourthTransX - fire_x + 0.5f)) 
  2561. - atan((ztrans2 -fourthTransZ)/(xtrans2 - fourthTransX + 0.5f)) < 0.0873*2 
  2562. && //10 degrees in radian
  2563. atan((fourthTransZ - fire_z)/(fourthTransX - fire_x + 0.5f))
  2564. - atan((ztrans2 -fourthTransZ)/(xtrans2 - fourthTransX + 0.5f)) > -0.0873*2 
  2565.   ) &&
  2566. isFire == true 
  2567. &&
  2568.   ( (ztrans2 > fourthTransZ && fourthTransZ > fire_z) ||
  2569. (ztrans2 < fourthTransZ && fourthTransZ < fire_z) 
  2570.   ) &&
  2571.   ( (xtrans2 > fourthTransX && fourthTransX > fire_x) ||
  2572. (xtrans2 < fourthTransX && fourthTransX < fire_x) 
  2573.   )
  2574. || //second condition
  2575. ( ( atan((fourthTransZ - fire_z)/(fourthTransX - fire_x + 0.5f)) 
  2576. - atan((ztrans2 -fourthTransZ)/(xtrans2 - fourthTransX + 0.5f)) > 0.0873*33 
  2577. || //165 degrees in radian
  2578. atan((fourthTransZ - fire_z)/(fourthTransX - fire_x + 0.5f))
  2579. - atan((ztrans2 -fourthTransZ)/(xtrans2 - fourthTransX + 0.5f)) < -0.0873*33
  2580.    ) && //-165 degrees in radian
  2581.  isFire == true 
  2582. )
  2583.   )
  2584. {
  2585. fourthHitCount += 1;
  2586. if( fourthHitCount == 3)
  2587. fourthHitStatus = true;
  2588. point += 10;
  2589. }
  2590. }
  2591. glTranslatef( 0, 25.0f, 0); //move the model upwards
  2592. glCallList(MODEL);
  2593. glPopMatrix();
  2594. }
  2595. else
  2596. glTranslatef( fourthTransX, 15.0f, fourthTransZ);
  2597. glRotatef(fourthMult + fourthRotateX, 0.0f, 1.0f, 0.0f);
  2598.   
  2599. if(ABS(fourthRotateY) < 89.0f)
  2600. {
  2601. fourthRotateYi += 0.1f;
  2602. }else
  2603. {
  2604. fourthRotateYi = 0.0f;
  2605. }  
  2606. fourthRotateY += fourthRotateYi;  
  2607. glRotatef(fourthRotateY, 1.0f, 0.0f, -1.0f);  // Fall@Rotate the object around the XZ-Axis
  2608.  
  2609. glCallList(MODEL);
  2610. }
  2611. }
  2612. //******************************* fifth ***************************************************
  2613. if(xtrans2 > 0 && xtrans2 < CELL &&
  2614. ztrans2 > CELL && ztrans2 < CELL*4 )
  2615. {   
  2616.   fifthTrigger = true;
  2617. }else
  2618. {
  2619.   fifthTrigger = false;
  2620.   if(fifthHitStatus == false)//re-init
  2621.   {
  2622.   fifthHitCount = 0; 
  2623.   fifthTransX   = 20.0f;
  2624.   fifthTransZ   = CELL*2+20.0f;
  2625.   }
  2626. }
  2627. if(fifthTrigger == true )
  2628. {   
  2629. if(fifthHitStatus == false)
  2630. {
  2631. glPushMatrix();
  2632. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** ////////////////////
  2633.   
  2634. if((xtrans2 - fifthTransX) > 15) //if on the left, move towards right
  2635. {
  2636. fifthTransXi += 0.001f; 
  2637. }else if((fifthTransX - xtrans2) > 15) //if on the right, move towards left
  2638. {
  2639. fifthTransXi -= 0.001f; 
  2640. }else
  2641. {
  2642. fifthTransXi = 0.0f; 
  2643. }
  2644. fifthTransX += fifthTransXi;
  2645. glTranslatef(fifthTransX, 0, 0);
  2646. if((ztrans2 - fifthTransZ) > 15) //if on the front, move forwards 
  2647. {
  2648. fifthTransZi += 0.001f; 
  2649. }else if((fifthTransZ - ztrans2) > 15) //if on the back, move backwards
  2650. {
  2651. fifthTransZi -= 0.001f; 
  2652. }else
  2653. {
  2654. fifthTransZi = 0.0f; 
  2655. fifthTransZ += fifthTransZi;
  2656. glTranslatef( 0, 0, fifthTransZ);
  2657. // If the monster approach to player
  2658. if( ABS(xtrans2-fifthTransX) < 15 
  2659. && ABS(ztrans2-fifthTransZ) < 15 )
  2660. gameOver = true;
  2661. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** //////////////////// 
  2662. fifthRotateX = atan ( (ztrans2 - fifthTransZ) / (xtrans2 - fifthTransX + 0.5f) ) / piover180;
  2663.   
  2664. //if degree is in 3rd quadrant
  2665. if( (ztrans2 - fifthTransZ) < 0.0f && (xtrans2 - fifthTransX) < 0.0f ) 
  2666. {
  2667. if(fifthRotateX < 15.0f)
  2668. fifthMult = 135.0f;
  2669. else if(fifthRotateX > 15.0f && fifthRotateX < 30.0f)
  2670. fifthMult = 110.0f;
  2671. else if(fifthRotateX > 30.0f && fifthRotateX < 45.0f)
  2672. fifthMult = 85.0f;
  2673. else if(fifthRotateX > 45.0f && fifthRotateX < 60.0f)
  2674. fifthMult = 60.0f;
  2675. else if(fifthRotateX > 60.0f && fifthRotateX < 75.0f)
  2676. fifthMult = 35.0f;
  2677. else
  2678. fifthMult = 10.0f;
  2679. }
  2680. //if degree is in 2nd quadrant(z=+;x=-)
  2681. else if( (xtrans2 - fifthTransX) < 0.0f &&  (ztrans2 - fifthTransZ) > 0.0f) 
  2682. {
  2683. if(fifthRotateX > -15.0f)
  2684. fifthMult = -165.0f;
  2685. else if(fifthRotateX > -30.0f && fifthRotateX < -15.0f)
  2686. fifthMult = -140.0f;
  2687. else if(fifthRotateX > -45.0f && fifthRotateX < -30.0f)
  2688. fifthMult = -115.0f;
  2689. else if(fifthRotateX > -60.0f && fifthRotateX < -45.0f)
  2690. fifthMult = -90.0f;
  2691. else if(fifthRotateX > -75.0f && fifthRotateX < -60.0f)
  2692. fifthMult = -65.0f;
  2693. else
  2694. fifthMult = -40.0f;
  2695. //fifthMult = -135.0f * fifthRotateX/90.0f -150.0f;
  2696. }
  2697. //if degree is in 4th quadrant(z=-;x=+)
  2698. else if( (xtrans2 - fifthTransX) > 0.0f &&  (ztrans2 - fifthTransZ) < 0.0f) 
  2699. {
  2700. if(fifthRotateX > -15.0f)
  2701. fifthMult = 20.0f;
  2702. else if(fifthRotateX > -30.0f && fifthRotateX < -15.0f)
  2703. fifthMult = 40.0f;
  2704. else if(fifthRotateX > -45.0f && fifthRotateX < -30.0f)
  2705. fifthMult = 60.0f;
  2706. else if(fifthRotateX > -60.0f && fifthRotateX < -45.0f)
  2707. fifthMult = 80.0f;
  2708. else if(fifthRotateX > -75.0f && fifthRotateX < -60.0f)
  2709. fifthMult = 100.0f;
  2710. else
  2711. fifthMult = 140.0f;
  2712. //fifthMult =   -45.0f * fifthRotateX/90.0f + 15.0f;
  2713. }
  2714. //if degree is in 1st quadrant
  2715. else
  2716. {
  2717. fifthMult = -165.0f * fifthRotateX/90.0f - 15.0f; 
  2718. }
  2719.   
  2720. glRotatef(fifthMult + fifthRotateX, 0.0f, 1.0f, 0.0f); // Face the player around the Y-Axis
  2721. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** ////////////////////
  2722. if( ( ( atan((fifthTransZ - fire_z)/(fifthTransX - fire_x + 0.5f)) 
  2723. - atan((ztrans2 -fifthTransZ)/(xtrans2 - fifthTransX + 0.5f)) < 0.0873*2 
  2724. && //10 degrees in radian
  2725. atan((fifthTransZ - fire_z)/(fifthTransX - fire_x + 0.5f))
  2726. - atan((ztrans2 -fifthTransZ)/(xtrans2 - fifthTransX + 0.5f)) > -0.0873*2 
  2727.   ) &&
  2728. isFire == true 
  2729. &&
  2730.   ( (ztrans2 > fifthTransZ && fifthTransZ > fire_z) ||
  2731. (ztrans2 < fifthTransZ && fifthTransZ < fire_z) 
  2732.   ) &&
  2733.   ( (xtrans2 > fifthTransX && fifthTransX > fire_x) ||
  2734. (xtrans2 < fifthTransX && fifthTransX < fire_x) 
  2735.   )
  2736. || //second condition
  2737. ( ( atan((fifthTransZ - fire_z)/(fifthTransX - fire_x + 0.5f)) 
  2738. - atan((ztrans2 -fifthTransZ)/(xtrans2 - fifthTransX + 0.5f)) > 0.0873*33 
  2739. || //165 degrees in radian
  2740. atan((fifthTransZ - fire_z)/(fifthTransX - fire_x + 0.5f))
  2741. - atan((ztrans2 -fifthTransZ)/(xtrans2 - fifthTransX + 0.5f)) < -0.0873*33 
  2742.    ) && //-165 degrees in radian
  2743.  isFire == true 
  2744. )
  2745.   )
  2746. {
  2747. fifthHitCount += 1;
  2748. if( fifthHitCount == 3)
  2749. fifthHitStatus = true;
  2750. point += 10;
  2751. }
  2752. }
  2753. glTranslatef( 0, 25.0f, 0); //move the model upwards
  2754. glCallList(MODEL);
  2755. glPopMatrix();
  2756. }
  2757. else
  2758. glTranslatef( fifthTransX, 15.0f, fifthTransZ);
  2759. glRotatef(fifthMult + fifthRotateX, 0.0f, 1.0f, 0.0f);
  2760.   
  2761. if(ABS(fifthRotateY) < 89.0f)
  2762. {
  2763. fifthRotateYi += 0.1f;
  2764. }else
  2765. {
  2766. fifthRotateYi = 0.0f;
  2767. }  
  2768. fifthRotateY += fifthRotateYi;  
  2769. glRotatef(fifthRotateY, 1.0f, 0.0f, -1.0f);  // Fall@Rotate the object around the XZ-Axis
  2770.  
  2771. glCallList(MODEL);
  2772. }
  2773. }
  2774. //******************************* sixth ***************************************************
  2775. if(xtrans2 > CELL && xtrans2 < CELL*2 &&
  2776. ztrans2 > 0 && ztrans2 < CELL*3 )
  2777. {   
  2778.   sixthTrigger = true;
  2779. }else
  2780. {
  2781.   sixthTrigger = false;
  2782.   if(sixthHitStatus == false)//re-init
  2783.   {
  2784.   sixthHitCount = 0; 
  2785.   sixthTransX   = CELL*2-20.0f;
  2786.   sixthTransZ   = 20.0f;
  2787.   }
  2788. }
  2789. if(sixthTrigger == true )
  2790. {   
  2791. if(sixthHitStatus == false)
  2792. {
  2793. glPushMatrix();
  2794. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** ////////////////////
  2795.   
  2796. if((xtrans2 - sixthTransX) > 15) //if on the left, move towards right
  2797. {
  2798. sixthTransXi += 0.001f; 
  2799. }else if((sixthTransX - xtrans2) > 15) //if on the right, move towards left
  2800. {
  2801. sixthTransXi -= 0.001f; 
  2802. }else
  2803. {
  2804. sixthTransXi = 0.0f; 
  2805. }
  2806. sixthTransX += sixthTransXi;
  2807. glTranslatef(sixthTransX, 0, 0);
  2808. if((ztrans2 - sixthTransZ) > 15) //if on the front, move forwards 
  2809. {
  2810. sixthTransZi += 0.001f; 
  2811. }else if((sixthTransZ - ztrans2) > 15) //if on the back, move backwards
  2812. {
  2813. sixthTransZi -= 0.001f; 
  2814. }else
  2815. {
  2816. sixthTransZi = 0.0f; 
  2817. sixthTransZ += sixthTransZi;
  2818. glTranslatef( 0, 0, sixthTransZ);
  2819. // If the monster approach to player
  2820. if( ABS(xtrans2-sixthTransX) < 15 
  2821. && ABS(ztrans2-sixthTransZ) < 15 )
  2822. gameOver = true;
  2823. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** //////////////////// 
  2824. sixthRotateX = atan ( (ztrans2 - sixthTransZ) / (xtrans2 - sixthTransX + 0.5f) ) / piover180;
  2825.   
  2826. //if degree is in 3rd quadrant
  2827. if( (ztrans2 - sixthTransZ) < 0.0f && (xtrans2 - sixthTransX) < 0.0f ) 
  2828. {
  2829. if(sixthRotateX < 15.0f)
  2830. sixthMult = 135.0f;
  2831. else if(sixthRotateX > 15.0f && sixthRotateX < 30.0f)
  2832. sixthMult = 110.0f;
  2833. else if(sixthRotateX > 30.0f && sixthRotateX < 45.0f)
  2834. sixthMult = 85.0f;
  2835. else if(sixthRotateX > 45.0f && sixthRotateX < 60.0f)
  2836. sixthMult = 60.0f;
  2837. else if(sixthRotateX > 60.0f && sixthRotateX < 75.0f)
  2838. sixthMult = 35.0f;
  2839. else
  2840. sixthMult = 10.0f;
  2841. }
  2842. //if degree is in 2nd quadrant(z=+;x=-)
  2843. else if( (xtrans2 - sixthTransX) < 0.0f &&  (ztrans2 - sixthTransZ) > 0.0f) 
  2844. {
  2845. if(sixthRotateX > -15.0f)
  2846. sixthMult = -165.0f;
  2847. else if(sixthRotateX > -30.0f && sixthRotateX < -15.0f)
  2848. sixthMult = -140.0f;
  2849. else if(sixthRotateX > -45.0f && sixthRotateX < -30.0f)
  2850. sixthMult = -115.0f;
  2851. else if(sixthRotateX > -60.0f && sixthRotateX < -45.0f)
  2852. sixthMult = -90.0f;
  2853. else if(sixthRotateX > -75.0f && sixthRotateX < -60.0f)
  2854. sixthMult = -65.0f;
  2855. else
  2856. sixthMult = -40.0f;
  2857. //sixthMult = -135.0f * sixthRotateX/90.0f -150.0f;
  2858. }
  2859. //if degree is in 4th quadrant(z=-;x=+)
  2860. else if( (xtrans2 - sixthTransX) > 0.0f &&  (ztrans2 - sixthTransZ) < 0.0f) 
  2861. {
  2862. if(sixthRotateX > -15.0f)
  2863. sixthMult = 20.0f;
  2864. else if(sixthRotateX > -30.0f && sixthRotateX < -15.0f)
  2865. sixthMult = 40.0f;
  2866. else if(sixthRotateX > -45.0f && sixthRotateX < -30.0f)
  2867. sixthMult = 60.0f;
  2868. else if(sixthRotateX > -60.0f && sixthRotateX < -45.0f)
  2869. sixthMult = 80.0f;
  2870. else if(sixthRotateX > -75.0f && sixthRotateX < -60.0f)
  2871. sixthMult = 100.0f;
  2872. else
  2873. sixthMult = 140.0f;
  2874. //sixthMult =   -45.0f * sixthRotateX/90.0f + 15.0f;
  2875. }
  2876. //if degree is in 1st quadrant
  2877. else
  2878. {
  2879. sixthMult = -165.0f * sixthRotateX/90.0f - 15.0f; 
  2880. }
  2881.   
  2882. glRotatef(sixthMult + sixthRotateX, 0.0f, 1.0f, 0.0f); // Face the player around the Y-Axis
  2883. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** ////////////////////
  2884. if( ( ( atan((sixthTransZ - fire_z)/(sixthTransX - fire_x + 0.5f)) 
  2885. - atan((ztrans2 -sixthTransZ)/(xtrans2 - sixthTransX + 0.5f)) < 0.0873*2 
  2886. && //10 degrees in radian
  2887. atan((sixthTransZ - fire_z)/(sixthTransX - fire_x + 0.5f))
  2888. - atan((ztrans2 -sixthTransZ)/(xtrans2 - sixthTransX + 0.5f)) > -0.0873*2 
  2889.   ) &&
  2890. isFire == true 
  2891. &&
  2892.   ( (ztrans2 > sixthTransZ && sixthTransZ > fire_z) ||
  2893. (ztrans2 < sixthTransZ && sixthTransZ < fire_z) 
  2894.   ) &&
  2895.   ( (xtrans2 > sixthTransX && sixthTransX > fire_x) ||
  2896. (xtrans2 < sixthTransX && sixthTransX < fire_x) 
  2897.   )
  2898. || //second condition
  2899. ( ( atan((sixthTransZ - fire_z)/(sixthTransX - fire_x + 0.5f)) 
  2900. - atan((ztrans2 -sixthTransZ)/(xtrans2 - sixthTransX + 0.5f)) > 0.0873*33 
  2901. || //165 degrees in radian
  2902. atan((sixthTransZ - fire_z)/(sixthTransX - fire_x + 0.5f))
  2903. - atan((ztrans2 -sixthTransZ)/(xtrans2 - sixthTransX + 0.5f)) < -0.0873*33 
  2904.    ) && //-165 degrees in radian
  2905.  isFire == true 
  2906. )
  2907.   )
  2908. {
  2909. sixthHitCount += 1;
  2910. if( sixthHitCount == 3)
  2911. sixthHitStatus = true;
  2912. point += 10;
  2913. }
  2914. }
  2915. glTranslatef( 0, 25.0f, 0); //move the model upwards
  2916. glCallList(MODEL);
  2917. glPopMatrix();
  2918. }
  2919. else
  2920. glTranslatef( sixthTransX, 15.0f, sixthTransZ);
  2921. glRotatef(sixthMult + sixthRotateX, 0.0f, 1.0f, 0.0f);
  2922.   
  2923. if(ABS(sixthRotateY) < 89.0f)
  2924. {
  2925. sixthRotateYi += 0.1f;
  2926. }else
  2927. {
  2928. sixthRotateYi = 0.0f;
  2929. }  
  2930. sixthRotateY += sixthRotateYi;  
  2931. glRotatef(sixthRotateY, 1.0f, 0.0f, -1.0f);  // Fall@Rotate the object around the XZ-Axis
  2932.  
  2933. glCallList(MODEL);
  2934. }
  2935. }
  2936. //******************************* End ***************************************************
  2937. // Determine if you have fired a weapon
  2938. if (isFire)
  2939. {
  2940. PlaySound("Data/rifle.WAV", NULL, SND_ASYNC);
  2941. m16_kicki = 1;
  2942.     
  2943. shots_fired++;
  2944. if (shots_fired > MAX_SHOTS_FIRED-1) 
  2945. shots_fired = 0;
  2946. isFireComplete = false;
  2947. isFire = false;
  2948. fire_x = -xtrans;
  2949. fire_y = 10;
  2950. fire_z = -ztrans;
  2951. fire_xp = -(GLdouble)sin(heading*piover180) / 5;
  2952. fire_yp = -(GLdouble)tan(mouse_3d_y*piover180) / 5;
  2953. fire_zp = -(GLdouble)cos(heading*piover180) / 5;
  2954. }
  2955. int fire_counter = 0;
  2956. // Begin calculations for the projectile
  2957. while (!isFireComplete)
  2958. {     
  2959. fire_counter++;
  2960. fire_x += fire_xp;
  2961. fire_y += fire_yp;
  2962. fire_z += fire_zp;
  2963.       
  2964. if (DetectPartCollision(fire_x,  fire_y,  fire_z, BlankNum, BlankNum, BlankNum, 0, 0))
  2965. {
  2966. isFireComplete = true;
  2967. Ricochet();
  2968. isRicochet = true; 
  2969. }
  2970. else if (fire_counter > 10000)
  2971. {
  2972. isFireComplete = true;
  2973. // Determine if it was the M16 that was fired.
  2974. if (isRicochet)
  2975. {   
  2976. int i;
  2977. bool isRicochetComplete = true;
  2978.     
  2979. glDisable(GL_TEXTURE_2D);
  2980. glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
  2981. for (int j = 0; j < MAX_SHOTS_FIRED; j++)
  2982. {
  2983. for (i = 8; i < MAX_PARTICLES; i++)
  2984. {
  2985. if (particle[i][j].life > 0)
  2986. {
  2987. isRicochetComplete = false;
  2988. particle[i][j].x += particle[i][j].xi;
  2989. particle[i][j].y += particle[i][j].yi;
  2990. particle[i][j].z += particle[i][j].zi;
  2991. DetectPartCollision(particle[i][j].x,  particle[i][j].y,  particle[i][j].z,
  2992. particle[i][j].xi, particle[i][j].yi, particle[i][j].zi, 0, .75f);
  2993. particle[i][j].yi -= .01f;  // cheap simulated gravity
  2994. particle[i][j].xi *= .99;
  2995. particle[i][j].yi *= .99;
  2996. particle[i][j].zi *= .99;
  2997. particle[i][j].life -= particle[i][j].fade;
  2998.         
  2999. glLoadIdentity();
  3000. glRotated(mouse_3d_y,1.f,0,0);
  3001. glRotated(sceneroty,0,1.f,0);
  3002. glTranslated(xtrans,-10,ztrans);  
  3003. glTranslated(particle[i][j].x,particle[i][j].y,particle[i][j].z);
  3004. glRotated(-sceneroty,0,1.f,0);
  3005. glRotated(-mouse_3d_y,1.f,0,0);
  3006. particle[i][j].triangle_rotate_x += particle[i][j].triangle_rotate_xi;
  3007. particle[i][j].triangle_rotate_y += particle[i][j].triangle_rotate_yi;
  3008. particle[i][j].triangle_rotate_z += particle[i][j].triangle_rotate_zi;
  3009. particle[i][j].triangle_rotate_xi -= particle[i][j].fade;
  3010. particle[i][j].triangle_rotate_yi -= particle[i][j].fade;
  3011. particle[i][j].triangle_rotate_zi -= particle[i][j].fade;
  3012. glRotated(particle[i][j].triangle_rotate_x,1,0,0);
  3013. glRotated(particle[i][j].triangle_rotate_y,0,1,0);
  3014. glRotated(particle[i][j].triangle_rotate_z,0,0,1);
  3015. glColor4d(0,0,0,particle[i][j].life);
  3016. glBegin(GL_TRIANGLES);
  3017. glVertex3d(particle[i][j].triangle_x1, particle[i][j].triangle_y1, particle[i][j].triangle_z1);
  3018. glVertex3d(particle[i][j].triangle_x2, particle[i][j].triangle_y2, particle[i][j].triangle_z2);
  3019. glVertex3d(particle[i][j].triangle_x3, particle[i][j].triangle_y3, particle[i][j].triangle_z3);
  3020. glEnd();
  3021. }
  3022. }
  3023. }
  3024. glEnable(GL_TEXTURE_2D);
  3025. glDisable(GL_DEPTH_TEST);
  3026. glBlendFunc(GL_SRC_ALPHA,GL_ONE);
  3027. glBindTexture(GL_TEXTURE_2D, texture[3]);
  3028. // Display particles of the ricochet from the M16
  3029. for (j = 0; j < MAX_SHOTS_FIRED; j++)
  3030. {
  3031. for (i = 0; i < 8; i++)
  3032. {     
  3033. if (particle[i][j].life > 0)
  3034. {
  3035. isRicochetComplete = false;
  3036. particle[i][j].x += particle[i][j].xi/2;
  3037. particle[i][j].y += particle[i][j].yi/2;
  3038. particle[i][j].z += particle[i][j].zi/2;
  3039. particle[i][j].yi += .01f;
  3040. particle[i][j].xi *= .9f;
  3041. particle[i][j].yi *= .9f;
  3042. particle[i][j].zi *= .9f;
  3043.         
  3044. particle[i][j].life -= particle[i][j].fade/2;
  3045. glLoadIdentity();
  3046. glRotated(mouse_3d_y,1.f,0,0);
  3047. glRotated(sceneroty,0,1.f,0);
  3048. glTranslated(xtrans,-10,ztrans);       
  3049. glTranslated(particle[i][j].x,particle[i][j].y,particle[i][j].z);
  3050. glRotated(-sceneroty,0,1.f,0);
  3051. glRotated(-mouse_3d_y,1.f,0,0);
  3052. glColor4d(.18f,.17f,.15f,particle[i][j].life);
  3053. glBegin(GL_QUADS);
  3054. glTexCoord2d(1,1); glVertex3d( particle[i][j].size, particle[i][j].size,0);
  3055. glTexCoord2d(1,0); glVertex3d( particle[i][j].size,-particle[i][j].size,0);
  3056. glTexCoord2d(0,0); glVertex3d(-particle[i][j].size,-particle[i][j].size,0);
  3057. glTexCoord2d(0,1); glVertex3d(-particle[i][j].size, particle[i][j].size,0);
  3058. glEnd();
  3059. }  
  3060. }
  3061. }
  3062. glEnable(GL_DEPTH_TEST);
  3063. if (isRicochetComplete)
  3064. isRicochet = false;
  3065. }
  3066.  
  3067. // Crosshair  
  3068. glDisable(GL_DEPTH_TEST);
  3069. glLoadIdentity();
  3070. glTranslated(0.0f,0.0f,-35.0f);   
  3071. glBlendFunc(GL_SRC_ALPHA,GL_ONE);
  3072. glColor4f(1,1,1,1);
  3073. glBindTexture(GL_TEXTURE_2D,texture[2]);
  3074. glBegin(GL_QUADS);
  3075. glTexCoord2d(1,1); glVertex2f(1,1);
  3076. glTexCoord2d(1,0); glVertex2f(1,-1);
  3077. glTexCoord2d(0,0); glVertex2f(-1,-1);
  3078. glTexCoord2d(0,1); glVertex2f(-1,1);
  3079. glEnd(); 
  3080.   
  3081. glDisable(GL_DEPTH_TEST);   
  3082. glBindTexture(GL_TEXTURE_2D, textures[0].texID); // Select Our Font Texture
  3083. glColor4d(1,1,1,1);
  3084. glPrint(150,250,1,"Distance: %4.0f", Hypot( (xtrans2-CELL*3/2.0), (ztrans2-5.0) ) / 10.0 );
  3085. //////////// *** NEW *** ////////// EXIT ///////////// *** NEW *** ////////////////////
  3086. // If player get out
  3087. if( Hypot( (xtrans2-CELL*3/2.0), (ztrans2-5.0) ) / 10.0 < 5.0 )
  3088. getOut = true; 
  3089. //////////// *** NEW *** ////////// EXIT ///////////// *** NEW *** ////////////////////
  3090. if( firstTrigger == true && firstHitCount < 3)
  3091. {
  3092. glColor4d(1,0,0,1);
  3093. glPrint(150,230,1,"ALERT!");
  3094. }else if( secondTrigger == true && secondHitCount < 3)
  3095. {
  3096. glColor4d(1,0,0,1);
  3097. glPrint(150,230,1,"ALERT!");
  3098. }else if( thirdTrigger == true && thirdHitCount < 3)
  3099. {
  3100. glColor4d(1,0,0,1);
  3101. glPrint(150,230,1,"ALERT!");
  3102. }else if( fourthTrigger == true && fourthHitCount < 3)
  3103. {
  3104. glColor4d(1,0,0,1);
  3105. glPrint(150,230,1,"ALERT!");
  3106. }else if( fifthTrigger == true && fifthHitCount < 3)
  3107. {
  3108. glColor4d(1,0,0,1);
  3109. glPrint(150,230,1,"ALERT!");
  3110. }else if( sixthTrigger == true && sixthHitCount < 3)
  3111. {
  3112. glColor4d(1,0,0,1);
  3113. glPrint(150,230,1,"ALERT!");
  3114. }
  3115. glColor4d(0,0,1,1);
  3116. glPrint(150,210,1,"point: %4.0d", point);
  3117. glColor4d(1,1,1,1);
  3118. glEnable(GL_DEPTH_TEST);
  3119. glDisable(GL_TEXTURE_2D);
  3120.     glEnable(GL_TEXTURE_2D);
  3121. //  ESTABLISH A FPS FRAMERATE COUNTER
  3122. if (isFPS)
  3123. glDisable(GL_DEPTH_TEST);
  3124. frames++;    
  3125. if (frames%10 == 0) 
  3126. {
  3127. Time2 = TimerGetTime()/1000;
  3128. DiffTime = ABS(Time2-Time1);      
  3129. Time1 = TimerGetTime()/1000;     
  3130. if (DiffTime != 0)
  3131. FPS = 10/(DiffTime);
  3132. }             
  3133.     
  3134. glBindTexture(GL_TEXTURE_2D, textures[0].texID); // Select Our Font Texture
  3135. glColor4d(1,1,1,1);
  3136. glPrint(-350,250,1,"FPS: %4.0f", FPS);
  3137.   
  3138. glPrint(-350,230,1,"firstTransX: %4.2f", firstTransX);
  3139. glPrint(-350,210,1,"firstTransZ: %4.2f", firstTransZ);
  3140. glPrint(-350,190,1,"(xtrans2-firstTransX): %4.2f", (xtrans2-firstTransX) );
  3141. glPrint(-350,170,1,"xtrans2: %4.2f", xtrans2);
  3142. glPrint(-350,150,1,"ztrans2: %4.2f", ztrans2);
  3143. glPrint(-350,130,1,"(ztrans2-firstTransZ): %4.2f", (ztrans2-firstTransZ) );
  3144. glPrint(-350,110,1,"firstRotateX@atan: %4.2f", firstRotateX );
  3145. glPrint(-350,90,1,"multiplier+atan: %4.2f", firstMult+firstRotateX);
  3146. glPrint(-350,70,1,"fire_x: %4.2f", fire_x );
  3147. glPrint(-350,50,1,"fire_y: %4.2f", fire_y );
  3148. glPrint(-350,30,1,"fire_z: %4.2f", fire_z );
  3149. glPrint(-350,10,1,"deg(M-H): %4.2f", atan((firstTransZ - fire_z)/(firstTransX - fire_x + 0.5f))/ piover180 );
  3150. glPrint(-350,-10,1,"deg(P-M): %4.2f", atan((ztrans2 -firstTransZ)/(xtrans2 - firstTransX + 0.5f))/ piover180);
  3151. glPrint(-350,-30,1,"condition: %4.2f", atan((firstTransZ - fire_z)/(firstTransX - fire_x + 0.5f))/ piover180
  3152. - atan((ztrans2 -firstTransZ)/(xtrans2 - firstTransX + 0.5f))/ piover180);
  3153. glPrint(-350,-50,1,"[0]hit %2.0d", firstHitCount);
  3154. if( firstHitStatus == true )
  3155. {
  3156. glPrint(-350,-70,1,"[0]dead");
  3157. }
  3158. //second
  3159. glPrint(-350,-90,1,"secondTransX: %4.2f", secondTransX);
  3160. glPrint(-350,-110,1,"secondTransZ: %4.2f", secondTransZ); 
  3161. glPrint(-350,-150,1,"condition: %4.2f", atan((secondTransZ - fire_z)/(secondTransX - fire_x + 0.5f))/ piover180
  3162. - atan((ztrans2 -secondTransZ)/(xtrans2 - secondTransX + 0.5f))/ piover180);
  3163. glPrint(-350,-170,1,"[1]hit %2.0d", secondHitCount);
  3164. if( secondHitStatus == true )
  3165. {
  3166. glPrint(-350,-190,1,"[1]dead");
  3167. }
  3168. //third
  3169. glPrint(80,170,1,"thirdTransX: %4.2f", thirdTransX);
  3170. glPrint(80,150,1,"thirdTransZ: %4.2f", thirdTransZ); 
  3171. glPrint(80,130,1,"condition: %4.2f", atan((thirdTransZ - fire_z)/(thirdTransX - fire_x + 0.5f))/ piover180
  3172. - atan((ztrans2 -thirdTransZ)/(xtrans2 - thirdTransX + 0.5f))/ piover180);
  3173. glPrint(80,110,1,"[2]hit %2.0d", thirdHitCount);
  3174. if( thirdHitStatus == true )
  3175. {
  3176. glPrint(80,90,1,"[2]dead");
  3177. }
  3178. //fourth
  3179. glPrint(80,70,1,"fourthTransX: %4.2f", fourthTransX);
  3180. glPrint(80,50,1,"fourthTransZ: %4.2f", fourthTransZ); 
  3181. glPrint(80,30,1,"condition: %4.2f", atan((fourthTransZ - fire_z)/(fourthTransX - fire_x + 0.5f))/ piover180
  3182. - atan((ztrans2 -fourthTransZ)/(xtrans2 - fourthTransX + 0.5f))/ piover180);
  3183. glPrint(80,10,1,"[3]hit %2.0d", fourthHitCount);
  3184. if( fourthHitStatus == true )
  3185. {
  3186. glPrint(80,-10,1,"[3]dead");
  3187. }
  3188. //fifth
  3189. glPrint(80,-30,1,"fifthTransX: %4.2f", fifthTransX);
  3190. glPrint(80,-50,1,"fifthTransZ: %4.2f", fifthTransZ); 
  3191. glPrint(80,-70,1,"condition: %4.2f", atan((fifthTransZ - fire_z)/(fifthTransX - fire_x + 0.5f))/ piover180
  3192. - atan((ztrans2 -fifthTransZ)/(xtrans2 - fifthTransX + 0.5f))/ piover180);
  3193. glPrint(80,-90,1,"[4]hit %2.0d", fifthHitCount);
  3194. if( fifthHitStatus == true )
  3195. {
  3196. glPrint(80,-110,1,"[4]dead");
  3197. }
  3198. //sixth
  3199. glPrint(80,-130,1,"sixthTransX: %4.2f", sixthTransX);
  3200. glPrint(80,-150,1,"sixthTransZ: %4.2f", sixthTransZ); 
  3201. glPrint(80,-170,1,"condition: %4.2f", atan((sixthTransZ - fire_z)/(sixthTransX - fire_x + 0.5f))/ piover180
  3202. - atan((ztrans2 -sixthTransZ)/(xtrans2 - sixthTransX + 0.5f))/ piover180);
  3203. glPrint(80,-190,1,"[5]hit %2.0d", sixthHitCount);
  3204. if( sixthHitStatus == true )
  3205. {
  3206. glPrint(80,-210,1,"[5]dead");
  3207. }
  3208. glEnable(GL_DEPTH_TEST);           
  3209. glDisable(GL_TEXTURE_2D);
  3210. glEnable(GL_TEXTURE_2D);
  3211. }
  3212.   }else if(gameOver == true) // If game over
  3213.   {
  3214. glBindTexture(GL_TEXTURE_2D, textures[0].texID); // Select Our Font Texture
  3215. glColor4d(0,0,1,1);
  3216. glPrint(0,210,1,"point: %4.0d", point);
  3217. glColor4d(1,1,1,1);
  3218. glPrint(0,190,1,"GAME OVER!");
  3219. glPrint(0,170,1,"Press ESC to exit...");
  3220. glEnable(GL_DEPTH_TEST);           
  3221.     glDisable(GL_TEXTURE_2D);
  3222.     glEnable(GL_TEXTURE_2D);
  3223.   }else // If palyer get out 
  3224.   {
  3225. glBindTexture(GL_TEXTURE_2D, textures[0].texID); // Select Our Font Texture
  3226. glColor4d(0,0,1,1);
  3227. glPrint(0,210,1,"point: %4.0d", point);
  3228. glColor4d(1,1,1,1);
  3229. glPrint(0,190,1,"You win!");
  3230. glPrint(0,170,1,"Press ESC to exit...");
  3231. glEnable(GL_DEPTH_TEST);           
  3232.     glDisable(GL_TEXTURE_2D);
  3233.     glEnable(GL_TEXTURE_2D);
  3234.   }
  3235.   return TRUE; // Keep Going
  3236. }
  3237. GLvoid KillGLWindow(GLvoid) // Properly Kill The Window
  3238. {
  3239. // When we are done, we need to free all the model data
  3240. // We do this by walking through all the objects and freeing their information
  3241. // Go through all the objects in the scene
  3242. for(int i = 0; i < g_3DModel.numOfObjects; i++)
  3243. {
  3244. // Free the faces, normals, vertices, and texture coordinates.
  3245. if(g_3DModel.pObject[i].pFaces) delete [] g_3DModel.pObject[i].pFaces;
  3246. if(g_3DModel.pObject[i].pNormals) delete [] g_3DModel.pObject[i].pNormals;
  3247. if(g_3DModel.pObject[i].pVerts) delete [] g_3DModel.pObject[i].pVerts;
  3248. if(g_3DModel.pObject[i].pTexVerts) delete [] g_3DModel.pObject[i].pTexVerts;
  3249. }
  3250. KillFont();
  3251. if (hRC) // Do We Have A Rendering Context?
  3252. {
  3253. if (!wglMakeCurrent(NULL,NULL)) // Are We Able To Release The DC And RC Contexts?
  3254. {
  3255. MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  3256. }
  3257. if (!wglDeleteContext(hRC)) // Are We Able To Delete The RC?
  3258. {
  3259. MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  3260. }
  3261. hRC=NULL; // Set RC To NULL
  3262. }
  3263. if (hDC && !ReleaseDC(hWnd,hDC)) // Are We Able To Release The DC
  3264. {
  3265. MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  3266. hDC=NULL; // Set DC To NULL
  3267. }
  3268. if (hWnd && !DestroyWindow(hWnd)) // Are We Able To Destroy The Window?
  3269. {
  3270. MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  3271. hWnd=NULL; // Set hWnd To NULL
  3272. }
  3273. if (fullscreen) // Are We In Fullscreen Mode?
  3274. {
  3275. ChangeDisplaySettings(NULL,0); // If So Switch Back To The Desktop
  3276. ShowCursor(TRUE); // Show Mouse Pointer
  3277. }
  3278. }
  3279. /* This Code Creates Our OpenGL Window.  Parameters Are: *
  3280.  * title - Title To Appear At The Top Of The Window *
  3281.  * width - Width Of The GL Window Or Fullscreen Mode *
  3282.  * height - Height Of The GL Window Or Fullscreen Mode *
  3283.  * bits - Number Of Bits To Use For Color (8/16/24/32) *
  3284.  * fullscreenflag - Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE) */
  3285.  
  3286. BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
  3287. {
  3288. GLuint PixelFormat; // Holds The Results After Searching For A Match
  3289. WNDCLASS wc; // Windows Class Structure
  3290. DWORD dwExStyle; // Window Extended Style
  3291. DWORD dwStyle; // Window Style
  3292. RECT WindowRect; // Grabs Rectangle Upper Left / Lower Right Values
  3293. WindowRect.left=(long)0; // Set Left Value To 0
  3294. WindowRect.right=(long)width; // Set Right Value To Requested Width
  3295. WindowRect.top=(long)0; // Set Top Value To 0
  3296. WindowRect.bottom=(long)height; // Set Bottom Value To Requested Height
  3297. fullscreen=fullscreenflag; // Set The Global Fullscreen Flag
  3298. hInstance = GetModuleHandle(NULL); // Grab An Instance For Our Window
  3299. wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Size, And Own DC For Window.
  3300. wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc Handles Messages
  3301. wc.cbClsExtra = 0; // No Extra Window Data
  3302. wc.cbWndExtra = 0; // No Extra Window Data
  3303. wc.hInstance = hInstance; // Set The Instance
  3304. wc.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_ICON1 ) );
  3305. wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Load The Arrow Pointer
  3306. wc.hbrBackground = NULL; // No Background Required For GL
  3307. wc.lpszMenuName = NULL; // We Don't Want A Menu
  3308. wc.lpszClassName = "OpenGL"; // Set The Class Name
  3309. if (!RegisterClass(&wc)) // Attempt To Register The Window Class
  3310. {
  3311. MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  3312. return FALSE; // Return FALSE
  3313. }
  3314. if (fullscreen) // Attempt Fullscreen Mode?
  3315. {
  3316. DEVMODE dmScreenSettings; // Device Mode
  3317. memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // Makes Sure Memory's Cleared
  3318. dmScreenSettings.dmSize=sizeof(dmScreenSettings); // Size Of The Devmode Structure
  3319. dmScreenSettings.dmPelsWidth = width; // Selected Screen Width
  3320. dmScreenSettings.dmPelsHeight = height; // Selected Screen Height
  3321. dmScreenSettings.dmBitsPerPel = bits; // Selected Bits Per Pixel
  3322. dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
  3323. // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
  3324. if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
  3325. {
  3326. // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
  3327. if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported BynYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
  3328. {
  3329. fullscreen=FALSE; // Windowed Mode Selected.  Fullscreen = FALSE
  3330. }
  3331. else
  3332. {
  3333. // Pop Up A Message Box Letting User Know The Program Is Closing.
  3334. MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
  3335. return FALSE; // Return FALSE
  3336. }
  3337. }
  3338. }
  3339. if (fullscreen) // Are We Still In Fullscreen Mode?
  3340. {
  3341. dwExStyle=WS_EX_APPWINDOW; // Window Extended Style
  3342. dwStyle=WS_POPUP; // Windows Style
  3343. ShowCursor(FALSE); // Hide Mouse Pointer
  3344. }
  3345. else
  3346. {
  3347. dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style
  3348. dwStyle=WS_OVERLAPPEDWINDOW; // Windows Style
  3349. }
  3350. AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); // Adjust Window To True Requested Size
  3351. // Create The Window
  3352. if (!(hWnd=CreateWindowEx( dwExStyle, // Extended Style For The Window
  3353. "OpenGL", // Class Name
  3354. title, // Window Title
  3355. dwStyle | // Defined Window Style
  3356. WS_CLIPSIBLINGS | // Required Window Style
  3357. WS_CLIPCHILDREN, // Required Window Style
  3358. 0, 0, // Window Position
  3359. WindowRect.right-WindowRect.left,// Calculate Window Width
  3360. WindowRect.bottom-WindowRect.top,// Calculate Window Height
  3361. NULL, // No Parent Window
  3362. NULL, // No Menu
  3363. hInstance, // Instance
  3364. NULL))) // Dont Pass Anything To WM_CREATE
  3365. {
  3366. KillGLWindow(); // Reset The Display
  3367. MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  3368. return FALSE; // Return FALSE
  3369. }
  3370. static PIXELFORMATDESCRIPTOR pfd= // pfd Tells Windows How We Want Things To Be
  3371. {
  3372. sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
  3373. 1, // Version Number
  3374. PFD_DRAW_TO_WINDOW | // Format Must Support Window
  3375. PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
  3376. PFD_DOUBLEBUFFER, // Must Support Double Buffering
  3377. PFD_TYPE_RGBA, // Request An RGBA Format
  3378. bits, // Select Our Color Depth
  3379. 0, 0, 0, 0, 0, 0, // Color Bits Ignored
  3380. 0, // No Alpha Buffer
  3381. 0, // Shift Bit Ignored
  3382. 0, // No Accumulation Buffer
  3383. 0, 0, 0, 0, // Accumulation Bits Ignored
  3384. 16, // 16Bit Z-Buffer (Depth Buffer)  
  3385. 0, // No Stencil Buffer
  3386. 0, // No Auxiliary Buffer
  3387. PFD_MAIN_PLANE, // Main Drawing Layer
  3388. 0, // Reserved
  3389. 0, 0, 0 // Layer Masks Ignored
  3390. };
  3391. if (!(hDC=GetDC(hWnd))) // Did We Get A Device Context?
  3392. {
  3393. KillGLWindow(); // Reset The Display
  3394. MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  3395. return FALSE; // Return FALSE
  3396. }
  3397. if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Did Windows Find A Matching Pixel Format?
  3398. {
  3399. KillGLWindow(); // Reset The Display
  3400. MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  3401. return FALSE; // Return FALSE
  3402. }
  3403. if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // Are We Able To Set The Pixel Format?
  3404. {
  3405. KillGLWindow(); // Reset The Display
  3406. MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  3407. return FALSE; // Return FALSE
  3408. }
  3409. if (!(hRC=wglCreateContext(hDC))) // Are We Able To Get A Rendering Context?
  3410. {
  3411. KillGLWindow(); // Reset The Display
  3412. MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  3413. return FALSE; // Return FALSE
  3414. }
  3415. if(!wglMakeCurrent(hDC,hRC)) // Try To Activate The Rendering Context
  3416. {
  3417. KillGLWindow(); // Reset The Display
  3418. MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  3419. return FALSE; // Return FALSE
  3420. }
  3421. ShowWindow(hWnd,SW_SHOW); // Show The Window
  3422. SetForegroundWindow(hWnd); // Slightly Higher Priority
  3423. SetFocus(hWnd); // Sets Keyboard Focus To The Window
  3424. ReSizeGLScene(width, height); // Set Up Our Perspective GL Screen
  3425. if (!InitGL()) // Initialize Our Newly Created GL Window
  3426. {
  3427. KillGLWindow(); // Reset The Display
  3428. MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  3429. return FALSE; // Return FALSE
  3430. }
  3431. return TRUE; // Success
  3432. }
  3433. LRESULT CALLBACK WndProc( HWND hWnd, // Handle For This Window
  3434. UINT uMsg, // Message For This Window
  3435. WPARAM wParam, // Additional Message Information
  3436. LPARAM lParam) // Additional Message Information
  3437. {
  3438. if (uMsg == WM_MOUSEMOVE)
  3439. {
  3440. if (LOWORD(lParam) > 370) SetCursorPos(10,(int)mouse_y), mouse_wrap_x--;
  3441. else if (LOWORD(lParam) < 10) SetCursorPos(370,(int)mouse_y), mouse_wrap_x++;
  3442. if (HIWORD(lParam) > 370) SetCursorPos((int)mouse_x,10), mouse_wrap_x--;
  3443. else if (HIWORD(lParam) < 10) SetCursorPos((int)mouse_x,370), mouse_wrap_x++;
  3444. if (ABS(mouse_x-LOWORD(lParam)) > 300)
  3445. {
  3446. if (mouse_x > 360/2)
  3447. mouse_3d_x += ((mouse_x-360)-LOWORD(lParam))/sensitivity;
  3448. else if (LOWORD(lParam) > 360/2)
  3449. mouse_3d_x += (mouse_x-(LOWORD(lParam)-360))/sensitivity;
  3450. }
  3451. else
  3452. mouse_3d_x += (mouse_x-LOWORD(lParam))/sensitivity;
  3453. if (mouse_3d_x > 360) mouse_3d_x = 0;
  3454. else if (mouse_3d_x < 0) mouse_3d_x = 360;
  3455. if (invert_mouse)
  3456. {
  3457. if (ABS(mouse_y-HIWORD(lParam)) > 300)
  3458. if (mouse_y > 360/2)
  3459. mouse_3d_y -= (HIWORD(lParam)-(mouse_y-360))/sensitivity;
  3460. else if (LOWORD(lParam) > 360/2)
  3461. mouse_3d_y -= ((HIWORD(lParam)-360)-mouse_y)/sensitivity;
  3462. }
  3463. else
  3464. mouse_3d_y -= (HIWORD(lParam)-mouse_y)/sensitivity;
  3465. }
  3466. else
  3467. {
  3468. if (ABS(mouse_y-HIWORD(lParam)) > 300)
  3469. if (mouse_y > 360/2)
  3470. mouse_3d_y -= ((mouse_y-360)-HIWORD(lParam))/sensitivity;
  3471. else if (LOWORD(lParam) > 360/2)
  3472. mouse_3d_y -= (mouse_y-(HIWORD(lParam)-360))/sensitivity;
  3473. }
  3474. else
  3475. mouse_3d_y -= (mouse_y-HIWORD(lParam))/sensitivity;
  3476. }
  3477. if (mouse_3d_x > 360) mouse_3d_x = 0;
  3478. else if (mouse_3d_x < 0) mouse_3d_x = 360;
  3479. if (mouse_3d_y > 85) mouse_3d_y = 85;
  3480. else if (mouse_3d_y < -85) mouse_3d_y = -85;
  3481. mouse_x = LOWORD(lParam);          
  3482. mouse_y = HIWORD(lParam);
  3483. }
  3484. else if (uMsg == WM_LBUTTONDOWN)
  3485. {     
  3486. isFire = true;
  3487. }
  3488. else if (uMsg == WM_ACTIVATE) // Watch For Window Activate Message
  3489. {
  3490. if (!HIWORD(wParam)) // Check Minimization State
  3491. {
  3492. active=TRUE; // Program Is Active
  3493. }
  3494. else
  3495. {
  3496. active=FALSE; // Program Is No Longer Active
  3497. }
  3498. }
  3499.         
  3500. else if (uMsg == WM_SYSCOMMAND) // Intercept System Commands
  3501. {
  3502. switch (wParam) // Check System Calls
  3503. {
  3504. case SC_SCREENSAVE: // Screensaver Trying To Start?
  3505. case SC_MONITORPOWER: // Monitor Trying To Enter Powersave?
  3506. return 0; // Prevent From Happening
  3507. }
  3508. }
  3509.         
  3510. else if (uMsg == WM_CLOSE) // Did We Receive A Close Message?
  3511. {
  3512.  PostQuitMessage(0); // Send A Quit Message
  3513. }
  3514.         
  3515. else if (uMsg == WM_KEYDOWN) // Is A Key Being Held Down?
  3516. {
  3517. keys[wParam] = TRUE; // If So, Mark It As TRUE
  3518. }
  3519.         
  3520. else if (uMsg == WM_KEYUP) // Has A Key Been Released?
  3521. {
  3522. keys[wParam] = FALSE; // If So, Mark It As FALSE
  3523. }
  3524.         
  3525. else if (uMsg == WM_SIZE) // Resize The OpenGL Window
  3526. {
  3527. ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Width, HiWord=Height
  3528. }        
  3529. // Pass All Unhandled Messages To DefWindowProc
  3530. return DefWindowProc(hWnd,uMsg,wParam,lParam);
  3531. }
  3532. int is_Fired = 0; 
  3533. int WINAPI WinMain( HINSTANCE hInstance, // Instance
  3534. HINSTANCE hPrevInstance, // Previous Instance
  3535. LPSTR lpCmdLine, // Command Line Parameters
  3536. int nCmdShow) // Window Show State
  3537. {
  3538. MSG msg; // Windows Message Structure
  3539. BOOL done=FALSE; // Bool Variable To Exit Loop
  3540. // Ask The User Which Screen Mode They Prefer
  3541. if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode(Support Mouse Movement)?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
  3542. {
  3543. fullscreen=FALSE; // Windowed Mode
  3544. }
  3545. // Create Our OpenGL Window
  3546. if (!CreateGLWindow("First Person Shooter",640,480,16,fullscreen))
  3547. {
  3548. return 0; // Quit If Window Was Not Created
  3549. }
  3550. while(!done) // Loop That Runs While done=FALSE
  3551. {
  3552. if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // Is There A Message Waiting?
  3553. {
  3554. if (msg.message==WM_QUIT) // Have We Received A Quit Message?
  3555. {
  3556. done=TRUE; // If So done=TRUE
  3557. }
  3558. else // If Not, Deal With Window Messages
  3559. {
  3560. TranslateMessage(&msg); // Translate The Message
  3561. DispatchMessage(&msg); // Dispatch The Message
  3562. }
  3563. }
  3564. else // If There Are No Messages
  3565. {
  3566. // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
  3567. if ((active && !DrawGLScene()) || keys[VK_ESCAPE]) // Active?  Was There A Quit Received?
  3568. {
  3569. done=TRUE; // ESC or DrawGLScene Signalled A Quit
  3570. }
  3571. else // Not Time To Quit, Update Screen
  3572. {
  3573. SwapBuffers(hDC); // Swap Buffers (Double Buffering)
  3574. is_Fired--;
  3575. if (is_Fired < 0) is_Fired = 0;
  3576. if (keys[VK_UP])  // Move forwards
  3577. {
  3578. XP -= (GLdouble)sin(heading*piover180) * 10.0f;
  3579. ZP -= (GLdouble)cos(heading*piover180) * 10.0f;
  3580. }
  3581. else if (keys['W'])  // Move forwards
  3582. {
  3583. XP -= (GLdouble)sin(heading*piover180) * 10.0f;
  3584. ZP -= (GLdouble)cos(heading*piover180) * 10.0f;
  3585. }
  3586. if (keys[VK_DOWN]) // Move backwards
  3587. {
  3588. XP += (GLdouble)sin(heading*piover180) * 10.0f;
  3589. ZP += (GLdouble)cos(heading*piover180) * 10.0f;
  3590. }                
  3591. else if (keys['S']) // Move backwards
  3592. {
  3593. XP += (GLdouble)sin(heading*piover180) * 10.0f;
  3594. ZP += (GLdouble)cos(heading*piover180) * 10.0f;
  3595. }
  3596. if (keys['A'])  // strafe left
  3597. {
  3598. XP += (GLdouble)sin((heading-90)*piover180) * 10.0f;
  3599. ZP += (GLdouble)cos((heading-90)*piover180) * 10.0f;
  3600. }
  3601. if (keys['D']) // strafe right
  3602. {
  3603. XP += (GLdouble)sin((heading+90)*piover180) * 10.0f;
  3604. ZP += (GLdouble)cos((heading+90)*piover180) * 10.0f;
  3605. }                
  3606. if (keys[VK_LEFT]) // Turn left
  3607. {
  3608. zprot += .5f;
  3609. }
  3610. else if (keys[VK_RIGHT]) // Turn right
  3611. {
  3612. zprot -= .5f;
  3613. }
  3614. if (keys['F'] && !fp) // Toggle Frame Per Second Counter
  3615. {
  3616. isFPS = !isFPS;
  3617. fp = true;
  3618. }
  3619. else if (!keys['F'])
  3620. {
  3621. fp = false;
  3622. }        
  3623. if (keys['I'] && !ip) // Invert y-axis for the mouse
  3624. {
  3625. invert_mouse = !invert_mouse;
  3626. ip = true;
  3627. }
  3628. else if (!keys['I'])
  3629. {
  3630. ip = false;
  3631. }
  3632. }
  3633. }
  3634. }
  3635. // Shutdown
  3636. KillGLWindow(); // Kill The Window
  3637. return (msg.wParam); // Exit The Program
  3638. }