NetBSD/games/hunt/huntd/hunt.h

482 lines
11 KiB
C

/* $NetBSD: hunt.h,v 1.12 2008/01/28 03:23:29 dholland Exp $ */
/*
* Copyright (c) 1983-2003, Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* + Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* + Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* + Neither the name of the University of California, San Francisco nor
* the names of its contributors may be used to endorse or promote
* products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
# include "bsd.h"
# include <stdio.h>
# include <string.h>
# ifdef LOG
# include <syslog.h>
# endif
# if !defined(TERMINFO) && BSD_RELEASE < 44
# include <sgtty.h>
# else
# include <sys/ioctl.h>
# endif
# include <sys/types.h>
# include <sys/uio.h>
# include <sys/poll.h>
# ifdef INTERNET
# include <netinet/in.h>
# include <netdb.h>
# include <arpa/inet.h>
# ifdef BROADCAST
# include <net/if.h>
# endif
# else
# include <sys/un.h>
# endif
# ifdef INTERNET
# define SOCK_FAMILY AF_INET
# else
# define SOCK_FAMILY AF_UNIX
# define AF_UNIX_HACK /* 4.2 hack; leaves files around */
# endif
/*
* Preprocessor define dependencies
*/
# if defined(VOLCANO) && !defined(OOZE)
# define OOZE
# endif
# if defined(BOOTS) && !defined(FLY)
# define FLY
# endif
# if !defined(REFLECT) && !defined(RANDOM)
# define RANDOM
# endif
# ifdef TERMINFO
/* mvcur() in terminfo needs the curses library to be initialized to not
* coredump, so give up and use it. */
# define USE_CURSES
# endif
/* decrement version number for each change in startup protocol */
# define HUNT_VERSION -1
# 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 == 17 && MAXMON == 0)
* or (MAXPL + MAXMON <= 16).
*/
# ifdef MONITOR
# define MAXPL 15
# define MAXMON 1
# else
# define MAXPL 17
# define MAXMON 0
# endif
# define SHORTLEN 2 /* sizeof (network short) */
# define LONGLEN 4 /* sizeof (network long) */
# define NAMELEN 20
# define MSGLEN SCREEN_WIDTH
# define DECAY 50.0
# define NASCII 128
# define WIDTH 51
# define WIDTH2 64 /* Next power of 2 >= WIDTH (for fast access) */
# define HEIGHT 23
# define UBOUND 1
# define DBOUND (HEIGHT - 1)
# define LBOUND 1
# define RBOUND (WIDTH - 1)
# define SCREEN_HEIGHT 24
# define SCREEN_WIDTH 80
# define SCREEN_WIDTH2 128 /* Next power of 2 >= SCREEN_WIDTH */
# 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_AMMO_ROW 0
# define STAT_GUN_ROW 1
# define STAT_DAM_ROW 2
# define STAT_KILL_ROW 3
# define STAT_PLAY_ROW 5
# ifdef MONITOR
# define STAT_MON_ROW (STAT_PLAY_ROW + MAXPL + 1)
# endif
# define STAT_NAME_LEN 18
# define DOOR '#'
# define WALL1 '-'
# define WALL2 '|'
# define WALL3 '+'
# ifdef REFLECT
# define WALL4 '/'
# define WALL5 '\\'
# endif
# define KNIFE 'K'
# define SHOT ':'
# define GRENADE 'o'
# define SATCHEL 'O'
# define BOMB '@'
# define MINE ';'
# define GMINE 'g'
# ifdef OOZE
# define SLIME '$'
# endif
# ifdef VOLCANO
# define LAVA '~'
# endif
# ifdef DRONE
# define DSHOT '?'
# endif
# ifdef FLY
# define FALL 'F'
# endif
# ifdef BOOTS
# define NBOOTS 2
# define BOOT 'b'
# define BOOT_PAIR 'B'
# endif
# define SPACE ' '
# define ABOVE 'i'
# define BELOW '!'
# define RIGHT '}'
# define LEFTS '{'
# ifdef FLY
# define FLYER '&'
# define isplayer(c) (c == LEFTS || c == RIGHT ||\
c == ABOVE || c == BELOW || c == FLYER)
# else
# define isplayer(c) (c == LEFTS || c == RIGHT ||\
c == ABOVE || c == BELOW)
# endif
# define NORTH 01
# define SOUTH 02
# define EAST 010
# define WEST 020
# ifndef TRUE
# define TRUE 1
# define FALSE 0
# endif
# undef CTRL
# define CTRL(x) ((x) & 037)
# 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 BOMB7REQ 49
# define BOMB9REQ 81
# define BOMB11REQ 121
# define BOMB13REQ 169
# define BOMB15REQ 225
# define BOMB17REQ 289
# define BOMB19REQ 361
# define BOMB21REQ 441
# define MAXBOMB 11
# ifdef DRONE
# define MINDSHOT 2 /* At least a satchel bomb */
# endif
extern int shot_req[];
extern int shot_type[];
# ifdef OOZE
# define SLIME_FACTOR 3
# define SLIMEREQ 5
# define SSLIMEREQ 10
# define SLIME2REQ 15
# define SLIME3REQ 20
# define MAXSLIME 4
# define SLIMESPEED 5
extern int slime_req[];
# endif
# ifdef VOLCANO
# define LAVASPEED 1
# endif
# define CLOAKLEN 20
# define SCANLEN (Nplayer * 20)
# define EXPLEN 4
# define Q_QUIT 0
# define Q_CLOAK 1
# define Q_FLY 2
# define Q_SCAN 3
# define Q_MESSAGE 4
# define C_PLAYER 0
# define C_MONITOR 1
# define C_MESSAGE 2
# define C_SCORES 3
# ifdef MONITOR
# define C_TESTMSG() (Query_driver ? C_MESSAGE :\
(Show_scores ? C_SCORES :\
(Am_monitor ? C_MONITOR :\
C_PLAYER)))
# else
# define C_TESTMSG() (Show_scores ? C_SCORES :\
(Query_driver ? C_MESSAGE :\
C_PLAYER))
# endif
# ifdef FLY
# define _scan_char(pp) (((pp)->p_scan < 0) ? ' ' : '*')
# define _cloak_char(pp) (((pp)->p_cloak < 0) ? _scan_char(pp) : '+')
# define stat_char(pp) (((pp)->p_flying < 0) ? _cloak_char(pp) : FLYER)
# else
# define _scan_char(pp) (((pp)->p_scan < 0) ? ' ' : '*')
# define stat_char(pp) (((pp)->p_cloak < 0) ? _scan_char(pp) : '+')
# endif
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
typedef struct sockaddr_un SOCKET;
# endif
struct ident_def {
char i_name[NAMELEN];
char i_team;
uint32_t i_machine;
uint32_t i_uid;
float i_kills;
int i_entries;
float i_score;
int i_absorbed;
int i_faced;
int i_shot;
int i_robbed;
int i_slime;
int i_missed;
int i_ducked;
int i_gkills, i_bkills, i_deaths, i_stillb, i_saved;
IDENT *i_next;
};
struct player_def {
IDENT *p_ident;
char p_over;
int p_face;
int p_undershot;
# ifdef FLY
int p_flying;
int p_flyx, p_flyy;
# endif
# ifdef BOOTS
int p_nboots;
# endif
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;
char p_cbuf[BUFSIZ];
};
struct bullet_def {
int b_x, b_y;
int b_face;
int b_charge;
char b_type;
char b_size;
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 const char *Driver;
extern int Nplayer, Socket, Status;
extern struct pollfd fdset[];
# ifdef INTERNET
extern u_short Test_port;
# else
extern char *Sock_name, *Stat_name;
# endif
# ifdef VOLCANO
extern int volcano;
# endif
extern int See_over[NASCII];
extern BULLET *Bullets;
extern EXPL *Expl[EXPLEN];
extern EXPL *Last_expl;
extern IDENT *Scores;
extern PLAYER Player[MAXPL], *End_player;
# ifdef BOOTS
extern PLAYER Boot[NBOOTS];
# endif
# ifdef MONITOR
extern FLAG Am_monitor;
extern PLAYER Monitor[MAXMON], *End_monitor;
# endif
# ifdef INTERNET
extern char *Send_message;
# endif
extern char map_key[256];
extern FLAG no_beep;
/*
* function types
*/
void add_shot(int, int, int, char, int, PLAYER *, int, char);
int answer(void);
void bad_con(void) __attribute__((__noreturn__));
void bad_ver(void) __attribute__((__noreturn__));
int broadcast_vec(int, struct sockaddr **);
void ce(PLAYER *);
void cgoto(PLAYER *, int, int);
void check(PLAYER *, int, int);
void checkdam(PLAYER *, PLAYER *, IDENT *, int, char);
void clearwalls(void);
void clear_eol(void);
void clear_the_screen(void);
void clrscr(PLAYER *);
BULLET *create_shot(int, int, int, char, int, int, PLAYER *,
IDENT *, int, char);
void do_connect(char *, char, long);
void do_message(void);
void drawmaze(PLAYER *);
void drawplayer(PLAYER *, FLAG);
void drawstatus(PLAYER *);
void execute(PLAYER *);
void faketalk(void);
void find_driver(FLAG);
void fixshots(int, int, char);
IDENT *get_ident(uint32_t, uint32_t, char *, char);
void get_local_name(char *);
int get_remote_name(char *);
BULLET *is_bullet(int, int);
void look(PLAYER *);
void makemaze(void);
void message(PLAYER *, const char *);
void mon_execute(PLAYER *);
void moveshots(void);
void open_ctl(void);
int opposite(int, char);
void otto(int, int, char);
void outch(PLAYER *, int);
void outstr(PLAYER *, const char *, int);
int player_sym(PLAYER *, int, int);
PLAYER *play_at(int, int);
void playit(void);
void put_ch(char);
void put_str(char *);
int quit(int);
int rand_dir(void);
int rand_num(int);
void redraw_screen(void);
void rmnl(char *);
void rollexpl(void);
void see(PLAYER *, int);
void sendcom(PLAYER *, int, ...);
void showexpl(int, int, char);
void showstat(PLAYER *);
void start_driver(void);
void stmonitor(PLAYER *);
void stplayer(PLAYER *, int);
char translate(char);
SIGNAL_TYPE cleanup(int) __attribute__((__noreturn__));
SIGNAL_TYPE intr(int);
SIGNAL_TYPE sigalrm(int);
SIGNAL_TYPE sigemt(int) __attribute__((__noreturn__));
SIGNAL_TYPE sigterm(int) __attribute__((__noreturn__));
SIGNAL_TYPE sigusr1(int) __attribute__((__noreturn__));
SIGNAL_TYPE tstp(int);