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