www.pudn.com > coolMEMORY.rar > GameMenu.cpp


//----------------------------------------------------------------------------- 
// File: GameMenu.cpp 
//----------------------------------------------------------------------------- 
 
#include "AS\AS_Engine.h" 
#include "ModuleHeaders.h" 
 
 
// Variables: ***************************************************************** 
char **pbyFoundCardStyle; // The names of the found card styles folders 
char **pbyFoundCardStyleName; // The names of the found card styles (language dependent) 
int iFoundCardStyles; // The number of found card styles 
cELEMENT cP1, cP1Human, cP1ComputerEasy, cP1ComputerNormal, cP1ComputerClever, 
		 cP2, cP2Human, cP2ComputerEasy, cP2ComputerNormal, cP2ComputerClever, 
		 cP3, cP3Human, cP3ComputerEasy, cP3ComputerNormal, cP3ComputerClever, 
		 cP4, cP4Human, cP4ComputerEasy, cP4ComputerNormal, cP4ComputerClever; 
cELEMENT *cPlayerButton[4][4] = {{&cP1Human, &cP1ComputerEasy, &cP1ComputerNormal, &cP1ComputerClever}, 
								 {&cP2Human, &cP2ComputerEasy, &cP2ComputerNormal, &cP2ComputerClever}, 
								 {&cP3Human, &cP3ComputerEasy, &cP3ComputerNormal, &cP3ComputerClever}, 
								 {&cP4Human, &cP4ComputerEasy, &cP4ComputerNormal, &cP4ComputerClever}}; 
cELEMENT cCardPairsSlider, cCardPairsText, cCardStyleLast, cCardStyleNext, 
		 cCardStyleText, cThinkTime, cThinkTimeSlider; 
cELEMENT cStart, cAdvancedOptions, cQuit; 
cELEMENT *cButtonList[MENU_BUTTONS] = 
		{&cP1, &cP1Human, &cP1ComputerEasy, &cP1ComputerNormal, &cP1ComputerClever, 
		 &cP2, &cP2Human, &cP2ComputerEasy, &cP2ComputerNormal, &cP2ComputerClever, 
		 &cP3, &cP3Human, &cP3ComputerEasy, &cP3ComputerNormal, &cP3ComputerClever, 
		 &cP4, &cP4Human, &cP4ComputerEasy, &cP4ComputerNormal, &cP4ComputerClever, 
		 &cCardPairsSlider, &cCardPairsText, &cCardStyleLast, &cCardStyleNext, 
		 &cCardStyleText, &cThinkTime, &cThinkTimeSlider, &cStart, &cAdvancedOptions, &cQuit}; 
// For the animated main menu background: 
long lGameMenuBackgroundAniTimer, 
	 lBackFlashTimeDelay, lBackFlashTime; 
int iGameMenuBackgroundAniStep; 
float fLastBackFlash, fBackFlash, fCurrentBackFlash, fBackFlashDelta; 
/////////////////////////////////////////////////////////////////////////////// 
 
// Functions: ***************************************************************** 
HRESULT GameMenu(void); 
HRESULT GameMenuCheck(AS_WINDOW *); 
HRESULT GameMenuDraw(AS_WINDOW *); 
void EnumerateCardStyles(void); 
void DestroyFoundCardStyles(void); 
void SetStandartMenuCamera(void); 
void InitGameMenuElements(void); 
void InitGameMenuElementsLanguage(void); 
void DrawGameMenuElements(AS_WINDOW *); 
void CheckGameMenuElements(void); 
 
void P1Button(void); 
void P2Button(void); 
void P3Button(void); 
void P4Button(void); 
void P1HumanButton(void); 
void P1ComputerEasyButton(void); 
void P1ComputerNormalButton(void); 
void P1ComputerCleverButton(void); 
void P2HumanButton(void); 
void P2ComputerEasyButton(void); 
void P2ComputerNormalButton(void); 
void P2ComputerCleverButton(void); 
void P3HumanButton(void); 
void P3ComputerEasyButton(void); 
void P3ComputerNormalButton(void); 
void P3ComputerCleverButton(void); 
void P4HumanButton(void); 
void P4ComputerEasyButton(void); 
void P4ComputerNormalButton(void); 
void P4ComputerCleverButton(void); 
void CardPairsSlider(void); 
void CardStyleLast(void); 
void CardStyleNext(void); 
void LoadNewCardStyle(int); 
void ThinkTimeButton(void); 
void ThinkTimeSlider(void); 
void StartButton(void); 
void AdvancedOptionsButton(void); 
void QuitButton(void); 
void MusicNext(void); 
/////////////////////////////////////////////////////////////////////////////// 
 
 
// cELEMENT functions: ******************************************************** 
void cELEMENT::Draw(void) 
{ // begin cELEMENT::Draw() 
	if(!bVisible) 
		return; 
	 
	glPushMatrix(); 
	glTranslatef(vWorldPos.fX, vWorldPos.fY, vWorldPos.fZ); 
	glScalef(vSize.fX*2, vSize.fY*2, vSize.fZ*2); 
	glDisable(GL_BLEND); 
 
	if(_ASConfig->bMultitexturing) 
	{ 
		glActiveTextureARB(GL_TEXTURE1_ARB); 
		if(bActive) 
			glColor3f(0.9f, 0.9f, 0.9f); 
		else 
			glColor3f(0.4f, 0.4f, 0.4f); 
		glBindTexture(GL_TEXTURE_2D, GameTexture[5].iOpenGLID); 
		glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); 
		glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); 
		glEnable(GL_TEXTURE_2D); 
		glEnable(GL_TEXTURE_GEN_S); 
		glEnable(GL_TEXTURE_GEN_T); 
		glActiveTextureARB(GL_TEXTURE0_ARB); 
	} 
	if(bActive) 
		glColor3f(1.0f, 1.0f, 1.0f); 
	else 
		glColor3f(0.2f, 0.2f, 0.2f); 
	switch(eType) 
	{ 
		case CHECK_ELEMENT: case BUTTON_ELEMENT: case SLIDER_ELEMENT:			 
			// Front side: 
			glColor4f(bActive*0.3f, bActive*0.3f, bActive*0.3f, 0.5f); 
			glDisable(GL_CULL_FACE); 
			glBindTexture(GL_TEXTURE_2D, GameTexture[5].iOpenGLID); 
			glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); 
			glEnable(GL_BLEND); 
			glDisable(GL_DEPTH_TEST); 
			glBegin(GL_QUADS); 
			// Main part: 
				glVertex2f(-0.5f, -0.5f); 
				glVertex2f(0.5f, -0.5f); 
				glVertex2f(0.5f, 0.5f); 
				glVertex2f(-0.5f, 0.5f); 
			// Top: 
				glColor4f(0.0f, 0.0f, 0.0f, 1.0f); 
				glVertex2f(-0.7f, -0.7f); 
				glVertex2f(0.7f, -0.7f); 
				glColor4f(0.0f, 0.0f, 0.0f, 0.5f); 
				glVertex2f(0.5f, -0.5f); 
				glVertex2f(-0.5f, -0.5f); 
 
			// Left: 
				glColor4f(0.0f, 0.0f, 0.0f, 1.0f); 
				glVertex2f(-0.7f, 0.9f); 
				glVertex2f(-0.7f, -0.7f); 
				glColor4f(0.0f, 0.0f, 0.0f, 0.5f); 
				glVertex2f(-0.5f, -0.5f); 
				glVertex2f(-0.5f, 0.5f); 
 
			// Right: 
				glColor4f(0.0f, 0.0f, 0.0f, 1.0f); 
				glVertex2f(0.7f, 0.9f); 
				glVertex2f(0.7f, -0.7f); 
				glColor4f(0.0f, 0.0f, 0.0f, 0.5f); 
				glVertex2f(0.5f, -0.5f); 
				glVertex2f(0.5f, 0.5f); 
 
			// Bottom: 
				glColor4f(0.0f, 0.0f, 0.0f, 0.5f); 
				glVertex2f(-0.5f, 0.5f); 
				glVertex2f(0.5f, 0.5f); 
				glColor4f(0.0f, 0.0f, 0.0f, 1.0f); 
				glVertex2f(0.7f, 0.9f); 
				glVertex2f(-0.7f, 0.9f); 
 
			// Bottom: 
				glColor4f(0.0f, 0.0f, 0.0f, 0.5f); 
				glVertex2f(-0.5f, 0.5f); 
				glVertex2f(0.5f, 0.5f); 
				glColor4f(0.0f, 0.0f, 0.0f, 1.0f); 
				glVertex2f(0.7f, -0.9f); 
				glVertex2f(-0.7f, -0.9f); 
			glEnd(); 
			glDisable(GL_BLEND); 
			glBlendFunc(GL_SRC_ALPHA, GL_ONE); 
			glEnable(GL_DEPTH_TEST); 
			glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); 
			glEnable(GL_CULL_FACE); 
 
			// Is it checked?? 
			if(bChecked) 
			{ 
				glBindTexture(GL_TEXTURE_2D, GameTexture[3].iOpenGLID); 
				if(bActive) 
					glColor3f(0.6f, 0.6f, 0.6f); 
				else 
					glColor3f(0.2f, 0.2f, 0.2f); 
				if(eType == CHECK_ELEMENT && bRound) 
				{ 
					glScalef(0.7f+vAniPos.fX/300, 0.7f+vAniPos.fY/300, 0.7f+vAniPos.fZ/300); 
					glCallList(iSphereList); 
				} 
				else 
				{ 
					glScalef(1.4f, 1.4f, 1.4f); 
					glRotatef(vAniPos.fX, 0.0f, 1.0f, 0.0f); 
					glRotatef(vAniPos.fY/2, 0.0f, 1.0f, 0.0f); 
					glRotatef(vAniPos.fZ/2, 0.0f, 0.0f, 1.0f); 
					glCullFace(GL_FRONT); 
					ASDrawMd2Frame(pCheckedModel, 0); 
					glCullFace(GL_BACK); 
				} 
			} 
		break; 
	} 
	glPopMatrix(); 
	if(eType == SLIDER_ELEMENT) 
	{ // Draw the slider: 
		glPushMatrix(); 
		if(bActive) 
			glColor3f(0.3f, 0.3f, 0.3f); 
		else 
			glColor3f(0.1f, 0.1f, 0.1f); 
		glBindTexture(GL_TEXTURE_2D, GameTexture[3].iOpenGLID); 
		glTranslatef((float) (iCurrentSliderPos-iSliderMin)/(iSliderMax-iSliderMin)*vSize.fX*2, 0.0f, 0.0f); 
		glTranslatef(vWorldPos.fX-vSize.fX, vWorldPos.fY, vWorldPos.fZ); 
		glScalef(1.0f, vSize.fY*2, 1.0f); 
		glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); 
		glCullFace(GL_FRONT); 
		ASDrawMd2Frame(pSliderModel, 0); 
		glCullFace(GL_BACK); 
		glPopMatrix(); 
	} 
	if(_ASConfig->bMultitexturing) 
	{ 
		glActiveTextureARB(GL_TEXTURE1_ARB); 
		glDisable(GL_TEXTURE_2D); 
		glDisable(GL_TEXTURE_GEN_S); 
		glDisable(GL_TEXTURE_GEN_T); 
		glActiveTextureARB(GL_TEXTURE0_ARB); 
	} 
	if(_AS->bCompiledVertexArraySupported) 
		glUnlockArraysEXT(); 
	glDisableClientState(GL_VERTEX_ARRAY); 
	glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
} // end cELEMENT::Draw() 
 
