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