Ejemplo n.º 1
0
 void Run(Player owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     DeckType FuHunDeck = new DeckType("FuHun");
     CardsMovement move = new CardsMovement();
     move.Cards = new List<Card>();
     int toDraw = 2;
     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);
     }
     move.To = new DeckPlace(null, FuHunDeck);
     var result = from c in move.Cards select c.SuitColor;
     bool success = result.Distinct().Count() == toDraw;
     if (success) FuHunEffect = 0;
     else FuHunEffect = 1;
     NotifySkillUse();
     Game.CurrentGame.MoveCards(move, false, Core.Utils.GameDelayTypes.Draw);
     Game.CurrentGame.HandleCardTransferToHand(null, owner, Game.CurrentGame.Decks[null, FuHunDeck]);
     if (success)
     {
         Trigger tri = new RemoveShengPao(owner, fhWuSheng, fhPaoXiao);
         Game.CurrentGame.PlayerAcquireAdditionalSkill(owner, fhWuSheng, HeroTag);
         Game.CurrentGame.PlayerAcquireAdditionalSkill(owner, fhPaoXiao, HeroTag);
         Game.CurrentGame.RegisterTrigger(GameEvent.PhasePostEnd, tri);
     }
     Game.CurrentGame.CurrentPhaseEventIndex++;
     throw new TriggerResultException(TriggerResult.End);
 }
Ejemplo n.º 2
0
 public override void Process(Player source, List<Player> dests, ICard card, ReadOnlyCard readonlyCard)
 {
     DeckType wuguDeck = new DeckType("WuGu");
     DeckType wuguFakeDeck = new DeckType("WuGuFake");
     CardsMovement move = new CardsMovement();
     move.Cards = new List<Card>();
     for (int i = 0; i < dests.Count; i++)
     {
         Game.CurrentGame.SyncImmutableCardAll(Game.CurrentGame.PeekCard(0));
         Card c = Game.CurrentGame.DrawCard();
         move.Cards.Add(c);
     }
     move.To = new DeckPlace(null, wuguDeck);
     Game.CurrentGame.MoveCards(move);
     fakeMapping = new Dictionary<Card, Card>();
     Game.CurrentGame.Decks[null, wuguFakeDeck].Clear();
     foreach (var c in Game.CurrentGame.Decks[null, wuguDeck])
     {
         var faked = new Card(c);
         faked.Place = new DeckPlace(null, wuguFakeDeck);
         Game.CurrentGame.Decks[null, wuguFakeDeck].Add(faked);
         fakeMapping.Add(faked, c);
     }
     Game.CurrentGame.NotificationProxy.NotifyWuGuStart(new DeckPlace(null, wuguFakeDeck));
     base.Process(source, dests, card, readonlyCard);
     Game.CurrentGame.NotificationProxy.NotifyWuGuEnd();
     Game.CurrentGame.Decks[null, wuguFakeDeck].Clear();
     if (Game.CurrentGame.Decks[null, wuguDeck].Count > 0)
     {
         move = new CardsMovement();
         move.Cards = new List<Card>(Game.CurrentGame.Decks[null, wuguDeck]);
         move.To = new DeckPlace(null, DeckType.Discard);
         Game.CurrentGame.MoveCards(move);
     }
 }
Ejemplo n.º 3
0
        void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
        {
            DeckType HuoShouDeck = new DeckType("HuoShou");

            CardsMovement move = new CardsMovement();
            move.Cards = new List<Card>();
            int toDraw = Owner.LostHealth;
            for (int i = 0; i < toDraw; i++)
            {
                Game.CurrentGame.SyncImmutableCardAll(Game.CurrentGame.PeekCard(0));
                Card c = Game.CurrentGame.DrawCard();
                move.Cards.Add(c);
            }
            move.To = new DeckPlace(null, HuoShouDeck);
            Game.CurrentGame.MoveCards(move);
            List<Card> toDiscard = new List<Card>();
            foreach (var c in move.Cards)
            {
                if (c.Suit == SuitType.Heart)
                {
                    toDiscard.Add(c);
                    Game.CurrentGame.RecoverHealth(Owner, Owner, 1);
                }
            }
            Game.CurrentGame.HandleCardDiscard(null, toDiscard);
            Game.CurrentGame.HandleCardTransferToHand(null, Owner, Game.CurrentGame.Decks[null, HuoShouDeck]);
            Game.CurrentGame.CurrentPhaseEventIndex++;
            throw new TriggerResultException(TriggerResult.End);
        }
Ejemplo n.º 4
0
        void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
        {
            Owner[FenXinUsed] = 1;
            Player target = eventArgs.Targets[0];
            DeckType RoleDeck = new DeckType("Role");
            Card role1 = Game.CurrentGame.Decks[Owner, RoleDeck][0];
            Card role2 = Game.CurrentGame.Decks[target, RoleDeck][0];
            Game.CurrentGame.SyncCard(target, ref role1);
            Game.CurrentGame.SyncCard(Owner, ref role2);

            List<CardsMovement> moves = new List<CardsMovement>();
            CardsMovement move1 = new CardsMovement();
            move1.Cards = new List<Card>() { role1 };
            move1.To = new DeckPlace(target, RoleDeck);
            moves.Add(move1);

            CardsMovement move2 = new CardsMovement();
            move2.Cards = new List<Card>() { role2 };
            move2.To = new DeckPlace(Owner, RoleDeck);
            moves.Add(move2);

            Game.CurrentGame.MoveCards(moves);

            var role = role2.Type as RoleCardHandler;
            if (role != null)
            {
                Owner.Role = role.Role;
            }
            role = role1.Type as RoleCardHandler;
            if (role != null)
            {
                target.Role = role.Role;
            }
            GameDelays.Delay(GameDelayTypes.RoleDistribute);
        }
Ejemplo n.º 5
0
        public List<Card> this[Player player, DeckType type]
        {
            get
            {
                if (player == null)
                {
                    player = GameAsPlayer.Instance;
                }
                if (!gameDecks.ContainsKey(player))
                {
                    gameDecks[player] = new Dictionary<DeckType, List<Card>>();
                }
                if (!gameDecks[player].ContainsKey(type))
                {
                    gameDecks[player][type] = new List<Card>();
                }
                return gameDecks[player][type];
            }

            set
            {
                if (player == null)
                {
                    player = GameAsPlayer.Instance;
                }
                if (!gameDecks.ContainsKey(player))
                {
                    gameDecks[player] = new Dictionary<DeckType, List<Card>>();
                }
                if (!gameDecks[player].ContainsKey(type))
                {
                    gameDecks[player][type] = value;
                }
            }
        }
