home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
-
- #include "werr.h"
-
- #include "cell.h"
-
- extern long GetCell(int, int, int);
-
- extern void move(int, int);
- extern void draw(int, int);
- extern void circle(int, int, int);
-
- struct _travel
- {
- int mask;
- int x0, y0, x1, y1;
- };
-
- static struct
- {
- int mask;
- int x0, y0;
- } circle_travel[] =
- {
- { HOLE_NORTH, 0, 1 },
- { HOLE_NORTHEAST, 1, 1 },
- { HOLE_EAST, 1, 0 },
- { HOLE_SOUTHEAST, 1, -1 },
- { HOLE_SOUTH, 0, -1 },
- { HOLE_SOUTHWEST, -1, -1 },
- { HOLE_WEST, -1, 0 },
- { HOLE_NORTHWEST, -1, 1 },
-
- { 0, 0, 0 }
- };
-
- static struct
- {
- int mask;
- int x0, y0, x1, y1;
- } line_travel[] =
- {
- { LINE_HORIZONTAL, -1, 0, 1, 0 },
- { LINE_VERTICAL, 0, -1, 0, 1 },
-
- { DIAG_NEtoSW, 1, 1, -1, -1 },
- { DIAG_SEtoNW, -1, 1, -1, 1 },
-
- { CORNER_NORTHEAST, 0, 1, 1, 0 },
- { CORNER_SOUTHEAST, 0, -1, 1, 0 },
- { CORNER_SOUTHWEST, 0, -1, -1, 0 },
- { CORNER_NORTHWEST, 0, 1, -1, 0 },
-
- { BENT_NtoSE, 0, 1, 1, -1 },
- { BENT_NtoSW, 0, 1, -1, -1 },
- { BENT_EtoSW, 1, 0, -1, -1 },
- { BENT_EtoNW, 1, 0, -1, 1 },
- { BENT_StoNW, 0, -1, -1, 1 },
- { BENT_StoNE, 0, -1, 1, 1 },
- { BENT_WtoNE, -1, 0, 1, 1 },
- { BENT_WtoSE, -1, 0, 1, -1 },
-
- { ANGLE_NEtoSE, 1, 1, 1, -1 },
- { ANGLE_SEtoSW, 1, -1, -1, -1 },
- { ANGLE_SWtoNW, -1, -1, -1, 1 },
- { ANGLE_NWtoNE, -1, 1, 1, 1 },
-
- { SHARP_NtoNE, 0, 1, 1, 1 },
- { SHARP_EtoNE, 1, 0, 1, 1 },
- { SHARP_EtoSE, 1, 0, 1, -1 },
- { SHARP_StoSE, 0, -1, 1, -1 },
- { SHARP_StoSW, 0, -1, -1, -1 },
- { SHARP_WtoSW, -1, 0, -1, -1 },
- { SHARP_WtoNW, -1, 0, -1, 1 },
- { SHARP_NtoNW, 0, 1, -1, 1 },
-
- { 0, 0, 0, 0, 0 }
- };
-
- static void traverse(int x0, int y0, int *col, int *row, int side)
- {
- int i, x, fromcol, fromrow;
-
- fromcol = *col;
- fromrow = *row;
-
- *col += x0;
- *row += y0;
-
- x = GetCell(*row, *col, side);
- if (x & HOLE)
- {
- draw(*col * 50 + 25, *row * 50 + 25);
- }
- else
- for (i = 0; line_travel[i].mask != 0; i++)
- if (x & line_travel[i].mask)
- {
- if (line_travel[i].x0 == x0 && line_travel[i].y0 == y0)
- {
- traverse(x0, y0, col, row, side);
- }
- else if (line_travel[i].x1 == x0 && line_travel[i].y1 == y0)
- {
- traverse(x0, y0, col, row, side);
- }
- else if (line_travel[i].x0 == -x0 && line_travel[i].y0 == -y0)
- {
- draw(*col * 50 + 25, *row * 50 + 25);
- traverse(line_travel[i].x1, line_travel[i].y1, col, row, side);
- }
- else if (line_travel[i].x1 == -x0 && line_travel[i].y1 == -y0)
- {
- draw(*col * 50 + 25, *row * 50 + 25);
- traverse(line_travel[i].x0, line_travel[i].y0, col, row, side);
- }
- else
- werr(0, "Unable to traverse at (%d, %d) from (%d, %d)",
- *col, *row, fromcol, fromrow);
- }
- }
-
- void PlotLine(int x, int col, int row, int side)
- {
- int i;
-
- if (x & ~HOLE)
- {
- move(col * 50 + 25, row * 50 + 25);
- for (i = 0; circle_travel[i].mask != 0; i++)
- if (x & circle_travel[i].mask)
- traverse(circle_travel[i].x0, circle_travel[i].y0, &col, &row, side);
- }
- }
-