Beispiel #1
0
        void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
        {
            foreach (Card c in eventArgs.Cards)
            {
                if (c.HistoryPlace1.DeckType == DeckType.Equipment && c.HistoryPlace1.Player == Owner)
                {
                    if (AskForSkillUse())
                    {
                        NotifySkillUse(new List<Player>());
                        int answer = 0;
                        Owner.AskForMultipleChoice(new MultipleChoicePrompt("XuanFeng"), new List<OptionPrompt>() { new OptionPrompt("XuanFengChuSha"), new OptionPrompt("XuanFengShangHai") }, out answer);
                        if (answer == 0)
                        {
                            ISkill skill;
                            List<Card> cards;
                            List<Player> players;
                            if (Owner.AskForCardUsage(new CardUsagePrompt("XuanFeng1"), new XuanFeng1Verifier(),
                                out skill, out cards, out players))
                            {
                                try
                                {
                                    GameEventArgs args = new GameEventArgs();
                                    Owner[Sha.NumberOfShaUsed]--;
                                    args.Source = Owner;
                                    args.Targets = new List<Player>(players);
                                    args.Skill = new XuanFengShaComposerSkill();
                                    args.Cards = cards;
                                    Game.CurrentGame.Emit(GameEvent.CommitActionToTargets, args);
                                }
                                catch (TriggerResultException e)
                                {
                                    Trace.Assert(e.Status == TriggerResult.Retry);
                                    continue;
                                }
                            }
                        }
                        else
                        {
                            ISkill skill;
                            List<Card> cards;
                            List<Player> players;
                            if (Owner.AskForCardUsage(new CardUsagePrompt("XuanFeng2"), new XuanFeng2Verifier(), out skill, out cards, out players))
                            {
                                Game.CurrentGame.DoDamage(Owner, players[0], 1, DamageElement.None, null, null);
                            }

                        }
                    }
                }
            }
        }
Beispiel #2
0
 void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     var card = Game.CurrentGame.Judge(Owner, this, null, (judgeResultCard) => { return judgeResultCard.SuitColor == SuitColorType.Black; });
     if (card.SuitColor == SuitColorType.Black)
     {
         ISkill skill;
         List<Card> cards;
         List<Player> players;
         int toDraw = Owner.LostHealth;
         List<Card> remainingCards = new List<Card>();
         CardsMovement move = new CardsMovement();
         for (int i = 0; i < toDraw; i++)
         {
             Game.CurrentGame.SyncImmutableCard(Owner, Game.CurrentGame.PeekCard(0));
             Card c = Game.CurrentGame.DrawCard();
             move.Cards.Add(c);
             remainingCards.Add(c);
         }
         move.To = new DeckPlace(Owner, DeckType.Hand);
         move.Helper.IsFakedMove = true;
         Game.CurrentGame.MoveCards(move);
         if (!Owner.AskForCardUsage(new CardUsagePrompt("MiJi"), new MiJiVerifier(), out skill, out cards, out players))
         {
             players = new List<Player>() { Owner };
         }
         Game.CurrentGame.InsertBeforeDeal(null, remainingCards, new MovementHelper() { IsFakedMove = true });
         Game.CurrentGame.DrawCards(players[0], toDraw);
     }
 }
Beispiel #3
0
 bool TianMingProcess(Player player)
 {
     int discardedCount = Math.Min(player.HandCards().Count + player.Equipments().Count, 2);
     ISkill skill;
     List<Card> cards;
     List<Player> players;
     CardUsagePrompt prompt = new CardUsagePrompt("TianMing");
     CardUsagePrompt otherPrompt = new CardUsagePrompt("TianMingOther", discardedCount);
     CardUsagePrompt otherIsNakedPrompt = new CardUsagePrompt("TianMingOtherIsNaked");
     if (player.AskForCardUsage(player == Owner ? prompt : (discardedCount == 0 ? otherIsNakedPrompt : otherPrompt), new TianMingVerifier(discardedCount), out skill, out cards, out players))
     {
         if (player == Owner)
         {
             TianMingEffect = 0;
         }
         else if (player.IsMale)
         {
             TianMingEffect = 1;
         }
         else
         {
             TianMingEffect = 2;
         }
         NotifySkillUse();
         if (cards.Count > 0)
         {
             Game.CurrentGame.HandleCardDiscard(player, cards);
         }
         Game.CurrentGame.DrawCards(player, 2);
         return true;
     }
     return false;
 }
