Beispiel #1
0
        public override bool Commit(GameEventArgs arg)
        {
            Owner[TiaoXinUsed] = 1;
            var           target = arg.Targets[0];
            ISkill        skill;
            List <Card>   cards;
            List <Player> players;

            while (true)
            {
                var v = new JieDaoShaRen.JieDaoShaRenVerifier(Owner);
                Game.CurrentGame.Emit(GameEvent.PlayerIsAboutToUseCard, new PlayerIsAboutToUseOrPlayCardEventArgs()
                {
                    Source = target, Verifier = v
                });
                if (Game.CurrentGame.UiProxies[target].AskForCardUsage(new CardUsagePrompt("TiaoXin", Owner), v,
                                                                       out skill, out cards, out players))
                {
                    try
                    {
                        GameEventArgs args = new GameEventArgs();
                        target[Sha.NumberOfShaUsed]--;
                        args.Source  = target;
                        args.Targets = new List <Player>(players);
                        args.Targets.Add(Owner);
                        args.Skill = skill;
                        args.Cards = cards;
                        Game.CurrentGame.Emit(GameEvent.CommitActionToTargets, args);
                    }
                    catch (TriggerResultException e)
                    {
                        Trace.Assert(e.Status == TriggerResult.Retry);
                        continue;
                    }
                }
                else
                {
                    var theCard = Game.CurrentGame.SelectACardFrom(arg.Targets[0], Owner, new CardChoicePrompt("TiaoXin", Owner), "TiaoXin");
                    if (theCard != null)
                    {
                        Game.CurrentGame.HandleCardDiscard(arg.Targets[0], new List <Card>()
                        {
                            theCard
                        });
                    }
                }
                break;
            }
            return(true);
        }
Beispiel #2
0
        void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs, List <Card> cards, List <Player> players)
        {
            NotifySkillUse(players);
            Game.CurrentGame.DrawCards(players[0], 2);
            ISkill        skill;
            List <Card>   nCard;
            List <Player> nPlayer;

            while (true)
            {
                var v = new JieDaoShaRen.JieDaoShaRenVerifier(players[1]);

                bool xuanhuoShaUsed = false;
                if (players.Count == 2 && !players[1].IsDead)
                {
                    Game.CurrentGame.Emit(GameEvent.PlayerIsAboutToUseCard, new PlayerIsAboutToUseOrPlayCardEventArgs()
                    {
                        Source = players[0], Verifier = v
                    });
                    if (players[0].AskForCardUsage(new CardUsagePrompt("XuanHuoSha", players[1]), v, out skill, out nCard, out nPlayer))
                    {
                        xuanhuoShaUsed = true;
                        try
                        {
                            players[0][Sha.NumberOfShaUsed]--;
                            GameEventArgs args = new GameEventArgs();
                            args.Source  = players[0];
                            args.Targets = nPlayer;
                            args.Targets.Add(players[1]);
                            args.Skill = skill;
                            args.Cards = nCard;
                            Game.CurrentGame.Emit(GameEvent.CommitActionToTargets, args);
                        }
                        catch (TriggerResultException e)
                        {
                            Trace.Assert(e.Status == TriggerResult.Retry);
                            continue;
                        }
                    }
                }

                if (!xuanhuoShaUsed)
                {
                    int cardCount = players[0].HandCards().Count + players[0].Equipments().Count;
                    if (cardCount == 0)
                    {
                        break;
                    }
                    List <Card> toGet = new List <Card>();
                    if (cardCount <= 2)
                    {
                        toGet.AddRange(players[0].HandCards());
                        toGet.AddRange(players[0].Equipments());
                    }
                    else
                    {
                        List <List <Card> > answer;
                        List <DeckPlace>    sourcePlace = new List <DeckPlace>();
                        sourcePlace.Add(new DeckPlace(players[0], DeckType.Hand));
                        sourcePlace.Add(new DeckPlace(players[0], DeckType.Equipment));
                        if (!Owner.AskForCardChoice(new CardChoicePrompt("XuanHuo", players[0], Owner),
                                                    sourcePlace,
                                                    new List <string>()
                        {
                            "HuoDe"
                        },
                                                    new List <int>()
                        {
                            2
                        },
                                                    new RequireCardsChoiceVerifier(2, true),
                                                    out answer,
                                                    null,
                                                    CardChoiceCallback.GenericCardChoiceCallback))
                        {
                            answer = new List <List <Card> >();
                            answer.Add(Game.CurrentGame.PickDefaultCardsFrom(sourcePlace, 2));
                        }
                        Game.CurrentGame.SyncImmutableCards(Owner, answer[0]);
                        toGet = answer[0];
                    }
                    Game.CurrentGame.HandleCardTransferToHand(players[0], Owner, toGet);
                }
                break;
            }
            Game.CurrentGame.CurrentPhaseEventIndex++;
            throw new TriggerResultException(TriggerResult.End);
        }