public virtual void Use(Room room, CardUseStruct card_use)
        {
            WrappedCard   card    = card_use.Card;
            List <Player> targets = card_use.To;

            for (int index = 0; index < targets.Count; index++)
            {
                Player           target = targets[index];
                CardEffectStruct effect = new CardEffectStruct
                {
                    Card        = card,
                    From        = card_use.From,
                    To          = target,
                    Multiple    = (targets.Count > 1),
                    Drank       = card_use.Drank,
                    ExDamage    = card_use.ExDamage,
                    BasicEffect = card_use.EffectCount.Count > index ? card_use.EffectCount[index] : new CardBasicEffect(target, 0, 0, 0)
                };

                List <Player> players = new List <Player>();
                for (int i = index; i < targets.Count; i++)
                {
                    if (card_use.EffectCount.Count <= i || !card_use.EffectCount[i].Nullified)
                    {
                        players.Add(targets[i]);
                    }
                }
                effect.StackPlayers = players;

                room.CardEffect(effect);
            }

            List <int> table_cardids = room.GetCardIdsOnTable(room.GetSubCards(card));

            if (table_cardids.Count > 0)
            {
                CardMoveReason reason = new CardMoveReason(MoveReason.S_REASON_USE, card_use.From.Name, null, card.Skill, null)
                {
                    Card = card
                };
                if (targets.Count == 1)
                {
                    reason.TargetId = targets[0].Name;
                }
                CardsMoveStruct move = new CardsMoveStruct(table_cardids, card_use.From, null, Place.PlaceTable, Place.DiscardPile, reason);
                room.MoveCardsAtomic(new List <CardsMoveStruct> {
                    move
                }, true);
            }
        }
        public virtual void DoRecast(Room room, CardUseStruct use)
        {
            WrappedCard    card   = use.Card;
            CardMoveReason reason = new CardMoveReason(MoveReason.S_REASON_RECAST, use.From.Name)
            {
                SkillName = card.Skill
            };

            room.RecordSubCards(use.Card);
            room.MoveCardTo(card, null, Place.PlaceTable, reason, true);
            if (!string.IsNullOrEmpty(reason.SkillName))
            {
                room.BroadcastSkillInvoke(use.From, use.Card);
            }
            else
            {
                room.BroadcastSkillInvoke("@recast", use.From.IsMale() ? "male" : "female", -1);
            }

            if (!string.IsNullOrEmpty(card.Skill) && !card.Skill.StartsWith("-") && use.IsOwnerUse && RoomLogic.PlayerHasSkill(room, use.From, card.Skill))
            {
                room.NotifySkillInvoked(use.From, card.Skill);
            }

            LogMessage log = new LogMessage("#Card_Recast")
            {
                From     = use.From.Name,
                Card_str = RoomLogic.CardToString(room, card)
            };

            room.SendLog(log);

            List <int> table_cardids = room.GetCardIdsOnTable(room.GetSubCards(card));

            if (table_cardids.Count > 0)
            {
                CardsMoveStruct move = new CardsMoveStruct(table_cardids, use.From, null, Place.PlaceTable, Place.DiscardPile, reason);
                room.MoveCardsAtomic(new List <CardsMoveStruct>()
                {
                    move
                }, true);
                room.RemoveSubCards(use.Card);
            }

            room.DrawCards(use.From, 1, "recast");
        }
Example #3
0
        public override void Record(TriggerEvent triggerEvent, Room room, Player player, ref object data)
        {
            if (triggerEvent == TriggerEvent.EventPhaseStart && player.Phase == PlayerPhase.Start && base.Triggerable(player, room) && player.GetPile("qiuan").Count > 0)
            {
                List <int> ids = player.GetPile("qiuan");
                player.SetTag(Name, ids);
                CardsMoveStruct move = new CardsMoveStruct(ids, player, Place.PlaceHand, new CardMoveReason(MoveReason.S_REASON_EXCHANGE_FROM_PILE, player.Name));
                room.MoveCardsAtomic(new List <CardsMoveStruct> {
                    move
                }, false);

                room.LoseHp(player);
            }
            else if (triggerEvent == TriggerEvent.EventPhaseChanging && data is PhaseChangeStruct change && change.To == PlayerPhase.NotActive && player.ContainsTag(Name))
            {
                player.RemoveTag(Name);
            }
        }