Ejemplo n.º 6
0
 protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard, GameEventArgs inResponseTo)
 {
     DeckType wuguDeck = new DeckType("WuGu");
     DeckType wuguFakeDeck = new DeckType("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 });
 }
Ejemplo n.º 7
0
        public void AddCards(DeckType deck, IList<CardView> cards, bool isFaked, bool updateFootnote)
        {
            if (isFaked)
            {
                foreach (var card in cards)
                {
                    card.Disappear(0d);
                }
                return;
            }

            if (cards.Count == 0) return;

            int numAdded = cards.Count;
            int numRemoved = Cards.Count - Math.Max(_MaxVisibleCards, numAdded + 1);

            DeckType from = cards[0].Card.Place.DeckType;
            Canvas canvas = cards[0].Parent as Canvas;

            // canvas can only be null on reconnection.
            // @todo: Probably fix canvas on its source rather than here.
            if (canvas == null) return;

            if (updateFootnote)
            {
                foreach (var card in cards)
                {
                    card.CardModel.UpdateFootnote();
                }
            }

            // Do not show cards that move from compute area to discard area
            // or from judge result area to discard aresa
            if (from != DeckType.Compute && (from != DeckType.JudgeResult || from == DeckType.JudgeResult && deck != DeckType.Discard) && from != DeckType.Dealing)
            {
                AddCards(cards);
                // Card just entered compute area should hold until they enter discard area.
            }
            else if (from == DeckType.Dealing && deck == DeckType.JudgeResult)
            {
                foreach (var card in Cards) MarkClearance(card);
                AppendCards(cards);
            }
            else
            {
                foreach (var card in cards)
                {
                    canvas.Children.Remove(card);
                }
            }

            // When a card enters discard area, every thing in the deck should fade out (but
            // not disappear).
            // When there are too many cards in the deck, remove the dated ones.
            for (int i = 0; i < numRemoved; i++)
            {
                MarkClearance(Cards[i]);
            }
        }
Ejemplo n.º 8
0
        public void AddCards(DeckType deck, IList<CardView> cards, bool isFaked)
        {
            if (isFaked)
            {
                foreach (var card in cards)
                {
                    card.Disappear(0d);
                }
                return;
            }

            if (cards.Count == 0) return;

            int numAdded = cards.Count;
            int numRemoved = Cards.Count - Math.Max(_MaxVisibleCards, numAdded + 1);

            DeckType from = cards[0].Card.Place.DeckType;
            Canvas canvas = cards[0].Parent as Canvas;
            Trace.Assert(canvas != null);

            foreach (var card in cards)
            {
                card.CardModel.UpdateFootnote();
                card.CardModel.IsFootnoteVisible = true;
            }

            // Do not show cards that move from compute area to discard area
            // or from judge result area to discard aresa
            if (from != DeckType.Compute && from != DeckType.JudgeResult && from != DeckType.Dealing)
            {
                AddCards(cards, 0.3d);
            }
            else if (from == DeckType.Dealing && deck == DeckType.JudgeResult)
            {
                foreach (var card in Cards) MarkClearance(card);
                AppendCards(cards);
            }
            else
            {
                foreach (var card in cards)
                {
                    canvas.Children.Remove(card);
                }
            }

            // Card just entered compute area should hold until they enter discard area.
            foreach (var card in cards)
            {
                card.DiscardDeckClearTimeStamp = int.MaxValue;
            }

            // When a card enters discard area, every thing in the deck should fade out (but
            // not disappear).
            // When there are too many cards in the deck, remove the dated ones.
            for (int i = 0; i < numRemoved; i++)
            {
                MarkClearance(Cards[i]);
            }
        }
Ejemplo n.º 9
0
 static DeckType()
 {
     Dealing = new DeckType("Dealing");
     Discard = new DeckType("Discard");
     Compute = new DeckType("Compute");
     Hand = new DeckType("Hand");
     Equipment = new DeckType("Equipment");
     DelayedTools = new DeckType("DelayedTools");
     JudgeResult = new DeckType("JudgeResult");
     GuHuo = new DeckType("GuHuo");
     None = new DeckType("None");
     Heroes = new DeckType("Heroes");
 }
Ejemplo n.º 10
0
        void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
        {
            var GuZhengDeck = new DeckType("GuZheng");
            foreach (Card c in new List<Card>(GuZhengCards))
            {
                if (c.Place.DeckType != DeckType.Discard)
                {
                    GuZhengCards.Remove(c);
                }
            }
            CardsMovement move = new CardsMovement();
            move.Cards = GuZhengCards;
            move.To = new DeckPlace(null, GuZhengDeck);
            Game.CurrentGame.MoveCards(move);
            List<List<Card>> answer;
            var options = new AdditionalCardChoiceOptions() { Options = new List<string>() { Prompt.MultipleChoiceOptionPrefix + "GuZhengHuoDe", Prompt.MultipleChoiceOptionPrefix + "GuZhengBuHuoDe" } };
            if (!Game.CurrentGame.UiProxies[Owner].AskForCardChoice(
                new CardChoicePrompt("GuZheng"),
                new List<DeckPlace>() { new DeckPlace(null, GuZhengDeck) },
                new List<string>() { "GuZhengFanHui" },
                new List<int>() { 1 },
                new RequireOneCardChoiceVerifier(),
                out answer,
                options))
            {
                Trace.TraceInformation("Invalid answer, choosing for you");
                answer = new List<List<Card>>();
                answer.Add(new List<Card>());
                answer[0].Add(Game.CurrentGame.Decks[null, GuZhengDeck][0]);
            }
            move = new CardsMovement();
            move.Cards = new List<Card>(answer[0]);
            move.To = new DeckPlace(Game.CurrentGame.CurrentPlayer, DeckType.Hand);
            Game.CurrentGame.MoveCards(move);
            Game.CurrentGame.PlayerAcquiredCard(Game.CurrentGame.CurrentPlayer, answer[0]);

            if (options.OptionResult == 1)
            {
                Game.CurrentGame.PlaceIntoDiscard(null, new List<Card>(Game.CurrentGame.Decks[null, GuZhengDeck]));
            }
            else
            {
                var cardsToAcquire = new List<Card>(Game.CurrentGame.Decks[null, GuZhengDeck]);
                move = new CardsMovement();
                move.Cards = new List<Card>(cardsToAcquire);
                move.To = new DeckPlace(Owner, DeckType.Hand);
                Game.CurrentGame.MoveCards(move);
                Game.CurrentGame.PlayerAcquiredCard(Owner, cardsToAcquire);
            }
            GuZhengCards = new List<Card>();
        }
Ejemplo n.º 11
0
        void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
        {
            DeckType mjDeck = new DeckType("ManJuan");
            List<Card> theCards = new List<Card>(eventArgs.Cards);
            CardsMovement move = new CardsMovement();
            move.Cards = eventArgs.Cards;
            move.To = new DeckPlace(null, DeckType.Discard);
            move.Helper.IsFakedMove = true;
            Game.CurrentGame.MoveCards(move);
            if (Game.CurrentGame.CurrentPlayer == Owner)
            {
                foreach (var reclaim in theCards)
                {
                    List<Card> garbageList = new List<Card>();
                    foreach (var garbage in Game.CurrentGame.Decks[null, DeckType.Discard])
                    {
                        if (garbage.Rank == reclaim.Rank)
                        {
                            garbageList.Add(garbage);
                        }
                    }
                    move = new CardsMovement();
                    move.Cards = garbageList;
                    move.To = new DeckPlace(null, mjDeck);
                    move.Helper.IsFakedMove = true;
                    Game.CurrentGame.MoveCards(move);

                    IUiProxy ui = Game.CurrentGame.UiProxies[Owner];
                    List<List<Card>> answer;

                    if (!ui.AskForCardChoice(new CardChoicePrompt("ManJuan", Owner), new List<DeckPlace>() {new DeckPlace(null, mjDeck)}, new List<string>() {"ZuiXiang"}, new List<int>() {1}, new RequireOneCardChoiceVerifier(), out answer))
                    {
                        Trace.TraceInformation("Player {0} Invalid answer", Owner);
                        answer = new List<List<Card>>();
                        answer.Add(new List<Card>());
                        answer[0].Add(Game.CurrentGame.Decks[null, mjDeck][0]);
                    }
                    Trace.Assert(answer.Count == 1 && answer[0].Count == 1);

                    move = new CardsMovement();
                    move.Cards = new List<Card>(answer[0]);
                    move.To = new DeckPlace(Owner, DeckType.Hand);
                    Game.CurrentGame.MoveCards(move);
                    move = new CardsMovement();
                    move.Cards = new List<Card>(Game.CurrentGame.Decks[null, mjDeck]);
                    move.To = new DeckPlace(null, DeckType.Discard);
                    move.Helper.IsFakedMove = true;
                    Game.CurrentGame.MoveCards(move);
                }
            }
        }
Ejemplo n.º 12
0
        void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
        {
            DeckType shelieDeck = new DeckType("SheLie");

            CardsMovement move = new CardsMovement();
            move.Cards = new List<Card>();
            for (int i = 0; i < 5; i++)
            {
                Game.CurrentGame.SyncImmutableCardAll(Game.CurrentGame.PeekCard(0));
                Card c = Game.CurrentGame.DrawCard();
                move.Cards.Add(c);
            }
            move.To = new DeckPlace(null, shelieDeck);
            Game.CurrentGame.MoveCards(move);
            List<List<Card>> answer;
            if (!Game.CurrentGame.UiProxies[Owner].AskForCardChoice(new CardChoicePrompt("SheLie", Owner),
                    new List<DeckPlace>() { new DeckPlace(null, shelieDeck) },
                    new List<string>() { "SheLie" },
                    new List<int>() { 4 },
                    new SheLieVerifier(Game.CurrentGame.Decks[null, shelieDeck]),
                    out answer,
                    null,
                    CardChoiceCallback.GenericCardChoiceCallback))
            {
                Trace.TraceInformation("Invalid answer for SheLie, choosing for you");
                answer = new List<List<Card>>();
                answer.Add(new List<Card>());
                HashSet<SuitType> choice = new HashSet<SuitType>();
                foreach (Card c in Game.CurrentGame.Decks[null, shelieDeck])
                {
                    if (!choice.Contains(c.Suit))
                    {
                        answer[0].Add(c);
                        choice.Add(c.Suit);
                    }
                }
            }

            Game.CurrentGame.HandleCardTransferToHand(null, Owner, answer[0]);
            foreach (var c in Game.CurrentGame.Decks[null, shelieDeck])
            {
                c.Log.SkillAction = this;
                c.Log.GameAction = GameAction.PlaceIntoDiscard;
            }
            Game.CurrentGame.PlaceIntoDiscard(null, new List<Card>(Game.CurrentGame.Decks[null, shelieDeck]));
            Game.CurrentGame.CurrentPhaseEventIndex++;
            throw new TriggerResultException(TriggerResult.End);
        }
Ejemplo n.º 13
0
 public override void Process(GameEventArgs handlerArgs)
 {
     base.Process(handlerArgs);
     DeckType wuguDeck = new DeckType("WuGu");
     DeckType wuguFakeDeck = new DeckType("WuGuFake");
     CardsMovement move = new CardsMovement();
     Game.CurrentGame.NotificationProxy.NotifyWuGuEnd();
     Game.CurrentGame.Decks[null, wuguFakeDeck].Clear();
     if (Game.CurrentGame.Decks[null, wuguDeck].Count > 0)
     {
         move = new CardsMovement();
         move.Cards = new List<Card>(Game.CurrentGame.Decks[null, wuguDeck]);
         move.To = new DeckPlace(null, DeckType.Discard);
         Game.CurrentGame.MoveCards(move, false, Core.Utils.GameDelayTypes.Draw);
     }
 }
Ejemplo n.º 14
0
        public override bool Commit(GameEventArgs arg)
        {
            Owner[DiMengUsed] = 1;
            List<Card> cards = arg.Cards;
            if (cards.Count > 0)
            {
                Game.CurrentGame.HandleCardDiscard(Owner, cards);
            }
            Player src1 = arg.Targets[0];
            Player src2 = arg.Targets[1];
            DeckType DiMengDeck1 = new DeckType("DiMeng1");
            DeckType DiMengDeck2 = new DeckType("DiMeng2");
            Game.CurrentGame.EnterAtomicContext();
            CardsMovement move = new CardsMovement();
            cards = new List<Card>(Game.CurrentGame.Decks[src1, DeckType.Hand]);
            move.Cards = new List<Card>(cards);
            move.To = new DeckPlace(null, DiMengDeck1);
            Game.CurrentGame.MoveCards(move);
            Game.CurrentGame.PlayerLostCard(src1, cards);

            cards = new List<Card>(Game.CurrentGame.Decks[src2, DeckType.Hand]);
            move.Cards = new List<Card>(cards);
            move.To = new DeckPlace(null, DiMengDeck2);
            Game.CurrentGame.MoveCards(move);
            Game.CurrentGame.PlayerLostCard(src2, cards);
            Game.CurrentGame.ExitAtomicContext();

            Game.CurrentGame.SyncImmutableCards(src1, Game.CurrentGame.Decks[null, DiMengDeck2]);
            Game.CurrentGame.EnterAtomicContext();
            cards = new List<Card>(Game.CurrentGame.Decks[null, DiMengDeck2]);
            move.Cards = new List<Card>(cards);
            move.To = new DeckPlace(src1, DeckType.Hand);
            Game.CurrentGame.MoveCards(move);
            Game.CurrentGame.PlayerAcquiredCard(src1, cards);

            Game.CurrentGame.SyncImmutableCards(src2, Game.CurrentGame.Decks[null, DiMengDeck1]);
            cards = new List<Card>(Game.CurrentGame.Decks[null, DiMengDeck1]);
            move.Cards = new List<Card>(cards);
            move.To = new DeckPlace(src2, DeckType.Hand);
            Game.CurrentGame.MoveCards(move);
            Game.CurrentGame.PlayerAcquiredCard(src2, cards);
            Game.CurrentGame.ExitAtomicContext();
            return true;
        }
Ejemplo n.º 15
0
        protected override void Process(Player source, Player dest, ICard card, ReadOnlyCard readonlyCard)
        {
            DeckType wuguDeck = new DeckType("WuGu");
            List<List<Card>> answer;
            if (!Game.CurrentGame.UiProxies[dest].AskForCardChoice(new CardChoicePrompt("WuGuFengDeng"),
                    new List<DeckPlace>() { new DeckPlace(null, wuguDeck) },
                    new List<string>() { "WuGu" },
                    new List<int>() { 1 },
                    new RequireOneCardChoiceVerifier(),
                    out answer))
            {
                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]);
            }

            Game.CurrentGame.HandleCardTransferToHand(null, dest, answer[0]);
        }
