/***************************************************************************
File		  : PUZLLE.C (main function file)
External files: -NONE-
Program Group : Game
Written by	  : Jeyakumar M S
Date		  : JAN 2003
Last Update   : MAY 2003


Comments: This program is written using 'C' Programming Language.
		  Graphics Codes Uses Only Built in graphics function.
		  doesn't uses any coding standerd style.


***************************************************************************/



/***Keys scan codes definition used in program***/
#define TAB 9
#define ENTER 10
#define RETURN 13
#define SPACE 32
#define UP 80
#define DOWN 72
#define LEFT 75
#define RIGHT 77
#define ESC 27
#define BACKSP 8

/*ACTIVE_PANEL, REFRESH_PANEL used for Game menu to show or redraw*/
#define ACTIVE_PANEL 0
#define REFRESH_PANEL 1

/***width and height required for single letter***/
#define H_TEXT textheight("H")
#define W_TEXT textwidth("W")

/***Size of panel***/
#define PANEL_SIZE (20*textwidth("A"))

/***Selection bar Height***/
#define SEL_SIZE 46

/***Graphics Library Path (path contains .BGI Files)***/
#define GRAPH_PATH "c:\\soft\\lang\\turboc2"

/***Width and Height of screen***/
#define MAXX getmaxx()
#define MAXY getmaxy()


/***Header file req.***/
#include
#include
#include
#include
#include
#include
#include
#include

int scrx,scry,cnt=4,mx,my,isx,isy,brd,old_cnt,sec;
int arr_list[8][8],dummy[8][8],arr_check[64],ctrl_maxmnu,ctrl_x,ctrl_y;
unsigned long int step_count;
void panel_description(char [],char);
char ref_ary,player[16]="Player",snd=1,sklevel=1;
unsigned long int pst;
char score[10];
unsigned long int p_score;
unsigned int seconds;
struct time tm1;

int inp_box(char *,char *,int);

/***Main program***/

void main()
{
int gd=VGA,gm=VGAHI,i,sec,hnd;
initgraph(&gd,&gm,GRAPH_PATH);

pst=1000;

scrx=MAXX;
scry=MAXY;
mx=30;
my=30;
brd=30;
if(!ref_ary)
init_array(); 	/*Inititalize Array*/
save_array();	/*Save Array into Temp array*/
while(1)		/*Loop forever*/
startmenu();	/*Show the main menu*/
}

