예제 #1
0
        public void AssignNewTask(TeamGameState teamGameState, Task oldTask, DateTime recalcTime)
        {
            Check.Require(teamGameState.ActiveTaskState == null, "Невозможно назначить команде новую задачу, т.к. коменде уже назначена задача.");

            // Пытаемся получить следующее задание для команды
            Task newTask = dispatcherFactory.CrearteDispatcher(teamGameState.Game)
                           .GetNextTaskForTeam(taskRepository, teamGameState, oldTask);

            // Если нет нового задания, то команда завершила игру
            if (newTask == null)
            {
                TeamFinishGame(teamGameState, recalcTime);
                return;
            }

            TeamTaskState teamTaskState = new TeamTaskState {
                TaskStartTime  = recalcTime,
                TaskFinishTime = null,
                State          = (int)TeamTaskStateFlag.Execute,
                TeamGameState  = teamGameState,
                Task           = newTask,
                NextTask       = null
            };

            teamGameState.ActiveTaskState = teamTaskState;

            teamTaskStateRepository.SaveOrUpdate(teamTaskState);
            //Сразу же отправляем команде первую подсказку (т.е. текст задания)
            AssignNewTaskTip(teamTaskState, teamTaskState.Task.Tips.First(), recalcTime);
        }
예제 #2
0
        public void ShouldNotAssignFirstTaskTest4()
        {
            var recalcDateTime = new DateTime(2010, 1, 1, 22, 0, 0);

            var team = new Team();
            var tts  = new TeamTaskState {
                Task = task1
            };
            var tgs = new TeamGameState {
                Game = game, Team = team, ActiveTaskState = tts
            };

            tgs.AcceptedTasks.Add(tts);
            team.TeamGameState = tgs;
            game.Teams.Add(team);

            Expect.Call(repository.Get(1))
            .Return(game).Repeat.Any();

            DoNotExpect.Call(() => gameService.AssignNewTask(tgs, null, recalcDateTime));

            mocks.ReplayAll();

            service.RecalcGameState(recalcDateTime);

            mocks.VerifyAll();
        }
예제 #3
0
        public void CanAssignSecondTaskTipTest()
        {
            DateTime recalcTime = DateTime.Now;

            Expect.Call(acceptedTipRepository.SaveOrUpdate(null)).IgnoreArguments();

            mocks.ReplayAll();

            var service = new TaskService(taskRepository, teamTaskStateRepository, acceptedCodeRepository,
                                          acceptedBadCodeRepository, acceptedTipRepository, dispatcherFactory);

            var teamTaskState = new TeamTaskState {
                TeamGameState = new TeamGameState {
                    Game = game, Team = team
                }
            };

            teamTaskState.AcceptedTips.Add(new AcceptedTip {
                Tip = new Tip {
                    Name = "Tip 0", SuspendTime = 0
                }
            });
            var tip = new Tip {
                Name = "Tip 1", SuspendTime = 30
            };

            service.AssignNewTaskTip(teamTaskState, tip, recalcTime);

            mocks.VerifyAll();

            Assert.AreEqual(2, teamTaskState.AcceptedTips.Count());
            Assert.AreEqual(recalcTime, teamTaskState.AcceptedTips[1].AcceptTime);
            Assert.AreEqual(tip, teamTaskState.AcceptedTips[1].Tip);
            Assert.AreEqual(teamTaskState, teamTaskState.AcceptedTips[1].TeamTaskState);
        }
예제 #4
0
        public void ShouldNotAssignDuodleTipTest()
        {
            DateTime recalcTime = DateTime.Now;

            DoNotExpect.Call(acceptedTipRepository.SaveOrUpdate(null));

            mocks.ReplayAll();

            var service = new TaskService(taskRepository, teamTaskStateRepository, acceptedCodeRepository,
                                          acceptedBadCodeRepository, acceptedTipRepository, dispatcherFactory);

            var teamTaskState = new TeamTaskState {
                TeamGameState = new TeamGameState {
                    Game = game, Team = team
                }
            };
            var tip = new Tip {
                Name = "Tip 0", SuspendTime = 0
            };

            teamTaskState.AcceptedTips.Add(new AcceptedTip {
                Tip = tip
            });
            service.AssignNewTaskTip(teamTaskState, tip, recalcTime);

            mocks.VerifyAll();

            Assert.AreEqual(1, teamTaskState.AcceptedTips.Count());
        }
