xref: /netbsd-src/games/hunt/huntd/terminal.c (revision 9fbd88883c38d0c0fbfcbe66d76fe6b0fab3f9de)
1 /*	$NetBSD: terminal.c,v 1.2 1997/10/10 16:34:05 lukem Exp $	*/
2 /*
3  *  Hunt
4  *  Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold
5  *  San Francisco, California
6  */
7 
8 #include <sys/cdefs.h>
9 #ifndef lint
10 __RCSID("$NetBSD: terminal.c,v 1.2 1997/10/10 16:34:05 lukem Exp $");
11 #endif /* not lint */
12 
13 #if __STDC__
14 #include <stdarg.h>
15 #else
16 #include <varargs.h>
17 #endif
18 # include	"hunt.h"
19 # define	TERM_WIDTH	80	/* Assume terminals are 80-char wide */
20 
21 /*
22  * cgoto:
23  *	Move the cursor to the given position on the given player's
24  *	terminal.
25  */
26 void
27 cgoto(pp, y, x)
28 	PLAYER	*pp;
29 	int	y, x;
30 {
31 	if (x == pp->p_curx && y == pp->p_cury)
32 		return;
33 	sendcom(pp, MOVE, y, x);
34 	pp->p_cury = y;
35 	pp->p_curx = x;
36 }
37 
38 /*
39  * outch:
40  *	Put out a single character.
41  */
42 void
43 outch(pp, ch)
44 	PLAYER	*pp;
45 	char	ch;
46 {
47 	if (++pp->p_curx >= TERM_WIDTH) {
48 		pp->p_curx = 0;
49 		pp->p_cury++;
50 	}
51 	(void) putc(ch, pp->p_output);
52 }
53 
54 /*
55  * outstr:
56  *	Put out a string of the given length.
57  */
58 void
59 outstr(pp, str, len)
60 	PLAYER	*pp;
61 	char	*str;
62 	int	len;
63 {
64 	pp->p_curx += len;
65 	pp->p_cury += (pp->p_curx / TERM_WIDTH);
66 	pp->p_curx %= TERM_WIDTH;
67 	while (len--)
68 		(void) putc(*str++, pp->p_output);
69 }
70 
71 /*
72  * clrscr:
73  *	Clear the screen, and reset the current position on the screen.
74  */
75 void
76 clrscr(pp)
77 	PLAYER	*pp;
78 {
79 	sendcom(pp, CLEAR);
80 	pp->p_cury = 0;
81 	pp->p_curx = 0;
82 }
83 
84 /*
85  * ce:
86  *	Clear to the end of the line
87  */
88 void
89 ce(pp)
90 	PLAYER	*pp;
91 {
92 	sendcom(pp, CLRTOEOL);
93 }
94 
95 #if 0		/* XXX lukem*/
96 /*
97  * ref;
98  *	Refresh the screen
99  */
100 void
101 ref(pp)
102 	PLAYER	*pp;
103 {
104 	sendcom(pp, REFRESH);
105 }
106 #endif
107 
108 /*
109  * sendcom:
110  *	Send a command to the given user
111  */
112 void
113 #if __STDC__
114 sendcom(PLAYER *pp, int command, ...)
115 #else
116 sendcom(pp, command, va_alist)
117 	PLAYER	*pp;
118 	int	command;
119 	va_dcl
120 #endif
121 {
122 	va_list	ap;
123 	int	arg1, arg2;
124 #if __STDC__
125 	va_start(ap, command);
126 #else
127 	va_start(ap);
128 #endif
129 	(void) putc(command, pp->p_output);
130 	switch (command & 0377) {
131 	case MOVE:
132 		arg1 = va_arg(ap, int);
133 		arg2 = va_arg(ap, int);
134 		(void) putc(arg1, pp->p_output);
135 		(void) putc(arg2, pp->p_output);
136 		break;
137 	case ADDCH:
138 	case READY:
139 		arg1 = va_arg(ap, int);
140 		(void) putc(arg1, pp->p_output);
141 		break;
142 	}
143 
144 	va_end(ap);		/* No return needed for void functions. */
145 }
146