Beispiel #4
0
 protected void Run(Player owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     ISkill skill;
     List<Card> cards;
     List<Player> players;
     if (owner.AskForCardUsage(new CardUsagePrompt("MieJi", this), new MieJiVerifier(eventArgs.Targets[0], eventArgs.Card, eventArgs.Card.Type), out skill, out cards, out players))
     {
         NotifySkillUse(players);
         eventArgs.UiTargets.AddRange(players);
         eventArgs.Targets = eventArgs.Card.Type.ActualTargets(eventArgs.Source, eventArgs.UiTargets, eventArgs.Card);
     }
 }
Beispiel #5
0
 public void StoreChun(Player owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     ISkill skill;
     List<Card> cards;
     List<Player> players;
     if (owner.AskForCardUsage(new CardUsagePrompt("ChunLao"), new ChunLaoStoreChunVerifier(), out skill, out cards, out players))
     {
         NotifySkillUse();
         CardsMovement move = new CardsMovement();
         move.Cards = cards;
         move.To = new DeckPlace(Owner, ChunDeck);
         Game.CurrentGame.MoveCards(move);
     }
 }
Beispiel #6
0
 void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     ISkill skill;
     List<Card> cards;
     List<Player> players;
     if (Owner.AskForCardUsage(new CardUsagePrompt("HuWei"), new HuWeiVerifier(), out skill, out cards, out players))
     {
         NotifySkillUse();
         GameEventArgs args = new GameEventArgs();
         args.Source = Owner;
         args.Targets = players;
         args.Skill = new CardWrapper(Owner, new ShuiYanQiJun(), false);
         args.Cards = new List<Card>();
         Game.CurrentGame.Emit(GameEvent.CommitActionToTargets, args);
     }
 }
Beispiel #7
0
 void Run(Player owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     ISkill skill;
     List<Card> cards;
     List<Player> players;
     if (owner.AskForCardUsage(new CardUsagePrompt("YuanHu", this), new YuanHuVerifier(), out skill, out cards, out players))
     {
         CardCategory type = cards[0].Type.Category;
         YuanHuEffect = effectMap[type];
         NotifySkillUse(players);
         Game.CurrentGame.HandleCardTransfer(owner, players[0], DeckType.Equipment, cards);
         switch (type)
         {
             case CardCategory.Weapon:
                 {
                     var result = from player in Game.CurrentGame.AlivePlayers where player != players[0] && Game.CurrentGame.DistanceTo(players[0], player) == 1 select player;
                     if (result.Count() == 0) break;
                     List<Card> nCards;
                     List<Player> nPlayers;
                     if (!owner.AskForCardUsage(new CardUsagePrompt("YuanHuQiZhi"), new YuanHuChoiceOnePlayer(players[0]), out skill, out nCards, out nPlayers))
                     {
                         nPlayers = new List<Player>();
                         nPlayers.Add(result.First());
                     }
                     if (nPlayers[0].HandCards().Count + nPlayers[0].DelayedTools().Count + nPlayers[0].Equipments().Count > 0)
                     {
                         var Card = Game.CurrentGame.SelectACardFrom(nPlayers[0], owner, new CardChoicePrompt("YuanHu", nPlayers[0], owner), "YuanHu", false, false);
                         Game.CurrentGame.HandleCardDiscard(nPlayers[0], new List<Card>() { Card });
                     }
                     break;
                 }
             case CardCategory.Armor:
                 {
                     Game.CurrentGame.DrawCards(players[0], 1);
                     break;
                 }
             case CardCategory.DefensiveHorse:
             case CardCategory.OffensiveHorse:
                 {
                     Game.CurrentGame.RecoverHealth(owner, players[0], 1);
                     break;
                 }
             default:
                 break;
         }
     }
 }
