summaryrefslogtreecommitdiffstats
path: root/hunt/huntd/terminal.c
blob: 13d34850d9135035bd845d6e80d31d7b31159b59 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
 *  Hunt
 *  Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold
 *  San Francisco, California
 */

# include	"hunt.h"
# define	TERM_WIDTH	80	/* Assume terminals are 80-char wide */

/*
 * cgoto:
 *	Move the cursor to the given position on the given player's
 *	terminal.
 */
cgoto(pp, y, x)
register PLAYER	*pp;
register int	y, x;
{
	if (x == pp->p_curx && y == pp->p_cury)
		return;
	sendcom(pp, MOVE, y, x);
	pp->p_cury = y;
	pp->p_curx = x;
}

/*
 * outch:
 *	Put out a single character.
 */
outch(pp, ch)
register PLAYER	*pp;
char		ch;
{
	if (++pp->p_curx >= TERM_WIDTH) {
		pp->p_curx = 0;
		pp->p_cury++;
	}
	(void) putc(ch, pp->p_output);
}

/*
 * outstr:
 *	Put out a string of the given length.
 */
outstr(pp, str, len)
register PLAYER	*pp;
register char	*str;
register int	len;
{
	pp->p_curx += len;
	pp->p_cury += (pp->p_curx / TERM_WIDTH);
	pp->p_curx %= TERM_WIDTH;
	while (len--)
		(void) putc(*str++, pp->p_output);
}

/*
 * clrscr:
 *	Clear the screen, and reset the current position on the screen.
 */
clrscr(pp)
register PLAYER	*pp;
{
	sendcom(pp, CLEAR);
	pp->p_cury = 0;
	pp->p_curx = 0;
}

/*
 * ce:
 *	Clear to the end of the line
 */
ce(pp)
PLAYER	*pp;
{
	sendcom(pp, CLRTOEOL);
}

/*
 * ref;
 *	Refresh the screen
 */
ref(pp)
register PLAYER	*pp;
{
	sendcom(pp, REFRESH);
}

/*
 * sendcom:
 *	Send a command to the given user
 */
/* VARARGS2 */
sendcom(pp, command, arg1, arg2)
register PLAYER		*pp;
register int	command;
int			arg1, arg2;
{
	(void) putc(command, pp->p_output);
	switch (command & 0377) {
	  case MOVE:
		(void) putc(arg1, pp->p_output);
		(void) putc(arg2, pp->p_output);
		break;
	  case ADDCH:
	  case READY:
		(void) putc(arg1, pp->p_output);
		break;
	}
}