home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / netds / rpc / mazelord / initmaze.c < prev    next >
C/C++ Source or Header  |  1995-06-06  |  6KB  |  216 lines

  1. /***********************************************************************
  2. File:   InitMaze.c
  3.  
  4.  
  5. Abstract:
  6.  
  7.     This module contains code to initialize the full maze, as well as the
  8.     data structures associated with it.
  9.  
  10. Contents:
  11.  
  12.     InitMaze() -- Inserts subgrids into the Maze array, sets player position
  13.     Calc3DMaze() -- Calculates posts used for drawing 3-d view
  14.     InsertSubGrid() -- copies a sub-grid into the maze
  15.  
  16.  
  17. ************************************************************************/
  18.  
  19. #include "winmaze.h"
  20. #include "mazproto.h"
  21. #include "math.h"
  22.  
  23.  
  24. /*=====================================================================
  25. Function: InitMaze()
  26.  
  27. Inputs: none
  28.  
  29. Outputs: none
  30.  
  31. Abstract:
  32.     InitMaze is responsible for initializing the full maze to blocked
  33.     characters, and setting up the temple space.
  34. ======================================================================*/
  35.  
  36. void InitMaze(
  37.     void
  38.     )
  39. {
  40.     int i,j;
  41.     BYTE b;
  42.  
  43.     //
  44.     // Initialize the entire maze to being filled already.
  45.     // we'll leave the outer subgrid ring as a buffer.
  46.     //
  47.     b = NORTH | WEST | SOUTH | EAST;
  48.  
  49.     for(i=0;i<X_SIZE;i++) {
  50.         for (j=0;j<Y_SIZE;j++) {
  51.             bMaze[i][j] = b;
  52.             }
  53.         }
  54.  
  55.     InsertSubGrid(NUM_PLAYER_SUBGRIDS,6,6);
  56.     InsertSubGrid(NUM_PLAYER_SUBGRIDS+1,7,6);
  57.     InsertSubGrid(NUM_PLAYER_SUBGRIDS+2,5,7);
  58.     InsertSubGrid(NUM_PLAYER_SUBGRIDS+3,6,7);
  59.     InsertSubGrid(NUM_PLAYER_SUBGRIDS+4,7,7);
  60.     InsertSubGrid(NUM_PLAYER_SUBGRIDS+5,6,8);
  61.     InsertSubGrid(NUM_PLAYER_SUBGRIDS+6,7,8);
  62.  
  63.     //
  64.     // Kludge to start new players out in the sanctuary
  65.     //
  66.     ptSelf.Pos.ix = 6*X_CELLS_PER_SUBGRID+1;
  67.     ptSelf.Pos.iy = 7*Y_CELLS_PER_SUBGRID+1;
  68.     ptSelf.Pos.Facing = NORTH;
  69.     ptLastPos = ptSelf.Pos;
  70.  
  71.     return;
  72. }
  73.  
  74.  
  75.  
  76. /*=====================================================================
  77. Function: Calc3DMaze()
  78.  
  79. Inputs: none
  80.  
  81. Outputs: none
  82.  
  83. Abstract:
  84.     Calc maze is responsible for recalculating the maze drawing info.
  85.     3-d transformations are done only when the window is resized. The
  86.     results are stored in a table (giving the polygons for each panel, from
  87.     left to right in 2-d coordinates.
  88. ======================================================================*/
  89.  
  90. void Calc3DMaze(
  91.      )
  92. {
  93.     int i,j,k,width,depth;
  94.     float pw, ph,x[3],y[3], dx, dyh, dyl, dz, dist;
  95.     POINT pCenter;
  96.     float m,b;
  97.  
  98.  
  99.     SetCursor(LoadCursor((HINSTANCE)NULL,IDC_WAIT));
  100.  
  101.     pw = (float) PANEL_WIDTH;
  102.     ph = (float) PANEL_HEIGHT;
  103.  
  104.     //
  105.     // establish the scale. Should be sufficient to allow the end of the panel
  106.     // we're in to show.  A full panel displayed 1/2 panel away should be 2/3
  107.     // of the screen wide.
  108.     //
  109.     width = (rMaze.right - rMaze.left);
  110.     depth = (rMaze.bottom - rMaze.top);
  111.  
  112.     //
  113.     // Since scale is used in MC_TO_SC, we need to nullify its effect to set it
  114.     //
  115.     scale = (float) 1.0;
  116.     scale = (float) (.9 * depth/((float)MC_TO_SC(ph,-pw/2)));
  117.  
  118.  
  119.     pCenter.x = rMaze.left + width/2;
  120.     pCenter.y = rMaze.top + depth/2;
  121.  
  122.     //
  123.     // x and y center
  124.     //
  125.     dyl = ph /2;
  126.     dyh = - dyl;
  127.  
  128.     for(i=0;i<(MAX_DRAW_DIST*2+2);i++) {
  129.         for (j=1;j<(MAX_DRAW_DIST+2);j++) {
  130.  
  131.             //
  132.             // Calculate post in left position
  133.             //
  134.  
  135.             dx = (i - (MAX_DRAW_DIST+1)) * pw - pw /2;
  136.             dz = (j-1)*pw - pw/2;
  137.  
  138.             //
  139.             // left top
  140.             //
  141.             dist = dz;
  142.  
  143.             pPost[i][j][0].x = pCenter.x + (int) MC_TO_SC(dx,dist);
  144.             pPost[i][j][0].y = pCenter.y + (int) MC_TO_SC(dyh,dist);
  145.  
  146.             //
  147.             // left bottom
  148.             //
  149.             dist = dz;
  150.             pPost[i][j][1].x = pCenter.x + (int) MC_TO_SC(dx,dist);
  151.             pPost[i][j][1].y = pCenter.y + (int) MC_TO_SC(dyl,dist);
  152.  
  153.             }
  154.         }
  155.  
  156.     //
  157.     // Clip as necessary, using line equation: y=mx + b.
  158.     //
  159.     for (i=0,j=0;i<(MAX_DRAW_DIST*2+2);i++) {
  160.         for (k=0;k<2;k++) {
  161.             x[1] = (float) pPost[i][1][k].x;
  162.             x[2] = (float) pPost[i][2][k].x;
  163.             y[1] = (float) pPost[i][1][k].y;
  164.             y[2] = (float) pPost[i][2][k].y;
  165.             m = (y[2] - y[1])/(x[2]-x[1]);
  166.             b = y[1] - m*x[1];
  167.             if (i < MAX_DRAW_DIST+2) {
  168.                 pPost[i][0][k].x = rMaze.left;
  169.                 }
  170.             else {
  171.                 pPost[i][0][k].x = rMaze.right;
  172.                 }
  173.             pPost[i][0][k].y = (int)(m*((float)pPost[i][0][k].x) + b);
  174.             }
  175.         }
  176.  
  177.     SetCursor(LoadCursor((HINSTANCE)NULL,IDC_ARROW));
  178.  
  179.     return;
  180. }
  181.  
  182.  
  183.  
  184. /*=====================================================================
  185. Function: InsertSubGrid()
  186.  
  187. Inputs: # of subgrid, x and y position in maze to insert the subgrid
  188.  
  189. Outputs: none
  190.  
  191. Abstract:
  192.     Insert Subgrid will copy the specified subgrid into bMaze, with its upper
  193.     left corner at iXPos*X_CELLS_PER_SUBGRID, iYPos*Y_CELLS_PER_SUBGRID.
  194. ======================================================================*/
  195.  
  196. void InsertSubGrid(
  197.     int SubGridNo,
  198.     int iXPos,
  199.     int iYPos
  200.     )
  201. {
  202.     int i,j;
  203.  
  204.     iXPos = iXPos*X_CELLS_PER_SUBGRID;
  205.     iYPos = iYPos*Y_CELLS_PER_SUBGRID;
  206.  
  207.  
  208.     for (i=0;i<X_CELLS_PER_SUBGRID;i++) {
  209.         for (j=0;j<Y_CELLS_PER_SUBGRID;j++) {
  210.             bMaze[i+iXPos][j+iYPos] = SubGrids[SubGridNo].Cell[i][j];
  211.             }
  212.         }
  213.  
  214.     return;
  215. }
  216.