/*
Coded by : Da.MoRz
Email : p_mdriyaz@hotmail.com
*/
#include 
#include 
#include 
#include 
#include 

void blockcheck(int);
void dcheck();
void display();
void gameover();
void gameovercheck();
void setimages();

//Direction functions
void uru();
void ulu();
void uls();
void u_();
void dr_();
void dl_();

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

void interrupt (*okey)();
void interrupt nkey();

int loop,loop1,rnd,temp,key,del=0,chances=2,score=0,tx=1,win=0;

int spos=280;

int ball_x=315,ball_y=150;
int ball_xvar,ball_yvar;
int ball_prevx=0,ball_prevy=60;

int cx,cy;//contact x,contact y
int prevcx,prevcy;

int color_d[15][5];
int act_d[15][5];

enum direct{u=0,d,ur,dr,ul,dl} dir;

union REGS i;

struct palettetype p;

void *slide,*ball,*eball,*blue,*red,*green,*yellow;

void main()
{
	setimages();

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

	okey=getvect(0x09);
	setvect(0x09,nkey);
	i.x.ax=0x07;
	i.x.dx=550;
	int86(0x33,&i,&i);

	ball_xvar=0;
	ball_yvar=2;
	dir=d;
	while(1)
	{
		gameovercheck();
		if(tx<40)
		{
			gotoxy(tx,1);
			printf("_");
			gotoxy(81-tx,1);
			printf("_");
		}
		else if(tx>40)
		{
			gotoxy(tx,1);
			printf("-");
			gotoxy(80-tx,1);
			printf("-");
		}
		tx++;
		if(tx>80) tx=1;

		gotoxy(1,2);
		printf("Chances left:%d",chances);
		printf(" Score:%2d",score);
		printf(" Press -/+ to Decrease/Increase speed");
		printf(",Click LMB to quit");

		ball_x+=ball_xvar;
		ball_y+=ball_yvar;

		if(ball_y<=113)
		{
		if(ball_y<=53)
			blockcheck(0);
		else if(ball_y<=68)
			blockcheck(1);
		else if(ball_y<=83)
			blockcheck(2);
		else if(ball_y<=98)
			blockcheck(3);
		else if(ball_y<=113)
			blockcheck(4);
		}
		if(ball_y>450)
		{
			chances--;
			sound(1000);
			delay(150);
			nosound();
			if(chances<0)
			{
				chances=0;
				gameover();
			}
			ball_x=315;
			ball_y=150;
			dir=d;
			ball_xvar=0;
			ball_yvar=2;
		}
		switch(dir)
		{
			case d:
			dcheck();
			break;

			case dr:
			if(ball_x>=622)
			dr_();
			dcheck();
			break;

			case dl:
			if(ball_x<=0)
			dl_();
			dcheck();
			break;

			case ur:
			if(ball_x>=622)
			{
				ball_xvar=-(ball_xvar);
				ball_yvar=ball_yvar;

				dir=ul;
			}
			if(ball_y<=40)
				uru();
			break;

			case ul:
			if(ball_x<=0)
				uls();
			if(ball_y<=40)
				ulu();
			break;

			case u:
			if(ball_y<=40)
				u_();
			break;
		}
		delay(del);
		display();
	}
}

void blockcheck(int y)
{
	temp=(int)ball_x/42;
	if(act_d[temp][y]==1)
	{
		act_d[temp][y]=0;
		sound(750);
		delay(25);
		nosound();
		if(dir==ur)
			uru();
		else if(dir==ul)
			ulu();
		else if(dir==u)
			u_();
	}
}

void uls()
{
	ball_xvar=-(ball_xvar);
	ball_yvar=(ball_yvar);
	dir=ur;
}

void dl_()
{
	ball_xvar=-(ball_xvar);
	ball_yvar=ball_yvar;

	dir=dr;
}

void dr_()
{
	ball_xvar=-(ball_xvar);
	ball_yvar=ball_yvar;

	dir=dl;
}

void uru()
{
	ball_xvar=ball_xvar;
	ball_yvar=-(ball_yvar);

	dir=dr;
}

void ulu()
{
	ball_xvar=ball_xvar;
	ball_yvar=-(ball_yvar);

	dir=dl;
}

