Пример #1
0
        protected void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
        {
            NotifySkillUse(new List <Player>());
            int answer;

            if (Game.CurrentGame.UiProxies[Owner].AskForMultipleChoice(
                    new MultipleChoicePrompt(Prompt.SkillUseYewNoPrompt, new BaGuaZhen.BaGuaZhenSkill()), Prompt.YesNoChoices, out answer) &&
                answer == 1)
            {
                ReadOnlyCard c = Game.CurrentGame.Judge(Owner, null, new Card()
                {
                    Type = new BaGuaZhen()
                }, (judgeResultCard) => { return(judgeResultCard.SuitColor == SuitColorType.Red); });
                if (c.SuitColor == SuitColorType.Red)
                {
                    eventArgs.Cards = new List <Card>();
                    eventArgs.Skill = new CardWrapper(Owner, new Shan(), false);
                    ActionLog log = new ActionLog();
                    log.Source      = Owner;
                    log.SkillAction = new BaGuaZhen().EquipmentSkill;
                    log.GameAction  = GameAction.None;
                    Game.CurrentGame.NotificationProxy.NotifySkillUse(log);
                    throw new TriggerResultException(TriggerResult.Success);
                }
            }
        }
Пример #2
0
 protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs eventArgs)
 {
     if (eventArgs != null)
     {
         eventArgs.ReadonlyCard[ShaCancelling.ShaCancellationCount]--;
     }
 }
Пример #3
0
        public void OnAfterDamageInflicted(Player owner, GameEvent gameEvent, GameEventArgs eventArgs)
        {
            ReadOnlyCard c = Game.CurrentGame.Judge(owner, this, null, (judgeResultCard) => { return(judgeResultCard.Suit != SuitType.Heart); });

            if (c.Suit != SuitType.Heart)
            {
                NotifySkillUse(new List <Player>()
                {
                    eventArgs.Source
                });
                List <DeckPlace> deck = new List <DeckPlace>();
                GangLieVerifier  ver  = new GangLieVerifier();
                ISkill           skill;
                List <Card>      cards;
                List <Player>    players;
                if (!Game.CurrentGame.UiProxies[eventArgs.Source].AskForCardUsage(new CardUsagePrompt("GangLie", Owner), ver, out skill, out cards, out players))
                {
                    Game.CurrentGame.DoDamage(owner, eventArgs.Source, 1, DamageElement.None, null, null);
                }
                else
                {
                    Game.CurrentGame.HandleCardDiscard(eventArgs.Source, cards);
                }
            }
            else
            {
                Trace.TraceInformation("Judgement fail");
            }
        }
Пример #4
0
 protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs inResponseTo)
 {
     if (dest.Health >= dest.MaxHealth)
     {
         return;
     }
     Game.CurrentGame.RecoverHealth(source, dest, 1);
 }
Пример #5
0
 protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs inResponseTo)
 {
     if (readonlyCard[EatOneGetAnotherFreeCoupon] == 1)
     {
         Game.CurrentGame.RecoverHealth(source, dest, 2);
     }
     else
     {
         Game.CurrentGame.RecoverHealth(source, dest, 1);
     }
 }
Пример #6
0
 protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs inResponseTo)
 {
     if (Game.CurrentGame.DyingPlayers.Count > 0)
     {
         Game.CurrentGame.RecoverHealth(source, dest, 1);
     }
     else
     {
         dest[JiuUsed] = 1;
         dest[Drank]   = 1;
     }
 }
Пример #7
0
        protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs inResponseTo)
        {
            DeckType            wuguDeck     = DeckType.Register("WuGu");
            DeckType            wuguFakeDeck = DeckType.Register("WuGuFake");
            List <List <Card> > answer;

            if (!Game.CurrentGame.UiProxies[dest].AskForCardChoice(new CardChoicePrompt("WuGuFengDeng"),
                                                                   new List <DeckPlace>()
            {
                new DeckPlace(null, wuguFakeDeck)
            },
                                                                   new List <string>()
            {
                "WuGu"
            },
                                                                   new List <int>()
            {
                1
            },
                                                                   new WuGuCardChoiceVerifier(FakeMapping),
                                                                   out answer,
                                                                   new AdditionalCardChoiceOptions()
            {
                IsWuGu = true
            }))
            {
                Trace.TraceInformation("Invalid answer for WuGu, choosing for you");
                answer = new List <List <Card> >();
                answer.Add(new List <Card>());
                answer[0].Add(Game.CurrentGame.Decks[null, wuguDeck][0]);
            }
            else
            {
                if (!FakeMapping.ContainsKey(answer[0][0]) || FakeMapping[answer[0][0]] == null)
                {
                    answer[0] = new List <Card>()
                    {
                        Game.CurrentGame.Decks[null, wuguDeck][0]
                    };
                }
                var theCard = answer[0][0];
                answer[0] = new List <Card>()
                {
                    FakeMapping[theCard]
                };
                FakeMapping[theCard] = null;
            }
            Game.CurrentGame.HandleCardTransferToHand(null, dest, answer[0], new MovementHelper()
            {
                IsWuGu = true
            });
        }
