Пример #1
0
 public override TriggerStruct Triggerable(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who)
 {
     if (player != null && data is InfoStruct info && info.Info == skill_name)
     {
         TriggerStruct trigger = new TriggerStruct(Name, player)
         {
             SkillPosition = info.Head ? "head" : "deputy"
         };
         return(trigger);
     }
     return(new TriggerStruct());
 }
Пример #2
0
 public override TriggerStruct Triggerable(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who)
 {
     if (player != null && player.Alive && player.HasFlag("tunchu"))
     {
         if (player.IsKongcheng())
         {
             player.SetFlags("-tunchu");
             return(new TriggerStruct());
         }
         TriggerStruct trigger = new TriggerStruct(Name, player)
         {
             SkillPosition = (string)player.GetTag("tunchu")
         };
         return(trigger);
     }
     return(new TriggerStruct());
 }
Пример #3
0
        public override List <TriggerStruct> Triggerable(TriggerEvent triggerEvent, Room room, Player player, ref object data)
        {
            List <TriggerStruct> skill_list = new List <TriggerStruct>();

            if (player.Alive && player.Phase == PlayerPhase.Finish && player.HandcardNum < player.Hp)
            {
                List <Player> lifengs = RoomLogic.FindPlayersBySkillName(room, Name);
                foreach (Player p in lifengs)
                {
                    if (p.GetPile("commissariat").Count > 0)
                    {
                        TriggerStruct trigger = new TriggerStruct(Name, p);
                        skill_list.Add(trigger);
                    }
                }
            }
            return(skill_list);
        }
Пример #4
0
        public override List <TriggerStruct> Triggerable(TriggerEvent triggerEvent, Room room, Player player, ref object data)
        {
            List <TriggerStruct> result = new List <TriggerStruct>();

            if (player.Phase == PlayerPhase.Start && room.AliveCount() >= 4)
            {
                foreach (string skill in player.GetHeadSkillList(true, false))
                {
                    Skill real_skill = Engine.GetSkill(skill);
                    if (real_skill != null && real_skill is BattleArraySkill baskill)
                    {
                        if (baskill.ViewAsSkill.IsEnabledAtPlay(room, player))
                        {
                            TriggerStruct trigger = new TriggerStruct(Name, player)
                            {
                                SkillPosition = "head"
                            };
                            result.Add(trigger);
                        }
                    }
                }
                foreach (string skill in player.GetDeputySkillList(true, false))
                {
                    Skill real_skill = Engine.GetSkill(skill);
                    if (real_skill != null && real_skill is BattleArraySkill baskill)
                    {
                        if (baskill.ViewAsSkill.IsEnabledAtPlay(room, player))
                        {
                            TriggerStruct trigger = new TriggerStruct(Name, player)
                            {
                                SkillPosition = "deputy"
                            };
                            result.Add(trigger);
                        }
                    }
                }
            }

            return(result);
        }
Пример #5
0
        public virtual List <TriggerStruct> Triggerable(TriggerEvent triggerEvent, Room room, Player player, ref object data)
        {
            List <TriggerStruct> skill_lists = new List <TriggerStruct>();

            if (Name == "gamerule")
            {
                return(skill_lists);
            }

            TriggerStruct skill_list = Triggerable(triggerEvent, room, player, ref data, null);

            if (!string.IsNullOrEmpty(skill_list.SkillName))
            {
                for (int i = 0; i < skill_list.Times; i++)
                {
                    TriggerStruct skill = skill_list;
                    skill.Times = 1;
                    skill_lists.Add(skill);
                }
            }

            return(skill_lists);
        }
Пример #6
0
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            Player lord = null;

            foreach (Player p in room.GetAlivePlayers())
            {
                if (p.GetRoleEnum() == PlayerRole.Lord)
                {
                    lord = p;
                    break;
                }
            }

            room.DoAnimate(AnimateType.S_ANIMATE_INDICATE, player.Name, lord.Name);
            room.SendCompulsoryTriggerLog(player, Name, true);
            room.BroadcastSkillInvoke(Name, player, info.SkillPosition);

            room.LoseHp(player);
            if (lord.Alive)
            {
                RecoverStruct recover = new RecoverStruct
                {
                    Who     = player,
                    Recover = 1
                };
                room.Recover(lord, recover, true);
                if (lord.Alive)
                {
                    room.DrawCards(lord, new DrawCardStruct(1, player, Name));
                }
            }

            return(false);
        }
