Пример #1
0
        static async Task ask(ActionCard card, object[] args)
        {
            Game            game         = args[0] as Game;
            Player          player       = args[1] as Player;
            EventData <int> value        = args[2] as EventData <int>;
            Player          sourcePlayer = args[4] as Player;

            if (player == card.Owner && value.data < 0 && sourcePlayer != card.Owner)//其他玩家减少拥有者的影响力。
            {
                //启用阻塞
                flag = new TaskCompletionSource <bool>();
                if (game.Requests[game.Players.IndexOf(card.Owner)].Any(x => x is UseLimitCardRequest r && r.CardType == game.Database.getID(typeof(AT_N005))))
                {
                    //说明该玩家处于另一个挂裱询问
                    return;
                }
                Log.Game($"询问 { card.Owner.Name } 使用挂裱");
                UseLimitCardResponse useLimitCard = (UseLimitCardResponse)await game.WaitAnswer(new UseLimitCardRequest()
                {
                    AllPlayerRequest = true,
                    PlayerId         = card.Owner.Id,
                    CardType         = game.Database.getID(typeof(AT_N005))
                }.SetTimeOut(game.RequestTime));

                if (useLimitCard.Used)
                {
                    Log.Game($" { card.Owner.Name } 使用挂裱");
                    //响应后 取消其他玩家的询问
                    game.CancelRequests();
                    await card.Owner.DropActionCard(game, new List <int>() { card.Id }, true);//弃牌

                    //实际上的效果
                    await sourcePlayer.ChangeSize(game, value.data, card, player);

                    //取消阻塞
                    flag.TrySetResult(true);
                }
                else
                {
                    Log.Game($" { card.Owner.Name } 取消使用挂裱");
                    if (game.Requests.All(x => x.Count == 0))
                    {
                        flag.TrySetResult(true);
                    }
                }
            }
        }
Пример #2
0
        static async Task doeffect(ActionCard card, object[] args, Game game)
        {
            ChooseDirectionResponse response = args[1] as ChooseDirectionResponse;

            if (!response.IfSet)
            {
                //启用阻塞
                flag = new TaskCompletionSource <bool>();
                if (game.Requests[game.Players.IndexOf(card.Owner)].Any(x => x is UseLimitCardRequest r && r.CardType == game.Database.getID(typeof(AT_N020))))
                {
                    //说明该玩家处于另一个墨菲定律询问
                    return;
                }
                Log.Game($"询问 { card.Owner.Name } 使用定律");
                UseLimitCardResponse response1 = (UseLimitCardResponse)await game.WaitAnswer(new UseLimitCardRequest()
                {
                    AllPlayerRequest = true,
                    PlayerId         = card.Owner.Id,
                    CardType         = game.Database.getID(typeof(AT_N020))
                }.SetTimeOut(game.RequestTime));

                if (response1.Used)
                {
                    Log.Game($" { card.Owner.Name } 使用墨菲定律");
                    //响应后 取消其他玩家的询问
                    game.CancelRequests();
                    //这段会有问题,丢卡后卡的owner变成null,个人影响力变化会找不到来源玩家(理论上是自己)
                    Player owner = card.Owner;
                    await card.Owner.DropActionCard(game, new List <int>() { card.Id }, true);

                    await owner.ChangeSize(game, -1, card, card.Owner);

                    //把方向置为反向
                    response.IfForward = !response.IfForward;
                    //取消阻塞
                    flag.TrySetResult(true);
                }
                else
                {
                    Log.Game($" { card.Owner.Name } 取消使用墨菲定律");
                    if (game.Requests.All(x => x.Count == 0))
                    {
                        flag.TrySetResult(true);
                    }
                }
            }
        }