void u_()
{
	ball_xvar=ball_xvar;
	ball_yvar=-(ball_yvar);

	dir=d;
}
void dcheck()
{
	if(ball_y>392 && ball_y<400)
	{
		if(ball_x>=spos && ball_x<=(spos+80))
		{
			if(ball_x<=(spos+38))
			{
				if(ball_x<=(spos+5))
					ball_yvar=-1;
				if(ball_x>(spos+5) && ball_x<=(spos+15))
					ball_yvar=-3;
				if(ball_x>(spos+15) && ball_x<=(spos+25))
					ball_yvar=-5;
				if(ball_x>(spos+25) && ball_x<=(spos+38))
					ball_yvar=-7;

				ball_xvar=-4;
				dir=ul;
			}
			else if(ball_x>=(spos+42))
			{
				if(ball_x<=(spos+50))
					ball_yvar=-7;
				if(ball_x>(spos+50) && ball_x<=(spos+65))
					ball_yvar=-5;
				if(ball_x>(spos+65) && ball_x<=(spos+75))
					ball_yvar=-3;
				if(ball_x>(spos+75) && ball_x<=(spos+80))
					ball_yvar=-1;

				ball_xvar=4;
				dir=ur;
			}
			else
			{
				ball_xvar=0;
				ball_yvar=-4;
				dir=u;
			}
		}
	}
}
void display()
{
	for(loop=0;loop<5;loop++)
	{
		for(loop1=0;loop1<15;loop1++)
		{
			if(act_d[loop1][loop]==1)
			{
				switch(color_d[loop1][loop])
				{
				case 0:
					putimage(loop1*42,(loop*15)+40,blue,0);
					break;
				case 1:
					putimage(loop1*42,(loop*15)+40,yellow,0);
					break;
				case 2:
					putimage(loop1*42,(loop*15)+40,red,0);
					break;
				case 3:
					putimage(loop1*42,(loop*15)+40,green,0);
					break;
				}
			}
			else if(act_d[loop1][loop]<=0 && act_d[loop1][loop]>=-15)
			{
				setcolor(0);
				setfillstyle(1,0);
				bar(loop1*42,(loop*15)+40,(loop1*42)+40,(loop*15)+53);
				act_d[loop1][loop]--;
			}
		}
	}

	setfillstyle(1,0);
	bar(0,400,getmaxx(),410);

	putimage(spos,400,slide,OR_PUT);

	putimage(ball_prevx,ball_prevy,ball,XOR_PUT);
	putimage(ball_x,ball_y,ball,OR_PUT);
	ball_prevx=ball_x;
	ball_prevy=ball_y;
}

void gameover()
{
	free(blue);
	free(yellow);
	free(red);
	free(green);
	free(ball);
	free(eball);
	free(slide);
	setvect(0x08,old);
	setvect(0x09,okey);
	i.x.ax=31;
	int86(0x33,&i,&i);
	closegraph();
	textcolor(RED);
	if(win)
	{
		gotoxy(37,11);
		printf("You Win");
	}
	gotoxy(35,12);
	printf("/");
	gotoxy(45,12);
	printf("\\");
	gotoxy(36,13);
	printf("Game Over");
	gotoxy(35,14);
	printf("\\");
	gotoxy(45,14);
	printf("/");
	exit(0);
}

void gameovercheck()
{
	temp=0;
	for(loop=0;loop<15;loop++)
	{
		for(loop1=0;loop1<5;loop1++)
		{
			if(act_d[loop][loop1]==1)
			{
				temp++;
			}
		}
	}
	score=75-temp;
	if(!temp)
	{
		win=1;
		gameover();
	}
}

