source: mainline/uspace/app/tetris/screen.c@ 0d3b9474

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 0d3b9474 was ebe70f1, checked in by Martin Decky <martin@…>, 16 years ago

slightly cleanup the horrible mess of tetris
introduce colors

  • Property mode set to 100644
File size: 6.3 KB
Line 
1/* $OpenBSD: screen.c,v 1.13 2006/04/20 03:25:36 ray Exp $ */
2/* $NetBSD: screen.c,v 1.4 1995/04/29 01:11:36 mycroft Exp $ */
3
4/*-
5 * Copyright (c) 1992, 1993
6 * The Regents of the University of California. All rights reserved.
7 *
8 * This code is derived from software contributed to Berkeley by
9 * Chris Torek and Darren F. Provine.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 *
35 * @(#)screen.c 8.1 (Berkeley) 5/31/93
36 */
37
38/** @addtogroup tetris
39 * @{
40 */
41/** @file
42 */
43
44/*
45 * Tetris screen control.
46 */
47
48#include <err.h>
49#include <stdio.h>
50#include <stdlib.h>
51#include <string.h>
52#include <unistd.h>
53#include <vfs/vfs.h>
54#include <async.h>
55#include "screen.h"
56#include "tetris.h"
57#include <io/console.h>
58
59#define STOP (B_COLS - 3)
60
61static cell curscreen[B_SIZE]; /* non-zero => standout (or otherwise marked) */
62static int curscore;
63static int isset; /* true => terminal is in game mode */
64
65static const struct shape *lastshape;
66
67
68/*
69 * putstr() is for unpadded strings (either as in termcap(5) or
70 * simply literal strings);
71 */
72static inline void putstr(char *s)
73{
74 while (*s)
75 putchar(*(s++));
76}
77
78static void start_standout(uint32_t color)
79{
80 console_set_rgb_color(fphone(stdout), 0xf0f0f0, color);
81}
82
83static void resume_normal(void)
84{
85 console_set_rgb_color(fphone(stdout), 0, 0xf0f0f0);
86}
87
88void clear_screen(void)
89{
90 console_clear(fphone(stdout));
91 moveto(0, 0);
92}
93
94/*
95 * Clear the screen, forgetting the current contents in the process.
96 */
97void scr_clear(void)
98{
99 resume_normal();
100 console_clear(fphone(stdout));
101 curscore = -1;
102 memset(curscreen, 0, sizeof(curscreen));
103}
104
105/*
106 * Set up screen
107 */
108void scr_init(void)
109{
110 console_cursor_visibility(fphone(stdout), 0);
111 resume_normal();
112 scr_clear();
113}
114
115void moveto(int r, int c)
116{
117 console_goto(fphone(stdout), c, r);
118}
119
120winsize_t winsize;
121
122static int get_display_size(winsize_t *ws)
123{
124 return console_get_size(fphone(stdout), &ws->ws_col, &ws->ws_row);
125}
126
127/*
128 * Set up screen mode.
129 */
130void scr_set(void)
131{
132 winsize_t ws;
133
134 Rows = 0;
135 Cols = 0;
136
137 if (get_display_size(&ws) == 0) {
138 Rows = ws.ws_row;
139 Cols = ws.ws_col;
140 }
141
142 if ((Rows < MINROWS) || (Cols < MINCOLS)) {
143 char smallscr[55];
144
145 snprintf(smallscr, sizeof(smallscr),
146 "the screen is too small (must be at least %dx%d)",
147 MINROWS, MINCOLS);
148 stop(smallscr);
149 }
150 isset = 1;
151
152 scr_clear();
153}
154
155/*
156 * End screen mode.
157 */
158void scr_end(void)
159{
160 console_cursor_visibility(fphone(stdout), 1);
161}
162
163void stop(char *why)
164{
165 if (isset)
166 scr_end();
167
168 errx(1, "aborting: %s", why);
169}
170
171/*
172 * Update the screen.
173 */
174void scr_update(void)
175{
176 cell *bp;
177 cell *sp;
178 cell so;
179 cell cur_so = 0;
180 int i;
181 int j;
182 int ccol;
183
184 /* Always leave cursor after last displayed point */
185 curscreen[D_LAST * B_COLS - 1] = -1;
186
187 if (score != curscore) {
188 moveto(0, 0);
189 printf("Score: %d", score);
190 curscore = score;
191 }
192
193 /* Draw preview of next pattern */
194 if ((showpreview) && (nextshape != lastshape)) {
195 int i;
196 static int r = 5, c = 2;
197 int tr, tc, t;
198
199 lastshape = nextshape;
200
201 /* Clean */
202 resume_normal();
203 moveto(r - 1, c - 1);
204 putstr(" ");
205 moveto(r, c - 1);
206 putstr(" ");
207 moveto(r + 1, c - 1);
208 putstr(" ");
209 moveto(r + 2, c - 1);
210 putstr(" ");
211
212 moveto(r - 3, c - 2);
213 putstr("Next shape:");
214
215 /* Draw */
216 start_standout(nextshape->color);
217 moveto(r, 2 * c);
218 putstr(" ");
219 for (i = 0; i < 3; i++) {
220 t = c + r * B_COLS;
221 t += nextshape->off[i];
222
223 tr = t / B_COLS;
224 tc = t % B_COLS;
225
226 moveto(tr, 2*tc);
227 putstr(" ");
228 }
229 resume_normal();
230 }
231
232 bp = &board[D_FIRST * B_COLS];
233 sp = &curscreen[D_FIRST * B_COLS];
234 for (j = D_FIRST; j < D_LAST; j++) {
235 ccol = -1;
236 for (i = 0; i < B_COLS; bp++, sp++, i++) {
237 if (*sp == (so = *bp))
238 continue;
239
240 *sp = so;
241 if (i != ccol) {
242 if (cur_so) {
243 resume_normal();
244 cur_so = 0;
245 }
246 moveto(RTOD(j), CTOD(i));
247 }
248
249 if (so != cur_so) {
250 if (so)
251 start_standout(so);
252 else
253 resume_normal();
254 cur_so = so;
255 }
256 putstr(" ");
257
258 ccol = i + 1;
259 /*
260 * Look ahead a bit, to avoid extra motion if
261 * we will be redrawing the cell after the next.
262 * Motion probably takes four or more characters,
263 * so we save even if we rewrite two cells
264 * `unnecessarily'. Skip it all, though, if
265 * the next cell is a different color.
266 */
267
268 if ((i > STOP) || (sp[1] != bp[1]) || (so != bp[1]))
269 continue;
270
271 if (sp[2] != bp[2])
272 sp[1] = -1;
273 else if ((i < STOP) && (so == bp[2]) && (sp[3] != bp[3])) {
274 sp[2] = -1;
275 sp[1] = -1;
276 }
277 }
278 }
279
280 if (cur_so)
281 resume_normal();
282
283 fflush(stdout);
284}
285
286/*
287 * Write a message (set != 0), or clear the same message (set == 0).
288 * (We need its length in case we have to overwrite with blanks.)
289 */
290void scr_msg(char *s, int set)
291{
292 int l = str_size(s);
293
294 moveto(Rows - 2, ((Cols - l) >> 1) - 1);
295
296 if (set)
297 putstr(s);
298 else
299 while (--l >= 0)
300 (void) putchar(' ');
301}
302
303/** @}
304 */
Note: See TracBrowser for help on using the repository browser.