diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 1f1b519f3..038c16962 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -2068,6 +2068,7 @@ public: assert(value < 2); _target->basicAbilities.set(ability, value > 0); + _target->modifiedbAbi += 1; return InstantAbility::addToGame(); } @@ -2080,7 +2081,10 @@ public: { MTGCardInstance * _target = (MTGCardInstance *) target; if (_target) + { _target->basicAbilities.set(ability, stateBeforeActivation); + _target->modifiedbAbi -= 1; + } return 1; } diff --git a/projects/mtg/include/CardPrimitive.h b/projects/mtg/include/CardPrimitive.h index f02cd7d16..057698922 100644 --- a/projects/mtg/include/CardPrimitive.h +++ b/projects/mtg/include/CardPrimitive.h @@ -58,6 +58,7 @@ public: uint8_t colors; typedef std::bitset BasicAbilitiesSet; BasicAbilitiesSet basicAbilities; + BasicAbilitiesSet origbasicAbilities; map magicTexts; string magicText; diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 2ba30835d..635eaab23 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -242,6 +242,8 @@ public: bool isACopier; bool bypassTC; bool discarded; + int copiedID; + int modifiedbAbi; void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 6efa07997..4eaff7a7f 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -390,8 +390,20 @@ int AACopier::resolve() MTGCardInstance * _target = (MTGCardInstance *) target; if (_target) { - source->copy(_target); - source->isACopier = true; + if(_target->isACopier) + { + MTGCard* clone = MTGCollection()->getCardById(_target->copiedID); + MTGCardInstance * myClone = NEW MTGCardInstance(clone, source->controller()->game); + source->copy(myClone); + source->isACopier = true; + source->copiedID = _target->copiedID; + } + else + { + source->copy(_target); + source->isACopier = true; + source->copiedID = _target->getId(); + } return 1; } return 0; @@ -2520,6 +2532,10 @@ int AACloner::resolve() // Use id of the card to have the same image as the original MTGCard* clone = (_target->isToken ? _target: MTGCollection()->getCardById(_target->getId())); + // If its a copier then copy what it is + if(_target->isACopier) + clone = _target; + Player * targetPlayer = who == 1 ? source->controller()->opponent() : source->controller(); int tokenize = 1;//tokenizer support for cloning @@ -2575,6 +2591,8 @@ int AACloner::resolve() { spell->source->addType(*it); } + spell->source->modifiedbAbi = _target->modifiedbAbi; + spell->source->origbasicAbilities = _target->origbasicAbilities; delete spell; } return 1; @@ -4157,6 +4175,7 @@ for (it = types.begin(); it != types.end(); it++) for (it = abilities.begin(); it != abilities.end(); it++) { _target->basicAbilities.set(*it); + _target->modifiedbAbi += 1; } if(newAbilityFound) @@ -4305,6 +4324,7 @@ int ATransformer::destroy() for (it = abilities.begin(); it != abilities.end(); it++) { _target->basicAbilities.reset(*it); + _target->modifiedbAbi -= 1; } for (it = oldcolors.begin(); it != oldcolors.end(); it++) diff --git a/projects/mtg/src/CardPrimitive.cpp b/projects/mtg/src/CardPrimitive.cpp index 462457492..566b1c03e 100644 --- a/projects/mtg/src/CardPrimitive.cpp +++ b/projects/mtg/src/CardPrimitive.cpp @@ -41,6 +41,7 @@ CardPrimitive::CardPrimitive(CardPrimitive * source) if(!source) return; basicAbilities = source->basicAbilities; + origbasicAbilities = source->basicAbilities; for (size_t i = 0; i < source->types.size(); ++i) types.push_back(source->types[i]); @@ -76,6 +77,7 @@ CardPrimitive::~CardPrimitive() int CardPrimitive::init() { basicAbilities.reset(); + origbasicAbilities.reset(); types.clear(); diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 95d0311fe..640bbc2c0 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -804,6 +804,11 @@ void GameObserver::gameStateBasedEffects() c->damageToOpponent = false; c->damageToCreature = false; c->isAttacking = NULL; + if(c->modifiedbAbi > 0) + { + c->modifiedbAbi = 0; + c->basicAbilities = c->origbasicAbilities; + } } for (int t = 0; t < nbcards; t++) { diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index a1851ba9c..abe1ea1be 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -59,6 +59,8 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to isACopier = false; bypassTC = false; discarded = false; + copiedID = getId(); + modifiedbAbi = 0; } MTGCardInstance * MTGCardInstance::createSnapShot() @@ -76,6 +78,8 @@ void MTGCardInstance::copy(MTGCardInstance * card) CardPrimitive * data = source->data; basicAbilities = card->basicAbilities; + origbasicAbilities = card->origbasicAbilities; + modifiedbAbi = card->modifiedbAbi; for (size_t i = 0; i < data->types.size(); i++) { types.push_back(data->types[i]);