Ejemplo n.º 16
0
        public override bool Commit(GameEventArgs arg)
        {
            GameDelays.Delay(GameDelayTypes.Awaken);

            Owner[XinZhanUsed] = 1;
            DeckType XinZhanDeck = new DeckType("XinZhan");
            CardsMovement move = new CardsMovement();
            move.Cards = new List<Card>();
            for (int i = 0; i < choiceCount; i++)
            {
                Game.CurrentGame.SyncImmutableCard(Owner, Game.CurrentGame.PeekCard(0));
                Card c = Game.CurrentGame.DrawCard();
                move.Cards.Add(c);
            }
            move.To = new DeckPlace(null, XinZhanDeck);
            move.Helper.IsFakedMove = true;
            Game.CurrentGame.MoveCards(move);
            List<List<Card>> answer;
            AdditionalCardChoiceOptions options = new AdditionalCardChoiceOptions();
            options.Rearrangeable = new List<bool>() { true, false };
            options.DefaultResult = new List<List<Card>>() { new List<Card>(Game.CurrentGame.Decks[null, XinZhanDeck]), new List<Card>() };
            if (!Game.CurrentGame.UiProxies[Owner].AskForCardChoice(new CardChoicePrompt("XinZhan", Owner),
                    new List<DeckPlace>() {},
                    new List<string>() { "PaiDuiDing", "HuoDe" },
                    new List<int>() {choiceCount, choiceCount},
                    new XinZhanVerifier(),
                    out answer,
                    options,
                    CardChoiceCallback.GenericCardChoiceCallback))
            {
                Game.CurrentGame.NotificationProxy.NotifyLogEvent(new Prompt(Prompt.LogEventPrefix + "XinZhan", Owner, Game.CurrentGame.Decks[null, XinZhanDeck].Count));
                Game.CurrentGame.InsertBeforeDeal(null, Game.CurrentGame.Decks[null, XinZhanDeck], new MovementHelper() { IsFakedMove = true });
            }
            else
            {
                Game.CurrentGame.NotificationProxy.NotifyLogEvent(new Prompt(Prompt.LogEventPrefix + "XinZhan", Owner, answer[0].Count));
                Game.CurrentGame.InsertBeforeDeal(null, answer[0], new MovementHelper() { IsFakedMove = true });
                Game.CurrentGame.HandleCardTransferToHand(null, Owner, answer[1]);
            }
            return true;
        }
Ejemplo n.º 17
0
 public override void Process(GameEventArgs handlerArgs)
 {
     var source = handlerArgs.Source;
     var dests = handlerArgs.Targets;
     var readonlyCard = handlerArgs.ReadonlyCard;
     var inResponseTo = handlerArgs.InResponseTo;
     var card = handlerArgs.Card;
     DeckType wuguDeck = new DeckType("WuGu");
     DeckType wuguFakeDeck = new DeckType("WuGuFake");
     CardsMovement move = new CardsMovement();
     move.Cards = new List<Card>();
     for (int i = 0; i < dests.Count; i++)
     {
         Game.CurrentGame.SyncImmutableCardAll(Game.CurrentGame.PeekCard(0));
         Card c = Game.CurrentGame.DrawCard();
         move.Cards.Add(c);
     }
     move.To = new DeckPlace(null, wuguDeck);
     Game.CurrentGame.MoveCards(move);
     fakeMapping = new Dictionary<Card, Card>();
     Game.CurrentGame.Decks[null, wuguFakeDeck].Clear();
     foreach (var c in Game.CurrentGame.Decks[null, wuguDeck])
     {
         var faked = new Card(c);
         faked.Place = new DeckPlace(null, wuguFakeDeck);
         Game.CurrentGame.Decks[null, wuguFakeDeck].Add(faked);
         fakeMapping.Add(faked, c);
     }
     Game.CurrentGame.NotificationProxy.NotifyWuGuStart(new CardChoicePrompt("WuGuFengDeng.Init"), new DeckPlace(null, wuguFakeDeck));
     base.Process(handlerArgs);
     Game.CurrentGame.NotificationProxy.NotifyWuGuEnd();
     Game.CurrentGame.Decks[null, wuguFakeDeck].Clear();
     if (Game.CurrentGame.Decks[null, wuguDeck].Count > 0)
     {
         move = new CardsMovement();
         move.Cards = new List<Card>(Game.CurrentGame.Decks[null, wuguDeck]);
         move.To = new DeckPlace(null, DeckType.Discard);
         Game.CurrentGame.MoveCards(move);
     }
 }
Ejemplo n.º 18
0
 public override void Process(Player source, List<Player> dests, ICard card, ReadOnlyCard readonlyCard)
 {
     DeckType wuguDeck = new DeckType("WuGu");
     CardsMovement move = new CardsMovement();
     move.Cards = new List<Card>();
     for (int i = 0; i < dests.Count; i++)
     {
         Game.CurrentGame.SyncImmutableCardAll(Game.CurrentGame.PeekCard(0));
         Card c = Game.CurrentGame.DrawCard();
         move.Cards.Add(c);
     }
     move.To = new DeckPlace(null, wuguDeck);
     Game.CurrentGame.MoveCards(move);
     base.Process(source, dests, card, readonlyCard);
     if (Game.CurrentGame.Decks[null, wuguDeck].Count > 0)
     {
         move = new CardsMovement();
         move.Cards = new List<Card>(Game.CurrentGame.Decks[null, wuguDeck]);
         move.To = new DeckPlace(null, DeckType.Discard);
         Game.CurrentGame.MoveCards(move);
     }
 }
