hunt.h revision 1.15 1 1.15 dholland /* $NetBSD: hunt.h,v 1.15 2009/07/04 04:29:54 dholland Exp $ */
2 1.3 perry
3 1.1 mrg /*
4 1.8 wiz * Copyright (c) 1983-2003, Regents of the University of California.
5 1.8 wiz * All rights reserved.
6 1.8 wiz *
7 1.8 wiz * Redistribution and use in source and binary forms, with or without
8 1.8 wiz * modification, are permitted provided that the following conditions are
9 1.8 wiz * met:
10 1.8 wiz *
11 1.8 wiz * + Redistributions of source code must retain the above copyright
12 1.8 wiz * notice, this list of conditions and the following disclaimer.
13 1.8 wiz * + Redistributions in binary form must reproduce the above copyright
14 1.8 wiz * notice, this list of conditions and the following disclaimer in the
15 1.8 wiz * documentation and/or other materials provided with the distribution.
16 1.8 wiz * + Neither the name of the University of California, San Francisco nor
17 1.8 wiz * the names of its contributors may be used to endorse or promote
18 1.8 wiz * products derived from this software without specific prior written
19 1.8 wiz * permission.
20 1.8 wiz *
21 1.8 wiz * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
22 1.8 wiz * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23 1.8 wiz * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
24 1.8 wiz * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 1.8 wiz * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 1.8 wiz * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 1.8 wiz * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 1.8 wiz * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 1.8 wiz * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 1.8 wiz * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 1.8 wiz * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 1.1 mrg */
33 1.1 mrg
34 1.15 dholland #include "bsd.h"
35 1.1 mrg
36 1.15 dholland #include <stdio.h>
37 1.15 dholland #include <string.h>
38 1.15 dholland
39 1.15 dholland #ifdef LOG
40 1.15 dholland #include <syslog.h>
41 1.15 dholland #endif
42 1.15 dholland
43 1.15 dholland #if !defined(TERMINFO) && BSD_RELEASE < 44
44 1.15 dholland #include <sgtty.h>
45 1.15 dholland #else
46 1.15 dholland #include <sys/ioctl.h>
47 1.15 dholland #endif
48 1.15 dholland
49 1.15 dholland #include <sys/types.h>
50 1.15 dholland #include <sys/uio.h>
51 1.15 dholland #include <sys/poll.h>
52 1.15 dholland
53 1.15 dholland #ifdef INTERNET
54 1.15 dholland #include <netinet/in.h>
55 1.15 dholland #include <netdb.h>
56 1.15 dholland #include <arpa/inet.h>
57 1.15 dholland #ifdef BROADCAST
58 1.15 dholland #include <net/if.h>
59 1.15 dholland #endif
60 1.15 dholland #else
61 1.15 dholland #include <sys/un.h>
62 1.15 dholland #endif
63 1.15 dholland
64 1.15 dholland #ifdef INTERNET
65 1.15 dholland #define SOCK_FAMILY AF_INET
66 1.15 dholland #else
67 1.15 dholland #define SOCK_FAMILY AF_UNIX
68 1.15 dholland #define AF_UNIX_HACK /* 4.2 hack; leaves files around */
69 1.15 dholland #endif
70 1.1 mrg
71 1.1 mrg /*
72 1.1 mrg * Preprocessor define dependencies
73 1.1 mrg */
74 1.15 dholland #if defined(VOLCANO) && !defined(OOZE)
75 1.15 dholland #define OOZE
76 1.15 dholland #endif
77 1.15 dholland #if defined(BOOTS) && !defined(FLY)
78 1.15 dholland #define FLY
79 1.15 dholland #endif
80 1.15 dholland #if !defined(REFLECT) && !defined(RANDOM)
81 1.15 dholland #define RANDOM
82 1.15 dholland #endif
83 1.15 dholland #ifdef TERMINFO
84 1.1 mrg /* mvcur() in terminfo needs the curses library to be initialized to not
85 1.1 mrg * coredump, so give up and use it. */
86 1.15 dholland #define USE_CURSES
87 1.15 dholland #endif
88 1.1 mrg
89 1.1 mrg /* decrement version number for each change in startup protocol */
90 1.15 dholland #define HUNT_VERSION -1
91 1.1 mrg
92 1.15 dholland #define ADDCH ('a' | 0200)
93 1.15 dholland #define MOVE ('m' | 0200)
94 1.15 dholland #define REFRESH ('r' | 0200)
95 1.15 dholland #define CLRTOEOL ('c' | 0200)
96 1.15 dholland #define ENDWIN ('e' | 0200)
97 1.15 dholland #define CLEAR ('C' | 0200)
98 1.15 dholland #define REDRAW ('R' | 0200)
99 1.15 dholland #define LAST_PLAYER ('l' | 0200)
100 1.15 dholland #define BELL ('b' | 0200)
101 1.15 dholland #define READY ('g' | 0200)
102 1.1 mrg
103 1.1 mrg /*
104 1.1 mrg * Choose MAXPL and MAXMON carefully. The screen is assumed to be
105 1.1 mrg * 23 lines high and will only tolerate (MAXPL == 17 && MAXMON == 0)
106 1.1 mrg * or (MAXPL + MAXMON <= 16).
107 1.1 mrg */
108 1.15 dholland #ifdef MONITOR
109 1.15 dholland #define MAXPL 15
110 1.15 dholland #define MAXMON 1
111 1.15 dholland #else
112 1.15 dholland #define MAXPL 17
113 1.15 dholland #define MAXMON 0
114 1.15 dholland #endif
115 1.15 dholland #define SHORTLEN 2 /* sizeof (network short) */
116 1.15 dholland #define LONGLEN 4 /* sizeof (network long) */
117 1.15 dholland #define NAMELEN 20
118 1.15 dholland #define MSGLEN SCREEN_WIDTH
119 1.15 dholland #define DECAY 50.0
120 1.15 dholland
121 1.15 dholland #define NASCII 128
122 1.15 dholland
123 1.15 dholland #define WIDTH 51
124 1.15 dholland #define WIDTH2 64 /* Next power of 2 >= WIDTH (for fast access) */
125 1.15 dholland #define HEIGHT 23
126 1.15 dholland #define UBOUND 1
127 1.15 dholland #define DBOUND (HEIGHT - 1)
128 1.15 dholland #define LBOUND 1
129 1.15 dholland #define RBOUND (WIDTH - 1)
130 1.15 dholland
131 1.15 dholland #define SCREEN_HEIGHT 24
132 1.15 dholland #define SCREEN_WIDTH 80
133 1.15 dholland #define SCREEN_WIDTH2 128 /* Next power of 2 >= SCREEN_WIDTH */
134 1.15 dholland
135 1.15 dholland #define STAT_LABEL_COL 60
136 1.15 dholland #define STAT_VALUE_COL 74
137 1.15 dholland #define STAT_NAME_COL 61
138 1.15 dholland #define STAT_SCAN_COL (STAT_NAME_COL + 5)
139 1.15 dholland #define STAT_AMMO_ROW 0
140 1.15 dholland #define STAT_GUN_ROW 1
141 1.15 dholland #define STAT_DAM_ROW 2
142 1.15 dholland #define STAT_KILL_ROW 3
143 1.15 dholland #define STAT_PLAY_ROW 5
144 1.15 dholland #ifdef MONITOR
145 1.15 dholland #define STAT_MON_ROW (STAT_PLAY_ROW + MAXPL + 1)
146 1.15 dholland #endif
147 1.15 dholland #define STAT_NAME_LEN 18
148 1.15 dholland
149 1.15 dholland #define DOOR '#'
150 1.15 dholland #define WALL1 '-'
151 1.15 dholland #define WALL2 '|'
152 1.15 dholland #define WALL3 '+'
153 1.15 dholland #ifdef REFLECT
154 1.15 dholland #define WALL4 '/'
155 1.15 dholland #define WALL5 '\\'
156 1.15 dholland #endif
157 1.15 dholland #define KNIFE 'K'
158 1.15 dholland #define SHOT ':'
159 1.15 dholland #define GRENADE 'o'
160 1.15 dholland #define SATCHEL 'O'
161 1.15 dholland #define BOMB '@'
162 1.15 dholland #define MINE ';'
163 1.15 dholland #define GMINE 'g'
164 1.15 dholland #ifdef OOZE
165 1.15 dholland #define SLIME '$'
166 1.15 dholland #endif
167 1.15 dholland #ifdef VOLCANO
168 1.15 dholland #define LAVA '~'
169 1.15 dholland #endif
170 1.15 dholland #ifdef DRONE
171 1.15 dholland #define DSHOT '?'
172 1.15 dholland #endif
173 1.15 dholland #ifdef FLY
174 1.15 dholland #define FALL 'F'
175 1.15 dholland #endif
176 1.15 dholland #ifdef BOOTS
177 1.15 dholland #define NBOOTS 2
178 1.15 dholland #define BOOT 'b'
179 1.15 dholland #define BOOT_PAIR 'B'
180 1.15 dholland #endif
181 1.15 dholland #define SPACE ' '
182 1.15 dholland
183 1.15 dholland #define ABOVE 'i'
184 1.15 dholland #define BELOW '!'
185 1.15 dholland #define RIGHT '}'
186 1.15 dholland #define LEFTS '{'
187 1.15 dholland #ifdef FLY
188 1.15 dholland #define FLYER '&'
189 1.15 dholland #define isplayer(c) (c == LEFTS || c == RIGHT ||\
190 1.15 dholland c == ABOVE || c == BELOW || c == FLYER)
191 1.15 dholland #else
192 1.15 dholland #define isplayer(c) (c == LEFTS || c == RIGHT ||\
193 1.15 dholland c == ABOVE || c == BELOW)
194 1.15 dholland #endif
195 1.15 dholland
196 1.15 dholland #define NORTH 01
197 1.15 dholland #define SOUTH 02
198 1.15 dholland #define EAST 010
199 1.15 dholland #define WEST 020
200 1.15 dholland
201 1.15 dholland #ifndef TRUE
202 1.15 dholland #define TRUE 1
203 1.15 dholland #define FALSE 0
204 1.15 dholland #endif
205 1.15 dholland
206 1.15 dholland #undef CTRL
207 1.15 dholland #define CTRL(x) ((x) & 037)
208 1.15 dholland
209 1.15 dholland #define BULSPD 5 /* bullets movement speed */
210 1.15 dholland #define ISHOTS 15
211 1.15 dholland #define NSHOTS 5
212 1.15 dholland #define MAXNCSHOT 2
213 1.15 dholland #define MAXDAM 10
214 1.15 dholland #define MINDAM 5
215 1.15 dholland #define STABDAM 2
216 1.15 dholland
217 1.15 dholland #define BULREQ 1
218 1.15 dholland #define GRENREQ 9
219 1.15 dholland #define SATREQ 25
220 1.15 dholland #define BOMB7REQ 49
221 1.15 dholland #define BOMB9REQ 81
222 1.15 dholland #define BOMB11REQ 121
223 1.15 dholland #define BOMB13REQ 169
224 1.15 dholland #define BOMB15REQ 225
225 1.15 dholland #define BOMB17REQ 289
226 1.15 dholland #define BOMB19REQ 361
227 1.15 dholland #define BOMB21REQ 441
228 1.15 dholland #define MAXBOMB 11
229 1.15 dholland #ifdef DRONE
230 1.15 dholland #define MINDSHOT 2 /* At least a satchel bomb */
231 1.15 dholland #endif
232 1.15 dholland extern int shot_req[];
233 1.15 dholland extern int shot_type[];
234 1.15 dholland #ifdef OOZE
235 1.15 dholland #define SLIME_FACTOR 3
236 1.15 dholland #define SLIMEREQ 5
237 1.15 dholland #define SSLIMEREQ 10
238 1.15 dholland #define SLIME2REQ 15
239 1.15 dholland #define SLIME3REQ 20
240 1.15 dholland #define MAXSLIME 4
241 1.15 dholland #define SLIMESPEED 5
242 1.15 dholland extern int slime_req[];
243 1.15 dholland #endif
244 1.15 dholland #ifdef VOLCANO
245 1.15 dholland #define LAVASPEED 1
246 1.15 dholland #endif
247 1.15 dholland
248 1.15 dholland #define CLOAKLEN 20
249 1.15 dholland #define SCANLEN (Nplayer * 20)
250 1.15 dholland #define EXPLEN 4
251 1.15 dholland
252 1.15 dholland #define Q_QUIT 0
253 1.15 dholland #define Q_CLOAK 1
254 1.15 dholland #define Q_FLY 2
255 1.15 dholland #define Q_SCAN 3
256 1.15 dholland #define Q_MESSAGE 4
257 1.15 dholland
258 1.15 dholland #define C_PLAYER 0
259 1.15 dholland #define C_MONITOR 1
260 1.15 dholland #define C_MESSAGE 2
261 1.15 dholland #define C_SCORES 3
262 1.15 dholland
263 1.15 dholland #ifdef MONITOR
264 1.15 dholland #define C_TESTMSG() (Query_driver ? C_MESSAGE :\
265 1.15 dholland (Show_scores ? C_SCORES :\
266 1.15 dholland (Am_monitor ? C_MONITOR :\
267 1.15 dholland C_PLAYER)))
268 1.15 dholland #else
269 1.15 dholland #define C_TESTMSG() (Show_scores ? C_SCORES :\
270 1.15 dholland (Query_driver ? C_MESSAGE :\
271 1.15 dholland C_PLAYER))
272 1.15 dholland #endif
273 1.15 dholland
274 1.15 dholland #ifdef FLY
275 1.15 dholland #define _scan_char(pp) (((pp)->p_scan < 0) ? ' ' : '*')
276 1.15 dholland #define _cloak_char(pp) (((pp)->p_cloak < 0) ? _scan_char(pp) : '+')
277 1.15 dholland #define stat_char(pp) (((pp)->p_flying < 0) ? _cloak_char(pp) : FLYER)
278 1.15 dholland #else
279 1.15 dholland #define _scan_char(pp) (((pp)->p_scan < 0) ? ' ' : '*')
280 1.15 dholland #define stat_char(pp) (((pp)->p_cloak < 0) ? _scan_char(pp) : '+')
281 1.15 dholland #endif
282 1.1 mrg
283 1.1 mrg typedef int FLAG;
284 1.1 mrg typedef struct bullet_def BULLET;
285 1.1 mrg typedef struct expl_def EXPL;
286 1.1 mrg typedef struct player_def PLAYER;
287 1.1 mrg typedef struct ident_def IDENT;
288 1.1 mrg typedef struct regen_def REGEN;
289 1.15 dholland #ifdef INTERNET
290 1.1 mrg typedef struct sockaddr_in SOCKET;
291 1.15 dholland #else
292 1.1 mrg typedef struct sockaddr_un SOCKET;
293 1.15 dholland #endif
294 1.1 mrg
295 1.1 mrg struct ident_def {
296 1.15 dholland char i_name[NAMELEN];
297 1.15 dholland char i_team;
298 1.12 dholland uint32_t i_machine;
299 1.12 dholland uint32_t i_uid;
300 1.15 dholland float i_kills;
301 1.15 dholland int i_entries;
302 1.15 dholland float i_score;
303 1.15 dholland int i_absorbed;
304 1.15 dholland int i_faced;
305 1.15 dholland int i_shot;
306 1.15 dholland int i_robbed;
307 1.15 dholland int i_slime;
308 1.15 dholland int i_missed;
309 1.15 dholland int i_ducked;
310 1.15 dholland int i_gkills, i_bkills, i_deaths, i_stillb, i_saved;
311 1.15 dholland IDENT *i_next;
312 1.1 mrg };
313 1.1 mrg
314 1.1 mrg struct player_def {
315 1.15 dholland IDENT *p_ident;
316 1.15 dholland char p_over;
317 1.15 dholland int p_face;
318 1.15 dholland int p_undershot;
319 1.15 dholland #ifdef FLY
320 1.15 dholland int p_flying;
321 1.15 dholland int p_flyx, p_flyy;
322 1.15 dholland #endif
323 1.15 dholland #ifdef BOOTS
324 1.15 dholland int p_nboots;
325 1.15 dholland #endif
326 1.15 dholland FILE *p_output;
327 1.15 dholland int p_fd;
328 1.15 dholland int p_mask;
329 1.15 dholland int p_damage;
330 1.15 dholland int p_damcap;
331 1.15 dholland int p_ammo;
332 1.15 dholland int p_ncshot;
333 1.15 dholland int p_scan;
334 1.15 dholland int p_cloak;
335 1.15 dholland int p_x, p_y;
336 1.15 dholland int p_ncount;
337 1.15 dholland int p_nexec;
338 1.15 dholland long p_nchar;
339 1.15 dholland char p_death[MSGLEN];
340 1.15 dholland char p_maze[HEIGHT][WIDTH2];
341 1.15 dholland int p_curx, p_cury;
342 1.15 dholland int p_lastx, p_lasty;
343 1.15 dholland char p_cbuf[BUFSIZ];
344 1.1 mrg };
345 1.1 mrg
346 1.1 mrg struct bullet_def {
347 1.15 dholland int b_x, b_y;
348 1.15 dholland int b_face;
349 1.15 dholland int b_charge;
350 1.15 dholland char b_type;
351 1.15 dholland char b_size;
352 1.15 dholland char b_over;
353 1.15 dholland PLAYER *b_owner;
354 1.15 dholland IDENT *b_score;
355 1.15 dholland FLAG b_expl;
356 1.15 dholland BULLET *b_next;
357 1.1 mrg };
358 1.1 mrg
359 1.1 mrg struct expl_def {
360 1.15 dholland int e_x, e_y;
361 1.15 dholland char e_char;
362 1.15 dholland EXPL *e_next;
363 1.1 mrg };
364 1.1 mrg
365 1.1 mrg struct regen_def {
366 1.15 dholland int r_x, r_y;
367 1.15 dholland REGEN *r_next;
368 1.1 mrg };
369 1.1 mrg
370 1.1 mrg /*
371 1.1 mrg * external variables
372 1.1 mrg */
373 1.1 mrg
374 1.15 dholland extern FLAG Last_player;
375 1.1 mrg
376 1.15 dholland extern char Buf[BUFSIZ], Maze[HEIGHT][WIDTH2], Orig_maze[HEIGHT][WIDTH2];
377 1.1 mrg
378 1.12 dholland extern const char *Driver;
379 1.1 mrg
380 1.15 dholland extern int Nplayer, Socket, Status;
381 1.15 dholland extern struct pollfd fdset[];
382 1.1 mrg
383 1.15 dholland #ifdef INTERNET
384 1.15 dholland extern u_short Test_port;
385 1.15 dholland #else
386 1.15 dholland extern char *Sock_name, *Stat_name;
387 1.15 dholland #endif
388 1.1 mrg
389 1.15 dholland #ifdef VOLCANO
390 1.15 dholland extern int volcano;
391 1.15 dholland #endif
392 1.1 mrg
393 1.15 dholland extern int See_over[NASCII];
394 1.1 mrg
395 1.15 dholland extern BULLET *Bullets;
396 1.1 mrg
397 1.15 dholland extern EXPL *Expl[EXPLEN];
398 1.15 dholland extern EXPL *Last_expl;
399 1.1 mrg
400 1.15 dholland extern IDENT *Scores;
401 1.1 mrg
402 1.15 dholland extern PLAYER Player[MAXPL], *End_player;
403 1.15 dholland #ifdef BOOTS
404 1.15 dholland extern PLAYER Boot[NBOOTS];
405 1.15 dholland #endif
406 1.1 mrg
407 1.15 dholland #ifdef MONITOR
408 1.15 dholland extern FLAG Am_monitor;
409 1.15 dholland extern PLAYER Monitor[MAXMON], *End_monitor;
410 1.15 dholland #endif
411 1.1 mrg
412 1.15 dholland #ifdef INTERNET
413 1.15 dholland extern char *Send_message;
414 1.15 dholland #endif
415 1.1 mrg
416 1.15 dholland extern char map_key[256];
417 1.15 dholland extern FLAG no_beep;
418 1.1 mrg
419 1.1 mrg /*
420 1.1 mrg * function types
421 1.1 mrg */
422 1.1 mrg
423 1.15 dholland void add_shot(int, int, int, char, int, PLAYER *, int, char);
424 1.15 dholland int answer(void);
425 1.15 dholland void bad_con(void) __dead;
426 1.15 dholland void bad_ver(void) __dead;
427 1.15 dholland int broadcast_vec(int, struct sockaddr **);
428 1.15 dholland void ce(PLAYER *);
429 1.15 dholland void cgoto(PLAYER *, int, int);
430 1.15 dholland void check(PLAYER *, int, int);
431 1.15 dholland void checkdam(PLAYER *, PLAYER *, IDENT *, int, char);
432 1.15 dholland void clearwalls(void);
433 1.15 dholland void clear_eol(void);
434 1.15 dholland void clear_the_screen(void);
435 1.15 dholland void clrscr(PLAYER *);
436 1.15 dholland BULLET *create_shot(int, int, int, char, int, int, PLAYER *,
437 1.10 jsm IDENT *, int, char);
438 1.15 dholland void do_connect(char *, char, long);
439 1.15 dholland void do_message(void);
440 1.15 dholland void drawmaze(PLAYER *);
441 1.15 dholland void drawplayer(PLAYER *, FLAG);
442 1.15 dholland void drawstatus(PLAYER *);
443 1.15 dholland void execute(PLAYER *);
444 1.15 dholland void faketalk(void);
445 1.15 dholland void find_driver(FLAG);
446 1.15 dholland void fixshots(int, int, char);
447 1.15 dholland IDENT *get_ident(uint32_t, uint32_t, char *, char);
448 1.15 dholland void get_local_name(char *);
449 1.15 dholland int get_remote_name(char *);
450 1.15 dholland BULLET *is_bullet(int, int);
451 1.15 dholland void look(PLAYER *);
452 1.15 dholland void makemaze(void);
453 1.15 dholland void message(PLAYER *, const char *);
454 1.15 dholland void mon_execute(PLAYER *);
455 1.15 dholland void moveshots(void);
456 1.15 dholland void open_ctl(void);
457 1.15 dholland int opposite(int, char);
458 1.15 dholland void otto(int, int, char);
459 1.15 dholland void outch(PLAYER *, int);
460 1.15 dholland void outstr(PLAYER *, const char *, int);
461 1.15 dholland int player_sym(PLAYER *, int, int);
462 1.15 dholland PLAYER *play_at(int, int);
463 1.15 dholland void playit(void);
464 1.15 dholland void put_ch(char);
465 1.15 dholland void put_str(char *);
466 1.15 dholland int quit(int);
467 1.15 dholland int rand_dir(void);
468 1.15 dholland int rand_num(int);
469 1.15 dholland void redraw_screen(void);
470 1.15 dholland void rmnl(char *);
471 1.15 dholland void rollexpl(void);
472 1.15 dholland void see(PLAYER *, int);
473 1.15 dholland void sendcom(PLAYER *, int, ...);
474 1.15 dholland void showexpl(int, int, char);
475 1.15 dholland void showstat(PLAYER *);
476 1.15 dholland void start_driver(void);
477 1.15 dholland void stmonitor(PLAYER *);
478 1.15 dholland void stplayer(PLAYER *, int);
479 1.15 dholland char translate(char);
480 1.15 dholland SIGNAL_TYPE cleanup(int) __dead;
481 1.15 dholland SIGNAL_TYPE intr(int);
482 1.15 dholland SIGNAL_TYPE sigalrm(int);
483 1.15 dholland SIGNAL_TYPE sigemt(int) __dead;
484 1.15 dholland SIGNAL_TYPE sigterm(int) __dead;
485 1.15 dholland SIGNAL_TYPE sigusr1(int) __dead;
486 1.15 dholland SIGNAL_TYPE tstp(int);
487