Пример #8
0
        protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs inResponseTo)
        {
            SingleCardUsageVerifier v1         = new SingleCardUsageVerifier((c) => { return(RequiredCard.GetType().IsAssignableFrom(c.Type.GetType())); }, false, RequiredCard);
            List <Player>           sourceList = new List <Player>();

            sourceList.Add(source);
            GameEventArgs args = new GameEventArgs();

            args.Source       = dest;
            args.Targets      = sourceList;
            args.Card         = new CompositeCard();
            args.Card.Type    = RequiredCard;
            args.ReadonlyCard = readonlyCard;
            try
            {
                Game.CurrentGame.Emit(GameEvent.PlayerRequireCard, args);
            }
            catch (TriggerResultException e)
            {
                if (e.Status == TriggerResult.Success)
                {
                    Game.CurrentGame.HandleCardPlay(dest, args.Skill, args.Cards, sourceList);
                    return;
                }
            }
            while (true)
            {
                IPlayerProxy  ui = Game.CurrentGame.UiProxies[dest];
                ISkill        skill;
                List <Player> p;
                List <Card>   cards;
                Game.CurrentGame.Emit(GameEvent.PlayerIsAboutToPlayCard, new PlayerIsAboutToUseOrPlayCardEventArgs()
                {
                    Source = dest, Verifier = v1
                });
                if (!ui.AskForCardUsage(new CardUsagePrompt(UsagePromptString, source),
                                        v1, out skill, out cards, out p))
                {
                    Trace.TraceInformation("Player {0} Invalid answer", dest);
                    Game.CurrentGame.DoDamage(source.IsDead ? null : source, dest, 1, DamageElement.None, card, readonlyCard);
                }
                else
                {
                    if (!Game.CurrentGame.HandleCardPlay(dest, skill, cards, sourceList))
                    {
                        continue;
                    }
                    Trace.TraceInformation("Player {0} Responded. ", dest.Id);
                }
                break;
            }
        }
Пример #9
0
            public override void Run(GameEvent gameEvent, GameEventArgs eventArgs)
            {
                if (!eventArgs.Targets.Contains(Owner))
                {
                    return;
                }
                DamageEventArgs damageArgs = eventArgs as DamageEventArgs;
                ReadOnlyCard    rCard      = new ReadOnlyCard(damageArgs.ReadonlyCard);

                rCard[ShiChouDamage] = 1;
                target[ShiChouTarget[Owner]]++;
                Game.CurrentGame.DoDamage(damageArgs.Source, target, Owner, damageArgs.Magnitude, damageArgs.Element, damageArgs.Card, rCard);
                throw new TriggerResultException(TriggerResult.End);
            }
