Merge pull request #673 from kevlahnota/master

Fix Cant life change and Seperated Cascade from Depleter class.
This commit is contained in:
Anthony Calosa
2016-06-03 12:19:25 +08:00
5 changed files with 96 additions and 61 deletions

View File

@@ -6076,16 +6076,27 @@ class AADepleter: public ActivatedAbilityTP
public: public:
string nbcardsStr; string nbcardsStr;
bool toexile; bool toexile;
bool cascade;
AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost = NULL, AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost = NULL,
int who = TargetChooser::UNSET, bool toexile = false, bool cascade = false); int who = TargetChooser::UNSET, bool toexile = false);
int resolve(); int resolve();
string Cascade;
void toCastCard(MTGCardInstance * card);
const string getMenuText(); const string getMenuText();
AADepleter * clone() const; AADepleter * clone() const;
}; };
//AACascade
class AACascade: public ActivatedAbilityTP
{
public:
string nbcardsStr;
AACascade(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost = NULL,
int who = TargetChooser::UNSET);
int resolve();
void toCastCard(MTGCardInstance * card);
const string getMenuText();
AACascade * clone() const;
};
//Generic skip turn/extra turn //Generic skip turn/extra turn
class AAModTurn: public ActivatedAbilityTP class AAModTurn: public ActivatedAbilityTP
{ {

View File

@@ -261,12 +261,49 @@ AADamager * AADamager::clone() const
//AADepleter //AADepleter
AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost, int who, bool toexile, bool cascade) : AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost, int who, bool toexile) :
ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbcardsStr(nbcardsStr),toexile(toexile),cascade(cascade) ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbcardsStr(nbcardsStr),toexile(toexile)
{ {
Cascade = "Cascade";
} }
int AADepleter::resolve() int AADepleter::resolve()
{
Player * player = getPlayerFromTarget(getTarget());
if (player)
{
WParsedInt numCards(nbcardsStr, NULL, source);
MTGLibrary * library = player->game->library;
for (int i = 0; i < numCards.getValue(); i++)
{
if (library->nb_cards)
{
if(toexile)
player->game->putInZone(library->cards[library->nb_cards - 1], library, player->game->exile);
else
player->game->putInZone(library->cards[library->nb_cards - 1], library, player->game->graveyard);
}
}
}
return 1;
}
const string AADepleter::getMenuText()
{
if(toexile)
return "Ingest";
return "Deplete";
}
AADepleter * AADepleter::clone() const
{
return NEW AADepleter(*this);
}
//AACascade
AACascade::AACascade(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost, int who) :
ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbcardsStr(nbcardsStr)
{
}
int AACascade::resolve()
{ {
Player * player = getPlayerFromTarget(getTarget()); Player * player = getPlayerFromTarget(getTarget());
if (player) if (player)
@@ -280,85 +317,72 @@ AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card,
{ {
if (library->nb_cards) if (library->nb_cards)
{ {
if(cascade) for(int z = library->nb_cards; z >= 0; z--)
{ {
for(int z = library->nb_cards; z >= 0; z--) if(!library->cards[z]->isLand() && (library->cards[z]->getManaCost()->getConvertedCost() < source->getManaCost()->getConvertedCost()))
{ {
if(!library->cards[z]->isLand() && (library->cards[z]->getManaCost()->getConvertedCost() < source->getManaCost()->getConvertedCost())) viable = library->cards[z];
player->game->putInZone(viable, library, exile);
{ {
viable = library->cards[z]; vector<MTGCardInstance*>selectedCards;
player->game->putInZone(viable, library, exile); for(int j=0; j < library->nb_cards; j++)
{ {
vector<MTGCardInstance*>selectedCards; if(library->cards[j]->isCascaded)
for(int j=0; j < library->nb_cards; j++) {
library->cards[j]->isCascaded = false;
selectedCards.push_back(library->cards[j]);
}
}
if(selectedCards.size())
{
std::random_shuffle ( selectedCards.begin(), selectedCards.end() );
for(unsigned int i = 0; i < selectedCards.size();++i)
{ {
if(library->cards[j]->isCascaded) vector<MTGCardInstance *>oldOrder = library->cards;
{ vector<MTGCardInstance *>newOrder;
library->cards[j]->isCascaded = false; newOrder.push_back(selectedCards[i]);
selectedCards.push_back(library->cards[j]); for(unsigned int k = 0;k < oldOrder.size();++k)
}
}
if(selectedCards.size())
{
std::random_shuffle ( selectedCards.begin(), selectedCards.end() );
for(unsigned int i = 0; i < selectedCards.size();++i)
{ {
vector<MTGCardInstance *>oldOrder = library->cards; MTGCardInstance * rearranged = oldOrder[k];
vector<MTGCardInstance *>newOrder; if(rearranged != selectedCards[i])
newOrder.push_back(selectedCards[i]); newOrder.push_back(rearranged);
for(unsigned int k = 0;k < oldOrder.size();++k)
{
MTGCardInstance * rearranged = oldOrder[k];
if(rearranged != selectedCards[i])
newOrder.push_back(rearranged);
}
library->cards = newOrder;
} }
library->cards = newOrder;
} }
} }
toCastCard(viable->next);
return 1;
}
else
{
library->cards[library->nb_cards - 1]->isCascaded=true;
counter++;
} }
toCastCard(viable->next);
return 1;
}
else
{
library->cards[library->nb_cards - 1]->isCascaded=true;
counter++;
} }
} }
else if(toexile)
player->game->putInZone(library->cards[library->nb_cards - 1], library, player->game->exile);
else
player->game->putInZone(library->cards[library->nb_cards - 1], library, player->game->graveyard);
} }
} }
} }
return 1; return 1;
} }
void AADepleter::toCastCard(MTGCardInstance * thisCard) void AACascade::toCastCard(MTGCardInstance * thisCard)
{ {
MTGAbility *ac = NEW AACastCard(game, game->mLayers->actionLayer()->getMaxId(), thisCard, thisCard,false,false,true,"","",false,false); MTGAbility *ac = NEW AACastCard(game, game->mLayers->actionLayer()->getMaxId(), thisCard, thisCard,false,false,true,"","",false,false);
//ac->oneShot=true; MayAbility *ma1 = NEW MayAbility(game, game->mLayers->actionLayer()->getMaxId(), ac, thisCard->clone(),true);
//ac->addToGame();
MayAbility *ma1 = NEW MayAbility(game, game->mLayers->actionLayer()->getMaxId(), ac, thisCard,true);
MTGAbility *ga1 = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), thisCard,NULL,ma1); MTGAbility *ga1 = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), thisCard,NULL,ma1);
ga1->resolve(); ga1->resolve();
return; return;
} }
const string AADepleter::getMenuText() const string AACascade::getMenuText()
{ {
if(cascade) return "Cascade";
return Cascade;
else if(toexile)
return "Ingest";
return "Deplete";
} }
AADepleter * AADepleter::clone() const AACascade * AACascade::clone() const
{ {
return NEW AADepleter(*this); return NEW AACascade(*this);
} }
//take extra turns or skip turns, values in the negitive will make you skip. //take extra turns or skip turns, values in the negitive will make you skip.

