summaryrefslogtreecommitdiffstats
path: root/src/skel/glfw/glfw.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/skel/glfw/glfw.cpp')
-rw-r--r--src/skel/glfw/glfw.cpp238
1 files changed, 221 insertions, 17 deletions
diff --git a/src/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp
index 21115585..a1170c61 100644
--- a/src/skel/glfw/glfw.cpp
+++ b/src/skel/glfw/glfw.cpp
@@ -16,7 +16,6 @@
#include "platform.h"
#include "crossplatform.h"
-#include "patcher.h"
#include "main.h"
#include "FileMgr.h"
#include "Text.h"
@@ -27,8 +26,10 @@
#include "Frontend.h"
#include "Game.h"
#include "PCSave.h"
+#include "MemoryCard.h"
#include "Sprite2d.h"
#include "AnimViewer.h"
+#include "Font.h"
#define MAX_SUBSYSTEMS (16)
@@ -62,11 +63,7 @@ static psGlobalType PsGlobal;
#undef MAKEPOINTS
#define MAKEPOINTS(l) (*((POINTS /*FAR*/ *)&(l)))
-#define SAFE_RELEASE(x) { if (x) x->Release(); x = NULL; }
-#define JIF(x) if (FAILED(hr=(x))) \
- {debug(TEXT("FAILED(hr=0x%x) in ") TEXT(#x) TEXT("\n"), hr); return;}
-
-unsigned long _dwMemAvailPhys;
+size_t _dwMemAvailPhys;
RwUInt32 gGameState;
#ifdef _WIN32
@@ -281,17 +278,76 @@ psInitialize(void)
RsGlobal.ps = &PsGlobal;
PsGlobal.fullScreen = FALSE;
+ PsGlobal.cursorIsInWindow = TRUE;
PsGlobal.joy1id = -1;
PsGlobal.joy2id = -1;
CFileMgr::Initialise();
+#ifdef PS2_MENU
+ CPad::Initialise();
+ CPad::GetPad(0)->Mode = 0;
+
+ CGame::frenchGame = false;
+ CGame::germanGame = false;
+ CGame::nastyGame = true;
+ CMenuManager::m_PrefsAllowNastyGame = true;
+
+#ifndef _WIN32
+ // Mandatory for Linux(Unix? Posix?) to set lang. to environment lang.
+ setlocale(LC_ALL, "");
+
+ char *systemLang, *keyboardLang;
+
+ systemLang = setlocale (LC_ALL, NULL);
+ keyboardLang = setlocale (LC_CTYPE, NULL);
+
+ short lang;
+ lang = !strncmp(systemLang, "fr_",3) ? LANG_FRENCH :
+ !strncmp(systemLang, "de_",3) ? LANG_GERMAN :
+ !strncmp(systemLang, "en_",3) ? LANG_ENGLISH :
+ !strncmp(systemLang, "it_",3) ? LANG_ITALIAN :
+ !strncmp(systemLang, "es_",3) ? LANG_SPANISH :
+ LANG_OTHER;
+#else
+ WORD lang = PRIMARYLANGID(GetSystemDefaultLCID());
+#endif
+
+ if ( lang == LANG_ITALIAN )
+ CMenuManager::m_PrefsLanguage = CMenuManager::LANGUAGE_ITALIAN;
+ else if ( lang == LANG_SPANISH )
+ CMenuManager::m_PrefsLanguage = CMenuManager::LANGUAGE_SPANISH;
+ else if ( lang == LANG_GERMAN )
+ {
+ CGame::germanGame = true;
+ CGame::nastyGame = false;
+ CMenuManager::m_PrefsAllowNastyGame = false;
+ CMenuManager::m_PrefsLanguage = CMenuManager::LANGUAGE_GERMAN;
+ }
+ else if ( lang == LANG_FRENCH )
+ {
+ CGame::frenchGame = true;
+ CGame::nastyGame = false;
+ CMenuManager::m_PrefsAllowNastyGame = false;
+ CMenuManager::m_PrefsLanguage = CMenuManager::LANGUAGE_FRENCH;
+ }
+ else
+ CMenuManager::m_PrefsLanguage = CMenuManager::LANGUAGE_AMERICAN;
+
+ FrontEndMenuManager.InitialiseMenuContentsAfterLoadingGame();
+
+ TheMemoryCard.Init();
+#else
C_PcSave::SetSaveDirectory(_psGetUserFilesFolder());
InitialiseLanguage();
+#ifndef GTA3_1_1_PATCH
FrontEndMenuManager.LoadSettings();
+#endif
+
+#endif
gGameState = GS_START_UP;
TRACE("gGameState = GS_START_UP");
@@ -334,6 +390,14 @@ psInitialize(void)
_dwOperatingSystemVersion = OS_WIN95;
}
}
+
+#ifndef PS2_MENU
+
+#ifdef GTA3_1_1_PATCH
+ FrontEndMenuManager.LoadSettings();
+#endif
+
+#endif
MEMORYSTATUS memstats;
GlobalMemoryStatus(&memstats);
@@ -343,6 +407,14 @@ psInitialize(void)
debug("Physical memory size %u\n", memstats.dwTotalPhys);
debug("Available physical memory %u\n", memstats.dwAvailPhys);
#else
+
+#ifndef PS2_MENU
+
+#ifdef GTA3_1_1_PATCH
+ FrontEndMenuManager.LoadSettings();
+#endif
+
+#endif
struct sysinfo systemInfo;
sysinfo(&systemInfo);
@@ -664,7 +736,9 @@ psSelectDevice()
FrontEndMenuManager.m_nPrefsDepth = vm.depth;
#endif
+#ifndef PS2_MENU
FrontEndMenuManager.m_nCurrOption = 0;
+#endif
/* Set up the video mode and set the apps window
* dimensions to match */
@@ -713,6 +787,7 @@ void keypressCB(GLFWwindow* window, int key, int scancode, int action, int mods)
void resizeCB(GLFWwindow* window, int width, int height);
void scrollCB(GLFWwindow* window, double xoffset, double yoffset);
void cursorCB(GLFWwindow* window, double xpos, double ypos);
+void cursorEnterCB(GLFWwindow* window, int entered);
void joysChangeCB(int jid, int event);
bool IsThisJoystickBlacklisted(int i)
@@ -748,9 +823,10 @@ void _InputInitialiseJoys()
}
}
-void _InputInitialiseMouse()
+long _InputInitialiseMouse()
{
glfwSetInputMode(PSGLOBAL(window), GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
+ return 0;
}
void psPostRWinit(void)
@@ -762,6 +838,7 @@ void psPostRWinit(void)
glfwSetWindowSizeCallback(PSGLOBAL(window), resizeCB);
glfwSetScrollCallback(PSGLOBAL(window), scrollCB);
glfwSetCursorPosCallback(PSGLOBAL(window), cursorCB);
+ glfwSetCursorEnterCallback(PSGLOBAL(window), cursorEnterCB);
glfwSetJoystickCallback(joysChangeCB);
_InputInitialiseJoys();
@@ -1005,27 +1082,27 @@ void InitialiseLanguage()
{
case LANG_GERMAN:
{
- CMenuManager::m_PrefsLanguage = LANGUAGE_GERMAN;
+ CMenuManager::m_PrefsLanguage = CMenuManager::LANGUAGE_GERMAN;
break;
}
case LANG_SPANISH:
{
- CMenuManager::m_PrefsLanguage = LANGUAGE_SPANISH;
+ CMenuManager::m_PrefsLanguage = CMenuManager::LANGUAGE_SPANISH;
break;
}
case LANG_FRENCH:
{
- CMenuManager::m_PrefsLanguage = LANGUAGE_FRENCH;
+ CMenuManager::m_PrefsLanguage = CMenuManager::LANGUAGE_FRENCH;
break;
}
case LANG_ITALIAN:
{
- CMenuManager::m_PrefsLanguage = LANGUAGE_ITALIAN;
+ CMenuManager::m_PrefsLanguage = CMenuManager::LANGUAGE_ITALIAN;
break;
}
default:
{
- CMenuManager::m_PrefsLanguage = LANGUAGE_AMERICAN;
+ CMenuManager::m_PrefsLanguage = CMenuManager::LANGUAGE_AMERICAN;
break;
}
}
@@ -1267,13 +1344,18 @@ _InputTranslateShiftKeyUpDown(RsKeyCodes *rs) {
RsKeyboardEventHandler(rshiftStatus ? rsKEYDOWN : rsKEYUP, &(*rs = rsRSHIFT));
}
-// TODO this only works in frontend(and luckily only frontend use this), maybe because of glfw knows that mouse pos is > 32000 in game??
+// TODO this only works in frontend(and luckily only frontend use this). Fun fact: if I get pos manually in game, glfw reports that it's > 32000
void
cursorCB(GLFWwindow* window, double xpos, double ypos) {
FrontEndMenuManager.m_nMouseTempPosX = xpos;
FrontEndMenuManager.m_nMouseTempPosY = ypos;
}
+void
+cursorEnterCB(GLFWwindow* window, int entered) {
+ PSGLOBAL(cursorIsInWindow) = !!entered;
+}
+
/*
*****************************************************************************
*/
@@ -1288,6 +1370,15 @@ WinMain(HINSTANCE instance,
RwInt32 argc;
RwChar** argv;
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil, SPIF_SENDCHANGE);
+
+#if 0
+ // TODO: make this an option somewhere
+ AllocConsole();
+ freopen("CONIN$", "r", stdin);
+ freopen("CONOUT$", "w", stdout);
+ freopen("CONOUT$", "w", stderr);
+#endif
+
#else
int
main(int argc, char *argv[])
@@ -1295,7 +1386,6 @@ main(int argc, char *argv[])
#endif
RwV2d pos;
RwInt32 i;
-// StaticPatcher::Apply();
#ifndef _WIN32
struct sigaction act;
@@ -1425,14 +1515,33 @@ main(int argc, char *argv[])
SetErrorMode(SEM_FAILCRITICALERRORS);
#endif
+#ifdef PS2_MENU
+ int32 r = TheMemoryCard.CheckCardStateAtGameStartUp(CARD_ONE);
+ if ( r == CMemoryCard::ERR_DIRNOENTRY || r == CMemoryCard::ERR_NOFORMAT
+ && r != CMemoryCard::ERR_OPENNOENTRY && r != CMemoryCard::ERR_NONE )
+ {
+ LoadingScreen(nil, nil, "loadsc0");
+
+ TheText.Unload();
+ TheText.Load();
+
+ CFont::Initialise();
+
+ FrontEndMenuManager.DrawMemoryCardStartUpMenus();
+ }
+#endif
+
+ if (TurnOnAnimViewer)
+ {
#ifndef MASTER
- if (TurnOnAnimViewer) {
CAnimViewer::Initialise();
+#ifndef PS2_MENU
FrontEndMenuManager.m_bGameNotLoaded = false;
+#endif
gGameState = GS_ANIMVIEWER;
TurnOnAnimViewer = false;
- }
#endif
+ }
initkeymap();
@@ -1452,7 +1561,18 @@ main(int argc, char *argv[])
* Enter the message processing loop...
*/
+#ifdef PS2_MENU
+ if (TheMemoryCard.m_bWantToLoad)
+ LoadSplash(GetLevelSplashScreen(CGame::currLevel));
+
+ TheMemoryCard.m_bWantToLoad = false;
+
+ CTimer::Update();
+
+ while( !RsGlobal.quit && !(FrontEndMenuManager.m_bWantToRestart || TheMemoryCard.b_FoundRecentSavedGameWantToLoad) && !glfwWindowShouldClose(PSGLOBAL(window)) )
+#else
while( !RsGlobal.quit && !FrontEndMenuManager.m_bWantToRestart && !glfwWindowShouldClose(PSGLOBAL(window)))
+#endif
{
glfwPollEvents();
if( ForegroundApp )
@@ -1461,7 +1581,11 @@ main(int argc, char *argv[])
{
case GS_START_UP:
{
+#ifdef NO_MOVIES
gGameState = GS_INIT_ONCE;
+#else
+ gGameState = GS_INIT_LOGO_MPEG;
+#endif
TRACE("gGameState = GS_INIT_ONCE");
break;
}
@@ -1470,13 +1594,27 @@ main(int argc, char *argv[])
{
//CoUninitialize();
+#ifdef PS2_MENU
+ extern char version_name[64];
+ if ( CGame::frenchGame || CGame::germanGame )
+ LoadingScreen(NULL, version_name, "loadsc24");
+ else
+ LoadingScreen(NULL, version_name, "loadsc0");
+
+ printf("Into TheGame!!!\n");
+#else
LoadingScreen(nil, nil, "loadsc0");
+#endif
if ( !CGame::InitialiseOnceAfterRW() )
RsGlobal.quit = TRUE;
+#ifdef PS2_MENU
+ gGameState = GS_INIT_PLAYING_GAME;
+#else
gGameState = GS_INIT_FRONTEND;
TRACE("gGameState = GS_INIT_FRONTEND;");
+#endif
break;
}
@@ -1500,18 +1638,27 @@ main(int argc, char *argv[])
break;
}
+#ifndef PS2_MENU
case GS_FRONTEND:
{
if(!glfwGetWindowAttrib(PSGLOBAL(window), GLFW_ICONIFIED))
RsEventHandler(rsFRONTENDIDLE, nil);
+#ifdef PS2_MENU
+ if ( !FrontEndMenuManager.m_bMenuActive || TheMemoryCard.m_bWantToLoad )
+#else
if ( !FrontEndMenuManager.m_bMenuActive || FrontEndMenuManager.m_bWantToLoad )
+#endif
{
gGameState = GS_INIT_PLAYING_GAME;
TRACE("gGameState = GS_INIT_PLAYING_GAME;");
}
+#ifdef PS2_MENU
+ if (TheMemoryCard.m_bWantToLoad )
+#else
if ( FrontEndMenuManager.m_bWantToLoad )
+#endif
{
InitialiseGame();
FrontEndMenuManager.m_bGameNotLoaded = false;
@@ -1520,11 +1667,37 @@ main(int argc, char *argv[])
}
break;
}
+#endif
case GS_INIT_PLAYING_GAME:
{
+#ifdef PS2_MENU
+ CGame::Initialise("DATA\\GTA3.DAT");
+
+ //LoadingScreen("Starting Game", NULL, GetRandomSplashScreen());
+
+ if ( TheMemoryCard.CheckCardInserted(CARD_ONE) == CMemoryCard::NO_ERR_SUCCESS
+ && TheMemoryCard.ChangeDirectory(CARD_ONE, TheMemoryCard.Cards[CARD_ONE].dir)
+ && TheMemoryCard.FindMostRecentFileName(CARD_ONE, TheMemoryCard.MostRecentFile) == true
+ && TheMemoryCard.CheckDataNotCorrupt(TheMemoryCard.MostRecentFile))
+ {
+ strcpy(TheMemoryCard.LoadFileName, TheMemoryCard.MostRecentFile);
+ TheMemoryCard.b_FoundRecentSavedGameWantToLoad = true;
+
+ if (CMenuManager::m_PrefsLanguage != TheMemoryCard.GetLanguageToLoad())
+ {
+ CMenuManager::m_PrefsLanguage = TheMemoryCard.GetLanguageToLoad();
+ TheText.Unload();
+ TheText.Load();
+ }
+
+ CGame::currLevel = (eLevelName)TheMemoryCard.GetLevelToLoad();
+ }
+#else
InitialiseGame();
+
FrontEndMenuManager.m_bGameNotLoaded = false;
+#endif
gGameState = GS_PLAYING_GAME;
TRACE("gGameState = GS_PLAYING_GAME;");
break;
@@ -1573,16 +1746,46 @@ main(int argc, char *argv[])
RwInitialised = FALSE;
FrontEndMenuManager.UnloadTextures();
+#ifdef PS2_MENU
+ if ( !(FrontEndMenuManager.m_bWantToRestart || TheMemoryCard.b_FoundRecentSavedGameWantToLoad))
+ break;
+#else
if ( !FrontEndMenuManager.m_bWantToRestart )
break;
+#endif
CPad::ResetCheats();
CPad::StopPadsShaking();
DMAudio.ChangeMusicMode(MUSICMODE_DISABLE);
+#ifdef PS2_MENU
+ CGame::ShutDownForRestart();
+#endif
+
+ CTimer::Stop();
+
+#ifdef PS2_MENU
+ if (FrontEndMenuManager.m_bWantToRestart || TheMemoryCard.b_FoundRecentSavedGameWantToLoad)
+ {
+ if (TheMemoryCard.b_FoundRecentSavedGameWantToLoad)
+ {
+ FrontEndMenuManager.m_bWantToRestart = true;
+ TheMemoryCard.m_bWantToLoad = true;
+ }
+
+ CGame::InitialiseWhenRestarting();
+ DMAudio.ChangeMusicMode(MUSICMODE_GAME);
+ FrontEndMenuManager.m_bWantToRestart = false;
+
+ continue;
+ }
+
+ CGame::ShutDown();
CTimer::Stop();
+ break;
+#else
if ( FrontEndMenuManager.m_bWantToLoad )
{
CGame::ShutDownForRestart();
@@ -1614,6 +1817,7 @@ main(int argc, char *argv[])
FrontEndMenuManager.m_bFirstTime = false;
FrontEndMenuManager.m_bWantToRestart = false;
+#endif
}
@@ -1747,7 +1951,7 @@ void CapturePad(RwInt32 padID)
void joysChangeCB(int jid, int event)
{
- if (event == GLFW_CONNECTED)
+ if (event == GLFW_CONNECTED && !IsThisJoystickBlacklisted(jid))
{
if (PSGLOBAL(joy1id) == -1)
PSGLOBAL(joy1id) = jid;