Пример #10
0
        protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs inResponseTo)
        {
            IPlayerProxy ui = Game.CurrentGame.UiProxies[source];

            if (source.IsDead)
            {
                return;
            }
            if (dest.HandCards().Count + dest.Equipments().Count + dest.DelayedTools().Count == 0)
            {
                return;                                                                                    // ShunChai -> WuXie(from target) -> WuXie(soemone else) -> target has no card
            }
            List <DeckPlace> places = new List <DeckPlace>();

            places.Add(new DeckPlace(dest, DeckType.Hand));
            places.Add(new DeckPlace(dest, DeckType.Equipment));
            places.Add(new DeckPlace(dest, DeckType.DelayedTools));
            List <string> resultDeckPlace = new List <string>();

            resultDeckPlace.Add(ResultDeckName);
            List <int> resultDeckMax = new List <int>();

            resultDeckMax.Add(1);
            List <List <Card> > answer;

            if (!ui.AskForCardChoice(new CardChoicePrompt(ChoicePrompt), places, resultDeckPlace, resultDeckMax, new RequireOneCardChoiceVerifier(true), out answer))
            {
                Trace.TraceInformation("Player {0} Invalid answer", source.Id);
                answer = new List <List <Card> >();
                answer.Add(Game.CurrentGame.PickDefaultCardsFrom(places));
            }
            Card theCard = answer[0][0];

            if (ShunChaiDest(source, dest).DeckType == DeckType.Discard)
            {
                Game.CurrentGame.HandleCardDiscard(dest, new List <Card>()
                {
                    theCard
                });
            }
            else
            {
                Game.CurrentGame.HandleCardTransferToHand(dest, source, new List <Card>()
                {
                    theCard
                });
            }
        }
Пример #11
0
        protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs inResponseTo)
        {
            IPlayerProxy ui = Game.CurrentGame.UiProxies[dest];
            HuoGongCardChoiceVerifier v1 = new HuoGongCardChoiceVerifier();
            ISkill        s;
            List <Player> p;
            List <Card>   cards;

            if (dest.IsDead)
            {
                return;
            }
            if (!ui.AskForCardUsage(new CardUsagePrompt("HuoGong", source), v1, out s, out cards, out p))
            {
                Trace.TraceInformation("Player {0} Invalid answer", dest);
                cards = new List <Card>();
                if (Game.CurrentGame.Decks[dest, DeckType.Hand].Count == 0)
                {
                    Trace.TraceError("HuoGong Cannot Show Card! This should NOT have happened!");
                    return;
                }
                cards.Add(Game.CurrentGame.Decks[dest, DeckType.Hand][0]);
            }
            var theCard = cards[0];

            Game.CurrentGame.SyncCardAll(ref theCard);
            Trace.TraceInformation("Player {0} HuoGong showed {1}, ", dest.Id, theCard);
            Game.CurrentGame.NotificationProxy.NotifyShowCard(dest, theCard);
            if (source.IsDead)
            {
                return;
            }
            ui = Game.CurrentGame.UiProxies[source];
            HuoGongCardMatchVerifier v2 = new HuoGongCardMatchVerifier(theCard.Suit);

            Game.CurrentGame.HideHandCard(theCard);
            v2.Owner = source;
            if (ui.AskForCardUsage(new CardUsagePrompt("HuoGong2", dest, theCard.Suit), v2, out s, out cards, out p))
            {
                Game.CurrentGame.HandleCardDiscard(source, cards);
                Game.CurrentGame.DoDamage(source, dest, 1, DamageElement.Fire, card, readonlyCard);
            }
            else
            {
                Trace.TraceInformation("HuoGong aborted, failed to provide card");
            }
        }
Пример #12
0
 void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     ISkill skill;
     List<Card> cards;
     List<Player> players;
     DamageEventArgs args = eventArgs as DamageEventArgs;
     if (Game.CurrentGame.UiProxies[Owner].AskForCardUsage(new CardUsagePrompt("TianXiang"), new TianXiangVerifier(),
         out skill, out cards, out players))
     {
         NotifySkillUse(players);
         Game.CurrentGame.HandleCardDiscard(Owner, cards);
         ReadOnlyCard ncard = new ReadOnlyCard(args.ReadonlyCard);
         ncard[TianXiangDamage] = 1;
         players[0][TianXiangTarget]++;
         Game.CurrentGame.DoDamage(args.Source, players[0], Owner, args.Magnitude, args.Element, args.Card, ncard);
         throw new TriggerResultException(TriggerResult.End);
     }
 }
Пример #13
0
            protected void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
            {
                ParentEquipment.InUse = true;
                ReadOnlyCard c = Game.CurrentGame.Judge(Owner, null, new Card()
                {
                    Type = new BaGuaZhen()
                }, (judgeResultCard) => { return(judgeResultCard.SuitColor == SuitColorType.Red); });

                ParentEquipment.InUse = false;
                if (c.SuitColor == SuitColorType.Red)
                {
                    eventArgs.Cards = new List <Card>();
                    eventArgs.Skill = new CardWrapper(Owner, new Shan(), false);
                    ActionLog log = new ActionLog();
                    log.Source      = Owner;
                    log.SkillAction = this;
                    log.GameAction  = GameAction.None;
                    Game.CurrentGame.NotificationProxy.NotifySkillUse(log);
                    throw new TriggerResultException(TriggerResult.Success);
                }
            }
