added ability to have triggered abilities target based on the event that triggered, bramblewood paragon, graft, etc.
use "trigger" inside target code of triggered ability. does not work with @each and @next. @damaged can use trigger[to] and trigger[from] to specify the target or source of the damage, respectively. Adds cards: Aether Flash Bramblewood Paragon In the Web of War Juniper Order Ranger Mortuary Primal Forcemage Fungus Sliver Simic Initiate as well as a test file for feral hydra, missing from my last commit. and daily build.
This commit is contained in:
@@ -275,13 +275,12 @@ class AAFizzler:public ActivatedAbility{
|
||||
|
||||
|
||||
//MayAbility: May do ...
|
||||
class MayAbility:public MTGAbility{
|
||||
class MayAbility:public MTGAbility, public NestedAbility{
|
||||
public:
|
||||
int triggered;
|
||||
bool must;
|
||||
MTGAbility * ability;
|
||||
MTGAbility * mClone;
|
||||
MayAbility(int _id, MTGAbility * _ability, MTGCardInstance * _source, bool must = false):MTGAbility(_id,_source),must(must),ability(_ability){
|
||||
MayAbility(int _id, MTGAbility * _ability, MTGCardInstance * _source, bool must = false):MTGAbility(_id,_source),must(must),NestedAbility(_ability){
|
||||
triggered = 0;
|
||||
mClone = NULL;
|
||||
}
|
||||
@@ -389,13 +388,12 @@ public:
|
||||
|
||||
//Generic Activated Ability
|
||||
|
||||
class GenericActivatedAbility:public ActivatedAbility{
|
||||
class GenericActivatedAbility:public ActivatedAbility, public NestedAbility{
|
||||
public:
|
||||
MTGAbility * ability;
|
||||
int limitPerTurn;
|
||||
int counters;
|
||||
MTGGameZone * activeZone;
|
||||
GenericActivatedAbility(int _id, MTGCardInstance * card, MTGAbility * a, ManaCost * _cost, int _tap = 0, int limit = 0, int restrictions = 0, MTGGameZone * dest = NULL):ActivatedAbility(_id, card,_cost,restrictions,_tap),ability(a),limitPerTurn(limit),activeZone(dest){
|
||||
GenericActivatedAbility(int _id, MTGCardInstance * card, MTGAbility * a, ManaCost * _cost, int _tap = 0, int limit = 0, int restrictions = 0, MTGGameZone * dest = NULL):ActivatedAbility(_id, card,_cost,restrictions,_tap),NestedAbility(a),limitPerTurn(limit),activeZone(dest){
|
||||
counters = 0;
|
||||
target = ability->target;
|
||||
}
|
||||
@@ -1399,10 +1397,9 @@ class APowerToughnessModifierUntilEndOfTurn: public ActivatedAbility{
|
||||
};
|
||||
|
||||
|
||||
class GenericInstantAbility: public InstantAbility{
|
||||
class GenericInstantAbility: public InstantAbility, public NestedAbility{
|
||||
public:
|
||||
MTGAbility * ability;
|
||||
GenericInstantAbility(int _id, MTGCardInstance * _source, Damageable * _target, MTGAbility * ability): InstantAbility(_id, _source, _target), ability(ability){
|
||||
GenericInstantAbility(int _id, MTGCardInstance * _source, Damageable * _target, MTGAbility * ability): InstantAbility(_id, _source, _target), NestedAbility(ability){
|
||||
ability->target = _target;
|
||||
}
|
||||
|
||||
@@ -1643,13 +1640,12 @@ class AConvertLandToCreatures:public ListMaintainerAbility{
|
||||
};
|
||||
|
||||
//Generic Kird Ape
|
||||
class AAsLongAs:public ListMaintainerAbility{
|
||||
class AAsLongAs:public ListMaintainerAbility, public NestedAbility{
|
||||
public:
|
||||
MTGAbility * ability;
|
||||
MTGAbility * a;
|
||||
int includeSelf;
|
||||
int mini,maxi;
|
||||
AAsLongAs(int _id, MTGCardInstance * _source, Damageable * _target, TargetChooser * _tc, int _includeSelf, MTGAbility * ability,int mini = 0, int maxi = 0):ListMaintainerAbility(_id, _source,_target),ability(ability),mini(mini),maxi(maxi){
|
||||
AAsLongAs(int _id, MTGCardInstance * _source, Damageable * _target, TargetChooser * _tc, int _includeSelf, MTGAbility * ability,int mini = 0, int maxi = 0):ListMaintainerAbility(_id, _source,_target),NestedAbility(ability),mini(mini),maxi(maxi){
|
||||
tc = _tc;
|
||||
includeSelf = _includeSelf;
|
||||
tc->targetter = NULL;
|
||||
@@ -1731,13 +1727,12 @@ class AAsLongAs:public ListMaintainerAbility{
|
||||
};
|
||||
|
||||
//Lords (Merfolk lord...) give power and toughness to OTHER creatures of their type, they can give them special abilities, regeneration
|
||||
class ALord:public ListMaintainerAbility{
|
||||
class ALord:public ListMaintainerAbility, public NestedAbility{
|
||||
public:
|
||||
MTGAbility * ability;
|
||||
int includeSelf;
|
||||
map<Damageable *, MTGAbility *> abilities;
|
||||
|
||||
ALord(int _id, MTGCardInstance * card, TargetChooser * _tc, int _includeSelf, MTGAbility * a):ListMaintainerAbility(_id,card), ability(a){
|
||||
ALord(int _id, MTGCardInstance * card, TargetChooser * _tc, int _includeSelf, MTGAbility * a):ListMaintainerAbility(_id,card), NestedAbility(a){
|
||||
tc = _tc;
|
||||
tc->targetter = NULL;
|
||||
includeSelf = _includeSelf;
|
||||
@@ -1811,14 +1806,13 @@ class ALord:public ListMaintainerAbility{
|
||||
|
||||
|
||||
//Foreach (plague rats...)
|
||||
class AForeach:public ListMaintainerAbility{
|
||||
class AForeach:public ListMaintainerAbility, public NestedAbility{
|
||||
public:
|
||||
MTGAbility * ability;
|
||||
int includeSelf;
|
||||
int mini;
|
||||
int maxi;
|
||||
map<Damageable *, MTGAbility *> abilities;
|
||||
AForeach(int _id, MTGCardInstance * card,Damageable * _target, TargetChooser * _tc, int _includeSelf, MTGAbility * a, int mini = 0, int maxi = 0):ListMaintainerAbility(_id,card,_target), ability(a),mini(mini),maxi(maxi){
|
||||
AForeach(int _id, MTGCardInstance * card,Damageable * _target, TargetChooser * _tc, int _includeSelf, MTGAbility * a, int mini = 0, int maxi = 0):ListMaintainerAbility(_id,card,_target), NestedAbility(a),mini(mini),maxi(maxi){
|
||||
tc = _tc;
|
||||
tc->targetter = NULL;
|
||||
includeSelf = _includeSelf;
|
||||
@@ -1877,12 +1871,11 @@ class AForeach:public ListMaintainerAbility{
|
||||
};
|
||||
|
||||
|
||||
class AThis:public MTGAbility{
|
||||
public:
|
||||
MTGAbility * ability;
|
||||
class AThis:public MTGAbility, public NestedAbility{
|
||||
public:
|
||||
MTGAbility * a;
|
||||
ThisDescriptor * td;
|
||||
AThis(int _id, MTGCardInstance * _source, Damageable * _target, ThisDescriptor * _td, MTGAbility * ability):MTGAbility(_id, _source,_target),ability(ability){
|
||||
AThis(int _id, MTGCardInstance * _source, Damageable * _target, ThisDescriptor * _td, MTGAbility * ability):MTGAbility(_id, _source,_target),NestedAbility(ability){
|
||||
td = _td;
|
||||
ability->source = source;
|
||||
ability->target = target;
|
||||
@@ -1941,12 +1934,11 @@ class AThis:public MTGAbility{
|
||||
}
|
||||
};
|
||||
|
||||
class AThisForEach:public MTGAbility{
|
||||
class AThisForEach:public MTGAbility, public NestedAbility{
|
||||
public:
|
||||
MTGAbility * ability;
|
||||
ThisDescriptor * td;
|
||||
vector<MTGAbility *> abilities;
|
||||
AThisForEach(int _id, MTGCardInstance * _source, Damageable * _target, ThisDescriptor * _td, MTGAbility * ability):MTGAbility(_id, _source,_target),ability(ability){
|
||||
AThisForEach(int _id, MTGCardInstance * _source, Damageable * _target, ThisDescriptor * _td, MTGAbility * ability):MTGAbility(_id, _source,_target),NestedAbility(ability){
|
||||
td = _td;
|
||||
ability->source = source;
|
||||
ability->target = target;
|
||||
|
||||
@@ -83,6 +83,11 @@ class MTGAbility: public ActionElement{
|
||||
};
|
||||
};
|
||||
|
||||
class NestedAbility{
|
||||
public:
|
||||
MTGAbility * ability;
|
||||
NestedAbility(MTGAbility * _ability);
|
||||
};
|
||||
|
||||
class TriggeredAbility:public MTGAbility{
|
||||
public:
|
||||
@@ -164,9 +169,8 @@ class ActivatedAbility:public MTGAbility{
|
||||
virtual ostream& toString(ostream& out) const;
|
||||
};
|
||||
|
||||
class TargetAbility:public ActivatedAbility{
|
||||
class TargetAbility:public ActivatedAbility, public NestedAbility{
|
||||
public:
|
||||
MTGAbility * ability;
|
||||
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);
|
||||
virtual int reactToClick(MTGCardInstance * card);
|
||||
@@ -233,16 +237,16 @@ class TriggerNextPhase:public TriggerAtPhase{
|
||||
};
|
||||
|
||||
|
||||
class GenericTriggeredAbility:public TriggeredAbility{
|
||||
class GenericTriggeredAbility:public TriggeredAbility, public NestedAbility{
|
||||
public:
|
||||
TriggeredAbility * t;
|
||||
MTGAbility * ability;
|
||||
MTGAbility * destroyCondition;
|
||||
GenericTriggeredAbility(int id, MTGCardInstance * _source, TriggeredAbility * _t, MTGAbility * a,MTGAbility * dc = NULL, Targetable * _target = NULL);
|
||||
virtual int trigger();
|
||||
virtual int triggerOnEvent(WEvent * e);
|
||||
virtual int resolve();
|
||||
virtual int testDestroy();
|
||||
void setTriggerTargets(WEvent * e, MTGAbility * a);
|
||||
void Update(float dt);
|
||||
virtual GenericTriggeredAbility* clone() const;
|
||||
const char * getMenuText();
|
||||
|
||||
@@ -53,8 +53,6 @@ class TargetChooser: public TargetsList {
|
||||
virtual ~TargetChooser(){};
|
||||
int targetListSet();
|
||||
virtual TargetChooser* clone() const = 0;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -166,5 +164,15 @@ class DamageTargetChooser:public TargetChooser{
|
||||
virtual DamageTargetChooser * clone() const;
|
||||
};
|
||||
|
||||
//Should only be used for triggered abilities.
|
||||
class TriggerTargetChooser:public TargetChooser{
|
||||
public:
|
||||
Targetable * target;
|
||||
int triggerTarget;
|
||||
TriggerTargetChooser(int _triggerTarget);
|
||||
virtual bool targetsZone(MTGGameZone * z);
|
||||
virtual bool canTarget(Targetable * _target);
|
||||
virtual TriggerTargetChooser * clone() const;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -19,10 +19,18 @@ public:
|
||||
DAMAGE = 2,
|
||||
CHANGE_PHASE = 3,
|
||||
};
|
||||
//for getTargets, in case event has more than one possible "target", like with damage events.
|
||||
enum {
|
||||
TARGET_NONE = 0,
|
||||
TARGET_TO,
|
||||
TARGET_FROM,
|
||||
};
|
||||
int type; //Deprecated, use dynamic casting instead
|
||||
WEvent(int type = NOT_SPECIFIED);
|
||||
virtual ~WEvent() {};
|
||||
virtual std::ostream& toString(std::ostream& out) const;
|
||||
virtual int getValue() {return 0;};
|
||||
virtual Targetable * getTarget(int target) {return 0;};
|
||||
};
|
||||
|
||||
struct WEventZoneChange : public WEvent {
|
||||
@@ -32,6 +40,7 @@ struct WEventZoneChange : public WEvent {
|
||||
WEventZoneChange(MTGCardInstance * card, MTGGameZone * from, MTGGameZone *to);
|
||||
virtual ~WEventZoneChange() {};
|
||||
virtual std::ostream& toString(std::ostream& out) const;
|
||||
virtual Targetable * getTarget(int target);
|
||||
};
|
||||
|
||||
|
||||
@@ -39,6 +48,8 @@ struct WEventDamage : public WEvent {
|
||||
Damage * damage;
|
||||
WEventDamage(Damage * damage);
|
||||
virtual std::ostream& toString(std::ostream& out) const;
|
||||
virtual int getValue();
|
||||
virtual Targetable * getTarget(int target);
|
||||
};
|
||||
|
||||
struct WEventPhaseChange : public WEvent {
|
||||
@@ -67,6 +78,7 @@ struct WEventCardTap : public WEventCardUpdate {
|
||||
bool before;
|
||||
bool after;
|
||||
WEventCardTap(MTGCardInstance * card, bool before, bool after);
|
||||
virtual Targetable * getTarget(int target);
|
||||
};
|
||||
|
||||
//Event when a card's "attacker" status changes
|
||||
|
||||
Reference in New Issue
Block a user