public virtual ActionResult Choice(int Id) { IQuestRepository repo = new EFQuestRepository(); var myMembershipId = User.Identity.GetUserId(); var me = PlayerProcedures.GetPlayerFromMembership(myMembershipId); // assert player is animate if (me.Mobility != PvPStatics.MobilityFull) { TempData["Error"] = "You are not animate."; return(RedirectToAction(MVC.Quest.Quest())); } // assert player has enough AP if (me.ActionPoints < QuestStatics.ActionAPCost) { TempData["Error"] = "You don't have enough action points for this."; TempData["SubError"] = "Wait a while; you will get more action points soon."; return(RedirectToAction(MVC.Quest.Quest())); } var currentState = QuestProcedures.GetQuestState(me.InQuestState); var desiredConnection = QuestProcedures.GetQuestConnection(Id); var nextState = QuestProcedures.GetQuestState(desiredConnection.QuestStateToId); // assert desired state is in same quest if (nextState.QuestId != me.InQuest || desiredConnection.QuestId != me.InQuest) { TempData["Error"] = "Unavailable"; return(RedirectToAction(MVC.Quest.Quest())); } // assert a connection does exist between current state and chosen one if (desiredConnection.QuestStateFromId != me.InQuestState) { TempData["Error"] = "Unavailable"; return(RedirectToAction(MVC.Quest.Quest())); } var output = new QuestPlayPageViewModel(); output.Player = PlayerProcedures.GetPlayerFormViewModel(me.Id); output.QuestStart = QuestProcedures.GetQuest(me.InQuest); output.QuestPlayerVariables = QuestProcedures.GetAllQuestPlayerVariablesFromQuest(output.QuestStart.Id, me.Id); var buffs = ItemProcedures.GetPlayerBuffs(me); // assert player has the right requirements for this if (!QuestProcedures.QuestConnectionIsAvailable(desiredConnection, me, buffs, output.QuestPlayerVariables)) { TempData["Error"] = "You're not able to do that."; return(RedirectToAction(MVC.Quest.Quest())); } // make rolls for pass / fail if (desiredConnection.RequiresRolls()) { var passes = QuestProcedures.RollForQuestConnection(desiredConnection, me, buffs, output.QuestPlayerVariables); // player fails; reroute to the failure quest state if (!passes) { nextState = QuestProcedures.GetQuestState(desiredConnection.QuestStateFailToId); TempData["RollResult"] = "fail"; } else { TempData["RollResult"] = "pass"; } } else { TempData["RollResult"] = "none"; } QuestProcedures.PlayerSetQuestState(me, nextState); QuestProcedures.ProcessQuestStatePreactions(me, nextState); var keepPlayerOnline = me.LastActionTimestamp > DateTime.UtcNow.AddMinutes(-TurnTimesStatics.GetOfflineAfterXMinutes()); PlayerProcedures.ChangePlayerActionMana(-1, 0, 0, me.Id, keepPlayerOnline); TempData["ConnectionText"] = desiredConnection.Text; return(RedirectToAction(MVC.Quest.Quest())); }