void cELEMENT::DrawText(AS_WINDOW *pWindow) 
{ // begin cELEMENT::DrawText() 
	double fModelViewMatrix[16], fProjectionMatrix[16], dWinX, dWinY, dWinZ; 
	int iViewport[4]; 
 
	if(!bVisible) 
		return; 
	 
	glGetDoublev(GL_MODELVIEW_MATRIX, fModelViewMatrix); 
	glGetDoublev(GL_PROJECTION_MATRIX, fProjectionMatrix); 
	iViewport[0] = iViewport[1] = 0; 
	iViewport[2] = 640; 
	iViewport[3] = 480; 
	 
	switch(eType) 
	{ 
		case CHECK_ELEMENT: case BUTTON_ELEMENT: case SLIDER_ELEMENT: case TEXT_ELEMENT: 
			if(eType == CHECK_ELEMENT) 
				gluProject(vWorldPos.fX+vSize.fX, vWorldPos.fY+vSize.fY/1.4f, vWorldPos.fZ, fModelViewMatrix, fProjectionMatrix, iViewport, &dWinX, &dWinY, &dWinZ); 
			else 
				gluProject(vWorldPos.fX, vWorldPos.fY+vSize.fY, vWorldPos.fZ, fModelViewMatrix, fProjectionMatrix, iViewport, &dWinX, &dWinY, &dWinZ); 
			 
			glEnable(GL_BLEND); 
			glEnable(GL_TEXTURE_2D); 
			glDisable(GL_DEPTH_TEST); 
			if(bActive || bRound) 
				glColor4f(1.0f, 1.0f, 1.0f, 0.9f); 
			else 
				glColor4f(0.5f, 0.5f, 0.5f, 0.5f); 
			if(eType == CHECK_ELEMENT) 
				pWindow->PrintAnimated((int) dWinX, (int) dWinY, byText, 0, 1.0f, fFontAni, 0); 
			else 
				pWindow->PrintAnimated((int) dWinX, (int) dWinY, byText, 0, 1.0f, fFontAni, 1); 
			glEnable(GL_DEPTH_TEST); 
		break; 
	} 
} // end cELEMENT::DrawText() 
 
