void MagicEngine_MagicEvent(MagicEventArg arg) { Border b; switch (arg.Type) { case MagicEventType.PlayerHasLost: closeCurrentGame(); break; case MagicEventType.Unset: break; case MagicEventType.BeginPhase: b = phasePannel.FindByName ((arg as PhaseEventArg).Phase.ToString()) as Border; if (b != null) { b.Foreground = Color.White; } break; case MagicEventType.EndPhase: b = phasePannel.FindByName ((arg as PhaseEventArg).Phase.ToString()) as Border; if (b != null) { b.Foreground = Color.Transparent; } break; case MagicEventType.PlayLand: break; case MagicEventType.CastSpell: break; case MagicEventType.TapCard: break; case MagicEventType.ChangeZone: break; default: break; } }
public bool ExecuteIfMatch(MagicEventArg arg, CardInstance triggerSource) { if (Type != arg.Type) { return(false); } if (TriggerZone != CardGroupEnum.Any) { if (triggerSource.CurrentGroup.GroupName != TriggerZone) { return(false); } } switch (Type) { case MagicEventType.ChangeZone: if (!targetIsValid(arg.Source, triggerSource)) { return(false); } ChangeZoneEventArg czea = arg as ChangeZoneEventArg; if ((czea.Origine == Origine || Origine == CardGroupEnum.Any) && (czea.Destination == Destination || Destination == CardGroupEnum.Any)) { if (InhibStacking) { MagicEngine.CurrentEngine.MagicStack.PushOnStack(new AbilityActivation(arg.Source, Exec) { GoesOnStack = false }); } else { MagicEngine.CurrentEngine.MagicStack.PushOnStack(new AbilityActivation(arg.Source, Exec)); } } else { return(false); } return(true); case MagicEventType.CastSpell: if (targetIsValid((arg as SpellEventArg).Spell.CardSource, triggerSource)) { MagicEngine.CurrentEngine.MagicStack.PushOnStack (new AbilityActivation((arg as SpellEventArg).Spell.CardSource, Exec)); } else { return(false); } return(true); default: Debug.WriteLine("default trigger handler: " + this.ToString()); if (targetIsValid(arg.Source, triggerSource)) { if (InhibStacking) { MagicEngine.CurrentEngine.MagicStack.PushOnStack(new AbilityActivation(arg.Source, Exec) { GoesOnStack = false }); } else { MagicEngine.CurrentEngine.MagicStack.PushOnStack(new AbilityActivation(arg.Source, Exec)); } } else { return(false); } return(true); } }
void MagicEngine_MagicEvent(MagicEventArg arg) { Magic.AddLog("MAGIC EVENT: " + arg.ToString()); #region check triggers //check cards in play having trigger effects foreach (CardInstance ci in CardsInPlayHavingTriggers) { foreach (Trigger t in ci.Model.Triggers) { if (t.ExecuteIfMatch(arg, ci)) { Magic.AddLog("=> " + t.ToString()); } } } //check pump effect //todo should simplify trigger checking with a single function foreach (CardInstance ci in CardsInPlayHavingPumpEffects) { List <EffectGroup> egToRemove = new List <EffectGroup>(); foreach (EffectGroup eg in ci.PumpEffect) { if (eg.TrigEnd != null) { if (eg.TrigEnd.Type != arg.Type) { continue; } switch (eg.TrigEnd.Type) { case MagicEventType.EndTurn: egToRemove.Add(eg); break; } } } foreach (EffectGroup egtr in egToRemove) { ci.PumpEffect.Remove(egtr); } } #endregion switch (arg.Type) { case MagicEventType.PlayerIsReady: //check if all players are ready foreach (Player p in Players) { if (p.CurrentState != Player.PlayerStates.Ready) { return; } } startGame(); break; case MagicEventType.BeginPhase: processPhaseBegin(arg as PhaseEventArg); break; case MagicEventType.EndPhase: processPhaseEnd(arg as PhaseEventArg); break; case MagicEventType.PlayLand: break; case MagicEventType.ActivateAbility: break; case MagicEventType.CastSpell: break; case MagicEventType.TapCard: break; case MagicEventType.ChangeZone: if (arg.Source.IsToken) { arg.Source.CurrentGroup.Cards.Remove(arg.Source); } break; case MagicEventType.Unset: break; default: break; } CheckCardInstanceUpdates(); foreach (Player p in Players) //TODO:too wide update { p.InPlay.UpdateLayout(); } }
public void RaiseMagicEvent(MagicEventArg arg) { MagicEvent(arg); }