ftp.nice.ch/pub/next/tools/screen/backspace/Spor.NIHS.bs.tar.gz#/SporView.BackModule/sporen6.c

This is sporen6.c in view mode; [Download] [Up]

/*

		Dateiname:	SPOREN6.C
		Dateityp:	Source
		Zweck:		Spielkram
		Projekt:	SPOREN.PRJ
		Version:	2.60
		Start:		03.07.95
		Update:		14.07.95
		Autor:		Stefan Jeworowski

*/

/* Bibliotheken */

#include	<stdlib.h>
#include	<time.h>
#include	<string.h>
#include	<stdio.h>

#include	"spordefs.h"
//#include	"drawspor.h"
#include	"sporen6.h"
#include	"draw.h"

#define		NOENTRY			0L

/*
	( SP )
*/
#define REAL_MAX_SPOREN		50000
#define REALMAPMX					500
#define REALMAPMY					500
#define DIAGSY						0

/* Variablen- / Zeigerdeklarationen */

SPORE	sporen[ REAL_MAX_SPOREN ],
			*freelist[ REAL_MAX_SPOREN ],
			*map[ REALMAPMX ][ REALMAPMY ],
			*firstSp, *lastSp;

int		ende, freect, statCount, clrCount;

COORD	loctab[ 8 ] = {	{-1,-1}, { 0,-1}, { 1,-1},
						{-1, 0},          { 1, 0},
						{-1, 1}, { 0, 1}, { 1, 1}	};

int		typCount[ 4 ];
int	MAPMX,
		/* ( SP ) */
		MAPMY,
		SCRMX,		/* Anzahl Pix in X */
		MAX_SPOREN,
		DIAGHT,
		start_population,
		start_spread,
		random_kind,
		start_cloud,
		eatOne,
		hh;


/* Die Haupt-Steuer-Funktionen */

#ifdef ATARI
main()
#endif
#ifdef NeXT
	int	start_simulation()
#endif
{
	hsInit();
	hsMain();
	hsExit();

	return (0);
}


/*
	einen Simulationsschritt durchföhren ( SP )
*/
void cDoSimulation( void )
{
	if( do_sim_step() == 0 )
		init_sim();

	return;
}


/*
	ScreenSize setzen ( SP )
*/
void set_screen_size( int mapx, int mapy, int pixelx )
{

	MAPMX = mapx / 4;
	DIAGHT = mapy / 10;		
	MAPMY = ( mapy - DIAGHT ) / 4;
#ifdef DEBUG
	fprintf( stderr, "mapy:%d DIAGHT:%d\n", mapy, DIAGHT );
#endif
	SCRMX	= pixelx;

	return;
}


/*
	Parameter setzen ( SP )
	maxsporen 				-> gröût mögliche Population
	start_population 	-> Population bei Simulationsstart
	random_kind      	-> 0 = gleich viele Sporen der jeweiligen Farbe setzen
									     1 = Anzahl der Sporen der jeweiligen Frabe wörfeln
	start_spread 			-> abstand der einzelnen 'Startwolken' ( 3er Gruppen )
	start_cloud 			-> Ausdehnung der Startwolken
*/
void set_simulation_parameter( int maxsporen, int start_pop, int spread, int rnd_kind,
 			int cloud, int eat  )
{
	if( maxsporen > REAL_MAX_SPOREN )
		maxsporen = REAL_MAX_SPOREN;

	MAX_SPOREN = maxsporen;

	random_kind = rnd_kind;
	start_population = start_pop / 3;
	start_spread = spread;
	start_cloud = cloud;
	eatOne = eat;

	hh = MAX_SPOREN / DIAGHT +1;

#ifdef DEBUG
	fprintf( stderr, "ms/dh:%d\n", MAX_SPOREN / DIAGHT );
#endif

	return;
}


/*
	einen 'Sim' durchlauf durchföhren ( SP )
*/
int do_sim_step()
{
	sporenLife();
	statistik();

	return( freect );
}


