From c6dc51c7d3bf84ca9fe48f0fff5dbba069af610e Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 15:34:23 +0100 Subject: [PATCH 01/21] Simplify Damage::resolve a bit --- projects/mtg/src/Damage.cpp | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index aff70bd6b..d571aed0f 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -59,24 +59,12 @@ int Damage::resolve() //reserved for culmulitive absorb ability coding //prevent next damage----------------------------- - if ((target)->preventable >= 1) - { - int preventing = (target)->preventable; - for (int k = preventing; k > 0; k--) - { - //the following keeps preventable from ADDING toughness/life if damage was less then preventable amount. - for (int i = damage; i >= 1; i--) - { - (target)->preventable -= 1; - damage -= 1; - break;//does the redux of damage 1 time, breaks the loop to deincrement preventing and start the loop over. - } - } - } - - //set prevent next damage back to 0 if it is equal to less then 0 - if ((target)->preventable < 0) + if ((target)->preventable > 0) { + int preventing = MIN(target->preventable, damage); + damage -= preventing; + target->preventable -= preventing; + }else{ (target)->preventable = 0; } From 146872797bf83a118d6f70b02e5f33d1bb946507 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 16:08:29 +0100 Subject: [PATCH 02/21] ActionElement.h: Replace defines, remove superfluous ";" Defines do not follow scope rules, but enums do. Enum classes even utilize strong type checking (but i am not sure about compiler support for c++11 on all target platforms). --- projects/mtg/include/ActionElement.h | 25 +++++++++---------------- projects/mtg/src/ActionElement.cpp | 10 ++-------- projects/mtg/src/MTGGamePhase.cpp | 8 ++++---- 3 files changed, 15 insertions(+), 28 deletions(-) diff --git a/projects/mtg/include/ActionElement.h b/projects/mtg/include/ActionElement.h index 7be2a33b8..bdd7007fe 100644 --- a/projects/mtg/include/ActionElement.h +++ b/projects/mtg/include/ActionElement.h @@ -9,10 +9,6 @@ #include #include "MTGDefinitions.h" -#define INACTIVE 0 -#define ACTION_REQUESTED 1 -#define ACTIVE 2 - class MTGCardInstance; class ManaCost; class Targetable; @@ -22,31 +18,33 @@ class WEvent; class ActionElement: public JGuiObject { protected: - int activeState; + enum Activity{ + Inactive, + ActionRequested, + Active + }; + + Activity activity; TargetChooser * tc; public: GamePhase currentPhase; GamePhase newPhase; int modal; int waitingForAnswer; - int getActivity(); - virtual void Update(float){}; - virtual void Render(){}; + virtual void Update(float){} + virtual void Render(){} virtual int testDestroy() { return 0; } - ; virtual int destroy() { return 0; } - ; virtual bool CheckUserInput(JButton) { return false; } - ; ActionElement(int id); ActionElement(const ActionElement& copyFromMe); TargetChooser * getActionTc(){return tc;} @@ -62,27 +60,22 @@ public: { return 0; } - ; virtual int stillInUse(MTGCardInstance *) { return 0; } - ; virtual int receiveEvent(WEvent *) { return 0; } - ; virtual int reactToClick(MTGCardInstance *) { return 0; } - ; virtual const char * getMenuText() { return "Ability"; } - ; virtual ActionElement * clone() const = 0; }; diff --git a/projects/mtg/src/ActionElement.cpp b/projects/mtg/src/ActionElement.cpp index abf685513..f5956fe2e 100644 --- a/projects/mtg/src/ActionElement.cpp +++ b/projects/mtg/src/ActionElement.cpp @@ -8,7 +8,7 @@ ActionElement::ActionElement(int id) : JGuiObject(id) { - activeState = INACTIVE; + activity = Inactive; modal = 0; waitingForAnswer = 0; currentPhase = MTG_PHASE_INVALID; @@ -18,7 +18,7 @@ ActionElement::ActionElement(int id) : ActionElement::ActionElement(const ActionElement& a): JGuiObject(a) { - activeState = a.activeState; + activity = a.activity; tc = a.tc ? a.tc->clone() : NULL; currentPhase = a.currentPhase; newPhase = a.newPhase; @@ -31,12 +31,6 @@ ActionElement::~ActionElement() SAFE_DELETE(tc); } -int ActionElement::getActivity() -{ - - return activeState; -} - int ActionElement::isReactingToTargetClick(Targetable * object) { if (MTGCardInstance * cObject = dynamic_cast(object)) diff --git a/projects/mtg/src/MTGGamePhase.cpp b/projects/mtg/src/MTGGamePhase.cpp index 4c93439e3..e88ae621d 100644 --- a/projects/mtg/src/MTGGamePhase.cpp +++ b/projects/mtg/src/MTGGamePhase.cpp @@ -17,7 +17,7 @@ void MTGGamePhase::Update(float) int newState = observer->getCurrentGamePhase(); if (newState != currentState) { - activeState = ACTIVE; + activity = Active; animation = 4; currentState = newState; } @@ -28,18 +28,18 @@ void MTGGamePhase::Update(float) } else { - activeState = INACTIVE; + activity = Inactive; animation = 0; } } bool MTGGamePhase::NextGamePhase() { - if (activeState == INACTIVE) + if (activity == Inactive) { if (observer->currentActionPlayer == observer->currentlyActing()) { - activeState = ACTIVE; + activity = Active; observer->userRequestNextGamePhase(); return true; } From 3ca2f1c1edefe1db78d4e16a31c812fadba3d943 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 17:12:58 +0100 Subject: [PATCH 03/21] Replace defines in Damage.h with enums. --- projects/mtg/include/AllAbilities.h | 10 +++--- projects/mtg/include/Damage.h | 38 +++++++++++++---------- projects/mtg/include/ReplacementEffects.h | 5 +-- projects/mtg/src/AIStats.cpp | 2 +- projects/mtg/src/ActionStack.cpp | 4 +-- projects/mtg/src/AllAbilities.cpp | 10 +++--- projects/mtg/src/Damage.cpp | 18 +++++------ projects/mtg/src/DamagerDamaged.cpp | 2 +- projects/mtg/src/GuiCombat.cpp | 2 +- projects/mtg/src/MTGAbility.cpp | 2 +- projects/mtg/src/MTGRules.cpp | 2 +- projects/mtg/src/ReplacementEffects.cpp | 4 +-- 12 files changed, 53 insertions(+), 46 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 64e14ee8f..6ff6c7521 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -873,8 +873,8 @@ public: return 0; if (!tc->canTarget(e->damage->target)) return 0; if (fromTc && !fromTc->canTarget(e->damage->source)) return 0; - if (type == 1 && e->damage->typeOfDamage != DAMAGE_COMBAT) return 0; - if (type == 2 && e->damage->typeOfDamage == DAMAGE_COMBAT) return 0; + if (type == 1 && e->damage->typeOfDamage != Damage::DAMAGE_COMBAT) return 0; + if (type == 2 && e->damage->typeOfDamage == Damage::DAMAGE_COMBAT) return 0; e->damage->target->thatmuch = e->damage->damage; e->damage->source->thatmuch = e->damage->damage; this->source->thatmuch = e->damage->damage; @@ -2577,7 +2577,7 @@ public: } else { - if (d->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (d->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { a->source = (MTGCardInstance *) d; } @@ -2725,7 +2725,7 @@ public: } else { - if (d->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (d->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { a->source = (MTGCardInstance *) d; } @@ -5549,7 +5549,7 @@ public: { WEventDamage * e = (WEventDamage *) event; Damage * d = e->damage; - if (combatonly && e->damage->typeOfDamage != DAMAGE_COMBAT) + if (combatonly && e->damage->typeOfDamage != Damage::DAMAGE_COMBAT) return 0; MTGCardInstance * card = d->source; if (d->damage > 0 && card && (card == source || card == source->target)) diff --git a/projects/mtg/include/Damage.h b/projects/mtg/include/Damage.h index 0074fa002..8789dd4d0 100644 --- a/projects/mtg/include/Damage.h +++ b/projects/mtg/include/Damage.h @@ -11,17 +11,15 @@ class JGuiObject; class MTGCardInstance; class GameObserver; -#define DAMAGEABLE_MTGCARDINSTANCE 0 -#define DAMAGEABLE_PLAYER 1 - -#define DAMAGE_ALL_TYPES 0 -#define DAMAGE_COMBAT 1 -#define DAMAGE_OTHER 2 - class Damageable:public Targetable { protected: public: + enum DamageableType{ + DAMAGEABLE_MTGCARDINSTANCE = 0, + DAMAGEABLE_PLAYER + }; + int life; int handsize; int poisonCount; @@ -29,12 +27,14 @@ public: int preventable; int thatmuch; int lifeLostThisTurn; - int type_as_damageable; + DamageableType type_as_damageable; Damageable(GameObserver* observer, int _life) - : Targetable(observer) - {life=_life;lifeLostThisTurn = 0;}; - int getLife(){return life;}; - virtual int dealDamage(int damage){life-=damage;return life;}; + : Targetable(observer), life(_life), handsize(0), + poisonCount(0), damageCount(0), preventable(0), thatmuch(0), + lifeLostThisTurn(0), type_as_damageable(DAMAGEABLE_MTGCARDINSTANCE) + {} + int getLife(){return life;} + virtual int dealDamage(int damage){life-=damage;return life;} virtual int afterDamage(){return 0;} virtual int poisoned(){return 0;} virtual int prevented(){return 0;} @@ -47,17 +47,23 @@ public: class Damage: public Interruptible { - protected: - void init(MTGCardInstance * source, Damageable * target, int damage, int typeOfDamage); public: + enum DamageType{ + DAMAGE_ALL_TYPES = 0, + DAMAGE_COMBAT, + DAMAGE_OTHER + }; + Damageable * target; - int typeOfDamage; + DamageType typeOfDamage; int damage; void Render(); Damage(GameObserver* observer, MTGCardInstance* source, Damageable * target); - Damage(GameObserver* observer, MTGCardInstance* source, Damageable * target, int damage, int typeOfDamage = DAMAGE_OTHER); + Damage(GameObserver* observer, MTGCardInstance* source, Damageable * target, int damage, DamageType typeOfDamage = DAMAGE_OTHER); int resolve(); virtual ostream& toString(ostream& out) const; + protected: + void init(MTGCardInstance * source, Damageable * target, int damage, DamageType typeOfDamage); }; class DamageStack : public GuiLayer, public Interruptible diff --git a/projects/mtg/include/ReplacementEffects.h b/projects/mtg/include/ReplacementEffects.h index 58219923c..1c2550fdc 100644 --- a/projects/mtg/include/ReplacementEffects.h +++ b/projects/mtg/include/ReplacementEffects.h @@ -29,9 +29,10 @@ protected: TargetChooser * tcTarget; int damage; bool oneShot; - int typeOfDamage; + Damage::DamageType typeOfDamage; public: - REDamagePrevention(MTGAbility * _source, TargetChooser *_tcSource = NULL, TargetChooser *_tcTarget = NULL, int _damage = -1, bool _oneShot = true, int typeOfDamage = DAMAGE_ALL_TYPES); + REDamagePrevention(MTGAbility * _source, TargetChooser *_tcSource = NULL, TargetChooser *_tcTarget = NULL, + int _damage = -1, bool _oneShot = true, Damage::DamageType typeOfDamage = Damage::DAMAGE_ALL_TYPES); WEvent * replace(WEvent *e); ~REDamagePrevention(); }; diff --git a/projects/mtg/src/AIStats.cpp b/projects/mtg/src/AIStats.cpp index 3e9a59664..e0d281e69 100644 --- a/projects/mtg/src/AIStats.cpp +++ b/projects/mtg/src/AIStats.cpp @@ -47,7 +47,7 @@ void AIStats::updateStatsCard(MTGCardInstance * cardInstance, Damage * damage, f { stat->value += static_cast(multiplier * STATS_PLAYER_MULTIPLIER * damage->damage); } - else if (damage->target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + else if (damage->target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { MTGCardInstance * target = (MTGCardInstance *) damage->target; if (target->controller() == player && !target->isInPlay(player->getObserver())) diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index 69a32202e..6509bc217 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -161,7 +161,7 @@ void StackAbility::Render() if (target) { quad = target->getIcon(); - if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { alt2 = ((MTGCardInstance *) target)->name; } @@ -400,7 +400,7 @@ void Spell::Render() if (target) { quad = target->getIcon(); - if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { alt2 = ((MTGCardInstance *) target)->name; } diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 8cbe9742d..d0f2cad43 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2351,7 +2351,7 @@ int AALifer::resolve() return 0; WParsedInt life(life_s, NULL, source); - if (_target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (_target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { _target = ((MTGCardInstance *) _target)->controller(); } @@ -4380,7 +4380,7 @@ int AAExchangeLife::resolve() int oldlife = player->getLife(); int targetOldLife = _target->getLife(); int modifier = oldlife > targetOldLife? oldlife - targetOldLife:targetOldLife - oldlife; - if (_target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (_target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { int increaser = 0; MTGCardInstance * card = ((MTGCardInstance*)_target); @@ -4597,15 +4597,15 @@ int APreventDamageTypes::addToGame() fromTc->targetter = NULL; if (type != 1 && type != 2) {//not adding this creates a memory leak. - re = NEW REDamagePrevention(this, fromTc, toTc, -1, false, DAMAGE_COMBAT); + re = NEW REDamagePrevention(this, fromTc, toTc, -1, false, Damage::DAMAGE_COMBAT); } else if (type == 1) { - re = NEW REDamagePrevention(this, fromTc, toTc, -1, false, DAMAGE_ALL_TYPES); + re = NEW REDamagePrevention(this, fromTc, toTc, -1, false, Damage::DAMAGE_ALL_TYPES); } else if (type == 2) { - re = NEW REDamagePrevention(this, fromTc, toTc, -1, false, DAMAGE_OTHER); + re = NEW REDamagePrevention(this, fromTc, toTc, -1, false, Damage::DAMAGE_OTHER); } game->replacementEffects->add(re); return MTGAbility::addToGame(); diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index d571aed0f..f868be9c2 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -14,13 +14,13 @@ Damage::Damage(GameObserver* observer, MTGCardInstance * source, Damageable * ta init(source, target, source->getPower(), DAMAGE_OTHER); } -Damage::Damage(GameObserver* observer, MTGCardInstance * source, Damageable * target, int damage, int _typeOfDamage) +Damage::Damage(GameObserver* observer, MTGCardInstance * source, Damageable * target, int damage, DamageType _typeOfDamage) : Interruptible(observer) { init(source, target, damage, _typeOfDamage); } -void Damage::init(MTGCardInstance * _source, Damageable * _target, int _damage, int _typeOfDamage) +void Damage::init(MTGCardInstance * _source, Damageable * _target, int _damage, DamageType _typeOfDamage) { typeOfDamage = _typeOfDamage; target = _target; @@ -69,7 +69,7 @@ int Damage::resolve() } //------------------------------------------------- - if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { MTGCardInstance * _target = (MTGCardInstance *) target; if ((_target)->protectedAgainst(source)) @@ -122,7 +122,7 @@ int Damage::resolve() int a = damage; - if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE && (source->has(Constants::WITHER) || source->has( + if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE && (source->has(Constants::WITHER) || source->has( Constants::INFECT))) { // Damage for WITHER or poison on creatures. This should probably go in replacement effects @@ -134,7 +134,7 @@ int Damage::resolve() if(_target->toughness <= 0 && _target->has(Constants::INDESTRUCTIBLE)) _target->controller()->game->putInGraveyard(_target); } - else if (target->type_as_damageable == DAMAGEABLE_PLAYER && (source->has(Constants::INFECT)||source->has(Constants::POISONDAMAGER))) + else if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER && (source->has(Constants::INFECT)||source->has(Constants::POISONDAMAGER))) { // Poison on player Player * _target = (Player *) target; @@ -151,7 +151,7 @@ int Damage::resolve() } } } - else if (target->type_as_damageable == DAMAGEABLE_PLAYER && (source->has(Constants::POISONTOXIC) || + else if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER && (source->has(Constants::POISONTOXIC) || source->has(Constants::POISONTWOTOXIC) || source->has(Constants::POISONTHREETOXIC))) { //Damage + 1, 2, or 3 poison counters on player @@ -190,9 +190,9 @@ int Damage::resolve() //return the left over amount after effects have been applied to them. a = target->dealDamage(damage); target->damageCount += damage;//the amount must be the actual damage so i changed this from 1 to damage, this fixes pdcount and odcount - if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) ((MTGCardInstance*)target)->wasDealtDamage = true; - if (target->type_as_damageable == DAMAGEABLE_PLAYER) + if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER) { if(target == source->controller()) { @@ -248,7 +248,7 @@ void Damage::Render() } else { - if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) mFont->DrawString(_(((MTGCardInstance *) target)->getName()).c_str(), x + 120, y); } diff --git a/projects/mtg/src/DamagerDamaged.cpp b/projects/mtg/src/DamagerDamaged.cpp index 158a8d3dd..5f2be1383 100644 --- a/projects/mtg/src/DamagerDamaged.cpp +++ b/projects/mtg/src/DamagerDamaged.cpp @@ -43,7 +43,7 @@ void DamagerDamaged::addDamage(int damage, DamagerDamaged* source) return; } if (0 < damage) - damages.push_back(Damage(card->getObserver(), source->card, card, damage, DAMAGE_COMBAT)); + damages.push_back(Damage(card->getObserver(), source->card, card, damage, Damage::DAMAGE_COMBAT)); return; } diff --git a/projects/mtg/src/GuiCombat.cpp b/projects/mtg/src/GuiCombat.cpp index 46265e209..29888cac1 100644 --- a/projects/mtg/src/GuiCombat.cpp +++ b/projects/mtg/src/GuiCombat.cpp @@ -526,7 +526,7 @@ int GuiCombat::resolve() // Returns the number of damage objects dealt this turn } if (dmg > 0 && ((!attacker->isBlocked()) || attacker->has(Constants::TRAMPLE))) - stack->Add(NEW Damage(observer, (*it)->card, (Damageable*)attacker->isAttacking?(Damageable*)attacker->isAttacking:observer->opponent(), dmg, DAMAGE_COMBAT)); + stack->Add(NEW Damage(observer, (*it)->card, (Damageable*)attacker->isAttacking?(Damageable*)attacker->isAttacking:observer->opponent(), dmg, Damage::DAMAGE_COMBAT)); for (vector::iterator d = (*it)->damages.begin(); d != (*it)->damages.end(); ++d) stack->Add(NEW Damage(*d)); diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index ff52b934a..cebf7e5ac 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -4477,7 +4477,7 @@ Player * MTGAbility::getPlayerFromDamageable(Damageable * target) if (!target) return NULL; - if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) return ((MTGCardInstance *) target)->controller(); return (Player *) target; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index b8da4451c..03101b281 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -2700,7 +2700,7 @@ int MTGDeathtouchRule::receiveEvent(WEvent * event) if (!card) return 0; - if (d->target->type_as_damageable != DAMAGEABLE_MTGCARDINSTANCE) + if (d->target->type_as_damageable != Damageable::DAMAGEABLE_MTGCARDINSTANCE) return 0; MTGCardInstance * _target = (MTGCardInstance *) (d->target); diff --git a/projects/mtg/src/ReplacementEffects.cpp b/projects/mtg/src/ReplacementEffects.cpp index e330eee5f..b155043d0 100644 --- a/projects/mtg/src/ReplacementEffects.cpp +++ b/projects/mtg/src/ReplacementEffects.cpp @@ -6,7 +6,7 @@ #include "AllAbilities.h" REDamagePrevention::REDamagePrevention(MTGAbility * source, TargetChooser *tcSource, TargetChooser *tcTarget, int damage, - bool oneShot, int typeOfDamage) : + bool oneShot, Damage::DamageType typeOfDamage) : source(source), tcSource(tcSource), tcTarget(tcTarget), damage(damage), oneShot(oneShot), typeOfDamage(typeOfDamage) { } @@ -18,7 +18,7 @@ WEvent * REDamagePrevention::replace(WEvent *event) WEventDamage * e = dynamic_cast (event); if (!e) return event; Damage *d = e->damage; - if (d->typeOfDamage != typeOfDamage && typeOfDamage != DAMAGE_ALL_TYPES) return event; + if (d->typeOfDamage != typeOfDamage && typeOfDamage != Damage::DAMAGE_ALL_TYPES) return event; if ((!tcSource || tcSource->canTarget(d->source)) && (!tcTarget || tcTarget->canTarget(d->target))) { if (damage == -1) From 7a48c5e087488278a487df4a24029ecd649f50a8 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 19:36:24 +0100 Subject: [PATCH 04/21] Fix some cppcheck warnings (mostly style and postfix vs prefix iteration) --- projects/mtg/src/AIHints.cpp | 11 +++++----- projects/mtg/src/AIMomirPlayer.cpp | 7 ++----- projects/mtg/src/AIPlayer.cpp | 4 ++-- projects/mtg/src/AIPlayerBaka.cpp | 32 ++++++++++-------------------- projects/mtg/src/AIStats.cpp | 8 ++++---- projects/mtg/src/ActionLayer.cpp | 9 +++------ 6 files changed, 26 insertions(+), 45 deletions(-) diff --git a/projects/mtg/src/AIHints.cpp b/projects/mtg/src/AIHints.cpp index f61686598..c090c86be 100644 --- a/projects/mtg/src/AIHints.cpp +++ b/projects/mtg/src/AIHints.cpp @@ -307,14 +307,13 @@ bool AIHints::canWeCombo(GameObserver* observer,MTGCardInstance * card,AIPlayerB TargetChooserFactory tfc(observer); TargetChooser * hintTc = NULL; bool gotCombo = false; - int comboPartsHold = 0; - int comboPartsUntil = 0; - int comboPartsRestriction = 0; + for(unsigned int i = 0; i < hints.size();i++) { - comboPartsHold = 0; - comboPartsUntil = 0; - comboPartsRestriction = 0; + int comboPartsHold = 0; + int comboPartsUntil = 0; + int comboPartsRestriction = 0; + if(gotCombo) return gotCombo;//because more then one might be possible at any time. if (hints[i]->hold.size()) diff --git a/projects/mtg/src/AIMomirPlayer.cpp b/projects/mtg/src/AIMomirPlayer.cpp index 0d7e741a5..c67a11b55 100644 --- a/projects/mtg/src/AIMomirPlayer.cpp +++ b/projects/mtg/src/AIMomirPlayer.cpp @@ -90,13 +90,13 @@ int AIMomirPlayer::computeActions() } else if (p == this && observer->mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0) { //standard actions - CardDescriptor cd; - MTGCardInstance * card = NULL; switch (currentGamePhase) { case MTG_PHASE_FIRSTMAIN: { + CardDescriptor cd; + MTGCardInstance * card = NULL; ManaCost * potentialMana = getPotentialMana(); int converted = potentialMana->getConvertedCost(); SAFE_DELETE(potentialMana); @@ -118,15 +118,12 @@ int AIMomirPlayer::computeActions() } momir(); return 1; - break; } case MTG_PHASE_SECONDMAIN: selectAbility(); return 1; - break; default: return AIPlayerBaka::computeActions(); - break; } } return AIPlayerBaka::computeActions(); diff --git a/projects/mtg/src/AIPlayer.cpp b/projects/mtg/src/AIPlayer.cpp index 1c911af9d..fdb1e23bf 100644 --- a/projects/mtg/src/AIPlayer.cpp +++ b/projects/mtg/src/AIPlayer.cpp @@ -97,7 +97,7 @@ int AIAction::clickMultiAct(vector& actionTargets) ite = actionTargets.erase(ite); continue; } - ite++; + ++ite; } //shuffle to make it less predictable, otherwise ai will always seem to target from right to left. making it very obvious. @@ -167,7 +167,7 @@ int AIPlayer::clickMultiTarget(TargetChooser * tc, vector& potentia ite = potentialTargets.erase(ite); continue; } - ite++; + ++ite; } randomGenerator.random_shuffle(potentialTargets.begin(), potentialTargets.end()); diff --git a/projects/mtg/src/AIPlayerBaka.cpp b/projects/mtg/src/AIPlayerBaka.cpp index 2c1039562..3368812d0 100644 --- a/projects/mtg/src/AIPlayerBaka.cpp +++ b/projects/mtg/src/AIPlayerBaka.cpp @@ -134,10 +134,9 @@ int OrderedAIAction::getEfficiency() if (!target) break; - bool NeedPreventing; - NeedPreventing = false; if (currentPhase == MTG_PHASE_COMBATBLOCKERS) { + bool NeedPreventing = false; MTGCardInstance * nextOpponent = target->getNextOpponent(); if(!nextOpponent) break; @@ -152,12 +151,10 @@ int OrderedAIAction::getEfficiency() //small bonus added for the poor 1/1s, if we can save them, we will unless something else took precidence. //note is the target is being blocked or blocking a creature with wither or deathtouch, it is not even considered for preventing as it is a waste. //if its combat blockers, it is being blocked or blocking, and has less prevents the the amount of damage it will be taking, the effeincy is increased slightly and totalled by the danger rank multiplier for final result. - int calculateAfterDamage = 0; - int damages = 0; if((target->defenser || target->blockers.size()) && target->controller() == p) { - damages = nextOpponent->power; - calculateAfterDamage = int(target->toughness - damages); + int damages = nextOpponent->power; + int calculateAfterDamage = target->toughness - damages; if((calculateAfterDamage + target->preventable) > 0) { efficiency = 0; @@ -588,8 +585,7 @@ int OrderedAIAction::getEfficiency() efficiency = 80; if(atc->name.length() && atc->sabilities.length() && atc->types.size() && p->game->inPlay->findByName(atc->name)) { - list::iterator it; - for (it = atc->types.begin(); it != atc->types.end(); it++) + for (list::const_iterator it = atc->types.begin(); it != atc->types.end(); ++it) { if(*it == Subtypes::TYPE_LEGENDARY)//ai please stop killing voja!!! :P efficiency = 0; @@ -978,11 +974,10 @@ vector AIPlayerBaka::canPayMana(MTGCardInstance * target,ManaCost * } } ManaCostHybrid * hybridCost; - int hyb; - hyb = 0; hybridCost = cost->getHybridCost(0); if(hybridCost) { + int hyb = 0; while ((hybridCost = cost->getHybridCost(hyb)) != NULL) { //here we try to find one of the colors in the hybrid cost, it is done 1 at a time unfortunately @@ -1046,7 +1041,6 @@ vector AIPlayerBaka::canPayMana(MTGCardInstance * target,ManaCost * { ManaCost * withKickerCost= NEW ManaCost(cost->getKicker()); - int canKick = 0; vectorkickerPayment; bool keepLooking = true; while(keepLooking) @@ -1061,7 +1055,6 @@ vector AIPlayerBaka::canPayMana(MTGCardInstance * target,ManaCost * payments.push_back(kickerPayment[w]); } } - canKick += 1; keepLooking = cost->getKicker()->isMulti; } else @@ -1297,12 +1290,10 @@ int AIPlayerBaka::createAbilityTargets(MTGAbility * a, MTGCardInstance * c, Rank TargetChooser * AIPlayerBaka::GetComboTc( GameObserver * observer,TargetChooser * tc) { - TargetChooser * gathertc = NULL; TargetChooserFactory tcf(observer); - map::iterator it = comboHint->cardTargets.begin(); - for(map::iterator it = comboHint->cardTargets.begin();it != comboHint->cardTargets.end();it++) + for(map::iterator it = comboHint->cardTargets.begin();it != comboHint->cardTargets.end();++it) { - gathertc = tcf.createTargetChooser(it->first.c_str(),tc->source); + TargetChooser *gathertc = tcf.createTargetChooser(it->first.c_str(),tc->source); gathertc->setAllZones(); if(gathertc->canTarget(tc->source)) { @@ -1402,7 +1393,6 @@ int AIPlayerBaka::selectAbility() MTGCardInstance * card = game->inPlay->cards[j]; if(a->getCost() && !a->isReactingToClick(card, totalPotentialMana))//for performance reason only look for specific mana if the payment couldnt be made with potential. { - abilityPayment = vector(); abilityPayment = canPayMana(card,a->getCost()); } if (a->isReactingToClick(card, totalPotentialMana) || abilityPayment.size()) @@ -1410,10 +1400,9 @@ int AIPlayerBaka::selectAbility() if(a->getCost() && a->getCost()->hasX() && totalPotentialMana->getConvertedCost() < a->getCost()->getConvertedCost()+1) continue; //don't even bother to play an ability with {x} if you can't even afford x=1. - ManaCost * fullPayment = NULL; if (abilityPayment.size()) { - fullPayment = NEW ManaCost(); + ManaCost *fullPayment = NEW ManaCost(); for(int ch = 0; ch < int(abilityPayment.size());ch++) { AManaProducer * ampp = dynamic_cast (abilityPayment[ch]); @@ -1525,7 +1514,7 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard } //Make sure we own the decision to choose the targets assert(tc->Owner == observer->currentlyActing()); - if (tc && tc->Owner != observer->currentlyActing()) + if (tc->Owner != observer->currentlyActing()) { observer->currentActionPlayer = tc->Owner; //this is a hack, but if we hit this condition we are locked in a infinate loop @@ -1905,12 +1894,11 @@ MTGCardInstance * AIPlayerBaka::activateCombo() { if(!comboHint) return NULL; - TargetChooser * hintTc = NULL; TargetChooserFactory tfc(observer); ManaCost * totalCost = ManaCost::parseManaCost(comboHint->manaNeeded); for(unsigned int k = 0;k < comboHint->casting.size(); k++) { - hintTc = tfc.createTargetChooser(comboHint->casting[k],nextCardToPlay); + TargetChooser *hintTc = tfc.createTargetChooser(comboHint->casting[k],nextCardToPlay); int combohand = game->hand->cards.size(); for(int j = 0; j < combohand;j++) { diff --git a/projects/mtg/src/AIStats.cpp b/projects/mtg/src/AIStats.cpp index e0d281e69..b181e238b 100644 --- a/projects/mtg/src/AIStats.cpp +++ b/projects/mtg/src/AIStats.cpp @@ -24,7 +24,7 @@ AIStats::AIStats(Player * _player, char * _filename) AIStats::~AIStats() { list::iterator it; - for (it = stats.begin(); it != stats.end(); it++) + for (it = stats.begin(); it != stats.end(); ++it) { AIStat * stat = *it; delete stat; @@ -115,7 +115,7 @@ bool AIStats::isInTop(MTGCardInstance * card, unsigned int max, bool tooSmallCou MTGCard * source = card->model; int id = source->getMTGId(); list::iterator it; - for (it = stats.begin(); it != stats.end(); it++) + for (it = stats.begin(); it != stats.end(); ++it) { if (n >= max) return false; @@ -135,7 +135,7 @@ AIStat * AIStats::find(MTGCard * source) { int id = source->getMTGId(); list::iterator it; - for (it = stats.begin(); it != stats.end(); it++) + for (it = stats.begin(); it != stats.end(); ++it) { AIStat * stat = *it; if (stat->source == id) @@ -174,7 +174,7 @@ void AIStats::save() { char writer[128]; list::iterator it; - for (it = stats.begin(); it != stats.end(); it++) + for (it = stats.begin(); it != stats.end(); ++it) { AIStat * stat = *it; if (stat->value > 0) diff --git a/projects/mtg/src/ActionLayer.cpp b/projects/mtg/src/ActionLayer.cpp index 4ea73402e..ccdc9b2a4 100644 --- a/projects/mtg/src/ActionLayer.cpp +++ b/projects/mtg/src/ActionLayer.cpp @@ -165,8 +165,6 @@ void ActionLayer::Update(float dt) if (cantCancel) { ActionElement * ae = isWaitingForAnswer(); - int countTargets = 0; - int maxTargets = 0; if(ae && ae->getActionTc()) { if (!ae->getActionTc()->validTargetsExist()) @@ -175,8 +173,8 @@ void ActionLayer::Update(float dt) cancelCurrentAction(); return; } - countTargets = ae->getActionTc()->countValidTargets(); - maxTargets = ae->getActionTc()->maxtargets; + int countTargets = ae->getActionTc()->countValidTargets(); + int maxTargets = ae->getActionTc()->maxtargets; if (countTargets < maxTargets) { /* @@ -440,10 +438,9 @@ void ActionLayer::setCustomMenuObject(Targetable * object, bool must,vectorisMultipleChoice = true; - ActionElement * currentAction = NULL; for(int w = 0; w < int(abilities.size());w++) { - currentAction = (ActionElement*)abilities[w]; + ActionElement *currentAction = (ActionElement*)abilities[w]; currentActionCard = (MTGCardInstance*)abilities[0]->target; abilitiesMenu->Add(mObjects.size()-1, currentAction->getMenuText(),"",false); } From 446ed2075808eb3f7f6332d360f581300a0ef7e3 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 19:38:14 +0100 Subject: [PATCH 05/21] Fix typo ActionLayer::receiveEventPlus(...) This method is rarely used, however it returned 0 after adding stuff. It now returns the sum. --- projects/mtg/src/ActionLayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/ActionLayer.cpp b/projects/mtg/src/ActionLayer.cpp index ccdc9b2a4..5d21cf6c2 100644 --- a/projects/mtg/src/ActionLayer.cpp +++ b/projects/mtg/src/ActionLayer.cpp @@ -264,7 +264,7 @@ int ActionLayer::receiveEventPlus(WEvent * event) ActionElement * currentAction = (ActionElement *) mObjects[i]; result += currentAction->receiveEvent(event); } - return 0; + return result; } int ActionLayer::isReactingToTargetClick(Targetable * card) From e1213d1c1fdc2cba292a9738eb4a21a157b9606b Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 19:50:17 +0100 Subject: [PATCH 06/21] Remove variables flagged for removal (via conditional TODO comment) x and y is provided by PlayGuiObject::Pos. --- projects/mtg/include/ActionStack.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/projects/mtg/include/ActionStack.h b/projects/mtg/include/ActionStack.h index 2f831245e..48715c3d3 100644 --- a/projects/mtg/include/ActionStack.h +++ b/projects/mtg/include/ActionStack.h @@ -48,9 +48,6 @@ class TargetChooser; class Interruptible: public PlayGuiObject, public Targetable { public: - //TODO : remove these when they are back in PlayGuiObject - float x, y; - int state, display; MTGCardInstance * source; virtual void Entering() From 5419d87e4ed7ddfff1db32680a664fbd9dffe2d7 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 20:22:03 +0100 Subject: [PATCH 07/21] Get rid of two more define groups. --- projects/mtg/include/ActionStack.h | 11 ++++++----- projects/mtg/include/CardDescriptor.h | 10 ++++++---- projects/mtg/src/AIHints.cpp | 3 +-- projects/mtg/src/AIMomirPlayer.cpp | 3 +-- projects/mtg/src/TargetChooser.cpp | 12 ++++++------ 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/projects/mtg/include/ActionStack.h b/projects/mtg/include/ActionStack.h index 48715c3d3..06e7f2afe 100644 --- a/projects/mtg/include/ActionStack.h +++ b/projects/mtg/include/ActionStack.h @@ -41,10 +41,6 @@ class DamageStack; class ManaCost; class TargetChooser; - -#define ACTIONSTACK_STANDARD 0 -#define ACTIONSTACK_TARGET 1 - class Interruptible: public PlayGuiObject, public Targetable { public: @@ -183,6 +179,11 @@ public: class ActionStack :public GuiLayer { public: + enum ActionStackMode{ + ACTIONSTACK_STANDARD = 0, + ACTIONSTACK_TARGET = 1 + }; + typedef enum { NOT_DECIDED = 0, @@ -204,7 +205,7 @@ protected: InterruptDecision interruptDecision[2]; float timer; int currentState; - int mode; + ActionStackMode mode; int checked; ATutorialMessage* currentTutorial; int interruptBtnXOffset, noBtnXOffset, noToAllBtnXOffset, interruptDialogWidth; diff --git a/projects/mtg/include/CardDescriptor.h b/projects/mtg/include/CardDescriptor.h index 32cbbb11c..704e3d55f 100644 --- a/projects/mtg/include/CardDescriptor.h +++ b/projects/mtg/include/CardDescriptor.h @@ -9,9 +9,6 @@ #include "MTGGameZones.h" #include "Counters.h" -#define CD_OR 1 -#define CD_AND 2 - enum ENUM_COMPARISON_MODES { COMPARISON_NONE = 0, // Needs to remain 0 for quick if(comparison_mode) checks @@ -31,7 +28,12 @@ class CardDescriptor: public MTGCardInstance MTGCardInstance * match_not(MTGCardInstance * card); bool valueInRange(int comparisonMode, int value, int criterion); public: - int mode; + enum Operator{ + CD_OR = 1, + CD_AND = 2 + }; + + Operator mode; int powerComparisonMode; int toughnessComparisonMode; int manacostComparisonMode; diff --git a/projects/mtg/src/AIHints.cpp b/projects/mtg/src/AIHints.cpp index c090c86be..c8dae463f 100644 --- a/projects/mtg/src/AIHints.cpp +++ b/projects/mtg/src/AIHints.cpp @@ -74,8 +74,7 @@ AIHint::AIHint(string _line) if(action.find( "combo ") != string::npos) { - string Combo = ""; - Combo = action.c_str() + 6; + string Combo = action.c_str() + 6; combos.push_back(Combo); } diff --git a/projects/mtg/src/AIMomirPlayer.cpp b/projects/mtg/src/AIMomirPlayer.cpp index c67a11b55..5daaa55b3 100644 --- a/projects/mtg/src/AIMomirPlayer.cpp +++ b/projects/mtg/src/AIMomirPlayer.cpp @@ -96,7 +96,6 @@ int AIMomirPlayer::computeActions() case MTG_PHASE_FIRSTMAIN: { CardDescriptor cd; - MTGCardInstance * card = NULL; ManaCost * potentialMana = getPotentialMana(); int converted = potentialMana->getConvertedCost(); SAFE_DELETE(potentialMana); @@ -106,7 +105,7 @@ int AIMomirPlayer::computeActions() //Attempt to put land into play cd.init(); cd.setColor(Constants::MTG_COLOR_LAND); - card = cd.match(game->hand); + MTGCardInstance *card = cd.match(game->hand); int canPutLandsIntoPlay = game->playRestrictions->canPutIntoZone(card, game->inPlay); if (card && (canPutLandsIntoPlay == PlayRestriction::CAN_PLAY)) { diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index 4db161dc0..2e73f23e4 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -294,13 +294,13 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta string attribute; if (found2 != string::npos) { - cd->mode = CD_OR; + cd->mode = CardDescriptor::CD_OR; attribute = attributes.substr(0, found2); attributes = attributes.substr(found2 + 1); } else if (foundAnd != string::npos) { - cd->mode = CD_AND; + cd->mode = CardDescriptor::CD_AND; attribute = attributes.substr(0, foundAnd); attributes = attributes.substr(foundAnd + 1); } @@ -550,7 +550,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta else cd->colors = card->colors; - cd->mode = CD_OR; + cd->mode = CardDescriptor::CD_OR; } else if( CDtype.find("types") != string::npos ) { @@ -572,7 +572,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta cd->removeType("creature"); cd->removeType("planeswalker"); cd->removeType("tribal"); - cd->mode = CD_OR; + cd->mode = CardDescriptor::CD_OR; } } else if (attribute.find("counter") != string::npos) @@ -629,7 +629,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta { cd->SetExclusionColor(cid); } - cd->mode = CD_OR; + cd->mode = CardDescriptor::CD_OR; } if (attribute.find("chosencolor") != string::npos) @@ -685,7 +685,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta } } if (nbminuses) - cd->mode = CD_AND; + cd->mode = CardDescriptor::CD_AND; typeName = typeName.substr(0, found); } if (cd) From 94c3ac9ad9c5d77fa612f2f51404d230d8122014 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 21:02:08 +0100 Subject: [PATCH 08/21] Fix FTBFS --- projects/mtg/src/CardGui.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 0874f8291..0c414ae94 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -1013,7 +1013,7 @@ bool CardGui::FilterCard(MTGCard * _card,string filter) CardDescriptor cd; MTGCardInstance * card = (MTGCardInstance*) _card->data; cd.init(); - cd.mode = CD_OR; + cd.mode = CardDescriptor::CD_OR; while (filter.size()) { @@ -1033,13 +1033,13 @@ bool CardGui::FilterCard(MTGCard * _card,string filter) string attribute; if (found2 != string::npos) { - cd.mode = CD_OR; + cd.mode = CardDescriptor::CD_OR; attribute = attributes.substr(0, found2); attributes = attributes.substr(found2 + 1); } else if (foundAnd != string::npos) { - cd.mode = CD_AND; + cd.mode = CardDescriptor::CD_AND; attribute = attributes.substr(0, foundAnd); attributes = attributes.substr(foundAnd + 1); } @@ -1302,7 +1302,7 @@ bool CardGui::FilterCard(MTGCard * _card,string filter) } } if (nbminuses) - cd.mode = CD_AND; + cd.mode = CardDescriptor::CD_AND; filter = filter.substr(0, found); } else @@ -1312,7 +1312,7 @@ bool CardGui::FilterCard(MTGCard * _card,string filter) if (found != string::npos) { - cd.mode = CD_OR; + cd.mode = CardDescriptor::CD_OR; typeName = filter.substr(0, found); filter = filter.substr(found + 1); } From f2314ca673c7781601e299567011363a08f0b041 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 21:05:07 +0100 Subject: [PATCH 09/21] Use proposed coding style --- projects/mtg/src/Damage.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index d571aed0f..20f4b67fb 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -59,13 +59,15 @@ int Damage::resolve() //reserved for culmulitive absorb ability coding //prevent next damage----------------------------- - if ((target)->preventable > 0) + if (target->preventable > 0) { int preventing = MIN(target->preventable, damage); damage -= preventing; target->preventable -= preventing; - }else{ - (target)->preventable = 0; + } + else + { + target->preventable = 0; } //------------------------------------------------- From 6c41e5c92c7a38bf21be3debaf70828df138e34d Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Tue, 19 Nov 2013 02:41:30 +0400 Subject: [PATCH 10/21] Added option (#define CAPTURE_STDERR) if set then the DebugTrace calls only for failing tests are shown --- JGE/include/DebugRoutines.h | 15 ++++++++++++++- JGE/include/OutputCapturer.h | 28 ++++++++++++++++++++++++++++ JGE/src/OutputCapturer.cpp | 3 +++ JGE/src/Qtconsole.cpp | 3 +++ projects/mtg/src/TestSuiteAI.cpp | 12 ++++++++++++ projects/mtg/wagic-qt.pro | 2 ++ travis-script.sh | 2 +- 7 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 JGE/include/OutputCapturer.h create mode 100644 JGE/src/OutputCapturer.cpp diff --git a/JGE/include/DebugRoutines.h b/JGE/include/DebugRoutines.h index 944d4e7a1..1ce188214 100644 --- a/JGE/include/DebugRoutines.h +++ b/JGE/include/DebugRoutines.h @@ -4,6 +4,8 @@ // dirty, but I get OS header includes this way #include "JGE.h" +#include "OutputCapturer.h" + #include #include #include @@ -29,12 +31,23 @@ std::string ToHex(T* pointer) #if defined (WIN32) || defined (LINUX) #ifdef QT_CONFIG + +#ifdef CAPTURE_STDERR #define DebugTrace(inString) \ { \ std::ostringstream stream; \ stream << inString; \ - qDebug("%s", stream.str().c_str()); \ + OutputCapturer::add(stream.str()); \ } +#else // CAPTURE_STDERR +#define DebugTrace(inString) \ +{ \ + std::ostringstream stream; \ + stream << inString; \ + qDebug("%s", stream.str().c_str()); \ +} +#endif // CAPTURE_STDERR + #elif defined (ANDROID) #include #define DebugTrace(inString) \ diff --git a/JGE/include/OutputCapturer.h b/JGE/include/OutputCapturer.h new file mode 100644 index 000000000..9e2f3d924 --- /dev/null +++ b/JGE/include/OutputCapturer.h @@ -0,0 +1,28 @@ +#ifndef OUTPUTCAPTURER_H +#define OUTPUTCAPTURER_H + +#if defined(QT_CONFIG) +#include +#include +#include + +class OutputCapturer +{ +private: + static std::ostringstream stream; +public: + static void add(const std::string& s) { + stream << s << "\n"; + } + static void debugAndClear() { + stream.flush(); + qDebug("%s", stream.str().c_str()); + stream.str(""); + } + static void clear() { + stream.str(""); + } +}; +#endif + +#endif // OUTPUTCAPTURER_H diff --git a/JGE/src/OutputCapturer.cpp b/JGE/src/OutputCapturer.cpp new file mode 100644 index 000000000..3c31da724 --- /dev/null +++ b/JGE/src/OutputCapturer.cpp @@ -0,0 +1,3 @@ +#include "../include/OutputCapturer.h" + +std::ostringstream OutputCapturer::stream; diff --git a/JGE/src/Qtconsole.cpp b/JGE/src/Qtconsole.cpp index 96b0c9efb..9f3078393 100644 --- a/JGE/src/Qtconsole.cpp +++ b/JGE/src/Qtconsole.cpp @@ -98,5 +98,8 @@ int main(int argc, char* argv[]) result = testSuite.run(); delete wagicCore; DebugTrace("TestSuite done: failed test: " << result); +#ifdef CAPTURE_STDERR + OutputCapturer::debugAndClear(); +#endif return result; } diff --git a/projects/mtg/src/TestSuiteAI.cpp b/projects/mtg/src/TestSuiteAI.cpp index 80c930ef8..eeb279fd2 100644 --- a/projects/mtg/src/TestSuiteAI.cpp +++ b/projects/mtg/src/TestSuiteAI.cpp @@ -433,6 +433,15 @@ void TestSuiteGame::assertGame() Log("==Test Succesful !=="); else Log("==Test Failed !=="); +#ifdef CAPTURE_STDERR + if (error) + { + OutputCapturer::debugAndClear(); + } else + { + OutputCapturer::clear(); + } +#endif mMutex.unlock(); } @@ -585,6 +594,9 @@ void TestSuite::ThreadProc(void* inParam) { LOG("Entering TestSuite::ThreadProc"); TestSuite* instance = reinterpret_cast(inParam); +#ifdef CAPTURE_STDERR + OutputCapturer::debugAndClear(); +#endif if (instance) { string filename; diff --git a/projects/mtg/wagic-qt.pro b/projects/mtg/wagic-qt.pro index 5f9544b9b..715823a8a 100644 --- a/projects/mtg/wagic-qt.pro +++ b/projects/mtg/wagic-qt.pro @@ -327,6 +327,7 @@ SOURCES += \ ../../JGE/src/pc/JSocket.cpp\ ../../JGE/src/pc/JSfx.cpp\ ../../JGE/src/JSprite.cpp\ + ../../JGE/src/OutputCapturer.cpp\ ../../JGE/src/Vector2D.cpp\ ../../JGE/src/tinyxml/tinystr.cpp\ ../../JGE/src/tinyxml/tinyxml.cpp\ @@ -393,6 +394,7 @@ HEADERS += \ ../../JGE/include/JSpline.h\ ../../JGE/include/JSprite.h\ ../../JGE/include/JTypes.h\ + ../../JGE/include/OutputCapturer.h\ ../../JGE/include/Vector2D.h\ ../../JGE/include/Vector3D.h\ ../../JGE/include/vram.h\ diff --git a/travis-script.sh b/travis-script.sh index f01edd15b..b9461e8a9 100755 --- a/travis-script.sh +++ b/travis-script.sh @@ -10,7 +10,7 @@ make -j 8 # let's try an Intel linux binary cd ../.. -qmake projects/mtg/wagic-qt.pro CONFIG+=console CONFIG+=debug +qmake projects/mtg/wagic-qt.pro CONFIG+=console CONFIG+=debug DEFINES+=CAPTURE_STDERR make -j 8 # and finish by running the testsuite From 331e126787489353ec704298f8b42d1bcb3ecfd1 Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Tue, 19 Nov 2013 02:57:42 +0400 Subject: [PATCH 11/21] Added info about total number of tests --- JGE/src/Qtconsole.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/JGE/src/Qtconsole.cpp b/JGE/src/Qtconsole.cpp index 9f3078393..a09f5ba25 100644 --- a/JGE/src/Qtconsole.cpp +++ b/JGE/src/Qtconsole.cpp @@ -96,8 +96,9 @@ int main(int argc, char* argv[]) options.reloadProfile(); TestSuite testSuite("test/_tests.txt"); result = testSuite.run(); + int totalTests = testSuite.nbTests + testSuite.nbAITests; delete wagicCore; - DebugTrace("TestSuite done: failed test: " << result); + DebugTrace("TestSuite done: failed test: " << result << " out of " << totalTests << " total"); #ifdef CAPTURE_STDERR OutputCapturer::debugAndClear(); #endif From f370899a8abd137376e3dd7887bf705ae4d397a1 Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Tue, 19 Nov 2013 03:58:43 +0400 Subject: [PATCH 12/21] Thread-safe version of OutputCapturer --- JGE/include/OutputCapturer.h | 4 ++++ JGE/include/Threading.h | 1 - JGE/src/OutputCapturer.cpp | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/JGE/include/OutputCapturer.h b/JGE/include/OutputCapturer.h index 9e2f3d924..fe23f1e89 100644 --- a/JGE/include/OutputCapturer.h +++ b/JGE/include/OutputCapturer.h @@ -5,13 +5,17 @@ #include #include #include +#include "Threading.h" class OutputCapturer { private: static std::ostringstream stream; + static boost::mutex mMutex; + public: static void add(const std::string& s) { + boost::mutex::scoped_lock lock(mMutex); stream << s << "\n"; } static void debugAndClear() { diff --git a/JGE/include/Threading.h b/JGE/include/Threading.h index fe3c79068..2c0667ce7 100644 --- a/JGE/include/Threading.h +++ b/JGE/include/Threading.h @@ -315,7 +315,6 @@ namespace boost #include #include -#include "../include/DebugRoutines.h" #include "../include/JLogger.h" namespace boost diff --git a/JGE/src/OutputCapturer.cpp b/JGE/src/OutputCapturer.cpp index 3c31da724..41dc4fb81 100644 --- a/JGE/src/OutputCapturer.cpp +++ b/JGE/src/OutputCapturer.cpp @@ -1,3 +1,4 @@ #include "../include/OutputCapturer.h" std::ostringstream OutputCapturer::stream; +boost::mutex mMutex; From 071a487100ea300a8b72aba178ee797d8feb6883 Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Tue, 19 Nov 2013 11:06:31 +0400 Subject: [PATCH 13/21] Fixed compilation error --- JGE/include/OutputCapturer.h | 15 +++------------ JGE/src/OutputCapturer.cpp | 20 +++++++++++++++++++- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/JGE/include/OutputCapturer.h b/JGE/include/OutputCapturer.h index fe23f1e89..4b32e301a 100644 --- a/JGE/include/OutputCapturer.h +++ b/JGE/include/OutputCapturer.h @@ -14,18 +14,9 @@ private: static boost::mutex mMutex; public: - static void add(const std::string& s) { - boost::mutex::scoped_lock lock(mMutex); - stream << s << "\n"; - } - static void debugAndClear() { - stream.flush(); - qDebug("%s", stream.str().c_str()); - stream.str(""); - } - static void clear() { - stream.str(""); - } + static void add(const std::string& s); + static void debugAndClear(); + static void clear(); }; #endif diff --git a/JGE/src/OutputCapturer.cpp b/JGE/src/OutputCapturer.cpp index 41dc4fb81..902dc10e8 100644 --- a/JGE/src/OutputCapturer.cpp +++ b/JGE/src/OutputCapturer.cpp @@ -1,4 +1,22 @@ #include "../include/OutputCapturer.h" std::ostringstream OutputCapturer::stream; -boost::mutex mMutex; +boost::mutex OutputCapturer::mMutex; + +void OutputCapturer::add(const std::string& s) +{ + boost::mutex::scoped_lock lock(mMutex); + stream << s << "\n"; +} + +void OutputCapturer::debugAndClear() +{ + stream.flush(); + qDebug("%s", stream.str().c_str()); + stream.str(""); +} + +void OutputCapturer::clear() +{ + stream.str(""); +} From 35697a65b4d6f0052375e7c9c8e59b366d7875e0 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Wed, 20 Nov 2013 11:13:35 +0100 Subject: [PATCH 14/21] Use style guide --- projects/mtg/src/ActionLayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/ActionLayer.cpp b/projects/mtg/src/ActionLayer.cpp index 5d21cf6c2..5efec2e67 100644 --- a/projects/mtg/src/ActionLayer.cpp +++ b/projects/mtg/src/ActionLayer.cpp @@ -440,7 +440,7 @@ void ActionLayer::setCustomMenuObject(Targetable * object, bool must,vectorisMultipleChoice = true; for(int w = 0; w < int(abilities.size());w++) { - ActionElement *currentAction = (ActionElement*)abilities[w]; + ActionElement* currentAction = (ActionElement*)abilities[w]; currentActionCard = (MTGCardInstance*)abilities[0]->target; abilitiesMenu->Add(mObjects.size()-1, currentAction->getMenuText(),"",false); } From bbc310dec7fe66adf2ad16fe7e452e1b1a0daeb0 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sun, 17 Nov 2013 21:55:16 +0100 Subject: [PATCH 15/21] Remove some dead code --- projects/mtg/include/CardEffect.h | 21 --------------------- projects/mtg/include/GameApp.h | 2 -- projects/mtg/include/OSD.h | 11 ----------- projects/mtg/src/CardEffect.cpp | 20 -------------------- projects/mtg/src/GameStateDeckViewer.cpp | 16 ---------------- projects/mtg/template.vcxproj | 2 -- projects/mtg/template.vcxproj.filters | 6 ------ projects/mtg/wagic-qt.pro | 3 --- 8 files changed, 81 deletions(-) delete mode 100644 projects/mtg/include/CardEffect.h delete mode 100644 projects/mtg/include/OSD.h delete mode 100644 projects/mtg/src/CardEffect.cpp diff --git a/projects/mtg/include/CardEffect.h b/projects/mtg/include/CardEffect.h deleted file mode 100644 index ef2ea3b09..000000000 --- a/projects/mtg/include/CardEffect.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef _CARDEFFECT_H_ -#define _CARDEFFECT_H_ - -#include -#include "Effects.h" - -struct CardGui; - -class CardEffect: public Effect -{ -public: - CardEffect(CardGui* target); - ~CardEffect(); -private: - CardGui* target; - -public: - virtual void Render(); -}; - -#endif // _CARDEFFECT_H_ diff --git a/projects/mtg/include/GameApp.h b/projects/mtg/include/GameApp.h index 7c0c996d7..eeb1c8141 100644 --- a/projects/mtg/include/GameApp.h +++ b/projects/mtg/include/GameApp.h @@ -20,7 +20,6 @@ #include "MTGCard.h" #include "MTGGameZones.h" -#include "CardEffect.h" #ifdef NETWORK_SUPPORT #include "JNetwork.h" #endif //NETWORK_SUPPORT @@ -49,7 +48,6 @@ public: GameType gameType; Rules * rules; - CardEffect *effect; #ifdef NETWORK_SUPPORT string mServerAddress; JNetwork* mpNetwork; diff --git a/projects/mtg/include/OSD.h b/projects/mtg/include/OSD.h deleted file mode 100644 index f6733ebd3..000000000 --- a/projects/mtg/include/OSD.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _OSD_H_ -#define _OSD_H_ - -class OSDLayer: public PlayGuiObjectController -{ - virtual void Update(float dt); - virtual bool CheckUserInput(JButton key); - virtual void Render(); -}; - -#endif diff --git a/projects/mtg/src/CardEffect.cpp b/projects/mtg/src/CardEffect.cpp deleted file mode 100644 index 12afd8bb2..000000000 --- a/projects/mtg/src/CardEffect.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "../include/GameApp.h" -#include "../include/MTGCard.h" -#include "../include/GameOptions.h" -#include "../include/CardEffect.h" - -CardEffect::CardEffect(CardGui* target) : - target(target) -{ - -} - -CardEffect::~CardEffect() -{ - -} - -void CardEffect::Render() -{ - // std::cout << "Rendering effect" << std::endl; -} diff --git a/projects/mtg/src/GameStateDeckViewer.cpp b/projects/mtg/src/GameStateDeckViewer.cpp index 41a8a2f37..24e51f910 100644 --- a/projects/mtg/src/GameStateDeckViewer.cpp +++ b/projects/mtg/src/GameStateDeckViewer.cpp @@ -23,22 +23,6 @@ #include "AIPlayer.h" - -//!! helper function; this is probably handled somewhere in the code already. -// If not, should be placed in general library -void StringExplode(string str, string separator, vector* results) -{ - size_t found; - found = str.find_first_of(separator); - while (found != string::npos) - { - if (found > 0) results->push_back(str.substr(0, found)); - str = str.substr(found + 1); - found = str.find_first_of(separator); - } - if (str.length() > 0) results->push_back(str); -} - GameStateDeckViewer::GameStateDeckViewer(GameApp* parent) : GameState(parent, "deckeditor") { diff --git a/projects/mtg/template.vcxproj b/projects/mtg/template.vcxproj index 7109ebd09..96f355a51 100644 --- a/projects/mtg/template.vcxproj +++ b/projects/mtg/template.vcxproj @@ -455,7 +455,6 @@ - @@ -517,7 +516,6 @@ - diff --git a/projects/mtg/template.vcxproj.filters b/projects/mtg/template.vcxproj.filters index 32cd0ca8b..0d874bf5b 100644 --- a/projects/mtg/template.vcxproj.filters +++ b/projects/mtg/template.vcxproj.filters @@ -363,9 +363,6 @@ inc - - inc - inc @@ -528,9 +525,6 @@ inc - - inc - inc diff --git a/projects/mtg/wagic-qt.pro b/projects/mtg/wagic-qt.pro index 715823a8a..d9b1171fe 100644 --- a/projects/mtg/wagic-qt.pro +++ b/projects/mtg/wagic-qt.pro @@ -89,7 +89,6 @@ SOURCES += \ src/AllAbilities.cpp\ src/CardDescriptor.cpp\ src/CardDisplay.cpp\ - src/CardEffect.cpp\ src/CardGui.cpp\ src/CardPrimitive.cpp\ src/CardSelector.cpp\ @@ -243,7 +242,6 @@ HEADERS += \ include/GameStateShop.h\ include/MTGPack.h\ include/TextScroller.h\ - include/CardEffect.h\ include/GameStateStory.h\ include/MTGRules.h\ include/ThisDescriptor.h\ @@ -254,7 +252,6 @@ HEADERS += \ include/Token.h\ include/CardPrimitive.h\ include/GuiAvatars.h\ - include/OSD.h\ include/Translate.h\ include/CardSelector.h\ include/GuiBackground.h\ From 9c282aeb56b2540765aab1381872dac8fff53089 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Wed, 20 Nov 2013 12:02:33 +0100 Subject: [PATCH 16/21] Remove CardEffect.o from Makefile --- projects/mtg/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/Makefile b/projects/mtg/Makefile index 9485d7d1b..dc4f2b7fe 100644 --- a/projects/mtg/Makefile +++ b/projects/mtg/Makefile @@ -1,7 +1,7 @@ OBJS = objs/InteractiveButton.o objs/AbilityParser.o objs/ActionElement.o\ objs/ActionLayer.o objs/ActionStack.o objs/AIHints.o objs/AIMomirPlayer.o\ objs/AIPlayer.o objs/AIPlayerBaka.o objs/AIStats.o objs/AllAbilities.o\ - objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o\ + objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o\ objs/CardPrimitive.o objs/CardSelector.o objs/CardSelectorSingleton.o\ objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o\ objs/DeckDataWrapper.o objs/DeckEditorMenu.o objs/DeckMenu.o\ From e76c57d74775a654ffb2cec60a03f5196d90eff1 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Wed, 20 Nov 2013 12:56:33 +0100 Subject: [PATCH 17/21] Fix some valgrind memcheck warnings. However there remains one... ... within the threaded texture cache. Once it is resized, some textures in GetQuad(...) (WCachedResource.cpp:102/103) have uninitialized widths/heights. --- projects/mtg/src/GameOptions.cpp | 7 ++++--- projects/mtg/src/GameStateMenu.cpp | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/projects/mtg/src/GameOptions.cpp b/projects/mtg/src/GameOptions.cpp index 18e395760..b82265623 100644 --- a/projects/mtg/src/GameOptions.cpp +++ b/projects/mtg/src/GameOptions.cpp @@ -1188,10 +1188,11 @@ bool GameOptionKeyBindings::read(string input) iss.get(*(s.rdbuf()), ','); iss.get(); - LocalKeySym local; - char sep; - u32 button; + LocalKeySym local = 0; + char sep = 0; + u32 button = 0; s >> local >> sep >> button; + if (':' != sep) return false; assoc.push_back(make_pair(local, u32_to_button(button))); diff --git a/projects/mtg/src/GameStateMenu.cpp b/projects/mtg/src/GameStateMenu.cpp index 11327ce83..b6df5f2f8 100644 --- a/projects/mtg/src/GameStateMenu.cpp +++ b/projects/mtg/src/GameStateMenu.cpp @@ -65,6 +65,7 @@ GameStateMenu::GameStateMenu(GameApp* parent) : scroller = NULL; langChoices = false; primitivesLoadCounter = -1; + bgTexture = NULL; } GameStateMenu::~GameStateMenu() From 8209716fc9f15e589ad727f676881220f9589d49 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Wed, 20 Nov 2013 13:53:15 +0100 Subject: [PATCH 18/21] Remove unused file --- projects/mtg/src/MTGSpellStack.cpp | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 projects/mtg/src/MTGSpellStack.cpp diff --git a/projects/mtg/src/MTGSpellStack.cpp b/projects/mtg/src/MTGSpellStack.cpp deleted file mode 100644 index 0b8fac351..000000000 --- a/projects/mtg/src/MTGSpellStack.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "MTGSpellStack.h" - -MTGSpellStack::MTGSpellStack() -{ - cursor = -1; -} - -void MTGSpellStack::addSpell(Ability * ability) -{ - cursor++; - spellStack[cursor] ability; -} - -int MTGSpellStack::resolve() -{ - if (cursor < 0) - return 0; - int result = cursor; - cursor--; - (spellStack[cursor + 1])->resolve(); - return (result + 1); -} From 3cee80e3bcec6d902777d160fa63624602788106 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Wed, 20 Nov 2013 14:01:59 +0100 Subject: [PATCH 19/21] Delete another unused file (GuiMessageBox.cpp) --- projects/mtg/src/GuiMessageBox.cpp | 56 ------------------------------ 1 file changed, 56 deletions(-) delete mode 100644 projects/mtg/src/GuiMessageBox.cpp diff --git a/projects/mtg/src/GuiMessageBox.cpp b/projects/mtg/src/GuiMessageBox.cpp deleted file mode 100644 index 94b22ac0c..000000000 --- a/projects/mtg/src/GuiMessageBox.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "GuiMessageBox.h" - -bool GuiMessageBox::CheckUserInput(JButton key) -{ - if (mActionButton == key) - { - if (mObjects[mCurr] != NULL && mObjects[mCurr]->ButtonPressed()) - { - if (mListener != NULL) - { - mListener->ButtonPressed(mId, mObjects[mCurr]->GetId()); - return true; - } - } - } - - if ((PSP_CTRL_LEFT == key) || (PSP_CTRL_UP == key)) // || mEngine->GetAnalogY()<64) - { - int n = mCurr; - n--; - if (n < 0) - { - if ((mStyle & JGUI_STYLE_WRAPPING)) - n = mCount - 1; - else - n = 0; - } - - if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(PSP_CTRL_UP)) - { - mCurr = n; - mObjects[mCurr]->Entering(); - } - return true; - } - else if ((PSP_CTRL_RIGHT == key) || (PSP_CTRL_DOWN == key)) // || mEngine->GetAnalogY()>192) - { - int n = mCurr; - n++; - if (n > mCount - 1) - { - if ((mStyle & JGUI_STYLE_WRAPPING)) - n = 0; - else - n = mCount - 1; - } - - if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(PSP_CTRL_DOWN)) - { - mCurr = n; - mObjects[mCurr]->Entering(); - } - return true; - } - return false; -} From ffbb228d2d67f85ef13ef2155b08f4463dee097f Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Thu, 21 Nov 2013 14:25:01 +0400 Subject: [PATCH 20/21] Fixed wrong activation cost in dragon hatchling --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 6d356044e..038e29d22 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -23286,7 +23286,7 @@ type=Sorcery [/card] [card] name=Dragon Hatchling -auto={1}{R}:1/0 +auto={R}:1/0 abilities=flying text=Flying -- {R}: Dragon Hatchling gets +1/+0 until end of turn. mana={1}{R} From 052e3abdb8ff92b42882039fda4809278bd9471e Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Fri, 22 Nov 2013 01:03:07 +0400 Subject: [PATCH 21/21] Small fix in match_and ( [-color1; -color2] was handled incorrectly ) --- projects/mtg/bin/Res/test/_tests.txt | 1 + .../mtg/bin/Res/test/consign_to_dream.txt | 25 +++++++++++++++++++ projects/mtg/src/CardDescriptor.cpp | 3 ++- 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 projects/mtg/bin/Res/test/consign_to_dream.txt diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 32841bb5a..7a5448816 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -226,6 +226,7 @@ colossus_of_sardia1.txt colossus_of_sardia2.txt composite_golem.txt conservator.txt +consign_to_dream.txt Contagion_Clasp.txt control_magic.txt control_magic2.txt diff --git a/projects/mtg/bin/Res/test/consign_to_dream.txt b/projects/mtg/bin/Res/test/consign_to_dream.txt new file mode 100644 index 000000000..599770868 --- /dev/null +++ b/projects/mtg/bin/Res/test/consign_to_dream.txt @@ -0,0 +1,25 @@ +# Test TargetChooser based on negation of two colors +# Grizzly bear should be put on top of library + +# name=Consign to Dream +# Return target permanent to its owner's hand. +# If that permanent is red or green, put it on top of its owner's library + +[INIT] +FIRSTMAIN +[PLAYER1] +hand:Consign to Dream +manapool:{2}{U} +inplay:grizzly bears +[PLAYER2] +[DO] +Consign to Dream +grizzly bears +endinterruption +[ASSERT] +FIRSTMAIN +[PLAYER1] +graveyard:Consign to Dream +library:grizzly bears +[PLAYER2] +[END] \ No newline at end of file diff --git a/projects/mtg/src/CardDescriptor.cpp b/projects/mtg/src/CardDescriptor.cpp index 995ff79b4..f304e356d 100644 --- a/projects/mtg/src/CardDescriptor.cpp +++ b/projects/mtg/src/CardDescriptor.cpp @@ -160,7 +160,8 @@ MTGCardInstance * CardDescriptor::match_and(MTGCardInstance * card) if (mColorExclusions) { - if ((mColorExclusions & card->colors) == mColorExclusions) + // if any of forbidden colors intersect with card colors + if ((mColorExclusions & card->colors) != 0) match = NULL; }