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