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

games@tekred.TEK.COM (06/29/88)

Submitted by: "Stanley T. Shebs" <shebs%defun@cs.utah.edu>
Comp.sources.games: Volume 4, Issue 94
Archive-name: xconq5/Part06



#! /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 6 (of 18)."
# Contents:  lib/xconq.news move.c standard.c
# Wrapped by billr@saab on Wed Jun 29 08:55:38 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f lib/xconq.news -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"lib/xconq.news\"
else
echo shar: Extracting \"lib/xconq.news\" \(117 characters\)
sed "s/^X//" >lib/xconq.news <<'END_OF_lib/xconq.news'
X
X                              XCONQ NEWS
X
XVersion 5 is very different from version 1, be sure to read the manual.
X
X
END_OF_lib/xconq.news
if test 117 -ne `wc -c <lib/xconq.news`; then
    echo shar: \"lib/xconq.news\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f move.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"move.c\"
else
echo shar: Extracting \"move.c\" \(22132 characters\)
sed "s/^X//" >move.c <<'END_OF_move.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: move.c,v 1.1 88/06/21 12:30:23 shebs Exp $ */
X
X/* Nothing happens in xconq without movement, and it involves some rather */
X/* complicated control structures in order to get the details right. */
X/* Units only actually move by following preset orders; when they appear */
X/* to be moving under manual control, they are just following orders that */
X/* only last for one move before new orders are requested from the player. */
X
X/* Order of movement is sequential by sides, but non-moving sides are in */
X/* survey mode and can do things. */
X
X#include "config.h"
X#include "misc.h"
X#include "dir.h"
X#include "period.h"
X#include "side.h"
X#include "unit.h"
X#include "map.h"
X#include "global.h"
X
X/* Complaints about inability to do various things should only appear if */
X/* a human player issues the order to an awake unit. */
X
X#define human_order(u) ((u)->side->directorder && humanside((u)->side))
X
X/* Unit can be awake permanently or temporarily. */
X
X#define is_awake(u) ((u)->orders.type == AWAKE || (u)->awake)
X
Xbool delaymove;    /* true when unit move has been delayed */
Xbool loopagain;    /* flag to go with delaymove flag */
Xbool randomness;   /* true if some unit types move randomly */
X
Xint movetries;     /* Number of times unit tried to move (temp for mplay) */
X
XSide *curside;     /* current side for when turns are sequential */
X
X/* Cache useful details about units (for optimization only). */
X
Xinit_movement()
X{
X    int u, t;
X
X    randomness = FALSE;
X    for_all_unit_types(u) {
X	for_all_terrain_types(t) {
X	    if (utypes[u].randommove[t] > 0) randomness = TRUE;
X	}
X    }
X}
X
X/* The movement phases starts by precomputing theoretical maxima for moves, */
X/* then does each side one-by-one.  Before iterating, each human side must */
X/* be wedged (to ignore input). */
X
Xmovement_phase()
X{
X    Unit *unit;
X    Side *side, *side2;
X
X    if (Debug) printf("Entering movement phase\n");
X    compute_moves();
X    for_all_sides(side) {
X	side->directorder = FALSE;
X	side->movunit = NULL;
X	side->curunit = NULL;
X	if (humanside(side)) {
X	} else {
X	    init_machine_turn(side);
X	}
X    }
X    for_all_sides(side) {
X	if (Debug) printf("--- %s ---\n", side->name);
X	if (!side->lost) {
X	    curside = side;
X	    for_all_sides(side2) {
X		if (!humanside(side) && humanside(side2) && !side2->lost)
X		    wedge_mode(side2);
X		update_sides(side2);
X	    }
X	    loopagain = TRUE;
X	    while (loopagain && !side->lost) {
X		loopagain = FALSE;
X		for_all_units(unit) {
X		    if (unit->side == side && !side->lost) {
X			if (!humanside(side) && change_machine_product(unit)) {
X			    request_new_product(unit);
X			} else {
X			    make_current(side, unit);
X			    cancel_request(side);
X			    move_mode(side);
X			    move_1(side, unit);
X			}
X		    }
X		}
X	    }	    
X	}
X    }
X    /* For display hacking, also to find misc bugs :-) */
X    curside = NULL;
X    for_all_sides(side)  {
X	if (humanside(side) && !side->lost) {
X	    wedge_mode(side);
X	    update_sides(side);
X	}
X    }
X}
X
X/* Compute moves for all the units at once. */
X
Xcompute_moves()
X{
X    Unit *unit;
X
X    for_all_units(unit) {
X	unit->movesleft = compute_move(unit);
X	unit->actualmoves = 0;
X    }
X}
X
X/* Compute number of moves available to the units.  This is complicated by */
X/* reduction of movement due to damage and the effect of occupants on */
X/* mobility.  Also, we never let a moving unit have a movement of zero, */
X/* since this causes endless difficulties, despite the apparent improvement */
X/* in realism.  (or allow 0 but round up when possible?) */
X
X/* Moves should be recomputed and possibly adjusted downward after a hit. */
X
Xcompute_move(unit)
XUnit *unit;
X{
X    int u = unit->type, moves = 0;
X    Unit *occ;
X
X    if (!neutral(unit) && (moves = utypes[u].speed) > 0) {
X	if (cripple(unit)) {
X	    moves = (moves * unit->hp) / (utypes[u].crippled + 1);
X	}
X	for_all_occupants(unit, occ) {
X	    if (utypes[u].mobility[occ->type] != 100) {
X		moves = (moves * utypes[u].mobility[occ->type]) / 100;
X		break;
X	    }
X	}
X	moves = max(1, moves);
X    }
X    if (idled(unit) && global.setproduct) moves++;
X    return moves;
X}
X
X/* To move a single unit, keep iterating until all its moves are used up, */
X/* or it dies, or its movement has been postponed until the other units */
X/* have been done.  A single move is either under preset orders, or must be */
X/* supplied by a human player, or computed by a machine player. */
X
Xmove_1(side, unit)
XSide *side;
XUnit *unit;
X{
X    Side *side2;
X
X    if (Debug) printf("%s going to move\n", unit_handle(NULL, unit));
X    movetries = 0;
X    while (alive(unit) && unit->movesleft > 0 && !delaymove && !side->lost) {
X	if (side->mode == MOVE) make_current(side, unit);
X	if (idled(unit) && global.setproduct) {
X	    request_new_product(unit);
X	    for_all_sides(side2) {
X		if (humanside(side2) && !side2->lost) {
X		    if (side2 != curside) survey_mode(side2);
X		    request_command(side2);
X		}
X	    }
X	    handle_requests();
X	} else if (!is_awake(unit)) {
X	    follow_order(unit);
X	} else if (humanside(side) && under_control(unit)) {
X	    side->directorder = TRUE;
X	    for_all_sides(side2) {
X		if (humanside(side2) && !side2->lost) {
X		    if (side2 != curside) {
X			if (side2->mode != SURVEY) goto_empty_hex(side2);
X			survey_mode(side2);
X		    }
X		    request_command(side2);
X		}
X	    }
X	    handle_requests();
X	} else {
X	    show_info(side);
X	    machine_move(unit);
X	}
X    }
X    if (delaymove) {
X	delaymove = FALSE;
X	loopagain = TRUE;
X    }
X}
X
X/* The display and interaction should be mostly shut down. */
X
Xwedge_mode(side)
XSide *side;
X{
X    int oldmode = side->mode;
X
X    if (Debug) printf("%s side in wedge mode\n", side->name);
X    side->mode = WEDGED;
X    cancel_request(side);
X    clear_info(side);
X    if (side->mode != oldmode) show_timemode(side);
X}
X
X/* Switching to move mode involves shifting from wherever the cursor is, */
X/* back to the unit that was being moved earlier. */
X
Xmove_mode(side)
XSide *side;
X{
X    int oldmode = side->mode;
X
X    if (Debug) printf("%s side in move mode\n", side->name);
X    side->mode = MOVE;
X    if (side->movunit != NULL) {
X	make_current(side, side->movunit);
X	put_on_screen(side, side->curx, side->cury);
X	side->movunit = NULL;
X    }
X    if (side->mode != oldmode) show_timemode(side);
X}
X
X/* Switching to survey mode */
X
Xsurvey_mode(side)
XSide *side;
X{
X    int oldmode = side->mode;
X
X    if (Debug) printf("%s side in survey mode\n", side->name);
X    side->mode = SURVEY;
X    if (side->movunit == NULL) side->movunit = side->curunit;
X    make_current(side, unit_at(side->curx, side->cury));
X    if (side->curunit != side->movunit) show_info(side);
X    if (side->mode != oldmode) show_timemode(side);
X}
X
X/* Test if a unit (on a human side) is actually under manual control. */
X
Xunder_control(unit)
XUnit *unit;
X{
X    return probability(utypes[unit->type].control);
X}
X
X/* Set the "current" unit of a side - the one being displayed, moved, etc. */
X
Xmake_current(side, unit)
XSide *side;
XUnit *unit;
X{
X    if (unit != NULL && alive(unit) &&
X	(unit->side == side || Debug || Build)) {
X	side->curunit = unit;
X	side->curx = unit->x;  side->cury = unit->y;
X    } else {
X	side->curunit = NULL;
X    }
X}
X
Xunowned_p(x, y)
Xint x, y;
X{
X    Unit *unit = unit_at(x, y);
X
X    return (unit == NULL || unit->side != tmpside);
X}
X
Xgoto_empty_hex(side)
XSide *side;
X{
X    int x, y;
X
X    tmpside = side;
X    if (search_area(side->curx, side->cury, 20, unowned_p, &x, &y)) {
X	side->curx = x;  side->cury = y;
X	side->curunit = NULL;
X    }
X}
X
X/* Do single move of a single order for a given unit. */
X
Xfollow_order(unit)
XUnit *unit;
X{
X    bool success = FALSE;
X    int u = unit->type;
X    Side *us = unit->side;
X
X    if (Debug) printf("%s doing %s with %d moves left\n",
X		      unit_handle(NULL, unit), order_desig(&(unit->orders)),
X		      unit->movesleft);
X/* somewhere this has a right home */
X/*    unit->awake = FALSE;  */
X    switch (unit->orders.type) {
X    case SENTRY:
X	if (unit->orders.rept-- > 0) {
X	    unit->movesleft = 0;
X	    success = TRUE;
X	}
X	break;
X    case MOVEDIR:
X	success = move_dir(unit, unit->orders.p.dir);
X	break;
X    case MOVETO:
X	success = move_to_dest(unit);
X	break;
X    case EDGE:
X	success = follow_coast(unit);
X	break;
X    case FOLLOW:
X	success = follow_leader(unit);
X	break;
X    case PATROL:
X	success = move_patrol(unit);
X	break;
X    case AWAKE:
X    case NONE:
X    default:
X        case_panic("order type", unit->orders.type);
X    }
X    if (alive(unit)) {
X	if (success || !humanside(us)) {
X	    unit->movesleft -=
X		1 + utypes[u].moves[terrain_at(unit->x, unit->y)];
X	}
X	if (!us->directorder || success) {
X	    maybe_wakeup(unit);
X	}
X    }
X    us->directorder = FALSE;
X    if (!success) movetries++;
X}
X
X/* Force unit to try to move in given direction. */
X
Xmove_dir(unit, dir)
XUnit *unit;
Xint dir;
X{
X    if (unit->orders.rept-- > 0) {
X	return move_to_next(unit, dirx[dir], diry[dir], TRUE, TRUE);
X    }
X    return FALSE;
X}
X
X/* Have unit try to move to its ordered position. */
X
Xmove_to_dest(unit)
XUnit *unit;
X{
X    return move_to(unit, unit->orders.p.pt[0].x, unit->orders.p.pt[0].y,
X		   (unit->orders.flags & SHORTESTPATH));
X}
X
X/* Follow a coast line. This is a version of contour-following, but flaky */
X/* because our terrain is discrete rather than continuous.  The algorithm */
X/* looks backward then goes around in a circle looks for an edge; a hex */
X/* the unit can move into, which has an obstacle hex adjacent. */
X
X/* The direction-munging things should be abstracted. */
X
Xfollow_coast(unit)
XUnit *unit;
X{
X    int cw = 1, olddir = unit->orders.p.dir;
X    int testdir, k;
X    
X    /* try to go in straight line first (why?) */
X    if (flip_coin() && direction_works(unit, olddir)) return olddir;
X    testdir = (olddir - 2 * cw + 6) % 6;
X    for_all_directions(k) {
X	if (direction_works(unit, testdir)) {
X	    unit->orders.p.dir = testdir;
X	    return TRUE;
X	}
X	testdir = (testdir + cw + 6) % 6;
X    }
X    /* If none of the directions work out... */
X    wake_unit(unit, FALSE);
X    notify(unit->side, "%s can't figure out where to move to!",
X	   unit_handle(unit->side, unit));
X    return FALSE;
X}
X
Xdirection_works(unit, dir)
XUnit *unit;
Xint dir;
X{
X    int nx, ny;
X
X    nx = wrap(unit->x + dirx[dir]);  ny = limit(unit->y + diry[dir]);
X    if (could_move(unit->type, terrain_at(nx, ny)) &&
X	adj_obstacle(unit->type, nx, ny)) {
X	move_dir(unit, dir);
X	return TRUE;
X    } else {
X	return FALSE;
X    }
X}
X
Xadj_obstacle(type, x, y)
Xint type, x, y;
X{
X    int d, x1, y1;
X
X    for_all_directions(d) {
X	x1 = wrap(x + dirx[d]);  y1 = limit(y + diry[d]);
X	if (!could_move(type, terrain_at(x1, y1))) return TRUE;
X    }
X    return FALSE;
X}
X
X/* Unit attempts to follow its leader around, but not too closely. */
X
Xfollow_leader(unit)
XUnit *unit;
X{
X    Unit *leader = unit->orders.p.leader;
X
X    if (!alive(leader)) {
X	wake_unit(unit, FALSE);
X	return FALSE;
X    } else if (abs(unit->x - leader->x) < 2 && abs(unit->y - leader->y) < 2) {
X	unit->movesleft = 0;
X	return TRUE;
X    } else {
X	return move_to(unit, leader->x, leader->y, FALSE);
X    }
X}
X
X/* Patrol just does move_to, but cycling waypoints around when the first */
X/* one has been reached. */
X
Xmove_patrol(unit)
XUnit *unit;
X{
X    int tx, ty;
X
X    if (unit->orders.rept-- > 0) {
X	if (unit->x == unit->orders.p.pt[0].x &&
X	    unit->y == unit->orders.p.pt[0].y) {
X	    tx = unit->orders.p.pt[0].x;
X	    ty = unit->orders.p.pt[0].y;
X	    unit->orders.p.pt[0].x = unit->orders.p.pt[1].x;
X	    unit->orders.p.pt[0].y = unit->orders.p.pt[1].y;
X	    unit->orders.p.pt[1].x = tx;
X	    unit->orders.p.pt[1].y = ty;
X	}
X	return move_to(unit, unit->orders.p.pt[0].x, unit->orders.p.pt[0].y,
X		       (unit->orders.flags & SHORTESTPATH));
X    }
X    return TRUE;
X}
X
X/* Retreat is a special kind of movement. */
X/* Veterans should get several tries at retreating to a good place, perhaps */
X/* one try per point of "veteranness"? */
X
Xretreat_unit(unit)
XUnit *unit;
X{
X    int dir;
X    bool success;
X
X    dir = random_dir();
X    success = move_to_next(unit, dirx[dir], diry[dir], FALSE, FALSE);
X    return success;
X}
X
X/* This weird-looking routine computes next directions for moving to a */
X/* given spot.  The basic strategy is to prefer to go in the x or y distance */
X/* that is the greatest difference, so as to even the two displacements out. */
X/* (This leaves more options open if blockage several hexes away.)  Make it */
X/* probabilistic, so repeated travel will eventually trace the envelope of */
X/* possible moves.  The number of directions ranges from 1 to 4, depending */
X/* on whether there is a straight-line path to the dest, and whether we are */
X/* required to take a direct path or are allowed to move in dirs that don't */
X/* the unit any closer (we never increase our distance though). */
X/* Some trickinesses:  world is cylindrical, so must resolve ambiguity about */
X/* getting to the same place going either direction (we pick shortest). */
X
X#define left_of(d) (((d) + 5) % 6)
X#define rite_of(d) (((d) + 1) % 6)
X
Xmove_to(unit, tx, ty, shortest)
XUnit *unit;
Xint tx, ty;
Xbool shortest;
X{
X    bool closer, success;
X    int dx, dxa, dy, dist, d1, d2, d3, d4, axis = -1, hextant = -1, tmp;
X
X    dist = distance(unit->x, unit->y, tx, ty);
X    dx = tx - unit->x;  dy = ty - unit->y;
X
X    dxa = (tx + world.width) - unit->x;
X    if (abs(dx) > abs(dxa)) dx = dxa;
X    dxa = (tx - world.width) - unit->x;
X    if (abs(dx) > abs(dxa)) dx = dxa;
X    if (dx == 0 && dy == 0) {
X	wake_unit(unit, FALSE);
X	return FALSE;
X    }
X    axis = hextant = -1;
X    if (dx == 0) {
X	axis = (dy > 0 ? NE : SW);
X    } else if (dy == 0) {
X	axis = (dx > 0 ? EAST : WEST);
X    } else if (dx == (0 - dy)) {
X	axis = (dy > 0 ? NW : SE);
X    } else if (dx > 0) {
X	hextant = (dy > 0 ? EAST : (abs(dx) > abs(dy) ? SE : SW));
X    } else {
X	hextant = (dy < 0 ? WEST : (abs(dx) > abs(dy) ? NW : NE));
X    }
X    if (axis >= 0) {
X	d1 = d2 = axis;
X    }
X    if (hextant >= 0) {
X	d1 = left_of(hextant);
X	d2 = hextant;
X    }
X    d3 = left_of(d1);
X    d4 = rite_of(d2);
X    closer = (shortest || dist == 1);
X    if (flip_coin()) {
X        tmp = d1;  d1 = d2; d2 = tmp;
X    }
X    success = move_to_next(unit, dirx[d1], diry[d1], FALSE, 1);
X    if (!success)
X	success = move_to_next(unit, dirx[d2], diry[d2], closer, 1);
X    if (!success && !closer) {
X	if (opposite_dir(unit->lastdir) == d3) {
X	    success = move_to_next(unit, dirx[d4], diry[d4], TRUE, 1);
X	} else if (opposite_dir(unit->lastdir) == d4) {
X	    success = move_to_next(unit, dirx[d3], diry[d3], TRUE, 1);
X	} else {
X	    success = move_to_next(unit, dirx[d3], diry[d3], FALSE, 1);
X	    if (!success)
X		success = move_to_next(unit, dirx[d4], diry[d4], TRUE, 1);
X	}
X    }
X    return success;
X}
X
X/* This function and a couple auxes encode most of the rules about how */
X/* units can move.  Attempts to move onto other units are handled */
X/* by other functions below.  Unit will also refuse to move onto the edge of */
X/* the map or into the wrong kind of terrain.  Otherwise, it succeeds in its */
X/* movement and we put it at the new spot.  If at any time, the unit */
X/* could not move and yet was supposed to, it will wake up. */
X
Xmove_to_next(unit, dx, dy, mustgo, atk)
XUnit *unit;
Xint dx, dy;
Xbool mustgo, atk;
X{
X    bool offcourse = FALSE, success = FALSE;
X    int nx, ny, newdir, utype = unit->type;
X    Unit *unit2;
X    Side *us = unit->side;
X
X    if (randomness) {
X	offcourse = (random(10000) <
X		     utypes[utype].randommove[terrain_at(unit->x, unit->y)]);
X	if (offcourse) {
X	    newdir = random_dir();
X	    dx = dirx[newdir];  dy = diry[newdir];
X	    notify(us, "%s goes off course...", unit_handle(us, unit));
X	}
X    }
X
X    nx = wrap(unit->x + dx);  ny = unit->y + dy;
X
X    if ((unit2 = unit_at(nx, ny)) != NULL) {
X	success = move_to_unit(unit, unit2, dx, dy, mustgo, atk, offcourse);
X    } else if (!between(1, ny, world.height-2)) {
X	if (global.leavemap) {
X	    kill_unit(unit, DISBAND);
X	} else if (offcourse) {
X	    notify(us, "%s has fallen off the edge of the world!",
X		   unit_handle(us, unit));
X	    kill_unit(unit, DISASTER);
X	} else if (human_order(unit) && mustgo) {
X	    cmd_error(us, "%s can't leave this map!",
X		      unit_handle(us, unit));
X	}
X    } else if (!could_move(utype, terrain_at(nx, ny))) {
X	if (offcourse) {
X	    notify(us, "%s has met with disaster!", unit_handle(us, unit));
X	    kill_unit(unit, DISASTER);
X	} else if (human_order(unit) && mustgo) {
X	    cmd_error(us, "%s won't go into the %s!",
X		      unit_handle(us, unit), ttypes[terrain_at(nx, ny)].name);
X	}
X    } else {
X	move_unit(unit, nx, ny);
X	unit->lastdir = find_dir(dx, dy);
X	success = TRUE;
X    }
X    /* Units don't get dead by failing to move, so test not needed here. */
X    if (!success && mustgo) {
X/*	unit->awake = TRUE;  */
X	wake_unit(unit, FALSE);
X    }
X    return success;
X}
X
X/* An enemy unit will be attacked, unless unit is on a transport *and* it */
X/* cannot move to that hex anyway. */
X/* Also will refuse if hit prob < 10% (can still defend tho) */
X/* If the attackee is destroyed, then unit will attempt to move in again. */
X/* A friendly transport will be boarded unless it is full. */
X/* Blank refusal to move if any other unit. */
X
X/* Allies treat each other's units as their own. */
X
Xmove_to_unit(unit, unit2, dx, dy, mustgo, atk, offcourse)
XUnit *unit, *unit2;
Xint dx, dy;
Xbool mustgo, atk, offcourse;
X{
X    int u = unit->type, u2 = unit2->type, u2x = unit2->x, u2y = unit2->y;
X    Side *us = unit->side;
X
X    if (!allied_side(us, unit2->side)) {
X	if (unit->transport != NULL && impassable(unit, u2x, u2y)) {
X	    if (human_order(unit) && mustgo) {
X		cmd_error(us, "%s can't attack there!", unit_handle(us, unit));
X	    }
X	} else if (side_view(us, u2x, u2y) == EMPTY) {
X	    notify(us, "%s spots something!", unit_handle(us, unit));
X	    see_exact(us, u2x, u2y);
X	    draw_hex(us, u2x, u2y, TRUE);
X	} else if (atk && (unit->orders.flags & ATTACKUNIT)) {
X	    if (!could_hit(u, u2) && !could_capture(u, u2)) {
X		if (human_order(unit) && mustgo) {
X		    cmd_error(us, "%s refuses to attack a %s!",
X			      unit_handle(us, unit), utypes[u2].name);
X		}
X	    } else if (!enough_ammo(unit, unit2)) {
X		if (human_order(unit) && mustgo) {
X		    cmd_error(us, "%s is out of ammo!", unit_handle(us, unit));
X		}
X	    } else {
X		if (attack(unit, unit2)) {
X		    /* if battle won, can try moving again */
X		    return move_to_next(unit, dx, dy, FALSE, FALSE);
X		}
X		return TRUE;
X	    }
X	} else {
X	    /* here if aircraft blocked on return, etc - no action needed */
X	}
X    } else if (could_carry(u2, u)) {
X	if (!can_carry(unit2, unit)) {
X	    if (human_order(unit) && mustgo) {
X		cmd_error(us, "%s is full already!", unit_handle(us, unit2));
X	    }
X	} else {
X	    move_unit(unit, u2x, u2y);
X	    unit->movesleft -= utypes[u].entertime[u2];
X	    unit->lastdir = find_dir(dx, dy);
X	    return TRUE;
X 	}
X    } else if (could_carry(u, u2)) {
X	if (impassable(unit, u2x, u2y)) {
X	    if (human_order(unit) && mustgo) {
X		cmd_error(us, "%s can't pick up anybody there!",
X			  unit_handle(us, unit));
X	    }
X	} else if (!can_carry(unit, unit2)) {
X	    if (human_order(unit) && mustgo) {
X		cmd_error(us, "%s is full already!", unit_handle(us, unit));
X	    }
X	} else if (unit->orders.flags == 0) {
X	    /* blow out at the bottom */
X	} else {
X	    move_unit(unit, u2x, u2y);
X	    unit->lastdir = find_dir(dx, dy);
X	    return TRUE;
X	}
X    } else {
X	if (offcourse) {
X	    notify(us, "%s is involved in a wreck!", unit_handle(us, unit));
X	    kill_unit(unit, DISASTER);
X	    kill_unit(unit2, DISASTER);
X	} else if (human_order(unit) && mustgo) {
X	    cmd_error(us, "%s refuses to attack its friends!",
X		      unit_handle(us, unit));
X	}
X    }
X    return FALSE;
X}
X
X/* Perform the act of moving proper. (very simple, never fails) */
X/* This is also the right place to put in anything that happens if the *
X/* unit actually changes its location. */
X
Xmove_unit(unit, nx, ny)
XUnit *unit;
Xint nx, ny;
X{
X    Side *us = unit->side;
X
X    if (producing(unit) && !utypes[unit->type].maker) {
X	notify(us, "%s moved, cancelling its build!", unit_handle(us, unit));
X	if (active_display(us) && humanside(us)) beep(us);
X	set_product(unit, NOTHING);
X	unit->schedule = 0;
X    }
X    leave_hex(unit);
X    occupy_hex(unit, nx, ny);
X    consume_move_supplies(unit);
X}
X
X/* This routine is too strict, doesn't account for resupply at start of next */
X/* turn.  Hacked to check on transport at least. */
X
Xconsume_move_supplies(unit)
XUnit *unit;
X{
X    int u = unit->type, r;
X    
X    unit->actualmoves++;
X    for_all_resource_types(r) {
X	if (utypes[u].tomove[r] > 0) {
X	    unit->supply[r] -= utypes[u].tomove[r];
X	    if (unit->supply[r] <= 0 && unit->transport == NULL) {
X		exhaust_supply(unit);
X		return;
X	    }
X	}
X    }
X}
X
X/* When doing a survey, you can move the cursor anywhere and it will show */
X/* what is at that hex, but not give away too much! */
X
Xmove_survey(side, nx, ny)
XSide *side;
Xint nx, ny;
X{
X    if (between(1, ny, world.height-2)) {
X	side->curx = nx;  side->cury = ny;
X	make_current(side, unit_at(side->curx, side->cury));
X    } else {
X	if (active_display(side)) beep(side);
X    }
X    put_on_screen(side, side->curx, side->cury);
X    show_info(side);
X}
X
X/* This routine encodes nearly all of the conditions under which a unit */
X/* following orders might wake up and request new instructions. */
X
Xmaybe_wakeup(unit)
XUnit *unit;
X{
X    if (unit->orders.rept <= 0) {
X	wake_unit(unit, FALSE);
X    } else if ((unit->orders.flags & SUPPLYWAKE) && low_supplies(unit)) {
X	wake_unit(unit, TRUE);
X	unit->orders.flags &= ~SUPPLYWAKE;
X    } else if ((unit->orders.flags & ENEMYWAKE) && adj_enemy(unit)) {
X	wake_unit(unit, FALSE);
X    }
X}
X
X/* True if unit is adjacent to an unfriendly. */
X
Xadj_enemy(unit)
XUnit *unit;
X{
X    int d, x, y, view;
X
X    for_all_directions(d) {
X	x = wrap(unit->x + dirx[d]);  y = unit->y + diry[d];
X	if (!neutral(unit)) {
X	    view = side_view(unit->side, x, y);
X	    if (view != EMPTY && enemy_side(side_n(vside(view)), unit->side))
X		return TRUE;
X	}
X    }
X    return FALSE;
X}
END_OF_move.c
if test 22132 -ne `wc -c <move.c`; then
    echo shar: \"move.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f standard.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"standard.c\"