void cELEMENT::Check(void) 
{ // begin cELEMENT::Check() 
	int i; 
	 
	if(!bVisible || !bActive) 
		return; 
 
	if(vMouseWorldPos.fX > vWorldPos.fX-vSize.fX && 
	   vMouseWorldPos.fY > vWorldPos.fY-vSize.fY && 
	   vMouseWorldPos.fX < vWorldPos.fX+vSize.fX && 
	   vMouseWorldPos.fY < vWorldPos.fY+vSize.fY) 
	{ // The mouse is on the button: 
		if(eType == SLIDER_ELEMENT) 
		{ // Check the slider: 
			if(ASMouse.byButtons[0]) 
			{ 
				iCurrentSliderPos = (int) -((vWorldPos.fX-vSize.fX-vMouseWorldPos.fX)/vSize.fX/2*(iSliderMax-iSliderMin)-1.5f); 
				if(iCurrentSliderPos < iSliderMin) 
					iCurrentSliderPos = iSliderMin; 
				if(iCurrentSliderPos > iSliderMax) 
					iCurrentSliderPos = iSliderMax; 
				if(pLeftMouseButton) 
					pLeftMouseButton(); 
			} 
		} 
		else 
		{ 
			if(ASMouse.bFirstButtons[0]) 
			{ 
				if(!bRound) 
				{ 
					if(eType != BUTTON_ELEMENT) 
						bChecked = !bChecked; 
				} 
				else 
					bChecked = TRUE; 
				if(pLeftMouseButton) 
					pLeftMouseButton(); 
			} 
		} 
	} 
 
	// Animate: 
	for(i = 0; i < 3; i++) 
	{ 
		vAniPos.fV[i] += (float) vAniSpeed.fV[i]*g_lDeltatime/50; 
		if(vAniLastPos.fV[i] > vAniNewPos.fV[i]) 
		{ 
			vAniSpeed.fV[i] -= g_lDeltatime/30; 
			if(vAniPos.fV[i] <= vAniNewPos.fV[i]) 
			{ 
				vAniSpeed.fV[i] *= 0.5f; 
				vAniLastPos.fV[i] = vAniPos.fV[i]; 
				if((rand() % 2)) 
					vAniNewPos.fV[i] = (float) (rand() % 100)/10.0f; 
				else 
					vAniNewPos.fV[i] = -(float) (rand() % 100)/10.0f; 
			} 
		} 
		else 
		{ 
			vAniSpeed.fV[i] += g_lDeltatime/30; 
			if(vAniPos.fV[i] >= vAniNewPos.fV[i]) 
			{ 
				vAniSpeed.fV[i] *= 0.5f; 
				vAniLastPos.fV[i] = vAniPos.fV[i]; 
				if((rand() % 2)) 
					vAniNewPos.fV[i] = (float) (rand() % 100)/10.0f; 
				else 
					vAniNewPos.fV[i] = -(float) (rand() % 100)/10.0f; 
			} 
		} 
	} 
} // end cELEMENT::Check() 
/////////////////////////////////////////////////////////////////////////////// 
 
 
HRESULT GameMenu(void) 
{ // begin GameMenu() 
	MSG msg; 
 
	_AS->WriteLogMessage("Enter game menu module"); 
	_AS->bDraw = FALSE; 
	_AS->pWindow[GAME_WINDOW_ID].SetDrawFunction(GameMenuDraw); 
	_AS->pWindow[GAME_WINDOW_ID].SetCheckFunction(GameMenuCheck); 
	 
	_AS->iActiveLights = 0; 
	_ASCamera->SetStandartCamera(); 
	EnumerateCardStyles(); 
	InitGameMenuElements(); 
	SetStandartMenuCamera(); 
	g_lGameTimer = 0; 
	lGameMenuBackgroundAniTimer = lBackFlashTimeDelay = lBackFlashTime = g_lGameTimer; 
	_AS->bDraw = TRUE; 
 
	// Go into the game loop: 
	_AS->WriteLogMessage("Enter the game menu loop"); 
	for(;;) 
	{ 
		if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
    	{ 
        	if(!GetMessage(&msg, NULL, 0, 0)) 
                break; 
        	TranslateMessage(&msg); 
        	DispatchMessage(&msg); 
    	} 
		else 
		{	 
			if(_AS->GetShutDown() || _AS->CheckModuleChange()) 
				PostQuitMessage(0); 
			if(!_AS->GetActive()) 
				continue; 
			_AS->UpdateWindows(); 
		} 
	} 
	_AS->WriteLogMessage("Left the game game loop"); 
 
	DestroyFoundCardStyles(); 
	_AS->bDraw = FALSE; 
	 
	// Left the game module: 
	return msg.wParam; 
} // end GameMenu() 
 
