- 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
+46 -41
View File
@@ -24,7 +24,7 @@ int TargetsList::addTarget(Targetable * target)
if(!tc || (tc && tc->maxtargets == 1))
{
//because this was originally coded with targets as an array
//we have to add this condiational to insure that cards with single target effects
//we have to add this conditional to insure that cards with single target effects
//and abilities that seek the nextcardtarget still work correctly.
targets.clear();
targets.push_back(target);
@@ -76,46 +76,66 @@ int TargetsList::toggleTarget(Targetable * target)
}
}
Targetable * TargetsList::getNextTarget(Targetable * previous, int type)
{
int found = 0;
if (!previous) found = 1;
for (size_t i = 0; i < targets.size(); i++)
{
if (found && (type == -1 || targets[i]->typeAsTarget() == type))
{
return targets[i];
}
if (targets[i] == previous) found = 1;
size_t TargetsList::iterateTarget(Targetable * previous){
if (!previous)
return 0;
for (size_t i = 0; i < targets.size(); i++) {
if (targets[i] == previous)
return i + 1;
}
return targets.size() + 1;
}
Targetable * TargetsList::getNextTarget(Targetable * previous)
{
size_t nextIndex = iterateTarget(previous);
if (nextIndex < targets.size())
return targets[nextIndex];
return NULL;
}
MTGCardInstance * TargetsList::getNextCardTarget(MTGCardInstance * previous)
{
return ((MTGCardInstance *) getNextTarget(previous, TARGET_CARD));
size_t nextIndex = iterateTarget(previous);
for (size_t i = nextIndex; i < targets.size(); ++i)
{
if (MTGCardInstance * c = dynamic_cast<MTGCardInstance *>(targets[i]))
return c;
}
return NULL;
}
Player * TargetsList::getNextPlayerTarget(Player * previous)
{
return ((Player *) getNextTarget(previous, TARGET_PLAYER));
size_t nextIndex = iterateTarget(previous);
for (size_t i = nextIndex; i < targets.size(); ++i)
{
if (Player * p = dynamic_cast<Player *>(targets[i]))
return p;
}
return NULL;
}
Interruptible * TargetsList::getNextInterruptible(Interruptible * previous, int type)
{
int found = 0;
if (!previous) found = 1;
for (size_t i = 0; i < targets.size(); i++)
size_t nextIndex = iterateTarget(previous);
for (size_t i = nextIndex; i < targets.size(); i++)
{
if (found && targets[i]->typeAsTarget() == TARGET_STACKACTION)
if (Interruptible * action = dynamic_cast<Interruptible *>(targets[i]))
{
Interruptible * action = (Interruptible *) targets[i];
if (action->type == type)
{
return action;
}
}
if (targets[i] == previous) found = 1;
}
return NULL;
}
@@ -135,32 +155,17 @@ Damage * TargetsList::getNextDamageTarget(Damage * previous)
Damageable * TargetsList::getNextDamageableTarget(Damageable * previous)
{
int found = 0;
if (!previous) found = 1;
for (size_t i = 0; i < targets.size(); i++)
size_t nextIndex = iterateTarget(previous);
for (size_t i = nextIndex; i < targets.size(); i++)
{
if (targets[i]->typeAsTarget() == TARGET_PLAYER)
if (Player * pTarget = dynamic_cast<Player *>(targets[i]))
{
if (found)
{
return ((Player *) targets[i]);
}
else
{
if ((Player *) targets[i] == previous) found = 1;
}
return pTarget;
}
else if (targets[i]->typeAsTarget() == TARGET_CARD)
else if (MTGCardInstance * cTarget = dynamic_cast<MTGCardInstance *>(targets[i]))
{
if (found)
{
return ((MTGCardInstance *) targets[i]);
}
else
{
if ((MTGCardInstance *) targets[i] == previous) found = 1;
}
return cTarget;
}
}
return NULL;