- some dangerous casts Player/MTGCardInstance fixed

- removed typeAsTarget function and replaced with dynamic casting
- The test suite passes, but it is possible that I busted some of AI's features :(
This commit is contained in:
wagic.the.homebrew
2011-11-19 14:07:57 +00:00
parent e9139bedab
commit 851e1f20f1
16 changed files with 237 additions and 317 deletions
+22 -63
View File
@@ -1043,7 +1043,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
if (amp)
{
amp->setCost(cost);
if (cost && card->typeAsTarget() == TARGET_CARD)
if (cost)
cost->setExtraCostsAction(a, card);
amp->oneShot = 0;
amp->tap = doTap;
@@ -3620,10 +3620,13 @@ Player * MTGAbility::getPlayerFromTarget(Targetable * target)
if (!target)
return NULL;
if (target->typeAsTarget() == TARGET_CARD)
return ((MTGCardInstance *) target)->controller();
if (MTGCardInstance * cTarget = dynamic_cast<MTGCardInstance *>(target))
return cTarget->controller();
return (Player *) target;
if (Player * cPlayer = dynamic_cast<Player *>(target))
return cPlayer;
return ((Interruptible *) target)->source->controller();
}
Player * MTGAbility::getPlayerFromDamageable(Damageable * target)
@@ -3770,8 +3773,8 @@ int ActivatedAbility::reactToTargetClick(Targetable * object)
ManaCost * cost = getCost();
if (cost)
{
if (object->typeAsTarget() == TARGET_CARD)
cost->setExtraCostsAction(this, (MTGCardInstance *) object);
if (MTGCardInstance * cObject = dynamic_cast<MTGCardInstance *>(object))
cost->setExtraCostsAction(this, cObject);
if (!cost->isExtraPaymentSet())
{
game->mExtraPayment = cost->extraCosts;
@@ -3891,8 +3894,9 @@ TargetAbility::TargetAbility(GameObserver* observer, int id, MTGCardInstance * c
int TargetAbility::reactToTargetClick(Targetable * object)
{
if (object->typeAsTarget() == TARGET_CARD)
return reactToClick((MTGCardInstance *) object);
if (MTGCardInstance * cObject = dynamic_cast<MTGCardInstance *>(object))
return reactToClick(cObject);
if (waitingForAnswer)
{
if (tc->toggleTarget(object) == TARGET_OK_FULL)
@@ -3976,7 +3980,7 @@ int TargetAbility::resolve()
ability->target = t;
//do nothing if the target controller responded by phasing out the target.
if (t->typeAsTarget() == TARGET_CARD && ((MTGCardInstance*)t)->isPhased)
if (dynamic_cast<MTGCardInstance *>(t) && ((MTGCardInstance*)t)->isPhased)
return 0;
if (ability->oneShot)
{
@@ -4575,21 +4579,12 @@ int AManaProducer::isReactingToClick(MTGCardInstance * _card, ManaCost * mana)
int AManaProducer::resolve()
{
Targetable * _target = getTarget();
Player * player;
if (_target)
{
if (_target->typeAsTarget() == TARGET_CARD)
{
player = ((MTGCardInstance *) _target)->controller();
}
else
{
player = (Player *) _target;
}
player->getManaPool()->add(output, source);
return 1;
}
return 0;
Player * player = getPlayerFromTarget(_target);
if (!player)
return 0;
player->getManaPool()->add(output, source);
return 1;
}
int AManaProducer::reactToClick(MTGCardInstance * _card)
@@ -4672,19 +4667,7 @@ Targetable * AbilityTP::getTarget()
switch (who)
{
case TargetChooser::TARGET_CONTROLLER:
if (target)
{
switch (target->typeAsTarget())
{
case TARGET_CARD:
return ((MTGCardInstance *) target)->controller();
case TARGET_STACKACTION:
return ((Interruptible *) target)->source->controller();
default:
return (Player *) target;
}
}
return NULL;
return getPlayerFromTarget(target);
case TargetChooser::CONTROLLER:
return source->controller();
case TargetChooser::OPPONENT:
@@ -4709,19 +4692,7 @@ Targetable * ActivatedAbilityTP::getTarget()
switch (who)
{
case TargetChooser::TARGET_CONTROLLER:
if (target)
{
switch (target->typeAsTarget())
{
case TARGET_CARD:
return ((MTGCardInstance *) target)->controller();
case TARGET_STACKACTION:
return ((Interruptible *) target)->source->controller();
default:
return (Player *) target;
}
}
return NULL;
return getPlayerFromTarget(target);
case TargetChooser::CONTROLLER:
return source->controller();
case TargetChooser::OPPONENT:
@@ -4747,19 +4718,7 @@ Targetable * InstantAbilityTP::getTarget()
switch (who)
{
case TargetChooser::TARGET_CONTROLLER:
if (target)
{
switch (target->typeAsTarget())
{
case TARGET_CARD:
return ((MTGCardInstance *) target)->controller();
case TARGET_STACKACTION:
return ((Interruptible *) target)->source->controller();
default:
return (Player *) target;
}
}
return NULL;
return getPlayerFromTarget(target);
case TargetChooser::CONTROLLER:
return source->controller();
case TargetChooser::OPPONENT: