- reworked the testsuite and the rules (storyflow) to use the same game deserialization code, moved that code to the players and zone classes

- removed every references to the gameobserver singleton. This object can now be instantiated several times as it's needed for minmax. To be able to do that, I mostly added a reference to a gameobserver from any targetable object (cards, players, spells) and abilities.
This commit is contained in:
Xawotihs
2011-10-01 13:30:30 +00:00
parent d6db0c4f63
commit 9adb9d625d
86 changed files with 1902 additions and 1961 deletions

View File

@@ -11,35 +11,18 @@
#include "MTGGamePhase.h"
#include "GuiPhaseBar.h"
GameObserver * GameObserver::mInstance = NULL;
GameObserver* GameObserver::GetInstance()
GameObserver::GameObserver()
{
return mInstance;
initialize();
}
void GameObserver::EndInstance()
void GameObserver::initialize()
{
SAFE_DELETE(mInstance);
}
void GameObserver::Init(Player * _players[], int _nbplayers)
{
mInstance = NEW GameObserver(_players, _nbplayers);
}
GameObserver::GameObserver(Player * _players[], int _nb_players)
{
for (int i = 0; i < _nb_players; i++)
{
players[i] = _players[i];
}
currentPlayer = NULL;
currentActionPlayer = NULL;
isInterrupting = NULL;
currentPlayerId = 0;
nbPlayers = _nb_players;
nbPlayers = 0;
currentGamePhase = -1;
targetChooser = NULL;
cardWaitingForTargets = NULL;
@@ -52,11 +35,37 @@ GameObserver::GameObserver(Player * _players[], int _nb_players)
connectRule = false;
}
void GameObserver::setPlayers(Player * _players[], int _nbplayers)
{
for (int i = 0; i < _nbplayers; i++)
{
players[i] = _players[i];
players[i]->setObserver(this);
}
nbPlayers = _nbplayers;
}
GameObserver::GameObserver(Player * _players[], int _nb_players)
{
initialize();
setPlayers(_players, _nb_players);
}
int GameObserver::getCurrentGamePhase()
{
return currentGamePhase;
}
const char* GameObserver::getCurrentGamePhaseName()
{
return phaseRing->phaseName(currentGamePhase);
}
const char* GameObserver::getNextGamePhaseName()
{
return phaseRing->phaseName((currentGamePhase + 1) % Constants::MTG_PHASE_CLEANUP);
}
Player * GameObserver::opponent()
{
int index = (currentPlayerId + 1) % nbPlayers;
@@ -130,8 +139,7 @@ void GameObserver::nextGamePhase()
while (currentPlayer->game->hand->nb_cards > currentPlayer->handsize && currentPlayer->nomaxhandsize == false)
{
WEvent * e = NEW WEventCardDiscard(currentPlayer->game->hand->cards[0]);
GameObserver * game = GameObserver::GetInstance();
game->receiveEvent(e);
receiveEvent(e);
currentPlayer->game->putInGraveyard(currentPlayer->game->hand->cards[0]);
}
mLayers->actionLayer()->Update(0);
@@ -249,19 +257,19 @@ void GameObserver::startGame(Rules * rules)
turn = 0;
mRules = rules;
if (rules)
rules->initPlayers();
rules->initPlayers(this);
options.automaticStyle(players[0], players[1]);
mLayers = NEW DuelLayers();
mLayers->init();
mLayers->init(this);
currentPlayerId = 0;
currentPlayer = players[0];
currentActionPlayer = currentPlayer;
phaseRing = NEW PhaseRing(players, nbPlayers);
phaseRing = NEW PhaseRing(this);
if (rules)
rules->initGame();
rules->initGame(this);
//Preload images from hand
if (!players[0]->isAI())
@@ -298,7 +306,7 @@ void GameObserver::startGame(Rules * rules)
if (card)
{
MTGCardInstance * copy = p->game->putInZone(card, p->game->library, p->game->stack);
Spell * spell = NEW Spell(copy);
Spell * spell = NEW Spell(this, copy);
spell->resolve();
delete spell;
}
@@ -455,7 +463,7 @@ void GameObserver::gameStateBasedEffects()
//////////////////////////
//forceDestroy over ride//
//////////////////////////
if(card->isInPlay())
if(card->isInPlay(this))
{
card->graveEffects = false;
card->exileEffects = false;
@@ -471,7 +479,7 @@ void GameObserver::gameStateBasedEffects()
check = card->childrenCards[wC];
for(size_t wCC = 0; wCC < card->childrenCards.size();wCC++)
{
if(check->isInPlay())
if(check->isInPlay(this))
{
if(check->getName() == card->childrenCards[wCC]->getName() && check != card->childrenCards[wCC])
{
@@ -559,7 +567,7 @@ void GameObserver::gameStateBasedEffects()
c->flanked -= 1;
}
c->fresh = 0;
if(c->wasDealtDamage && c->isInPlay())
if(c->wasDealtDamage && c->isInPlay(this))
c->wasDealtDamage = false;
c->damageToController = false;
c->damageToOpponent = false;
@@ -571,8 +579,7 @@ void GameObserver::gameStateBasedEffects()
if (c->has(Constants::TREASON))
{
WEvent * e = NEW WEventCardSacrifice(c);
GameObserver * game = GameObserver::GetInstance();
game->receiveEvent(e);
receiveEvent(e);
p->game->putInGraveyard(c);
}
@@ -632,8 +639,7 @@ void GameObserver::gameStateBasedEffects()
}
//Auto skip Phases
GameObserver * game = game->GetInstance();
int skipLevel = (game->currentPlayer->playMode == Player::MODE_TEST_SUITE) ? Constants::ASKIP_NONE
int skipLevel = (currentPlayer->playMode == Player::MODE_TEST_SUITE) ? Constants::ASKIP_NONE
: options[Options::ASPHASES].number;
int nrCreatures = currentPlayer->game->inPlay->countByType("Creature");
@@ -752,7 +758,7 @@ void GameObserver::Affinity()
int reduce = 0;
if(card->has(Constants::AFFINITYGREENCREATURES))
{
TargetChooserFactory tf;
TargetChooserFactory tf(this);
TargetChooser * tc = tf.createTargetChooser("creature[green]",NULL);
reduce = card->controller()->game->battlefield->countByCanTarget(tc);
SAFE_DELETE(tc);
@@ -968,8 +974,7 @@ int GameObserver::cardClick(MTGCardInstance * card, Targetable * object)
&& currentPlayer->game->hand->nb_cards > currentPlayer->handsize && currentPlayer->nomaxhandsize == false)
{
WEvent * e = NEW WEventCardDiscard(currentPlayer->game->hand->cards[0]);
GameObserver * game = GameObserver::GetInstance();
game->receiveEvent(e);
receiveEvent(e);
currentPlayer->game->putInGraveyard(card);
}
else if (reaction)
@@ -1093,7 +1098,7 @@ int GameObserver::targetListIsSet(MTGCardInstance * card)
{
if (targetChooser == NULL)
{
TargetChooserFactory tcf;
TargetChooserFactory tcf(this);
targetChooser = tcf.createTargetChooser(card);
if (targetChooser == NULL)
{