void processPhaseEnd(PhaseEventArg pea) { MagicStack.ClearIncompleteActions(); MagicStack.ResolveStack(); switch (pea.Phase) { case GamePhases.Untap: break; case GamePhases.Upkeep: break; case GamePhases.Draw: break; case GamePhases.Main2: case GamePhases.Main1: if (CurrentPhase == GamePhases.Main1 && cp.CreaturesAbleToAttack.Count() == 0) { CurrentPhase = GamePhases.EndOfCombat; } break; case GamePhases.BeforeCombat: break; case GamePhases.DeclareAttacker: if (!pea.Player.HasAttackingCreature) { CurrentPhase = GamePhases.EndOfCombat; break; } foreach (CardInstance c in pea.Player.AttackingCreature) { if (!c.IsTapped && !c.HasAbility(AbilityEnum.Vigilance)) { c.Tap(); RaiseMagicEvent(new MagicEventArg(MagicEventType.Attack, c)); } } break; case GamePhases.DeclareBlocker: break; case GamePhases.FirstStrikeDame: break; case GamePhases.CombatDamage: break; case GamePhases.EndOfCombat: foreach (Player p in Players) { bool updateLayout = false; foreach (CardInstance c in p.InPlay.Cards) { if (c.Combating) { updateLayout = true; c.Combating = false; } } if (updateLayout) { p.InPlay.UpdateLayout(); } } break; case GamePhases.EndOfTurn: break; case GamePhases.CleanUp: MagicEvent(new MagicEventArg { Type = MagicEventType.EndTurn //Player = Players [currentPlayer] }); currentPlayerIndex++; priorityPlayer = _currentPlayer; CurrentPhase = GamePhases.Untap; //Players[_priorityPlayer].pbTimer.Visible = true; break; } foreach (Player p in Players) { //p.CurrentAction = null; p.ManaPool = null; p.NotifyValueChange("ManaPoolElements", null); } if (pea.Phase != GamePhases.CleanUp) { CurrentPhase++; } raiseBeginPhase = true; }
void processPhaseBegin(PhaseEventArg pea) { foreach (Player p in Players) { p.PhaseDone = false; } priorityPlayer = _currentPlayer; switch (pea.Phase) { case GamePhases.Untap: cp.AllowedLandsToBePlayed = 1; cp.LifePointsGainedThisTurn = cp.LifePointsLooseThisTurn = 0; cp.CardToDraw = 1; foreach (CardInstance c in cp.InPlay.Cards) { c.HasSummoningSickness = false; c.TryToUntap(); } break; case GamePhases.Upkeep: break; case GamePhases.Draw: //if (pea.Player == cp) { while (cp.CardToDraw > 0) { cp.DrawOneCard(); cp.CardToDraw--; } //} break; case GamePhases.Main1: case GamePhases.Main2: break; case GamePhases.BeforeCombat: break; case GamePhases.DeclareAttacker: // if (cp.Type == Player.PlayerType.human) // stopChrono (); break; case GamePhases.DeclareBlocker: break; case GamePhases.FirstStrikeDame: Chrono.Reset(); foreach (CardInstance ac in cp.AttackingCreature.Where (cpac => cpac.HasAbility(AbilityEnum.FirstStrike) || cpac.HasAbility(AbilityEnum.DoubleStrike))) { Damage d = new Damage(null, ac, ac.Power); foreach (CardInstance def in ac.BlockingCreatures.Where (cpac => cpac.HasAbility(AbilityEnum.FirstStrike) || cpac.HasAbility(AbilityEnum.DoubleStrike))) { MagicStack.PushOnStack(new Damage(ac, def, def.Power)); } if (ac.BlockingCreatures.Count == 0) { d.Target = cp.Opponent; MagicStack.PushOnStack(d); } else if (ac.BlockingCreatures.Count == 1) { d.Target = ac.BlockingCreatures [0]; MagicStack.PushOnStack(d); } else { //push damages one by one for further resolution for (int i = 0; i < ac.Power; i++) { MagicStack.PushOnStack(new Damage(null, d.Source, 1)); } } } MagicStack.CheckStackForUnasignedDamage(); break; case GamePhases.CombatDamage: Chrono.Reset(); foreach (CardInstance ac in cp.AttackingCreature) { Damage d = new Damage(null, ac, ac.Power); foreach (CardInstance def in ac.BlockingCreatures.Where (cpac => !cpac.HasAbility(AbilityEnum.FirstStrike))) { MagicStack.PushOnStack(new Damage(ac, def, def.Power)); } if (ac.HasAbility(AbilityEnum.FirstStrike) && !ac.HasAbility(AbilityEnum.DoubleStrike)) { return; } if (ac.BlockingCreatures.Count == 0) { d.Target = cp.Opponent; MagicStack.PushOnStack(d); } else if (ac.BlockingCreatures.Count == 1) { d.Target = ac.BlockingCreatures [0]; MagicStack.PushOnStack(d); } else { for (int i = 0; i < ac.Power; i++) { MagicStack.PushOnStack(new Damage(null, d.Source, 1)); } } } MagicStack.CheckStackForUnasignedDamage(); break; case GamePhases.EndOfCombat: break; case GamePhases.EndOfTurn: break; case GamePhases.CleanUp: foreach (Player p in Players) { foreach (CardInstance ac in p.InPlay.Cards) { if (ac.Damages.Count > 0) { ac.Damages.Clear(); } } } int cardDiff = cp.Hand.Cards.Count - 7; Ability discard = new Ability(EffectType.Discard); discard.ValidTargets += new CardTarget() { ValidGroup = CardGroupEnum.Hand, Controler = ControlerType.You }; discard.Mandatory = true; discard.RequiredTargetCount = 1; discard.TargetPrompt = "Select card to discard"; for (int i = 0; i < cardDiff; i++) { MagicStack.PushOnStack(new AbilityActivation(null, discard) { GoesOnStack = false, Player = cp }); } break; } }