start_game()
{
char ch,lx,ly,a[2];
char control;
int i;

if(!ref_ary)                    		/*if entered first time*/
seconds=(cnt*(4-sklevel)*10+1);   		/*Maximun Number of Seconds Allowed
										for game - Calculate using Skill
										Level(sklevel) and Level (cnt)*/
ref_ary=1;

setfillstyle(1,5);
bar(0,0,MAXX,MAXY);

show_control_panel(REFRESH_PANEL);		/*Show Game Menu*/

/*Following lines Draws the shadowed area of play area*/
setfillstyle(1,0);
bar(10,10,cnt*50+2*brd+10,cnt*50+2*brd+10);
setfillstyle(1,1);
setcolor(15);
bar(0,0,cnt*50+2*brd,cnt*50+2*brd);
rectangle(0,0,cnt*50+2*brd,cnt*50+2*brd);
setcolor(15);
settextjustify(CENTER_TEXT,CENTER_TEXT);
outtextxy((cnt*50+2*brd)/2,brd/2,player);
lx=ly=isx=isy=0;						/*foucs to first element*/

display_map();    						/*Draw Play area*/

/***Set Focus rectangle (brd = border size , lx,ly = lastx,lasty,SEL_SIZE=size of bar***/
pull_area(brd+lx*50+2,brd+ly*50+2,brd+lx*50+SEL_SIZE,brd+ly*50+SEL_SIZE);

gettime(&tm1);      /*get current time*/

while(1)
{
if(kbhit())			/*Check key press*/
{
ch=getch();
show_score();		/*Show Score/timer Panel*/
switch(ch)			/*Preform action for key*/
 {
 case UP:if(isy0)
	 isy--;
	 else
	 isy=cnt-1;
	 break;
 case LEFT:if(isx>0)
	 isx--;
	 else
	 isx=cnt-1;
	 break;
 case RIGHT:if(isx0)
  {
  arr_list[isx-1][isy]=arr_list[isx][isy];
  arr_list[isx][isy]=0;
  isx--;
  }
 else if(arr_list[isx+1][isy]==0 && isx0)
  {
  arr_list[isx][isy-1]=arr_list[isx][isy];
  arr_list[isx][isy]=0;
  isy--;
  }
 else if(arr_list[isx][isy+1]==0 && isy>4,attr&15);
bar(x1+1,y1+1,x2-1,y2-1);
setcolor(~(attr&15));
settextjustify(CENTER_TEXT,CENTER_TEXT);
outtextxy((x1+x2)/2,(y1+y2)/2,text);
}

label(int x1,int y1,int x2,int y2,char attr,void *text)
{
setfillstyle(1,attr&15);
bar(x1,y1,x2,y2);
setcolor(attr>>4);
settextjustify(CENTER_TEXT,CENTER_TEXT);
outtextxy((x1+x2)/2,(y1+y2)/2,text);
}

pull_area(int x1,int y1,int x2,int y2)		/*heigh light (select) effect*/
{
setcolor(DARKGRAY);
rectangle(x1,y1,x2,y2);
setcolor(WHITE);
rectangle(x1,y1,x2-1,y2-1);
}

push_area(int x1,int y1,int x2,int y2)		/*Remove unselect*/
{
setcolor(WHITE);
rectangle(x1,y1,x2,y2);
setcolor(DARKGRAY);
rectangle(x1+1,y1+1,x2-1,y2-1);
}

flat_area(int x1,int y1,int x2,int y2,char attr) /*Remove Selection bar*/
{
setcolor(attr);
rectangle(x1,y1,x2,y2);
setcolor(attr);
rectangle(x1+1,y1+1,x2-1,y2-1);
}

message(char *msg,char attr)
 {
 savearea(MAXX/2-165,MAXY/2-65,MAXX/2+160,MAXY/2+60,attr&15);
 setfillstyle(1,8);
 bar(MAXX/2-145,MAXY/2-45,MAXX/2+150,MAXY/2+50);
 setfillstyle(SOLID_FILL,attr>>4);
 bar(MAXX/2-155,MAXY/2-55,MAXX/2+140,MAXY/2+40);
 setcolor(attr&15);
 settextjustify(LEFT_TEXT,TOP_TEXT);
 settextstyle(6,0,1);
 print_area(MAXX/2-150,MAXY/2-50,MAXX/2+140,MAXY/2+40,msg);
 while(getch()!=27);
 showarea(MAXX/2-165,MAXY/2-65,MAXX/2+160,MAXY/2+60);
 settextstyle(0,0,0);
 return 0;
 }


my_strcpy(char *des,char *src,int from,int to)
 {
 int i,j;
 for(i=from,j=0;i<=to;i++,j++)
  {
  *(des+j)=*(src+j);
  *(des+j+1)='\0';
  }
 }

print_area(int x1,int y1,int x2,int y2,char *text)
 {
 int i,j,c=0;
 char ac[2];
 i=x1;j=y1;
 while(*(text+c))
  {
  if(i>(x2-W_TEXT-W_TEXT/2) || *(text+c)==10)
    {
    i=x1;
    j=j+H_TEXT+2;
    if(j>=(y2+H_TEXT+2))
     return 0;
    }
  if(*(text+c)!=10)
  {
  ac[0]=*(text+c);
  ac[1]=0;
  outtextxy(i,j,ac);
  i=i+W_TEXT+W_TEXT/2;
  }
  c++;
  }
 }

savearea(int x1,int y1,int x2,int y2,char opt)
{
int i,j;
FILE *f;
f=fopen("puzzlesf.svf","wb");
if(f==NULL)
 return 0;
for(i=x1;i<=x2;i++)
{
 for(j=y1;j<=y2;j++)
  {
  putc(getpixel(i,j),f);
  if(opt!=-1)
   putpixel(i,j,opt);
  }
if(snd)
my_sound();
}
fclose(f);
nosound();
}

showarea(int x1,int y1,int x2,int y2)
{
int i,j;
FILE *f;
f=fopen("puzzlesf.svf","rb");
if(f==NULL)
 return 0;
for(i=x1;i<=x2;i++)
 {
 for(j=y1;j<=y2;j++)
  putpixel(i,j,getc(f));
 if(snd)
 my_sound();
 }
fclose(f);
nosound();
}

finished()
{
int i,r,g,b;
cleardevice();
message("Good Job!\nPress ESC To \nContinue",4<<4|14);
puz_hof();
seconds=0;
}


startmenu()
{
int mh,mw,x1,y1,x2,count=0,lc=0;
char mtitle[]="Puzzles",ch;
char *mlist[]={"Level-1","Level-2","Level-3","Level-4","Level-5","Level-6","Settings","Load","Exit","Resume Game"};
char i,mcnt,mi;
static key;
mcnt=(ref_ary)?10:9;
if(key>=mcnt)
 key=0;
settextstyle(0,0,0);
mh=H_TEXT*mcnt;
mw=W_TEXT*20;
setfillstyle(1,9);
bar(0,0,MAXX,MAXY);
setfillstyle(0,0);
setcolor(14);
x1=MAXX/2-mw/2,y1=MAXY/2-mcnt/2*mh/2,x2=MAXX/2+mw/2;
setfillstyle(1,0);
bar(x1+10,y1-H_TEXT*4+10,x2+10,y1-1+10);
label(x1,y1-H_TEXT*4,x2,y1-1,1<<4|14,mtitle);
for(i=0;imcnt-1)
	 key=0;
	 pull_area(x1,y1+key*mcnt*4,x2,y1+(key+1)*mcnt*4-1);
	 break;
 case SPACE:pause_game();break;
 case RETURN:
 case ENTER:
	 switch_games(key);
	 return 0;
 case ESC:ask_quit();break;
 }
}
if(count++>pst)
 {
 count=0;
 label(x1,y1-H_TEXT*4,x2,y1-1,lc<<4|(~lc&15),mtitle);
 setcolor(0);
 rectangle(x1-1,y1-H_TEXT*4-1,x2+1,y1-1);
 lc=(lc+1)%16;
 }

}
}

