fixed a couple memleaks, also added human player targeting for blocking.

This commit is contained in:
omegablast2002@yahoo.com
2012-04-02 16:48:33 +00:00
parent b705158e13
commit 0b1327bf01
5 changed files with 81 additions and 32 deletions
+1
View File
@@ -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);
+6 -4
View File
@@ -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 */
+21 -18
View File
@@ -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;
} }
+2 -2
View File
@@ -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(
+43
View File
@@ -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,8 +1506,14 @@ 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,6 +1524,29 @@ 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;
if(card->controller()->isHuman())
{
if(!currentOpponent)
{
SAFE_DELETE(blockAbility);
TargetChooserFactory tf(card->getObserver());
tcb = tf.createTargetChooser("blockable",card);
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);
}
else
while (!result) while (!result)
{ {
currentOpponent = game->currentPlayer->game->inPlay->getNextAttacker(currentOpponent); currentOpponent = game->currentPlayer->game->inPlay->getNextAttacker(currentOpponent);
@@ -1528,6 +1560,11 @@ int MTGBlockRule::reactToClick(MTGCardInstance * card)
return 1; return 1;
} }
const char * MTGBlockRule::getMenuText()
{
return blockmenu.c_str();
}
ostream& MTGBlockRule::toString(ostream& out) const ostream& MTGBlockRule::toString(ostream& out) const
{ {
out << "MTGBlockRule ::: ("; out << "MTGBlockRule ::: (";
@@ -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
// //