コード例 #1
0
ファイル: MagicEventArgs.cs プロジェクト: jpbruyere/MagicCrow
 public DamageEventArg(Damage _d)
 {
     Type   = MagicEventType.Damage;
     Damage = _d;
 }
コード例 #2
0
ファイル: MagicEngine.cs プロジェクト: jpbruyere/MagicCrow
        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;
            }
        }