예제 #5
0
        public void CloseTaskForTeam(TeamTaskState teamTaskState, TeamTaskStateFlag flag, DateTime recalcTime)
        {
            teamTaskState.TaskFinishTime = recalcTime;
            teamTaskState.State          = (int)flag;

            teamTaskState.TeamGameState.ActiveTaskState = null;
            teamTaskState.TeamGameState.AcceptedTasks.Add(teamTaskState);
        }
예제 #6
0
        public static Team AssignTask(this Team team, Task task, DateTime taskStartTime)
        {
            var tts = new TeamTaskState
            {
                Task          = task,
                TaskStartTime = taskStartTime,
                TeamGameState = team.TeamGameState
            };

            team.TeamGameState.ActiveTaskState = tts;
            return(team);
        }
예제 #7
0
        public void AssignNewTaskTip(TeamTaskState teamTaskState, Tip tip, DateTime recalcTime)
        {
            AcceptedTip acceptedTip = new AcceptedTip
            {
                AcceptTime    = recalcTime,
                Tip           = tip,
                TeamTaskState = teamTaskState
            };

            //Подсказку дадим только в том случае, если такая еще не выдавалась.
            if (!teamTaskState.AcceptedTips.Any(x => x.Tip == tip))
            {
                teamTaskState.AcceptedTips.Add(acceptedTip);
                acceptedTipRepository.SaveOrUpdate(acceptedTip);
            }
        }
예제 #8
0
        public void CloseTaskForTeamTest()
        {
            var service = new TaskService(taskRepository, teamTaskStateRepository, acceptedCodeRepository,
                                          acceptedBadCodeRepository, acceptedTipRepository, dispatcherFactory);

            DateTime recalcTime    = DateTime.Now;
            var      teamTaskState = new TeamTaskState {
                TeamGameState = new TeamGameState {
                    Game = game, Team = team
                }
            };

            service.CloseTaskForTeam(teamTaskState, TeamTaskStateFlag.Success, recalcTime);

            Assert.AreEqual(recalcTime, teamTaskState.TaskFinishTime);
            Assert.AreEqual((int)TeamTaskStateFlag.Success, teamTaskState.State);
            Assert.IsNull(teamTaskState.TeamGameState.ActiveTaskState);
            Assert.True(teamTaskState.TeamGameState.AcceptedTasks.Contains(teamTaskState));
        }
예제 #9
0
        public DataTable GetGameResults(int gameId)
        {
            DataTable  dt          = new DataTable("GameResults");
            DataColumn rankColumn  = new DataColumn("rank", typeof(int));
            DataColumn teamColumn  = new DataColumn("team", typeof(string));
            DataColumn tasksColumn = new DataColumn("tasks", typeof(int));
            DataColumn bonusColumn = new DataColumn("bonus", typeof(int));
            DataColumn timeColumn  = new DataColumn("time", typeof(TimeSpan));

            dt.Columns.AddRange(new DataColumn[] { rankColumn, teamColumn, tasksColumn, bonusColumn, timeColumn });

            Game game = gameRepository.Get(gameId);

            // Выбираем команды закончившие игру
            foreach (Team team in game.Teams.Where(x => x.TeamGameState != null && x.TeamGameState.GameDoneTime != null))
            {
                // Количество успешно выполненных заданий
                int tasks = team.TeamGameState.AcceptedTasks.Count(t => t.State == (int)TeamTaskStateFlag.Success);

                // Количество бонусов
                int bonus = team.TeamGameState.AcceptedTasks.BonusCodesCount();

                // Время выполнения последнего успешно выполненного задания
                DateTime lastTaskTime = game.GameDate;
                var      taskStates   = team.TeamGameState.AcceptedTasks.Where(x => x.State == (int)TeamTaskStateFlag.Success);
                if (taskStates.Count() > 0)
                {
                    TeamTaskState tts = taskStates.Last();
                    lastTaskTime = (DateTime)tts.TaskFinishTime;
                }

                DataRow row = dt.NewRow();
                row[teamColumn]  = team.Name;
                row[tasksColumn] = tasks;
                row[bonusColumn] = bonus;
                row[timeColumn]  = lastTaskTime - game.GameDate;
                dt.Rows.Add(row);
            }

            return(dt);
        }