Пример #14
0
        protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs inResponseTo)
        {
            if (source.IsDead)
            {
                return;
            }
            if (dest.Equipments().Count == 0)
            {
                Game.CurrentGame.DoDamage(source, dest, 1, DamageElement.None, null, null);
                return;
            }
            int answer;

            if (dest.AskForMultipleChoice(new MultipleChoicePrompt("ShuiYanQiJun"), OptionPrompt.YesNoChoices, out answer) && answer == 1)
            {
                Game.CurrentGame.HandleCardDiscard(dest, new List <Card>(dest.Equipments()));
            }
            else
            {
                Game.CurrentGame.DoDamage(source, dest, 1, DamageElement.None, null, null);
            }
        }
Пример #15
0
 public override void Activate(Player p, Card c)
 {
     while (true)
     {
         GameEventArgs args = new GameEventArgs();
         args.Source  = null;
         args.Targets = new List <Player>()
         {
             p
         };
         args.Card         = c;
         args.ReadonlyCard = new ReadOnlyCard(c);
         try
         {
             Game.CurrentGame.Emit(GameEvent.CardUsageBeforeEffected, args);
         }
         catch (TriggerResultException e)
         {
             Trace.Assert(e.Status == TriggerResult.End);
             break;
         }
         ReadOnlyCard result = Game.CurrentGame.Judge(p, null, c, (judgeResultCard) => { return(judgeResultCard.Suit == SuitType.Spade && judgeResultCard.Rank >= 2 && judgeResultCard.Rank <= 9); });
         if (result.Suit == SuitType.Spade && result.Rank >= 2 && result.Rank <= 9)
         {
             var           roc  = new ReadOnlyCard(c);
             CardsMovement move = new CardsMovement();
             move.Cards = new List <Card>();
             move.Cards.Add(c);
             move.To = new DeckPlace(null, DeckType.Discard);
             Game.CurrentGame.MoveCards(move);
             Game.CurrentGame.DoDamage(null, p, 3, DamageElement.Lightning, c, roc);
             return;
         }
         break;
     }
     RecursiveShanDianDriver(p, p, c);
 }
Пример #16
0
        public override void Activate(Player p, Card c)
        {
            while (true)
            {
                GameEventArgs args = new GameEventArgs();
                args.Source  = null;
                args.Targets = new List <Player>()
                {
                    p
                };
                args.Card         = c;
                args.ReadonlyCard = new ReadOnlyCard(c);
                try
                {
                    Game.CurrentGame.Emit(GameEvent.CardUsageBeforeEffected, args);
                }
                catch (TriggerResultException e)
                {
                    Trace.Assert(e.Status == TriggerResult.End);
                    break;
                }
                ReadOnlyCard result = Game.CurrentGame.Judge(p, null, c, (judgeResultCard) => { return(judgeResultCard.Suit != SuitType.Heart); });
                if (result.Suit != SuitType.Heart)
                {
                    Game.CurrentGame.PhasesSkipped.Add(TurnPhase.Play);
                }
                break;
            }
            CardsMovement move = new CardsMovement();

            move.Cards = new List <Card>();
            move.Cards.Add(c);
            move.To = new DeckPlace(null, DeckType.Discard);
            move.Helper.IsFakedMove = true;
            Game.CurrentGame.MoveCards(move, false, Core.Utils.GameDelays.None);
        }
