Laurent - Added deluge (10E) also added "all" to the tap parser, tested and work, not compatible with cost at the moment. Test suite before R486 was running fine on this update.

This commit is contained in:
wagic.laurent
2009-06-17 20:50:21 +00:00
parent 53b1b5e9ec
commit ba83a42fa4
4 changed files with 303 additions and 282 deletions
+10
View File
@@ -486,6 +486,16 @@ type=Sorcery
mana={B} mana={B}
[/card] [/card]
[card] [card]
text=Tap all creatures without flying.
id=135223
name=Deluge
auto=tap all(creature[-flying])
rarity=U
color=Blue
type=Instant
mana={2}{U}
[/card]
[card]
text=Destroy target artifact or land. text=Destroy target artifact or land.
target=artifact,land target=artifact,land
auto=destroy auto=destroy
-9
View File
@@ -311,15 +311,6 @@ mana={3}{U}
subtype=Aura subtype=Aura
[/card] [/card]
[card] [card]
text=Tap all creatures without flying.
id=135223
name=Deluge
rarity=U
color=Blue
type=Instant
mana={2}{U}
[/card]
[card]
text=When Denizen of the Deep comes into play, return each other creature you control to its owner's hand. text=When Denizen of the Deep comes into play, return each other creature you control to its owner's hand.
id=135250 id=135250
name=Denizen of the Deep name=Denizen of the Deep
+270 -269
View File
@@ -1,269 +1,270 @@
#ifndef _MTGABILITY_H_ #ifndef _MTGABILITY_H_
#define _MTGABILITY_H_ #define _MTGABILITY_H_
class MTGCardInstance; class MTGCardInstance;
class GameObserver; class GameObserver;
class Spell; class Spell;
class Damageable; class Damageable;
class PlayGuiObject; class PlayGuiObject;
class TargetChooser; class TargetChooser;
class ManaCost; class ManaCost;
class MTGGameZone; class MTGGameZone;
class Player; class Player;
class AManaProducer; class AManaProducer;
class WEvent; class WEvent;
#include "ActionElement.h" #include "ActionElement.h"
#include <string> #include <string>
#include <map> #include <map>
#include <hge/hgeparticle.h> #include <hge/hgeparticle.h>
using std::string; using std::string;
using std::map; using std::map;
//Two stupid variables used to give a hint to the AI: //Two stupid variables used to give a hint to the AI:
// Should I cast a spell on an enemy or friendly unit ? // Should I cast a spell on an enemy or friendly unit ?
#define BAKA_EFFECT_GOOD 1 #define BAKA_EFFECT_GOOD 1
#define BAKA_EFFECT_BAD -1 #define BAKA_EFFECT_BAD -1
#define BAKA_EFFECT_DONTKNOW 0 #define BAKA_EFFECT_DONTKNOW 0
#define COUNT_POWER 1 #define COUNT_POWER 1
#define PARSER_LORD 1 #define PARSER_LORD 1
#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[25]; char menuText[25];
GameObserver * game; GameObserver * game;
public: public:
int forceDestroy; int forceDestroy;
ManaCost * cost; ManaCost * cost;
Damageable * target; Damageable * target;
int aType; int aType;
MTGCardInstance * source; MTGCardInstance * source;
MTGAbility(int id, MTGCardInstance * card); MTGAbility(int id, MTGCardInstance * card);
MTGAbility(int id, MTGCardInstance * _source, Damageable * _target); MTGAbility(int id, MTGCardInstance * _source, Damageable * _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){if (card==source) return 1; return 0;}; virtual int stillInUse(MTGCardInstance * card){if (card==source) return 1; return 0;};
virtual int resolve(){return 0;}; virtual int resolve(){return 0;};
virtual ostream& toString(ostream& out) const; virtual ostream& toString(ostream& out) const;
/*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,
DAMAGER = 3, DAMAGER = 3,
STANDARD_REGENERATE = 4, STANDARD_REGENERATE = 4,
PUT_INTO_PLAY = 5, PUT_INTO_PLAY = 5,
MOMIR = 6, MOMIR = 6,
MTG_BLOCK_RULE = 7, MTG_BLOCK_RULE = 7,
}; };
}; };
class TriggeredAbility:public MTGAbility{ class TriggeredAbility:public MTGAbility{
public: public:
TriggeredAbility(int id, MTGCardInstance * card); TriggeredAbility(int id, MTGCardInstance * card);
TriggeredAbility(int id, MTGCardInstance * _source, Damageable * _target); TriggeredAbility(int id, MTGCardInstance * _source, Damageable * _target);
virtual void Update(float dt); virtual void Update(float dt);
virtual void Render(){}; virtual void Render(){};
virtual int trigger()=0; virtual int trigger()=0;
virtual int resolve() = 0; virtual int resolve() = 0;
virtual ostream& toString(ostream& out) const; virtual ostream& toString(ostream& out) const;
}; };
class ActivatedAbility:public MTGAbility{ class ActivatedAbility:public MTGAbility{
public: public:
int playerturnonly; int playerturnonly;
int needsTapping; int needsTapping;
ActivatedAbility(int id, MTGCardInstance * card,ManaCost * _cost = NULL, int _playerturnonly = 0,int tap = 1); ActivatedAbility(int id, MTGCardInstance * card,ManaCost * _cost = NULL, int _playerturnonly = 0,int tap = 1);
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 ostream& toString(ostream& out) const; virtual ostream& toString(ostream& out) const;
}; };
class TargetAbility:public ActivatedAbility{ class TargetAbility:public ActivatedAbility{
public: public:
TargetAbility(int id, MTGCardInstance * card, TargetChooser * _tc,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);
TargetAbility(int id, MTGCardInstance * card,ManaCost * _cost = NULL, int _playerturnonly = 0,int tap = 1); TargetAbility(int id, MTGCardInstance * card,ManaCost * _cost = NULL, int _playerturnonly = 0,int tap = 1);
virtual void Update(float dt); virtual void Update(float dt);
virtual int reactToClick(MTGCardInstance * card); virtual int reactToClick(MTGCardInstance * card);
virtual int reactToTargetClick(Targetable * object); virtual int reactToTargetClick(Targetable * object);
virtual void Render(); virtual void Render();
virtual ostream& toString(ostream& out) const; virtual ostream& toString(ostream& out) const;
}; };
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 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;
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);
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 destroy(); virtual int destroy();
virtual ostream& toString(ostream& out) const; virtual ostream& toString(ostream& out) const;
}; };
/* An attempt to globalize triggered abilities as much as possible */ /* An attempt to globalize triggered abilities as much as possible */
class MTGAbilityBasicFeatures{ class MTGAbilityBasicFeatures{
public: public:
Damageable * target; Damageable * target;
GameObserver * game; GameObserver * game;
MTGCardInstance * source; MTGCardInstance * source;
MTGAbilityBasicFeatures(); MTGAbilityBasicFeatures();
MTGAbilityBasicFeatures(MTGCardInstance * _source, Damageable * _target = NULL); MTGAbilityBasicFeatures(MTGCardInstance * _source, Damageable * _target = NULL);
void init(MTGCardInstance * _source, Damageable * _target = NULL); void init(MTGCardInstance * _source, Damageable * _target = NULL);
}; };
class Trigger:public MTGAbilityBasicFeatures{ class Trigger:public MTGAbilityBasicFeatures{
public: public:
virtual int trigger()=0; virtual int trigger()=0;
virtual int testDestroy(){return 0;}; virtual int testDestroy(){return 0;};
}; };
class TriggerAtPhase:public Trigger{ class TriggerAtPhase:public Trigger{
public: public:
int currentPhase, newPhase; int currentPhase, newPhase;
int phaseId; int phaseId;
TriggerAtPhase(int _phaseId); TriggerAtPhase(int _phaseId);
virtual int trigger(); virtual int trigger();
}; };
class TriggerNextPhase:public TriggerAtPhase{ class TriggerNextPhase:public TriggerAtPhase{
public: public:
int destroyActivated; int destroyActivated;
TriggerNextPhase(int _phaseId); TriggerNextPhase(int _phaseId);
virtual int testDestroy(); virtual int testDestroy();
}; };
class TriggeredEvent:public MTGAbilityBasicFeatures{ class TriggeredEvent:public MTGAbilityBasicFeatures{
public: public:
TriggeredEvent(); TriggeredEvent();
TriggeredEvent(MTGCardInstance * source, Damageable * target = NULL); TriggeredEvent(MTGCardInstance * source, Damageable * target = NULL);
virtual int resolve()=0; virtual int resolve()=0;
}; };
class DrawEvent:public TriggeredEvent{ class DrawEvent:public TriggeredEvent{
public: public:
Player * player; Player * player;
int nbcards; int nbcards;
DrawEvent(Player * _player, int _nbcards); DrawEvent(Player * _player, int _nbcards);
int resolve(); int resolve();
}; };
class BuryEvent: public TriggeredEvent{ class BuryEvent: public TriggeredEvent{
public: public:
int resolve(); int resolve();
}; };
class DamageEvent:public TriggeredEvent{ class DamageEvent:public TriggeredEvent{
public: public:
int damage; int damage;
DamageEvent(MTGCardInstance * _source, Damageable * _target, int _damage); DamageEvent(MTGCardInstance * _source, Damageable * _target, int _damage);
int resolve(); int resolve();
}; };
class DestroyCondition:public MTGAbilityBasicFeatures{ class DestroyCondition:public MTGAbilityBasicFeatures{
public: public:
virtual int testDestroy(); virtual int testDestroy();
}; };
class GenericTriggeredAbility:public TriggeredAbility{ class GenericTriggeredAbility:public TriggeredAbility{
public: public:
Trigger * t; Trigger * t;
TriggeredEvent * te; TriggeredEvent * te;
DestroyCondition * dc; DestroyCondition * dc;
GenericTriggeredAbility(int id, MTGCardInstance * _source, Trigger * _t, TriggeredEvent * _te, DestroyCondition * _dc = NULL, Damageable * _target = NULL); GenericTriggeredAbility(int id, MTGCardInstance * _source, Trigger * _t, TriggeredEvent * _te, DestroyCondition * _dc = NULL, Damageable * _target = NULL);
virtual int trigger(); virtual int trigger();
virtual int resolve(); virtual int resolve();
virtual int testDestroy(); virtual int testDestroy();
~GenericTriggeredAbility(); ~GenericTriggeredAbility();
}; };
/* Ability Factory */ /* Ability Factory */
class AbilityFactory{ class AbilityFactory{
private: private:
int countCards(TargetChooser * tc, Player * player = NULL, int option = 0); int countCards(TargetChooser * tc, Player * player = NULL, int option = 0);
int putInPlayFromZone(MTGCardInstance * card, MTGGameZone * zone, Player * p); int putInPlayFromZone(MTGCardInstance * card, MTGGameZone * zone, Player * p);
int parsePowerToughness(string s, int *power, int *toughness); int parsePowerToughness(string s, int *power, int *toughness);
Trigger * parseTrigger(string magicText); Trigger * parseTrigger(string magicText);
Damageable * parseCollateralTarget(MTGCardInstance * card, string s); Damageable * parseCollateralTarget(MTGCardInstance * card, string s);
public: public:
int magicText(int id, Spell * spell, MTGCardInstance * card = NULL); int magicText(int id, Spell * spell, MTGCardInstance * card = NULL);
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);
void addAbilities(int _id, Spell * spell); int TapAll(TargetChooser * tc);
}; void addAbilities(int _id, Spell * spell);
};
class AManaProducer: public MTGAbility{
protected: class AManaProducer: public MTGAbility{
protected:
ManaCost * cost;
ManaCost * output; ManaCost * cost;
string menutext; ManaCost * output;
float x0,y0,x1,y1,x,y; string menutext;
float animation; float x0,y0,x1,y1,x,y;
Player * controller; float animation;
int tap; Player * controller;
int tap;
hgeParticleSystem * mParticleSys;
public: hgeParticleSystem * mParticleSys;
static int currentlyTapping; public:
AManaProducer(int id, MTGCardInstance * card, ManaCost * _output, ManaCost * _cost = NULL, int doTap = 1 ); static int currentlyTapping;
void Update(float dt); AManaProducer(int id, MTGCardInstance * card, ManaCost * _output, ManaCost * _cost = NULL, int doTap = 1 );
void Render(); void Update(float dt);
int isReactingToClick(MTGCardInstance * _card, ManaCost * mana = NULL); void Render();
int resolve(); int isReactingToClick(MTGCardInstance * _card, ManaCost * mana = NULL);
int reactToClick(MTGCardInstance * _card); int resolve();
const char * getMenuText(); int reactToClick(MTGCardInstance * _card);
int testDestroy(); const char * getMenuText();
~AManaProducer(); int testDestroy();
virtual ostream& toString(ostream& out) const; ~AManaProducer();
}; virtual ostream& toString(ostream& out) const;
};
#include "MTGCardInstance.h"
#include "MTGCardInstance.h"
#endif
#endif
+23 -4
View File
@@ -87,6 +87,21 @@ int AbilityFactory::moveAll(TargetChooser * tc, string destinationZone){
} }
int AbilityFactory::TapAll(TargetChooser * tc){
MTGCardInstance * source = tc->source;
tc->source = NULL; // This is to prevent protection from...
GameObserver * g = GameObserver::GetInstance();
for (int i = 0; i < 2 ; i++){
for (int j = g->players[i]->game->inPlay->nb_cards-1; j >=0 ; j--){
MTGCardInstance * current = g->players[i]->game->inPlay->cards[j];
if (tc->canTarget(current)){
current->tapped = 1;
}
}
}
tc->source = source; //restore source
return 1;
}
int AbilityFactory::putInPlayFromZone(MTGCardInstance * card, MTGGameZone * zone, Player * p){ int AbilityFactory::putInPlayFromZone(MTGCardInstance * card, MTGGameZone * zone, Player * p){
@@ -931,10 +946,14 @@ int AbilityFactory::magicText(int id, Spell * spell, MTGCardInstance * card){
break; break;
} }
if (tc){ if (tc){
game->addObserver(NEW ATapper(id, card, cost, tc)); if (all){
}else{ TapAll(tc);
target->tapped = 1; }else{
} game->addObserver(NEW ATapper(id, card, cost, tc));
}
}else{
target->tapped = 1;
}
result++; result++;
continue; continue;
} }