예제 #10
0
        /// <summary>
        /// Возвращает варианты выбора подсказок, если это необходимо для задания с выбором подсказки.
        /// </summary>
        public IEnumerable <Tip> GetSuggestTips(TeamTaskState teamTaskState, DateTime recalcTime)
        {
            // Время от начала задания
            double taskTimeSpend = (recalcTime - teamTaskState.TaskStartTime).TotalMinutes;
            // Время получения последней из полученных подсказок
            double lastAcceptTipTime = (teamTaskState.AcceptedTips.Last().AcceptTime - teamTaskState.TaskStartTime).TotalMinutes;
            // Подсказки,
            // которые дожны быть выданы на данный момент,
            var tips = new List <Tip>(teamTaskState.Task.Tips
                                      .Where(tip => tip.SuspendTime > lastAcceptTipTime && tip.SuspendTime <= taskTimeSpend && tip.SuspendTime < teamTaskState.TeamGameState.Game.TimePerTask));

            // Если пришло время предложить команде выбрать подсказку
            if (tips.Count() > 0)
            {
                // Все подсказки, исключая уже выданные
                return(teamTaskState.Task.Tips
                       .Where(tip => tip.SuspendTime > 0)
                       .Except(teamTaskState.AcceptedTips.Tips()));
            }

            return(null);
        }
예제 #11
0
 /// <summary>
 /// "Ускориться".
 /// </summary>
 /// <remarks>
 /// Устанавливает время ускорения в текущее и назначает вторую подсказку.
 /// </remarks>
 /// <param name="teamTaskState">Состояние команды затребовавшая ускорение.</param>
 /// <param name="recalcTime"></param>
 public void AccelerateTask(TeamTaskState teamTaskState, DateTime recalcTime)
 {
     teamTaskState.AccelerationTaskStartTime = recalcTime;
     AssignNewTaskTip(teamTaskState, teamTaskState.Task.Tips.Last(tip => tip.SuspendTime > 0), recalcTime);
 }
예제 #12
0
 /// <summary>
 /// Возвращает варианты выбора подсказок, если это необходимо для задания с выбором подсказки.
 /// </summary>
 public IEnumerable <Tip> GetSuggestTips(TeamTaskState teamTaskState, DateTime recalcTime)
 {
     return(taskService.GetSuggestTips(teamTaskState, recalcTime));
 }
예제 #13
0
 /// <summary>
 /// "Ускориться".
 /// </summary>
 /// <param name="teamTaskState">Состояние команды затребовавшая ускорение.</param>
 /// <param name="dateTimeNow"></param>
 public void AccelerateTask(TeamTaskState teamTaskState, DateTime dateTimeNow)
 {
     taskService.AccelerateTask(teamTaskState, dateTimeNow);
 }
예제 #14
0
 /// <summary>
 /// Отправить команде подсказку.
 /// </summary>
 /// <param name="teamTaskState"></param>
 /// <param name="tip"></param>
 /// <param name="dateTimeNow"></param>
 public void AssignNewTaskTip(TeamTaskState teamTaskState, Tip tip, DateTime dateTimeNow)
 {
     taskService.AssignNewTaskTip(teamTaskState, tip, dateTimeNow);
 }
예제 #15
0
 /// <summary>
 /// Помечает задание как успешно выполненное.
 /// </summary>
 /// <param name="teamTaskState"></param>
 /// <param name="flag"></param>
 /// <param name="recalcTime"></param>
 public void CloseTaskForTeam(TeamTaskState teamTaskState, TeamTaskStateFlag flag, DateTime recalcTime)
 {
     taskService.CloseTaskForTeam(teamTaskState, flag, recalcTime);
 }