Пример #7
0
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            room.SendCompulsoryTriggerLog(ask_who, name, true);
            room.BroadcastSkillInvoke(Name, ask_who, info.SkillPosition);

            JudgeStruct judge = new JudgeStruct
            {
                Pattern       = ".|black",
                Good          = true,
                Reason        = Name,
                PlayAnimation = true,
                Who           = player,
            };

            room.Judge(ref judge);

            if (judge.IsEffected())
            {
                List <Player> players = new List <Player>();
                foreach (Player p in room.GetAlivePlayers())
                {
                    if (p.Camp == ask_who.Camp)
                    {
                        room.DoAnimate(AnimateType.S_ANIMATE_INDICATE, player.Name, p.Name);
                        players.Add(p);
                    }
                }

                room.SortByActionOrder(ref players);
                foreach (Player p in players)
                {
                    room.DrawCards(p, new DrawCardStruct(1, ask_who, Name));
                }
            }

            return(false);
        }
Пример #8
0
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            room.SendCompulsoryTriggerLog(ask_who, Name);
            room.BroadcastSkillInvoke(Name, ask_who, info.SkillPosition);
            List <string> choices = new List <string> {
                "draw"
            };

            if (player.IsWounded())
            {
                choices.Add("recover");
            }

            string choice = room.AskForChoice(player, Name, string.Join("+", choices));

            if (choice == "draw")
            {
                room.DrawCards(player, 1, Name);
            }
            else
            {
                room.Recover(player, 1);
            }

            return(false);
        }
Пример #9
0
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            room.SendCompulsoryTriggerLog(player, Name, true);
            room.BroadcastSkillInvoke(Name, player, info.SkillPosition);
            List <Player> targets = room.GetOtherPlayers(player);

            room.SortByActionOrder(ref targets);
            foreach (Player p in targets)
            {
                if (p.Alive && player.Alive && !p.IsAllNude() && RoomLogic.CanGetCard(room, player, p, "hej"))
                {
                    room.DoAnimate(AnimateType.S_ANIMATE_INDICATE, player.Name, p.Name);
                    int        id  = room.AskForCardChosen(player, p, "hej", Name, false, HandlingMethod.MethodGet);
                    List <int> ids = new List <int> {
                        id
                    };
                    room.ObtainCard(player, ref ids, new CardMoveReason(MoveReason.S_REASON_EXTRACTION, player.Name, p.Name, Name, string.Empty), false);
                }
            }

            if (player.Alive)
            {
                room.LoseHp(player);
            }

            return(false);
        }
Пример #10
0
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            if (data is DamageStruct damage)
            {
                room.DoAnimate(AnimateType.S_ANIMATE_INDICATE, player.Name, damage.To.Name);
                room.SendCompulsoryTriggerLog(player, name, true);
                room.BroadcastSkillInvoke(Name, player, info.SkillPosition);

                Player        target = damage.To;
                List <string> handle = new List <string>();
                if (!target.IsKongcheng() && RoomLogic.CanGetCard(room, player, target, "h"))
                {
                    handle.Add("h^false^get");
                }
                if (target.HasEquip() && RoomLogic.CanGetCard(room, player, target, "e"))
                {
                    handle.Add("e^false^get");
                }
                if (target.JudgingArea.Count > 0 && RoomLogic.CanGetCard(room, player, target, "j"))
                {
                    handle.Add("j^false^get");
                }

                List <int> ids = room.AskForCardsChosen(player, damage.To, handle, Name);
                if (ids.Count > 0)
                {
                    room.ObtainCard(player, ref ids, new CardMoveReason(MoveReason.S_REASON_EXTRACTION, player.Name, damage.To.Name, Name, string.Empty), false);
                }

                if (player.Alive)
                {
                    room.LoseHp(player);
                }
            }

            return(false);
        }
Пример #11
0
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            Player lord = null;

            foreach (Player p in room.GetAlivePlayers())
            {
                if (p.GetRoleEnum() == PlayerRole.Lord)
                {
                    lord = p;
                    break;
                }
            }
            List <int> give = room.AskForExchange(player, Name, 1, 0, "@huying:" + lord.Name, string.Empty, Slash.ClassName, info.SkillPosition);

            room.SendCompulsoryTriggerLog(player, Name, true);
            room.BroadcastSkillInvoke(Name, player, info.SkillPosition);
            room.DoAnimate(AnimateType.S_ANIMATE_INDICATE, player.Name, lord.Name);

            if (give.Count > 0)
            {
                room.ObtainCard(lord, ref give, new CardMoveReason(MoveReason.S_REASON_GIVE, player.Name, lord.Name, Name, string.Empty), true);
            }
            else
            {
                room.LoseHp(player);
                if (lord.Alive)
                {
                    foreach (int id in room.DrawPile)
                    {
                        WrappedCard card = room.GetCard(id);
                        if (card.Name.Contains(Slash.ClassName))
                        {
                            CardMoveReason reason = new CardMoveReason(MoveReason.S_REASON_GOTBACK, lord.Name, Name, string.Empty);
                            List <int>     ids    = new List <int> {
                                id
                            };
                            room.ObtainCard(lord, ref ids, reason, true);
                            break;
                        }
                    }
                }
            }

            return(false);
        }