Example #4
0
        public override void Use(Room room, CardUseStruct card_use)
        {
            WrappedCard card = card_use.Card;

            if (card_use.To.Count == 0)
            {
                CardMoveReason reason = new CardMoveReason(CardMoveReason.MoveReason.S_REASON_USE, card_use.From.Name, null, card.Skill, null)
                {
                    CardString = RoomLogic.CardToString(room, card_use.Card)
                };
                room.MoveCardTo(card, room.GetCardOwner(card.GetEffectiveId()), null, Place.DiscardPile, reason, true);
            }

            if (room.GetCardIdsOnTable(card).Count == 0)
            {
                return;
            }

            int    equipped_id = -1;
            Player target      = card_use.To[0];

            if (target.HasEquip((int)EquipLocation()))
            {
                equipped_id = target.GetEquip((int)EquipLocation());
            }

            List <CardsMoveStruct> exchangeMove = new List <CardsMoveStruct> {
            };
            CardsMoveStruct move1 = new CardsMoveStruct(card.GetEffectiveId(), target, Place.PlaceEquip,
                                                        new CardMoveReason(CardMoveReason.MoveReason.S_REASON_USE, target.Name));

            move1.Reason.CardString = RoomLogic.CardToString(room, card_use.Card);
            exchangeMove.Add(move1);
            if (equipped_id != -1)
            {
                CardsMoveStruct move2 = new CardsMoveStruct(equipped_id, target, Place.PlaceTable,
                                                            new CardMoveReason(CardMoveReason.MoveReason.S_REASON_CHANGE_EQUIP, target.Name));
                exchangeMove.Add(move2);
            }
            room.MoveCardsAtomic(exchangeMove, true);

            LogMessage log = new LogMessage
            {
                From     = target.Name,
                Type     = "$Install",
                Card_str = card.GetEffectiveId().ToString()
            };

            room.SendLog(log);

            if (equipped_id != -1)
            {
                if (room.GetCardPlace(equipped_id) == Place.PlaceTable)
                {
                    CardsMoveStruct move3 = new CardsMoveStruct(equipped_id, null, Place.DiscardPile,
                                                                new CardMoveReason(CardMoveReason.MoveReason.S_REASON_CHANGE_EQUIP, target.Name));
                    room.MoveCardsAtomic(new List <CardsMoveStruct> {
                        move3
                    }, true);
                }
            }
        }
Example #5
0
        public override void OnEffect(Room room, CardEffectStruct effect)
        {
            WrappedCard card = effect.Card;

            if (room.GetCardIdsOnTable(card).Count == 0)
            {
                return;
            }

            LogMessage log = new LogMessage
            {
                From = effect.To.Name,
                Type = "#DelayedTrick",
                Arg  = card.Name
            };

            room.SendLog(log);

            JudgeStruct judge_struct = new JudgeStruct
            {
                Pattern        = judge.Pattern,
                Good           = judge.Good,
                Negative       = judge.Negative,
                Reason         = judge.Reason,
                PlayAnimation  = judge.PlayAnimation,
                Time_consuming = judge.Time_consuming,
                Who            = effect.To
            };

            room.Judge(ref judge_struct);
            if (judge_struct.IsEffected())
            {
                TakeEffect(room, effect.To, card);
                List <int> table_cardids = room.GetCardIdsOnTable(card);
                if (table_cardids.Count > 0)
                {
                    //DummyCard dummy(table_cardids);
                    CardMoveReason reason = new CardMoveReason(CardMoveReason.MoveReason.S_REASON_NATURAL_ENTER, null);
                    //room->moveCardTo(&dummy, NULL, Player::DiscardPile, reason, true);
                    CardsMoveStruct move = new CardsMoveStruct(table_cardids, null, Place.DiscardPile, reason);
                    room.MoveCardsAtomic(new List <CardsMoveStruct> {
                        move
                    }, true);
                }
            }
            else if (movable)
            {
                OnNullified(room, effect.To, card);
            }
            else
            {
                List <int> table_cardids = room.GetCardIdsOnTable(card);
                if (table_cardids.Count > 0)
                {
                    CardMoveReason  reason = new CardMoveReason(CardMoveReason.MoveReason.S_REASON_NATURAL_ENTER, null);
                    CardsMoveStruct move   = new CardsMoveStruct(table_cardids, null, Place.DiscardPile, reason);
                    room.MoveCardsAtomic(new List <CardsMoveStruct> {
                        move
                    }, true);
                }
            }
        }
