Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
#include <draw.h>
4
#include <event.h>
5
#include "mahjongg.h"
6
 
7
#define MJDIR "/sys/games/lib/mahjongg/"
8
 
9
char *Border	= MJDIR "images/border.bit";
10
char *Mask	= MJDIR "images/mask.bit";
11
char *Gameover	= MJDIR "images/gameover.bit";
12
 
13
char *deftileset= MJDIR "tilesets/default.tileset";
14
char *defbackgr = MJDIR "backgrounds/default.bit";
15
char *deflayout = MJDIR "layouts/default.layout";
16
 
17
ulong defchan;
18
int trace;
19
 
20
char *buttons[] =
21
{
22
	"deselect",
23
	"new",
24
	"restart",
25
	"resize",
26
	"exit",
27
 
28
};
29
 
30
Menu menu =
31
{
32
	buttons
33
};
34
 
35
void
36
usage(void)
37
{
38
	fprint(2, "usage: %s [-cf] [-b bg] [-l layout] [-t tileset]\n", argv0);
39
	exits("usage");
40
}
41
 
42
Image *
43
eallocimage(Rectangle r, int repl, uint chan, uint color)
44
{
45
	Image *tmp;
46
 
47
	tmp = allocimage(display, r, chan, repl, color);
48
	if(tmp == nil)
49
		sysfatal("cannot allocate buffer image: %r");
50
	return tmp;
51
}
52
 
53
Image *
54
eloadfile(char *path)
55
{
56
	Image *img;
57
	int fd;
58
 
59
	fd = open(path, OREAD);
60
	if(fd < 0) {
61
		fprint(2, "cannot open image file %s: %r\n", path);
62
		exits("image");
63
	}
64
	img = readimage(display, fd, 0);
65
	if(img == nil)
66
		sysfatal("cannot load image: %r");
67
	close(fd);
68
 
69
	return img;
70
}
71
 
72
void
73
allocimages(void)
74
{
75
	Rectangle one = Rect(0, 0, 1, 1);
76
 
77
	selected = eallocimage(one, 1, RGBA32, setalpha(DPalebluegreen, 0x5f));
78
	litbrdr = eallocimage(one, 1, RGBA32, DGreen);
79
	img = eallocimage(Rect(0, 0, Sizex, Sizey), 0,
80
		defchan? defchan: screen->chan, DBlack);
81
	textcol = eallocimage(one, 1, RGBA32, DWhite);
82
 
83
	background = eloadfile(defbackgr);
84
	replclipr(background, 1, img->r);
85
 
86
	mask = eloadfile(Mask);
87
	gameover = eloadfile(Gameover);
88
	tileset = eloadfile(deftileset);
89
}
90
 
91
 
92
void
93
eresized(int new)
94
{
95
	if(new && getwindow(display, Refnone) < 0)
96
		sysfatal("can't reattach to window");
97
	drawlevel();
98
}
99
 
100
void
101
main(int argc, char **argv)
102
{
103
	int clickety = 0;
104
	Mouse m;
105
	Event e;
106
	Point origin = Pt(Bord, Bord);
107
 
108
	ARGBEGIN{
109
	case 'b':
110
		defbackgr = EARGF(usage());
111
		break;
112
	case 'c':
113
		defchan = RGBA32;
114
		break;
115
	case 'f':
116
		trace = 1;
117
		break;
118
	case 'l':
119
		deflayout = EARGF(usage());
120
		break;
121
	case 't':
122
		deftileset = EARGF(usage());
123
		break;
124
	default:
125
		usage();
126
	}ARGEND
127
 
128
	if(argc > 0)
129
		usage();
130
 
131
	if(! parse(deflayout)) {
132
		fprint(2, "usage: %s [levelfile]\n", argv[0]);
133
		exits("usage");
134
	}
135
 
136
	if(initdraw(nil, nil, "mahjongg") < 0)
137
		sysfatal("initdraw failed: %r");
138
	einit(Emouse|Ekeyboard);
139
 
140
	allocimages();
141
 
142
	/* resize to the size of the current level */
143
	resize(img->r.max);
144
 
145
	generate(time(0));
146
	drawlevel();
147
	for(;;) {
148
		if(level.remaining == 0 && !level.done)
149
			done();
150
		switch(event(&e)) {
151
		case Emouse:
152
			m = e.mouse;
153
			if(m.buttons&1) {
154
				if(level.done)
155
					break;
156
				if(!clickety && level.remaining > 0) {
157
					clickety = 1;
158
					clicked(subpt(m.xy, addpt(screen->r.min,
159
						origin)));
160
				}
161
			} else {
162
				clickety = 0;
163
				if(trace)
164
					light(subpt(m.xy, addpt(screen->r.min,
165
						origin)));
166
			}
167
			if(m.buttons&2) {
168
				/* nothing here for the moment */
169
			}
170
			if(m.buttons&4)
171
				switch(emenuhit(3, &m, &menu)) {
172
				case 0:
173
					deselect();
174
					break;
175
				case 1:
176
					generate(time(0));
177
					drawlevel();
178
					break;
179
				case 2:
180
					level = orig;
181
					drawlevel();
182
					break;
183
				case 3:
184
					resize(img->r.max);
185
					break;
186
				case 4:
187
					exits(nil);
188
				}
189
			break;
190
		case 2:
191
			switch(e.kbdc) {
192
			case 127:
193
			case 'q':
194
			case 'Q':
195
				exits(nil);
196
			case 'h':
197
			case 'H':
198
				if(!level.done)
199
					hint();
200
				break;
201
			case 'n':
202
			case 'N':
203
				/* new */
204
				generate(time(0));
205
				drawlevel();
206
				break;
207
			case 'r':
208
			case 'R':
209
				level = orig;
210
				drawlevel();
211
				break;
212
			case 'c':
213
			case 'C':
214
				if(!level.done) {
215
					clearlevel();
216
					done();
217
				}
218
				break;
219
			case 8:
220
			case 'u':
221
			case 'U':
222
				if(level.done) {
223
					level.done = 0;
224
					drawlevel();
225
				}
226
				undo();
227
				break;
228
			}
229
			break;
230
		}
231
	}
232
}