Thread View: rec.games.programmer
1 messages
1 total messages
Started by Kent Paul Dolan
Thu, 18 Apr 1991 03:50
townmaze part 03/04
Author: Kent Paul Dolan
Date: Thu, 18 Apr 1991 03:50
Date: Thu, 18 Apr 1991 03:50
322 lines
10989 bytes
10989 bytes
Archive-name: townmaze/part03
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 3 (of 4)."
# Contents: makestreet.c
# Wrapped by xanthian@zorch on Wed Apr 17 20:34:41 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'makestreet.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'makestreet.c'\"
else
echo shar: Extracting \"'makestreet.c'\" \(8837 characters\)
sed "s/^X//" >'makestreet.c' <<'END_OF_FILE'
X/*
X** makestreet.c Copyright 1991 Kent Paul Dolan,
X** Mountain View, CA, USA 94039-0755
X**
X** Written to satisfy an inquiry on USENet's rec.games.programmer newsgroup.
X** May be freely used or modified in any non-commercial work. Copyrighted
X** only to prevent patenting by someone else.
X*/
X
X#include <stdio.h>
X#include "townmaze.h"
X#include "townproto.h"
X
X#ifdef __STDC__
Xint makestreet(int chosencell,int streetid,int streetpoints)
X#else
Xint makestreet(chosencell,streetid,streetpoints)
X int chosencell,streetid, streetpoints;
X#endif
X{
X
X int choseni, chosenj;
X int nhbrid, nextnhbrid, thirdnhbrid;
X int streetwalk, highstreetnum, lowstreetnum;
X int canstraighten;
X
X/*
X** Check that a street isn't going in next to an unused cell; if it is,
X** mark it dead, instead if it's live; in any case, refuse to do it.
X*/
X
X for (nhbrid = 0; nhbrid < 4; nhbrid++)
X {
X if (nhbrexists(chosencell,nhbrid))
X if (statlist[nhbris(chosencell,nhbrid)].status == UNUSED)
X {
X if (statlist[chosencell].status == LIVE)
X movefromto(&live,&livect,&dead,&deadct,DEAD,chosencell);
X return(1==0);
X }
X }
X
X/*
X** Check for and abide by straightness control
X*/
X
X if ((mazestraightness > 0) && (streetpoints == -1))
X if ((RANDOM()%1000) < mazestraightness)
X {
X canstraighten = (1==0);
X for (nhbrid = 0; nhbrid < 4; nhbrid++)
X if (nhbrexists(chosencell,nhbrid))
X if (statlist[nhbris(chosencell,nhbrid)].streetdir ==
X ((nhbrid+2)%4))
X canstraighten = (1==1);
X if (!canstraighten) return(1==0);
X }
X/*
X** Update the chosen cell in the status list
X*/
X switch (statlist[chosencell].status)
X {
X case UNUSED:
X case STREET:
X fprintf(stderr,"error picking street; bad cell status %d\n",
X statlist[chosencell].status);
X freespace();
X exit(1);
X break;
X
X case LIVE:
X/* fprintf(stderr,"moving cell %d from live to street\n",chosencell); */
X movefromto(&live,&livect,&street,&streetct,STREET,chosencell);
X break;
X
X case DEAD:
X/* fprintf(stderr,"moving cell %d from dead to street\n",chosencell); */
X movefromto(&dead,&deadct,&street,&streetct,STREET,chosencell);
X break;
X
X case ISOLATED:
X/* fprintf(stderr,"moving cell %d from isolated to street\n",chosencell);*/
X movefromto(&isolated,&isolatedct,&street,&streetct,STREET,chosencell);
X break;
X
X default:
X fprintf(stderr,"unexpected chosencell status in makegates %d\n",
X statlist[chosencell].status);
X }
X
X/*
X** Give the street the required streetid, either new or continuing an
X** existing street.
X*/
X
X statlist[chosencell].streetnum = streetid;
X
X/*
X** Update the chosen cell on the map.
X*/
X
X choseni = chosencell / (mazewidth/2);
X chosenj = chosencell % (mazewidth/2);
X
X choseni = 2 * choseni + 1;
X chosenj = 2 * chosenj + 1;
X
X cmaze[choseni - 1][chosenj] = HDOOR;
X cmaze[choseni][chosenj + 1] = VDOOR;
X cmaze[choseni + 1][chosenj] = HDOOR;
X cmaze[choseni][chosenj - 1] = VDOOR;
X
X/*
X** Update the neighbors of the new street cell;
X*/
X
X for (nhbrid = 0; nhbrid < 4; nhbrid++)
X {
X if (nhbrexists(chosencell,nhbrid))
X switch (statlist[nhbris(chosencell,nhbrid)].status)
X {
X case UNUSED:
X fprintf(stderr,
X "logic error; tried to put a street beside an unused cell\n");
X showdebugmaze();
X freespace();
X exit(1);
X break;
X case STREET:
X switch (nhbrid) /* change the door to a passage, adopt a continuing */
X { /* direction from a neighbor street */
X case 0:
X cmaze[choseni - 1][chosenj] = BLANK;
X if (statlist[nhbris(chosencell,nhbrid)].streetdir == 2)
X statlist[chosencell].streetdir = 2;
X break;
X case 1:
X cmaze[choseni][chosenj + 1] = BLANK;
X if (statlist[nhbris(chosencell,nhbrid)].streetdir == 3)
X statlist[chosencell].streetdir = 3;
X break;
X case 2:
X cmaze[choseni + 1][chosenj] = BLANK;
X if (statlist[nhbris(chosencell,nhbrid)].streetdir == 0)
X statlist[chosencell].streetdir = 0;
X break;
X case 3:
X cmaze[choseni][chosenj - 1] = BLANK;
X if (statlist[nhbris(chosencell,nhbrid)].streetdir == 1)
X statlist[chosencell].streetdir = 1;
X break;
X default:
X fprintf(stderr,"bad nhbrid in nhbr update street switch case\n");
X /* The above should be impossible; nhbrexists and nhbris already */
X /* both checked for this problem */
X showdebugmaze();
X freespace();
X exit(1);
X }
X
X if (statlist[chosencell].streetnum !=
X statlist[nhbris(chosencell,nhbrid)].streetnum)
X {
X
X/*
X** Two different streets have met; merge their streetids and decrement the
X** streetcount.
X*/
X
X lowstreetnum =
X ( ( statlist[chosencell].streetnum >
X statlist[nhbris(chosencell,nhbrid)].streetnum )
X ? statlist[nhbris(chosencell,nhbrid)].streetnum
X : statlist[chosencell].streetnum
X );
X highstreetnum =
X ( ( statlist[chosencell].streetnum <
X statlist[nhbris(chosencell,nhbrid)].streetnum )
X ? statlist[nhbris(chosencell,nhbrid)].streetnum
X : statlist[chosencell].streetnum
X );
X
X streetwalk = street;
X while (streetwalk != NOPOINTER)
X {
X if (statlist[streetwalk].streetnum == highstreetnum)
X statlist[streetwalk].streetnum = lowstreetnum;
X streetwalk = statlist[streetwalk].next;
X }
X streetnumct--;
X }
X break;
X case DEAD: /* do nothing; that's why it's called dead */
X break;
X case LIVE:
X movefromto(&live,&livect,&dead,&deadct,DEAD,nhbris(chosencell,nhbrid));
X for (nextnhbrid = 0; nextnhbrid < 4; nextnhbrid++)
X if (nhbrexists(nhbris(chosencell,nhbrid),nextnhbrid))
X if (statlist[nhbris(nhbris(chosencell,nhbrid),nextnhbrid)].status
X == ISOLATED)
X {
X movefromto(&dead,&deadct,&live,&livect,LIVE,
X nhbris(chosencell,nhbrid));
X break;
X }
X break;
X case ISOLATED:
X movefromto(&isolated,&isolatedct,&dead,&deadct,DEAD,
X nhbris(chosencell,nhbrid));
X statlist[nhbris(chosencell,nhbrid)].status = DEAD;
X/*
X** Only let an isolated cell become live if it is interior; stops
X** streets from running along the city wall, creating lots of gates.
X*/
X if (interiorcell(nhbris(chosencell,nhbrid)))
X for (nextnhbrid = 0; nextnhbrid < 4; nextnhbrid++)
X if (nhbrexists(nhbris(chosencell,nhbrid),nextnhbrid))
X if (statlist[nhbris(nhbris(chosencell,nhbrid),nextnhbrid)].status
X == ISOLATED)
X {
X movefromto(&dead,&deadct,&live,&livect,LIVE,
X nhbris(chosencell,nhbrid));
X break;
X }
X/*
X** When an isolated cell stops being so, neighbors may stop being live
X** that were depending on it for that status; we're not done!
X*/
X for (nextnhbrid = 0; nextnhbrid < 4; nextnhbrid++)
X if (nhbrexists(nhbris(chosencell,nhbrid),nextnhbrid))
X if (statlist[nhbris(nhbris(chosencell,nhbrid),nextnhbrid)].status
X == LIVE)
X {
X movefromto(&live,&livect,&dead,&deadct,DEAD,
X nhbris(nhbris(chosencell,nhbrid),nextnhbrid));
X for (thirdnhbrid =0; thirdnhbrid <4; thirdnhbrid++)
X {
X if (nhbrexists(nhbris(nhbris(chosencell,
X nhbrid),
X nextnhbrid),
X thirdnhbrid))
X if (statlist[nhbris(nhbris(nhbris(chosencell,
X nhbrid),
X nextnhbrid),
X thirdnhbrid)].status
X == ISOLATED)
X {
X movefromto(&dead,&deadct,&live,&livect,LIVE,
X nhbris(nhbris(chosencell,nhbrid),nextnhbrid));
X break;
X }
X }
X }
X break;
X default:
X fprintf(stderr,"bad statlist[%d].status entry %d\n",
X nhbris(chosencell,nhbrid),
X statlist[nhbris(chosencell,nhbrid)].status);
X showdebugmaze();
X freespace();
X exit(1);
X }
X }
X if (statlist[chosencell].streetdir == -1)
X if (streetpoints != -1)
X statlist[chosencell].streetdir = streetpoints;
X else
X {
X for (nhbrid = 0; nhbrid < 4; nhbrid++)
X {
X if (nhbrexists(chosencell,nhbrid))
X if (statlist[nhbris(chosencell,nhbrid)].status == STREET)
X {
X statlist[chosencell].streetdir = ((nhbrid +2)%4);
X break;
X }
X }
X }
X/* showdebugmaze(); */
X return(1==1);
X}
END_OF_FILE
if test 8837 -ne `wc -c <'makestreet.c'`; then
echo shar: \"'makestreet.c'\" unpacked with wrong size!
fi
# end of 'makestreet.c'
fi
echo shar: End of archive 3 \(of 4\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 4 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 4 archives.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads