diff --git a/projects/mtg/include/ManaCost.h b/projects/mtg/include/ManaCost.h index 11b6ef38c..4090ffd66 100644 --- a/projects/mtg/include/ManaCost.h +++ b/projects/mtg/include/ManaCost.h @@ -14,76 +14,79 @@ class Player; class ManaCost{ - friend std::ostream& operator<<(std::ostream& out, ManaCost& m); - friend std::ostream& operator<<(std::ostream& out, ManaCost* m); - friend std::ostream& operator<<(std::ostream& out, ManaCost m); + friend std::ostream& operator<<(std::ostream& out, ManaCost& m); + friend std::ostream& operator<<(std::ostream& out, ManaCost* m); + friend std::ostream& operator<<(std::ostream& out, ManaCost m); - protected: - int cost[Constants::MTG_NB_COLORS+1]; - ManaCostHybrid * hybrids[10]; - unsigned int nbhybrids; - int extraCostsIsCopy; - - public: - enum{ - MANA_UNPAID = 0, - MANA_PAID = 1, - MANA_PAID_WITH_KICKER = 2, - MANA_PAID_WITH_ALTERNATIVE = 3, - MANA_PAID_WITH_BUYBACK = 4, - MANA_PAID_WITH_FLASHBACK = 5, - MANA_PAID_WITH_RETRACE = 6, - MANA_PAID_WITH_MORPH = 7 +protected: + int cost[Constants::MTG_NB_COLORS+1]; + ManaCostHybrid * hybrids[10]; + unsigned int nbhybrids; + int extraCostsIsCopy; - }; - ExtraCosts * extraCosts; - ManaCost * kicker; - ManaCost * alternative; - ManaCost * BuyBack; - ManaCost * FlashBack; - ManaCost * Retrace; - ManaCost * morph; - static ManaCost * parseManaCost(string value, ManaCost * _manacost = NULL, MTGCardInstance * c = NULL); - virtual void init(); - void x(); - int hasX(); - ManaCost(int _cost[], int nb_elems = 1); - ManaCost(); - ~ManaCost(); - ManaCost(ManaCost * _manaCost); - void copy (ManaCost * _manaCost); - int isNull(); - int getConvertedCost(); - string toString(); - int getCost(int color); - //Returns NULL if i is greater than nbhybrids - ManaCostHybrid * getHybridCost(unsigned int i); - int hasColor(int color); - int remove (int color, int value); - int add(int color, int value); +public: + enum{ + MANA_UNPAID = 0, + MANA_PAID = 1, + MANA_PAID_WITH_KICKER = 2, + MANA_PAID_WITH_ALTERNATIVE = 3, + MANA_PAID_WITH_BUYBACK = 4, + MANA_PAID_WITH_FLASHBACK = 5, + MANA_PAID_WITH_RETRACE = 6, + MANA_PAID_WITH_MORPH = 7 - // - // Extra Costs (sacrifice,counters...) - // - int addExtraCost(ExtraCost * _cost); - int setExtraCostsAction(MTGAbility * action, MTGCardInstance * card); - int isExtraPaymentSet(); - int canPayExtra(); - int doPayExtra(); + }; + ExtraCosts * extraCosts; + ManaCost * kicker; + ManaCost * alternative; + ManaCost * BuyBack; + ManaCost * FlashBack; + ManaCost * Retrace; + ManaCost * morph; + static ManaCost * parseManaCost(string value, ManaCost * _manacost = NULL, MTGCardInstance * c = NULL); + virtual void init(); + void x(); + int hasX(); + ManaCost(int _cost[], int nb_elems = 1); + ManaCost(); + ~ManaCost(); + ManaCost(ManaCost * _manaCost); + ManaCost(const ManaCost& manaCost); + ManaCost& operator= (const ManaCost& manaCost); + void copy (ManaCost * _manaCost); + int isNull(); + int getConvertedCost(); + string toString(); + int getCost(int color); + //Returns NULL if i is greater than nbhybrids + ManaCostHybrid * getHybridCost(unsigned int i); + int hasColor(int color); + int remove (int color, int value); + int add(int color, int value); - int addHybrid(int c1, int v1, int c2, int v2); - int tryToPayHybrids(ManaCostHybrid * _hybrids[], int _nbhybrids, int diff[]); - void randomDiffHybrids(ManaCost * _cost, int diff[]); - int add(ManaCost * _cost); - int pay (ManaCost * _cost); + // + // Extra Costs (sacrifice,counters...) + // + int addExtraCost(ExtraCost * _cost); + int setExtraCostsAction(MTGAbility * action, MTGCardInstance * card); + int isExtraPaymentSet(); + int canPayExtra(); + int doPayExtra(); - //return 1 if _cost can be paid with current data, 0 otherwise - int canAfford(ManaCost * _cost); + int addHybrid(int c1, int v1, int c2, int v2); + int tryToPayHybrids(ManaCostHybrid * _hybrids[], int _nbhybrids, int diff[]); + int tryToPayHybrids(vector hybridList, int diff[]); + void randomDiffHybrids(ManaCost * _cost, int diff[]); + int add(ManaCost * _cost); + int pay (ManaCost * _cost); - int isPositive(); - ManaCost * Diff(ManaCost * _cost); + //return 1 if _cost can be paid with current data, 0 otherwise + int canAfford(ManaCost * _cost); + + int isPositive(); + ManaCost * Diff(ManaCost * _cost); #ifdef WIN32 - void Dump(); + void Dump(); #endif @@ -91,15 +94,15 @@ class ManaCost{ class ManaPool:public ManaCost{ protected: - Player * player; + Player * player; public: - void init(); - ManaPool(Player * player); - ManaPool(ManaCost * _manaCost, Player * player); - int remove (int color, int value); - int add(int color, int value, MTGCardInstance * source = NULL); - int add(ManaCost * _cost, MTGCardInstance * source = NULL); - int pay (ManaCost * _cost); + void init(); + ManaPool(Player * player); + ManaPool(ManaCost * _manaCost, Player * player); + int remove (int color, int value); + int add(int color, int value, MTGCardInstance * source = NULL); + int add(ManaCost * _cost, MTGCardInstance * source = NULL); + int pay (ManaCost * _cost); }; #endif diff --git a/projects/mtg/src/ManaCost.cpp b/projects/mtg/src/ManaCost.cpp index 0ab72045c..16363964c 100644 --- a/projects/mtg/src/ManaCost.cpp +++ b/projects/mtg/src/ManaCost.cpp @@ -234,13 +234,72 @@ ManaCost::ManaCost(int _cost[], int nb_elems) } -ManaCost::ManaCost(ManaCost * _manaCost) +ManaCost::ManaCost(ManaCost * manaCost) { init(); for (int i = 0; i <= Constants::MTG_NB_COLORS; i++) { - cost[i] = _manaCost->getCost(i); + cost[i] = manaCost->getCost(i); } + for (int i = 0 ; i < 10; i++) + hybrids[i] = manaCost->hybrids[i]; + + nbhybrids = manaCost->nbhybrids; + kicker = manaCost->kicker; + Retrace = manaCost->Retrace; + BuyBack = manaCost->BuyBack; + alternative = manaCost->alternative; + FlashBack = manaCost->FlashBack; + extraCosts = manaCost->extraCosts; + morph = manaCost->morph; + extraCostsIsCopy = manaCost->extraCostsIsCopy; +} + +// Copy Constructor + +ManaCost::ManaCost(const ManaCost& manaCost) +{ + + for (int i = 0; i <= Constants::MTG_NB_COLORS; i++) + { + cost[i] = manaCost.cost[i]; + } + for (int i = 0 ; i < 10; i++) + hybrids[i] = manaCost.hybrids[i]; + + nbhybrids = manaCost.nbhybrids; + kicker = manaCost.kicker; + Retrace = manaCost.Retrace; + BuyBack = manaCost.BuyBack; + alternative = manaCost.alternative; + FlashBack = manaCost.FlashBack; + morph = manaCost.morph; + extraCosts = manaCost.extraCosts; + extraCostsIsCopy = manaCost.extraCostsIsCopy; +} + +// operator= +ManaCost & ManaCost::operator= (const ManaCost & manaCost) +{ + if ( this != &manaCost ) + { + int * new_array = new int[Constants::MTG_NB_COLORS]; + std::memcpy(cost, manaCost.cost, sizeof(new_array)); + for (int i = 0 ; i < 10; i++) + hybrids[i] = manaCost.hybrids[i]; + SAFE_DELETE_ARRAY( new_array ); + + nbhybrids = manaCost.nbhybrids; + kicker = manaCost.kicker; + Retrace = manaCost.Retrace; + BuyBack = manaCost.BuyBack; + alternative = manaCost.alternative; + FlashBack = manaCost.FlashBack; + morph = manaCost.morph; + extraCosts = manaCost.extraCosts; + extraCostsIsCopy = manaCost.extraCostsIsCopy; + } + return *this; } ManaCost::~ManaCost() @@ -249,6 +308,7 @@ ManaCost::~ManaCost() { SAFE_DELETE(hybrids[i]); } + SAFE_DELETE(extraCosts); SAFE_DELETE(kicker); SAFE_DELETE(alternative); @@ -543,7 +603,16 @@ void ManaCost::randomDiffHybrids(ManaCost * _cost, int diff[]) diff[h->color1 * 2 + 1] -= h->value1; } } +int ManaCost::tryToPayHybrids(vector hybridList, int diff[]) +{ + if (hybridList.empty()) + return 1; +} + +/** + starting from the end of the array (diff) +*/ int ManaCost::tryToPayHybrids(ManaCostHybrid * _hybrids[], int _nbhybrids, int diff[]) { if (!_nbhybrids)