HRESULT GameMenuDraw(AS_WINDOW *pWindow) 
{ // begin GameDraw() 
	if(!_AS->bDraw) 
		return 0; 
	 
	// Setup general stuff: 
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
	 
	// Setup normal projection: 
	glMatrixMode(GL_PROJECTION); 
	glLoadIdentity(); 
	gluPerspective(45.f+_ASCamera->fWaterScale[0], 
				   (float) (_ASConfig->iWindowWidth+_ASCamera->fWaterScale[1])/(float) (_ASConfig->iWindowHeight+_ASCamera->fWaterScale[2]), 10.0f, 150.0f); 
	glMatrixMode(GL_MODELVIEW); 
	glLoadIdentity(); 
	SetupLights(); 
 
	// Draw background: 
	glBindTexture(GL_TEXTURE_2D, GameTexture[6].iOpenGLID); 
	glDisable(GL_BLEND); 
	glEnable(GL_TEXTURE_2D); 
	glDisable(GL_DEPTH_TEST); 
	glColor3f(1.0f, 1.0f, 1.0f); 
	glLoadIdentity(); 
	glTranslatef(0.0f, 0.0f, -24.0f); 
	glBegin(GL_QUADS); 
		glTexCoord2f(0.0f, 1.0f); glVertex2f(-15.0f, -11.0f); 
		glTexCoord2f(1.0f, 1.0f); glVertex2f( 15.0f, -11.0f); 
		glTexCoord2f(1.0f, 0.0f); glVertex2f( 15.0f,  11.0f); 
		glTexCoord2f(0.0f, 0.0f); glVertex2f(-15.0f,  11.0f); 
	glEnd(); 
 
	// Draw the water background: 
	glColor4f(fCurrentBackFlash, fCurrentBackFlash, 0.5f+fCurrentBackFlash, 0.5f); 
	glEnable(GL_BLEND); 
	glLoadIdentity(); 
	glTranslatef(0.0f, 0.0f, -34.0f); 
	glBindTexture(GL_TEXTURE_2D, Caust1Texture[iGameMenuBackgroundAniStep].iOpenGLID); 
	glBegin(GL_QUADS); 
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-15.0f, -11.0f, 10.0f); 
		glTexCoord2f(1.0f, 0.0f); glVertex3f(15.0f, -11.0f, 10.0f); 
		glTexCoord2f(1.0f, 1.0f); glVertex3f(15.0f, 11.0f, 10.0f); 
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-15.0f, 11.0f, 10.0f); 
	glEnd(); 
	glEnable(GL_DEPTH_TEST); 
 
	// Setup camera: 
	_ASCamera->SetCameraTranslation(FALSE); 
	 
	glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 
	glMateriali(GL_FRONT, GL_SHININESS,128); 
 
	ASEnableLighting(); 
 
	glEnable(GL_LIGHTING); 
		GLfloat LightAmbient[]	= { 0.7f, 0.7f, 0.7f, 1.0f }; 
		GLfloat LightDiffuse[]	= { 0.5f, 0.5f, 0.5f, 1.0f };  
		float fLightData[4]  = {0.0f, 0.0f, 0.0f, 0.0f}; 
 
		fLightData[0] = -15.0f; 
		fLightData[1] = -5.0f; 
		fLightData[2] = -10.0f; 
		fLightData[3] = 1.0f; 
		glLightfv(GL_LIGHT0+_AS->iActiveLights, GL_POSITION, fLightData); 
		glLightfv(GL_LIGHT0+_AS->iActiveLights, GL_AMBIENT , LightAmbient); 
		glLightfv(GL_LIGHT0+_AS->iActiveLights, GL_DIFFUSE, LightDiffuse); 
		glEnable(GL_LIGHT0+_AS->iActiveLights); 
		_AS->iActiveLights++; 
 
 
	// Draw the elements: 
	DrawGameMenuElements(pWindow); 
 
	// Draw the symbols: 
	glDisable(GL_BLEND); 
	glCullFace(GL_FRONT); 
 
	// Computer easy: 
	glPushMatrix(); 
	glTranslatef(cP1ComputerEasy.vWorldPos.fX-3.0f, 
				 cP1ComputerEasy.vWorldPos.fY+cP1ComputerEasy.vSize.fY*1.5f, 
				 cP1ComputerEasy.vWorldPos.fZ); 
	glRotatef(180.0f, 1.0f, 0.0f, 0.0f); 
	glRotatef(cP1ComputerEasy.vAniPos.fX/4, 1.0f, 0.0f, 0.0f); 
	glRotatef(cP1ComputerEasy.vAniPos.fY/4, 0.0f, 1.0f, 0.0f); 
	glRotatef(cP1ComputerEasy.vAniPos.fZ/4, 0.0f, 0.0f, 1.0f); 
	glScalef(0.065f, 0.065f, 0.065f); 
	glBindTexture(GL_TEXTURE_2D, GameTexture[7].iOpenGLID); 
	ASDrawMd2Frame(pComputerModel, 0); 
 
	// Draw the computer screen: 
	glBindTexture(GL_TEXTURE_2D, GameTexture[0].iOpenGLID); 
	glBegin(GL_QUADS); 
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f, 36.0f, 18.0f); 
		glTexCoord2f(1.0f, 0.0f); glVertex3f(14.0f, 36.0f, 18.0f); 
		glTexCoord2f(1.0f, 1.0f); glVertex3f(14.0f, 11.0f, 18.0f); 
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f, 11.0f, 18.0f); 
	glEnd(); 
	glPopMatrix(); 
 
	// Computer normal: 
	glPushMatrix(); 
	glTranslatef(cP1ComputerNormal.vWorldPos.fX-3.0f, 
				 cP1ComputerNormal.vWorldPos.fY+cP1ComputerNormal.vSize.fY*1.5f, 
				 cP1ComputerNormal.vWorldPos.fZ); 
	glRotatef(180.0f, 1.0f, 0.0f, 0.0f); 
	glRotatef(cP1ComputerNormal.vAniPos.fX/4, 1.0f, 0.0f, 0.0f); 
	glRotatef(cP1ComputerNormal.vAniPos.fY/4, 0.0f, 1.0f, 0.0f); 
	glRotatef(cP1ComputerNormal.vAniPos.fZ/4, 0.0f, 0.0f, 1.0f); 
	glScalef(0.065f, 0.065f, 0.065f); 
	glBindTexture(GL_TEXTURE_2D, GameTexture[7].iOpenGLID); 
	ASDrawMd2Frame(pComputerModel, 0); 
 
	// Draw the computer screen: 
	glBindTexture(GL_TEXTURE_2D, GameTexture[4].iOpenGLID); 
	glBegin(GL_QUADS); 
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f, 36.0f, 18.0f); 
		glTexCoord2f(1.0f, 0.0f); glVertex3f(14.0f, 36.0f, 18.0f); 
		glTexCoord2f(1.0f, 1.0f); glVertex3f(14.0f, 11.0f, 18.0f); 
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f, 11.0f, 18.0f); 
	glEnd(); 
	glPopMatrix(); 
 
	// Computer clever: 
	glPushMatrix(); 
	glTranslatef(cP1ComputerClever.vWorldPos.fX-3.0f, 
				 cP1ComputerClever.vWorldPos.fY+cP1ComputerClever.vSize.fY*1.5f, 
				 cP1ComputerClever.vWorldPos.fZ); 
	glRotatef(180.0f, 1.0f, 0.0f, 0.0f); 
	glRotatef(cP1ComputerClever.vAniPos.fX/4, 1.0f, 0.0f, 0.0f); 
	glRotatef(cP1ComputerClever.vAniPos.fY/4, 0.0f, 1.0f, 0.0f); 
	glRotatef(cP1ComputerClever.vAniPos.fZ/4, 0.0f, 0.0f, 1.0f); 
	glScalef(0.065f, 0.065f, 0.065f); 
	glBindTexture(GL_TEXTURE_2D, GameTexture[7].iOpenGLID); 
	ASDrawMd2Frame(pComputerModel, 0); 
 
	// Draw the computer screen: 
	glBindTexture(GL_TEXTURE_2D, GameTexture[8].iOpenGLID); 
	glBegin(GL_QUADS); 
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f, 36.0f, 18.0f); 
		glTexCoord2f(1.0f, 0.0f); glVertex3f(14.0f, 36.0f, 18.0f); 
		glTexCoord2f(1.0f, 1.0f); glVertex3f(14.0f, 11.0f, 18.0f); 
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f, 11.0f, 18.0f); 
	glEnd(); 
	glPopMatrix(); 
 
	glCullFace(GL_BACK); 
	_ASCamera->SetCameraTranslation(FALSE); 
	glEnable(GL_BLEND); 
	glColor4f(1.0f, 1.0f, 1.0f, 0.0f); 
	glBegin(GL_QUADS); 
		glVertex3f(-100.0f, 100.0f, 0.0f); 
		glVertex3f(100.0f, 100.0f, 0.0f); 
		glVertex3f(100.0f, -100.0f, 0.0f); 
		glVertex3f(-100.0f, -100.0f, 0.0f); 
	glEnd(); 
 
	DrawMouseCursor(5.0f); 
	DisplaySmallMessage(pWindow); 
 
	ASSwapBuffers(*pWindow->GethDC(), pWindow, TRUE); 
 
	return 0; 
} // end GameMenuDraw() 
 
HRESULT GameMenuCheck(AS_WINDOW *pWindow) 
{ // begin GameMenuCheck() 
	float fDelta; 
	 
	_AS->ReadDXInput(*pWindow->GethWnd()); 
	AnimateFont(); 
	_ASCamera->SetCameraTranslation(FALSE); 
	UpdateMouseWorldPos(TRUE); 
	CheckSmallMessage(); 
	CheckGameMenuElements(); 
 
	// Animate the background: 
	if(g_lGameTimer-lGameMenuBackgroundAniTimer > 70 || g_lGameTimer-lGameMenuBackgroundAniTimer < 0) 
	{ // Go to the next animation step: 
		lGameMenuBackgroundAniTimer = g_lGameTimer; 
		iGameMenuBackgroundAniStep++; 
		if(iGameMenuBackgroundAniStep >= 32) 
			iGameMenuBackgroundAniStep = 0; 
	} 
	 
	// Change the color of the background: 
	if((g_lGameTimer-lBackFlashTime) > lBackFlashTimeDelay || g_lGameTimer-lBackFlashTime < 0) 
	{ 
		lBackFlashTime = g_lGameTimer; 
		lBackFlashTimeDelay = rand() % 500+300; 
		fLastBackFlash = fBackFlash; 
		fBackFlash = (float) (rand() % 50)/100.0f; 
		fBackFlashDelta = fBackFlash-fLastBackFlash; 
	} 
	fDelta = ((float) (g_lGameTimer-lBackFlashTime+1)/lBackFlashTimeDelay); 
	if(fDelta < 0.0f) 
		fDelta = -fDelta; 
	if(fBackFlash > fLastBackFlash) 
		fCurrentBackFlash = (float) fLastBackFlash+fBackFlashDelta*fDelta; 
	else 
		fCurrentBackFlash = (float) fLastBackFlash+fBackFlashDelta*fDelta; 
 
// Keys: 
	if(ASKeyFirst[DIK_F1]) 
	{ // Open the help file: 
		OpenHelp(); 
		return 0; 
	} 
	if(ASKeyFirst[DIK_F2]) 
		OpenAdvancedGameMenuDialog(); 
	if(ASKeyFirst[DIK_F11]) 
		MusicNext(); 
	if(ASKeyFirst[DIK_F12]) 
	{ // Open the configuration menu: 
		SendMessage(*_AS->pWindow[GAME_WINDOW_ID].GethWnd(), WM_COMMAND, ID_OPTIONS_CONFIG, 0); 
		InitGameMenuElementsLanguage(); 
	} 
	if(ASKeyFirst[DIK_ESCAPE]) 
		_AS->SetShutDown(TRUE); 
// Other: 
 
	return 0; 
} // end GameMenuCheck() 
 
