xref: /plan9/sys/src/games/sokoban/graphics.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 #include <event.h>
5*a7b22450SDavid du Colombier 
6*a7b22450SDavid du Colombier #include "sokoban.h"
7*a7b22450SDavid du Colombier 
8*a7b22450SDavid du Colombier void
drawscreen(void)9*a7b22450SDavid du Colombier drawscreen(void)
10*a7b22450SDavid du Colombier {
11*a7b22450SDavid du Colombier 	draw(screen, screen->r, img, nil, ZP);
12*a7b22450SDavid du Colombier 	flushimage(display, 1);
13*a7b22450SDavid du Colombier }
14*a7b22450SDavid du Colombier 
15*a7b22450SDavid du Colombier void
drawglenda(void)16*a7b22450SDavid du Colombier drawglenda(void)
17*a7b22450SDavid du Colombier {
18*a7b22450SDavid du Colombier 	Rectangle r;
19*a7b22450SDavid du Colombier 	Point p;
20*a7b22450SDavid du Colombier 
21*a7b22450SDavid du Colombier 	p = level.glenda;
22*a7b22450SDavid du Colombier 	p.x *= BoardX;
23*a7b22450SDavid du Colombier 	p.y *= BoardY;
24*a7b22450SDavid du Colombier 	/* leave some room from the edge of the window */
25*a7b22450SDavid du Colombier 	p = addpt(p, Pt(1, 1));
26*a7b22450SDavid du Colombier 
27*a7b22450SDavid du Colombier 	r = Rpt(p, Pt(p.x + BoardX, p.y+BoardY));
28*a7b22450SDavid du Colombier 	draw(img, r, glenda, nil, ZP);
29*a7b22450SDavid du Colombier }
30*a7b22450SDavid du Colombier 
31*a7b22450SDavid du Colombier void
drawwin(void)32*a7b22450SDavid du Colombier drawwin(void)
33*a7b22450SDavid du Colombier {
34*a7b22450SDavid du Colombier 	Rectangle r;
35*a7b22450SDavid du Colombier 	Point p;
36*a7b22450SDavid du Colombier 
37*a7b22450SDavid du Colombier 	p = level.glenda;
38*a7b22450SDavid du Colombier 	p.x *= BoardX;
39*a7b22450SDavid du Colombier 	p.y *= BoardY;
40*a7b22450SDavid du Colombier 	p = addpt(p, Pt(6, 6));
41*a7b22450SDavid du Colombier 	p = addpt(p, Pt(1, 1));
42*a7b22450SDavid du Colombier 
43*a7b22450SDavid du Colombier 	r = Rpt(p, Pt(p.x + BoardX, p.y+BoardY));
44*a7b22450SDavid du Colombier 	draw(img, r, text, win, ZP);
45*a7b22450SDavid du Colombier }
46*a7b22450SDavid du Colombier 
47*a7b22450SDavid du Colombier void
drawboard(Point p)48*a7b22450SDavid du Colombier drawboard(Point p)
49*a7b22450SDavid du Colombier {
50*a7b22450SDavid du Colombier 	Rectangle r;
51*a7b22450SDavid du Colombier 	uint square = level.board[p.x][p.y];
52*a7b22450SDavid du Colombier 
53*a7b22450SDavid du Colombier 	p.x *= BoardX;
54*a7b22450SDavid du Colombier 	p.y *= BoardY;
55*a7b22450SDavid du Colombier 
56*a7b22450SDavid du Colombier 	/* leave some room from the edge of the window */
57*a7b22450SDavid du Colombier 	p = addpt(p, Pt(1, 1));
58*a7b22450SDavid du Colombier 
59*a7b22450SDavid du Colombier 	r = Rpt(p, Pt(p.x + BoardX, p.y+BoardY));
60*a7b22450SDavid du Colombier 
61*a7b22450SDavid du Colombier 	switch(square) {
62*a7b22450SDavid du Colombier 	case Background:
63*a7b22450SDavid du Colombier 		draw(img, r, bg, nil, ZP);
64*a7b22450SDavid du Colombier 		break;
65*a7b22450SDavid du Colombier 	case Empty:
66*a7b22450SDavid du Colombier 		draw(img, r, empty, nil, ZP);
67*a7b22450SDavid du Colombier 		break;
68*a7b22450SDavid du Colombier 	case Wall:
69*a7b22450SDavid du Colombier 		draw(img, r, wall, nil, ZP);
70*a7b22450SDavid du Colombier 		break;
71*a7b22450SDavid du Colombier 	case Cargo:
72*a7b22450SDavid du Colombier 		draw(img, r, cargo, nil, ZP);
73*a7b22450SDavid du Colombier 		break;
74*a7b22450SDavid du Colombier 	case Goal:
75*a7b22450SDavid du Colombier 		draw(img, r, goal, nil, ZP);
76*a7b22450SDavid du Colombier 		break;
77*a7b22450SDavid du Colombier 	case GoalCargo:
78*a7b22450SDavid du Colombier 		draw(img, r, goalcargo, nil, ZP);
79*a7b22450SDavid du Colombier 		break;
80*a7b22450SDavid du Colombier 	}
81*a7b22450SDavid du Colombier }
82*a7b22450SDavid du Colombier 
83*a7b22450SDavid du Colombier void
resize(Point p)84*a7b22450SDavid du Colombier resize(Point p)
85*a7b22450SDavid du Colombier {
86*a7b22450SDavid du Colombier 	/* resize to the size of the current level */
87*a7b22450SDavid du Colombier 
88*a7b22450SDavid du Colombier 	int fd;
89*a7b22450SDavid du Colombier 
90*a7b22450SDavid du Colombier 	fd = open("/dev/wctl", OWRITE);
91*a7b22450SDavid du Colombier 	if(fd >= 0){
92*a7b22450SDavid du Colombier 		fprint(fd, "resize -dx %d -dy %d", p.x*BoardX+10, p.y*BoardY+10);
93*a7b22450SDavid du Colombier 		close(fd);
94*a7b22450SDavid du Colombier 	}
95*a7b22450SDavid du Colombier 
96*a7b22450SDavid du Colombier }
97*a7b22450SDavid du Colombier 
98*a7b22450SDavid du Colombier Point
boardsize(Point p)99*a7b22450SDavid du Colombier boardsize(Point p)
100*a7b22450SDavid du Colombier {
101*a7b22450SDavid du Colombier 	return Pt(p.x*BoardX+2, p.y*BoardY+2);
102*a7b22450SDavid du Colombier }
103*a7b22450SDavid du Colombier 
104*a7b22450SDavid du Colombier void
drawlevel(void)105*a7b22450SDavid du Colombier drawlevel(void)
106*a7b22450SDavid du Colombier {
107*a7b22450SDavid du Colombier 	int x, y;
108*a7b22450SDavid du Colombier 
109*a7b22450SDavid du Colombier 	resize(level.max);
110*a7b22450SDavid du Colombier 
111*a7b22450SDavid du Colombier 	if(img)
112*a7b22450SDavid du Colombier 		freeimage(img);
113*a7b22450SDavid du Colombier 	img = eallocimage(Rpt(Pt(0, 0), boardsize(level.max)), 0, 0);
114*a7b22450SDavid du Colombier 
115*a7b22450SDavid du Colombier 	draw(img, insetrect(img->r, 1), empty, nil, ZP);
116*a7b22450SDavid du Colombier 
117*a7b22450SDavid du Colombier 	for(x = 0; x < MazeX; x++) {
118*a7b22450SDavid du Colombier 		for(y = 0; y < MazeY; y++) {
119*a7b22450SDavid du Colombier 			drawboard(Pt(x, y));
120*a7b22450SDavid du Colombier 		}
121*a7b22450SDavid du Colombier 	}
122*a7b22450SDavid du Colombier 
123*a7b22450SDavid du Colombier 	drawglenda();
124*a7b22450SDavid du Colombier }
125