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()