#include "HangmanGui.c"
#include "HangmanMain.h"

int wbmain()
{
	main();
return 0;
}

void DummyProjectIDCMP(struct Window *wnd );

int main()
{
	Guess_Filename_g="hangman.dat\0";
	Guess_User_g="\0";
	Guess_Word_g="\0";
	Guessed_User_g=calloc(80,sizeof(char));
	Game_On_g=0;

	running=0;
	SetupScreen();
	OpenProject0Window();

	ReadWordFile();
	NewGameClicked();

	while(running!=100)
	{
		running=HandleProject0IDCMP();
	}

	CloseProject0Window();
	CloseDownScreen();

return 0;
}

int GuessItClicked( void )
{
	int fnd_flag=0;
	int i =0;
	int len =0;
	char *check;

	OffGadget(Project0Gadgets[0],Project0Wnd,NULL);

	check=DupString(((struct StringInfo *) (Project0Gadgets[0]->SpecialInfo))->Buffer);

	rtrimstr(check);
	ltrimstr(check);

	len=strlen(check);

	for(i=0;i<len;i++)
	{
		check[i]=ToUpper(check[i]);
	}

	if(len >1)
	{
		if(strcmp(check,Guess_Word_g)==0)
		{
			fnd_flag=2;
		}
	}
	else
	{
		for(i=0;i<strlen(Guess_Word_g);i++)
		{
			if(Guess_Word_g[i]==check[0])
			{
				Guess_Mask_g[i]=check[0];
				fnd_flag=1;
			}
		}

		Gadget2Text.IText=Guess_Mask_g;
		updateTxtGad(Project0Wnd,Project0Gadgets[2],&Gadget2Text);

		if(strcmp(Guess_Mask_g,Guess_Word_g)==0)
		{
			fnd_flag=2;
		}
	}

	if(fnd_flag==2)
	{
		Guess_User_g="\0";
		Guess_Number_g=0;
		Game_On_g=0;
		ShowWinnerBox();
		NewGameClicked();
	}	

	if(fnd_flag==0)
	{
		if(len ==1)
		{
			Guessed_User_g=strcat(Guessed_User_g," \0");			
			Guessed_User_g=strcat(Guessed_User_g,check);
		}

		Guess_User_g="\0";
		Guess_Number_g++;

		DrawHangman(Project0Wnd);
		
		if(Guess_Number_g >9) 
		{
			Guess_User_g="\0";
			Guess_Number_g=0;
			Game_On_g=0;
			ShowLoserBox();
			NewGameClicked();
		}
	}
	
	Gadget3Text.IText=Guessed_User_g;
	updateTxtGad(Project0Wnd,Project0Gadgets[4],&Gadget3Text);

	updateStrGad(Project0Wnd,Project0Gadgets[0],Guess_User_g);

	OnGadget(Project0Gadgets[0],Project0Wnd,NULL);
}

int NewGameClicked( void )
{
	int i=0;
	int Item_No=0;

	clock_t clk=clock();
	if(Game_On_g==1)
	{
		i=HangmanRequestG(Project0Wnd);
	}
	if(i==1 | Game_On_g==0)
	{
		OffGadget(Project0Gadgets[5],Project0Wnd,NULL);
	
		EraseRect(Project0Wnd->RPort,439,36,589,162);
		EraseRect(Project0Wnd->RPort,160,50,400,80);		
		EraseRect(Project0Wnd->RPort,28,110,400,150);		

		Guess_Number_g=0;

		srand(clk);

		Item_No=rand();
		Item_No=Item_No % Item_Count_g;

		strcpy(Guessed_User_g,"Letters Guessed Wrong :\0");	
		Guess_Word_g=Word_List[Item_No];
		Guess_Mask_g=DupString(Guess_Word_g);

		for(i=0;i<strlen(Guess_Mask_g);i++)
		{
			Guess_Mask_g[i]='*';
		}

		Guess_User_g="\0";
	
		Gadget2Text.IText=Guess_Mask_g;
		updateTxtGad(Project0Wnd,Project0Gadgets[2],&Gadget2Text);

		updateStrGad(Project0Wnd,Project0Gadgets[0],Guess_User_g);

		OnGadget(Project0Gadgets[5],Project0Wnd,NULL);
		Game_On_g=1;
	}
}

int LoadWordsClicked( void )
{
	int i=0;
	struct FileRequester *Hangman_File;
	i=HangmanRequestG(Project0Wnd);
	if(i==1)
	{
        	if (Hangman_File = (struct FileRequester *) AllocAslRequestTags(ASL_FileRequest,
            		ASL_Hail, (ULONG)"Hangman File Requester",
             /*  		ASL_Dir,  NULL,*/
               		ASL_File, (ULONG)"hangman.dat",
                	ASL_Pattern, (ULONG)"#?.dat",
               		ASL_Window, Project0Wnd,
               		TAG_DONE))
        		{
        			if (AslRequest(Hangman_File, 0L))
                		{
                			if (Hangman_File->rf_NumArgs==0)
					{
						Guess_Filename_g=calloc(strlen(Hangman_File->fr_File)+1,sizeof(char));
                        			strcpy(Guess_Filename_g,Hangman_File->fr_File);
                        		}
				}
                		FreeAslRequest(Hangman_File);
			}
		for(i=0;i<Item_Count_g;i++)
		{
			free(Word_List[i]);
		}

		ReadWordFile();
		Game_On_g=0;	
		NewGameClicked();
	}			     
}

