v07i081: Whales and Plankton, part 08/13
Brandon S. Allbery - comp.sources.misc
allbery at uunet.UU.NET
Wed Jul 19 11:40:53 AEST 1989
Posting-number: Volume 7, Issue 81
Submitted-by: loy at gtx.UUCP (Bob Loy)
Archive-name: whpl/part08
# whpl08of13.shar
#---cut here---cut here---cut here---cut here---cut here---
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files.
# This archive created: Sat Jan 14 04:04:49 MST 1989
export PATH; PATH=/bin:$PATH
echo shar: extracting "'whpl.c2'" '(28498 characters)'
if test -f 'whpl.c2'
then
echo shar: will not over-write existing file "'whpl.c2'"
else
sed 's/^X//' << \SHAR_EOF > 'whpl.c2'
X
X/*---------------------------------------------------------------------------*
X Top-level Declaration - includes, defines, externs & globals.
X*----------------------------------------------------------------------------*/
X
X#include "whpl.h"
X
X /* EXTERNS FROM */
X /* Functions From libraries: */
X extern void qsort();
X extern char *calloc(), *realloc();
X
X /* Functions From rando.c: */
X extern short nextrand();
X extern long randout();
X extern long randsize();
X
X /* Functions From whio.c: */
X extern void kidsout();
X
X /* Functions From whx.c: */
X extern void finish();
X
X
X /* EXTERNS TO */
X /* Functions To whio.c: */
X int qlohi();
X
X /* Variables To whio.c: */
X char ingentyp[7] = INGENTYP; /* Init for whales' hunt, feed, count,
X and any other genetypes */
X short endexwarn = FALSE; /* Warning of .enrec overflow */
X
X /* Functions To whx.c: */
X void whaleload();
X void countwhales();
X void clearlocarr();
X void plankplace();
X int countplank();
X void plankgrow();
X void plankgrow();
X int whaleplace();
X void whaledie();
X void mate();
X
X /* Variables To whx.c: */
X FILE *whin; /* Pointer to whale input file */
X char whinfile[40]; /* Holds name of whale in-file */
X char whinstr[99]; /* For lines read from whale in-file */
X Uint hgpcflg = HGPERCHR; /* Maximum hunt genes per chromosome */
X Uint fgpcflg = FGPERCHR; /* Maximum feed genes per chromosome */
X Uchar *secarr; /* Scratch array for locarr, below*/
X
X /* Variables To Everywhere: */
X int debug = 5; /* Debug level from 0 - 9; 9 prints all */
X Uint daterun = DATRUN; /* ID stamp for whales & filenames */
X Uchar *locarr; /* Main location array covering the planet
X "Wa-Tor" */
X Uint area = AREA; /* Overall size of "Wa-Tor" */
X Uint vbias = VBIAS; /* Horizontal width of "Wa-Tor" (should
X divide area evenly) */
X whale_type *whale; /* Start of main array of whale structs */
X Uint whale_size = sizeof(whale_type); /* Whale struct size */
X Uint numwh = NUMWH; /* Number of current whales in array
X pointed to by *whale */
X Uint truwh = NUMWH; /* Number of current live whales */
X Uint malwh; /* Number of current live males */
X Uint femwh; /* Number of current live females */
X int year = 0; /* Holds num of mate cycles in run */
X int dielim = DIELIM; /* Compared to whale.die; how many times
X whales can be below the death percen-
X tile cut-off and get away with it */
X
X /* GLOBALS */
X static int mom, pop, baby; /* Used in mate routines */
X static Ushort noclone; /* Used in mate routines */
X static short collisions = 0; /* Check for too many recursive
X collision() calls */
X
X/*---------------------------------------------------------------------------*
X@
X@@ int qhilo(two int pointers) - Compare function for qsort().
X@ return: As required by qsort()
X@ caller: femsort(), allsort()
X@ proc : This function has qsort() leave highest values in lowest
X@ array spots
X@
X@*---------------------------------------------------------------------------*/
X
Xint
Xqhilo(ptr1, ptr2)
X int *ptr1, *ptr2;
X{
X if (*ptr1 < *ptr2)
X return(1);
X else if (*ptr1 > *ptr2)
X return(-1);
X else
X return(0);
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ int qlohi(two int pointers) - Compare function for qsort().
X@ return: As required by qsort()
X@ caller: quiklist(), lastuff()
X@ proc : This function has qsort() leave lowest values in lowest
X@ array spots
X@
X@*---------------------------------------------------------------------------*/
X
Xint
Xqlohi(ptr1, ptr2)
X int *ptr1, *ptr2;
X{
X if (*ptr1 > *ptr2)
X return(1);
X else if (*ptr1 < *ptr2)
X return(-1);
X else
X return(0);
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ int testloc(limit) - For debugging; tests writing past area limits.
X@ return: 0 if passed value is within limits
X@ -1 if passed value is beyond array bounds, lower or higher
X@ caller: none in ver 1.10
X@
X@*---------------------------------------------------------------------------*/
X
Xint
Xtestloc(n)
X int n;
X{
X if ((n < 0) || (n >= area))
X return(-1);
X return(0);
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ void quiklist() - Outputs list used for debugging.
X@ input : Whole whale list
X@ output: Same format as "whs*" stat files
X@ caller: none in ver 1.10
X@ calls : whaleout(), qlohi(); qsort(), calloc(), may call finish()
X@
X@*---------------------------------------------------------------------------*/
X
Xvoid
Xquiklist()
X{
X register int j;
X energarr *enerlist;
X
X enerlist = (energarr *) calloc((numwh), (sizeof(energarr)));
X if (enerlist == NULL)
X {
X if (debug >= 2)
X fprintf(stderr, "\nquiklist(): enerlist calloc problems.\n");
X finish(8);
X }
X for (j = 0; j < numwh; j++)
X {
X enerlist[j].ener = whale[j].energy;
X enerlist[j].whal = j;
X }
X qsort((char*)enerlist, (numwh), sizeof(energarr), qlohi);
X fprintf(stdout, "\n");
X fprintf(stdout,
X " energy, ansave, orat, age, die, whale\n");
X for (j = numwh - 1; j >= 0; j--)
X {
X fprintf(stdout, " %7d %7d %5d %3d %3d ",
X enerlist[j].ener,
X whale[enerlist[j].whal].ancesave,
X whale[enerlist[j].whal].offratio,
X whale[enerlist[j].whal].age,
X whale[enerlist[j].whal].die);
X whaleout(enerlist[j].whal, stdout, 1);
X }
X fprintf(stderr, "\n");
X fprintf(stderr,
X " energy, ansave, orat, age, die, whale\n");
X for (j = numwh - 1; j >= 0; j--)
X {
X fprintf(stderr, " %7d %7d %5d %3d %3d ",
X enerlist[j].ener,
X whale[enerlist[j].whal].ancesave,
X whale[enerlist[j].whal].offratio,
X whale[enerlist[j].whal].age,
X whale[enerlist[j].whal].die);
X whaleout(enerlist[j].whal, stderr, 1);
X }
X free((char*) enerlist);
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ Ushort geneval() - Returns value of countgene or extragene.
X@ input : Unsigned char from 'a' thru 'z'
X@ caller: Uncalled in version 1.10
X@ return: Unsigned short from 0 thru 25
X@
X@*---------------------------------------------------------------------------*/
X
XUshort
Xgeneval(ugene)
X Uchar ugene;
X{
X Ushort gv;
X
X if (ugene < 'a' || ugene > 'z')
X {
X if (debug >= 2)
X fprintf(stderr, "geneval(): bad char passed: %c\n", ugene);
X }
X if (ugene == 'z') /* 'z' equals value of zero */
X ugene = '`';
X ugene -= '`';
X gv = (Ushort) ugene;
X return(gv);
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ int boundstest(index) - Coerces values to be within area limits.
X@ caller: attract(), collision(), movewhale(), plankgrow1(), plankgrow2()
X@ return: proper value of passed parameter
X@
X@*---------------------------------------------------------------------------*/
X
Xint
Xboundstest(n)
X register int n;
X{
X if (n < 0)
X n = n + area;
X if (n >= area)
X n = n - area;
X return(n);
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ void clearlocarr() - Clears locarr[area], the array covering "Wa-Tor".
X@ output: Fills locarr[] with ascii spaces
X@ caller: main()
X@ proc : Yeah, I cheated and used a single-dimensional array rather than
X@ a 2-D array, as it is somewhat simpler to deal with (constant
X@ vbias is used to section off the rows within the 1-D array).
X@ This introduces a very slight bias into the top-bottom & left-
X@ right contiguities of the Wa-Tor grid, as a whale always
X@ swimming horizontally will eventually spiral across the whole
X@ face of the planet, while one swimming vertically will stay
X@ stuck in one track.
X@ I've never worried about it; if anyone wants to rewrite whpl
X@ using a 2-D array, I'm all for it!
X@
X@ Note : Be sure vbias divides evenly into area to create a true rectangle
X@
X@*---------------------------------------------------------------------------*/
X
Xvoid
Xclearlocarr()
X{
X register int j;
X
X for (j = 0; j < area; j++)
X locarr[j] = ' ';
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ void loadsecarr(fill) - Fills secarr[area], scratch array for locarr[].
X@ output: Fills secarr[] with ascii value of passed parameter
X@ caller: mate(), plankgrow(), plankplace()
X@ proc : See proc comment for clearlocarr()
X@
X@ Note : See Note in clearlocarr()
X@
X@*---------------------------------------------------------------------------*/
X
Xvoid
Xloadsecarr(fill)
X register char fill;
X{
X register int j;
X
X for (j = 0; j < area; j++)
X secarr[j] = fill;
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ int countplank() - Counts the plankton in the locarr[] array.
X@ caller: finish(), interim(), whaledie(), look(), mate(), plankcall(),
X@ main()
X@ return: The count
X@
X@*---------------------------------------------------------------------------*/
X
Xint
Xcountplank()
X{
X register int j;
X register int k = 0;
X
X for (j = 0; j < area; j++)
X {
X if (locarr[j] == '.')
X k++;
X }
X return(k);
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ void plankplace(density, resolution [and speed] ) - Inits plankton.
X@ input : locarr[] array, maybe secarr[]
X@ output: Randomly seeded plankton in locarr[area]
X@ caller: main()
X@ calls : loadsecarr(), nextrand() or randout()
X@ proc : Fast version (passed parm resolution = 0) makes use of fastest,
X@ six-bit random number function nextrand()
X@ Slower version (passed parm resolution = 1) can seed with
X@ sparser density, down to one part in 4096
X@
X@*---------------------------------------------------------------------------*/
X
Xvoid
Xplankplace(dens, resol)
X int dens, resol;
X{
X register int j;
X Ushort chomp;
X
X switch(resol)
X {
X /* For density of X part in 64: */
X case 0 :
X for (j = 0; j < area; j++)
X {
X chomp = nextrand();
X if (chomp < dens)
X locarr[j] = '.';
X }
X break;
X /* For density of X part in 4096: */
X case 1 :
X loadsecarr(' ');
X for (j = 0; j < area; j++)
X {
X chomp = (Ushort)(randout() & 0xFFF);
X if (chomp < dens)
X secarr[j] = '.';
X }
X for (j = 0; j < area; j++)
X {
X if (secarr[j] == '.')
X locarr[j] = '.';
X }
X break;
X default:
X if (debug >= 2)
X fprintf(stderr, "\n plankplace(): case: default\n");
X break;
X }
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ void plankgrow2() - One possible plankton growth function.
X@ input : locarr[] and secarr[] arrays
X@ output: Increased plankton count in locarr[]
X@ caller: plankgrow(), which chooses which plankgrowX() function is called
X@ calls : nextrand(), boundstest()
X@ proc : "Fuzzy" growth function; each plankton "pixel" found in locarr[]
X@ randomly spawns another one two pixels away
X@
X@*---------------------------------------------------------------------------*/
X
Xvoid
Xplankgrow2()
X{
X register int j, n;
X short nibl;
X
X for (j = 0; j < area; j++)
X {
X if (locarr[j] == '.')
X {
X nibl = nextrand() & 0xF;
X switch(nibl)
X {
X case 0 :
X n = (j - 2*vbias) - 2*HBIAS;
X break;
X case 1 :
X n = (j - vbias) - 2*HBIAS;
X break;
X case 2 :
X n = (j - 2*vbias);
X break;
X case 3 :
X n = (j - 2*vbias) - HBIAS;
X break;
X case 4 :
X n = (j - 2*vbias) + 2*HBIAS;
X break;
X case 5 :
X n = (j - 2*vbias) + HBIAS;
X break;
X case 6 :
X n = (j + 2*HBIAS);
X break;
X case 7 :
X n = (j + 2*HBIAS) - vbias;
X break;
X case 8 :
X n = (j + 2*vbias) + 2*HBIAS;
X break;
X case 9 :
X n = (j + vbias) + 2*HBIAS;
X break;
X case 10 :
X n = (j + 2*vbias);
X break;
X case 11 :
X n = (j + 2*vbias) + HBIAS;
X break;
X case 12 :
X n = (j + 2*vbias) - 2*HBIAS;
X break;
X case 13 :
X n = (j + 2*vbias) - HBIAS;
X break;
X case 14 :
X n = (j - 2*HBIAS);
X break;
X case 15 :
X n = (j - 2*HBIAS) + vbias;
X break;
X default:
X if (debug >= 2)
X fprintf(stderr, "\n plankgrow2(): case: default\n");
X break;
X }
X n = boundstest(n);
X secarr[n] = '.';
X }
X }
X for (j = 0; j < area; j++)
X {
X if (secarr[j] == '.')
X locarr[j] = '.';
X }
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ void plankgrow1() - One possible plankton growth function.
X@ input : locarr[] and secarr[] arrays
X@ output: Increased plankton count in locarr[]
X@ caller: plankgrow(), which chooses which plankgrowX() function is called
X@ calls : nextrand(), boundstest()
X@ proc : "Sharp" growth function; each plankton "pixel" found in locarr[]
X@ randomly spawns another one in a neighboring pixel
X@
X@*---------------------------------------------------------------------------*/
X
Xvoid
Xplankgrow1()
X{
X register int j, n;
X short nibl;
X
X for (j = 0; j < area; j++)
X {
X if (locarr[j] == '.')
X {
X nibl = nextrand() & 0x7;
X switch(nibl)
X {
X case 0 :
X n = (j - vbias) - HBIAS;
X break;
X case 1 :
X n = (j - vbias);
X break;
X case 2 :
X n = (j - vbias) + HBIAS;
X break;
X case 3 :
X n = (j + HBIAS);
X break;
X case 4 :
X n = (j + vbias) + HBIAS;
X break;
X case 5 :
X n = (j + vbias);
X break;
X case 6 :
X n = (j + vbias) - HBIAS;
X break;
X case 7 :
X n = (j - HBIAS);
X break;
X default:
X if (debug >= 2)
X fprintf(stderr, "\n plankgrow1(): case: default\n");
X break;
X }
X n = boundstest(n);
X secarr[n] = '.';
X }
X }
X for (j = 0; j < area; j++)
X {
X if (secarr[j] == '.')
X locarr[j] = '.';
X }
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ void plankgrow(switch) - Chooses which plankgrowX() function is called.
X@ caller: plankcall(), main()
X@ calls : One of 4 possible plankton growth functions
X@ (only two implemented as of version 1.10:
X@ plankgrow1(), plankgrow2())
X@ proc : Loads secarr[] array with ascii blanks prior using the passed
X@ parameter to select which function to call
X@
X@*---------------------------------------------------------------------------*/
X
Xvoid
Xplankgrow(swit)
X int swit;
X{
X loadsecarr(' ');
X swit = swit & 0x3;
X switch(swit)
X {
X case 0 :
X if (debug >= 2)
X fprintf(stderr, "\n pg(sw): no case 0 yet \n");
X break;
X case 1 :
X plankgrow1();
X break;
X case 2 :
X plankgrow2();
X break;
X case 3 :
X if (debug >= 2)
X fprintf(stderr, "\n plankgrow(sw): no case 3 yet \n");
X break;
X default:
X if (debug >= 2)
X fprintf(stderr, "\n plankgrow(sw): case: default\n");
X break;
X }
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ void countwhales() - Counts live whales of both sexes.
X@ input : Whole whale list
X@ output: Updates malwh and femwh
X@ caller: whaledie(), mate(), interim(), finish(), main()
X@
X@*---------------------------------------------------------------------------*/
X
Xvoid
Xcountwhales()
X{
X register int j;
X
X malwh = 0;
X femwh = 0;
X for (j = 0; j < numwh; j++)
X {
X if (whale[j].sex == 'M' && whale[j].energy > 9999)
X malwh++;
X else if (whale[j].sex == 'F' && whale[j].energy > 9999)
X femwh++;
X }
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ int whaleplace() - Randomly assigns locarr[] locations to whales.
X@ return: Random location
X@ caller: whaleload(), mate(), main()
X@ calls : randsize()
X@
X@*---------------------------------------------------------------------------*/
X
Xint
Xwhaleplace()
X{
X register Uint slice;
X
X do{
X slice = (Uint)randsize(area);
X } while (slice > area);
X return(slice);
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ void whaleload(whale, how) - Fills whale structures.
X@ input : Reads in some info not used in program, for completeness
X@ output: Filled structure for given whale, dependent on 'how' flag passed
X@ Tests and may reset global flags hgpcflg & fgpcflg
X@ caller: mate(), whaleinit()
X@ calls : whaleplace(), randout()
X@ proc : May create new whales, fill them from file read, or generate
X@ them during mating, based on passed 'how' flag
X@
X@*---------------------------------------------------------------------------*/
X
Xvoid
Xwhaleload(j, how)
X register int j;
X short how;
X{
X register int k;
X static char blankgns[7] = " ";
X
X if (how == 1) /* Init by reading from file */
X {
X Uint selfd;
X Uint selfg;
X Uint selfm;
X char genes[7];
X char die[2];
X char sex[2];
X int age;
X int ofr;
X int rtg;
X int erec[20];
X short edex;
X short hg[16];
X short fg[16];
X int lsr;
X short df[20];
X short tl[20];
X short rk[20];
X int asav;
X short amax;
X short amin;
X Uint fathd;
X Uint fathg;
X Uint fathm;
X char fgns[7];
X Uint mothd;
X Uint mothg;
X Uint mothm;
X char mgns[7];
X short chidex;
X short alchldn;
X Uint ofd[50];
X Uint ofg[50];
X Uint ofm[50];
X char ogns[50][7];
X char cgns[7];
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%*s%u%u%u%s",
X &selfd, &selfg, &selfm, genes);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%s%s%d%d%d", die, sex, &age, &ofr, &rtg);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd",
X &hg[0],&hg[1],&hg[2],&hg[3],&hg[4],&hg[5],&hg[6],&hg[7],
X &hg[8],&hg[9],&hg[10],&hg[11],&hg[12],&hg[13],&hg[14],&hg[15]);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd",
X &fg[0],&fg[1],&fg[2],&fg[3],&fg[4],&fg[5],&fg[6],&fg[7],
X &fg[8],&fg[9],&fg[10],&fg[11],&fg[12],&fg[13],&fg[14],&fg[15]);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%*s%hd", &edex);
X for (k = 0; k < edex; k++)
X {
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%d", &erec[k]);
X }
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%*s%d", &lsr);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd",
X &df[0],&tl[0],&rk[0], &df[1],&tl[1],&rk[1],
X &df[2],&tl[2],&rk[2], &df[3],&tl[3],&rk[3]);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd",
X &df[4],&tl[4],&rk[4], &df[5],&tl[5],&rk[5],
X &df[6],&tl[6],&rk[6], &df[7],&tl[7],&rk[7]);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd",
X &df[8],&tl[8],&rk[8], &df[9],&tl[9],&rk[9],
X &df[10],&tl[10],&rk[10], &df[11],&tl[11],&rk[11]);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd",
X &df[12],&tl[12],&rk[12], &df[13],&tl[13],&rk[13],
X &df[14],&tl[14],&rk[14], &df[15],&tl[15],&rk[15]);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd",
X &df[16],&tl[16],&rk[16], &df[17],&tl[17],&rk[17],
X &df[18],&tl[18],&rk[18], &df[19],&tl[19],&rk[19]);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%*s%d%hd%hd", &asav, &amax, &amin);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%u%u%u%s", &fathd, &fathg, &fathm, fgns);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%u%u%u%s", &mothd, &mothg, &mothm, mgns);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%*s%hd%hd", &chidex, &alchldn);
X for (k = 0; k < chidex; k++)
X {
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%u%u%u%s", &ofd[k], &ofg[k], &ofm[k], cgns);
X strncpy(&ogns[k][0], cgns, 7);
X }
X /* Begin assigning input to whale[j]: */
X for (k = 0; k < 20; k++)
X {
X if (k < edex)
X whale[j].enrec[k] = erec[k];
X else
X whale[j].enrec[k] = 0;
X }
X if (edex == 20)
X {
X if (debug >= 2)
X {
X fprintf(stderr,
X "\nwhaleload(): wh[%d].enrec array is FULL\n", j);
X fprintf(stderr, " *** WILL OVERWRITE IN PROGRAM ***\n");
X }
X edex = 19;
X endexwarn++;
X }
X whale[j].endex = edex;
X whale[j].age = age;
X whale[j].sex = sex[0];
X for (k = 0; k < 20; k++)
X {
X whale[j].comp[k].diff = df[k];
X whale[j].comp[k].totl = tl[k];
X whale[j].comp[k].rank = rk[k];
X }
X whale[j].ancesave = asav;
X whale[j].ancesmax = amax;
X whale[j].ancesmin = amin;
X whale[j].father.datrun = fathd;
X whale[j].father.gennum = fathg;
X whale[j].father.mutate = fathm;
X strncpy(whale[j].father.gns, fgns, 7);
X whale[j].mother.datrun = mothd;
X whale[j].mother.gennum = mothg;
X whale[j].mother.mutate = mothm;
X strncpy(whale[j].mother.gns, mgns, 7);
X whale[j].self.datrun = selfd;
X whale[j].self.gennum = selfg;
X whale[j].self.mutate = selfm;
X strncpy(whale[j].self.gns, genes, 7);
X if (chidex == 49)
X {
X if (debug >= 2)
X {
X fprintf(stderr,
X "\nwhaleload(): wh[%d].offspr array is FULL\n", j);
X fprintf(stderr, " *** MAY WRAP AROUND IN PROGRAM ***\n");
X }
X }
X for (k = 0; k < 50; k++)
X {
X if (k < chidex)
X {
X whale[j].offspr[k].datrun = ofd[k];
X whale[j].offspr[k].gennum = ofg[k];
X whale[j].offspr[k].mutate = ofm[k];
X strncpy(whale[j].offspr[k].gns, &ogns[k][0], 7);
X }
X else
X {
X whale[j].offspr[k].datrun = 0;
X whale[j].offspr[k].gennum = 0;
X whale[j].offspr[k].mutate = 0;
X strncpy(whale[j].offspr[k].gns, blankgns, 7);
X }
X }
X whale[j].childex = chidex;
X whale[j].allchldn = alchldn;
X whale[j].hunttype = genes[0];
X whale[j].hgperchr = genes[1];
X whale[j].feedtype = genes[2];
X whale[j].fgperchr = genes[3];
X for (k = 0; k < 16; k++)
X whale[j].huntgene[k] = hg[k];
X for (k = 0; k < 16; k++)
X whale[j].feedgene[k] = fg[k];
X /* Force to "zero" in whpl.c version 1.10: ----*/
X whale[j].countgene = 'z';
X whale[j].extragene = 'z';
X/*------- Otherwise... ---------------
X whale[j].countgene = genes[4];
X whale[j].extragene = genes[5];
X--------------------------------------*/
X }
X if (how == 0) /* Init as newly created whales */
X {
X if (j % 2)
X whale[j].sex = 'M';
X else
X whale[j].sex = 'F';
X whale[j].father.datrun = 0;
X whale[j].father.gennum = 0;
X whale[j].father.mutate = 0;
X strncpy(whale[j].father.gns, blankgns, 7);
X whale[j].mother.datrun = 0;
X whale[j].mother.gennum = 0;
X whale[j].mother.mutate = 0;
X strncpy(whale[j].mother.gns, blankgns, 7);
X whale[j].hunttype = ingentyp[0];
X whale[j].hgperchr = ingentyp[1];
X whale[j].feedtype = ingentyp[2];
X whale[j].fgperchr = ingentyp[3];
X /* Force to "zero" in whpl.c version 1.10: ----*/
X ingentyp[4] = 'z';
X ingentyp[5] = 'z';
X strncpy(whale[j].self.gns, ingentyp, 7);
X if (whale[j].hgperchr != '0')
X {
X for (k = 0; k < 16; k++)
X whale[j].huntgene[k] = randout() & 0x3F;
X }
X else
X {
X for (k = 0; k < 16; k++)
X whale[j].huntgene[k] = -1;
X }
X if (whale[j].fgperchr != '0')
X {
X for (k = 0; k < 16; k++)
X whale[j].feedgene[k] = randout() & 0x3F;
X }
X else
X {
X for (k = 0; k < 16; k++)
X whale[j].feedgene[k] = -1;
X }
X }
X if (how == 0 || how == 2) /* Init as newly created or as babies */
X {
X for (k = 0; k < 20; k++)
X {
X whale[j].enrec[k] = 0;
X }
X whale[j].endex = 0;
X whale[j].age = 0;
X whale[j].self.datrun = daterun;
X whale[j].self.gennum = GENNUM + 10000 * year + j;
X whale[j].self.mutate = 1000000000;
X for (k = 0; k < 20; k++)
X {
X whale[j].comp[k].diff = 0;
X whale[j].comp[k].totl = 0;
X whale[j].comp[k].rank = 0;
X }
X whale[j].ancesave = 0;
X whale[j].ancesmax = 0;
X whale[j].ancesmin = 0;
X for (k = 0; k < 50; k++)
X {
X whale[j].offspr[k].datrun = 0;
X whale[j].offspr[k].gennum = 0;
X whale[j].offspr[k].mutate = 0;
X strncpy(whale[j].offspr[k].gns, blankgns, 7);
X }
X whale[j].childex = 0;
X whale[j].allchldn = 0;
X /* Force to "zero" in whpl.c version 1.10: ----*/
X whale[j].countgene = 'z';
X whale[j].extragene = 'z';
X/*------- Otherwise... ---------------
X whale[j].countgene = ingentyp[4];
X whale[j].extragene = ingentyp[5];
X--------------------------------------*/
X }
X whale[j].sortfield = 0;
X whale[j].energy = 1000000;
X whale[j].die = 0;
X whale[j].offratio = 0;
X whale[j].rating = 0;
X whale[j].lastrat = 0;
X whale[j].huntdex = 0;
X whale[j].feeddex = 0;
X whale[j].lastfed = 1000000;
X whale[j].huntfeed = 'H';
X whale[j].locatn = whaleplace();
X if (hgpcflg < whale[j].hgperchr - '0')
X hgpcflg = whale[j].hgperchr - '0';
X if (fgpcflg < whale[j].fgperchr - '0')
X fgpcflg = whale[j].fgperchr - '0';
X}
SHAR_EOF
if test 28498 -ne "`wc -c < 'whpl.c2'`"
then
echo shar: error transmitting "'whpl.c2'" '(should have been 28498 characters)'
fi
fi # end of overwriting check
# End of shell archive
exit 0
---
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
Bob Loy | Life is the detour you take on the
...!sun!sunburn!gtx!loy | way to where you're really going.
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
More information about the Comp.sources.misc
mailing list