예제 #1
0
        public void UpdateDayInfo(GameInfo gameInfo)
        {
            // 日の情報を更新
            TodayInfo.Update(gameInfo);

            // 新規会話の処理
            for (int i = talkOffset; i < TodayInfo.TalkList.Count; i++)
            {
                Talk    talk    = TodayInfo.TalkList[i];
                Content content = TodayInfo.TalkList[i].Content;

                // 単文か
                if (content.Operator == Operator.NOP)
                {
                    switch (content.Topic)
                    {
                    case Topic.COMINGOUT:
                        // カミングアウト
                        // 自分に対するCOのみ対象
                        if (talk.Agent == content.Target)
                        {
                            if (content.Role.GetTeam() == Team.VILLAGER)
                            {
                                // 村陣営CO
                                UpdateComingOut(content.Target, content.Role, talk);
                            }
                            else
                            {
                                // 人外CO
                                UpdateMonsterSideComingOut(content.Target, content.Role, talk);
                            }
                        }
                        break;

                    case Topic.DIVINED:
                        // 占い結果

                        // カミングアウトの更新
                        UpdateComingOut(talk.Agent, Role.SEER, talk);

                        // 判定の追加
                        Judge newSeerJudge = new Judge(talk);
                        SeerJudge.Add(newSeerJudge);

                        // 内訳の削除
                        if (IsRemoveVillagerFakeCO)
                        {
                            RemovePatternFromJudge(newSeerJudge);
                        }

                        break;

                    case Topic.IDENTIFIED:
                        // 霊媒結果

                        // カミングアウトの更新
                        UpdateComingOut(talk.Agent, Role.MEDIUM, talk);

                        // 判定の追加
                        Judge newMediumJudge = new Judge(talk);
                        MediumJudge.Add(newMediumJudge);

                        // 内訳の削除
                        if (IsRemoveVillagerFakeCO)
                        {
                            RemovePatternFromJudge(newMediumJudge);
                        }

                        break;

                    case Topic.GUARDED:
                        // 護衛履歴
                        break;

                    default:
                        break;
                    }
                }
            }
            talkOffset = TodayInfo.TalkList.Count;

            // 新規囁きの処理
        }
예제 #2
0
        /// <summary>
        /// 日付変更時(昼の開始時)の処理
        /// </summary>
        private void DayStart(GameInfo gameInfo)
        {
            // 昨日の情報を更新
            YesterdayInfo = TodayInfo;
            if (YesterdayInfo != null && YesterdayInfo.Day != 0 && YesterdayInfo.Day + 1 == gameInfo.Day)
            {
                TodayInfo.UpdateFromTomorrow(gameInfo);
            }

            // 日の情報を作成
            TodayInfo = new DayInfo(gameInfo);
            DayInfo.Add(gameInfo.Day, TodayInfo);

            // 死体で発見されたエージェントが人狼のパターンを削除する
            foreach (Agent agent in gameInfo.LastDeadAgentList)
            {
                ICondition condition = RoleCondition.GetCondition(agent, Role.WEREWOLF);
                AllViewSystemInfo.RemoveMatchPattern(condition);
            }

            //TODO 飽和が早い配役対応 (15人村→4日目から)(5人村→1狼のため必要無し)
            // 人狼生存人数がおかしいパターンを削除する
            int maxWolfNum = (gameInfo.AliveAgentList.Count - 1) / 2;

            maxWolfNum = Math.Min(maxWolfNum, GameSetting.RoleNumMap[Role.WEREWOLF]);
            if (gameInfo.Day > GameSetting.RoleNumMap[Role.WEREWOLF])
            {
                BitMatchNumCondition condition = new BitMatchNumCondition()
                {
                    MinNum = 1, MaxNum = maxWolfNum,
                };
                foreach (Agent agent in gameInfo.AliveAgentList)
                {
                    condition.AddWerewolf(agent);
                }
                AllViewSystemInfo.RemoveNotMatchPattern(condition);
            }

            // 自分の占い判定の追加
            if (gameInfo.DivineResult != null)
            {
                MySeerJudge.Add(gameInfo.DivineResult);
            }

            // 自分の霊媒判定の追加
            if (gameInfo.MediumResult != null)
            {
                MyMediumJudge.Add(gameInfo.MediumResult);
            }

            // 自分の護衛履歴の追加
            if (gameInfo.GuardedAgent != null)
            {
                MyGuardHistory.Add(gameInfo.Day - 1, gameInfo.GuardedAgent);
            }

            // 護衛成功からのパターン削除
            if (gameInfo.GuardedAgent != null && gameInfo.LastDeadAgentList.Count <= 0)
            {
                BitCondition condition = new BitCondition();
                condition.AddWerewolf(gameInfo.GuardedAgent);

                AllViewSystemInfo.RemoveMatchPattern(condition);
            }


            talkOffset = 0;

            // debug

            /*
             * Console.Write(gameInfo.Day + "日目 : ");
             * Console.Write(SelfViewSystemInfo.MonsterSidePattern.Count);
             * Console.Write(" / ");
             * Console.Write(AllViewSystemInfo.MonsterSidePattern.Count);
             * Console.WriteLine("");
             */
        }