INITMAZE.C

/*********************************************************************** 
File: InitMaze.c


Abstract:

This module contains code to initialize the full maze, as well as the
data structures associated with it.

Contents:

InitMaze() -- Inserts subgrids into the Maze array, sets player position
Calc3DMaze() -- Calculates posts used for drawing 3-d view
InsertSubGrid() -- copies a sub-grid into the maze


************************************************************************/

#include "winmaze.h"
#include "mazproto.h"
#include "math.h"


/*=====================================================================
Function: InitMaze()

Inputs: none

Outputs: none

Abstract:
InitMaze is responsible for initializing the full maze to blocked
characters, and setting up the temple space.
======================================================================*/

void InitMaze(
void
)
{
int i,j;
BYTE b;

//
// Initialize the entire maze to being filled already.
// we'll leave the outer subgrid ring as a buffer.
//
b = NORTH | WEST | SOUTH | EAST;

for(i=0;i<X_SIZE;i++) {
for (j=0;j<Y_SIZE;j++) {
bMaze[i][j] = b;
}
}

InsertSubGrid(NUM_PLAYER_SUBGRIDS,6,6);
InsertSubGrid(NUM_PLAYER_SUBGRIDS+1,7,6);
InsertSubGrid(NUM_PLAYER_SUBGRIDS+2,5,7);
InsertSubGrid(NUM_PLAYER_SUBGRIDS+3,6,7);
InsertSubGrid(NUM_PLAYER_SUBGRIDS+4,7,7);
InsertSubGrid(NUM_PLAYER_SUBGRIDS+5,6,8);
InsertSubGrid(NUM_PLAYER_SUBGRIDS+6,7,8);

//
// Kludge to start new players out in the sanctuary
//
ptSelf.Pos.ix = 6*X_CELLS_PER_SUBGRID+1;
ptSelf.Pos.iy = 7*Y_CELLS_PER_SUBGRID+1;
ptSelf.Pos.Facing = NORTH;
ptLastPos = ptSelf.Pos;

return;
}



/*=====================================================================
Function: Calc3DMaze()

Inputs: none

Outputs: none

Abstract:
Calc maze is responsible for recalculating the maze drawing info.
3-d transformations are done only when the window is resized. The
results are stored in a table (giving the polygons for each panel, from
left to right in 2-d coordinates.
======================================================================*/

void Calc3DMaze(
)
{
int i,j,k,width,depth;
float pw, ph,x[3],y[3], dx, dyh, dyl, dz, dist;
POINT pCenter;
float m,b;


SetCursor(LoadCursor((HINSTANCE)NULL,IDC_WAIT));

pw = (float) PANEL_WIDTH;
ph = (float) PANEL_HEIGHT;

//
// establish the scale. Should be sufficient to allow the end of the panel
// we're in to show. A full panel displayed 1/2 panel away should be 2/3
// of the screen wide.
//
width = (rMaze.right - rMaze.left);
depth = (rMaze.bottom - rMaze.top);

//
// Since scale is used in MC_TO_SC, we need to nullify its effect to set it
//
scale = (float) 1.0;
scale = (float) (.9 * depth/((float)MC_TO_SC(ph,-pw/2)));


pCenter.x = rMaze.left + width/2;
pCenter.y = rMaze.top + depth/2;

//
// x and y center
//
dyl = ph /2;
dyh = - dyl;

for(i=0;i<(MAX_DRAW_DIST*2+2);i++) {
for (j=1;j<(MAX_DRAW_DIST+2);j++) {

//
// Calculate post in left position
//

dx = (i - (MAX_DRAW_DIST+1)) * pw - pw /2;
dz = (j-1)*pw - pw/2;

//
// left top
//
dist = dz;

pPost[i][j][0].x = pCenter.x + (int) MC_TO_SC(dx,dist);
pPost[i][j][0].y = pCenter.y + (int) MC_TO_SC(dyh,dist);

//
// left bottom
//
dist = dz;
pPost[i][j][1].x = pCenter.x + (int) MC_TO_SC(dx,dist);
pPost[i][j][1].y = pCenter.y + (int) MC_TO_SC(dyl,dist);

}
}

//
// Clip as necessary, using line equation: y=mx + b.
//
for (i=0,j=0;i<(MAX_DRAW_DIST*2+2);i++) {
for (k=0;k<2;k++) {
x[1] = (float) pPost[i][1][k].x;
x[2] = (float) pPost[i][2][k].x;
y[1] = (float) pPost[i][1][k].y;
y[2] = (float) pPost[i][2][k].y;
m = (y[2] - y[1])/(x[2]-x[1]);
b = y[1] - m*x[1];
if (i < MAX_DRAW_DIST+2) {
pPost[i][0][k].x = rMaze.left;
}
else {
pPost[i][0][k].x = rMaze.right;
}
pPost[i][0][k].y = (int)(m*((float)pPost[i][0][k].x) + b);
}
}

SetCursor(LoadCursor((HINSTANCE)NULL,IDC_ARROW));

return;
}



/*=====================================================================
Function: InsertSubGrid()

Inputs: # of subgrid, x and y position in maze to insert the subgrid

Outputs: none

Abstract:
Insert Subgrid will copy the specified subgrid into bMaze, with its upper
left corner at iXPos*X_CELLS_PER_SUBGRID, iYPos*Y_CELLS_PER_SUBGRID.
======================================================================*/

void InsertSubGrid(
int SubGridNo,
int iXPos,
int iYPos
)
{
int i,j;

iXPos = iXPos*X_CELLS_PER_SUBGRID;
iYPos = iYPos*Y_CELLS_PER_SUBGRID;


for (i=0;i<X_CELLS_PER_SUBGRID;i++) {
for (j=0;j<Y_CELLS_PER_SUBGRID;j++) {
bMaze[i+iXPos][j+iYPos] = SubGrids[SubGridNo].Cell[i][j];
}
}

return;
}