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