#include<windows.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include"adogdres.h"
#include"adogd.h"


void cha_adj(void);
void gp(int ganger, int terning);
void familie(void);
void soc_class(void);
void height_weight(void);
void hitclass(void);
/*BYTE Tall[7];*/

extern HWND hMakeDialog[3];
extern HWND hWnd;
extern HANDLE hTerning, hPlayer;
extern charinfo Player;
extern HANDLE hInst;
extern HMENU hMenu;
extern BYTE Method;

extern BOOL bThief;
extern BOOL bRogue;
extern BOOL bWizard;
extern BOOL bCleric;
extern BOOL bBard;
extern BOOL bSpecialist;


BOOL new(void)
{
	RECT WndRect, WndRectChild;
	int x;
	register char i;
	FARPROC DialogProc;

	switch(Method)
	{
		case DEFAULT:
		case METHOD1:
			GetClientRect(hWnd, &WndRect);

			x = WndRect.right / 3;
			for(i = 0; i < 3; i++)
			{
				hMakeDialog[i] = CreateDialog(hInst, "CHARACTER",
															hWnd, NULL);

				GetClientRect(hMakeDialog[i], &WndRectChild);

				MoveWindow(hMakeDialog[i], x * i,
								WndRect.top + 50,
								WndRectChild.right + (2 * GetSystemMetrics(SM_CXDLGFRAME)),
								WndRectChild.bottom + GetSystemMetrics(SM_CXDLGFRAME) +
								GetSystemMetrics(SM_CYCAPTION) , FALSE);

				ShowWindow(hMakeDialog[i], SW_SHOW);
			}
		break;

		case METHOD2:
			DialogProc = MakeProcInstance(Metode2, hInst);
			DialogBox(hInst, "METHOD2", hWnd, DialogProc);
			FreeProcInstance(DialogProc);
		break;

		case METHOD4:
			/*fpDialog = MakeProcInstance(Metode4, hInst);
			DialogBox(hInst, "METHOD4", hDlg, fpDialog);
			FreeProcInstance(fpDialog);*/
		case METHOD3:
			DialogProc = MakeProcInstance(Metode3, hInst);
			DialogBox(hInst, "METHOD3", hWnd, DialogProc);
			FreeProcInstance(DialogProc);
		break;

		case METHOD5:
			DialogProc = MakeProcInstance(Metode5, hInst);
			DialogBox(hInst, "METHOD5", hWnd, DialogProc);
			FreeProcInstance(DialogProc);
		break;

		case METHOD6:
			MessageBox(hWnd, "Not Implemented", NULL, MB_OK);
			EnableMenuItem(hMenu, 0, MF_BYPOSITION | MF_ENABLED);
			DrawMenuBar(hWnd);
		break;
	}



	return TRUE;
}


/* Velger race og class */

