Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

v22i134: xsokoban - Simple but complex move the stones game, Part01/08

23 views
Skip to first unread message

Andrew Myers

unread,
Nov 3, 1994, 10:30:17 AM11/3/94
to
Submitted-by: an...@tonic.lcs.mit.edu (Andrew Myers)
Posting-number: Volume 22, Issue 134
Archive-name: xsokoban/part01
Environment: X11, game
Supersedes: xsokoban: Volume 21, Issue 98-104

This is Xsokoban version 3.2e with WWW support

Xsokoban is a tricky puzzle game with 90 difficult levels to solve.
Once you've solved a level, there's still the puzzle of solving it
optimally. The code has been tested on a variety of operating systems
and compilers.

Improvements over the previous release (3.1b) are:

- Xsokoban now (optionally) stores scores at a global WWW site. The
site is http://clef.lcs.mit.edu/~andru/xsokoban.html. Hundreds of
users have already stored scores there, providing significant
competition.
- The build process now uses autoconf, making it easier to build.
- Score entries have dates.
- Bugs for black & white displays are fixed.
- Much faster startup due to optimized pixmaps.
- The old checkpointing commands (c, ^U) have been added back in,
supplementing the existing infinite undo.

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".
# Contents: xsokoban xsokoban/bitmaps xsokoban/bitmaps/defaults
# xsokoban/config.h xsokoban/configure xsokoban/errors.h
# xsokoban/screens
# Wrapped by chris@sparky on Thu Nov 3 09:23:49 1994
PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:
echo ' "shar: End of archive 1 (of 8)."'
if test ! -d 'xsokoban' ; then
echo shar: Creating directory \"'xsokoban'\"
mkdir 'xsokoban'
fi
if test ! -d 'xsokoban/bitmaps' ; then
echo shar: Creating directory \"'xsokoban/bitmaps'\"
mkdir 'xsokoban/bitmaps'
fi
if test ! -d 'xsokoban/bitmaps/defaults' ; then
echo shar: Creating directory \"'xsokoban/bitmaps/defaults'\"
mkdir 'xsokoban/bitmaps/defaults'
fi
if test -f 'xsokoban/config.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/config.h'\"
else
echo shar: Extracting \"'xsokoban/config.h'\" \(4932 characters\)
sed "s/^X//" >'xsokoban/config.h' <<'END_OF_FILE'
X/***********************************************************************
X Configuration variables for xsokoban
X
X You may wish to alter the directory paths, particularly ROOTDIR.
X
X Note that the string concatenation performed below requires an
X ANSI-standard preprocessor. If you don't have one, you'll have to
X manually edit SCREENPATH, SAVEPATH, etc. to start with ROOTDIR.
X***********************************************************************/
X
X/*
X ROOTDIR: The directory below which the xsokoban data files, such as
X the bitmaps, score file, and saved games, are stored. I
X suggest "/usr/local/lib/xsokoban" as a value for this
X variable in the installed version, but you know best...
X*/
X#ifndef ROOTDIR
X#define ROOTDIR "."
X#endif
X
X/*
X SCREENPATH: the name of the directory where the screen files are held
X*/
X#ifndef SCREENPATH
X#define SCREENPATH ROOTDIR "/screens"
X#endif
X
X/*
X SAVEPATH: the name of the path where save files are held
X Attention: Be sure that there are no other files with
X the name <username>.sav
X*/
X#ifndef SAVEPATH
X#define SAVEPATH ROOTDIR "/saves"
X#endif
X
X/*
X BITPATH: the full pathname to the bitmap/pixmap file defaults.
X*/
X#ifndef BITPATH
X#define BITPATH ROOTDIR "/bitmaps/defaults"
X#endif
X
X/*
X LOCKPATH: temporary file which is created to ensure that no users
X work with the scorefile at the same time. It should be
X in the same directory as the score file.
X*/
X#ifndef LOCKFILE
X#define LOCKFILE ROOTDIR "/scores/lock"
X#endif
X
X/*
X SCOREFILE: the full pathname of the score file
X*/
X#ifndef SCOREFILE
X#define SCOREFILE ROOTDIR "/scores/scores"
X#endif
X
X/*
X USE_XPM: Look for color pixmaps to define the appearance of the
X game. This requires that you have the XPM library, which
X reads in ".xpm" files and produces pixmaps.
X*/
X#ifndef USE_XPM
X#define USE_XPM 1
X#endif
X
X/*
X MAXUSERNAME: defines the maximum length of a system's user name
X*/
X#define MAXUSERNAME 32
X
X/*
X MAXSCOREENTRIES: defines the maximum number of entries in the scoretable
X*/
X#define MAXSCOREENTRIES 20000
X
X/*
X SUPERUSER: defines the name of the local game owner. Almost never "root"!
X*/
X#ifndef SUPERUSER
X#define SUPERUSER "andru"
X#endif
X
X/*
X PASSWORD: defines the password necessary for creating a new score file
X*/
X#ifndef PASSWORD
X#define PASSWORD "score"
X#endif
X
X/*
X ANYLEVEL: Allow any user to play any level and enter a score for it
X*/
X#define ANYLEVEL 0
X
X/*
X MAXSOLNRANK: The maximum solution rank for which an entry is retained
X in the score table.
X*/
X#define MAXSOLNRANK 10
X
X/*
X STACKDEPTH: Number of previous positions remembered in the move stack
X*/
X#define STACKDEPTH 1000
X
X/*
X TIMEOUT: How long a lock can be held on the score file, in seconds.
X Doesn't matter if WWW == 1.
X*/
X#define TIMEOUT 10
X
X/*
X SLEEPLEN: Amount of time to sleep for between moves of the man,
X in msec.
X*/
X#define SLEEPLEN 8
X
X/*
X WWW: Use WWW to store the score file and screens for you.
X
X Below, you will find definitions that will allow xsokoban to connect
X to an public xsokoban server maintained by Andrew Myers. The xsokoban
X home page is at
X
X http://clef.lcs.mit.edu/~andru/xsokoban.html
X
X In order to create your own WWW xsokoban score server, a few small
X shell scripts must be used; they are not provided in this
X distribution, but can be obtained on request from an...@lcs.mit.edu.
X*/
X#ifndef WWW
X#define WWW 1
X#endif
X
X/*
X WWWHOST: Host where WWW scores are stored
X*/
X#ifndef WWWHOST
X#define WWWHOST "clef.lcs.mit.edu"
X#endif
X
X/*
X WWWPORT: Port at WWWHOST
X*/
X#ifndef WWWPORT
X#define WWWPORT 80
X#endif
X
X/* HERE: Your local domain. This string will be appended to every user
X name that is sent to the WWW sokoban server, in order to avoid collisions.
X Change it!
X
X For example, if you are at Stanford, a good value for HERE would be
X "@stanford.edu". Making HERE specific to individual machines is a
X bad idea.
X
X Usernames that are specified through the "xsokoban.username" resource
X do not have HERE appended to them.
X*/
X#ifndef HERE
X#define HERE "@somewhere.somedomain"
X#endif
X
X/*
X WWWSCOREPATH: Path to access in order to store scores. $L means the
X current level number, $M is the string of moves, $U is the user name,
X $N is the length of the string of moves.
X*/
X#ifndef WWWSCORECOMMAND
X#define WWWSCORECOMMAND "POST /cgi-bin/sok-solve?$L,$U HTTP/1.0\n" \
X "Content-type: text/plain\n" \
X "Content-length: $N\n" \
X "\n" \
X "$M\n"
X#endif
X
X#ifndef WWWREADSCORECMD
X#define WWWREADSCORECMD "GET /cgi-bin/sok-scores HTTP/1.0\n\n"
X#endif
X
X/*
X WWWSCREENPATH: Path to access in order to get screen files. $L
X means the requested level number. Not currently used.
X*/
X#ifndef WWWSCREENPATH
X#define WWWSCREENPATH "GET /cgi-bin/sok-screens?level=$L HTTP/1.0\n\n"
X#endif
END_OF_FILE
if test 4932 -ne `wc -c <'xsokoban/config.h'`; then
echo shar: \"'xsokoban/config.h'\" unpacked with wrong size!
fi
# end of 'xsokoban/config.h'
fi
if test -f 'xsokoban/configure' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/configure'\"
else
echo shar: Extracting \"'xsokoban/configure'\" \(41490 characters\)
sed "s/^X//" >'xsokoban/configure' <<'END_OF_FILE'
X#!/bin/sh
X# Guess values for system-dependent variables and create Makefiles.
X# Generated automatically using autoconf version 1.11
X# Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
X
X# This configure script is free software; you can redistribute it and/or
X# modify it under the terms of the GNU General Public License as published
X# by the Free Software Foundation; either version 2, or (at your option)
X# any later version.
X
X# This script is distributed in the hope that it will be useful, but
X# WITHOUT ANY WARRANTY; without even the implied warranty of
X# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
X# Public License for more details.
X
X# You should have received a copy of the GNU General Public License
X# along with this program; if not, write to the Free Software
X# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
X
X# Save the original args to write them into config.status later.
Xconfigure_args="$*"
X
X# Only options that might do something get documented.
Xac_usage="Usage: configure [options] [host]
XOptions: [defaults in brackets after descriptions]
X--build=BUILD configure for building on BUILD [BUILD=HOST]
X--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
X--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
X--exec-prefix=PREFIX install host dependent files in PREFIX [/usr/local]
X--help print this message
X--host=HOST configure for HOST [guessed]
X--prefix=PREFIX install host independent files in PREFIX [/usr/local]
X--quiet, --silent do not print \`checking for...' messages
X--srcdir=DIR find the sources in DIR [configure dir or ..]
X--target=TARGET configure for TARGET [TARGET=HOST]
X--verbose print results of checks
X--version print the version of autoconf that created configure
X--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
X--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
X--x-includes=DIR X include files are in DIR
X--x-libraries=DIR X library files are in DIR"
X
X# Initialize some variables set by options.
X# The variables have the same names as the options, with
X# dashes changed to underlines.
Xbuild=NONE
Xexec_prefix=
Xhost=NONE
Xno_create=
Xnonopt=NONE
Xnorecursion=
Xprefix=
Xprogram_prefix=
Xprogram_suffix=
Xprogram_transform_name=
Xsilent=
Xsrcdir=
Xtarget=NONE
Xverbose=
Xx_includes=
Xx_libraries=
X
Xac_prev=
Xfor ac_option
Xdo
X
X # If the previous option needs an argument, assign it.
X if test -n "$ac_prev"; then
X eval "$ac_prev=\$ac_option"
X ac_prev=
X continue
X fi
X
X # Accept (but ignore some of) the important Cygnus configure
X # options, so we can diagnose typos.
X
X case "$ac_option" in
X -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
X *) ac_optarg= ;;
X esac
X
X case "$ac_option" in
X
X -build | --build | --buil | --bui | --bu | --b)
X ac_prev=build ;;
X -build=* | --build=* | --buil=* | --bui=* | --bu=* | --b=*)
X build="$ac_optarg" ;;
X
X -disable-* | --disable-*)
X ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
X # Reject names that aren't valid shell variable names.
X if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
X echo "configure: $ac_feature: invalid feature name" >&2; exit 1
X fi
X ac_feature=`echo $ac_feature| sed 's/-/_/g'`
X eval "enable_${ac_feature}=no" ;;
X
X -enable-* | --enable-*)
X ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
X # Reject names that aren't valid shell variable names.
X if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
X echo "configure: $ac_feature: invalid feature name" >&2; exit 1
X fi
X ac_feature=`echo $ac_feature| sed 's/-/_/g'`
X case "$ac_option" in
X *=*) ;;
X *) ac_optarg=yes ;;
X esac
X eval "enable_${ac_feature}='$ac_optarg'" ;;
X
X # For backward compatibility, recognize -exec-prefix and --exec_prefix.
X -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
X | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
X | --exec | --exe | --ex)
X ac_prev=exec_prefix ;;
X -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
X | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
X | --exec=* | --exe=* | --ex=*)
X exec_prefix="$ac_optarg" ;;
X
X -gas | --gas | --ga | --g)
X with_gas=yes ;; # Obsolete; use --with-gas.
X
X -help | --help | --hel | --he)
X cat << EOF
X$ac_usage
XEOF
X exit 0 ;;
X
X -host | --host | --hos | --ho)
X ac_prev=host ;;
X -host=* | --host=* | --hos=* | --ho=*)
X host="$ac_optarg" ;;
X
X -nfp | --nfp | --nf)
X with_fp=no ;; # Obsolete; use --without-fp.
X
X -no-create | --no-create | --no-creat | --no-crea | --no-cre \
X | --no-cr | --no-c)
X no_create=yes ;;
X
X -norecursion | --norecursion | --norecursio | --norecursi \
X | --norecurs | --norecur | --norecu | --norec | --nore | --nor)
X norecursion=yes ;;
X
X -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
X ac_prev=prefix ;;
X -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
X prefix="$ac_optarg" ;;
X
X -program-prefix | --program-prefix | --program-prefi | --program-pref \
X | --program-pre | --program-pr | --program-p)
X ac_prev=program_prefix ;;
X -program-prefix=* | --program-prefix=* | --program-prefi=* \
X | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
X program_prefix="$ac_optarg" ;;
X
X -program-suffix | --program-suffix | --program-suffi | --program-suff \
X | --program-suf | --program-su | --program-s)
X ac_prev=program_suffix ;;
X -program-suffix=* | --program-suffix=* | --program-suffi=* \
X | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
X program_suffix="$ac_optarg" ;;
X
X -program-transform-name | --program-transform-name \
X | --program-transform-nam | --program-transform-na \
X | --program-transform-n | --program-transform- \
X | --program-transform | --program-transfor \
X | --program-transfo | --program-transf \
X | --program-trans | --program-tran \
X | --progr-tra | --program-tr | --program-t)
X ac_prev=program_transform_name ;;
X -program-transform-name=* | --program-transform-name=* \
X | --program-transform-nam=* | --program-transform-na=* \
X | --program-transform-n=* | --program-transform-=* \
X | --program-transform=* | --program-transfor=* \
X | --program-transfo=* | --program-transf=* \
X | --program-trans=* | --program-tran=* \
X | --progr-tra=* | --program-tr=* | --program-t=*)
X program_transform_name="$ac_optarg" ;;
X
X -q | -quiet | --quiet | --quie | --qui | --qu | --q \
X | -silent | --silent | --silen | --sile | --sil)
X silent=yes ;;
X
X -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
X ac_prev=srcdir ;;
X -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
X srcdir="$ac_optarg" ;;
X
X -target | --target | --targe | --targ | --tar | --ta | --t)
X ac_prev=target ;;
X -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
X target="$ac_optarg" ;;
X
X -v | -verbose | --verbose | --verbos | --verbo | --verb)
X verbose=yes ;;
X
X -version | --version | --versio | --versi | --vers)
X echo "configure generated by autoconf version 1.11"
X exit 0 ;;
X
X -with-* | --with-*)
X ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
X # Reject names that aren't valid shell variable names.
X if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
X echo "configure: $ac_package: invalid package name" >&2; exit 1
X fi
X ac_package=`echo $ac_package| sed 's/-/_/g'`
X case "$ac_option" in
X *=*) ;;
X *) ac_optarg=yes ;;
X esac
X eval "with_${ac_package}='$ac_optarg'" ;;
X
X -without-* | --without-*)
X ac_package=`echo $ac_option|sed -e 's/-*without-//'`
X # Reject names that aren't valid shell variable names.
X if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
X echo "configure: $ac_package: invalid package name" >&2; exit 1
X fi
X ac_package=`echo $ac_package| sed 's/-/_/g'`
X eval "with_${ac_package}=no" ;;
X
X --x) with_x=yes ;; # Obsolete; use --with-x.
X
X -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
X | --x-incl | --x-inc | --x-in | --x-i)
X ac_prev=x_includes ;;
X -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
X | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
X x_includes="$ac_optarg" ;;
X
X -x-libraries | --x-libraries | --x-librarie | --x-librari \
X | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
X ac_prev=x_libraries ;;
X -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
X | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
X x_libraries="$ac_optarg" ;;
X
X -*) echo "configure: $ac_option: invalid option; use --help to show usage" >&2; exit 1
X ;;
X
X *)
X if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
X echo "configure: warning: $ac_option: invalid host type" >&2
X fi
X if test "x$nonopt" != xNONE; then
X echo "configure: can only configure for one host and one target at a time" >&2; exit 1
X fi
X nonopt="$ac_option"
X ;;
X
X esac
Xdone
X
Xif test -n "$ac_prev"; then
X echo "configure: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" >&2; exit 1
Xfi
X
Xtrap 'rm -fr conftest* confdefs* core $ac_clean_files; exit 1' 1 2 15
Xtrap 'rm -fr confdefs* $ac_clean_files' 0
X
X# Save the original args if we used an alternate arg parser.
Xac_configure_temp="${configure_args-$*}"
X# Strip out --no-create and --norecursion so they don't pile up.
Xconfigure_args=
Xfor ac_arg in $ac_configure_temp; do
X case "$ac_arg" in
X -no-create | --no-create | --no-creat | --no-crea | --no-cre \
X | --no-cr | --no-c) ;;
X -norecursion | --norecursion | --norecursio | --norecursi \
X | --norecurs | --norecur | --norecu | --norec | --nore | --nor) ;;
X *) configure_args="$configure_args $ac_arg" ;;
X esac
Xdone
X
X# NLS nuisances.
X# These must not be set unconditionally because not all systems understand
X# e.g. LANG=C (notably SCO).
Xif test "${LC_ALL+set}" = 'set'; then LC_ALL=C; export LC_ALL; fi
Xif test "${LANG+set}" = 'set'; then LANG=C; export LANG; fi
X
X# confdefs.h avoids OS command line length limits that DEFS can exceed.
Xrm -rf conftest* confdefs.h
X# AIX cpp loses on an empty file, so make sure it contains at least a newline.
Xecho > confdefs.h
X
X# A filename unique to this package, relative to the directory that
X# configure is in, which we can look for to find out if srcdir is correct.
Xac_unique_file=xsokoban.man
X
X# Find the source files, if location was not specified.
Xif test -z "$srcdir"; then
X ac_srcdir_defaulted=yes
X # Try the directory containing this script, then `..'.
X ac_prog=$0
X ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
X test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
X srcdir=$ac_confdir
X if test ! -r $srcdir/$ac_unique_file; then
X srcdir=..
X fi
Xfi
Xif test ! -r $srcdir/$ac_unique_file; then
X if test x$ac_srcdir_defaulted = xyes; then
X echo "configure: can not find sources in ${ac_confdir} or .." >&2; exit 1
X else
X echo "configure: can not find sources in ${srcdir}" >&2; exit 1
X fi
Xfi
Xac_ext=c
X# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
Xac_cpp='${CPP}'
Xac_compile='${CC-cc} $CFLAGS $LDFLAGS conftest.${ac_ext} -o conftest $LIBS >/dev/null 2>&1'
X
X
X
X############################################################################
X# Create config files
X
X
X############################################################################
X# Check for programs
X
X# check whether --with-gcc or --without-gcc was given.
Xwithval="$with_gcc"
Xif test -n "$withval"; then
X CC=gcc
Xfi
X
X
X# Make sure to not get the incompatible SysV /etc/install and
X# /usr/sbin/install, which might be in PATH before a BSD-like install,
X# or the SunOS /usr/etc/install directory, or the AIX /bin/install,
X# or the AFS install, which mishandles nonexistent args, or
X# /usr/ucb/install on SVR4, which tries to use the nonexistent group
X# `staff', or /sbin/install on IRIX which has incompatible command-line
X# syntax. Sigh.
X#
X# On most BSDish systems install is in /usr/bin, not /usr/ucb
X# anyway.
X# This turns out not to be true, so the mere pathname isn't an indication
X# of whether the program works. What we really need is a set of tests for
X# the install program to see if it actually works in all the required ways.
X#
X# Avoid using ./install, which might have been erroneously created
X# by make from ./install.sh.
Xif test -z "${INSTALL}"; then
X test -n "$silent" || echo "checking for a BSD compatible install"
X IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
X for ac_dir in $PATH; do
X case "$ac_dir" in
X ''|.|/etc|/sbin|/usr/sbin|/usr/etc|/usr/afsws/bin|/usr/ucb) ;;
X *)
X # OSF1 and SCO ODT 3.0 have their own names for install.
X for ac_prog in installbsd scoinst install; do
X if test -f $ac_dir/$ac_prog; then
X if test $ac_prog = install &&
X grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
X # AIX install. It has an incompatible calling convention.
X # OSF/1 installbsd also uses dspmsg, but is usable.
X :
X else
X INSTALL="$ac_dir/$ac_prog -c"
X break 2
X fi
X fi
X done
X ;;
X esac
X done
X IFS="$ac_save_ifs"
Xfi
X
Xif test -z "$INSTALL"; then
X # As a last resort, use the slow shell script.
X for ac_dir in ${srcdir} ${srcdir}/.. ${srcdir}/../..; do
X if test -f $ac_dir/install.sh; then
X INSTALL="$ac_dir/install.sh -c"; break
X fi
X done
Xfi
Xif test -z "$INSTALL"; then
X echo "configure: can not find install.sh in ${srcdir} or ${srcdir}/.. or ${srcdir}/../.." >&2; exit 1
Xfi
Xtest -n "$verbose" && echo " setting INSTALL to $INSTALL"
X
X# Use test -z because SunOS4 sh mishandles ${INSTALL_PROGRAM-'${INSTALL}'}.
X# It thinks the first close brace ends the variable substitution.
Xtest -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
Xtest -n "$verbose" && echo " setting INSTALL_PROGRAM to $INSTALL_PROGRAM"
X
Xtest -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
Xtest -n "$verbose" && echo " setting INSTALL_DATA to $INSTALL_DATA"
X
Xif test -z "$CC"; then
X # Extract the first word of `gcc', so it can be a program name with args.
X set ac_dummy gcc; ac_word=$2
X test -n "$silent" || echo "checking for $ac_word"
X IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
X for ac_dir in $PATH; do
X test -z "$ac_dir" && ac_dir=.
X if test -f $ac_dir/$ac_word; then
X CC="gcc"
X break
X fi
X done
X IFS="$ac_save_ifs"
Xfi
Xtest -z "$CC" && CC="cc"
Xtest -n "$CC" && test -n "$verbose" && echo " setting CC to $CC"
X
X# Find out if we are using GNU C, under whatever name.
Xcat > conftest.c <<EOF
X#ifdef __GNUC__
X yes
X#endif
XEOF
X${CC-cc} -E conftest.c > conftest.out 2>&1
Xif egrep yes conftest.out >/dev/null 2>&1; then
X GCC=1 # For later tests.
Xfi
Xrm -f conftest*
X
Xtest -n "$silent" || echo "checking how to run the C preprocessor"
Xif test -z "$CPP"; then
X # This must be in double quotes, not single quotes, because CPP may get
X # substituted into the Makefile and ``${CC-cc}'' will simply confuse
X # make. It must be expanded now.
X CPP="${CC-cc} -E"
X cat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <stdio.h>
XSyntax Error
XEOF
X# Some shells (Coherent) do redirections in the wrong order, so need
X# the parens.
Xac_err=`eval "($ac_cpp conftest.${ac_ext} >/dev/null) 2>&1"`
Xif test -z "$ac_err"; then
X :
Xelse
X rm -rf conftest*
X CPP="${CC-cc} -E -traditional-cpp"
X cat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <stdio.h>
XSyntax Error
XEOF
X# Some shells (Coherent) do redirections in the wrong order, so need
X# the parens.
Xac_err=`eval "($ac_cpp conftest.${ac_ext} >/dev/null) 2>&1"`
Xif test -z "$ac_err"; then
X :
Xelse
X rm -rf conftest*
X CPP=/lib/cpp
Xfi
Xrm -f conftest*
Xfi
Xrm -f conftest*
Xfi
Xtest -n "$verbose" && echo " setting CPP to $CPP"
X
X
X#####################
X# Find Xpm if needed
X
X(cat config.h; echo "use_xpm=USE_XPM;www=WWW") > tmp.$$.c
X$CPP tmp.$$.c | egrep -v "^#" > tmp2.$$
X. ./tmp2.$$
Xif test $use_xpm = 1; then
X echo "Looking for Xpm">&2
X libxpm=1
X incxpm=1
X ac_save_LIBS="${LIBS}"
XLIBS="${LIBS} -lXpm"
Xac_have_lib=""
Xtest -n "$silent" || echo "checking for -lXpm"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X
Xint main() { return 0; }
Xint t() { main();; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X ac_have_lib="1"
X
Xfi
Xrm -f conftest*
XLIBS="${ac_save_LIBS}"
Xif test -n "${ac_have_lib}"; then
X :; LIBS="$LIBS -lXpm"
Xelse
X :; echo "Can't find libXpm.a! You must add to LIBS in Makefile.">&2
X
Xfi
X
X test -n "$silent" || echo "checking for xpm.h"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <xpm.h>
XEOF
X# Some shells (Coherent) do redirections in the wrong order, so need
X# the parens.
Xac_err=`eval "($ac_cpp conftest.${ac_ext} >/dev/null) 2>&1"`
Xif test -z "$ac_err"; then
X :
Xelse
X rm -rf conftest*
X echo "Can't find xpm.h! You must add to INCS in Makefile.">&2
X
Xfi
Xrm -f conftest*
X
Xfi
Xrm -f tmp.$$.c tmp2.$$
X
X###################
X# Find X
X
X# If we find X, set shell vars x_includes and x_libraries to the paths.
Xno_x=true
Xif test "x$with_x" != xno; then
Xtest -n "$silent" || echo "checking for X include and library files with xmkmf"
Xrm -fr conftestdir
Xif mkdir conftestdir; then
X cd conftestdir
X # Make sure to not put "make" in the Imakefile rules, since we grep it out.
X cat > Imakefile <<'EOF'
Xacfindx:
X @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"'
XEOF
X if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
X no_x=
X # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
X eval `make acfindx 2>/dev/null | grep -v make`
X # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
X if test ! -f $ac_im_usrlibdir/libX11.a && test -f $ac_im_libdir/libX11.a
X then
X ac_im_usrlibdir=$ac_im_libdir
X fi
X case "$ac_im_incroot" in
X /usr/include) ;;
X *) test -z "$x_includes" && x_includes="$ac_im_incroot" ;;
X esac
X case "$ac_im_usrlibdir" in
X /usr/lib | /lib) ;;
X *) test -z "$x_libraries" && x_libraries="$ac_im_usrlibdir" ;;
X esac
X fi
X cd ..
X rm -fr conftestdir
Xfi
X
Xif test -z "$ac_im_usrlibdir"; then
Xtest -n "$silent" || echo "checking for X include and library files directly"
Xif test ".$x_direct_test_library" = . ; then
X x_direct_test_library='Xt'
Xfi
Xif test ".$x_direct_test_include" = . ; then
X x_direct_test_include='X11/Intrinsic.h'
Xfi
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <$x_direct_test_include>
XEOF
X# Some shells (Coherent) do redirections in the wrong order, so need
X# the parens.
Xac_err=`eval "($ac_cpp conftest.${ac_ext} >/dev/null) 2>&1"`
Xif test -z "$ac_err"; then
X rm -rf conftest*
X no_x=
X
Xelse
X rm -rf conftest*
X for ac_dir in \
X /usr/X11R6/include \
X /usr/X11R5/include \
X /usr/X11R4/include \
X \
X /usr/include/X11R6 \
X /usr/include/X11R5 \
X /usr/include/X11R4 \
X \
X /usr/local/X11R6/include \
X /usr/local/X11R5/include \
X /usr/local/X11R4/include \
X \
X /usr/local/include/X11R6 \
X /usr/local/include/X11R5 \
X /usr/local/include/X11R4 \
X \
X /usr/X11/include \
X /usr/include/X11 \
X /usr/local/X11/include \
X /usr/local/include/X11 \
X \
X /usr/X386/include \
X /usr/x386/include \
X /usr/XFree86/include/X11 \
X \
X /usr/include \
X /usr/local/include \
X /usr/unsupported/include \
X /usr/athena/include \
X /usr/local/x11r5/include \
X /usr/lpp/Xamples/include \
X \
X /usr/openwin/include \
X /usr/openwin/share/include \
X ; \
X do
X if test -r "$ac_dir/$x_direct_test_include"; then
X test -z "$x_includes" && x_includes=$ac_dir
X no_x=
X break
X fi
X done
Xfi
Xrm -f conftest*
X
X# Check for the libraries. First see if replacing the `include' by
X# `lib' works.
Xac_save_LIBS="${LIBS}"
XLIBS="${LIBS} -l"$x_direct_test_library""
Xac_have_lib=""
Xtest -n "$silent" || echo "checking for -l"$x_direct_test_library""
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X
Xint main() { return 0; }
Xint t() { main();; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X ac_have_lib="1"
X
Xfi
Xrm -f conftest*
XLIBS="${ac_save_LIBS}"
Xif test -n "${ac_have_lib}"; then
X :; no_x=
Xelse
X :; for ac_dir in `echo "$x_includes" | sed s/include/lib/` \
X /usr/X11R6/lib \
X /usr/X11R5/lib \
X /usr/X11R4/lib \
X \
X /usr/lib/X11R6 \
X /usr/lib/X11R5 \
X /usr/lib/X11R4 \
X \
X /usr/local/X11R6/lib \
X /usr/local/X11R5/lib \
X /usr/local/X11R4/lib \
X \
X /usr/local/lib/X11R6 \
X /usr/local/lib/X11R5 \
X /usr/local/lib/X11R4 \
X \
X /usr/X11/lib \
X /usr/lib/X11 \
X /usr/local/X11/lib \
X /usr/local/lib/X11 \
X \
X /usr/X386/lib \
X /usr/x386/lib \
X /usr/XFree86/lib/X11 \
X \
X /usr/lib \
X /usr/local/lib \
X /usr/unsupported/lib \
X /usr/athena/lib \
X /usr/local/x11r5/lib \
X /usr/lpp/Xamples/lib \
X \
X /usr/openwin/lib \
X /usr/openwin/share/lib \
X ; \
Xdo
X for ac_extension in a so sl; do
X if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then
X test -z "$x_libraries" && x_libraries=$ac_dir
X no_x=
X break 2
X fi
X done
Xdone
Xfi
X
Xfi
Xtest -n "$x_includes" && test -n "$verbose" && echo " X11 headers are in $x_includes"
Xtest -n "$x_libraries" && test -n "$verbose" && echo " X11 libraries are in $x_libraries"
Xfi
X
Xif test -n "$no_x"; then
X echo "Cannot find X libraries! Package may not compile">&2
X x_includes=
X x_libraries=-lX11
Xelse
X if test x$x_includes != x &&
X test x$x_includes != x/usr/include; then
X INCS="$INCS -I$x_includes"
X fi
X if test x$x_libraries != x &&
X test x$x_libraries != x/usr/lib; then
X LIBS="$LIBS -L$x_libraries"
X fi
X LIBS="$LIBS -lX11"
Xfi
X
X
X
X
X##############
X# DEC bogosity
X
Xac_save_LIBS="${LIBS}"
XLIBS="${LIBS} -ldnet_stub"
Xac_have_lib=""
Xtest -n "$silent" || echo "checking for -ldnet_stub"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X
Xint main() { return 0; }
Xint t() { main();; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X ac_have_lib="1"
X
Xfi
Xrm -f conftest*
XLIBS="${ac_save_LIBS}"
Xif test -n "${ac_have_lib}"; then
X
X{
Xtest -n "$verbose" && \
Xecho " defining HAVE_LIBDNET_STUB"
Xecho "#define" HAVE_LIBDNET_STUB "1" >> confdefs.h
XDEFS="$DEFS -DHAVE_LIBDNET_STUB=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}HAVE_LIBDNET_STUB\${ac_dB}HAVE_LIBDNET_STUB\${ac_dC}1\${ac_dD}
X\${ac_uA}HAVE_LIBDNET_STUB\${ac_uB}HAVE_LIBDNET_STUB\${ac_uC}1\${ac_uD}
X\${ac_eA}HAVE_LIBDNET_STUB\${ac_eB}HAVE_LIBDNET_STUB\${ac_eC}1\${ac_eD}
X"
X}
X
X LIBS="${LIBS} -ldnet_stub"
Xfi
X
X
X####################################
X# Turn on all compiler warning flags
X
Xif test -n "$GCC"
Xthen
X WARN=-Wall
Xelse
X if test -f /bin/uname &&
X test `uname` = OSF1
X then
X WARN=-std1
X else
X WARN=
X fi
Xfi
X
X
X############################################################################
X# Check for library functions and C++ prototypes
X
Xtest -n "$silent" || echo "checking for getpass prototype"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <stdlib.h>
Xint main() { return 0; }
Xint t() { char *s = getpass("prompt");; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining GETPASS_PROTO"
Xecho "#define" GETPASS_PROTO "1" >> confdefs.h
XDEFS="$DEFS -DGETPASS_PROTO=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}GETPASS_PROTO\${ac_dB}GETPASS_PROTO\${ac_dC}1\${ac_dD}
X\${ac_uA}GETPASS_PROTO\${ac_uB}GETPASS_PROTO\${ac_uC}1\${ac_uD}
X\${ac_eA}GETPASS_PROTO\${ac_eB}GETPASS_PROTO\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
X
X
Xtest -n "$silent" || echo "checking for fprintf prototype"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <stdio.h>
Xint main() { return 0; }
Xint t() { fprintf(stderr, "foo");; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining FPRINTF_PROTO"
Xecho "#define" FPRINTF_PROTO "1" >> confdefs.h
XDEFS="$DEFS -DFPRINTF_PROTO=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}FPRINTF_PROTO\${ac_dB}FPRINTF_PROTO\${ac_dC}1\${ac_dD}
X\${ac_uA}FPRINTF_PROTO\${ac_uB}FPRINTF_PROTO\${ac_uC}1\${ac_uD}
X\${ac_eA}FPRINTF_PROTO\${ac_eB}FPRINTF_PROTO\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
X
X
Xtest -n "$silent" || echo "checking for fclose prototype"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <stdio.h>
Xint main() { return 0; }
Xint t() { FILE *f; fclose(f);; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining FCLOSE_PROTO"
Xecho "#define" FCLOSE_PROTO "1" >> confdefs.h
XDEFS="$DEFS -DFCLOSE_PROTO=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}FCLOSE_PROTO\${ac_dB}FCLOSE_PROTO\${ac_dC}1\${ac_dD}
X\${ac_uA}FCLOSE_PROTO\${ac_uB}FCLOSE_PROTO\${ac_uC}1\${ac_uD}
X\${ac_eA}FCLOSE_PROTO\${ac_eB}FCLOSE_PROTO\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
X
X
Xtest -n "$silent" || echo "checking for time prototype"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <time.h>
Xint main() { return 0; }
Xint t() { time_t t; t = time(&t);; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining TIME_PROTO"
Xecho "#define" TIME_PROTO "1" >> confdefs.h
XDEFS="$DEFS -DTIME_PROTO=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}TIME_PROTO\${ac_dB}TIME_PROTO\${ac_dC}1\${ac_dD}
X\${ac_uA}TIME_PROTO\${ac_uB}TIME_PROTO\${ac_uC}1\${ac_uD}
X\${ac_eA}TIME_PROTO\${ac_eB}TIME_PROTO\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
X
X
Xtest -n "$silent" || echo "checking for localtime prototype"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <time.h>
Xint main() { return 0; }
Xint t() { time_t t; struct tm stm = *localtime(&t);; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining LOCALTIME_PROTO"
Xecho "#define" LOCALTIME_PROTO "1" >> confdefs.h
XDEFS="$DEFS -DLOCALTIME_PROTO=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}LOCALTIME_PROTO\${ac_dB}LOCALTIME_PROTO\${ac_dC}1\${ac_dD}
X\${ac_uA}LOCALTIME_PROTO\${ac_uB}LOCALTIME_PROTO\${ac_uC}1\${ac_uD}
X\${ac_eA}LOCALTIME_PROTO\${ac_eB}LOCALTIME_PROTO\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
X
X
Xtest -n "$silent" || echo "checking for mktemp prototype"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <stdlib.h>
Xint main() { return 0; }
Xint t() { char *s = mktemp("fooXXXXXX"); ; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining MKTEMP_PROTO"
Xecho "#define" MKTEMP_PROTO "1" >> confdefs.h
XDEFS="$DEFS -DMKTEMP_PROTO=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}MKTEMP_PROTO\${ac_dB}MKTEMP_PROTO\${ac_dC}1\${ac_dD}
X\${ac_uA}MKTEMP_PROTO\${ac_uB}MKTEMP_PROTO\${ac_uC}1\${ac_uD}
X\${ac_eA}MKTEMP_PROTO\${ac_eB}MKTEMP_PROTO\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
X
X
Xtest -n "$silent" || echo "checking for perror prototype"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <errno.h>
X#include <stdio.h>
Xint main() { return 0; }
Xint t() { perror("bleah"); ; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining PERROR_PROTO"
Xecho "#define" PERROR_PROTO "1" >> confdefs.h
XDEFS="$DEFS -DPERROR_PROTO=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}PERROR_PROTO\${ac_dB}PERROR_PROTO\${ac_dC}1\${ac_dD}
X\${ac_uA}PERROR_PROTO\${ac_uB}PERROR_PROTO\${ac_uC}1\${ac_uD}
X\${ac_eA}PERROR_PROTO\${ac_eB}PERROR_PROTO\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
X
X
Xtest -n "$silent" || echo "checking for rename prototype"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <unistd.h>
X#include <stdio.h>
Xint main() { return 0; }
Xint t() { int x = rename("foo", "bar");; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining RENAME_PROTO"
Xecho "#define" RENAME_PROTO "1" >> confdefs.h
XDEFS="$DEFS -DRENAME_PROTO=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}RENAME_PROTO\${ac_dB}RENAME_PROTO\${ac_dC}1\${ac_dD}
X\${ac_uA}RENAME_PROTO\${ac_uB}RENAME_PROTO\${ac_uC}1\${ac_uD}
X\${ac_eA}RENAME_PROTO\${ac_eB}RENAME_PROTO\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
X
X
Xtest -n "$silent" || echo "checking for strdup prototype"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <string.h>
Xint main() { return 0; }
Xint t() { char *s = strdup("foo");; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining STRDUP_PROTO"
Xecho "#define" STRDUP_PROTO "1" >> confdefs.h
XDEFS="$DEFS -DSTRDUP_PROTO=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}STRDUP_PROTO\${ac_dB}STRDUP_PROTO\${ac_dC}1\${ac_dD}
X\${ac_uA}STRDUP_PROTO\${ac_uB}STRDUP_PROTO\${ac_uC}1\${ac_uD}
X\${ac_eA}STRDUP_PROTO\${ac_eB}STRDUP_PROTO\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
X
X
Xtest -n "$silent" || echo "checking for usleep"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <stdlib.h>
Xint main() { return 0; }
Xint t() { unsigned x = usleep(1);; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining HAS_USLEEP"
Xecho "#define" HAS_USLEEP "1" >> confdefs.h
XDEFS="$DEFS -DHAS_USLEEP=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}HAS_USLEEP\${ac_dB}HAS_USLEEP\${ac_dC}1\${ac_dD}
X\${ac_uA}HAS_USLEEP\${ac_uB}HAS_USLEEP\${ac_uC}1\${ac_uD}
X\${ac_eA}HAS_USLEEP\${ac_eB}HAS_USLEEP\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
X
X
Xtest -n "$silent" || echo "checking for bzero prototype"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <stdlib.h>
Xint main() { return 0; }
Xint t() { char *x; int l; bzero(x, l);; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining BZERO_PROTO"
Xecho "#define" BZERO_PROTO "1" >> confdefs.h
XDEFS="$DEFS -DBZERO_PROTO=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}BZERO_PROTO\${ac_dB}BZERO_PROTO\${ac_dC}1\${ac_dD}
X\${ac_uA}BZERO_PROTO\${ac_uB}BZERO_PROTO\${ac_uC}1\${ac_uD}
X\${ac_eA}BZERO_PROTO\${ac_eB}BZERO_PROTO\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
X
X
Xfor ac_hdr in limits.h sys/select.h
Xdo
Xac_tr_hdr=HAVE_`echo $ac_hdr | tr '[a-z]./' '[A-Z]__'`
Xtest -n "$silent" || echo "checking for ${ac_hdr}"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <${ac_hdr}>
XEOF
X# Some shells (Coherent) do redirections in the wrong order, so need
X# the parens.
Xac_err=`eval "($ac_cpp conftest.${ac_ext} >/dev/null) 2>&1"`
Xif test -z "$ac_err"; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining ${ac_tr_hdr}"
Xecho "#define" ${ac_tr_hdr} "1" >> confdefs.h
XDEFS="$DEFS -D${ac_tr_hdr}=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}${ac_tr_hdr}\${ac_dB}${ac_tr_hdr}\${ac_dC}1\${ac_dD}
X\${ac_uA}${ac_tr_hdr}\${ac_uB}${ac_tr_hdr}\${ac_uC}1\${ac_uD}
X\${ac_eA}${ac_tr_hdr}\${ac_eB}${ac_tr_hdr}\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
Xdone
X
X
Xecho "looking for htons, ntohs" >&2
X
Xtest -n "$silent" || echo "checking for htons in machine/endian.h"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <machine/endian.h>
Xint main() { return 0; }
Xint t() { short x,y; x = htons(y);; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining NEED_ENDIAN"
Xecho "#define" NEED_ENDIAN "1" >> confdefs.h
XDEFS="$DEFS -DNEED_ENDIAN=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}NEED_ENDIAN\${ac_dB}NEED_ENDIAN\${ac_dC}1\${ac_dD}
X\${ac_uA}NEED_ENDIAN\${ac_uB}NEED_ENDIAN\${ac_uC}1\${ac_uD}
X\${ac_eA}NEED_ENDIAN\${ac_eB}NEED_ENDIAN\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
X
Xtest -n "$silent" || echo "checking for htons in netinet/in.h"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <netinet/in.h>
Xint main() { return 0; }
Xint t() { short x,y; x = htons(y);; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining NEED_NETINET_IN"
Xecho "#define" NEED_NETINET_IN "1" >> confdefs.h
XDEFS="$DEFS -DNEED_NETINET_IN=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}NEED_NETINET_IN\${ac_dB}NEED_NETINET_IN\${ac_dC}1\${ac_dD}
X\${ac_uA}NEED_NETINET_IN\${ac_uB}NEED_NETINET_IN\${ac_uC}1\${ac_uD}
X\${ac_eA}NEED_NETINET_IN\${ac_eB}NEED_NETINET_IN\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
X
Xtest -n "$silent" || echo "checking for htons in net/nh.h"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <net/nh.h>
Xint main() { return 0; }
Xint t() { short x,y; x = htons(y);; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining NEED_NH"
Xecho "#define" NEED_NH "1" >> confdefs.h
XDEFS="$DEFS -DNEED_NH=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}NEED_NH\${ac_dB}NEED_NH\${ac_dC}1\${ac_dD}
X\${ac_uA}NEED_NH\${ac_uB}NEED_NH\${ac_uC}1\${ac_uD}
X\${ac_eA}NEED_NH\${ac_eB}NEED_NH\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
X
Xtest -n "$silent" || echo "checking for htons in sys/byteorder.h"
Xcat > conftest.${ac_ext} <<EOF
X#include "confdefs.h"
X#include <sys/byteorder.h>
Xint main() { return 0; }
Xint t() { short x,y; x = htons(y);; return 0; }
XEOF
Xif eval $ac_compile; then
X rm -rf conftest*
X
X{
Xtest -n "$verbose" && \
Xecho " defining NEED_BYTEORDER"
Xecho "#define" NEED_BYTEORDER "1" >> confdefs.h
XDEFS="$DEFS -DNEED_BYTEORDER=1"
Xac_sed_defs="${ac_sed_defs}\${ac_dA}NEED_BYTEORDER\${ac_dB}NEED_BYTEORDER\${ac_dC}1\${ac_dD}
X\${ac_uA}NEED_BYTEORDER\${ac_uB}NEED_BYTEORDER\${ac_uC}1\${ac_uD}
X\${ac_eA}NEED_BYTEORDER\${ac_eB}NEED_BYTEORDER\${ac_eC}1\${ac_eD}
X"
X}
X
X
Xfi
Xrm -f conftest*
X
X
X############################################################################
X# Build configured files
X
X
X# The preferred way to propogate these variables is regular @ substitutions.
Xif test -n "$prefix"; then
X ac_prsub="s%^prefix\\([ ]*\\)=\\([ ]*\\).*$%prefix\\1=\\2$prefix%"
Xelse
X prefix=/usr/local
Xfi
Xif test -n "$exec_prefix"; then
X ac_prsub="$ac_prsub
Xs%^exec_prefix\\([ ]*\\)=\\([ ]*\\).*$%exec_prefix\\1=\\2$exec_prefix%"
Xelse
X exec_prefix='${prefix}' # Let make expand it.
Xfi
X
X# Any assignment to VPATH causes Sun make to only execute
X# the first set of double-colon rules, so remove it if not needed.
X# If there is a colon in the path, we need to keep it.
Xif test "x$srcdir" = x.; then
X ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
Xfi
X
X# Quote sed substitution magic chars in DEFS.
Xcat >conftest.def <<EOF
X$DEFS
XEOF
Xac_escape_ampersand_and_backslash='s%[&\\]%\\&%g'
XDEFS=`sed "$ac_escape_ampersand_and_backslash" <conftest.def`
Xrm -f conftest.def
X# Substitute for predefined variables.
X
Xtrap 'rm -f config.status; exit 1' 1 2 15
Xecho creating config.status
Xrm -f config.status
Xcat > config.status <<EOF
X#!/bin/sh
X# Generated automatically by configure.
X# Run this file to recreate the current configuration.
X# This directory was configured as follows,
X# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
X#
X# $0 $configure_args
X
Xac_cs_usage="Usage: config.status [--recheck] [--version] [--help]"
Xfor ac_option
Xdo
X case "\$ac_option" in
X -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
X echo running \${CONFIG_SHELL-/bin/sh} $0 $configure_args --no-create
X exec \${CONFIG_SHELL-/bin/sh} $0 $configure_args --no-create ;;
X -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
X echo "config.status generated by autoconf version 1.11"
X exit 0 ;;
X -help | --help | --hel | --he | --h)
X echo "\$ac_cs_usage"; exit 0 ;;
X *) echo "\$ac_cs_usage"; exit 1 ;;
X esac
Xdone
X
Xtrap 'rm -fr Makefile config_local.h conftest*; exit 1' 1 2 15
XINSTALL='$INSTALL'
XINSTALL_PROGRAM='$INSTALL_PROGRAM'
XINSTALL_DATA='$INSTALL_DATA'
XCC='$CC'
XCPP='$CPP'
XLIBS='$LIBS'
XINCS='$INCS'
XWARN='$WARN'
Xsrcdir='$srcdir'
Xtop_srcdir='$top_srcdir'
Xprefix='$prefix'
Xexec_prefix='$exec_prefix'
Xac_prsub='$ac_prsub'
Xac_vpsub='$ac_vpsub'
Xextrasub='$extrasub'
XEOF
Xcat >> config.status <<\EOF
X
Xac_given_srcdir=$srcdir
X
XCONFIG_FILES=${CONFIG_FILES-"Makefile"}
Xfor ac_file in .. ${CONFIG_FILES}; do if test "x$ac_file" != x..; then
X # Remove last slash and all that follows it. Not all systems have dirname.
X ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
X if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
X # The file is in a subdirectory.
X test ! -d "$ac_dir" && mkdir "$ac_dir"
X ac_dir_suffix="/$ac_dir"
X else
X ac_dir_suffix=
X fi
X
X # A "../" for each directory in $ac_dir_suffix.
X ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
X case "$ac_given_srcdir" in
X .) srcdir=.
X if test -z "$ac_dir_suffix"; then top_srcdir=.
X else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
X /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
X *) # Relative path.
X srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
X top_srcdir="$ac_dots$ac_given_srcdir" ;;
X esac
X
X echo creating "$ac_file"
X rm -f "$ac_file"
X comment_str="Generated automatically from `echo $ac_file|sed 's|.*/||'`.in by configure."
X case "$ac_file" in
X *.c | *.h | *.C | *.cc | *.m ) echo "/* $comment_str */" > "$ac_file" ;;
X * ) echo "# $comment_str" > "$ac_file" ;;
X esac
X sed -e "
X$ac_prsub
X$ac_vpsub
X$extrasub
Xs%@INSTALL@%$INSTALL%g
Xs%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
Xs%@INSTALL_DATA@%$INSTALL_DATA%g
Xs%@CC@%$CC%g
Xs%@CPP@%$CPP%g
Xs%@LIBS@%$LIBS%g
Xs%@INCS@%$INCS%g
Xs%@WARN@%$WARN%g
Xs%@srcdir@%$srcdir%g
Xs%@top_srcdir@%$top_srcdir%g
Xs%@prefix@%$prefix%g
Xs%@exec_prefix@%$exec_prefix%g
Xs%@DEFS@%-DHAVE_CONFIG_H%" $ac_given_srcdir/${ac_file}.in >> $ac_file
Xfi; done
X
X# These sed commands are put into ac_sed_defs when defining a macro.
X# They are broken into pieces to make the sed script easier to manage.
X# They are passed to sed as "A NAME B NAME C VALUE D", where NAME
X# is the cpp macro being defined and VALUE is the value it is being given.
X# Each defining turns into a single global substitution command.
X# Hopefully no one uses "!" as a variable value.
X# Other candidates for the sed separators, like , and @, do get used.
X#
X# ac_d sets the value in "#define NAME VALUE" lines.
Xac_dA='s!^\([ ]*\)#\([ ]*define[ ][ ]*\)'
Xac_dB='\([ ][ ]*\)[^ ]*!\1#\2'
Xac_dC='\3'
Xac_dD='!g'
X# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
Xac_uA='s!^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
Xac_uB='\([ ]\)!\1#\2define\3'
Xac_uC=' '
Xac_uD='\4!g'
X# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
Xac_eA='s!^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
Xac_eB='$!\1#\2define\3'
Xac_eC=' '
Xac_eD='!g'
Xrm -f conftest.sed
XEOF
X# Turn off quoting long enough to insert the sed commands.
Xrm -f conftest.sh
Xcat > conftest.sh <<EOF
X$ac_sed_defs
XEOF
X
X# Break up $ac_sed_defs (now in conftest.sh) because some shells have a limit
X# on the size of here documents.
X
X# Maximum number of lines to put in a single here document.
Xac_max_sh_lines=9
X
Xwhile :
Xdo
X # wc gives bogus results for an empty file on some AIX systems.
X ac_lines=`grep -c . conftest.sh`
X if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
X rm -f conftest.s1 conftest.s2
X sed ${ac_max_sh_lines}q conftest.sh > conftest.s1 # Like head -9.
X sed 1,${ac_max_sh_lines}d conftest.sh > conftest.s2 # Like tail +10.
X # Write a limited-size here document to append to conftest.sed.
X echo 'cat >> conftest.sed <<CONFEOF' >> config.status
X cat conftest.s1 >> config.status
X echo 'CONFEOF' >> config.status
X rm -f conftest.s1 conftest.sh
X mv conftest.s2 conftest.sh
Xdone
Xrm -f conftest.sh
X
X# Now back to your regularly scheduled config.status.
Xcat >> config.status <<\EOF
X# This sed command replaces #undef's with comments. This is necessary, for
X# example, in the case of _POSIX_SOURCE, which is predefined and required
X# on some systems where configure will not decide to define it in
X# config_local.h.
Xcat >> conftest.sed <<\CONFEOF
Xs,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
XCONFEOF
Xrm -f conftest.h
X# Break up the sed commands because old seds have small limits.
Xac_max_sed_lines=20
X
XCONFIG_HEADERS=${CONFIG_HEADERS-"config_local.h"}
Xfor ac_file in .. ${CONFIG_HEADERS}; do if test "x$ac_file" != x..; then
X echo creating $ac_file
X
X cp $ac_given_srcdir/$ac_file.in conftest.h1
X cp conftest.sed conftest.stm
X while :
X do
X ac_lines=`grep -c . conftest.stm`
X if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
X rm -f conftest.s1 conftest.s2 conftest.h2
X sed ${ac_max_sed_lines}q conftest.stm > conftest.s1 # Like head -20.
X sed 1,${ac_max_sed_lines}d conftest.stm > conftest.s2 # Like tail +21.
X sed -f conftest.s1 < conftest.h1 > conftest.h2
X rm -f conftest.s1 conftest.h1 conftest.stm
X mv conftest.h2 conftest.h1
X mv conftest.s2 conftest.stm
X done
X rm -f conftest.stm conftest.h
X echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
X cat conftest.h1 >> conftest.h
X rm -f conftest.h1
X if cmp -s $ac_file conftest.h 2>/dev/null; then
X # The file exists and we would not be changing it.
X echo "$ac_file is unchanged"
X rm -f conftest.h
X else
X rm -f $ac_file
X mv conftest.h $ac_file
X fi
Xfi; done
Xrm -f conftest.sed
X
X
X
Xexit 0
XEOF
Xchmod +x config.status
X# Some shells look in PATH for config.status without the "./".
Xtest -n "$no_create" || ${CONFIG_SHELL-/bin/sh} ./config.status
X
END_OF_FILE
if test 41490 -ne `wc -c <'xsokoban/configure'`; then
echo shar: \"'xsokoban/configure'\" unpacked with wrong size!
fi
chmod +x 'xsokoban/configure'
# end of 'xsokoban/configure'
fi
if test -f 'xsokoban/errors.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/errors.h'\"
else
echo shar: Extracting \"'xsokoban/errors.h'\" \(2762 characters\)
sed "s/^X//" >'xsokoban/errors.h' <<'END_OF_FILE'
X/* textual error messages corresponding to the #defines in globals.h */
Xchar *errmess[] = {
X "illegal error number",
X "cannot open screen file",
X "more than one player position in screen file",
X "illegal char in screen file",
X "no player position in screenfile",
X "too many rows in screen file",
X "too many columns in screenfile",
X "quit the game",
X "cannot get your username",
X "cannot open savefile",
X "error writing to savefile",
X "cannot stat savefile",
X "error reading savefile",
X "cannot restore, your savefile has been altered",
X "game saved",
X "too many entries in score table",
X "cannot open score file",
X "error reading scorefile",
X "error writing scorefile",
X "illegal command line syntax",
X "illegal password",
X "level number too large in command line",
X "only the game owner is allowed to make a new score table",
X "cannot find file to restore",
X "cannot find bitmap file",
X "cannot open display",
X "cannot load font",
X "cannot allocate string memory",
X "could not load requested color"
X};
X
X/* usage message */
X#define USAGESTR \
X "usage: %s [-{r|<nn>|C} -s[level] -c[file] -display <disp> -{w|walls} -{f|font} \n\
X -{rv|reverse} -{b|bitdir} <path> -{fg|foreground} <color> \n\
X -{bg|background} <color> -{bd|border} <color> \n\
X -{pr|pointer} <color> -xrm <arg>] [-v <level> <user> <bytes>\n\n"
X
Xchar *usages[] = {
X "\t-c[textfile] : create a new score file (\"superuser\" only)\n",
X "\t-r : restore a saved game.\n",
X "\t-s [level] : show high score table or a portion of it.\n",
X "\t-<nn> : play level <nn> (<nn> must be greater than 0)\n",
X "\t-C : use own colormap for displaying\n",
X "\t-display <disp> : run on display <disp>\n",
X "\t-w :\n",
X "\t-walls : use fancy walls\n",
X "\t-rv :\n",
X "\t-reverse : reverse the foreground and backgound colors\n",
X "\t-f <fn> :\n",
X "\t-font <fn> : use font <fn>\n",
X "\t-b <path> :\n",
X "\t-bitdir <path> : use bitmaps found in directory <path>\n",
X "\t-fg <color> :\n",
X "\t-foregound <color> : use <color> as foreground color\n",
X "\t-bg <color> :\n",
X "\t-backgound <color> : use <color> as background color\n",
X "\t-bd <color> :\n",
X "\t-border <color> : use <color> as border color\n",
X "\t-pr <color> :\n",
X "\t-pointer <color> : use <color> as the pointer foreground color\n",
X "\t-xrm <arg> : specify that <arg> is an X resource.\n",
X "\t-v <level> <user> <bytes> : verify and score a solution. Soln on stdin.\n",
X NULL
X};
END_OF_FILE
if test 2762 -ne `wc -c <'xsokoban/errors.h'`; then
echo shar: \"'xsokoban/errors.h'\" unpacked with wrong size!
fi
# end of 'xsokoban/errors.h'
fi
if test ! -d 'xsokoban/screens' ; then
echo shar: Creating directory \"'xsokoban/screens'\"
mkdir 'xsokoban/screens'
fi
echo shar: End of archive 1 \(of 8\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 8 archives.
rm -f ark[1-9]isdone
else
echo You still must unpack the following archives:
echo " " ${MISSING}
fi
exit 0
exit 0 # Just in case...
--
// ch...@Sterling.COM | Send comp.sources.x submissions to:
\X/ Amiga: The only way to fly! | sour...@sterling.com
GCS d++(--) h++ s++:+ g+++(?) p? au(*)(0) a w+ v-(*) C++ US+++ P+ L+ 3 N++ K
!W M V-- -po+ Y+ t+ 5++ j- r+ G+ v b+++ D- b-- e+ u+ h- f+ r+++ !n y+++

Andrew Myers

unread,
Nov 3, 1994, 10:30:27 AM11/3/94
to
Submitted-by: an...@tonic.lcs.mit.edu (Andrew Myers)
Posting-number: Volume 22, Issue 135
Archive-name: xsokoban/part02

Environment: X11, game
Supersedes: xsokoban: Volume 21, Issue 98-104

#! /bin/sh


# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: xsokoban/bitmaps/defaults/saveman.xpm xsokoban/play.c
# xsokoban/score.c


# Wrapped by chris@sparky on Thu Nov 3 09:23:49 1994
PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 2 (of 8)."'
if test -f 'xsokoban/bitmaps/defaults/saveman.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/saveman.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/saveman.xpm'\" \(4367 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/saveman.xpm' <<'END_OF_FILE'
X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */
X"40 40 55 2",
X/* colors */
X"`b c #E6E51B",
X"`c c #514A35",
X"`e c #D9D98C",
X"`j c #BE8A4A",
X"`o c #585856",
X"`r c #525250",
X"`t c #BC8C4B",
X"`x c #CC9275",
X"`y c #8D6737",
X"`z c #555042",
X"a` c #B68352",
X"aa c #9A723D",
X"af c #5D5543",
X"ah c #595956",
X"al c #CAC829",
X"an c #B98747",
X"aq c #302E20",
X"ar c #7D603A",
X"at c #DDDD8E",
X"au c #514A33",
X"av c #939363",
X"az c #5A5A56",
X"bj c #979770",
X"bl c #DAD741",
X"bm c #58585D",
X"bn c #DADA8D",
X"bo c #565551",
X"bp c #926740",
X"bq c #804E35",
X"bs c #A2A142",
X"bu c #9E9E73",
X"bw c #514B38",
X"bx c #5F4A28",
X"cb c #BA998B",
X"cc c #B18340",
X"cd c #715336",
X"cf c #573423",
X"ch c #DBDB8D",
X"cj c #C4A03B",
X"cl c #585855",
X"cn c #D7D78C",
X"co c #AB7F40",
X"ct c #545454",
X"cx c #DBDA8C",
X"df c #D8D88C",
X"dg c #D6D68A",
X"di c #BBB720",
X"dj c #9C9C72",
X"dk c #8F872D",
X"dl c #555554",
X"dm c #504E45",
X"do c #605D4E",
X"dp c #DFDF8F",
X"dq c #766B3F",
X"dr c #98793C",
X/* pixels */
X"bjdgdpdpdpdpdpdpdpatbuazdlctctctctctctdlavcnatdpdpdpdpdpdpatbuazctctctctctctctct",
X"dlbjcndpdpdpdpdpdpdpdpbuazctctctctdlazazdobubndpdpdpdpdpdpdpdfbjahctctctctctctct",
X"ct`objdgdpdpdpdpdpdpdpchbuazctazdqa``t`t`t`t`tdgdgdpdpdpdpdpdpdfbjahctctctctctct",
X"ctctctbjcndpdpdpdpdpdpdpchbudo`tcj`tcjancccodr`ybscxdpdpdpdpdpdpdfbjahctctctctct",
X"ctctct`objdgdpdpdpdpdpdpdpch`xdrcc`t`jcccodr`yarcd`xdpdpdpdpdpdpdpdfbjahctctctct",
X"ctctctctdlbjdfdpdpdpdpdpdpdpcjauaqbxdrcccodkcfaqaqdk`edpdpdpdpdpdpdpcnbjahctctct",
X"ctctctctct`objcndpdpdpdpdpcxcj`tdrcdbxaaaacfbxbxbxcdbubndpdpdpdpdpdpdpdfbjahctct",
X"ctctctctctct`objdfdpdpdpdpdp`xcjaadq`ycodrarcdcdarardodjbndpdpdpdpdpdpdpcnbjahct",
X"ctctctctctctct`objcndpdpdpcxblcja`aadrcccc`ycddqarcdafahdjbndpdpdpdpdpdpdpdfbj`o",
X"clctctctctctctct`obj`edpdpdpcj`xcjcjcjcjccdkdk`y`yarboctazdjbndpdpdpdpdpdpdpdfdj",
X"bjazctctctctctctct`objdgdg`xcj`b`b`bal`bdialdididkdkafdlctazdjbndpdpdpdpdpdpdpat",
X"chbuazctctctctctctct`ravdq`ycj`b`b`b`b`bal`bdididicjdqdm`rctazdjbndpdpdpdpdpdpdp",
X"dpchbuazdlctctctctct`r`cauauco`b`b`b`bdi`bdidididi`yauau`z`rctazbubndpdpdpdpdpdp",
X"dpdpatbuazctctctctctdmauauaubqcj`b`bdi`bdididididibxauauau`zctctazbubndpdpdpdpdp",
X"dpdpdpchbuazctctct`rbwauauaucdandi`bdi`bdididididkcdauauaubw`rctctazbubndpdpdpdp",
X"dpdpdpdpchbuazctct`r`cauauaucdanandi`bdididididianbxauauauau`zctctctazbubndpdpdp",
X"dpdpdpdpdpbnbuazctdmauauauaucdan`jcjdididididicccccdauauauau`zctctctctazbubndpdp",
X"dpdpdpdpdpdpbnbuaz`zauauauaucdccanandidididiccananafauauauaubwctctctctctazbubndp",
X"dpdpdpdpdpdpdpbndj`zauauauaubwan`j`jancjdicccc`j`jcdauauauau`zctctctctctctazbubn",
X"atdpdpdpdpdpdpdpatdqauauauaucdan`j`j`jccccan`j`j`jarauauauaubwctctctctctctctazbj",
X"djcndpdpdpdpdpdpdpavbwauauaucdan`j`j`j`j`j`j`j`j`jbpauauauau`zclctctctctctctctcl",
X"`objcndpdpdpdpdpdpbuauauauauarananan`jan`j`j`j`j`jcoauauau`cdqbjahctctctctctctct",
X"ct`objdgdpdpdpdpdpdgauauauauaranccanccanccanananancocdauauauavdgbj`octctctctctct",
X"ctctdlbjcndpdpdpcxdgdqauau`caacocococccoccccccccccccarauauauavbncnbjahctctctctct",
X"ctctct`odjchdpdpdpatbubwaucdaaaacoaacocoaacococococobp`cau`cbudpdpdfbjahctctctct",
X"ctctctctazbuchdpdpdp`edqauaraaaaaaaabpaaaaaaaaaaaaaadrcd`cdqdgdpdpdpcnbjahctctct",
X"ctctctctctazbuchdpdpdpdgavaa`ybp`yaabpbpbpbpbpbpbpaabp`ydqcbdpdpdpdpdpdfbjahctct",
X"ctctctctct`oazbuchdpdpat`e`t`y`y`y`y`y`y`y`y`y`y`y`y`yaabsdpdpdpdpdpdpdpcnbjahct",
X"ctctctctctctdlazbuatdpdpdpbn`xdr`y`y`y`y`y`y`y`y`y`y`ydqbudpdpdpdpdpdpdpdpdfbj`o",
X"dlctctctctctct`oazbuchdpdpdpcxdgcjdkaa`y`y`y`y`y`ydkdqctbmdjbndpdpdpdpdpdpdpdfdj",
X"av`octctctctctctdlazbuatdpdpdpdgdidi`t`xbsarardodkdiar`zctazdjbndpdpdpdpdpdpdpat",
X"dgbj`octctctctctctahazbuchdpatbldidi`edpdgbjahbodqdidkdoctctazdjbndpdpdpdpdpdpdp",
X"dpcnbjdlctctctctctctdlazbudpataldididgatatdgavctdodidibxclctctazbubndpdpdpdpdpdp",
X"dpatdgbj`octctctctctdlazazbubldidibschatdpbndgavafdkdidkboctctctazbubndpdpdpdpdp",
X"dpdpdpcnbjdlctctctctctctdodkaldidibsdpdpdpdpatcnavdkdidkdqafdlctctazbubndpdpdpdp",
X"dpdpdpatdgbj`octctctbodqdkdididididialdgdpdpatcnbldididididkdqdodlctazbubndpdpdp",
X"dpdpdpdpdpcnbjdlctctdododqdmbwdkbsblblbsdgdpatdgdibsbsdidkbxdkafdo`rdlazbubndpdp",
X"dpdpdpdpdpatdgbj`octdl`r`rdldmafbmbucndpcxatdgdgchdpdgbsdq`r`r`rctctctctazbubndp",
X"dpdpdpdpdpdpdpdgbjdlctdldldldlboboazbudpdpdpcxcxatdpdpdgav`rdldldlctctctctazbubn",
X"dpdpdpdpdpdpdpchdgavdlctctctdldldlbmdobudpdpdpdpdpdpdp`edgavdlctctctctctctdlazbu"
X};
END_OF_FILE
if test 4367 -ne `wc -c <'xsokoban/bitmaps/defaults/saveman.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/saveman.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/saveman.xpm'
fi
if test -f 'xsokoban/play.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/play.c'\"
else
echo shar: Extracting \"'xsokoban/play.c'\" \(23785 characters\)
sed "s/^X//" >'xsokoban/play.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include <assert.h>
X#include <string.h>
X#include <stdlib.h>
X#include <ctype.h>
X
X#include "externs.h"
X#include "globals.h"
X
Xextern int abs(int);
X
X/* defining the types of move */
X#define MOVE 1
X#define PUSH 2
X#define SAVE 3
X#define UNSAVE 4
X#define STOREMOVE 5
X#define STOREPUSH 6
X
X/* This value merely needs to be greater than the longest possible path length
X * making it the number of squares in the array seems a good bet.
X */
X#define BADMOVE MAXROW*MAXCOL
X
X/* some simple checking macros to make sure certain moves are legal when
X * trying to do mouse based movement.
X */
X#define ISPLAYER(x,y) ((map[x][y] == player) || (map[x][y] == playerstore))
X#define ISCLEAR(x,y) ((map[x][y] == ground) || (map[x][y] == store))
X#define ISPACKET(x,y) ((map[x][y] == packet) || (map[x][y] == save))
X
X/* Some macros useful in MultiPushPacket */
X#define D_RIGHT 0
X#define D_UP 1
X#define D_LEFT 2
X#define D_DOWN 3
X
X#define UNVISITED (BADMOVE+1)
X
X#define SETPACKET(x, y) map[x][y] = (map[x][y] == ground) ? packet : save
X#define CLEARPACKET(x, y) map[x][y] = (map[x][y] == packet) ? ground : store
X#define CAN_GO(x, y, d) \
X (ISCLEAR(x+Dx[d], y+Dy[d]) && PossibleToReach(x-Dx[d], y-Dy[d]))
X#define OPDIR(d) ((d+2) % 4)
X
X/* Variables used in MultiPushPacket. */
Xstatic int pmap[MAXROW+1][MAXCOL+1][4];
Xstatic char dmap[MAXROW+1][MAXCOL+1][4];
X
Xstatic int x1, y1;
Xstatic int Dx[4] = {0, -1, 0, 1};
Xstatic int Dy[4] = {1, 0, -1, 0};
Xstatic int moveKeys[4] = {XK_Right, XK_Up, XK_Left, XK_Down};
Xvoid MultiPushPacket(int, int);
X
X
Xstatic XEvent xev;
Xstatic POS tpos1, tpos2, lastppos, lasttpos1, lasttpos2;
Xstatic char lppc, ltp1c, ltp2c;
Xstatic short action, lastaction;
X
Xstatic Boolean shift = _false_;
Xstatic Boolean cntrl = _false_;
Xstatic Boolean displaying = _true_;
Xstatic KeySym oldmove;
Xstatic int findmap[MAXROW+1][MAXCOL+1];
X
X#define MAXDELTAS 4
X
X/** For stack saves. **/
Xstruct map_delta {
X int x,y;
X char oldchar, newchar;
X};
Xstruct move_r {
X short px, py;
X short moves, pushes, saved, ndeltas;
X struct map_delta deltas[MAXDELTAS];
X};
Xstatic struct move_r move_stack[STACKDEPTH];
Xstatic int move_stack_sp; /* points to last saved move. If no saved move, -1 */
Xstatic Map prev_map;
Xstatic void RecordChange(void);
Xstatic void UndoChange(void);
Xstatic void InitMoveStack(void);
X
Xstatic int tempsave;
X/* The move index at which a temporary save request was made */
X
XBoolean ApplyMoves(int moveseqlen, char *moveseq);
X/* forward decl */
X
X/* Play a particular level.
X All we do here is wait for input, and dispatch to appropriate routines
X to deal with it nicely.
X*/
Xshort Play(void)
X{
X short ret;
X int bufs = 1;
X char buf[1];
X KeySym sym;
X XComposeStatus compose;
X
X displaying = _true_;
X ClearScreen();
X ShowScreen();
X InitMoveStack();
X tempsave = moves;
X ret = 0;
X while (ret == 0) {
X XNextEvent(dpy, &xev);
X switch(xev.type) {
X case Expose:
X /* Redisplaying is pretty cheap, so I don't care too much about it */
X RedisplayScreen();
X break;
X case ButtonPress:
X switch(xev.xbutton.button) {
X case Button1:
X /* move the man to where the pointer is. */
X MoveMan(xev.xbutton.x, xev.xbutton.y);
X RecordChange();
X break;
X case Button2:
X /* Push a ball */
X PushMan(xev.xbutton.x, xev.xbutton.y);
X RecordChange();
X break;
X case Button3:
X /* undo last move */
X UndoChange();
X ShowScreen();
X break;
X default:
X /* I'm sorry, you win the irritating beep for your efforts. */
X HelpMessage();
X break;
X }
X RedisplayScreen();
X break;
X case KeyPress:
X buf[0] = '\0';
X (void) XLookupString(&xev.xkey, buf, bufs, &sym, &compose);
X cntrl = (xev.xkey.state & ControlMask) ? _true_ : _false_;
X shift = (xev.xkey.state & ShiftMask) ? _true_ : _false_;
X switch(sym) {
X case XK_q:
X /* q is for quit */
X if(!cntrl)
X ret = E_ABORTLEVEL;
X break;
X case XK_S:
X if (shift || cntrl) {
X ret = DisplayScores(0);
X RedisplayScreen();
X }
X break;
X case XK_s:
X /* save */
X if(!cntrl && !shift) {
X ret = SaveGame();
X if(ret == 0)
X ret = E_SAVED;
X }
X break;
X case XK_question:
X /* help */
X if(!cntrl) {
X ShowHelp();
X RedisplayScreen();
X }
X break;
X case XK_r:
X /* ^R refreshes the screen */
X if(cntrl)
X RedisplayScreen();
X break;
X case XK_U:
X /* Do a full screen reset */
X if(!cntrl) {
X tempsave = moves = pushes = 0;
X ret = ReadScreen();
X InitMoveStack();
X if(ret == 0) {
X ShowScreen();
X }
X }
X break;
X case XK_u:
X if(!cntrl) {
X UndoChange();
X ShowScreen();
X } else {
X Bool ok;
X moves = pushes = 0;
X ret = ReadScreen();
X InitMoveStack();
X ok = ApplyMoves(tempsave, move_history);
X RecordChange();
X assert(ok);
X ShowScreen();
X assert(tempsave == moves);
X }
X break;
X case XK_c:
X if (!cntrl) {
X if (moves < MOVE_HISTORY_SIZE) tempsave = moves;
X else tempsave = MOVE_HISTORY_SIZE - 1;
X }
X break;
X case XK_k:
X case XK_K:
X case XK_Up:
X case XK_j:
X case XK_J:
X case XK_Down:
X case XK_l:
X case XK_L:
X case XK_Right:
X case XK_h:
X case XK_H:
X case XK_Left:
X /* A move, A move!! we have a MOVE!! */
X MakeMove(sym);
X RedisplayScreen();
X RecordChange();
X break;
X default:
X /* I ONLY want to beep if a key was pressed. Contrary to what
X * X11 believes, SHIFT and CONTROL are NOT keys
X */
X if(buf[0]) {
X HelpMessage();
X }
X break;
X }
X break;
X case ClientMessage:
X {
X XClientMessageEvent *cm = (XClientMessageEvent *)&xev;
X if (cm->message_type == wm_protocols &&
X cm->data.l[0] == wm_delete_window)
X ret = E_ENDGAME;
X }
X break;
X default:
X break;
X }
X /* if we solved a level, set it up so we get some score! */
X if((ret == 0) && (packets == savepack)) {
X scorelevel = level;
X scoremoves = moves;
X scorepushes = pushes;
X break;
X }
X }
X return ret;
X}
X
X/* Perform a user move based on the key in "sym". */
Xvoid MakeMove(KeySym sym)
X{
X do {
X action = TestMove(sym);
X if(action != 0) {
X lastaction = action;
X lastppos.x = ppos.x;
X lastppos.y = ppos.y;
X lppc = map[ppos.x][ppos.y];
X lasttpos1.x = tpos1.x;
X lasttpos1.y = tpos1.y;
X ltp1c = map[tpos1.x][tpos1.y];
X lasttpos2.x = tpos2.x;
X lasttpos2.y = tpos2.y;
X ltp2c = map[tpos2.x][tpos2.y];
X DoMove(lastaction);
X /* store the current keysym so we can do the repeat. */
X oldmove = sym;
X }
X } while ((action != 0) && (packets != savepack) && (shift || cntrl));
X}
X
X/* make sure a move is valid and if it is, return type of move */
Xshort TestMove(KeySym action)
X{
X short ret;
X char tc;
X Boolean stop_at_object;
X
X stop_at_object = cntrl;
X
X if((action == XK_Up) || (action == XK_k) || (action == XK_K)) {
X tpos1.x = ppos.x-1;
X tpos2.x = ppos.x-2;
X tpos1.y = tpos2.y = ppos.y;
X if (moves < MOVE_HISTORY_SIZE) move_history[moves] = 'k';
X }
X if((action == XK_Down) || (action == XK_j) || (action == XK_J)) {
X tpos1.x = ppos.x+1;
X tpos2.x = ppos.x+2;
X tpos1.y = tpos2.y = ppos.y;
X if (moves < MOVE_HISTORY_SIZE) move_history[moves] = 'j';
X }
X if((action == XK_Left) || (action == XK_h) || (action == XK_H)) {
X tpos1.y = ppos.y-1;
X tpos2.y = ppos.y-2;
X tpos1.x = tpos2.x = ppos.x;
X if (moves < MOVE_HISTORY_SIZE) move_history[moves] = 'h';
X }
X if((action == XK_Right) || (action == XK_l) || (action == XK_L)) {
X tpos1.y = ppos.y+1;
X tpos2.y = ppos.y+2;
X tpos1.x = tpos2.x = ppos.x;
X if (moves < MOVE_HISTORY_SIZE) move_history[moves] = 'l';
X }
X tc = map[tpos1.x][tpos1.y];
X if((tc == packet) || (tc == save)) {
X if(!stop_at_object) {
X if(map[tpos2.x][tpos2.y] == ground)
X ret = (tc == save) ? UNSAVE : PUSH;
X else if(map[tpos2.x][tpos2.y] == store)
X ret = (tc == save) ? STOREPUSH : SAVE;
X else
X ret = 0;
X } else
X ret = 0;
X } else if(tc == ground)
X ret = MOVE;
X else if(tc == store)
X ret = STOREMOVE;
X else
X ret = 0;
X return ret;
X}
X
X/* actually update the internal map with the results of the move */
Xvoid DoMove(short moveaction)
X{
X map[ppos.x][ppos.y] = (map[ppos.x][ppos.y] == player) ? ground : store;
X switch( moveaction) {
X case MOVE:
X map[tpos1.x][tpos1.y] = player;
X break;
X case STOREMOVE:
X map[tpos1.x][tpos1.y] = playerstore;
X break;
X case PUSH:
X map[tpos2.x][tpos2.y] = map[tpos1.x][tpos1.y];
X map[tpos1.x][tpos1.y] = player;
X pushes++;
X break;
X case UNSAVE:
X map[tpos2.x][tpos2.y] = packet;
X map[tpos1.x][tpos1.y] = playerstore;
X pushes++;
X savepack--;
X break;
X case SAVE:
X map[tpos2.x][tpos2.y] = save;
X map[tpos1.x][tpos1.y] = player;
X savepack++;
X pushes++;
X break;
X case STOREPUSH:
X map[tpos2.x][tpos2.y] = save;
X map[tpos1.x][tpos1.y] = playerstore;
X pushes++;
X break;
X }
X moves++;
X if (displaying) {
X DisplayMoves();
X DisplayPushes();
X DisplaySave();
X MapChar(map[ppos.x][ppos.y], ppos.x, ppos.y, 1);
X MapChar(map[tpos1.x][tpos1.y], tpos1.x, tpos1.y, 1);
X MapChar(map[tpos2.x][tpos2.y], tpos2.x, tpos2.y, 1);
X SyncScreen();
X#ifdef HAS_USLEEP
X usleep(SLEEPLEN * 1000);
X#endif
X }
X ppos.x = tpos1.x;
X ppos.y = tpos1.y;
X}
X
X/* find the shortest path to the target via a fill search algorithm */
Xvoid FindTarget(int px, int py, int pathlen)
X{
X if(!(ISCLEAR(px, py) || ISPLAYER(px, py)))
X return;
X if(findmap[px][py] <= pathlen)
X return;
X
X findmap[px][py] = pathlen++;
X
X if((px == ppos.x) && (py == ppos.y))
X return;
X
X FindTarget(px - 1, py, pathlen);
X FindTarget(px + 1, py, pathlen);
X FindTarget(px, py - 1, pathlen);
X FindTarget(px, py + 1, pathlen);
X}
X
X/* Do all the fun movement stuff with the mouse */
Xvoid MoveMan(int mx, int my)
X{
X int x, y;
X
X shift = cntrl = _false_;
X
X /* reverse the screen coords to get the internal coords (yes, I know this
X * should be fixed) RSN */
X y = wX(mx);
X x = wY(my);
X
X /* make sure we are within the bounds of the array */
X if((x < 0) || (x > MAXROW) || (y < 0) || (y > MAXCOL)) {
X HelpMessage();
X return;
X }
X
X /* If the click was on a packet then try to 'drag' the packet */
X if(ISPACKET(x, y)) {
X MultiPushPacket(x, y);
X return;
X }
X
X /* if we clicked on the player or a wall (or an object but that was already
X * handled) the we don't want to move.
X */
X if(!ISCLEAR(x, y)) {
X HelpMessage();
X return;
X }
X if (!RunTo(x, y)) HelpMessage();
X}
X
X/* Return whether (x,y) is on the board */
XBoolean ValidPosn(int x, int y)
X{
X return (x >= 0) && (x <= MAXROW) && (y >= 0) && (y <= MAXCOL);
X}
X
X/*
X Find the object at a position orthogonal to (x, y) that is
X closest to (ppos.x, ppos.y), is separated from (x,y) only
X by empty spaces, and has the player or an empty space on the far
X side of (x,y), and is not directly opposite the destination space
X from the player; place its coordinates in (*ox, *oy) and return _true_.
X If no such object exists, return _false_.
X*/
XBoolean FindOrthogonalObject(int x, int y, int *ox, int *oy)
X{
X int dir;
X int bestdist = BADMOVE;
X Boolean foundOne = _false_;
X for (dir = 0; dir < 4; dir++) {
X int dx, dy, x1, y1, dist;
X switch(dir) {
X default: dx = 1; dy = 0; break; /* use "default" to please gcc */
X case 1: dx = -1; dy = 0; break;
X case 2: dx = 0; dy = 1; break;
X case 3: dx = 0; dy = -1; break;
X }
X if ((ppos.x == x && ((ppos.y - y)*dy) < 0)
X || (ppos.y == y && ((ppos.x - x)*dx) < 0)) continue;
X /* Eliminate case where player would push in the opposite
X direction. */
X x1 = x; y1 = y;
X while (ValidPosn(x1, y1)) {
X x1 += dx; y1 += dy;
X dist = abs(ppos.x - x1) + abs(ppos.y - y1);
X if (dist <= bestdist && ISPACKET(x1, y1) &&
X (ISPLAYER(x1 + dx, y1 + dy) || ISCLEAR(x1 + dx, y1 + dy))) {
X if (dist < bestdist) {
X bestdist = dist;
X *ox = x1;
X *oy = y1;
X foundOne = _true_;
X break;
X } else {
X foundOne = _false_; /* found one that was just as good */
X }
X }
X if (!ISCLEAR(x1, y1)) break;
X }
X }
X return foundOne ? _true_ : _false_ ;
X}
X
X
X/* Kind of a self explanatory name, ehh? */
XBoolean PossibleToReach(int x, int y)
X{
X int i,j;
X
X /* Fill the trace map */
X for(i = 0; i <= MAXROW; i++)
X for (j = 0; j <= MAXCOL; j++)
X findmap[i][j] = BADMOVE;
X
X /* flood fill search to find a shortest path to the push point. */
X FindTarget(x, y, 0);
X return (findmap[ppos.x][ppos.y] != BADMOVE);
X}
X
X/* Try to find the goal from (x, y), coming from 'direction', */
X/* having walked 'dist' units. */
Xint PushFromDir(int x, int y, int direction, int dist)
X{
X int r, res, d, fx = ppos.x, fy = ppos.y;
X
X /* Have we been here before? */
X if (pmap[x][y][direction] != UNVISITED) {
X if (pmap[x][y][direction] == BADMOVE)
X return BADMOVE;
X else
X return dist+pmap[x][y][direction]-1;
X }
X
X /* Have we found the target? */
X if (x==x1 && y==y1) {
X pmap[x][y][direction] = 1;
X return dist;
X }
X
X /* Try going in all four directions. Choose the shortest path, if any */
X res = BADMOVE;
X pmap[x][y][direction] = BADMOVE;
X for (d = 0; d < 4; d++) {
X ppos.x = fx; ppos.y = fy;
X if (CAN_GO(x, y, d)) {
X CLEARPACKET(x, y);
X SETPACKET(x+Dx[d], y+Dy[d]);
X ppos.x = x;
X ppos.y = y;
X r = PushFromDir(x+Dx[d], y+Dy[d], OPDIR(d), dist+1);
X if (r < res) {
X dmap[x][y][direction] = d;
X res = r;
X }
X SETPACKET(x, y);
X CLEARPACKET(x+Dx[d], y+Dy[d]);
X }
X }
X pmap[x][y][direction] = (res == BADMOVE) ? BADMOVE : res-dist+1;
X ppos.x = fx;
X ppos.y = fy;
X return res;
X}
X
X/*
X The player has pressed button two on a packet.
X Wait for the release of the button and then try to move the
X packet from the button press coord to the button release coord.
X Give help message (i.e. beep...) if it is not possible.
X Code by Jan Sparud.
X*/
Xvoid MultiPushPacket(int x0, int y0)
X{
X int i, j, k, d = 0, r, result;
X char manChar;
X
X /* Wait for button release */
X XNextEvent(dpy, &xev);
X while (!(xev.type == ButtonRelease &&
X (xev.xbutton.button == Button2 ||
X xev.xbutton.button == Button1)))
X XNextEvent(dpy, &xev);
X
X y1 = wX(xev.xbutton.x);
X x1 = wY(xev.xbutton.y);
X
X if (x0 == x1 && y0 == y1) {
X /* Player just clicked on a stone. If man is next to stone,
X just push it once.
X */
X if(ISPLAYER(x0 - 1, y0))
X MakeMove(XK_Down);
X else if(ISPLAYER(x0 + 1, y0))
X MakeMove(XK_Up);
X else if(ISPLAYER(x0, y0 - 1))
X MakeMove(XK_Right);
X else if(ISPLAYER(x0, y0 + 1))
X MakeMove(XK_Left);
X else {
X /* we weren't right next to the object */
X HelpMessage();
X return;
X }
X return;
X }
X
X if (!ValidPosn(x1, y1) || (!ISCLEAR(x1, y1) && !ISPLAYER(x1, y1))) {
X HelpMessage();
X return;
X }
X
X /* Remove (temporarily) the player from the board */
X manChar = map[ppos.x][ppos.y];
X map[ppos.x][ppos.y] = map[ppos.x][ppos.y] == player ? ground : store;
X
X /* Prepare the distance map */
X for (i=0; i<MAXROW; i++)
X for (j=0; j<MAXCOL; j++)
X if (ISCLEAR(i, j) || (i==x0 && j==y0))
X for (k=0; k<4; k++)
X pmap[i][j][k] = UNVISITED;
X else
X for (k=0; k<4; k++)
X pmap[i][j][k] = BADMOVE;
X
X /* Try to go from the start position in all four directions */
X result = BADMOVE;
X for (k = 0; k < 4; k++)
X if (CAN_GO(x0, y0, k)) {
X r = PushFromDir(x0, y0, OPDIR(k), 1);
X if (r < result) {
X d = OPDIR(k);
X result = r;
X }
X }
X
X /* Put the player on the board again */
X map[ppos.x][ppos.y] = manChar;
X
X /* If we found a way (i.e. result < BADMOVE) then follow the route */
X if (result < BADMOVE) {
X for (i = x0, j = y0; !(i==x1 && j==y1);) {
X d = OPDIR(dmap[i][j][d]);
X RunTo(i+Dx[d], j+Dy[d]);
X i -= Dx[d];
X j -= Dy[d];
X MakeMove(moveKeys[OPDIR(d)]);
X }
X } else {
X /* Otherwise, beep */
X HelpMessage();
X return;
X }
X}
X
X/* Push a nearby stone to the position indicated by (mx, my). */
Xvoid PushMan(int mx, int my)
X{
X int i, x, y, ox, oy, dist;
X
X shift = cntrl = _false_;
X
X /* reverse the screen coords to get the internal coords (yes, I know this
X * should be fixed) RSN */
X y = wX(mx);
X x = wY(my);
X
X /* make sure we are within the bounds of the array */
X if(!ValidPosn(x,y)) {
X HelpMessage();
X return;
X }
X
X /* If the click was on a packet then try to 'drag' the packet */
X if(ISPACKET(x, y)) {
X MultiPushPacket(x, y);
X return;
X }
X
X /* if we clicked on the player or a wall (or an object but that was already
X * handled) the we don't want to move.
X */
X if(!ISCLEAR(x, y)) {
X HelpMessage();
X return;
X }
X
X if (!FindOrthogonalObject(x, y, &ox, &oy)) {
X HelpMessage();
X return;
X }
X
X assert(x == ox || y == oy);
X dist = abs(ox - x) + abs(oy - y);
X
X if (x > ox) ox--;
X if (x < ox) ox++;
X if (y > oy) oy--;
X if (y < oy) oy++;
X
X /* (ox,oy) now denotes the place we need to run to to be able to push */
X
X if (ox != ppos.x || oy != ppos.y) {
X if (!ISCLEAR(ox, oy)) {
X HelpMessage();
X return;
X }
X if (!RunTo(ox, oy)) {
X HelpMessage();
X return;
X }
X }
X assert(ppos.x == ox && ppos.y == oy);
X
X for (i = 0; i < dist; i++) {
X if (ppos.x < x) MakeMove(XK_Down);
X if (ppos.x > x) MakeMove(XK_Up);
X if (ppos.y < y) MakeMove(XK_Right);
X if (ppos.y > y) MakeMove(XK_Left);
X }
X}
X
X/* Move the player to the position (x,y), if possible. Return _true_
X iff successful. The position (x,y) must be clear.
X*/
XBoolean RunTo(int x, int y)
X{
X int i,j,cx,cy;
X /* Fill the trace map */
X for(i = 0; i <= MAXROW; i++)
X for (j = 0; j <= MAXCOL; j++)
X findmap[i][j] = BADMOVE;
X /* flood fill search to find a shortest path to the push point. */
X FindTarget(x, y, 0);
X
X /* if we didn't make it back to the players position, there is no valid path
X * to that place.
X */
X if(findmap[ppos.x][ppos.y] == BADMOVE) {
X return _false_;
X } else {
X /* we made it back, so let's walk the path we just built up */
X cx = ppos.x;
X cy = ppos.y;
X while(findmap[cx][cy]) {
X if(findmap[cx - 1][cy] == (findmap[cx][cy] - 1)) {
X MakeMove(XK_Up);
X cx--;
X } else if(findmap[cx + 1][cy] == (findmap[cx][cy] - 1)) {
X MakeMove(XK_Down);
X cx++;
X } else if(findmap[cx][cy - 1] == (findmap[cx][cy] - 1)) {
X MakeMove(XK_Left);
X cy--;
X } else if(findmap[cx][cy + 1] == (findmap[cx][cy] - 1)) {
X MakeMove(XK_Right);
X cy++;
X } else {
X /* if we get here, something is SERIOUSLY wrong, so we should abort */
X abort();
X }
X }
X }
X return _true_;
X}
X
X
Xstatic void InitMoveStack()
X{
X move_stack_sp = -1;
X move_stack[0].moves = moves;
X move_stack[0].pushes = pushes;
X move_stack[0].saved = savepack;
X memcpy(prev_map, map, sizeof(map));
X}
X
X/* Add a record to the move stack that records the changes since the
X last map state (which is stored in "prev_map"). Update "prev_map"
X to contain the current map so the next call to "RecordChange()"
X will perform correctly.
X
X If the stack runs out of space, dump the oldest half of the
X saved moves and continue. Undoing past that point will jump
X back to the beginning of the level. If the user is using the
X mouse or any skill, should never happen.
X*/
Xstatic void RecordChange()
X{
X struct move_r *r = &move_stack[++move_stack_sp];
X int x,y, ndeltas = 0;
X assert(move_stack_sp < STACKDEPTH);
X if (move_stack_sp == STACKDEPTH - 1) {
X int shift = STACKDEPTH/2;
X memcpy(&move_stack[0], &move_stack[shift],
X sizeof(struct move_r) * (STACKDEPTH - shift));
X move_stack_sp -= shift;
X r -= shift;
X }
X r[1].moves = moves;
X r[1].pushes = pushes;
X r[1].saved = savepack;
X r[1].px = ppos.x;
X r[1].py = ppos.y;
X for (x = 0; x <= MAXROW; x++) {
X for (y = 0; y <= MAXROW; y++) {
X if (map[x][y] != prev_map[x][y]) {
X assert(ndeltas < MAXDELTAS);
X r->deltas[ndeltas].x = x;
X r->deltas[ndeltas].y = y;
X r->deltas[ndeltas].newchar = map[x][y];
X r->deltas[ndeltas].oldchar = prev_map[x][y];
X ndeltas++;
X#if 0
X printf("Change (%d,%d) %c->%c\n", x, y, prev_map[x][y],
X map[x][y]);
X#endif
X }
X }
X }
X r->ndeltas = ndeltas;
X if (ndeltas == 0) {
X move_stack_sp--; /* Why push an identical entry? */
X }
X memcpy(prev_map, map, sizeof(map));
X}
X
Xstatic void UndoChange()
X{
X if (move_stack_sp <= 0) {
X int ret;
X moves = pushes = 0;
X ret = ReadScreen();
X InitMoveStack();
X if (ret) {
X fprintf(stderr, "Can't read screen file\n");
X exit(-1);
X }
X } else {
X struct move_r *r = &move_stack[move_stack_sp];
X int i;
X moves = r->moves;
X pushes = r->pushes;
X savepack = r->saved;
X ppos.x = r->px;
X ppos.y = r->py;
X for (i = 0; i<r->ndeltas; i++) {
X#if 0
X printf("Applying reverse change: (%d,%d) %c->%c\n",
X r->deltas[i].x, r->deltas[i].y,
X map[r->deltas[i].x][r->deltas[i].y], r->deltas[i].oldchar);
X#endif
X map[r->deltas[i].x][r->deltas[i].y] = r->deltas[i].oldchar;
X }
X move_stack_sp--;
X memcpy(prev_map, map, sizeof(map));
X }
X}
X
Xchar move_history[MOVE_HISTORY_SIZE];
X
X/* Verify: Determine whether the move sequence solves
X the current level. Return "_true_" if so. Set "moves" and "pushes"
X appropriately.
X
X "moveseqlen" must be the number of characters in "moveseq".
X
X The format of "moveseq" is as described in "ApplyMoves".
X*/
X
XBoolean Verify(int moveseqlen, char *moveseq)
X{
X InitMoveStack();
X tempsave = moves = pushes = 0;
X if (ApplyMoves(moveseqlen, moveseq) && savepack == packets) {
X scorelevel = level;
X scoremoves = moves;
X scorepushes = pushes;
X return _true_;
X } else {
X return _false_;
X }
X}
X
X/* ApplyMoves:
X
X Receive a move sequence, and apply it to the current level as if
X the player had made the moves, but without doing any screen updates.
X Return _true_ if the move sequence is well-formed; _false_ if not.
X
X "moveseqlen" must be the length in characters of "moveseq".
X
X A well-formed move string "moveseq" is a sequence of the characters
X "h,j,k,l" and "1-9".
X
X [hjkl]: move the man by one in the appropriate direction
X [HJKL]: move the man by two in the appropriate direction
X [1-9]: provide a count of how many times the next move
X should be executed, divided by two. Thus, "1" means
X repeat twice, "9" means repeat 18 times. The next
X character must be one of [hjklHJKL].
X*/
Xstatic Boolean SingleMove(char c)
X{
X switch(c) {
X case 'h': MakeMove(XK_h); break;
X case 'H': MakeMove(XK_h); MakeMove(XK_h); break;
X case 'j': MakeMove(XK_j); break;
X case 'J': MakeMove(XK_j); MakeMove(XK_j); break;
X case 'k': MakeMove(XK_k); break;
X case 'K': MakeMove(XK_k); MakeMove(XK_k); break;
X case 'l': MakeMove(XK_l); break;
X case 'L': MakeMove(XK_l); MakeMove(XK_l); break;
X default: return _false_;
X }
X return _true_;
X}
X
XBoolean ApplyMoves(int moveseqlen, char *moveseq)
X{
X int i = 0;
X char lastc = 0;
X Bool olddisp = displaying;
X
X displaying = _false_;
X shift = _false_;
X cntrl = _false_;
X
X while (i < moveseqlen) {
X char c = moveseq[i++];
X if (lastc && c != lastc) RecordChange();
X lastc = c;
X switch (c) {
X case 'h': case 'j': case 'k': case 'l':
X case 'H': case 'J': case 'K': case 'L':
X SingleMove(c);
X break;
X case '1': case '2': case '3':
X case '4': case '5': case '6':
X case '7': case '8': case '9':
X {
X int reps = c - '0';
X if (i == moveseqlen) {
X displaying = olddisp;
X return _false_;
X }
X c = moveseq[i++];
X lastc = tolower(c);
X while (reps--) {
X if (!SingleMove(c)) {
X displaying = olddisp;
X return _false_;
X }
X }
X }
X break;
X }
X }
X RecordChange();
X displaying = olddisp;
X return _true_;
X}
X
END_OF_FILE
if test 23785 -ne `wc -c <'xsokoban/play.c'`; then
echo shar: \"'xsokoban/play.c'\" unpacked with wrong size!
fi
# end of 'xsokoban/play.c'
fi
if test -f 'xsokoban/score.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/score.c'\"
else
echo shar: Extracting \"'xsokoban/score.c'\" \(22258 characters\)
sed "s/^X//" >'xsokoban/score.c' <<'END_OF_FILE'
X#include "config_local.h"
X
X#include <stdio.h>
X#include <signal.h>
X#include <sys/types.h>
X#include <assert.h>
X#include <string.h>
X#include <unistd.h>
X#include <netinet/in.h>
X#include <sys/stat.h>
X#include <errno.h>
X#include <time.h>
X#include <sys/param.h>
X#include <fcntl.h>
X#include <ctype.h>
X#include <stdlib.h>
X
X#include "externs.h"
X#include "globals.h"
X
X#define SCORE_VERSION "xs02"
X
Xshort scoreentries;
Xstruct st_entry scoretable[MAXSCOREENTRIES];
X
X#if !WWW
Xstatic FILE *scorefile;
Xstatic int sfdbn;
X#endif
X
X
X/* Acquire the lock on the score file. This is done by creating a new
X directory. If someone else holds the lock, the directory will exist.
X Since mkdir() should be done synchronously, even over NFS, it will
X fail if someone else holds the lock.
X
X TIMEOUT is the number of seconds which you get to hold the lock on
X the score file for. Also, the number of seconds after which we give
X up on trying to acquire the lock nicely and start trying to break
X the lock. In theory, there are still some very unlikely ways to get
X hosed. See comments in WriteScore about this. Portable locking over
X NFS is hard.
X
X After TIMEOUT seconds, we break the lock, assuming that the old
X lock-holder died in process. If the process that had the lock is
X alive but just very slow, it could end up deleting the changes we
X make, or we could delete its changes. However, the score file can't
X get trashed this way, since rename() is used to update the score file.
X
X See comments in WriteScore about how the score file can get trashed,
X though it's extremely unlikely.
X*/
X
X#if !WWW
Xstatic time_t lock_time;
X/* This timer is used to allow the writer to back out voluntarily if it
X notices that its time has expired. This is not a guarantee that no
X conflicts will occur, since the final rename() in WriteScore could
X take arbitrarily long, running the clock beyond TIMEOUT seconds.
X*/
X#endif
X
Xshort LockScore(void)
X{
X#if !WWW
X int i, result;
X
X for (i = 0; i < TIMEOUT; i++) {
X result = mkdir(LOCKFILE, 0);
X lock_time = time(0);
X if (result < 0) {
X if (errno == EEXIST) sleep(1);
X else return E_WRITESCORE;
X } else {
X break;
X }
X }
X
X if (result < 0) {
X struct stat s;
X time_t t = time(0);
X if (0 > stat(LOCKFILE, &s)) {
X fprintf(stderr, "Warning: Can't mkdir or stat %s\n", LOCKFILE);
X return E_WRITESCORE; /* disappeared? */
X }
X /* Check to make sure that the lock is still the same one we
X saw in the first place. This code assumes loosely synchronized
X clocks. To do it right, we'd have to create another file on
X the server machine, and compare timestamps. Not worth it.
X */
X if (t - s.st_ctime <= TIMEOUT) {
X fprintf(stderr,
X "Warning: some other process is mucking with the lock file\n");
X return E_WRITESCORE;
X }
X /* Assume that the last process to muck with the score file
X is dead.
X */
X fprintf(stderr, "Warning: breaking old lock\n");
X if (0 > rmdir(LOCKFILE)) {
X fprintf(stderr, "Warning: Couldn't remove old lock %s\n",
X LOCKFILE);
X return E_WRITESCORE;
X }
X result = mkdir(LOCKFILE, 0);
X if (result < 0) {
X fprintf(stderr, "Warning: Couldn't create %s\n", LOCKFILE);
X return E_WRITESCORE;
X }
X }
X
X return 0;
X#else
X return 0;
X#endif
X}
X
Xvoid UnlockScore(void)
X{
X#if !WWW
X if (0 > rmdir(LOCKFILE)) {
X fprintf(stderr, "Warning: Couldn't remove lock %s\n", LOCKFILE);
X }
X#endif
X}
X
X/* print out the score list for level "level". If "level" == 0, show
X scores for all levels. */
Xshort OutputScore(int level)
X{
X short ret;
X
X if ((ret = LockScore()))
X return ret;
X
X if ((ret = ReadScore()) == 0)
X ShowScore(level);
X UnlockScore();
X return ((ret == 0) ? E_ENDGAME : ret);
X}
X
X/* Create a new score file. If "textfile" is non-zero, read the
X scores out of the text file of that name. */
Xshort MakeNewScore(char *textfile)
X{
X#if !WWW
X short ret = 0;
X
X if ((ret = LockScore()))
X return ret;
X
X if (textfile) {
X char *text, *pos, *end;
X int fd;
X struct stat s;
X if (0 > stat(textfile, &s)) {
X perror(textfile);
X return E_FOPENSCORE;
X }
X if (0 > (fd = open(textfile, O_RDONLY))) {
X perror(textfile);
X return E_FOPENSCORE;
X }
X pos = text = (char *)malloc((size_t)s.st_size);
X end = text + s.st_size;
X while (pos < end) {
X int n = read(fd, pos, end - pos);
X switch(n) {
X case -1: perror(textfile);
X return E_FOPENSCORE;
X case 0: fprintf(stderr, "Unexpected EOF\n");
X return E_FOPENSCORE;
X default: pos += n;
X break;
X
X }
X }
X (void)close(fd);
X if ((ret = ParseScoreText(text))) return ret;
X free(text);
X } else {
X scoreentries = 0;
X }
X
X if ((ret = WriteScore())) return ret;
X UnlockScore();
X return ((ret == 0) ? E_ENDGAME : ret);
X#else
X fprintf(stderr, "Cannot make a new score in WWW mode\n");
X return E_WRITESCORE;
X#endif
X}
X
X/* get the players current level based on the level they last scored on */
Xshort GetUserLevel(short *lv)
X{
X short ret = 0, pos;
X
X#if !WWW
X if ((ret = LockScore()))
X return ret;
X
X if ((scorefile = fopen(SCOREFILE, "r")) == NULL)
X ret = E_FOPENSCORE;
X else {
X#endif
X if ((ret = ReadScore()) == 0)
X *lv = ((pos = FindUser()) > -1) ? scoretable[pos].lv + 1 : 1;
X#if !WWW
X }
X UnlockScore();
X#endif
X return (ret);
X}
X
X/* Add a new score to the score file. Show the current scores if "show". */
Xshort Score(Boolean show)
X{
X short ret;
X
X if ((ret = LockScore()))
X return ret;
X if ((ret = ReadScore()) == 0)
X if ((ret = MakeScore()) == 0)
X if ((ret = WriteScore()) == 0)
X if (show) ShowScore(0);
X UnlockScore();
X return ((ret == 0) ? E_ENDGAME : ret);
X}
X
Xvoid ntohs_entry(struct st_entry *entry)
X{
X entry->lv = ntohs(entry->lv);
X entry->mv = ntohs(entry->mv);
X entry->ps = ntohs(entry->ps);
X entry->date = ntohl(entry->date);
X}
X
X/* read in an existing score file. Uses the ntoh() and hton() functions
X * so that the score files transfer across systems.
X */
Xshort ReadScore_WWW();
X#if !WWW
Xshort ReadOldScoreFile01();
X#endif
Xshort ReadScore(void)
X{
X#if WWW
X return ReadScore_WWW();
X#else
X short ret = 0;
X long tmp;
X
X sfdbn = open(SCOREFILE, O_RDONLY);
X if (0 > sfdbn)
X ret = E_FOPENSCORE;
X else {
X char magic[5];
X if (read(sfdbn, &magic[0], 4) != 4) ret = E_READSCORE;
X magic[4] = 0;
X if (0 == strcmp(magic, SCORE_VERSION)) {
X /* we have the right version */
X } else {
X if (0 == strcmp(magic, "xs01")) {
X fprintf(stderr, "Warning: old-style score file\n");
X return ReadOldScoreFile01();
X } else {
X fprintf(stderr, "Error: unrecognized score file format. May be"
X " obsolete, or else maybe this program is.\n");
X ret = E_READSCORE;
X (void)close(ret);
X return ret;
X }
X }
X if (read(sfdbn, &scoreentries, 2) != 2)
X ret = E_READSCORE;
X else {
X scoreentries = ntohs(scoreentries);
X tmp = scoreentries * sizeof(scoretable[0]);
X if (read(sfdbn, &(scoretable[0]), tmp) != tmp)
X ret = E_READSCORE;
X
X /* swap up for little-endian machines */
X for (tmp = 0; tmp < scoreentries; tmp++) ntohs_entry(&scoretable[tmp]);
X }
X (void)close(sfdbn);
X }
X return ret;
X#endif
X}
X
X#if !WWW
Xshort ReadOldScoreFile01()
X{
X short ret = 0;
X time_t now = time(0);
X if (read(sfdbn, &scoreentries, 2) != 2)
X ret = E_READSCORE;
X else {
X int tmp;
X struct old_st_entry *t = (struct old_st_entry *)malloc(scoreentries *
X sizeof(struct old_st_entry));
X scoreentries = ntohs(scoreentries);
X tmp = scoreentries * sizeof(t[0]);
X if (read(sfdbn, &t[0], tmp) != tmp)
X ret = E_READSCORE;
X
X /* swap up for little-endian machines */
X for (tmp = 0; tmp < scoreentries; tmp++) {
X scoretable[tmp].lv = ntohs(t[tmp].lv);
X scoretable[tmp].mv = ntohs(t[tmp].mv);
X scoretable[tmp].ps = ntohs(t[tmp].ps);
X strncpy(scoretable[tmp].user, t[tmp].user, MAXUSERNAME);
X scoretable[tmp].date = now;
X }
X }
X (void)close(sfdbn);
X return ret;
X}
X#endif
X
X/* Return the solution rank for table index "j". The solution rank for
X an entry is one greater than the number of entries that are better
X than it, unless there is a better or equal solution that is by the
X same person, in which case the solution rank is at least "BADSOLN".
X If two solutions are equal, the one that was arrived at first, and
X thus has a lower table index, is considered to be better.
X One solution is at least as good as another solution if it is at
X least as good in numbers of moves and pushes. Note that
X non-comparable solutions may exist.
X
X The array "ignore" indicates that some scoretable entries should
X be ignored for the purpose of computing rank.
X*/
X#define BADSOLN 100
Xint SolnRank(int j, Boolean *ignore)
X{
X int i, rank = 1;
X unsigned short level = scoretable[j].lv;
X for (i = 0; i < j; i++) {
X if (!(ignore && ignore[i]) && scoretable[i].lv == level) {
X if (scoretable[i].mv == scoretable[j].mv &&
X scoretable[i].ps == scoretable[j].ps &&
X 0 == strcmp(scoretable[i].user, scoretable[j].user)) {
X rank = BADSOLN;
X }
X if ((scoretable[i].mv < scoretable[j].mv &&
X scoretable[i].ps <= scoretable[j].ps) ||
X (scoretable[i].mv <= scoretable[j].mv &&
X scoretable[i].ps < scoretable[j].ps)) {
X if (0 == strcmp(scoretable[i].user, scoretable[j].user))
X rank = BADSOLN;
X else
X rank++;
X }
X }
X }
X return rank;
X}
X
X/* Removes all score entries for a user who has multiple entries,
X * that are for a level below the user's top level, and that are not "best
X * solutions" as defined by "SolnRank". Also removes duplicate entries
X * for a level that is equal to the user's top level, but which are not
X * the user's best solution as defined by table position.
X *
X * The current implementation is O(n^2) in the number of actual score entries.
X * A hash table would fix this.
X */
X
Xvoid CleanupScoreTable()
X{
X int i;
X Boolean deletable[MAXSCOREENTRIES];
X for (i = 0; i < scoreentries; i++) {
X deletable[i] = _false_;
X if (SolnRank(i, deletable) > MAXSOLNRANK) {
X char *user = scoretable[i].user;
X int j;
X for (j = 0; j < i; j++) {
X if (0 == strcmp(scoretable[j].user, user))
X deletable[i] = _true_;
X }
X }
X }
X FlushDeletedScores(deletable);
X}
X
X/* Deletes entries from the score table for which the boolean array
X contains true.
X*/
Xvoid FlushDeletedScores(Boolean delete[])
X{
X int i, k = 0;
X for (i = 0; i < scoreentries; i++) {
X if (i != k) CopyEntry(k, i);
X if (!delete[i]) k++;
X }
X scoreentries = k;
X}
X
X/* Adds a new user score to the score table, if appropriate. Users' top
X * level scores, and the best scores for a particular level (in moves and
X * pushes, separately considered), are always preserved.
X */
Xshort MakeScore(void)
X{
X short pos, i;
X
X pos = FindPos(); /* find the new score position */
X if (pos > -1) { /* score table not empty */
X for (i = scoreentries; i > pos; i--)
X CopyEntry(i, i - 1);
X } else {
X pos = scoreentries;
X }
X
X strcpy(scoretable[pos].user, username);
X scoretable[pos].lv = scorelevel;
X scoretable[pos].mv = scoremoves;
X scoretable[pos].ps = scorepushes;
X scoretable[pos].date = time(0);
X scoreentries++;
X
X CleanupScoreTable();
X if (scoreentries == MAXSCOREENTRIES)
X return E_TOMUCHSE;
X else
X return 0;
X}
X
X
X/* searches the score table to find a specific player. */
Xshort FindUser(void)
X{
X short i;
X Boolean found = _false_;
X
X for (i = 0; (i < scoreentries) && (!found); i++)
X found = (strcmp(scoretable[i].user, username) == 0);
X return ((found) ? i - 1 : -1);
X}
X
X/* finds the position for a new score in the score table */
Xshort FindPos(void)
X{
X short i;
X Boolean found = _false_;
X
X for (i = 0; (i < scoreentries) && (!found); i++)
X found = ((scorelevel > scoretable[i].lv) ||
X ((scorelevel == scoretable[i].lv) &&
X (scoremoves < scoretable[i].mv)) ||
X ((scorelevel == scoretable[i].lv) &&
X (scoremoves == scoretable[i].mv) &&
X (scorepushes < scoretable[i].ps)));
X return ((found) ? i - 1 : -1);
X}
X
X/* WriteScore() writes out the score table. It uses ntoh() and hton()
X functions to make the scorefile compatible across systems. It and
X LockScore() try to avoid trashing the score file, even across NFS.
X However, they are not perfect.
X
X The vulnerability here is that if we take more than 10 seconds to
X finish Score(), AND someone else decides to break the lock, AND
X they pick the same temporary name, they may write on top of the
X same file. Then we could scramble the score file by moving it with
X alacrity to SCOREFILE before they finish their update. This is
X quite unlikely, but possible.
X
X We could limit the damage by writing just the one score we're
X adding to a temporary file *when we can't acquire the lock*. Then,
X the next time someone comes by and gets the lock, they integrate
X all the temporary files. Since the score change would be smaller
X than one block, duplicate temporary file names means only that a
X score change can be lost. This approach would not require a TIMEOUT.
X
X The problem with that scheme is that if someone dies holding the
X lock, the temporary files just pile up without getting applied.
X Also, user intervention is required to blow away the lock; and
X blowing away the lock can get us in the same trouble that happens
X here.
X*/
X
Xchar const *tempnm = SCOREFILE "XXXXXX";
X
Xshort WriteScore_WWW();
X
Xshort WriteScore(void)
X{
X#if WWW
X return WriteScore_WWW();
X#else
X short ret = 0;
X int tmp;
X
X char tempfile[MAXPATHLEN];
X strcpy(tempfile, tempnm);
X
X (void)mktemp(tempfile);
X scorefile = fopen(tempfile, "w");
X if (!scorefile) return E_FOPENSCORE;
X sfdbn = fileno(scorefile);
X
X scoreentries = htons(scoreentries);
X if (fwrite(SCORE_VERSION, 4, 1, scorefile) != 1) {
X ret = E_WRITESCORE;
X } else if (fwrite(&scoreentries, 2, 1, scorefile) != 1) {
X ret = E_WRITESCORE;
X } else {
X scoreentries = ntohs(scoreentries);
X
X /* swap around for little-endian machines */
X for (tmp = 0; tmp < scoreentries; tmp++) {
X scoretable[tmp].lv = htons(scoretable[tmp].lv);
X scoretable[tmp].mv = htons(scoretable[tmp].mv);
X scoretable[tmp].ps = htons(scoretable[tmp].ps);
X scoretable[tmp].date = htonl(scoretable[tmp].date);
X }
X tmp = scoreentries;
X while (tmp > 0) {
X int n = fwrite(&(scoretable[scoreentries - tmp]),
X sizeof(struct st_entry),
X tmp,
X scorefile);
X if (n <= 0 && errno) {
X perror(tempfile);
X ret = E_WRITESCORE;
X break;
X }
X tmp -= n;
X }
X
X /* and swap back for the rest of the run ... */
X for (tmp = 0; tmp < scoreentries; tmp++) {
X scoretable[tmp].lv = ntohs(scoretable[tmp].lv);
X scoretable[tmp].mv = ntohs(scoretable[tmp].mv);
X scoretable[tmp].ps = ntohs(scoretable[tmp].ps);
X scoretable[tmp].date = ntohl(scoretable[tmp].date);
X }
X }
X if (EOF == fflush(scorefile)) {
X ret = E_WRITESCORE;
X perror(tempfile);
X } else
X if (0 > fsync(sfdbn)) {
X ret = E_WRITESCORE;
X perror(tempfile);
X }
X if (EOF == fclose(scorefile)) {
X ret = E_WRITESCORE;
X perror(tempfile);
X }
X if (ret == 0) {
X time_t t = time(0);
X if (t - lock_time >= TIMEOUT) {
X fprintf(stderr,
X "Took more than %d seconds trying to write score file; lock expired.\n",
X TIMEOUT);
X ret = E_WRITESCORE;
X } else if (0 > rename(tempfile, SCOREFILE)) {
X ret = E_WRITESCORE;
X }
X }
X if (ret != 0) (void)unlink(tempfile);
X return ret;
X#endif
X}
X
Xchar *mos[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
X "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
X
Xchar date_buf[10];
Xchar *DateToASCII(time_t date)
X{
X if (datemode) {
X sprintf(date_buf, "%d", (int)date);
X } else {
X struct tm then = *localtime(&date);
X time_t dnow = time(0);
X struct tm now = *localtime(&dnow);
X if (then.tm_year != now.tm_year) {
X sprintf(date_buf, "%s %d", mos[then.tm_mon], then.tm_year % 100);
X } else if (then.tm_mon != now.tm_mon ||
X then.tm_mday != now.tm_mday) {
X sprintf(date_buf, "%d %s", then.tm_mday, mos[then.tm_mon]);
X } else {
X int hour = then.tm_hour % 12;
X if (hour == 0) hour = 12;
X sprintf(date_buf, "%d:%.2d%s", hour, then.tm_min,
X (then.tm_hour < 12) ? "am" : "pm");
X }
X }
X return date_buf;
X}
X
X/* displays the score table to the user. If level == 0, show all
X levels. */
X
X#define TRY(name,expr) do { if (0>(expr)) { perror(name); }} while (0)
X
Xvoid ShowScore(int level)
X{
X register i;
X
X TRY("printf",
X printf(
X "Rank User Level Moves Pushes Date\n"));
X TRY("printf",
X printf(
X "======================================================================\n"));
X for (i = 0; i < scoreentries; i++) {
X if (level == 0 || scoretable[i].lv == level) {
X int rank = SolnRank(i, 0);
X if (rank <= MAXSOLNRANK) TRY("printf", printf("%4d", rank));
X else TRY("printf", printf(" "));
X TRY("printf",
X printf(" %32s %4d %4d %4d %s\n", scoretable[i].user,
X scoretable[i].lv, scoretable[i].mv, scoretable[i].ps,
X DateToASCII(scoretable[i].date)));
X }
X }
X}
X
X/* duplicates a score entry */
Xvoid CopyEntry(short i1, short i2)
X{
X strcpy(scoretable[i1].user, scoretable[i2].user);
X scoretable[i1].lv = scoretable[i2].lv;
X scoretable[i1].mv = scoretable[i2].mv;
X scoretable[i1].ps = scoretable[i2].ps;
X scoretable[i1].date = scoretable[i2].date;
X}
X
Xstatic int blurt(char *buf, int bufptr, int count, char c)
X{
X if (count == 1) {
X buf[bufptr++] = c;
X } else if ((count & 1) && (count <= 9)) {
X buf[bufptr++] = '0' + count;
X buf[bufptr++] = c;
X } else {
X while (count >= 2) {
X int digit = count/2;
X if (digit > 9) digit = 9;
X count -= 2 * digit;
X if (digit>1) buf[bufptr++] = '0' + digit;
X buf[bufptr++] = toupper(c);
X }
X if (count) buf[bufptr++] = c;
X }
X return bufptr;
X}
X
Xstatic int compress_moves(char *buf)
X{
X int i;
X int bufptr = 0;
X int count = 0;
X char lastc = 0;
X for (i = 0; i < moves; i++) {
X char c = move_history[i];
X if (c != lastc && count) {
X bufptr = blurt(buf, bufptr, count, lastc);
X count = 1;
X } else {
X count++;
X }
X lastc = c;
X }
X bufptr = blurt(buf, bufptr, count, lastc);
X assert(bufptr <= MOVE_HISTORY_SIZE);
X return bufptr;
X}
X
Xstatic char movelist[MOVE_HISTORY_SIZE];
Xstatic int movelen;
X
X/*
X Copy the string in "template" to a newly-allocated string, which
X should be freed with "free". Any occurrences of '$M' are subsituted
X with the current compressed move history. Occurrences of '$L' are
X subsituted with the current level. '$U' is substituted with the
X current username. '$R' is substituted with the current WWW URL.
X '$$' is substituted with the plain character '$'.
X*/
Xchar *subst_names(char const *template)
X{
X char buffer[4096];
X char *buf = &buffer[0];
X while (*template) {
X if (*template != '$') {
X *buf++ = *template++;
X } else {
X template++;
X switch(*template++) {
X case 'L':
X sprintf(buf, "%d", (int)level);
X buf += strlen(buf);
X break;
X case 'U':
X strcpy(buf, username);
X buf += strlen(username);
X break;
X case 'M':
X strcpy(buf, movelist);
X buf += strlen(movelist);
X break;
X case 'N':
X sprintf(buf, "%d", movelen);
X buf += strlen(buf);
X break;
X#if 0
X case 'R':
X strcpy(buf, url);
X buf += strlen(url);
X break;
X#endif
X case '$':
X *buf++ = '$';
X break;
X }
X }
X }
X *buf = 0;
X return strdup(buffer);
X}
X
Xstatic const char *www_score_command = WWWSCORECOMMAND;
X
Xshort WriteScore_WWW()
X{
X int buflen;
X char *cmd;
X char *result;
X if (0 == strcmp(HERE, "@somewhere.somedomain")) {
X fprintf(stderr, "In order to save a score, fix the configuration\n"
X "variable HERE (in config.h) and recompile.\n");
X return E_WRITESCORE;
X }
X buflen = compress_moves(movelist);
X movelen = buflen;
X movelist[movelen] = 0;
X#if 0
X fprintf(stderr, "compressed %d moves to %d characters\n",
X moves, movelen);
X#endif
X cmd = subst_names(www_score_command);
X result = qtelnet(WWWHOST, WWWPORT, cmd);
X free(cmd);
X if (result) {
X#if 0
X fprintf(stderr, "%s", result);
X#endif
X free(result);
X } else {
X return E_WRITESCORE;
X }
X return 0;
X}
X
X/* Extract one line from "text". Return 0 if there is no line to extract. */
Xchar *getline(char *text, char *linebuf)
X{
X if (*text == 0) {
X *linebuf = 0;
X return 0;
X }
X while (*text != '\n' && *text) {
X *linebuf++ = *text++;
X }
X *linebuf = 0;
X return (*text) ? text + 1 : text ;
X}
X
X/*
X Yes, it actually parses xsokoban's own output format! Pretty
X disgusting!
X*/
Xshort ReadScore_WWW()
X{
X char *cmd, *text;
X short ret;
X movelist[0] = 0;
X cmd = subst_names(WWWREADSCORECMD);
X text = qtelnet(WWWHOST, WWWPORT, cmd);
X/* Now, skip past all the initial crud */
X if (!text) return E_READSCORE;
X ret = ParseScoreText(text);
X free(text);
X return ret;
X}
X
Xshort ParseScoreText(char *text)
X{
X char line[256];
X char *ws = " \t\r\n";
X Boolean baddate = _false_;
X for (;;) {
X text = getline(text, line);
X if (line[0] == '=') break;
X }
X scoreentries = 0;
X for (;;) {
X char *user, *date_str;
X int level, moves, pushes;
X time_t date = 0;
X int rank;
X char rank_s[4];
X text = getline(text, line);
X if (!text) break;
X strncpy(rank_s, line, 4);
X rank = atoi(rank_s);
X user = strtok(line + 4, ws);
X if (!user) break;
X if (rank != 0 || 0 == strcmp(user, username)) {
X level = atoi(strtok(0, ws));
X moves = atoi(strtok(0, ws));
X pushes = atoi(strtok(0, ws));
X date_str = strtok(0, ws);
X if (date_str) date = (time_t)atoi(date_str);
X if (!date) {
X date = time(0);
X if (!baddate) {
X baddate = _true_;
X fprintf(stderr,
X "Warning: Bad or missing date in ASCII scores\n");
X }
X }
X if (level == 0 || moves == 0 || pushes == 0) return E_READSCORE;
X strncpy(scoretable[scoreentries].user, user, MAXUSERNAME);
X scoretable[scoreentries].lv = (unsigned short)level;
X scoretable[scoreentries].mv = (unsigned short)moves;
X scoretable[scoreentries].ps = (unsigned short)pushes;
X scoretable[scoreentries].date = date;
X scoreentries++;
X }
X }
X return 0;
X}
END_OF_FILE
if test 22258 -ne `wc -c <'xsokoban/score.c'`; then
echo shar: \"'xsokoban/score.c'\" unpacked with wrong size!
fi
# end of 'xsokoban/score.c'
fi
echo shar: End of archive 2 \(of 8\).
cp /dev/null ark2isdone

Andrew Myers

unread,
Nov 3, 1994, 10:30:36 AM11/3/94
to
Submitted-by: an...@tonic.lcs.mit.edu (Andrew Myers)
Posting-number: Volume 22, Issue 136
Archive-name: xsokoban/part03

Environment: X11, game
Supersedes: xsokoban: Volume 21, Issue 98-104

#! /bin/sh


# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: xsokoban/display.c xsokoban/globals.h xsokoban/main.c
# xsokoban/scoredisp.c
# Wrapped by chris@sparky on Thu Nov 3 09:23:50 1994


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 3 (of 8)."'
if test -f 'xsokoban/display.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/display.c'\"
else
echo shar: Extracting \"'xsokoban/display.c'\" \(20376 characters\)
sed "s/^X//" >'xsokoban/display.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include <string.h>
X#include <assert.h>
X
X#include "config_local.h"
X
X#ifdef HAVE_LIMITS_H
X#include <limits.h>
X#else
X#include <sys/limits.h>
X#endif


X
X#include "externs.h"
X#include "globals.h"

X#include "defaults.h"
X#include "help.h"
X
X#if USE_XPM
X#include "xpm.h"
X#endif
X
X/* mnemonic defines to help orient some of the text/line drawing, sizes */
X#define HELPLINE ((bit_height * MAXROW) + 30)
X#define STATUSLINE ((bit_height * MAXROW) + 5)
X#define HELP_H (bit_height * MAXROW)
X#define HELP_W (bit_width * MAXCOL)
X
X/* local to this file */
Xstatic Window win;
Xstatic GC gc, rgc, drgc;
Xstatic unsigned int width, height, depth;
Xstatic XFontStruct *finfo;
Xstatic Boolean optwalls;
Xstatic Cursor this_curs;
Xstatic Pixmap help[HELP_PAGES], floor;
Xstatic Pixmap blank, work, man, saveman, goal, object,
X treasure, walls[NUM_WALLS];
Xstatic Boolean font_alloc = _false_, gc_alloc = _false_,
X pix_alloc = _false_, cmap_alloc = _false_, win_alloc = _false_;
Xstatic int hlpscrn = -1;
Xstatic char buf[500];
X
X/* globals */
XDisplay *dpy;
Xint scr;
Xunsigned bit_width, bit_height;
XAtom wm_delete_window, wm_protocols;
XBoolean display_alloc = _false_;
XColormap cmap;
X
X/* names of the fancy wall bitmap files. If you define a set of fancy
X * wall bitmaps, they must use these names
X */
Xstatic char *wallname[] = {
X "lonewall", "southwall", "westwall", "llcornerwall",
X "northwall", "vertiwall", "ulcornerwall", "west_twall",
X "eastwall", "lrcornerwall", "horizwall", "south_twall",
X "urcornerwall", "east_twall", "north_twall", "centerwall"
X};
X
X/* Do all the nasty X stuff like making the windows, setting all the defaults,
X * creating all the pixmaps, loading everything, and mapping the window.
X * This does NOT do the XOpenDisplay(), so that the -display switch can be
X * handled cleanly.
X */
Xshort InitX(void)
X{
X int i;
X Boolean reverse = _false_, tmpwalls = _false_;
X char *rval;
X unsigned long fore, back, bord, curs, gc_mask;
X XSizeHints szh;
X XWMHints wmh;
X XSetWindowAttributes wattr;
X XClassHint clh;
X XGCValues val, reval;
X XTextProperty wname, iname;
X XColor cfg, cbg;
X Atom protocols[1];
X Window root;
X
X /* these are always needed */
X scr = DefaultScreen(dpy);
X cmap = DefaultColormap(dpy, scr);
X depth = DefaultDepth(dpy, scr);
X root = RootWindow(dpy, scr);
X
X /* Get a new colormap now, if needed. */
X if (ownColormap) {
X XWindowAttributes wa;
X XGetWindowAttributes(dpy, root, &wa);
X cmap = XCreateColormap(dpy, root, wa.visual, AllocNone);
X cmap_alloc = _true_;
X }
X
X /* here is where we figure out the resources and set the defaults.
X * resources can be either on the command line, or in your .Xdefaults/
X * .Xresources files. They are read in and parsed in main.c, but used
X * here.
X */
X finfo = GetFontResource(FONT);
X if (!finfo) return E_NOFONT;
X font_alloc = _true_;
X
X rval = GetResource(REVERSE);
X if(rval != (char *)0) {
X reverse = StringToBoolean(rval);
X }
X
X fore = GetColorOrDefault(dpy, FOREG, depth, "black", _false_);
X back = GetColorOrDefault(dpy, BACKG, depth, "grey90", _true_);
X
X if(reverse) {
X unsigned long t;
X t = fore;
X fore = back;
X back = t;
X }
X
X if(!GetColorResource(BORDER, &bord))
X bord = fore;
X if(!GetColorResource(CURSOR, &curs))
X curs = fore;
X
X bitpath = GetResource(BITDIR);
X rval = GetResource(WALLS);
X if(rval != (char *)0)
X tmpwalls = StringToBoolean(rval);
X
X /* Walls are funny. If a alternate bitpath has been defined, assume
X * !fancywalls unless explicitly told fancy walls. If the default
X * bitpath is being used, you can assume fancy walls.
X */
X if(bitpath && !tmpwalls)
X optwalls = _false_;
X else
X optwalls = _true_;
X
X width = MAXCOL * DEF_BITW;
X height = MAXROW * DEF_BITH + 50;
X
X wmh.initial_state = NormalState;
X wmh.input = True;
X wmh.flags = (StateHint | InputHint);
X
X clh.res_class = clh.res_name = progname;
X
X /* Make sure the window and icon names are set */
X if(!XStringListToTextProperty(&progname, 1, &wname))
X return E_NOMEM;
X if(!XStringListToTextProperty(&progname, 1, &iname))
X return E_NOMEM;
X
X
X /* load in a cursor, and recolor it so it looks pretty */
X this_curs = XCreateFontCursor(dpy, DEF_CURSOR);
X cfg.pixel = curs;
X cbg.pixel = back;
X XQueryColor(dpy, cmap, &cfg);
X XQueryColor(dpy, cmap, &cbg);
X XRecolorCursor(dpy, this_curs, &cfg, &cbg);
X
X /* set up the funky little window attributes */
X wattr.background_pixel = back;
X wattr.border_pixel = bord;
X wattr.backing_store = Always;
X wattr.event_mask = (KeyPressMask | ExposureMask | ButtonPressMask |
X ButtonReleaseMask);
X wattr.cursor = this_curs;
X wattr.colormap = cmap;
X
X /* Create the window. we create it with NO size so that we
X * can load in the bitmaps; we later resize it correctly.
X */
X win = XCreateWindow(dpy, root, 0, 0, width, height, 4,
X CopyFromParent, InputOutput, CopyFromParent,
X (CWBackPixel | CWBorderPixel | CWBackingStore |
X CWEventMask | CWCursor | CWColormap), &wattr);
X win_alloc = _true_;
X
X
X /* this will set the bit_width and bit_height as well as loading
X * in the pretty little bitmaps
X */
X switch (LoadBitmaps()) {
X case 0: break;
X case E_NOCOLOR: return E_NOCOLOR;
X case E_NOBITMAP: return E_NOBITMAP;
X }
X blank = XCreatePixmap(dpy, win, bit_width, bit_height, 1);
X pix_alloc = _true_;
X
X width = MAXCOL * bit_width;
X height = MAXROW * bit_height + 50;
X
X /* whee, resize the window with the correct size now that we know it */
X XResizeWindow(dpy, win, width, height);
X
X /* set up the size hints, we don't want manual resizing allowed. */
X szh.min_width = szh.width = szh.max_width = width;
X szh.min_height = szh.height = szh.max_height = height;
X szh.x = szh.y = 0;
X szh.flags = (PSize | PPosition | PMinSize | PMaxSize);
X
X /* now SET all those hints we create above */
X XSetWMNormalHints(dpy, win, &szh);
X XSetWMHints(dpy, win, &wmh);
X XSetClassHint(dpy, win, &clh);
X XSetWMName(dpy, win, &wname);
X XSetWMIconName(dpy, win, &iname);
X
X /* Turn on WM_DELETE_WINDOW */
X wm_delete_window = XInternAtom(dpy, "WM_DELETE_WINDOW", 0);
X wm_protocols = XInternAtom(dpy, "WM_PROTOCOLS", 0);
X protocols[0] = wm_delete_window;
X XSetWMProtocols(dpy, win, protocols, 1);
X
X work = XCreatePixmap(dpy, win, width, height, depth);
X
X /* set up all the relevant GC's */
X val.foreground = reval.background = fore;
X val.background = reval.foreground = back;
X val.function = reval.function = GXcopy;
X val.font = reval.font = finfo->fid;
X gc_mask = (GCForeground | GCBackground | GCFunction | GCFont);
X gc = XCreateGC(dpy, work, gc_mask, &val);
X rgc = XCreateGC(dpy, blank, gc_mask, &reval);
X drgc = XCreateGC(dpy, work, gc_mask, &reval);
X
X /* make the help windows and the working bitmaps */
X /* we need to do this down here since it requires GCs to be allocated */
X for(i = 0; i < HELP_PAGES; i++)
X help[i] = XCreatePixmap(dpy, win, HELP_W, HELP_H, depth);
X MakeHelpWindows();
X XFillRectangle(dpy, blank, rgc, 0, 0, bit_width, bit_height);
X
X gc_alloc = _true_;
X
X /* display the friendly little clear screen */
X ClearScreen();
X XMapWindow(dpy, win);
X RedisplayScreen();


X
X return 0;
X}
X

X/* deallocate all the memory and structures used in creating stuff */
Xvoid DestroyDisplay(void)


X{
X int i;
X

X if (!display_alloc) return;
X
X /* kill the font */
X if (font_alloc) {
X XFreeFont(dpy, finfo);
X font_alloc = _false_;
X }
X
X if (cmap_alloc) {
X XFreeColormap(dpy, cmap);
X cmap = DefaultColormap(dpy, scr);
X cmap_alloc = _false_;
X }
X
X /* Destroy everything allocated right around the gcs. Help windows are
X * freed here cause they are created about the same time. (Yes, I know
X * this could cause problems, it hasn't yet.
X */
X if(gc_alloc) {
X XFreeGC(dpy, gc);
X XFreeGC(dpy, rgc);
X XFreeGC(dpy, drgc);
X XFreePixmap(dpy, work);
X for (i = 0; i < HELP_PAGES; i++)
X XFreePixmap(dpy, help[i]);
X gc_alloc = _false_;
X }
X /* free up all the allocated pix */
X if(pix_alloc) {
X XFreePixmap(dpy, man);
X XFreePixmap(dpy, saveman);
X XFreePixmap(dpy, goal);
X XFreePixmap(dpy, treasure);
X XFreePixmap(dpy, object);
X XFreePixmap(dpy, floor);
X XFreePixmap(dpy, blank);
X for(i = 0; i < NUM_WALLS; i++)
X if(i == 0 || optwalls)
X XFreePixmap(dpy, walls[i]);
X pix_alloc = _false_;
X }
X /* okay.. NOW we can destroy the main window and the display */
X if (win_alloc) {
X XDestroyWindow(dpy, win);
X win_alloc = _false_;
X }
X}
X
Xstatic Boolean full_pixmap[256];
X
Xstatic Boolean TryBitmapFile(char *template, Pixmap *pix, char *bitpath,
X char *fname, int map)
X{
X unsigned int width, height;
X int dum3, dum4;
X sprintf(buf, template, bitpath, fname);
X
X if(XReadBitmapFile(dpy, win, buf, &width, &height, pix, &dum3, &dum4) ==
X BitmapSuccess) {
X if (width > bit_width) bit_width = width;
X if (height > bit_height) bit_height = height;
X full_pixmap[map] = _false_;
X return _true_;
X }
X return _false_;
X}
X
X#if USE_XPM
X/*
X Try to load an XPM file. Return 0 if success, E_NOCOLOR if there were
X not enough colors to allocate for the pixmap, E_NOBITMAP if the pixmap
X couldn't be loaded.
X*/
Xstatic Boolean xpm_color_failed = _false_;
X
Xstatic short TryPixmapFile(char *template, Pixmap *pix, char *bitpath,
X char *fname, int map)
X{
X int ret;
X char *errmsg;
X XpmAttributes attr;
X XWindowAttributes wa;
X if (xpm_color_failed)
X return E_NOCOLOR; /* Don't keep trying for each pixmap */
X if (!XGetWindowAttributes(dpy, win, &wa)) {
X fprintf(stderr, "What? Can't get attributes of window\n");
X abort();
X }
X if (wa.depth < 8) {
X /* Hopeless! Not enough colors...*/
X return E_NOBITMAP;
X }
X
X attr.valuemask = XpmCloseness | XpmExactColors | XpmColorKey | XpmColormap |
X XpmDepth;
X attr.colormap = wa.colormap;
X attr.depth = wa.depth;
X attr.color_key = XPM_COLOR;
X attr.closeness = 10;
X attr.exactColors = _false_;
X sprintf(buf, template, bitpath, fname);
X if ((ret = XpmReadFileToPixmap(dpy, win, buf, pix, NULL, &attr)) ==
X XpmSuccess) {
X
X if (attr.width > bit_width) bit_width = attr.width;
X if (attr.height > bit_height) bit_height = attr.height;
X full_pixmap[map] = _true_;
X return 0;
X }
X switch(ret) {
X case XpmColorError: return 0; /* partial success */
X case XpmSuccess: errmsg = "success"; break;
X case XpmOpenFailed: return E_NOBITMAP; /* open failed */
X case XpmFileInvalid: errmsg = "file format invalid"; break;
X case XpmNoMemory: errmsg = "No memory"; break;
X case XpmColorFailed: return E_NOCOLOR;
X default: errmsg = "unknown error code"; break;
X }
X fprintf(stderr, "XpmReadFileToPixmap (%s) failed: %s\n", buf, errmsg);
X return E_NOBITMAP;
X}
X#endif
X
X/* Load in a single bitmap. If this bitmap is the largest in the x or
X * y direction, set bit_width or bit_height appropriately. If your pixmaps
X * are of varying sizes, a bit_width by bit_height box is guaranteed to be
X * able to surround all of them.
X * Return 0 for success, E_NOBITMAP if a loadable bitmap could not be found,
X * E_NOCOLOR if a loadable pixmap was found but there were not enough colors
X * load it.
X */
X
Xshort LoadOneBitmap(char *fname, char *altname, Pixmap *pix, int map)
X{
X if(bitpath && *bitpath) {
X /* we have something to try other than the default, let's do it */
X#if USE_XPM
X switch(TryPixmapFile("%s/%s.xpm", pix, bitpath, fname, map)) {
X case 0: return 0;
X case E_NOCOLOR: return E_NOCOLOR;
X case E_NOBITMAP: break;
X }
X switch(TryPixmapFile("%s/%s.xpm", pix, bitpath, altname, map)) {
X case 0: return 0;
X case E_NOCOLOR: return E_NOCOLOR;
X case E_NOBITMAP: break;
X }
X#endif
X if (TryBitmapFile("%s/%s.xbm", pix, bitpath, fname, map)) return 0;
X if (TryBitmapFile("%s/%s.xbm", pix, bitpath, altname, map)) return 0;
X return E_NOBITMAP;
X }
X
X#if USE_XPM
X switch(TryPixmapFile("%s/%s.xpm", pix, BITPATH, fname, map)) {
X case 0: return 0;
X case E_NOCOLOR: return E_NOCOLOR;
X case E_NOBITMAP: break;
X }
X switch(TryPixmapFile("%s/%s.xpm", pix, BITPATH, altname, map)) {
X case 0: return 0;
X case E_NOCOLOR: return E_NOCOLOR;
X case E_NOBITMAP: break;
X }
X#endif
X if (TryBitmapFile("%s/%s.xbm", pix, BITPATH, fname, map)) return 0;
X if (TryBitmapFile("%s/%s.xbm", pix, BITPATH, altname, map)) return 0;
X return E_NOBITMAP;
X}
X
X/* loads all the bitmaps in.. if any fail, it returns E_NOBITMAP up a level
X * so the program can report the error to the user. It tries to load in the
X * alternates as well.
X */
Xshort LoadBitmaps(void)
X{
X register int i;
X short ret;
X
X if ((ret = LoadOneBitmap("man", NULL, &man, player))) return ret;
X if ((ret = LoadOneBitmap("saveman", "man", &saveman, playerstore)))
X return ret;
X if ((ret = LoadOneBitmap("object", NULL, &object, packet))) return ret;
X if ((ret = LoadOneBitmap("treasure", NULL, &treasure, save))) return ret;
X if ((ret = LoadOneBitmap("goal", NULL, &goal, store))) return ret;
X if ((ret = LoadOneBitmap("floor", NULL, &floor, ground))) return ret;
X
X if(optwalls) {
X for(i = 0; i < NUM_WALLS; i++) {
X if ((ret = LoadOneBitmap(wallname[i], "wall", &walls[i], wall)))
X return ret;
X }
X } else {
X if ((ret = LoadOneBitmap("wall", NULL, &walls[0], wall))) return ret;


X }
X return 0;
X}
X

Xstatic void DrawPixmap(Drawable w, Pixmap p, int mapchar, int x, int y)
X{
X if (full_pixmap[mapchar])
X XCopyArea(dpy, p, w, gc, 0, 0, bit_width, bit_height, x, y);
X else
X XCopyPlane(dpy, p, w, gc, 0, 0, bit_width, bit_height, x, y, 1);
X}
X
X/* Create and draw all the help windows. This is not wholly foolproof with
X * the variable-size bitmap code yet, as the constants to place things on the
X * screen, are just that, constants. This should be rewritten.
X */
Xvoid MakeHelpWindows(void)
X{
X int i;
X int ypos = 0;
X#if WWW
X char *title = " Sokoban -- X+WWW version 3.2e -- Help page %d";
X#else
X char *title = " Sokoban -- X version 3.2e -- Help page %d";
X#endif
X char *next = " Press <Return> to exit";
X
X for(i = 0; i < HELP_PAGES; i++) {
X XFillRectangle(dpy, help[i], drgc, 0, 0, HELP_W, HELP_H);
X sprintf(buf, title, (i+1));
X XDrawImageString(dpy, help[i], gc, 0, 11, buf, strlen(buf));
X XDrawLine(dpy, help[i], gc, 0, 17, HELP_W, 17);
X XDrawLine(dpy, help[i], gc, 0, HELP_H-20, HELP_W, HELP_H-20);
X XDrawImageString(dpy, help[i], gc, 2, HELP_H-7, next, strlen(next));
X }
X for(i = 0; help_pages[i].textline != NULL; i++) {
X ypos += help_pages[i].ydelta;
X XDrawImageString(dpy,help[help_pages[i].page], gc,
X help_pages[i].xpos * (finfo->max_bounds.width),
X ypos, help_pages[i].textline,
X strlen(help_pages[i].textline));
X }
X
X DrawPixmap(help[0], man, player, 180, 340);
X DrawPixmap(help[0], goal, store, 280, 340);
X DrawPixmap(help[0], walls[0], wall, 389, 340);
X DrawPixmap(help[0], object, packet, 507, 340);
X DrawPixmap(help[0], treasure, save, 270, 388);
X DrawPixmap(help[0], saveman, playerstore, 507, 388);
X}
X
X/* wipe out the entire contents of the screen */
Xvoid ClearScreen(void)
X{
X register int i,j;
X
X XFillRectangle(dpy, work, drgc, 0, 0, width, height);
X for(i = 0; i < MAXROW; i++)
X for(j = 0; j < MAXCOL; j++)
X DrawPixmap(work, floor, ground, j*bit_width, i*bit_height);
X XDrawLine(dpy, work, gc, 0, bit_height*MAXROW, bit_width*MAXCOL,
X bit_height*MAXROW);
X}
X
X/* redisplay the current screen.. Has to handle the help screens if one
X * is currently active.. Copys the correct bitmaps onto the window.
X */
Xvoid RedisplayScreen(void)
X{
X if(hlpscrn == -1)
X XCopyArea(dpy, work, win, gc, 0, 0, width, height, 0, 0);
X else
X XCopyArea(dpy, help[hlpscrn], win, gc, 0, 0, HELP_W, HELP_H, 0, 0);
X XFlush(dpy);
X}
X
X/* Flush all X events to the screen and wait for them to get there. */
Xvoid SyncScreen(void)
X{
X XSync(dpy, 0);
X}
X
X/* Draws all the neat little pictures and text onto the working pixmap
X * so that RedisplayScreen is happy.
X */
Xvoid ShowScreen(void)
X{
X register int i,j;
X
X for(i = 0; i < rows; i++)
X for(j = 0; j < cols && map[i][j] != 0; j++)
X MapChar(map[i][j], i, j, 0);
X DisplayLevel();
X DisplayPackets();
X DisplaySave();
X DisplayMoves();
X DisplayPushes();
X DisplayHelp();
X RedisplayScreen();
X}
X
X/* Draws a single pixmap, translating from the character map to the pixmap
X * rendition. If "copy_area", also push the change through to the actual window.
X */
Xvoid MapChar(char c, int i, int j, Boolean copy_area)
X{
X Pixmap this;
X
X this = GetObjectPixmap(i, j, c); /* i, j are passed so walls can be done */
X if (full_pixmap[(int)c])
X XCopyArea(dpy, this, work, gc, 0, 0, bit_width, bit_height, cX(j), cY(i));
X else
X XCopyPlane(dpy, this, work, gc, 0, 0, bit_width, bit_height, cX(j), cY(i), 1);
X if (copy_area) {
X XCopyArea(dpy, work, win, gc, cX(j), cY(i), bit_width, bit_height,
X cX(j), cY(i));
X }
X}
X
X/* figures out the appropriate pixmap from the internal game representation.
X * Handles fancy walls.
X */
XPixmap GetObjectPixmap(int i, int j, char c)
X{
X switch(c) {
X case player: return man;
X case playerstore: return saveman;
X case store: return goal;
X case save: return treasure;
X case packet: return object;
X case wall:
X if(optwalls) return walls[PickWall(i,j)];
X else return walls[0];
X case ground: return floor;
X default: return blank;
X }
X}
X
X/* returns and index into the fancy walls array. works by assigning a value
X * to each 'position'.. the type of fancy wall is computed based on how
X * many neighboring walls there are.
X */
Xint PickWall(int i, int j)
X{
X int ret = 0;
X
X if(i > 0 && map[i-1][j] == wall) ret += 1;
X if(j < cols && map[i][j+1] == wall) ret += 2;
X if(i < rows && map[i+1][j] == wall) ret += 4;
X if(j > 0 && map[i][j-1] == wall) ret += 8;


X return ret;
X}
X

X/* Draws a string onto the working pixmap */
Xvoid DrawString(int x, int y, char *text)
X{
X int x_off, y_off;
X
X x_off = x * finfo->max_bounds.width;
X y_off = y + finfo->ascent;
X
X XDrawImageString(dpy, work, gc, x_off, y_off, text, strlen(text));
X}
X
X/* The following routines display various 'statusline' stuff (ie moves, pushes,
X * etc) on the screen. they are called as they are needed to be changed to
X * avoid unnecessary drawing */
Xvoid DisplayLevel(void)
X{
X sprintf(buf, "Level: %3d", level);
X DrawString(0, STATUSLINE, buf);
X}
X
Xvoid DisplayPackets(void)
X{
X sprintf(buf, "Packets: %3d", packets);
X DrawString(12, STATUSLINE, buf);
X}
X
Xvoid DisplaySave(void)
X{
X sprintf(buf, "Saved: %3d", savepack);
X DrawString(26, STATUSLINE, buf);
X}
X
Xvoid DisplayMoves(void)
X{
X sprintf(buf, "Moves: %5d", moves);
X DrawString(38, STATUSLINE, buf);
X}
X
Xvoid DisplayPushes(void)
X{
X sprintf(buf, "Pushes: %3d", pushes);
X DrawString(52, STATUSLINE, buf);
X}
X
Xvoid DisplayHelp(void)
X{
X DrawString(0, HELPLINE, "Press ? for help.");
X}
X
X/* Function used by the help pager. We ONLY want to flip pages if a key
X * key is pressed.. We want to exit the help pager if ENTER is pressed.
X * As above, <shift> and <control> and other such fun keys are NOT counted
X * as a keypress.
X */
XBoolean WaitForEnter(void)
X{
X KeySym keyhit;


X char buf[1];
X int bufs = 1;

X XComposeStatus compose;
X XEvent xev;
X
X while (1) {


X XNextEvent(dpy, &xev);
X switch(xev.type) {
X case Expose:

X RedisplayScreen();
X break;
X case KeyPress:
X buf[0] = '\0';

X XLookupString(&xev.xkey, buf, bufs, &keyhit, &compose);
X if(buf[0]) {
X return (keyhit == XK_Return) ? _true_ : _false_;
X }


X break;
X default:
X break;
X }
X }

X}
X
X/* Displays the first help page, and flips help pages (one per key press)
X * until a return is pressed.
X */
Xvoid ShowHelp(void)


X{
X int i = 0;

X Boolean done = _false_;
X
X hlpscrn = 0;
X XCopyArea(dpy, help[i], win, gc, 0, 0, HELP_W, HELP_H, 0, 0);
X XFlush(dpy);
X while(!done) {
X done = WaitForEnter();
X if(done) {
X hlpscrn = -1;
X return;
X } else {
X i = (i+1)%HELP_PAGES;
X hlpscrn = i;
X XCopyArea(dpy, help[i], win, gc, 0, 0, HELP_W, HELP_H, 0, 0);
X XFlush(dpy);
X }
X }
X}
X
Xshort DisplayScores(short *newlev)
X{
X return DisplayScores_(dpy, win, newlev);
X}
X
X
X/* since the 'press ? for help' is ALWAYS displayed, just beep when there is
X * a problem.
X */
Xvoid HelpMessage(void)
X{
X XBell(dpy, 0);
X RedisplayScreen();
X}
END_OF_FILE
if test 20376 -ne `wc -c <'xsokoban/display.c'`; then
echo shar: \"'xsokoban/display.c'\" unpacked with wrong size!
fi
# end of 'xsokoban/display.c'
fi
if test -f 'xsokoban/globals.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/globals.h'\"
else
echo shar: Extracting \"'xsokoban/globals.h'\" \(2787 characters\)
sed "s/^X//" >'xsokoban/globals.h' <<'END_OF_FILE'
X#include "config.h"
X/*****************************************************************************\
X * Stuff in this file shouldn't ever need to be changed. *
X\*****************************************************************************/
X
X#define BUFSIZE 256
X
X/* internal object representation */
X#define player '@'
X#define playerstore '+'
X#define store '.'
X#define packet '$'
X#define save '*'
X#define ground ' '
X#define wall '#'
X
X/* maximum possible size of a board */
X#define MAXROW 20
X#define MAXCOL 20
X
X/* player position for movement */
Xtypedef struct {
X short x, y;
X} POS;
X
X/* list of possible errors */
X#define E_FOPENSCREEN 1
X#define E_PLAYPOS1 2
X#define E_ILLCHAR 3
X#define E_PLAYPOS2 4
X#define E_TOMUCHROWS 5
X#define E_TOMUCHCOLS 6
X#define E_ENDGAME 7
X#define E_NOUSER 8
X#define E_FOPENSAVE 9
X#define E_WRITESAVE 10
X#define E_STATSAVE 11
X#define E_READSAVE 12
X#define E_ALTERSAVE 13
X#define E_SAVED 14
X#define E_TOMUCHSE 15
X#define E_FOPENSCORE 16
X#define E_READSCORE 17
X#define E_WRITESCORE 18
X#define E_USAGE 19
X#define E_ILLPASSWORD 20
X#define E_LEVELTOOHIGH 21
X#define E_NOSUPER 22
X#define E_NOSAVEFILE 23
X#define E_NOBITMAP 24
X#define E_NODISPLAY 25
X#define E_NOFONT 26
X#define E_NOMEM 27
X#define E_NOCOLOR 28
X#define E_ABORTLEVEL 29
X
X/* classname for silly X stuff */
X#define CLASSNAME "XSokoban"
X
X/* macros translating game coords to window coords */
X#define cX(x) (bit_width * (((MAXCOL - cols) / 2) + (x)))
X#define cY(x) (bit_height * (((MAXROW - rows) / 2) + (x)))
X
X/* macros translating window coords to game coords */
X#define wX(x) (((x)/bit_width) - ((MAXCOL - cols)/2))
X#define wY(x) (((x)/bit_height) - ((MAXROW - rows)/2))
X
X#define MOVE_HISTORY_SIZE 4096
X/* The number of moves that are remembered for temp saves and
X verifies. */
X
X/*** Global state ***/
Xtypedef char Map[MAXROW+1][MAXCOL+1];
X
Xextern Map map;
X
Xextern short rows, cols, level, moves, pushes, savepack, packets;
Xextern unsigned short scorelevel, scoremoves, scorepushes;
Xextern POS ppos;
Xextern Display *dpy;
Xextern Boolean ownColormap, datemode;
Xextern unsigned bit_width, bit_height; /* for macros wX, wY */
Xextern Atom wm_delete_window, wm_protocols;
Xextern XrmDatabase rdb;
Xextern Colormap cmap;
Xextern char *progname, *bitpath, *username;
Xextern Boolean display_alloc;
X
Xchar move_history[MOVE_HISTORY_SIZE];
X/* The characters "move_history[0..moves-1]" describe the entire
X sequence of moves applied to this level so far, in a format
X compatible with "Verify". */
X
Xextern short scoreentries;
X
Xstruct old_st_entry {
X char user[MAXUSERNAME];
X unsigned short lv, pad1, mv, pad2, ps, pad3;
X};
X
Xextern struct st_entry {
X char user[MAXUSERNAME];
X unsigned short lv, pad1, mv, pad2, ps, pad3;
X time_t date;
X} scoretable[MAXSCOREENTRIES];
END_OF_FILE
if test 2787 -ne `wc -c <'xsokoban/globals.h'`; then
echo shar: \"'xsokoban/globals.h'\" unpacked with wrong size!
fi
# end of 'xsokoban/globals.h'
fi
if test -f 'xsokoban/main.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/main.c'\"
else
echo shar: Extracting \"'xsokoban/main.c'\" \(11866 characters\)
sed "s/^X//" >'xsokoban/main.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include <pwd.h>
X#include <X11/Xlib.h>
X#include <X11/Xresource.h>
X#include <stdlib.h>
X#include <unistd.h>
X#include <string.h>


X#include <ctype.h>
X
X#include "externs.h"
X#include "globals.h"

X#include "options.h"
X#include "errors.h"
X
Xshort VerifyScore(short optlevel);
X
X/* useful globals */
XBoolean scoring = _true_;
Xshort level, packets, savepack, moves, pushes, rows, cols;
Xunsigned short scorelevel, scoremoves, scorepushes;
XPOS ppos;
Xchar map[MAXROW + 1][MAXCOL + 1];
Xchar *username = 0, *progname = 0, *bitpath = 0;
Xchar *optfile = 0;
XXrmDatabase rdb;
XBoolean ownColormap = _false_, datemode = _false_;
X
Xstatic short optlevel = 0, userlevel;
Xstatic Boolean optshowscore = _false_, optmakescore = _false_,
X optrestore = _false_, superuser = _false_,
X optverify = _false_;
Xstatic struct passwd *pwd;
X
Xstatic char *FixUsername(char *name);
X/* FixUsername makes sure that the username contains no spaces or
X unprintable characters, and is less than MAXUSERNAME characters
X long. */
X
Xint movelen;
X/* Length of the verified move sequence waiting on stdin if -v is used */
X
X/* do all the setup foo, and make sure command line gets parsed. */
Xvoid main(int argc, char **argv)
X{
X short ret = 0, ret2 = 0;
X
X#ifdef VICE
X Authenticate();
X#endif
X
X scorelevel = 0;
X moves = pushes = packets = savepack = 0;
X
X /* make the program name be what it is invoked with */
X progname = strrchr(argv[0], '/');
X if(progname == NULL)
X progname = argv[0];
X else
X progname++;
X
X /* Parse the command line */
X ret = CheckCommandLine(&argc, argv);
X
X /* find out who is playing us. (pwd will be kept around in case we need to
X * build the Xresources stuff later.
X */
X pwd = getpwuid(getuid());
X if(pwd == NULL)
X /* we MUST be being played by somebody, sorry */
X ret = E_NOUSER;
X else {
X /* find out who we are. */
X#if !WWW
X if (!username) username = FixUsername(pwd->pw_name);
X /* else we already got a fixed username from the -v option */
X#else
X/* If running in Web mode, append HERE to the username. */
X if (!username) {
X/* username might have already been set by the X resource mechanism */
X char *here = HERE;
X char *namebuf = (char *)malloc(strlen(pwd->pw_name) + strlen(here) + 1);
X strcpy(namebuf, pwd->pw_name);
X strcat(namebuf, here);
X username = FixUsername(namebuf);
X free(namebuf);
X } else {
X username = FixUsername(username);
X }
X#endif
X /* see if we are the superuser */
X superuser = (strcmp(username, SUPERUSER) == 0) ? _true_ : _false_;
X if(ret == 0) {
X if(optshowscore)
X ret = OutputScore(optlevel);
X else if (optverify) {
X ret = VerifyScore(optlevel);
X } else if(optmakescore) {
X if(superuser) {
X /* make sure of that, shall we? */
X ret = GetGamePassword();
X if(ret == 0)
X ret = MakeNewScore(optfile);
X } else
X /* sorry, BAD superuser */
X ret = E_NOSUPER;
X } else if(optrestore) {
X ret = RestoreGame();
X } else {
X ret = GetUserLevel(&userlevel);
X if(ret == 0) {
X if(optlevel > 0) {
X#if !ANYLEVEL
X if (userlevel < optlevel) {
X if (superuser) {
X /* superusers can play any level (but not score),
X * which is useful for testing out new boards.
X */
X level = optlevel;
X scoring = _false_;
X } else {
X ret = E_LEVELTOOHIGH;
X }
X } else
X#endif
X level = optlevel;
X } else
X level = userlevel;
X }
X }
X }
X }
X if(ret == 0) {
X /* play till we drop, then nuke the good stuff */
X ret = GameLoop();
X DestroyDisplay();
X XCloseDisplay(dpy); /* factored this out to allow re-init */
X display_alloc = _false_;
X }
X /* always report here since the game returns E_ENDGAME when the user quits.
X * Sigh.. it would be so much easier to just do it right.
X */
X Error(ret);
X /* see if they score, and do it (again report an error */
X if((scorelevel > 0) && scoring) {
X ret2 = Score(_true_);
X Error(ret2);
X }
X /* exit with whatever status we ended with */
X switch(ret)
X {
X case E_ENDGAME:
X case E_SAVED:
X ret = 0; /* normal exits */
X break;
X }
X exit(ret);
X}
X
Xstatic char *FixUsername(char *name)
X{
X char namebuf[MAXUSERNAME];
X char *c = namebuf;
X strncpy(namebuf, name, MAXUSERNAME);
X namebuf[MAXUSERNAME-1] = 0;
X while (*c) {
X if (!isprint(*c) || *c == ' ') *c = '_';
X c++;
X }
X return strdup(namebuf);
X}
X
X/* Oh boy, the fun stuff.. Follow along boys and girls as we parse the command
X * line up into little bitty pieces and merge in all the xdefaults that we
X * need.
X *
X * May set "username" to some value.
X */
Xshort CheckCommandLine(int *argcP, char **argv)
X{
X XrmDatabase command = NULL, temp = NULL;
X char *res;
X char buf[1024];
X int option;
X
X /* let's do this the sensible way, Command line first! */
X /* we will also OPEN the display here, though we won't do anything with it */
X XrmInitialize();
X
X /* build an XrmDB from the command line based on the options (options.h) */
X XrmParseCommand(&command, options, sizeof(options)/sizeof(*options),
X progname, argcP, argv);
X
X /* okay, we now have the X command line options parsed, we might as well
X * make sure we need to go further before we do. These command line options
X * are NOT caught by XrmParseCommand(), so we need to do them ourselves.
X * Remember, they are all exclusive of one another.
X */
X for(option = 1; option < *argcP; option++) {
X if(argv[option][0] == '-') {
X switch(argv[option][1]) {
X case 's':
X if(optshowscore || optmakescore || optrestore || (optlevel > 0) ||
X optverify)
X return E_USAGE;
X optshowscore = _true_;
X optlevel = atoi(&argv[option][2]);
X if (optlevel == 0 && argv[option+1] &&
X argv[option+1][0] != '-') {
X optlevel = atoi(argv[option+1]);
X option++;
X }
X break;
X case 'c':
X if(optshowscore || optmakescore || optrestore || (optlevel > 0) ||
X optverify)
X return E_USAGE;
X optfile = 0;
X if (argv[option][2] != 0)
X optfile = &argv[option][2];
X else if (argv[option+1] && argv[option + 1][0] != '-') {
X optfile = &argv[option + 1][0];
X option++;
X }
X optmakescore = _true_;
X break;
X case 'C':
X ownColormap = _true_;
X break;
X case 'r':
X if(optshowscore || optmakescore || optrestore || (optlevel > 0) ||
X optverify)
X return E_USAGE;
X optrestore = _true_;
X break;
X case 'v':
X if(optshowscore || optmakescore || optrestore || (optlevel > 0) ||
X optverify)
X return E_USAGE;
X option++;
X optlevel = atoi(argv[option++]);
X if (!optlevel || !argv[option]) return E_USAGE;
X username = FixUsername(argv[option++]);
X if (!argv[option]) return E_USAGE;
X movelen = atoi(argv[option++]);
X if (!movelen) return E_USAGE;
X optverify = _true_;
X break;
X case 'd':
X datemode = _true_;
X break;
X default:
X if(optshowscore || optrestore || optmakescore || (optlevel > 0) ||
X optverify)
X return E_USAGE;
X optlevel = atoi(argv[option]+1);
X if(optlevel == 0)
X return E_USAGE;
X break;
X }
X } else
X /* found an option that didn't begin with a - (oops) */
X return E_USAGE;
X }
X
X if (optshowscore || optmakescore || optverify)
X return 0; /* Don't mess with X any more */
X /* okay.. NOW, find out what display we are currently attached to. This
X * allows us to put the display on another machine
X */
X res = GetDatabaseResource(command, "display");
X
X /* open up the display */
X dpy = XOpenDisplay(res);
X if(dpy == (Display *)NULL)
X return E_NODISPLAY;
X display_alloc = _true_;
X
X /* okay, we have a display, now we can get the std xdefaults and stuff */
X res = XResourceManagerString(dpy);
X if(res != NULL)
X /* try to get it off the server first (ya gotta love R4) */
X rdb = XrmGetStringDatabase(res);
X else {
X /* can't get it from the server, let's do it the slow way */
X /* try HOME first in case you have people sharing accounts :) */
X res = getenv("HOME");
X if(res != NULL)
X strcpy(buf, res);
X else
X /* no HOME, let's try and make one from the pwd (whee) */
X strcpy(buf, pwd->pw_dir);
X strcat(buf, "/.Xdefaults");
X rdb = XrmGetFileDatabase(buf);
X }
X
X /* let's merge in the X environment */
X res = getenv("XENVIRONMENT");
X if(res != NULL) {
X temp = XrmGetFileDatabase(res);
X XrmMergeDatabases(temp, &rdb);
X }
X
X /* now merge in the rest of the X command line options! */
X XrmMergeDatabases(command, &rdb);
X
X if (!username) username = GetResource("username");


X return 0;
X}
X

X/* Read a move sequence from stdin in a newly-allocated string. */
Xstatic char *ReadMoveSeq()
X{
X char *moveseq = (char *)malloc(movelen);
X int ch = 0;
X while (ch < movelen) {
X int n = read(0, moveseq + ch, movelen - ch); /* read from stdin */
X if (n <= 0) { perror("Move sequence"); return 0; }
X ch += n;
X }
X return moveseq;
X}
X
Xshort VerifyScore(short optlevel)
X{
X short ret;
X char *moveseq = ReadMoveSeq();
X if (!moveseq) { return E_WRITESCORE; }
X level = optlevel;
X ret = ReadScreen();
X if (ret) return ret;
X if (Verify(movelen, moveseq)) {
X ret = Score(_false_);
X scorelevel = 0; /* don't score again */
X if (ret == 0) ret = E_ENDGAME;
X } else {
X ret = E_WRITESCORE;
X }
X free(moveseq);


X return ret;
X}
X

X/* we just sit here and keep playing level after level after level after .. */
Xshort GameLoop(void)


X{
X short ret = 0;
X

X /* make sure X is all set up and ready for us */
X ret = InitX();
X if (ret == E_NOCOLOR && !ownColormap) {
X DestroyDisplay();
X ownColormap = _true_;
X fprintf(stderr,
X "xsokoban: Couldn't allocate enough colors, trying own colormap\n");
X ret = InitX();
X }
X
X if(ret != 0)
X return ret;
X
X /* get where we are starting from */
X if(!optrestore)


X ret = ReadScreen();
X

X /* until we quit or get an error, just keep on going. */
X while(ret == 0) {
X ret = Play();
X if((scorelevel > 0) && scoring) {
X int ret2;
X ret2 = Score(_false_);
X Error(ret2);
X scorelevel = 0;
X }
X if (ret == 0 || ret == E_ABORTLEVEL) {
X short newlev = 0;
X short ret2;
X ret2 = DisplayScores(&newlev);
X if (ret2 == 0) {
X if (newlev > 0 &&
X#if !ANYLEVEL
X newlev <= userlevel &&
X#endif
X 1) {
X level = newlev;
X } else {
X if (ret == 0) level++;
X }
X ret = 0;
X } else {
X ret = ret2;
X }
X
X }
X if(ret == 0) {
X moves = pushes = packets = savepack = 0;


X ret = ReadScreen();
X }

X }
X return ret;
X}
X

X/* Does this really need a comment :) */
Xshort GetGamePassword(void)
X{
X return ((strcmp(getpass("Password: "), PASSWORD) == 0) ? 0 : E_ILLPASSWORD);
X}
X
X/* display the correct error message based on the error number given us.
X * There are 2 special cases, E_ENDGAME (in which case we don't WANT a
X * silly error message cause it's not really an error, and E_USAGE, in which
X * case we want to give a really nice list of all the legal options.
X */
Xvoid Error(short err)
X{
X switch(err) {
X case E_FOPENSCREEN:
X case E_PLAYPOS1:
X case E_ILLCHAR:
X case E_PLAYPOS2:
X case E_TOMUCHROWS:
X case E_TOMUCHCOLS:
X case E_NOUSER:
X case E_FOPENSAVE:
X case E_WRITESAVE:
X case E_STATSAVE:
X case E_READSAVE:
X case E_ALTERSAVE:
X case E_SAVED:
X case E_TOMUCHSE:
X case E_FOPENSCORE:
X case E_READSCORE:
X case E_WRITESCORE:
X case E_USAGE:
X case E_ILLPASSWORD:
X case E_LEVELTOOHIGH:
X case E_NOSUPER:
X case E_NOSAVEFILE:
X case E_NOBITMAP:
X case E_NODISPLAY:
X case E_NOFONT:
X case E_NOMEM:
X case E_NOCOLOR:
X fprintf(stderr, "%s: %s\n", progname, errmess[err]);
X if(err == E_USAGE)
X Usage();
X break;
X default:
X if(err != E_ENDGAME && err != E_ABORTLEVEL)
X fprintf(stderr, "%s: %s\n", progname, errmess[0]);


X break;
X }
X}
X

X/* this simply prints out the usage string nicely. */
Xvoid Usage(void)


X{
X short i;
X

X fprintf(stderr, USAGESTR, progname);
X for (i = 0; usages[i] != NULL; i++)
X fprintf(stderr, "%s", usages[i]);
X}
END_OF_FILE
if test 11866 -ne `wc -c <'xsokoban/main.c'`; then
echo shar: \"'xsokoban/main.c'\" unpacked with wrong size!
fi
# end of 'xsokoban/main.c'
fi
if test -f 'xsokoban/scoredisp.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/scoredisp.c'\"
else
echo shar: Extracting \"'xsokoban/scoredisp.c'\" \(15112 characters\)
sed "s/^X//" >'xsokoban/scoredisp.c' <<'END_OF_FILE'
X#include <X11/X.h>
X#include <X11/Xlib.h>
X#include <X11/Xresource.h>
X#include <assert.h>
X#include <string.h>
X#include <stdio.h>


X#include <stdlib.h>
X
X#include "externs.h"
X#include "globals.h"

X#include "defaults.h"
X
X#ifndef EXIT_FAILURE
X#define EXIT_FAILURE -1
X#endif
X
Xstatic Boolean initted = _false_;
Xstatic unsigned long sb_bg, panel_bg[3], border_color, panel_fg,
X text_color, text_highlight, thumb_colors[3], separation_color;
Xstatic unsigned int sb_width, panel_height, border_width, bevel_width,
X text_indent;
Xstatic unsigned int thumb_height, thumb_width;
Xstatic unsigned int bevel_darkening;
Xstatic unsigned long white;
Xstatic XWindowAttributes wa;
Xstatic GC gc, scroll_gc;
Xstatic XFontStruct *finfo, *score_finfo;
Xstatic char *selected_user;
X
Xstatic u_short rank[MAXSCOREENTRIES];
X
X#if !defined(STRDUP_PROTO)
Xchar *strdup(const char *s)
X{
X int l = strlen(s);
X char *ret = (char *)malloc((size_t)(l + 1));
X strcpy(ret, s);


X return ret;
X}
X#endif
X

Xunsigned int GetIntResource(char *resource_name, unsigned int def)
X{
X char *ret;
X ret = GetResource(resource_name);
X if (!ret) return def;
X return atoi(ret);
X}
X
Xu_short darken(u_short x)
X{
X return (u_short)((u_int)x * (0xFFFF - bevel_darkening)/0xFFFF);
X}
X
Xu_short lighten(u_short x)
X{
X return x + bevel_darkening - (u_short)(bevel_darkening * (u_int)x/0xFFFF);
X}
X
X/* Return 0 on success, an error message on error.
X shades[0] contains the requested color, shades[1] contains
X a darker version of the same color, shades[2] contains a
X lighter version. For use in drawing Motif-oid beveled panels.
X*/
Xchar *GetColorShades(Display *dpy,
X XWindowAttributes *wa,
X char *resource_name,
X char *default_name_8,
X Boolean default_white_2,
X unsigned long shades[])
X{
X char *rval = GetResource(resource_name);
X char buf[500];
X XColor normal, light, dark;
X if (!rval) {
X if (wa->depth >= 8) rval = default_name_8;
X else rval = default_white_2 ? "white" : "black";
X }
X if (!XParseColor(dpy, wa->colormap, rval, &normal)) {
X sprintf(buf, "Cannot parse color name for resource %s: %s",
X resource_name, rval);
X return strdup(buf);
X }
X dark.red = darken(normal.red);
X dark.green = darken(normal.green);
X dark.blue = darken(normal.blue);
X light.red = lighten(normal.red);
X light.green = lighten(normal.green);
X light.blue = lighten(normal.blue);
X if (!XAllocColor(dpy, wa->colormap, &normal) ||
X !XAllocColor(dpy, wa->colormap, &light) ||
X !XAllocColor(dpy, wa->colormap, &dark)) {
X sprintf(buf, "Cannot allocate color shades for resource %s: %s",
X resource_name, rval);
X return strdup(buf);
X }
X shades[0] = normal.pixel;
X shades[1] = dark.pixel;
X shades[2] = light.pixel;


X return 0;
X}
X
X

X/* Return 0 on success, else return an error message. */
Xchar *InitDisplayScores(Display *dpy, Window win)
X{
X Status status = XGetWindowAttributes(dpy, win, &wa);
X XGCValues gc_values;
X u_long value_mask;
X assert(status);
X bevel_darkening = GetIntResource("bevel.darkening", 16000);
X sb_bg = GetColorOrDefault(dpy, "scrollbar.background",
X wa.depth, "gray", _true_);
X GetColorShades(dpy, &wa,
X "panel.background", "beige", _true_,
X panel_bg);
X
X panel_fg = GetColorOrDefault(dpy, "panel.foreground",
X wa.depth, "black", _true_);
X border_color = GetColorOrDefault(dpy, "border.color",
X wa.depth, "black", _false_);
X text_color = GetColorOrDefault(dpy, "text.color",
X wa.depth, "black", _false_);
X text_highlight = GetColorOrDefault(dpy, "text.highlight",
X wa.depth, "red3", _false_);
X
X text_indent = GetIntResource("text.indent", 3);
X white = GetColorOrDefault(dpy, "highlight.color",
X wa.depth, "white", _true_);
X border_width = GetIntResource("border.width", 1);
X sb_width = GetIntResource("scrollbar.width", 25);
X panel_height = GetIntResource("panel.height", 25);
X bevel_width = GetIntResource("bevel.width", 3);
X thumb_height = GetIntResource("scrollbar.thumb.height", sb_width);
X thumb_width = GetIntResource("scrollbar.thumb.width", sb_width);
X separation_color = GetColorOrDefault(dpy, "sep.color", wa.depth,
X "gray", _false_);
X GetColorShades(dpy, &wa, "scrollbar.thumb.color", "gray", _true_,
X thumb_colors);
X finfo = GetFontResource("panel.font");
X score_finfo = GetFontResource("text.font");
X if (!score_finfo || !finfo) {
X return "Either cannot get font for panel or for text";
X }
X
X gc_values.function = GXcopy;
X gc_values.foreground = panel_fg;
X gc_values.background = panel_bg[0];
X gc_values.line_width = 1;
X gc_values.font = finfo->fid;
X value_mask = GCForeground | GCBackground | GCFunction | GCFont |
X GCLineWidth;
X
X gc = XCreateGC(dpy, win, value_mask, &gc_values);
X initted = _true_;


X return 0;
X}
X

Xstatic void DrawPanel(XWindowAttributes *wa, Window panel);
Xstatic void DrawScores(XWindowAttributes *wa, Window win);
Xstatic void DrawThumb(Window thumb);
X
Xstatic int font_height;
Xstatic int vmax, vposn;
Xstatic int win_height;
Xstatic int thumb_range;
Xstatic int yclip;
X
Xstatic void ComputeRanks()
X{
X int i;


X for (i = 0; i < scoreentries; i++) {

X rank[i] = SolnRank(i, 0);
X }
X}
X
Xstatic int FindCurrent()
X{
X int i;


X for (i = 0; i < scoreentries; i++) {

X if (0 == strcmp(scoretable[i].user, username) &&
X (unsigned short)level == scoretable[i].lv) {
X return i;
X }
X }
X for (i = 0; i < scoreentries; i++)
X if ((unsigned short)level > scoretable[i].lv) return i;
X return scoreentries - 1; /* Couldn't find it at all */
X}
X
X/* Make "vposn" an allowable position. */
Xstatic void TrimPosn()
X{
X if (vposn >= vmax)
X vposn = vmax - 1;
X if (vposn < 0) vposn = 0; /* must do this after prev stmt */
X}
X
Xstatic void PositionThumb(Window thumb)
X{
X int x = (thumb_width - sb_width)/2 - 1;
X int y = (int)((float)vposn/vmax * (float)thumb_range);
X if (x < 0) x = 0;
X if (y < 0) y = 0;
X if (y > thumb_range) y = thumb_range;
X XMoveWindow(dpy, thumb, x - 1, y - 1);
X /* subtract 1 to fudge thumb into place */
X}
X
X/* Display scores. Return E_ENDGAME if user wanted to quit from here.
X If user middle-clicked on a level, and "newlev" is non-zero, put
X the level clicked-on into "newlev".
X*/
Xshort DisplayScores_(Display *dpy, Window win, short *newlev)
X{
X Status status;
X XEvent xev;
X Window scrollbar, panel, thumb;


X short ret = 0;

X Boolean dragging = _false_;
X Boolean scores_dirty = _false_;
X
X selected_user = username;
X
X if (!initted) {
X char *msg = InitDisplayScores(dpy, win);
X if (msg) {
X fprintf(stderr, msg);
X exit(EXIT_FAILURE);
X }
X }
X ComputeRanks();
X status = XGetWindowAttributes(dpy, win, &wa); assert(status);
X scrollbar = XCreateSimpleWindow(dpy, win,
X wa.width - sb_width, 0,
X sb_width, wa.height - panel_height,
X border_width, border_color, sb_bg);
X panel = XCreateSimpleWindow(dpy, win,
X 0, wa.height - panel_height,
X wa.width, panel_height,
X 0, 0, panel_bg[0]);
X XSelectInput(dpy, scrollbar, ExposureMask | KeyPressMask
X | ButtonPressMask | ButtonReleaseMask | PointerMotionMask);
X XSelectInput(dpy, panel, ExposureMask | KeyPressMask);
X XClearWindow(dpy, win);
X
X font_height = score_finfo->max_bounds.ascent +
X score_finfo->max_bounds.descent;
X win_height = wa.height - panel_height - yclip;
X thumb_range = wa.height - panel_height - thumb_height;
X vmax = font_height * (scoreentries + 2) - win_height;
X vposn = (int)(FindCurrent() * font_height) -
X (int)(win_height/2);
X yclip = font_height * 3/2;
X /* coerce to int to make sure we do this in signed arithmetic */
X TrimPosn();
X thumb = XCreateSimpleWindow(dpy, scrollbar,
X 0, 0,
X thumb_width, thumb_height,
X border_width, border_color, thumb_colors[0]);
X PositionThumb(thumb);
X XSelectInput(dpy, thumb, ExposureMask);
X
X XMapRaised(dpy, scrollbar);
X XMapRaised(dpy, panel);
X XMapRaised(dpy, thumb);
X {
X XRectangle rectangles[1];
X scroll_gc = XCreateGC(dpy, win, 0, 0);
X XCopyGC(dpy, gc, GCForeground | GCBackground | GCFunction |
X GCFont | GCLineWidth, scroll_gc);
X rectangles[0].x = 0;
X rectangles[0].y = yclip;
X rectangles[0].width = wa.width - sb_width;
X rectangles[0].height = wa.height - panel_height - yclip;
X XSetClipRectangles(dpy, scroll_gc, 0, 0, &rectangles[0], 1, Unsorted);
X XSetFont(dpy, scroll_gc, score_finfo->fid);
X }
X
X
X DrawScores(&wa, win);
X
X for (;;) {
X if (scores_dirty) {
X if (0 == XPending(dpy)) {
X scores_dirty = _false_;
X PositionThumb(thumb);
X XClearWindow(dpy, win);
X DrawScores(&wa, win);
X XSync(dpy, False); /* make sure we don't get ahead */
X }
X }


X XNextEvent(dpy, &xev);
X switch(xev.type) {

X default:
X fprintf(stderr,
X "Warning: unexpected X event type %d seen\n", xev.type);


X break;
X case ClientMessage:
X {
X XClientMessageEvent *cm = (XClientMessageEvent *)&xev;
X if (cm->message_type == wm_protocols &&
X cm->data.l[0] == wm_delete_window) {
X ret = E_ENDGAME;

X goto done;
X }
X
X }
X case NoExpose:
X break;
X case Expose: {
X XExposeEvent *expose = &xev.xexpose;
X Window w = expose->window;
X if (expose->count != 0) break;
X if (w == win) {
X DrawScores(&wa, win);
X } else
X if (w == scrollbar) {
X } else
X if (w == thumb) {
X DrawThumb(thumb);
X }
X if (w == panel) {
X DrawPanel(&wa, panel);
X }
X XFlush(dpy);
X }
X
X break;
X case KeyPress: {
X char buf[1];
X int buflen = 1;


X KeySym sym;
X XComposeStatus compose;

X buf[0] = 0;

X (void)XLookupString(&xev.xkey, &buf[0], buflen,
X &sym, &compose);
X assert(status);
X switch(sym) {
X case XK_Return:
X goto done;
X case XK_q:
X ret = E_ENDGAME;
X goto done;
X default:
X if (buf[0]) XBell(dpy, 0);


X break;
X }
X
X }

X break;
X case ButtonPress:

X if (xev.xbutton.window == scrollbar) {
X dragging = _true_;
X }
X if (xev.xbutton.window == win) {
X int i = (xev.xbutton.y - yclip +
X vposn - font_height/2)/font_height;
X if (i < 0) i = 0;
X if (i >= scoreentries) i = scoreentries - 1;
X switch (xev.xbutton.button) {
X case Button1:
X {
X char *tmp = scoretable[i].user;
X if (0 != strcmp(tmp, selected_user)) {
X selected_user = tmp;
X scores_dirty = _true_;
X }
X break;
X }
X case Button2:
X if (newlev) {
X *newlev = scoretable[i].lv;
X goto done;
X } else {
X XBell(dpy, 0);


X }
X break;
X default:
X break;
X }
X }

X break;
X case ButtonRelease:
X dragging = _false_;
X break;
X case MotionNotify:
X {
X int old_vposn = vposn;
X int y = xev.xbutton.y;
X if (dragging) {
X vposn = (float)(y - (int)thumb_height/2)/
X thumb_range * vmax;
X TrimPosn();
X if (old_vposn != vposn) {
X scores_dirty = _true_;
X }
X }
X XFlush(dpy);


X }
X break;
X }
X }

X done:
X XDestroySubwindows(dpy, win);
X XFreeGC(dpy, scroll_gc);


X return ret;
X}
X

Xstatic void DrawScores(XWindowAttributes *wa, Window win)
X{
X int first_index = vposn/font_height;
X int last_index = (vposn + win_height - 1)/font_height;
X int i;
X char * header = "Rank User Level Moves Pushes Date";
X XSetForeground(dpy, gc, text_color);
X XDrawString(dpy, win, gc, text_indent, font_height, header,
X strlen(header));
X XDrawLine(dpy, win, gc, 0, yclip-1, wa->width - sb_width,
X yclip-1);
X
X for (i = first_index; i <= last_index && i < scoreentries; i++) {
X char buf[500];
X int y = yclip + (i+1) * font_height - vposn;
X if (i < last_index &&
X scoretable[i + 1].lv != scoretable[i].lv) {
X XSetForeground(dpy, scroll_gc, separation_color);
X XDrawLine(dpy, win, scroll_gc, 0, y + 2, wa->width, y + 2);
X }
X if (0 == strcmp(scoretable[i].user, selected_user)) {
X XSetForeground(dpy, scroll_gc, text_highlight);
X } else {
X XSetForeground(dpy, scroll_gc, text_color);
X }
X if (rank[i] <= MAXSOLNRANK)
X sprintf(buf, "%4d", rank[i]);
X else
X sprintf(buf, " ");
X sprintf(buf + 4, " %32s %4d %4d %4d %s", scoretable[i].user,


X scoretable[i].lv, scoretable[i].mv, scoretable[i].ps,

X DateToASCII(scoretable[i].date));
X XDrawString(dpy, win, scroll_gc, text_indent, y, buf, strlen(buf));
X }
X}
X
Xstatic void DrawPanel(XWindowAttributes *wa, Window panel)
X{
X char *msg = "Press <Return> to continue, \"q\" to quit the game.";
X XSetForeground(dpy, gc, panel_bg[2]);
X XFillRectangle(dpy, panel, gc,
X 0, 0, wa->width - bevel_width, bevel_width);
X XFillRectangle(dpy, panel, gc,
X 0, 0, bevel_width, panel_height - bevel_width);
X XSetForeground(dpy, gc, panel_bg[1]);
X {
X XPoint triangle[3];
X triangle[0].x = wa->width;
X triangle[0].y = bevel_width;
X triangle[1].x = wa->width;
X triangle[1].y = 0;
X triangle[2].x = wa->width - bevel_width;
X triangle[2].y = bevel_width;
X XFillPolygon(dpy, panel, gc,
X &triangle[0], 3, Convex, CoordModeOrigin);
X triangle[0].x = bevel_width;
X triangle[0].y = panel_height - bevel_width;
X triangle[1].x = triangle[0].x;
X triangle[1].y = panel_height;
X triangle[2].x = 0;
X triangle[2].y = panel_height;
X XFillPolygon(dpy, panel, gc,
X &triangle[0], 3, Convex, CoordModeOrigin);
X }
X XFillRectangle(dpy, panel, gc,
X bevel_width, panel_height - bevel_width,
X wa->width - bevel_width, bevel_width);
X XFillRectangle(dpy, panel, gc,
X wa->width - bevel_width, bevel_width,
X bevel_width, panel_height - bevel_width);
X XSetForeground(dpy, gc, white);
X XDrawLine(dpy, panel, gc, 0, 0, bevel_width,
X bevel_width);
X XSetForeground(dpy, gc, border_color);
X XDrawLine(dpy, panel, gc, 0, 0,
X wa->width, 0);
X XSetForeground(dpy, gc, text_color);
X XDrawString(dpy, panel, gc, text_indent, panel_height -
X 2 * bevel_width, msg, strlen(msg));
X}
X
Xstatic void DrawThumb(Window thumb)
X{
X int wm1 = thumb_width - 1;
X XSetForeground(dpy, gc, thumb_colors[2]);
X XFillRectangle(dpy, thumb, gc,
X 0, 0, wm1 - bevel_width, bevel_width);
X XFillRectangle(dpy, thumb, gc,
X 0, 0, bevel_width, thumb_height - bevel_width);
X XSetForeground(dpy, gc, thumb_colors[1]);
X {
X XPoint triangle[3];
X triangle[0].x = wm1;
X triangle[0].y = bevel_width;
X triangle[1].x = wm1;
X triangle[1].y = 0;
X triangle[2].x = wm1 - bevel_width;
X triangle[2].y = bevel_width;
X XFillPolygon(dpy, thumb, gc,
X &triangle[0], 3, Convex, CoordModeOrigin);
X triangle[0].x = bevel_width;
X triangle[0].y = thumb_height - bevel_width;
X triangle[1].x = triangle[0].x;
X triangle[1].y = thumb_height;
X triangle[2].x = 0;
X triangle[2].y = thumb_height;
X XFillPolygon(dpy, thumb, gc,
X &triangle[0], 3, Convex, CoordModeOrigin);
X }
X XFillRectangle(dpy, thumb, gc,
X bevel_width, thumb_height - bevel_width,
X wm1 - bevel_width, bevel_width);
X XFillRectangle(dpy, thumb, gc,
X wm1 - bevel_width, bevel_width,
X bevel_width, thumb_height - bevel_width);
X XSetForeground(dpy, gc, white);
X XDrawLine(dpy, thumb, gc, 0, 0, bevel_width, bevel_width);
X}
END_OF_FILE
if test 15112 -ne `wc -c <'xsokoban/scoredisp.c'`; then
echo shar: \"'xsokoban/scoredisp.c'\" unpacked with wrong size!
fi
# end of 'xsokoban/scoredisp.c'
fi
echo shar: End of archive 3 \(of 8\).
cp /dev/null ark3isdone

Andrew Myers

unread,
Nov 3, 1994, 10:31:00 AM11/3/94
to
Submitted-by: an...@tonic.lcs.mit.edu (Andrew Myers)
Posting-number: Volume 22, Issue 137
Archive-name: xsokoban/part04

Environment: X11, game
Supersedes: xsokoban: Volume 21, Issue 98-104

#! /bin/sh


# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: xsokoban/FILES xsokoban/README
# xsokoban/bitmaps/defaults/man.xpm
# xsokoban/bitmaps/defaults/northwall.xpm
# xsokoban/bitmaps/defaults/object.xpm
# xsokoban/bitmaps/defaults/treasure.xpm
# xsokoban/bitmaps/defaults/vertiwall.xpm xsokoban/configure.in
# xsokoban/externs.h xsokoban/xsokoban.man
# Wrapped by chris@sparky on Thu Nov 3 09:23:50 1994


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 4 (of 8)."'
if test -f 'xsokoban/FILES' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/FILES'\"
else
echo shar: Extracting \"'xsokoban/FILES'\" \(4758 characters\)
sed "s/^X//" >'xsokoban/FILES' <<'END_OF_FILE'
Xxsokoban/Imakefile
Xxsokoban/Makefile
Xxsokoban/Makefile.in
Xxsokoban/README
Xxsokoban/FILES
Xxsokoban/config.h
Xxsokoban/configure
Xxsokoban/configure.in
Xxsokoban/config_local.h
Xxsokoban/config_local.h.in
Xxsokoban/defaults.h
Xxsokoban/display.c
Xxsokoban/errors.h
Xxsokoban/externs.h
Xxsokoban/globals.h
Xxsokoban/help.h
Xxsokoban/main.c
Xxsokoban/options.h
Xxsokoban/play.c
Xxsokoban/qtelnet.c
Xxsokoban/resources.c
Xxsokoban/save.c
Xxsokoban/score.c
Xxsokoban/scoredisp.c
Xxsokoban/screen.c
Xxsokoban/xsokoban.man
Xxsokoban/patchlevel.h
Xxsokoban/bitmaps/defaults/centerwall.xpm
Xxsokoban/bitmaps/defaults/east_twall.xpm
Xxsokoban/bitmaps/defaults/eastwall.xpm
Xxsokoban/bitmaps/defaults/floor.xpm
Xxsokoban/bitmaps/defaults/goal.xpm
Xxsokoban/bitmaps/defaults/horizwall.xpm
Xxsokoban/bitmaps/defaults/llcornerwall.xpm
Xxsokoban/bitmaps/defaults/lonewall.xpm
Xxsokoban/bitmaps/defaults/lrcornerwall.xpm
Xxsokoban/bitmaps/defaults/man.xpm
Xxsokoban/bitmaps/defaults/north_twall.xpm
Xxsokoban/bitmaps/defaults/northwall.xpm
Xxsokoban/bitmaps/defaults/object.xpm
Xxsokoban/bitmaps/defaults/saveman.xpm
Xxsokoban/bitmaps/defaults/south_twall.xpm
Xxsokoban/bitmaps/defaults/southwall.xpm
Xxsokoban/bitmaps/defaults/treasure.xpm
Xxsokoban/bitmaps/defaults/ulcornerwall.xpm
Xxsokoban/bitmaps/defaults/urcornerwall.xpm
Xxsokoban/bitmaps/defaults/vertiwall.xpm
Xxsokoban/bitmaps/defaults/man.xbm
Xxsokoban/bitmaps/defaults/wall.xpm
Xxsokoban/bitmaps/defaults/west_twall.xpm
Xxsokoban/bitmaps/defaults/westwall.xpm
Xxsokoban/bitmaps/defaults/centerwall.xbm
Xxsokoban/bitmaps/defaults/east_twall.xbm
Xxsokoban/bitmaps/defaults/eastwall.xbm
Xxsokoban/bitmaps/defaults/floor.xbm
Xxsokoban/bitmaps/defaults/goal.xbm
Xxsokoban/bitmaps/defaults/horizwall.xbm
Xxsokoban/bitmaps/defaults/llcornerwall.xbm
Xxsokoban/bitmaps/defaults/lonewall.xbm
Xxsokoban/bitmaps/defaults/lrcornerwall.xbm
Xxsokoban/bitmaps/defaults/north_twall.xbm
Xxsokoban/bitmaps/defaults/northwall.xbm
Xxsokoban/bitmaps/defaults/object.xbm
Xxsokoban/bitmaps/defaults/saveman.xbm
Xxsokoban/bitmaps/defaults/south_twall.xbm
Xxsokoban/bitmaps/defaults/southwall.xbm
Xxsokoban/bitmaps/defaults/treasure.xbm
Xxsokoban/bitmaps/defaults/ulcornerwall.xbm
Xxsokoban/bitmaps/defaults/urcornerwall.xbm
Xxsokoban/bitmaps/defaults/vertiwall.xbm
Xxsokoban/bitmaps/defaults/wall.xbm
Xxsokoban/bitmaps/defaults/west_twall.xbm
Xxsokoban/bitmaps/defaults/westwall.xbm
Xxsokoban/screens/screen.1
Xxsokoban/screens/screen.2
Xxsokoban/screens/screen.3
Xxsokoban/screens/screen.4
Xxsokoban/screens/screen.5
Xxsokoban/screens/screen.6
Xxsokoban/screens/screen.7
Xxsokoban/screens/screen.8
Xxsokoban/screens/screen.9
Xxsokoban/screens/screen.10
Xxsokoban/screens/screen.11
Xxsokoban/screens/screen.12
Xxsokoban/screens/screen.13
Xxsokoban/screens/screen.14
Xxsokoban/screens/screen.15
Xxsokoban/screens/screen.16
Xxsokoban/screens/screen.17
Xxsokoban/screens/screen.18
Xxsokoban/screens/screen.19
Xxsokoban/screens/screen.20
Xxsokoban/screens/screen.21
Xxsokoban/screens/screen.22
Xxsokoban/screens/screen.23
Xxsokoban/screens/screen.24
Xxsokoban/screens/screen.25
Xxsokoban/screens/screen.26
Xxsokoban/screens/screen.27
Xxsokoban/screens/screen.28
Xxsokoban/screens/screen.29
Xxsokoban/screens/screen.30
Xxsokoban/screens/screen.31
Xxsokoban/screens/screen.32
Xxsokoban/screens/screen.33
Xxsokoban/screens/screen.34
Xxsokoban/screens/screen.35
Xxsokoban/screens/screen.36
Xxsokoban/screens/screen.37
Xxsokoban/screens/screen.38
Xxsokoban/screens/screen.39
Xxsokoban/screens/screen.40
Xxsokoban/screens/screen.41
Xxsokoban/screens/screen.42
Xxsokoban/screens/screen.43
Xxsokoban/screens/screen.44
Xxsokoban/screens/screen.45
Xxsokoban/screens/screen.46
Xxsokoban/screens/screen.47
Xxsokoban/screens/screen.48
Xxsokoban/screens/screen.49
Xxsokoban/screens/screen.50
Xxsokoban/screens/screen.51
Xxsokoban/screens/screen.52
Xxsokoban/screens/screen.53
Xxsokoban/screens/screen.54
Xxsokoban/screens/screen.55
Xxsokoban/screens/screen.56
Xxsokoban/screens/screen.57
Xxsokoban/screens/screen.58
Xxsokoban/screens/screen.59
Xxsokoban/screens/screen.60
Xxsokoban/screens/screen.61
Xxsokoban/screens/screen.62
Xxsokoban/screens/screen.63
Xxsokoban/screens/screen.64
Xxsokoban/screens/screen.65
Xxsokoban/screens/screen.66
Xxsokoban/screens/screen.67
Xxsokoban/screens/screen.68
Xxsokoban/screens/screen.69
Xxsokoban/screens/screen.70
Xxsokoban/screens/screen.71
Xxsokoban/screens/screen.72
Xxsokoban/screens/screen.73
Xxsokoban/screens/screen.74
Xxsokoban/screens/screen.75
Xxsokoban/screens/screen.76
Xxsokoban/screens/screen.77
Xxsokoban/screens/screen.78
Xxsokoban/screens/screen.79
Xxsokoban/screens/screen.80
Xxsokoban/screens/screen.81
Xxsokoban/screens/screen.82
Xxsokoban/screens/screen.83
Xxsokoban/screens/screen.84
Xxsokoban/screens/screen.85
Xxsokoban/screens/screen.86
Xxsokoban/screens/screen.87
Xxsokoban/screens/screen.88
Xxsokoban/screens/screen.89
Xxsokoban/screens/screen.90
END_OF_FILE
if test 4758 -ne `wc -c <'xsokoban/FILES'`; then
echo shar: \"'xsokoban/FILES'\" unpacked with wrong size!
fi
# end of 'xsokoban/FILES'
fi
if test -f 'xsokoban/README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/README'\"
else
echo shar: Extracting \"'xsokoban/README'\" \(4745 characters\)
sed "s/^X//" >'xsokoban/README' <<'END_OF_FILE'
X
XXSokoban 3.2e
X-------------
X
XThis distribution
Xcontains all the files to compile and run the game,
Xthe original 50 sokoban screen files, 40 additional screen files
Xgleaned from various public domain versions of sokoban, and a manual
Xpage that explains how the game works.
X
X
X Installation
X Credits
X Fixes, Bug Reports, and Modifications
X Redistribution
X Play Safely!
X NO WARRANTY!
X
X
XInstallation
X
X
X Edit the header file config.h to define the
X appropriate paths and options for your system. These defines
X should be checked carefully to make sure they are correct.
X
X
X
X You can compile xsokoban in either WWW mode or local mode.
X Where it stores scores depends on the mode. The mode is
X controlled by the WWW option; see "config.h" for
X more details.
X
X
X If compiling in WWW mode, make sure you change the variable
X HERE to refer to your location!
X
X
XDo one of the following (A,B, or C) to produce a Makefile:
X
X
X A. (Easy) Run the script "configure" to produce the include file
X "config_local.h" and a Makefile.
X
X
X B. OR: Edit "config_local.h" by hand, and use "xmkmf" to
X produce a Makefile from the Imakefile provided.
X
X
X C. OR: Edit "config_local.h" and "Makefile" by hand to set the
X compiler and compiler flags correctly and select the right
X libraries to compile with.
X
X
X If you want to have the game run in color, you will need the
X XPM library. In this case, make sure that if you used options B
X or C, the variable EXTRA_INCLUDES points to the directory
X containing "xpm.h", and that EXTRA_LIBRARIES references the
X directory containing the library "libXpm.a".
X
X Last time I checked, XPM could be obtained by FTP from
X export.lcs.mit.edu:contrib. Make sure your version of XPM is up
X to date. The current pixmaps definitely work with versions 3.2g
X and 3.3, but not with version 2. They should work with version 3.4,
X too.
X
X
X Compile by typing "make". If something goes wrong, and you can track
X down an error, send me a bug report (including what changes you needed
X to make, and I will see about fixing it for later distributions).
X
X Some systems have non-ANSI X header files, and you will need to
X turn off function prototypes in those headers, or get better header
X files. You will know this is happening if reams of errors start
X popping up in "Xlib.h"
X
X
X Play the game by typing "xsokoban". If it complains about not being
X able to read the scorefile, create one with "xsokoban -c". If this
X doesn't work, it is probably because you need to create the score
X directory. See config.h.
X
X
X Set ROOTDIR to the desired final location for the xsokoban
X data files, and rebuild. Install the game by typing "make install" or by
X manually copying the executable. Install the directories screens/,
X scores/, bitmaps/, and saves/ under ROOTDIR.
X
X
X
XCredits
X
X Unknown Hacker - Original curses(1) implementation.
X Joseph L. Traub - X windows interface.
X Kevin Solie - simultaneously developed X implementation (merged in).
X Mark Linderman, Christos Zoulas - Mouse code (added to Solie's version).
X Andrew Myers - Improved mouse UI, score ranking, WWW and color support
X
XFixes, Bug Reports, and Modifications
X
X If you make any changes to this program, fix any bugs, add any neat
X features, or whatever, please send mail to "an...@lcs.mit.edu"
X so that I can add them in to the newest release.
X
XRedistribution
X
X XSokoban is distributed in the public domain and may be freely
X redistributed.
X
XPlay Safely!
X XSokoban is an addictive and time-consuming game. Like any other
X computer game, if played for long periods of time, xsokoban can put
X stress on the tendons and nerves in your arm, causing injury. The
X injury may not cause pain until it is advanced. Take breaks. Make
X sure your computer setup is ergonomic. Use the user interface
X intelligently.
X
XNO WARRANTY!
X
X XSokoban comes with absolutely no warranty. The entire risk as
X to the quality and performance of the program is with you. Should
X xsokoban prove defective, you assume the cost of all necessary
X servicing, repair or correction.
X
X In no event unless required by applicable law will Andrew Myers or
X any other party be liable to you for damages, including any lost
X profits, lost monies, physical injury, or other special, incidental, or
X consequential damages arising out of the use or inability to use
X the program (including but not limited to loss of data or data
X being rendered inaccurate or losses sustained by third parties),
X even if you have been advised of the possibility of such damages,
X or for any claim by any other party.
X
XAndrew Myers
Xan...@lcs.mit.edu
END_OF_FILE
if test 4745 -ne `wc -c <'xsokoban/README'`; then
echo shar: \"'xsokoban/README'\" unpacked with wrong size!
fi
# end of 'xsokoban/README'
fi
if test -f 'xsokoban/bitmaps/defaults/man.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/man.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/man.xpm'\" \(4176 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/man.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 43 2",


X/* colors */
X"`b c #E6E51B",
X"`c c #514A35",

X"`j c #BE8A4A",
X"`o c #585856",
X"`r c #525250",
X"`t c #BC8C4B",
X"`x c #CC9275",
X"`y c #8D6737",
X"`z c #555042",
X"a` c #B68352",
X"aa c #9A723D",
X"af c #5D5543",

X"al c #CAC829",
X"an c #B98747",
X"aq c #302E20",
X"ar c #7D603A",

X"au c #514A33",

X"az c #5A5A56",

X"bf c #AE7959",
X"bg c #82533B",


X"bl c #DAD741",
X"bm c #58585D",

X"bo c #565551",
X"bp c #926740",

X"bw c #514B38",
X"bx c #5F4A28",

X"by c #614B4B",


X"cc c #B18340",
X"cd c #715336",
X"cf c #573423",

X"cg c #947376",


X"cj c #C4A03B",
X"cl c #585855",

X"co c #AB7F40",
X"ct c #545454",

X"da c #C78E72",


X"di c #BBB720",

X"dk c #8F872D",
X"dl c #555554",
X"dm c #504E45",
X"do c #605D4E",

X"dq c #766B3F",
X"dr c #98793C",
X/* pixels */

X"ctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctct",
X"ctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctct",
X"ctctctctctctctctctctctctctctctdldodqdqcgdqdqdo`octctctctctctctctctctctctctctctct",
X"ctctctctctctctctctctctctctdlazdrdacj`jcj`janaadqboctctctctctctctctctctctctctctct",
X"ctctctctctctctctctctctctctclbfcjcj`j`jcccoaa`y`ycdctctctctctctctctctctctctctctct",
X"ctctctctctctctctctctctctbmdqdrcf`yccanccdraabxcfauboctctctctctctctctctctctctctct",
X"ctctctctctctctctctctctctctbfco`ccfcf`ycc`ybxaqaqcfafboctctctctctctctctctctctctct",
X"ctctctctctctctctctctctctctbfcjcjdr`yarco`ybxararcdcdctctctctctctctctctctctctctct",
X"ctctctctctctctctctctctctcta`cj`tdqdodrccdkcdaucd`ycdctctctctctctctctctctctctctct",
X"ctctctctctctctctctctctctcta``xcjcjancccccoaa`y`y`yafctctctctctctctctctctctctctct",
X"ctctctctctctctctctctctctctdrcjblcjaldididididkdk`ycd`rdlctctctctctctctctctctctct",
X"ctctctctctctctctctctct`rbyccbl`b`b`b`b`baldididididrdoctctctctctctctctctctctctct",
X"ctctctctctctctctctct`rbwauarcj`b`b`b`bdi`bdidididiarau`z`rctctctctctctctctctctct",
X"ctctctctctctctctctctbwauaucdcc`b`b`bdi`baldidididkbxauau`zctctctctctctctctctctct",
X"ctctctctctctctctct`r`cauauaucodi`b`bdialdididididkbxauauaudmctctctctctctctctctct",
X"ctctctctctctctctct`zauauauauaaandi`bdi`bdididicjaaauauauaubw`rctctctctctctctctct",
X"ctctctctctctctctctbwauauauaubp`jandidididididiccaaauauauau`c`rctctctctctctctctct",
X"ctctctctctctctctctbwauauauau`y`j`jcjdidididiccanaaauauauauaudmctctctctctctctctct",
X"ctctctctctctctct`rbwauauauau`y`j`j`jcjdidicccjanaaauauauauau`rboctctctctctctctct",
X"ctctctctctctctct`rbwauauauau`y`j`j`jcccjccan`j`jccbwauauauaudmctctctctctctctctct",
X"ctctctctctctctct`rbwauauauaubp`j`j`j`janan`j`j`jancdauauauau`rboctctctctctctctct",
X"ctctctctctctctctbobwauauau`caa`j`j`jan`j`j`j`j`jancdauauauaudmctctctctctctctctct",
X"ctctctctctctctctct`zauauauaucoanccanananananan`j`jbpauauauau`rboctctctctctctctct",
X"ctctctctctctctctctdmauauauafcococcccccccccccanccandrauauauau`rctctctctctctctctct",
X"ctctctctctctctctct`rbwauauaraacocococococococococococd`caubw`rctctctctctctctctct",
X"ctctctctctctctctctct`zauaubpaaaaaaaaaaaacoaacoaacoaa`yauau`zctctctctctctctctctct",
X"ctctctctctctctctctct`r`zar`yaaaaaabpaabpaabpaabpaaaaaacdbw`rboctctctctctctctctct",
X"ctctctctctctctctctctctctar`y`y`y`y`y`y`y`y`y`y`y`y`y`y`ydoctctctctctctctctctctct",
X"ctctctctctctctctctctctctctdo`y`y`y`y`y`y`y`y`y`y`y`y`yardldlctctctctctctctctctct",
X"ctctctctctctctctctctctctctbodo`yaa`y`y`y`y`y`y`y`y`ydoctctctctctctctctctctctctct",
X"ctctctctctctctctctctctctctctctdkdidkbg`y`y`y`y`ydidkafboctctctctctctctctctctctct",
X"ctctctctctctctctctctctctctctafdkdiarbobobobodlafdkdidqctctctctctctctctctctctctct",
X"ctctctctctctctctctctctctctctdodidibxbobodldldldldkdidkbwctctctctctctctctctctctct",
X"ctctctctctctctctctctctctdl`rdkdidkafboctctctct`rdqdidkdoctctctctctctctctctctctct",
X"ctctctctctctctctctctctctcldqdididkauazctctctctctdodididq`zdlctctctctctctctctctct",
X"ctctctctctctctctctct`rdqdkdididkdidkdoctctctdldmdqdidididkdqdoctctctctctctctctct",
X"ctctctctctctctctctdldodkdkdqdkdkdkdkdkafbodlbodqdidkdidkdkdkdk`zbodlctctctctctct",
X"ctctctctctctctctctdlbo`r`rdmaudk`zbwafdqdo`rdodqauaudqdkafdmdmbodlctctctctctctct",
X"ctctctctctctctctctctctctdlclbodm`rcl`r`r`rdlbo`rcl`rdmdoaf`rbodldlctctctctctctct",
X"ctctctctctctctctctctctctdl`rdldldldldldldldldldl`rdlclbo`rdldlctctctctctctctctct",
X};
END_OF_FILE
if test 4176 -ne `wc -c <'xsokoban/bitmaps/defaults/man.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/man.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/man.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/northwall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/northwall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/northwall.xpm'\" \(3871 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/northwall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 24 2",
X/* colors */
X"`f c #7F4D34",
X"`g c #7D4B32",


X"`x c #CC9275",

X"ae c #67402C",


X"ar c #7D603A",

X"ax c #F3E6DF",
X"bc c #7C4B32",
X"bg c #82533B",


X"bp c #926740",
X"bq c #804E35",

X"br c #7E4C33",


X"bu c #9E9E73",

X"c` c #B27A5F",


X"cd c #715336",
X"cf c #573423",

X"cm c #CFBAB6",


X"cn c #D7D78C",

X"cp c #B77F63",
X"cq c #5E3926",
X"cz c #643C28",
X"da c #C78E72",


X"dg c #D6D68A",

X"dh c #7B4A31",
X"dn c #BE8A6F",
X/* pixels */
X"axcm`x`x`x`x`x`x`x`x`x`x`x`x`xbu`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xdabp",
X"cmaxcm`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xbpcq",
X"`xdgax`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xdabpaecf",
X"`x`xcmaxcm`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xbpcqcfcf",
X"`x`x`xcmax`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xdabpaecfcfcf",
X"`x`x`x`xcncmdncpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpbpcqcfcfcfcf",
X"`x`x`x`x`xcpbqbqbqbqbqbqbqbqbgbqbgbqar`fcdbgcdbgcdbgcdbgcdbqbqbqbqbqaecfcfcfcfcf",
X"`x`x`x`x`xc`bqbr`gbrbrbcbrbcbcbcbcbcdh`gbr`g`g`g`g`g`g`gbrbrbrbcbcbcaecfcfcfcfcf",
X"`x`x`x`x`xc``f`g`g`g`g`gbr`gbrbc`g`g`g`g`g`g`g`g`g`g`g`g`g`gbrbr`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc``f`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc``f`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf"
X};
END_OF_FILE
if test 3871 -ne `wc -c <'xsokoban/bitmaps/defaults/northwall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/northwall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/northwall.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/object.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/object.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/object.xpm'\" \(4176 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/object.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 43 2",
X/* colors */
X"`` c #000000",
X"`a c #4C486F",
X"`d c #1A172A",
X"`h c #07060A",
X"`k c #8A86A5",
X"`l c #70709C",
X"`m c #8D6EE7",
X"`n c #3D3D56",


X"`o c #585856",

X"`p c #585681",


X"`r c #525250",

X"`w c #474766",
X"ab c #B0A9B9",
X"ag c #65658D",


X"ah c #595956",

X"aj c #6B6B96",
X"ak c #393851",
X"ap c #5C5C69",


X"aq c #302E20",

X"as c #0F0D1A",
X"ax c #F3E6DF",
X"ay c #000001",
X"b` c #271D4F",
X"ba c #423F45",
X"bd c #9999C2",
X"be c #373644",
X"bh c #454562",
X"bi c #7B7BA4",
X"bk c #211845",


X"bm c #58585D",

X"bo c #565551",

X"bt c #5F5F88",
X"bz c #42425E",
X"ca c #4E4E6D",
X"ck c #27262F",
X"cs c #3F3F5A",


X"ct c #545454",

X"d` c #8080B7",
X"db c #514B4A",
X"dd c #020103",
X"de c #2F2F39",


X"dl c #555554",
X"dm c #504E45",

X/* pixels */
X"ctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctct",
X"ctctctctctctctctctctctctctdlapapag`l`l`lajbtapbmdlctctctctctctctctctctctctctctct",
X"ctctctctctctctctctctctbmag`kbdbdabbdbdbdbdd`d``lagapdlctctctctctctctctctctctctct",
X"ctctctctctctctctctahajbdbdababbdbdbdbd`mbdd`d`bi`lajbtbmctctctctctctctctctctctct",
X"ctctctctctctctctap`kababax`mabbdbdbd`mbdbdd`d`bi`lajbt`pcactctctctctctctctctctct",
X"ctctctctctctbobtbdaxababbdbdabbdbdbdbdd`d`d`bi`l`lajbtbtca`w`rctctctctctctctctct",
X"ctctctctctctbtabbdbdbdababbdbdbdbd`mbdd`d`d`bi`l`lajbtbt`pcabz`rctctctctctctctct",
X"ctctctctbobtbdaxbdaxababbdbdbdbd`mbdbdd`d``ld``lajajag`p`pcabhakdbctctctctctctct",
X"ctctctctbmbdbdbdbdbdbdbdbdbdbdbdbdd`d`d`d`d``l`l`lagagbt`pca`w`nbebactctctctctct",
X"ctctct`od`bdaxababbdbdbdbdbd`mbd`md`d`d`d``l`l`lajajbt`p`pca`wcsbeckbectctctctct",
X"ctctctapbdbdbdbdbdbdbdbdbd`mbdd`d`d`d`d``ld``l`lajbtbtbt`pca`wcsakckasba`rctctct",
X"ctctctbdabababbdbdbdbd`mbdbdbdd`d`d`d`d``l`l`lajajagbt`pcaca`w`nakde`dasbactctct",
X"ctctapbdbdbdbdbdbdbdbdbd`md`d`d`d`d``l`l`l`l`lajbtbtbt`pcacabhcsbedeck`haq`rctct",
X"ctctbibdbdbdbdbdbdbd`mbdd`d`d`d`d`d``ld``l`lajagagbt`p`pca`abz`nakdede`ddddectct",
X"ctctbibdbdbdbd`mbd`md`d`d`d`d`d``l`ld`aj`lajajbtbt`p`pcaca`wbzakbeb`beckddasboct",
X"dlcabdbdbd`mbdbdbdd`d`d`d`d`d``ld``l`l`lajajagbtbt`p`pca`abh`nakakbebede`hddbact",
X"ctapd``mbdbdbdd`d`d`d`d`d``ld``l`l`l`lajajbtbtbt`p`pcaca`wcs`nakbeakakbeas``ck`r",
X"`oapd`bdbdd`d`d`d`d`d`d``ld``l`l`lajajajagbtbt`p`pcaca`wbh`nakakakakakakas``asdb",
X"ctapd`d`d`d`d`d``l`l`l`l`l`l`l`l`lajagbtbtbt`p`pcacacabhcs`nakakakakakak`d```hba",
X"dlapd`d`d`d``ld``ld``ld``l`lajajajajbtbtbt`p`p`pcacabhbz`nakakakak`n`nak`d``ddbe",
X"ctbm`lbi`l`l`l`l`l`lajajajajajajbtbtbtbt`p`pcaca`w`wbz`nakak`n`n`ncscs`nas``ddde",
X"ctbmaj`l`laj`lajajajajajajajbtbtbtbt`p`p`pcacaca`wbzcs`n`n`n`ncscsbzbz`nas````aq",
X"ctctbtajagajagajajajbtajbtbtbtbt`p`p`pcacaca`abhbzcs`nak`ncscsbzbzbzbhak`h````ck",
X"ctctcabtbtbtbtbtbtbtbtbtbtbt`p`p`p`p`pcaca`wbhbz`n`n`n`ncscsbzbzbhbh`wdedd``ddde",
X"ctctbm`p`p`p`pbtbtbt`pbt`p`p`p`pcaca`a`w`w`wcs`n`n`n`ncsbzbzbhbhbh`wbh`d`````hba",
X"ctctct`w`w`p`p`p`p`p`p`pca`pcacacaca`w`wbzcs`n`n`n`ncsbzbzbhbh`w`w`wcs`h`````hba",
X"ctctctbh`w`w`aca`acacacacaca`a`w`wbhbzcs`nak`nakcscsbzbzbh`w`w`wca`wckdday```ddm",
X"ctctdlctcsbz`w`a`wca`aca`w`w`w`wbzcs`n`nak`n`ncscsbzbzbh`w`w`wcacacsas````ddaqdl",
X"ctctctct`rak`ncsbzbhbzbhbzbzcs`n`nakakakak`ncscsbzbz`w`w`w`wcaca`w`d```````hdbct",
X"ctctctctct`ndeakakak`n`n`nakakakakakakak`n`ncsbzbhbh`w`w`wcaca`adedd``````ck`rct",
X"ctctctctctctbededeakb`akdeakakbeakakak`ncscsbzbzbh`w`wcacacacabe`hay`````hbadlct",
X"ctctctctctctctbebkckdedeb`debeb`akakak`ncsbzbzbh`w`w`w`aca`abe`h``````dddedldlct",
X"ctctctctctctctctbackdededeakdeakakak`ncscsbzbh`w`wcacaca`wck`hay````ayckdmdlctct",
X"ctctctctctctctctctde`ddeb`deakakakakcscsbzbhbh`w`wca`wak`ddday````ddasdmctctctct",
X"ctctctctctctctctctctdeas`ddeakakak`ncscsbzbh`w`wbhak`d`h````````ay`ddmctctctctct",
X"ctctctctctctctctctct`rbaas`has`dckbeakakakakde`dasdd``````````ddckdmctctctctctct",
X"ctctctctctctctctctctct`rdmck`h`h`h`h`h`h`hdddday``````````ddasbedmdlctctctctctct",
X"ctctctctctctctctctctctct`r`rbaaq`hdd````````````````dd`hasdedmbodlctctctctctctct",
X"ctctctctctctctctctctctctctct`r`rdmdeaqasas`h`hasasaqckbabobodldlctctctctctctctct",
X"ctctctctctctctctctctctctctctctctctctct`r`rdmdmdmdm`rdlbobodldlctctctctctctctctct",
X};
END_OF_FILE
if test 4176 -ne `wc -c <'xsokoban/bitmaps/defaults/object.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/object.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/object.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/treasure.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/treasure.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/treasure.xpm'\" \(4639 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/treasure.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 72 2",
X/* colors */
X"`` c #000000",
X"`a c #4C486F",
X"`d c #1A172A",
X"`h c #07060A",
X"`i c #2F2263",
X"`k c #8A86A5",
X"`m c #8D6EE7",


X"`o c #585856",

X"`p c #585681",
X"`q c #322469",


X"`r c #525250",

X"`s c #3E2D82",
X"`v c #35266F",
X"`w c #474766",


X"`z c #555042",

X"ac c #43318D",
X"ad c #1A1333",


X"af c #5D5543",
X"ah c #595956",

X"ai c #523CAC",
X"ak c #393851",
X"am c #8460FE",
X"ao c #6147CB",
X"ap c #5C5C69",


X"aq c #302E20",

X"as c #0F0D1A",


X"at c #DDDD8E",
X"au c #514A33",
X"av c #939363",

X"aw c #48398A",
X"ay c #000001",


X"az c #5A5A56",

X"b` c #271D4F",
X"ba c #423F45",
X"bb c #251B4D",
X"be c #373644",
X"bh c #454562",


X"bj c #979770",

X"bk c #211845",


X"bm c #58585D",
X"bn c #DADA8D",
X"bo c #565551",

X"bu c #9E9E73",

X"bv c #584B6A",
X"bz c #42425E",
X"ca c #4E4E6D",


X"cb c #BA998B",

X"ce c #2C205C",
X"cg c #947376",


X"ch c #DBDB8D",

X"ci c #16102F",
X"ck c #27262F",


X"cl c #585855",

X"cm c #CFBAB6",


X"cn c #D7D78C",

X"cr c #8E8E97",


X"ct c #545454",

X"cv c #7253EC",
X"cw c #372873",
X"cy c #37305F",
X"d` c #8080B7",
X"db c #514B4A",
X"dc c #3A2A79",
X"dd c #020103",
X"de c #2F2F39",


X"df c #D8D88C",
X"dg c #D6D68A",

X"dj c #9C9C72",

X"dl c #555554",
X"dm c #504E45",

X"dp c #DFDF8F",
X"dq c #766B3F",

X/* pixels */
X"bjcndpdpdpdpdpdpdpatbuazdlctctctctctctdlbjdgdpdpdpdpdpdpdpatbuazctctctctctctctct",
X"dlbjcndpdpdpdpdpdpdpatbuazctdl`wbv`a`a`a`wbjcbdgatdpdpdpdpdpdfbjahctctctctctctct",
X"ct`objcndpdpdpdpdpdpdpdgcg`paiaiaiaiacacacdcdccaapcbdgatdpdpdpdfbjahctctctctctct",
X"ctctdlbjcndpdpdpdpdgcmd`aoaoaoaoaoaoaiaiacacdccwcycy`wbudgdpdpdpdfbjahctctctctct",
X"ctctct`objcndpdpcn`kaocvamamamcvcvaoaoaiaiac`sdc`qceb`b`azdgdgdpdpdfbjahctctctct",
X"ctctctctclbjdgcmd`cvamamamamamamcvcvaoaoaiawacdc`q`ib`b`bkbebuatdpdpcnbjahctctct",
X"ctctctctctclcgd`cvamamamamamamamamcvcvaoaiaiac`s`v`iceb`bkbkdebudpdpdpdfbjahctct",
X"ctctctctctapaicvamam`m`m`m`mamamamcvaoaoaiaiac`scw`qceb`bkbkaddebudpdpdpcnbjahct",
X"ctctctctctaicvamam`m`m`m`m`m`mamamcvcvaoaiaiac`sdc`qceb`bbbkadadbebudpdpdpdfbj`o",
X"clctctct`paoamam`m`m`m`m`m`mamamamcvaoaoaiaiac`scw`q`ib`bbbkbkadasaqdjatdpdpdfdj",
X"bjazctbmaicvcvam`m`m`m`m`m`m`mamcvcvcvaoaiaiac`sdc`qcecebbbkadadcias`dbudpdpdpat",
X"chbubm`aaocvamam`m`m`m`m`mamamamcvcvaoaoaiacac`scw`qceb`bbbkbkadcias`haqdgdpdpdp",
X"dpchdjaiaocvcvam`m`m`m`m`mamamcvcvaoaoaiaiacac`s`v`qcecebbbkbkadciciasayaudgdpdp",
X"dpdpcbaiaoaoamamamamamamamamcvcvaoaoaiaiaiac`sdc`v`qceb`bbbkbkadciciasas`havdpdp",
X"dpatcraiaicvcvcvamamamamamcvcvaoaoaoaiaiacac`sdc`v`icecebbbkbkadciciciasddaudgdp",
X"dpcn`paiaiaoaocvcvcvcvcvcvaoaoaoaoaiaiawacacdccw`v`iceceb`bkbkadadciciasdd`hbudp",
X"dpdgawawaiaiaoaoaoaoaoaoaoaoaoaiaiaiacaiac`sdccw`q`iceceb`bbbkbkadadadci`hdddqat",
X"dgdgawacaiaiaiaiaoaoaoaoaoaoaiaiacaiac`s`sdcdc`v`q`i`iceb`bbbkbkbkadadci`h``aqdg",
X"atcbcw`sacacaiaiaiaiaiaiaiaiaiacaiac`s`s`sdccw`v`q`q`iceceb`bbbkbkbkadadas``asbu",
X"dgdgcydc`sacacaiacaiacaiacacacacac`s`s`sdccwcw`v`q`q`icececeb`b`bbbkbkad`hdd`hdq",
X"bjcbbh`vcwdc`s`sacacacacacacac`s`s`sdcdccwcw`v`v`v`q`q`icecececeb`bbbkadas``ddba",
X"ctavbz`i`q`vcwdcdc`s`s`s`s`sdcdcdcdccwcwcwcw`v`v`v`v`q`q`q`i`iceceb`bbad`h````ck",
X"ctctcecece`i`q`v`v`vcw`vcwcwcwcw`v`v`v`v`v`v`v`v`v`v`v`v`v`v`q`iceb`bbaddday``ck",
X"ctdlakb`b`b`ce`i`i`i`q`q`q`q`q`q`q`q`q`v`v`v`vcw`vcwcwcwdccw`v`q`icebbcidd``ddde",
X"ctctdbbbbbb`b`cecececececece`i`i`i`i`q`q`q`v`vcwcwdcdcdcdcdcdc`v`icebkas````ddba",
X"ctct`rdebkbkbkbbbbb`b`ceb`cececece`i`i`i`q`q`vcwdcdc`s`s`s`sdccw`icebk`h``dd`hba",
X"ctctctakadbkbkbkbkbbbkbbbbb`b`b`cecece`i`q`q`vdcdc`s`s`s`s`sdc`v`ib`ci``````asbo",
X"ctctctctckadadadbkbkbkbkbkbkbbb`b`b`cece`i`qcwdc`s`s`sac`s`sdc`vcebk`h````ddaqdl",
X"ctctctctbaadadadadadadbkbkbkbkbkbbb`cece`i`vcwdc`s`s`sac`sdccw`qb`asay````asdqap",
X"dlctctctctbeciciciadadadadadbkbkbkbbb`ce`i`vcwdc`s`s`s`s`sdc`vceaddday``ddafcndj",
X"av`octctct`rdeasciciciciciadadbkbkbkb`ce`i`qcwcwdcdc`sdccw`vcead`hayay``asbudpdp",
X"dgbj`octctctdbdeasasasciciciadadbkbkb`ce`i`i`vcwcwdccw`v`qcead`hay`````hdqdpdpdp",
X"atdgbjdlctctct`rdeasciasciciciadbkbkbbb`cece`i`q`q`q`q`ib`ad`hayay``ddaudgdpdpdp",
X"dpatdgbj`octctct`rdeasasasciciadadbkbkbbb`cececececeb`bkasdday``````aqdgdpdpdpdp",
X"dpdpdpdgbjdlctctct`rckasasciciciadadbkbkbkbbbbb`bbbkas`hayay````ayasavdgdgdpdpdp",
X"dpdpdpatdgbj`octctct`rde`hddasasciadadadadadcici`hddayay``````dd`ddmctdjchdpdpdp",
X"dpdpdpdpdpdgbjdlctctctctba`dddaydddd`h`h`h`hay``ayayay````ay`hdedmdlctazbubndpdp",
X"dpdpdpdpdpatdgbj`octctctdl`zde`d`hddayayay````````````ddasckdmbodlctctctazbubndp",
X"dpdpdpdpdpdpdpdgbjdlctctctdlcldmbadeaqaqas`h`hasaqaqdqavav`rctctctctctctctazbubn",
X"dpdpdpdpdpdpdpchdgavdlctctctdldlbo`rbobubudgbubudgdgchcndgavdlctctctctctctdlazbu"
X};
END_OF_FILE
if test 4639 -ne `wc -c <'xsokoban/bitmaps/defaults/treasure.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/treasure.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/treasure.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/vertiwall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/vertiwall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/vertiwall.xpm'\" \(4270 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/vertiwall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 7 2",
X/* colors */
X"`g c #7D4B32",


X"`x c #CC9275",

X"bc c #7C4B32",
X"br c #7E4C33",
X"c` c #B27A5F",


X"cf c #573423",

X"cz c #643C28",
X/* pixels */
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf"
X};
END_OF_FILE
if test 4270 -ne `wc -c <'xsokoban/bitmaps/defaults/vertiwall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/vertiwall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/vertiwall.xpm'
fi
if test -f 'xsokoban/configure.in' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/configure.in'\"
else
echo shar: Extracting \"'xsokoban/configure.in'\" \(3464 characters\)
sed "s/^X//" >'xsokoban/configure.in' <<'END_OF_FILE'
XAC_INIT(xsokoban.man)


X
X############################################################################
X# Create config files

XAC_CONFIG_HEADER(config_local.h)


X
X############################################################################
X# Check for programs
X

XAC_WITH(gcc,CC=gcc)
X
XAC_PROG_INSTALL
XAC_PROG_CC
XAC_PROG_CPP


X
X#####################
X# Find Xpm if needed
X
X(cat config.h; echo "use_xpm=USE_XPM;www=WWW") > tmp.$$.c
X$CPP tmp.$$.c | egrep -v "^#" > tmp2.$$
X. ./tmp2.$$
Xif test $use_xpm = 1; then
X echo "Looking for Xpm">&2
X libxpm=1
X incxpm=1

X AC_HAVE_LIBRARY(-lXpm, [LIBS="$LIBS -lXpm"],


X [ echo "Can't find libXpm.a! You must add to LIBS in Makefile.">&2

X ])
X AC_HEADER_CHECK(xpm.h,,


X [echo "Can't find xpm.h! You must add to INCS in Makefile.">&2

X ])


Xfi
Xrm -f tmp.$$.c tmp2.$$
X
X###################
X# Find X
X

XAC_FIND_X


Xif test -n "$no_x"; then
X echo "Cannot find X libraries! Package may not compile">&2
X x_includes=
X x_libraries=-lX11
Xelse
X if test x$x_includes != x &&
X test x$x_includes != x/usr/include; then
X INCS="$INCS -I$x_includes"
X fi
X if test x$x_libraries != x &&
X test x$x_libraries != x/usr/lib; then
X LIBS="$LIBS -L$x_libraries"
X fi
X LIBS="$LIBS -lX11"
Xfi
X

XAC_SUBST(LIBS)
XAC_SUBST(INCS)


X
X##############
X# DEC bogosity
X

XAC_HAVE_LIBRARY(-ldnet_stub)


X
X####################################
X# Turn on all compiler warning flags
X
Xif test -n "$GCC"
Xthen
X WARN=-Wall
Xelse
X if test -f /bin/uname &&
X test `uname` = OSF1
X then
X WARN=-std1
X else
X WARN=
X fi
Xfi

XAC_SUBST(WARN)


X
X############################################################################
X# Check for library functions and C++ prototypes
X

XAC_COMPILE_CHECK([getpass prototype],
X[#include <stdlib.h>],
X[char *s = getpass("prompt");],
XAC_DEFINE(GETPASS_PROTO))
X
XAC_COMPILE_CHECK([fprintf prototype],
X[#include <stdio.h>],
X[fprintf(stderr, "foo");],
XAC_DEFINE(FPRINTF_PROTO))
X
XAC_COMPILE_CHECK([fclose prototype],
X[#include <stdio.h>],
X[FILE *f; fclose(f);],
XAC_DEFINE(FCLOSE_PROTO))
X
XAC_COMPILE_CHECK([time prototype],
X[#include <time.h>],
X[time_t t; t = time(&t);],
XAC_DEFINE(TIME_PROTO))
X
XAC_COMPILE_CHECK([localtime prototype],
X[#include <time.h>],
X[time_t t; struct tm stm = *localtime(&t);],
XAC_DEFINE(LOCALTIME_PROTO))
X
XAC_COMPILE_CHECK([mktemp prototype],
X[#include <stdlib.h>],
X[char *s = mktemp("fooXXXXXX"); ],
XAC_DEFINE(MKTEMP_PROTO))
X
XAC_COMPILE_CHECK([perror prototype],
X[#include <errno.h>
X#include <stdio.h>],
X[perror("bleah"); ],
XAC_DEFINE(PERROR_PROTO))
X
XAC_COMPILE_CHECK([rename prototype],
X[#include <unistd.h>
X#include <stdio.h>],
X[int x = rename("foo", "bar");],
XAC_DEFINE(RENAME_PROTO))
X
XAC_COMPILE_CHECK([strdup prototype],
X[#include <string.h>],
X[char *s = strdup("foo");],
XAC_DEFINE(STRDUP_PROTO))
X
XAC_COMPILE_CHECK([usleep],
X[#include <stdlib.h>],
X[unsigned x = usleep(1);],
XAC_DEFINE(HAS_USLEEP))
X
XAC_COMPILE_CHECK([bzero prototype],
X[#include <stdlib.h>],
X[char *x; int l; bzero(x, l);],
XAC_DEFINE(BZERO_PROTO))
X
XAC_HAVE_HEADERS(limits.h sys/select.h)


X
Xecho "looking for htons, ntohs" >&2

Xdefine(ACHTONS_CHECK,
X AC_COMPILE_CHECK([htons in $1],
X [#include <$1>],
X [short x,y; x = htons(y);],
X AC_DEFINE($2)))
XACHTONS_CHECK(machine/endian.h, NEED_ENDIAN)
XACHTONS_CHECK(netinet/in.h, NEED_NETINET_IN)
XACHTONS_CHECK(net/nh.h, NEED_NH)
XACHTONS_CHECK(sys/byteorder.h, NEED_BYTEORDER)


X
X############################################################################
X# Build configured files
X

XAC_OUTPUT(Makefile)
END_OF_FILE
if test 3464 -ne `wc -c <'xsokoban/configure.in'`; then
echo shar: \"'xsokoban/configure.in'\" unpacked with wrong size!
fi
# end of 'xsokoban/configure.in'
fi
if test -f 'xsokoban/externs.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/externs.h'\"
else
echo shar: Extracting \"'xsokoban/externs.h'\" \(4050 characters\)
sed "s/^X//" >'xsokoban/externs.h' <<'END_OF_FILE'
X#include <X11/X.h>
X#include <X11/Xlib.h>
X#include <X11/Xutil.h>
X#include <X11/keysym.h>
X#include <X11/Xresource.h>
X#include <sys/stat.h>
X#include <sys/types.h>
X#include <malloc.h>
X
X#ifdef NEED_NETINET_IN
X#include <netinet/in.h>
X#endif
X
X#ifdef NEED_NH
X#include <net/nh.h>
X#endif
X
X#ifdef NEED_ENDIAN
X#include <machine/endian.h>
X#endif
X
X#ifdef NEED_BYTEORDER
X#include <sys/byteorder.h>
X#endif
X
X#include "config_local.h"
X
X#if !defined(GETPASS_PROTO)
Xextern char *getpass(char *);
X#endif
X
X#if !defined(FPRINTF_PROTO)
Xextern int fprintf(FILE *, const char *, ...);
X#endif
X
X#if !defined(FCLOSE_PROTO)
Xextern int fclose(FILE *);
X#endif
X
X#if !defined(TIME_PROTO)
Xextern time_t time(time_t *);
X#endif
X
X#if !defined(MKTEMP_PROTO)
Xextern char *mktemp(char *tempfile);
X#endif
X
X#if !defined(PERROR_PROTO)
Xextern void perror(char *);
X#endif
X
X#if !defined(RENAME_PROTO)
Xextern int rename(char *from, char *to);
X#endif
X
X#if !defined(STRDUP_PROTO)
Xextern char *strdup(const char *);
X#endif
X
X#if defined(HAS_USLEEP)
Xextern unsigned usleep(unsigned);
X#endif
X
X#if !defined(LOCALTIME_PROTO)
Xextern struct tm *localtime(time_t *);
X#endif
X
X#if !defined(BZERO_PROTO)
Xextern void bzero(char *, int);
X#endif
X
Xint fsync(int);


X
X#ifndef EXIT_FAILURE
X#define EXIT_FAILURE -1
X#endif
X

X/* The boolean typedef */
Xtypedef enum { _false_ = 0, _true_ = 1 } Boolean;
X
X/* stuff from display.c */
Xextern short LoadBitmaps(void);
Xextern short LoadOneBitmap(char *fname, char *altname, Pixmap *pix, int map);
Xextern void MakeHelpWindows(void);
Xextern void ClearScreen(void);
Xextern void RedisplayScreen(void);
Xextern void SyncScreen(void);
Xextern void ShowScreen(void);
Xextern void MapChar(char, int, int, Boolean);
Xextern Pixmap GetObjectPixmap(int, int, char);
Xextern int PickWall(int, int);
Xextern void DrawString(int, int, char *);
Xextern void ClearString(int, int, int);
Xextern void DisplayLevel(void);
Xextern void DisplayPackets(void);
Xextern void DisplaySave(void);
Xextern void DisplayMoves(void);
Xextern void DisplayPushes(void);
Xextern void DisplayHelp(void);
Xextern short DisplayScores(short *);
Xextern void ShowHelp(void);
Xextern void HelpMessage(void);
Xextern void DestroyDisplay(void);
Xextern short InitX(void);
X
X/* stuff from main.c */
Xextern short CheckCommandLine(int *, char **);
Xextern void main(int, char **);
Xextern short GameLoop(void);
Xextern short GetGamePassword(void);
Xextern void Error(short);
Xextern void Usage(void);
X
X/* stuff from resources.c */
Xextern char *GetDatabaseResource(XrmDatabase, char *);
Xextern char *GetResource(char *);
Xextern Boolean StringToBoolean(char *);
Xextern Boolean GetColorResource(char *, unsigned long *);
Xextern XFontStruct *GetFontResource(char *);
Xextern unsigned long GetColorOrDefault(Display *, char *,
X int, char *, Boolean);
X
X/* stuff from play.c */
Xextern short Play(void);
Xextern void MakeMove(KeySym);
Xextern short TestMove(KeySym);
Xextern void DoMove(short);
Xextern void TempSave(void);
Xextern void TempReset(void);
Xextern Boolean WaitForEnter(void);
Xextern void MoveMan(int, int);
Xextern void FindTarget(int, int, int);
Xextern Boolean RunTo(int, int);
Xextern void PushMan(int, int);
Xextern Boolean Verify(int, char *);
X
X/* stuff from score.c */
Xextern short OutputScore(int);
Xextern short MakeNewScore(char *);
Xextern short GetUserLevel(short *);
Xextern short Score(Boolean show);
Xextern short ReadScore(void);
Xextern short MakeScore(void);
Xextern short FindUser(void);
Xextern short FindPos(void);
Xextern short WriteScore(void);
Xextern void ShowScore(int);
Xextern void CopyEntry(short, short);
Xextern void FlushDeletedScores(Boolean[]);
Xextern int SolnRank(int, Boolean *);
Xextern short ParseScoreText(char *text);
Xextern char *DateToASCII(time_t);
X
X/* stuff from screen.c */
Xextern short ReadScreen(void);
X
X/* stuff from save.c */
Xextern short SaveGame(void);
Xextern short RestoreGame(void);
X
X/* stuff from scoredisp.c */
Xextern short DisplayScores_(Display *, Window, short *);
Xextern char *InitDisplayScores(Display *, Window);
X
X/* stuff from qtelnet.c */
Xextern char *qtelnet(char *host, int port, char *msg);
END_OF_FILE
if test 4050 -ne `wc -c <'xsokoban/externs.h'`; then
echo shar: \"'xsokoban/externs.h'\" unpacked with wrong size!
fi
# end of 'xsokoban/externs.h'
fi
if test -f 'xsokoban/xsokoban.man' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/xsokoban.man'\"
else
echo shar: Extracting \"'xsokoban/xsokoban.man'\" \(9586 characters\)
sed "s/^X//" >'xsokoban/xsokoban.man' <<'END_OF_FILE'
X.TH XSOKOBAN 6 "3 January 1994" "MIT Lab for Computer Science"
X.SH NAME
Xxsokoban \- Pushing objects around...
X.SH SYNOPSIS
X.B xsokoban
X.B [{
X.BI \- nn
X.B | \-s[level] |
X.B \-r |
X.B \-c[scorefile-text]}
X.B \-C
X.B \-display
X<disp>
X.B {\-w | \-walls}
X.B {\-rv | \-reverse}
X.B {\-f | \-font}
X<fn>
X.B {\-b | \-bitdir}
X<path>
X.B {\-fg | \-foreground}
X<color>
X.B {\-bg | \-background}
X<color>
X.B {\-bd | \-border}
X<color>
X.B {\-pr | \-pointer}
X<color>
X.B \-xrm
X<arg>
X.B ]
X.SH DESCRIPTION
X.I xsokoban
Xis an implementation of the game
X.IR sokoban,
Xwritten on top of
X.IR X (1).
X
XThe goal of
X.I xsokoban
Xis to push all the round objects into the score area of each level
Xusing the mouse or the arrow keys. The arrow keys move the player in
Xthe corresponding direction, pushing an object if it is in the way and
Xthere is a clear space on the other side. The mouse buttons each have a
Xdistinct function.
X
XIf the left mouse button is pressed on a clear square, the player will
Xmove to that location via the optimal path if such a path exists;
Xotherwise, the game will beep.
X
XIf the middle button is pressed on an object that is adjacent to the
Xplayer, the object will be pushed one step. If the middle mouse button
Xis pressed on an empty space, the player will move the closest object
Xthat is on a straight line with the destination, such that the object
Xcan be pushed in that direction, and the player is not directly between
Xthe destination and the object. Before pushing the object, the player
Xis moved optimally to start the push.
X
XEither the left or middle mouse buttons may be used to "drag" an object
Xfrom an initial to a final position. If a straightforward way exists
Xfor the player to push the object without moving any other objects, the
Xplayer will execute appropriate moves and pushes to get the object to
Xthe desired destination.
X
XThe right button mouse undoes the last user action, and may be used any
Xnumber of times.
X
X.PP
XThe rest of the functions are bound to the keyboard:
X.TP 8
X.B ?
XDisplay the help screen.
X.TP 8
X.B q
XQuit the current level.
X.TP 8
X.B h,j,k,l
XMove the man just like the arrow keys, as in
X.IR vi (1).
X.TP 8
X.B s
XSave and quit.
X.TP 8
X.B u
XUndo the last action. Same as right mouse button.
X.TP 8
X.B U
XRestart a level.
X.TP 8
X.B c
XSnapshot the current position
X.TP 8
X.B ^U
XRestore to the last snapshot
X.TP 8
X.B ^R
XRedraw the screen.
X.TP 8
X.B S
XView the score file.
X
X.PP
XThe score file can be viewed at any time during the playing of the
Xgame. The scores are also displayed whenever a level is completed.
XScores of the current user are initially highlighted. While viewing
Xscores, the following keys may be used to control the listing:
X
X.TP 8
X.B q
XQuit the game
X.TP 8
X.B Return
XReturn to the game and continue with the current level; or, if the current
Xlevel is completed, begin the next level.
X.TP 8
X.B <left>
XThe left mouse button may be used to select a different user to
Xhighlight. It also controls the scroll bar at the right side of the
Xscreen.
X.TP 8
X.B <middle>
XThe middle mouse button selects a new level to play if a level is not
Xalready in progress.
X
X.PP
XScores are saved in the score file if they are of high
Xenough rank. A score is ranked according to how many scores are better
Xthan it; there are no scores superior to a rank 1 score, only one score
Xsuperior to a rank 2 score, and so on. If two scores are identical, the
Xfirst one entered is ranked higher.
X
XIt is possible for other users to have the same username as you, and
Xthus collide in the score file. One symptom of this problem is
Xthat when you first play the game, you are not started at level 1.
XTo avoid this problem, set your "xsokoban.username" X resource to
Xthe desired unique username.
X
X.SH OPTIONS
X.TP 8
X.B \-nn
XStart at level
X.I nn,
Xprovided that levels below it are completed.
X.TP 8
X.B \-s [level]
XPrint the scores on standard output. The optional level will restrict
Xthe printout to scores on just that level.
X.TP 8
X.B \-r
XRestore a saved game.
X.TP 8
X.B \-c [scorefile-text]
XCreate a new score file (can be ran only by the owner of the game).
XIf the argument "scorefile-text" is supplied, the file of that name
Xis assumed to contain the textual output compatible with the
Xoutput of "xsokoban -s". The scorefile is initialized
Xto contain the scores described in that text file. If no argument is
Xsupplied, the score file is initialized to be empty.
X.TP 8
X.B \-C
XCreate a new colormap for display purposes. Ordinarily
X.I xsokoban
Xcreates a new colormap automatically if the default colormap does
Xnot contain enough free slots to allow it to run properly.
X.TP 8
X.B \-display <display>
XRun the game on the named display.
X.TP 8
X.B {\-w | \-walls}
XUse fancy walls. (This is the default unless an option bitmap set is used)
X.TP 8
X.B {\-rv | \-reverse}
XUse reverse video.
X.TP 8
X.B {\-f | \-font} <fontname>
XUse the named font instead of the default 9x15 font.
X.TP 8
X.B {\-b | \-bitdir} <path>
XUse the bitmaps found in <path> instead of the defaults.
X.TP 8
X.B {\-fg | \-foreground} <color>
XUse the named color as the foreground color. (default is BlackPixel())
X.TP 8
X.B {\-bg | \-background} <color>
XUse the named color as the background color. (default is WhitePixel())
X.TP 8
X.B {\-bd | \-border} <color>
XUse the named color as the border color. (default is foreground color)
X.TP 8
X.B {\-pr | \-pointer} <color>
XUse the named color as the mouse pointer foreground. (default is foreground)
X.TP 8
X.B \-xrm <arg>
X<arg> is an X Resource specification.
X.SH OTHER INFORMATION
X.P
XThere is more information about
X.I xsokoban
Xin the WWW, at
X.br
X.sp
Xhttp://clef.lcs.mit.edu/~andru/xsokoban.html
X.sp
XA global score file is also located there.
X
X.SH AUTHORS
X.P
XUnknown Hacker - Original
X.IR curses (3)
Ximplementation.
X.P
XJoseph L. Traub - X windows interface.
X.P
XKevin Solie - simultaneously developed X implementation (merged in).
X.P
XMark Linderman, Christos Zoulas - Mouse code (added to Solie's version).
X.P
XAndrew Myers(http://clef.lcs.mit.edu/~andru) - Improved mouse UI, score ranking, color and WWW support.
X
XCode has also been donated by many
X.I xsokoban
Xusers. Thanks for all your contributions and suggestions!
X.SH RESOURCES
X.I xsokoban
Xunderstands the following resources.
X.TP 8
X.B username : string
XThe name you would like to use when playing xsokoban. It defaults
Xto your real username. If you are playing in WWW mode, some domain
Xinformation is appended to your real username to disambiguate from
Xother users with the same name. This domain information is not
Xappended to the username if specified through the resource.
X.TP 8
X.B fancyWalls : boolean
XUse fancy walls.
X.TP 8
X.B fontName : font
XUse named font.
X.TP 8
X.B reverseVideo : boolean
XReverse foreground and background pixels.
X.TP 8
X.B foreground : color
XUse color as foreground color.
X.TP 8
X.B background : color
XUse color as background color.
X.TP 8
X.B borderColor : color
XUse color as border color.
X.TP 8
X.B pointerColor : color
XUse color as pointer color.
X.TP 8
X.B bitmapDir : string
XLook for bitmaps in path specified by string.
X.TP 8
X.B border.color: color
XColor of borders in the score display
X.TP 8
X.B text.font: font
XFont of text in the score display
X.TP 8
X.B text.color: color
XColor of text in the score display
X.TP 8
X.B text.highlight: color
XColor of highlighted text in the score display
X.TP 8
X.B text.indent: int
XIndenting of text in the score display
X.TP 8
X.B scrollbar.width: int
XWidth of the scrollbar in the score display
X.TP 8
X.B scrollbar.background: color
XColor of the scrollbar background
X.TP 8
X.B scrollbar.thumb.height: int, scrollbar.thumb.width: int
XSize of the scrollbar thumb
X.TP 8
X.B scrollbar.thumb.color: color
XColor of the scrollbar thumb
X.TP 8
X.B panel.height: int
XHeight of the help panel in the score display
X.TP 8
X.B panel.font: font
XFont of the help panel in the score display
X.TP 8
X.B bevel.width
XWidth of the Motif-like bevels
X.TP 8
X.B sep.color: color
XColor of the lines separating different score levels
X
X.SH SPECIAL BITMAPS
XIn order to define your own bitmaps for
X.I xsokoban
Xyou only need to know the names of which files it is looking for.
XThe standard bitmap files are:
X.TP 8
X.B man.xbm
X-- The player bitmap.
X.TP 8
X.B goal.xbm
X-- The goal area bitmap.
X.TP 8
X.B wall.xbm
X-- The standard wall bitmap.
X.TP 8
X.B object.xbm
X-- The object that gets pushed.
X.TP 8
X.B treasure.xbm
X-- The bitmap for the object when it is on the goal.
X.TP 8
X.B saveman.xbm
X-- The bitmap for the player when it is on the goal.
X.TP 8
XTo use the fancy walls option, you need the following additional files.
X.TP 8
X.B lonewall.xbm
X-- a wall with connections on no sides.
X.TP 8
X.B southwall.xbm
X-- a wall with only northern connections
X.TP 8
X.B northwall.xbm
X-- a wall with only southern connections
X.TP 8
X.B eastwall.xbm
X-- a wall with only western connections
X.TP 8
X.B westwall.xbm
X-- a wall with only eastern connections
X.TP 8
X.B llcornerwall.xbm
X-- a wall with northern and eastern connections
X.TP 8
X.B ulcornerwall.xbm
X-- a wall with southern and eastern connections
X.TP 8
X.B lrcornerwall.xbm
X-- a wall with northern and western connections
X.TP 8
X.B urcornerwall.xbm
X-- a wall with southern and western connections
X.TP 8
X.B north_twall.xbm
X-- a wall with connections on all BUT northern side
X.TP 8
X.B south_twall.xbm
X-- a wall with connections on all BUT southern side
X.TP 8
X.B east_twall.xbm
X-- a wall with connections on all BUT eastern side
X.TP 8
X.B west_twall.xbm
X-- a wall with connections on all BUT western side
X.TP 8
X.B centerwall.xbm
X-- A wall will connections on all four sides.
X.SH BUGS
XAuto bitmap resizing code doesn't take into account font sizes.
X.br
XFeedback on user error is poor (only beeps).
END_OF_FILE
if test 9586 -ne `wc -c <'xsokoban/xsokoban.man'`; then
echo shar: \"'xsokoban/xsokoban.man'\" unpacked with wrong size!
fi
# end of 'xsokoban/xsokoban.man'
fi
echo shar: End of archive 4 \(of 8\).
cp /dev/null ark4isdone

Andrew Myers

unread,
Nov 3, 1994, 10:31:18 AM11/3/94
to
Submitted-by: an...@tonic.lcs.mit.edu (Andrew Myers)
Posting-number: Volume 22, Issue 138
Archive-name: xsokoban/part05

Environment: X11, game
Supersedes: xsokoban: Volume 21, Issue 98-104

#! /bin/sh


# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: xsokoban/bitmaps/defaults/centerwall.xpm
# xsokoban/bitmaps/defaults/east_twall.xpm
# xsokoban/bitmaps/defaults/goal.xpm
# xsokoban/bitmaps/defaults/llcornerwall.xpm
# xsokoban/bitmaps/defaults/lonewall.xpm
# xsokoban/bitmaps/defaults/south_twall.xpm
# xsokoban/bitmaps/defaults/southwall.xpm
# xsokoban/bitmaps/defaults/ulcornerwall.xpm
# xsokoban/bitmaps/defaults/wall.xpm
# xsokoban/bitmaps/defaults/west_twall.xpm
# xsokoban/bitmaps/defaults/westwall.xpm xsokoban/save.c
# Wrapped by chris@sparky on Thu Nov 3 09:23:51 1994


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 5 (of 8)."'
if test -f 'xsokoban/bitmaps/defaults/centerwall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/centerwall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/centerwall.xpm'\" \(3776 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/centerwall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 18 2",


X/* colors */
X"`f c #7F4D34",
X"`g c #7D4B32",

X"`u c #865741",


X"`x c #CC9275",
X"ae c #67402C",

X"bc c #7C4B32",

X"bf c #AE7959",
X"bg c #82533B",

X"bp c #926740",
X"bq c #804E35",
X"br c #7E4C33",

X"cf c #573423",

X"cp c #B77F63",
X"cq c #5E3926",
X"cz c #643C28",
X"da c #C78E72",

X"dh c #7B4A31",
X"dn c #BE8A6F",
X/* pixels */

X"`x`x`x`x`xbfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcfcfcfcf`u",
X"`x`x`x`x`xbfbc`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcfcfcqbp`x",
X"`x`x`x`x`xbfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcfcf`u`x`x",
X"`x`x`x`x`xbfbc`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcqbp`x`x`x",
X"`x`x`x`x`xbfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcae`u`x`x`x`x",
X"dncpdndndnbpbc`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbc`udncpdndndn",
X"bqbgbqbqbqbg`f`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbqbqbgbqbqbq",
X"br`gbrbrbr`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbr`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"aeaeaeaeae`u`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhaeaeaeaeaeae",
X"cfcfcfcqbpbf`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhczcfcfcfcfcf",
X"cfcfcqbp`xbfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhcqcfcfcfcfcf",
X"cfcqbpdadabf`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhczcfcfcfcfcf",
X"cqbp`x`x`xbfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhcqcfcfcfcfcf",
X"bp`x`x`xdabf`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhczcfcfcfcfcf",
X};
END_OF_FILE
if test 3776 -ne `wc -c <'xsokoban/bitmaps/defaults/centerwall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/centerwall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/centerwall.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/east_twall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/east_twall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/east_twall.xpm'\" \(3775 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/east_twall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 18 2",


X/* colors */
X"`f c #7F4D34",
X"`g c #7D4B32",

X"`u c #865741",


X"`x c #CC9275",
X"ae c #67402C",

X"bc c #7C4B32",

X"bf c #AE7959",
X"bg c #82533B",

X"bp c #926740",
X"bq c #804E35",
X"br c #7E4C33",

X"cf c #573423",

X"cp c #B77F63",
X"cq c #5E3926",
X"cz c #643C28",
X"da c #C78E72",

X"dh c #7B4A31",
X"dn c #BE8A6F",
X/* pixels */

X"`x`x`x`x`xbfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xbfbc`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xbfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xbfbc`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`x`x`x`x`xbfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"dncpdndndnbpbc`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"bqbgbqbqbqbg`f`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"br`gbrbrbr`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"aeaeaeaeae`u`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"cfcfcfcqbpbf`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"cfcfcqbp`xbfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"cfcqbpdadabf`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"cqbp`x`x`xbfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf",
X"bp`x`x`xdabf`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcczcfcfcfcfcf"
X};
END_OF_FILE
if test 3775 -ne `wc -c <'xsokoban/bitmaps/defaults/east_twall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/east_twall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/east_twall.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/goal.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/goal.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/goal.xpm'\" \(3807 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/goal.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 20 2",
X/* colors */
X"`e c #D9D98C",


X"`o c #585856",

X"ah c #595956",

X"ap c #5C5C69",

X"at c #DDDD8E",

X"av c #939363",

X"az c #5A5A56",

X"bj c #979770",

X"bn c #DADA8D",

X"bu c #9E9E73",

X"cg c #947376",
X"ch c #DBDB8D",

X"cl c #585855",

X"cn c #D7D78C",

X"ct c #545454",

X"df c #D8D88C",
X"dg c #D6D68A",
X"dj c #9C9C72",
X"dl c #555554",

X"dp c #DFDF8F",
X/* pixels */
X"bjdgdpdpdpdpdpdpdpatbuazdlctctctctctctdlbjdgdpdpdpdpdpdpdpatbuazctctctctctctctct",
X"dlbjcndpdpdpdpdpdpdpatbuazctctctctctctctahbj`edpdpdpdpdpdpdpdfbjahctctctctctctct",
X"ct`objdgdpdpdpdpdpdpdpbnbuazctctctctctctctazdj`edpdpdpdpdpdpdpdfbjahctctctctctct",
X"ctctdlbjcndpdpdpdpdpdpdpbndjazctctctctctctctahdj`edpdpdpdpdpdpdpdfbjahctctctctct",
X"ctctct`objcndpdpdpdpdpdpdpbndjazctctctctctctctazdjbndpdpdpdpdpdpdpdfbjahctctctct",
X"ctctctct`objdfdpdpdpdpdpdpdpbndjazctctctctctctctahdj`edpdpdpdpdpdpdpcnbjahctctct",
X"ctctctctct`objcndpdpdpdpdpdpdpbndjazctctctctctctctazdjbndpdpdpdpdpdpdpdfbjahctct",
X"ctctctctctct`objdfdpdpdpdpdpdpdpbndjazctctctctctctctazdjbndpdpdpdpdpdpdpcnbjahct",
X"ctctctctctctctahbjdfdpdpdpdpdpdpdp`edjazctctctctctctctazdjbndpdpdpdpdpdpdpdfbj`o",
X"clctctctctctctct`objdfdpdpdpdpdpdpdpdfdjazctctctctctctctazdjbndpdpdpdpdpdpdpdfdj",
X"bjazctctctctctctctahbjdfdpdpdpdpdpdpdp`edjazctctctctctctctazdjbndpdpdpdpdpdpdpat",
X"chbuazctctctctctctctahbjdfdpdpdpdpdpdpdpdfdjazctctctctctctctazdjbndpdpdpdpdpdpdp",
X"dpchbuazdlctctctctctctahbjdfdpdpdpdpdpdpdp`ebjazctctctctctctctazbubndpdpdpdpdpdp",
X"dpdpatbuazctctctctctctctahbj`edpdpdpdpdpdpdpbnbjazctctctctctctctazbubndpdpdpdpdp",
X"dpdpdpchbuazctctctctctctctahbj`edpdpdpdpdpdpdp`ebjahctctctctctctctazbubndpdpdpdp",
X"dpdpdpdpchbuazctctctctctctctahbj`edpdpdpdpdpdpdpbnbjazctctctctctctctazbubndpdpdp",
X"dpdpdpdpdpbnbuazctctctctctctctahbj`edpdpdpdpdpdpdp`ebjahctctctctctctctazbubndpdp",
X"dpdpdpdpdpdpbnbuazctctctctctctctahbj`edpdpdpdpdpdpdp`ebjahctctctctctctctazbubndp",
X"dpdpdpdpdpdpdpbndjahctctctctctctctazbj`edpdpdpdpdpdpdp`ebjahctctctctctctctazbubn",
X"atdpdpdpdpdpdpdpcnbjazctctctctctctctazbj`edpdpdpdpdpdpdp`ebjahctctctctctctctazbj",
X"djcndpdpdpdpdpdpdpcnbuazctctctctctctctazbj`edpdpdpdpdpdpdp`ebjahctctctctctctctcl",
X"`objcndpdpdpdpdpdpdpbnbuazctctctctctctctazbj`edpdpdpdpdpdpdpdfbjahctctctctctctct",
X"ct`objdgdpdpdpdpdpdpdpbnbuazctctctctctctctazdj`edpdpdpdpdpdpdpdfbjahctctctctctct",
X"ctctdlbjcndpdpdpdpdpdpdpbndjazctctctctctctctahdj`edpdpdpdpdpdpdpdfbjahctctctctct",
X"ctctct`odjchdpdpdpdpdpdpdpbndjazctctctctctctctazdjbndpdpdpdpdpdpdpdfbjahctctctct",
X"ctctctctazbuchdpdpdpdpdpdpdpbndjazctctctctctctctahdj`edpdpdpdpdpdpdpcnbjahctctct",
X"ctctctctctazbuchdpdpdpdpdpdpdpbndjazctctctctctctctazdjbndpdpdpdpdpdpdpdfbjahctct",
X"ctctctctct`oazbuchdpdpdpdpdpdpdpbndjazctctctctctctctazdjbndpdpdpdpdpdpdpcnbjahct",
X"ctctctctctctdlazbuatdpdpdpdpdpdpdp`ebj`octctctctctctctazdjbndpdpdpdpdpdpdpdfbj`o",
X"dlctctctctctct`oazbuchdpdpdpdpdpdpdpcnav`octctctctctctctazdjbndpdpdpdpdpdpdpdfdj",
X"av`octctctctctctdlazbuatdpdpdpdpdpdpdpcnbjctctctctctctctctazdjbndpdpdpdpdpdpdpat",
X"dgbj`octctctctctctahazbuchdpdpdpdpdpdpbndgavclctctctctctctctazdjbndpdpdpdpdpdpdp",
X"dpcnbjdlctctctctctctdlazbuatdpdpdpdpdpdpatdgavctctctctctctctctazbubndpdpdpdpdpdp",
X"dpatdgbj`octctctctctdlazazbuchdpdpdpdpdpdpbncnav`octctctctctctctazbubndpdpdpdpdp",
X"dpdpdpcnbjdlctctctctctctdlazbudpdpdpdpdpdpdpdpcnavctctctctctctctctazbubndpdpdpdp",
X"dpdpdpatdgbj`octctctctctdlazazbuchdpdpdpdpdpdpbncnav`octctctctctctctazbubndpdpdp",
X"dpdpdpdpdpcnbjdlctctctctctct`oazbudpdpdpdpdpdpdpatcnavctctctctctctctctazbubndpdp",
X"dpdpdpdpdpatdgbj`octctctctctdlazazbuatdpdpdpdpdpdpbncnav`octctctctctctctazbubndp",
X"dpdpdpdpdpdpdpdgbjdlctctctctctct`oazbudpdpdpdpdpdpdpatcnavctctctctctctctctazbubn",
X"dpdpdpdpdpdpdpchdgavdlctctctctctdlazapbudpdpdpdpdpdpdpcndgcgdlctctctctctctdlazbu"
X};
END_OF_FILE
if test 3807 -ne `wc -c <'xsokoban/bitmaps/defaults/goal.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/goal.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/goal.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/llcornerwall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/llcornerwall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/llcornerwall.xpm'\" \(3745 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/llcornerwall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 16 2",


X/* colors */
X"`g c #7D4B32",

X"`u c #865741",


X"`x c #CC9275",
X"ae c #67402C",

X"bc c #7C4B32",
X"bg c #82533B",
X"bp c #926740",
X"bq c #804E35",
X"br c #7E4C33",

X"c` c #B27A5F",
X"cf c #573423",

X"cp c #B77F63",
X"cq c #5E3926",
X"cz c #643C28",
X"da c #C78E72",

X"dn c #BE8A6F",
X/* pixels */

X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcfcfcfcf`u",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcfcfcqbp`x",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcfcf`u`x`x",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcqbp`x`x`x",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcae`u`x`x`x`x",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbc`udncpdndndn",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbqbqbgbqbqbq",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbr`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`brbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbc",
X"`x`x`x`xda`uaeczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczcz",
X"`x`x`xdabpcqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"`x`xda`ucqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"`xdabpcqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"da`ucqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"`ucqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X
X};
END_OF_FILE
if test 3745 -ne `wc -c <'xsokoban/bitmaps/defaults/llcornerwall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/llcornerwall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/llcornerwall.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/lonewall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/lonewall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/lonewall.xpm'\" \(3808 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/lonewall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 20 2",


X/* colors */
X"`f c #7F4D34",
X"`g c #7D4B32",

X"`u c #865741",


X"`x c #CC9275",
X"ae c #67402C",

X"ax c #F3E6DF",
X"bc c #7C4B32",

X"bp c #926740",
X"bq c #804E35",
X"br c #7E4C33",

X"c` c #B27A5F",
X"cf c #573423",

X"cm c #CFBAB6",
X"cn c #D7D78C",
X"cp c #B77F63",
X"cq c #5E3926",
X"cz c #643C28",
X"da c #C78E72",
X"dg c #D6D68A",

X"dn c #BE8A6F",
X/* pixels */

X"axcm`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xdabp",


X"cmaxcm`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xbpcq",
X"`xdgax`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xdabpaecf",
X"`x`xcmaxcm`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xbpcqcfcf",
X"`x`x`xcmax`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xdabpaecfcfcf",
X"`x`x`x`xcncmdncpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpbpcqcfcfcfcf",

X"`x`x`x`x`xcpbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqaecfcfcfcfcf",
X"`x`x`x`x`xc`bqbr`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcbcaecfcfcfcfcf",

X"`x`x`x`x`xc`brbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcczcfcfcfcfcf",
X"`x`x`x`xda`uaeczczczczczczczczczczczczczczczczczczczczczczczczczczczcqcfcfcfcfcf",
X"`x`x`xdabpcqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"`x`xda`ucqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"`xdabpcqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"da`ucqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"`ucqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X};
END_OF_FILE
if test 3808 -ne `wc -c <'xsokoban/bitmaps/defaults/lonewall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/lonewall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/lonewall.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/south_twall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/south_twall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/south_twall.xpm'\" \(3775 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/south_twall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 18 2",


X/* colors */
X"`f c #7F4D34",
X"`g c #7D4B32",

X"`u c #865741",


X"`x c #CC9275",
X"ae c #67402C",

X"bc c #7C4B32",

X"bf c #AE7959",
X"bg c #82533B",

X"bp c #926740",
X"bq c #804E35",
X"br c #7E4C33",

X"cf c #573423",

X"cp c #B77F63",
X"cq c #5E3926",

X"cu c #B47D63",


X"cz c #643C28",

X"dh c #7B4A31",
X"dn c #BE8A6F",
X/* pixels */

X"`x`x`x`x`xcubgbg`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcfcfcfcf`u",
X"`x`x`x`x`xbfbcbr`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcfcfcqbp`x",
X"`x`x`x`x`xbfdhbc`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcfcf`u`x`x",
X"`x`x`x`x`xbfbc`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcqbp`x`x`x",
X"`x`x`x`x`xbfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcae`u`x`x`x`x",
X"dncpdndndnbpbc`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbc`udncpdndndn",
X"bqbgbqbqbqbg`f`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbqbqbgbqbq`u",
X"br`gbrbrbr`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbr`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"bcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbc",
X"czczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczcz",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf"
X};
END_OF_FILE
if test 3775 -ne `wc -c <'xsokoban/bitmaps/defaults/south_twall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/south_twall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/south_twall.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/southwall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/southwall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/southwall.xpm'\" \(3760 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/southwall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 17 2",


X/* colors */
X"`f c #7F4D34",
X"`g c #7D4B32",

X"`u c #865741",


X"`x c #CC9275",
X"ae c #67402C",
X"ar c #7D603A",

X"bc c #7C4B32",

X"bp c #926740",
X"bq c #804E35",
X"br c #7E4C33",

X"c` c #B27A5F",
X"cd c #715336",
X"cf c #573423",

X"cq c #5E3926",
X"cz c #643C28",
X"da c #C78E72",

X"dh c #7B4A31",
X/* pixels */
X"`x`x`x`x`xc`br`gbcdhdhbccdbccdbccd`farbq`f`g`gbcbccdbccdcdcdcddhbcbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`gbcbcbc`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhdhdhbc`gbcczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdh`g`g`g`gbcczcfcfcfcfcf",

X"`x`x`x`x`xc`brbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcczcfcfcfcfcf",
X"`x`x`x`xda`uaeczczczczczczczczczczczczczczczczczczczczczczczczczczczcqcfcfcfcfcf",
X"`x`x`xdabpcqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"`x`xda`ucqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"`xdabpcqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"da`ucqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"`ucqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X};
END_OF_FILE
if test 3760 -ne `wc -c <'xsokoban/bitmaps/defaults/southwall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/southwall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/southwall.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/ulcornerwall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/ulcornerwall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/ulcornerwall.xpm'\" \(3760 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/ulcornerwall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 17 2",


X/* colors */
X"`f c #7F4D34",
X"`g c #7D4B32",
X"`x c #CC9275",
X"ae c #67402C",

X"ax c #F3E6DF",

X"bq c #804E35",
X"br c #7E4C33",

X"c` c #B27A5F",
X"cf c #573423",

X"cm c #CFBAB6",
X"cn c #D7D78C",
X"cp c #B77F63",
X"cq c #5E3926",
X"cz c #643C28",

X"dg c #D6D68A",
X"dh c #7B4A31",
X"dn c #BE8A6F",
X/* pixels */

X"axcm`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"cmaxcm`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`xdgax`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`x`xcmaxcm`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`x`x`xcmax`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`x`x`x`xcncmdncpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcp",
X"`x`x`x`x`xcpbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbq",
X"`x`x`x`x`xc`bqbr`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc``f`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc``f`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc``f`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhaeaeaeaeaeae",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhcqcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhcqcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhczcfcfcfcfcf",
X};
END_OF_FILE
if test 3760 -ne `wc -c <'xsokoban/bitmaps/defaults/ulcornerwall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/ulcornerwall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/ulcornerwall.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/wall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/wall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/wall.xpm'\" \(3808 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/wall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 20 2",


X/* colors */
X"`f c #7F4D34",
X"`g c #7D4B32",

X"`u c #865741",


X"`x c #CC9275",
X"ae c #67402C",

X"ax c #F3E6DF",
X"bc c #7C4B32",

X"bp c #926740",
X"bq c #804E35",
X"br c #7E4C33",

X"c` c #B27A5F",
X"cf c #573423",

X"cm c #CFBAB6",
X"cn c #D7D78C",
X"cp c #B77F63",
X"cq c #5E3926",
X"cz c #643C28",
X"da c #C78E72",
X"dg c #D6D68A",

X"dn c #BE8A6F",
X/* pixels */

X"axcm`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xdabp",


X"cmaxcm`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xbpcq",
X"`xdgax`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xdabpaecf",
X"`x`xcmaxcm`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xbpcqcfcf",
X"`x`x`xcmax`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xdabpaecfcfcf",
X"`x`x`x`xcncmdncpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpbpcqcfcfcfcf",

X"`x`x`x`x`xcpbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqaecfcfcfcfcf",
X"`x`x`x`x`xc`bqbr`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcbcaecfcfcfcfcf",

X"`x`x`x`x`xc`brbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcczcfcfcfcfcf",
X"`x`x`x`xda`uaeczczczczczczczczczczczczczczczczczczczczczczczczczczczcqcfcfcfcfcf",
X"`x`x`xdabpcqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"`x`xda`ucqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"`xdabpcqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"da`ucqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"`ucqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X};
END_OF_FILE
if test 3808 -ne `wc -c <'xsokoban/bitmaps/defaults/wall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/wall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/wall.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/west_twall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/west_twall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/west_twall.xpm'\" \(3744 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/west_twall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 16 2",


X/* colors */
X"`g c #7D4B32",

X"`u c #865741",


X"`x c #CC9275",
X"ae c #67402C",

X"bc c #7C4B32",
X"bg c #82533B",
X"bp c #926740",
X"bq c #804E35",
X"br c #7E4C33",

X"c` c #B27A5F",
X"cf c #573423",

X"cp c #B77F63",
X"cq c #5E3926",
X"cz c #643C28",

X"dh c #7B4A31",
X"dn c #BE8A6F",
X/* pixels */

X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcfcfcfcf`u",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcfcfcqbp`x",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcfcf`u`x`x",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbccqcqbp`x`x`x",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcae`u`x`x`x`x",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbc`udncpdndndn",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbqbqbgbqbqbq",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbr`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhaeaeaeaeaeae",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhcqcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhczcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhcqcfcfcfcfcf",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gdhczcfcfcfcfcf",
X};
END_OF_FILE
if test 3744 -ne `wc -c <'xsokoban/bitmaps/defaults/west_twall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/west_twall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/west_twall.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/westwall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/westwall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/westwall.xpm'\" \(3872 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/westwall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */
X"40 40 24 2",
X/* colors */
X"`f c #7F4D34",
X"`g c #7D4B32",

X"`u c #865741",


X"`x c #CC9275",

X"a` c #B68352",

X"ae c #67402C",

X"ax c #F3E6DF",
X"bc c #7C4B32",

X"bf c #AE7959",
X"bg c #82533B",

X"bp c #926740",
X"bq c #804E35",
X"br c #7E4C33",

X"c` c #B27A5F",
X"cf c #573423",

X"cm c #CFBAB6",

X"cp c #B77F63",
X"cq c #5E3926",

X"cu c #B47D63",


X"cz c #643C28",
X"da c #C78E72",
X"dg c #D6D68A",
X"dh c #7B4A31",
X"dn c #BE8A6F",
X/* pixels */

X"axcm`x`x`xda`x`x`x`x`xda`x`x`x`xdada`x`x`x`xda`x`x`x`x`xda`x`x`x`x`xda`x`x`x`x`x",
X"cmaxcm`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`xcmaxdgda`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`x`xcmaxcm`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`x`x`xcmax`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`x`x`x`xcmcmcuc`c`c`c`bfc`c`c`c`bfbfc`c`c`c`bfbfc`c`c`c`bfc`c`c`c`bfbfc`c`c`c`c`",
X"`x`x`x`x`xa`bqbrbr`gbcbcbcbr`gbrbcbrbr`g`gbrbcbrbcbrbcbrbcbr`g`gbrbrbcbcbrbc`gbr",
X"`x`x`x`x`xc``f`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xcpbr`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xbfbr`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`bc`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`bc`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xc`br`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xbfbc`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`xdabfbc`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xbfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`xdabf`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xbfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`xdabf`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xbfdhdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`xdabfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xbfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`xdabfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`x`xbfdh`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g",
X"`x`x`x`xdabfdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdh",
X"`x`x`x`xdnbgcqcqczcqcqcqczcqcqczcqcqczcqcqczcqcqczcqcqczcqcqcqczcqcqcqczcqcqczcq",
X"`x`x`xda`ucfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"`x`xdabpcqcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"`xdabpcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"dabpaecfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"bfczcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X};
END_OF_FILE
if test 3872 -ne `wc -c <'xsokoban/bitmaps/defaults/westwall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/westwall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/westwall.xpm'
fi
if test -f 'xsokoban/save.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/save.c'\"
else
echo shar: Extracting \"'xsokoban/save.c'\" \(3881 characters\)
sed "s/^X//" >'xsokoban/save.c' <<'END_OF_FILE'


X#include "config_local.h"
X
X#include <stdio.h>

X#include <sys/types.h>
X#include <sys/stat.h>
X#include <signal.h>
X#include <string.h>
X#include <unistd.h>


X#include <stdlib.h>
X
X#include "externs.h"
X#include "globals.h"
X

Xstatic long savedbn;
Xstatic char *sfname;
Xstatic FILE *savefile;
Xstatic struct stat sfstat;
X
X/* save out a game in a standard format. Uses the ntoh functions and hton
X * functions so that the same save file will work on an MSB or LSB system
X * other than that, it is a standard sokoban score file.
X */
Xshort SaveGame(void)


X{
X short ret = 0;
X

X signal(SIGINT, SIG_IGN);
X sfname = malloc(strlen(SAVEPATH) + strlen(username) + 6);
X sprintf(sfname, "%s/%s.sav", SAVEPATH, username);
X
X packets = htons(packets);
X pushes = htons(pushes);
X moves = htons(moves);
X level = htons(level);
X cols = htons(cols);
X savepack = htons(savepack);
X rows = htons(rows);
X ppos.x = htons(ppos.x);
X ppos.y = htons(ppos.y);
X
X if ((savefile = fopen(sfname, "w")) == NULL)
X ret = E_FOPENSAVE;
X else {
X savedbn = fileno(savefile);
X if (write(savedbn, &(map[0][0]), MAXROW * MAXCOL) != MAXROW * MAXCOL)
X ret = E_WRITESAVE;
X else if (write(savedbn, &ppos, sizeof(POS)) != sizeof(POS))
X ret = E_WRITESAVE;
X else if (write(savedbn, &level, 2) != 2)
X ret = E_WRITESAVE;
X else if (write(savedbn, &moves, 2) != 2)
X ret = E_WRITESAVE;
X else if (write(savedbn, &pushes, 2) != 2)
X ret = E_WRITESAVE;
X else if (write(savedbn, &packets, 2) != 2)
X ret = E_WRITESAVE;
X else if (write(savedbn, &savepack, 2) != 2)
X ret = E_WRITESAVE;
X else if (write(savedbn, &rows, 2) != 2)
X ret = E_WRITESAVE;
X else if (write(savedbn, &cols, 2) != 2)
X ret = E_WRITESAVE;
X else
X fclose(savefile);
X if (stat(sfname, &sfstat) != 0)
X ret = E_STATSAVE;
X else if ((savefile = fopen(sfname, "a")) == NULL)
X ret = E_FOPENSAVE;
X else if (write(savedbn, &sfstat, sizeof(sfstat)) != sizeof(sfstat))
X ret = E_WRITESAVE;
X fclose(savefile);
X }
X
X ppos.x = ntohs(ppos.x);
X ppos.y = ntohs(ppos.y);
X pushes = ntohs(pushes);
X moves = ntohs(moves);
X level = ntohs(level);
X packets = ntohs(packets);
X cols = ntohs(cols);
X rows = ntohs(rows);
X savepack = ntohs(savepack);
X
X if ((ret == E_WRITESAVE) || (ret == E_STATSAVE))
X unlink(sfname);
X signal(SIGINT, SIG_DFL);
X
X free(sfname);


X return ret;
X}
X

X/* loads in a previously saved game */
Xshort RestoreGame(void)


X{
X short ret = 0;

X struct stat oldsfstat;
X
X signal(SIGINT, SIG_IGN);
X sfname = malloc(strlen(SAVEPATH) + strlen(username) + 6);
X sprintf(sfname, "%s/%s.sav", SAVEPATH, username);
X
X if (stat(sfname, &oldsfstat) < -1)
X ret = E_NOSAVEFILE;
X else {
X if ((savefile = fopen(sfname, "r")) == NULL)
X ret = E_FOPENSAVE;
X else {
X savedbn = fileno(savefile);
X if (read(savedbn, &(map[0][0]), MAXROW * MAXCOL) != MAXROW * MAXCOL)
X ret = E_READSAVE;
X else if (read(savedbn, &ppos, sizeof(POS)) != sizeof(POS))
X ret = E_READSAVE;
X else if (read(savedbn, &level, 2) != 2)
X ret = E_READSAVE;
X else if (read(savedbn, &moves, 2) != 2)
X ret = E_READSAVE;
X else if (read(savedbn, &pushes, 2) != 2)
X ret = E_READSAVE;
X else if (read(savedbn, &packets, 2) != 2)
X ret = E_READSAVE;
X else if (read(savedbn, &savepack, 2) != 2)
X ret = E_READSAVE;
X else if (read(savedbn, &rows, 2) != 2)
X ret = E_READSAVE;
X else if (read(savedbn, &cols, 2) != 2)
X ret = E_READSAVE;
X else if (read(savedbn, &sfstat, sizeof(sfstat)) != sizeof(sfstat))
X ret = E_READSAVE;
X }
X
X ppos.x = ntohs(ppos.x);
X ppos.y = ntohs(ppos.y);
X level = ntohs(level);
X moves = ntohs(moves);
X pushes = ntohs(pushes);
X packets = ntohs(packets);
X savepack = ntohs(savepack);
X rows = ntohs(rows);
X cols = ntohs(cols);
X
X unlink(sfname);
X }
X signal(SIGINT, SIG_DFL);
X free(sfname);
X return ret;
X}
END_OF_FILE
if test 3881 -ne `wc -c <'xsokoban/save.c'`; then
echo shar: \"'xsokoban/save.c'\" unpacked with wrong size!
fi
# end of 'xsokoban/save.c'
fi
echo shar: End of archive 5 \(of 8\).
cp /dev/null ark5isdone

Andrew Myers

unread,
Nov 3, 1994, 10:31:27 AM11/3/94
to
Submitted-by: an...@tonic.lcs.mit.edu (Andrew Myers)
Posting-number: Volume 22, Issue 139
Archive-name: xsokoban/part06

Environment: X11, game
Supersedes: xsokoban: Volume 21, Issue 98-104

#! /bin/sh


# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: xsokoban/Makefile xsokoban/Makefile.in
# xsokoban/bitmaps/defaults/eastwall.xpm
# xsokoban/bitmaps/defaults/floor.xpm
# xsokoban/bitmaps/defaults/horizwall.xpm
# xsokoban/bitmaps/defaults/llcornerwall.xbm
# xsokoban/bitmaps/defaults/lrcornerwall.xbm
# xsokoban/bitmaps/defaults/lrcornerwall.xpm
# xsokoban/bitmaps/defaults/north_twall.xbm
# xsokoban/bitmaps/defaults/north_twall.xpm
# xsokoban/bitmaps/defaults/ulcornerwall.xbm
# xsokoban/bitmaps/defaults/urcornerwall.xbm
# xsokoban/bitmaps/defaults/urcornerwall.xpm xsokoban/config_local.h
# xsokoban/config_local.h.in xsokoban/help.h xsokoban/options.h
# xsokoban/qtelnet.c xsokoban/resources.c xsokoban/screen.c
# Wrapped by chris@sparky on Thu Nov 3 09:23:52 1994


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 6 (of 8)."'
if test -f 'xsokoban/Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/Makefile'\"
else
echo shar: Extracting \"'xsokoban/Makefile'\" \(1520 characters\)
sed "s/^X//" >'xsokoban/Makefile' <<'END_OF_FILE'
X# Generated automatically from Makefile.in by configure.
X############################################################
X# C compiler
X############################################################
XCC = gcc
X
X############################################################
X# C compiler flags
X############################################################
X#
XOPTIMIZER = -O -DNDEBUG
X#OPTIMIZER = -g -UNDEBUG
XINCS =
XWARN = -Wall
XLIBS = -lXpm -lX11 -ldnet_stub
XDEFS =
X
X############################################################
X# Where to install the executable
X############################################################
XBIN = /usr/local/bin
X
X##### Nothing from here on should need customization ######################
X
XCFLAGS = $(OPTIMIZER) $(WARN) $(INCS) $(DEFS)
XOBJECTS = display.o main.o resources.o play.o score.o screen.o save.o \
X scoredisp.o qtelnet.o
X
Xxsokoban: $(OBJECTS)
X $(CC) $(CFLAGS) -o xsokoban $(OBJECTS) $(LIBS)
X
Xclean:
X rm -f $(OBJECTS)
X
Xclobber: clean
X rm -f xsokoban
X
X# DO NOT DELETE THIS LINE -- make depend depends on it.
X
Xdisplay.o: config_local.h globals.h config.h defaults.h help.h
Xmain.o: externs.h config_local.h globals.h config.h options.h errors.h
Xplay.o: externs.h config_local.h globals.h config.h
Xresources.o: externs.h config_local.h globals.h config.h defaults.h
Xsave.o: config_local.h externs.h globals.h config.h
Xscore.o: config_local.h externs.h globals.h config.h
Xscoredisp.o: externs.h config_local.h globals.h config.h defaults.h
Xscreen.o: externs.h config_local.h globals.h config.h
END_OF_FILE
if test 1520 -ne `wc -c <'xsokoban/Makefile'`; then
echo shar: \"'xsokoban/Makefile'\" unpacked with wrong size!
fi
# end of 'xsokoban/Makefile'
fi
if test -f 'xsokoban/Makefile.in' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/Makefile.in'\"
else
echo shar: Extracting \"'xsokoban/Makefile.in'\" \(1453 characters\)
sed "s/^X//" >'xsokoban/Makefile.in' <<'END_OF_FILE'
X############################################################
X# C compiler
X############################################################
XCC = @CC@
X
X############################################################
X# C compiler flags
X############################################################
X#
XOPTIMIZER = -O -DNDEBUG
X#OPTIMIZER = -g -UNDEBUG
XINCS = @INCS@
XWARN = @WARN@
XLIBS = @LIBS@
XDEFS =
X
X############################################################
X# Where to install the executable
X############################################################
XBIN = /usr/local/bin
X
X##### Nothing from here on should need customization ######################
X
XCFLAGS = $(OPTIMIZER) $(WARN) $(INCS) $(DEFS)
XOBJECTS = display.o main.o resources.o play.o score.o screen.o save.o \
X scoredisp.o qtelnet.o
X
Xxsokoban: $(OBJECTS)
X $(CC) $(CFLAGS) -o xsokoban $(OBJECTS) $(LIBS)
X
Xclean:
X rm -f $(OBJECTS)
X
Xclobber: clean
X rm -f xsokoban
X
X# DO NOT DELETE THIS LINE -- make depend depends on it.
X
Xdisplay.o: config_local.h globals.h config.h defaults.h help.h
Xmain.o: externs.h config_local.h globals.h config.h options.h errors.h
Xplay.o: externs.h config_local.h globals.h config.h
Xresources.o: externs.h config_local.h globals.h config.h defaults.h
Xsave.o: config_local.h externs.h globals.h config.h
Xscore.o: config_local.h externs.h globals.h config.h
Xscoredisp.o: externs.h config_local.h globals.h config.h defaults.h
Xscreen.o: externs.h config_local.h globals.h config.h
END_OF_FILE
if test 1453 -ne `wc -c <'xsokoban/Makefile.in'`; then
echo shar: \"'xsokoban/Makefile.in'\" unpacked with wrong size!
fi
# end of 'xsokoban/Makefile.in'
fi
if test -f 'xsokoban/bitmaps/defaults/eastwall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/eastwall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/eastwall.xpm'\" \(3664 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/eastwall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 11 2",


X/* colors */
X"`g c #7D4B32",

X"`x c #CC9275",
X"ae c #67402C",
X"bc c #7C4B32",

X"bp c #926740",
X"bq c #804E35",

X"cf c #573423",
X"cp c #B77F63",
X"cq c #5E3926",
X"cz c #643C28",
X"da c #C78E72",

X/* pixels */
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xdabp",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xbpcq",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xdabpaecf",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xbpcqcfcf",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xdabpaecfcfcf",
X"cpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpbpcqcfcfcfcf",
X"bqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqaecfcfcfcfcf",
X"`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gbcbcaecfcfcfcfcf",

X"bcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcczcfcfcfcfcf",
X"czczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczcqcfcfcfcfcf",


X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",

X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X};
END_OF_FILE
if test 3664 -ne `wc -c <'xsokoban/bitmaps/defaults/eastwall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/eastwall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/eastwall.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/floor.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/floor.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/floor.xpm'\" \(3503 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/floor.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 1 2",
X/* colors */
X"ct c #545454",
X/* pixels */

X"ctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctct",
X"ctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctctct",
X};
END_OF_FILE
if test 3503 -ne `wc -c <'xsokoban/bitmaps/defaults/floor.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/floor.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/floor.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/horizwall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/horizwall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/horizwall.xpm'\" \(3598 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/horizwall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 7 2",


X/* colors */
X"`g c #7D4B32",

X"`x c #CC9275",

X"bc c #7C4B32",

X"bq c #804E35",

X"cf c #573423",
X"cp c #B77F63",

X"cz c #643C28",
X/* pixels */
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"cpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcp",
X"bqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbq",

X"bcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbc",
X"czczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczcz",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf"
X};
END_OF_FILE

if test 3598 -ne `wc -c <'xsokoban/bitmaps/defaults/horizwall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/horizwall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/horizwall.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/llcornerwall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/llcornerwall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/llcornerwall.xbm'\" \(848 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/llcornerwall.xbm' <<'END_OF_FILE'
X#define llcornerwall_width 30
X#define llcornerwall_height 30
Xstatic char llcornerwall_bits[] = {
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x35,
X 0xbc, 0xff, 0x7f, 0x3a, 0xbc, 0xff, 0x7f, 0x3d, 0xbc, 0xff, 0x7f, 0x3e,
X 0xbc, 0xff, 0x7f, 0x00, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0x3c, 0x00, 0x00, 0x00,
X 0x5c, 0x55, 0x55, 0x15, 0xac, 0xaa, 0xaa, 0x2a, 0x54, 0x55, 0x55, 0x15,
X 0xa8, 0xaa, 0xaa, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
END_OF_FILE
if test 848 -ne `wc -c <'xsokoban/bitmaps/defaults/llcornerwall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/llcornerwall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/llcornerwall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/lrcornerwall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/lrcornerwall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/lrcornerwall.xbm'\" \(848 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/lrcornerwall.xbm' <<'END_OF_FILE'
X#define lrcornerwall_width 30
X#define lrcornerwall_height 30
Xstatic char lrcornerwall_bits[] = {
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbb, 0xff, 0x7f, 0x05,
X 0xb7, 0xff, 0x7f, 0x0a, 0xaf, 0xff, 0x7f, 0x05, 0x9f, 0xff, 0x7f, 0x0a,
X 0x80, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05,
X 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a,
X 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05,
X 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a,
X 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05,
X 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05, 0x00, 0x00, 0x00, 0x0a,
X 0x55, 0x55, 0x55, 0x04, 0xaa, 0xaa, 0xaa, 0x08, 0x55, 0x55, 0x55, 0x01,
X 0xaa, 0xaa, 0xaa, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
END_OF_FILE
if test 848 -ne `wc -c <'xsokoban/bitmaps/defaults/lrcornerwall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/lrcornerwall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/lrcornerwall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/lrcornerwall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/lrcornerwall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/lrcornerwall.xpm'\" \(3728 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/lrcornerwall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 15 2",


X/* colors */
X"`f c #7F4D34",
X"`g c #7D4B32",
X"`x c #CC9275",

X"bc c #7C4B32",
X"bf c #AE7959",
X"bg c #82533B",
X"bp c #926740",
X"bq c #804E35",
X"br c #7E4C33",
X"cf c #573423",
X"cp c #B77F63",
X"cq c #5E3926",
X"cz c #643C28",

X"bcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcczcfcfcfcfcf",
X"czczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczczcqcfcfcfcfcf",


X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",

X"cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf",
X};
END_OF_FILE
if test 3728 -ne `wc -c <'xsokoban/bitmaps/defaults/lrcornerwall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/lrcornerwall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/lrcornerwall.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/north_twall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/north_twall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/north_twall.xbm'\" \(845 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/north_twall.xbm' <<'END_OF_FILE'
X#define north_twall_width 30
X#define north_twall_height 30
Xstatic char north_twall_bits[] = {
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0x80, 0xff, 0x7f, 0x00,
X 0x95, 0xff, 0x7f, 0x15, 0xaa, 0xff, 0x7f, 0x28, 0xb5, 0xff, 0x7f, 0x11,
X 0xba, 0xff, 0x7f, 0x22, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a};
END_OF_FILE
if test 845 -ne `wc -c <'xsokoban/bitmaps/defaults/north_twall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/north_twall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/north_twall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/north_twall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/north_twall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/north_twall.xpm'\" \(3696 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/north_twall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 13 2",


X/* colors */
X"`g c #7D4B32",
X"`u c #865741",
X"`x c #CC9275",
X"ae c #67402C",

X"bf c #AE7959",

X"bp c #926740",
X"bq c #804E35",

X"cf c #573423",
X"cp c #B77F63",
X"cq c #5E3926",
X"cz c #643C28",
X"da c #C78E72",
X"dh c #7B4A31",

X/* pixels */
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x",
X"cpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcp",
X"bqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbq",

if test 3696 -ne `wc -c <'xsokoban/bitmaps/defaults/north_twall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/north_twall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/north_twall.xpm'
fi
if test -f 'xsokoban/bitmaps/defaults/ulcornerwall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/ulcornerwall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/ulcornerwall.xbm'\" \(848 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/ulcornerwall.xbm' <<'END_OF_FILE'
X#define ulcornerwall_width 30
X#define ulcornerwall_height 30
Xstatic char ulcornerwall_bits[] = {
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x3f,
X 0xf4, 0xff, 0xff, 0x3f, 0xec, 0xff, 0xff, 0x3f, 0xdc, 0xff, 0xff, 0x3f,
X 0x3c, 0x00, 0x00, 0x00, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0x7f, 0x00,
X 0xbc, 0xff, 0x7f, 0x15, 0xbc, 0xff, 0x7f, 0x28, 0xbc, 0xff, 0x7f, 0x11,
X 0xbc, 0xff, 0x7f, 0x22, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a};
END_OF_FILE
if test 848 -ne `wc -c <'xsokoban/bitmaps/defaults/ulcornerwall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/ulcornerwall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/ulcornerwall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/urcornerwall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/urcornerwall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/urcornerwall.xbm'\" \(848 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/urcornerwall.xbm' <<'END_OF_FILE'
X#define urcornerwall_width 30
X#define urcornerwall_height 30
Xstatic char urcornerwall_bits[] = {
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x07,
X 0xff, 0xff, 0xff, 0x0b, 0xff, 0xff, 0xff, 0x05, 0xff, 0xff, 0xff, 0x0a,
X 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05,
X 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a,
X 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05,
X 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a,
X 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05,
X 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05, 0x80, 0xff, 0x7f, 0x0a,
X 0x95, 0xff, 0x7f, 0x05, 0xaa, 0xff, 0x7f, 0x0a, 0xb5, 0xff, 0x7f, 0x05,
X 0xba, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a};
END_OF_FILE
if test 848 -ne `wc -c <'xsokoban/bitmaps/defaults/urcornerwall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/urcornerwall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/urcornerwall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/urcornerwall.xpm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/urcornerwall.xpm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/urcornerwall.xpm'\" \(3711 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/urcornerwall.xpm' <<'END_OF_FILE'


X/* XPM */
Xstatic char *icons-40-128[] = {
X/* width height ncolors chars_per_pixel */

X"40 40 14 2",


X/* colors */
X"`g c #7D4B32",
X"`u c #865741",
X"`x c #CC9275",
X"ae c #67402C",
X"bc c #7C4B32",

X"bf c #AE7959",

X"bp c #926740",
X"bq c #804E35",

X"cf c #573423",
X"cp c #B77F63",
X"cq c #5E3926",
X"cz c #643C28",
X"da c #C78E72",
X"dh c #7B4A31",

X/* pixels */
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xdabp",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xbpcq",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xdabpaecf",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xbpcqcfcf",
X"`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`x`xdabpaecfcfcf",
X"cpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpbpcqcfcfcfcf",
X"bqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqaecfcfcfcfcf",

if test 3711 -ne `wc -c <'xsokoban/bitmaps/defaults/urcornerwall.xpm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/urcornerwall.xpm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/urcornerwall.xpm'
fi
if test -f 'xsokoban/config_local.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/config_local.h'\"
else
echo shar: Extracting \"'xsokoban/config_local.h'\" \(1647 characters\)
sed "s/^X//" >'xsokoban/config_local.h' <<'END_OF_FILE'
X/* config_local.h. Generated automatically by configure. */
X/*
X This file contains only definitions required to make compilation
X occur successfully. These definitions control whether various
X include files or extern declarations are needed.
X
X If the answer to any of these questions is yes, the corresponding
X symbol should be defined.
X*/
X/* Is there a prototype for "getpass"? */
X#define GETPASS_PROTO 1
X
X/* Are "htons" and "ntohs" defined in <machine/endian.h>? */
X#define NEED_ENDIAN 1
X
X/* Are "htons" and "ntohs" defined in <net/nh.h>? */
X/* #undef NEED_NH */
X
X/* Are "htons" and "ntohs" defined in <netinet/in.h>? */
X#define NEED_NETINET_IN 1
X
X/* Are "htons" and "ntohs" defined in <sys/byteorder.h>? */
X/* #undef NEED_BYTEORDER */
X
X/* Is there a prototype for "fprintf" in <stdio.h>? */
X#define FPRINTF_PROTO 1
X
X/* Is there a prototype for "fclose" in <stdio.h>? */
X#define FCLOSE_PROTO 1
X
X/* Is there a prototype for "time"? */
X#define TIME_PROTO 1
X
X/* Is there a prototype for "mktemp"? */
X#define MKTEMP_PROTO 1
X
X/* Is there a prototype for "perror" in <errno.h>? */
X#define PERROR_PROTO 1
X
X/* Is there a prototype for "rename" in <unistd.h>? */
X#define RENAME_PROTO 1
X
X/* Does the system support "strdup" and have a prototype in <string.h>? */
X#define STRDUP_PROTO 1
X
X/* Does the system have "usleep"? */
X#define HAS_USLEEP 1
X
X/* Is there a <limits.h>? (Otherwise, there had better be a <sys/limits.h>) */
X#define HAVE_LIMITS_H 1
X
X/* Is there a <sys/select.h>? (AIX requires it for fd_sets) */
X/* #undef HAVE_SYS_SELECT_H */
X
X#define BZERO_PROTO 1
X
X/* Does <time.h> have a localtime proto? */
X#define LOCALTIME_PROTO 1
END_OF_FILE
if test 1647 -ne `wc -c <'xsokoban/config_local.h'`; then
echo shar: \"'xsokoban/config_local.h'\" unpacked with wrong size!
fi
# end of 'xsokoban/config_local.h'
fi
if test -f 'xsokoban/config_local.h.in' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/config_local.h.in'\"
else
echo shar: Extracting \"'xsokoban/config_local.h.in'\" \(1525 characters\)
sed "s/^X//" >'xsokoban/config_local.h.in' <<'END_OF_FILE'
X/*
X This file contains only definitions required to make compilation
X occur successfully. These definitions control whether various
X include files or extern declarations are needed.
X
X If the answer to any of these questions is yes, the corresponding
X symbol should be defined.
X*/
X/* Is there a prototype for "getpass"? */
X#undef GETPASS_PROTO
X
X/* Are "htons" and "ntohs" defined in <machine/endian.h>? */
X#undef NEED_ENDIAN
X
X/* Are "htons" and "ntohs" defined in <net/nh.h>? */
X#undef NEED_NH
X
X/* Are "htons" and "ntohs" defined in <netinet/in.h>? */
X#undef NEED_NETINET_IN
X
X/* Are "htons" and "ntohs" defined in <sys/byteorder.h>? */
X#undef NEED_BYTEORDER
X
X/* Is there a prototype for "fprintf" in <stdio.h>? */
X#undef FPRINTF_PROTO
X
X/* Is there a prototype for "fclose" in <stdio.h>? */
X#undef FCLOSE_PROTO
X
X/* Is there a prototype for "time"? */
X#undef TIME_PROTO
X
X/* Is there a prototype for "mktemp"? */
X#undef MKTEMP_PROTO
X
X/* Is there a prototype for "perror" in <errno.h>? */
X#undef PERROR_PROTO
X
X/* Is there a prototype for "rename" in <unistd.h>? */
X#undef RENAME_PROTO
X
X/* Does the system support "strdup" and have a prototype in <string.h>? */
X#undef STRDUP_PROTO
X
X/* Does the system have "usleep"? */
X#undef HAS_USLEEP
X
X/* Is there a <limits.h>? (Otherwise, there had better be a <sys/limits.h>) */
X#undef HAVE_LIMITS_H
X
X/* Is there a <sys/select.h>? (AIX requires it for fd_sets) */
X#undef HAVE_SYS_SELECT_H
X
X#undef BZERO_PROTO
X
X/* Does <time.h> have a localtime proto? */
X#undef LOCALTIME_PROTO
END_OF_FILE
if test 1525 -ne `wc -c <'xsokoban/config_local.h.in'`; then
echo shar: \"'xsokoban/config_local.h.in'\" unpacked with wrong size!
fi
# end of 'xsokoban/config_local.h.in'
fi
if test -f 'xsokoban/help.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/help.h'\"
else
echo shar: Extracting \"'xsokoban/help.h'\" \(1349 characters\)
sed "s/^X//" >'xsokoban/help.h' <<'END_OF_FILE'
X/* help pages */
Xtypedef struct helpline {
X int xpos, ydelta, page;
X char *textline;
X} h_line;
X
Xh_line help_pages[] = {
X { 0, 35, 0, "Objective: Push all the objects from their starting positions"},
X { 12, 15, 0, "into their goal positions. Be warned that you can"},
X { 12, 15, 0, "push only one object at a time; watch out for corners!"},
X { 0, 35, 0, "Movement:"},
X { 12, 15, 0, "Left mouse button: move player to this point"},
X { 12, 15, 0, "Middle mouse button: push object to this point"},
X { 12, 15, 0, "Right mouse button: undo last action"},
X { 12, 15, 0, "Also, left or middle button can drag objects"},
X { 6, 20, 0, "Or use the arrow keys or hljk, as in vi:"},
X { 13, 15, 0, "Move/Push h l k j"},
X { 13, 15, 0, "Run/Push H L K J"},
X { 13, 15, 0, "Run Only ^H ^L ^K ^J"},
X { 0, 30, 0, "Other Commands:"},
X { 12, 15, 0, "^r: redraw screen ?: this help message"},
X { 12, 15, 0, " u: undo last action U: restart this level"},
X { 12, 15, 0, " s: save game and quit q: quit level"},
X { 12, 15, 0, " c: snapshot posn ^U: restore snapshot"},
X { 12, 15, 0, " S: view score file"},
X { 12, 50, 0, "Player: Goal: Wall: Object:"},
X { 12, 50, 0, "Object on a goal: Player on a goal:"},
X {0, 0, 0, NULL}
X};
X
X#define HELP_PAGES 1
END_OF_FILE
if test 1349 -ne `wc -c <'xsokoban/help.h'`; then
echo shar: \"'xsokoban/help.h'\" unpacked with wrong size!
fi
# end of 'xsokoban/help.h'
fi
if test -f 'xsokoban/options.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/options.h'\"
else
echo shar: Extracting \"'xsokoban/options.h'\" \(1595 characters\)
sed "s/^X//" >'xsokoban/options.h' <<'END_OF_FILE'
X/* the list of the options used to build the command line XrmDB.
X * if an option has no seperate arg, and appears on the command line, the
X * last value in the table is what will be entered into the db.
X */
Xstatic XrmOptionDescRec options[] = {
X { "-w", "*fancyWalls", XrmoptionNoArg, (caddr_t) "on" },
X { "-walls", "*fancyWalls", XrmoptionNoArg, (caddr_t) "on" },
X { "-f", "*fontName", XrmoptionSepArg, (caddr_t) 0 },
X { "-font", "*fontName", XrmoptionSepArg, (caddr_t) 0 },
X { "-rv", "*reverseVideo", XrmoptionNoArg, (caddr_t) "on" },
X { "-reverse", "*reverseVideo", XrmoptionNoArg, (caddr_t) "on" },
X { "-fg", "*foreground", XrmoptionSepArg, (caddr_t) 0 },
X { "-foreground", "*foreground", XrmoptionSepArg, (caddr_t) 0 },
X { "-bg", "*background", XrmoptionSepArg, (caddr_t) 0 },
X { "-background", "*background", XrmoptionSepArg, (caddr_t) 0 },
X { "-bd", "*borderColor", XrmoptionSepArg, (caddr_t) 0 },
X { "-border", "*borderColor", XrmoptionSepArg, (caddr_t) 0 },
X { "-pr", "*pointerColor", XrmoptionSepArg, (caddr_t) 0 },
X { "-pointer", "*pointerColor", XrmoptionSepArg, (caddr_t) 0 },
X { "-b", "*bitmapDir", XrmoptionSepArg, (caddr_t) 0 },
X { "-bitdir", "*bitmapDir", XrmoptionSepArg, (caddr_t) 0 },
X { "-display", ".display", XrmoptionSepArg, (caddr_t) 0 },
X { "-xrm", (char *) 0, XrmoptionResArg, (caddr_t) 0 }
X};
END_OF_FILE
if test 1595 -ne `wc -c <'xsokoban/options.h'`; then
echo shar: \"'xsokoban/options.h'\" unpacked with wrong size!
fi
# end of 'xsokoban/options.h'
fi
if test -f 'xsokoban/qtelnet.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/qtelnet.c'\"
else
echo shar: Extracting \"'xsokoban/qtelnet.c'\" \(2150 characters\)
sed "s/^X//" >'xsokoban/qtelnet.c' <<'END_OF_FILE'
X#include <netdb.h>
X#include <stdio.h>
X#include <sys/types.h>
X#include <sys/socket.h>
X#include <netinet/in.h>
X#include <ctype.h>


X#include <stdlib.h>
X#include <unistd.h>
X#include <string.h>

X
X#include "config_local.h"
X
X#if HAVE_SYS_SELECT_H
X#include <sys/select.h>
X#endif
X
X#include "externs.h"
X
X#define TRY(name,expr) if (0>(expr)) { perror(name); return 0; }
X
Xint lingerval = 1;
X
X/* Open a TCP-IP connection to machine "hostname" on port "port", and
X send it the text in "msg". Return all output from the connection
X in a newly-allocated string that must be freed to reclaim its
X storage.
X
X Return 0 on failure.
X*/
Xchar *qtelnet(char *hostname, int port, char *msg) {
X int sock;
X struct hostent *h;
X struct sockaddr_in client;
X char *retbuf = 0;
X int retmax = 0;
X int retpos = 0;
X TRY("socket", (sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)));
X TRY("setsockopt[SO_REUSEADDR,1]",
X setsockopt(sock,
X SOL_SOCKET,
X SO_REUSEADDR,
X &lingerval,
X sizeof(lingerval)));
X
X if (!isdigit(hostname[0])) {
X h = gethostbyname(hostname);
X if (!h) { fprintf(stderr, "Unknown host: %s\n", hostname); exit(-1); }
X else memcpy(&client.sin_addr, h->h_addr, h->h_length);
X } else {
X int a,b,c,d;
X unsigned long hostaddr;
X sscanf(hostname, "%d.%d.%d.%d", &a, &b, &c, &d);
X hostaddr = (a<<24)|(b<<16)|(c<<8)|d;
X client.sin_addr.s_addr = htonl(hostaddr);
X }
X
X
X client.sin_family = AF_INET;
X client.sin_port = htons (port);
X
X TRY("connect", connect(sock, &client, sizeof(client)));
X#if 0
X fprintf(stderr, "Connected to %s.\n", hostname);
X#endif
X write(sock, msg, strlen(msg));
X
X retmax = 4096;
X retpos = 0;
X retbuf = (char *)malloc(retmax);
X
X for(;;) {
X int ch;
X if (retmax == retpos) {
X retmax *= 2;
X { char *nrb = (char *)malloc(retmax);
X memcpy(nrb, retbuf, retmax);
X free(retbuf);
X retbuf = nrb; }
X }
X TRY("read", ch = read(sock, retbuf + retpos, retmax - retpos));
X if (ch == 0) {
X#if 0
X fprintf(stderr, "Connection closed by remote host\n");
X#endif
X break;
X }
X retpos += ch;
X }
X TRY("close", close(sock));
X retbuf[retpos] = 0;
X return retbuf;
X}
END_OF_FILE
if test 2150 -ne `wc -c <'xsokoban/qtelnet.c'`; then
echo shar: \"'xsokoban/qtelnet.c'\" unpacked with wrong size!
fi
# end of 'xsokoban/qtelnet.c'
fi
if test -f 'xsokoban/resources.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/resources.c'\"
else
echo shar: Extracting \"'xsokoban/resources.c'\" \(2708 characters\)
sed "s/^X//" >'xsokoban/resources.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include <string.h>


X#include <stdlib.h>
X
X#include "externs.h"
X#include "globals.h"

X#include "defaults.h"
X
X/* rewritten slightly from the xantfarm code by Jef Poskanzer */
X
X/* get a resource from the specified db. This helps support the -display
X * code, but could be used to get a resource that should only be specified
X * in a given place (ie either only command line, or only Xresource db)
X */
Xchar *GetDatabaseResource(XrmDatabase db, char *res)
X{
X char name[500];
X char class[500];
X char *type;
X XrmValue value;
X
X (void)sprintf(name, "%s.%s", progname, res);
X (void)sprintf(class, "%s.%s", CLASSNAME, res);
X
X if(XrmGetResource(db, name, class, &type, &value) == True)
X if(strcmp(type, "String") == 0)
X return (char *)value.addr;
X return (char *)0;
X}
X
X/* just calls the above routine with the general combined db */
Xchar *GetResource(char *res)
X{
X return GetDatabaseResource(rdb, res);
X}
X
X/* returns the color pixel for the given resource */
XBoolean GetColorResource(char *res, unsigned long *cP)
X{
X XColor color;
X char *rval = GetResource(res);
X
X if(rval == (char *)0)
X return _false_;
X if(XParseColor(dpy, cmap, rval, &color) != True)
X return _false_;
X if(XAllocColor(dpy, cmap, &color) != True)
X return _false_;
X *cP = color.pixel;


X return _true_;
X}
X

X/* Uses the global "cmap" to look up colors. Call exit() if no color
X can be found. XXX Yuck */
Xunsigned long GetColorOrDefault(Display *dpy,
X char *resource_name,
X int depth,
X char *default_name_8,
X Boolean default_white_2)
X{
X XColor c;
X unsigned long pixel;
X if (GetColorResource(resource_name, &pixel)) {
X return pixel;
X } else {
X char *val;
X if (depth >= 8)
X val = default_name_8;
X else
X val = default_white_2 ? "white" : "black";
X if (XParseColor(dpy, cmap, val, &c) &&
X XAllocColor(dpy, cmap, &c))
X return c.pixel;
X if (XParseColor(dpy, cmap, default_white_2 ? "white" : "black", &c) &&
X XAllocColor(dpy, cmap, &c))
X return c.pixel;
X fprintf(stderr, "Cannot obtain color for %s\n", resource_name);


X exit(EXIT_FAILURE);
X }
X}
X

XXFontStruct *GetFontResource(char *font)
X{
X char *rval = GetResource(font);
X XFontStruct *finfo;
X if (!rval) rval = DEF_FONT;
X finfo = XLoadQueryFont(dpy, rval);
X if (!finfo) {
X finfo = XLoadQueryFont(dpy, "fixed");
X }
X return finfo;
X}
X
Xchar *boolopts[] = {
X "true",
X "True",
X "on",
X "On",
X "yes",
X "Yes",
X "1"
X};
X
X/* convert a string to the 'boolean' type (I defined my own, thanks) */
XBoolean StringToBoolean(char *str)
X{
X int nboolopts = sizeof(boolopts)/sizeof(*boolopts), i;
X
X for(i = 0; i < nboolopts; i++)
X if(strcmp(str, boolopts[i]) == 0)
X return _true_;
X return _false_;
X}
END_OF_FILE
if test 2708 -ne `wc -c <'xsokoban/resources.c'`; then
echo shar: \"'xsokoban/resources.c'\" unpacked with wrong size!
fi
# end of 'xsokoban/resources.c'
fi
if test -f 'xsokoban/screen.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screen.c'\"
else
echo shar: Extracting \"'xsokoban/screen.c'\" \(1494 characters\)
sed "s/^X//" >'xsokoban/screen.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include <string.h>


X#include <stdlib.h>
X
X#include "externs.h"
X#include "globals.h"
X

X/* Read in the current screen level, updating "ppos", "map", "savepack",
X and "packets" appropriately. Return 0 if success, else an error code. */
Xshort ReadScreen(void)
X{
X FILE *screen;
X char *fnam;
X int y, x;
X short j, c, ret = 0;
X
X for (y = 0; y < MAXROW; y++)
X for (x = 0; x < MAXCOL; x++)
X map[y][x] = ground;
X
X fnam = malloc(strlen(SCREENPATH) + 12);
X sprintf(fnam, "%s/screen.%d", SCREENPATH, level);
X
X if ((screen = fopen(fnam, "r")) == NULL)
X ret = E_FOPENSCREEN;
X else {
X packets = savepack = rows = j = cols = 0;
X ppos.x = -1;
X ppos.y = -1;
X
X while ((ret == 0) && ((c = getc(screen)) != EOF)) {
X if (c == '\n') {
X map[rows++][j] = '\0';
X if (rows > MAXROW)
X ret = E_TOMUCHROWS;
X else {
X if (j > cols)
X cols = j;
X j = 0;
X }
X } else if ((c == player) || (c == playerstore)) {
X if (ppos.x != -1)
X ret = E_PLAYPOS1;
X else {
X ppos.x = rows;
X ppos.y = j;
X map[rows][j++] = c;
X if (j > MAXCOL)
X ret = E_TOMUCHCOLS;
X }
X } else if ((c == save) || (c == packet) ||
X (c == wall) || (c == store) ||
X (c == ground)) {
X if (c == save) {
X savepack++;
X packets++;
X }
X if (c == packet)
X packets++;
X map[rows][j++] = c;
X if (j > MAXCOL)
X ret = E_TOMUCHCOLS;
X } else
X ret = E_ILLCHAR;
X }
X fclose(screen);
X if ((ret == 0) && (ppos.x == -1))
X ret = E_PLAYPOS2;
X }
X free(fnam);
X return (ret);
X}
END_OF_FILE
if test 1494 -ne `wc -c <'xsokoban/screen.c'`; then
echo shar: \"'xsokoban/screen.c'\" unpacked with wrong size!
fi
# end of 'xsokoban/screen.c'
fi
echo shar: End of archive 6 \(of 8\).
cp /dev/null ark6isdone

Andrew Myers

unread,
Nov 3, 1994, 10:31:36 AM11/3/94
to
Submitted-by: an...@tonic.lcs.mit.edu (Andrew Myers)
Posting-number: Volume 22, Issue 140
Archive-name: xsokoban/part07

Environment: X11, game
Supersedes: xsokoban: Volume 21, Issue 98-104

#! /bin/sh


# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: xsokoban/Imakefile
# xsokoban/bitmaps/defaults/centerwall.xbm
# xsokoban/bitmaps/defaults/east_twall.xbm
# xsokoban/bitmaps/defaults/eastwall.xbm
# xsokoban/bitmaps/defaults/floor.xbm
# xsokoban/bitmaps/defaults/goal.xbm
# xsokoban/bitmaps/defaults/horizwall.xbm
# xsokoban/bitmaps/defaults/lonewall.xbm
# xsokoban/bitmaps/defaults/man.xbm
# xsokoban/bitmaps/defaults/northwall.xbm
# xsokoban/bitmaps/defaults/object.xbm
# xsokoban/bitmaps/defaults/saveman.xbm
# xsokoban/bitmaps/defaults/south_twall.xbm
# xsokoban/bitmaps/defaults/southwall.xbm
# xsokoban/bitmaps/defaults/treasure.xbm
# xsokoban/bitmaps/defaults/vertiwall.xbm
# xsokoban/bitmaps/defaults/wall.xbm
# xsokoban/bitmaps/defaults/west_twall.xbm
# xsokoban/bitmaps/defaults/westwall.xbm xsokoban/defaults.h
# xsokoban/screens/screen.10 xsokoban/screens/screen.14
# xsokoban/screens/screen.19 xsokoban/screens/screen.20
# xsokoban/screens/screen.22 xsokoban/screens/screen.23
# xsokoban/screens/screen.24 xsokoban/screens/screen.25
# xsokoban/screens/screen.28 xsokoban/screens/screen.30
# xsokoban/screens/screen.35 xsokoban/screens/screen.36
# xsokoban/screens/screen.37 xsokoban/screens/screen.39
# xsokoban/screens/screen.41 xsokoban/screens/screen.44
# xsokoban/screens/screen.50 xsokoban/screens/screen.52
# xsokoban/screens/screen.62 xsokoban/screens/screen.63
# xsokoban/screens/screen.64 xsokoban/screens/screen.66
# xsokoban/screens/screen.68 xsokoban/screens/screen.69
# xsokoban/screens/screen.70 xsokoban/screens/screen.71
# xsokoban/screens/screen.72 xsokoban/screens/screen.85
# xsokoban/screens/screen.88 xsokoban/screens/screen.89
# xsokoban/screens/screen.90
# Wrapped by chris@sparky on Thu Nov 3 09:23:53 1994


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 7 (of 8)."'
if test -f 'xsokoban/Imakefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/Imakefile'\"
else
echo shar: Extracting \"'xsokoban/Imakefile'\" \(389 characters\)
sed "s/^X//" >'xsokoban/Imakefile' <<'END_OF_FILE'
XDEFINES= -DNDEBUG
XEXTRA_INCLUDES= -I/usr/local/include
X
XSYS_LIBRARIES= -L/usr/local/lib -lXpm $(XLIB)
X# -lXpm is only needed if you are using Xpm.
X
XSRCS= display.c main.c resources.c play.c score.c screen.c \
X save.c scoredisp.c qtelnet.c
XOBJS= display.o main.o resources.o play.o score.o screen.o \
X save.o scoredisp.o qtelnet.o
X
XComplexProgramTarget(xsokoban)
X
Xinstall:: install.man
END_OF_FILE
if test 389 -ne `wc -c <'xsokoban/Imakefile'`; then
echo shar: \"'xsokoban/Imakefile'\" unpacked with wrong size!
fi
# end of 'xsokoban/Imakefile'
fi
if test -f 'xsokoban/bitmaps/defaults/centerwall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/centerwall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/centerwall.xbm'\" \(842 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/centerwall.xbm' <<'END_OF_FILE'
X#define centerwall_width 30
X#define centerwall_height 30
Xstatic char centerwall_bits[] = {
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbb, 0xff, 0x7f, 0x35,
X 0xb7, 0xff, 0x7f, 0x3a, 0xaf, 0xff, 0x7f, 0x3d, 0x9f, 0xff, 0x7f, 0x3e,
X 0x80, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,


X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0x80, 0xff, 0x7f, 0x00,
X 0x95, 0xff, 0x7f, 0x15, 0xaa, 0xff, 0x7f, 0x28, 0xb5, 0xff, 0x7f, 0x11,
X 0xba, 0xff, 0x7f, 0x22, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a};
END_OF_FILE

if test 842 -ne `wc -c <'xsokoban/bitmaps/defaults/centerwall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/centerwall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/centerwall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/east_twall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/east_twall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/east_twall.xbm'\" \(842 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/east_twall.xbm' <<'END_OF_FILE'
X#define east_twall_width 30
X#define east_twall_height 30
Xstatic char east_twall_bits[] = {


X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbb, 0xff, 0x7f, 0x05,
X 0xb7, 0xff, 0x7f, 0x0a, 0xaf, 0xff, 0x7f, 0x05, 0x9f, 0xff, 0x7f, 0x0a,
X 0x80, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05,
X 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a,
X 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05,
X 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a,
X 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05,

X 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05, 0x80, 0xff, 0x7f, 0x0a,
X 0x95, 0xff, 0x7f, 0x05, 0xaa, 0xff, 0x7f, 0x0a, 0xb5, 0xff, 0x7f, 0x05,
X 0xba, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a};
END_OF_FILE

if test 842 -ne `wc -c <'xsokoban/bitmaps/defaults/east_twall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/east_twall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/east_twall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/eastwall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/eastwall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/eastwall.xbm'\" \(836 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/eastwall.xbm' <<'END_OF_FILE'
X#define eastwall_width 30
X#define eastwall_height 30
Xstatic char eastwall_bits[] = {


X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x07,
X 0xff, 0xff, 0xff, 0x0b, 0xff, 0xff, 0xff, 0x05, 0xff, 0xff, 0xff, 0x0a,
X 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05,
X 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a,
X 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05,
X 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a,
X 0xff, 0xff, 0x7f, 0x05, 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05,

X 0xff, 0xff, 0x7f, 0x0a, 0xff, 0xff, 0x7f, 0x05, 0x00, 0x00, 0x00, 0x0a,
X 0x55, 0x55, 0x55, 0x04, 0xaa, 0xaa, 0xaa, 0x08, 0x55, 0x55, 0x55, 0x01,
X 0xaa, 0xaa, 0xaa, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
END_OF_FILE

if test 836 -ne `wc -c <'xsokoban/bitmaps/defaults/eastwall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/eastwall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/eastwall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/floor.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/floor.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/floor.xbm'\" \(827 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/floor.xbm' <<'END_OF_FILE'
X#define floor_width 30
X#define floor_height 30
Xstatic char floor_bits[] = {
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
END_OF_FILE
if test 827 -ne `wc -c <'xsokoban/bitmaps/defaults/floor.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/floor.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/floor.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/goal.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/goal.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/goal.xbm'\" \(824 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/goal.xbm' <<'END_OF_FILE'
X#define goal_width 30
X#define goal_height 30
Xstatic char goal_bits[] = {
X 0x41, 0x10, 0x04, 0x01, 0xa2, 0x28, 0x8a, 0x22, 0x14, 0x45, 0x51, 0x14,
X 0x08, 0x82, 0x20, 0x08, 0x14, 0x45, 0x51, 0x14, 0xa2, 0x28, 0x8a, 0x22,
X 0x41, 0x10, 0x04, 0x01, 0xa2, 0x28, 0x8a, 0x22, 0x14, 0x45, 0x51, 0x14,
X 0x08, 0x82, 0x20, 0x08, 0x14, 0x45, 0x51, 0x14, 0xa2, 0x28, 0x8a, 0x22,
X 0x41, 0x10, 0x04, 0x01, 0xa2, 0x28, 0x8a, 0x22, 0x14, 0x45, 0x51, 0x14,
X 0x08, 0x82, 0x20, 0x08, 0x14, 0x45, 0x51, 0x14, 0xa2, 0x28, 0x8a, 0x22,
X 0x41, 0x10, 0x04, 0x01, 0xa2, 0x28, 0x8a, 0x22, 0x14, 0x45, 0x51, 0x14,
X 0x08, 0x82, 0x20, 0x08, 0x14, 0x45, 0x51, 0x14, 0xa2, 0x28, 0x8a, 0x22,
X 0x41, 0x10, 0x04, 0x01, 0xa2, 0x28, 0x8a, 0x22, 0x14, 0x45, 0x51, 0x14,
X 0x08, 0x82, 0x20, 0x08, 0x14, 0x45, 0x51, 0x14, 0xa2, 0x28, 0x8a, 0x22};
END_OF_FILE
if test 824 -ne `wc -c <'xsokoban/bitmaps/defaults/goal.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/goal.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/goal.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/horizwall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/horizwall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/horizwall.xbm'\" \(839 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/horizwall.xbm' <<'END_OF_FILE'
X#define horizwall_width 30
X#define horizwall_height 30
Xstatic char horizwall_bits[] = {


X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,

X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00,
X 0x55, 0x55, 0x55, 0x15, 0xaa, 0xaa, 0xaa, 0x2a, 0x55, 0x55, 0x55, 0x15,
X 0xaa, 0xaa, 0xaa, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
END_OF_FILE
if test 839 -ne `wc -c <'xsokoban/bitmaps/defaults/horizwall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/horizwall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/horizwall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/lonewall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/lonewall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/lonewall.xbm'\" \(836 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/lonewall.xbm' <<'END_OF_FILE'
X#define lonewall_width 30
X#define lonewall_height 30
Xstatic char lonewall_bits[] = {
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x0f,
X 0xf4, 0xff, 0xff, 0x07, 0xec, 0xff, 0xff, 0x0b, 0xdc, 0xff, 0xff, 0x05,
X 0x3c, 0x00, 0x00, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a,
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05,
X 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a,
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05,
X 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a,
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0x3c, 0x00, 0x00, 0x04,
X 0xbc, 0xaa, 0xaa, 0x08, 0x5c, 0x55, 0x55, 0x01, 0xac, 0xaa, 0xaa, 0x02,
X 0x54, 0x55, 0x55, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
END_OF_FILE
if test 836 -ne `wc -c <'xsokoban/bitmaps/defaults/lonewall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/lonewall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/lonewall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/man.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/man.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/man.xbm'\" \(821 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/man.xbm' <<'END_OF_FILE'
X#define man_width 30
X#define man_height 30
Xstatic char man_bits[] = {
X 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x08, 0x04, 0x00,
X 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x34, 0x0b, 0x00,
X 0x00, 0x04, 0x08, 0x00, 0x00, 0xe8, 0x05, 0x00, 0x00, 0xcc, 0x0c, 0x00,
X 0x00, 0xde, 0x1e, 0x00, 0x00, 0xda, 0x16, 0x00, 0x00, 0x3a, 0x17, 0x00,
X 0x00, 0xf9, 0x27, 0x00, 0x00, 0xf9, 0x27, 0x00, 0x80, 0xf8, 0x47, 0x00,
X 0x80, 0xf8, 0x47, 0x00, 0x80, 0xf8, 0x47, 0x00, 0x00, 0xf9, 0x27, 0x00,
X 0x00, 0xf9, 0x27, 0x00, 0x00, 0xfd, 0x2f, 0x00, 0x00, 0xfe, 0x1f, 0x00,
X 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x14, 0x0a, 0x00,
X 0x00, 0x3e, 0x1f, 0x00, 0x00, 0x3f, 0x3f, 0x00, 0x80, 0x3f, 0x7f, 0x00,
X 0xc0, 0x36, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
END_OF_FILE
if test 821 -ne `wc -c <'xsokoban/bitmaps/defaults/man.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/man.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/man.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/northwall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/northwall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/northwall.xbm'\" \(839 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/northwall.xbm' <<'END_OF_FILE'
X#define northwall_width 30
X#define northwall_height 30
Xstatic char northwall_bits[] = {
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x07,
X 0xf4, 0xff, 0xff, 0x0b, 0xec, 0xff, 0xff, 0x05, 0xdc, 0xff, 0xff, 0x0a,
X 0x3c, 0x00, 0x00, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05,
X 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a,
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05,
X 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a,
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05,
X 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a,
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05,
X 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a};
END_OF_FILE
if test 839 -ne `wc -c <'xsokoban/bitmaps/defaults/northwall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/northwall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/northwall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/object.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/object.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/object.xbm'\" \(830 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/object.xbm' <<'END_OF_FILE'
X#define object_width 30
X#define object_height 30
Xstatic char object_bits[] = {
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x00,
X 0x00, 0xfc, 0x1f, 0x00, 0x00, 0x0f, 0x78, 0x00, 0x80, 0x03, 0xe0, 0x00,
X 0xc0, 0x00, 0x80, 0x01, 0x60, 0xf0, 0x01, 0x03, 0x60, 0xfc, 0x00, 0x03,
X 0x30, 0x0e, 0x00, 0x06, 0x30, 0x07, 0x00, 0x06, 0x18, 0x01, 0x00, 0x0c,
X 0x18, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x00, 0x0c,
X 0x18, 0x01, 0x00, 0x0c, 0x18, 0x01, 0x00, 0x0c, 0x18, 0x03, 0x00, 0x0c,
X 0x30, 0x07, 0x00, 0x06, 0x30, 0x0e, 0x00, 0x06, 0x60, 0x1c, 0x00, 0x03,
X 0x60, 0x78, 0x00, 0x03, 0xc0, 0xe0, 0x81, 0x01, 0x80, 0x03, 0xe0, 0x00,
X 0x00, 0x0f, 0x78, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0xf0, 0x07, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
END_OF_FILE
if test 830 -ne `wc -c <'xsokoban/bitmaps/defaults/object.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/object.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/object.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/saveman.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/saveman.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/saveman.xbm'\" \(833 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/saveman.xbm' <<'END_OF_FILE'
X#define saveman_width 30
X#define saveman_height 30
Xstatic char saveman_bits[] = {
X 0x41, 0x10, 0x04, 0x01, 0xa2, 0xf8, 0x8b, 0x22, 0x14, 0x0d, 0x54, 0x14,
X 0x08, 0x0a, 0x24, 0x08, 0x14, 0x05, 0x58, 0x14, 0xa2, 0x34, 0x8b, 0x22,
X 0x41, 0x04, 0x08, 0x01, 0xa2, 0xe8, 0x85, 0x22, 0x14, 0xcd, 0x4c, 0x14,
X 0x08, 0xde, 0x3e, 0x08, 0x14, 0xdb, 0x56, 0x14, 0xa2, 0x3a, 0x97, 0x22,
X 0x41, 0xf9, 0x27, 0x01, 0xa2, 0xf9, 0xe7, 0x22, 0x94, 0xf8, 0x47, 0x14,
X 0x88, 0xf8, 0x47, 0x08, 0x94, 0xf8, 0x47, 0x14, 0xa2, 0xf9, 0xe7, 0x22,
X 0x41, 0xf9, 0x27, 0x01, 0xa2, 0xfd, 0xaf, 0x22, 0x14, 0xfe, 0x5f, 0x14,
X 0x08, 0xfe, 0x2f, 0x08, 0x14, 0xf9, 0x57, 0x14, 0xa2, 0x14, 0x8a, 0x22,
X 0x41, 0x3e, 0x1f, 0x01, 0xa2, 0x3f, 0xbf, 0x22, 0x94, 0x7f, 0x7f, 0x14,
X 0xc8, 0xb6, 0xdb, 0x08, 0x14, 0x45, 0x41, 0x14, 0xa2, 0x28, 0x8a, 0x22};
END_OF_FILE
if test 833 -ne `wc -c <'xsokoban/bitmaps/defaults/saveman.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/saveman.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/saveman.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/south_twall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/south_twall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/south_twall.xbm'\" \(845 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/south_twall.xbm' <<'END_OF_FILE'
X#define south_twall_width 30
X#define south_twall_height 30
Xstatic char south_twall_bits[] = {
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbb, 0xff, 0x7f, 0x35,
X 0xb7, 0xff, 0x7f, 0x3a, 0xaf, 0xff, 0x7f, 0x3d, 0x9f, 0xff, 0x7f, 0x3e,
X 0x80, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,


X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,
X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f,

X 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00,
X 0x55, 0x55, 0x55, 0x15, 0xaa, 0xaa, 0xaa, 0x2a, 0x55, 0x55, 0x55, 0x15,
X 0xaa, 0xaa, 0xaa, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
END_OF_FILE
if test 845 -ne `wc -c <'xsokoban/bitmaps/defaults/south_twall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/south_twall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/south_twall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/southwall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/southwall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/southwall.xbm'\" \(839 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/southwall.xbm' <<'END_OF_FILE'
X#define southwall_width 30
X#define southwall_height 30
Xstatic char southwall_bits[] = {
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05,
X 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a,
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05,
X 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a,
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05,
X 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a,
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05,
X 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0x3c, 0x00, 0x00, 0x0a,
X 0x5c, 0x55, 0x55, 0x04, 0xac, 0xaa, 0xaa, 0x08, 0x54, 0x55, 0x55, 0x01,
X 0xa8, 0xaa, 0xaa, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
END_OF_FILE
if test 839 -ne `wc -c <'xsokoban/bitmaps/defaults/southwall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/southwall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/southwall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/treasure.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/treasure.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/treasure.xbm'\" \(836 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/treasure.xbm' <<'END_OF_FILE'
X#define treasure_width 30
X#define treasure_height 30
Xstatic char treasure_bits[] = {
X 0x41, 0x10, 0x04, 0x01, 0xa2, 0x28, 0x8a, 0x22, 0x14, 0xf5, 0x57, 0x14,
X 0x08, 0xfe, 0x3f, 0x08, 0x14, 0x8f, 0x7a, 0x14, 0xa2, 0x03, 0xc5, 0x22,
X 0xc1, 0x82, 0x8a, 0x01, 0x62, 0xf5, 0x15, 0x23, 0x74, 0xfe, 0xa8, 0x17,
X 0x38, 0x5e, 0x50, 0x0f, 0x34, 0x2f, 0xa0, 0x16, 0x1a, 0x55, 0x50, 0x2d,
X 0x39, 0xaa, 0xa8, 0x0e, 0x5a, 0x45, 0x15, 0x2d, 0xbc, 0x82, 0x0a, 0x1e,
X 0x58, 0x01, 0x05, 0x0c, 0xbc, 0x83, 0x0a, 0x1e, 0x5a, 0x47, 0x15, 0x2d,
X 0x31, 0xaf, 0xa8, 0x06, 0x32, 0x5e, 0x50, 0x27, 0x74, 0x3c, 0xa0, 0x17,
X 0x68, 0x7c, 0x50, 0x0b, 0xd4, 0xea, 0xa9, 0x15, 0xa2, 0x47, 0xf5, 0x22,
X 0x41, 0x8f, 0x7a, 0x01, 0xa2, 0xfc, 0x9f, 0x22, 0x14, 0xf5, 0x57, 0x14,
X 0x08, 0x82, 0x20, 0x08, 0x14, 0x45, 0x51, 0x14, 0xa2, 0x28, 0x8a, 0x22};
END_OF_FILE
if test 836 -ne `wc -c <'xsokoban/bitmaps/defaults/treasure.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/treasure.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/treasure.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/vertiwall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/vertiwall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/vertiwall.xbm'\" \(839 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/vertiwall.xbm' <<'END_OF_FILE'
X#define vertiwall_width 30
X#define vertiwall_height 30
Xstatic char vertiwall_bits[] = {
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05,
X 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a,
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05,
X 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a,
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05,
X 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a,
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05,
X 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a,
X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05,
X 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a};
END_OF_FILE
if test 839 -ne `wc -c <'xsokoban/bitmaps/defaults/vertiwall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/vertiwall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/vertiwall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/wall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/wall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/wall.xbm'\" \(824 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/wall.xbm' <<'END_OF_FILE'
X#define wall_width 30
X#define wall_height 30
Xstatic char wall_bits[] = {
X 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0xfa, 0xff, 0xff, 0x17,
X 0xf6, 0xff, 0xff, 0x1b, 0xee, 0xff, 0xff, 0x1d, 0xde, 0xff, 0xff, 0x16,
X 0xbe, 0x00, 0x40, 0x1b, 0x7e, 0xff, 0xbf, 0x1d, 0xbe, 0xb6, 0x6d, 0x1f,
X 0xbe, 0xdb, 0x76, 0x1b, 0xbe, 0x6d, 0x5b, 0x1d, 0xbe, 0xf6, 0x6f, 0x1f,
X 0xbe, 0xfb, 0x7f, 0x1f, 0xbe, 0xfd, 0x5f, 0x1f, 0xbe, 0xfe, 0x7f, 0x1f,
X 0xbe, 0xfb, 0x7f, 0x1f, 0xbe, 0xfd, 0x7f, 0x1f, 0xbe, 0xfe, 0x7f, 0x1f,
X 0xbe, 0xfb, 0x7f, 0x1f, 0xbe, 0xfd, 0x7f, 0x1f, 0xbe, 0xf6, 0x7f, 0x1f,
X 0xbe, 0xdb, 0x7f, 0x1f, 0x7e, 0xff, 0xbf, 0x1f, 0xbe, 0x00, 0x40, 0x1f,
X 0xde, 0xff, 0xff, 0x1e, 0x6e, 0xfb, 0xff, 0x1d, 0xb6, 0xfd, 0xff, 0x1b,
X 0xda, 0xff, 0xff, 0x17, 0xfc, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00};
END_OF_FILE
if test 824 -ne `wc -c <'xsokoban/bitmaps/defaults/wall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/wall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/wall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/west_twall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/west_twall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/west_twall.xbm'\" \(842 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/west_twall.xbm' <<'END_OF_FILE'
X#define west_twall_width 30
X#define west_twall_height 30
Xstatic char west_twall_bits[] = {


X 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a, 0xbc, 0xff, 0x7f, 0x35,
X 0xbc, 0xff, 0x7f, 0x3a, 0xbc, 0xff, 0x7f, 0x3d, 0xbc, 0xff, 0x7f, 0x3e,
X 0xbc, 0xff, 0x7f, 0x00, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,

X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0x7f, 0x00,
X 0xbc, 0xff, 0x7f, 0x15, 0xbc, 0xff, 0x7f, 0x28, 0xbc, 0xff, 0x7f, 0x11,
X 0xbc, 0xff, 0x7f, 0x22, 0xbc, 0xff, 0x7f, 0x05, 0xbc, 0xff, 0x7f, 0x0a};
END_OF_FILE

if test 842 -ne `wc -c <'xsokoban/bitmaps/defaults/west_twall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/west_twall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/west_twall.xbm'
fi
if test -f 'xsokoban/bitmaps/defaults/westwall.xbm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/bitmaps/defaults/westwall.xbm'\"
else
echo shar: Extracting \"'xsokoban/bitmaps/defaults/westwall.xbm'\" \(836 characters\)
sed "s/^X//" >'xsokoban/bitmaps/defaults/westwall.xbm' <<'END_OF_FILE'
X#define westwall_width 30
X#define westwall_height 30
Xstatic char westwall_bits[] = {


X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x3f,
X 0xf4, 0xff, 0xff, 0x3f, 0xec, 0xff, 0xff, 0x3f, 0xdc, 0xff, 0xff, 0x3f,
X 0x3c, 0x00, 0x00, 0x00, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,
X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f,

X 0xbc, 0xff, 0xff, 0x3f, 0xbc, 0xff, 0xff, 0x3f, 0x3c, 0x00, 0x00, 0x00,
X 0x5c, 0x55, 0x55, 0x15, 0xac, 0xaa, 0xaa, 0x2a, 0x54, 0x55, 0x55, 0x15,
X 0xa8, 0xaa, 0xaa, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
END_OF_FILE

if test 836 -ne `wc -c <'xsokoban/bitmaps/defaults/westwall.xbm'`; then
echo shar: \"'xsokoban/bitmaps/defaults/westwall.xbm'\" unpacked with wrong size!
fi
# end of 'xsokoban/bitmaps/defaults/westwall.xbm'
fi
if test -f 'xsokoban/defaults.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/defaults.h'\"
else
echo shar: Extracting \"'xsokoban/defaults.h'\" \(386 characters\)
sed "s/^X//" >'xsokoban/defaults.h' <<'END_OF_FILE'
X#define DEF_FONT "9x15"
X#define DEF_BITH 30
X#define DEF_BITW 30
X#define DEF_CURSOR 102
X
X#define WALLS "fancyWalls"
X#define FONT "fontName"
X#define REVERSE "reverseVideo"
X#define FOREG "foreground"
X#define BACKG "background"
X#define BORDER "borderColor"
X#define CURSOR "pointerColor"
X#define BITDIR "bitmapDir"
X#define BITH "bitmapHeight"
X#define BITW "bitmapWidth"
X#define NUM_WALLS 16
END_OF_FILE
if test 386 -ne `wc -c <'xsokoban/defaults.h'`; then
echo shar: \"'xsokoban/defaults.h'\" unpacked with wrong size!
fi
# end of 'xsokoban/defaults.h'
fi
if test -f 'xsokoban/screens/screen.10' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.10'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.10'\" \(320 characters\)
sed "s/^X//" >'xsokoban/screens/screen.10' <<'END_OF_FILE'
X ### #############
X##@#### # #
X# $$ $$ $ $ ...#
X# $$$# $ #...#
X# $ # $$ $$ #...#
X### # $ #...#
X# # $ $ $ #...#
X# ###### ###...#
X## # # $ $ #...#
X# ## # $$ $ $##..#
X# ..# # $ #.#
X# ..# # $$$ $$$ #.#
X##### # # #.#
X # ######### #.#
X # #.#
X ###############
END_OF_FILE
if test 320 -ne `wc -c <'xsokoban/screens/screen.10'`; then
echo shar: \"'xsokoban/screens/screen.10'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.10'
fi
if test -f 'xsokoban/screens/screen.14' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.14'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.14'\" \(284 characters\)
sed "s/^X//" >'xsokoban/screens/screen.14' <<'END_OF_FILE'
X #######
X ####### #
X # # $@$ #
X #$$ # #########
X # ###......## #
X # $......## # #
X # ###...... #
X## #### ### #$##
X# #$ # $ # #
X# $ $$$ # $## #
X# $ $ ###$$ # #
X##### $ # #
X ### ### # #
X # # #
X ######## #
X ####
END_OF_FILE
if test 284 -ne `wc -c <'xsokoban/screens/screen.14'`; then
echo shar: \"'xsokoban/screens/screen.14'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.14'
fi
if test -f 'xsokoban/screens/screen.19' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.19'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.19'\" \(258 characters\)
sed "s/^X//" >'xsokoban/screens/screen.19' <<'END_OF_FILE'
X ######
X # @####
X##### $ #
X# ## ####
X# $ # ## #
X# $ # ##### #
X## $ $ # #
X## $ $ ### # #
X## # $ # # #
X## # #$# # #
X## ### # # ######
X# $ #### # #....#
X# $ $ ..#.#
X####$ $# $ ....#
X# # ## ....#
X###################
END_OF_FILE
if test 258 -ne `wc -c <'xsokoban/screens/screen.19'`; then
echo shar: \"'xsokoban/screens/screen.19'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.19'
fi
if test -f 'xsokoban/screens/screen.20' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.20'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.20'\" \(303 characters\)
sed "s/^X//" >'xsokoban/screens/screen.20' <<'END_OF_FILE'
X ##########
X##### ####
X# # $ #@ #
X# #######$#### ###
X# # ## # #$ ..#
X# # $ # # #.#
X# # $ # #$ ..#
X# # ### ## #.#
X# ### # # #$ ..#
X# # # #### #.#
X# #$ $ $ #$ ..#
X# $ # $ $ # #.#
X#### $### #$ ..#
X # $$ ###....#
X # ## ######
X ########
END_OF_FILE
if test 303 -ne `wc -c <'xsokoban/screens/screen.20'`; then
echo shar: \"'xsokoban/screens/screen.20'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.20'
fi
if test -f 'xsokoban/screens/screen.22' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.22'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.22'\" \(311 characters\)
sed "s/^X//" >'xsokoban/screens/screen.22' <<'END_OF_FILE'
X###### ####
X# ####### #####
X# $# # $ # #
X# $ $ $ # $ $ #
X##$ $ # @# $ #
X# $ ########### ##
X# # #.......# $#
X# ## # ......# #
X# # $........$ #
X# # $ #.... ..# #
X# $ $####$#### $#
X# $ ### $ $ ##
X# $ $ $ $ #
X## ###### $ ##### #
X# # #
X###################
END_OF_FILE
if test 311 -ne `wc -c <'xsokoban/screens/screen.22'`; then
echo shar: \"'xsokoban/screens/screen.22'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.22'
fi
if test -f 'xsokoban/screens/screen.23' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.23'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.23'\" \(254 characters\)
sed "s/^X//" >'xsokoban/screens/screen.23' <<'END_OF_FILE'
X #######
X # # ####
X##### $#$ # ##
X#.. # # # #
X#.. # $#$ # $####
X#. # #$ # #
X#.. $# # $ #
X#..@# #$ #$ # #
X#.. # $# $# #
X#.. # #$$#$ # ##
X#.. # $# # $#$ #
X#.. # # # # #
X##. #### ##### #
X #### #### #####
END_OF_FILE
if test 254 -ne `wc -c <'xsokoban/screens/screen.23'`; then
echo shar: \"'xsokoban/screens/screen.23'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.23'
fi
if test -f 'xsokoban/screens/screen.24' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.24'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.24'\" \(306 characters\)
sed "s/^X//" >'xsokoban/screens/screen.24' <<'END_OF_FILE'
X###############
X#.......... .####
X#..........$$.# #
X###########$ # ##
X# $ $ $ #
X## #### # $ # #
X# # ## # ##
X# $# # ## ### ##
X# $ #$### ### ##
X### $ # # ### ##
X### $ ## # # ##
X # $ # $ $ $ #
X # $ $#$$$ # #
X # # $ #####
X # @## # # #
X ##############
END_OF_FILE
if test 306 -ne `wc -c <'xsokoban/screens/screen.24'`; then
echo shar: \"'xsokoban/screens/screen.24'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.24'
fi
if test -f 'xsokoban/screens/screen.25' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.25'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.25'\" \(295 characters\)
sed "s/^X//" >'xsokoban/screens/screen.25' <<'END_OF_FILE'
X####
X# ##############
X# # ..#......#
X# # # ##### ...#
X##$# ........#
X# ##$###### ####
X# $ # ######@ #
X##$ # $ ###### #
X# $ #$$$## #
X# # #$#$###
X# #### #$$$$$ #
X# # $ # #
X# # ## ###
X# ######$###### $ #
X# # # #
X########## #####
END_OF_FILE
if test 295 -ne `wc -c <'xsokoban/screens/screen.25'`; then
echo shar: \"'xsokoban/screens/screen.25'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.25'
fi
if test -f 'xsokoban/screens/screen.28' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.28'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.28'\" \(258 characters\)
sed "s/^X//" >'xsokoban/screens/screen.28' <<'END_OF_FILE'
X #####
X ##### #
X ## $ $ ####
X##### $ $ $ ##.#
X# $$ ##..#
X# ###### ###.. #
X## # # #... #
X# $ # #... #
X#@ #$ ## ####...#
X#### $ $$ ##..#
X ## $ $ $...#
X # $$ $ # .#
X # $ $ ####
X ###### #
X #####
END_OF_FILE
if test 258 -ne `wc -c <'xsokoban/screens/screen.28'`; then
echo shar: \"'xsokoban/screens/screen.28'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.28'
fi
if test -f 'xsokoban/screens/screen.30' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.30'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.30'\" \(270 characters\)
sed "s/^X//" >'xsokoban/screens/screen.30' <<'END_OF_FILE'
X ###########
X # # #
X##### # $ $ #
X# ##### $## # ##
X# $ ## # ## $ #
X# $ @$$ # ##$$$ #
X## ### # ## #
X## # ### #####$#
X## # $ #....#
X# ### ## $ #....##
X# $ $ # #..$. #
X# ## $ # ##.... #
X##### ######...##
X ##### #####
END_OF_FILE
if test 270 -ne `wc -c <'xsokoban/screens/screen.30'`; then
echo shar: \"'xsokoban/screens/screen.30'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.30'
fi
if test -f 'xsokoban/screens/screen.35' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.35'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.35'\" \(298 characters\)
sed "s/^X//" >'xsokoban/screens/screen.35' <<'END_OF_FILE'
X############ ######
X# # # ###....#
X# $$# @ .....#
X# # ### # ....#
X## ## ### # ....#
X # $ $ # # ####
X # $ $## # #
X#### # #### # ## #
X# # #$ ## # #
X# $ $ # ## # ##
X# # $ $ # # #
X# $ ## ## # #####
X# $$ $$ #
X## ## ### $ #
X # # # #
X ###### ######
END_OF_FILE
if test 298 -ne `wc -c <'xsokoban/screens/screen.35'`; then
echo shar: \"'xsokoban/screens/screen.35'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.35'
fi
if test -f 'xsokoban/screens/screen.36' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.36'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.36'\" \(289 characters\)
sed "s/^X//" >'xsokoban/screens/screen.36' <<'END_OF_FILE'
X #####
X##### ###### #
X# #### $ $ $ #
X# $ ## ## ## ##
X# $ $ $ $ #
X### $ ## ## ##
X # ##### #####$$ #
X ##$##### @## #
X # $ ###$### $ ##
X # $ # ### ###
X # $$ $ # $$ #
X # # ## #
X #######.. .###
X #.........#
X #.........#
X ###########
END_OF_FILE
if test 289 -ne `wc -c <'xsokoban/screens/screen.36'`; then
echo shar: \"'xsokoban/screens/screen.36'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.36'
fi
if test -f 'xsokoban/screens/screen.37' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.37'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.37'\" \(272 characters\)
sed "s/^X//" >'xsokoban/screens/screen.37' <<'END_OF_FILE'
X###########
X#...... #########
X#...... # ## #
X#..### $ $ #
X#... $ $ # ## #
X#...#$##### # #
X### # #$ #$ #
X # $$ $ $ $## #
X # $ #$#$ ##$ #
X ### ## # ## #
X # $ $ ## ######
X # $ $ #
X ## # # #
X #####@#####
X ###
END_OF_FILE
if test 272 -ne `wc -c <'xsokoban/screens/screen.37'`; then
echo shar: \"'xsokoban/screens/screen.37'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.37'
fi
if test -f 'xsokoban/screens/screen.39' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.39'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.39'\" \(291 characters\)
sed "s/^X//" >'xsokoban/screens/screen.39' <<'END_OF_FILE'
X ######
X #############....#
X## ## ##....#
X# $$## $ @##....#
X# $$ $# ....#
X# $ ## $$ # # ...#
X# $ ## $ # ....#
X## ##### ### ##.###
X## $ $ ## . #
X# $### # ##### ###
X# $ # #
X# $ #$ $ $### #
X# $$$# $ # ####
X# # $$ #
X###### ###
X #####
END_OF_FILE
if test 291 -ne `wc -c <'xsokoban/screens/screen.39'`; then
echo shar: \"'xsokoban/screens/screen.39'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.39'
fi
if test -f 'xsokoban/screens/screen.41' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.41'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.41'\" \(286 characters\)
sed "s/^X//" >'xsokoban/screens/screen.41' <<'END_OF_FILE'
X #####
X ## ##
X ## #
X ## $$ #
X ## $$ $ #
X # $ $ #
X#### # $$ #####
X# ######## ## #
X#. $$$@#
X#.# ####### ## ##
X#.# #######. #$ $##
X#........... # #
X############## $ #
X ## ##
X ####
END_OF_FILE
if test 286 -ne `wc -c <'xsokoban/screens/screen.41'`; then
echo shar: \"'xsokoban/screens/screen.41'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.41'
fi
if test -f 'xsokoban/screens/screen.44' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.44'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.44'\" \(258 characters\)
sed "s/^X//" >'xsokoban/screens/screen.44' <<'END_OF_FILE'
X #####
X # #
X # # #######
X # $@######
X # $ ##$ ### #
X # #### $ $ #
X # ##### # #$ ####
X## #### ##$ #
X# $# $ # ## ## #
X# # #...# #
X###### ### ... #
X #### # #...# #
X # ### # #
X # #
X #########
END_OF_FILE
if test 258 -ne `wc -c <'xsokoban/screens/screen.44'`; then
echo shar: \"'xsokoban/screens/screen.44'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.44'
fi
if test -f 'xsokoban/screens/screen.50' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.50'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.50'\" \(307 characters\)
sed "s/^X//" >'xsokoban/screens/screen.50' <<'END_OF_FILE'
X ############
X ##.. # #
X ##..* $ $ #
X ##..*.# # # $##
X #..*.# # # $ #
X####...# # # #
X# ## # #
X# @$ $ ### # ##
X# $ $ # # #
X###$$ # # # # #
X # $ # # #####
X # $# ##### #
X #$ # # # #
X # ### ## #
X # # # ##
X #### ######
END_OF_FILE
if test 307 -ne `wc -c <'xsokoban/screens/screen.50'`; then
echo shar: \"'xsokoban/screens/screen.50'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.50'
fi
if test -f 'xsokoban/screens/screen.52' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.52'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.52'\" \(318 characters\)
sed "s/^X//" >'xsokoban/screens/screen.52' <<'END_OF_FILE'
X ########
X #......#
X #### #......#
X # #########...#
X # $ $ #...#
X # # # # # # #
X##### # # #@# # #
X# # ### ### ## ##
X# $ # $ $ $ # #
X# $$$ $ # #
X# # ###$###$## #
X### # $ # #
X ## $ # $ $ $ ###
X # # ### ### ##
X # $ #
X # ###########
X ####
END_OF_FILE
if test 318 -ne `wc -c <'xsokoban/screens/screen.52'`; then
echo shar: \"'xsokoban/screens/screen.52'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.52'
fi
if test -f 'xsokoban/screens/screen.62' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.62'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.62'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.62' <<'END_OF_FILE'
X####################
X# # # # # # #
X# @# # ## $ $ ##
X#### # # # $ #
X# # ## #$ ## ## #
X# $ $ $ #
X#..###$$## $##$ ## #
X#..#.# # $ $ # #
X#....# $$ ##$ ####
X#....# ##### #
X#...### ## #
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.62'`; then
echo shar: \"'xsokoban/screens/screen.62'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.62'
fi
if test -f 'xsokoban/screens/screen.63' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.63'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.63'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.63' <<'END_OF_FILE'
X####################
X#....# # # #
X#....# # $ $ #
X#.... ## $# # $#$ #
X#...# $ $# $ #
X#..#### # $ $$ #
X# #### #### ###
X# # # #
X# ## # $ # $ $ #
X# ## $ ## $ $ #
X# @# # # #
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.63'`; then
echo shar: \"'xsokoban/screens/screen.63'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.63'
fi
if test -f 'xsokoban/screens/screen.64' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.64'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.64'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.64' <<'END_OF_FILE'
X####################
X#....### #
X#....##### # #$# ##
X#....### #$ $ #
X#....### $ #$$##
X## #### $# #$ $ #
X## #### $ $ # #
X#@ ####$###$## $ #
X## # # $ #
X## ### # $ ####
X######## # # #
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.64'`; then
echo shar: \"'xsokoban/screens/screen.64'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.64'
fi
if test -f 'xsokoban/screens/screen.66' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.66'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.66'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.66' <<'END_OF_FILE'
X####################
X# # #...#@ #
X# # ....# #
X# $ # #....# #
X# ##$#### ##....# #
X# $ $ # #...# #
X# $$ # # # $$ #
X### $$$# $$ $ #
X# $ # # # $# #
X# $# # $ #
X# # # # # #
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.66'`; then
echo shar: \"'xsokoban/screens/screen.66'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.66'
fi
if test -f 'xsokoban/screens/screen.68' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.68'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.68'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.68' <<'END_OF_FILE'
X####################
X#@ # # #
X## ### ## #### # ##
X# # # $$ #
X# # # # $ # $ ## ##
X# $ # #$$ # #
X# ### # ## ##
X#..#.# $ # $ # #
X#..#.# $ # ## $$ #
X#....## $$ $ # #
X#.....## # #
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.68'`; then
echo shar: \"'xsokoban/screens/screen.68'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.68'
fi
if test -f 'xsokoban/screens/screen.69' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.69'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.69'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.69' <<'END_OF_FILE'
X####################
X# # # # ##
X# $# $ $ ##...$ $ #
X# $ # ##....# $ #
X# ## $ ##....# $ #
X# $ #....## $ #
X# $## #...# #
X# $$$##$## ### ##
X# # # # # # #
X# $ # $ ## #
X# # #@ #
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.69'`; then
echo shar: \"'xsokoban/screens/screen.69'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.69'
fi
if test -f 'xsokoban/screens/screen.70' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.70'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.70'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.70' <<'END_OF_FILE'
X####################
X# # # # # # #
X# $ $ $ #
X## # #$###$## ## #
X# $ $ # $ #
X# ###$##$# # $ #
X# # $ $ ###### $#
X# $ $$ $ #@#.#...#
X# # # # #.#...#
X# ########## #.....#
X# #.....#
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.70'`; then
echo shar: \"'xsokoban/screens/screen.70'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.70'
fi
if test -f 'xsokoban/screens/screen.71' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.71'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.71'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.71' <<'END_OF_FILE'
X####################
X# # # ## ##
X# $# $ # ## #
X# $ $ #..# $ #
X# $ $ #....# # ##
X# $# #......### $ #
X# # #....# #$ #
X# $ ####..# # #
X## $ ## # # $ $##
X### $ $#@$ $# #
X#### # # #
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.71'`; then
echo shar: \"'xsokoban/screens/screen.71'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.71'
fi
if test -f 'xsokoban/screens/screen.72' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.72'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.72'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.72' <<'END_OF_FILE'
X####################
X# ....# ####
X# .... #
X# # ########## #
X# #$ # ###..#
X# $ #$$### #..#
X# $ ### $ $ #..#
X# $ # $ $ # ##..#
X# # $$ # $ ## ##
X#@## $# $ $ ##
X## ## # ###
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.72'`; then
echo shar: \"'xsokoban/screens/screen.72'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.72'
fi
if test -f 'xsokoban/screens/screen.85' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.85'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.85'\" \(312 characters\)
sed "s/^X//" >'xsokoban/screens/screen.85' <<'END_OF_FILE'
X############
X# # ##
X# $ $ # ######
X#### ##### #
X #.. # #### #
X #.#### #### #
X #.... # $ ####
X # ...# # $$$# ##
X###.#### ## $@$ #
X# ##### $ # #
X# #.# $ $###$ #
X# #.######## # $ #
X# #.. ## $ #
X# # ####### $ # # #
X# # # ##
X##### ##########
END_OF_FILE
if test 312 -ne `wc -c <'xsokoban/screens/screen.85'`; then
echo shar: \"'xsokoban/screens/screen.85'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.85'
fi
if test -f 'xsokoban/screens/screen.88' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.88'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.88'\" \(258 characters\)
sed "s/^X//" >'xsokoban/screens/screen.88' <<'END_OF_FILE'
X#############
X#........####
X#...#### # #####
X#...# ### $ #
X#...$$ $ $ #
X# .# $ $# $ ##
X#...# #$# $ #
X#.# # $ $ #
X#. #$###$####$#
X## # $ $ #
X # # $@$ # #
X # # #### $ $#
X # # ### #
X # # $$ # #####
X # # #
X #########
END_OF_FILE
if test 258 -ne `wc -c <'xsokoban/screens/screen.88'`; then
echo shar: \"'xsokoban/screens/screen.88'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.88'
fi
if test -f 'xsokoban/screens/screen.89' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.89'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.89'\" \(326 characters\)
sed "s/^X//" >'xsokoban/screens/screen.89' <<'END_OF_FILE'
X ##################
X # $ ...#.##
X # ####..... #
X # ####### #..... #
X # # $ $ ##....##
X # # $ # # ###...#
X # # $@$ $ ##### #
X## # $ $ $$ $ #
X# #$# $# # $## #
X# ## ## ## $ # #
X# # $# $ $ # #
X# # #######
X# ########$## #
X# # $ #
X######## #####
X ### #
X ####
END_OF_FILE
if test 326 -ne `wc -c <'xsokoban/screens/screen.89'`; then
echo shar: \"'xsokoban/screens/screen.89'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.89'
fi
if test -f 'xsokoban/screens/screen.90' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.90'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.90'\" \(337 characters\)
sed "s/^X//" >'xsokoban/screens/screen.90' <<'END_OF_FILE'
X####################
X#..# # #
X#.$ $ #$$ $## $##
X#.$# ### ## ## #
X# # $ # $$ $ #
X# ### # # #$ ####
X# ## # $ #@ # #
X# $ $ ##.## $ #
X# # $# $# $ ###
X# # # # ### #
X# ######## # #
X# # #.#.#
X##$########$# ...#
X# .* # ##.#.#
X# .*...* $ .....#
X####################
X
END_OF_FILE
if test 337 -ne `wc -c <'xsokoban/screens/screen.90'`; then
echo shar: \"'xsokoban/screens/screen.90'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.90'
fi
echo shar: End of archive 7 \(of 8\).
cp /dev/null ark7isdone

Andrew Myers

unread,
Nov 3, 1994, 10:31:46 AM11/3/94
to
Submitted-by: an...@tonic.lcs.mit.edu (Andrew Myers)
Posting-number: Volume 22, Issue 141
Archive-name: xsokoban/part08

Environment: X11, game
Supersedes: xsokoban: Volume 21, Issue 98-104

#! /bin/sh


# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: xsokoban/patchlevel.h xsokoban/screens/screen.1
# xsokoban/screens/screen.11 xsokoban/screens/screen.12
# xsokoban/screens/screen.13 xsokoban/screens/screen.15
# xsokoban/screens/screen.16 xsokoban/screens/screen.17
# xsokoban/screens/screen.18 xsokoban/screens/screen.2
# xsokoban/screens/screen.21 xsokoban/screens/screen.26
# xsokoban/screens/screen.27 xsokoban/screens/screen.29
# xsokoban/screens/screen.3 xsokoban/screens/screen.31
# xsokoban/screens/screen.32 xsokoban/screens/screen.33
# xsokoban/screens/screen.34 xsokoban/screens/screen.38
# xsokoban/screens/screen.4 xsokoban/screens/screen.40
# xsokoban/screens/screen.42 xsokoban/screens/screen.43
# xsokoban/screens/screen.45 xsokoban/screens/screen.46
# xsokoban/screens/screen.47 xsokoban/screens/screen.48
# xsokoban/screens/screen.49 xsokoban/screens/screen.5
# xsokoban/screens/screen.51 xsokoban/screens/screen.53
# xsokoban/screens/screen.54 xsokoban/screens/screen.55
# xsokoban/screens/screen.56 xsokoban/screens/screen.57
# xsokoban/screens/screen.58 xsokoban/screens/screen.59
# xsokoban/screens/screen.6 xsokoban/screens/screen.60
# xsokoban/screens/screen.61 xsokoban/screens/screen.65
# xsokoban/screens/screen.67 xsokoban/screens/screen.7
# xsokoban/screens/screen.73 xsokoban/screens/screen.74
# xsokoban/screens/screen.75 xsokoban/screens/screen.76
# xsokoban/screens/screen.77 xsokoban/screens/screen.78
# xsokoban/screens/screen.79 xsokoban/screens/screen.8
# xsokoban/screens/screen.80 xsokoban/screens/screen.81
# xsokoban/screens/screen.82 xsokoban/screens/screen.83
# xsokoban/screens/screen.84 xsokoban/screens/screen.86
# xsokoban/screens/screen.87 xsokoban/screens/screen.9
# Wrapped by chris@sparky on Thu Nov 3 09:23:55 1994


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 8 (of 8)."'
if test -f 'xsokoban/patchlevel.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/patchlevel.h'\"
else
echo shar: Extracting \"'xsokoban/patchlevel.h'\" \(51 characters\)
sed "s/^X//" >'xsokoban/patchlevel.h' <<'END_OF_FILE'
X/*
X * version tracking
X */
X
X
X#define PATCHLEVEL 13
END_OF_FILE
if test 51 -ne `wc -c <'xsokoban/patchlevel.h'`; then
echo shar: \"'xsokoban/patchlevel.h'\" unpacked with wrong size!
fi
# end of 'xsokoban/patchlevel.h'
fi
if test -f 'xsokoban/screens/screen.1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.1'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.1'\" \(164 characters\)
sed "s/^X//" >'xsokoban/screens/screen.1' <<'END_OF_FILE'


X #####
X # #

X #$ #
X ### $##
X # $ $ #


X### # ## # ######

X# # ## ##### ..#
X# $ $ ..#
X##### ### #@## ..#
X # #########
X #######
END_OF_FILE
if test 164 -ne `wc -c <'xsokoban/screens/screen.1'`; then
echo shar: \"'xsokoban/screens/screen.1'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.1'
fi
if test -f 'xsokoban/screens/screen.11' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.11'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.11'\" \(223 characters\)
sed "s/^X//" >'xsokoban/screens/screen.11' <<'END_OF_FILE'
X ####
X #### # #
X ### @###$ #
X ## $ #
X ## $ $$## ##
X # #$## #
X # # $ $$ # ###
X # $ # # $ #####
X#### # $$ # #
X#### ## $ #
X#. ### ########
X#.. ..# ####
X#...#.#
X#.....#
X#######
END_OF_FILE
if test 223 -ne `wc -c <'xsokoban/screens/screen.11'`; then
echo shar: \"'xsokoban/screens/screen.11'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.11'
fi
if test -f 'xsokoban/screens/screen.12' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.12'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.12'\" \(226 characters\)
sed "s/^X//" >'xsokoban/screens/screen.12' <<'END_OF_FILE'
X################
X# #
X# # ###### #
X# # $ $ $ $# #
X# # $@$ ## ##
X# # $ $ $###...#
X# # $ $ ##...#
X# ###$$$ $ ##...#
X# # ## ##...#
X##### ## ##...#


X ##### ###
X # #

X #######
END_OF_FILE
if test 226 -ne `wc -c <'xsokoban/screens/screen.12'`; then
echo shar: \"'xsokoban/screens/screen.12'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.12'
fi
if test -f 'xsokoban/screens/screen.13' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.13'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.13'\" \(236 characters\)
sed "s/^X//" >'xsokoban/screens/screen.13' <<'END_OF_FILE'
X #########
X ## ## #####
X### # # ###
X# $ #$ # # ... #
X# # $#@$## # #.#. #
X# # #$ # . . #
X# $ $ # # #.#. #
X# ## ##$ $ . . #
X# $ # # #$#.#. #
X## $ $ $ $... #
X #$ ###### ## #
X # # ##########
X ####
END_OF_FILE
if test 236 -ne `wc -c <'xsokoban/screens/screen.13'`; then
echo shar: \"'xsokoban/screens/screen.13'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.13'
fi
if test -f 'xsokoban/screens/screen.15' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.15'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.15'\" \(229 characters\)
sed "s/^X//" >'xsokoban/screens/screen.15' <<'END_OF_FILE'
X ########
X # # #
X # $ #
X ### #$ ####
X # $ ##$ #
X # # @ $ # $#
X # # $ ####
X ## ####$## #
X # $#.....# # #
X # $..**. $# ###
X## #.....# #
X# ### #######
X# $$ # #
X# # #
X###### #
X #####
END_OF_FILE
if test 229 -ne `wc -c <'xsokoban/screens/screen.15'`; then
echo shar: \"'xsokoban/screens/screen.15'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.15'
fi
if test -f 'xsokoban/screens/screen.16' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.16'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.16'\" \(185 characters\)
sed "s/^X//" >'xsokoban/screens/screen.16' <<'END_OF_FILE'
X#####
X# ##
X# # ####
X# $ #### #
X# $$ $ $#
X###@ #$ ##
X # ## $ $ ##
X # $ ## ## .#
X # #$##$ #.#
X ### $..##.#
X # #.*...#
X # $$ #.....#
X # #########
X # #
X ####
END_OF_FILE
if test 185 -ne `wc -c <'xsokoban/screens/screen.16'`; then
echo shar: \"'xsokoban/screens/screen.16'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.16'
fi
if test -f 'xsokoban/screens/screen.17' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.17'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.17'\" \(213 characters\)
sed "s/^X//" >'xsokoban/screens/screen.17' <<'END_OF_FILE'
X ##########
X #.. # #
X #.. #
X #.. # ####
X ####### # ##
X # #
X # # ## # #
X#### ## #### ##
X# $ ##### # #
X# # $ $ # $ #
X# @$ $ # ##
X#### ## #######
X # #
X ######
END_OF_FILE
if test 213 -ne `wc -c <'xsokoban/screens/screen.17'`; then
echo shar: \"'xsokoban/screens/screen.17'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.17'
fi
if test -f 'xsokoban/screens/screen.18' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.18'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.18'\" \(249 characters\)
sed "s/^X//" >'xsokoban/screens/screen.18' <<'END_OF_FILE'
X ###########
X # . # #
X # #. @ #
X ##### ##..# ####
X## # ..### ###
X# $ #... $ # $ #
X# .. ## ## ## #
X####$##$# $ # # #
X ## # #$ $$ # #
X # $ # # # $## #
X # #
X # ########### #
X #### ####
END_OF_FILE
if test 249 -ne `wc -c <'xsokoban/screens/screen.18'`; then
echo shar: \"'xsokoban/screens/screen.18'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.18'
fi
if test -f 'xsokoban/screens/screen.2' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.2'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.2'\" \(148 characters\)
sed "s/^X//" >'xsokoban/screens/screen.2' <<'END_OF_FILE'
X############
X#.. # ###
X#.. # $ $ #
X#.. #$#### #
X#.. @ ## #
X#.. # # $ ##
X###### ##$ $ #
X # $ $ $ $ #
X # # #
X ############
END_OF_FILE
if test 148 -ne `wc -c <'xsokoban/screens/screen.2'`; then
echo shar: \"'xsokoban/screens/screen.2'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.2'
fi
if test -f 'xsokoban/screens/screen.21' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.21'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.21'\" \(209 characters\)
sed "s/^X//" >'xsokoban/screens/screen.21' <<'END_OF_FILE'
X#########
X# #
X# ####
X## #### # #
X## #@## #
X# $$$ $ $$#
X# # ## $ #
X# # ## $ ####
X#### $$$ $# #
X # ## ....#
X # # # #.. .#
X # # # ##...#
X ##### $ #...#


X ## #####
X #####
END_OF_FILE

if test 209 -ne `wc -c <'xsokoban/screens/screen.21'`; then
echo shar: \"'xsokoban/screens/screen.21'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.21'
fi
if test -f 'xsokoban/screens/screen.26' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.26'\"


else
echo shar: Extracting \"'xsokoban/screens/screen.26'\" \(177 characters\)

sed "s/^X//" >'xsokoban/screens/screen.26' <<'END_OF_FILE'
X #######
X # # #####
X## # #...###
X# $# #... #
X# $ #$$ ... #
X# $# #... .#
X# # $########
X##$ $ $ #
X## # $$ # #
X ###### ##$$@#
X # ##
X ########
END_OF_FILE
if test 177 -ne `wc -c <'xsokoban/screens/screen.26'`; then
echo shar: \"'xsokoban/screens/screen.26'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.26'
fi
if test -f 'xsokoban/screens/screen.27' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.27'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.27'\" \(248 characters\)
sed "s/^X//" >'xsokoban/screens/screen.27' <<'END_OF_FILE'
X #################
X #... # # ##
X##..... $## # #$ #
X#......# $ # #
X#......# # # # #
X######### $ $ $ #
X # #$##$ ##$##
X ## $ # $ #
X # ## ### # ##$ #
X # $ $$ $ $ #
X # $ $##$ ######
X ####### @ ##
X ######
END_OF_FILE
if test 248 -ne `wc -c <'xsokoban/screens/screen.27'`; then
echo shar: \"'xsokoban/screens/screen.27'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.27'
fi
if test -f 'xsokoban/screens/screen.29' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.29'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.29'\" \(228 characters\)
sed "s/^X//" >'xsokoban/screens/screen.29' <<'END_OF_FILE'
X#####
X# ##
X# $ #########
X## # # ######
X## # $#$#@ # #
X# # $ # $ #
X# ### ######### ##
X# ## ..*..... # ##
X## ## *.*..*.* # ##
X# $########## ##$ #
X# $ $ $ $ #


X# # # # # #
X###################

END_OF_FILE
if test 228 -ne `wc -c <'xsokoban/screens/screen.29'`; then
echo shar: \"'xsokoban/screens/screen.29'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.29'
fi
if test -f 'xsokoban/screens/screen.3' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.3'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.3'\" \(164 characters\)
sed "s/^X//" >'xsokoban/screens/screen.3' <<'END_OF_FILE'
X ########
X # @#
X # $#$ ##
X # $ $#
X ##$ $ #
X######### $ # ###


X#.... ## $ $ #

X##... $ $ #
X#.... ##########
X########
END_OF_FILE
if test 164 -ne `wc -c <'xsokoban/screens/screen.3'`; then
echo shar: \"'xsokoban/screens/screen.3'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.3'
fi
if test -f 'xsokoban/screens/screen.31' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.31'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.31'\" \(236 characters\)
sed "s/^X//" >'xsokoban/screens/screen.31' <<'END_OF_FILE'
X ####
X # #########


X ## ## # #

X # $# $@$ ####
X #$ $ # $ $# ##
X## $## #$ $ #
X# # # # $$$ #
X# $ $ $## ####
X# $ $ #$# # #
X## ### ###$ #
X # #.... #
X ####......####
X #....####
X #...##
X #...#
X #####
END_OF_FILE
if test 236 -ne `wc -c <'xsokoban/screens/screen.31'`; then
echo shar: \"'xsokoban/screens/screen.31'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.31'
fi
if test -f 'xsokoban/screens/screen.32' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.32'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.32'\" \(189 characters\)
sed "s/^X//" >'xsokoban/screens/screen.32' <<'END_OF_FILE'
X ####
X ##### #
X ## $#
X## $ ## ###
X#@$ $ # $ #
X#### ## $#
X #....#$ $ #
X #....# $#
X #.... $$ ##
X #... # $ #
X ######$ $ #
X # ###
X #$ ###
X # #
X ####
END_OF_FILE
if test 189 -ne `wc -c <'xsokoban/screens/screen.32'`; then
echo shar: \"'xsokoban/screens/screen.32'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.32'
fi
if test -f 'xsokoban/screens/screen.33' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.33'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.33'\" \(195 characters\)
sed "s/^X//" >'xsokoban/screens/screen.33' <<'END_OF_FILE'
X############
X## ## #
X## $ $ #
X#### ## $$ #
X# $ # #
X# $$$ # ####
X# # # $ ##
X# # # $ #
X# $# $# #
X# ..# ####
X####.. $ #@#
X#.....# $# #
X##....# $ #
X###..## #
X############
END_OF_FILE
if test 195 -ne `wc -c <'xsokoban/screens/screen.33'`; then
echo shar: \"'xsokoban/screens/screen.33'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.33'
fi
if test -f 'xsokoban/screens/screen.34' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.34'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.34'\" \(203 characters\)
sed "s/^X//" >'xsokoban/screens/screen.34' <<'END_OF_FILE'
X #########
X #.... ##
X #.#.# $ ##
X##....# # @##
X# ....# # ##
X# #$ ##$ #
X## ### $ #
X #$ $ $ $# #
X # # $ $ ## #
X # ### ## #
X # ## ## ##
X # $ # $ #
X ###$ $ ###
X # #####
X ####
END_OF_FILE
if test 203 -ne `wc -c <'xsokoban/screens/screen.34'`; then
echo shar: \"'xsokoban/screens/screen.34'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.34'
fi
if test -f 'xsokoban/screens/screen.38' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.38'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.38'\" \(120 characters\)
sed "s/^X//" >'xsokoban/screens/screen.38' <<'END_OF_FILE'
X ####
X####### @#
X# $ #
X# $## $#
X##$#...# #
X # $... #
X # #. .# ##
X # # #$ #
X #$ $ #
X # #######
X ####
END_OF_FILE
if test 120 -ne `wc -c <'xsokoban/screens/screen.38'`; then
echo shar: \"'xsokoban/screens/screen.38'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.38'
fi
if test -f 'xsokoban/screens/screen.4' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.4'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.4'\" \(230 characters\)
sed "s/^X//" >'xsokoban/screens/screen.4' <<'END_OF_FILE'
X ########
X # ....#
X############ ....#
X# # $ $ ....#
X# $$$#$ $ # ....#
X# $ $ # ....#
X# $$ #$ $ $########
X# $ # #
X## #########
X# # ##
X# $ ##
X# $$#$$ @#
X# # ##
X###########
END_OF_FILE
if test 230 -ne `wc -c <'xsokoban/screens/screen.4'`; then
echo shar: \"'xsokoban/screens/screen.4'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.4'
fi
if test -f 'xsokoban/screens/screen.40' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.40'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.40'\" \(248 characters\)
sed "s/^X//" >'xsokoban/screens/screen.40' <<'END_OF_FILE'
X ############
X # ##
X # # #$$ $ #
X #$ #$# ## @#
X ## ## # $ # ##
X # $ #$ # #
X # # $ # #
X ## $ $ ## #
X # # ## $ #
X # ## $$# #
X######$$ # #
X#....# ########
X#.#... ##
X#.... #
X#.... #
X#########
END_OF_FILE
if test 248 -ne `wc -c <'xsokoban/screens/screen.40'`; then
echo shar: \"'xsokoban/screens/screen.40'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.40'
fi
if test -f 'xsokoban/screens/screen.42' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.42'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.42'\" \(233 characters\)
sed "s/^X//" >'xsokoban/screens/screen.42' <<'END_OF_FILE'
X ########
X #### ######
X # ## $ $ @#
X # ## ##$#$ $ $##
X### ......# $$ ##
X# ......# # #
X# # ......#$ $ #
X# #$...... $$# $ #
X# ### ###$ $ ##
X### $ $ $ $ #
X # $ $ $ $ #
X ###### ######
X #####
END_OF_FILE
if test 233 -ne `wc -c <'xsokoban/screens/screen.42'`; then
echo shar: \"'xsokoban/screens/screen.42'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.42'
fi
if test -f 'xsokoban/screens/screen.43' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.43'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.43'\" \(213 characters\)
sed "s/^X//" >'xsokoban/screens/screen.43' <<'END_OF_FILE'
X #######
X ##### # ####


X # # $ #

X #### #$$ ## ## #
X## # # ## ###
X# ### $#$ $ $ #
X#... # ## # #
X#...# @ # ### ##
X#...# ### $ $ #
X######## ## # #
X #########
END_OF_FILE
if test 213 -ne `wc -c <'xsokoban/screens/screen.43'`; then
echo shar: \"'xsokoban/screens/screen.43'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.43'
fi
if test -f 'xsokoban/screens/screen.45' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.45'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.45'\" \(203 characters\)
sed "s/^X//" >'xsokoban/screens/screen.45' <<'END_OF_FILE'
X##### ####
X#...# # ####
X#...### $ #
X#....## $ $###
X##....## $ #
X###... ## $ $ #
X# ## # $ #
X# ## # ### ####
X# $ # #$ $ #
X# $ @ $ $ #
X# # $ $$ $ ###
X# ###### ###
X# ## ####
X###
END_OF_FILE
if test 203 -ne `wc -c <'xsokoban/screens/screen.45'`; then
echo shar: \"'xsokoban/screens/screen.45'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.45'
fi
if test -f 'xsokoban/screens/screen.46' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.46'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.46'\" \(221 characters\)
sed "s/^X//" >'xsokoban/screens/screen.46' <<'END_OF_FILE'
X##########
X# ####
X# ###### # ##
X# # $ $ $ $ #
X# #$ #
X###$ $$# ###
X # ## # $##
X ##$# $ @#
X # $ $ ###


X # # $ #

X # ## # #

X ## ##### #
X # #
X #.......###
X #.......#
X #########
END_OF_FILE
if test 221 -ne `wc -c <'xsokoban/screens/screen.46'`; then
echo shar: \"'xsokoban/screens/screen.46'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.46'
fi
if test -f 'xsokoban/screens/screen.47' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.47'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.47'\" \(182 characters\)
sed "s/^X//" >'xsokoban/screens/screen.47' <<'END_OF_FILE'
X ####
X ######### ##
X## $ $ #####
X# ## ## ##...#
X# #$$ $ $$#$##...#
X# # @ # ...#
X# $# ###$$ ...#
X# $ $$ $ ##....#
X###$ #######
X # #######
X ####
END_OF_FILE
if test 182 -ne `wc -c <'xsokoban/screens/screen.47'`; then
echo shar: \"'xsokoban/screens/screen.47'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.47'
fi
if test -f 'xsokoban/screens/screen.48' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.48'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.48'\" \(223 characters\)
sed "s/^X//" >'xsokoban/screens/screen.48' <<'END_OF_FILE'
X #########
X #*.*#*.*#
X #.*.*.*.#
X #*.*.*.*#
X #.*.*.*.#
X #*.*.*.*#
X ### ###
X # #
X###### ######
X# #
X# $ $ $ $ $ #
X## $ $ $ $ ##
X #$ $ $ $ $#
X # $@$ #
X # ##### #
X #### ####
END_OF_FILE
if test 223 -ne `wc -c <'xsokoban/screens/screen.48'`; then
echo shar: \"'xsokoban/screens/screen.48'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.48'
fi
if test -f 'xsokoban/screens/screen.49' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.49'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.49'\" \(235 characters\)
sed "s/^X//" >'xsokoban/screens/screen.49' <<'END_OF_FILE'
X ####
X # ##
X # ##
X # $$ ##
X ###$ $ ##
X #### $ #
X### # ##### #
X# # #....$ #
X# # $ ....# #
X# $ # #.*..# #
X### #### ### #
X #### @$ ##$##
X ### $ #
X # ## #
X #########
END_OF_FILE
if test 235 -ne `wc -c <'xsokoban/screens/screen.49'`; then
echo shar: \"'xsokoban/screens/screen.49'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.49'
fi
if test -f 'xsokoban/screens/screen.5' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.5'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.5'\" \(223 characters\)
sed "s/^X//" >'xsokoban/screens/screen.5' <<'END_OF_FILE'
X #####
X # #####
X # #$## #
X # $ #
X######### ### #
X#.... ## $ $###
X#.... $ $$ ##
X#.... ##$ $ @#
X######### $ ##
X # $ $ #
X ### ## #
X # #
X ######
END_OF_FILE
if test 223 -ne `wc -c <'xsokoban/screens/screen.5'`; then
echo shar: \"'xsokoban/screens/screen.5'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.5'
fi
if test -f 'xsokoban/screens/screen.51' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.51'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.51'\" \(156 characters\)
sed "s/^X//" >'xsokoban/screens/screen.51' <<'END_OF_FILE'
X #########
X # #
X # $ $$ $#
X### # $ #
X#.# $$ ##
X#.### $ #
X#.#. $ ## ####
X#... $## $ #
X#...$ $ #
X#..###$### #@#
X#..# # ###
X#### #######
END_OF_FILE
if test 156 -ne `wc -c <'xsokoban/screens/screen.51'`; then
echo shar: \"'xsokoban/screens/screen.51'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.51'
fi
if test -f 'xsokoban/screens/screen.53' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.53'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.53'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.53' <<'END_OF_FILE'
X####################
X# ###
X# $# $ ## $ ##
X# $### # $$ ##
X#.### $ $ ## ##
X#...# # # #$ #
X#..##$$#### $ # #
X#...# $ ## ###
X#...$ ### # # #
X##.. $# ## ##@ #
X###.# #
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.53'`; then
echo shar: \"'xsokoban/screens/screen.53'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.53'
fi
if test -f 'xsokoban/screens/screen.54' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.54'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.54'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.54' <<'END_OF_FILE'
X####################
X# # # # #@#
X# $ $ $ # #
X## ###..## ### #
X# #....#$# $### #
X# $ #....# $ $ $ #
X# #....# # # $ $ #
X# ##..## #$# #
X##$## ## # #$##
X# $ $ # # #
X# # # # #
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.54'`; then
echo shar: \"'xsokoban/screens/screen.54'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.54'
fi
if test -f 'xsokoban/screens/screen.55' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.55'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.55'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.55' <<'END_OF_FILE'
X####################
X# @## # ##
X# ## $ $ ##
X# ###....# # # ###
X# #....# # # $ #
X### #...# # #
X## ##.# $ $ #
X## $ $ ### # # ###
X## $ # # $ #
X#### $ $# # # # $ #
X#### # # ##
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.55'`; then
echo shar: \"'xsokoban/screens/screen.55'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.55'
fi
if test -f 'xsokoban/screens/screen.56' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.56'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.56'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.56' <<'END_OF_FILE'
X####################
X# # ## # @###
X## $ # $### #
X##$# $ ##$# $ $ #
X# $# $ ###
X# ## $ ### #....#
X# # $# # # # #....##
X# $ $ # #....###
X##$ ### $ #....####
X# # $ ######
X# # # ######
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.56'`; then
echo shar: \"'xsokoban/screens/screen.56'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.56'
fi
if test -f 'xsokoban/screens/screen.57' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.57'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.57'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.57' <<'END_OF_FILE'
X####################
X#@ ### # # #
X# # # # $ $ #
X##### # $ $#$# #
X#.#..# ##$ $ #
X#..... $ # ##
X#..... ###$##$###
X#.#..# $ # #
X##### # #$ $ #
X##### # $ $ $ #
X##### # # # # #
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.57'`; then
echo shar: \"'xsokoban/screens/screen.57'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.57'
fi
if test -f 'xsokoban/screens/screen.58' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.58'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.58'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.58' <<'END_OF_FILE'
X####################
X##... ## # # #
X#.... $ ## #
X#....# # #$###$ #
X#...# # # #
X##.# #$ # $## #
X# # # $ $ ### $ #
X# $ $ # # ## #
X## # ## #$$# $# # #
X# # $ $ # ##
X# # # # @#
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.58'`; then
echo shar: \"'xsokoban/screens/screen.58'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.58'
fi
if test -f 'xsokoban/screens/screen.59' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.59'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.59'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.59' <<'END_OF_FILE'
X####################
X# # #@# ## #####
X# # # $ $ #####
X# # ###### $ ###
X# # #....# $$ #
X##$##$##....# #
X# #....##$##$##
X# $$ #....# #


X# $ $ # # ### #

X##### $ $ $ #
X##### # # # ##
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.59'`; then
echo shar: \"'xsokoban/screens/screen.59'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.59'
fi
if test -f 'xsokoban/screens/screen.6' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.6'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.6'\" \(142 characters\)
sed "s/^X//" >'xsokoban/screens/screen.6' <<'END_OF_FILE'
X###### ###
X#.. # ##@##
X#.. ### #
X#.. $$ #
X#.. # # $ #
X#..### # $ #
X#### $ #$ #
X # $# $ #
X # $ $ #
X # ## #
X #########
END_OF_FILE
if test 142 -ne `wc -c <'xsokoban/screens/screen.6'`; then
echo shar: \"'xsokoban/screens/screen.6'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.6'
fi
if test -f 'xsokoban/screens/screen.60' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.60'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.60'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.60' <<'END_OF_FILE'


X####################
X# # # #

X# $ ## ### ##
X##### ## $ $ #
X##..## # # $ # # #
X#.... $ ##$# ##
X#.... $##### #$##
X##..# # # # $ #
X###.# # $ $ # @#
X## $ $ # # ####
X## ###########
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.60'`; then
echo shar: \"'xsokoban/screens/screen.60'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.60'
fi
if test -f 'xsokoban/screens/screen.61' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.61'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.61'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.61' <<'END_OF_FILE'
X####################
X# ###..### #
X# $$ ###..### $@ #
X# # ##......# $ #
X# #......# $ #
X#### ###..######$ #
X# $$$ #..# # #
X# $# $ $ $$ #$ #
X# # ## $ ## # #
X# $ $ ## $ $ #


X# # ## ## # #

X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.61'`; then
echo shar: \"'xsokoban/screens/screen.61'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.61'
fi
if test -f 'xsokoban/screens/screen.65' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.65'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.65'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.65' <<'END_OF_FILE'
X####################
X# # @#...###
X# # ##...##
X# # # ##$## ## ....#
X# $ # $$$ ....#
X###$### $$ ### ##.#


X# $ # # ####

X# $ # ### # # #
X## #$## $ $$ #
X# $ ## # # # #
X# # # # #
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.65'`; then
echo shar: \"'xsokoban/screens/screen.65'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.65'
fi
if test -f 'xsokoban/screens/screen.67' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.67'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.67'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.67' <<'END_OF_FILE'
X####################
X#####@###.##...## #
X#####$ ..#...# #
X#### ......# $ #
X### $ #.....## # ##
X## $$# ##### $ $ #
X## $# $ ## $$ #
X## # # # $ $ #
X## $$ ### #$## #
X## $# $ $ $ ##


X### # # ###
X####################

END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.67'`; then
echo shar: \"'xsokoban/screens/screen.67'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.67'
fi
if test -f 'xsokoban/screens/screen.7' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.7'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.7'\" \(153 characters\)
sed "s/^X//" >'xsokoban/screens/screen.7' <<'END_OF_FILE'
X #####
X ####### ##
X## # @## $$ #
X# $ #
X# $ ### #
X### #####$###
X# $ ### ..#
X# $ $ $ ...#
X# ###...#
X# $$ # #...#
X# ### #####
X####
END_OF_FILE
if test 153 -ne `wc -c <'xsokoban/screens/screen.7'`; then
echo shar: \"'xsokoban/screens/screen.7'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.7'
fi
if test -f 'xsokoban/screens/screen.73' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.73'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.73'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.73' <<'END_OF_FILE'
X####################
X# # #@ # #
X# $$ #$$# # # ## #
X# # $ $ #$$ # #
X## # # # # # # #
X# ## # #
X# # $ # # # #
X# $ #$ # # $ #..#
X##$ # #### #...#
X# $ #....#
X# # # #.....#
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.73'`; then
echo shar: \"'xsokoban/screens/screen.73'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.73'
fi
if test -f 'xsokoban/screens/screen.74' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.74'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.74'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.74' <<'END_OF_FILE'
X####################
X# # ##### #
X## $ # #### $ #
X#### $$ #..# # #
X# $ $ ##..#### ##
X# $ ###.... $$ #
X# #$# ....# # $ #
X# # # $ ..###$# #
X# # $ #..# ## #
X# $# #### # $##
X# # # @# ##
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.74'`; then
echo shar: \"'xsokoban/screens/screen.74'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.74'
fi
if test -f 'xsokoban/screens/screen.75' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.75'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.75'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.75' <<'END_OF_FILE'
X####################
X# # # # #@#
X# $ $ # $ # #
X##$# $### # $$# #
X# # #.### #$ $ #
X# #$#....# # ### #
X# $ #.....## # #
X##$ #.#....#$$ $ #
X# ######..## # # #
X# $ $ ### #
X# # # # #
X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.75'`; then
echo shar: \"'xsokoban/screens/screen.75'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.75'
fi
if test -f 'xsokoban/screens/screen.76' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.76'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.76'\" \(252 characters\)
sed "s/^X//" >'xsokoban/screens/screen.76' <<'END_OF_FILE'
X####################
X# # # # #@## # #
X# $ #
X# ##$# ##### $ # ##
X## ##.....# # #
X##$##$#.....###$#$ #
X# # ##.....# # ##
X# $ ##..## # #
X# $ # $ $ $$$ #
X## $ $# # # $ #


X# ## # # #

X####################
END_OF_FILE
if test 252 -ne `wc -c <'xsokoban/screens/screen.76'`; then
echo shar: \"'xsokoban/screens/screen.76'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.76'
fi
if test -f 'xsokoban/screens/screen.77' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.77'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.77'\" \(182 characters\)
sed "s/^X//" >'xsokoban/screens/screen.77' <<'END_OF_FILE'
X###### #####
X# # # #
X# $ #### $ #
X# $ $ #
X# ###@###$ #
X########## ###
X#.. ## #
X#.. ##$ #
X#.. ## $ #
X#.. ## $ #
X#.. $ $ #
X### #########
X ####
END_OF_FILE
if test 182 -ne `wc -c <'xsokoban/screens/screen.77'`; then
echo shar: \"'xsokoban/screens/screen.77'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.77'
fi
if test -f 'xsokoban/screens/screen.78' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.78'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.78'\" \(232 characters\)
sed "s/^X//" >'xsokoban/screens/screen.78' <<'END_OF_FILE'


X ###########
X # #

X # $ $ #

X###### # $ ##### #
X# ##### $ ##$#
X# $ $ #
X# ## ## #
X# ##@##### ## #
X# #### # ## ##
X#....# # $ #
X#....# # #
X###### #######
END_OF_FILE
if test 232 -ne `wc -c <'xsokoban/screens/screen.78'`; then
echo shar: \"'xsokoban/screens/screen.78'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.78'
fi
if test -f 'xsokoban/screens/screen.79' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.79'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.79'\" \(200 characters\)
sed "s/^X//" >'xsokoban/screens/screen.79' <<'END_OF_FILE'
X#############
X# #
X# ### $$ #


X# # $ $ #

X# $####$######
X# $ ## #####
X# $$ $ ...#
X### ## $$# ...#
X # ## # ...#
X # # ...#
X ###@#############
X ###
END_OF_FILE
if test 200 -ne `wc -c <'xsokoban/screens/screen.79'`; then
echo shar: \"'xsokoban/screens/screen.79'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.79'
fi
if test -f 'xsokoban/screens/screen.8' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.8'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.8'\" \(226 characters\)
sed "s/^X//" >'xsokoban/screens/screen.8' <<'END_OF_FILE'
X ####
X # ###########
X # $ $ $ #
X # $# $ # $ #
X # $ $ # #


X### $# # #### #

X#@#$ $ $ ## #
X# $ #$# # #
X# $ $ $ $ #
X##### #########


X # #
X # #

X #......#
X #......#
X #......#
X ########
END_OF_FILE
if test 226 -ne `wc -c <'xsokoban/screens/screen.8'`; then
echo shar: \"'xsokoban/screens/screen.8'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.8'
fi
if test -f 'xsokoban/screens/screen.80' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.80'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.80'\" \(204 characters\)
sed "s/^X//" >'xsokoban/screens/screen.80' <<'END_OF_FILE'
X #################
X###@## ...#
X# # ...#
X# $ # ...#
X# $$ # ...#
X## $ ###$##########


X # ### $ #

X## $ $ #
X# $ # $ #
X# $ # #
X# $ # #
X# # #
X###########
END_OF_FILE
if test 204 -ne `wc -c <'xsokoban/screens/screen.80'`; then
echo shar: \"'xsokoban/screens/screen.80'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.80'
fi
if test -f 'xsokoban/screens/screen.81' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.81'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.81'\" \(244 characters\)
sed "s/^X//" >'xsokoban/screens/screen.81' <<'END_OF_FILE'
X #####
X ########## #
X # # #
X # $ $ $$ #
X # ##### ## $ #
X #$$ #$## $ #
X # ### # ##$ #
X###### ### $ $ #
X#.... ## #
X#.... ######
X#.... #
X###########@##
X ###
END_OF_FILE
if test 244 -ne `wc -c <'xsokoban/screens/screen.81'`; then
echo shar: \"'xsokoban/screens/screen.81'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.81'
fi
if test -f 'xsokoban/screens/screen.82' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.82'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.82'\" \(185 characters\)
sed "s/^X//" >'xsokoban/screens/screen.82' <<'END_OF_FILE'
X ######
X #### #
X # ## #
X # $ #
X### #### ########
X# $ $ ## ...#
X# $$ $$ ...#
X# $ $## ...#
X##@## ## ## ...#
X ### $ ########
X # $$ #
X # # #
X #########
END_OF_FILE
if test 185 -ne `wc -c <'xsokoban/screens/screen.82'`; then
echo shar: \"'xsokoban/screens/screen.82'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.82'
fi
if test -f 'xsokoban/screens/screen.83' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.83'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.83'\" \(234 characters\)
sed "s/^X//" >'xsokoban/screens/screen.83' <<'END_OF_FILE'
X####### #########


X# # # ## #

X# ### # # $ #
X# # $ ### $ #
X# $$ ##$ #
X# #### ## #
X#@############ ##
X###.. #####$ #
X #.. #### #
X #.. $$ #
X #.. #### $ #
X #.. # # #
X ######## #####
END_OF_FILE
if test 234 -ne `wc -c <'xsokoban/screens/screen.83'`; then
echo shar: \"'xsokoban/screens/screen.83'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.83'
fi
if test -f 'xsokoban/screens/screen.84' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.84'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.84'\" \(195 characters\)
sed "s/^X//" >'xsokoban/screens/screen.84' <<'END_OF_FILE'
X#######
X# ##########
X# # # ##
X# $ # $ $ #


X# $ # $ ## #

X# $$ ##$ $ #
X## # ## #######
X## # ## ...#
X# #$ ...#
X# $$ ...#
X# ##@# ...#
X################
END_OF_FILE
if test 195 -ne `wc -c <'xsokoban/screens/screen.84'`; then
echo shar: \"'xsokoban/screens/screen.84'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.84'
fi
if test -f 'xsokoban/screens/screen.86' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.86'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.86'\" \(159 characters\)
sed "s/^X//" >'xsokoban/screens/screen.86' <<'END_OF_FILE'
X################
X# #@ # #
X# # # # # $ $$#
X# #...# #$$$ #
X# ...# # $ $$##
X# ##.## # ## #
X# #... $ #
X# ## ### #######
X# # ####
X######
END_OF_FILE
if test 159 -ne `wc -c <'xsokoban/screens/screen.86'`; then
echo shar: \"'xsokoban/screens/screen.86'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.86'
fi
if test -f 'xsokoban/screens/screen.87' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.87'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.87'\" \(231 characters\)
sed "s/^X//" >'xsokoban/screens/screen.87' <<'END_OF_FILE'
X #####
X #### ## #####


X # $ ### #

X # $@$ $ $ #
X # #$######## ##
X # # $ # #
X # # $ $ # # #
X## # $# # #####
X# ## # #
X# $ # ### #
X##### ## #....#
X# $ ....#
X# #....#
X################
END_OF_FILE
if test 231 -ne `wc -c <'xsokoban/screens/screen.87'`; then
echo shar: \"'xsokoban/screens/screen.87'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.87'
fi
if test -f 'xsokoban/screens/screen.9' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xsokoban/screens/screen.9'\"
else
echo shar: Extracting \"'xsokoban/screens/screen.9'\" \(240 characters\)
sed "s/^X//" >'xsokoban/screens/screen.9' <<'END_OF_FILE'
X #######
X # ...#
X ##### ...#
X # . .#
X # ## ...#
X ## ## ...#
X ### ########
X # $$$ ##
X ##### $ $ #####
X## #$ $ # #
X#@ $ $ $ $ #
X###### $$ $ #####
X # #
X ########
END_OF_FILE
if test 240 -ne `wc -c <'xsokoban/screens/screen.9'`; then
echo shar: \"'xsokoban/screens/screen.9'\" unpacked with wrong size!
fi
# end of 'xsokoban/screens/screen.9'
fi
echo shar: End of archive 8 \(of 8\).
cp /dev/null ark8isdone

0 new messages