/*
If you ever need to use this code, please do.
but,let me know how useful it was.
mail to :p_mdriyaz@hotmail.com

coded by:Da.MoRz

ver 1.0
*/

#include 
#include 
#include 
#include 
#include 
#include 
#include 

void calc(int);
void car(int,int,int);
void check();
void crash();
void divider();
void finishline();
void gameover();
void gameovercheck();
 int getkey();
void grass();
void help();
void lamps();
void mainscreen();
void printdet();
void road();
void redlife();
void setgraph();
void setimages();
void treest(int,int);
void winner();

void interrupt (*old)();
void interrupt new();

int min=1,sec=30;

int loop,loop1,
    maxx,maxy,
    midx,midy,
    locx,locy,
    movx,movy;

int nos,key,loop,set,setcomp,che,speed=200,life=2;

void *timage[10], *imgcar, *imgcare, *fin;

unsigned long unit=0;

struct
{
	int insert[5];
	int sw[5];
	int vx[5],vy[5];
	int sp[5];

}data[20];

unsigned far *head=(unsigned far *)0x41a;
unsigned far *tail=(unsigned far *)0x41c;

void main()
{
	struct palettetype p1;

	randomize();

	mainscreen();

	setgraph();

	set=0;setcomp=0;

	getpalette(&p1);
	setrgbpalette(p1.colors[13],8,8,8);
	setrgbpalette(p1.colors[12],0,15,0);
	setrgbpalette(p1.colors[10],0,27,0);

	setimages();

	old=getvect(0x08);
	setvect(0x08,new);

	gotoxy(14,1);
	printf("\'H\'=Help");

	putimage(486,0,imgcar,0);
	putimage(506,0,imgcar,0);

	while(1)
	{
		unit++;

		if(!(unit%100))
		{
			for(loop1=setcomp;loop1<=set;loop1++)
			{
				che=0;
				for(loop=0;loop<5;loop++)
				{
					if(data[loop1].sw[loop]==0)
						che++;
				}

			if(che==5)
				setcomp++;
			}
			set++;
		}

		for(loop=0;loop<5;loop++)
			if(data[set].insert[loop]==unit)
				data[set].sw[loop]=1;

		gotoxy(53,1);
		printf("%2dm:%2ds",min,sec);

		gotoxy(70,1);
		if(speed<55) printf("MAX");
		else         printf("   ");

		gotoxy(75,1);
		if(speed<40) printf("NOS");
		else         printf("   ");

		road();
		lamps();
		divider();
		if(unit>=1400)
			finishline();
		check();
		car(movx,movy,4);

		if(kbhit())
		{
			key=getkey();
			calc(key);
		}
		else
		{
			speed+=3;

			gotoxy(75,1);
			printf("   ");

			if(speed>200)
			{
				speed=200;
				gotoxy(1,1);
				printf("Speed :%3d",0);

				nosound();
				key=0;

				while(key!=72)
				{
					while(!kbhit())
					{
						gotoxy(53,1);
						printf("%2dm:%2ds",min,sec);
						check();
					}
					key=getkey();
					if(key==1)
						gameovercheck();
					if(key==35)
						help();
				}
				calc(key);
			}
		}

		gotoxy(1,1);
		printf("Speed :%3d",200-speed);

		sound(150+(200-speed));
		delay(speed);
	}
}

void calc(int kp)
{
	if(kp==1)
		gameovercheck();
	nos=0;

	if(kp==72) speed-=5;
	else if(kp==80) speed+=10;
	else if(kp==57) {speed=0;nos=1;}
	else if(kp==75) movx-=5;
	else if(kp==77) movx+=5;
	else if(kp==35) help();

	crash();

	if(speed<50 && !nos) speed=50;

	if(speed>200)
	{
		speed=200;
		gotoxy(1,1);
		printf("Speed :%3d",0);
		nosound();

		key=0;
		while(key!=72)
		{
			while(!kbhit())
			{
				gotoxy(53,1);
				printf("%2dm:%2ds",min,sec);
				check();
			}

			key=getkey();

			if(key==1)
				gameovercheck();

			if(key==35)
				help();
		}
	}
}

void car(int x,int y,int c)
{
	int poly[6];

	if(locx!=x)
	{
		setfillstyle(1,BLACK);
		bar(locx-7,locy-10,locx+7,locy+10);
	}

	setcolor(c);
	setfillstyle(1,c);

	line(x-4,y-6,x+4,y-6);
	bar(x-7,y+8,x+7,y+10);

	poly[0]=x-4;
	poly[1]=y+8;

	poly[2]=x+4;
	poly[3]=y+8;

	poly[4]=x;
	poly[5]=y-10;

	fillpoly(3,poly);

	setfillstyle(1,DARKGRAY);

	bar(x-5,y-8,x-4,y-4);
	bar(x+4,y-8,x+5,y-4);

	bar(x-6,y+4,x-5,y+8);
	bar(x+5,y+4,x+6,y+8);

	locx=x;
	locy=y;
}

