/*
 *  Hunt
 *  Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold
 *  San Francisco, California
 *
 *  Copyright (c) 1985 Regents of the University of California.
 *  All rights reserved.  The Berkeley software License Agreement
 *  specifies the terms and conditions for redistribution.
 */

# include	<stdio.h>
# ifndef OLDIPC
# include	<sgtty.h>
# include	<sys/types.h>
# include	<sys/uio.h>
# else OLDIPC
# include	<sys/localopts.h>
# include	<sys/types.h>
# include	<sys/netltoshort.h>
# endif OLDIPC
# include	<sys/socket.h>
# ifdef	INTERNET
# include	<netinet/in.h>
# include	<netdb.h>
# ifndef OLDIPC
# include	<arpa/inet.h>
# endif !OLDIPC
# ifdef BROADCAST
# include	<net/if.h>
# endif BROADCAST
# else	INTERNET
# include	<sys/un.h>
# endif	INTERNET

# ifdef	INTERNET
# define	SOCK_FAMILY	AF_INET
# else	INTERNET
# define	SOCK_FAMILY	AF_UNIX
# define	AF_UNIX_HACK		/* 4.2 hack; leaves files around */
# endif	INTERNET

# define	ADDCH		('a' | 0200)
# define	MOVE		('m' | 0200)
# define	REFRESH		('r' | 0200)
# define	CLRTOEOL	('c' | 0200)
# define	ENDWIN		('e' | 0200)
# define	CLEAR		('C' | 0200)
# define	REDRAW		('R' | 0200)
# define	LAST_PLAYER	('l' | 0200)
# define	BELL		('b' | 0200)
# define	READY		('g' | 0200)

/*
 * Choose MAXPL and MAXMON carefully.  The screen is assumed to be
 * 23 lines high and will only tolerate (MAXPL == 12 && MAXMON == 0)
 * or (MAXPL + MAXMON <= 10).
 */
# define	MAXPL		9
# ifdef MONITOR
# define	MAXMON		1
# endif MONITOR
# define	NAMELEN		20
# define	MSGLEN		80
# define	DECAY		50.0

# define	NASCII		128

# ifndef REFLECT
# ifndef RANDOM
# define RANDOM
# endif RANDOM
# endif REFLECT

# define	WIDTH	59
# define	WIDTH2	64	/* Next power of 2 >= WIDTH (for fast access) */
# define	HEIGHT	23
# define	UBOUND	1
# define	DBOUND	22
# define	LBOUND	1
# define	RBOUND	(WIDTH - 1)

# define	STAT_LABEL_COL	60
# define	STAT_VALUE_COL	74
# define	STAT_NAME_COL	61
# define	STAT_SCAN_COL	(STAT_NAME_COL + 5)
# define	STAT_NAME_ROW	0
# define	STAT_AMMO_ROW	2
# define	STAT_SCAN_ROW	3
# define	STAT_CLOAK_ROW	4
# define	STAT_GUN_ROW	5
# define	STAT_DAM_ROW	7
# define	STAT_KILL_ROW	8
# define	STAT_PLAY_ROW	10
# ifdef MONITOR
# define	STAT_MON_ROW	(STAT_PLAY_ROW + MAXPL + 1)
# endif MONITOR
# define	STAT_NAME_LEN	16

# define	DOOR	'#'
# define	WALL1	'-'
# define	WALL2	'|'
# define	WALL3	'+'
# ifdef REFLECT
# define	WALL4	'/'
# define	WALL5	'\\'
# endif REFLECT
# define	KNIFE	'K'
# define	SHOT	':'
# define	GRENADE	'o'
# define	SATCHEL	'O'
# define	BOMB	'@'
# define	MINE	';'
# define	GMINE	'g'
# ifdef	OOZE
# define	SLIME	'$'
# endif	OOZE
# ifdef	VOLCANO
# define	LAVA	'~'
# endif	VOLCANO
# ifdef FLY
# define	FALL	'F'
# endif FLY
# define	SPACE	' '

# define	ABOVE	'i'
# define	BELOW	'!'
# define	RIGHT	'}'
# define	LEFTS	'{'
# ifdef FLY
# define	FLYER	'&'
# endif FLY

# define	NORTH	01
# define	SOUTH	02
# define	EAST	010
# define	WEST	020

# ifndef TRUE
# define	TRUE	1
# define	FALSE	0
# endif TRUE
# ifndef CTRL
# define	CTRL(x)	('x' & 037)
# endif CTRL