pause_game()
{
savearea(MAXX/2-205,MAXY/2-25,MAXX/2+210,MAXY/2+30,-1);
setfillstyle(1,0);
bar(MAXX/2-200,MAXY/2-20,MAXX/2+210,MAXY/2+30);
setfillstyle(1,4);
bar(MAXX/2-205,MAXY/2-25,MAXX/2+205,MAXY/2+25);
setfillstyle(1,15);
bar(MAXX/2-200,MAXY/2-20,MAXX/2+200,MAXY/2+20);
setcolor(0);
settextjustify(LEFT_TEXT,CENTER_TEXT);
outtextxy(MAXX/2-190,MAXY/2,"Game Paused...Press SPACE To Continue");
while(getch()!=32);
showarea(MAXX/2-205,MAXY/2-25,MAXX/2+210,MAXY/2+30);
}

ask_quit()
{
char fn[2];
do
{
if(inp_box("Are You Sure Do You Want To Quit The Game?(Y/N)",fn,1)==0)
 fn[0]='n';
if(toupper(fn[0])=='Y')
 exitall();
else if(toupper(fn[0])=='N')
 break;
}while(1);
/*showarea(MAXX/2-205,MAXY/2-25,MAXX/2+205,MAXY/2+25);*/
}

switch_games(int no)
{
save_array();
if(no<6)
 {
 cnt=no+3;
 init_array();
 save_array();
 start_game();
 }
else if(no==6)
 {
 settings();
 }
else if(no==7)
 {
/* label(0,0,MAXX,H_TEXT*4,5<<4|1,"Select Game");
 label(0,H_TEXT*4,MAXX,MAXY,7,"");
 push_area(0,H_TEXT*4,MAXX,MAXY);*/
 if(select_game(MAXX/2-W_TEXT*5,MAXY/2-5*H_TEXT,10*W_TEXT))
  {
  save_array();
  start_game();
  }
 else
  {
  resetarray();
  return 0;
  }
 }
else if(no==8)
 {
 ask_quit();
 }
else if(no==9)
 {
 resetarray();
 start_game();
 }
}


