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


//----------------------------------------------------------------------------- 
// File: Game.cpp 
//----------------------------------------------------------------------------- 
 
#include "AS\AS_Engine.h" 
#include "ModuleHeaders.h" 
 
 
// Variables: ***************************************************************** 
// Textures: 
AS_TEXTURE GameTexture[GAME_TEXTURES]; 
AS_TEXTURE Caust1Texture[CAUST_1_STEPS]; 
AS_TEXTURE BlurTexture, TempTexture; 
// Models: 
AS_MD2_MODEL *pCupModel, *pMouseModel, *pComputerModel, 
			 *pCheckedModel, *pSliderModel; 
AS_MD2_MODEL **pModels[] = {&pCupModel, &pMouseModel, &pComputerModel, 
							&pCheckedModel, &pSliderModel}; 
// Lists: 
int iSphereList; 
// Other: 
int GAME_WINDOW_ID = -1; // The window ID of our game window 
AS_3D_VECTOR vMouseWorldPos; // The mouse position in our 3D world 
BOOL bPause; // Is the game paused? 
// For the animated font: 
float fFontAni[4][2]; // The current vertex position 
float fFontAniLast[4][2]; // The last vertex position 
float fFontAniT[4][2]; // The vertex target position 
float fFontAniV[4][2]; // The vertex velocity 
// Small message: 
long lSmallMessageShowTime, lSmallMessageTimer, lSmallMessageTempTimer; 
float fSmallMessageBlend; 
char bySmallMessageText[256], bySmallMessageNewText[256]; 
BOOL bSmallMessageChangeText, bSmallMessageShowText; 
/////////////////////////////////////////////////////////////////////////////// 
 
// Functions: ***************************************************************** 
HRESULT Game(void); 
void LoadGameTextures(void); 
void CreateBlurTexture(void); 
void DestroyBlurTexture(void); 
HRESULT GameDraw(AS_WINDOW *); 
HRESULT GameCheck(AS_WINDOW *); 
void UpdateAllTextures(void); 
void UpdateRenderQuality(void); 
void CreateGameLists(void); 
void DestroyGameLists(void); 
void InitGameObjects(void); 
void DestroyGameObjects(void); 
void AnimateFont(void); 
void ShowSmallMessage(char *, long); 
void DisplaySmallMessage(AS_WINDOW *); 
void CheckSmallMessage(void); 
void DrawMouseCursor(float); 
void UpdateMouseWorldPos(BOOL); 
void SetupLights(void); 
void SetGameLanguage(void); 
/////////////////////////////////////////////////////////////////////////////// 
 
 
HRESULT Game(void) 
{ // begin Game() 
	MSG msg; 
 
	_AS->WriteLogMessage("Enter game module"); 
	_AS->bDraw = FALSE; 
	_AS->pWindow[GAME_WINDOW_ID].SetDrawFunction(GameDraw); 
	_AS->pWindow[GAME_WINDOW_ID].SetCheckFunction(GameCheck); 
 
	_AS->iActiveLights = 0; 
 
	// Generate OpenGL card script textures: 
	pcCardStyle->GenOpenGLTextures(); 
 
	cGameInfo.Reset(); 
	InitGameCards(); 
	_ASCamera->SetStandartCamera(); 
	_AS->bDraw = TRUE; 
 
	// Go into the game loop: 
	_AS->WriteLogMessage("Enter the game 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 loop"); 
 
	ShowSmallMessage("", 10); 
	DestroyGameCards(); 
	_AS->bDraw = FALSE; 
	 
	// Left the game module: 
	return msg.wParam; 
} // end Game() 
 
void LoadGameTextures(void) 
{ // begin LoadGameTextures() 
	char byFilename[GAME_TEXTURES][256] = {"ComputerEasy.jpg", "Lightmap.jpg", 
										   "Cup.jpg", "CupEnvironment.jpg", 
										   "ComputerNormal.jpg", "MenuEnvironment.jpg", 
										   "Menu.jpg", "Computer.jpg", "ComputerClever.jpg", 
										   "Titel.jpg", "AS.jpg", "Particle_1.jpg"}; 
	char byFilename2[CAUST_1_STEPS][256]; 
	 
	// Load the game textures: 
	ASLoadTextures(byFilename, GAME_TEXTURES, GameTexture); 
 
	// Load the caust textures: 
	for(int i = 0; i < CAUST_1_STEPS; i++) 
		sprintf(byFilename2[i], "caust%d.jpg", i); 
	ASLoadTextures(byFilename2, CAUST_1_STEPS, Caust1Texture); 
} // end LoadGameTextures() 
 
