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