Beispiel #8
0
 /// <summary>
 /// 某玩家对某玩家视为使用一张虚拟的杀,能被技能转化,影响选择的目标,如疠火,朱雀羽扇
 /// </summary>
 public static void UseDummyShaTo(Player source, Player target, CardHandler shaType, Prompt prompt, CardAttribute helper = null, bool notifyShaSound = true)
 {
     CompositeCard sha = new CompositeCard() { Type = shaType };
     var v1 = new DummyShaVerifier(target, shaType, helper);
     ISkill skill;
     List<Card> cards;
     List<Player> players;
     Game.CurrentGame.Emit(GameEvent.PlayerIsAboutToUseCard, new PlayerIsAboutToUseOrPlayCardEventArgs() { Source = source, Verifier = v1 });
     source.AskForCardUsage(prompt, v1, out skill, out cards, out players);
     GameEventArgs args = new GameEventArgs();
     args.Source = source;
     args.Targets = new List<Player>(players);
     if (target != null) args.Targets.Add(target);
     args.Skill = skill == null ? new CardWrapper(source, shaType, notifyShaSound) : skill;
     args.Cards = cards;
     CompositeCard card = null;
     if (skill != null)
     {
         List<Card> dummyCards = new List<Card>() { new Card() { Type = shaType, Place = new DeckPlace(null, DeckType.None) } };
         (skill as CardTransformSkill).TryTransform(dummyCards, null, out card);
         //虚拟的杀是不能有子卡的。
         card.Subcards.Clear();
     }
     //在触发 CommitActionToTargets 的时候,只有在这里,args.Card才会被赋值,且为CompositeCard
     args.Card = card;
     if (args.Targets.Count == 0)
     {
         foreach (Player p in Game.CurrentGame.AlivePlayers)
         {
             if (p != source && v1.FastVerify(source, skill, cards, new List<Player>() { p }) != VerifierResult.Fail)
             {
                 args.Targets.Add(p);
                 break;
             }
         }
     }
     try
     {
         Game.CurrentGame.Emit(GameEvent.CommitActionToTargets, args);
     }
     catch (TriggerResultException)
     {
         //程序总是不应该执行到这里的
         Trace.Assert(false);
     }
 }
Beispiel #9
0
 void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     ISkill skill;
     List<Card> cards;
     List<Player> players;
     if (Owner.AskForCardUsage(new CardUsagePrompt("ShiChou", this), new ShiChouVerifier(), out skill, out cards, out players))
     {
         NotifySkillUse(players);
         Owner[ShiChouUsed] = 1;
         players[0][ShiChouSource[Owner]] = 1;
         Game.CurrentGame.HandleCardTransferToHand(Owner, players[0], cards);
         players[0][ShiChouStatus] = 1;
         Trigger tri1 = new ShiChouProtect(Owner, players[0]);
         Trigger tri2 = new ShiChouDrawCards(players[0], Owner);
         Trigger tri3 = new ShiChouRemoval(players[0], Owner, tri1, tri2);
         Game.CurrentGame.RegisterTrigger(GameEvent.DamageInflicted, tri1);
         Game.CurrentGame.RegisterTrigger(GameEvent.DamageComputingFinished, tri2);
         Game.CurrentGame.RegisterTrigger(GameEvent.PlayerIsAboutToDie, tri3);
     }
 }
Beispiel #10
0
 public void SaveALife(Player owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     ISkill skill;
     List<Card> cards;
     List<Player> players;
     while (eventArgs.Targets[0].Health <= 0 && Game.CurrentGame.Decks[owner, ChunDeck].Count > 0 &&
         owner.AskForCardUsage(new CardUsagePrompt("ChunLaoSave"), new  ChuLaoVerifier(), out skill, out cards, out players))
     {
         NotifySkillUse(eventArgs.Targets);
         Card theCard = cards[0];
         Game.CurrentGame.HandleCardDiscard(owner, new List<Card>() { theCard });
         Game.CurrentGame.IsDying.Push(eventArgs.Targets[0]);
         GameEventArgs args = new GameEventArgs();
         args.Source = eventArgs.Targets[0];
         args.Targets = new List<Player>() { eventArgs.Targets[0] };
         args.Skill = new ChunLaoJiuCardTransformSkill();
         args.Cards = new List<Card>();
         Game.CurrentGame.Emit(GameEvent.CommitActionToTargets, args);
         Game.CurrentGame.IsDying.Pop();
     }
 }
Beispiel #11
0
 void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     int drawCount = Owner.LostHealth;
     Game.CurrentGame.DrawCards(Owner, drawCount);
     drawCount = Math.Min(Owner.HandCards().Count, drawCount);
     while (drawCount > 0)
     {
         ISkill skill;
         List<Card> cards;
         List<Player> players;
         if (Owner.AskForCardUsage(new CardUsagePrompt("MiJi", drawCount), new MiJiVerifier(drawCount), out skill, out cards, out players))
         {
             drawCount -= cards.Count;
             Game.CurrentGame.HandleCardTransferToHand(Owner, players[0], cards);
         }
         else
         {
             drawCount = 0;
         }
     }
 }
