[comp.sources.games] v04i092: xconq5 - version 5 of the strategy game for X-windows and curses, Part04/18

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 *) &period;
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