From ecdf802d68f9852150ac92f9737426c340fb64a3 Mon Sep 17 00:00:00 2001 From: Muzychenko Andrey <33288308+k4zmu2a@users.noreply.github.com> Date: Fri, 5 Nov 2021 10:16:27 +0300 Subject: [PATCH] Added game data loading from user folder (SDL_GetPrefPath). Ref issue #80. --- SpaceCadetPinball/pb.cpp | 2 ++ SpaceCadetPinball/winmain.cpp | 45 +++++++++++++++++++++++++++-------- SpaceCadetPinball/winmain.h | 2 +- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/SpaceCadetPinball/pb.cpp b/SpaceCadetPinball/pb.cpp index 284ef7e..9fa7fb2 100644 --- a/SpaceCadetPinball/pb.cpp +++ b/SpaceCadetPinball/pb.cpp @@ -39,6 +39,8 @@ int pb::init() { float projMat[12], zMin = 0, zScaler = 0; + if (winmain::DatFileName.empty()) + return 1; auto dataFilePath = pinball::make_path_name(winmain::DatFileName); record_table = partman::load_records(dataFilePath.c_str(), FullTiltMode); diff --git a/SpaceCadetPinball/winmain.cpp b/SpaceCadetPinball/winmain.cpp index 1b9a4c6..5e4fa9c 100644 --- a/SpaceCadetPinball/winmain.cpp +++ b/SpaceCadetPinball/winmain.cpp @@ -36,7 +36,7 @@ bool winmain::ShowSpriteViewer = false; bool winmain::LaunchBallEnabled = true; bool winmain::HighScoresEnabled = true; bool winmain::DemoActive = false; -char* winmain::BasePath; +std::string winmain::BasePath; int winmain::MainMenuHeight = 0; std::string winmain::FpsDetails; double winmain::UpdateToFrameRatio; @@ -58,19 +58,44 @@ int winmain::WinMain(LPCSTR lpCmdLine) SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Could not initialize SDL2", SDL_GetError(), nullptr); return 1; } - BasePath = SDL_GetBasePath(); pinball::quickFlag = strstr(lpCmdLine, "-quick") != nullptr; - DatFileName = options::get_string("Pinball Data", pinball::get_rc_string(168, 0)); - /*Check for full tilt .dat file and switch to it automatically*/ - auto cadetFilePath = pinball::make_path_name("CADET.DAT"); - auto cadetDat = fopen(cadetFilePath.c_str(), "r"); - if (cadetDat) + // Search for game data in: game folder, user folder + // Game data test order: CADET.DAT, PINBALL.DAT + char* dataSearchPaths[2] { - fclose(cadetDat); - DatFileName = "CADET.DAT"; - pb::FullTiltMode = true; + SDL_GetBasePath(), + SDL_GetPrefPath(nullptr, "SpaceCadetPinball") + }; + std::string datFileNames[2] + { + "CADET.DAT", + options::get_string("Pinball Data", pinball::get_rc_string(168, 0)) + }; + for (auto path : dataSearchPaths) + { + if (DatFileName.empty() && path) + { + BasePath = path; + for (int i = 0; i < 2; i++) + { + auto datFileName = datFileNames[i]; + auto datFilePath = pinball::make_path_name(datFileName); + auto datFile = fopen(datFilePath.c_str(), "r"); + if (datFile) + { + fclose(datFile); + DatFileName = datFileName; + if (i == 0) + pb::FullTiltMode = true; + printf("Loading game from: %s\n", datFilePath.c_str()); + break; + } + } + } + + SDL_free(path); } // SDL window diff --git a/SpaceCadetPinball/winmain.h b/SpaceCadetPinball/winmain.h index eb32410..485232f 100644 --- a/SpaceCadetPinball/winmain.h +++ b/SpaceCadetPinball/winmain.h @@ -48,7 +48,7 @@ public: static bool LaunchBallEnabled; static bool HighScoresEnabled; static bool DemoActive; - static char* BasePath; + static std::string BasePath; static int MainMenuHeight; static int WinMain(LPCSTR lpCmdLine);