void setimages()
{
	int gd=DETECT,gm;
	int poly[8];
	int area;

	initgraph(&gd,&gm,"");

	getpalette(&p);

	//blue
	setrgbpalette(p.colors[1],0,20,50);
	setrgbpalette(p.colors[2],0,25,50);
	setrgbpalette(p.colors[3],0,30,50);

	//yellow
	setrgbpalette(p.colors[4],35,35,0);
	setrgbpalette(p.colors[5],40,40,0);
	setrgbpalette(p.colors[6],45,45,0);

	//red
	setrgbpalette(p.colors[7],20,0,0);
	setrgbpalette(p.colors[8],25,0,0);
	setrgbpalette(p.colors[9],30,0,0);

	//green
	setrgbpalette(p.colors[10],0,25,0);
	setrgbpalette(p.colors[11],0,30,0);
	setrgbpalette(p.colors[12],0,35,0);

	//grey
	setrgbpalette(p.colors[13],25,25,25);
	setrgbpalette(p.colors[14],30,30,30);

	area=imagesize(0,0,40,13);

	blue=malloc(area);
	yellow=malloc(area);
	red=malloc(area);
	green=malloc(area);

	for(loop=0;loop<4;loop++)
	{
		setfillstyle(1,2+(loop*3));

		bar(0,0,40,13);

		setcolor(1+(loop*3));
		setfillstyle(1,1+(loop*3));

		poly[0]=0;poly[1]=0;poly[2]=2;	poly[3]=2;
		poly[4]=2;poly[5]=11;poly[6]=0;	poly[7]=13;
		fillpoly(4,poly);

		poly[0]=0;poly[1]=0;poly[2]=40;poly[3]=0;
		poly[4]=38;poly[5]=2;poly[6]=2; poly[7]=2;
		fillpoly(4,poly);

		setcolor(3+(loop*3));
		setfillstyle(1,3+(loop*3));

		poly[0]=40;poly[1]=0;poly[2]=40;poly[3]=13;
		poly[4]=38;poly[5]=11;poly[6]=38;poly[7]=2;

		fillpoly(4,poly);

		poly[0]=0;poly[1]=13;poly[2]=2;	poly[3]=11;
		poly[4]=38;poly[5]=11;poly[6]=40;poly[7]=13;

		fillpoly(4,poly);

		switch(loop)
		{
		case 0:
			getimage(0,0,40,13,blue);
			break;
		case 1:
			getimage(0,0,40,13,yellow);
			break;
		case 2:
			getimage(0,0,40,13,red);
			break;
		case 3:
			getimage(0,0,40,13,green);
			break;
		}
	}
	setcolor(13);
	setfillstyle(1,13);

	poly[0]=0;poly[1]=0;poly[2]=5;poly[3]=5;
	poly[4]=75;poly[5]=5;poly[6]=80;poly[7]=0;
	fillpoly(4,poly);

	poly[0]=0;poly[1]=0;poly[2]=0;poly[3]=10;
	poly[4]=5;poly[5]=5;
	fillpoly(3,poly);

	setcolor(14);
	setfillstyle(1,14);

	poly[0]=0;poly[1]=10;poly[2]=5;poly[3]=5;
	poly[4]=75;poly[5]=5;poly[6]=80;poly[7]=10;
	fillpoly(4,poly);

	poly[0]=80;poly[1]=0;poly[2]=80;poly[3]=10;
	poly[4]=75;poly[5]=5;
	fillpoly(3,poly);

	area=imagesize(0,0,80,10);
	slide=malloc(area);

	getimage(0,0,80,10,slide);

	setcolor(15);
	setfillstyle(1,15);
	pieslice(4,30,0,360,4);

	area=imagesize(0,0,8,8);
	ball=malloc(area);
	eball=malloc(area);
	getimage(0,26,8,34,ball);
	getimage(200,326,208,324,eball);

	for(loop=0;loop<5;loop++)
	{
		for(loop1=0;loop1<15;loop1++)
		{
			rnd=random(4);
			color_d[loop1][loop]=rnd;
			act_d[loop1][loop]=1;
		}
	}
	cleardevice();
}

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

	i.x.ax=0x03;
	int86(0x33,&i,&i);
	spos=i.x.cx;
	if((i.x.bx&1)==1)
		gameover();
}

void interrupt nkey()
{
	int x;
	x=inportb(0x60);
	if(x==12 || x==74)
		del+=10;
	if(x==13 || x==78)
		del-=10;
	if(del<0) del=0;
	outportb(0x20,0x20);
	(*okey)();
}

    Source: geocities.com/ecma_ver1/source

               ( geocities.com/ecma_ver1)