savegame()
{
FILE *f;
char fn[14],i;
save_array();
do
{
if(inp_box("Enter Name To Save:",fn,10)==0)
 return 0;
if(!loadgame(fn))
   break;
else
 inp_box("Name Already Exist!!!",fn,0);
}while(1);
resetarray();
f=fopen("Puzzles.sav","ab");
 if(f==NULL)
   return 0;
 fwrite(fn,14,1,f);
 fwrite(&cnt,2,1,f);
 for(i=0;i>4);
setcolor(attr&15);
for(i=0;i>4));
label(x,y+sel*2*H_TEXT,x+width,y+(sel+1)*2*H_TEXT,15<<4|1,items[sel]);
while(1)
 {
 ch=getch();
 label(x,y+sel*2*H_TEXT,x+width,y+(sel+1)*2*H_TEXT,1<<4|15,items[sel]);
 switch(ch)
  {
  case DOWN:if(sel>0)
	    sel--;
	    else
	    sel=count-1;
	    break;
  case UP:if(sel>4);
 outtextxy(x,y,str);
 switch(ch)
  {
  case 8:if(i>0)
	 {
	 i--;
	 *(str+i)='\0';
	 }
	 break;
  case 13:
  case 10:
	return 1;
  case 27:return 0;
  default:if(ch>=32 && ch<=126)
	    {
	    *(str+i)=ch;
	    i++;
	    *(str+i)='\0';
	    }
	    break;
  }
  setcolor(attr&15);
  outtextxy(x,y,str);
 }
}


show_control_panel(char rate)
{
int tstart=4*H_TEXT;
char citems[][20]={"Resume","Save Game","Restart Game","End Game","Main Menu","Up : ","Down : ","Right : ","Left : ","Move : "},i;
char temp[3];
ctrl_maxmnu=5;
setfillstyle(1,4);
label(MAXX-PANEL_SIZE,0,MAXX,tstart,15<<4|4,"Controls");
pull_area(MAXX-PANEL_SIZE,0,MAXX,tstart);
for(i=24;i<28;i++)
 {
 temp[0]=i;
 temp[1]='\0';
 strcat(citems[i-24+ctrl_maxmnu],temp);
 }
temp[0]=17;
temp[1]=188;
temp[2]='\0';
strcat(citems[9],temp);
strcat(citems[9]," / BkSp");
ctrl_x=MAXX-PANEL_SIZE+2;
ctrl_y=tstart;
for(i=0;i0)
		 selmenu--;
		else
		 selmenu=ctrl_maxmnu-1;
		break;

  case UP:	if(selmenu=(MAXX-W_TEXT))
   {
   x=MAXX-PANEL_SIZE+W_TEXT;
   y=y+2*H_TEXT;
   }
  }
 }
 return;
 }