/*
	Anfangssporen setzen ( SP )
*/
void init_sim()
{
	int	x,
			y,
			i;

	hsInit();

	Cls();
	sporenInit();
	varInit();

	for(i = 0 ; i < start_population; i++)
	{
		x = MAPMX / 2 + zufall( start_spread ) - start_spread / 2;
		y = MAPMY / 2 + zufall( start_spread ) - start_spread / 2;

		if( random_kind == 1 )
		{
			setSpore( x-zufall( start_cloud ), y-zufall( start_cloud ), zufall( 8 ), 
					zufall( 3 ) + 1, 100 );
			setSpore( x+zufall( start_cloud ), y+zufall( start_cloud ), zufall( 8 ), 
					zufall( 3 ) + 1, 100 );
			setSpore( x+zufall( start_cloud ), y-zufall( start_cloud ), zufall( 8 ), 
					zufall( 3 ) + 1, 100 );
		}
		else
		{
			setSpore( x-zufall( start_cloud ), y-zufall( start_cloud ), zufall(8), 1, 100 );
			setSpore( x+zufall( start_cloud ), y+zufall( start_cloud ), zufall(8), 2, 100 );
			setSpore( x+zufall( start_cloud ), y-zufall( start_cloud ), zufall(8), 3, 100 );
		}
	}

	return;
}


void hsInit(void)
{
	srand((unsigned) time(0L) % 37);
	sysInit();
}

void hsMain(void)
{
	int x, y;

	do
	{
		Cls();
		sporenInit();
		varInit();
		x = MAPMX / 2;
		y = MAPMY / 2;
		setSpore( x-zufall(5), y-zufall(5), zufall(8), 1, 100 );
		setSpore( x+zufall(5), y+zufall(5), zufall(8), 2, 100 );
		setSpore( x+zufall(5), y-zufall(5), zufall(8), 3, 100 );
		do
		{
			sporenLife();
			statistik();
			keyTest();
		}
		while ( ende == 0 && freect != 0 );
	}
	while ( !ende );
}

void hsExit(void)
{
	sysExit();
}

void hsError(int e)
{
	hsExit();
	exit(e);
}


/* Die Hilfsfunktionen */

void Cls(void)
{
	int x, y;

	tosCls();

	NextCls( MAPMX * 4, DIAGHT );

	for ( x = 0; x < MAPMX; x++ )
	{
		for ( y = 0; y < MAPMY; y++ )
		{
			map[ x ][ y ] = (SPORE *) NOENTRY;
		}
	}
}

int zufall(int wid)
{
	return rand() % wid;
}

void keyTest(void)
{
/*
	long k;

	k = tosKeyTest();						/* Abfragen, ohne warten */
/*
	if ( (int) k == 27 )	ende = 1;		/* ESC = Abbruch */
}


/*	Die Programmfunktionen */

void varInit(void)
{
	ende = 0;
	freect = 0;
	firstSp = NOENTRY;
	lastSp = NOENTRY;
	typCount[ 1 ] = 0;
	typCount[ 2 ] = 0;
	typCount[ 3 ] = 0;
	statCount = 0;
	clrCount = SCRMX / 16;
}

void sporenInit(void)
{
	int a;

	for (a = 0; a < MAX_SPOREN; a++)
	{
		sporen[ a ].mapx = 0;
		sporen[ a ].mapy = 0;
		sporen[ a ].rot = 0;
		sporen[ a ].typ = 0;
		sporen[ a ].pow = 0;
		sporen[ a ].pPrv = (SPORE *) NOENTRY;
		sporen[ a ].pNxt = (SPORE *) NOENTRY;
		freelist[ a ] = &( sporen[ a ] );
	}
	freect = 0;
}