Пример #12
0
 public abstract bool OnPhaseChange(Room room, Player player, TriggerStruct info);
Пример #13
0
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            int n = (int)data;

            data = GetDrawNum(room, player, n);
            return(false);
        }
Пример #14
0
 public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
 {
     return(OnPhaseChange(room, player, info));
 }
Пример #15
0
 virtual public bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
 {
     return(false);
 }
Пример #16
0
 virtual public TriggerStruct Cost(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
 {
     return(info);
 }
Пример #17
0
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            room.SendCompulsoryTriggerLog(ask_who, Name, true);
            room.BroadcastSkillInvoke(Name, ask_who, info.SkillPosition);

            room.LoseMaxHp(ask_who);
            if (ask_who.Alive)
            {
                room.DrawCards(ask_who, ask_who.MaxHp, Name);
            }

            return(false);
        }
Пример #18
0
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            int count = 1 - player.Hp;

            if (count > 0)
            {
                RecoverStruct recover = new RecoverStruct
                {
                    Who     = ask_who,
                    Recover = count
                };
                room.Recover(player, recover, true);
            }

            return(false);
        }
Пример #19
0
        public override TriggerStruct Cost(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            if (player.Alive && ask_who.Alive)
            {
                ask_who.SetFlags("slashTargetFix");
                player.SetFlags("SlashAssignee");

                WrappedCard used = room.AskForUseCard(ask_who, "Slash:fangong", "@fangong-slash:" + player.Name, null, -1, HandlingMethod.MethodUse, false);
                if (used == null)
                {
                    ask_who.SetFlags("-slashTargetFix");
                    player.SetFlags("-SlashAssignee");
                }
            }

            return(new TriggerStruct());
        }
