- Get pcsx2 to display "game name (region) [serial] [crc]" in the console title-bar based on info found in game database.

- Some work on the database_loader class... now loads all game data into memory, and you can switch the game who's data is being read by calling setGame().
- Made the database_loader class a global "GameDB" so that it can be referred to throughout pcsx2 code...


git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2983 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
cottonvibes 2010-05-12 09:33:45 +00:00
parent 8687a03c78
commit 36973bfb92
3 changed files with 103 additions and 32 deletions

View File

@ -29,6 +29,7 @@
#include "ps2/BiosTools.h"
#include "DataBase_Loader.h"
DataBase_Loader GameDB("DataBase.dbf", "Serial");
wxString DiscID;
static cdvdStruct cdvd;
@ -346,8 +347,9 @@ static __forceinline void _reloadElfInfo(wxString elfpath)
elfptr.Delete();
DataBase_Loader dbLoader("DataBase.dbf", "Serial", DiscID.ToUTF8().data());
Console.WriteLn("Game = %s (%s)", dbLoader.getString("Name").c_str(), dbLoader.getString("Region").c_str());
// Set the Game DataBase to the correct game based on Game Serial Code...
GameDB.setGame(DiscID.ToUTF8().data());
Console.WriteLn("Game = %s (%s)", GameDB.getString("Name").c_str(), GameDB.getString("Region").c_str());
}
void cdvdReloadElfInfo()

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "File_Reader.h"
struct key_pair {
@ -22,6 +23,14 @@ struct key_pair {
: key(_key) , value(_value) {}
};
class Game_Data {
public:
string id; // Serial Identification Code
deque<key_pair> kList; // List of all (key, value) pairs for game data
Game_Data(string _id)
: id(_id) {}
};
// DataBase_Loader:
// Give the starting Key and Value you're looking for,
// and it will extract the necessary data from the database.
@ -50,6 +59,8 @@ private:
void extract(string& line, key_pair& keyPair) {
stringstream ss(line);
string t;
keyPair.key = "";
keyPair.value = "";
ss >> keyPair.key;
if (!line.length() || isComment(keyPair.key)) {
doError(line, keyPair);
@ -78,60 +89,113 @@ private:
}
}
public:
deque<key_pair> kList;
DataBase_Loader(string file, string key, string value) {
deque<Game_Data*> gList;
Game_Data* curGame;
DataBase_Loader(string file, string key, string value = "") {
curGame = NULL;
if (!fileExists(file)) {
Console.Error("DataBase_Loader: DataBase Not Found! [%s]", file.c_str());
}
File_Reader reader(file);
key_pair keyPair("", "");
string s0, s1;
string s0;
try {
for(;;) {
keyPair.key = "";
keyPair.value = "";
s0 = reader.getLine();
extract(s0, keyPair);
if ((keyPair.key.compare(key) == 0)
&& (keyPair.value.compare(value) == 0)) break;
}
Console.WriteLn("DataBase_Loader: Found Game! [%s]", value.c_str());
kList.push_back(keyPair);
for (;;) {
s0 = reader.getLine();
extract(s0, keyPair);
if (keyPair.key.compare("") == 0) continue;
if (keyPair.key.compare(key) == 0) break;
kList.push_back(keyPair);
for(;;) { // Find first game
s0 = reader.getLine();
extract(s0, keyPair);
if (keyPair.key.compare(key) == 0) break;
}
Game_Data* game = new Game_Data(keyPair.value);
game->kList.push_back(keyPair);
for (;;) { // Fill game data, find new game, repeat...
s0 = reader.getLine();
extract(s0, keyPair);
if (keyPair.key.compare("") == 0) continue;
if (keyPair.key.compare(key) == 0) {
gList.push_back(game);
game = new Game_Data(keyPair.value);
}
game->kList.push_back(keyPair);
}
}
}
catch(...) {}
if (!kList.size()) Console.Warning("DataBase_Loader: Game Not Found! [%s]", value.c_str());
catch(int& i) { i = 0; }
if (!value.compare("")) return;
if (setGame(value)) Console.WriteLn("DataBase_Loader: Found Game! [%s]", value.c_str());
else Console.Warning("DataBase_Loader: Game Not Found! [%s]", value.c_str());
}
~DataBase_Loader() {}
~DataBase_Loader() {
deque<Game_Data*>::iterator it = gList.begin();
for ( ; it != gList.end(); ++it) {
delete it[0];
}
}
// Sets the current game to the one matching the serial id given
// Returns true if game found, false if not found...
bool setGame(string id) {
deque<Game_Data*>::iterator it = gList.begin();
for ( ; it != gList.end(); ++it) {
if (!it[0]->id.compare(id)) {
curGame = it[0];
return true;
}
}
return false;
}
// Gets a string representation of the 'value' for the given key
string getString(string key) {
deque<key_pair>::iterator it = kList.begin();
for ( ; it != kList.end(); ++it) {
if (!it[0].key.compare(key)) {
return it[0].value;
if (curGame) {
deque<key_pair>::iterator it = curGame->kList.begin();
for ( ; it != curGame->kList.end(); ++it) {
if (!it[0].key.compare(key)) {
return it[0].value;
}
}
}
return string("???");
else Console.Error("DataBase_Loader: Game not set!");
return string("");
}
// Gets a wxString representation of the 'value' for the given key
wxString getStringWX(string key) {
string s = getString(key);
return wxString(fromAscii(s.c_str()));
}
// Gets a double representation of the 'value' for the given key
double getDouble(string key) {
string v = getString(key);
return atof(v.c_str());
}
// Gets a float representation of the 'value' for the given key
float getFloat(string key) {
string v = getString(key);
return (float)atof(v.c_str());
}
// Gets an integer representation of the 'value' for the given key
int getInt(string key) {
string v = getString(key);
return strtoul(v.c_str(), NULL, 0);
}
// Gets a u8 representation of the 'value' for the given key
u8 getU8(string key) {
string v = getString(key);
return (u8)atoi(v.c_str());
}
// Gets a bool representation of the 'value' for the given key
u8 getBool(string key) {
string v = getString(key);
return !!atoi(v.c_str());
}
};
extern DataBase_Loader GameDB;

View File

@ -30,6 +30,7 @@
#include "Elfheader.h"
#include "CDVD/CDVD.h"
#include "Patch.h"
#include "DataBase_Loader.h"
using namespace R5900; // for R5900 disasm tools
@ -576,12 +577,16 @@ __forceinline void CPU_INT( u32 n, s32 ecycle)
void __fastcall eeGameStarting()
{
if (!g_GameStarted && ElfCRC) {
wxString filename( wxsFormat( L"%8.8x", ElfCRC ) );
wxString gameCRC( wxsFormat( L"%8.8x", ElfCRC ) );
wxString gameName = GameDB.getStringWX("Name");
gameName += L" (" + GameDB.getStringWX("Region") + L")";
gameName += L" [" + DiscID + L"]";
gameName += L" [" + gameCRC + L"]";
// if patches found the following status msg will be overwritten
Console.SetTitle(L"Game running [CRC=" + filename +L"]");
// if patches found the following title will be overwritten
Console.SetTitle(gameName);
if (EmuConfig.EnablePatches) InitPatch(filename);
if (EmuConfig.EnablePatches) InitPatch(gameCRC);
GetMTGS().SendGameCRC(ElfCRC);
g_GameStarted = true;