void check()
{
	for(loop1=setcomp;loop1<=set;loop1++)
	{
		for(loop=0;loop<5;loop++)
		{
			if(data[loop1].sw[loop]==1)
			{
				setfillstyle(1,BLACK);

				bar(data[loop1].vx[loop],data[loop1].vy[loop],data[loop1].vx[loop]+14,data[loop1].vy[loop]+20);

				che=(200-speed)-(data[loop1].sp[loop]);
				data[loop1].vy[loop]+=(che/3);

				if(data[loop1].vy[loop]>479 || data[loop1].vy[loop]<20)
					data[loop1].sw[loop]=0;
				else
				{
					putimage(data[loop1].vx[loop],data[loop1].vy[loop],imgcare,0);

					if(((data[loop1].vy[loop]<=midy-10 && data[loop1].vy[loop]+20>midy-10) ||
					    (data[loop1].vy[loop]<=midy+10 && data[loop1].vy[loop]+20>midy+10))&&
					   ((data[loop1].vx[loop]<=movx-7 && data[loop1].vx[loop]+14>movx-7) ||
					    (data[loop1].vx[loop]<=movx+7 && data[loop1].vx[loop]+14>movx+7)))
						redlife();
				}
			}
		}
	}
}

void crash()
{
	if(movx<=midx-80 || movx>=midx+80)
		redlife();
}

void divider()
{
	static int dy=21;

	setfillstyle(1,BLACK);
	bar(midx-5,20,midx+5,maxy);

	setfillstyle(1,WHITE);

	if(dy<=71)
		bar(midx-3,21,midx+3,dy);
	else
		bar(midx-3,dy-50,midx+3,(dy-50)+50);

	for(loop=dy+50;loop(midy-10))
		winner();
	fy+=10;
}

void gameover()
{
	setvect(0x08,old);

	sound(900);
	delay(400);
	sound(700);
	delay(300);
	sound(850);
	delay(450);
	sound(900);
	delay(550);
	nosound();
	delay(200);
	sound(900);
	delay(400);
	sound(700);
	delay(300);
	sound(740);
	delay(450);
	sound(650);
	delay(550);
	nosound();

	gotoxy(36,16);
	printf("GAME OVER");
	gotoxy(32,17);
	printf("PRESS ESC TO QUIT");

	key=0;
	while(key!=1)
	{
		while(!kbhit());
		key=getkey();
	}
	closegraph();
	printf("Visit http://www.geocities.com/ecma_ver1 for updated versions.");
	printdet();
	exit(0);
}

void gameovercheck()
{
	nosound();

	setfillstyle(1,BLACK);

	gotoxy(33,16);
	printf("QUIT GAME(Y/N)?");

	key=0;
	while(key!=49)
	{
		while(!kbhit());
		key=getkey();
		if(key==21)
		{
			bar(midx-80,midy-20,midx+80,midy+20);
			gameover();
		}
	}
	bar(midx-80,midy-20,midx+80,midy+20);
}

int getkey()
{
	union REGS i,o;
	i.h.ah=0;
	int86(22,&i,&o);
	*tail=*head;
	return o.h.ah;
}

void grass()
{
	setfillstyle(1,LIGHTGREEN);
	bar(0,20,midx-102,maxy);
	bar(midx+102,20,maxx,maxy);
}

void help()
{
	unsigned char ch1=24;
	unsigned char ch2=25;

	nosound();
	setcolor(WHITE);
	setfillstyle(1,BLACK);

	bar(midx-80,midy-130,midx+80,midy+80);
	rectangle(midx-80,midx-130,midx+80,midy+80);

	gotoxy(32,14);
	printf("%c : ACCLERATE",ch1);

	gotoxy(32,15);
	printf("%c :   BRAKE  ",ch2);

	gotoxy(32,16);
	printf("<- : STEER LEFT ");

	gotoxy(32,17);
	printf("-> :STEER  RIGHT");

	gotoxy(32,18);
	printf("SPACE: NITRO BOOST");

	gotoxy(32,19);
	printf("Esc  : QUIT");
	getch();

	bar(midx-80,midy-130,midx+80,midy+80);
}

void lamps()
{
	static int ly=21;

	setfillstyle(8,BLUE);
	bar(midx-100,20,midx-80,maxy);
	bar(midx+80,20,midx+100,maxy);

	setcolor(WHITE);
	setfillstyle(1,YELLOW);

	for(loop=ly;loop

    Source: geocities.com/ecma_ver1/source

               ( geocities.com/ecma_ver1)