Beispiel #12
0
 void Run(Player owner, GameEvent gameEvent, GameEventArgs eventArgs, List<Card> cards, List<Player> players)
 {
     Card theCard = cards[0];
     Game.CurrentGame.HandleCardTransfer(owner, players[0], DeckType.Equipment, cards);
     switch (theCard.Type.Category)
     {
         case CardCategory.Weapon:
             {
                 var result = from player in Game.CurrentGame.AlivePlayers where player != players[0] && Game.CurrentGame.DistanceTo(players[0], player) == 1 select player;
                 if (result.Count() == 0) break;
                 ISkill skill;
                 List<Card> nCards;
                 List<Player> nPlayers;
                 if (!owner.AskForCardUsage(new CardUsagePrompt("YuanHuQiZhi"), new YuanHuChoiceOnePlayer(players[0]), out skill, out nCards, out nPlayers))
                 {
                     nPlayers = new List<Player>();
                     nPlayers.Add(result.First());
                 }
                 var Card = Game.CurrentGame.SelectACardFrom(nPlayers[0], owner, new CardChoicePrompt("YuanHu", nPlayers[0], owner), "YuanHu");
                 Game.CurrentGame.HandleCardDiscard(nPlayers[0], new List<Card>() { Card });
                 break;
             }
         case CardCategory.Armor:
             {
                 Game.CurrentGame.DrawCards(players[0], 1);
                 break;
             }
         case CardCategory.DefensiveHorse:
         case CardCategory.OffensiveHorse:
             {
                 Game.CurrentGame.RecoverHealth(owner, players[0], 1);
                 break;
             }
         default:
             break;
     }
 }
Beispiel #13
0
 void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     Owner[FenYong.FenYongStatus] = 0;
     int answer = 0;
     Player current = Game.CurrentGame.CurrentPlayer;
     int choiceCount = Owner.LostHealth;
     int currentPlayerCardsCount = current.HandCards().Count + current.Equipments().Count();
     List<OptionPrompt> prompts = new List<OptionPrompt>();
     prompts.Add(new OptionPrompt("XueHenQiPai", current, choiceCount));
     prompts.Add(new OptionPrompt("XueHenSha"));
     Owner.AskForMultipleChoice(new MultipleChoicePrompt("XueHen"), prompts, out answer);
     if (answer == 0)
     {
         Owner[XueHenEffect] = 0;
         NotifySkillUse();
         if (currentPlayerCardsCount <= choiceCount)
         {
             List<Card> cards = new List<Card>();
             cards.AddRange(current.HandCards());
             cards.AddRange(current.Equipments());
             Game.CurrentGame.HandleCardDiscard(current, cards);
             return;
         }
         List<List<Card>> choiceAnswer;
         List<DeckPlace> sourcePlace = new List<DeckPlace>();
         sourcePlace.Add(new DeckPlace(current, DeckType.Hand));
         sourcePlace.Add(new DeckPlace(current, DeckType.Equipment));
         if (!Owner.AskForCardChoice(new CardChoicePrompt("XueHen", current, Owner),
             sourcePlace,
             new List<string>() { "QiPaiDui" },
             new List<int>() { choiceCount },
             new RequireCardsChoiceVerifier(choiceCount),
             out choiceAnswer,
             null,
             CardChoiceCallback.GenericCardChoiceCallback))
         {
             choiceAnswer = new List<List<Card>>();
             choiceAnswer.Add(Game.CurrentGame.PickDefaultCardsFrom(new List<DeckPlace>() { new DeckPlace(current, DeckType.Hand), new DeckPlace(current, DeckType.Equipment) }, choiceCount));
         }
         Game.CurrentGame.HandleCardDiscard(current, choiceAnswer[0]);
     }
     else
     {
         ISkill skill;
         List<Card> cards;
         List<Player> players;
         if (!Owner.AskForCardUsage(new CardUsagePrompt("XueHen"), new XueHenShaVerifier(), out skill, out cards, out players))
         {
             players = new List<Player>();
             List<Player> nPlayers = Game.CurrentGame.AlivePlayers;
             players.Add(nPlayers[0]);
         }
         Owner[XueHenEffect] = 1;
         NotifySkillUse(players);
         GameEventArgs args = new GameEventArgs();
         Owner[Sha.NumberOfShaUsed]--;
         args.Source = Owner;
         args.Targets = players;
         args.Skill = new CardWrapper(Owner, new RegularSha());
         Game.CurrentGame.Emit(GameEvent.CommitActionToTargets, args);
     }
 }