void CreateBlurTexture(void) 
{ // begin CreateBlurTexture() 
	UINT *piData; 
 
	// Create storage space for texture data (128x128x4) 
	piData = (UINT *) new UINT[((128*128)*4*sizeof(UINT))]; 
	memset(piData, 0, sizeof(UINT)*128*128*4); 
	glGenTextures(1, &BlurTexture.iOpenGLID); 
	glBindTexture(GL_TEXTURE_2D, BlurTexture.iOpenGLID); 
	glTexImage2D(GL_TEXTURE_2D, 0, 4, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, piData); 
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
 
	delete [] piData; 
 
	// Create storage space for texture data (256x256x3) 
	piData = (UINT *) new UINT[((256*256)*3*sizeof(UINT))]; 
	memset(piData, 0, sizeof(UINT)*256*256*3); 
	glGenTextures(1, &TempTexture.iOpenGLID); 
	glBindTexture(GL_TEXTURE_2D, TempTexture.iOpenGLID); 
	glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, piData); 
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
	delete [] piData; 
 
} // end CreateBlurTexture() 
 
void DestroyBlurTexture(void) 
{ // begin DestroyBlurTexture() 
	glDeleteTextures(1, &BlurTexture.iOpenGLID); 
	glDeleteTextures(1, &TempTexture.iOpenGLID); 
} // end DestroyBlurTexture() 
 
HRESULT GameDraw(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]), 1.0f, 150.0f); 
	glMatrixMode(GL_MODELVIEW); 
	glLoadIdentity(); 
	 
	SetupLights(); 
 
	// Setup camera: 
	_ASCamera->SetCameraTranslation(FALSE); 
	 
	// Draw the cards: 
	ASEnableLighting(); 
	glDisable(GL_BLEND); 
 
	DrawTableBackground(); 
 
	// Draw the game cards: 
	glEnable(GL_TEXTURE_2D); 
	DrawGameCards(); 
	PerformLightMapOnGameCarts(); 
 
	glEnable(GL_BLEND); 
	glColor4f(1.0f, 1.0f, 1.0f, 0.0f); 
	glBegin(GL_QUADS); 
		glVertex3f(vPlayField[MIN].fX, vPlayField[MAX].fY, 0.0f); 
		glVertex3f(vPlayField[MAX].fX, vPlayField[MAX].fY, 0.0f); 
		glVertex3f(vPlayField[MAX].fX, vPlayField[MIN].fY, 0.0f); 
		glVertex3f(vPlayField[MIN].fX, vPlayField[MIN].fY, 0.0f); 
	glEnd(); 
 
	if(cGameConfig.PlayerType[cGameInfo.iCurrentPlayer] == PLAYER_TYPE_HUMAN) 
		DrawMouseCursor(1.0f); 
 
	glColor4f(1.0f, 1.0f, 1.0f, 0.9f); 
	glEnable(GL_TEXTURE_2D); 
	glDisable(GL_LIGHTING); 
	glEnable(GL_BLEND); 
 
	// Show the information about the game: 
	cGameInfo.ShowInfo(pWindow); 
	DisplaySmallMessage(pWindow); 
 
	ASSwapBuffers(*pWindow->GethDC(), pWindow, TRUE); 
 
	return 0; 
} // end GameDraw() 
 
