xref: /plan9/sys/src/games/sokoban/sokoban.h (revision 01e2ed2d511b59a951d05402dc477f83cefea043)
1a7b22450SDavid du Colombier enum {
2a7b22450SDavid du Colombier 	/* levels */
3a7b22450SDavid du Colombier 	Empty		= 0,
4a7b22450SDavid du Colombier 	Background,
5a7b22450SDavid du Colombier 	Wall,
6a7b22450SDavid du Colombier 	Cargo,
7a7b22450SDavid du Colombier 	Goal,
8a7b22450SDavid du Colombier 	GoalCargo,
9a7b22450SDavid du Colombier 	Glenda,
10a7b22450SDavid du Colombier 
11a7b22450SDavid du Colombier 	/* movements */
12a7b22450SDavid du Colombier 	Up,
13a7b22450SDavid du Colombier 	Down,
14a7b22450SDavid du Colombier 	Left,
15a7b22450SDavid du Colombier 	Right,
16a7b22450SDavid du Colombier };
17a7b22450SDavid du Colombier 
18a7b22450SDavid du Colombier enum {
19a7b22450SDavid du Colombier 	/* glenda faces the horizontal direction she's moving in */
20a7b22450SDavid du Colombier 	GLeft	= 0,
21a7b22450SDavid du Colombier 	GRight 	= 1,
22a7b22450SDavid du Colombier };
23a7b22450SDavid du Colombier 
24a7b22450SDavid du Colombier enum {
25a7b22450SDavid du Colombier 	MazeX = 20,
26a7b22450SDavid du Colombier 	MazeY = 18,
27a7b22450SDavid du Colombier 	BoardX = 49,
28a7b22450SDavid du Colombier 	BoardY = 49,
29a7b22450SDavid du Colombier 	SizeX = MazeX*BoardX+10,
30a7b22450SDavid du Colombier 	SizeY = MazeY*BoardY+10,
31a7b22450SDavid du Colombier 
32a7b22450SDavid du Colombier 	Maxlevels = 200,
33a7b22450SDavid du Colombier };
34a7b22450SDavid du Colombier 
35*01e2ed2dSDavid du Colombier typedef struct Step {
3697787252SDavid du Colombier 	uint dir;		/* direction */
3797787252SDavid du Colombier 	uint count;	/* number of single-step moves */
3897787252SDavid du Colombier } Step;
3997787252SDavid du Colombier 
40*01e2ed2dSDavid du Colombier typedef struct Route {
41*01e2ed2dSDavid du Colombier 	uint nstep;	/* number of valid Step */
4297787252SDavid du Colombier 	Step *step;
43*01e2ed2dSDavid du Colombier 	Point dest;	/* result of step */
4497787252SDavid du Colombier } Route;
4597787252SDavid du Colombier 
46*01e2ed2dSDavid du Colombier typedef struct Walk {
47*01e2ed2dSDavid du Colombier 	uint nroute;	/* number of valid Route* */
48*01e2ed2dSDavid du Colombier 	Route **route;
49*01e2ed2dSDavid du Colombier 	uint beyond;	/* number of allocated Route* */
50*01e2ed2dSDavid du Colombier } Walk;
51*01e2ed2dSDavid du Colombier 
52*01e2ed2dSDavid du Colombier typedef struct Visited {
5397787252SDavid du Colombier 	uint 	board[MazeX][MazeY];
5497787252SDavid du Colombier } Visited;
5597787252SDavid du Colombier 
56*01e2ed2dSDavid du Colombier typedef struct Animation {
57*01e2ed2dSDavid du Colombier 	Route* route;
58*01e2ed2dSDavid du Colombier 	Step *step;
59*01e2ed2dSDavid du Colombier 	int count;
60*01e2ed2dSDavid du Colombier } Animation;
61*01e2ed2dSDavid du Colombier 
6297787252SDavid du Colombier typedef struct {
63a7b22450SDavid du Colombier 	Point 	glenda;
64a7b22450SDavid du Colombier 	Point 	max;		/* that's how much the board spans */
65a7b22450SDavid du Colombier 	uint 	index;
66a7b22450SDavid du Colombier 	uint	done;
67a7b22450SDavid du Colombier 	uint 	board[MazeX][MazeY];
68a7b22450SDavid du Colombier } Level;
69a7b22450SDavid du Colombier 
70a7b22450SDavid du Colombier Level level;		/* the current level */
71a7b22450SDavid du Colombier Level levels[Maxlevels];	/* all levels from this file */
72a7b22450SDavid du Colombier int numlevels;		/* how many levels do we have */
73a7b22450SDavid du Colombier 
74a7b22450SDavid du Colombier Image *img;		/* buffer */
75a7b22450SDavid du Colombier Image *text;		/* for text messages */
76a7b22450SDavid du Colombier Image *win;
77a7b22450SDavid du Colombier 
78a7b22450SDavid du Colombier Image *goal;
79a7b22450SDavid du Colombier Image *cargo;
80a7b22450SDavid du Colombier Image *goalcargo;
81a7b22450SDavid du Colombier Image *wall;
82a7b22450SDavid du Colombier Image *empty;
83a7b22450SDavid du Colombier Image *gleft;
84a7b22450SDavid du Colombier Image *gright;
85a7b22450SDavid du Colombier Image *glenda;
86a7b22450SDavid du Colombier Image *bg;
87a7b22450SDavid du Colombier 
88a7b22450SDavid du Colombier /* graphics.c */
89a7b22450SDavid du Colombier void drawscreen(void);
90a7b22450SDavid du Colombier void drawlevel(void);
91a7b22450SDavid du Colombier void drawwin(void);
92a7b22450SDavid du Colombier void drawglenda(void);
93a7b22450SDavid du Colombier void drawboard(Point);
94a7b22450SDavid du Colombier void resize(Point);
95a7b22450SDavid du Colombier Point boardsize(Point);
96a7b22450SDavid du Colombier 
97a7b22450SDavid du Colombier /* level.c */
98a7b22450SDavid du Colombier int loadlevels(char *);
99a7b22450SDavid du Colombier 
100a7b22450SDavid du Colombier /* move.c */
101a7b22450SDavid du Colombier void move(int);
102a7b22450SDavid du Colombier 
10397787252SDavid du Colombier /* route.c */
104*01e2ed2dSDavid du Colombier int validpush(Point, Step*, Point*);
105*01e2ed2dSDavid du Colombier int isvalid(Point, Route*, int (*)(Point, Step*, Point*));
10697787252SDavid du Colombier void freeroute(Route*);
107*01e2ed2dSDavid du Colombier Route* extend(Route*, int, int, Point);
108*01e2ed2dSDavid du Colombier Route* findroute(Point, Point);
109*01e2ed2dSDavid du Colombier 
110*01e2ed2dSDavid du Colombier /* animation.c */
111*01e2ed2dSDavid du Colombier void initanimation(Animation*);
112*01e2ed2dSDavid du Colombier void setupanimation(Animation*, Route*);
113*01e2ed2dSDavid du Colombier int onestep(Animation*);
114*01e2ed2dSDavid du Colombier void stopanimation(Animation*);
115*01e2ed2dSDavid du Colombier 
11697787252SDavid du Colombier 
117a7b22450SDavid du Colombier /* sokoban.c */
118a7b22450SDavid du Colombier char *genlevels(int);
119a7b22450SDavid du Colombier Image *eallocimage(Rectangle, int, uint);
120