Пример #20
0
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player target, TriggerStruct trigger_info)
        {
            if (room.SkipGameRule)
            {
                room.SkipGameRule = false;
                return(false);
            }

            // Handle global events
            if (player == null)
            {
                if (triggerEvent == TriggerEvent.GameStart)
                {
                    OnGameStart(room, ref data);
                }

                if (triggerEvent != TriggerEvent.BeforeCardsMove && triggerEvent != TriggerEvent.CardsMoveOneTime)
                {
                    return(false);
                }
            }

            switch (triggerEvent)
            {
            case TriggerEvent.TurnStart:
                OnTurnStart(room, player, ref data);
                break;

            case TriggerEvent.EventPhaseProceeding:
                OnPhaseProceed(room, player, ref data);
                break;

            case TriggerEvent.EventPhaseEnd:
                OnPhaseEnd(room, player, ref data);
                break;

            case TriggerEvent.EventPhaseChanging:
                OnPhaseChanging(room, player, ref data);
                break;

            case TriggerEvent.PreCardUsed:
                OnPreCardUsed(room, player, ref data);
                break;

            case TriggerEvent.CardUsed:
                OnCardUsed(room, player, ref data);
                break;

            case TriggerEvent.CardFinished:
                CardUseStruct use = (CardUseStruct)data;
                //room.ClearCardFlag(use.Card);
                use.Card.ClearFlags();                      //RoomCard会在其移动后自动清除flag
                room.RemoveSubCards(use.Card);

                //以askforcard形式使用的卡牌没有onUse的trigger,但有finish
                if (use.Reason != CardUseStruct.CardUseReason.CARD_USE_REASON_RESPONSE)
                {
                    room.RemoveUseOnFinish();
                }

                if (Engine.GetFunctionCard(use.Card.Name).IsNDTrick())
                {
                    room.RemoveHegNullification(use.Card);
                }

                foreach (Client p in room.Clients)
                {
                    room.DoNotify(p, CommandType.S_COMMAND_NULLIFICATION_ASKED, new List <string> {
                        "."
                    });
                }

                break;

            case TriggerEvent.EventAcquireSkill:
            case TriggerEvent.EventLoseSkill:
                InfoStruct info       = (InfoStruct)data;
                string     skill_name = info.Info;
                Skill      skill      = Engine.GetSkill(skill_name);
                bool       refilter   = skill is FilterSkill;

                if (!refilter && skill is TriggerSkill)
                {
                    TriggerSkill trigger = (TriggerSkill)skill;
                    ViewAsSkill  vsskill = trigger.ViewAsSkill;
                    if (vsskill != null && (vsskill is FilterSkill))
                    {
                        refilter = true;
                    }
                }

                if (refilter)
                {
                    room.FilterCards(player, player.GetCards("he"), triggerEvent == TriggerEvent.EventLoseSkill);
                }

                CheckBigKingdoms(room);
                break;

            case TriggerEvent.PostHpReduced:
                if (player.Hp > 0 || player.HasFlag("Global_Dying"))     // newest GameRule -- a player cannot enter dying when it is dying.
                {
                    break;
                }
                if (data is DamageStruct damage)
                {
                    room.EnterDying(player, damage);
                }
                else
                {
                    room.EnterDying(player, new DamageStruct());
                }

                break;

            case TriggerEvent.AskForPeaches:
                OnAskforPeach(room, player, ref data);
                break;

            case TriggerEvent.AskForPeachesDone:
            {
                if (player.Hp <= 0 && player.Alive)
                {
                    DyingStruct dying = (DyingStruct)data;
                    room.KillPlayer(player, dying.Damage);
                }

                break;
            }

            case TriggerEvent.ConfirmDamage:
            {
                break;
            }

            case TriggerEvent.DamageDone:
            {
                damage = (DamageStruct)data;
                if (damage.From != null && !damage.From.Alive)
                {
                    damage.From = null;
                }
                room.SendDamageLog(damage);

                if (damage.Nature != DamageNature.Normal && player.Chained && !damage.Chain && !damage.ChainStarter)
                {
                    damage.ChainStarter = true;
                }

                data = damage;

                bool reduce = !room.ApplyDamage(player, damage);

                if (reduce)
                {
                    room.RoomThread.Trigger(TriggerEvent.PostHpReduced, room, player, ref data);
                }

                break;
            }

            case TriggerEvent.DamageComplete:
            {
                damage = (DamageStruct)data;
                if (damage.Prevented)
                {
                    return(false);
                }

                /*
                 * if (damage.Nature != DamageNature.Normal && player.Chained)
                 * {
                 *  room.ChainedRemoveOnDamageDone(player, damage);
                 * }
                 */
                if (damage.Nature != DamageNature.Normal && !damage.Chain && damage.ChainStarter)              // iron chain effect
                {
                    List <Player> chained_players = new List <Player>();
                    if (!room.Current.Alive)
                    {
                        chained_players = room.GetOtherPlayers(room.Current);
                    }
                    else
                    {
                        chained_players = room.GetAllPlayers();
                    }
                    chained_players.Remove(damage.To);
                    foreach (Player chained_player in chained_players)
                    {
                        if (chained_player.Chained)
                        {
                            Thread.Sleep(500);
                            LogMessage log = new LogMessage
                            {
                                Type = "#IronChainDamage",
                                From = chained_player.Name
                            };
                            room.SendLog(log);

                            DamageStruct chain_damage = damage;
                            chain_damage.To             = chained_player;
                            chain_damage.Chain          = true;
                            chain_damage.Transfer       = false;
                            chain_damage.TransferReason = null;

                            room.Damage(chain_damage);
                        }
                    }
                }

                foreach (Player p in room.GetAllPlayers())
                {
                    if (p.HasFlag("Global_DFDebut"))
                    {
                        p.SetFlags("-Global_DFDebut");
                        room.RoomThread.Trigger(TriggerEvent.DFDebut, room, p);
                    }
                }
                break;
            }

            case TriggerEvent.CardEffect:
            {
                if (data is CardEffectStruct effect)
                {
                    if (Engine.GetFunctionCard(effect.Card.Name) is DelayedTrick)
                    {
                        CardMoveReason reason = new CardMoveReason(MoveReason.S_REASON_DELAYTRICK_EFFECT,
                                                                   effect.To.Name, effect.Card.Skill, effect.Card.Name)
                        {
                            Card = effect.Card
                        };

                        room.MoveCardTo(effect.Card, effect.To, Place.PlaceTable, reason, true);
                        Thread.Sleep(500);
                    }
                }
                break;
            }

            case TriggerEvent.CardEffected:
            {
                if (data is CardEffectStruct effect)
                {
                    FunctionCard fcard = Engine.GetFunctionCard(effect.Card.Name);
                    if (!(fcard is Slash) && effect.BasicEffect.Nullified)
                    {
                        LogMessage log = new LogMessage
                        {
                            Type = "#Cardnullified",
                            From = effect.To.Name,
                            Arg  = effect.Card.Name
                        };
                        room.SendLog(log);

                        return(true);
                    }
                    else if (fcard.TypeID == CardType.TypeTrick && room.IsCanceled(effect))
                    {
                        effect.To.SetFlags("Global_NonSkillnullify");
                        return(true);
                    }
                    object _effect = effect;
                    room.RoomThread.Trigger(TriggerEvent.CardEffectConfirmed, room, effect.To, ref _effect);

                    if (effect.To.Alive || fcard is Slash)
                    {
                        fcard.OnEffect(room, effect);
                    }
                }

                break;
            }

            case TriggerEvent.SlashEffected:
            {
                SlashEffectStruct effect = (SlashEffectStruct)data;
                if (effect.Nullified)
                {
                    LogMessage log = new LogMessage
                    {
                        Type = "#Cardnullified",
                        From = effect.To.Name,
                        Arg  = effect.Slash.Name
                    };
                    room.SendLog(log);

                    return(true);
                }

                if (effect.Jink_num > 0)
                {
                    room.RoomThread.Trigger(TriggerEvent.SlashProceed, room, effect.From, ref data);
                }
                else
                {
                    room.SlashResult(effect, null);
                }
                break;
            }

            case TriggerEvent.SlashProceed:
            {
                SlashEffectStruct effect  = (SlashEffectStruct)data;
                string            slasher = effect.From.Name;
                if (!effect.To.Alive)
                {
                    break;
                }
                if (effect.Jink_num == 1)
                {
                    CardResponseStruct resp = room.AskForCard(effect.To, Slash.ClassName, Jink.ClassName, string.Format("slash-jink:{0}::{1}", slasher, effect.Slash.Name),
                                                              data, HandlingMethod.MethodUse, null, effect.From, false, false);
                    room.SlashResult(effect, room.IsJinkEffected(effect.To, resp) ? resp.Card : null);
                }
                else
                {
                    WrappedCard jink = new WrappedCard(DummyCard.ClassName);
                    for (int i = effect.Jink_num; i > 0; i--)
                    {
                        string             prompt = string.Format("@multi-jink{0}:{1}::{2}:{3}", i == effect.Jink_num ? "-start" : string.Empty, slasher, i, effect.Slash.Name);
                        CardResponseStruct resp   = room.AskForCard(effect.To, Slash.ClassName, Jink.ClassName, prompt, data, HandlingMethod.MethodUse, null, effect.From, false, false);

                        if (!room.IsJinkEffected(effect.To, resp))
                        {
                            //delete jink;
                            room.SlashResult(effect, null);
                            return(false);
                        }
                        else
                        {
                            jink.AddSubCard(resp.Card);
                        }
                    }
                    room.SlashResult(effect, jink);
                }

                break;
            }

            case TriggerEvent.SlashHit:
            {
                SlashEffectStruct effect = (SlashEffectStruct)data;
                if (effect.Drank > 0)
                {
                    LogMessage log = new LogMessage
                    {
                        Type = "#AnalepticBuff",
                        From = effect.From.Name,
                        To   = new List <string> {
                            effect.To.Name
                        },
                        Arg  = (1 + effect.ExDamage).ToString(),
                        Arg2 = (1 + effect.ExDamage + effect.Drank).ToString()
                    };

                    room.SendLog(log);
                }
                DamageStruct slash_damage = new DamageStruct(effect.Slash, effect.From, effect.To, 1 + effect.ExDamage + effect.Drank, effect.Nature)
                {
                    Drank = effect.Drank > 0
                };
                room.Damage(slash_damage);
                break;
            }

            case TriggerEvent.BeforeGameOverJudge:
            {
                if (!player.General1Showed)
                {
                    room.ShowGeneral(player, true, false, false);
                }
                if (!player.General2Showed)
                {
                    room.ShowGeneral(player, false, false, false);
                }
                break;
            }

            case TriggerEvent.GameOverJudge:
            {
                string winner = GetWinner(room);
                if (!string.IsNullOrEmpty(winner))
                {
                    room.GameOver(winner);
                    return(true);
                }

                break;
            }

            case TriggerEvent.BuryVictim:
            {
                OnBuryVictim(room, player, ref data);
                break;
            }

            case TriggerEvent.StartJudge:
            {
                int         card_id      = room.GetNCards(1)[0];
                JudgeStruct judge_struct = (JudgeStruct)data;
                judge_struct.Card = room.GetCard(card_id);

                LogMessage log = new LogMessage
                {
                    Type     = "$InitialJudge",
                    From     = judge_struct.Who.Name,
                    Card_str = card_id.ToString()
                };
                room.SendLog(log);

                room.MoveCardTo(judge_struct.Card, null, judge_struct.Who, Place.PlaceJudge,
                                new CardMoveReason(MoveReason.S_REASON_JUDGE, judge_struct.Who.Name, null, null, judge_struct.Reason), true);

                Thread.Sleep(500);
                bool effected = judge_struct.Good == Engine.MatchExpPattern(room, judge_struct.Pattern, judge_struct.Who, judge_struct.Card);
                judge_struct.UpdateResult(effected);
                data = judge_struct;
                break;
            }

            case TriggerEvent.JudgeResult:
            {
                JudgeStruct judge = (JudgeStruct)data;
                LogMessage  log   = new LogMessage
                {
                    Type     = "$JudgeResult",
                    From     = player.Name,
                    Card_str = RoomLogic.CardToString(room, judge.Card)
                };
                room.SendLog(log);

                //Thread.Sleep(500);
                if (judge.PlayAnimation)
                {
                    room.SendJudgeResult(judge);
                    Thread.Sleep(800);
                }

                break;
            }

            case TriggerEvent.FinishJudge:
            {
                JudgeStruct judge = (JudgeStruct)data;

                if (room.GetCardPlace(judge.Card.Id) == Place.PlaceJudge)
                {
                    CardMoveReason reason = new CardMoveReason(MoveReason.S_REASON_JUDGEDONE, judge.Who.Name, null, judge.Reason);
                    room.MoveCardTo(judge.Card, judge.Who, null, Place.DiscardPile, reason, true);
                }

                break;
            }

            case TriggerEvent.ChoiceMade:
            {
                foreach (Player p in room.GetAlivePlayers())
                {
                    List <string> flags = new List <string>(p.Flags);
                    foreach (string flag in flags)
                    {
                        if (flag.StartsWith("Global_") && flag.EndsWith("Failed"))
                        {
                            p.SetFlags("-" + flag);
                        }
                    }
                }
                break;
            }

            case TriggerEvent.GeneralShown:
            {
                string winner = GetWinner(room);
                if (!string.IsNullOrEmpty(winner))
                {
                    room.GameOver(winner);         // if all hasShownGenreal, and they are all friend, game over.
                    return(true);
                }
                if (!room.ContainsTag("TheFirstToShowRewarded"))
                {
                    room.SetTag("TheFirstToShowRewarded", true);
                    room.SetPlayerMark(player, "@pioneer", 1);
                    room.AttachSkillToPlayer(player, "pioneer");
                }
                if (player.Alive && player.HasShownAllGenerals())
                {
                    if (player.GetMark("CompanionEffect") > 0)
                    {
                        room.RemovePlayerMark(player, "CompanionEffect");
                        room.DoSuperLightbox(player, string.Empty, "companion");
                        room.SetPlayerMark(player, "@companion", 1);
                        room.AttachSkillToPlayer(player, "companion");
                    }
                    if (player.GetMark("HalfMaxHpLeft") > 0)
                    {
                        room.RemovePlayerMark(player, "HalfMaxHpLeft");
                        room.SetPlayerMark(player, "@megatama", 1);
                        room.AttachSkillToPlayer(player, "megatama");
                    }
                }
                CheckBigKingdoms(room);
                break;
            }

            case TriggerEvent.BeforeCardsMove:
            {
                if (data is CardsMoveOneTimeStruct move)
                {
                    bool should_find_io = false;
                    if (move.To_place == Place.DiscardPile)
                    {
                        if (move.Reason.Reason != MoveReason.S_REASON_USE)
                        {
                            should_find_io = true;         // not use
                        }
                        else if (move.Card_ids.Count > 1)
                        {
                            should_find_io = true;         // use card isn't IO
                        }
                        else
                        {
                            WrappedCard card = room.GetCard(move.Card_ids[0]);
                            if (card.Name == Edict.ClassName && !card.HasFlag("edict_normal_use"))
                            {
                                should_find_io = true;         // use card isn't IO
                            }
                        }
                    }
                    if (should_find_io)
                    {
                        foreach (int id in move.Card_ids)
                        {
                            WrappedCard card = room.GetCard(id);
                            if (card.Name == Edict.ClassName)
                            {
                                room.MoveCardTo(card, null, Place.PlaceTable, true);
                                room.AddToPile(room.Players[0], "#edict", card, false);
                                LogMessage log = new LogMessage
                                {
                                    Type = "#RemoveEdict",
                                    Arg  = Edict.ClassName
                                };
                                room.SendLog(log);
                                room.SetTag("EdictInvoke", true);
                                room.SetTag("EdictCard", card);
                                int i = move.Card_ids.IndexOf(id);
                                move.From_places.RemoveAt(i);
                                move.Open.RemoveAt(i);
                                move.From_pile_names.RemoveAt(i);
                                move.Card_ids.Remove(id);
                                data = move;
                                break;
                            }
                        }
                    }
                }
                break;
            }

            case TriggerEvent.Death:
            {
                OnDeath(room, player, ref data);
                break;
            }

            case TriggerEvent.CardsMoveOneTime:
            {
                if (data is CardsMoveOneTimeStruct move)
                {
                    if (move.From != null && move.From_places.Contains(Place.PlaceEquip))
                    {
                        foreach (int id in move.Card_ids)
                        {
                            WrappedCard card = room.GetCard(id);
                            if (card.Name == JadeSeal.ClassName)
                            {
                                CheckBigKingdoms(room);
                                break;
                            }
                        }
                    }

                    if (move.To != null && move.To_place == Place.PlaceEquip)
                    {
                        foreach (int id in move.Card_ids)
                        {
                            WrappedCard card = room.GetCard(id);
                            if (card.Name == JadeSeal.ClassName)
                            {
                                CheckBigKingdoms(room);
                                break;
                            }
                        }
                    }
                }

                break;
            }

            default:
                break;
            }

            return(false);
        }