void killSpore(SPORE *spore)
{
	SPORE *prev, *next;

	prev = spore->pPrv;
	next = spore->pNxt;
	if ( prev != NOENTRY ) prev->pNxt = next;
	if ( next != NOENTRY ) next->pPrv = prev;
	freelist[ --freect ] = spore;
	if ( spore == lastSp ) lastSp = next;
	if ( spore == firstSp ) firstSp = prev;

	map[ spore->mapx ][ spore->mapy ] = NOENTRY;
	drawSpore( spore->mapx, spore->mapy + ( DIAGHT / 4 ), 0, 0 );
	typCount[ ( int )spore->typ ]--;
}

SPORE *newSpore(void)
{
	SPORE *spore;

	if ( freect < MAX_SPOREN )
	{
		spore = freelist[ freect++ ];
	}
	else
	{
		return ( NOENTRY );
	}
	spore->pPrv = firstSp;
	spore->pNxt = NOENTRY;
	if ( firstSp != NOENTRY )
	{
		firstSp->pNxt = spore;
	}
	else
	{
		lastSp = spore;
	}
	firstSp = spore;

	return ( spore );
}

void setSpore(int x, int y, int r, int t, int p)
{
	SPORE *spore;

	spore = newSpore();
	if (spore != NOENTRY)
	{
		spore->mapx = x;
		spore->mapy = y;
		spore->rot = r;
		spore->typ = t;
		spore->pow = p;
		typCount[ t ]++;
		map[ x ][ y ] = spore;
		drawSpore( x, y + ( DIAGHT / 4 ), spore->typ, spore->pow );
	}
}

void sporenLife(void)
{
	register int x, y, r, t, p;
	SPORE *aspore, *bspore;

	int		flag = 0;

	aspore = firstSp;
	if ( aspore != NOENTRY )
	{
		do
		{
			if ( aspore->pow == 0 )
			{
				killSpore( aspore );
			}
			else
			{
				r = aspore->rot;
				r++;
				if ( r == 8 ) r = 0;
				aspore->rot = r;
				x = aspore->mapx + loctab[ r ].x;
				y = aspore->mapy + loctab[ r ].y;
				if ( x < 0 ) x = MAPMX - 1;
				else
				{
					if ( x >= MAPMX ) x = 0;
				}
				if ( y < 0 ) y = MAPMY - 1;
				else
				{
					if ( y >= MAPMY ) y = 0;
				}
				bspore = map[ x ][ y ];
				t = aspore->typ;
				if ( bspore != NOENTRY )
				{
					if( !eatOne )
					{
						if ( bspore->typ != t )
						{
							flag = 1;
						}
						else
						{
							flag = 0;
							aspore->pow--;
						}
					}
					else
					{
						t = aspore -> typ - 1;
						if ( t == 0 )
							t = 3;
						if ( bspore -> typ == t )
							flag = 1;
						else
						{
							aspore->pow--;
							
							flag = 0;
						}
					}
					if( flag )
					{
						p = aspore->pow + 30;
						bspore->pow = 0;
						if ( p > 100 ) p = 100;
						aspore->pow = p;
					}
				}
				else
				{
					p = (int) aspore->pow - 10;
					if ( p > 0 )
					{
						setSpore( x, y, r, t, p );
						aspore->pow = p;
					}
					aspore->pow--;
				}
			}
			aspore = aspore->pPrv;
		}
		while ( aspore != NOENTRY );
	}
}

void statistik(void)
{
	int x, y1, y2, y3, y12;

	x = statCount;
	y1 = typCount[ 1 ] / hh;
	y2 = typCount[ 2 ] / hh;
	y3 = typCount[ 3 ] / hh;

	y12 = y1 + y2;
	diagLine( x, DIAGSY, y1, 1 );
	diagLine( x, DIAGSY + y1, y12, 2 );
	diagLine( x, DIAGSY + y12, y12 + y3, 3 );

	statCount++;
	if ( statCount == SCRMX )
 		statCount = 0;
	diagLine( clrCount, DIAGSY, DIAGHT/* + 9*/, 0 );
	clrCount++;
	if ( clrCount == SCRMX ) 
		clrCount = 0;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.