Пример #17
0
        void ZhaoLieProcess(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
        {
            ZhaoLieUsed = false;
            basicCards.Clear();
            notBasicCards.Clear();
            List <Card>   tao         = new List <Card>();
            DeckType      ZhaoLieDeck = DeckType.Register("ZhaoLie");
            CardsMovement move        = new CardsMovement();

            move.Cards = new List <Card>();
            int toDraw = 3;

            for (int i = 0; i < toDraw; i++)
            {
                Game.CurrentGame.SyncImmutableCardAll(Game.CurrentGame.PeekCard(0));
                Card c = Game.CurrentGame.DrawCard();
                c.Log.SkillAction = this;
                c.Log.Source      = Owner;
                move.Cards.Add(c);
                Game.CurrentGame.NotificationProxy.NotifyShowCard(null, c);
                if (c.Type is Tao)
                {
                    tao.Add(c);
                }
                else if (c.Type.IsCardCategory(CardCategory.Basic))
                {
                    basicCards.Add(c);
                }
                else
                {
                    notBasicCards.Add(c);
                }
            }
            move.To = new DeckPlace(null, ZhaoLieDeck);
            Game.CurrentGame.MoveCards(move);
            int answer = 0;
            List <OptionPrompt> prompts = new List <OptionPrompt>();

            prompts.Add(new OptionPrompt("ZhaoLieShangHai", notBasicCards.Count, basicCards.Count));
            prompts.Add(new OptionPrompt("ZhaoLieQiPai", notBasicCards.Count, basicCards.Count));
            while (true)
            {
                if (ZhaoLieTarget.HandCards().Count + ZhaoLieTarget.Equipments().Count < notBasicCards.Count)
                {
                    break;
                }
                ZhaoLieTarget.AskForMultipleChoice(new MultipleChoicePrompt("ZhaoLie"), prompts, out answer);
                break;
            }
            List <Card> toDiscard = new List <Card>();

            toDiscard.AddRange(notBasicCards);
            toDiscard.AddRange(tao);
            foreach (Card c in toDiscard)
            {
                c.Log             = new ActionLog();
                c.Log.SkillAction = this;
                c.Log.GameAction  = GameAction.PlaceIntoDiscard;
            }
            Game.CurrentGame.PlaceIntoDiscard(null, toDiscard);
            if (answer == 0)
            {
                if (notBasicCards.Count == 0)
                {
                    Game.CurrentGame.HandleCardTransferToHand(null, ZhaoLieTarget, basicCards);
                }
                else
                {
                    ReadOnlyCard rCard = new ReadOnlyCard(new Card()
                    {
                        Place = new DeckPlace(null, null)
                    });
                    rCard[ZhaoLieDamage] = 1;
                    Game.CurrentGame.DoDamage(Owner, ZhaoLieTarget, notBasicCards.Count, DamageElement.None, null, rCard);
                }
            }
            else
            {
                for (int i = 0; i < notBasicCards.Count; i++)
                {
                    Game.CurrentGame.ForcePlayerDiscard(ZhaoLieTarget, (pl, d) => { return(1 - d); }, true);
                }
                Game.CurrentGame.HandleCardTransferToHand(null, Owner, basicCards);
            }
            ZhaoLieTarget = null;
        }
Пример #18
0
 protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs inResponseTo)
 {
     Game.CurrentGame.DoDamage(source, dest, 1, ShaDamageElement, card, readonlyCard);
 }
Пример #19
0
 public void DoDamage(Player source, Player dest, int magnitude, DamageElement elemental, ICard card, ReadOnlyCard readonlyCard)
 {
     DoDamage(source, dest, dest, magnitude, elemental, card, readonlyCard);
 }