Пример #21
0
        public override TriggerStruct Cost(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            if (room.AskForSkillInvoke(ask_who, Name, player, info.SkillPosition))
            {
                room.BroadcastSkillInvoke(Name, ask_who, info.SkillPosition);
                room.DoSuperLightbox(ask_who, info.SkillPosition, Name);
                room.DoAnimate(AnimateType.S_ANIMATE_INDICATE, ask_who.Name, player.Name);
                room.SetPlayerMark(ask_who, limit_mark, 0);
                return(info);
            }

            return(new TriggerStruct());
        }
Пример #22
0
        /*
         * public override TriggerStruct Cost(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct inf)
         * {
         *  if (RoomLogic.PlayerHasSkill(room, player, skill_name) && player.Alive && data is InfoStruct info)
         *  {
         *      if (!player.HasShownSkill(skill_name, info.Head) && room.AskForSkillInvoke(player, name, null, inf.SkillPosition))
         *      {
         *          room.ShowSkill(player, skill_name, inf.SkillPosition);
         *          return new TriggerStruct();
         *      }
         *      else if (player.HasShownSkill(skill_name, info.Head))
         *          return new TriggerStruct();
         *  }
         *  return inf;
         * }
         */
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            if (!string.IsNullOrEmpty(pile_name))
            {
                room.ClearOnePrivatePile(player, pile_name);
            }

            OnSkillDetached(room, player, data);
            return(false);
        }