Example #6
0
        public virtual void Use(Room room, CardUseStruct card_use)
        {
            WrappedCard   card           = card_use.Card;
            List <Player> targets        = card_use.To;
            List <string> nullified_list = room.GetTag("CardUseNullifiedList") != null ? (List <string>)room.GetTag("CardUseNullifiedList") : new List <string>();
            bool          all_nullified  = nullified_list.Contains("_ALL_TARGETS");

            foreach (Player target in targets)
            {
                CardEffectStruct effect = new CardEffectStruct
                {
                    Card      = card,
                    From      = card_use.From,
                    To        = target,
                    Multiple  = (targets.Count > 1),
                    Nullified = (all_nullified || nullified_list.Contains(target.Name)),
                    Drank     = card_use.Drank,
                };
                if (card_use.EffectCount != null)
                {
                    foreach (EffctCount count in new List <EffctCount>(card_use.EffectCount))
                    {
                        if ((count.From == card_use.From && count.To == target && count.Index == targets.IndexOf(target)) ||
                            (count.To == card_use.From && count.From == target) && count.Index == targets.IndexOf(target))
                        {
                            card_use.EffectCount.Remove(count);
                            if (effect.EffectCount != null)
                            {
                                effect.EffectCount.Add(count);
                            }
                            else
                            {
                                effect.EffectCount = new List <EffctCount> {
                                    count
                                }
                            };
                            break;
                        }
                    }
                }

                List <Player> players = new List <Player>();
                for (int i = targets.IndexOf(target); i < targets.Count; i++)
                {
                    if (!nullified_list.Contains(targets[i].Name) && !all_nullified)
                    {
                        players.Add(targets[i]);
                    }
                }
                room.SetTag("targets" + RoomLogic.CardToString(room, card), players);
                effect.StackPlayers = players;

                room.CardEffect(effect);
            }

            List <int> table_cardids = room.GetCardIdsOnTable(card);

            if (table_cardids.Count > 0)
            {
                CardMoveReason reason = new CardMoveReason(CardMoveReason.MoveReason.S_REASON_USE, card_use.From.Name, null, card.Skill, null)
                {
                    CardString = RoomLogic.CardToString(room, card)
                };
                if (targets.Count == 1)
                {
                    reason.TargetId = targets[0].Name;
                }
                CardsMoveStruct move = new CardsMoveStruct(table_cardids, card_use.From, null, Place.PlaceTable, Place.DiscardPile, reason);
                room.MoveCardsAtomic(new List <CardsMoveStruct> {
                    move
                }, true);
            }
        }
