fixed a couple memleaks, also added human player targeting for blocking.
This commit is contained in:
@@ -3483,6 +3483,7 @@ MTGCardInstance * OriginalSrc;
|
|||||||
MTGCardInstance * storedTarget;
|
MTGCardInstance * storedTarget;
|
||||||
MTGAbility * storedAbility;
|
MTGAbility * storedAbility;
|
||||||
MTGAbility * clonedStored;
|
MTGAbility * clonedStored;
|
||||||
|
MTGAbility * mainAbility;
|
||||||
string menu;
|
string menu;
|
||||||
|
|
||||||
AADynamic(GameObserver* observer, int id, MTGCardInstance * card, Damageable * _target,int type = 0,int effect = 0,int who = 0,int amountsource = 1,MTGAbility * storedAbility = NULL, ManaCost * _cost = NULL);
|
AADynamic(GameObserver* observer, int id, MTGCardInstance * card, Damageable * _target,int type = 0,int effect = 0,int who = 0,int amountsource = 1,MTGAbility * storedAbility = NULL, ManaCost * _cost = NULL);
|
||||||
|
|||||||
@@ -243,15 +243,17 @@ public:
|
|||||||
class MTGBlockRule: public PermanentAbility
|
class MTGBlockRule: public PermanentAbility
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
string blockmenu;
|
||||||
|
TargetChooser * tcb;
|
||||||
|
MTGAbility * blocker;
|
||||||
|
MTGAbility * blockAbility;
|
||||||
int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL);
|
int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL);
|
||||||
int reactToClick(MTGCardInstance * card);
|
int reactToClick(MTGCardInstance * card);
|
||||||
virtual ostream& toString(ostream& out) const;
|
virtual ostream& toString(ostream& out) const;
|
||||||
MTGBlockRule(GameObserver* observer, int _id);
|
MTGBlockRule(GameObserver* observer, int _id);
|
||||||
const char * getMenuText()
|
const char * getMenuText();
|
||||||
{
|
|
||||||
return "Blocker";
|
|
||||||
}
|
|
||||||
virtual MTGBlockRule * clone() const;
|
virtual MTGBlockRule * clone() const;
|
||||||
|
~MTGBlockRule();
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Persist Rule */
|
/* Persist Rule */
|
||||||
|
|||||||
@@ -1758,6 +1758,7 @@ ActivatedAbility(observer, id, card, _cost, 0),type(type),effect(effect),who(who
|
|||||||
menu = "";
|
menu = "";
|
||||||
OriginalSrc = source;
|
OriginalSrc = source;
|
||||||
clonedStored = NULL;
|
clonedStored = NULL;
|
||||||
|
mainAbility = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AADynamic::resolve()
|
int AADynamic::resolve()
|
||||||
@@ -1934,58 +1935,58 @@ int AADynamic::resolve()
|
|||||||
{
|
{
|
||||||
case DYNAMIC_ABILITY_EFFECT_STRIKE://deal damage
|
case DYNAMIC_ABILITY_EFFECT_STRIKE://deal damage
|
||||||
{
|
{
|
||||||
AADamager * a = NEW AADamager(game, this->GetId(), source,tosrc == true?(Targetable*)OriginalSrc:(Targetable*)_target,sourceamountstring);
|
mainAbility = NEW AADamager(game, this->GetId(), source,tosrc == true?(Targetable*)OriginalSrc:(Targetable*)_target,sourceamountstring);
|
||||||
activateMainAbility(a,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target);
|
activateMainAbility(mainAbility,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target);
|
||||||
if(eachother)
|
if(eachother)
|
||||||
{
|
{
|
||||||
AADamager * a = NEW AADamager(game, this->GetId(), source,tosrc == true?(Targetable*)OriginalSrc:(Targetable*)_target,targetamountstring);
|
mainAbility = NEW AADamager(game, this->GetId(), source,tosrc == true?(Targetable*)OriginalSrc:(Targetable*)_target,targetamountstring);
|
||||||
activateMainAbility(a,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target);
|
activateMainAbility(mainAbility,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DYNAMIC_ABILITY_EFFECT_DRAW://draw cards
|
case DYNAMIC_ABILITY_EFFECT_DRAW://draw cards
|
||||||
{
|
{
|
||||||
AADrawer * a = NEW AADrawer(game, this->GetId(), source,_target,NULL, sourceamountstring);
|
mainAbility = NEW AADrawer(game, this->GetId(), source,_target,NULL, sourceamountstring);
|
||||||
return activateMainAbility(a,source,_target);
|
return activateMainAbility(mainAbility,source,_target);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DYNAMIC_ABILITY_EFFECT_LIFEGAIN://gain life
|
case DYNAMIC_ABILITY_EFFECT_LIFEGAIN://gain life
|
||||||
{
|
{
|
||||||
AALifer * a = NEW AALifer(game, this->GetId(), source,_target, sourceamountstring);
|
mainAbility = NEW AALifer(game, this->GetId(), source,_target, sourceamountstring);
|
||||||
return activateMainAbility(a,source,_target);
|
return activateMainAbility(mainAbility,source,_target);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DYNAMIC_ABILITY_EFFECT_PUMPPOWER://pump power
|
case DYNAMIC_ABILITY_EFFECT_PUMPPOWER://pump power
|
||||||
{
|
{
|
||||||
PTInstant * a = NEW PTInstant(game, this->GetId(), source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target,NEW WParsedPT(sourceamount,0));
|
mainAbility = NEW PTInstant(game, this->GetId(), source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target,NEW WParsedPT(sourceamount,0));
|
||||||
return activateMainAbility(a,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target);
|
return activateMainAbility(mainAbility,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DYNAMIC_ABILITY_EFFECT_PUMPTOUGHNESS://pump toughness
|
case DYNAMIC_ABILITY_EFFECT_PUMPTOUGHNESS://pump toughness
|
||||||
{
|
{
|
||||||
PTInstant * a = NEW PTInstant(game, this->GetId(), source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target,NEW WParsedPT(0,sourceamount));
|
mainAbility = NEW PTInstant(game, this->GetId(), source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target,NEW WParsedPT(0,sourceamount));
|
||||||
return activateMainAbility(a,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target);
|
return activateMainAbility(mainAbility,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DYNAMIC_ABILITY_EFFECT_PUMPBOTH://pump both
|
case DYNAMIC_ABILITY_EFFECT_PUMPBOTH://pump both
|
||||||
{
|
{
|
||||||
PTInstant * a = NEW PTInstant(game, this->GetId(), source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target,NEW WParsedPT(sourceamount,sourceamount));
|
mainAbility = NEW PTInstant(game, this->GetId(), source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target,NEW WParsedPT(sourceamount,sourceamount));
|
||||||
return activateMainAbility(a,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target);
|
return activateMainAbility(mainAbility,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DYNAMIC_ABILITY_EFFECT_LIFELOSS://lose life
|
case DYNAMIC_ABILITY_EFFECT_LIFELOSS://lose life
|
||||||
{
|
{
|
||||||
string altered = "-";
|
string altered = "-";
|
||||||
altered.append(sourceamountstring);
|
altered.append(sourceamountstring);
|
||||||
AALifer * a = NEW AALifer(game, this->GetId(), source,_target, altered);
|
mainAbility = NEW AALifer(game, this->GetId(), source,_target, altered);
|
||||||
return activateMainAbility(a,source,_target);
|
return activateMainAbility(mainAbility,source,_target);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DYNAMIC_ABILITY_EFFECT_DEPLETE://deplete cards
|
case DYNAMIC_ABILITY_EFFECT_DEPLETE://deplete cards
|
||||||
{
|
{
|
||||||
AADepleter * a = NEW AADepleter(game, this->GetId(), source,_target, sourceamountstring);
|
mainAbility = NEW AADepleter(game, this->GetId(), source,_target, sourceamountstring);
|
||||||
return activateMainAbility(a,source,_target);
|
return activateMainAbility(mainAbility,source,_target);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DYNAMIC_ABILITY_EFFECT_COUNTERSONEONE:
|
case DYNAMIC_ABILITY_EFFECT_COUNTERSONEONE:
|
||||||
@@ -2015,7 +2016,9 @@ int AADynamic::activateMainAbility(MTGAbility * toActivate,MTGCardInstance * sou
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
toActivate->oneShot = true;
|
toActivate->oneShot = true;
|
||||||
|
toActivate->forceDestroy = 1;
|
||||||
toActivate->resolve();
|
toActivate->resolve();
|
||||||
|
SAFE_DELETE(toActivate);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -317,7 +317,7 @@ int MillCost::doPay()
|
|||||||
MTGCardInstance * _target = (MTGCardInstance *) target;
|
MTGCardInstance * _target = (MTGCardInstance *) target;
|
||||||
if (target)
|
if (target)
|
||||||
{
|
{
|
||||||
source->storedCard = target;
|
source->storedCard = (MTGCardInstance*)_target->controller()->game->library->cards[_target->controller()->game->library->nb_cards - 1];
|
||||||
_target->controller()->game->putInZone(
|
_target->controller()->game->putInZone(
|
||||||
_target->controller()->game->library->cards[_target->controller()->game->library->nb_cards - 1],
|
_target->controller()->game->library->cards[_target->controller()->game->library->nb_cards - 1],
|
||||||
_target->controller()->game->library, _target->controller()->game->graveyard);
|
_target->controller()->game->library, _target->controller()->game->graveyard);
|
||||||
@@ -339,7 +339,7 @@ MillExileCost::MillExileCost(TargetChooser *_tc)
|
|||||||
int MillExileCost::doPay()
|
int MillExileCost::doPay()
|
||||||
{
|
{
|
||||||
MTGCardInstance * _target = (MTGCardInstance *) target;
|
MTGCardInstance * _target = (MTGCardInstance *) target;
|
||||||
source->storedCard = target;
|
source->storedCard = (MTGCardInstance*)_target->controller()->game->library->cards[_target->controller()->game->library->nb_cards - 1];
|
||||||
if (target)
|
if (target)
|
||||||
{
|
{
|
||||||
_target->controller()->game->putInZone(
|
_target->controller()->game->putInZone(
|
||||||
|
|||||||
@@ -1494,6 +1494,9 @@ MTGBlockRule::MTGBlockRule(GameObserver* observer, int _id) :
|
|||||||
PermanentAbility(observer, _id)
|
PermanentAbility(observer, _id)
|
||||||
{
|
{
|
||||||
aType = MTGAbility::MTG_BLOCK_RULE;
|
aType = MTGAbility::MTG_BLOCK_RULE;
|
||||||
|
tcb = NULL;
|
||||||
|
blocker = NULL;
|
||||||
|
blockAbility = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int MTGBlockRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
int MTGBlockRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
||||||
@@ -1503,7 +1506,13 @@ int MTGBlockRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (card->canBlock() && !card->isPhased)
|
if (card->canBlock() && !card->isPhased)
|
||||||
|
{
|
||||||
|
if(card->isDefenser())
|
||||||
|
blockmenu = "Remove Blocker";
|
||||||
|
else
|
||||||
|
blockmenu = "Assign To Block";
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1515,17 +1524,45 @@ int MTGBlockRule::reactToClick(MTGCardInstance * card)
|
|||||||
MTGCardInstance * currentOpponent = card->isDefenser();
|
MTGCardInstance * currentOpponent = card->isDefenser();
|
||||||
bool result = false;
|
bool result = false;
|
||||||
int canDefend = 0;
|
int canDefend = 0;
|
||||||
while (!result)
|
if(card->controller()->isHuman())
|
||||||
{
|
{
|
||||||
currentOpponent = game->currentPlayer->game->inPlay->getNextAttacker(currentOpponent);
|
if(!currentOpponent)
|
||||||
canDefend = card->toggleDefenser(currentOpponent);
|
{
|
||||||
|
|
||||||
DebugTrace("Defenser Toggle: " << card->getName() << endl
|
SAFE_DELETE(blockAbility);
|
||||||
<< "- canDefend: " << (canDefend == 0) << endl
|
TargetChooserFactory tf(card->getObserver());
|
||||||
<< "- currentOpponent: " << currentOpponent);
|
tcb = tf.createTargetChooser("blockable",card);
|
||||||
result = (canDefend || currentOpponent == NULL);
|
tcb->targetter = NULL;
|
||||||
|
blocker = NEW AABlock(card->getObserver(),-1,card,NULL);
|
||||||
|
blocker->oneShot = true;
|
||||||
|
blocker->forceDestroy = 1;
|
||||||
|
blocker->canBeInterrupted = false;
|
||||||
|
blockAbility = NEW GenericTargetAbility(game, "choose attacker","blockers",-1, card,tcb, blocker);
|
||||||
|
blockAbility->oneShot = true;
|
||||||
|
blockAbility->forceDestroy = 1;
|
||||||
|
blockAbility->canBeInterrupted = false;
|
||||||
|
return blockAbility->reactToTargetClick(card);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
card->toggleDefenser(NULL);
|
||||||
}
|
}
|
||||||
return 1;
|
else
|
||||||
|
while (!result)
|
||||||
|
{
|
||||||
|
currentOpponent = game->currentPlayer->game->inPlay->getNextAttacker(currentOpponent);
|
||||||
|
canDefend = card->toggleDefenser(currentOpponent);
|
||||||
|
|
||||||
|
DebugTrace("Defenser Toggle: " << card->getName() << endl
|
||||||
|
<< "- canDefend: " << (canDefend == 0) << endl
|
||||||
|
<< "- currentOpponent: " << currentOpponent);
|
||||||
|
result = (canDefend || currentOpponent == NULL);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char * MTGBlockRule::getMenuText()
|
||||||
|
{
|
||||||
|
return blockmenu.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
ostream& MTGBlockRule::toString(ostream& out) const
|
ostream& MTGBlockRule::toString(ostream& out) const
|
||||||
@@ -1538,6 +1575,12 @@ MTGBlockRule * MTGBlockRule::clone() const
|
|||||||
{
|
{
|
||||||
return NEW MTGBlockRule(*this);
|
return NEW MTGBlockRule(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MTGBlockRule::~MTGBlockRule()
|
||||||
|
{
|
||||||
|
SAFE_DELETE(blockAbility);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Attacker chooses blockers order
|
// Attacker chooses blockers order
|
||||||
//
|
//
|
||||||
|
|||||||
Reference in New Issue
Block a user