void EnumerateCardStyles(void) 
{ // begin EnumerateCardStyles() 
	WIN32_FIND_DATA FindFileData; 
	char byTemp[256], byFilename[256], byStyleName[256]; 
	HANDLE Find; 
	                    
	_AS->WriteLogMessage("Enumerate card styles"); 
	if(pbyFoundCardStyle) 
		DestroyFoundCardStyles(); 
	iFoundCardStyles = 0; 
	sprintf(byTemp, "%s%s\\*.*", _AS->byProgramPath, _AS->byCardStylesDirectory); 
	Find = FindFirstFile(byTemp, &FindFileData); 
	for(;;) 
	{ 
		if(FindFileData.cFileName[0] != '.' && FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) 
		{ // We found a card style: 
			iFoundCardStyles++; 
			pbyFoundCardStyle = (char **) realloc(pbyFoundCardStyle, sizeof(char **)*iFoundCardStyles); 
			pbyFoundCardStyle[iFoundCardStyles-1] = new char[strlen(FindFileData.cFileName)+1]; 
			strcpy(pbyFoundCardStyle[iFoundCardStyles-1], FindFileData.cFileName); 
 
			// Get the style name: 
			// Get the absolute path: 
			sprintf(byFilename, "%s%s\\%s\\info.txt", _AS->byProgramPath, _AS->byCardStylesDirectory, FindFileData.cFileName); 
			sprintf(byTemp, "general_%s", _ASConfig->byLanguage); 
			GetPrivateProfileString(byTemp, "name", "Noname", byStyleName, 256, byFilename); 
 
			pbyFoundCardStyleName = (char **) realloc(pbyFoundCardStyleName, sizeof(char **)*iFoundCardStyles); 
			pbyFoundCardStyleName[iFoundCardStyles-1] = new char[strlen(byStyleName)+1]; 
			strcpy(pbyFoundCardStyleName[iFoundCardStyles-1], byStyleName); 
		} 
		if(!FindNextFile(Find, &FindFileData)) 
			break; 
	} 
} // end EnumerateCardStyles() 
 
void DestroyFoundCardStyles(void) 
{ // begin DestroyFoundCardStyles() 
	for(int i = 0; i < iFoundCardStyles; i++) 
	{ 
		SAFE_DELETE(pbyFoundCardStyle[i]); 
		SAFE_DELETE(pbyFoundCardStyleName[i]); 
	} 
	SAFE_DELETE(pbyFoundCardStyle); 
	SAFE_DELETE(pbyFoundCardStyleName); 
	iFoundCardStyles = 0; 
} // end DestroyFoundCardStyles() 
 
void SetStandartMenuCamera(void) 
{ // begin AS_CAMERA::SetStandartMenuCamera() 
	memset(_ASCamera, 0, sizeof(AS_CAMERA)); 
	_ASCamera->fZoom = -55.0f; 
	_ASCamera->vPos.fY = -4.5f; 
} // end AS_CAMERA::SetStandartMenuCamera() 
 
