Ejemplo n.º 1
0
    // 宣布一个时机的到来
    public void CallTime(PTime Time)
    {
        PLogger.Log("时机到来:" + Time.Name);
        if (Time.IsPeroidTime() && EndTurnDirectly)
        {
            PLogger.Log("阶段立刻结束");
            return;
        }
        List <PPlayer>  Sequence = SettleSequence();
        List <PTrigger> ValidTriggerList;
        List <PTrigger> AlreadyTriggerList = new List <PTrigger>();

        foreach (PPlayer Judger in Sequence)
        {
            AlreadyTriggerList.Clear();
            PLogger.Log("开始启动" + (Judger == null ? "null" : Judger.Name) + "的响应");
            while ((ValidTriggerList = TriggerList.FindAll((PTrigger Trigger) => {
                if (Trigger.Time.Equals(Time) && Trigger.Player == Judger && !AlreadyTriggerList.Contains(Trigger) && (Judger == null || Judger.IsAlive))
                {
                    PLogger.Log("    执行判定:" + Trigger.Name);
                    bool Condition = Trigger.Condition(Game);
                    bool AiCondition = Condition && (Judger == null || Judger.IsUser || Trigger.AICondition(Game));
                    return(AiCondition);
                }
                else
                {
                    return(false);
                }
            })).Count > 0)
            {
                PTrigger ChosenTrigger = null;
                if (Judger == null || Judger.IsAI)
                {
                    ChosenTrigger = PMath.Max(ValidTriggerList, (PTrigger Trigger) => Trigger.AIPriority).Key;
                }
                else
                {
                    if (ValidTriggerList.Count == 1 && ValidTriggerList[0].IsLocked)
                    {
                        ChosenTrigger = ValidTriggerList[0];
                    }
                    else
                    {
                        string[] TriggerNames = ValidTriggerList.ConvertAll((PTrigger Trigger) => Trigger.Name + (Trigger.IsLocked ? "(锁定)" : string.Empty)).ToArray();
                        if (ValidTriggerList.TrueForAll((PTrigger Trigger) => !Trigger.IsLocked))
                        {
                            TriggerNames = TriggerNames.Concat(new string[] { "取消" }).ToArray();
                        }
                        int ChosenResult = PNetworkManager.NetworkServer.ChooseManager.Ask(Judger, "选择以下效果发动", TriggerNames);
                        if (ChosenResult < ValidTriggerList.Count)
                        {
                            ChosenTrigger = ValidTriggerList[ChosenResult];
                        }
                    }
                }
                if (ChosenTrigger != null)
                {
                    Game.Logic.StartSettle(new PSettle("于[" + Time.Name + "]触发[" + ChosenTrigger.Name + "]", (PGame Game) => {
                        ChosenTrigger.Effect(Game);
                    }));
                    if (!ChosenTrigger.CanRepeat)
                    {
                        AlreadyTriggerList.Add(ChosenTrigger);
                    }
                    if (Time.IsPeroidTime() && EndTurnDirectly)
                    {
                        PLogger.Log("阶段立刻结束");
                        return;
                    }
                    if (Time.Equals(PTime.EnterDyingTime))
                    {
                        PDyingTag DyingTag = Game.TagManager.FindPeekTag <PDyingTag>(PDyingTag.TagName);
                        if (DyingTag.Player != null && DyingTag.Player.Money > 0)
                        {
                            PLogger.Log("脱离濒死状态");
                            return;
                        }
                    }
                }
                else
                {
                    break;
                }
            }
        }
        PLogger.Log("时机结束:" + Time.Name);
    }