Beispiel #14
0
 void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     ISkill skill;
     List<Card> cards;
     List<Player> players;
     if (Owner.AskForCardUsage(new CardUsagePrompt("JunWei"), new JunWeiVerifier(), out skill, out cards, out players))
     {
         NotifySkillUse(players);
         Game.CurrentGame.HandleCardDiscard(Owner, cards);
         Player target = players[0];
         if (target.AskForCardUsage(new CardUsagePrompt("JunWeiShowCard"), new JunWeiShowCardVerifier(), out skill, out cards, out players))
         {
             Card temp = cards[0];
             Game.CurrentGame.NotificationProxy.NotifyShowCard(target, temp);
             if (!Owner.AskForCardUsage(new CardUsagePrompt("JunWeiGiveShan"), new JunWeiGiveShanVerifier(), out skill, out cards, out players))
             {
                 players = new List<Player>() { Owner };
             }
             Game.CurrentGame.SyncCardAll(ref temp);
             Game.CurrentGame.HandleCardTransferToHand(target, players[0], new List<Card>() { temp });
         }
         else
         {
             Game.CurrentGame.LoseHealth(target, 1);
             if (target.Equipments().Count == 0) return;
             GameDelays.Delay(GameDelayTypes.JunWei);
             List<List<Card>> answer;
             List<DeckPlace> sourceDecks = new List<DeckPlace>();
             sourceDecks.Add(new DeckPlace(target, DeckType.Equipment));
             if (!Owner.AskForCardChoice(new CardChoicePrompt("JunWeiChoice", target, Owner),
                 sourceDecks,
                 new List<string>() { "JunWei" },
                 new List<int>() { 1 },
                 new RequireOneCardChoiceVerifier(),
                 out answer))
             {
                 answer = new List<List<Card>>();
                 answer.Add(new List<Card>());
                 answer[0].Add(target.Equipments().First());
             }
             junweiTarget.Add(target);
             Game.CurrentGame.HandleCardTransfer(target, target, JunWeiDeck, answer[0]);
         }
     }
 }
Beispiel #15
0
 void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     ISkill skill;
     List<Card> cards;
     List<Player> players;
     bool shensu1 = gameEvent == GameEvent.PhaseOutEvents[TurnPhase.Start];
     CardUsagePrompt shensu1Prompt = new CardUsagePrompt("ShenSu1", this);
     CardUsagePrompt shensu2Prompt = new CardUsagePrompt("ShenSu2", this);
     if (Owner.AskForCardUsage(shensu1 ? shensu1Prompt : shensu2Prompt, new ShenSuVerifier(shensu1, verifier), out skill, out cards, out players))
     {
         NotifySkillUse();
         if (!shensu1) Game.CurrentGame.HandleCardDiscard(Owner, cards);
         GameEventArgs args = new GameEventArgs();
         Owner[Sha.NumberOfShaUsed]--;
         args.Source = Owner;
         args.Targets = players;
         args.Skill = skill == null ? new CardWrapper(Owner, new RegularSha(), false) : skill;
         args.Cards = new List<Card>();
         CardTransformSkill transformSkill = skill as CardTransformSkill;
         if (transformSkill != null)
         {
             CompositeCard card;
             transformSkill.TryTransform(new List<Card>() { new Card() { Type = new RegularSha(), Place = new DeckPlace(null, DeckType.None) } }, null, out card);
             card.Subcards.Clear();
             args.Card = card;
         }
         Game.CurrentGame.Emit(GameEvent.CommitActionToTargets, args);
         if (shensu1)
         {
             Game.CurrentGame.PhasesSkipped.Add(TurnPhase.Judge);
             Game.CurrentGame.PhasesSkipped.Add(TurnPhase.Draw);
         }
         else Game.CurrentGame.PhasesSkipped.Add(TurnPhase.Play);
     }
 }