From 476a74340a05a634a98b468fe5e6089255f987da Mon Sep 17 00:00:00 2001 From: "omegablast2002@yahoo.com" Date: Thu, 31 Mar 2011 16:15:30 +0000 Subject: [PATCH] little bit of hard code clean up, soft coded the following cards and removed thier hard codes Angelic Chorus Lavaborn Muse Pestilence Living Artifact Hypnotic Specter there is test for each of these. btw living artifact hard code was wrong, it was allowing you to remove counters at any phase, the soft code is actually correct. updated living artifact test to the correct version in next rev also fixed a case where "thatmuch" was never set, i now also store the amount on the source of the trigger as well. --- projects/mtg/include/AllAbilities.h | 308 +--------------------------- projects/mtg/src/MTGAbility.cpp | 28 +-- projects/mtg/src/TargetChooser.cpp | 2 +- 3 files changed, 6 insertions(+), 332 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 49a154db5..6bcbca24a 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -139,6 +139,8 @@ public: } if(checkagain > intValue) intValue = checkagain; + if(card && card->thatmuch > intValue) + intValue = card->thatmuch; } else if (s == "oplifelost") { @@ -724,6 +726,7 @@ public: if (type == 2 && e->damage->typeOfDamage == DAMAGE_COMBAT) return 0; e->damage->target->thatmuch = e->damage->damage; e->damage->source->thatmuch = e->damage->damage; + this->source->thatmuch = e->damage->damage; triggeredTurn = g->turn; return 1; } @@ -771,6 +774,7 @@ public: if (type == 1 && (e->amount > 0)) return 0; if (type == 0 && (e->amount < 0)) return 0; e->player->thatmuch = abs(e->amount); + this->source->thatmuch = abs(e->amount); return 1; } @@ -4550,64 +4554,6 @@ public: } }; -//Living Artifact -class ALivingArtifact: public MTGAbility -{ -public: - int usedThisTurn; - int counters; - Damage * latest; - ALivingArtifact(int _id, MTGCardInstance * _source, MTGCardInstance * _target) : - MTGAbility(_id, _source, _target) - { - usedThisTurn = 0; - counters = 0; - latest = NULL; - } - - int receiveEvent(WEvent * event) - { - WEventDamage * e = dynamic_cast (event); - if (!e) return 0; - Player * p = dynamic_cast (e->damage->target); - if (!p) return 0; - if (p != source->controller()) return 0; - counters += e->damage->damage; - return 1; //is this meant to return 0 or 1? - } - - int isReactingtoclick(MTGCardInstance * card, ManaCost * mana = NULL) - { - if (currentPhase == Constants::MTG_PHASE_UPKEEP && card == source && game->currentPlayer == source->controller() - && counters && !usedThisTurn) - { - return 1; - } - return 0; - } - - int reactToClick(MTGCardInstance * card) - { - source->controller()->life += 1; - counters--; - usedThisTurn = 1; - return 1; - } - - virtual ostream& toString(ostream& out) const - { - out << "ALivingArtifact ::: usedThisTurn : " << usedThisTurn << " ; counters : " << counters << " ; latest : " << latest - << " ("; - return MTGAbility::toString(out) << ")"; - } - ALivingArtifact * clone() const - { - ALivingArtifact * a = NEW ALivingArtifact(*this); - a->isClone = 1; - return a; - } -}; - //1143 Animate Dead class AAnimateDead: public MTGAbility { @@ -4770,35 +4716,6 @@ public: } }; -//1165 Hypnotic Specter -class AHypnoticSpecter: public MTGAbility -{ -public: - - AHypnoticSpecter(int _id, MTGCardInstance * _source) : - MTGAbility(_id, _source) - { - } - - int receiveEvent(WEvent * event) - { - WEventDamage * e = dynamic_cast (event); - if (!e) return 0; - if (e->damage->source != source) return 0; - Player * p = dynamic_cast (e->damage->target); - if (!p) return 0; - p->game->discardRandom(p->game->hand, source); - return 1; //is this meant to return 0 or 1? - } - - AHypnoticSpecter * clone() const - { - AHypnoticSpecter * a = NEW AHypnoticSpecter(*this); - a->isClone = 1; - return a; - } -}; - //1117 Jandor's Ring class AJandorsRing: public ActivatedAbility { @@ -4911,54 +4828,6 @@ public: } }; -//1172 Pestilence -class APestilence: public ActivatedAbility -{ -public: - APestilence(int _id, MTGCardInstance * card) : - ActivatedAbility(_id, card, NEW ManaCost(), 0, 0) - { - cost->add(Constants::MTG_COLOR_BLACK, 1); - } - - void Update(float dt) - { - if (newPhase != currentPhase && newPhase == Constants::MTG_PHASE_ENDOFTURN) - { - if (!game->players[0]->game->inPlay->hasType("creature") && !game->players[1]->game->inPlay->hasType("creature")) - { - source->controller()->game->putInGraveyard(source); - } - } - } - - int resolve() - { - for (int i = 0; i < 2; i++) - { - MTGInPlay * inplay = game->players[i]->game->inPlay; - for (int j = inplay->nb_cards - 1; j >= 0; j--) - { - if (inplay->cards[j]->isCreature()) game->mLayers->stackLayer()->addDamage(source, inplay->cards[j], 1); - } - game->mLayers->stackLayer()->addDamage(source, game->players[i], 1); - } - return 1; - } - - virtual ostream& toString(ostream& out) const - { - out << "APestilence ::: ("; - return ActivatedAbility::toString(out) << ")"; - } - APestilence * clone() const - { - APestilence * a = NEW APestilence(*this); - a->isClone = 1; - return a; - } -}; - //Power Leak class APowerLeak: public TriggeredAbility { @@ -5065,52 +4934,6 @@ public: } }; -//1178 Scavenging Ghoul -class AScavengingGhoul: public MTGAbility -{ -public: - int counters; - AScavengingGhoul(int _id, MTGCardInstance * _source, MTGCardInstance * _target) : - MTGAbility(_id, _source, _target) - { - counters = 0; - } - - void Update(float dt) - { - //TODO - } - - int isReactingToClick(MTGCardInstance * _card, ManaCost * mana = NULL) - { - if (counters > 0 && _card == source && game->currentlyActing()->game->inPlay->hasCard(source)) - { - return 1; - } - return 0; - } - - int reactToClick(MTGCardInstance * _card) - { - if (!isReactingToClick(_card)) return 0; - counters--; - source->regenerate(); - return 1; - } - - virtual ostream& toString(ostream& out) const - { - out << "AScavengingGhoul ::: counters : " << counters << " ("; - return MTGAbility::toString(out) << ")"; - } - AScavengingGhoul * clone() const - { - AScavengingGhoul * a = NEW AScavengingGhoul(*this); - a->isClone = 1; - return a; - } -}; - //1235 Aspect of Wolf class AAspectOfWolf: public ListMaintainerAbility { @@ -5448,77 +5271,6 @@ public: } }; -//Lavaborn - quick and very dirty ;) copy of ALifezonelink but without the multiplier. -class ALavaborn: public MTGAbility -{ -public: - int phase; - int condition; - int life; - int controller; - int nbcards; - MTGGameZone * zone; - ALavaborn(int _id, MTGCardInstance * card, int _phase, int _condition, int _life, int _controller = 0, MTGGameZone * _zone = - NULL) : - MTGAbility(_id, card) - { - phase = _phase; - condition = _condition; - controller = _controller; - life = _life; - zone = _zone; - if (zone == NULL) - { - if (controller) - { - zone = game->currentPlayer->game->hand; - } - else - { - zone = game->opponent()->game->hand; - } - } - } - - void Update(float dt) - { - if (newPhase != currentPhase && newPhase == phase) - { - if ((controller && game->currentPlayer == source->controller()) || (!controller && game->currentPlayer - != source->controller())) - { - if ((condition < 0 && zone->nb_cards < -condition) || (condition > 0 && zone->nb_cards > condition)) - { - int diff = zone->nb_cards - condition; - if (condition < 0) diff = -condition - zone->nb_cards; - if (life > 0) - { - game->currentPlayer->life += life; - } - else - { - game->mLayers->stackLayer()->addDamage(source, game->currentPlayer, -life); - } - } - } - } - } - virtual ostream& toString(ostream& out) const - { - out << "ALavaborn ::: phase : " << phase << " ; condition : " << condition << " ; life : " << life << " ; controller : " - << controller << " ; nbcards : " << nbcards << " ("; - return MTGAbility::toString(out) << ")"; - } - - ALavaborn * clone() const - { - ALavaborn * a = NEW ALavaborn(*this); - a->isClone = 1; - return a; - } - -}; - //Generic Millstone class AADepleter: public ActivatedAbilityTP { @@ -5848,58 +5600,6 @@ public: } }; -//Angelic Chorus (10E) -class AAngelicChorus: public ListMaintainerAbility -{ -public: - int init; - AAngelicChorus(int id, MTGCardInstance * _source) : - ListMaintainerAbility(id, _source) - { - init = 0; - } - - void Update(float dt) - { - ListMaintainerAbility::Update(dt); - init = 1; - } - - int canBeInList(MTGCardInstance * card) - { - if (card->hasType(Subtypes::TYPE_CREATURE) && game->isInPlay(card)) return 1; - return 0; - } - - int added(MTGCardInstance * card) - { - if (!init) return 0; - if (source->controller() == game->currentlyActing()) - { - card->controller()->life += card->toughness; - } - return 1; - } - - int removed(MTGCardInstance * card) - { - return 1; - } - - virtual ostream& toString(ostream& out) const - { - out << "AAngelicChorus ::: init : " << init << " ("; - return ListMaintainerAbility::toString(out) << ")"; - } - - AAngelicChorus * clone() const - { - AAngelicChorus * a = NEW AAngelicChorus(*this); - a->isClone = 1; - return a; - } -}; - // utility functions void PopulateColorIndexVector(list& colors, const string& colorsString, char delimiter = ','); diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 28c4a38e3..d6e1fa5aa 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -3451,16 +3451,6 @@ void AbilityFactory::addAbilities(int _id, Spell * spell) } break; } - case 1165: //Hypnotic Specter - { - game->addObserver(NEW AHypnoticSpecter(_id, card)); - break; - } - case 1258: //Living Artifact - { - game->addObserver(NEW ALivingArtifact(_id, card, card->target)); - break; - } case 1209: //Mana Short { Player * player = spell->getNextPlayerTarget(); @@ -3486,12 +3476,6 @@ void AbilityFactory::addAbilities(int _id, Spell * spell) } break; } - case 1172: //Pestilence - { - game->addObserver(NEW APestilence(_id, card)); - break; - } - case 1176: //Sacrifice { ASacrifice * ability = NEW ASacrifice(_id, card, card->target); @@ -3642,22 +3626,12 @@ void AbilityFactory::addAbilities(int _id, Spell * spell) //-- addon 10E--- - case 129710: //Angelic Chorus - { - game->addObserver(NEW AAngelicChorus(_id, card)); - break; - } - case 129767: //Threaten { game->addObserver(NEW AInstantControlSteal(_id, card, card->target)); break; } - case 130373: //Lavaborn Muse - { - game->addObserver(NEW ALavaborn(_id, card, Constants::MTG_PHASE_UPKEEP, -3, -3)); - break; - } + case 129774: // Traumatize { int nbcards; diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index 19f3ee78b..656cca0cf 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -484,7 +484,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta else if (attribute.find("share!") != string::npos) { size_t start = attribute.find("share!"); - size_t end = attribute.find("!"); + size_t end = attribute.rfind("!"); string CDtype = attribute.substr(start + 6,end - start); if(card->isSpell() && card->backupTargets[0]->typeAsTarget() == TARGET_STACKACTION) {