more work on cascade, I think I figured out what was causing a weird crash.

This commit is contained in:
zethfoxster
2016-07-14 20:28:19 -04:00
parent 01fd8fa406
commit e81346f881
6 changed files with 45 additions and 9 deletions
+1
View File
@@ -6208,6 +6208,7 @@ class AACascade: public ActivatedAbility
{ {
public: public:
string nbcardsStr; string nbcardsStr;
MTGCardInstance * castingThis;
vector<MTGCardInstance*>selectedCards; vector<MTGCardInstance*>selectedCards;
vector<MTGCardInstance *>oldOrder; vector<MTGCardInstance *>oldOrder;
vector<MTGCardInstance *>newOrder; vector<MTGCardInstance *>newOrder;
+1
View File
@@ -133,6 +133,7 @@ class GameObserver{
int isInPlay(MTGCardInstance * card); int isInPlay(MTGCardInstance * card);
int isInGrave(MTGCardInstance * card); int isInGrave(MTGCardInstance * card);
int isInExile(MTGCardInstance * card); int isInExile(MTGCardInstance * card);
int isInHand(MTGCardInstance * card);
virtual void Update(float dt); virtual void Update(float dt);
void Render(); void Render();
void ButtonPressed(PlayGuiObject*); void ButtonPressed(PlayGuiObject*);
+1
View File
@@ -92,6 +92,7 @@ public:
bool isPhased; bool isPhased;
bool isCascaded; bool isCascaded;
int phasedTurn; int phasedTurn;
bool handEffects;
bool graveEffects; bool graveEffects;
bool exileEffects; bool exileEffects;
bool suspended; bool suspended;
+10 -3
View File
@@ -1143,6 +1143,7 @@ AACascade::AACascade(GameObserver* observer, int _id, MTGCardInstance * _source,
selectedCards.clear(); selectedCards.clear();
oldOrder.clear(); oldOrder.clear();
newOrder.clear(); newOrder.clear();
castingThis = NULL;
} }
int AACascade::resolve() int AACascade::resolve()
{ {
@@ -1171,10 +1172,9 @@ int AACascade::resolve()
{ {
if (!viable->isLand() && (viable->getManaCost()->getConvertedCost() < source->getManaCost()->getConvertedCost())) if (!viable->isLand() && (viable->getManaCost()->getConvertedCost() < source->getManaCost()->getConvertedCost()))
{ {
toCastCard(viable);
viable = player->game->putInZone(viable, library, exile); viable = player->game->putInZone(viable, library, exile);
viable->isCascaded = true; viable->isCascaded = true;
castingThis = viable;
found = true; found = true;
} }
else else
@@ -1193,7 +1193,7 @@ int AACascade::resolve()
{ {
if (exile->cards[j]->isCascaded) if (exile->cards[j]->isCascaded)
{ {
MTGCardInstance * CardToPutBack = exile->cards[j];//player->game->putInZone(exile->cards[j], exile, library); MTGCardInstance * CardToPutBack = exile->cards[j];;
CardToPutBack->isCascaded = false; CardToPutBack->isCascaded = false;
selectedCards.push_back(CardToPutBack); selectedCards.push_back(CardToPutBack);
} }
@@ -1213,6 +1213,13 @@ int AACascade::resolve()
selectedCards.pop_back(); selectedCards.pop_back();
} }
} while (selectedCards.size()); } while (selectedCards.size());
if (castingThis)
{
while (castingThis->next)
castingThis = castingThis->next;
toCastCard(castingThis);
}
} }
////////////////////////////////////// //////////////////////////////////////
return 1; return 1;
+10
View File
@@ -1568,7 +1568,17 @@ int GameObserver::isInExile(MTGCardInstance * card)
} }
return 0; return 0;
} }
int GameObserver::isInHand(MTGCardInstance * card)
{
for (int i = 0; i < 2; i++)
{
MTGGameZone * hand = players[i]->game->hand;
if (players[i]->game->isInZone(card, hand))
return 1;
}
return 0;
}
void GameObserver::cleanupPhase() void GameObserver::cleanupPhase()
{ {
currentPlayer->cleanupPhase(); currentPlayer->cleanupPhase();
+22 -6
View File
@@ -3982,13 +3982,14 @@ int AbilityFactory::getAbilities(vector<MTGAbility *> * v, Spell * spell, MTGCar
{ {
card->graveEffects = false; card->graveEffects = false;
card->exileEffects = false; card->exileEffects = false;
card->handEffects = false;
for (int i = 0; i < 2; ++i) for (int i = 0; i < 2; ++i)
{ {
MTGPlayerCards * zones = observer->players[i]->game; MTGPlayerCards * zones = observer->players[i]->game;
if (dest == zones->hand) if (dest == zones->hand)
{ {
magicText = card->magicTexts["hand"]; magicText = card->magicTexts["hand"];
card->handEffects = true;
break; break;
} }
if (dest == zones->graveyard) if (dest == zones->graveyard)
@@ -4891,6 +4892,8 @@ int MTGAbility::testDestroy()
return 1; return 1;
if (forceDestroy == -1) if (forceDestroy == -1)
return 0; return 0;
if (source->handEffects && game->isInHand(source))
return 0;
if(source->graveEffects && game->isInGrave(source)) if(source->graveEffects && game->isInGrave(source))
return 0; return 0;
if(source->exileEffects && game->isInExile(source)) if(source->exileEffects && game->isInExile(source))
@@ -5934,13 +5937,26 @@ int AManaProducer::isReactingToClick(MTGCardInstance * _card, ManaCost * mana)
int result = 0; int result = 0;
if (!mana) if (!mana)
mana = game->currentlyActing()->getManaPool(); mana = game->currentlyActing()->getManaPool();
if (_card == source && (!tap || !source->isTapped()) && game->currentlyActing()->game->inPlay->hasCard(source) //please do not condense the following, I broke it apart for readability, it was far to difficult to tell what exactly happened before with it all in a single line.
&& (source->hasType(Subtypes::TYPE_LAND) || !tap || !source->hasSummoningSickness()) && !source->isPhased) //and far to prone to bugs.
if (_card == source)
{ {
ManaCost * cost = getCost(); if (!tap || (tap && !source->isTapped()))
if (!cost || (mana->canAfford(cost) && (!cost->extraCosts || cost->extraCosts->canPay())))/*counter cost bypass react to click*/
{ {
result = 1; if (!source->hasSummoningSickness())
{
if (game->currentlyActing()->game->inPlay->hasCard(source) && source->hasType(Subtypes::TYPE_LAND))
{
if (!source->isPhased)
{
ManaCost * cost = getCost();
if (!cost || (mana->canAfford(cost) && (!cost->extraCosts || cost->extraCosts->canPay())))/*counter cost bypass react to click*/
{
result = 1;
}
}
}
}
} }
} }
return result; return result;