#include "SAT.h"#include <fp.h>//original dimensions are 500 x 150#define		deptho		500#define		heighto		150#define		numdudes	4#define		kTicksPerFrame  2#define		skypat		128#define		groundpat	129#define		leftButton	0x7B#define		rightButton 0x7C#define		inputDelay	3SpritePtr ignore;short landscape[ deptho ],layering = 10,score = 0;Boolean		quit=false;pascal void HandleSprite( SpritePtr me);pascal void SetupSprite( SpritePtr me);pascal void SetupDudes( SpritePtr me );pascal void HandleDudes( SpritePtr me );pascal void NixNuke( SpritePtr me, SpritePtr him);pascal void DieDude( SpritePtr me );pascal void BoomDude( SpritePtr me );pascal void SetupSplash( SpritePtr me);void DisplayScore( void );void StopScreen( short pcID );void MakeLand( void );Boolean KeyState(short keyCode);pascal void HandleSprite (SpritePtr me){	if(KeyState(leftButton))	{			if(me->speed.h>-6)			{				if(++me->appLong>inputDelay)				{	me->speed.h -= 1; me->appLong = 0; }			}	}	if(KeyState(rightButton))	{			if(me->speed.h<6)			{				if(++me->appLong>inputDelay)				{	me->speed.h += 1; me->appLong = 0; }			}	}	//Cycle cicn's for runner's animation	if(me->speed.h!=0)	{		if(me->speed.h<0)		{			if(me->mode<136)	{me->mode = me->mode + 7; me->face = SATGetFace(me->mode);}			if(me->mode<142)	me->face = SATGetFace(++me->mode); else me->face = SATGetFace(me->mode=136);		}		else		{				if(me->mode>135)	{me->mode = me->mode - 7; me->face = SATGetFace(me->mode);}			if(me->mode<135)	me->face = SATGetFace(++me->mode); else me->face = SATGetFace(me->mode=129);		}	}	else	{		me->face = SATGetFace(1000);	}	me->position.h += me->speed.h;		if ( me->position.h+16 < deptho )		me->position.v = (gSAT.offSizeV-landscape[me->position.h+16])-32;	if (me->position.h <= 0 || me->position.h >= (gSAT.offSizeH-32))		{me->speed.h *= -1;}	if(me->position.v < 0)		me->position.v = 0;	if(me->position.v > (gSAT.offSizeV-32))		me->position.v = gSAT.offSizeV-32;}pascal void SetupSprite (SpritePtr me){	me->task = &HandleSprite;	me->mode = 1000;	me->face = SATGetFace(me->mode);	SetRect(&me->hotRect,10,0,22,32);	me->speed.h = 0;	me->layer = 10;	me->hitTask = &NixNuke;	me->appLong = 0;}pascal void SetupSplash( SpritePtr me ){	me->task = &BoomDude;	me->mode = 0;// add to splashboom cicn first id and increment to step through explosion	me->face = SATGetFace(200 + me->mode ); //See?	me->layer = -10;	me->appLong = TickCount();}pascal void SetupDudes( SpritePtr me ){	me->task = &HandleDudes;	me->face = SATGetFace(1500);	SetRect(&me->hotRect,3,0,29,32);	me->speed.h = 0;	me->layer = (layering -= 1);}pascal void BoomDude( SpritePtr me )//6min20sectrackninecd4 - spiffy sound{	me->face=SATGetFace(200+(me->mode++));	if(me->mode+1>205)		me->task = nil;}pascal void NixNuke( SpritePtr me, SpritePtr him){	SATPort	normalport;	Rect	r;	short	temp;	if(him->task = &HandleDudes)	{		if(fabs(me->speed.h + him->speed.h) >= fabs(me->speed.h) + fabs(him->speed.h) && fabs(me->speed.h)>=fabs(him->speed.h) && fabs(me->speed.h+him->speed.h)!=0)		{			ignore = SATNewSprite(0,him->position.h,him->position.v,&SetupSplash);			him->task = &DieDude;			him->mode = 1;			him->kind = 0;				score++; layering += 1;			SATGetPort(&normalport);			SATSetPortBackScreen();			SetRect(&r,StringWidth("\pCaught")+10,0,StringWidth("\pCaught")+60,15);			EraseRect(&r);			MoveTo(r.left,r.bottom-3);			SATDrawInt(score);			SATBackChanged(&r);			SATSetPort(&normalport);			ignore = SATNewSprite(-5, (temp = SATRand(gSAT.offSizeH-32)), gSAT.offSizeV-landscape[temp-16]-33, &SetupDudes); 		}		else if(fabs(me->speed.h + him->speed.h) < fabs(me->speed.h) + fabs(him->speed.h) && fabs(me->speed.h+him->speed.h)!=0 )		{			him->speed.h *= -1;			him->speed.h = him->speed.h+me->speed.h;			me->position.v = gSAT.offSizeV-landscape[(me->position.h += (me->speed.h/=3))+16]-32;		}			}}pascal void DieDude( SpritePtr me ){	if(me->position.v > -32 )	{		me->position.v -= me->mode;	me->mode *= 2;	}	else		me->task = nil;}pascal void HandleDudes( SpritePtr me ){	short temp;	if(KeyState(0x05))		ignore = SATNewSprite(-5, (temp = SATRand(gSAT.offSizeH-32)), gSAT.offSizeV-landscape[temp-16]-33, &SetupDudes); 		me->position.v = gSAT.offSizeV-landscape[me->position.h+16]-33;		if(SATRand100()<22)	{		switch(SATRand10()<6)		{			case true:				if(me->speed.h<5) me->speed.h += 1; break;			case false:				if(me->speed.h>-5) me->speed.h -= 1; break;		}	}	if(me->position.h+me->speed.h>=0 && me->position.h+32+me->speed.h<=gSAT.offSizeH)		me->position.h += me->speed.h;	else		me->position.h += (me->speed.h *= -1);	if(fabs(me->speed.h)>5)		me->speed.h -= (me->speed.h/fabs(me->speed.h));}void main(void){	long t,duration=0;	short i,temp,fID,l;	Rect	timebox,aframe,realwind;	SATPort	theport,sp;	WindowPtr	portal;	Rect	qbut;	PicHandle	qpic;	SATInitToolbox();	SATConfigure( false, kLayerSort, kKindCollision, 32 );	aframe = qd.screenBits.bounds;	SetRect(&realwind,			(aframe.right/2)-(deptho/2),			(aframe.bottom/2)-(heighto/2),			(aframe.right/2)+(deptho/2),			(aframe.bottom/2)+(heighto/2)			);	portal = NewCWindow(nil,&realwind,nil,true,dBoxProc,(WindowPtr)-1,false,0);	ShowWindow(portal);	SetPort(portal);	SetRect(&realwind,0,0,deptho,heighto);	SATCustomInit(nil,nil,&realwind,portal,nil,false,false,false,true,false);	ShowWindow(gSAT.wind.port);	SelectWindow(gSAT.wind.port);	SATRedraw();	StopScreen(true);		while(!quit)	{		HideCursor();	GetDateTime((unsigned long*) &qd.randSeed);	MakeLand();	ignore = SATNewSprite(5, gSAT.offSizeH/2-16, gSAT.offSizeV-landscape[gSAT.offSizeH/2-16]-33, &SetupSprite);	for(i=0; i<numdudes; i++ )		ignore = SATNewSprite(-5, temp = SATRand(gSAT.offSizeH-32), gSAT.offSizeV-landscape[temp-16]-33, &SetupDudes);	SATGetPort(&theport); SATSetPortBackScreen();		SetRect(&timebox,gSAT.offSizeH-StringWidth("\p3600")-10-StringWidth("\pTime Remaining:"),0,gSAT.offSizeH-StringWidth("\p3600")-10,15);	EraseRect(&timebox); MoveTo(timebox.left,timebox.bottom-3);	DrawString("\pTime Remaining:");	SATBackChanged(&timebox);	SetRect(&timebox,5,0,StringWidth("\pCaught")+5,15);	MoveTo(timebox.left,timebox.bottom-3);	DrawString("\pCaught:");	SATBackChanged(&timebox);	SetRect(&timebox,gSAT.offSizeH-5-StringWidth("\p3600"),0,gSAT.offSizeH-5,15);	MoveTo(timebox.left,timebox.bottom-3);	DrawString("\p3600");	SATBackChanged(&timebox);		SATSetPort(&theport);//	SetRect(&timebox,gSAT.offSizeH-5-StringWidth("\p3600"),0,gSAT.offSizeH-5,15);	do	{			t = TickCount();		SATRun(true);		while ((TickCount () - t) < kTicksPerFrame);		duration += kTicksPerFrame;		if( remainder(duration,10) == 0)		{			SATGetPort(&theport); SATSetPortBackScreen();			if(3600-duration<=600)				ForeColor(redColor);			EraseRect(&timebox); MoveTo(timebox.left,timebox.bottom-3);			SATDrawLong(3600-duration);			SATBackChanged(&timebox);			ForeColor(blackColor);			SATSetPort(&theport);		}		if(GetOSEvent(mDownMask,nil))		{				ShowCursor();			StopScreen(false); 			if(quit)			{				Alert(128,NULL);				ExitToShell();			}			HideCursor();		}			} while ( duration <= 3600 );//3600	DisplayScore();	//Here you hafta nuke the environment to start over	SATKillSprite(ignore);	SATKill();	SetRect(&realwind,0,0,deptho,heighto);	SATCustomInit(nil,nil,&realwind,portal,nil,false,false,false,true,false);	ShowWindow(gSAT.wind.port);	SelectWindow(gSAT.wind.port);	SATRedraw();	duration = 0;	score = 0;	ShowCursor();	StopScreen(true);	}		ShowCursor();	Alert(128,NULL);	ExitToShell();}void DisplayScore( void ){	SATPort	saveport,oldport;	Rect eraser;	SATPatHandle	dp;	Str255	temp;	short	fID;	Rect	s1;	PicHandle	sp1;	Boolean	flicker=true;	long t;	SATGetPort(&saveport); oldport = saveport; SATSetPort(&saveport);	SetRect(&eraser,0,0,deptho,heighto);	PaintRect(&eraser);	ForeColor(redColor);	GetFNum("\pChicago",&fID);	TextFont(fID);	SetRect(&s1,(gSAT.offSizeH/2)-250,((gSAT.offSizeV)/2)-75,(gSAT.offSizeH/2)+250,((gSAT.offSizeV)/2)+75);	sp1 = GetPicture(200);	DrawPicture(sp1,&s1);	TextSize(48);	NumToString((long)score,temp);	MoveTo((gSAT.offSizeH/2)-(StringWidth(temp)/2),(gSAT.offSizeV/2)+20);	//DrawString(temp);	SATDrawInt(score);	t = TickCount();	while(!GetOSEvent(mDownMask,nil))	{			if( remainder((TickCount()-t),10) == 0)		{			if(flicker)				{ForeColor(greenColor); flicker = !flicker; }			else				{ForeColor(redColor); flicker = !flicker; }						MoveTo((gSAT.offSizeH/2)-(StringWidth(temp)/2),(gSAT.offSizeV/2)+20);				SATDrawInt(score);		}	}	ForeColor(blackColor);	SATSetPort(&saveport);}void StopScreen( short pcID ){	SATPort		saveport,oldport;	Rect		eraser,qbut,abut,pbut,splashrect;	EventRecord	erk;	Boolean		latch = true;	char		temp;	PicHandle	qpic,apic,ppic,splashpic,infopic;	Point		whereat;	ControlRef	myfirstcontrol;	short 		infoID = 600;	long		pcpic;	SATGetPort(&saveport); oldport = saveport; SATSetPort(&saveport);	SetRect(&eraser,0,0,deptho,heighto);	PaintRect(&eraser);	SetRect(&qbut,gSAT.offSizeH-36,gSAT.offSizeV-19,gSAT.offSizeH-5,gSAT.offSizeV-5);	qpic = GetPicture(1004);	DrawPicture(qpic,&qbut);	SetRect(&abut,5,gSAT.offSizeV-19,46,gSAT.offSizeV-8);	apic = GetPicture(1000);	DrawPicture(apic,&abut);			SetRect(&pbut,(gSAT.offSizeH/2)-16,gSAT.offSizeV-19,(gSAT.offSizeH/2)+17,gSAT.offSizeV-5);//Don't know about this...	if(pcID)		ppic = GetPicture((pcpic = 1002));	else 		ppic = GetPicture((pcpic = 2000));	DrawPicture(ppic,&pbut);	SetRect(&splashrect,(gSAT.offSizeH/2)-250,((gSAT.offSizeV-20)/2)-65,(gSAT.offSizeH/2)+250,((gSAT.offSizeV-20)/2)+65);	splashpic = GetPicture(500);	DrawPicture(splashpic,&splashrect);	infopic = GetPicture(infoID);	while(latch)	{		if(GetOSEvent(everyEvent,&erk))		{			switch(erk.what)			{				case mouseDown:					whereat = erk.where;	GlobalToLocal(&whereat);					if(PtInRect(whereat,&qbut))					{							DrawPicture((qpic = GetPicture(1005)),&qbut);						quit = true;						latch = false;					}					if(PtInRect(whereat,&abut))					{						DrawPicture((apic = GetPicture(1001)),&abut);						while(infoID<603)						{						DrawPicture(infopic,&splashrect);						while(!GetOSEvent(mDownMask,nil))							;						infopic = GetPicture(++infoID);						}						infopic = GetPicture((infoID=600));						DrawPicture(splashpic,&splashrect);						DrawPicture((apic = GetPicture(1000)),&abut);					}					if(PtInRect(whereat,&pbut))					{						DrawPicture((ppic = GetPicture(pcpic+1)),&pbut);						latch = false;					}					break;			}		}	}	SATSetPort(&oldport);if(!quit)	SATRedraw();}void MakeLand( void ){	short	i,yL,temp1;	SATPort	saveport;	Rect	screenr;	SATPatHandle	dapattern;	RGBColor	thecolor;	yL = SATRand(gSAT.offSizeV/4);	for(i=0;i<deptho;i++)	{		if(SATRand10()>6)		{			if(yL+1<heighto-33)				landscape[i] = (yL+=1);			else				landscape[i] = yL;		}		else		{			landscape[i] = yL;			if(SATRand100()<31 && yL-1>=0)	landscape[i] = (yL -= 1);		}	}		SATGetPort(&saveport);	SATSetPortBackScreen();	SetRect(&screenr,0,0,gSAT.offSizeH,gSAT.offSizeV);	dapattern = SATGetPat(skypat);	SATBackPat(dapattern);	EraseRect(&screenr);	dapattern = SATGetPat(groundpat);	SATPenPat(dapattern);			for ( i = 0; i < deptho; i++ )	{		MoveTo(i,gSAT.offSizeV-landscape[i]);			LineTo(i,gSAT.offSizeV);	}	SATDisposePat(dapattern);	GetForeColor(&thecolor);		for (i = 0; i<deptho; i++)	{		SetCPixel(i,gSAT.offSizeV-landscape[i],&thecolor);	}	SATBackChanged(&screenr);	SATSetPort(&saveport);}Boolean KeyState(short keyCode){	unsigned char	ourKeyMap[16];	long			keyMapIndex;	Boolean			isKeyPressed;	short			bitToCheck;	GetKeys((unsigned long*)ourKeyMap);		keyMapIndex = ourKeyMap[keyCode/8];	bitToCheck = keyCode % 8;	isKeyPressed = (keyMapIndex >> bitToCheck) & 0x01;	return isKeyPressed;}