/// <summary> /// Create GameData of next day. /// </summary> /// <returns></returns> public GameData NextDay() { GameData gameData = new GameData(gameSetting); gameData.Day = this.Day + 1; gameData.agentStatusMap = new Dictionary<Agent, Status>(agentStatusMap); if (Executed != null) { gameData.agentStatusMap[Executed] = Status.DEAD; } if (Attacked != null) { gameData.agentStatusMap[Attacked] = Status.DEAD; } gameData.agentRoleMap = new Dictionary<Agent, Role>((Dictionary<Agent, Role>)agentRoleMap); gameData.DayBefore = this; return gameData; }
public void Night() { foreach (Agent agent in gameData.AgentList) { gameServer.DayFinish(agent); } //Vote List <Vote> voteList = gameData.VoteList; Agent executed = GetVotedAgent(voteList); if (executed != null) { if (gameData.GetStatus(executed) == Status.ALIVE && gameData.Day != 0) { gameData.Executed = executed; if (GameLogger != null) { GameLogger.Log(string.Format("{0},execute,{1},{2}", gameData.Day, executed.AgentIdx, gameData.GetRole(executed))); } } //Attack if (!(AliveWolfList.Count == 1 && gameData.GetRole(gameData.Executed) == Role.WEREWOLF) && gameData.Day != 0) { List <Vote> attackCandidateList = gameData.AttackVoteList; attackCandidateList.RemoveAll(v => v.Agent == executed); Agent attacked = GetAttackVotedAgent(attackCandidateList); if (attacked == executed) { attacked = null; } bool isGuarded = false; if (gameData.Guard != null) { if (gameData.Guard.Target.Equals(attacked) && attacked != null) { if (gameData.Executed == null || !gameData.Executed.Equals(gameData.Guard.Agent)) { isGuarded = true; } } } if (!isGuarded && attacked != null) { gameData.Attacked = attacked; if (GameLogger != null) { GameLogger.Log(string.Format("{0},attack,{1},true", gameData.Day, attacked.AgentIdx)); } } else if (attacked != null) { if (GameLogger != null) { GameLogger.Log(string.Format("{0},attack,{1},false", gameData.Day, attacked.AgentIdx)); } } else { if (GameLogger != null) { GameLogger.Log(string.Format("{0},attack,-1,false", gameData.Day)); } } } } gameData = gameData.NextDay(); gameDataMap[gameData.Day] = gameData; gameServer.SetGameData(gameData); }
/// <summary> /// Initialize Game /// </summary> public void Init() { gameDataMap = new Dictionary <int, GameData>(); gameData = new GameData(gameSetting); agentNameMap = new Dictionary <Agent, string>(); gameServer.SetGameData(gameData); List <Agent> agentList = gameServer.ConnectedAgentList; if (agentList.Count != gameSetting.PlayerNum) { throw new IllegalPlayerNumException("Player num is " + gameSetting.PlayerNum + " but connected agent is " + agentList.Count); } agentList = agentList.Shuffle().ToList(); Dictionary <Role, List <Agent> > requestRoleMap = new Dictionary <Role, List <Agent> >(); foreach (Role role in Enum.GetValues(typeof(Role))) { requestRoleMap[role] = new List <Agent>(); } List <Agent> noRequestAgentList = new List <Agent>(); foreach (Agent agent in agentList) { Role?requestedRole = gameServer.RequestRequestRole(agent); if (requestedRole != null) { if (requestRoleMap[(Role)requestedRole].Count < gameSetting.RoleNumMap[(Role)requestedRole]) { requestRoleMap[(Role)requestedRole].Add(agent); } else { noRequestAgentList.Add(agent); } } else { noRequestAgentList.Add(agent); //Console.WriteLine(agent + " request no role"); } } foreach (Role role in Enum.GetValues(typeof(Role))) { List <Agent> requestedAgentList = requestRoleMap[role]; for (int i = 0; i < gameSetting.RoleNumMap[role]; i++) { if (requestedAgentList.Count == 0) { gameData.AddAgent(noRequestAgentList[0], Status.ALIVE, role); noRequestAgentList.RemoveAt(0); } else { gameData.AddAgent(requestedAgentList[0], Status.ALIVE, role); requestedAgentList.RemoveAt(0); } } } gameDataMap[gameData.Day] = gameData; gameServer.SetGameData(gameData); gameServer.SetGameSetting(gameSetting); foreach (Agent agent in agentList) { gameServer.Init(agent); agentNameMap[agent] = gameServer.RequestName(agent); } }
private void Log() { if (!IsShowConsoleLog) { return; } GameData yesterday = gameData.DayBefore; Console.WriteLine("============================================="); if (yesterday != null) { Console.WriteLine("Day {0:00}", yesterday.Day); Console.WriteLine("========talk========"); foreach (Talk talk in yesterday.TalkList) { Console.WriteLine(talk); } Console.WriteLine("========Whisper========"); foreach (Talk whisper in yesterday.WhisperList) { Console.WriteLine(whisper); } Console.WriteLine("========Actions========"); foreach (Vote vote in yesterday.VoteList) { Console.WriteLine("Vote:{0}->{1}", vote.Agent, vote.Target); } // Console.WriteLine("Attack Vote Result"); foreach (Vote vote in yesterday.AttackVoteList) { Console.WriteLine("AttackVote:{0}->{1}", vote.Agent, vote.Target); } Judge divine = yesterday.Divine; Console.WriteLine("{0} executed", yesterday.Executed); if (divine != null) { Console.WriteLine("{0} divine {1}. Result is {2}", divine.Agent, divine.Target, divine.Result); } Guard guard = yesterday.Guard; if (guard != null) { Console.WriteLine("{0} guarded", guard); } Agent attacked = yesterday.Attacked; if (attacked != null) { Console.WriteLine("{0} attacked", attacked); } } Console.WriteLine("======"); List <Agent> agentList = gameData.AgentList; agentList.Sort(); foreach (Agent agent in agentList) { Console.Write("{0}\t{1}\t{2}\t{3}", agent, agentNameMap[agent], gameData.GetStatus(agent), gameData.GetRole(agent)); if (yesterday != null) { if (yesterday.Executed == agent) { Console.Write("\texecuted"); } if (yesterday.Attacked == agent) { Console.Write("\tattacked"); } Judge divine = yesterday.Divine; if (divine != null && divine.Target == agent) { Console.Write("\tdivined"); } Guard guard = yesterday.Guard; if (guard != null && guard.Target == agent) { Console.Write("\tguarded"); } } Console.WriteLine(); } Console.WriteLine("Human:{0}\nWerewolf:{1}\n", AliveHumanList.Count, AliveWolfList.Count); Console.WriteLine("============================================="); }