HRESULT GameCheck(AS_WINDOW *pWindow) 
{ // begin GameCheck() 
	_AS->ReadDXInput(*pWindow->GethWnd()); 
	_ASCamera->SetCameraTranslation(FALSE); 
	UpdateMouseWorldPos(FALSE); 
	cGameInfo.Check(); 
	AnimateFont(); 
	CheckSmallMessage(); 
	_ASCamera->Check(); 
 
// Keys: 
	if(ASKeyFirst[DIK_F1]) 
	{ // Open the help file: 
		OpenHelp(); 
		return 0; 
	} 
	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); 
	} 
	if(ASKeyFirst[DIK_ESCAPE]) 
		_AS->SetNextModule(MODULE_MENU); 
 
	if(ASKeyFirst[DIK_H]) 
		Setup.bShowHud = !Setup.bShowHud; 
 
	if(bCheatsActivated) 
	{ // The player could look behind the cards: 
		if(CHECK_KEY(ASKeys, DIK_NUMPAD7)) 
			_ASCamera->fRot[Y] += (float) g_lDeltatime/10; 
		if(CHECK_KEY(ASKeys, DIK_NUMPAD1)) 
			_ASCamera->fRot[Y] -= (float) g_lDeltatime/10; 
		if(CHECK_KEY(ASKeys, DIK_NUMPAD9)) 
			_ASCamera->fRot[X] += (float) g_lDeltatime/10; 
		if(CHECK_KEY(ASKeys, DIK_NUMPAD3)) 
			_ASCamera->fRot[X] -= (float) g_lDeltatime/10; 
		if(CHECK_KEY(ASKeys, DIK_ADD)) 
			_ASCamera->fZoom -= (float) g_lDeltatime/200; 
		if(CHECK_KEY(ASKeys, DIK_SUBTRACT)) 
			_ASCamera->fZoom += (float) g_lDeltatime/200; 
		if(CHECK_KEY(ASKeys, DIK_NUMPAD4)) 
			_ASCamera->vPos.fX += (float) g_lDeltatime/500; 
		if(CHECK_KEY(ASKeys, DIK_NUMPAD6)) 
			_ASCamera->vPos.fX -= (float) g_lDeltatime/500; 
		if(CHECK_KEY(ASKeys, DIK_NUMPAD8)) 
			_ASCamera->vPos.fY += (float) g_lDeltatime/500; 
		if(CHECK_KEY(ASKeys, DIK_NUMPAD2)) 
			_ASCamera->vPos.fY -= (float) g_lDeltatime/500; 
		if(CHECK_KEY(ASKeys, DIK_NUMPAD5)) 
			_ASCamera->SetStandartCamera(); 
 
		if(CHECK_KEY(ASKeys, DIK_SPACE)) 
		{ // Restart game: 
			InitGameCards(); 
			cGameInfo.Reset(); 
		} 
	} 
 
 
// Other: 
 
	return 0; 
} // end GameCheck() 
 
void UpdateAllTextures(void) 
{ // begin UpdateAllTextures() 
	if(bFirstRunConfigDialog) 
		return; 
 
	pcCardStyle->UpdateTextures(); 
	DestroyBlurTexture(); 
	ASDestroyOpenGLTextures(GAME_TEXTURES, GameTexture); 
	ASDestroyOpenGLTextures(CAUST_1_STEPS, Caust1Texture); 
	CreateBlurTexture(); 
	ASGenOpenGLTextures(GAME_TEXTURES, GameTexture); 
	ASGenOpenGLTextures(CAUST_1_STEPS, Caust1Texture); 
	switch(_AS->GetModule()) 
	{ 
		case MODULE_GAME: 
			_AS->pWindow[GAME_WINDOW_ID].KillFont(); 
			_AS->pWindow[GAME_WINDOW_ID].BuildFont(); 
		break; 
	} 
} // end UpdateAllTextures() 
 
void UpdateRenderQuality(void) 
{ // begin UpdateRenderQuality() 
	if(bFirstRunConfigDialog) 
		return; 
 
	switch(_AS->GetModule()) 
	{ 
		case MODULE_GAME: 
			ASConfigOpenGL(_AS->pWindow[GAME_WINDOW_ID].GetWidth(), _AS->pWindow[GAME_WINDOW_ID].GetWidth()); 
		break; 
	} 
} // end UpdateRenderQuality() 
 
void CreateGameLists(void) 
{ // begin CreateGameLists() 
	GLUquadricObj *pQuadric; 
 
	pQuadric = gluNewQuadric(); 
	gluQuadricDrawStyle(pQuadric, GLU_FILL); 
	gluQuadricNormals(pQuadric, GLU_SMOOTH); 
	gluQuadricTexture(pQuadric, GL_TRUE); 
	iSphereList = glGenLists(1); 
	glNewList(iSphereList, GL_COMPILE); 
		gluSphere(pQuadric, 1.0f, 8, 8); 
	glEndList(); 
	gluDeleteQuadric(pQuadric); 
} // end CreateGameLists()() 
 