Ejemplo n.º 19
0
        void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
        {
            DeckType GuanXingDeck = new DeckType("GuanXing");

            CardsMovement move = new CardsMovement();
            move.Cards = new List<Card>();
            int toDraw = Math.Min(5, Game.CurrentGame.AlivePlayers.Count);
            for (int i = 0; i < toDraw; i++)
            {
                Game.CurrentGame.SyncImmutableCard(Owner, Game.CurrentGame.PeekCard(0));
                Card c = Game.CurrentGame.DrawCard();
                move.Cards.Add(c);
            }
            move.To = new DeckPlace(null, GuanXingDeck);
            move.Helper.IsFakedMove = true;
            Game.CurrentGame.MoveCards(move, false, Core.Utils.GameDelayTypes.None);
            List<List<Card>> answer;
            AdditionalCardChoiceOptions options = new AdditionalCardChoiceOptions();
            options.Rearrangeable = new List<bool>() { true, true };
            options.DefaultResult = new List<List<Card>>() { new List<Card>(Game.CurrentGame.Decks[null, GuanXingDeck]), new List<Card>() };
            if (!Game.CurrentGame.UiProxies[Owner].AskForCardChoice(new CardChoicePrompt("GuanXing"),
                    new List<DeckPlace>() { },
                    new List<string>() { "PaiDuiDing", "PaiDuiDi" },
                    new List<int>() { toDraw, toDraw },
                    new GuanXingVerifier(Game.CurrentGame.Decks[null, GuanXingDeck]),
                    out answer,
                    options,
                    CardChoiceCallback.GenericCardChoiceCallback))
            {
                Game.CurrentGame.NotificationProxy.NotifyLogEvent(new LogEvent("GuanXing", Owner, Game.CurrentGame.Decks[null, GuanXingDeck].Count, 0), new List<Player>() { Owner }, false);
                Game.CurrentGame.InsertBeforeDeal(null, Game.CurrentGame.Decks[null, GuanXingDeck], new MovementHelper() { IsFakedMove = true });
            }
            else
            {
                Game.CurrentGame.NotificationProxy.NotifyLogEvent(new LogEvent("GuanXing", Owner, answer[0].Count, answer[1].Count), new List<Player>() { Owner }, false);
                Game.CurrentGame.InsertBeforeDeal(null, answer[0], new MovementHelper() { IsFakedMove = true });
                Game.CurrentGame.InsertAfterDeal(null, answer[1], new MovementHelper() { IsFakedMove = true });
            }
        }
Ejemplo n.º 20
0
        public override bool Commit(GameEventArgs arg)
        {
            Owner[GanLuUsed] = 1;
            List<Card> cards;
            Player src1 = arg.Targets[0];
            Player src2 = arg.Targets[1];
            DeckType GanLuDeck1 = new DeckType("GanLu1");
            DeckType GanLuDeck2 = new DeckType("GanLu2");
            Game.CurrentGame.EnterAtomicContext();
            CardsMovement move = new CardsMovement();
            cards = new List<Card>(src1.Equipments());
            move.Cards = new List<Card>(cards);
            move.To = new DeckPlace(null, GanLuDeck1);
            Game.CurrentGame.MoveCards(move);
            Game.CurrentGame.PlayerLostCard(src1, cards);

            cards = new List<Card>(src2.Equipments());
            move.Cards = new List<Card>(cards);
            move.To = new DeckPlace(null, GanLuDeck2);
            Game.CurrentGame.MoveCards(move);
            Game.CurrentGame.PlayerLostCard(src2, cards);
            Game.CurrentGame.ExitAtomicContext();

            Game.CurrentGame.EnterAtomicContext();
            cards = new List<Card>(Game.CurrentGame.Decks[null, GanLuDeck2]);
            move.Cards = new List<Card>(cards);
            move.To = new DeckPlace(src1, DeckType.Equipment);
            Game.CurrentGame.MoveCards(move);
            Game.CurrentGame.PlayerAcquiredCard(src1, cards);

            cards = new List<Card>(Game.CurrentGame.Decks[null, GanLuDeck1]);
            move.Cards = new List<Card>(cards);
            move.To = new DeckPlace(src2, DeckType.Equipment);
            Game.CurrentGame.MoveCards(move);
            Game.CurrentGame.PlayerAcquiredCard(src2, cards);
            Game.CurrentGame.ExitAtomicContext();
            return true;
        }
Ejemplo n.º 21
0
 public List<Card> this[DeckType type]
 {
     get { return this[null, type]; }
     set { this[null, type] = value; }
 }
Ejemplo n.º 22
0
            public override void Run(GameEvent gameEvent, GameEventArgs eventArgs)
            {
                Player p = eventArgs.Targets[0];
                Player source = eventArgs.Source;
                if (source == null)
                {
                    Trace.TraceInformation("Player {0} killed", p.Id);
                }
                else
                {
                    Trace.TraceInformation("Player {0} killed by Player {1}", p.Id, source.Id);
                }
                DeckType role = new DeckType("Role");
                Trace.Assert(Game.CurrentGame.Decks[p, role].Count == 1);
                Game.CurrentGame.SyncImmutableCardAll(Game.CurrentGame.Decks[p, role][0]);
                Trace.TraceInformation("Player {0} is {1}", p.Id, (Game.CurrentGame.Decks[p, role][0].Type as RoleCardHandler).Role);
                p.Role = (Game.CurrentGame.Decks[p, role][0].Type as RoleCardHandler).Role;
                Game.CurrentGame.NotificationProxy.NotifyDeath(p, source);

                if (p.Role == Role.Ruler)
                {
                    Trace.TraceInformation("Ruler dead. Game over");
                    if (Game.CurrentGame.AlivePlayers.Count == 2)
                    {
                        var winners = from pl in Game.CurrentGame.Players where pl.Role == Role.Defector select pl;
                        Game.CurrentGame.NotificationProxy.NotifyGameOver(false, winners.ToList());
                    }
                    else
                    {
                        var winners = from pl in Game.CurrentGame.Players where pl.Role == Role.Rebel select pl;
                        Game.CurrentGame.NotificationProxy.NotifyGameOver(false, winners.ToList());
                    }
                    throw new GameOverException();
                }

                if (p.Role == Role.Rebel || p.Role == Role.Defector)
                {
                    int deadRebel = 0;
                    int deadDefector = 0;
                    foreach (Player z in Game.CurrentGame.Players)
                    {
                        if (z.Role == Role.Rebel && (z.IsDead || z == p))
                        {
                            deadRebel++;
                        }
                        if (z.Role == Role.Defector && (z.IsDead || z == p))
                        {
                            deadDefector++;
                        }
                    }
                    Trace.TraceInformation("Deathtoll: Rebel {0}/{1}, Defector {2}/{3}", deadRebel, (Game.CurrentGame as RoleGame).NumberOfRebels, deadDefector, (Game.CurrentGame as RoleGame).NumberOfDefectors);
                    if (deadRebel == (Game.CurrentGame as RoleGame).NumberOfRebels && deadDefector == (Game.CurrentGame as RoleGame).NumberOfDefectors)
                    {
                        Trace.TraceInformation("Ruler wins.");
                        var winners = from pl in Game.CurrentGame.Players where pl.Role == Role.Ruler || pl.Role == Role.Loyalist select pl;
                        Game.CurrentGame.NotificationProxy.NotifyGameOver(false, winners.ToList());
                        throw new GameOverException();
                    }
                }

                Game.CurrentGame.Emit(GameEvent.PlayerIsDead, eventArgs);
                p.IsDead = true;
                if (p.Hero != null)
                {
                    foreach (ISkill s in p.Hero.Skills)
                    {
                        if (s is TriggerSkill)
                        {
                            (s as TriggerSkill).Owner = null;
                        }
                    }
                }
                if (p.Hero2 != null)
                {
                    foreach (ISkill s in p.Hero2.Skills)
                    {
                        if (s is TriggerSkill)
                        {
                            (s as TriggerSkill).Owner = null;
                        }
                    }
                }

                if (p.Role == Role.Rebel || p.Role == Role.Defector)
                {
                    if (source != null && !source.IsDead && p.Role == Role.Rebel)
                    {
                        Trace.TraceInformation("Killed rebel. GIVING YOU THREE CARDS OMG WIN GAME RIGHT THERE!!!");
                        Game.CurrentGame.DrawCards(source, 3);
                    }
                }
                if (p.Role == Role.Loyalist && source.Role == Role.Ruler)
                {
                    Trace.TraceInformation("Loyalist killl by ruler. GG");
                    Game.CurrentGame.SyncCardsAll(Game.CurrentGame.Decks[source, DeckType.Hand]);
                    CardsMovement move = new CardsMovement();
                    move.Cards = new List<Card>();
                    foreach (Card c in Game.CurrentGame.Decks[source, DeckType.Hand])
                    {
                        if (Game.CurrentGame.PlayerCanDiscardCard(source, c))
                        {
                            move.Cards.Add(c);
                        }
                    }
                    move.Cards.AddRange(Game.CurrentGame.Decks[source, DeckType.Equipment]);
                    move.Cards.AddRange(Game.CurrentGame.Decks[source, DeckType.DelayedTools]);
                    move.To = new DeckPlace(null, DeckType.Discard);
                    move.Helper = new MovementHelper();
                    Game.CurrentGame.MoveCards(move);
                }
            }