void InitGameMenuElements(void) 
{ // begin InitGameMenuElements() 
	int i, i2; 
 
	for(i = 0; i < MENU_BUTTONS; i++) 
		memset(cButtonList[i], 0, sizeof(cELEMENT)); 
 
	// Setup player buttons: 
	for(i = 0; i < 4; i++) 
		for(i2 = 0; i2 < 4; i2++) 
		{ 
			cPlayerButton[i][i2]->eType = CHECK_ELEMENT; 
			cPlayerButton[i][i2]->vSize = 1.0f; 
			cPlayerButton[i][i2]->bVisible = TRUE; 
			cPlayerButton[i][i2]->bActive = FALSE; 
			cPlayerButton[i][i2]->bChecked = FALSE; 
			cPlayerButton[i][i2]->bRound = TRUE; 
		} 
	for(i = 0; i < cGameConfig.iPlayers; i++) 
		for(i2 = 0; i2 < 4; i2++) 
			cPlayerButton[i][i2]->bActive = TRUE; 
	cP1.eType = CHECK_ELEMENT; 
	cP1.vSize = 1.0f; 
	cP1.bVisible = TRUE; 
	cP1.bActive = TRUE; 
	cP1.pLeftMouseButton = P1Button; 
	cP2.eType = CHECK_ELEMENT; 
	cP2.vSize = 1.0f; 
	cP2.bVisible = TRUE; 
	cP2.bActive = TRUE; 
	cP2.pLeftMouseButton = P2Button; 
	cP3.eType = CHECK_ELEMENT; 
	cP3.vSize = 1.0f; 
	cP3.bVisible = TRUE; 
	cP3.bActive = TRUE; 
	cP3.pLeftMouseButton = P3Button; 
	cP4.eType = CHECK_ELEMENT; 
	cP4.vSize = 1.0f; 
	cP4.bVisible = TRUE; 
	cP4.bActive = TRUE; 
	cP4.pLeftMouseButton = P4Button; 
	 
	cP1.bChecked = cP2.bChecked = cP3.bChecked = cP4.bChecked = FALSE; 
	cP1.bRound = cP2.bRound = cP3.bRound = cP4.bRound = TRUE; 
	switch(cGameConfig.iPlayers) 
	{ 
		case 1: cP1.bChecked = TRUE; break; 
		case 2: cP2.bChecked = TRUE; break; 
		case 3: cP3.bChecked = TRUE; break; 
		case 4: cP4.bChecked = TRUE; break; 
	} 
	for(i = 0; i < 4; i++) 
		cPlayerButton[i][cGameConfig.PlayerType[i]]->bChecked = TRUE; 
 
	cP1.vWorldPos.fX = -6.0f; 
	cP1.vWorldPos.fY = -7.0f; 
	cP1Human.vWorldPos.fX = -6.0f; 
	cP1Human.vWorldPos.fY = -4.0f; 
	cP1Human.pLeftMouseButton = P1HumanButton; 
	cP1ComputerEasy.vWorldPos.fX = -6.0f; 
	cP1ComputerEasy.vWorldPos.fY = -1.0f; 
	cP1ComputerEasy.pLeftMouseButton = P1ComputerEasyButton; 
	cP1ComputerNormal.vWorldPos.fX = -6.0f; 
	cP1ComputerNormal.vWorldPos.fY = 2.0f; 
	cP1ComputerNormal.pLeftMouseButton = P1ComputerNormalButton; 
	cP1ComputerClever.vWorldPos.fX = -6.0f; 
	cP1ComputerClever.vWorldPos.fY = 5.0f; 
	cP1ComputerClever.pLeftMouseButton = P1ComputerCleverButton; 
 
	cP2.vWorldPos.fX = -2.5f; 
	cP2.vWorldPos.fY = -7.0f; 
	cP2Human.vWorldPos.fX = -2.5f; 
	cP2Human.vWorldPos.fY = -4.0f; 
	cP2Human.pLeftMouseButton = P2HumanButton; 
	cP2ComputerEasy.vWorldPos.fX = -2.5f; 
	cP2ComputerEasy.vWorldPos.fY = -1.0f; 
	cP2ComputerEasy.pLeftMouseButton = P2ComputerEasyButton; 
	cP2ComputerNormal.vWorldPos.fX = -2.5f; 
	cP2ComputerNormal.vWorldPos.fY = 2.0f; 
	cP2ComputerNormal.pLeftMouseButton = P2ComputerNormalButton; 
	cP2ComputerClever.vWorldPos.fX = -2.5f; 
	cP2ComputerClever.vWorldPos.fY = 5.0f; 
	cP2ComputerClever.pLeftMouseButton = P2ComputerCleverButton; 
 
	cP3.vWorldPos.fX = 1.0f; 
	cP3.vWorldPos.fY = -7.0f; 
	cP3Human.vWorldPos.fX = 1.0f; 
	cP3Human.vWorldPos.fY = -4.0f; 
	cP3Human.pLeftMouseButton = P3HumanButton; 
	cP3ComputerEasy.vWorldPos.fX = 1.0f; 
	cP3ComputerEasy.vWorldPos.fY = -1.0f; 
	cP3ComputerEasy.pLeftMouseButton = P3ComputerEasyButton; 
	cP3ComputerNormal.vWorldPos.fX = 1.0f; 
	cP3ComputerNormal.vWorldPos.fY = 2.0f; 
	cP3ComputerNormal.pLeftMouseButton = P3ComputerNormalButton; 
	cP3ComputerClever.vWorldPos.fX = 1.0f; 
	cP3ComputerClever.vWorldPos.fY = 5.0f; 
	cP3ComputerClever.pLeftMouseButton = P3ComputerCleverButton; 
 
	cP4.vWorldPos.fX = 4.5f; 
	cP4.vWorldPos.fY = -7.0f; 
	cP4Human.vWorldPos.fX = 4.5f; 
	cP4Human.vWorldPos.fY = -4.0f; 
	cP4Human.pLeftMouseButton = P4HumanButton; 
	cP4ComputerEasy.vWorldPos.fX = 4.5f; 
	cP4ComputerEasy.vWorldPos.fY = -1.0f; 
	cP4ComputerEasy.pLeftMouseButton = P4ComputerEasyButton; 
	cP4ComputerNormal.vWorldPos.fX = 4.5f; 
	cP4ComputerNormal.vWorldPos.fY = 2.0f; 
	cP4ComputerNormal.pLeftMouseButton = P4ComputerNormalButton; 
	cP4ComputerClever.vWorldPos.fX = 4.5f; 
	cP4ComputerClever.vWorldPos.fY = 5.0f; 
	cP4ComputerClever.pLeftMouseButton = P4ComputerCleverButton; 
 
	cCardPairsSlider.eType = SLIDER_ELEMENT; 
	cCardPairsSlider.pLeftMouseButton = CardPairsSlider; 
	cCardPairsSlider.vWorldPos.fX = -5.0f; 
	cCardPairsSlider.vWorldPos.fY = 15.0f; 
	cCardPairsSlider.vSize.fX = 14.0f; 
	cCardPairsSlider.vSize.fY = 0.8f; 
	cCardPairsSlider.vSize.fZ = 1.0f; 
	cCardPairsSlider.bVisible = TRUE; 
	cCardPairsSlider.bActive = TRUE; 
	cCardPairsSlider.iSliderMin = 1; 
	for(i = 0, i2 = 0; i < 11; i++) 
	{ 
		cGameConfig.iCardPairs = iCardDimensionStencil[i][X]*iCardDimensionStencil[i][Y]/2; 
		if(cGameConfig.iCardPairs <= pcCardStyle->iCards) 
			i2++; 
	} 
	cCardPairsSlider.iSliderMax = i2-1; 
	cCardPairsSlider.iCurrentSliderPos = cGameConfig.iCardDimension; 
	cGameConfig.iCardPairs = iCardDimensionStencil[cGameConfig.iCardDimension][X]*iCardDimensionStencil[cGameConfig.iCardDimension][Y]/2; 
 
	cCardPairsText.eType = TEXT_ELEMENT; 
	cCardPairsText.vWorldPos.fX = 18.0f; 
	cCardPairsText.vWorldPos.fY = 15.0f; 
	cCardPairsText.vSize = 1.0f; 
	cCardPairsText.bVisible = TRUE; 
	cCardPairsText.bActive = TRUE; 
	strcpy(cCardPairsText.byText, T_CardPairs); 
 
	cCardStyleLast.eType = BUTTON_ELEMENT; 
	cCardStyleLast.pLeftMouseButton = CardStyleLast; 
	cCardStyleLast.vWorldPos.fX = -7.0f; 
	cCardStyleLast.vWorldPos.fY = 18.0f; 
	cCardStyleLast.vSize = 1.0f; 
	cCardStyleLast.bVisible = TRUE; 
	cCardStyleLast.bActive = TRUE; 
 
	cCardStyleNext.eType = BUTTON_ELEMENT; 
	cCardStyleNext.pLeftMouseButton = CardStyleNext; 
	cCardStyleNext.vWorldPos.fX = -5.0f; 
	cCardStyleNext.vWorldPos.fY = 18.0f; 
	cCardStyleNext.vSize = 1.0f; 
	cCardStyleNext.bVisible = TRUE; 
	cCardStyleNext.bActive = TRUE; 
 
	cCardStyleText.eType = TEXT_ELEMENT; 
	cCardStyleText.vWorldPos.fX = 9.0f; 
	cCardStyleText.vWorldPos.fY = 18.0f; 
	cCardStyleText.vSize = 1.0f; 
	cCardStyleText.bVisible = TRUE; 
	cCardStyleText.bActive = TRUE; 
	sprintf(cCardStyleText.byText, "%s: %s", T_CardStyle, pcCardStyle->byFolderName); 
 
	// Think time limit: 
	cThinkTime.eType = CHECK_ELEMENT; 
	cThinkTime.pLeftMouseButton = ThinkTimeButton; 
	cThinkTime.vWorldPos.fX = -15.0f; 
	cThinkTime.vWorldPos.fY = 10.0f; 
	cThinkTime.vSize = 1.0f; 
	cThinkTime.bVisible = TRUE; 
	cThinkTime.bActive = TRUE; 
	cThinkTime.bChecked = cGameConfig.bThinkTimeLimit; 
 
	cThinkTimeSlider.eType = SLIDER_ELEMENT; 
	cThinkTimeSlider.pLeftMouseButton = ThinkTimeSlider; 
	cThinkTimeSlider.vWorldPos.fX = 12.0f; 
	cThinkTimeSlider.vWorldPos.fY = 10.0f; 
	cThinkTimeSlider.vSize.fX = 10.0f; 
	cThinkTimeSlider.vSize.fY = 0.8f; 
	cThinkTimeSlider.vSize.fZ = 1.0f; 
	cThinkTimeSlider.bVisible = TRUE; 
	cThinkTimeSlider.bActive = cThinkTime.bChecked; 
	cThinkTimeSlider.iSliderMin = 2; 
	cThinkTimeSlider.iSliderMax = 30; 
	cThinkTimeSlider.iCurrentSliderPos = cGameConfig.iThinkTime; 
 
	// Other 
	cStart.eType = BUTTON_ELEMENT; 
	cStart.pLeftMouseButton = StartButton; 
	cStart.vWorldPos.fX = -14.0f; 
	cStart.vWorldPos.fY = 25.0f; 
	cStart.vSize.fX = 8.0f; 
	cStart.vSize.fY = 0.8f; 
	cStart.vSize.fZ = 1.0f; 
	cStart.bVisible = TRUE; 
	cStart.bActive = TRUE; 
 
	cAdvancedOptions.eType = BUTTON_ELEMENT; 
	cAdvancedOptions.pLeftMouseButton = AdvancedOptionsButton; 
	cAdvancedOptions.vWorldPos.fX = 0.0f; 
	cAdvancedOptions.vWorldPos.fY = 23.0f; 
	cAdvancedOptions.vSize.fX = 15.0f; 
	cAdvancedOptions.vSize.fY = 0.8f; 
	cAdvancedOptions.vSize.fZ = 1.0f; 
	cAdvancedOptions.bVisible = TRUE; 
	cAdvancedOptions.bActive = TRUE; 
 
	cQuit.eType = BUTTON_ELEMENT; 
	cQuit.pLeftMouseButton = QuitButton; 
	cQuit.vWorldPos.fX = 18.0f; 
	cQuit.vWorldPos.fY = 25.0f; 
	cQuit.vSize.fX = 8.0f; 
	cQuit.vSize.fY = 0.8f; 
	cQuit.vSize.fZ = 1.0f; 
	cQuit.bVisible = TRUE; 
	cQuit.bActive = TRUE; 
 
	InitGameMenuElementsLanguage(); 
} // end InitGameMenuElements() 
 
