Home | History | Annotate | Line # | Download | only in warp
      1 /* Header: warp.h,v 7.0.1.2 86/12/12 17:08:42 lwall Exp */
      2 
      3 /* Log:	warp.h,v
      4  * Revision 7.0.1.2  86/12/12  17:08:42  lwall
      5  * Baseline for net release.
      6  *
      7  * Revision 7.0.1.1  86/10/16  10:54:26  lwall
      8  * Added Damage.  Fixed random bugs.
      9  *
     10  * Revision 7.0  86/10/08  15:17:55  lwall
     11  * Split into separate files.  Added amoebas and pirates.
     12  *
     13  */
     14 
     15 #ifndef WARP_H
     16 #define WARP_H
     17 
     18 #include "config.h"	/* generated by Configure script */
     19 
     20 #include <sys/types.h>
     21 #include <sys/stat.h>
     22 #include <sys/param.h>
     23 #include <sys/ioctl.h>
     24 
     25 #include <term.h>
     26 #include <math.h>
     27 #include <stdio.h>
     28 #include <signal.h>
     29 #include <fcntl.h>
     30 #include <ctype.h>
     31 #include <errno.h>
     32 #include <stdbool.h>
     33 #include <stdlib.h>
     34 #include <string.h>
     35 #include <unistd.h>
     36 
     37 /* WARPLIB must be readable and writeable by warp, but not by anyone who you
     38  * don't trust.  In other words, to set up warp so everyone can play and
     39  * no one can cheat, give warp a uid of its own and make warp setuid to
     40  * that uid.  WARPLIB must then NOT be made writeable by the world,
     41  * since no attempt is made to encrypt saved games or anything.
     42  * (It must be readable by the world, however, due to a strangeness in
     43  * access.)
     44  */
     45 
     46 #define SAVEDIR "/var/games/warp"
     47 #define NEWSFILE "warp.news"
     48 #define HELPFILE "warp.doc"
     49 #define LOCKFILE ".warp.lock"
     50 #define LOGFILE "warp.log"
     51 #define SCOREBOARD "warp.top"
     52 #define LSCOREBOARD "warp.lowtop"
     53 #define FSCOREBOARD "warp.funtop"
     54 #define TMPSCOREBOARD "warp.topnew"
     55 #define WARPMACRO "%X/Kbmap.%{TERM}"
     56 
     57 /* warp library */
     58 #ifndef WARPLIB		/* ~ and %l only ("~%l" is permissible) */
     59 #   ifdef PRIVLIB
     60 #	define WARPLIB PRIVLIB
     61 #   else
     62 #	define WARPLIB "/usr/games/warp"
     63 #   endif
     64 #endif
     65 
     66 EXT char *warplib;
     67 
     68 #define PERMMAPS 8	/* how many starmaps are permanent */
     69 #define MAPS 20		/* how many starmaps to choose from */
     70 			/* (MAPS - PERMMAPS is # of half-gone universes) */
     71 
     72 /*
     73  * Screen size info, minimum screen size is 23x40 (actually 24x80).
     74  * YSIZE and XSIZE should be relatively prime so that a torpedo launched
     75  * at an angle will eventually cover the whole screen.
     76  * To calculate a new position for something:
     77  * new_position = (current_position + delta + ?SIZE00) % ?SIZE
     78  * This allows for negative deltas of up to ?SIZE00 (% doesn't work right
     79  * on negative numbers).
     80  * ?SIZE01, etc. are fudges for efficiency--they already include a delta.
     81  */
     82 
     83 #define XYSIZE 920
     84 #define XYSIZEx4 3680
     85 
     86 #define YSIZE   23
     87 #define YSIZE00 2300
     88 #define YSIZE01 2301
     89 #define YSIZE99 2299
     90 
     91 #define XSIZE   40
     92 #define XSIZE00 4000
     93 #define XSIZE01 4001
     94 #define XSIZE99 3999
     95 #define XSIZE02 4002
     96 #define XSIZE98 3998
     97 #define XSIZE03 4003
     98 #define XSIZE97 3997
     99 #define XSIZE08 4008
    100 #define XSIZE92 3992
    101 
    102 EXT char amb[YSIZE][XSIZE];
    103 
    104 #ifdef WHOAMI
    105 #    include <whoami.h>
    106 #endif
    107 
    108 #ifndef isalnum
    109 #   define isalnum(c) (isalpha(c) || isdigit(c))
    110 #endif
    111 
    112 #ifdef TERMIO
    113 #   include <termio.h>
    114 #elif defined TERMIOS
    115 #   include <termios.h>
    116 #else
    117 #   include <sgtty.h>
    118 #endif
    119 
    120 #include <sys/timeb.h>
    121 
    122 #   include <pwd.h>
    123 
    124 #define BITSPERBYTE 8
    125 #define LBUFLEN 512	/* line buffer length */
    126 
    127 #ifdef pdp11
    128 #   define CBUFLEN 256	/* command buffer length */
    129 #   define PUSHSIZE 128
    130 #else
    131 #   define CBUFLEN 512	/* command buffer length */
    132 #   define PUSHSIZE 256
    133 #endif
    134 #ifdef pdp11
    135 #   define MAXFILENAME 128
    136 #else
    137 #   define MAXFILENAME 512
    138 #endif
    139 #define FINISHCMD 0177
    140 
    141 /* some handy defs */
    142 
    143 #define Ctl(ch) (ch & 037)
    144 
    145 #define strNE(s1,s2) (strcmp(s1,s2))
    146 #define strEQ(s1,s2) (!strcmp(s1,s2))
    147 #define strnNE(s1,s2,l) (strncmp(s1,s2,l))
    148 #define strnEQ(s1,s2,l) (!strncmp(s1,s2,l))
    149 
    150 #define sgn(x) ((x) < 0 ? -1 : (x) > 0)
    151 
    152 /* Things we can figure out ourselves */
    153 
    154 #ifdef SIGPROF
    155 #   define BSD42		/* do we have Berkeley 4.2? */
    156 #endif
    157 
    158 #ifdef FIONREAD
    159 #   define PENDING
    160 #else
    161 #   ifdef O_NDELAY
    162 #	define PENDING
    163 #   else
    164 #	ifdef RDCHK
    165 #	    define PENDING
    166 #	endif
    167 #   endif
    168 #endif
    169 
    170 #define UNLINK(victim) unlink(victim)
    171 
    172 /* Valid substitutions for strings marked with % comment are:
    173  *	%H	Host name (yours)
    174  *	%L	Login name (yours)
    175  *	%N	Full name (yours)
    176  *	%O	Original working directory (where you ran warp from)
    177  *	%X	Warp library directory
    178  *	%~	Home directory
    179  *	%.	Directory containing . files
    180  *	%$	current process number
    181  *	%{name} Environment variable "name".  %{name-default} form allowed.
    182  *	%"prompt"
    183  *		Print prompt and insert what is typed.
    184  *	%`command`
    185  *		Insert output of command.
    186  *	%(test_text=pattern?if_text:else_text)
    187  *		Substitute if_text if test_text matches pattern, otherwise
    188  *		substitute else_text.  Use != for negated match.
    189  *		% substitutions are done on test_text, if_text, and else_text.
    190  *		(Note: %() only works if CONDSUB defined.)
    191  */
    192 
    193 /* *** System Dependent Stuff *** */
    194 
    195 /* NOTE: many of these are defined in the config.h file */
    196 
    197 #ifndef ROOTID
    198 #   define ROOTID 0        /* uid of superuser */
    199 #endif
    200 
    201 #   define sigset signal
    202 #   define sigignore(sig) signal(sig,SIG_IGN)
    203 
    204 #ifndef LOGDIRFIELD
    205 #   define LOGDIRFIELD 6		/* Which field (origin 1) is the */
    206 					/* login directory in /etc/passwd? */
    207 					/* (If it is not kept in passwd, */
    208 					/* but getpwnam() returns it, */
    209 					/* define the symbol GETPWENT) */
    210 #endif
    211 #ifndef GCOSFIELD
    212 #   define GCOSFIELD 5
    213 #endif
    214 
    215 /* Undefine any of the following features to save both I and D space */
    216 /* In general, earlier ones are easier to get along without */
    217 /* Pdp11's without split I and D may have to undefine them all */
    218 #define DEBUGGING	/* include debugging code */
    219 #define PUSHBACK	/* macros and keymaps using pushback buffer */
    220 #define CONDSUB		/* allow %(cond?text:text) */
    221 #define BACKTICK	/* allow %`command` */
    222 #define PROMPTTTY	/* allow %"prompt" */
    223 #define GETLOGIN	/* use getlogin() routine as backup to environment */
    224 			/* variables USER or LOGNAME */
    225 #define TILDENAME	/* allow ~logname expansion */
    226 #define GETWD		/* use our getwd() instead of piped in pwd */
    227 #define SETUIDGID	/* substitute eaccess() for access() so that rn */
    228 			/* can run setuid or setgid */
    229 			/* if not setuid or setgid, you don't need it */
    230 #define VERBOSE		/* compile in more informative messages */
    231 #define TERSE		/* compile in shorter messages */
    232 
    233 /* some dependencies among options */
    234 
    235 #ifndef SETUIDGID
    236 #   define eaccess access
    237 #endif
    238 
    239 #ifdef VERBOSE
    240 #   ifdef TERSE
    241 #	define IF(c) if (c)
    242 #	define ELSE else
    243 #   else /* !TERSE */
    244 #	define IF(c)
    245 #	define ELSE
    246 #   endif
    247 #else /* !VERBOSE */
    248 #   ifndef TERSE
    249 #	define TERSE
    250 #   endif
    251 #   define IF(c) "IF" outside of VERBOSE???
    252 #   define ELSE "ELSE" outside of VERBOSE???
    253 #endif
    254 
    255 #ifdef DEBUGGING
    256 #   define assert(ex) {if (!(ex)){fprintf(stderr,"Assertion failed: file %s, line %d\r\n", __FILE__, __LINE__);sig_catcher(0);}}
    257 #else
    258 #   define assert(ex) ;
    259 #endif
    260 
    261 #define TCSIZE 512	/* capacity for termcap strings */
    262 
    263 /* End of Space Conservation Section */
    264 
    265 /* More System Dependencies */
    266 
    267 /* preferred shell for use in doshell routine */
    268 /*  ksh or sh would be okay here */
    269 #ifndef PREFSHELL
    270 #   define PREFSHELL "/bin/csh"
    271 #endif
    272 
    273 /* path to fastest starting shell */
    274 #ifndef SH
    275 #   define SH "/bin/sh"
    276 #endif
    277 
    278 /* location of macro file */
    279 #ifndef WARPMACRO
    280 #   ifdef PUSHBACK
    281 #	define WARPMACRO "%./.warpmac"
    282 #   endif
    283 #endif
    284 
    285 /* location of full name */
    286 #ifndef FULLNAMEFILE
    287 #   ifndef PASSNAMES
    288 #	define FULLNAMEFILE "%./.fullname"
    289 #   endif
    290 #endif
    291 
    292 /* a motd-like file for warp */
    293 #ifndef WARPNEWSNAME		/* % and ~ */
    294 #   define WARPNEWSNAME "%X/warp.news"
    295 #endif
    296 
    297 /* typedefs */
    298 
    299 /* *** end of the machine dependent stuff *** */
    300 
    301 /* GLOBAL THINGS */
    302 
    303 /* file statistics area */
    304 
    305 EXT struct stat filestat;
    306 
    307 /* various things of type char */
    308 
    309 EXT char buf[LBUFLEN+1];	/* general purpose line buffer */
    310 
    311 EXT char *cwd INIT(NULL);		/* current working directory */
    312 
    313 /* switches */
    314 
    315 #ifdef DEBUGGING
    316     EXT int debug INIT(0);				/* -D */
    317 #   define DEB_FILEXP 64
    318 #endif
    319 
    320 #ifdef VERBOSE
    321 #   ifdef TERSE
    322 	EXT bool verbose INIT(true);			/* +t */
    323 #   endif
    324 #endif
    325 
    326 /* miscellania */
    327 
    328 EXT FILE *tmpfp INIT(NULL);	/* scratch fp */
    329 
    330 #define NOMARKING 0
    331 #define STANDOUT 1
    332 #define UNDERLINE 2
    333 
    334 /* Factored strings */
    335 
    336 EXT char nullstr[] INIT("");
    337 EXT char readerr[] INIT("warp read error");
    338 EXT char cantopen[] INIT("Can't open %s\r\n");
    339 
    340 #ifdef VERBOSE
    341 #define NOCD "Can't chdir to directory %s\r\n"
    342 #else
    343 #define NOCD "Can't find %s\r\n"
    344 #endif
    345 
    346 EXT bool justonemoretime INIT(true);
    347 EXT bool keepgoing INIT(true);
    348 
    349 EXT bool friendspec INIT(false);
    350 EXT bool piratespec INIT(false);
    351 EXT bool amoebaspec INIT(false);
    352 EXT bool starspec INIT(false);
    353 EXT bool klingspec INIT(false);
    354 EXT bool apolspec INIT(false);
    355 EXT bool crushspec INIT(false);
    356 EXT bool romspec INIT(false);
    357 EXT bool prespec INIT(false);
    358 EXT bool tholspec INIT(false);
    359 EXT bool gornspec INIT(false);
    360 EXT bool beginner INIT(false);
    361 EXT bool massacre INIT(false);
    362 EXT bool lowspeed INIT(false);
    363 EXT bool debugging INIT(false);
    364 EXT bool didkill INIT(false);
    365 EXT bool experimenting INIT(false);
    366 EXT bool scorespec INIT(false);
    367 EXT bool metakey INIT(false);
    368 
    369 EXT bool bombed_out;
    370 EXT int panic INIT(0);
    371 EXT bool madgorns;
    372 
    373 EXT int madfriends;
    374 
    375 EXT int inumpirates;
    376 EXT int numpirates;
    377 EXT int inumfriends;
    378 EXT int numfriends;
    379 EXT int inumamoebas;
    380 EXT int numamoebas;
    381 EXT int inumstars;
    382 EXT int numstars;
    383 EXT int inumenemies;
    384 EXT int numenemies;
    385 EXT int inumroms;
    386 EXT int inumthols;
    387 EXT int inumapollos;
    388 EXT int numapollos;
    389 EXT int apolloflag;
    390 EXT int inumcrushes;
    391 EXT int numcrushes;
    392 EXT int inumgorns;
    393 EXT int numgorns;
    394 EXT int deados;
    395 EXT int deadmudds;
    396 EXT int smarts;
    397 EXT int ismarts INIT(0);
    398 EXT int numos INIT(0);
    399 EXT int numxes INIT(0);
    400 EXT int ient;
    401 EXT int numents;
    402 EXT int ibase;
    403 EXT int numbases;
    404 EXT int inuminhab;
    405 EXT int numinhab;
    406 EXT int wave;
    407 EXT int cumsmarts;
    408 EXT int prescene INIT(-1);
    409 EXT int scandist;
    410 EXT int antibase;
    411 EXT int sm35;
    412 EXT int sm45;
    413 EXT int sm50;
    414 EXT int sm55;
    415 EXT int sm80;
    416 EXT int sm95;
    417 EXT int entmax;
    418 EXT int basemax;
    419 EXT int enemshields;
    420 EXT int super;
    421 EXT int whenok;
    422 EXT int yamblast;
    423 EXT int xamblast;
    424 EXT int ambsize;
    425 
    426 EXT char spbuf[1024];
    427 
    428 #endif
    429