9a52ae28a2
first, i added a timer to hide the big card after 5 secs or until a movement is registered. 2nd, removed the advancing of phases with flick up. 3rd added a flick left to "show/hide hand" 4th, fixed an error in the logic of "getDifficulty" part of the reason optimizedhand was not working. finally, unrefactored the checks of optimized hand, it was FAR to difficult to see what was actually happening the way it was coded. optimizedhand is finally working again, toggledifficulty and optimizedhand will again trigger and greatly improve ai vs player matches
273 lines
7.2 KiB
C++
273 lines
7.2 KiB
C++
#include "PrecompiledHeader.h"
|
|
|
|
#include "DeckManager.h"
|
|
#include "Player.h"
|
|
#include <JRenderer.h>
|
|
|
|
void DeckManager::updateMetaDataList(vector<DeckMetaData *> * refList, bool isAI)
|
|
{
|
|
if (refList)
|
|
{
|
|
vector<DeckMetaData *> * inputList = isAI ? &aiDeckOrderList : &playerDeckOrderList;
|
|
inputList->clear();
|
|
inputList->assign(refList->begin(), refList -> end());
|
|
}
|
|
}
|
|
|
|
vector<DeckMetaData *> * DeckManager::getPlayerDeckOrderList()
|
|
{
|
|
return &playerDeckOrderList;
|
|
}
|
|
|
|
vector<DeckMetaData *> * DeckManager::getAIDeckOrderList()
|
|
{
|
|
return &aiDeckOrderList;
|
|
}
|
|
|
|
/*
|
|
** Predicate helper for getDeckMetadataByID()
|
|
*/
|
|
struct DeckIDMatch
|
|
{
|
|
DeckIDMatch(int id) : mID(id)
|
|
{
|
|
}
|
|
|
|
bool operator() (DeckMetaData* inPtr)
|
|
{
|
|
return inPtr->getDeckId() == mID;
|
|
}
|
|
|
|
int mID;
|
|
};
|
|
|
|
DeckMetaData* DeckManager::getDeckMetaDataById( int deckId, bool isAI )
|
|
{
|
|
DeckMetaData* deck = NULL;
|
|
std::vector<DeckMetaData *>& deckList = isAI ? aiDeckOrderList : playerDeckOrderList;
|
|
|
|
std::vector<DeckMetaData *>::iterator pos = find_if(deckList.begin(), deckList.end(), DeckIDMatch(deckId));
|
|
if (pos != deckList.end())
|
|
{
|
|
deck = *pos;
|
|
}
|
|
else
|
|
{
|
|
ostringstream deckFilename;
|
|
string filepath;
|
|
if ( isAI )
|
|
filepath = options.profileFile( "ai/baka/");
|
|
else
|
|
filepath = options.profileFile( "" );
|
|
|
|
deckFilename << filepath << "/deck" << deckId << ".txt";
|
|
AddMetaData( deckFilename.str(), isAI );
|
|
deck = deckList.back();
|
|
}
|
|
return deck;
|
|
}
|
|
|
|
/*
|
|
** Predicate helper for getDeckMetadataByFilename()
|
|
*/
|
|
struct DeckFilenameMatch
|
|
{
|
|
DeckFilenameMatch(const std::string& filename) : mFilename(filename)
|
|
{
|
|
}
|
|
|
|
bool operator() (DeckMetaData* inPtr)
|
|
{
|
|
return inPtr->getFilename() == mFilename;
|
|
}
|
|
|
|
std::string mFilename;
|
|
};
|
|
|
|
DeckMetaData* DeckManager::getDeckMetaDataByFilename(const string& filename, bool isAI)
|
|
{
|
|
DeckMetaData* deck = NULL;
|
|
std::vector<DeckMetaData *>& deckList = isAI ? aiDeckOrderList : playerDeckOrderList;
|
|
|
|
std::vector<DeckMetaData *>::iterator pos = find_if(deckList.begin(), deckList.end(), DeckFilenameMatch(filename));
|
|
if (pos != deckList.end())
|
|
{
|
|
deck = *pos;
|
|
}
|
|
else
|
|
{
|
|
if ( FileExists( filename) )
|
|
{
|
|
AddMetaData( filename, isAI );
|
|
deck = deckList.back();
|
|
}
|
|
}
|
|
return deck;
|
|
}
|
|
|
|
void DeckManager::AddMetaData( const string& filename, bool isAI )
|
|
{
|
|
if (isAI)
|
|
{
|
|
aiDeckOrderList.push_back ( NEW DeckMetaData( filename, isAI ) );
|
|
aiDeckStatsMap.insert( make_pair( filename.c_str(), new StatsWrapper( aiDeckOrderList.back()->getDeckId()) ));
|
|
}
|
|
else
|
|
{
|
|
playerDeckOrderList.push_back ( NEW DeckMetaData( filename, isAI ) );
|
|
playerDeckStatsMap.insert( make_pair( filename.c_str(), new StatsWrapper( playerDeckOrderList.back()->getDeckId()) ));
|
|
}
|
|
}
|
|
|
|
void DeckManager::DeleteMetaData( const string& filename, bool isAI )
|
|
{
|
|
map<string, StatsWrapper *>::iterator it;
|
|
vector<DeckMetaData *>::iterator metaDataIter;
|
|
|
|
if (isAI)
|
|
{
|
|
it = aiDeckStatsMap.find(filename);
|
|
if (it != aiDeckStatsMap.end())
|
|
{
|
|
SAFE_DELETE(it->second);
|
|
aiDeckStatsMap.erase(it);
|
|
}
|
|
|
|
for( metaDataIter = mInstance->aiDeckOrderList.begin(); metaDataIter != mInstance->aiDeckOrderList.end(); ++metaDataIter)
|
|
{
|
|
if ((*metaDataIter)->getFilename() == filename)
|
|
{
|
|
SAFE_DELETE( *metaDataIter );
|
|
aiDeckOrderList.erase(metaDataIter);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
it = playerDeckStatsMap.find(filename);
|
|
if (it != playerDeckStatsMap.end())
|
|
{
|
|
SAFE_DELETE(it->second);
|
|
playerDeckStatsMap.erase(it);
|
|
}
|
|
|
|
for( metaDataIter = mInstance->playerDeckOrderList.begin(); metaDataIter != mInstance->playerDeckOrderList.end(); ++metaDataIter)
|
|
{
|
|
if ((*metaDataIter)->getFilename() == filename)
|
|
{
|
|
SAFE_DELETE( *metaDataIter );
|
|
playerDeckOrderList.erase(metaDataIter);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
StatsWrapper * DeckManager::getExtendedStatsForDeckId( int deckId, MTGAllCards *collection, bool isAI )
|
|
{
|
|
DeckMetaData *selectedDeck = getDeckMetaDataById( deckId, isAI );
|
|
if (selectedDeck == NULL)
|
|
{
|
|
ostringstream deckName;
|
|
deckName << options.profileFile() << "/deck" << deckId << ".txt";
|
|
map<string, StatsWrapper*>* statsMap = isAI ? &aiDeckStatsMap : &playerDeckStatsMap;
|
|
StatsWrapper * stats = NEW StatsWrapper( deckId );
|
|
statsMap->insert( make_pair(deckName.str(), stats));
|
|
return stats;
|
|
}
|
|
return getExtendedDeckStats( selectedDeck, collection, isAI);
|
|
}
|
|
|
|
|
|
StatsWrapper * DeckManager::getExtendedDeckStats( DeckMetaData *selectedDeck, MTGAllCards *collection, bool isAI )
|
|
{
|
|
StatsWrapper* stats = NULL;
|
|
|
|
string deckName = selectedDeck?selectedDeck->getFilename():"";
|
|
int deckId = selectedDeck?selectedDeck->getDeckId():0;
|
|
|
|
map<string, StatsWrapper*>* statsMap = isAI ? &aiDeckStatsMap : &playerDeckStatsMap;
|
|
if ( statsMap->find(deckName) == statsMap->end())
|
|
{
|
|
stats = NEW StatsWrapper(deckId);
|
|
stats->updateStats( deckName, collection);
|
|
statsMap->insert( make_pair(deckName, stats));
|
|
}
|
|
else
|
|
{
|
|
stats = statsMap->find(deckName)->second;
|
|
if ( stats->needUpdate )
|
|
stats->updateStats( deckName, collection );
|
|
}
|
|
return stats;
|
|
}
|
|
|
|
|
|
DeckManager * DeckManager::mInstance = NULL;
|
|
|
|
void DeckManager::EndInstance()
|
|
{
|
|
SAFE_DELETE(mInstance);
|
|
}
|
|
|
|
DeckManager* DeckManager::GetInstance()
|
|
{
|
|
if (!mInstance)
|
|
{
|
|
mInstance = NEW DeckManager();
|
|
}
|
|
|
|
return mInstance;
|
|
}
|
|
|
|
// p1 is assumed to be the player you want stats for
|
|
// p2 is the opponent
|
|
int DeckManager::getDifficultyRating(Player *statsPlayer, Player *player)
|
|
{
|
|
if(player->deckFile != "")
|
|
{
|
|
DeckMetaData *meta = getDeckMetaDataByFilename(player->deckFile, (player->isAI() == 1) );
|
|
|
|
if (meta)
|
|
{
|
|
int diff = meta->getVictoryPercentage();
|
|
meta->mPlayerDeck = statsPlayer->GetCurrentDeckStatsFile();
|
|
meta->mStatsFilename = player->deckFileSmall;
|
|
meta->LoadStats();
|
|
}
|
|
return meta->getDifficulty();
|
|
}
|
|
else
|
|
return EASY;
|
|
}
|
|
|
|
DeckManager::~DeckManager()
|
|
{
|
|
map<string, StatsWrapper *>::iterator it;
|
|
vector<DeckMetaData *>::iterator metaDataIter;
|
|
|
|
for (it = aiDeckStatsMap.begin(); it != aiDeckStatsMap.end(); it++){
|
|
SAFE_DELETE(it->second);
|
|
}
|
|
for (it = playerDeckStatsMap.begin(); it != playerDeckStatsMap.end(); it++){
|
|
SAFE_DELETE(it->second);
|
|
}
|
|
|
|
for( metaDataIter = aiDeckOrderList.begin(); metaDataIter != aiDeckOrderList.end(); ++metaDataIter)
|
|
{
|
|
SAFE_DELETE( *metaDataIter );
|
|
}
|
|
|
|
for( metaDataIter = playerDeckOrderList.begin(); metaDataIter != playerDeckOrderList.end(); ++metaDataIter)
|
|
{
|
|
SAFE_DELETE( *metaDataIter );
|
|
}
|
|
|
|
aiDeckOrderList.clear();
|
|
playerDeckOrderList.clear();
|
|
aiDeckStatsMap.clear();
|
|
playerDeckStatsMap.clear();
|
|
}
|