games@tekred.TEK.COM (06/29/88)
Submitted by: "Stanley T. Shebs" <shebs%defun@cs.utah.edu> Comp.sources.games: Volume 4, Issue 92 Archive-name: xconq5/Part04 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 4 (of 18)." # Contents: lib/1942.scn lib/standard.bdf period.c # Wrapped by billr@saab on Wed Jun 29 08:55:33 1988 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f lib/1942.scn -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"lib/1942.scn\" else echo shar: Extracting \"lib/1942.scn\" \(271 characters\) sed "s/^X//" >lib/1942.scn <<'END_OF_lib/1942.scn' XXconq 1 ----+- The world in 1942 (needs work!); XAxis should win by capturing London and Moscow, or by surviving Xsome number of turns. Allies win by capturing Rome, Berlin, and Tokyo. XRussia wins by surviving, as always... X. Xlib/earth1.map XSides 3 1 0 XAllies XAxis XRussia END_OF_lib/1942.scn if test 271 -ne `wc -c <lib/1942.scn`; then echo shar: \"lib/1942.scn\" unpacked with wrong size! fi # end of overwriting check fi if test -f lib/standard.bdf -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"lib/standard.bdf\" else echo shar: Extracting \"lib/standard.bdf\" \(20151 characters\) sed "s/^X//" >lib/standard.bdf <<'END_OF_lib/standard.bdf' XSTARTFONT 2.1 XCOMMENT The X10 name for this font was "/mit/games/lib/xconq5/standard.onx" XFONT /mit/games/lib/xconq5/standard.onx.bdf XSIZE 11 75 75 XFONTBOUNDINGBOX 16 16 0 0 XSTARTPROPERTIES 2 XFONT_DESCENT 5 XFONT_ASCENT 11 XENDPROPERTIES XCHARS 126 XSTARTCHAR C000 XENCODING 0 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP Xffff Xffff Xc003 Xc003 Xc003 Xc003 Xc003 Xc003 Xc003 Xc003 Xc003 Xc003 Xc003 Xc003 Xffff Xffff XENDCHAR XSTARTCHAR C001 XENCODING 1 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C002 XENCODING 2 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C003 XENCODING 3 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C004 XENCODING 4 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C005 XENCODING 5 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C006 XENCODING 6 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C007 XENCODING 7 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C010 XENCODING 8 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C011 XENCODING 9 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C012 XENCODING 10 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C013 XENCODING 11 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C014 XENCODING 12 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C015 XENCODING 13 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C016 XENCODING 14 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C017 XENCODING 15 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C020 XENCODING 16 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C021 XENCODING 17 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C022 XENCODING 18 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C023 XENCODING 19 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C024 XENCODING 20 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C025 XENCODING 21 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C026 XENCODING 22 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C027 XENCODING 23 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C030 XENCODING 24 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C031 XENCODING 25 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C032 XENCODING 26 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C033 XENCODING 27 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C034 XENCODING 28 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C035 XENCODING 29 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C036 XENCODING 30 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C037 XENCODING 31 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C040 XENCODING 32 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR ! XENCODING 33 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR " XENCODING 34 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR # XENCODING 35 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR $ XENCODING 36 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR % XENCODING 37 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR & XENCODING 38 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR ' XENCODING 39 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR ( XENCODING 40 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR ) XENCODING 41 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR * XENCODING 42 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X1000 X1000 X1000 X383e X2bea X3abe X3bea X7fff X0000 X0000 X0000 XENDCHAR XSTARTCHAR + XENCODING 43 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR , XENCODING 44 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR - XENCODING 45 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR . XENCODING 46 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR / XENCODING 47 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X00c8 X00d0 X00e0 X00c0 X00e0 X0160 X0260 X0460 X7c60 X17f0 X203c X0030 X0030 X0030 X0000 XENDCHAR XSTARTCHAR 0 XENCODING 48 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR 1 XENCODING 49 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR 2 XENCODING 50 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR 3 XENCODING 51 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR 4 XENCODING 52 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR 5 XENCODING 53 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR 6 XENCODING 54 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR 7 XENCODING 55 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR 8 XENCODING 56 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR 9 XENCODING 57 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR : XENCODING 58 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR ; XENCODING 59 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR < XENCODING 60 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR = XENCODING 61 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR > XENCODING 62 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR ? XENCODING 63 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR @ XENCODING 64 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0380 X7280 X5380 X72e0 X53a0 X72f0 X53d6 X7ef6 X57be X7efa X55ae Xffff X0000 X0000 X0000 XENDCHAR XSTARTCHAR A XENCODING 65 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR B XENCODING 66 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0200 X4240 X36c4 X1ff8 Xffff X7ffe X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR C XENCODING 67 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0040 X0400 X2000 X0400 X0000 X0380 Xffff X7ffe X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR D XENCODING 68 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR E XENCODING 69 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR F XENCODING 70 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR G XENCODING 71 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR H XENCODING 72 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR I XENCODING 73 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR J XENCODING 74 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR K XENCODING 75 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR L XENCODING 76 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR M XENCODING 77 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR N XENCODING 78 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X000c X1fd4 X3ffc X3ffc X1fd4 X000c X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR O XENCODING 79 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR P XENCODING 80 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR Q XENCODING 81 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR R XENCODING 82 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR S XENCODING 83 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR T XENCODING 84 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR U XENCODING 85 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR V XENCODING 86 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR W XENCODING 87 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR X XENCODING 88 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR Y XENCODING 89 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR Z XENCODING 90 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR [ XENCODING 91 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR \ XENCODING 92 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR ] XENCODING 93 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR ^ XENCODING 94 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR _ XENCODING 95 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR ` XENCODING 96 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR a XENCODING 97 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X03c0 Xfff0 X07fe X7ffc X3ff8 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR b XENCODING 98 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0200 X0600 X0e00 X0600 X0e02 X0606 X7ffe X7ffe X0606 X0e02 X0600 X0e00 X0600 X0200 X0000 XENDCHAR XSTARTCHAR c XENCODING 99 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR d XENCODING 100 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0500 X0fc0 X1ff8 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR e XENCODING 101 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR f XENCODING 102 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0060 X1fc0 X7fe0 X0700 X0000 X0006 X001c X0ffc X3ffe X01e0 X0070 X0000 X0000 XENDCHAR XSTARTCHAR g XENCODING 103 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR h XENCODING 104 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR i XENCODING 105 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0400 X2800 X7080 X7500 X7e10 X2ea0 X2fc2 X05d4 X05f8 X00b8 X00b8 X0010 X0010 X0000 XENDCHAR XSTARTCHAR j XENCODING 106 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR k XENCODING 107 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR l XENCODING 108 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR m XENCODING 109 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR n XENCODING 110 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR o XENCODING 111 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR p XENCODING 112 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR q XENCODING 113 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR r XENCODING 114 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR s XENCODING 115 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0600 X0600 X3ffc X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR t XENCODING 116 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0660 X0ff0 X3ffc X1ff8 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR u XENCODING 117 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR v XENCODING 118 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR w XENCODING 119 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR x XENCODING 120 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR y XENCODING 121 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR z XENCODING 122 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR { XENCODING 123 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR | XENCODING 124 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XSTARTCHAR } XENCODING 125 XSWIDTH 1 0 XDWIDTH 16 0 XBBX 16 16 0 -5 XBITMAP X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 X0000 XENDCHAR XENDFONT END_OF_lib/standard.bdf if test 20151 -ne `wc -c <lib/standard.bdf`; then echo shar: \"lib/standard.bdf\" unpacked with wrong size! fi # end of overwriting check fi if test -f period.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"period.c\" else echo shar: Extracting \"period.c\" \(31327 characters\) sed "s/^X//" >period.c <<'END_OF_period.c' X/* Copyright (c) 1987, 1988 Stanley T. Shebs, University of Utah. */ X/* This program may be used, copied, modified, and redistributed freely */ X/* for noncommercial purposes, so long as this notice remains intact. */ X X/* RCS $Header: period.c,v 1.1 88/06/21 12:30:35 shebs Exp $ */ X X/* This file defines a mini-postfix language for use in specifying periods. */ X/* The language is very restrictive, both lexically and semantically. The */ X/* only kinds of objects are integers, strings, symbols, and vectors, while */ X/* the only way to get new words is to make new unit, resource, and terrain */ X/* types, or to create names for constants. There is a strong flavor of APL */ X/* in the kinds of vector operations available. */ X X/* Stack hacking is a little dubious - we pop the stack *before* doing the */ X/* word, but don't copy args. Potential for disaster if word pushes */ X/* results too soon... Should use pointers to objects also, for portability. */ X X#include "config.h" X#include "misc.h" X#include "period.h" X#include "unit.h" X X/* Cute little macro from the MG people. It computes an offset of the slot */ X/* "m" from the beginning of structure type "t". */ X X#define OFFSET(t,m) ((char *) &(((t *) 0)->m) - ((char *) ((t *) 0))) X#define VOFFSET(t,m) ((char *) (((t *) 0)->m) - ((char *) ((t *) 0))) X X/* The "dictionary" is a symbol table, thus needs to be large enough to hold */ X/* all pre-defined symbols, as well as those added during execution. */ X/* There are about 200 predefined words. */ X X#define DICTSIZE 400 X X/* The stack doesn't have to be very deep, unless the period description is */ X/* really perverted. Depth should be at least MAXUTYPES+5 or so... */ X X#define STACKSIZE 50 X X/* An object has four possible types. Numbers can only be integers, and */ X/* vectors may only contain integers. Strings are unlimited, while symbols */ X/* mustn't overflow the dictionary. */ X X#define INT 0 X#define SYM 1 X#define STR 2 X#define VEC 3 X X/* States of tokenizer (along with symbols just above). */ X X#define ENDTOKEN (-99) X#define NIL (-1) X X/* Types of words (avoids using C hook functions usually). */ X X#define FN 0 /* arbitrary function */ X#define U1 1 /* put number into utype slot */ X#define S1 2 /* put string into utype slot */ X#define U2 3 /* put number(s) into utype array slot */ X#define VV 5 /* push value onto stack */ X#define P0 6 /* put number into period structure */ X#define T1 7 /* put number into terrain type slot */ X X/* Note that this declaration results in largish objects, but anything more */ X/* clever is probably overkill. */ X X/* MAXUTYPES must be larger than MAX[RT]TYPES (obscure). */ X Xtypedef struct a_obj { X int type; /* type of the object */ X int len; /* length if it's a vector */ X union { X int num; /* numeric value */ X char *str; /* string value */ X int sym; /* symbol value (index into dictionary) */ X short vec[MAXUTYPES]; /* vector value */ X } v; /* value is pretty sizeable because of vector values */ X} Obj; X X/* The dictionary interfaces words to C functions. */ X Xtypedef struct dict { X char *name; /* a word of the language */ X int wtype; /* type of word (1-d set, string set, etc) */ X int nargs; /* how much to pull from the stack */ X union { X int (*code)(); /* pointer to a C function */ X int offset; /* for offsets into structures */ X Obj value; /* a "default" value used sometimes */ X } f; X} Dict; X XDict words[DICTSIZE]; /* the dictionary itself */ X XObj stack[STACKSIZE]; /* the evaluation stack */ XObj curobj; /* the current word (used in weird way) */ X XFILE *pfp; /* period file pointer */ X Xbool mustbenew = TRUE; /* flag for an efficiency hack during init */ X Xint numwords; /* number of words presently in dictionary */ Xint top = 0; /* index to the top of the stack */ X Xint push_value(); /* predeclare to cover some forward refs */ X X/* Read a period section of an already-opened mapfile. */ X/* The debug prints are very important for debugging period files - they */ X/* provide at least a simple test that things are being read correctly. */ X/* There are also a number of consistency checks, though not all possible, */ X/* and nothing is done to test play balance for the period :-). */ X Xread_period(fp) XFILE *fp; X{ X int extension, endsym, si; X X pfp = fp; X fscanf(pfp, "Period %d\n", &extension); X if (Debug) printf("Trying to read period ...\n"); X init_words(); X endsym = lookup_symbol("end"); X clear_period(); X while (get_token(pfp)) { X if (Debug) { X print_object(curobj, FALSE); X } X if (curobj.type == SYM) { X si = curobj.v.sym; X if (si == endsym) break; X if (top < words[si].nargs) { X fprintf(stderr, "Stack underflow!\n"); X exit(1); X } X top -= words[si].nargs; X switch (words[si].wtype) { X case FN: X execute_word(words[si].f.code, words[si].nargs); X break; X case P0: X set_0d_n(stack[top], words[si].f.offset); X break; X case U1: X set_1d_n(stack[top], stack[top+1], words[si].f.offset); X break; X case S1: X set_1d_s(stack[top], stack[top+1], words[si].f.offset); X break; X case U2: X set_2d(stack[top], stack[top+1], stack[top+2], X words[si].f.offset); X break; X case VV: X push_value(); X break; X case T1: X set_1d_t(stack[top], stack[top+1], words[si].f.offset); X break; X default: X case_panic("word type", words[si].wtype); X break; X } X } else { X push_word(); X } X } X check_period_numbers(); X if (Debug) printf("... Done reading period.\n"); X} X X/* Execution is straightforward, but we need to know how many arguments each */ X/* C function expects. */ X Xexecute_word(fn, args) Xint (*fn)(), args; X{ X if (fn == NULL) abort(); X switch (args) { X case 0: X (*fn)(); X break; X case 1: X (*fn)(stack[top]); X break; X case 2: X (*fn)(stack[top], stack[top+1]); X break; X case 3: X (*fn)(stack[top], stack[top+1], stack[top+2]); X break; X case 4: X (*fn)(stack[top], stack[top+1], stack[top+2], stack[top+3]); X break; X default: X case_panic("argument", args); X break; X } X} X X/* Alas, the tokenizer is too simple to bother with lex, and does too much */ X/* to be a neat and short bit of code. The states are NIL, INT, STR, SYM, */ X/* and ENDTOKEN. The process starts in NIL, and succeeds in the state */ X/* ENDTOKEN, but fails (returning flag) if there is any sort of error. */ X/* Basically each token type is flagged by its special character(s), and */ X/* is terminated by whitespace (i.e. state machine is a bunch of looping */ X/* states with only other transitions to and from NIL). */ X Xget_token(fp) XFILE *fp; X{ X bool minus; X char ch, str[BUFSIZE]; X int state = NIL, j = 0; X X while (state != ENDTOKEN) { X ch = getc(fp); X switch (ch) { X case EOF: X return FALSE; X case ';': X while ((ch = getc(fp)) != '\n' && ch != EOF); X break; X default: X switch (state) { X case NIL: X if (isdigit(ch) || ch == '-') { X minus = (ch == '-'); X curobj.v.num = (minus ? 0 : ch - '0'); X state = curobj.type = INT; X } else if (iswhite(ch)) { X /* nothing to do here */ X } else if (ch == '"') { X state = curobj.type = STR; X } else { X str[j++] = ch; X state = curobj.type = SYM; X } X break; X case INT: X if (isdigit(ch)) { X curobj.v.num = curobj.v.num * 10 + ch - '0'; X } else { X if (minus) curobj.v.num = 0 - curobj.v.num; X state = ENDTOKEN; X } X break; X case STR: X if (ch == '"') { X str[j] = '\0'; X curobj.v.str = copy_string(str); X state = ENDTOKEN; X } else { X str[j++] = ch; X } X break; X case SYM: X if (iswhite(ch)) { X str[j] = '\0'; X curobj.v.sym = lookup_symbol(str); X if (curobj.v.sym < 0) { X fprintf(stderr, "Undefined symbol \"%s\"!\n", str); X exit(1); X } X state = ENDTOKEN; X } else { X str[j++] = ch; X } X break; X default: X case_panic("token state", state); X break; X } X break; X } X } X return TRUE; X} X X/* The dictionary starts out empty. During initialization before reading, */ X/* the basic set of predefined words come in. Then units and resources get */ X/* words later on as requested. The "mustbenew" flag enables/disables redef */ X/* checks. Return address of new word. as a convenience. */ X Xadd_word(word, type, args, fn) Xchar *word; Xint type, args; Xint (*fn)(); X{ X int sym; X X if (mustbenew && (sym = lookup_symbol(word)) > 0) { X fprintf(stderr, "May not redefine \"%s\"!\n", word); X return sym; X } X if (numwords < DICTSIZE) { X words[numwords].name = word; X words[numwords].wtype = type; X words[numwords].nargs = args; X words[numwords].f.code = fn; X numwords++; X return (numwords - 1); X } else { X fprintf(stderr, "Dictionary is full!\n"); X exit(1); X } X} X X/* Look up a symbol in the (not so small) dictionary. DO NOT add it if not */ X/* found - don't want any screwups to be compounded by feeble DWIM efforts. */ X Xlookup_symbol(str) Xchar *str; X{ X int i; X X for (i = 0; i < numwords; ++i) { X if (strcmp(words[i].name, str) == 0) return i; X } X return (-1); X} X X/* Put the current word on the stack, checking for overflow first. */ X Xpush_word() X{ X if (top < STACKSIZE) { X stack[top++] = curobj; X } else { X fprintf(stderr, "Stack overflow!\n"); X exit(1); X } X} X X/* Push the "value" slot of the word being executed onto the stack. */ X/* Used by all names and characters of units and resources - necessary */ X/* because we can't define individual distinct C codes for each type. */ X Xpush_value() X{ X if (top < STACKSIZE) { X stack[top++] = words[curobj.v.sym].f.value; X } else { X print_stack(); X fprintf(stderr, "Stack overflow!\n"); X exit(1); X } X} X X/* Generic number pusher. */ X Xpush_number(n) Xint n; X{ X if (top < STACKSIZE) { X stack[top].type = INT; X stack[top].v.num = n; X ++top; X } else { X fprintf(stderr, "Stack overflow!\n"); X exit(1); X } X} X X/* Fill in some very basic numbers at the outset. This is essentially a */ X/* "clear" operation, rampaging straight through the three period structures */ X/* then filling in a few numbers that *must* have reasonable values for the */ X/* program to work. A couple are convenience values, such as "nukehit". */ X Xclear_period() X{ X char *base; X int i, u, u2, r, t, tmp1, tmp2; X X tmp1 = period.numsnames; tmp2 = period.numunames; X base = (char *) . X for (i = 0; i < sizeof(Period); ++i) base[i] = '\0'; X base = (char *) utypes; X for (i = 0; i < sizeof(Utype) * MAXUTYPES; ++i) base[i] = '\0'; X base = (char *) rtypes; X for (i = 0; i < sizeof(Rtype) * MAXRTYPES; ++i) base[i] = '\0'; X base = (char *) ttypes; X for (i = 0; i < sizeof(Ttype) * MAXTTYPES; ++i) base[i] = '\0'; X period.numsnames = tmp1; period.numunames = tmp2; X period.name = "unspecified"; X period.fontname = ""; X period.scale = 100; X period.nukehit = 50; X period.countrysize = 3; X period.mindistance = 7; X period.maxdistance = 60; X period.firstutype = period.firstptype = NOTHING; X period.counterattack = TRUE; X period.defaultterrain = period.edgeterrain = -1; X period.altroughness = 80; period.wetroughness = 70; X period.spychance = 1; period.spyquality = 50; X for (u = 0; u < MAXUTYPES; ++u) { X utypes[u].attdamage = 1; X utypes[u].attritionmsg = "suffers attrition"; X utypes[u].accidentmsg = "has an accident"; X utypes[u].starvemsg = "runs out of supplies and dies"; X utypes[u].destroymsg = "destroys"; X utypes[u].visibility = 100; X utypes[u].seebest = 100; X utypes[u].seeworst = 100; X utypes[u].seerange = 1; X utypes[u].hp = 1; X utypes[u].counterable = TRUE; X utypes[u].control = 100; X for (u2 = 0; u2 < MAXUTYPES; ++u2) { X utypes[u].entertime[u2] = 1; X utypes[u].mobility[u2] = 100; X } X for (r = 0; r < MAXRTYPES; ++r) { X utypes[u].stockpile[r] = 100; X } X for (t = 0; t < MAXTTYPES; ++t) { X utypes[u].moves[t] = -1; X } X } X for (t = 0; t < MAXTTYPES; ++t) { X ttypes[t].minalt = ttypes[t].minwet = 0; X ttypes[t].maxalt = ttypes[t].maxwet = 100; X } X} X X/* Random side and unit names must be cleared separately by explicit cmd, */ X/* since periods don't always want to define their own. */ X Xclear_side_names() { period.numsnames = 0; } X Xclear_unit_names() { period.numunames = 0; } X X/* Words that set the contents of arrays are polymorphic in that they can */ X/* do array-like assignments as well as single value assignment. */ X Xset_0d_n(n, offset) XObj n; Xint offset; X{ X *((short *) ((char *) ((char *) &period) + offset)) = n.v.num; X} X X/* No string vectors, so all we can do is to assign the same string to */ X/* one or more different array positions. */ X X#define s1ds(s,i) (*((char **)((char *)((char *)&(utypes[i])) + offset)) = s) X Xset_1d_s(s, i, offset) XObj s, i; Xint offset; X{ X int z; X X if (s.type == STR) { X if (i.type == INT) { X s1ds(s.v.str, i.v.num); X } else { X for (z = 0; z < i.len; ++z) s1ds(s.v.str, i.v.vec[z]); X } X } else { X arg_error_1d("1st arg must be string", s, i); X } X} X X/* One-dimensional arrays allow the combinations of scalar value & index SS, */ X/* scalar value & vector index SV, and two vectors VV. The 4th combo is not */ X/* sensible. */ X X#define s1d(n,i) (*((short *)((char *)((char *)&(utypes[i])) + offset)) = n) X Xset_1d_n(n, i, offset) XObj n, i; Xint offset; X{ X int z; X X if (n.type == INT) { X if (i.type == INT) { X s1d(n.v.num, i.v.num); X } else { X for (z = 0; z < i.len; ++z) s1d(n.v.num, i.v.vec[z]); X } X } else { X if (i.type == INT) { X arg_error_1d("mismatched arguments", n, i); X } else { X for (z = 0; z < n.len; ++z) s1d(n.v.vec[z], i.v.vec[z]); X } X } X} X X/* This is identical to set_1d_n, but puts stuff into ttypes array instead. */ X X#define s1dt(n,i) (*((short *)((char *)((char *)&(ttypes[i])) + offset)) = n) X Xset_1d_t(n, i, offset) XObj n, i; Xint offset; X{ X int z; X X if (n.type == INT) { X if (i.type == INT) { X s1dt(n.v.num, i.v.num); X } else { X for (z = 0; z < i.len; ++z) s1dt(n.v.num, i.v.vec[z]); X } X } else { X if (i.type == INT) { X arg_error_1d("mismatched arguments", n, i); X } else { X for (z = 0; z < n.len; ++z) s1dt(n.v.vec[z], i.v.vec[z]); X } X } X} X X/* Dump the offending values and leave - any attempt to keep going will */ X/* probably screw things up and maybe cause a core dump. */ X Xarg_error_1d(msg, a, b) Xchar *msg; XObj a, b; X{ X fprintf(stderr, "Error in array setting: %s\n", msg); X print_object(a, TRUE); X print_object(b, TRUE); X exit(1); X} X X/* Two-dimensional setting is more complicated. VSS is not useful, and VVV */ X/* can only set diagonals. All others are useful. */ X X#define s2d(n,i,j) (*((short *)((char *)((char *)&(utypes[j]))+offset+2*i))=n) X Xset_2d(n, i1, i2, offset) XObj n, i1, i2; Xint offset; X{ X int z, zz; X X if (n.type == INT) { X if (i1.type == INT) { X if (i2.type == INT) { X s2d(n.v.num, i1.v.num, i2.v.num); X } else { X for (z = 0; z < i2.len; ++z) { X s2d(n.v.num, i1.v.num, i2.v.vec[z]); X } X } X } else { X if (i2.type == INT) { X for (z = 0; z < i1.len; ++z) { X s2d(n.v.num, i1.v.vec[z], i2.v.num); X } X } else { X for (z = 0; z < i1.len; ++z) { X for (zz = 0; zz < i2.len; ++zz) { X s2d(n.v.num, i1.v.vec[z], i2.v.vec[zz]); X } X } X } X } X } else { X if (i1.type == INT) { X if (i2.type == INT) { X arg_error_2d("mismatched argument types", n, i1, i2); X } else { X if (n.len != i2.len) X arg_error_2d("mismatched vectors", n, i1, i2); X for (z = 0; z < i2.len; ++z) { X s2d(n.v.vec[z], i1.v.num, i2.v.vec[z]); X } X } X } else { X if (i2.type == INT) { X if (n.len != i1.len) X arg_error_2d("mismatched vectors", n, i1, i2); X for (z = 0; z < i1.len; ++z) { X s2d(n.v.vec[z], i1.v.vec[z], i2.v.num); X } X } else { X arg_error_2d("mismatched argument types", n, i1, i2); X } X } X } X} X X/* Dump the offending values and die. */ X Xarg_error_2d(msg, a, b, c) Xchar *msg; XObj a, b, c; X{ X fprintf(stderr, "Error in array setting: %s\n", msg); X print_object(a, TRUE); X print_object(b, TRUE); X print_object(c, TRUE); X exit(1); X} X X/* Fortunately there are no 3D arrays!! */ X X/* The dreary wasteland of implementations of words. */ X/* Fortunately, most of them can use the multi-dimensional array hacking as */ X/* defined already, but we have to have both a "setter" function and a */ X/* "dictionary" function, so lots of short functions :-(. */ X X/* Build an arbitrary integer vector using [ ] words. */ X Xstart_vector() X{ X stack[top].type = STR; X stack[top++].v.str = "start-vector"; /* check overflow? */ X} X X/* Vector creation is a little tricky, since we usually take a variable */ X/* number of words from the stack. The basic scheme scans the stack for */ X/* for a non-integer or stack bottom, then builds a vector at that point. */ X Xfinish_vector() X{ X int i, bot, size; X X for (i = top-1; i >= 0; --i) { X if (stack[i].type != INT) { X bot = i; X break; X } X } X size = top - bot - 1; X if (size <= MAXUTYPES) { X stack[bot].type = VEC; X stack[bot].len = size; X for (i = 0; i < size; ++i) { X stack[bot].v.vec[i] = stack[bot+i+1].v.num; X } X top = bot + 1; X } else { X fprintf(stderr, "Vector too big!\n"); X exit(1); X } X} X X/* Assign a value to a variable, basically. Actually, we're defining a new */ X/* word and filling its value slot. */ X Xset_define(a1, a2) XObj a1, a2; X{ X words[add_word(a2.v.str, VV, 0, NULL)].f.value = a1; X} X Xpush_true() { push_number(TRUE); } X Xpush_false() { push_number(FALSE); } X Xpush_nothing() { push_number(NOTHING); } X X/* Things that don't fit in with all the "short" slots. */ X Xset_periodname(a1) Obj a1; { period.name = a1.v.str; } X Xset_fontname(a1) Obj a1; { period.fontname = a1.v.str; } X X/* Add a new type of unit. All args must be strings, but after the defn, */ X/* both char and full name may be used as normal words. */ X Xdefine_utype(a1, a2, a3) XObj a1, a2, a3; X{ X Obj obj; X X if (period.numutypes < MAXUTYPES) { X obj.type = INT; X obj.v.num = period.numutypes; X utypes[period.numutypes].uchar = a1.v.str[0]; X utypes[period.numutypes].name = a2.v.str; X utypes[period.numutypes].help = a3.v.str; X words[add_word(a1.v.str, VV, 0, NULL)].f.value = obj; X words[add_word(a2.v.str, VV, 0, NULL)].f.value = obj; X period.numutypes++; X } else { X fprintf(stderr, "Limited to %d types of units! (failed on %s)\n", X MAXUTYPES, a2.v.str); X exit(1); X } X} X X/* Add a new type of resource (similar to adding unit type). */ X Xdefine_rtype(a1, a2, a3) XObj a1, a2, a3; X{ X Obj obj; X X if (period.numrtypes < MAXRTYPES) { X obj.type = INT; X obj.v.num = period.numrtypes; X rtypes[period.numrtypes].rchar = a1.v.str[0]; X rtypes[period.numrtypes].name = a2.v.str; X rtypes[period.numrtypes].help = a3.v.str; X words[add_word(a1.v.str, VV, 0, NULL)].f.value = obj; X words[add_word(a2.v.str, VV, 0, NULL)].f.value = obj; X period.numrtypes++; X } else { X fprintf(stderr, "Limited to %d types of resources! (failed on %s)\n", X MAXRTYPES, a2.v.str); X exit(1); X } X} X X/* Add a new type of terrain. All args must be strings, but after the defn, */ X/* only full name may be used as a normal word. (Since most terrain chars */ X/* seem to conflict with various important chars in this language.) */ X Xdefine_ttype(a1, a2, a3) XObj a1, a2, a3; X{ X Obj obj; X X if (period.numttypes < MAXTTYPES) { X obj.type = INT; X obj.v.num = period.numttypes; X ttypes[period.numttypes].tchar = a1.v.str[0]; X ttypes[period.numttypes].name = a2.v.str; X ttypes[period.numttypes].color = a3.v.str; X /* Terrain chars are weird, so don't add as new words */ X words[add_word(a2.v.str, VV, 0, NULL)].f.value = obj; X period.numttypes++; X } else { X fprintf(stderr, "Limited to %d types of terrain! (failed on %s)\n", X MAXTTYPES, a2.v.str); X exit(1); X } X} X X/* Push vector of all types of objects for various classes. */ X Xpush_u_vec() { push_iota_vec(period.numutypes); } X Xpush_r_vec() { push_iota_vec(period.numrtypes); } X Xpush_t_vec() { push_iota_vec(period.numttypes); } X X/* Simulate the "iota" operator of APL; push a vector of consecutive ints. */ X Xpush_iota_vec(n) Xint n; X{ X int i; X X stack[top].type = VEC; X stack[top].len = n; X for (i = 0; i < n; ++i) stack[top].v.vec[i] = i; X ++top; X} X X/* Add the string into the array of random side names. */ X Xadd_side_name(a1) XObj a1; X{ X snames[period.numsnames++] = a1.v.str; X} X X/* Add the string into the array of random unit names. */ X Xadd_unit_name(a1) XObj a1; X{ X unames[period.numunames++] = a1.v.str; X} X X/* Absorb designer notes directly instead of trying to interpret words or */ X/* strings or whatever. This version limits commentary to about 8 pages, */ X/* which should be more than enough. */ X Xbegin_notes() X{ X char *line; X int i = 0; X X period.notes = (char **) malloc(400 * sizeof(char *)); X while ((line = read_line(pfp)) != NULL) { X if (strcmp(line, "end{notes}") == 0) break; X period.notes[i++] = line; X if (i >= 399) break; X } X period.notes[i] = NULL; X} X X/* Print the whole stack, attempting to fit it all on one line (hah!). */ X Xprint_stack() X{ X int i; X X if (top == 0) { X printf("/* Stack is empty. */\n"); X } else { X printf("/* Stack "); X for (i = 0; i < top; ++i) { X print_object(stack[i], FALSE); X } X printf("*/\n"); X } X} X X/* Ah, the joys of polymorphism. Gotta print each type out differently. */ X/* I suppose it's better than not knowing what the types of things are... */ X Xprint_object(obj, newline) XObj obj; Xbool newline; X{ X int i; X X switch (obj.type) { X case INT: X printf("%d ", obj.v.num); X break; X case STR: X printf("\"%s\" ", obj.v.str); X break; X case SYM: X printf("%s ", words[obj.v.sym].name); X break; X case VEC: X printf("["); X for (i = 0; i < obj.len; ++i) printf("%d,", obj.v.vec[i]); X printf("] "); X break; X } X if (newline) printf("\n"); X} X X/* Build the initial dictionary. At the end of this file, to eliminate need */ X/* for a zillion function declarations! */ X Xinit_words() X{ X numwords = 0; X mustbenew = FALSE; /* efficiency hack */ X add_word("[", FN, 0, start_vector); X add_word("]", FN, 0, finish_vector); X add_word("true", FN, 0, push_true); X add_word("false", FN, 0, push_false); X add_word("define", FN, 2, set_define); X add_word("period-name", FN, 1, set_periodname); X add_word("font-name", FN, 1, set_fontname); X add_word("scale", P0, 1, OFFSET(Period, scale)); X add_word("utype", FN, 3, define_utype); X add_word("rtype", FN, 3, define_rtype); X add_word("ttype", FN, 3, define_ttype); X add_word("u*", FN, 0, push_u_vec); X add_word("r*", FN, 0, push_r_vec); X add_word("t*", FN, 0, push_t_vec); X add_word("nothing", FN, 0, push_nothing); X add_word("dark", T1, 2, OFFSET(Ttype, dark)); X add_word("nuked", T1, 2, OFFSET(Ttype, nuked)); X add_word("max-alt", T1, 2, OFFSET(Ttype, maxalt)); X add_word("min-alt", T1, 2, OFFSET(Ttype, minalt)); X add_word("max-wet", T1, 2, OFFSET(Ttype, maxwet)); X add_word("min-wet", T1, 2, OFFSET(Ttype, minwet)); X add_word("inhabitants", T1, 2, OFFSET(Ttype, inhabitants)); X add_word("independence", T1, 2, OFFSET(Ttype, independence)); X add_word("default-terrain", P0, 1, OFFSET(Period, defaultterrain)); X add_word("edge-terrain", P0, 1, OFFSET(Period, edgeterrain)); X add_word("alt-roughness", P0, 1, OFFSET(Period, altroughness)); X add_word("wet-roughness", P0, 1, OFFSET(Period, wetroughness)); X add_word("icon-name", S1, 2, OFFSET(Utype, bitmapname)); X add_word("neutral", U1, 2, OFFSET(Utype, isneutral)); X add_word("territory", U1, 2, OFFSET(Utype, territory)); X add_word("can-disband", U1, 2, OFFSET(Utype, disband)); X add_word("efficiency", P0, 1, OFFSET(Period, efficiency)); X add_word("population", P0, 1, OFFSET(Period, population)); X add_word("hostility", P0, 1, OFFSET(Period, hostility)); X add_word("max-quality", U1, 2, OFFSET(Utype, maxquality)); X add_word("max-morale", U1, 2, OFFSET(Utype, maxmorale)); X add_word("control", U1, 2, OFFSET(Utype, control)); X add_word("country-size", P0, 1, OFFSET(Period, countrysize)); X add_word("country-min-distance", P0, 1, OFFSET(Period, mindistance)); X add_word("country-max-distance", P0, 1, OFFSET(Period, maxdistance)); X add_word("first-unit", P0, 1, OFFSET(Period, firstutype)); X add_word("first-product", P0, 1, OFFSET(Period, firstptype)); X add_word("in-country", U1, 2, OFFSET(Utype, incountry)); X add_word("density", U1, 2, OFFSET(Utype, density)); X add_word("named", U1, 2, OFFSET(Utype, named)); X add_word("already-seen", U1, 2, OFFSET(Utype, alreadyseen)); X add_word("favored", U2, 3, VOFFSET(Utype, favored)); X add_word("stockpile", U2, 3, VOFFSET(Utype, stockpile)); X add_word("known-radius", P0, 1, OFFSET(Period, knownradius)); X add_word("spy", P0, 1, OFFSET(Period, spychance)); X add_word("spy-quality", P0, 1, OFFSET(Period, spyquality)); X add_word("revolt", U1, 2, OFFSET(Utype, revolt)); X add_word("surrender", U1, 2, OFFSET(Utype, surrender)); X add_word("siege", U1, 2, OFFSET(Utype, siege)); X add_word("attrition", U2, 3, VOFFSET(Utype, attrition)); X add_word("attrition-damage", U1, 2, OFFSET(Utype, attdamage)); X add_word("attrition-message", S1, 2, OFFSET(Utype, attritionmsg)); X add_word("accident", U2, 3, VOFFSET(Utype, accident)); X add_word("accident-message", S1, 2, OFFSET(Utype, accidentmsg)); X add_word("make", U2, 3, VOFFSET(Utype, make)); X add_word("maker", U1, 2, OFFSET(Utype, maker)); X add_word("startup", U1, 2, OFFSET(Utype, startup)); X add_word("research", U1, 2, OFFSET(Utype, research)); X add_word("to-make", U2, 3, VOFFSET(Utype, tomake)); X add_word("repair", U2, 3, VOFFSET(Utype, repair)); X add_word("produce", U2, 3, VOFFSET(Utype, produce)); X add_word("productivity", U2, 3, VOFFSET(Utype, productivity)); X add_word("storage", U2, 3, VOFFSET(Utype, storage)); X add_word("consume", U2, 3, VOFFSET(Utype, consume)); X add_word("in-length", U2, 3, VOFFSET(Utype, inlength)); X add_word("out-length", U2, 3, VOFFSET(Utype, outlength)); X add_word("survival", U1, 2, OFFSET(Utype, survival)); X add_word("starve-message", S1, 2, OFFSET(Utype, starvemsg)); X add_word("speed", U1, 2, OFFSET(Utype, speed)); X add_word("moves", U2, 3, VOFFSET(Utype, moves)); X add_word("random-move", U2, 3, VOFFSET(Utype, randommove)); X add_word("free-move", U1, 2, OFFSET(Utype, freemove)); X add_word("one-move", U1, 2, OFFSET(Utype, onemove)); X add_word("jump-move", U1, 2, OFFSET(Utype, jumpmove)); X add_word("to-move", U2, 3, VOFFSET(Utype, tomove)); X add_word("capacity", U2, 3, VOFFSET(Utype, capacity)); X add_word("hold-volume", U1, 2, OFFSET(Utype, holdvolume)); X add_word("volume", U1, 2, OFFSET(Utype, volume)); X add_word("enter-time", U2, 3, VOFFSET(Utype, entertime)); X add_word("leave-time", U2, 3, VOFFSET(Utype, leavetime)); X add_word("bridge", U2, 3, VOFFSET(Utype, bridge)); X add_word("alter-mobility", U2, 3, VOFFSET(Utype, mobility)); X add_word("see-best", U1, 2, OFFSET(Utype, seebest)); X add_word("see-worst", U1, 2, OFFSET(Utype, seeworst)); X add_word("see-range", U1, 2, OFFSET(Utype, seerange)); X add_word("visibility", U1, 2, OFFSET(Utype, visibility)); X add_word("conceal", U2, 3, VOFFSET(Utype, conceal)); X add_word("always-seen", U1, 2, OFFSET(Utype, seealways)); X add_word("all-seen", P0, 1, OFFSET(Period, allseen)); X add_word("multi-part", U1, 2, OFFSET(Utype, parts)); X add_word("hp", U1, 2, OFFSET(Utype, hp)); X add_word("crippled", U1, 2, OFFSET(Utype, crippled)); X add_word("hit", U2, 3, VOFFSET(Utype, hit)); X add_word("hit-range", U1, 2, OFFSET(Utype, hitrange)); X add_word("neutrality", P0, 1, OFFSET(Period, neutrality)); X add_word("defense", U2, 3, VOFFSET(Utype, defense)); X add_word("damage", U2, 3, VOFFSET(Utype, damage)); X add_word("can-counter", U1, 2, OFFSET(Utype, counterable)); X add_word("area-radius", U1, 2, OFFSET(Utype, arearadius)); X add_word("nuke-hit", P0, 1, OFFSET(Period, nukehit)); X add_word("self-destruct", U1, 2, OFFSET(Utype, selfdestruct)); X add_word("combat-time", U1, 2, OFFSET(Utype, hittime)); X add_word("counterattack", P0, 1, OFFSET(Period, counterattack)); X add_word("capture", U2, 3, VOFFSET(Utype, capture)); X add_word("guard", U2, 3, VOFFSET(Utype, guard)); X add_word("protect", U2, 3, VOFFSET(Utype, protect)); X add_word("changes-side", U1, 2, OFFSET(Utype, changeside)); X add_word("retreat", U1, 2, OFFSET(Utype, retreat)); X add_word("skill-effect", U1, 2, OFFSET(Utype, skillf)); X add_word("discipline-effect", U1, 2, OFFSET(Utype, disciplinef)); X add_word("morale-effect", U1, 2, OFFSET(Utype, moralef)); X add_word("hits-with", U2, 3, VOFFSET(Utype, hitswith)); X add_word("hit-by", U2, 3, VOFFSET(Utype, hitby)); X add_word("destroy-message", S1, 2, OFFSET(Utype, destroymsg)); X add_word("clear-side-names", FN, 0, clear_side_names); X add_word("clear-unit-names", FN, 0, clear_unit_names); X add_word("sname", FN, 1, add_side_name); X add_word("uname", FN, 1, add_unit_name); X add_word("begin{notes}", FN, 0, begin_notes); X add_word("print", FN, 0, print_stack); X add_word("end", FN, 0, NULL); X mustbenew = TRUE; X} X X/* Run a doublecheck on plausibility of period parameters. Additional */ X/* checks are performed elsewhere as needed, for instance during random */ X/* generation. Serious mistakes exit now, since they can cause all sorts */ X/* of strange behavior and core dumps. It's a little more friendly to only */ X/* exit at the end of the tests, so all the mistakes can be found at once. */ X Xcheck_period_numbers() X{ X bool failed = FALSE, movers = FALSE, makers = FALSE; X int u1, u2, r1, r2, t1, t2; X X if (period.numutypes < 1) { X fprintf(stderr, "No units have been defined at all!\n"); X exit(1); X } X if (period.numttypes < 1) { X fprintf(stderr, "No terrain types have been defined at all!\n"); X exit(1); X } X if (!between(0, period.mindistance, period.maxdistance)) { X fprintf(stderr, "Warning: Country distances %d to %d screwed up\n", X period.mindistance, period.maxdistance); X } X for_all_unit_types(u1) { X if (utypes[u1].hp <= 0) { X fprintf(stderr, "Utype %d has nonpositive hp!\n", u1); X failed = TRUE; X } X if (utypes[u1].speed > 0) { X movers = TRUE; X } X for_all_unit_types(u2) { X if (utypes[u1].make[u2] > 0) { X if (utypes[u1].maker) makers = TRUE; X if (!could_carry(u1, u2) && !could_carry(u2, u1)) { X fprintf(stderr, X "Utype %d cannot hold product %d or vice versa!\n", X u1, u2); X failed = TRUE; X } X } X } X } X for_all_terrain_types(t1) { X for_all_terrain_types(t2) { X if (t1 != t2 && ttypes[t1].tchar == ttypes[t2].tchar) { X fprintf(stderr, "Terrain types %d and %d both use '%c'!\n", X t1, t2, ttypes[t1].tchar); X failed = TRUE; X } X } X } X if (!movers && !makers) { X fprintf(stderr, "No movers or builders have been defined!\n"); X failed = TRUE; X } X if (failed) exit(1); X if (Debug) { X printf("\n %d unit types, %d resource types, %d terrain types\n", X period.numutypes, period.numrtypes, period.numttypes); X } X} END_OF_period.c if test 31327 -ne `wc -c <period.c`; then echo shar: \"period.c\" unpacked with wrong size! fi # end of overwriting check fi echo shar: End of archive 4 \(of 18\). cp /dev/null ark4isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 18 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0