/*
	Process Exit Game Button
*/

int ExitGameClicked( void )
{
	running =HangmanRequest(Project0Wnd);
}

/*
	Update string gadget to show new entry
*/

void updateStrGad(struct Window *win, struct Gadget *gad, UBYTE *newstr)
{

/*
	remove gadget from display before changing contents
*/

	RemoveGList(win,gad,1);

/*
	Change contents and reset current cursor positions in string
*/
	
	strcpy(((struct StringInfo *) (gad->SpecialInfo))->Buffer,newstr);

	((struct StringInfo *)(gad->SpecialInfo))->BufferPos =0;
	((struct StringInfo *)(gad->SpecialInfo))->DispPos =0;

/*
	Add Gadget back to display and refresh
*/

	AddGList(win,gad,~0,1,NULL);
	RefreshGList(gad,win,NULL,1);

/*
	Finally re-activate string gadget
*/

	ActivateGadget(gad,win,NULL);

}

/*
	Draw the Hangman figure piece by piece
*/

void DrawHangman(struct Window *win)
{
	int pen=GetAPen(win->RPort);
	DisplayBeep(Scr);

	switch(Guess_Number_g)
	{
		case 1:
			SetAPen(win->RPort,1);
			SetOPen(win->RPort,1);
			Move(win->RPort,440,160);
			RectFill(win->RPort,440,154,588,160);
			SetAPen(win->RPort,pen);
			break;
		case 2:
			SetAPen(win->RPort,1);
			SetOPen(win->RPort,1);
			Move(win->RPort,576,159);
			RectFill(win->RPort,576,37,588,159);
			SetAPen(win->RPort,pen);
			break;
		case 3:
			SetAPen(win->RPort,1);
			SetOPen(win->RPort,1);
			Move(win->RPort,490,43);
			RectFill(win->RPort,490,37,588,43);
			SetAPen(win->RPort,pen);
			break;
		case 4:
			SetAPen(win->RPort,7);
			SetOPen(win->RPort,1);
			Move(win->RPort,490,65);
			RectFill(win->RPort,490,44,502,65);
			SetAPen(win->RPort,pen);
			break;
		case 5:
			SetAPen(win->RPort,1);
			SetOPen(win->RPort,1);
			DrawEllipse(win->RPort,496,75,10,10);
			SetAPen(win->RPort,8);
			Flood(win->RPort,0,499,78);
			SetAPen(win->RPort,pen);
			break;
		case 6:
			SetAPen(win->RPort,3);
			SetOPen(win->RPort,1);
			Move(win->RPort,485,115);
			RectFill(win->RPort,485,86,507,115);
			SetAPen(win->RPort,pen);
			break;
		case 7:
			SetAPen(win->RPort,3);
			SetOPen(win->RPort,1);
			Move(win->RPort,440,90);
			RectFill(win->RPort,440,86,484,90);
			SetAPen(win->RPort,pen);
			break;
		case 8:
			SetAPen(win->RPort,3);
			SetOPen(win->RPort,1);
			Move(win->RPort,508,90);
			RectFill(win->RPort,508,86,552,90);
			SetAPen(win->RPort,pen);
			break;
		case 9:
			SetAPen(win->RPort,3);
			SetOPen(win->RPort,1);
			Move(win->RPort,485,140);
			RectFill(win->RPort,485,116,492,140);
			SetAPen(win->RPort,pen);
			break;
		case 10:
			SetAPen(win->RPort,3);
			SetOPen(win->RPort,1);
			Move(win->RPort,500,140);
			RectFill(win->RPort,500,116,507,140);
			SetAPen(win->RPort,pen);
			break;
		default:
			break;

	}
}

/*
	Read the vocabulary file selected by user
*/

void ReadWordFile(void)
{
	char *field_p;
	char *line =calloc(81,sizeof(char));

	int i=0;
	FILE *input=fopen(Guess_Filename_g,"r");
	
	if(input >0)
	{

		while(!feof(input))
		{
			ReadLine(line,80,input);

			field_p=DupString(line);

			ltrimstr(field_p);
			rtrimstr(field_p);

			if(check_field(field_p)==0 && i<100)
			{
				Word_List[i]=field_p;
				i++;
			}
			else
			{
				if(field_p >0)
				{
				/*	free(field_p); */
				}
			}
		}
		fclose(input);
	}
	Item_Count_g=i;
}

/*
	Check the field read from file is valid
*/

int check_field(char *r_p)
{
	int checkit =1;

	if(r_p >0)
	{
		if(strlen(r_p)>1 && strlen(r_p)<26)
		{
			checkit =0;
		}
	}
return checkit;
}

/*
	Read a line from the vocabulary file
*/