Example #7
0
        public virtual void OnUse(Room room, CardUseStruct card_use)
        {
            Player player = card_use.From;

            room.SortByActionOrder(ref card_use);
            List <Player> targets = card_use.To;

            bool       hidden = (TypeID == CardType.TypeSkill && !WillThrow);
            LogMessage log    = new LogMessage("#UseCard")
            {
                From     = player.Name,
                To       = new List <string>(),
                Card_str = RoomLogic.CardToString(room, card_use.Card)
            };

            if (!TargetFixed(card_use.Card) || card_use.To.Count > 1 || !card_use.To.Contains(card_use.From))
            {
                log.SetTos(card_use.To);
            }


            List <int>             used_cards = new List <int>();
            List <CardsMoveStruct> moves      = new List <CardsMoveStruct>();

            used_cards.AddRange(card_use.Card.SubCards);

            RoomThread thread = room.RoomThread;
            object     data   = card_use;

            thread.Trigger(TriggerEvent.PreCardUsed, room, player, ref data);

            card_use = (CardUseStruct)data;

            if (TypeID != CardType.TypeSkill)
            {
                CardMoveReason reason = new CardMoveReason(CardMoveReason.MoveReason.S_REASON_USE, player.Name, null, card_use.Card.Skill, null)
                {
                    CardString = RoomLogic.CardToString(room, card_use.Card),
                    General    = RoomLogic.GetGeneralSkin(room, player, card_use.Card.Skill, card_use.Card.SkillPosition)
                };
                if (card_use.To.Count == 1)
                {
                    reason.TargetId = card_use.To[0].Name;
                }

                foreach (int id in used_cards)
                {
                    CardsMoveStruct move = new CardsMoveStruct(id, null, Place.PlaceTable, reason);
                    moves.Add(move);
                }
                room.MoveCardsAtomic(moves, true);
                if (used_cards.Count == 0)
                {                                                                                 //show virtual card on table
                    CardsMoveStruct move = new CardsMoveStruct(-1, player, Place.PlaceTable, reason)
                    {
                        From_place       = Place.PlaceUnknown,
                        From             = player.Name,
                        Is_last_handcard = false,
                    };
                    room.NotifyUsingVirtualCard(RoomLogic.CardToString(room, card_use.Card), move);
                }

                room.SendLog(log);
                if (this is Collateral)
                { // put it here for I don't wanna repeat these codes in Card::onUse
                    Player victim = room.FindPlayer((string)card_use.To[0].GetTag("collateralVictim"), true);
                    if (victim != null)
                    {
                        log = new LogMessage("#CollateralSlash")
                        {
                            From = card_use.From.Name,
                            To   = new List <string> {
                                victim.Name
                            },
                        };
                        room.SendLog(log);
                        room.DoAnimate(AnimateType.S_ANIMATE_INDICATE, card_use.To[0].Name, victim.Name);
                    }
                }
            }
            else
            {
                CardMoveReason reason = new CardMoveReason(CardMoveReason.MoveReason.S_REASON_THROW, card_use.From.Name, null,
                                                           card_use.Card.Skill, null)
                {
                    CardString = RoomLogic.CardToString(room, card_use.Card),
                    General    = RoomLogic.GetGeneralSkin(room, player, card_use.Card.Skill, card_use.Card.SkillPosition)
                };

                FunctionCard card = Engine.GetFunctionCard(card_use.Card.Name);
                if (card is SkillCard && WillThrow)
                {
                    room.MoveCardTo(card_use.Card, card_use.From, null, Place.PlaceTable, reason, true);
                }
                room.SendLog(log);

                if (WillThrow)
                {
                    List <int> table_cardids = room.GetCardIdsOnTable(card_use.Card);
                    if (table_cardids.Count > 0)
                    {
                        CardsMoveStruct move = new CardsMoveStruct(table_cardids, player, null, Place.PlaceTable, Place.DiscardPile, reason);
                        room.MoveCardsAtomic(new List <CardsMoveStruct> {
                            move
                        }, true);
                    }
                }
            }
            room.RoomThread.Trigger(TriggerEvent.CardUsedAnnounced, room, player, ref data);
            room.RoomThread.Trigger(TriggerEvent.CardTargetAnnounced, room, player, ref data);

            room.RoomThread.Trigger(TriggerEvent.CardUsed, room, player, ref data);
            room.RoomThread.Trigger(TriggerEvent.CardFinished, room, player, ref data);
        }