Пример #20
0
        /// <summary>
        /// 造成伤害
        /// </summary>
        /// <param name="source">伤害来源</param>
        /// <param name="dest">伤害目标</param>
        /// <param name="originalTarget">最初的伤害目标</param>
        /// <param name="magnitude">伤害点数</param>
        /// <param name="elemental">伤害属性</param>
        /// <param name="cards">造成伤害的牌</param>
        public void DoDamage(Player source, Player dest, Player originalTarget, int magnitude, DamageElement elemental, ICard card, ReadOnlyCard readonlyCard)
        {
            if (dest.IsDead)
            {
                return;
            }
            var damageArgs = new DamageEventArgs()
            {
                Source = source, OriginalTarget = originalTarget, Targets = new List <Player>(), Magnitude = magnitude, Element = elemental
            };
            HealthChangedEventArgs healthChangedArgs;
            int           ironShackledDamage        = 0;
            DamageElement ironShackledDamageElement = DamageElement.None;

            if (readonlyCard == null)
            {
                readonlyCard = new ReadOnlyCard(new Card()
                {
                    Place = new DeckPlace(null, null)
                });
            }
            damageArgs.ReadonlyCard = readonlyCard;
            if (card is CompositeCard)
            {
                if ((card as CompositeCard).Subcards != null)
                {
                    damageArgs.Cards = new List <Card>((card as CompositeCard).Subcards);
                }
            }
            else if (card is Card)
            {
                damageArgs.Cards = new List <Card>()
                {
                    card as Card
                };
            }
            else
            {
                damageArgs.Cards = new List <Card>();
            }
            damageArgs.Targets.Add(dest);
            damageArgs.Card = card;

            try
            {
                //伤害来源与基数、属性的确定发生在伤害结算前,连环,以及转移的伤害不会重新确定来源与基数,所以不会多次触发【裸衣】,以及【酒】
                while (damageArgs.ReadonlyCard[SourceAndElementIsConfirmed] == 0)
                {
                    Emit(GameEvent.DamageSourceConfirmed, damageArgs);
                    Emit(GameEvent.DamageElementConfirmed, damageArgs);
                    damageArgs.ReadonlyCard[SourceAndElementIsConfirmed] = 1;
                    break;
                }
                Emit(GameEvent.BeforeDamageComputing, damageArgs);
                Emit(GameEvent.DamageComputingStarted, damageArgs);
                Emit(GameEvent.DamageCaused, damageArgs);
                Emit(GameEvent.DamageInflicted, damageArgs);
                if (damageArgs.Magnitude == 0)
                {
                    Trace.TraceInformation("Damage is 0, aborting");
                    return;
                }
                if (damageArgs.Targets[0].IsIronShackled && damageArgs.Element != DamageElement.None)
                {
                    ironShackledDamage = damageArgs.Magnitude;
                    Trace.TraceInformation("IronShackled damage {0}", ironShackledDamage);
                    ironShackledDamageElement            = damageArgs.Element;
                    damageArgs.Targets[0].IsIronShackled = false;
                    // if this is TieSuo damage already, prevent itself from spreading...
                    if (readonlyCard[IsIronShackleDamage] == 1)
                    {
                        ironShackledDamage = 0;
                    }
                }
                healthChangedArgs = new HealthChangedEventArgs(damageArgs);
                Emit(GameEvent.BeforeHealthChanged, healthChangedArgs);
                damageArgs.Magnitude = -healthChangedArgs.Delta;
            }
            catch (TriggerResultException e)
            {
                if (e.Status == TriggerResult.End)
                {
                    //伤害结算完毕事件应该总是被触发
                    //受到伤害的角色如果存活能发动的技能/会执行的技能效果:【酒诗②】、执行【天香】摸牌的效果。
                    Emit(GameEvent.DamageComputingFinished, damageArgs);
                    Trace.TraceInformation("Damage Aborted");
                    return;
                }
                Trace.Assert(false);
                return;
            }

            Trace.Assert(damageArgs.Targets.Count == 1);
            damageArgs.Targets[0].Health -= damageArgs.Magnitude;
            Trace.TraceInformation("Player {0} Lose {1} hp, @ {2} hp", damageArgs.Targets[0].Id, damageArgs.Magnitude, damageArgs.Targets[0].Health);
            NotificationProxy.NotifyDamage(damageArgs.Source, damageArgs.Targets[0], damageArgs.Magnitude, damageArgs.Element);
            GameDelays.Delay(GameDelays.Damage);

            try
            {
                Emit(GameEvent.AfterHealthChanged, healthChangedArgs);
            }
            catch (TriggerResultException)
            {
            }
            Emit(GameEvent.AfterDamageCaused, damageArgs);
            Emit(GameEvent.AfterDamageInflicted, damageArgs);
            Emit(GameEvent.DamageComputingFinished, damageArgs);
            if (ironShackledDamage != 0)
            {
                List <Player> toProcess = new List <Player>(AlivePlayers);
                SortByOrderOfComputation(CurrentPlayer, toProcess);
                foreach (Player p in toProcess)
                {
                    if (p.IsIronShackled)
                    {
                        readonlyCard[IsIronShackleDamage] = 1;
                        DoDamage(damageArgs.Source, p, originalTarget, ironShackledDamage, ironShackledDamageElement, card, readonlyCard);
                    }
                }
            }
        }