void InitGameMenuElementsLanguage(void) 
{ // begin InitGameMenuElementsLanguage() 
	strcpy(cP1.byText, "1"); 
	strcpy(cP2.byText, "2"); 
	strcpy(cP3.byText, "3"); 
	strcpy(cP4.byText, "4"); 
	strcpy(cP4Human.byText, T_Human); 
	strcpy(cP4ComputerEasy.byText, T_ComputerEasy); 
	strcpy(cP4ComputerNormal.byText, T_ComputerNormal); 
	strcpy(cP4ComputerClever.byText, T_ComputerClever); 
	sprintf(cCardPairsSlider.byText, "%d", cGameConfig.iCardPairs); 
	strcpy(cCardStyleLast.byText, "<"); 
	strcpy(cCardStyleNext.byText, ">"); 
	strcpy(cCardPairsText.byText, T_CardPairs); 
	sprintf(cCardStyleText.byText, "%s: %s", T_CardStyle, pcCardStyle->byFolderName); 
	strcpy(cThinkTime.byText, T_ThinkTimeLimit); 
	sprintf(cThinkTimeSlider.byText, "%d %s", cGameConfig.iThinkTime, T_Seconds); 
	strcpy(cStart.byText, T_StartGame); 
	strcpy(	cAdvancedOptions.byText, T_AdvancedOptions); 
	strcpy(cQuit.byText, T_Quit); 
} // end InitGameMenuElementsLanguage() 
 
void DrawGameMenuElements(AS_WINDOW *pWindow) 
{ // begin DrawGameMenuElements() 
	int i; 
 
	for(i = 0; i < MENU_BUTTONS; i++) 
		cButtonList[i]->Draw(); 
	for(i = 0; i < MENU_BUTTONS; i++) 
		cButtonList[i]->DrawText(pWindow); 
} // end DrawGameMenuElements() 
 
void CheckGameMenuElements(void) 
{ // begin CheckGameMenuElements() 
	for(int i = 0; i < MENU_BUTTONS; i++) 
		cButtonList[i]->Check(); 
} // end CheckGameMenuElements() 
 
 
void P1Button(void) 
{ // begin P1Button() 
	int i, i2; 
 
	cGameConfig.iPlayers = 1; 
	cP2.bChecked = cP3.bChecked = cP4.bChecked = FALSE; 
	for(i = 0; i < 4; i++) 
		for(i2 = 0; i2 < 4; i2++) 
			cPlayerButton[i][i2]->bActive = FALSE; 
	for(i = 0; i < cGameConfig.iPlayers; i++) 
		for(i2 = 0; i2 < 4; i2++) 
			cPlayerButton[i][i2]->bActive = TRUE; 
} // end P1Button() 
 
void P2Button(void) 
{ // begin P2Button() 
	int i, i2; 
 
	cGameConfig.iPlayers = 2; 
	cP1.bChecked = cP3.bChecked = cP4.bChecked = FALSE; 
	for(i = 0; i < 4; i++) 
		for(i2 = 0; i2 < 4; i2++) 
			cPlayerButton[i][i2]->bActive = FALSE; 
	for(i = 0; i < cGameConfig.iPlayers; i++) 
		for(i2 = 0; i2 < 4; i2++) 
			cPlayerButton[i][i2]->bActive = TRUE; 
} // end P2Button() 
 
void P3Button(void) 
{ // begin P3Button() 
	int i, i2; 
 
	cGameConfig.iPlayers = 3; 
	cP1.bChecked = cP2.bChecked = cP4.bChecked = FALSE; 
	for(i = 0; i < 4; i++) 
		for(i2 = 0; i2 < 4; i2++) 
			cPlayerButton[i][i2]->bActive = FALSE; 
	for(i = 0; i < cGameConfig.iPlayers; i++) 
		for(i2 = 0; i2 < 4; i2++) 
			cPlayerButton[i][i2]->bActive = TRUE; 
} // end P3Button() 
 
void P4Button(void) 
{ // begin P4Button() 
	int i, i2; 
 
	cGameConfig.iPlayers = 4; 
	cP1.bChecked = cP2.bChecked = cP3.bChecked = FALSE; 
	for(i = 0; i < 4; i++) 
		for(i2 = 0; i2 < 4; i2++) 
			cPlayerButton[i][i2]->bActive = FALSE; 
	for(i = 0; i < cGameConfig.iPlayers; i++) 
		for(i2 = 0; i2 < 4; i2++) 
			cPlayerButton[i][i2]->bActive = TRUE; 
} // end P4Button() 
 
void P1HumanButton(void) 
{ // begin P1HumanButton() 
	cGameConfig.PlayerType[0] = PLAYER_TYPE_HUMAN; 
	cP1ComputerEasy.bChecked = cP1ComputerNormal.bChecked = cP1ComputerClever.bChecked = FALSE; 
} // end P1HumanButton() 
 
void P1ComputerEasyButton(void) 
{ // begin P1ComputerEasyButton() 
	cGameConfig.PlayerType[0] = PLAYER_TYPE_COMPUTER_EASY; 
	cP1Human.bChecked = cP1ComputerNormal.bChecked = cP1ComputerClever.bChecked = FALSE; 
} // end P1ComputerEasyButton() 
 
void P1ComputerNormalButton(void) 
{ // begin P1ComputerNormalButton() 
	cGameConfig.PlayerType[0] = PLAYER_TYPE_COMPUTER_NORMAL; 
	cP1Human.bChecked = cP1ComputerEasy.bChecked = cP1ComputerClever.bChecked = FALSE; 
} // end P1ComputerNormalButton() 
 
void P1ComputerCleverButton(void) 
{ // begin P1ComputerCleverButton() 
	cP1Human.bChecked = cP1ComputerEasy.bChecked = cP1ComputerNormal.bChecked = FALSE; 
	cGameConfig.PlayerType[0] = PLAYER_TYPE_COMPUTER_CLEVER; 
} // end P1ComputerCleverButton() 
 
void P2HumanButton(void) 
{ // begin P2HumanButton() 
	cGameConfig.PlayerType[1] = PLAYER_TYPE_HUMAN; 
	cP2ComputerEasy.bChecked = cP2ComputerNormal.bChecked = cP2ComputerClever.bChecked = FALSE; 
} // end P2HumanButton() 
 
void P2ComputerEasyButton(void) 
{ // begin P2ComputerEasyButton() 
	cGameConfig.PlayerType[1] = PLAYER_TYPE_COMPUTER_EASY; 
	cP2Human.bChecked = cP2ComputerNormal.bChecked = cP2ComputerClever.bChecked = FALSE; 
} // end P2ComputerEasyButton() 
 
void P2ComputerNormalButton(void) 
{ // begin P2ComputerNormalButton() 
	cGameConfig.PlayerType[1] = PLAYER_TYPE_COMPUTER_NORMAL; 
	cP2Human.bChecked = cP2ComputerEasy.bChecked = cP2ComputerClever.bChecked = FALSE; 
} // end P2ComputerNormalButton() 
 