Ejemplo n.º 23
0
            public override void Run(GameEvent gameEvent, GameEventArgs eventArgs)
            {
                Game game = Game.CurrentGame;

                foreach (Player pp in game.Players)
                {
                    game.HandCardVisibility.Add(pp, new List<Player>() { pp });
                }

                int numberOfDefectors = 1;

                // Put the whole deck in the dealing deck
                game.Decks[DeckType.Dealing] = game.CardSet.GetRange(0, game.CardSet.Count);
                var dealdeck = new List<Card>(game.Decks[DeckType.Dealing]);
                foreach (Card card in dealdeck)
                {
                    // We don't want hero cards
                    if (card.Type is HeroCardHandler)
                    {
                        game.Decks[DeckType.Dealing].Remove(card);
                        game.Decks[DeckType.Heroes].Add(card);
                        card.Place = new DeckPlace(null, DeckType.Heroes);
                    }
                    else if (card.Type is RoleCardHandler)
                    {
                        game.Decks[DeckType.Dealing].Remove(card);
                        card.Place = new DeckPlace(null, RoleDeckType);
                    }
                    else
                    {
                        card.Place = new DeckPlace(null, DeckType.Dealing);
                    }
                }
                if (game.Players.Count == 0)
                {
                    return;
                }
                // Await role decision
                int seed = DateTime.Now.Millisecond;
                Trace.TraceError("Seed is {0}", seed);
                Random random = new Random(seed);
                int rulerId = 0;

                game.Decks[null, RoleDeckType].Add(_FindARoleCard(Role.Ruler));
                Trace.Assert(game.Players.Count > 1);
                Trace.Assert(numberOfDefectors + 1 <= game.Players.Count);
                int t = numberOfDefectors;
                while (t-- > 0)
                {
                    game.Decks[null, RoleDeckType].Add(_FindARoleCard(Role.Defector));
                }
                int remaining = game.Players.Count - numberOfDefectors;
                int rebel;
                int loyalist;
                if (remaining <= 1)
                {
                    rebel = 0;
                    loyalist = 0;
                }
                else
                {
                    rebel = (int)Math.Ceiling(((double)remaining) / 2);
                    loyalist = remaining - rebel - 1;
                }

                Trace.Assert(rebel + loyalist + numberOfDefectors + 1 == game.Players.Count);
                (game as RoleGame).NumberOfDefectors = numberOfDefectors;
                (game as RoleGame).NumberOfRebels = rebel;

                while (rebel-- > 0)
                {
                    game.Decks[null, RoleDeckType].Add(_FindARoleCard(Role.Rebel));
                }
                while (loyalist-- > 0)
                {
                    game.Decks[null, RoleDeckType].Add(_FindARoleCard(Role.Loyalist));
                }

                Shuffle(game.Decks[null, RoleDeckType]);

                if (game.IsClient)
                {
                    int count = game.Decks[null, RoleDeckType].Count;
                    game.Decks[null, RoleDeckType].Clear();
                    while (count-- > 0)
                    {
                        Card c = new Card(SuitType.None, 0, new UnknownRoleCardHandler());
                        c.Id = Card.UnknownRoleId;
                        c.Place = new DeckPlace(null, RoleDeckType);
                        game.Decks[null, RoleDeckType].Add(c);
                    }
                    game.SyncImmutableCardAll(game.Decks[null, RoleDeckType][0]);
                }
                else
                {
                    foreach (Card c in game.Decks[null, RoleDeckType])
                    {
                        if ((c.Type as RoleCardHandler).Role == Role.Ruler)
                        {
                            game.SyncImmutableCardAll(c);
                        }
                    }
                }

                int i = 0;
                for (i = 0; i < game.Players.Count; i++)
                {
                    game.SyncImmutableCard(game.Players[i], game.Decks[null, RoleDeckType][i]);
                }

                List<CardsMovement> moves = new List<CardsMovement>();
                i = 0;
                foreach (Player p in game.Players)
                {
                    CardsMovement move = new CardsMovement();
                    move.Cards = new List<Card>() { game.Decks[null, RoleDeckType][i] };
                    move.To = new DeckPlace(p, RoleDeckType);
                    moves.Add(move);
                    i++;
                }
                game.MoveCards(moves, null);

                Thread.Sleep(1200);

                i = 0;
                foreach (Player player in game.Players)
                {
                    Card card = game.Decks[player, RoleDeckType][0];
                    var role = card.Type as RoleCardHandler;
                    if (role != null)
                    {
                        if (role.Role == Role.Ruler)
                        {
                            rulerId = i;
                        }
                        player.Role = role.Role;
                    }
                    i++;
                }

                Thread.Sleep(400);

                //hero allocation
                Shuffle(game.Decks[DeckType.Heroes]);
                if (!game.IsClient)
                {
                    foreach (var hero in new List<Card>(game.Decks[DeckType.Heroes]))
                    {
                        foreach (var s in (hero.Type as HeroCardHandler).Hero.Skills)
                        {
                            if (s.IsRulerOnly)
                            {
                                game.Decks[DeckType.Heroes].Remove(hero);
                                game.Decks[DeckType.Heroes].Insert(0, hero);
                            }
                        }
                    }
                }
                List<Card> rulerDraw = new List<Card>();
                for (int rc = 0; rc < 12; rc++)
                {
                    game.SyncImmutableCardAll(game.Decks[DeckType.Heroes][rc]);
                    rulerDraw.Add(game.Decks[DeckType.Heroes][rc]);
                }
                game.SyncCards(game.Players[rulerId], rulerDraw);
                DeckType tempHero = new DeckType("TempHero");
                game.Decks[null, tempHero].AddRange(rulerDraw);
                Trace.TraceInformation("Ruler is {0}", rulerId);
                game.Players[rulerId].Role = Role.Ruler;
                List<DeckPlace> sourceDecks = new List<DeckPlace>();
                sourceDecks.Add(new DeckPlace(null, tempHero));
                List<string> resultDeckNames = new List<string>();
                resultDeckNames.Add("HeroChoice");
                List<int> resultDeckMaximums = new List<int>();
                resultDeckMaximums.Add(1);
                List<List<Card>> answer;
                if (!game.UiProxies[game.Players[rulerId]].AskForCardChoice(new CardChoicePrompt("RulerHeroChoice"), sourceDecks, resultDeckNames, resultDeckMaximums, new AlwaysTrueChoiceVerifier(), out answer))
                {
                    answer = new List<List<Card>>();
                    answer.Add(new List<Card>());
                    answer[0].Add(game.Decks[DeckType.Heroes][0]);
                }
                game.SyncImmutableCardAll(answer[0][0]);
                game.Decks[DeckType.Heroes].Remove(answer[0][0]);

                HeroCardHandler h = (HeroCardHandler)answer[0][0].Type;
                Trace.TraceInformation("Assign {0} to player {1}", h.Hero.Name, rulerId);
                Game.CurrentGame.Players[rulerId].Hero = h.Hero;
                Game.CurrentGame.Players[rulerId].Allegiance = h.Hero.Allegiance;
                Game.CurrentGame.Players[rulerId].MaxHealth = Game.CurrentGame.Players[rulerId].Health = ((game.Players.Count > 4) ? h.Hero.MaxHealth + 1 : h.Hero.MaxHealth);
                Game.CurrentGame.Players[rulerId].IsMale = h.Hero.IsMale ? true : false;
                Game.CurrentGame.Players[rulerId].IsFemale = h.Hero.IsMale ? false : true;

                Shuffle(game.Decks[DeckType.Heroes]);
                Dictionary<Player, List<Card>> restDraw = new Dictionary<Player, List<Card>>();
                List<Player> players = new List<Player>(game.Players);
                players.Remove(game.Players[rulerId]);
                int idx = 0;
                foreach (Player p in players)
                {
                    restDraw.Add(p, new List<Card>());
                    for (int n = 0; n < 3; n++)
                    {
                        game.SyncImmutableCard(p, game.Decks[DeckType.Heroes][idx]);
                        restDraw[p].Add(game.Decks[DeckType.Heroes][idx]);
                        idx++;
                    }
                }

                var heroSelection = new Dictionary<Player, Card>();
                game.GlobalProxy.AskForHeroChoice(restDraw, heroSelection);

                bool notUsed = true;
                game.SyncConfirmationStatus(ref notUsed);

                List<Card> toRemove = new List<Card>();
                foreach (Player p in players)
                {
                    Card c;
                    //only server has the result
                    if (!game.IsClient)
                    {
                        idx = 0;
                        if (heroSelection.ContainsKey(p))
                        {
                            c = heroSelection[p];
                            idx = restDraw[p].IndexOf(c);
                        }
                        else
                        {
                            c = restDraw[p][0];
                        }
                        foreach (Player player in game.Players)
                        {
                            game.GameServer.SendObject(player.Id, idx);
                        }
                    }
                    // you are client
                    else
                    {
                        idx = (int)game.GameClient.Receive();
                        c = restDraw[p][idx];
                    }
                    game.SyncImmutableCardAll(c);
                    toRemove.Add(c);
                    h = (HeroCardHandler)c.Type;
                    Trace.TraceInformation("Assign {0} to player {1}", h.Hero.Name, p.Id);
                    var hero = h.Hero.Clone() as Hero;
                    foreach (var skill in new List<ISkill>(hero.Skills))
                    {
                        if (skill.IsRulerOnly)
                        {
                            hero.Skills.Remove(skill);
                        }
                    }
                    p.Hero = hero;
                    p.Allegiance = hero.Allegiance;
                    p.MaxHealth = p.Health = hero.MaxHealth;
                    p.IsMale = hero.IsMale ? true : false;
                    p.IsFemale = hero.IsMale ? false : true;

                }

                foreach (var card in toRemove)
                {
                    game.Decks[DeckType.Heroes].Remove(card);
                }

                if (game.IsClient)
                {
                    foreach (var card in game.Decks[DeckType.Heroes])
                    {
                        card.Type = new UnknownHeroCardHandler();
                        card.Id = Card.UnknownHeroId;
                    }
                }
                Shuffle(game.Decks[DeckType.Heroes]);

                foreach (var pxy in game.UiProxies)
                {
                    pxy.Value.Freeze();
                }
                var toCheck = game.AlivePlayers;
                game.SortByOrderOfComputation(game.Players[rulerId], toCheck);
                foreach (var p in toCheck)
                {
                    Game.CurrentGame.HandleGodHero(p);
                }

                Shuffle(game.Decks[null, DeckType.Dealing]);

                Player current = game.CurrentPlayer = game.Players[rulerId];

                StartGameDeal(game);

                foreach (var act in game.AlivePlayers)
                {
                    game.Emit(GameEvent.PlayerGameStartAction, new GameEventArgs() { Source = act });
                }

                while (true)
                {
                    GameEventArgs args = new GameEventArgs();
                    args.Source = current;
                    game.CurrentPhaseEventIndex = 0;
                    game.CurrentPhase = TurnPhase.BeforeStart;
                    game.CurrentPlayer = current;
                    game.Emit(GameEvent.DoPlayer, args);
                    current = game.NextAlivePlayer(current);
                }
            }
