merge attempt

This commit is contained in:
Nikolay Korolev 2020-12-19 03:21:04 +03:00
commit 8d1996833b
68 changed files with 2149 additions and 316 deletions

View file

@ -63,6 +63,7 @@
#include "timebars.h"
#include "GenericGameStorage.h"
#include "MemoryCard.h"
#include "MemoryHeap.h"
#include "SceneEdit.h"
#include "debugmenu.h"
#include "Clock.h"
@ -110,6 +111,18 @@ void TheGame(void);
void DebugMenuPopulate(void);
#endif
#ifndef FINAL
bool gbPrintMemoryUsage;
#endif
#ifdef GTA_PS2
#define WANT_TO_LOAD TheMemoryCard.m_bWantToLoad
#define FOUND_GAME_TO_LOAD TheMemoryCard.b_FoundRecentSavedGameWantToLoad
#else
#define WANT_TO_LOAD FrontEndMenuManager.m_bWantToLoad
#define FOUND_GAME_TO_LOAD b_FoundRecentSavedGameWantToLoad
#endif
#ifdef NEW_RENDERER
bool gbNewRenderer;
#define CLEARMODE (rwCAMERACLEARZ | rwCAMERACLEARSTENCIL)
@ -392,6 +405,63 @@ PluginAttach(void)
return TRUE;
}
#ifdef GTA_PS2
#define NUM_PREALLOC_ATOMICS 3245
#define NUM_PREALLOC_CLUMPS 101
#define NUM_PREALLOC_FRAMES 2821
#define NUM_PREALLOC_GEOMETRIES 1404
#define NUM_PREALLOC_TEXDICTS 106
#define NUM_PREALLOC_TEXTURES 1900
#define NUM_PREALLOC_MATERIALS 3300
bool preAlloc;
void
PreAllocateRwObjects(void)
{
int i;
void **tmp = new void*[0x8000];
preAlloc = true;
for(i = 0; i < NUM_PREALLOC_ATOMICS; i++)
tmp[i] = RpAtomicCreate();
for(i = 0; i < NUM_PREALLOC_ATOMICS; i++)
RpAtomicDestroy((RpAtomic*)tmp[i]);
for(i = 0; i < NUM_PREALLOC_CLUMPS; i++)
tmp[i] = RpClumpCreate();
for(i = 0; i < NUM_PREALLOC_CLUMPS; i++)
RpClumpDestroy((RpClump*)tmp[i]);
for(i = 0; i < NUM_PREALLOC_FRAMES; i++)
tmp[i] = RwFrameCreate();
for(i = 0; i < NUM_PREALLOC_FRAMES; i++)
RwFrameDestroy((RwFrame*)tmp[i]);
for(i = 0; i < NUM_PREALLOC_GEOMETRIES; i++)
tmp[i] = RpGeometryCreate(0, 0, 0);
for(i = 0; i < NUM_PREALLOC_GEOMETRIES; i++)
RpGeometryDestroy((RpGeometry*)tmp[i]);
for(i = 0; i < NUM_PREALLOC_TEXDICTS; i++)
tmp[i] = RwTexDictionaryCreate();
for(i = 0; i < NUM_PREALLOC_TEXDICTS; i++)
RwTexDictionaryDestroy((RwTexDictionary*)tmp[i]);
for(i = 0; i < NUM_PREALLOC_TEXTURES; i++)
tmp[i] = RwTextureCreate(RwRasterCreate(0, 0, 0, 0));
for(i = 0; i < NUM_PREALLOC_TEXDICTS; i++)
RwTextureDestroy((RwTexture*)tmp[i]);
for(i = 0; i < NUM_PREALLOC_MATERIALS; i++)
tmp[i] = RpMaterialCreate();
for(i = 0; i < NUM_PREALLOC_MATERIALS; i++)
RpMaterialDestroy((RpMaterial*)tmp[i]);
delete[] tmp;
preAlloc = false;
}
#endif
static RwBool
Initialise3D(void *param)
{
@ -765,6 +835,170 @@ tZonePrint ZonePrint[] =
};
#ifndef MASTER
void
PrintMemoryUsage(void)
{
// little hack
if(CPools::GetPtrNodePool() == nil)
return;
// Style taken from LCS, modified for III
// CFont::SetFontStyle(FONT_PAGER);
CFont::SetFontStyle(FONT_BANK);
CFont::SetBackgroundOff();
CFont::SetWrapx(640.0f);
// CFont::SetScale(0.5f, 0.75f);
CFont::SetScale(0.4f, 0.75f);
CFont::SetCentreOff();
CFont::SetCentreSize(640.0f);
CFont::SetJustifyOff();
CFont::SetPropOn();
CFont::SetColor(CRGBA(200, 200, 200, 200));
CFont::SetBackGroundOnlyTextOff();
CFont::SetDropShadowPosition(0);
float y;
#ifdef USE_CUSTOM_ALLOCATOR
y = 24.0f;
sprintf(gString, "Total: %d blocks, %d bytes", gMainHeap.m_totalBlocksUsed, gMainHeap.m_totalMemUsed);
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Game: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_GAME), gMainHeap.GetMemoryUsed(MEMID_GAME));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "World: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_WORLD), gMainHeap.GetMemoryUsed(MEMID_WORLD));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Render: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_RENDER), gMainHeap.GetMemoryUsed(MEMID_RENDER));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Render List: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_RENDERLIST), gMainHeap.GetMemoryUsed(MEMID_RENDERLIST));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Default Models: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_DEF_MODELS), gMainHeap.GetMemoryUsed(MEMID_DEF_MODELS));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Textures: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_TEXTURES), gMainHeap.GetMemoryUsed(MEMID_TEXTURES));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Streaming: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_STREAM), gMainHeap.GetMemoryUsed(MEMID_STREAM));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Streamed Models: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_STREAM_MODELS), gMainHeap.GetMemoryUsed(MEMID_STREAM_MODELS));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Streamed Textures: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_STREAM_TEXUTRES), gMainHeap.GetMemoryUsed(MEMID_STREAM_TEXUTRES));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Animation: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_ANIMATION), gMainHeap.GetMemoryUsed(MEMID_ANIMATION));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Pools: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_POOLS), gMainHeap.GetMemoryUsed(MEMID_POOLS));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Collision: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_COLLISION), gMainHeap.GetMemoryUsed(MEMID_COLLISION));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Game Process: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_GAME_PROCESS), gMainHeap.GetMemoryUsed(MEMID_GAME_PROCESS));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Script: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_SCRIPT), gMainHeap.GetMemoryUsed(MEMID_SCRIPT));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Cars: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_CARS), gMainHeap.GetMemoryUsed(MEMID_CARS));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Frontend: %d blocks, %d bytes", gMainHeap.GetBlocksUsed(MEMID_FRONTEND), gMainHeap.GetMemoryUsed(MEMID_FRONTEND));
AsciiToUnicode(gString, gUString);
CFont::PrintString(24.0f, y, gUString);
y += 12.0f;
#endif
y = 132.0f;
AsciiToUnicode("Pools usage:", gUString);
CFont::PrintString(400.0f, y, gUString);
y += 12.0f;
sprintf(gString, "PtrNode: %d/%d", CPools::GetPtrNodePool()->GetNoOfUsedSpaces(), CPools::GetPtrNodePool()->GetSize());
AsciiToUnicode(gString, gUString);
CFont::PrintString(400.0f, y, gUString);
y += 12.0f;
sprintf(gString, "EntryInfoNode: %d/%d", CPools::GetEntryInfoNodePool()->GetNoOfUsedSpaces(), CPools::GetEntryInfoNodePool()->GetSize());
AsciiToUnicode(gString, gUString);
CFont::PrintString(400.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Ped: %d/%d", CPools::GetPedPool()->GetNoOfUsedSpaces(), CPools::GetPedPool()->GetSize());
AsciiToUnicode(gString, gUString);
CFont::PrintString(400.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Vehicle: %d/%d", CPools::GetVehiclePool()->GetNoOfUsedSpaces(), CPools::GetVehiclePool()->GetSize());
AsciiToUnicode(gString, gUString);
CFont::PrintString(400.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Building: %d/%d", CPools::GetBuildingPool()->GetNoOfUsedSpaces(), CPools::GetBuildingPool()->GetSize());
AsciiToUnicode(gString, gUString);
CFont::PrintString(400.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Treadable: %d/%d", CPools::GetTreadablePool()->GetNoOfUsedSpaces(), CPools::GetTreadablePool()->GetSize());
AsciiToUnicode(gString, gUString);
CFont::PrintString(400.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Object: %d/%d", CPools::GetObjectPool()->GetNoOfUsedSpaces(), CPools::GetObjectPool()->GetSize());
AsciiToUnicode(gString, gUString);
CFont::PrintString(400.0f, y, gUString);
y += 12.0f;
sprintf(gString, "Dummy: %d/%d", CPools::GetDummyPool()->GetNoOfUsedSpaces(), CPools::GetDummyPool()->GetSize());
AsciiToUnicode(gString, gUString);
CFont::PrintString(400.0f, y, gUString);
y += 12.0f;
sprintf(gString, "AudioScriptObjects: %d/%d", CPools::GetAudioScriptObjectPool()->GetNoOfUsedSpaces(), CPools::GetAudioScriptObjectPool()->GetSize());
AsciiToUnicode(gString, gUString);
CFont::PrintString(400.0f, y, gUString);
y += 12.0f;
}
void
DisplayGameDebugText()
{
@ -777,8 +1011,10 @@ DisplayGameDebugText()
TWEAKBOOL(bDisplayPosn);
TWEAKBOOL(bDisplayCheatStr);
}
#endif
if(gbPrintMemoryUsage)
PrintMemoryUsage();
#endif
char str[200];
wchar ustr[200];
@ -1136,13 +1372,9 @@ RenderMenus(void)
{
if (FrontEndMenuManager.m_bMenuActive)
{
#ifdef PS2
gMainHeap.PushMemId(_TODOCONST(17));
#endif
PUSH_MEMID(MEMID_FRONTEND);
FrontEndMenuManager.DrawFrontEnd();
#ifdef PS2
gMainHeap.PopMemId();
#endif
POP_MEMID();
}
}
@ -1182,21 +1414,12 @@ Idle(void *arg)
tbEndTimer("DMAudio.Service");
if(CGame::bDemoMode && CTimer::GetTimeInMilliseconds() > (3*60 + 30)*1000 && !CCutsceneMgr::IsCutsceneProcessing()){
#ifdef PS2_MENU
TheMemoryCard.m_bWantToLoad = false;
WANT_TO_LOAD = false;
FrontEndMenuManager.m_bWantToRestart = true;
#else
FrontEndMenuManager.m_bWantToRestart = true;
FrontEndMenuManager.m_bWantToLoad = false;
#endif
return;
}
#ifdef PS2_MENU
if ( FrontEndMenuManager.m_bWantToRestart || TheMemoryCard.b_FoundRecentSavedGameWantToLoad )
#else
if(FrontEndMenuManager.m_bWantToRestart || b_FoundRecentSavedGameWantToLoad)
#endif
if(FrontEndMenuManager.m_bWantToRestart || FOUND_GAME_TO_LOAD)
{
return;
}
@ -1242,12 +1465,12 @@ Idle(void *arg)
if(CWeather::LightningFlash && !CCullZones::CamNoRain()){
if(!DoRWStuffStartOfFrame_Horizon(255, 255, 255, 255, 255, 255, 255))
return;
goto popret;
}else{
if(!DoRWStuffStartOfFrame_Horizon(CTimeCycle::GetSkyTopRed(), CTimeCycle::GetSkyTopGreen(), CTimeCycle::GetSkyTopBlue(),
CTimeCycle::GetSkyBottomRed(), CTimeCycle::GetSkyBottomGreen(), CTimeCycle::GetSkyBottomBlue(),
255))
return;
goto popret;
}
DefinedState();
@ -1295,7 +1518,7 @@ Idle(void *arg)
CVisibilityPlugins::SetRenderWareCamera(Scene.camera);
RwCameraClear(Scene.camera, &gColourTop, CLEARMODE);
if(!RsCameraBeginUpdate(Scene.camera))
return;
goto popret;
}
tbStartTimer(0, "RenderMenus");
@ -1304,7 +1527,7 @@ Idle(void *arg)
#ifdef PS2_MENU
if ( TheMemoryCard.m_bWantToLoad )
return;
goto popret;
#endif
tbStartTimer(0, "DoFade");
@ -1324,8 +1547,13 @@ Idle(void *arg)
DoRWStuffEndOfFrame();
POP_MEMID(); // MEMID_RENDER
if(g_SlowMode)
ProcessSlowMode();
return;
popret: POP_MEMID(); // MEMID_RENDER
}
void
@ -1478,14 +1706,13 @@ TheModelViewer(void)
}
#endif
#ifdef PS2
#ifdef GTA_PS2
void TheGame(void)
{
printf("Into TheGame!!!\n");
#ifdef GTA_PS2
gMainHeap.PushMemId(_TODOCONST(1));
#endif
PUSH_MEMID(MEMID_GAME); // NB: not popped
CTimer::Initialise();
@ -1523,78 +1750,50 @@ void TheGame(void)
while (true)
{
#ifdef PS2
if (TheMemoryCard.m_bWantToLoad)
#else
if (FrontEndMenuManager.m_bWantToLoad)
#endif
if (WANT_TO_LOAD)
{
Const char *splash1 = GetLevelSplashScreen(CGame::currLevel);
LoadSplash(splash1);
}
#ifdef PS2
TheMemoryCard.m_bWantToLoad = false;
#else
FrontEndMenuManager.m_bWantToLoad = false;
#endif
WANT_TO_LOAD = false;
CTimer::Update();
#ifdef PS2
while (!(FrontEndMenuManager.m_bWantToRestart || TheMemoryCard.b_FoundRecentSavedGameWantToLoad))
#else
while (!(FrontEndMenuManager.m_bWantToRestart || b_FoundRecentSavedGameWantToLoad))
#endif
while (!(FrontEndMenuManager.m_bWantToRestart || FOUND_GAME_TO_LOAD))
{
CSprite2d::InitPerFrame();
CFont::InitPerFrame();
#ifdef GTA_PS2
gMainHeap.PushMemId(_TODOCONST(12));
#endif
CPointLights::NumLights = 0;
PUSH_MEMID(MEMID_GAME_PROCESS)
CPointLights::InitPerFrame();
CGame::Process();
#ifdef GTA_PS2
gMainHeap.PopMemId();
#endif
POP_MEMID();
DMAudio.Service();
if (CGame::bDemoMode && CTimer::GetTimeInMilliseconds() > (3*60 + 30)*1000 && !CCutsceneMgr::IsCutsceneProcessing())
{
#ifdef PS2
TheMemoryCard.m_bWantToLoad = false;
#else
FrontEndMenuManager.m_bWantToLoad = false;
#endif
WANT_TO_LOAD = false;
FrontEndMenuManager.m_bWantToRestart = true;
break;
}
#ifdef PS2
if (FrontEndMenuManager.m_bWantToRestart || TheMemoryCard.b_FoundRecentSavedGameWantToLoad)
#else
if (FrontEndMenuManager.m_bWantToRestart || b_FoundRecentSavedGameWantToLoad)
#endif
if (FrontEndMenuManager.m_bWantToRestart || FOUND_GAME_TO_LOAD)
break;
SetLightsWithTimeOfDayColour(Scene.world);
#ifdef GTA_PS2
gMainHeap.PushMemId(_TODOCONST(15));
#endif
PUSH_MEMID(MEMID_RENDER);
// m_bRenderGameInMenu is there in III PS2 but I don't know about VC PS2.
if (!FrontEndMenuManager.m_bMenuActive || /*FrontEndMenuManager.m_bRenderGameInMenu == true && */TheCamera.GetScreenFadeStatus() != FADE_2 )
{
#ifdef GTA_PS2
gMainHeap.PushMemId(_TODOCONST(11));
#endif
PUSH_MEMID(MEMID_RENDERLIST);
CRenderer::ConstructRenderList();
CRenderer::PreRender();
#ifdef GTA_PS2
gMainHeap.PopMemId();
#endif
POP_MEMID();
if (CWeather::LightningFlash && !CCullZones::CamNoRain())
DoRWStuffStartOfFrame_Horizon(255, 255, 255, 255, 255, 255, 255);
@ -1626,15 +1825,9 @@ void TheGame(void)
RenderMenus();
#ifdef PS2
if (TheMemoryCard.m_bWantToLoad)
#else
if (FrontEndMenuManager.m_bWantToLoad)
#endif
if (WANT_TO_LOAD)
{
#ifdef GTA_PS2
gMainHeap.PopMemId();
#endif
POP_MEMID(); // MEMID_RENDER
break;
}
@ -1651,9 +1844,7 @@ void TheGame(void)
CTimer::Update();
#ifdef GTA_PS2
gMainHeap.PopMemId();
#endif
POP_MEMID(): // MEMID_RENDER
if (g_SlowMode)
ProcessSlowMode();
@ -1665,24 +1856,12 @@ void TheGame(void)
CGame::ShutDownForRestart();
CTimer::Stop();
#ifdef PS2
if (FrontEndMenuManager.m_bWantToRestart || TheMemoryCard.b_FoundRecentSavedGameWantToLoad)
#else
if (FrontEndMenuManager.m_bWantToRestart || b_FoundRecentSavedGameWantToLoad)
#endif
if (FrontEndMenuManager.m_bWantToRestart || FOUND_GAME_TO_LOAD)
{
#ifdef PS2
if (TheMemoryCard.b_FoundRecentSavedGameWantToLoad)
#else
if (b_FoundRecentSavedGameWantToLoad)
#endif
if (FOUND_GAME_TO_LOAD)
{
FrontEndMenuManager.m_bWantToRestart = true;
#ifdef PS2
TheMemoryCard.m_bWantToLoad = true;
#else
FrontEndMenuManager.m_bWantToLoad = true;
#endif
WANT_TO_LOAD = true;
}
CGame::InitialiseWhenRestarting();
@ -1705,7 +1884,7 @@ void SystemInit()
mwInit();
#endif
#ifdef GTA_PS2
#ifdef USE_CUSTOM_ALLOCATOR
InitMemoryMgr();
#endif
@ -1735,7 +1914,7 @@ void SystemInit()
#ifdef GTA_PS2
CFileMgr::InitCd();
Char modulepath[256];
char modulepath[256];
strcpy(modulepath, "cdrom0:\\");
strcat(modulepath, "SYSTEM\\");
@ -1822,7 +2001,7 @@ void SystemInit()
//
#endif
#ifdef PS2
#ifdef GTA_PS2
TheMemoryCard.Init();
#endif
}
@ -1851,7 +2030,7 @@ void GameInit()
#endif
CdStreamInit(MAX_CDCHANNELS);
#ifdef PS2
#ifdef GTA_PS2
Initialise3D(); //no params
#else
//TODO
@ -1958,21 +2137,18 @@ void GameInit()
CreateDebugFont();
#ifdef GTA_PS2
AddIntcHandler(_TODOCONST(2), VBlankCounter, 0);
AddIntcHandler(INTC_VBLANK_S, VBlankCounter, 0);
#endif
CameraSize(Scene.camera, NULL, DEFAULT_VIEWWINDOW, DEFAULT_ASPECT_RATIO);
CSprite2d::SetRecipNearClip();
CTxdStore::Initialise();
#ifdef GTA_PS2
gMainHeap.PushMemId(_TODOCONST(9));
#endif
PUSH_MEMID(MEMID_TEXTURES);
CFont::Initialise();
CHud::Initialise();
#ifdef GTA_PS2
gMainHeap.PopMemId();
#endif
POP_MEMID();
ValidateVersion();
@ -2000,11 +2176,10 @@ main(int argc, char *argv[])
SystemInit();
#ifdef PS2
#ifdef GTA_PS2
int32 r = TheMemoryCard.CheckCardStateAtGameStartUp(CARD_ONE);
if ( r == CMemoryCard::ERR_DIRNOENTRY || r == CMemoryCard::ERR_NOFORMAT
&& r != CMemoryCard::ERR_OPENNOENTRY && r != CMemoryCard::ERR_NONE )
if ( r == CMemoryCard::ERR_DIRNOENTRY || r == CMemoryCard::ERR_NOFORMAT )
{
GameInit();
@ -2014,6 +2189,8 @@ main(int argc, char *argv[])
CFont::Initialise();
FrontEndMenuManager.DrawMemoryCardStartUpMenus();
}else if(r == CMemoryCard::ERR_OPENNOENTRY || r == CMemoryCard::ERR_NONE){
// eh?
}
#endif
@ -2024,12 +2201,18 @@ main(int argc, char *argv[])
InitMPEGPlayer();
#ifdef GTA_PAL
PlayMPEG("cdrom0:\\MOVIES\\DMAPAL.PSS;1", false);
if (CGame::frenchGame || CGame::germanGame)
PlayMPEG("cdrom0:\\MOVIES\\INTROPAF.PSS;1", true);
else
PlayMPEG("cdrom0:\\MOVIES\\INTROPAL.PSS;1", true);
#else
PlayMPEG("cdrom0:\\MOVIES\\DMANTSC.PSS;1", false);
PlayMPEG("cdrom0:\\MOVIES\\INTRNTSC.PSS;1", true);
#endif
ShutdownMPEGPlayer();