View File

@@ -229,8 +229,8 @@ int Damage::resolve()
{ {
// "Normal" case, // "Normal" case,
//return the left over amount after effects have been applied to them. //return the left over amount after effects have been applied to them.
if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER && !((Player *)target)->inPlay()->hasAbility(Constants::CANTCHANGELIFE)) if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER && ((Player *)target)->inPlay()->hasAbility(Constants::CANTCHANGELIFE))
a = target->dealDamage(damage); ;//do nothing
else else
a = target->dealDamage(damage); a = target->dealDamage(damage);
target->damageCount += damage;//the amount must be the actual damage so i changed this from 1 to damage, this fixes pdcount and odcount target->damageCount += damage;//the amount must be the actual damage so i changed this from 1 to damage, this fixes pdcount and odcount

View File

@@ -1666,7 +1666,7 @@ ostream& operator<<(ostream& out, const GameObserver& g)
out << g.mSeed; out << g.mSeed;
out << endl; out << endl;
out << "rvalues:"; out << "rvalues:";
g.randomGenerator.saveUsedRandValues(out); out << g.randomGenerator.saveUsedRandValues(out);
out << endl; out << endl;
out << g.startupGameSerialized; out << g.startupGameSerialized;
} }

View File

@@ -2689,7 +2689,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
if (splitCascade.size()) if (splitCascade.size())
{ {
Targetable * t = spell ? spell->getNextTarget() : NULL; Targetable * t = spell ? spell->getNextTarget() : NULL;
MTGAbility * a = NEW AADepleter(observer, id, card, t , splitCascade[1], NULL, who, false,true); MTGAbility * a = NEW AACascade(observer, id, card, t , splitCascade[1], NULL, who);
a->oneShot = 1; a->oneShot = 1;
return a; return a;
} }