void DestroyGameLists(void) 
{ // begin DestroyGameLists() 
	if(glIsList(iSphereList)) 
		glDeleteLists(iSphereList, 1); 
} // end DestroyeGameLists() 
 
void InitGameObjects(void) 
{ // begin InitGameObjects() 
	char byModelFileTemp[MODELS][256] = {"Cup.md2", "Mouse.md2", "Computer.md2", 
										 "Checked.md2", "Slider.md2"}; 
	char byTemp[256], byTemp2[256]; 
 
	// Load all models: 
	for(int i = 0; i < MODELS; i++) 
	{ 
		sprintf(byTemp, "%s%s\\%s", _AS->byProgramPath, _AS->byObjectsDirectory, byModelFileTemp[i]); 
		sprintf(byTemp2, "Load model: %s", byTemp); 
		_AS->WriteLogMessage(byTemp2); 
		if(!((*pModels[i]) = ASLoadMd2Model(byTemp))) 
		{ 
			_AS->WriteLogMessage("------------------------------------------"); 
			_AS->WriteLogMessage("Couldn't load: %s   program couldn't run!!", byTemp); 
			_AS->WriteLogMessage("------------------------------------------"); 
			_ASConfig->bError = TRUE; 
			_ASConfig->bSetError = TRUE; 
			_AS->SetShutDown(TRUE); 
 
			return; 
		} 
	} 
} // end InitGameObjects() 
 
void DestroyGameObjects(void) 
{ // begin DestroyGameObjects()	 
	// Destroy all game models: 
	for(int i = 0; i < MODELS; i++) 
	{ 
		if(!(*pModels[i])) 
			continue; 
		ASFreeMd2Model(*pModels[i]); 
	} 
} // end DestroyGameObjects() 
 
void AnimateFont(void) 
{ // begin AnimateFont() 
	short i, i2; 
 
	for(i = 0; i < 4; i++) 
		for(i2 = 0; i2 < 2; i2++) 
		{ 
			fFontAni[i][i2] += fFontAniV[i][i2]*((float) g_lDeltatime/800); 
			if(fFontAniLast[i][i2] >= fFontAniT[i][i2]) 
			{ 
				fFontAniV[i][i2] -= ((float) g_lDeltatime/200); 
				if(fFontAniV[i][i2] < -1.2f) 
					fFontAniV[i][i2] = -1.2f; 
				if(fFontAni[i][i2] <= fFontAniT[i][i2]) 
				{ 
					fFontAniLast[i][i2] = fFontAni[i][i2]; 
					if(!(rand() % 2)) 
						fFontAniT[i][i2] = ((float) (rand() % 10)/8); 
					else 
						fFontAniT[i][i2] = -((float) (rand() % 10)/8); 
				} 
			} 
			if(fFontAniLast[i][i2] < fFontAniT[i][i2]) 
			{ 
				fFontAniV[i][i2] += ((float) g_lDeltatime/200); 
				if(fFontAniV[i][i2] > 1.2f) 
					fFontAniV[i][i2] = 1.2f; 
				if(fFontAni[i][i2] >= fFontAniT[i][i2]) 
				{ 
					fFontAniLast[i][i2] = fFontAni[i][i2]; 
					if(!(rand() % 2)) 
						fFontAniT[i][i2] = ((float) (rand() % 10)/8); 
					else 
						fFontAniT[i][i2] = -((float) (rand() % 10)/8); 
				} 
			} 
		} 
} // end AnimateFont() 
 
void ShowSmallMessage(char *pbyText, long lShowTime) 
{ // begin ShowSmallMessage() 
	if(!strcmp(pbyText, bySmallMessageNewText)) 
		return; 
 
	strcpy(bySmallMessageNewText, pbyText); 
	lSmallMessageShowTime = lShowTime; 
	bSmallMessageShowText = bSmallMessageChangeText = TRUE; 
} // end ShowSmallMessage() 
 
void DisplaySmallMessage(AS_WINDOW *pWindow) 
{ // begin DisplaySmallMessage() 
	if(fSmallMessageBlend <= 0.0f) 
		return; // Show no message! 
 
	glEnable(GL_TEXTURE_2D); 
	glEnable(GL_BLEND); 
	glColor4f(1.0f, 1.0f, 1.0f, fSmallMessageBlend); 
	pWindow->PrintAnimated(320, 5, bySmallMessageText, 0, fSmallMessageBlend, fFontAni, 1); 
} // end DisplaySmallMessage() 
 