Пример #21
0
        public override void Run(GameEvent gameEvent, GameEventArgs eventArgs)
        {
            ReadOnlyCard            card = eventArgs.ReadonlyCard;
            SingleCardUsageVerifier v1   = new SingleCardUsageVerifier((c) => { return(c.Type is WuXieKeJi); }, true, new WuXieKeJi());

            v1.Helper.ExtraTimeOutSeconds = -9;
            List <Card>   cards;
            List <Player> players;
            ISkill        skill;
            Player        responder;
            bool          WuXieSuccess = false;

            Trace.Assert(eventArgs.Targets.Count == 1);
            Player promptPlayer = eventArgs.Targets[0];
            ICard  promptCard   = eventArgs.ReadonlyCard;

            if (card != null && CardCategoryManager.IsCardCategory(card.Type.Category, CardCategory.Tool) &&
                card[WuXieKeJi.CannotBeCountered] == 0 && card[WuXieKeJi.CannotBeCountered[promptPlayer]] == 0)
            {
                bool askWuXie = false;
                foreach (var p in Game.CurrentGame.AlivePlayers)
                {
                    foreach (var c in Game.CurrentGame.Decks[p, DeckType.Hand])
                    {
                        if (c.Type is WuXieKeJi)
                        {
                            askWuXie = true;
                            break;
                        }
                    }
                    foreach (var sk in p.ActionableSkills)
                    {
                        CardTransformSkill cts = sk as CardTransformSkill;
                        if (cts != null)
                        {
                            if (cts.PossibleResults == null)
                            {
                                askWuXie = true;
                                break;
                            }
                            foreach (var pr in cts.PossibleResults)
                            {
                                if (pr is WuXieKeJi)
                                {
                                    askWuXie = true;
                                    break;
                                }
                            }
                        }
                    }
                    if (askWuXie)
                    {
                        break;
                    }
                }
                Game.CurrentGame.SyncConfirmationStatus(ref askWuXie);
                if (!askWuXie)
                {
                    return;
                }
                foreach (var p in Game.CurrentGame.AlivePlayers)
                {
                    Game.CurrentGame.Emit(GameEvent.PlayerIsAboutToPlayCard, new PlayerIsAboutToUseOrPlayCardEventArgs()
                    {
                        Source = p, Verifier = v1
                    });
                }
                while (true)
                {
                    Prompt prompt = new CardUsagePrompt("WuXieKeJi", promptPlayer, promptCard);
                    if (Game.CurrentGame.GlobalProxy.AskForCardUsage(
                            prompt, v1, out skill, out cards, out players, out responder))
                    {
                        try
                        {
                            GameEventArgs args = new GameEventArgs();
                            args.Source  = responder;
                            args.Targets = players;
                            args.Skill   = skill;
                            args.Cards   = cards;
                            Game.CurrentGame.Emit(GameEvent.CommitActionToTargets, args);
                        }
                        catch (TriggerResultException e)
                        {
                            Trace.Assert(e.Status == TriggerResult.Retry);
                            continue;
                        }
                        promptPlayer    = responder;
                        promptCard      = new CompositeCard();
                        promptCard.Type = new WuXieKeJi();
                        (promptCard as CompositeCard).Subcards = null;
                        WuXieSuccess = !WuXieSuccess;
                    }
                    else
                    {
                        break;
                    }
                }
            }
            if (WuXieSuccess)
            {
                throw new TriggerResultException(TriggerResult.End);
            }
        }
Пример #22
0
        protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs inResponseTo)
        {
            Player current   = dest;
            bool   firstTime = true;

            while (true)
            {
                List <Player> sourceList = new List <Player>();
                if (current == dest)
                {
                    sourceList.Add(source);
                }
                else
                {
                    sourceList.Add(dest);
                }
                IPlayerProxy            ui = Game.CurrentGame.UiProxies[current];
                SingleCardUsageVerifier v1 = new SingleCardUsageVerifier((c) => { return(c.Type is Sha); }, false, new Sha());
                ISkill          skill;
                List <Player>   p;
                List <Card>     cards;
                CardUsagePrompt prompt;
                if (current.IsDead)
                {
                    return;
                }
                if (firstTime)
                {
                    prompt = new CardUsagePrompt("JueDou", source);;
                }
                else
                {
                    prompt    = new CardUsagePrompt("JueDou2", current == dest ? source : dest);
                    firstTime = false;
                }
                int  numberOfShaRequired = current == dest ? readonlyCard[CardAttribute.TargetRequireTwoResponses[dest]] + 1 : readonlyCard[CardAttribute.SourceRequireTwoResponses] + 1;
                bool cannotProvideSha    = false;
                while (numberOfShaRequired > 0)
                {
                    Game.CurrentGame.Emit(GameEvent.PlayerIsAboutToPlayCard, new PlayerIsAboutToUseOrPlayCardEventArgs()
                    {
                        Source = current, Verifier = v1
                    });
                    if (!ui.AskForCardUsage(prompt, v1, out skill, out cards, out p))
                    {
                        Trace.TraceInformation("Player {0} Invalid answer", current);
                        cannotProvideSha = true;
                        break;
                    }
                    if (!Game.CurrentGame.HandleCardPlay(current, skill, cards, sourceList))
                    {
                        continue;
                    }
                    numberOfShaRequired--;
                }
                if (cannotProvideSha)
                {
                    break;
                }
                Trace.TraceInformation("Player {0} SHA, ", current.Id);
                if (current == dest)
                {
                    current = source;
                }
                else
                {
                    current = dest;
                }
            }
            Player won = current == dest ? source : dest;

            Game.CurrentGame.DoDamage(won, current, 1, DamageElement.None, card, readonlyCard);
        }
