f9be0a6341
- added 2 menus to wait for connection and wait for deck selection - tested compilation on Qt Linux, Qt Windows and PSP - deactivated everywhere (NETWORK_SUPPORT to activate).
221 lines
4.9 KiB
C++
221 lines
4.9 KiB
C++
#include "PrecompiledHeader.h"
|
|
|
|
#include "Player.h"
|
|
#include "GameObserver.h"
|
|
#include "DeckStats.h"
|
|
#include "ManaCost.h"
|
|
|
|
Player::Player(string file, string fileSmall, MTGDeck * deck) :
|
|
Damageable(20)
|
|
{
|
|
bool deleteDeckPlease = false;
|
|
if(deck == NULL && file != "testsuite" && file != "remote")
|
|
{
|
|
deck = NEW MTGDeck(file.c_str(), MTGCollection());
|
|
deleteDeckPlease = true;
|
|
}
|
|
|
|
game = NULL;
|
|
deckFile = file;
|
|
deckFileSmall = fileSmall;
|
|
manaPool = NEW ManaPool(this);
|
|
nomaxhandsize = false;
|
|
poisonCount = 0;
|
|
damageCount = 0;
|
|
preventable = 0;
|
|
mAvatarTex = NULL;
|
|
type_as_damageable = DAMAGEABLE_PLAYER;
|
|
playMode = MODE_HUMAN;
|
|
if (deck != NULL)
|
|
{
|
|
game = NEW MTGPlayerCards(deck);
|
|
game->setOwner(this);
|
|
deckName = deck->meta_name;
|
|
}
|
|
if(deleteDeckPlease)
|
|
{
|
|
SAFE_DELETE(deck);
|
|
}
|
|
}
|
|
|
|
/*Method to call at the end of a game, before all objects involved in the game are destroyed */
|
|
void Player::End()
|
|
{
|
|
DeckStats::GetInstance()->saveStats(this, opponent(), GameObserver::GetInstance());
|
|
}
|
|
|
|
Player::~Player()
|
|
{
|
|
SAFE_DELETE(manaPool);
|
|
SAFE_DELETE(game);
|
|
WResourceManager::Instance()->Release(mAvatarTex);
|
|
mAvatarTex = NULL;
|
|
}
|
|
|
|
void Player::loadAvatar(string file)
|
|
{
|
|
if (mAvatarTex)
|
|
{
|
|
WResourceManager::Instance()->Release(mAvatarTex);
|
|
mAvatarTex = NULL;
|
|
}
|
|
mAvatarTex = WResourceManager::Instance()->RetrieveTexture(file, RETRIEVE_LOCK, TEXTURE_SUB_AVATAR);
|
|
if (mAvatarTex)
|
|
mAvatar = WResourceManager::Instance()->RetrieveQuad(file, 0, 0, 35, 50, "playerAvatar", RETRIEVE_NORMAL, TEXTURE_SUB_AVATAR);
|
|
}
|
|
|
|
const string Player::getDisplayName() const
|
|
{
|
|
GameObserver * g = GameObserver::GetInstance();
|
|
if (this == g->players[0]) return "Player 1";
|
|
return "Player 2";
|
|
}
|
|
|
|
MTGInPlay * Player::inPlay()
|
|
{
|
|
return game->inPlay;
|
|
}
|
|
|
|
int Player::getId()
|
|
{
|
|
GameObserver * game = GameObserver::GetInstance();
|
|
for (int i = 0; i < 2; i++)
|
|
{
|
|
if (game->players[i] == this) return i;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
JQuadPtr Player::getIcon()
|
|
{
|
|
return mAvatar;
|
|
}
|
|
|
|
Player * Player::opponent()
|
|
{
|
|
GameObserver * game = GameObserver::GetInstance();
|
|
if (!game) return NULL;
|
|
return this == game->players[0] ? game->players[1] : game->players[0];
|
|
}
|
|
|
|
HumanPlayer::HumanPlayer(string file, string fileSmall, MTGDeck * deck) :
|
|
Player(file, fileSmall, deck)
|
|
{
|
|
loadAvatar("avatar.jpg");
|
|
playMode = MODE_HUMAN;
|
|
}
|
|
|
|
ManaPool * Player::getManaPool()
|
|
{
|
|
return manaPool;
|
|
}
|
|
|
|
int Player::gainOrLoseLife(int value)
|
|
{
|
|
if (!value)
|
|
return 0; //Don't do anything if there's no actual life change
|
|
|
|
thatmuch = abs(value); //the value that much is a variable to be used with triggered abilities.
|
|
//ie:when ever you gain life, draw that many cards. when used in a trigger draw:thatmuch, will return the value
|
|
//that the triggered event stored in the card for "that much".
|
|
life+=value;
|
|
if (value<0)
|
|
lifeLostThisTurn += abs(value);
|
|
|
|
//Send life event to listeners
|
|
WEvent * lifed = NEW WEventLife(this,value);
|
|
GameObserver * game = GameObserver::GetInstance();
|
|
game->receiveEvent(lifed);
|
|
|
|
return value;
|
|
}
|
|
|
|
int Player::gainLife(int value)
|
|
{
|
|
if (value <0)
|
|
{
|
|
DebugTrace("PLAYER.CPP: don't call gainLife on a negative value, use loseLife instead");
|
|
return 0;
|
|
}
|
|
return gainOrLoseLife(value);
|
|
}
|
|
|
|
int Player::loseLife(int value)
|
|
{
|
|
if (value <0)
|
|
{
|
|
DebugTrace("PLAYER.CPP: don't call loseLife on a negative value, use gainLife instead");
|
|
return 0;
|
|
}
|
|
return gainOrLoseLife(-value);
|
|
}
|
|
|
|
int Player::afterDamage()
|
|
{
|
|
return life;
|
|
}
|
|
|
|
int Player::poisoned()
|
|
{
|
|
return poisonCount;
|
|
}
|
|
|
|
int Player::damaged()
|
|
{
|
|
return damageCount;
|
|
}
|
|
|
|
int Player::prevented()
|
|
{
|
|
return preventable;
|
|
}
|
|
|
|
void Player::takeMulligan()
|
|
{
|
|
MTGPlayerCards * currentPlayerZones = game;
|
|
int cardsinhand = currentPlayerZones->hand->nb_cards;
|
|
for (int i = 0; i < cardsinhand; i++) //Discard hand
|
|
currentPlayerZones->putInZone(currentPlayerZones->hand->cards[0],
|
|
currentPlayerZones->hand,
|
|
currentPlayerZones->library);
|
|
|
|
currentPlayerZones->library->shuffle(); //Shuffle
|
|
|
|
for (int i = 0; i < (cardsinhand - 1); i++)
|
|
game->drawFromLibrary();
|
|
//Draw hand with 1 less card penalty //almhum
|
|
}
|
|
|
|
//Cleanup phase at the end of a turn
|
|
void Player::cleanupPhase()
|
|
{
|
|
game->inPlay->cleanupPhase();
|
|
game->graveyard->cleanupPhase();
|
|
}
|
|
|
|
std::string Player::GetCurrentDeckStatsFile()
|
|
{
|
|
std::ostringstream filename;
|
|
filename << "stats/" << deckFileSmall << ".txt";
|
|
return options.profileFile(filename.str());
|
|
}
|
|
|
|
|
|
ostream& operator<<(ostream& out, const Player& p)
|
|
{
|
|
return out << *(p.game);
|
|
}
|
|
|
|
istream& operator>>(istream& in, Player& p)
|
|
{
|
|
if(!p.game)
|
|
{
|
|
p.game = new MTGPlayerCards();
|
|
}
|
|
|
|
in >> *(p.game);
|
|
p.game->setOwner(&p);
|
|
|
|
return in;
|
|
}
|