# define	BULSPD		5		/* bullets movement speed */
# define	ISHOTS		15
# define	NSHOTS		5
# define	MAXNCSHOT	2
# define	MAXDAM		10
# define	MINDAM		5
# define	STABDAM		2

# define	BULREQ		1
# define	GRENREQ		9
# define	SATREQ		25
# define	BOMBREQ		49
# ifdef	OOZE
# define	SLIMEREQ	15
# define	SSLIMEREQ	30
# define	SLIMESPEED	5
# endif	OOZE
# ifdef	VOLCANO
# define	LAVASPEED	2
# endif VOLCANO

# define	CLOAKLEN	20
# define	SCANLEN		(Nplayer * 20)
# define	EXPLEN		4

# ifdef FLY
# define	_cloak_char(pp)	(((pp)->p_cloak < 0) ? ' ' : '+')
# define	_scan_char(pp)	(((pp)->p_scan < 0) ? _cloak_char(pp) : '*')
# define	stat_char(pp)	(((pp)->p_flying < 0) ? _scan_char(pp) : FLYER)
# else FLY
# define	_cloak_char(pp)	(((pp)->p_cloak < 0) ? ' ' : '+')
# define	stat_char(pp)	(((pp)->p_scan < 0) ? _cloak_char(pp) : '*')
# endif FLY

typedef int			FLAG;
typedef struct bullet_def	BULLET;
typedef struct expl_def		EXPL;
typedef struct player_def	PLAYER;
typedef struct ident_def	IDENT;
typedef struct regen_def	REGEN;
# ifdef	INTERNET
typedef struct sockaddr_in	SOCKET;
# else	INTERNET
typedef struct sockaddr_un	SOCKET;
# endif	INTERNET
typedef struct sgttyb		TTYB;

struct ident_def {
	char	i_name[NAMELEN];
	long	i_machine;
	long	i_uid;
	int	i_kills;
	int	i_entries;
	float	i_score;
	IDENT	*i_next;
};

struct player_def {
	IDENT	*p_ident;
	int	p_face;
	char	p_over;
	int	p_undershot;
# ifdef	FLY
	int	p_flying;
	int	p_flyx, p_flyy;
# endif FLY
	FILE	*p_output;
	int	p_fd;
	int	p_mask;
	int	p_damage;
	int	p_damcap;
	int	p_ammo;
	int	p_ncshot;
	int	p_scan;
	int	p_cloak;
	int	p_x, p_y;
	int	p_ncount;
	int	p_nexec;
	long	p_nchar;
	char	p_death[MSGLEN];
	char	p_maze[HEIGHT][WIDTH2];
	int	p_curx, p_cury;
	int	p_lastx, p_lasty;
	int	p_changed;
	char	p_cbuf[BUFSIZ];
};

struct bullet_def {
	int	b_x, b_y;
	int	b_face;
	int	b_charge;
	char	b_type;
	char	b_over;
	PLAYER	*b_owner;
	IDENT	*b_score;
	FLAG	b_expl;
	BULLET	*b_next;
};

struct expl_def {
	int	e_x, e_y;
	char	e_char;
	EXPL	*e_next;
};

struct regen_def {
	int	r_x, r_y;
	REGEN	*r_next;
};

/*
 * external variables
 */

extern FLAG	Last_player;

extern char	Buf[BUFSIZ], Maze[HEIGHT][WIDTH2], Orig_maze[HEIGHT][WIDTH2];

extern char	*Sock_name, *Driver;

extern int	errno, Have_inp, Nplayer, Num_fds, Socket;
extern long	Fds_mask, Sock_mask;

# ifdef INTERNET
extern int	Test_port;
extern int	Sock_port;
# else INTERNET
extern char	*Sock_name;
# endif INTERNET

# ifdef VOLCANO
extern int	volcano;
# endif	VOLCANO

extern int	See_over[NASCII];

extern BULLET	*Bullets;

extern EXPL	*Expl[EXPLEN];

extern IDENT	*Scores;

extern PLAYER	Player[MAXPL], *End_player;

# ifdef MONITOR
extern FLAG	Am_monitor;
extern PLAYER	Monitor[MAXMON], *End_monitor;
# endif MONITOR

/*
 * function types
 */

char	*getenv(), *malloc(), *sprintf(), *strcpy(), *strncpy();

IDENT	*get_ident();

int	moveshots();

BULLET	*is_bullet(), *create_shot();

PLAYER	*play_at();