Пример #23
0
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            room.SendCompulsoryTriggerLog(player, Name, true);
            room.BroadcastSkillInvoke(Name, player, info.SkillPosition);
            List <Player> targets = room.GetOtherPlayers(player);

            room.SortByActionOrder(ref targets);
            foreach (Player p in targets)
            {
                if (p.Alive && player.Alive)
                {
                    room.DoAnimate(AnimateType.S_ANIMATE_INDICATE, player.Name, p.Name);
                    room.Damage(new DamageStruct(Name, player, p));
                }
            }

            if (player.Alive)
            {
                room.LoseHp(player);
            }

            return(false);
        }
Пример #24
0
 public override TriggerStruct Cost(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
 {
     return(base.Cost(triggerEvent, room, player, ref data, ask_who, info));
 }
Пример #25
0
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            if (ask_who != player)
            {
                ResultStruct result = ask_who.Result;
                result.Assist++;
                ask_who.Result = result;
            }

            room.SendCompulsoryTriggerLog(ask_who, Name);
            room.BroadcastSkillInvoke(Name, ask_who, info.SkillPosition);
            room.DoAnimate(AnimateType.S_ANIMATE_INDICATE, ask_who.Name, player.Name);
            int count = (int)data;

            count++;
            data = count;
            return(false);
        }
