This commit is contained in:
wrenczes@gmail.com
2011-01-11 09:28:27 +00:00
parent 1c011e568a
commit 85bd7aa145
+119 -112
View File
@@ -1,8 +1,6 @@
#ifndef _MTGABILITY_H_ #ifndef _MTGABILITY_H_
#define _MTGABILITY_H_ #define _MTGABILITY_H_
class MTGCardInstance; class MTGCardInstance;
class Spell; class Spell;
class Damageable; class Damageable;
@@ -40,37 +38,38 @@ using std::map;
#define PARSER_FOREACH 2 #define PARSER_FOREACH 2
#define PARSER_ASLONGAS 3 #define PARSER_ASLONGAS 3
class MTGAbility: public ActionElement{ class MTGAbility: public ActionElement
protected: {
protected:
char menuText[50]; char menuText[50];
GameObserver * game; GameObserver* game;
public: public:
int oneShot; int oneShot;
int forceDestroy; int forceDestroy;
ManaCost * cost; ManaCost* cost;
ManaCost * alternative; ManaCost* alternative;
ManaCost * BuyBack; ManaCost* BuyBack;
ManaCost * FlashBack; ManaCost* FlashBack;
ManaCost * Retrace; ManaCost* Retrace;
Targetable * target; Targetable* target;
int aType; int aType;
int naType; int naType;
int abilitygranted; int abilitygranted;
int nbcardAmount; int nbcardAmount;
MTGCardInstance * source; MTGCardInstance* source;
MTGAbility(int id, MTGCardInstance * card); MTGAbility(int id, MTGCardInstance* card);
MTGAbility(int id, MTGCardInstance * _source, Targetable * _target); MTGAbility(int id, MTGCardInstance* _source, Targetable* _target);
virtual int testDestroy(); virtual int testDestroy();
virtual ~MTGAbility(); virtual ~MTGAbility();
virtual void Render(){}; virtual void Render(){};
virtual int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL){return 0;}; virtual int isReactingToClick(MTGCardInstance* card, ManaCost* mana = NULL){return 0;};
virtual int reactToClick(MTGCardInstance * card){return 0;}; virtual int reactToClick(MTGCardInstance* card){return 0;};
virtual int receiveEvent(WEvent * event){return 0;}; virtual int receiveEvent(WEvent* event){return 0;};
virtual void Update(float dt){}; virtual void Update(float dt){};
virtual int fireAbility(); virtual int fireAbility();
virtual int stillInUse(MTGCardInstance * card); virtual int stillInUse(MTGCardInstance* card);
virtual int resolve(){return 0;}; virtual int resolve(){return 0;};
virtual MTGAbility* clone() const = 0; virtual MTGAbility* clone() const = 0;
virtual ostream& toString(ostream& out) const; virtual ostream& toString(ostream& out) const;
@@ -79,7 +78,8 @@ class MTGAbility: public ActionElement{
/*Poor man's casting */ /*Poor man's casting */
/* Todo replace that crap with dynamic casting */ /* Todo replace that crap with dynamic casting */
enum { enum
{
UNKNOWN = 0, UNKNOWN = 0,
MANA_PRODUCER = 1, MANA_PRODUCER = 1,
MTG_ATTACK_RULE = 2, MTG_ATTACK_RULE = 2,
@@ -106,34 +106,35 @@ class MTGAbility: public ActionElement{
TAPPER = 23, TAPPER = 23,
LIFER = 24, LIFER = 24,
CLONING = 25, CLONING = 25,
}; };
}; };
class NestedAbility{ class NestedAbility
public: {
MTGAbility * ability; public:
NestedAbility(MTGAbility * _ability); MTGAbility* ability;
NestedAbility(MTGAbility* _ability);
}; };
class TriggeredAbility:public MTGAbility{ class TriggeredAbility:public MTGAbility
public: {
TriggeredAbility(int id, MTGCardInstance * card); public:
TriggeredAbility(int id, MTGCardInstance * _source, Targetable * _target); TriggeredAbility(int id, MTGCardInstance* card);
TriggeredAbility(int id, MTGCardInstance* _source, Targetable* _target);
virtual void Update(float dt); virtual void Update(float dt);
virtual void Render(){}; virtual void Render(){};
virtual int trigger(){return 0;}; virtual int trigger(){return 0;};
virtual int triggerOnEvent(WEvent * e){return 0;}; virtual int triggerOnEvent(WEvent* e){return 0;};
int receiveEvent(WEvent * e); int receiveEvent(WEvent* e);
virtual int resolve() = 0; virtual int resolve() = 0;
virtual TriggeredAbility* clone() const = 0; virtual TriggeredAbility* clone() const = 0;
virtual ostream& toString(ostream& out) const; virtual ostream& toString(ostream& out) const;
}; };
class ActivatedAbility:public MTGAbility{ class ActivatedAbility:public MTGAbility
public: {
public:
enum { enum {
NO_RESTRICTION = 0, NO_RESTRICTION = 0,
PLAYER_TURN_ONLY = 1, PLAYER_TURN_ONLY = 1,
@@ -186,163 +187,169 @@ class ActivatedAbility:public MTGAbility{
CLEANUP = 56, CLEANUP = 56,
AFTER_EOT = 57, AFTER_EOT = 57,
}; };
ManaCost * abilityCost; ManaCost* abilityCost;
int restrictions; int restrictions;
int needsTapping; int needsTapping;
ActivatedAbility(int id, MTGCardInstance * card,ManaCost * _cost = NULL, int _restrictions = NO_RESTRICTION,int tap = 1); ActivatedAbility(int id, MTGCardInstance* card,ManaCost* _cost = NULL, int _restrictions = NO_RESTRICTION,int tap = 1);
virtual ~ActivatedAbility(); virtual ~ActivatedAbility();
virtual int reactToClick(MTGCardInstance * card); virtual int reactToClick(MTGCardInstance* card);
virtual int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL); virtual int isReactingToClick(MTGCardInstance* card, ManaCost* mana = NULL);
virtual int reactToTargetClick(Targetable * object); virtual int reactToTargetClick(Targetable* object);
virtual int resolve() = 0; virtual int resolve() = 0;
virtual ActivatedAbility* clone() const = 0; virtual ActivatedAbility* clone() const = 0;
virtual ostream& toString(ostream& out) const; virtual ostream& toString(ostream& out) const;
}; };
class TargetAbility:public ActivatedAbility, public NestedAbility{ class TargetAbility:public ActivatedAbility, public NestedAbility
public: {
TargetAbility(int id, MTGCardInstance * card, TargetChooser * _tc,ManaCost * _cost = NULL, int _playerturnonly = 0,int tap = 1); public:
TargetAbility(int id, MTGCardInstance * card,ManaCost * _cost = NULL, int _playerturnonly = 0,int tap = 1); TargetAbility(int id, MTGCardInstance* card, TargetChooser* _tc,ManaCost* _cost = NULL, int _playerturnonly = 0,int tap = 1);
virtual int reactToClick(MTGCardInstance * card); TargetAbility(int id, MTGCardInstance* card,ManaCost* _cost = NULL, int _playerturnonly = 0,int tap = 1);
virtual int reactToTargetClick(Targetable * object); virtual int reactToClick(MTGCardInstance* card);
virtual int reactToTargetClick(Targetable* object);
virtual TargetAbility* clone() const = 0; virtual TargetAbility* clone() const = 0;
virtual void Render(); virtual void Render();
virtual int resolve(); virtual int resolve();
virtual const char * getMenuText(); virtual const char* getMenuText();
virtual ostream& toString(ostream& out) const; virtual ostream& toString(ostream& out) const;
~TargetAbility(); ~TargetAbility();
}; };
class InstantAbility:public MTGAbility{ class InstantAbility:public MTGAbility
public: {
public:
int init; int init;
virtual void Update(float dt); virtual void Update(float dt);
virtual int testDestroy(); virtual int testDestroy();
InstantAbility(int _id, MTGCardInstance * source); InstantAbility(int _id, MTGCardInstance* source);
InstantAbility(int _id, MTGCardInstance * source,Damageable * _target); InstantAbility(int _id, MTGCardInstance* source,Damageable* _target);
virtual int resolve(){return 0;}; virtual int resolve(){return 0;};
virtual InstantAbility* clone() const = 0; virtual InstantAbility* clone() const = 0;
virtual ostream& toString(ostream& out) const; virtual ostream& toString(ostream& out) const;
}; };
/* State based effects. This class works ONLY for InPlay and needs to be extended for other areas of the game !!! */ /* State based effects. This class works ONLY for InPlay and needs to be extended for other areas of the game !!! */
class ListMaintainerAbility:public MTGAbility{ class ListMaintainerAbility:public MTGAbility
public: {
public:
map<MTGCardInstance *,bool> cards; map<MTGCardInstance *,bool> cards;
map<Player *,bool> players; map<Player *,bool> players;
ListMaintainerAbility(int _id):MTGAbility(_id,NULL){}; ListMaintainerAbility(int _id):MTGAbility(_id,NULL){};
ListMaintainerAbility(int _id, MTGCardInstance *_source):MTGAbility(_id, _source){}; ListMaintainerAbility(int _id, MTGCardInstance *_source):MTGAbility(_id, _source){};
ListMaintainerAbility(int _id, MTGCardInstance *_source,Damageable * _target):MTGAbility(_id, _source, _target){}; ListMaintainerAbility(int _id, MTGCardInstance *_source,Damageable* _target):MTGAbility(_id, _source, _target){};
virtual void Update(float dt); virtual void Update(float dt);
void updateTargets(); void updateTargets();
virtual bool canTarget(MTGGameZone * zone); virtual bool canTarget(MTGGameZone* zone);
virtual int canBeInList(MTGCardInstance * card) = 0; virtual int canBeInList(MTGCardInstance* card) = 0;
virtual int added(MTGCardInstance * card) = 0; virtual int added(MTGCardInstance* card) = 0;
virtual int removed(MTGCardInstance * card) = 0; virtual int removed(MTGCardInstance* card) = 0;
virtual int canBeInList(Player * p){return 0;}; virtual int canBeInList(Player* p){return 0;};
virtual int added(Player * p){return 0;}; virtual int added(Player* p){return 0;};
virtual int removed(Player * p){return 0;}; virtual int removed(Player* p){return 0;};
virtual int destroy(); virtual int destroy();
virtual ListMaintainerAbility* clone() const = 0; virtual ListMaintainerAbility* clone() const = 0;
virtual ostream& toString(ostream& out) const; virtual ostream& toString(ostream& out) const;
}; };
class TriggerAtPhase:public TriggeredAbility{ class TriggerAtPhase:public TriggeredAbility
public: {
public:
int phaseId; int phaseId;
int who; int who;
TriggerAtPhase(int id, MTGCardInstance * source, Targetable * target,int _phaseId, int who = 0); TriggerAtPhase(int id, MTGCardInstance* source, Targetable* target,int _phaseId, int who = 0);
virtual int trigger(); virtual int trigger();
int resolve(){return 0;}; int resolve(){return 0;};
virtual TriggerAtPhase* clone() const; virtual TriggerAtPhase* clone() const;
}; };
class TriggerNextPhase:public TriggerAtPhase{ class TriggerNextPhase:public TriggerAtPhase
public: {
public:
int destroyActivated; int destroyActivated;
TriggerNextPhase(int id, MTGCardInstance * source, Targetable * target,int _phaseId, int who = 0); TriggerNextPhase(int id, MTGCardInstance* source, Targetable* target,int _phaseId, int who = 0);
virtual TriggerNextPhase* clone() const; virtual TriggerNextPhase* clone() const;
virtual int testDestroy(); virtual int testDestroy();
}; };
class GenericTriggeredAbility:public TriggeredAbility, public NestedAbility{ class GenericTriggeredAbility:public TriggeredAbility, public NestedAbility
public: {
TriggeredAbility * t; public:
TriggeredAbility* t;
queue<Targetable *> targets; queue<Targetable *> targets;
MTGAbility * destroyCondition; MTGAbility* destroyCondition;
GenericTriggeredAbility(int id, MTGCardInstance * _source, TriggeredAbility * _t, MTGAbility * a,MTGAbility * dc = NULL, Targetable * _target = NULL); GenericTriggeredAbility(int id, MTGCardInstance* _source, TriggeredAbility* _t, MTGAbility* a,MTGAbility* dc = NULL, Targetable* _target = NULL);
virtual int trigger(); virtual int trigger();
virtual int triggerOnEvent(WEvent * e); virtual int triggerOnEvent(WEvent* e);
virtual int resolve(); virtual int resolve();
virtual int testDestroy(); virtual int testDestroy();
Targetable * getTriggerTarget(WEvent * e, MTGAbility * a); Targetable* getTriggerTarget(WEvent* e, MTGAbility* a);
void setTriggerTargets(Targetable * ta, MTGAbility * a); void setTriggerTargets(Targetable* ta, MTGAbility* a);
void Update(float dt); void Update(float dt);
virtual GenericTriggeredAbility* clone() const; virtual GenericTriggeredAbility* clone() const;
const char * getMenuText(); const char* getMenuText();
~GenericTriggeredAbility(); ~GenericTriggeredAbility();
}; };
/* Ability Factory */ /* Ability Factory */
class AbilityFactory{ class AbilityFactory
private: {
int countCards(TargetChooser * tc, Player * player = NULL, int option = 0); private:
TriggeredAbility * parseTrigger(string s, string magicText, int id, Spell * spell, MTGCardInstance *card, Targetable * target); int countCards(TargetChooser* tc, Player* player = NULL, int option = 0);
TriggeredAbility* parseTrigger(string s, string magicText, int id, Spell* spell, MTGCardInstance *card, Targetable* target);
int parseRestriction(string s); int parseRestriction(string s);
MTGAbility * getAlternateCost( string s, int id, Spell *spell, MTGCardInstance *card ); MTGAbility* getAlternateCost( string s, int id, Spell *spell, MTGCardInstance *card );
MTGAbility * getManaReduxAbility(string s, int id, Spell *spell, MTGCardInstance *card, MTGCardInstance *target); MTGAbility* getManaReduxAbility(string s, int id, Spell *spell, MTGCardInstance *card, MTGCardInstance *target);
public: public:
Counter * parseCounter(string s, MTGCardInstance * target, Spell * spell = NULL); Counter* parseCounter(string s, MTGCardInstance* target, Spell* spell = NULL);
int parsePowerToughness(string s, int *power, int *toughness); int parsePowerToughness(string s, int* power, int* toughness);
int getAbilities(vector<MTGAbility *> * v, Spell * spell, MTGCardInstance * card = NULL, int id = 0,MTGGameZone * dest = NULL); int getAbilities(vector<MTGAbility *>* v, Spell* spell, MTGCardInstance* card = NULL, int id = 0,MTGGameZone* dest = NULL);
MTGAbility * parseMagicLine(string s, int id, Spell * spell, MTGCardInstance *card, int activated = 0, int forceUEOT = 0,int oneShot = 0,int forceForever = 0, MTGGameZone * dest = NULL); MTGAbility* parseMagicLine(string s, int id, Spell* spell, MTGCardInstance *card, int activated = 0, int forceUEOT = 0,int oneShot = 0,int forceForever = 0, MTGGameZone* dest = NULL);
int abilityEfficiency(MTGAbility * a, Player * p, int mode = MODE_ABILITY, TargetChooser * tc = NULL); int abilityEfficiency(MTGAbility* a, Player* p, int mode = MODE_ABILITY, TargetChooser* tc = NULL);
int magicText(int id, Spell * spell, MTGCardInstance * card = NULL, int mode = MODE_PUTINTOPLAY, TargetChooser * tc = NULL, MTGGameZone * dest = NULL); int magicText(int id, Spell* spell, MTGCardInstance* card = NULL, int mode = MODE_PUTINTOPLAY, TargetChooser* tc = NULL, MTGGameZone* dest = NULL);
static int computeX(Spell * spell, MTGCardInstance * card); static int computeX(Spell* spell, MTGCardInstance* card);
static int computeXX(Spell * spell, MTGCardInstance * card); static int computeXX(Spell* spell, MTGCardInstance* card);
static MTGAbility * getCoreAbility(MTGAbility * a); static MTGAbility* getCoreAbility(MTGAbility* a);
int destroyAllInPlay(TargetChooser * tc, int bury = 0); int destroyAllInPlay(TargetChooser* tc, int bury = 0);
int moveAll(TargetChooser * tc, string destinationZone); int moveAll(TargetChooser* tc, string destinationZone);
int damageAll(TargetChooser * tc, int damage); int damageAll(TargetChooser* tc, int damage);
int TapAll(TargetChooser * tc); int TapAll(TargetChooser* tc);
int UntapAll(TargetChooser * tc); int UntapAll(TargetChooser* tc);
void addAbilities(int _id, Spell * spell); void addAbilities(int _id, Spell* spell);
}; };
class ActivatedAbilityTP:public ActivatedAbility{ class ActivatedAbilityTP:public ActivatedAbility
{
public: public:
int who; int who;
ActivatedAbilityTP(int id, MTGCardInstance * card, Targetable * _target = NULL, ManaCost * cost=NULL, int doTap = 0, int who = TargetChooser::UNSET); ActivatedAbilityTP(int id, MTGCardInstance* card, Targetable* _target = NULL, ManaCost* cost=NULL, int doTap = 0, int who = TargetChooser::UNSET);
Targetable * getTarget(); Targetable* getTarget();
}; };
class AManaProducer: public ActivatedAbilityTP{ class AManaProducer: public ActivatedAbilityTP
protected: {
protected:
string menutext; string menutext;
Player * controller; Player* controller;
public: public:
ManaCost * output; ManaCost* output;
int tap; int tap;
AManaProducer(int id, MTGCardInstance * card, Targetable * t, ManaCost * _output, ManaCost * _cost = NULL, int doTap = 1, int who = TargetChooser::UNSET ); AManaProducer(int id, MTGCardInstance* card, Targetable* t, ManaCost* _output, ManaCost* _cost = NULL, int doTap = 1, int who = TargetChooser::UNSET);
int isReactingToClick(MTGCardInstance * _card, ManaCost * mana = NULL); int isReactingToClick(MTGCardInstance* _card, ManaCost* mana = NULL);
int resolve(); int resolve();
int reactToClick(MTGCardInstance * _card); int reactToClick(MTGCardInstance* _card);
const char * getMenuText(); const char* getMenuText();
~AManaProducer(); ~AManaProducer();
virtual AManaProducer * clone() const; virtual AManaProducer* clone() const;
}; };
#include "MTGCardInstance.h"
#endif #endif