enum {
/* levels */
Empty = 0,
Background,
Wall,
Cargo,
Goal,
GoalCargo,
Glenda,
/* movements */
Up,
Down,
Left,
Right,
};
enum {
/* glenda faces the horizontal direction she's moving in */
GLeft = 0,
GRight = 1,
};
enum {
MazeX = 20,
MazeY = 18,
BoardX = 49,
BoardY = 49,
SizeX = MazeX*BoardX+10,
SizeY = MazeY*BoardY+10,
Maxlevels = 200,
};
typedef struct {
uint dir; /* direction */
uint count; /* number of single-step moves */
} Step;
typedef struct {
uint nstep; /* number of valid steps */
Step *step;
uint beyond; /* number of allocated Step */
} Route;
typedef struct {
uint board[MazeX][MazeY];
} Visited;
typedef struct {
Point glenda;
Point max; /* that's how much the board spans */
uint index;
uint done;
uint board[MazeX][MazeY];
} Level;
Level level; /* the current level */
Level levels[Maxlevels]; /* all levels from this file */
int numlevels; /* how many levels do we have */
int animate; /* boolean: animate during multi-step move? */
Image *img; /* buffer */
Image *text; /* for text messages */
Image *win;
Image *goal;
Image *cargo;
Image *goalcargo;
Image *wall;
Image *empty;
Image *gleft;
Image *gright;
Image *glenda;
Image *bg;
/* graphics.c */
void drawscreen(void);
void drawlevel(void);
void drawwin(void);
void drawglenda(void);
void drawboard(Point);
void resize(Point);
Point boardsize(Point);
/* level.c */
int loadlevels(char *);
/* move.c */
void move(int);
/* route.c */
Route* newroute(void);
void freeroute(Route*);
void reverseroute(Route*);
void pushstep(Route*, int, int);
void popstep(Route*);
int validwalk(Point, Step, Point*);
int validpush(Point, Step, Point*);
int isvalid(Point, Route*, int (*)(Point, Step, Point*));
int findwalk(Point, Point, Route*);
void applyroute(Route*);
/* sokoban.c */
char *genlevels(int);
Image *eallocimage(Rectangle, int, uint);
|