From bf8d4fd82728f420559ecd90392954373f62c126 Mon Sep 17 00:00:00 2001 From: "wagic.the.homebrew@gmail.com" Date: Sun, 26 Jul 2009 03:15:52 +0000 Subject: [PATCH] Erwan - bug fixes (civic wayfinder, fault line) - target's quad is displayed for generictargetabilities - added menutext for powertoughnessmodifier --- projects/mtg/bin/Res/sets/ONS/_cards.dat | 2 +- projects/mtg/bin/Res/test/_tests.txt | 2 + projects/mtg/bin/Res/test/civic_wayfinder.txt | 21 +++++++++ projects/mtg/bin/Res/test/fault_line.txt | 20 +++++++++ projects/mtg/include/AllAbilities.h | 10 +++++ projects/mtg/include/MTGAbility.h | 1 + projects/mtg/src/ActionStack.cpp | 21 +++++++++ projects/mtg/src/MTGAbility.cpp | 45 +++++++++++-------- projects/mtg/src/TargetChooser.cpp | 3 +- 9 files changed, 105 insertions(+), 20 deletions(-) create mode 100644 projects/mtg/bin/Res/test/civic_wayfinder.txt create mode 100644 projects/mtg/bin/Res/test/fault_line.txt diff --git a/projects/mtg/bin/Res/sets/ONS/_cards.dat b/projects/mtg/bin/Res/sets/ONS/_cards.dat index 660e8575f..6a6013279 100644 --- a/projects/mtg/bin/Res/sets/ONS/_cards.dat +++ b/projects/mtg/bin/Res/sets/ONS/_cards.dat @@ -427,7 +427,7 @@ rarity=R text={T}: Target Elf or Soldier gets +2/+2 until end of turn. id=39715 name=Grassland Crusader -auto={T}:2/2 target(creature[Elf;Soldier]) +auto={T}:2/2 target(elf,soldier) mana={5}{W} type=Creature subtype=Cleric Soldier diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 58aaf49b8..2eba434e8 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -52,6 +52,7 @@ castle.txt cathodion.txt celestial_purge.txt circle_of_protection.txt +civic_wayfinder.txt clone.txt clone2.txt composite_golem.txt @@ -76,6 +77,7 @@ dross_harvester.txt elvish_piper.txt elvish_promenade.txt fastbond.txt +fault_line.txt flare.txt fledgling_imp.txt fledgling_imp2.txt diff --git a/projects/mtg/bin/Res/test/civic_wayfinder.txt b/projects/mtg/bin/Res/test/civic_wayfinder.txt new file mode 100644 index 000000000..5b8ce7a49 --- /dev/null +++ b/projects/mtg/bin/Res/test/civic_wayfinder.txt @@ -0,0 +1,21 @@ +#Bug: Civic wayfinder finds more than basic lands +[INIT] +FIRSTMAIN +[PLAYER1] +hand:civic wayfinder +manapool:{2}{G} +library:forest,adarkar wastes +[PLAYER2] +[DO] +civic wayfinder +choice 0 +adarkar wastes +forest +[ASSERT] +FIRSTMAIN +[PLAYER1] +inplay:civic wayfinder +hand:forest +library:adarkar wastes +[PLAYER2] +[END] \ No newline at end of file diff --git a/projects/mtg/bin/Res/test/fault_line.txt b/projects/mtg/bin/Res/test/fault_line.txt new file mode 100644 index 000000000..360ff761a --- /dev/null +++ b/projects/mtg/bin/Res/test/fault_line.txt @@ -0,0 +1,20 @@ +#Bug: fault line has the same effect as earthquale (error in X cost) +[INIT] +FIRSTMAIN +[PLAYER1] +hand:fault line +manapool:{1}{R}{R} +[PLAYER2] +inplay:grizzly bears +[DO] +fault line +[ASSERT] +FIRSTMAIN +[PLAYER1] +graveyard:fault line +manapool:{0} +life:19 +[PLAYER2] +inplay:grizzly bears +life:19 +[END] \ No newline at end of file diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index d3fc40ddd..2174ec5a3 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -1062,6 +1062,12 @@ class AInstantPowerToughnessModifierUntilEOT: public InstantAbility{ return 1; } + const char * getMenuText(){ + char buffer[4096]; + sprintf(buffer, "%i/%i",power,toughness); + return buffer; + } + virtual ostream& toString(ostream& out) const { out << "APowerToughnessModifierUntilEndOfTurn ::: power : " << power @@ -1101,6 +1107,10 @@ class APowerToughnessModifierUntilEndOfTurn: public ActivatedAbility{ return resolve(); } + const char * getMenuText(){ + return ability->getMenuText(); + } + int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL){ if (!ActivatedAbility::isReactingToClick(card,mana)) return 0; return (!maxcounters || (counters < maxcounters)); diff --git a/projects/mtg/include/MTGAbility.h b/projects/mtg/include/MTGAbility.h index 53a7c0545..ed5a569c9 100644 --- a/projects/mtg/include/MTGAbility.h +++ b/projects/mtg/include/MTGAbility.h @@ -205,6 +205,7 @@ class AbilityFactory{ int abilityEfficiency(MTGAbility * a, Player * p, int mode = MODE_ABILITY); public: int magicText(int id, Spell * spell, MTGCardInstance * card = NULL); + static int computeX(Spell * spell, MTGCardInstance * card); int destroyAllInPlay(TargetChooser * tc, int bury = 0); int moveAll(TargetChooser * tc, string destinationZone); int damageAll(TargetChooser * tc, int damage); diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index e459cb54e..6cd6a075b 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -64,6 +64,27 @@ void StackAbility::Render(){ }else{ mFont->DrawString(_(ability->source->getName()).c_str(),x,y-15); } + + Targetable * _target = ability->target; + if (ability->tc){ + Targetable * t = ability->tc->getNextTarget(); + if(t) _target = t; + } + Damageable * target = NULL; + if (_target!= ability->source && (_target->typeAsTarget() == TARGET_CARD || _target->typeAsTarget() == TARGET_PLAYER)){ + target = (Damageable *) _target; + } + if (target){ + quad = target->getIcon(); + if (quad){ + quad->SetColor(ARGB(255,255,255,255)); + float scale = 30 / quad->mHeight; + renderer->RenderQuad(quad, x + 150 , y , 0,scale,scale); + }else{ + if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + mFont->DrawString(_(((MTGCardInstance *)target)->name).c_str(),x+120,y); + } + } } StackAbility::StackAbility(int id,MTGAbility * _ability): Interruptible(id),ability(_ability){ type=ACTION_ABILITY; diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 96bd46896..a81896d2a 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -757,6 +757,14 @@ int AbilityFactory::abilityEfficiency(MTGAbility * a, Player * p, int mode){ return BAKA_EFFECT_DONTKNOW; } +//Returns the "X" cost that was paid for a spell +int AbilityFactory::computeX(Spell * spell, MTGCardInstance * card){ + ManaCost * c = spell->cost->Diff(card->getManaCost()); + int x = c->getCost(Constants::MTG_NB_COLORS); + delete c; + return x; +} + //Some basic functionalities that can be added automatically in the text file /* * Several objects are computed from the text string, and have a direct influence on what action we should take @@ -981,7 +989,7 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){ } case 1291: //Fireball { - int x = spell->cost->getConvertedCost() - 1; //TODO BETTER + int x = computeX(spell,card); game->addObserver(NEW AFireball(_id, card,spell, x)); break; } @@ -1153,7 +1161,7 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){ } case 1164: //Howl from beyond { - int x = spell->cost->getConvertedCost() - 1; //TODO, this is not enough, Spells shouls have a function like "xCost" because the spell might cost more than expected to launch + int x = computeX(spell,card); AInstantPowerToughnessModifierUntilEOT * ability = NEW AInstantPowerToughnessModifierUntilEOT( _id, card, card->target, x, 0); game->addObserver(ability); break; @@ -1204,7 +1212,7 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){ } case 1167: //Mind Twist { - int xCost = spell->cost->getConvertedCost() - 1; + int xCost = computeX(spell,card); for (int i = 0; i < xCost; i++){ game->opponent()->game->discardRandom(game->opponent()->game->hand); } @@ -1231,7 +1239,7 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){ } case 1224: //Spell Blast { - int x = spell->cost->getConvertedCost() - 1; + int x = computeX(spell,card); Spell * starget = spell->getNextSpellTarget(); if (starget){ if (starget->cost->getConvertedCost() <= x) game->mLayers->stackLayer()->Fizzle(starget); @@ -1326,7 +1334,7 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){ case 1266: //stream of life { - int x = spell->cost->getConvertedCost() - 1; //TODO Improve that ! + int x = computeX(spell,card); spell->getNextPlayerTarget()->life += x; break; } @@ -1334,7 +1342,7 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){ case 1231: //Volcanic Eruption { - int x = spell->cost->getConvertedCost() - 3; + int x = computeX(spell,card); int _x = x; MTGCardInstance * target = spell->getNextCardTarget(); while(target && _x){ @@ -1369,15 +1377,15 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){ } case 1289: //earthquake { - int x = spell->cost->getConvertedCost() - 1; + int x = computeX(spell,card); for (int i = 0; i < 2 ; i++){ - game->mLayers->stackLayer()->addDamage(card, game->players[i], x); - for (int j = 0; j < game->players[i]->game->inPlay->nb_cards; j++){ - MTGCardInstance * current = game->players[i]->game->inPlay->cards[j]; - if (!current->basicAbilities[Constants::FLYING] && current->isACreature()){ - game->mLayers->stackLayer()->addDamage(card, current, x); - } - } + game->mLayers->stackLayer()->addDamage(card, game->players[i], x); + for (int j = 0; j < game->players[i]->game->inPlay->nb_cards; j++){ + MTGCardInstance * current = game->players[i]->game->inPlay->cards[j]; + if (!current->basicAbilities[Constants::FLYING] && current->isACreature()){ + game->mLayers->stackLayer()->addDamage(card, current, x); + } + } } break; } @@ -1613,7 +1621,7 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){ //-- addon Urza Saga--- case 8818: //Goblin Offensive { - int x = spell->cost->getConvertedCost() - 3; + int x = computeX(spell,card); ATokenCreator * tok = NEW ATokenCreator(id,card,NEW ManaCost(),"Goblin","creature Goblin",1,1,"Red",0); for (int i=0; i < x; i++){ tok->resolve(); @@ -1646,7 +1654,7 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){ case 130542: //Flowstone Slide { TargetChooser * lordTargets = NULL; - int x = spell->cost->getConvertedCost() - 4; + int x = computeX(spell,card); TargetChooserFactory tcf; lordTargets = tcf.createTargetChooser("creature", card); break; @@ -1803,7 +1811,7 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){ case 151114: //Rise of the Hobgoblins { - int x = spell->cost->getConvertedCost() - 2; + int x = computeX(spell,card); ATokenCreator * tok = NEW ATokenCreator(id,card,NEW ManaCost(),"Goblin Soldier","creature Goblin Soldier",1,1,"red white",0); for (int i=0; i < x; i++){ tok->resolve(); @@ -1817,7 +1825,7 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){ { Player * player = spell->getNextPlayerTarget(); MTGLibrary * library = player->game->library; - int x = spell->cost->getConvertedCost() - 2; + int x = computeX(spell,card); for (int i = 0; i < x; i++){ if (library->nb_cards) player->game->putInZone(library->cards[library->nb_cards-1],library, player->game->graveyard); @@ -2108,6 +2116,7 @@ void TargetAbility::Render(){ //TODO ? } + int TargetAbility::resolve(){ Targetable * t = tc->getNextTarget(); if (t && ability){ diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index efaeaee80..748136f67 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -102,6 +102,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta unsigned int found2 = attributes.find(";"); string attribute; if (found2 != string::npos){ + cd->mode = CD_OR; attribute = attributes.substr(0,found2); attributes = attributes.substr(found2+1); }else{ @@ -179,7 +180,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta } } } - if (nbminuses == 0) cd->mode = CD_OR; + if (nbminuses) cd->mode = CD_AND; typeName = typeName.substr(0,found); } //X targets allowed ?