#ifndef _MTG_CARD_INSTANCE_H_ #define _MTG_CARD_INSTANCE_H_ #include "MTGCard.h" #include "CardPrimitive.h" #include "MTGGameZones.h" #include "MTGAbility.h" #include "WResourceManager.h" #include "ManaCost.h" #include "Damage.h" #include "Targetable.h" class MTGCardInstance; class MTGPlayerCards; class MTGAbility; class MTGCard; class ManaCost; class UntapBlockers; class CardDescriptor; class Counters; struct Pos; #include using namespace std; class MTGCardInstance: public CardPrimitive, public MTGCard, public Damageable #ifdef TRACK_OBJECT_USAGE , public InstanceCounter #endif { private: bool blocked; //Blocked this turn or not? protected: int untapping; int nb_damages; string sample; int tapped; int lifeOrig; MTGPlayerCards * belongs_to; MTGCardInstance * getNextPartner(); void initMTGCI(); int addBlocker(MTGCardInstance * c); int removeBlocker(MTGCardInstance * c); int init(); public: vectorparentCards; vectorchildrenCards; vectorcardsAbilities; int setAttacker(int value); int setDefenser(MTGCardInstance * c); MTGGameZone * currentZone; Pos* view; int X; int castX; int setX; int alternateCostPaid[ManaCost::MANA_PAID_WITH_BESTOW + 1]; int paymenttype; int castMethod; /* Tells if the card reached its current zone by being cast or not (brought into the zone by an effect). non 0 == cast, 0 == not cast */ int frozen; int sunburst; int equipment; int auras; bool wasDealtDamage; bool combatdamageToOpponent; bool damageToOpponent; bool damageToController; bool damageToCreature; bool mPropertiesChangedSinceLastUpdate; int reduxamount; int flanked; int regenerateTokens; int isToken; int origpower; int basepower;//to keep origpower intact int pbonus; int origtoughness; int basetoughness;//to keep origtoughness intact int tbonus; int isMultiColored; int isLeveler; bool enchanted; int CDenchanted; int CDdamaged; bool blinked; bool isExtraCostTarget; bool morphed; bool turningOver; bool isMorphed; bool isFlipped; string MeldedFrom; bool isPhased; bool isCascaded; int phasedTurn; bool handEffects; bool graveEffects; bool exileEffects; bool suspended; bool miracle; bool hasCopiedToken; bool isBestowed; int chooseacolor; string chooseasubtype; int coinSide;//1 = tails int stillInUse(); int didattacked; int didblocked; int notblocked; int fresh; int MaxLevelUp; int CountedObjects; int kicked; int dredge; bool isDualWielding; bool stillNeeded; Player * lastController; Player * previousController; MTGGameZone * getCurrentZone(); MTGGameZone * previousZone; MTGCardInstance * previous; MTGCardInstance * next; MTGAbility * TokenAndAbility; MTGAbility * GrantedAndAbility; int doDamageTest; bool skipDamageTestOnce; int summoningSickness; ManaCost reducedCost; ManaCost increasedCost; ManaCost * getReducedManaCost(); ManaCost * getIncreasedManaCost(); bool matchesCastFilter(int castMethod); // The recommended method to test for summoning Sickness ! int hasSummoningSickness(); MTGCardInstance * changeController(Player * newcontroller,bool notZone = false); Player * owner; Counters * counters; const string getDisplayName() const; MTGCardInstance * target; Player * playerTarget; vector backupTargets; //types void addType(const string& type_text); virtual void addType(int id); void setType(const string& type_text); void setSubtype(const string &value); int removeType(const string &value, int removeAll = 0); int removeType(int value, int removeAll = 0); //dangerranking is a hint to Ai which creatures are the ones it should be targetting for effects. int DangerRanking(); //Combat bool isBlocked() {return blocked;}; //Blocked this turn or not? MTGCardInstance * defenser; listblockers; int attacker; int toggleDefenser(MTGCardInstance * opponent); int raiseBlockerRankOrder(MTGCardInstance * blocker); //Returns rank of the card in blockers if it is a blocker of this (starting at 1), 0 otherwise int getDefenserRank(MTGCardInstance * blocker); int toggleAttacker(); MTGCardInstance * banding; // If belongs to a band when attacking int canBlock(); int canBlock(MTGCardInstance * opponent); int canAttack(); int isAttacker(); Targetable * isAttacking; MTGCardInstance * storedCard; MTGCardInstance * myPair; MTGCardInstance * createSnapShot(); MTGCardInstance * storedSourceCard; MTGCardInstance * shackled; MTGCardInstance * seized; MTGCardInstance * isDefenser(); int initAttackersDefensers(); MTGCardInstance * getNextOpponent(MTGCardInstance * previous=NULL); int nbOpponents(); int stepPower(CombatStep step); int afterDamage(); int has(int ability); int cleanup(); MTGCard * model; MTGCardInstance(); MTGCardInstance(MTGCard * card, MTGPlayerCards * _belongs_to); int regenerate(); int triggerRegenerate(); Player * controller(); virtual ~MTGCardInstance(); int bury(); int destroy(); int addToToughness(int value); int setToughness(int value); int isSettingBase; vectorprotections; int addProtection(TargetChooser * tc); int removeProtection(TargetChooser *tc, int erase = 0); int protectedAgainst(MTGCardInstance * card); vectorcanttarget; int addCantBeTarget(TargetChooser * tc); int removeCantBeTarget(TargetChooser *tc, int erase = 0); int CantBeTargetby(MTGCardInstance * card); vectorcantBeBlockedBys; vectorcantBeBlockerOfs; vectorcantBeBlockerOfCards; int addCantBeBlockedBy(TargetChooser * tc); int removeCantBeBlockedBy(TargetChooser *tc, int erase = 0); int cantBeBlockedBy(MTGCardInstance * card); int addCantBeBlockerOf(TargetChooser * tc); int removeCantBeBlockerOf(TargetChooser *tc, int erase = 0); int cantBeBlockerOf(MTGCardInstance * card); int addCantBeBlockerOfCard(MTGCardInstance * card); int removeCantBeBlockerOfCard(MTGCardInstance * card, int erase = 0); int cantBeBlockerOfCard(MTGCardInstance * card); void copy(MTGCardInstance * card); void setUntapping(); int isUntapping(); int isTapped(); void untap(); void tap(bool sendNoEvent = false); void attemptUntap(); //cda and other func void stripPTbonus(); void minusPTbonus(int p = 0, int t = 0); void plusPTbonus(int p = 0, int t = 0); void applyPTbonus(); void addcounter(int p = 0, int t = 0); void removecounter(int p = 0, int t = 0); void addptbonus(int p = 0, int t = 0); void removeptbonus(int p = 0, int t = 0); void addbaseP(int p = 0); void addbaseT(int t = 0); void revertbaseP(); void revertbaseT(); int getCurrentPower(); int getCurrentToughness(); int LKIpower; int LKItoughness; int countDuplicateCardNames(); void cdaPT(int p = 0, int t = 0); bool isCDA; void switchPT(bool apply = false); int swapP; int swapT; bool isSwitchedPT; bool isACopier; bool bypassTC; bool discarded; int copiedID; bool StackIsEmptyandSorcerySpeed(); bool isTargetted(); int cardistargetted; bool isTargetter(); int cardistargetter; int myconvertedcost; ManaCost * computeNewCost(MTGCardInstance * card,ManaCost * oldCost, ManaCost * refCost,bool noTrinisphere = false); int countTrini; bool anymanareplacement; vectorimprintedCards; int attackCost; int attackCostBackup; int attackPlaneswalkerCost; int attackPlaneswalkerCostBackup; int blockCost; int blockCostBackup; int imprintG; int imprintU; int imprintR; int imprintB; int imprintW; int canproduceG; int canproduceU; int canproduceR; int canproduceB; int canproduceW; int canproduceC; int entersBattlefield; string currentimprintName; vectorimprintedNames; MTGCardInstance * revealedLast;//last card revealed by a ability this card owns. bool MadnessPlay; void eventattacked(); void eventattackedAlone(); void eventattackednotblocked(); void eventattackedblocked(MTGCardInstance * opponent); void eventblocked(MTGCardInstance * opponent); int isInPlay(GameObserver* game); const string& getSample(); JQuadPtr getIcon(); ostream& toString(ostream&) const; static MTGCardInstance AnyCard; static MTGCardInstance NoCard; bool parseLine(const string& ss); virtual MTGCardInstance* clone(); }; #endif