Files
wagic/projects/mtg/src/CardDescriptor.cpp
T
wagic.the.homebrew@gmail.com ab445c9758 Erwan
- Added a few cards
- Creature attacks, blocks, is re-ordered in blocking list events
2009-07-12 12:27:55 +00:00

157 lines
3.5 KiB
C++

#include "../include/config.h"
#include "../include/CardDescriptor.h"
#include "../include/Subtypes.h"
CardDescriptor::CardDescriptor(): MTGCardInstance(){
init();
mode = CD_AND;
}
int CardDescriptor::init(){
int result = MTGCardInstance::init();
attacker = 0;
defenser = NULL;
banding = NULL;
return result;
}
void CardDescriptor::unsecureSetTapped(int i){
tapped = i;
}
void CardDescriptor::setNegativeSubtype( string value){
int id = Subtypes::subtypesList->Add(value);
addType(-id);
}
MTGCardInstance * CardDescriptor::match_or(MTGCardInstance * card){
int found = 1;
for (int i = 0; i< nb_types; i++){
found = 0;
if (types[i] >= 0){
if (card->hasSubtype(types[i]) || (Subtypes::subtypesList->find(card->name) == types[i])){
found = 1;
break;
}
}else{
if (!card->hasSubtype(-types[i]) && (Subtypes::subtypesList->find(card->name) != -types[i])){
found = 1;
break;
}
}
}
if (!found) return NULL;
for (int i = 0; i< Constants::MTG_NB_COLORS; i++){
if (colors[i] == 1){
found = 0;
if(card->hasColor(i)){
found = 1;
break;
}
}
else if (colors[i] == -1){
found = 0;
if(!card->hasColor(i)){
found = 1;
break;
}
}
}
if (!found) return NULL;
return card;
}
MTGCardInstance * CardDescriptor::match_and(MTGCardInstance * card){
MTGCardInstance * match = card;
for (int i = 0; i< nb_types; i++){
if (types[i] >= 0){
if (!card->hasSubtype(types[i]) && !(Subtypes::subtypesList->find(card->name) == types[i])){
match = NULL;
}
}else{
if(card->hasSubtype(-types[i]) || (Subtypes::subtypesList->find(card->name) == -types[i])){
match = NULL;
}
}
}
for (int i = 0; i< Constants::MTG_NB_COLORS; i++){
if ((colors[i] == 1 && !card->hasColor(i))||(colors[i] == -1 && card->hasColor(i))){
match = NULL;
}
}
return match;
}
MTGCardInstance * CardDescriptor::match(MTGCardInstance * card){
MTGCardInstance * match = card;
if (mode == CD_AND){
match = match_and(card);
}else{
match=match_or(card);
}
//Abilities
for(map<int,int>::const_iterator it = basicAbilities.begin(); it != basicAbilities.end(); ++it){
int j = it->first;
if ((basicAbilities[j] == 1 && !card->basicAbilities[j]) || (basicAbilities[j] == -1 && card->basicAbilities[j])){
match = NULL;
}
}
if ((tapped == -1 && card->isTapped()) || (tapped == 1 && !card->isTapped())){
match = NULL;
}
if (attacker == 1){
if ((int)defenser == 1){
if (!card->attacker && !card->defenser) match = NULL;
}else{
if (!card->attacker) match = NULL;
}
}else if (attacker == -1){
if ((int)defenser == -1){
if (card->attacker || card->defenser) match = NULL;
}else{
if (card->attacker) match = NULL;
}
}else{
if ((int)defenser == -1){
if (card->defenser) match = NULL;
}else if ((int)defenser == 1){
if (!card->defenser) match = NULL;
}else{
// we don't care about the attack/blocker state
}
}
return match;
}
MTGCardInstance * CardDescriptor::match(MTGGameZone * zone){
return (nextmatch(zone, NULL));
}
MTGCardInstance * CardDescriptor::nextmatch(MTGGameZone * zone, MTGCardInstance * previous){
int found = 0;
if (NULL == previous) found = 1;
for(int i=0; i < zone->nb_cards; i++){
if(found && match(zone->cards[i])){
return zone->cards[i];
}
if (zone->cards[i] == previous){
found = 1;
}
}
return NULL;
}