private static TeamEvaluation EvaluateTeam(World world, int team) { TeamEvaluation teamEval = new TeamEvaluation(); teamEval.IsWinner = world.Winner() == team; teamEval.Gold = world.Gold[team]; teamEval.NumMinionsKilled = world.MinionsKilled[team]; teamEval.NumDenies = world.Denies[team]; teamEval.HeroDamageOutput = world.HeroDamageOutput[team]; foreach (Unit unit in world.Units) { if (unit.Team == team) { if (unit.UnitType == UnitType.Hero) { ++teamEval.NumHeroes; teamEval.HeroHealth += unit.Health; teamEval.Mana += unit.Mana; double centerX = World.MapWidth / 2; double forwardProportion = 1.0 - (Math.Abs(unit.Pos.X - centerX) / (World.MapWidth / 2)); teamEval.Forward += forwardProportion; teamEval.StunnedTicks += unit.StunDuration; } else if (unit.UnitType == UnitType.Minion) { teamEval.MinionHealth += unit.Health; } else if (unit.UnitType == UnitType.Tower) { teamEval.TowerHealth += unit.Health; } } } teamEval.Score = MinionsKilledFactor * teamEval.NumMinionsKilled + DeniesFactor * teamEval.NumDenies + ForwardFactor * teamEval.Forward + GoldFactor * teamEval.Gold + (teamEval.IsWinner ? WinnerFactor : 0) + HeroDamageOutputFactor * teamEval.HeroDamageOutput + NumHeroesFactor * teamEval.NumHeroes + HeroHealthFactor * teamEval.HeroHealth + HeroManaFactor * teamEval.Mana + StunnedFactor * teamEval.StunnedTicks + MinionHealthFactor * teamEval.MinionHealth + TowerHealthFactor * teamEval.TowerHealth; return(teamEval); }
public ActionResult SubmitTeamEvaluation(int assignmentId) { Assignment assignment = db.Assignments.Find(assignmentId); IAssignmentTeam pAt; if (assignment.PreceedingAssignment.Type == AssignmentTypes.DiscussionAssignment) { pAt = GetDiscussionTeam(assignment.PreceedingAssignment, ActiveCourseUser); } else { pAt = GetAssignmentTeam(assignment.PreceedingAssignment, ActiveCourseUser); } List <TeamEvaluation> existingTeamEvaluations = (from te in db.TeamEvaluations where te.TeamEvaluationAssignmentID == assignmentId && te.EvaluatorID == ActiveCourseUser.ID select te).ToList(); int existingCommentID = (from C in existingTeamEvaluations where C.CommentID != 0 select C.CommentID).FirstOrDefault(); TeamEvaluationComment tec; if (existingCommentID != 0) //Comment already existed. Modify that and use that. { tec = (from tc in db.TeamEvaluationComments where tc.ID == existingCommentID select tc).FirstOrDefault(); tec.Comment = Convert.ToString(Request.Params["inBrowserText"]); db.SaveChanges(); } else //using new comment { tec = new TeamEvaluationComment(); tec.Comment = Convert.ToString(Request.Params["inBrowserText"]); db.TeamEvaluationComments.Add(tec); db.SaveChanges(); } List <int> TeamEvalPoints = new List <int>(); //Creating or editing TeamEvaluations for each team member from the previous assignment assignment team //since the team could be a discussion team, only select team members who are students. foreach (TeamMember tm in pAt.Team.TeamMembers.Where(tm => tm.CourseUser.AbstractRoleID == (int)CourseRole.CourseRoles.Student)) { TeamEvaluation te = (from eval in existingTeamEvaluations where eval.RecipientID == tm.CourseUserID select eval).FirstOrDefault(); string param = "points-" + tm.CourseUserID; int paramPoints = Convert.ToInt32(Request.Params[param]); TeamEvalPoints.Add(paramPoints); if (te == null) //No TE exists, create one { TeamEvaluation newTE = new TeamEvaluation(); newTE.TeamEvaluationAssignmentID = assignmentId; newTE.AssignmentUnderReviewID = (int)assignment.PrecededingAssignmentID; newTE.EvaluatorID = ActiveCourseUser.ID; newTE.RecipientID = tm.CourseUserID; newTE.Points = paramPoints; newTE.CommentID = tec.ID; db.TeamEvaluations.Add(newTE); } else //TE exists, modify it { te.CommentID = tec.ID; te.Points = paramPoints; } } if (assignment.TeamEvaluationSettings.DiscrepancyCheckSize > 0 && (TeamEvalPoints.Max() - TeamEvalPoints.Min()) > assignment.TeamEvaluationSettings.DiscrepancyCheckSize) { (new NotificationController()).SendTeamEvaluationDiscrepancyNotification(pAt.TeamID, assignment); } db.SaveChanges(); return(RedirectToAction("Index")); }
public ActionResult StudentTeamEvaluation(int assignmentId) { Assignment a = db.Assignments.Find(assignmentId); Team previousTeam; if (a.PreceedingAssignment.Type == AssignmentTypes.DiscussionAssignment) { //Note: This could have non-student types on the team, such as moderators or TAs DiscussionTeam dt = GetDiscussionTeam(a.PreceedingAssignment, ActiveCourseUser); previousTeam = new Team(); previousTeam.TeamMembers = dt.Team.TeamMembers.Where(tm => tm.CourseUser.AbstractRoleID == (int)CourseRole.CourseRoles.Student).ToList(); } else { previousTeam = GetAssignmentTeam(a.PreceedingAssignment, ActiveCourseUser).Team; } AssignmentTeam at = GetAssignmentTeam(a, ActiveCourseUser); if (at != null && a.Type == AssignmentTypes.TeamEvaluation) { ViewBag.AssignmentTeam = at; ViewBag.PreviousTeam = previousTeam; List <TeamEvaluation> teamEvals = (from te in db.TeamEvaluations where te.TeamEvaluationAssignmentID == assignmentId && te.EvaluatorID == ActiveCourseUser.ID orderby te.Recipient.UserProfile.LastName select te).ToList(); //MG: evaluator (currentuser) must have completed at as many evaluations as team members from the previous assignment. //Otherwise, use artificial team evals for view if (teamEvals.Count < previousTeam.TeamMembers.Count) //Creating new team eval { List <TeamEvaluation> artificialTeamEvals = new List <TeamEvaluation>(); foreach (TeamMember tm in previousTeam.TeamMembers.OrderBy(tm2 => tm2.CourseUser.UserProfile.LastName)) { TeamEvaluation te = new TeamEvaluation(); te.Points = 0; te.Recipient = tm.CourseUser; artificialTeamEvals.Add(te); } ViewBag.SubmitButtonValue = "Submit"; ViewBag.TeamEvaluations = artificialTeamEvals; ViewBag.InitialPointsPossible = previousTeam.TeamMembers.Count * 100; } else //using existing team evals { ViewBag.InitialPointsPossible = 0; //Must be 0 as we are reloading old TEs, and requirements for submitting initially are that points possible must be 0 ViewBag.Comment = teamEvals.FirstOrDefault().Comment; ViewBag.SubmitButtonValue = "Resubmit"; ViewBag.TeamEvaluations = teamEvals; } return(View("_StudentTeamEvaluationView")); } else { return(View("Index")); } }