void complete(void)
{
	void SpellsFunc(void);

	FARPROC ShowProc;
	FARPROC DialogProc;
	HWND ShowDlg;

	Player.strbonus = 0;
	Player.birthrank = 0;
	Player.siblings = 0;
	Player.age = 0;
	Player.height = 0;
	Player.weight = 0;
	Player.hp = 0;
	Player.gp = 0;
	Player.race = 0;
	Player.sex = 0;
	strcpy(Player.sclass, "---");
	strcpy(Player.family, "---");
	strcpy(Player.status, "---");
	strcpy(Player.class, "---");
	strcpy(Player.name, "");
	Player.thiefskills = NULL;
	Player.spells = NULL;

	cha_adj();

	EnableMenuItem(hMenu, IDM_LOOK, MF_BYCOMMAND | MF_ENABLED);
	EnableMenuItem(hMenu, IDM_PRINT, MF_BYCOMMAND | MF_ENABLED);
	EnableMenuItem(hMenu, IDM_SAVE, MF_BYCOMMAND | MF_ENABLED);

	ShowProc = MakeProcInstance(Look, hInst);
	ShowDlg = CreateDialog(hInst, "COMPL_CHAR", hWnd, ShowProc);
	ShowWindow(ShowDlg, SW_SHOW);

	EnableWindow(GetDlgItem(ShowDlg, IDM_PRINT), FALSE);
	EnableWindow(GetDlgItem(ShowDlg, IDM_SAVE), FALSE);
	EnableWindow(GetDlgItem(ShowDlg, IDM_OK), FALSE);

	DialogProc = MakeProcInstance(Race, hInst);
	DialogBox(hInst, "RACEDLG", hWnd, DialogProc);
	FreeProcInstance(DialogProc);

	soc_class();
	familie();
	height_weight();

	SendMessage(ShowDlg, UPDATE, NULL, NULL);

	DialogProc = MakeProcInstance(Classe, hInst);
	DialogBox(hInst, "CLASSDLG", hWnd, DialogProc);
	FreeProcInstance(DialogProc);

	SendMessage(ShowDlg, UPDATE, NULL, NULL);

	hitclass();

	if(bThief == TRUE || bBard == TRUE)
	{
		DialogProc = MakeProcInstance(Thief, hInst);
		DialogBox(hInst, "THIEF", hWnd, DialogProc);
		FreeProcInstance(DialogProc);
	}

	if(bSpecialist == TRUE)
	{
		DialogProc = MakeProcInstance(Wizard, hInst);
		DialogBox(hInst, "MAGESCHOOL", hWnd, DialogProc);
		FreeProcInstance(DialogProc);
	}

	if(bWizard == TRUE)
	{
		SpellsFunc();
	}

	if(bCleric == TRUE)
	{
		DialogProc = MakeProcInstance(Cleric, hInst);
		DialogBox(hInst, "RELIGION", hWnd, DialogProc);
		FreeProcInstance(DialogProc);
	}

	EnableWindow(GetDlgItem(ShowDlg, IDM_PRINT), TRUE);
	EnableWindow(GetDlgItem(ShowDlg, IDM_SAVE), TRUE);
	EnableWindow(GetDlgItem(ShowDlg, IDM_OK), TRUE);

	DestroyWindow(ShowDlg);

	DialogBox(hInst, "COMPL_CHAR", hWnd, ShowProc);
	FreeProcInstance(ShowProc);

	EnableMenuItem(hMenu, 0, MF_BYPOSITION | MF_ENABLED);
	DrawMenuBar(hWnd);
}


/* race-dialog */

