Erwan
- Fix for issue 284 (Damage not triggering when creature dies in combat phase)
This commit is contained in:
@@ -547,6 +547,15 @@ Interruptible * ActionStack::getLatest(int state){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int ActionStack::receiveEventPlus(WEvent * event) {
|
||||
int result = 0;
|
||||
for (int i = 0; i < mCount ; ++i){
|
||||
Interruptible * current = (Interruptible *)mObjects[i];
|
||||
result += current->receiveEvent(event);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void ActionStack::Update(float dt){
|
||||
askIfWishesToInterrupt = NULL;
|
||||
//modal = 0;
|
||||
|
||||
@@ -178,18 +178,30 @@ DamageStack::DamageStack() {
|
||||
}
|
||||
|
||||
|
||||
/* Damage Stack resolve process:
|
||||
1 - apply damages to targets. For each of them, send an event to the GameObserver (for Damage triggers)
|
||||
2 - Once this is done, send a "Damage Stakc Resolved" event to the GameObserver
|
||||
3 - Once that message is received on the DamageStack's side, do the "afterDamage" effects (send to graveyard, etc...)
|
||||
Using events in 2 and 3 guarantees that the "send to graveyard" effect will only apply AFTER Damaged triggers are applied
|
||||
*/
|
||||
int DamageStack::resolve(){
|
||||
for (int i = mCount-1; i>= 0; i--){
|
||||
Damage * damage = (Damage*)mObjects[i];
|
||||
if (damage->state == NOT_RESOLVED) damage->resolve();
|
||||
//damage->resolve();
|
||||
}
|
||||
|
||||
GameObserver::GetInstance()->receiveEvent(NEW WEventDamageStackResolved());
|
||||
return 1;
|
||||
}
|
||||
|
||||
int DamageStack::receiveEvent(WEvent * e) {
|
||||
WEventDamageStackResolved *event = dynamic_cast<WEventDamageStackResolved*>(e);
|
||||
if (!event) return 0;
|
||||
|
||||
for (int i = mCount-1; i>= 0; i--){
|
||||
Damage * damage = (Damage*)mObjects[i];
|
||||
if (damage->state == RESOLVED_OK) damage->target->afterDamage();
|
||||
//damage->target->afterDamage();
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -601,7 +601,7 @@ void GameObserver::untapPhase(){
|
||||
int GameObserver::receiveEvent(WEvent * e){
|
||||
if (!e) return 0;
|
||||
eventsQueue.push(e);
|
||||
if (eventsQueue.size() > 1) return -1;
|
||||
if (eventsQueue.size() > 1) return -1; //resolving events can generate more events
|
||||
int result = 0;
|
||||
while(eventsQueue.size()){
|
||||
WEvent * ev = eventsQueue.front();
|
||||
|
||||
@@ -10,6 +10,8 @@ WEventZoneChange::WEventZoneChange(MTGCardInstance * card, MTGGameZone * from, M
|
||||
|
||||
WEventDamage::WEventDamage(Damage *damage) : WEvent(DAMAGE), damage(damage){}
|
||||
|
||||
WEventDamageStackResolved::WEventDamageStackResolved() : WEvent(){}
|
||||
|
||||
WEventCardUpdate::WEventCardUpdate(MTGCardInstance * card) : WEvent(), card(card) {};
|
||||
|
||||
WEventPhaseChange::WEventPhaseChange(Phase * from, Phase * to) : WEvent(CHANGE_PHASE), from(from), to(to){}
|
||||
|
||||
Reference in New Issue
Block a user