else
echo shar: Extracting \"standard.c\" \(28946 characters\)
sed "s/^X//" >standard.c <<'END_OF_standard.c'
X#include "config.h"
X#include "period.h"
X
XPeriod period = { "WW II ca 1945", NULL, "standard", 100, 3, 8, 48,
X 13, 2, 9, 115, 671, 12, 0, 0, 0, 1, 50, -50, 0, 0, 0,
X 80, 70, -1, 7, 1, 50 };
X
XUtype utypes[MAXUTYPES] = {
X{ 'i', "infantry", "marches around and captures things", NULL, "",
X  0, 0, 0, 0,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100,  },
X  0, 0, 0, 1, "suffers attrition", "has an accident",
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 20, 0, 
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,  },
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, "runs out of supplies and dies",
X  { 1, 0,  },
X  { 0, 0, 0, 0, 100, 100, 0, 0, 0,  },
X  { 6, 6,  },
X  { 1, 0,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  0, 1, 0, 0,
X  { -1, -1, -1, 0, 0, 0, 0, -1, -1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0,  },
X  1, 20,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,  },
X  0, 100, 100, 1, 100,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 1, 0, 0, 0, 0, 0, 0, 1, 0, "defeats",
X  { 50, 40, 20, 15, 20, 20, 30, 20, 9, 40, 80, 60, 40,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 1,  },
X  { 0, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 70, 50, 30,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 0, 0, 0, 0, 0, 0, 100, 1
X },
X{ 'a', "armor", "faster than infantry, limited to open terrain", NULL, "",
X  0, 0, 0, 0,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100,  },
X  0, 0, 0, 1, "suffers attrition", "has an accident",
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 20, 0, 
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0,  },
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, "runs out of supplies and dies",
X  { 2, 0,  },
X  { 0, 0, 0, 0, 100, 0, 0, 0, 0,  },
X  { 10, 4,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  0, 2, 0, 0,
X  { -1, -1, -1, 0, 0, -1, -1, -1, -1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 0,  },
X  1, 20,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,  },
X  0, 100, 100, 1, 100,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 1, 0, 0, 0, 1, 0, 0, 1, 0, "defeats",
X  { 60, 50, 30, 30, 30, 20, 30, 20, 20, 50, 90, 70, 50,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,  },
X  { 0, 1,  },
X  { 0, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 70, 50,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 1, 0, 0, 0, 0, 0, 100, 1
X },
X{ 'f', "fighter", "interceptor to get those nasty bombers", NULL, "",
X  0, 0, 0, 0,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100,  },
X  0, 0, 0, 1, "suffers attrition", "has an accident",
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 20, 0, 
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, "runs out of supplies and dies",
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 18, 3,  },
X  { 3, 0,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  0, 9, 0, 0,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 0,  },
X  0, 20,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,  },
X  0, 100, 100, 1, 100,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 1, 0, 0, 0, 1, 0, 0, 1, 0, "shoots down",
X  { 15, 25, 60, 70, 20, 30, 20, 50, 40, 80, 100, 100, 100,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 1,  },
X  { 0, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 1, 0, 0, 0, 0, 0, 100, 1
X },
X{ 'b', "bomber", "long range aircraft, carries infantry and bombs", NULL, "",
X  0, 0, 0, 0,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100,  },
X  0, 0, 0, 1, "suffers attrition", "has an accident",
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 20, 0, 
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, "runs out of supplies and dies",
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 36, 3,  },
X  { 2, 0,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  0, 6, 0, 0,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 0,  },
X  0, 20,
X  { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,  },
X  { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,  },
X  0, 100, 100, 1, 100,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 2, 1, 0, 0, 1, 0, 0, 1, 0, "shoots down",
X  { 20, 20, 10, 9, 30, 50, 50, 70, 60, 50, 90, 95, 99,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 2, 2, 3,  },
X  { 0, 1,  },
X  { 0, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 1, 0, 0, 0, 0, 0, 100, 1
X },
X{ 'd', "destroyer", "fast, cheap, and sinks subs", NULL, "",
X  0, 0, 0, 0,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100,  },
X  0, 0, 0, 1, "suffers attrition", "has an accident",
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 20, 0, 
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, "runs out of supplies and dies",
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 20,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  0, 3, 0, 0,
X  { 0, 0, -1, -1, -1, -1, -1, -1, -1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 0,  },
X  0, 20,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,  },
X  0, 100, 100, 1, 100,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 3, 1, 0, 0, 1, 0, 0, 1, 0, "sinks",
X  { 5, 5, 10, 5, 60, 70, 60, 40, 20, 0, 99, 90, 80,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 1,  },
X  { 0, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 1, 0, 0, 0, 0, 0, 100, 1
X },
X{ 's', "submarine", "sneaks around and sinks ships", NULL, "",
X  0, 0, 0, 0,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100,  },
X  0, 0, 0, 1, "suffers attrition", "has an accident",
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 20, 0, 
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, "runs out of supplies and dies",
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 10,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  0, 3, 0, 0,
X  { 0, 0, -1, -1, -1, -1, -1, -1, -1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 0,  },
X  0, 20,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,  },
X  0, 100, 100, 1, 0,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 2, 1, 0, 0, 1, 0, 0, 1, 0, "sinks",
X  { 0, 0, 10, 5, 40, 10, 60, 40, 50, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 3, 3, 3, 3, 4, 1, 1, 1, 1,  },
X  { 0, 1,  },
X  { 0, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 1, 0, 0, 0, 0, 0, 100, 1
X },
X{ 't', "troop transport", "carries infantry and armor across the pond", NULL, "",
X  0, 0, 0, 0,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100,  },
X  0, 0, 0, 1, "suffers attrition", "has an accident",
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 20, 0, 
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, "runs out of supplies and dies",
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 200, 20,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  0, 2, 0, 0,
X  { 0, 0, -1, -1, -1, -1, -1, -1, -1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 0,  },
X  0, 6,
X  { 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,  },
X  0, 100, 100, 1, 100,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 3, 2, 0, 0, 1, 0, 0, 1, 0, "sinks",
X  { 20, 5, 10, 5, 50, 50, 40, 30, 9, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 1,  },
X  { 0, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 1, 0, 0, 0, 0, 0, 100, 1
X },
X{ 'C', "carrier", "carries fighters and bombers around", NULL, "",
X  0, 0, 1, 0,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100,  },
X  0, 0, 0, 1, "suffers attrition", "has an accident",
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 20, 0, 
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0,  },
X  0, "runs out of supplies and dies",
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 200, 40,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  0, 4, 0, 0,
X  { 0, 2, -1, -1, -1, -1, -1, -1, -1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 0,  },
X  0, 20,
X  { 0, 0, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,  },
X  0, 100, 100, 1, 100,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 4, 2, 0, 0, 1, 0, 0, 1, 0, "sinks",
X  { 30, 20, 40, 10, 30, 30, 40, 20, 20, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 1,  },
X  { 0, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 1, 0, 0, 0, 0, 0, 100, 1
X },
X{ 'B', "battleship", "the most powerful ship", NULL, "",
X  0, 0, 1, 0,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100,  },
X  0, 0, 0, 1, "suffers attrition", "has an accident",
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 20, 0, 
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0,  },
X  0, "runs out of supplies and dies",
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 200, 40,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  0, 4, 0, 0,
X  { 0, 2, -1, -1, -1, -1, -1, -1, -1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 0,  },
X  0, 20,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,  },
X  0, 100, 100, 1, 100,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 8, 2, 0, 0, 1, 0, 0, 1, 0, "sinks",
X  { 50, 50, 50, 20, 70, 50, 90, 50, 90, 0, 100, 100, 100,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4,  },
X  { 0, 1,  },
X  { 0, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 1, 0, 0, 0, 0, 0, 100, 1
X },
X{ 'N', "atomic bomb", "leveler of cities (and anything else)", NULL, "",
X  0, 0, 1, 0,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100,  },
X  0, 0, 0, 1, "suffers attrition", "has an accident",
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 20, 300, 
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, "runs out of supplies and dies",
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  0, 1, 0, 0,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0,  },
X  0, 20,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,  },
X  0, 100, 100, 1, 10,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 1, 0, 0, 1, 1, 0, 0, 0, 0, "destroys",
X  { 100, 100, 100, 100, 100, 100, 100, 100, 100, 0, 100, 100, 100,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,  },
X  { 0, 1,  },
X  { 0, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 1, 0, 0, 0, 0, 0, 100, 1
X },
X{ '/', "base", "airstrip plus port", NULL, "",
X  0, 0, 1, 0,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100,  },
X  0, 0, 0, 1, "suffers attrition", "has an accident",
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 20, 0, 
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, "runs out of supplies and dies",
X  { 10, 5,  },
X  { 0, 0, 0, 20, 100, 50, 20, 0, 0,  },
X  { 200, 100,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  0, 0, 0, 0,
X  { -1, -1, -1, 0, 0, 0, 0, -1, -1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0,  },
X  0, 20,
X  { 2, 2, 4, 4, 2, 2, 2, 2, 2, 2, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,  },
X  0, 100, 100, 1, 100,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 10, 5, 0, 0, 1, 0, 0, 1, 0, "flattens",
X  { 10, 10, 20, 20, 20, 20, 30, 20, 20, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 1,  },
X  { 0, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0,  },
X  1, 1, 0, 0, 0, 0, 0, 100, 1
X },
X{ '*', "town", "smaller than a city", NULL, "",
X  5, 100, 1, 0,
X  { 0, 0, 0, 20, 40, 20, 20, 0, 0,  },
X  { 100, 100,  },
X  0, 0, 0, 1, "suffers attrition", "has an accident",
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  1, 20, 0, 
X  { 4, 7, 8, 16, 10, 16, 12, 30, 40, 20, 0, 0, 0,  },
X  { 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  0, "runs out of supplies and dies",
X  { 20, 10,  },
X  { 0, 0, 0, 20, 100, 50, 20, 0, 0,  },
X  { 500, 200,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  0, 0, 0, 0,
X  { -1, -1, -1, 0, 0, 0, 0, -1, -1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0,  },
X  0, 20,
X  { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,  },
X  1, 100, 100, 1, 100,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 20, 10, 0, 0, 1, 0, 0, 1, 0, "flattens",
X  { 30, 20, 50, 40, 40, 0, 30, 20, 20, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 1,  },
X  { 0, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0,  },
X  5, 1, 0, 0, 0, 0, 0, 100, 0
X },
X{ '@', "city", "capital of a side", NULL, "",
X  1, 0, 1, 0,
X  { 0, 0, 0, 0, 100, 0, 0, 0, 0,  },
X  { 100, 100,  },
X  0, 0, 0, 1, "suffers attrition", "has an accident",
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  1, 20, 0, 
X  { 4, 7, 8, 16, 10, 16, 12, 30, 40, 20, 0, 0, 0,  },
X  { 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  0, "runs out of supplies and dies",
X  { 50, 20,  },
X  { 0, 0, 0, 20, 100, 50, 20, 0, 0,  },
X  { 900, 400,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  { 0, 0,  },
X  0, 0, 0, 0,
X  { -1, -1, -1, 0, 0, 0, 0, -1, -1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0,  },
X  0, 20,
X  { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,  },
X  1, 100, 100, 1, 100,
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  0, 40, 20, 0, 0, 1, 0, 0, 1, 0, "flattens",
X  { 50, 40, 70, 60, 50, 0, 30, 20, 50, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  },
X  { 0, 1,  },
X  { 0, 1,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  },
X  { 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0,  },
X  25, 1, 0, 0, 0, 0, 0, 100, 0
X },
X};
X
XRtype rtypes[MAXRTYPES] = {
X{ 'F', "fuel", "basic motive power" },
X{ 'A', "ammo", "generic hitting capability" },
X};
X
XTtype ttypes[MAXTTYPES] = {
X{ '.', "sea", "sky blue",
X  0, 0, 0, 68, 0, 100, 0, 0 },
X{ ',', "shallows", "cyan",
X  0, 1, 68, 69, 0, 100, 0, 0 },
X{ '=', "swamp", "cyan",
X  0, 2, 69, 71, 50, 100, 0, 0 },
X{ '~', "desert", "yellow",
X  0, 3, 70, 93, 0, 20, 0, 0 },
X{ '+', "plains", "green",
X  0, 3, 70, 93, 20, 80, 0, 0 },
X{ '%', "forest", "forest green",
X  0, 3, 70, 93, 80, 100, 0, 0 },
X{ '^', "mountains", "sienna",
X  0, 6, 93, 99, 0, 100, 0, 0 },
X{ '_', "ice", "white",
X  0, 6, 99, 100, 0, 100, 0, 0 },
X{ ':', "vacuum", "black",
X  1, 8, 0, 0, 0, 0, 0, 0 },
X};
X
Xchar *snames[MAXSNAMES] = {
X"American", "Canadian", "Mexican", "Guatemalan", "Honduran", 
X"Sandinista", "Costa Rican", "Panamanian", "Colombian", "Ecuadorean", 
X"Peruvian", "Chilean", "Argentinian", "Uruguayan", "Paraguayan", 
X"Brazilian", "Bolivian", "Guyanan", "Venezuelan", "Cuban", 
X"Haitian", "Jamaican", "Irish", "British", "Portuguese", 
X"Spanish", "French", "Italian", "Albanian", "Greek", 
X"Turk", "Bulgarian", "Cypriot", "Maltese", "Icelander", 
X"Rumanian", "Soviet", "Finnish", "Swedish", "Polish", 
X"Czech", "Hungarian", "Austrian", "German", "Swiss", 
X"Belgian", "Dutch", "Danish", "Norwegian", "Moroccan", 
X"Mauritanian", "Senegalese", "Guinean", "Liberian", "Ghanan", 
X"Nigerian", "Cameroon", "Gabonese", "Zairean", "Angolan", 
X"Namibian", "South African", "Botswanan", "Mozambiquan", "Zimbabwean", 
X"Zambian", "Tanzanian", "Rwandan", "Djiboutian", "Madagascaran", 
X"Kenyan", "Ugandan", "Somalian", "Ethiopian", "Sudanese", 
X"Egyptian", "Libyan", "Tunisian", "Algerian", "Syrian", 
X"Lebanese", "Israeli", "Jordanian", "Saudi", "Yemeni", 
X"Omani", "Kuwaiti", "Iraqi", "Iranian", "Afghan", 
X"Pakistani", "Indian", "Nepalese", "Burmese", "Vietnamese", 
X"Kampuchean", "Laotian", "Siamese", "Malaysian", "Indonesian", 
X"Australian", "Micronesian", "Fijian", "Tongan", "Samoan", 
X"Tahitian", "New Zealander", "Papuan", "Polynesian", "Filipino", 
X"Japanese", "Korean", "Chinese", "Mongolian", "Tibetan", };
X
Xchar *unames[MAXUNAMES] = {
X"Uglegorsk", "Taganrog", "Kuzemino", "Igodovo", "Izhevsk", 
X"Leninskoye", "Zvenigorod", "Faustovo", "Tokma", "Bolotnoje", 
X"Pudino", "Predivinsk", "Gotoputovo", "Stupino", "Toyooka", 
X"Kobayashi", "Kamiyahagi", "Fukude", "Dandong", "Xingtai", 
X"Xiaojiagang", "Wushu", "Wutangjie", "Qingfeng", "Dushikou", 
X"Huilong", "Linyi", "Miaoyang", "Xinbo", "Bugt", 
X"Tan-an", "Ban Khlong Kua", "Bo Phloi", "Thot-not", "Herbertabad", 
X"Mong Pawn", "Roi Et", "Butong", "Lubukbertubung", "Moutong", 
X"Gimpu", "Waingapu", "Sindangbarang", "Kualakapuas", "Bongka", 
X"Salimbatu", "Bonggaw", "Baing", "Grokgak", "Bap", 
X"Meerut", "Harda", "Garwa", "Digboi", "Kurnool", 
X"Nirmal", "Coondapoor", "Tetulbaria", "Maheshwar", "Paramagudi", 
X"Bhakkar", "Mungaoli", "Shorapur", "Channapatna", "Chilaw", 
X"Bajandalaj", "Cogt-Ovoo", "Un't", "Ich-Uul", "Yazd", 
X"Samarkand", "Mashhad", "Chah Bahar", "Jubbah", "Al-'Awsajiyah", 
X"Kifri", "Kashgar", "Chundzha", "Ushtobe", "Dzaamar", 
X"Wadi Musa", "Bogustan", "Gakuch", "Pibor Post", "Umm Digulgulaya", 
X"Umm Shalil", "Buzaymah", "Gedo", "North Horr", "Todenyang", 
X"Madadi", "Ngetera", "Ouadda", "Mazoula", "Tiglit", 
X"Gummi", "Gbarnga", "Burutu", "Bafwabalinga", "Goonda", 
X"Ankoroka", "Vryburg", "Matuba", "Bakouma", "El Idrissia", 
X"Agadir", "Nungwe", "Bunianga", "Ngali", "Nguiroungou", 
X"Otukpa", "Hell-Ville", "Morafenobe", "Tongobory", "Farafangana", 
X"Mungbere", "Haco", "Barbar", "Oulessebougou", "Nookawarra", 
X"Bunbury", "Buckleboo", "Breeza Plains", "Mistake Creek", "Boolaloo", 
X"Yarloop", "Dubbo", "Bushy Park", "Old Cork", "Cessnock", 
X"Wagga Wagga", "Mungar Junction", "Koolywirtie", "Wonthaggi", "Oatlands", 
X"Bindebango", "Alice Springs", "Kwatisore", "Finschhafen", "Yobi", 
X"Rumahtinggih", "New Hope", "Hackleburg", "Kaktovik", "Fort Yukon", 
X"Benson", "Gila Bend", "Turkey Flat", "Tuba City", "Wide Ruins", 
X"Metalton", "Oil Trough", "Hackett", "Burnt Ranch", "Calexico", 
X"Eel Rock", "Gilroy", "Joshua Tree", "Milpitas", "Mormon Bar", 
X"Pumpkin Center", "Death Valley Junction", "Toms Place", "Pinole", "Petaluma", 
X"Scotts Valley", "Whiskeytown", "Leucadia", "Lompoc", "Granada Hills", 
X"Las Animas", "Silver Plume", "Upper Stepney", "Moosup", "Danbury", 
X"Yeehaw Junction", "Big Pine Key", "Panacea", "Wewahitchka", "Estiffanulga", 
X"Dixie Unameion", "Fowlstown", "Dacula", "Americus", "Laupahoehoe", 
X"Malad City", "Kootenai", "Farmer City", "Aroma Park", "Goreville", 
X"Illiopolis", "Mascoutah", "Metamora", "Metropolis", "New Boston", 
X"Pontoon Beach", "Romeoville", "Teutopolis", "Etan Green", "French Lick", 
X"Loogootee", "Needmore", "Ogden Dunes", "Oolitic", "Star City", 
X"Coon Rapids", "Correctionville", "Grundy Center", "Lost Nation", "Ossian", 
X"Sac City", "Countryside", "Mankato", "Pretty Prairie", "Greeley", 
X"Grouse Creek", "Big Clifty", "Cloverport", "Druid Hills", "Fancy Farm", 
X"Hardburly", "Hardshell", "Horse Cave", "Pleasureville", "Science Hill", 
X"Sublimity City", "Watergap", "Bayou Goula", "Cut Off", "Hackberry", 
X"Lutcher", "Waggaman", "Veazie", "Madawaska", "Bestgate", 
X"College Park", "Frostburg", "Pocomoke City", "Port Deposit", "Pumphrey", 
X"Tammany Manor", "Weems Creek", "Whiskey Bottom", "Hack Point", "Assinippi", 
X"Buzzards Bay", "Dorothy Pond", "Hopkinton", "Housatonic", "Pigeon Cove", 
X"Swampscott", "Gloucester", "Hyannis Port", "Ipswich", "Boxford", 
X"Bad Axe", "Brown City", "Cassopolis", "New Buffalo", "Petoskey", 
X"Ishpeming", "Ypsilanti", "Saugatuck", "Skanee", "Bruce Crossing", 
X"Baraga", "Germfask", "Assinins", "Tapiola", "Gaastra", 
X"Bete Grise", "Ada", "Blue Earth", "Brainerd", "Eden Valley", 
X"Lino Lakes", "New Prague", "Sleepy Eye", "Waconia", "Bogue Chitto", 
X"Buckatunna", "Guntown", "Picayune", "Red Lick", "Senatobia", 
X"Tie Plant", "Yazoo City", "Bourbon", "Doe Run", "Hayti", 
X"Humansville", "Lutesville", "Moberly", "New Madrid", "Peculiar", 
X"Sappington", "Vandalia", "Big Sandy", "Hungry Horse", "Kalispell", 
X"East Missoula", "Hershey", "Loup City", "Minatare", "Wahoo", 
X"Grainfield", "Winnemucca", "Tonopah", "Jackpot", "Littleton", 
X"Winnisquam", "Cheesequake", "Freewood Acres", "Forked River", "Hoboken", 
X"Succasunna", "Maple Shade", "New Egypt", "Parsippany", "Ship Bottom", 
X"Adobe Acres", "Cloudcroft", "Ruidoso", "Toadlena", "Los Padillos", 
X"Ojo Caliente", "Angola on the Lake", "Podunk", "Chili Center", "Aquebogue", 
X"Muttontown", "Hicksville", "Hoosick Falls", "Nyack", "Painted Post", 
X"Peekskill", "Portville", "Ronkonkoma", "Wappingers Falls", "Sparrow Bush", 
X"Swan Lake", "Altamahaw", "Biltmore Forest", "Boger City", "Granite Quarry", 
X"High Shoals", "Lake Toxaway", "Scotland Neck", "Hiddenite", "Mocksville", 
X"Yadkinville", "Nags Head", "Kill Devil Hills", "Rural Hall", "Cannon Ball", 
X"Hoople", "Zap", "Academia", "Arcanum", "Blacklick Estates", 
X"Blue Ball", "Crooksville", "Dry Run", "Flushing", "Gratis", 
X"Lithopolis", "Mingo Junction", "Newton Falls", "New Straitsville", "Painesville", 
X"Pepper Pike", "Possum Woods", "Sahara Sands", "Bowlegs", "Broken Arrow", 
X"Fort Supply", "Drumright", "Dill City", "Okay", "Hooker", 
X"Condon", "Happy Valley", "Drain", "Junction City", "Molalla", 
X"Philomath", "Tillamook", "Wankers Corner", "Atlasburg", "Beaver Meadows", 
X"Birdsboro", "Daisytown", "Fairless Hills", "Fairchance", "Kutztown", 
X"Erdenheim", "Hyndman", "Pringle", "Scalp Level", "Slickville", 
X"Zelienople", "Sugar Notch", "Toughkenamon", "Throop", "Tire Hill", 
X"Wormleysburg", "Oleopolis", "Woonsocket", "Pawtucket", "Due West", 
X"Ninety Six", "Travelers Rest", "Ware Shoals", "Deadwood", "Lower Brule", 
X"New Underwood", "Pickstown", "Plankinton", "Tea", "Yankton", 
X"Berry's Chapel", "Bulls Gap", "Cornersville", "Counce", "Gilt Edge", 
X"Grimsley", "Malesus", "Soddy-Daisy", "Bastrop", "New Braunfels", 
X"Harlingen", "Dimock", "Devils Elbow", "North Zulch", "Llano", 
X"Fort Recovery", "Arp", "Bovina", "Cut and Shoot", "College Station", 
X"Grurer", "Iraan", "Leming", "Harlingen", "Muleshoe", 
X"Munday", "Kermit", "La Grange", "Ropesville", "Wink", 
X"Yoakum", "Sourlake", "Delta", "Moab", "Nephi", 
X"Loa", "Moroni", "Orem", "Tooele", "Sigurd", 
X"Bellows Falls", "Chester Depot", "Winooski", "Accotink", "Ben Hur", 
X"Ferry Farms", "Disputanta", "Dooms", "Sleepy Hollow", "Max Meadows", 
X"Goochland", "Rural Retreat", "Sandston", "Stanleytown", "Willis Wharf", 
X"Stuarts Draft", "Black Diamond", "Carnation", "Cle Elum", "Cosmopolis", 
X"Darrington", "Enumclaw", "Forks", "Goose Prairie", "Navy Yard City", 
X"La Push", "Soap Lake", "Walla Walla", "Sedro Woolley", "Pe Ell", 
X"Ruston", "Barrackville", "Pocatalico", "Fort Gay", "Big Chimney", 
X"Nutter Fort", "Hometown", "Nitro", "Triadelphia", "Star City", 
X"Combined Lock", "Coon Valley", "Black Earth", "New Holstein", "Little Chute", 
X"Wisconsin Dells", "Random Lake", "Sheboygan", "Nauwatosa", "East Thermopolis", 
X"Fort Washakie", "Paradise Valley", "Sexsmith", "Squamish", "Fort Qu'Appelle", 
X"Flin Flon", "Moose Jaw", "Grand-Mere", "Great Village", "Pugwash", 
X"Chiliwack", "Cranbery Portage", "Moosonee", "Joe Batt's Arm", "St.-Polycarpe", 
X"Crabtree Mills", "Copper Cliff", "Uxbridge", "Penetanguishene", "Boger City", 
X"Drumheller", "Port Blandford", "Hamtramck", "Hackensack", "North Middleboro", 
X"Fannettsburg", "Corkscrew", "Boynton Beach", "Belchertown", "Huatabampo", 
X"Zapotiltic", "Ipiranga", "Perseverancia", "Bilwaskarma", "Aguadulce", 
X"Albert Town", "Fuente de Oro", "Pedras de Fogo", "Maxaranguape", "Comodoro Rivadavia", 
X"Coribe", "Rossell y Rius", "General Alvear", "Ushaia", "Los Antiguos", 
X"Puerto Alegre", "Quevedo", "Kannonkoski", "Uusikaupunki", "Ulfborg", 
X"Wloszczowa", "Drohiczyn", "Vrchlabi", "Oroshaza", "Klagenfurt", 
X"Pisz", "Krokowa", "Partizanske", "Ozd", "Jimbolia", 
X"Peshkopi", "Galaxidhion", "Naxos", "Thingvellir", "Honningsvag", 
X"Vikna", "Jokkmokk", "Rimbo", "Kukkola", "Viitasaari", 
X"Guderup", "Grindsted", "Store Andst", "Odder", "Vrigstad", 
X"Trollhaetten", "Kinsarvik", "Grimstad", "Ballybunion", "Banagher", 
X"Carncastle", "Lisp", "Knokke", "Bialy", "Bor", 
X"Hel", "Puck", "Diepholz", "Sangerhausen", "Biedenkopf", 
X"Mosbach", "Butzbach", "Goslar", "Studenka", "Slavonice", 
X"Gouda", "Dokkum", "Oss", "Bad Bramstedt", "Dinkelsbuehl", 
X"Hoogezand", "Schoensee", "Fuerstenfeldbruck", "Pfaffenhausen", "Namlos", 
X"Bad Hall", "Consdorf", "Cloppenburg", "Bad Muskau", "Exing", 
X"Bois-d'Arcy", "Presles-en-Brie", "Silly-le-Long", "Saint-Witz", "Limoux", 
X"Crozon", "Guilvinec", "Poggibonsi", "Pignans", "La Tour-du-Pin", 
X"Roquefort", "Saint-Quentin", "Bobbio", "Viareggio", "Siderno", 
X"Cortona", "Pedrogao Grande", "Villarcayo", "Alosno", "La Bisbal", 
X"Cold Norton", "Potten End", "Battlesbridge", "Fawkham Green", "Ysbyty Ystwyth", 
X"Bletchley", "Llanbrynmair", "St Keverne", "Foxholes", "Whitby", 
X"Sutton-on-Sea", "Tweedmouth", "Wrexham", "Kirkwall", "Blair Atholl", 
X"Inchbare", "Blackwaterfoot", "Ramsgate", "Llantwit Major", "Minehead", 
X"Buckfastleigh", "Pocklington", "Robin Hood's Bay", "West Kilbride", "Inchnadamph", 
X"North Tolsta", "Oykel Bridge", "Pangbourne", "Moreton-in-Marsh", "Wye", 
X"Congresbury", };
END_OF_standard.c
if test 28946 -ne `wc -c <standard.c`; then
    echo shar: \"standard.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 6 \(of 18\).
cp /dev/null ark6isdone
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