BOOL FAR PASCAL Race(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
{
	void race_adj(void);
	void checkrace(HWND hDlg);
	WORD ID;

	switch(message)
	{
		case WM_INITDIALOG:
			checkrace(hDlg);
			CheckRadioButton(hDlg, HUMAN, GNOME, HUMAN);
			CheckRadioButton(hDlg, MALE, FEMALE, MALE);
		return TRUE;

		case WM_COMMAND:
			switch(wParam)
			{
				case IDM_OK:
					/* sjekker valgt rase */
					for(ID = HUMAN; ID <= GNOME; ID++)
					{
						if(IsDlgButtonChecked(hDlg, ID) == TRUE)
							break;
					}
					switch(ID - HUMAN)
					{
						case 0:
							Player.race = HUMAN;
						break;

						case 1:
							Player.race = HALFELF;
						break;

						case 2:
							Player.race = ELF;
						break;

						case 3:
							Player.race = HALFLING;
						break;

						case 4:
							Player.race = DWARF;
						break;

						case 5:
							Player.race = GNOME;
						break;
					}

					if(IsDlgButtonChecked(hDlg, MALE) != TRUE)
					{
						Player.sex = FEMALE;
					}
					else
					{
						Player.sex = MALE;
					}

					race_adj();

					EndDialog(hDlg, NULL);
					return TRUE;
			}
	}
	return FALSE;
}


/* Class-dialog */

BOOL FAR PASCAL Classe(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
{
	void InitClasse(HWND hDlg);

	BYTE lengde;
	int Index;
	static BOOL bValgt;

	switch(message)
	{
		case WM_INITDIALOG:
			bValgt = FALSE;
			InitClasse(hDlg);
		return TRUE;

		case WM_COMMAND:
			switch(wParam)
			{
				case CLASS:
					switch(HIWORD(lParam))
					{
						case LBN_SELCHANGE:
							bValgt = TRUE;
							Index = SendDlgItemMessage(hDlg, CLASS, LB_GETCURSEL, NULL,
																				 NULL);
							lengde = SendDlgItemMessage(hDlg, CLASS, LB_GETTEXT, Index,
																					(LONG)(LPSTR) Player.class);
							Player.class[lengde] = NULL;
							SetDlgItemText(hDlg, SELECTED, (LPSTR) Player.class);
						return TRUE;

						case LBN_DBLCLK:
							EndDialog(hDlg, NULL);
						return TRUE;
					}
				break;

				case IDM_OK:
					if(bValgt == TRUE)
					{
						EndDialog(hDlg, NULL);
					}
				return TRUE;
			}
	}
	return FALSE;
}





/* viser karakteren i bakgrunnen */

/*BOOL FAR PASCAL Show(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
{
	BYTE i;
	int ID;
	switch(message)
	{
		case UPDATE:
		case WM_SHOWWINDOW:
			if(wParam != NULL || message == UPDATE)
			{
				for(i = 0, ID = STR_SUM; ID <= CML_SUM; i++, ID += 10)
					SetDlgItemInt(hDlg, ID, Player.skill[i], FALSE);
			}
		return TRUE;

		case WM_SETFOCUS:
			if(wParam != NULL)
			{
				SetFocus(wParam);
			}
		return TRUE;
	}
	return FALSE;
}*/

/* viser minimumsverdiene til karakter-klassene */

BOOL FAR PASCAL Minimum(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
{
	switch(message)
	{
		case WM_SETFOCUS:
			if(wParam != NULL)
			{
				SetFocus(wParam);
			}
		return TRUE;
	}
	return FALSE;
}






BOOL FAR PASCAL Thief(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
{
	BOOL InitThief(HWND hDlg);

	int verdi;
	BOOL dummy;
	static HANDLE Scroller[8];
	BYTE i;
	int ID;
	BOOL OK;
	static BYTE Poeng;
	static BYTE MaxPoeng;
	static BYTE Max;
	static ThiefSkill OldValue;
	static pThiefSkills Peker;

	switch(message)
	{
		case WM_INITDIALOG:
			for(i = PICK, ID = PICKPOCKETMODIFY; ID <= READLANGMODIFY; i++, ID ++)
			{
				Scroller[i] = GetDlgItem(hDlg, ID);
			}

			InitThief(hDlg);

			Peker = (pThiefSkills) LocalLock(Player.thiefskills);
			if(Peker == NULL)
			{
				MessageBox(hDlg, "Bug in Thief", NULL, MB_OK);
				return FALSE;
			}

			for(i = 0, ID = PICKPOCKET; ID <= READLANG; i++, ID++)
			{
				OldValue[i] = Peker[i];
				SetDlgItemInt(hDlg, ID, Peker[i], Peker[i] < 0);
			}

			if(bBard == TRUE)
			{
				SetWindowText(hDlg, (LPSTR) "Bard");
				for(ID = BARD1; ID <= BARD4; ID++)
				{
					EnableWindow(GetDlgItem(hDlg, ID), FALSE);
				}
				for(ID = OPENLOCKS; ID <= HIDESHADOWS; ID++)
				{
					SetDlgItemText(hDlg, ID, (LPSTR) "");
					EnableWindow(GetDlgItem(hDlg, ID), FALSE);
				}
				for(i = LOCK; i <= HIDE; i++)
				{
					EnableWindow(Scroller[i], FALSE);
				}
				MaxPoeng = Poeng = 20;
				Max = 10;
			}
			else
			{
				SetWindowText(hDlg, (LPSTR) "Thief");
				MaxPoeng = Poeng = 60;
				Max = 30;
			}
			SetDlgItemInt(hDlg, POENG, Poeng, FALSE);
			SetDlgItemInt(hDlg, MAX, Max, FALSE);
		return TRUE;

		case WM_COMMAND:
			switch(wParam)
			{
				case IDM_OK:
					if(Poeng > 0)
					{
						BYTE Dummytext[100];

						MessageBeep(NULL);
						sprintf(Dummytext,
										"You still have %u points left to divide\n"
										"Are you sure you want to end this?",
										Poeng);
						if(MessageBox(hDlg, Dummytext, "AD&D",MB_YESNO |
													MB_ICONEXCLAMATION) == IDNO)
						{
							break;
						}
					}
					LocalUnlock(Player.thiefskills);
					EndDialog(hDlg, NULL);
				return TRUE;
			}
		break;

		case WM_VSCROLL:
			OK = FALSE;
			if(wParam == SB_LINEUP || wParam == SB_LINEDOWN)
			{
				for(i = PICK; i <= READL; i++)
				{
					if(Scroller[i] == HIWORD(lParam))
					{
						OK = TRUE;
						break;
					}
				}
				if(OK == TRUE)
				{
					verdi = GetDlgItemInt(hDlg, i + 400, &dummy, TRUE);

					if(wParam == SB_LINEUP && Poeng > 0 &&
						 (verdi - OldValue[i]) < Max && verdi < 95)
					{
						Peker[i]++;
						verdi++;
						Poeng--;
					}
					else if(wParam == SB_LINEDOWN && Poeng < MaxPoeng &&
									verdi > OldValue[i])
					{
						Peker[i]--;
						verdi--;
						Poeng++;
					}
					SetDlgItemInt(hDlg, i + 400, verdi, verdi < 0);
					SetDlgItemInt(hDlg, POENG, Poeng, FALSE);
				}
			}
		return TRUE;
	}

	return FALSE;
}


/* viser thief-skills i bakgrunnen */

BOOL FAR PASCAL LookThief(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
{
	BYTE i;
	int ID;

	switch(message)
	{
		case WM_INITDIALOG:
		return TRUE;

		case WM_SHOWWINDOW:
			if(wParam != NULL)
			{
				pThiefSkills Peker;

				Peker = (pThiefSkills) LocalLock(Player.thiefskills);
				if(Peker == NULL)
				{
					MessageBox(hDlg, "Bug in LookThief", NULL, MB_OK);
					return FALSE;
				}

				if(bBard == TRUE)
				{
					SetWindowText(hDlg, (LPSTR) "Bard's skills");
					for(i = 0, ID = PICKPOCKET; ID <= READLANG; i++, ID ++)
					{
						SetDlgItemInt(hDlg, ID, Peker[i], Peker[i] < 0);
					}
					for(ID = BARD1; ID <= BARD4; ID++)
					{
						EnableWindow(GetDlgItem(hDlg, ID), FALSE);
					}
					for(ID = OPENLOCKS; ID <= HIDESHADOWS; ID++)
					{
						SetDlgItemText(hDlg, ID, (LPSTR) "");
						EnableWindow(GetDlgItem(hDlg, ID), FALSE);
					}
				}
				else
				{
					SetWindowText(hDlg, (LPSTR) "Thief's skills");
					for(i = 0, ID = PICKPOCKET; ID <= READLANG; i++, ID ++)
					{
						SetDlgItemInt(hDlg, ID, Peker[i], Peker[i] < 0);
					}
				}

				LocalUnlock(Player.thiefskills);
			}
		return TRUE;

		case WM_SETFOCUS:
			if(wParam != NULL)
			{
				SetFocus(wParam);
			}
		return TRUE;
	}
	return FALSE;
}



BOOL FAR PASCAL Wizard(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
{
	void InitWizard(HWND hDlg);

	BYTE lengde;
	int Index;
	static BOOL bValgt;

	switch(message)
	{
		case WM_INITDIALOG:
			bValgt = FALSE;
			InitWizard(hDlg);
		return TRUE;

		case WM_COMMAND:
			switch(wParam)
			{
				case MAGICSCHOOL:
					switch(HIWORD(lParam))
					{
						case LBN_SELCHANGE:
							bValgt = TRUE;
							Index = SendDlgItemMessage(hDlg, MAGICSCHOOL, LB_GETCURSEL,
																				 NULL, NULL);
							lengde = SendDlgItemMessage(hDlg, MAGICSCHOOL, LB_GETTEXT,
																					Index, (LONG)(LPSTR) Player.class);
							Player.class[lengde] = NULL;
							SetDlgItemText(hDlg, SELECTED, (LPSTR) Player.class);
						return TRUE;

						case LBN_DBLCLK:
							if(stricmp(Player.class, "Normal Mage") == NULL)
							{
								bSpecialist = FALSE;
								strcpy(Player.class, "Wizard");
							}
							EndDialog(hDlg, NULL);
						return TRUE;
					}
				break;

				case IDM_OK:
					if(bValgt == TRUE)
					{
						if(strcmp(Player.class, "Normal Mage") == NULL)
						{
							bSpecialist = FALSE;
							strcpy(Player.class, "Wizard");
						}
						EndDialog(hDlg, NULL);
					}
				return TRUE;
			}
	}
	return FALSE;
}


/* viser spells i bakgrunnen */

BOOL FAR PASCAL LookSpells(HWND hDlg, unsigned message, WORD wParam,
													 LONG lParam)
{
	switch(message)
	{
		case WM_INITDIALOG:
		return TRUE;

		case WM_SHOWWINDOW:
			if(wParam != NULL)
			{
				pSpells Peker;

				Peker = (pSpells) LocalLock(Player.spells);
				if(Peker == NULL)
				{
					MessageBox(hDlg, "Bug in LookSpells", NULL, MB_OK);
					return FALSE;
				}

				SetDlgItemText(hDlg, OFFSPELL, Peker->Offensive);
				SetDlgItemText(hDlg, DEFSPELL, Peker->Defensive);
				SetDlgItemText(hDlg, MISCSPELL, Peker->Miscelleanous);
				SetDlgItemText(hDlg, BONSPELL, Peker->Bonus);

				LocalUnlock(Player.spells);
			}
		return TRUE;

		case WM_SETFOCUS:
			if(wParam != NULL)
			{
				SetFocus(wParam);
			}
		return TRUE;
	}
	return FALSE;
}



BOOL FAR PASCAL Cleric(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
{
	void InitCleric(HWND hDlg);

	static BOOL bValgt;
	BYTE dummy[100];
	int i, Index;

	switch(message)
	{
		case WM_INITDIALOG:
			bValgt = FALSE;
			InitCleric(hDlg);
		break;

		case WM_COMMAND:
			switch(wParam)
			{
				case RELIGION:
					switch(HIWORD(lParam))
					{
						case LBN_SELCHANGE:
							bValgt = TRUE;
							Index = SendDlgItemMessage(hDlg, RELIGION, LB_GETCURSEL,
																				 NULL, NULL);
							SendDlgItemMessage(hDlg, RELIGION, LB_GETTEXT,
																					Index, (LONG)(LPSTR) dummy);

							for(i = 0; dummy[i] > 31 && i < 24; i++);
							dummy[i] = NULL;

							if(stricmp(dummy, "Normal Cleric") == NULL)
							{
								strcpy(Player.class, "Cleric");
							}
							else
							{
								sprintf(Player.class, "Priest of %s", dummy);
							}
							SetDlgItemText(hDlg, SELECTED, (LPSTR) dummy);
						return TRUE;

						case LBN_DBLCLK:
							EndDialog(hDlg, NULL);
						return TRUE;
					}
				break;

				case IDM_OK:
					if(bValgt == TRUE)
					{
						EndDialog(hDlg, NULL);
					}
				return TRUE;
			}
	}
	return FALSE;
}
