- Magic 2010: Combat Damages don't go on the stack anymore
- Comp rules: "goes to graveyard" effects don't go on the stack anymore
- Regenerate "fixed" (untested)
- Basic "ReplacementEffect" mechanism for damage prevention. Can be extended to other replacement effects with some limits.
- TODO: Damages don't go on the stack, the abilities that create them do.
This commit is contained in:
wagic.the.homebrew@gmail.com
2009-06-23 14:22:00 +00:00
parent 5dc98359c1
commit ca3c2d30ab
17 changed files with 266 additions and 64 deletions

View File

@@ -0,0 +1,76 @@
#include "../include/config.h"
#include "../include/ReplacementEffects.h"
#include "../include/MTGCardInstance.h"
#include "../include/TargetChooser.h"
#include "../include/Damage.h"
REDamagePrevention::REDamagePrevention(TargetChooser *_tcSource, TargetChooser *_tcTarget,int _damage, bool _oneShot):damage(_damage), tcSource(_tcSource), tcTarget(_tcTarget), oneShot(_oneShot){
}
WEvent * REDamagePrevention::replace (WEvent *event){
if (!event) return event;
if (!damage) return event;
WEventDamage * e = dynamic_cast<WEventDamage*>(event);
if (!e) return event;
Damage *d = e->damage;
if ((!tcSource || tcSource->canTarget(d->source)) &&
(!tcTarget || tcTarget->canTarget(d->target))
){
if (damage == -1){
d->damage = 0;
delete event;
if (oneShot) damage = 0;
return NULL;
}
if (damage >= d->damage){
damage-= d->damage;
d->damage = 0;
delete event;
return NULL;
}
d->damage -= damage;
damage = 0;
delete event;
WEventDamage* newEvent = NEW WEventDamage(d);
return newEvent;
}
return event;
}
REDamagePrevention::~REDamagePrevention(){
SAFE_DELETE(tcSource);
SAFE_DELETE(tcTarget);
}
ReplacementEffects::ReplacementEffects(){}
WEvent * ReplacementEffects::replace(WEvent *e){
list<ReplacementEffect *>::iterator it;
for ( it=modifiers.begin() ; it != modifiers.end(); it++ ){
ReplacementEffect *re = *it;
WEvent * newEvent = re->replace(e);
if (!newEvent) return NULL;
if (newEvent != e) return replace(newEvent);
}
return e;
}
int ReplacementEffects::add(ReplacementEffect * re){
modifiers.push_back(re);
return 1;
}
int ReplacementEffects::remove (ReplacementEffect *re){
modifiers.remove(re);
return 1;
}
ReplacementEffects::~ReplacementEffects(){
list<ReplacementEffect *>::iterator it;
for ( it=modifiers.begin() ; it != modifiers.end(); it++ ){
ReplacementEffect *re = *it;
delete(re);
}
modifiers.clear();
}