Пример #23
0
 protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs inResponseTo)
 {
     Game.CurrentGame.DrawCards(dest, 2);
 }
Пример #24
0
        protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs inResponseTo)
        {
            if (source.IsDead)
            {
                return;
            }
            if (dest.HandCards().Count + dest.Equipments().Count == 0)
            {
                return;                                                        // ShunChai -> WuXie(from target) -> WuXie(soemone else) -> target has no card
            }
            List <string> resultDeckPlace = new List <string>();

            resultDeckPlace.Add("GuoHeChaiQiao");
            List <int> resultDeckMax = new List <int>();

            resultDeckMax.Add(1);
            List <List <Card> > answer;
            bool doHandCard = true;

            if (dest.Equipments().Count != 0)
            {
                int result = 0;
                source.AskForMultipleChoice(new MultipleChoicePrompt("GuoHeChaiQiao2"), new List <OptionPrompt>()
                {
                    new OptionPrompt("ShouPai"), new OptionPrompt("ZhuangBeiPai")
                }, out result);
                if (result == 1)
                {
                    doHandCard = false;
                }
            }
            if (doHandCard)
            {
                Game.CurrentGame.SyncImmutableCards(source, Game.CurrentGame.Decks[dest, DeckType.Hand]);
                Game.CurrentGame.HandCardVisibility[source].Add(dest);
                var places = new List <DeckPlace>()
                {
                    new DeckPlace(dest, DeckType.Hand)
                };
                if (!source.AskForCardChoice(new CardChoicePrompt("GuoHeChaiQiao2"), places, resultDeckPlace, resultDeckMax, new RequireOneCardChoiceVerifier(true), out answer))
                {
                    Trace.TraceInformation("Player {0} Invalid answer", source.Id);
                    answer = new List <List <Card> >();
                    answer.Add(Game.CurrentGame.PickDefaultCardsFrom(places));
                }
                foreach (Card c in dest.HandCards())
                {
                    Game.CurrentGame.HideHandCard(c);
                }
                Game.CurrentGame.HandCardVisibility[source].Remove(dest);
                Game.CurrentGame.HandleCardDiscard(dest, answer[0]);
            }
            else
            {
                var places = new List <DeckPlace>()
                {
                    new DeckPlace(dest, DeckType.Equipment)
                };
                if (!source.AskForCardChoice(new CardChoicePrompt("GuoHeChaiQiao2"), places, resultDeckPlace, resultDeckMax, new RequireOneCardChoiceVerifier(true), out answer))
                {
                    Trace.TraceInformation("Player {0} Invalid answer", source.Id);
                    answer = new List <List <Card> >();
                    answer.Add(Game.CurrentGame.PickDefaultCardsFrom(places));
                }
                Game.CurrentGame.HandleCardDiscard(dest, answer[0]);
            }
        }
Пример #25
0
 protected override void Process(Players.Player source, Players.Player dest, ICard card, ReadOnlyCard cardr, GameEventArgs inResponseTo)
 {
     throw new NotImplementedException();
 }
Пример #26
0
 protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard cardr, GameEventArgs inResponseTo)
 {
     dest.IsIronShackled = !dest.IsIronShackled;
     Game.CurrentGame.NotificationProxy.NotifyIronShackled(dest);
 }