inp1_box(char *str,char *buf,int len)
{
savearea(MAXX/2-205,MAXY/2-25,MAXX/2+210,MAXY/2+30,-1);
setfillstyle(1,0);
bar(MAXX/2-200,MAXY/2-20,MAXX/2+210,MAXY/2+30);
setfillstyle(1,8);
bar(MAXX/2-205,MAXY/2-25,MAXX/2+205,MAXY/2+25);
setfillstyle(1,15);
bar(MAXX/2-200,MAXY/2-20,MAXX/2+200,MAXY/2+20);
setcolor(0);
settextjustify(LEFT_TEXT,CENTER_TEXT);
outtextxy(MAXX/2-190,MAXY/2,str);
get_input(buf,MAXX/2-190+W_TEXT*(strlen(str)+1),MAXY/2,15<<4,len);
showarea(MAXX/2-205,MAXY/2-25,MAXX/2+210,MAXY/2+30);
return 1;
}

inp_box(char *str,char *buf,int len)
{
int wd,state;
wd=(textwidth(str)+W_TEXT*(len+4));
savearea(MAXX/2-wd/2-5,MAXY/2-25,MAXX/2+wd/2+5,MAXY/2+30,-1);
setfillstyle(1,0);
bar(MAXX/2-wd/2+5,MAXY/2-20,MAXX/2+wd/2+5,MAXY/2+30);
setfillstyle(1,8);
bar(MAXX/2-wd/2,MAXY/2-25,MAXX/2+wd/2,MAXY/2+25);
setfillstyle(1,15);
bar(MAXX/2-wd/2+5,MAXY/2-20,MAXX/2+wd/2-5,MAXY/2+20);
setcolor(0);
settextjustify(LEFT_TEXT,CENTER_TEXT);
outtextxy(MAXX/2-wd/2+10,MAXY/2,str);
state=get_input(buf,MAXX/2-wd/2+W_TEXT*(strlen(str)+2),MAXY/2,15<<4,len);
showarea(MAXX/2-wd/2-5,MAXY/2-25,MAXX/2+wd/2+5,MAXY/2+30);
return state;
}

save_array()
{
int i,j;
for(i=0;imcnt-1)
	 key=0;
	 pull_area(x1,y1+key*mcnt*4,x2,y1+(key+1)*mcnt*4-1);
	 break;
 case SPACE:pause_game();break;
 case RETURN:
 case ENTER:
	 if(switch_settings(key)==0)
	 return 0;
	 break;
 case ESC:return 0;
 }
}
if(count++>pst)
 {
 count=0;
 label(x1,y1-H_TEXT*4,x2,y1-1,lc<<4|(~lc&15),mtitle);
 setcolor(0);
 rectangle(x1-1,y1-H_TEXT*4-1,x2+1,y1-1);
 lc=(lc+1)%16;
 }

}

}

switch_settings(int no)
{
char csec[6];
switch(no)
 {
 case 0:sklevel=1;
	inp_box("Now Skill is ONE (Press Enter to Continue)",csec,0);
	break;
 case 1:sklevel=2;
	inp_box("Now Skill is TWO (Press Enter to Continue)",csec,0);
	break;
 case 2:sklevel=3;
	inp_box("Now Skill is THREE (Press Enter to Continue)",csec,0);
	break;
 case 3:inp_box("Player Name:",player,15);break;
 case 4:inp_box("Time in Second(0-1000):",csec,5);
	sec=atoi(csec);
	if(sec>1000)
	 {
	 inp_box("Invalid Time",csec,0);
	 return 0;
	 }
	break;
 case 5:if(snd)
	 {
	 snd=0;
	 inp_box("Now Sound is OFF (Press Enter to Continue)",csec,0);
	 }
	else
	 {
	 snd=1;
	 inp_box("Now Sound is ON    (Press ENTER to Continue)",csec,0);
	 }
	 break;
 case 6:return 0;
 }
return 1;
}

my_sound()
{
static sply,scnt;
int slist[]={500,700,1000,1200,1500,1600,1800,2000,2200,2400,2600,2900};
sply=sply%12;
sound(slist[sply]);
if(scnt++>25)
 {
 scnt=0;
 sply++;
 }
}

puz_hof()
{
/*TODO:Hight scores*/
}



Hosted by www.Geocities.ws

1