Ejemplo n.º 24
0
Archivo: Game.cs Proyecto: maplegh/sgs
 public void HandleCardTransfer(Player from, Player to, DeckType target, List<Card> cards)
 {
     CardsMovement move = new CardsMovement();
     move.Cards = new List<Card>(cards);
     move.To = new DeckPlace(to, target);
     move.Helper = new MovementHelper();
     MoveCards(move);
     PlayerLostCard(from, cards);
     PlayerAcquiredCard(to, cards);
 }
Ejemplo n.º 25
0
 public List <Card> this[DeckType type]
 {
     get { return(this[null, type]); }
     set { this[null, type] = value; }
 }
Ejemplo n.º 26
0
 public void HandleCardTransfer(Player from, Player to, DeckType target, List<Card> cards)
 {
     if (to.IsDead)
     {
         if (cards.Any(cd => cd.Place.DeckType != DeckType.Hand && cd.Place.DeckType != DeckType.Equipment && cd.Place.DeckType != DeckType.DelayedTools))
         {
             CardsMovement move1 = new CardsMovement();
             move1.Cards = new List<Card>(cards);
             move1.To = new DeckPlace(null, DeckType.Discard);
             MoveCards(move1);
             PlayerLostCard(from, cards);
         }
         return;
     }
     CardsMovement move = new CardsMovement();
     move.Cards = new List<Card>(cards);
     move.To = new DeckPlace(to, target);
     move.Helper = new MovementHelper();
     MoveCards(move);
     GameDelays.Delay(GameDelayTypes.CardTransfer);
     EnterAtomicContext();
     PlayerLostCard(from, cards);
     PlayerAcquiredCard(to, cards);
     ExitAtomicContext();
 }
