- fix for issue 772

- fixed some issues in zstream that prevented to use "getline" in zipped streams 
- added a "pooled buffers" system to keep a cache of file descriptors. This is potentially dangerous though, but shaves several seconds of loading time on the PSP. If problems arise on other platforms I'll make it a compilation parameter
- gracefully fail when calling manacost information on a not properly initialized mana cost
This commit is contained in:
wagic.the.homebrew
2011-12-28 16:14:08 +00:00
parent 9e80314f6d
commit 591f0e0d30
12 changed files with 276 additions and 61 deletions

View File

@@ -126,6 +126,7 @@ void GameApp::Create()
LOG("init Res Folder at " + foldersRoot);
JFileSystem::init(foldersRoot + "User/", foldersRoot + systemFolder);
// Create User Folders (for write access) if they don't exist
{
const char* folders[] = { "ai", "ai/baka", "ai/baka/stats", "campaigns", "graphics", "lang", "packs", "player", "player/stats", "profiles", "rules", "sets", "settings", "sound", "sound/sfx", "themes", "test"};
@@ -160,6 +161,13 @@ void GameApp::Create()
//Test for Music files presence
JFileSystem * jfs = JFileSystem::GetInstance();
HasMusic = jfs->FileExists(WResourceManager::Instance()->musicFile("Track0.mp3")) && jfs->FileExists(WResourceManager::Instance()->musicFile("Track1.mp3"));
LOG("Init Collection");
MTGAllCards::loadInstance();
LOG("Loading rules");
Rules::loadAllRules();
LOG("Loading Textures");
LOG("--Loading menuicons.png");
@@ -235,8 +243,6 @@ void GameApp::Create()
jq = WResourceManager::Instance()->RetrieveQuad("phasebar.png", 0, 0, 0, 0, "phasebar", RETRIEVE_MANAGE);
LOG("Init Collection");
MTGAllCards::loadInstance();
LOG("Creating Game States");
mGameStates[GAME_STATE_DECK_VIEWER] = NEW GameStateDeckViewer(this);
@@ -265,9 +271,6 @@ void GameApp::Create()
mCurrentState = NULL;
mNextState = mGameStates[GAME_STATE_MENU];
LOG("--Load Game rules");
Rules::loadAllRules();
//Set Audio volume
JSoundSystem::GetInstance()->SetSfxVolume(options[Options::SFXVOLUME].number);
JSoundSystem::GetInstance()->SetMusicVolume(options[Options::MUSICVOLUME].number);

View File

@@ -1750,17 +1750,33 @@ void GameObserver::createPlayer(const string& playerMode
#ifdef TESTSUITE
void GameObserver::loadTestSuitePlayer(int playerId, TestSuiteGame* testSuite)
{
players.push_back(new TestSuiteAI(testSuite, playerId));
loadPlayer(playerId, new TestSuiteAI(testSuite, playerId));
}
#endif //TESTSUITE
void GameObserver::loadPlayer(int playerId, Player* player)
{
players.push_back(player);
//Because we're using a vector instead of an array (why?),
// we have to prepare the vector in order to be the right size to accomodate the playerId variable
// see http://code.google.com/p/wagic/issues/detail?id=772
if (players.size() > (size_t) playerId) {
SAFE_DELETE(players[playerId]);
players[playerId] = NULL;
} else {
while (players.size() <= (size_t) playerId)
{
players.push_back(NULL);
}
}
players[playerId] = player;
}
void GameObserver::loadPlayer(int playerId, PlayerType playerType, int decknb, bool premadeDeck)
{
if (decknb)
{
if (playerType == PLAYER_TYPE_HUMAN)
@@ -1774,7 +1790,8 @@ void GameObserver::loadPlayer(int playerId, PlayerType playerType, int decknb, b
sprintf(deckFile, "%s/deck%i.txt", options.profileFile().c_str(), decknb);
char deckFileSmall[255];
sprintf(deckFileSmall, "player_deck%i", decknb);
players.push_back(NEW HumanPlayer(this, deckFile, deckFileSmall, premadeDeck));
loadPlayer(playerId, NEW HumanPlayer(this, deckFile, deckFileSmall, premadeDeck));
#ifdef NETWORK_SUPPORT
// FIXME, this is broken
if(isNetwork)
@@ -1785,7 +1802,7 @@ void GameObserver::loadPlayer(int playerId, PlayerType playerType, int decknb, b
}
else
{ //Remote player
mPlayers.push_back(NEW RemotePlayer(mParent->mpNetwork));
loadPlayer(playerId, NEW RemotePlayer(mParent->mpNetwork));
#endif //NETWORK_SUPPORT
}
}
@@ -1794,7 +1811,8 @@ void GameObserver::loadPlayer(int playerId, PlayerType playerType, int decknb, b
AIPlayerFactory playerCreator;
Player * opponent = NULL;
if (playerId == 1) opponent = players[0];
players.push_back(playerCreator.createAIPlayer(this, MTGCollection(), opponent, decknb));
loadPlayer(playerId, playerCreator.createAIPlayer(this, MTGCollection(), opponent, decknb));
}
}
else
@@ -1809,11 +1827,11 @@ void GameObserver::loadPlayer(int playerId, PlayerType playerType, int decknb, b
if (playerId == 1) opponent = players[0];
#ifdef AI_CHANGE_TESTING
if (playerType == PLAYER_TYPE_CPU_TEST)
players.push_back(playerCreator.createAIPlayerTest(this, MTGCollection(), opponent, playerId == 0 ? "ai/bakaA/" : "ai/bakaB/"));
loadPlayer(playerId, playerCreator.createAIPlayerTest(this, MTGCollection(), opponent, playerId == 0 ? "ai/bakaA/" : "ai/bakaB/"));
else
#endif
{
players.push_back(playerCreator.createAIPlayer(this, MTGCollection(), opponent));
loadPlayer(playerId, playerCreator.createAIPlayer(this, MTGCollection(), opponent));
}
if (playerType == PLAYER_TYPE_CPU_TEST)

View File

@@ -394,11 +394,9 @@ void GameStateMenu::listPrimitives()
{
string filename = "sets/primitives/";
filename.append(primitiveFiles[i]);
izfstream file;
if (! JFileSystem::GetInstance()->openForRead(file, filename))
continue;
file.close();
if (! JFileSystem::GetInstance()->FileExists(filename))
continue;
primitives.push_back(filename);
}
primitivesLoadCounter = 0;

View File

@@ -330,18 +330,20 @@ int MTGAllCards::load(const char * config_file, const char * set_name, int autol
int lineNumber = 0;
std::string contents;
if (!JFileSystem::GetInstance()->readIntoString(config_file, contents))
izfstream file;
if (!JFileSystem::GetInstance()->openForRead(file, config_file))
return total_cards;
std::stringstream stream(contents);
string s;
while (true)
while (getline(file,s))
{
if (!std::getline(stream, s)) return total_cards;
lineNumber++;
if (!s.size()) continue;
if (s[s.size() - 1] == '\r') s.erase(s.size() - 1); // Handle DOS files
if (s[s.size() - 1] == '\r')
s.erase(s.size() - 1); //Handle DOS files
if (!s.size()) continue;
if (s.find("#AUTO_DEFINE ") == 0)
{
string toAdd = s.substr(13);
@@ -374,6 +376,7 @@ int MTGAllCards::load(const char * config_file, const char * set_name, int autol
if (!maxGrade) maxGrade = Constants::GRADE_BORDERLINE; //Default setting for grade is borderline?
if (fileGrade > maxGrade)
{
file.close();
return total_cards;
}
}
@@ -405,6 +408,7 @@ int MTGAllCards::load(const char * config_file, const char * set_name, int autol
continue;
}
}
file.close();
return total_cards;
}

View File

@@ -351,11 +351,23 @@ ManaCost::~ManaCost()
void ManaCost::x()
{
if (cost.size() <= (size_t)Constants::NB_Colors)
{
DebugTrace("Seems ManaCost was not properly initialized");
return;
}
cost[Constants::NB_Colors] = 1;
}
int ManaCost::hasX()
{
if (cost.size() <= (size_t)Constants::NB_Colors)
{
DebugTrace("Seems ManaCost was not properly initialized");
return 0;
}
return cost[Constants::NB_Colors];
}
@@ -465,6 +477,11 @@ void ManaCost::copy(ManaCost * _manaCost)
int ManaCost::getCost(int color)
{
if (cost.size() <= (size_t)color)
{
DebugTrace("Seems ManaCost was not properly initialized");
return 0;
}
return cost[color];
}
@@ -477,7 +494,7 @@ ManaCostHybrid * ManaCost::getHybridCost(unsigned int i)
int ManaCost::hasColor(int color)
{
if (cost[color])
if (getCost(color))
return 1;
for (size_t i = 0; i < hybrids.size(); i++)
{