Пример #26
0
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            DamageStruct damage = (DamageStruct)data;

            OnDamaged(room, player, damage, info);

            return(false);
        }
Пример #27
0
 public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
 {
     if (triggerEvent == TriggerEvent.EventPhaseStart)
     {
         GeneralSkin gsk = RoomLogic.GetGeneralSkin(room, player, Name, info.SkillPosition);
         room.SendCompulsoryTriggerLog(ask_who, Name, true);
         room.BroadcastSkillInvoke(Name, "male", 1, gsk.General, gsk.SkinId);
         room.DrawCards(ask_who, 2, Name);
     }
     else
     {
         room.AskForDiscard(ask_who, Name, 1, 1, false, true, "@moqu", false, info.SkillPosition);
         GeneralSkin gsk = RoomLogic.GetGeneralSkin(room, player, Name, info.SkillPosition);
         room.BroadcastSkillInvoke(Name, "male", 2, gsk.General, gsk.SkinId);
         room.SendCompulsoryTriggerLog(ask_who, Name, true);
     }
     return(false);
 }
Пример #28
0
 public abstract void OnDamaged(Room room, Player target, DamageStruct damage, TriggerStruct info);
Пример #29
0
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            room.SendCompulsoryTriggerLog(ask_who, Name, true);
            room.BroadcastSkillInvoke(Name, ask_who, info.SkillPosition);
            int count = ask_who.GetMark(Name);

            count++;
            List <Player> targets = new List <Player>();

            foreach (Player p in room.GetAlivePlayers())
            {
                if (p.Camp == ask_who.Camp)
                {
                    targets.Add(p);
                }
            }

            room.SortByActionOrder(ref targets);
            foreach (Player p in targets)
            {
                if (p.Alive)
                {
                    room.DoAnimate(AnimateType.S_ANIMATE_INDICATE, ask_who.Name, p.Name);
                    room.DrawCards(p, new DrawCardStruct(count, ask_who, Name));
                }
            }

            if (ask_who.Alive)
            {
                ask_who.SetMark(Name, count);
                room.SetPlayerStringMark(ask_who, Name, count.ToString());
            }

            return(false);
        }