int ReadLine(char *s, int sdblim, FILE *input)
{
	int c,i;
	for(i=0;i<sdblim-1 && (c=getc(input))!=EOF && c!='\n';i++)
	{
		s[i]=toupper(c);
	}
	s[i]='\0';
return i;
}

/*

	strip leading spaces from string

*/

void ltrimstr(char from[])
{
	char *to=calloc(strlen(from),1);
	int k=0;
	int j =0;
	while(from[j] ==' ')
	{
		j++;
	}
	if(j >0)
	{
		for(k=0;k<strlen(from)-1;k++)
		{
			to[k]=from[j];
			to[k+1]='\0';
			j++;
		}
		strcpy(from,to);
		free(to);
	}
}

/*

	rtrimstr  - strip trailing spaces from string

*/

void rtrimstr(char from[])
{
	char *to=calloc(strlen(from),1);
	int j =strlen(from)-1;
	if(from[j]==' ')
	{
		while(from[j] ==' ' && j >0)
		{
			j--;
		}
		strncpy(to,from,j+1);
		strcpy(from,to);
		free(to);
	}
}

/*
	Make a copy of the string parsed
*/

char *DupString(char *from)
{
	char *to;

	if(from >0)
	{
		to=calloc(strlen(from)+1,sizeof(char));
		strcpy(to,from);
	}
return to;
}

/*
	Update a Text gadget
*/

void updateTxtGad(struct Window *win, struct Gadget *gad, struct IntuiText *newstr)
{

/*
	remove gadget from display before changing contents
*/

	RemoveGList(win,gad,1);

/*
	Change contents and reset current cursor positions in string
*/
	
	gad->GadgetText=newstr;

/*
	Add Gadget back to display and refresh
*/

	AddGList(win,gad,~0,1,NULL);
	RefreshGList(gad,win,NULL,1);

/*
	Finally re-activate string gadget
*/

	ActivateGadget(gad,win,NULL);

}


/*
	return button clicked to continue
*/


int WinnerOkClicked( void )
{
	return 100;
}

/*
	return button clicked to continue
*/

int LostOkClicked( void )
{
	return 100;
}

/*
	return button clicked to continue
*/

int AboutOkClicked( void )
{
	return 100;
}

/*
	Perform menu item new game
*/

int Project0GameItem0( void )
{
	NewGameClicked();
	return 0;
}

/*
	Perform menu item load words
*/

int Project0GameItem1( void )
{
	LoadWordsClicked();
	return 0;
}

/*
	Perform menu item about
*/

int Project0GameItem2( void )
{
	ShowAboutBox();
	return 0;
}

/*
	Perform menu item Exit hangman
*/

int Project0GameItem3( void )
{
	running=HangmanRequest(Project0Wnd);
	return running;
}

/*
	Show Hangman AboutBox
*/

void ShowAboutBox()
{
	int runninga=0;
	OpenProject3Window();

	while(runninga!=100)
	{
		runninga=HandleProject3IDCMP();
		if(Project0Wnd!=NULL) 
		{
			DummyProjectIDCMP(Project0Wnd);
		}
	}

	CloseProject3Window();
}

/*
	Show Hangman WinnerBox
*/

void ShowWinnerBox()
{
	int runninga=0;
	OpenProject1Window();

	while(runninga!=100)
	{
		runninga=HandleProject1IDCMP();
		if(Project0Wnd!=NULL) 
		{
			DummyProjectIDCMP(Project0Wnd);
		}
	}

	CloseProject1Window();
}

/*
	Show Hangman LoserBox
*/

void ShowLoserBox()
{
	int runninga=0;
	OpenProject2Window();

	while(runninga!=100)
	{
		runninga=HandleProject2IDCMP();
		if(Project0Wnd!=NULL) 
		{
			DummyProjectIDCMP(Project0Wnd);
		}
	}

	CloseProject2Window();
}

/*
	Process List box on About Hangman Box
*/

int Gadget13Clicked(void)
{
	return 0;
}

/*
	Kill Hangman (Ok|Cancel)
*/

int HangmanRequest(struct Window *Win)
{
	struct EasyStruct HangmanES = {
		sizeof (struct EasyStruct),
		0,
		"Hangman 1997 Request",
		"Exit Hangman?",
		"Ok|Cancel"
		};
	int reply =0;

	reply=EasyRequest( Win, &HangmanES, NULL, NULL);

	if(reply ==1)
	{
		reply =100;
	}
	return reply;
}

/*
	Warn Kill Hangman Game (Ok|Cancel)
*/

int HangmanRequestG(struct Window *Win)
{
	struct EasyStruct HangmanES = {
		sizeof (struct EasyStruct),
		0,
		"Hangman 1997 Request",
		"This will abort the current Game",
		"Ok|Cancel"
		};
	int reply =0;

	reply=EasyRequest( Win, &HangmanES, NULL, NULL);

	return reply;
}

/***********************************************
	Disable Project Window Gadgets
************************************************/

void DummyProjectIDCMP(struct Window *wnd )
{
	struct IntuiMessage	*m;

	while( m = GT_GetIMsg( wnd->UserPort ))
	{

		GT_ReplyIMsg( m );

	}
}