Ejemplo n.º 27
0
 public DeckPlace(Player player, DeckType deckType)
 {
     this.player   = player;
     this.deckType = deckType;
 }
Ejemplo n.º 28
0
        void Run(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
        {
            var GuZhengDeck = new DeckType("GuZheng");
            belongToCurrent = new List<Card>();
            foreach (Card c in new List<Card>(GuZhengCards))
            {
                if (c.Place.DeckType != DeckType.Discard)
                {
                    GuZhengCards.Remove(c);
                }
                else if (c.HistoryPlace1.Player == Game.CurrentGame.CurrentPlayer)
                {
                    belongToCurrent.Add(c);
                }
            }
            if (belongToCurrent.Count == 0 || !AskForSkillUse())
            {
                GuZhengCards = new List<Card>();
                belongToCurrent = new List<Card>();
                return;
            }
            NotifySkillUse();
            CardsMovement move = new CardsMovement();
            move.Cards = GuZhengCards;
            move.To = new DeckPlace(null, GuZhengDeck);
            Game.CurrentGame.MoveCards(move);
            List<List<Card>> answer;
            var options = new AdditionalCardChoiceOptions() { Options = new List<OptionPrompt>() { new OptionPrompt("GuZhengHuoDe"), new OptionPrompt("GuZhengBuHuoDe") } };
            if (!Game.CurrentGame.UiProxies[Owner].AskForCardChoice(
                new CardChoicePrompt("GuZheng", Owner, Game.CurrentGame.CurrentPlayer),
                new List<DeckPlace>() { new DeckPlace(null, GuZhengDeck) },
                new List<string>() { "GuZhengFanHui" },
                new List<int>() { 1 },
                new GuZhengVerifier(),
                out answer,
                options))
            {
                Trace.TraceInformation("Invalid answer, choosing for you");
                answer = new List<List<Card>>();
                answer.Add(new List<Card>());
                answer[0].Add(belongToCurrent[0]);
            }
            move = new CardsMovement();
            move.Cards = new List<Card>(answer[0]);
            move.To = new DeckPlace(Game.CurrentGame.CurrentPlayer, DeckType.Hand);
            Game.CurrentGame.MoveCards(move);
            Game.CurrentGame.PlayerAcquiredCard(Game.CurrentGame.CurrentPlayer, answer[0]);

            if (options.OptionResult == 1)
            {
                Game.CurrentGame.PlaceIntoDiscard(null, new List<Card>(Game.CurrentGame.Decks[null, GuZhengDeck]));
            }
            else
            {
                var cardsToAcquire = new List<Card>(Game.CurrentGame.Decks[null, GuZhengDeck]);
                move = new CardsMovement();
                move.Cards = new List<Card>(cardsToAcquire);
                move.To = new DeckPlace(Owner, DeckType.Hand);
                Game.CurrentGame.MoveCards(move);
                Game.CurrentGame.PlayerAcquiredCard(Owner, cardsToAcquire);
            }
            GuZhengCards = new List<Card>();
        }
Ejemplo n.º 29
0
 public override void Run(GameEvent gameEvent, GameEventArgs eventArgs)
 {
     var card = eventArgs.Card;
     if (!(card.Type is WuGuFengDeng)) return;
     var wugu = card.Type as WuGuFengDeng;
     var dests = eventArgs.Targets;
     DeckType wuguDeck = new DeckType("WuGu");
     DeckType wuguFakeDeck = new DeckType("WuGuFake");
     CardsMovement move = new CardsMovement();
     move.Cards = new List<Card>();
     for (int i = 0; i < dests.Count; i++)
     {
         Game.CurrentGame.SyncImmutableCardAll(Game.CurrentGame.PeekCard(0));
         Card c = Game.CurrentGame.DrawCard();
         move.Cards.Add(c);
     }
     move.To = new DeckPlace(null, wuguDeck);
     Game.CurrentGame.MoveCards(move, false, Core.Utils.GameDelayTypes.None);
     wugu.FakeMapping = new Dictionary<Card, Card>();
     Game.CurrentGame.Decks[null, wuguFakeDeck].Clear();
     foreach (var c in Game.CurrentGame.Decks[null, wuguDeck])
     {
         var faked = new Card(c);
         faked.Place = new DeckPlace(null, wuguFakeDeck);
         Game.CurrentGame.Decks[null, wuguFakeDeck].Add(faked);
         wugu.FakeMapping.Add(faked, c);
     }
     Game.CurrentGame.NotificationProxy.NotifyWuGuStart(new CardChoicePrompt("WuGuFengDeng.Init"), new DeckPlace(null, wuguFakeDeck));
 }
Ejemplo n.º 30
0
 public DeckPlace(Player player, DeckType deckType)
 {
     this.player = player;
     this.deckType = deckType;
 }
Ejemplo n.º 31
0
 void ZhaoLieProcess(Player Owner, GameEvent gameEvent, GameEventArgs eventArgs)
 {
     ZhaoLieUsed = false;
     basicCards.Clear();
     notBasicCards.Clear();
     List<Card> tao = new List<Card>();
     DeckType ZhaoLieDeck = new DeckType("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;
 }
Ejemplo n.º 32
0
 public void AskForHeroChoice(Dictionary<Player, List<Card>> restDraw, Dictionary<Player, Card> heroSelection)
 {
     DeckType temp = new DeckType("Temp");
     if (!restDraw.ContainsKey(proxy.HostPlayer))
     {
         return;
     }
     Game.CurrentGame.Decks[proxy.HostPlayer, temp].AddRange(restDraw[proxy.HostPlayer]);
     List<DeckPlace> sourceDecks = new List<DeckPlace>();
     sourceDecks.Add(new DeckPlace(proxy.HostPlayer, temp));
     List<string> resultDeckNames = new List<string>() { "HeroChoice" };
     List<int> resultDeckMaximums = new List<int>() { 1 };
     int windowId = 0;
     proxy.TryAskForCardChoice(new CardChoicePrompt("HeroChoice"), sourceDecks, resultDeckNames, resultDeckMaximums, new AlwaysTrueChoiceVerifier(), new List<bool>() {false}, ref windowId, null);
 }