Пример #30
0
        public virtual TriggerStruct Cost(Room room, ref object data, TriggerStruct info)
        {
            Player target = room.FindPlayer(info.Invoker, true);

            if (RoomLogic.HasArmorEffect(room, target, Name, false) &&
                (frequency == Frequency.Compulsory || room.AskForSkillInvoke(target, Name, data)))
            {
                return(info);
            }

            List <string> all     = new List <string>();
            bool          show    = false;
            bool          protect = true;

            foreach (ViewHasSkill vhskill in Engine.ViewHas(room, target, Name, "armor"))
            {
                Skill mskill = Engine.GetMainSkill(vhskill.Name);
                if (RoomLogic.PlayerHasShownSkill(room, target, mskill))
                {
                    protect = false;
                    if (frequency == Frequency.Compulsory)
                    {
                        show = true;
                    }
                }
                all.Add(mskill.Name);
            }
            if (protect)
            {
                target.SetFlags("Global_askForSkillCost");
            }

            if (all.Count > 0)
            {
                List <TriggerStruct> skills = new List <TriggerStruct>();
                foreach (string sk in all)
                {
                    TriggerStruct skill = new TriggerStruct(sk, target)
                    {
                        ResultTarget = info.ResultTarget
                    };
                    skills.Add(skill);
                }
                TriggerStruct result = room.AskForSkillTrigger(target, "armorskill", skills, !show, data);

                if (string.IsNullOrEmpty(result.SkillName))
                {
                    return(result);
                }
                else
                {
                    TriggerSkill result_skill = Engine.GetTriggerSkill(result.SkillName);
                    if (result_skill != null)
                    {
                        if (show || all.Count > 1 || room.AskForSkillInvoke(target, result_skill.Name, data, result.SkillPosition))
                        {
                            return(result);
                        }
                    }
                    else if (show || all.Count > 1 || room.AskForSkillInvoke(target, result_skill.Name, data, result.SkillPosition))
                    {
                        return(info);
                    }
                }
            }
            return(new TriggerStruct());
        }