diff --git a/projects/mtg/include/ActionStack.h b/projects/mtg/include/ActionStack.h index 7a3bdde16..0e74224db 100644 --- a/projects/mtg/include/ActionStack.h +++ b/projects/mtg/include/ActionStack.h @@ -77,7 +77,7 @@ public: } virtual const string getDisplayName() const; - void Render(MTGCardInstance * source, JQuad * targetQuad, string alt1, string alt2, string action, bool bigQuad = false); + void Render(MTGCardInstance * source, JQuad * targetQuad, string alt1, string alt2, string action, bool bigQuad = false, int aType = 0); virtual int receiveEvent(WEvent *) { diff --git a/projects/mtg/include/MTGAbility.h b/projects/mtg/include/MTGAbility.h index 59e3ef5b1..55deae9ff 100644 --- a/projects/mtg/include/MTGAbility.h +++ b/projects/mtg/include/MTGAbility.h @@ -220,6 +220,7 @@ public: ATTACK_COST = 36, BLOCK_COST = 37, GRANTEDFLASHBACK_COST = 38, + FORCED_TOKEN_CREATOR, }; }; diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index aa22e9295..ba82ff9f0 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -480,7 +480,8 @@ public: int alreadyplayed; MTGAllCards * collection; - MTGCardInstance * genCreature(int id); + MTGAbility * tokCreate; + MTGCardInstance * genCreature(int id, Player * p); void Update(float dt); void Render(); MTGMomirRule(GameObserver* observer, int _id, MTGAllCards * _collection); diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index 26a8da545..86106aa0c 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -88,7 +88,7 @@ float Interruptible::GetVerticalTextOffset() const } void Interruptible::Render(MTGCardInstance * source, JQuad * targetQuad, string alt1, string alt2, string action, - bool bigQuad) + bool bigQuad, int aType) { WFont * mFont = observer->getResourceManager()->GetWFont(Fonts::MAIN_FONT); mFont->SetColor(ARGB(255,255,255,255)); @@ -132,9 +132,19 @@ void Interruptible::Render(MTGCardInstance * source, JQuad * targetQuad, string { /*Pos pos = Pos(CardGui::BigWidth / 2, CardGui::BigHeight / 2 - 10, 1.0, 0.0, 220); CardGui::DrawCard(source, pos, observer->getCardSelector()->GetDrawMode());*/ - Pos pos = Pos(CardGui::BigWidth / 2, CardGui::BigHeight / 2 - 10, 0.80f, 0.0, 220); - pos.actY = 142;//adjust y a little bit - CardGui::DrawCard(source, pos, observer->getCardSelector()->GetDrawMode()); + if(observer->gameType() == GAME_TYPE_MOMIR && aType == MTGAbility::FORCED_TOKEN_CREATOR) + { + Pos pos = Pos(CardGui::BigWidth / 2, CardGui::BigHeight / 2 - 10, 0.80f, 0.0, 220); + pos.actY = 142;//adjust y a little bit + CardGui::DrawCard(source, pos, observer->getCardSelector()->GetDrawMode()); + } + else if (observer->gameType() != GAME_TYPE_MOMIR) + { + Pos pos = Pos(CardGui::BigWidth / 2, CardGui::BigHeight / 2 - 10, 0.80f, 0.0, 220); + pos.actY = 142;//adjust y a little bit + CardGui::DrawCard(source, pos, observer->getCardSelector()->GetDrawMode()); + } + } if (targetQuad) @@ -188,7 +198,10 @@ void StackAbility::Render() } } - Interruptible::Render(source, quad.get(), alt1, alt2, action); + if(observer->gameType() == GAME_TYPE_MOMIR) + Interruptible::Render(source, quad.get(), alt1, alt2, action, true, ability->aType); + else + Interruptible::Render(source, quad.get(), alt1, alt2, action); } StackAbility::StackAbility(GameObserver* observer, int id, MTGAbility * _ability) : Interruptible(observer, id), ability(_ability) diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 7e4b5cb60..758543db9 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -114,7 +114,12 @@ void MTGCardInstance::copy(MTGCardInstance * card) source = card; CardPrimitive * data = source->data; - basicAbilities = data->basicAbilities; + //basicAbilities = data->basicAbilities; + for(unsigned int j = 0; j < data->basicAbilities.size(); j++) + { + if(data->basicAbilities[j]) + basicAbilities[j] = data->basicAbilities[j]; + } types.clear();//reset types.. fix copying man lands... the copier becomes an unanimated land... for (size_t i = 0; i < data->types.size(); i++) { diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 45e005961..a0cebf18f 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -2230,25 +2230,25 @@ int MTGBlockRule::receiveEvent(WEvent *e) //but this action can not be ignored. } } - + } + if (dynamic_cast(e)) + { //if a card with menace is not blocked by 2 or more, remove any known blockers and attacking as normal. MTGGameZone * z = p->game->inPlay; for (int i = 0; i < z->nb_cards; i++) { MTGCardInstance * card = z->cards[i]; - if (card->has(Constants::MENACE) && card->blockers.size() < 2) + if (card->isAttacker() && card->has(Constants::MENACE) && card->blockers.size() < 2) { while (card->blockers.size()) { MTGCardInstance * blockingCard = card->blockers.front(); - blockingCard->toggleDefenser(NULL); - + if(blockingCard->getNextOpponent() == card) + blockingCard->toggleDefenser(NULL); } } } - } - return 1; } @@ -2381,13 +2381,14 @@ MTGMomirRule::MTGMomirRule(GameObserver* observer, int _id, MTGAllCards * _colle alreadyplayed = 0; aType = MTGAbility::MOMIR; textAlpha = 0; + tokCreate = NULL; } int MTGMomirRule::isReactingToClick(MTGCardInstance * card, ManaCost *) { if (alreadyplayed) return 0; - Player * player = game->currentlyActing(); + Player * player = card->controller(); Player * currentPlayer = game->currentPlayer; if (!player->game->hand->hasCard(card)) return 0; @@ -2403,7 +2404,7 @@ int MTGMomirRule::isReactingToClick(MTGCardInstance * card, ManaCost *) int MTGMomirRule::reactToClick(MTGCardInstance * card_to_discard) { - Player * player = game->currentlyActing(); + Player * player = card_to_discard->controller(); ManaCost * cost = player->getManaPool(); int converted = cost->getConvertedCost(); int id = genRandomCreatureId(converted); @@ -2414,29 +2415,53 @@ int MTGMomirRule::reactToClick(MTGCardInstance * card_to_discard, int cardId) { if (!isReactingToClick(card_to_discard)) return 0; - Player * player = game->currentlyActing(); + Player * player = card_to_discard->controller(); ManaCost * cost = player->getManaPool(); player->getManaPool()->pay(cost); - MTGCardInstance * card = genCreature(cardId); + MTGCardInstance * card = genCreature(cardId, player); + card->owner = player; player->game->putInZone(card_to_discard, card_to_discard->currentZone, player->game->graveyard); - player->game->stack->addCard(card); + /*player->game->stack->addCard(card); Spell * spell = NEW Spell(game, card); spell->resolve(); spell->source->isToken = 1; - delete spell; + delete spell;*/ + + string abi = "token("; + ostringstream tokID; + tokID << abs(cardId); + abi.append(tokID.str()); + abi.append(") controller"); + + AbilityFactory af(game); + tokCreate = af.parseMagicLine(abi,game->mLayers->actionLayer()->getMaxId(),NULL, card->clone()); + tokCreate->aType = MTGAbility::FORCED_TOKEN_CREATOR; + if(tokCreate) + tokCreate->fireAbility(); + alreadyplayed = 1; textAlpha = 255; text = card->name; + + SAFE_DELETE(card); return 1; } -MTGCardInstance * MTGMomirRule::genCreature(int id) +MTGCardInstance * MTGMomirRule::genCreature(int id, Player * p) { if (!id) return NULL; - Player * p = game->currentlyActing(); + //Player * p = game->currentlyActing(); MTGCard * card = collection->getCardById(id); + int myCC = card->data->getManaCost()->getConvertedCost(); + int myId = 0; + while(card->getRarity() == Constants::RARITY_T) + { + myId = genRandomCreatureId(myCC); + card = collection->getCardById(myId); + } + return NEW MTGCardInstance(card, p->game); }