void P2ComputerCleverButton(void) 
{ // begin P2ComputerCleverButton() 
	cGameConfig.PlayerType[1] = PLAYER_TYPE_COMPUTER_CLEVER; 
	cP2Human.bChecked = cP2ComputerEasy.bChecked = cP2ComputerNormal.bChecked = FALSE; 
} // end P2ComputerCleverButton() 
 
void P3HumanButton(void) 
{ // begin P3HumanButton() 
	cGameConfig.PlayerType[2] = PLAYER_TYPE_HUMAN; 
	cP3ComputerEasy.bChecked = cP3ComputerNormal.bChecked = cP3ComputerClever.bChecked = FALSE; 
} // end P3HumanButton() 
 
void P3ComputerEasyButton(void) 
{ // begin P3ComputerEasyButton() 
	cGameConfig.PlayerType[2] = PLAYER_TYPE_COMPUTER_EASY; 
	cP3Human.bChecked = cP3ComputerNormal.bChecked = cP3ComputerClever.bChecked = FALSE; 
} // end P3ComputerEasyButton() 
 
void P3ComputerNormalButton(void) 
{ // begin P3ComputerNormalButton() 
	cGameConfig.PlayerType[2] = PLAYER_TYPE_COMPUTER_NORMAL; 
	cP3Human.bChecked = cP3ComputerEasy.bChecked = cP3ComputerClever.bChecked = FALSE; 
} // end P3ComputerNormalButton() 
 
void P3ComputerCleverButton(void) 
{ // begin P3ComputerCleverButton() 
	cGameConfig.PlayerType[2] = PLAYER_TYPE_COMPUTER_CLEVER; 
	cP3Human.bChecked = cP3ComputerEasy.bChecked = cP3ComputerNormal.bChecked = FALSE; 
} // end P3ComputerCleverButton() 
 
void P4HumanButton(void) 
{ // begin P4HumanButton() 
	cGameConfig.PlayerType[3] = PLAYER_TYPE_HUMAN; 
	cP4ComputerEasy.bChecked = cP4ComputerNormal.bChecked = cP4ComputerClever.bChecked = FALSE; 
} // end P4HumanButton() 
 
void P4ComputerEasyButton(void) 
{ // begin P4ComputerEasyButton() 
	cGameConfig.PlayerType[3] = PLAYER_TYPE_COMPUTER_EASY; 
	cP4Human.bChecked = cP4ComputerNormal.bChecked = cP4ComputerClever.bChecked = FALSE; 
} // end P4ComputerEasyButton() 
 
void P4ComputerNormalButton(void) 
{ // begin P4ComputerNormalButton() 
	cGameConfig.PlayerType[3] = PLAYER_TYPE_COMPUTER_NORMAL; 
	cP4Human.bChecked = cP4ComputerEasy.bChecked = cP4ComputerClever.bChecked = FALSE; 
} // end P4ComputerNormalButton() 
 
void P4ComputerCleverButton(void) 
{ // begin P4ComputerCleverButton() 
	cGameConfig.PlayerType[3] = PLAYER_TYPE_COMPUTER_CLEVER; 
	cP4Human.bChecked = cP4ComputerEasy.bChecked = cP4ComputerNormal.bChecked = FALSE; 
} // end P4ComputerCleverButton() 
 
void CardPairsSlider(void) 
{ // begin CardPairsSlider() 
	cGameConfig.iCardDimension =  cCardPairsSlider.iCurrentSliderPos; 
	cGameConfig.iCardPairs = iCardDimensionStencil[cGameConfig.iCardDimension][X]*iCardDimensionStencil[cGameConfig.iCardDimension][Y]/2; 
	sprintf(cCardPairsSlider.byText, "%d", cGameConfig.iCardPairs); 
} // end CardPairsSlider() 
 
void CardStyleLast(void) 
{ // begin CardStyleLast() 
	int i; 
	 
	// Find the current music index: 
	for(i = 0; i < iFoundCardStyles; i++) 
	{ 
		if(!strcmp(pbyFoundCardStyle[i], pcCardStyle->byFolderName)) 
			break; 
	} 
	 
	// Choose the last card card style: 
	i--; 
	if(i < 0) 
		i = iFoundCardStyles-1; 
	 
	// Load the selected card style: 
	LoadNewCardStyle(i); 
} // end CardStyleLast() 
 
void CardStyleNext(void) 
{ // begin CardStyleNext() 
	int i; 
	 
	// Find the current music index: 
	for(i = 0; i < iFoundCardStyles; i++) 
	{ 
		if(!strcmp(pbyFoundCardStyle[i], pcCardStyle->byFolderName)) 
			break; 
	} 
	 
	// Choose the last card card style: 
	i++; 
	if(i > iFoundCardStyles-1) 
		i = 0; 
	 
	// Load the selected card style: 
	LoadNewCardStyle(i); 
} // end CardStyleNext() 
 
void LoadNewCardStyle(int i) 
{ // begin LoadNewCardStyle() 
	if(!pbyFoundCardStyle) 
		return; 
 
	// Load the selected card script: 
	pcCardStyle->Load(pbyFoundCardStyle[i]); 
 
	// Check if the number of card pairs is corrent: 
	for(;;) 
	{ 
		cGameConfig.iCardPairs = iCardDimensionStencil[cGameConfig.iCardDimension][X]*iCardDimensionStencil[cGameConfig.iCardDimension][Y]/2; 
		if(cGameConfig.iCardPairs > pcCardStyle->iCards) 
		{ 
			cGameConfig.iCardDimension--; 
			if(cGameConfig.iCardDimension <= 0) 
			{ 
				cGameConfig.iCardDimension = 0; 
				cGameConfig.iCardPairs = iCardDimensionStencil[cGameConfig.iCardDimension][X]*iCardDimensionStencil[cGameConfig.iCardDimension][Y]/2; 
				break; 
			} 
		} 
		else 
			break; 
	} 
	InitGameMenuElements(); 
} // end LoadNewCardStyle() 
 
void ThinkTimeButton(void) 
{ // begin ThinkTimeButton() 
	cGameConfig.bThinkTimeLimit = cThinkTime.bChecked; 
	cThinkTimeSlider.bActive = cThinkTime.bChecked; 
} // end ThinkTimeButton() 
 
void ThinkTimeSlider(void) 
{ // begin ThinkTimeSlider() 
	cGameConfig.iThinkTime = cThinkTimeSlider.iCurrentSliderPos; 
	sprintf(cThinkTimeSlider.byText, "%d %s", cGameConfig.iThinkTime, T_Seconds); 
} // end ThinkTimeSlider() 
 
void StartButton(void) 
{ // begin StartButton() 
	_AS->SetNextModule(MODULE_GAME); 
} // end StartButton() 
 
void AdvancedOptionsButton(void) 
{ // begin AdvancedOptionsButton() 
	OpenAdvancedGameMenuDialog(); 
} // end AdvancedOptionsButton() 
 
void QuitButton(void) 
{ // begin QuitButton() 
	_AS->SetShutDown(TRUE); 
} // end QuitButton() 
 
void MusicNext(void) 
{ // begin MusicNext() 
	int i; 
	 
	// Find the current music index: 
	for(i = 0; i < iFoundMusic; i++) 
	{ 
		if(!strcmp(pbyFoundMusic[i], byCurrentMusic)) 
			break; 
	} 
	 
	// Choose the next music: 
	i++; 
	if(i > iFoundMusic-1) 
		i = 0; 
	StartMusic(pbyFoundMusic[i]); 
} // end MusicNext()