]> git.lizzy.rs Git - plan9front.git/blob - sys/src/games/sokoban/move.c
games/mahjongg: off by one in bmatch(), fix hint() redraw (thanks Kenji)
[plan9front.git] / sys / src / games / sokoban / move.c
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4
5 #include "sokoban.h"
6
7 /* pretty ghastly, if you ask me */
8 void
9 move(int key)
10 {
11         Point g = level.glenda;
12         int moved = 0;
13
14         /* this is messy; no time for math */
15         switch(key) {
16         case Up:
17                 switch(level.board[g.x][g.y-1]) {
18                 case Empty:
19                 case Goal:
20                         moved = 1;
21                         level.glenda = Pt(g.x, g.y-1);
22                         break;
23                 case Cargo:
24                 case GoalCargo:
25                         switch(level.board[g.x][g.y-2]) {
26                         case Empty:
27                                 moved = 1;
28                                 level.board[g.x][g.y-2] = Cargo;
29                                 drawboard(Pt(g.x, g.y-2));
30                                 break;
31                         case Goal:
32                                 moved = 1;
33                                 level.board[g.x][g.y-2] = GoalCargo;
34                                 drawboard(Pt(g.x, g.y-2));
35                                 break;
36                         }
37                         if(moved) {
38                                 level.board[g.x][g.y-1] = (level.board[g.x][g.y-1] == Cargo) ? Empty : Goal;
39                                 level.glenda = Pt(g.x, g.y-1);
40                         }
41                         break;
42                 }
43                 break;
44         case Down:
45                 switch(level.board[g.x][g.y+1]) {
46                 case Empty:
47                 case Goal:
48                         moved = 1;
49                         level.glenda = Pt(g.x, g.y+1);
50                         break;
51                 case Cargo:
52                 case GoalCargo:
53                         switch(level.board[g.x][g.y+2]) {
54                         case Empty:
55                                 moved = 1;
56                                 level.board[g.x][g.y+2] = Cargo;
57                                 drawboard(Pt(g.x, g.y+2));
58                                 break;
59                         case Goal:
60                                 moved = 1;
61                                 level.board[g.x][g.y+2] = GoalCargo;
62                                 drawboard(Pt(g.x, g.y+2));
63                                 break;
64                         }
65                         if(moved) {
66                                 level.board[g.x][g.y+1] = (level.board[g.x][g.y+1] == Cargo) ? Empty : Goal;
67                                 level.glenda = Pt(g.x, g.y+1);
68                         }
69                         break;
70                 }
71                 break;
72         case Left:
73                 glenda = gleft;
74                 switch(level.board[g.x-1][g.y]) {
75                 case Empty:
76                 case Goal:
77                         moved = 1;
78                         level.glenda = Pt(g.x-1, g.y);
79                         break;
80                 case Cargo:
81                 case GoalCargo:
82                         switch(level.board[g.x-2][g.y]) {
83                         case Empty:
84                                 moved = 1;
85                                 level.board[g.x-2][g.y] = Cargo;
86                                 drawboard(Pt(g.x-2, g.y));
87                                 break;
88                         case Goal:
89                                 moved = 1;
90                                 level.board[g.x-2][g.y] = GoalCargo;
91                                 drawboard(Pt(g.x-2, g.y));
92                                 break;
93                         }
94                         if(moved) {
95                                 level.board[g.x-1][g.y] = (level.board[g.x-1][g.y] == Cargo) ? Empty : Goal;
96                                 level.glenda = Pt(g.x-1, g.y);
97                         }
98                         break;
99                 }
100                 break;
101         case Right:
102                 glenda = gright;
103                 switch(level.board[g.x+1][g.y]) {
104                 case Empty:
105                 case Goal:
106                         moved = 1;
107                         level.glenda = Pt(g.x+1, g.y);
108                         break;
109                 case Cargo:
110                 case GoalCargo:
111                         switch(level.board[g.x+2][g.y]) {
112                         case Empty:
113                                 moved = 1;
114                                 level.board[g.x+2][g.y] = Cargo;
115                                 drawboard(Pt(g.x+2, g.y));
116                                 break;
117                         case Goal:
118                                 moved = 1;
119                                 level.board[g.x+2][g.y] = GoalCargo;
120                                 drawboard(Pt(g.x+2, g.y));
121                                 break;
122                         }
123                         if(moved) {
124                                 level.board[g.x+1][g.y] = (level.board[g.x+1][g.y] == Cargo) ? Empty : Goal;
125                                 level.glenda = Pt(g.x+1, g.y);
126                         }
127                         break;
128                 }
129                 break;
130         }
131         if(moved)
132                 drawboard(Pt(g.x, g.y));
133
134         drawglenda();
135 }
136