1 /*
2  *	@(#) screen.c -- Screen oriented routines for TROJKA
3  *	created:	4.iii.1992
4  *	last update: 	16.iv.1992
5  */
6 
7 #include <stdio.h>
8 #include <curses.h>
9 
10 #include "sys_custom.h"
11 #include "trojka.h"
12 #include "screen.h"
13 #include "hiscore.h"
14 
15 int	makeblock(), 	wipeblock(), 	makestars(),
16 	showscore(), 	showtrojka(), 	showspeed(),
17 	showmesg(),	showgameover(),
18 	titlescreen(),	listscores(),
19 	build(), 	redraw(),	drawfield(),
20 	statistics(), 	selectspeed(),
21         getname(),	dropchar(),	backspace();
22 
23 extern struct scorefile *sfile;
24 
25 extern flag
26 	quit; 		/* all defined in trojka */
27 
28 extern int
29 	block_count[],
30 	xloc[],
31 	yloc[],
32 	blockwidth,
33 	stacklevel,
34 	position,
35 	x_min,
36 	x_max,
37 	statx,
38 	speed;
39 
40 
41 extern unsigned long
42 	score,
43 	wipes,
44 	blocks;
45 
46 extern char field[VIRT_XSIZE][VIRT_YSIZE];
47 
48 static char TITLE[7][40] = {
49 	"                       **",
50 	"*****  ****    ***   *   *  *  *    *  ",
51 	"  *    *   *  *   *  *  **  * *    * * ",
52 	"  *    ****   *   *  * * *  **    *   *",
53 	"  *    *      *   *  **  *  * *   *****",
54 	"  *    *       ***   *   *  *  *  *   *",
55 	"  T      R      O      J     K      A  "
56 };
57 
58 
59 static char mesg[MESGS][40] = {
60 	"You're doin' well",
61 	"You're playing ok",
62 	"You're doin' fine",
63 	"You're playing good",
64 	"You're playing great",
65 	"You're playing very good",
66 	"You're really are good at this",
67 	"You're a champion",
68 	"You're a trojka-professional",
69 	"You've played this before, haven't ya?",
70 	"Hey, I hope you're not cheating!",
71 	"What a magnificent score",
72 	"You're kinda addicted...",
73 	"You're a MEGA-player",
74 	"What time is it, by the way?",
75 	"You're a trojka-czar",
76 	"I'm very tired",
77 	"You must be paranoid..",
78 	"I give up giving comments. Enjoy!"
79 };
80 
81 static char block80[BLOCKS+1][5] =
82 {
83 	"    ",
84 	"OOOO",
85 	"||||",
86 	"XXXX",
87 	"%%%%",
88 	"$$$$"
89 }; /* used in mono */
90 
91 
makeblock(x,y,shape)92 int makeblock(x, y, shape)		/* create a block	*/
93 int x, y, shape;
94 {
95 	movexy(xloc[x], yloc[y]);
96 	qprintf("%4s",block80[shape]);
97 }
98 
99 
wipeblock(x,y)100 int wipeblock(x, y)		/* remove block */
101 int x, y;
102 {
103 	movexy(xloc[x], yloc[y]);
104 	qprintf(SPACE80);
105 }
106 
107 
makestars(x,y)108 int makestars(x, y)		/* show stars */
109 int x, y;
110 {
111 	movexy(xloc[x], yloc[y]);
112 	qprintf(WIPE80);
113 }
114 
115 
showscore()116 int showscore()
117 {
118 	movexy(SCORE_X, SCORE_Y+1);
119 	qprintf("%7lu",score);
120 	refresh();
121 }
122 
123 
showtrojka(bonus)124 int showtrojka(bonus)
125 int bonus;
126 {
127 	movexy(x_min, BONUS_Y);
128 	qprintf("TROJKA!  %5lu",
129 		(unsigned long)(1111*bonus)
130 	);
131 	refresh();
132 	delay(1000);
133 	movexy(x_min, BONUS_Y); qprintf("              ");
134 	refresh();
135 }
136 
137 
showspeed(s)138 int showspeed(s)
139 int s;
140 {
141 	movexy(SPEED_X+3, SPEED_Y+1);	qprintf("%u",s);
142 		refresh();
143 }
144 
145 
showmesg(n)146 int showmesg(n)
147 int n;
148 {
149 	movexy((80 - strlen(mesg[n])) / 2, MESG_Y);
150 	qprintf("%s",mesg[n]);
151 		refresh();
152 }
153 
154 
wipemesg()155 int wipemesg()
156 {
157 	movexy(1, MESG_Y);
158 	clreol();
159 		refresh();
160 }
161 
162 
showgameover()163 int showgameover()
164 {
165 	movexy(x_min,10);
166 	qprintf(" G A M E    O V E R ");
167 		refresh();
168 	delay(1500);
169 
170 }
171 
172 
handletrojka(trojka_count)173 int handletrojka(trojka_count)
174 int trojka_count;
175 {
176 	showtrojka(trojka_count);
177 	score += (unsigned long)(trojka_count * 1111);
178 	showscore();
179 }
180 
181 
titlescreen()182 int titlescreen()			/* title screen */
183 {
184 	char c;
185 	int i;
186 
187 
188 	clear_scr();
189 
190 	for(i = 0; i < 7;i++) {
191 		movexy(1,i +6);
192 		qprintf("%s",TITLE[i]);
193 	}
194 	movexy(1,i + 13);
195 	qprintf("KEEP PLAYING TROJKA");
196 
197 	readscores();	/* re-read scores */
198 	listscores();
199 	movexy(1,1);
200 	refresh();
201 	killkeys();
202 	c = getch();
203 
204 	if(c == QUIT)
205 		quit = TRUE;
206 
207 	clear_scr();
208 }
209 
210 
listscores()211 int listscores()
212 {
213 	int j;
214 	flag hilite;
215 
216 	struct scorefile *eof, *i;
217 
218 	eof = &sfile[NUMSCORES-1];
219 	j = 0;
220 	hilite = 0;
221 
222 	movexy(HISCORE_X,1);	qprintf("Best Trojka-Czars");
223 
224 	for(i=sfile; i<eof; i++) {
225 		if (j == position-1) {
226 			hilite = 1;
227 			standout();
228 /* hilight */
229 		}
230 		movexy(HISCORE_X, j+3);
231 		qprintf("%-22s %7lu %3d",
232 			i->name,
233 			i->points,
234 			i->stage
235 		);
236 		if(hilite == 1) {
237 			standend();
238 /* unhilight */
239 			hilite = 0;
240 		}
241 		j++;
242 	}
243 	if(position >= NUMSCORES) {
244 		movexy(HISCORE_X, 24);
245 		qprintf("%-22s %7lu %3d",
246 			"You",
247 			score,
248 			speed
249 		);
250 	}
251 }
252 
253 
build()254 int build()
255 {
256 	int x, y, left, right;
257 
258 	left = x_min - 1;
259 	right = x_max + blockwidth;
260 
261 	clear_scr();
262 
263 	for(y = SCR_TOP + 1; y <= BOTTOM; y++) {
264 		movexy(left, y);
265 		qprintf("#");
266 		movexy(right, y);
267 		qprintf("#");
268 	}
269 	for(x = left; x <= right; x++)
270 	{
271 		movexy(x, BOTTOM + 1);
272 		qprintf("#");
273 	}
274 
275 	movexy(SCORE_X, SCORE_Y);	qprintf("-SCORE-");
276 	movexy(SPEED_X, SPEED_Y);	qprintf("-SPEED-");
277 	movexy(statx, SUM_Y);		qprintf("S U M");
278 	movexy(statx, WIPES_Y);		qprintf("* * *");
279 	movexy(statx, 1);		qprintf("Statistics");
280 	for(y = 0; y < BLOCKS; y++) {
281 		movexy(statx, (y * 2) + 3);
282 		qprintf("%4s",block80[y+1]);
283 	}
284 	movexy(SPEED_X+3, SPEED_Y+1);	qprintf("%u",speed);
285 	refresh();
286 }
287 
288 
redraw()289 int redraw()
290 {
291 	int x, y, left, right;
292 
293 	left = x_min - 1;
294 	right = x_max + blockwidth;
295 
296 	clear_scr();
297 
298 	for(y = SCR_TOP + 1; y <= BOTTOM; y++) {
299 		movexy(left, y);
300 		qprintf("#");
301 		movexy(right, y);
302 		qprintf("#");
303 	}
304 	for(x = left; x <= right; x++)
305 	{
306 		movexy(x, BOTTOM + 1);
307 		qprintf("#");
308 	}
309 
310 	movexy(SCORE_X, SCORE_Y);	qprintf("-SCORE-");
311 	movexy(SPEED_X, SPEED_Y);	qprintf("-SPEED-");
312 	movexy(statx, SUM_Y);		qprintf("S U M");
313 	movexy(statx, WIPES_Y);		qprintf("* * *");
314 	movexy(statx, 1);		qprintf("Statistics");
315 	for(y = 0; y < BLOCKS; y++) {
316 		movexy(statx, (y * 2) + 3);
317 		qprintf("%4s",block80[y+1]);
318 	}
319 	drawfield();
320 	refresh();
321 }
322 
323 
drawfield()324 int drawfield()
325 {
326 	int x,y;
327 
328 	for(x = 0; x < VIRT_XSIZE;x++)
329 		for(y = PLM_TOP; y >= PLM_BOTTOM; y--)
330 			makeblock(x,y,field[x][y]);
331 }
332 
333 
statistics()334 int statistics()
335 {
336 	int y, perc, x;
337 
338 	x = statx + 6;
339 
340 	movexy(statx, WIPES_Y+1);	qprintf("%5lu",wipes);
341 	movexy(statx, SUM_Y+1);		qprintf("%5lu",blocks);
342 
343 	for(y = 0; y < BLOCKS; y++) {
344 		perc = (block_count[y] * 100) / blocks;
345 		movexy(x, (( y * 2 ) + 3) );
346 		qprintf("%4d %%", perc);
347 	}
348 	refresh();
349 }
350 
351 
selectspeed()352 int selectspeed()	/* get starting speed */
353 {
354 	char c;
355 
356 	movexy(10, 12);
357 	qprintf("Select game-speed (0...9) --->");
358 	refresh();
359 	killkeys();			/* flush keyboard buffer */
360 	c = getch();
361 	if (c == QUIT)		/* if QUIT-key is pressed.. */
362 		quit = TRUE;		/* ..quit the game        */
363 	else {
364 		if((c >= '0') && (c <= '9'))
365 			return c-'0';
366 		return 5 ;
367 	}
368 }
369 
370 
getname(tag)371 int getname(tag)
372 char tag[];
373 {
374 	int x, xstart, name_len;
375 	char c;
376 
377 	name_len = 20;
378 	x = c = 0;
379 	xstart = (80-name_len) / 2;
380 
381 	clear_scr();
382 
383 	movexy(xstart, SCORE_Y);
384 	qprintf("Score: %7lu", score);
385 	movexy(xstart, SCORE_Y + 3);
386 	qprintf("Enter your name please:");
387 	movexy(xstart, TAG_Y);
388 	qprintf("....................");
389 	movexy(xstart + x, TAG_Y);
390 	refresh();
391 
392 	killkeys();
393 	c = getch();
394 
395 	movexy(26,SCORE_Y); clreol();
396 	movexy(26,SCORE_Y + 3); clreol();
397 	refresh();
398 
399 	while((c != CR) && (c != LF)) {
400 		movexy(xstart + x, TAG_Y);
401 		refresh();
402 		if ((c >= ' ') && (c <= '~') && (x < name_len)) {
403 			dropchar(xstart + x, (tag[x] = c));
404 			x++;
405 		} else if((c == BACKSP) && (x > 0)) {
406 				x--;
407 				backspace(xstart + x, tag[x]);
408 				tag[x] = '\0';
409 				movexy(xstart + x, TAG_Y);
410 				qprintf(".");
411 				movexy(xstart + x, TAG_Y);
412 				refresh();
413 			}
414 		c = getch();
415 	}
416 	tag[x] = '\0';
417 	return(x);
418 }
419 
420 
dropchar(x,c)421 int dropchar(x,c)
422 int x;
423 char c;
424 {
425 	int y;
426 
427 	for(y = SCR_TOP + 1; y <= TAG_Y; y++) {
428 		movexy(x, y-1);		qprintf(" ");
429 		movexy(x, y);		qprintf("%c",c);
430 		refresh();
431 	}
432 }
433 
434 
backspace(x,c)435 int backspace(x, c)
436 int x;
437 char c;
438 {
439 	int y;
440 
441 	for(y = TAG_Y; y < SCR_BOT - 1; y++) {
442 		movexy(x, y);		qprintf("%c",c);
443 		refresh();
444 		movexy(x, y);		qprintf(" ");
445 		refresh();
446 	}
447 }
448