コード例 #1
0
ファイル: ZhiYu.cs プロジェクト: RagingBigFemaleBird/sgs
 public void Run(Player owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     Game.CurrentGame.DrawCards(owner, 1);
     Game.CurrentGame.SyncImmutableCardsAll(owner.HandCards());
     Game.CurrentGame.ShowHandCards(owner, owner.HandCards());
     var result = from card in owner.HandCards() select card.SuitColor;
     if (result.Distinct().Count() == 1)
     {
         Game.CurrentGame.ForcePlayerDiscard(eventArgs.Source, (p, i) => { return 1 - i; }, false);
     }
 }
コード例 #2
0
ファイル: KuiWei.cs プロジェクト: RagingBigFemaleBird/sgs
 void KuiWeiDiscard(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     Owner[KuiWeiStatus] = 0;
     int count = GetWeaponCount();
     if (count == 0 || Owner.HandCards().Count + Owner.Equipments().Count == 0) return;
     NotifySkillUse();
     if (count >= Owner.HandCards().Count + Owner.Equipments().Count)
     {
         List<Card> cards = new List<Card>();
         cards.AddRange(Owner.HandCards());
         cards.AddRange(Owner.Equipments());
         Game.CurrentGame.HandleCardDiscard(Owner, cards);
         return;
     }
     Game.CurrentGame.ForcePlayerDiscard(Owner, (p, d) => { return count - d; }, true);
 }
コード例 #3
0
ファイル: XiuLuo.cs プロジェクト: RagingBigFemaleBird/sgs
 void Run(Player owner, GameEvent gameEvent, GameEventArgs args)
 {
     while (owner.HandCards().Count > 0 && owner.DelayedTools().Count > 0)
     {
         List<List<Card>> answer;
         List<DeckPlace> sourceDeck = new List<DeckPlace>();
         sourceDeck.Add(new DeckPlace(owner, DeckType.DelayedTools));
         sourceDeck.Add(new DeckPlace(owner, DeckType.Hand));
         AdditionalCardChoiceOptions options = new AdditionalCardChoiceOptions();
         options.IsCancellable = true;
         if (owner.AskForCardChoice(new CardChoicePrompt("XiuLuo", owner),
             sourceDeck,
             new List<string>() { "XLJinNang", "XLShouPai" },
             new List<int>() { 1, 1 },
             new XiuLuoVerifier(),
             out answer,
             options))
         {
             NotifySkillUse();
             Game.CurrentGame.HandleCardDiscard(owner, answer[1]);
             Game.CurrentGame.HandleCardDiscard(owner, answer[0]);
         }
         else break;
     }
 }
コード例 #4
0
ファイル: ShunChai.cs プロジェクト: RagingBigFemaleBird/sgs
        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 });
            }
        }
コード例 #5
0
ファイル: TianMing.cs プロジェクト: RagingBigFemaleBird/sgs
 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;
 }
コード例 #6
0
ファイル: GuiDao.cs プロジェクト: RagingBigFemaleBird/sgs
 public void OnJudgeBegin(Player player, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     if (player.HandCards().Count == 0 && !player.Equipments().Any(card => card.SuitColor == SuitColorType.Black))
     {
         return;
     }
     ISkill skill;
     List<Card> cards;
     List<Player> players;
     Card c = Game.CurrentGame.Decks[eventArgs.Source, DeckType.JudgeResult].Last();
     if (Game.CurrentGame.UiProxies[player].AskForCardUsage(new CardUsagePrompt("GuiDao", eventArgs.Source, c.Suit, c.Rank), new GuiDaoVerifier(), out skill, out cards, out players))
     {
         NotifySkillUse();
         Card theCard = cards[0];
         theCard.Log = new ActionLog();
         theCard.Log.Source = player;
         theCard.Log.SkillAction = this;
         theCard.Log.GameAction = GameAction.ReplaceJudge;
         Game.CurrentGame.EnterAtomicContext();
         List<Card> toDiscard = new List<Card>() {Game.CurrentGame.Decks[eventArgs.Source, DeckType.JudgeResult].Last()};
         CardsMovement move = new CardsMovement();
         move.Cards = new List<Card>();
         move.Cards.AddRange(cards);
         move.To = new DeckPlace(eventArgs.Source, DeckType.JudgeResult);
         Game.CurrentGame.MoveCards(move);
         Game.CurrentGame.PlayerLostCard(player, cards);
         Game.CurrentGame.HandleCardTransferToHand(null, player, toDiscard);
         Game.CurrentGame.ExitAtomicContext();
     }
 }
コード例 #7
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]);

            }
        }
コード例 #8
0
ファイル: ShangShi.cs プロジェクト: RagingBigFemaleBird/sgs
 bool canTrigger(Player p, GameEvent e, GameEventArgs a)
 {
     if (e == GameEvent.CardsLost)
     {
         if (!a.Cards.Any(c => c.HistoryPlace1.DeckType == DeckType.Hand))
             return false;
     }
     if (e == GameEvent.CardsAcquired)
     {
         if (!a.Cards.Any(c => c.Place.DeckType == DeckType.Hand))
             return false;
     }
     if (e == GameEvent.AfterHealthChanged && p.Health - (a as HealthChangedEventArgs).Delta < 0)
         return false;
     return (Game.CurrentGame.CurrentPhaseEventIndex == 3 || Game.CurrentGame.CurrentPhase != TurnPhase.Discard) && p.HandCards().Count < p.LostHealth;
 }
