Files
wagic/projects/mtg/src/TargetsList.cpp
T
wagic.the.homebrew@gmail.com c8333e76b1 Erwan
- Updated Parser mechanism. Right now this doesn't change functionalities much, but should be more readable, and make it easier to code some new abilities in the future
- Fixed regenerate, broken with r532
- Death Ward now works
- I think "&&" now works with all abilities, needs to be tested...
2009-07-11 15:59:51 +00:00

130 lines
3.0 KiB
C++

#include "../include/config.h"
#include "../include/TargetsList.h"
#include "../include/Player.h"
#include "../include/MTGCardInstance.h"
#include "../include/Damage.h"
#include "../include/ActionStack.h"
TargetsList::TargetsList(){
cursor = 0;
}
TargetsList::TargetsList(Targetable * _targets[], int nbtargets){
for (int i = 0; i < nbtargets; i++){
targets[i] = _targets[i];
}
cursor = nbtargets;
}
int TargetsList::addTarget(Targetable * target){
if (!alreadyHasTarget(target)){
targets[cursor] = target;
cursor++;
return 1;
}
return 0;
}
int TargetsList::alreadyHasTarget(Targetable * target){
for (int i=0; i<cursor; i++){
if (targets[i] == target) return 1;
}
return 0;
}
int TargetsList::removeTarget(Targetable * target){
for (int i=0; i<cursor; i++){
if (targets[i] == target) {
targets[i] = targets[cursor];
targets[cursor] = NULL;
cursor--;
}
}
return 0;
}
int TargetsList::toggleTarget(Targetable * target){
if (alreadyHasTarget(target)){
return removeTarget(target);
}else{
return addTarget(target);
}
}
Targetable * TargetsList::getNextTarget(Targetable * previous , int type){
int found = 0;
if (!previous) found = 1;
for (int i = 0; i < cursor; i++){
if (found && (type == -1 || targets[i]->typeAsTarget() == type)){
return (targets[i]);
}
if (targets[i] == previous) found = 1;
}
return NULL;
}
MTGCardInstance * TargetsList::getNextCardTarget(MTGCardInstance * previous){
return ((MTGCardInstance *)getNextTarget(previous, TARGET_CARD));
}
Player * TargetsList::getNextPlayerTarget(Player * previous){
return ((Player *)getNextTarget(previous, TARGET_PLAYER));
}
Interruptible * TargetsList::getNextInterruptible(Interruptible * previous, int type){
int found = 0;
if (!previous) found = 1;
for (int i = 0; i < cursor; i++){
if (found && targets[i]->typeAsTarget() == TARGET_STACKACTION){
Interruptible * action = (Interruptible *) targets[i];
if (action->type==type){
return action;
}
}
if (targets[i] == previous) found = 1;
}
return NULL;
}
Spell * TargetsList::getNextSpellTarget(Spell * previous){
Spell * spell = (Spell *) getNextInterruptible(previous, ACTION_SPELL);
return spell;
}
//How about DAMAGESTacks ??
Damage * TargetsList::getNextDamageTarget(Damage * previous){
Damage * damage = (Damage * ) getNextInterruptible(previous, ACTION_DAMAGE);
return damage;
}
Damageable * TargetsList::getNextDamageableTarget(Damageable * previous){
int found = 0;
if (!previous) found = 1;
for (int i = 0; i < cursor; i++){
if (targets[i]->typeAsTarget() == TARGET_PLAYER){
if (found){
return ((Player *) targets[i]);
}else{
if ((Player *)targets[i] == previous) found = 1;
}
}else if(targets[i]->typeAsTarget() == TARGET_CARD){
if (found){
return ((MTGCardInstance *) targets[i]);
}else{
if ((MTGCardInstance *)targets[i] == previous) found = 1;
}
}
}
return NULL;
}