Home | History | Annotate | Line # | Download | only in huntd
hunt.h revision 1.19
      1 /*	$NetBSD: hunt.h,v 1.19 2009/08/12 07:42:11 dholland Exp $	*/
      2 
      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 "bsd.h"
     35 
     36 #include <stdio.h>
     37 #include <string.h>
     38 
     39 #ifdef LOG
     40 #include <syslog.h>
     41 #endif
     42 
     43 #include <sys/ioctl.h>
     44 #include <sys/types.h>
     45 #include <sys/uio.h>
     46 #include <sys/poll.h>
     47 
     48 #ifdef INTERNET
     49 #include <netinet/in.h>
     50 #include <netdb.h>
     51 #include <arpa/inet.h>
     52 #include <net/if.h>
     53 #else
     54 #include <sys/un.h>
     55 #endif
     56 
     57 #ifdef INTERNET
     58 #define SOCK_FAMILY	AF_INET
     59 #else
     60 #define SOCK_FAMILY	AF_UNIX
     61 #define AF_UNIX_HACK			/* 4.2 hack; leaves files around */
     62 #endif
     63 
     64 /*
     65  * Preprocessor define dependencies
     66  */
     67 #if defined(VOLCANO) && !defined(OOZE)
     68 #define OOZE
     69 #endif
     70 #if defined(BOOTS) && !defined(FLY)
     71 #define FLY
     72 #endif
     73 #if !defined(REFLECT) && !defined(RANDOM)
     74 #define RANDOM
     75 #endif
     76 
     77 /* decrement version number for each change in startup protocol */
     78 #define HUNT_VERSION		-1
     79 
     80 #define ADDCH		('a' | 0200)
     81 #define MOVE		('m' | 0200)
     82 #define REFRESH		('r' | 0200)
     83 #define CLRTOEOL	('c' | 0200)
     84 #define ENDWIN		('e' | 0200)
     85 #define CLEAR		('C' | 0200)
     86 #define REDRAW		('R' | 0200)
     87 #define LAST_PLAYER	('l' | 0200)
     88 #define BELL		('b' | 0200)
     89 #define READY		('g' | 0200)
     90 
     91 /*
     92  * Choose MAXPL and MAXMON carefully.  The screen is assumed to be
     93  * 23 lines high and will only tolerate (MAXPL == 17 && MAXMON == 0)
     94  * or (MAXPL + MAXMON <= 16).
     95  */
     96 #ifdef MONITOR
     97 #define MAXPL		15
     98 #define MAXMON		1
     99 #else
    100 #define MAXPL		17
    101 #define MAXMON		0
    102 #endif
    103 #define SHORTLEN	2		/* sizeof (network short) */
    104 #define LONGLEN		4		/* sizeof (network long) */
    105 #define NAMELEN		20
    106 #define MSGLEN		SCREEN_WIDTH
    107 #define DECAY		50.0
    108 
    109 #define NASCII		128
    110 
    111 #define WIDTH		51
    112 #define WIDTH2		64	/* Next power of 2 >= WIDTH (for fast access) */
    113 #define HEIGHT		23
    114 #define UBOUND		1
    115 #define DBOUND		(HEIGHT - 1)
    116 #define LBOUND		1
    117 #define RBOUND		(WIDTH - 1)
    118 
    119 #define SCREEN_HEIGHT	24
    120 #define SCREEN_WIDTH	80
    121 #define SCREEN_WIDTH2	128	/* Next power of 2 >= SCREEN_WIDTH */
    122 
    123 #define STAT_LABEL_COL	60
    124 #define STAT_VALUE_COL	74
    125 #define STAT_NAME_COL	61
    126 #define STAT_SCAN_COL	(STAT_NAME_COL + 5)
    127 #define STAT_AMMO_ROW	0
    128 #define STAT_GUN_ROW	1
    129 #define STAT_DAM_ROW	2
    130 #define STAT_KILL_ROW	3
    131 #define STAT_PLAY_ROW	5
    132 #ifdef MONITOR
    133 #define STAT_MON_ROW	(STAT_PLAY_ROW + MAXPL + 1)
    134 #endif
    135 #define STAT_NAME_LEN	18
    136 
    137 #define DOOR		'#'
    138 #define WALL1		'-'
    139 #define WALL2		'|'
    140 #define WALL3		'+'
    141 #ifdef REFLECT
    142 #define WALL4		'/'
    143 #define WALL5		'\\'
    144 #endif
    145 #define KNIFE		'K'
    146 #define SHOT		':'
    147 #define GRENADE		'o'
    148 #define SATCHEL		'O'
    149 #define BOMB		'@'
    150 #define MINE		';'
    151 #define GMINE		'g'
    152 #ifdef OOZE
    153 #define SLIME		'$'
    154 #endif
    155 #ifdef VOLCANO
    156 #define LAVA		'~'
    157 #endif
    158 #ifdef DRONE
    159 #define DSHOT		'?'
    160 #endif
    161 #ifdef FLY
    162 #define FALL		'F'
    163 #endif
    164 #ifdef BOOTS
    165 #define NBOOTS		2
    166 #define BOOT		'b'
    167 #define BOOT_PAIR	'B'
    168 #endif
    169 #define SPACE		' '
    170 
    171 #define ABOVE		'i'
    172 #define BELOW		'!'
    173 #define RIGHT		'}'
    174 #define LEFTS		'{'
    175 #ifdef FLY
    176 #define FLYER		'&'
    177 #define isplayer(c)	(c == LEFTS || c == RIGHT ||\
    178 			 c == ABOVE || c == BELOW || c == FLYER)
    179 #else
    180 #define	isplayer(c)	(c == LEFTS || c == RIGHT ||\
    181 			 c == ABOVE || c == BELOW)
    182 #endif
    183 
    184 #define NORTH	01
    185 #define SOUTH	02
    186 #define EAST	010
    187 #define WEST	020
    188 
    189 #ifndef TRUE
    190 #define TRUE	1
    191 #define FALSE	0
    192 #endif
    193 
    194 #undef CTRL
    195 #define CTRL(x) ((x) & 037)
    196 
    197 #define BULSPD		5		/* bullets movement speed */
    198 #define ISHOTS		15
    199 #define NSHOTS		5
    200 #define MAXNCSHOT	2
    201 #define MAXDAM		10
    202 #define MINDAM		5
    203 #define STABDAM		2
    204 
    205 #define BULREQ		1
    206 #define GRENREQ		9
    207 #define SATREQ		25
    208 #define BOMB7REQ	49
    209 #define BOMB9REQ	81
    210 #define BOMB11REQ	121
    211 #define BOMB13REQ	169
    212 #define BOMB15REQ	225
    213 #define BOMB17REQ	289
    214 #define BOMB19REQ	361
    215 #define BOMB21REQ	441
    216 #define MAXBOMB		11
    217 #ifdef DRONE
    218 #define MINDSHOT	2	/* At least a satchel bomb */
    219 #endif
    220 extern int shot_req[];
    221 extern int shot_type[];
    222 #ifdef OOZE
    223 #define SLIME_FACTOR	3
    224 #define SLIMEREQ	5
    225 #define SSLIMEREQ	10
    226 #define SLIME2REQ	15
    227 #define SLIME3REQ	20
    228 #define MAXSLIME	4
    229 #define SLIMESPEED	5
    230 extern int slime_req[];
    231 #endif
    232 #ifdef VOLCANO
    233 #define LAVASPEED	1
    234 #endif
    235 
    236 #define CLOAKLEN	20
    237 #define SCANLEN		(Nplayer * 20)
    238 #define EXPLEN		4
    239 
    240 #define Q_QUIT		0
    241 #define Q_CLOAK		1
    242 #define Q_FLY		2
    243 #define Q_SCAN		3
    244 #define Q_MESSAGE	4
    245 
    246 #define C_PLAYER	0
    247 #define C_MONITOR	1
    248 #define C_MESSAGE	2
    249 #define C_SCORES	3
    250 
    251 #ifdef MONITOR
    252 #define C_TESTMSG()	(Query_driver ? C_MESSAGE :\
    253 			(Show_scores ? C_SCORES :\
    254 			(Am_monitor ? C_MONITOR :\
    255 			C_PLAYER)))
    256 #else
    257 #define	C_TESTMSG()	(Show_scores ? C_SCORES :\
    258 			(Query_driver ? C_MESSAGE :\
    259 			C_PLAYER))
    260 #endif
    261 
    262 #ifdef FLY
    263 #define _scan_char(pp)	(((pp)->p_scan < 0) ? ' ' : '*')
    264 #define _cloak_char(pp)	(((pp)->p_cloak < 0) ? _scan_char(pp) : '+')
    265 #define stat_char(pp)	(((pp)->p_flying < 0) ? _cloak_char(pp) : FLYER)
    266 #else
    267 #define _scan_char(pp)	(((pp)->p_scan < 0) ? ' ' : '*')
    268 #define stat_char(pp)	(((pp)->p_cloak < 0) ? _scan_char(pp) : '+')
    269 #endif
    270 
    271 typedef int			FLAG;
    272 typedef struct bullet_def	BULLET;
    273 typedef struct expl_def		EXPL;
    274 typedef struct player_def	PLAYER;
    275 typedef struct ident_def	IDENT;
    276 typedef struct regen_def	REGEN;
    277 #ifdef INTERNET
    278 typedef struct sockaddr_in	SOCKET;
    279 #else
    280 typedef struct sockaddr_un	SOCKET;
    281 #endif
    282 
    283 struct ident_def {
    284 	char i_name[NAMELEN];
    285 	char i_team;
    286 	uint32_t i_machine;
    287 	uint32_t i_uid;
    288 	float i_kills;
    289 	int i_entries;
    290 	float i_score;
    291 	int i_absorbed;
    292 	int i_faced;
    293 	int i_shot;
    294 	int i_robbed;
    295 	int i_slime;
    296 	int i_missed;
    297 	int i_ducked;
    298 	int i_gkills, i_bkills, i_deaths, i_stillb, i_saved;
    299 	IDENT *i_next;
    300 };
    301 
    302 struct player_def {
    303 	IDENT *p_ident;
    304 	char p_over;
    305 	int p_face;
    306 	int p_undershot;
    307 #ifdef FLY
    308 	int p_flying;
    309 	int p_flyx, p_flyy;
    310 #endif
    311 #ifdef BOOTS
    312 	int p_nboots;
    313 #endif
    314 	FILE *p_output;
    315 	int p_fd;
    316 	int p_mask;
    317 	int p_damage;
    318 	int p_damcap;
    319 	int p_ammo;
    320 	int p_ncshot;
    321 	int p_scan;
    322 	int p_cloak;
    323 	int p_x, p_y;
    324 	int p_ncount;
    325 	int p_nexec;
    326 	long p_nchar;
    327 	char p_death[MSGLEN];
    328 	char p_maze[HEIGHT][WIDTH2];
    329 	int p_curx, p_cury;
    330 	int p_lastx, p_lasty;
    331 	char p_cbuf[BUFSIZ];
    332 };
    333 
    334 struct bullet_def {
    335 	int b_x, b_y;
    336 	int b_face;
    337 	int b_charge;
    338 	char b_type;
    339 	char b_size;
    340 	char b_over;
    341 	PLAYER *b_owner;
    342 	IDENT *b_score;
    343 	FLAG b_expl;
    344 	BULLET *b_next;
    345 };
    346 
    347 struct expl_def {
    348 	int e_x, e_y;
    349 	char e_char;
    350 	EXPL *e_next;
    351 };
    352 
    353 struct regen_def {
    354 	int r_x, r_y;
    355 	REGEN *r_next;
    356 };
    357 
    358 /*
    359  * external variables
    360  */
    361 
    362 extern FLAG Last_player;
    363 
    364 extern char Buf[BUFSIZ], Maze[HEIGHT][WIDTH2], Orig_maze[HEIGHT][WIDTH2];
    365 
    366 extern const char *Driver;
    367 
    368 extern int Nplayer, Socket, Status;
    369 extern struct pollfd fdset[];
    370 
    371 #ifdef INTERNET
    372 extern u_short Test_port;
    373 #else
    374 extern char *Sock_name, *Stat_name;
    375 #endif
    376 
    377 #ifdef VOLCANO
    378 extern int volcano;
    379 #endif
    380 
    381 extern int See_over[NASCII];
    382 
    383 extern BULLET *Bullets;
    384 
    385 extern EXPL *Expl[EXPLEN];
    386 extern EXPL *Last_expl;
    387 
    388 extern IDENT *Scores;
    389 
    390 extern PLAYER Player[MAXPL], *End_player;
    391 #ifdef BOOTS
    392 extern PLAYER Boot[NBOOTS];
    393 #endif
    394 
    395 #ifdef MONITOR
    396 extern FLAG Am_monitor;
    397 extern PLAYER Monitor[MAXMON], *End_monitor;
    398 #endif
    399 
    400 #ifdef INTERNET
    401 extern char *Send_message;
    402 #endif
    403 
    404 extern char map_key[256];
    405 extern FLAG no_beep;
    406 
    407 /*
    408  * function types
    409  */
    410 
    411 void add_shot(int, int, int, char, int, PLAYER *, int, char);
    412 int answer(void);
    413 void bad_con(void) __dead;
    414 void bad_ver(void) __dead;
    415 void ce(PLAYER *);
    416 void cgoto(PLAYER *, int, int);
    417 void check(PLAYER *, int, int);
    418 void checkdam(PLAYER *, PLAYER *, IDENT *, int, char);
    419 void clearwalls(void);
    420 void clear_eol(void);
    421 void clear_the_screen(void);
    422 void clrscr(PLAYER *);
    423 BULLET *create_shot(int, int, int, char, int, int, PLAYER *,
    424 		    IDENT *, int, char);
    425 void do_connect(char *, char, long);
    426 void do_message(void);
    427 void drawmaze(PLAYER *);
    428 void drawplayer(PLAYER *, FLAG);
    429 void execute(PLAYER *);
    430 void faketalk(void);
    431 void fixshots(int, int, char);
    432 void get_local_name(char *);
    433 int get_remote_name(char *);
    434 BULLET *is_bullet(int, int);
    435 void look(PLAYER *);
    436 void makemaze(void);
    437 void message(PLAYER *, const char *);
    438 void mon_execute(PLAYER *);
    439 void moveshots(void);
    440 void open_ctl(void);
    441 int opposite(int, char);
    442 void otto(int, int, char);
    443 void outch(PLAYER *, int);
    444 void outstr(PLAYER *, const char *, int);
    445 PLAYER *play_at(int, int);
    446 void playit(void);
    447 void put_ch(char);
    448 void put_str(char *);
    449 int quit(int);
    450 int rand_dir(void);
    451 int rand_num(int);
    452 void rollexpl(void);
    453 void sendcom(PLAYER *, int, ...);
    454 void showexpl(int, int, char);
    455 void showstat(PLAYER *);
    456 void cleanup(int) __dead;
    457 void intr(int);
    458 void tstp(int);
    459