/***************************************************************************
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*/
}