コード例 #9
0
ファイル: MiJi.cs プロジェクト: shonwang/sgs
 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;
         }
     }
 }
コード例 #10
0
ファイル: QuanJi.cs プロジェクト: h1398123/sgs
        void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
        {
            var args = eventArgs as DamageEventArgs;
            int damage = args.Magnitude;
            while (damage-- > 0)
            {
                if (!AskForSkillUse())
                    break;

                Game.CurrentGame.DrawCards(Owner, 1);

                ISkill skill;
                List<Card> cards;
                List<Player> players;
                if (!Game.CurrentGame.UiProxies[Owner].AskForCardUsage(new CardUsagePrompt("QuanJi"), new QuanJiVerifier(), out skill, out cards, out players))
                {
                    cards = new List<Card>();
                    cards.Add(Owner.HandCards().First());
                }
                Game.CurrentGame.HandleCardTransfer(Owner, Owner, QuanDeck, cards);
            }
        }
コード例 #11
0
ファイル: YinLing.cs プロジェクト: h1398123/sgs
 protected override bool VerifyPlayer(Player source, Player player)
 {
     return player != source && player.HandCards().Count + player.Equipments().Count > 0;
 }
コード例 #12
0
ファイル: Game.Procedures.cs プロジェクト: h1398123/sgs
        public Card SelectACardFrom(Player from, Player ask, Prompt prompt, String resultdeckname, bool equipExcluded = false, bool delayedToolsExcluded = true, bool noReveal = false)
        {
            var deck = from.HandCards();
            if (!equipExcluded) deck = new List<Card>(deck.Concat(from.Equipments()));
            if (!delayedToolsExcluded) deck = new List<Card>(deck.Concat(from.DelayedTools()));
            if (deck.Count == 0) return null;
            List<DeckPlace> places = new List<DeckPlace>();
            places.Add(new DeckPlace(from, DeckType.Hand));
            if (!equipExcluded) places.Add(new DeckPlace(from, DeckType.Equipment));
            if (!delayedToolsExcluded) places.Add(new DeckPlace(from, DeckType.DelayedTools));
            List<List<Card>> answer;

            if (!ask.AskForCardChoice(prompt, places, new List<string>() { resultdeckname }, new List<int>() { 1 }, new RequireOneCardChoiceVerifier(noReveal), out answer))
            {
                Trace.TraceInformation("Player {0} Invalid answer", ask);
                answer = new List<List<Card>>();
                answer.Add(new List<Card>());
                answer[0].Add(deck.First());
            }
            Card theCard = answer[0][0];
            if (noReveal)
            {
                SyncCard(from, ref theCard);
            }
            else
            {
                SyncCardAll(ref theCard);
            }
            Trace.Assert(answer.Count == 1 && answer[0].Count == 1);
            return theCard;
        }
コード例 #13
0
ファイル: SongCi.cs プロジェクト: RagingBigFemaleBird/sgs
 protected override bool VerifyPlayer(Player source, Player player)
 {
     return Math.Max(player.Health, 0) != player.HandCards().Count && source[SongCiTarget[player]] == 0;
 }
コード例 #14
0
ファイル: ShangShi.cs プロジェクト: RagingBigFemaleBird/sgs
 void Run(Player p, GameEvent e, GameEventArgs a)
 {
     Game.CurrentGame.DrawCards(p, p.LostHealth - p.HandCards().Count);
 }
コード例 #15
0
ファイル: MiZhao.cs プロジェクト: RagingBigFemaleBird/sgs
 protected override bool? AdditionalVerify(Player source, List<Card> cards, List<Player> players)
 {
     if (source[MiZhaoUsed] != 0 || source.HandCards().Count == 0) return false;
     return true;
 }
コード例 #16
0
ファイル: MiZhao.cs プロジェクト: RagingBigFemaleBird/sgs
 protected override bool VerifyPlayer(Player source, Player player)
 {
     return player != target && player.HandCards().Count > 0;
 }
コード例 #17
0
ファイル: TuXi2.cs プロジェクト: RagingBigFemaleBird/sgs
 public override VerifierResult FastVerify(Player source, ISkill skill, List<Card> cards, List<Player> players)
 {
     if (skill != null || (cards != null && cards.Count != 0))
     {
         return VerifierResult.Fail;
     }
     if (players == null || players.Count == 0)
     {
         return VerifierResult.Partial;
     }
     foreach (Player p in players)
     {
         if (p == source)
         {
             return VerifierResult.Fail;
         }
         if (Game.CurrentGame.Decks[p, DeckType.Hand].Count == 0)
         {
             return VerifierResult.Fail;
         }
         if (p.HandCards().Count <= source.HandCards().Count) return VerifierResult.Fail;
     }
     if (players.Count > 1)
     {
         return VerifierResult.Fail;
     }
     return VerifierResult.Success;
 }
コード例 #18
0
ファイル: DaHe.cs プロジェクト: RagingBigFemaleBird/sgs
 protected override bool? AdditionalVerify(Player source, List<Card> cards, List<Player> players)
 {
     return source[DaHeUsed] == 0 && source.HandCards().Count > 0;
 }
コード例 #19
0
ファイル: DaHe.cs プロジェクト: RagingBigFemaleBird/sgs
 protected override bool VerifyPlayer(Player source, Player player)
 {
     return source != player && player.HandCards().Count > 0;
 }