void CheckSmallMessage(void) 
{ // begin CheckSmallMessage() 
	if(bSmallMessageChangeText) 
	{ // Change to the next text: 
		fSmallMessageBlend -= (float) g_lDeltatime/300; 
		if(fSmallMessageBlend <= 0.0f) 
		{ // Show the new text: 
			fSmallMessageBlend = 0.0f; 
			lSmallMessageTimer = g_lGameTimer; 
			bSmallMessageChangeText = FALSE; 
			strcpy(bySmallMessageText, bySmallMessageNewText); 
		} 
 
		return; 
	} 
	if(bSmallMessageShowText) 
	{ // Blend in/show the text: 
		if(fSmallMessageBlend != 1.0f) 
		{ 
			fSmallMessageBlend += (float) g_lDeltatime/((float) (fSmallMessageBlend+0.01f)*4000); 
			if(fSmallMessageBlend >= 1.0f) 
				fSmallMessageBlend = 1.0f; 
		} 
		if(g_lGameTimer-lSmallMessageTimer >= lSmallMessageShowTime) 
		{ // Time out, disable the text: 
			bSmallMessageShowText = FALSE; 
		} 
	} 
	else 
	{ // Blend out the text: 
		fSmallMessageBlend -= (float) g_lDeltatime/5000; 
		if(fSmallMessageBlend <= 0.0f) 
		{ 
			fSmallMessageBlend = 0.0f; 
			strcpy(bySmallMessageText, ""); 
		} 
	} 
} // end CheckSmallMessage() 
 
void DrawMouseCursor(float fScale) 
{ // begin DrawMouseCursor() 
	glDepthMask(FALSE); 
	glDisable(GL_BLEND); 
	glDisable(GL_DEPTH_TEST); 
	glEnable(GL_TEXTURE_2D); 
 
	glColor3f(1.0f, 1.0f, 1.0f); 
	_ASCamera->SetCameraTranslation(FALSE); 
	glTranslatef(vMouseWorldPos.fX, vMouseWorldPos.fY, 0.0f); 
	glRotatef(-45.0f, 0.0f, 0.0f, 1.0f); 
	glRotatef(180.0f, 0.0f, 1.0f, 0.0f); 
	glScalef(0.002f, 0.002f, 0.002f); 
	glScalef(fScale, fScale, fScale); 
 
	glCullFace(GL_FRONT); 
	glEnable(GL_TEXTURE_GEN_S); 
	glEnable(GL_TEXTURE_GEN_T); 
	glBindTexture(GL_TEXTURE_2D, GameTexture[3].iOpenGLID); 
	ASDrawMd2Frame(pMouseModel, 0); 
	glDisable(GL_TEXTURE_GEN_S); 
	glDisable(GL_TEXTURE_GEN_T); 
	glCullFace(GL_BACK); 
 
	glDepthMask(TRUE); 
	glEnable(GL_DEPTH_TEST); 
} // end DrawMouseCursor() 
 
void UpdateMouseWorldPos(BOOL bMainMenu) 
{ // begin UpdateMouseWorldPos() 
	if(bMainMenu) 
	{ 
		vMouseWorldPos.fX += ((float) ASMouse.lX)*_ASConfig->fMouseSensibility/7; 
		vMouseWorldPos.fY += ((float) ASMouse.lY)*_ASConfig->fMouseSensibility/7; 
		if(vMouseWorldPos.fX < -29.0f) 
			vMouseWorldPos.fX = -29.0f; 
		if(vMouseWorldPos.fX > 29.0f) 
			vMouseWorldPos.fX = 29.0f; 
		if(vMouseWorldPos.fY < -18.0f) 
			vMouseWorldPos.fY = -18.0f; 
		if(vMouseWorldPos.fY > 26.0f) 
			vMouseWorldPos.fY = 26.0f; 
		vMouseWorldPos.fZ = (float) -1.0f; 
	} 
	else 
	{ 
		vMouseWorldPos.fX += ((float) ASMouse.lX*(-_ASCamera->fZoom))*_ASConfig->fMouseSensibility/340; 
		vMouseWorldPos.fY += ((float) ASMouse.lY*(-_ASCamera->fZoom))*_ASConfig->fMouseSensibility/340; 
 
		if(vMouseWorldPos.fX < vPlayField[MIN].fX) 
			vMouseWorldPos.fX = vPlayField[MIN].fX; 
		if(vMouseWorldPos.fX > vPlayField[MAX].fX) 
			vMouseWorldPos.fX = vPlayField[MAX].fX; 
		if(vMouseWorldPos.fY < vPlayField[MIN].fY) 
			vMouseWorldPos.fY = vPlayField[MIN].fY; 
		if(vMouseWorldPos.fY > vPlayField[MAX].fY) 
			vMouseWorldPos.fY = vPlayField[MAX].fY; 
		vMouseWorldPos.fZ = (float) -0.5f; 
	} 
} // end UpdateMouseWorldPos() 
 
