1/*	$OpenBSD: server.h,v 1.12 2017/01/21 08:22:57 krw Exp $	*/
2/*	$NetBSD: hunt.h,v 1.5 1998/09/13 15:27:28 hubertf Exp $	*/
3/*
4 * Copyright (c) 1983-2003, Regents of the University of California.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
9 * met:
10 *
11 * + Redistributions of source code must retain the above copyright
12 *   notice, this list of conditions and the following disclaimer.
13 * + Redistributions in binary form must reproduce the above copyright
14 *   notice, this list of conditions and the following disclaimer in the
15 *   documentation and/or other materials provided with the distribution.
16 * + Neither the name of the University of California, San Francisco nor
17 *   the names of its contributors may be used to endorse or promote
18 *   products derived from this software without specific prior written
19 *   permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
22 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
24 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34#include <sys/socket.h>
35
36#include <stdio.h>
37
38#ifndef __GNUC__
39#define __attribute__(x)
40#endif
41
42/*
43 * Choose MAXPL and MAXMON carefully.  The screen is assumed to be
44 * 23 lines high and will only tolerate (MAXPL == 17 && MAXMON == 0)
45 * or (MAXPL + MAXMON <= 16).
46 */
47#define MAXPL		14
48#define MAXMON		2
49#if (MAXPL + MAXMON > 16)
50#warning "MAXPL + MAXMON is excessive"
51#endif
52
53#define MSGLEN		SCREEN_WIDTH
54
55#define UBOUND		1
56#define DBOUND		(HEIGHT - 1)
57#define LBOUND		1
58#define RBOUND		(WIDTH - 1)
59
60#define NASCII		128
61
62/* Layout of the scoreboard: */
63#define STAT_LABEL_COL	60
64#define STAT_VALUE_COL	74
65#define STAT_NAME_COL	61
66#define STAT_SCAN_COL	(STAT_NAME_COL + 5)
67#define STAT_AMMO_ROW	0
68#define STAT_GUN_ROW	1
69#define STAT_DAM_ROW	2
70#define STAT_KILL_ROW	3
71#define STAT_PLAY_ROW	5
72#define STAT_MON_ROW	(STAT_PLAY_ROW + MAXPL + 1)
73#define STAT_NAME_LEN	18
74
75/* Number of boots: */
76#define NBOOTS		2
77
78/* Bitmask of directions */
79#define NORTH		01
80#define SOUTH		02
81#define EAST		010
82#define WEST		020
83
84# undef CTRL
85#define CTRL(x)	((x) & 037)
86
87#define BULREQ		1		/* 0 */
88#define GRENREQ		9		/* 1 */
89#define SATREQ		25		/* 2 */
90#define BOMB7REQ	49		/* 3 */
91#define BOMB9REQ	81		/* 4 */
92#define BOMB11REQ	121		/* 5 */
93#define BOMB13REQ	169		/* 6 */
94#define BOMB15REQ	225		/* 7 */
95#define BOMB17REQ	289		/* 8 */
96#define BOMB19REQ	361		/* 9 */
97#define BOMB21REQ	441		/* 10 */
98#define MAXBOMB				   11
99
100#define SLIMEREQ	5		/* 0 */
101#define SSLIMEREQ	10		/* 1 */
102#define SLIME2REQ	15		/* 2 */
103#define SLIME3REQ	20		/* 3 */
104#define MAXSLIME			   4
105
106#define EXPLEN		16
107
108#define _scan_char(pp)	(((pp)->p_scan < 0) ? ' ' : '*')
109#define _cloak_char(pp)	(((pp)->p_cloak < 0) ? _scan_char(pp) : '+')
110#define stat_char(pp)	(((pp)->p_flying < 0) ? _cloak_char(pp) : FLYER)
111
112typedef struct bullet_def	BULLET;
113typedef struct expl_def		EXPL;
114typedef struct player_def	PLAYER;
115typedef struct ident_def	IDENT;
116typedef struct regen_def	REGEN;
117
118#define	ALL_PLAYERS		((PLAYER *)1)
119
120struct ident_def {
121	char	i_name[NAMELEN];
122	char	i_team;
123	long	i_machine;
124	long	i_uid;
125	float	i_kills;
126	int	i_entries;
127	float	i_score;
128	int	i_absorbed;
129	int	i_faced;
130	int	i_shot;
131	int	i_robbed;
132	int	i_slime;
133	int	i_missed;
134	int	i_ducked;
135	int	i_gkills, i_bkills, i_deaths, i_stillb, i_saved;
136	IDENT	*i_next;
137};
138
139struct player_def {
140	IDENT	*p_ident;
141	char	p_over;
142	int	p_face;
143	int	p_undershot;
144	int	p_flying;
145	int	p_flyx, p_flyy;
146	int	p_nboots;
147	FILE	*p_output;
148	int	p_fd;
149	int	p_mask;
150	int	p_damage;
151	int	p_damcap;
152	int	p_ammo;
153	int	p_ncshot;
154	int	p_scan;
155	int	p_cloak;
156	int	p_x, p_y;
157	int	p_ncount;
158	int	p_nexec;
159	long	p_nchar;
160	char	p_death[MSGLEN];
161	char	p_maze[HEIGHT][WIDTH2];
162	int	p_curx, p_cury;
163	int	p_lastx, p_lasty;
164	char	p_cbuf[BUFSIZ];
165};
166
167struct bullet_def {
168	int	b_x, b_y;
169	int	b_face;
170	int	b_charge;
171	char	b_type;
172	char	b_size;
173	char	b_over;
174	PLAYER	*b_owner;
175	IDENT	*b_score;
176	FLAG	b_expl;
177	BULLET	*b_next;
178};
179
180struct expl_def {
181	int	e_x, e_y;
182	char	e_char;
183	EXPL	*e_next;
184};
185
186struct regen_def {
187	int	r_x, r_y;
188	REGEN	*r_next;
189};
190
191struct spawn {
192	int		fd;
193	int		reading_msg;
194	struct sockaddr source;
195	socklen_t	sourcelen;
196	u_int32_t	uid;
197	char		name[NAMELEN+1];
198	u_int8_t	team;
199	u_int32_t	enter_status;
200	char		ttyname[NAMELEN];
201	u_int32_t	mode;
202	char		msg[BUFSIZ];
203	int		msglen;
204	struct spawn *	next;
205	struct spawn **	prevnext;
206	int		inlen;
207	char		inbuf[ sizeof (u_int32_t) + NAMELEN +
208			       sizeof (u_int8_t) + sizeof (u_int32_t) +
209			       NAMELEN + sizeof (u_int32_t) ];
210};
211
212extern struct spawn *	Spawn;
213
214extern int	Socket;
215
216/* answer.c */
217void	answer_first(void);
218int	answer_next(struct spawn *);
219int	rand_dir(void);
220void	answer_info(FILE *);
221
222/* draw.c */
223void	drawmaze(PLAYER *);
224void	look(PLAYER *);
225void	check(PLAYER *, int, int);
226void	showstat(PLAYER *);
227void	drawplayer(PLAYER *, FLAG);
228void	message(PLAYER *, char *);
229
230/* driver.c */
231int	rand_num(int);
232void	checkdam(PLAYER *, PLAYER *, IDENT *, int, char);
233__dead void	cleanup(int);
234
235/* execute.c */
236void	mon_execute(PLAYER *);
237void	execute(PLAYER *);
238void	add_shot(int, int, int, char, int, PLAYER *, int, char);
239BULLET *create_shot(int, int, int, char, int, int, PLAYER *, IDENT *,
240	    int, char);
241void	ammo_update(PLAYER *);
242
243/* expl.c */
244void	showexpl(int, int, char);
245void	rollexpl(void);
246void	makemaze(void);
247void	clearwalls(void);
248int	can_rollexpl(void);
249
250/* makemaze.c */
251void	makemaze(void);
252
253/* shots.c */
254int	can_moveshots(void);
255void	moveshots(void);
256PLAYER *play_at(int, int);
257int	opposite(int, char);
258BULLET *is_bullet(int, int);
259void	fixshots(int, int, char);
260
261/* terminal.c */
262void	cgoto(PLAYER *, int, int);
263void	outch(PLAYER *, char);
264void	outstr(PLAYER *, char *, int);
265void	outyx(PLAYER *, int, int, const char *, ...)
266			__attribute__((format (printf, 4, 5)));
267void	clrscr(PLAYER *);
268void	ce(PLAYER *);
269void	sendcom(PLAYER *, int, ...);
270void	flush(PLAYER *);
271void	logit(int, const char *, ...)
272			__attribute__((format (printf, 2, 3)));
273void	logx(int, const char *, ...)
274			__attribute__((format (printf, 2, 3)));
275
276/* extern.c */
277extern FLAG	Am_monitor;
278extern char	Buf[BUFSIZ];
279extern char	Maze[HEIGHT][WIDTH2];
280extern char	Orig_maze[HEIGHT][WIDTH2];
281extern fd_set	Fds_mask;
282extern fd_set	Have_inp;
283extern int	Nplayer;
284extern int	Num_fds;
285extern int	Socket;
286extern int	Status;
287extern int	See_over[NASCII];
288extern BULLET *	Bullets;
289extern EXPL *	Expl[EXPLEN];
290extern EXPL *	Last_expl;
291extern PLAYER	Player[MAXPL];
292extern PLAYER *	End_player;
293extern PLAYER	Boot[NBOOTS];
294extern IDENT *	Scores;
295extern PLAYER	Monitor[MAXMON];
296extern PLAYER *	End_monitor;
297extern int	volcano;
298extern int	shot_req[MAXBOMB];
299extern int	shot_type[MAXBOMB];
300extern int	slime_req[MAXSLIME];
301