enum { /* levels */ Empty = 0, Background, Wall, /* Own */ CarX, CarY, CarZ, /* 2-length */ CarA, CarB, CarC, CarD, CarE, CarF, CarG, CarH, CarI, CarJ, CarK, CarL, CarM, CarN, /* 3-length */ TruckO, TruckP, TruckQ, TruckR, TruckS, TruckT, TruckU, TruckV, NElems, }; enum { OHoriz = 0, OVert = 1, }; enum { MazeX = 20, MazeY = 18, // BoardX = 48, //49, // BoardY = 48, //49, Maxlevels = 200, Off = 3, /* offset in board, should be >= max car length */ /* to have left border and top border */ /* to allow car to disappear to left and to top */ }; int BoardX; int BoardY; int SizeX; int SizeY; int OutlineWidth; typedef struct { Point max; /* leftmost - bottom-most index; */ /* for board span subtract Pt(Off,Off) */ Point win; /* position where we draw win message*/ uint us; /* the element we need to free to win */ uint index; /* in list of levels in b2 menu */ uint done; uint board[MazeX][MazeY]; /* offset Off wrt graphics */ int orient[NElems]; /* orientation of element */ int length[NElems]; /* length of element */ char *name; } Level; Level level; /* the current level */ Level levels[Maxlevels]; /* all levels from this file */ int numlevels; /* how many levels do we have */ int usefaces; /* use faces in visualization? */ int tinyflag; int boutflag; Image *img; /* buffer */ Image *text; /* for text messages */ Image *black; /* for faces border */ Image *win; /* winning message */ Image *wall; Image *empty; Image *bg; Image *col[NElems]; Image *face[NElems]; Image *car[NElems][2]; Image *msk[NElems][2]; /* graphics.c */ void drawscreen(void); void drawlevel(void); void drawwin(Point); void drawboard(Point, int *, Point); void resize(Point); Point boardsize(Point); int intile(Point, Point); int inhalftile(Point, Point); Point subtile(Point, Point); Point addtile(Point, Point); Point getdir(Point, Point); /* level.c */ int loadlevels(char *); /* move.c */ int item(Point); void setitem(Point, int); int isvehicle(int); Point next(Point); Point prev(Point); Point gettopleft(Point); int canmove(Point, Point); int onestep(Point, Point, Point*); Point destof(Point, Point); /* rushhour.c */ char *genlevels(int); Image *eallocimage(Rectangle, int, uint); Image * openimage(char *dir, char *file); Image * openface(char *path); char* estrdup(char*); void* erealloc(void*, ulong);