Exemple #1
0
        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;
        }
Exemple #2
0
        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;
            }
        }