void SetupLights(void) 
{ // begin SetupLights() 
	if(_AS->iActiveLights+1 < _AS->iMaxLights) 
	{ // General environment light: 
		GLfloat LightAmbient[]	= { 0.7f-0.5f*fGameFinishedBlend, 0.7f-0.5f*fGameFinishedBlend, 0.7f-0.5f*fGameFinishedBlend, 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++; 
	} 
	if(_AS->iActiveLights+1 < _AS->iMaxLights) 
	{ // General environment light: 
		GLfloat LightAmbient[]	= { 0.1f, 0.07f, 0.07f, 1.0f }; 
		GLfloat LightDiffuse[]	= { 0.5f, 0.2f, 0.2f, 1.0f };  
		float fLightData[4]  = {0.0f, 0.0f, 0.0f, 0.0f}; 
 
		fLightData[0] = vMouseWorldPos.fX; 
		fLightData[1] = vMouseWorldPos.fY; 
		fLightData[2] = vMouseWorldPos.fZ; 
		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++; 
	} 
} // end SetupLights() 
 
void SetGameLanguage(void) 
{ // begin SetGameLanguage() 
	char byTemp[256]; 
	HWND hWndGame; 
	 
	if(GAME_WINDOW_ID == -1 || !_AS->GetWindows()) 
		return; 
	hWndGame = *_AS->pWindow[GAME_WINDOW_ID].GethWnd(); 
 
	// Setup the texts of the menu bar: 
	HMENU hMenu = GetMenu(hWndGame); 
	MENUITEMINFO SubMenuInfo = { sizeof(MENUITEMINFO), 
							     MIIM_ID | MIIM_TYPE, 
								 MFT_STRING, MFS_DEFAULT, 
								 IDR_GAME, 
								 NULL, NULL, NULL, NULL, 
								 T_Quit, 0}; 
	ModifyMenu(hMenu, 0, MF_STRING | MF_BYPOSITION, 0, T_General); 
	SetMenuItemInfo(GetSubMenu(hMenu, 0), 0, TRUE, &SubMenuInfo); 
	 
 
	ModifyMenu(hMenu, 1, MF_STRING | MF_BYPOSITION, 0, T_Options); 
	 
	SubMenuInfo.wID = ID_OPTIONS_CONFIG; 
	sprintf(byTemp, "%s\tF12", T_Configuration); 
	SubMenuInfo.dwTypeData = byTemp; 
	SetMenuItemInfo(GetSubMenu(hMenu, 1), 0, TRUE, &SubMenuInfo); 
	 
	SubMenuInfo.wID = ID_OPTIONS_SHOW_LOG; 
	SubMenuInfo.dwTypeData = T_ShowLog; 
	SetMenuItemInfo(GetSubMenu(hMenu, 1), 1, TRUE, &SubMenuInfo); 
 
 
	ModifyMenu(hMenu, 2, MF_STRING | MF_BYPOSITION, 0, T_Help); 
	 
	SubMenuInfo.wID = ID_HELP_HELP; 
	sprintf(byTemp, "%s\tF1", T_Help); 
	SubMenuInfo.dwTypeData = byTemp; 
	SetMenuItemInfo(GetSubMenu(hMenu, 2), 0, TRUE, &SubMenuInfo); 
	 
	SubMenuInfo.wID = ID_HELP_CREDITS; 
	SubMenuInfo.dwTypeData = T_Credits; 
	SetMenuItemInfo(GetSubMenu(hMenu, 4), 4, TRUE, &SubMenuInfo); 
 
	DrawMenuBar(hWndGame); 
} // end SetGameLanguage()