public virtual ActionResult AbandonConfirm() { var myMembershipId = User.Identity.GetUserId(); var me = PlayerProcedures.GetPlayerFromMembership(myMembershipId); // assert that this player is in a quest if (me.InQuest <= 0) { TempData["Error"] = "You are not in a quest."; return(RedirectToAction(MVC.PvP.Play())); } // assert player is not currently in a quest with an end state var state = QuestProcedures.GetQuestState(me.InQuestState); if (state.QuestEnds != null && state.QuestEnds.Any()) { TempData["Error"] = "It is too late to abandon this quest."; TempData["SubError"] = "You must accept the consequences of your actions, be they for good or ill!"; return(RedirectToAction(MVC.Quest.Questing())); } QuestProcedures.PlayerEndQuest(me, (int)QuestStatics.QuestOutcomes.Failed); TempData["Result"] = "You abandoned your quest."; return(RedirectToAction(MVC.PvP.Play())); }
public virtual ActionResult Quest() { IQuestRepository repo = new EFQuestRepository(); var myMembershipId = User.Identity.GetUserId(); var me = PlayerProcedures.GetPlayerFromMembership(myMembershipId); var unopenedMessageCount = DomainRegistry.Repository.FindSingle(new GetUnreadMessageCountByPlayer { OwnerId = me.Id }); var openedUnreadMessageCount = DomainRegistry.Repository.FindSingle(new GetReadAndMarkedAsUnreadMessageCountByPlayer { OwnerId = me.Id }); var output = new QuestPlayPageViewModel(); output.Player = PlayerProcedures.GetPlayerFormViewModel(me.Id); output.QuestStart = QuestProcedures.GetQuest(me.InQuest); output.QuestState = QuestProcedures.GetQuestState(me.InQuestState); output.QuestConnections = QuestProcedures.GetChildQuestConnections(me.InQuestState); output.BuffBox = ItemProcedures.GetPlayerBuffs(me); output.QuestPlayerVariables = QuestProcedures.GetAllQuestPlayerVariablesFromQuest(output.QuestStart.Id, me.Id); output.HasNewMessages = unopenedMessageCount != 0; output.UnreadMessageCount = unopenedMessageCount + openedUnreadMessageCount; ViewBag.ErrorMessage = TempData["Error"]; ViewBag.SubErrorMessage = TempData["SubError"]; ViewBag.Result = TempData["Result"]; output.SetConnectionText((string)TempData["ConnectionText"]); return(PartialView(MVC.Quest.Views.Quest, output)); }
public virtual ActionResult QuestConnection(int Id, int QuestId, int FromQuestId, int ToQuestId) { IQuestRepository repo = new EFQuestRepository(); var questConnection = repo.QuestConnections.FirstOrDefault(q => q.Id == Id); if (questConnection == null) { questConnection = new QuestConnection { QuestId = QuestId, QuestConnectionRequirements = new List <QuestConnectionRequirement>(), QuestStateFromId = FromQuestId, QuestStateToId = ToQuestId, QuestStateFailToId = 0, }; } var output = new QuestConnectionFormViewModel { QuestConnection = questConnection, }; if (FromQuestId > 0) { output.FromQuestState = QuestProcedures.GetQuestState(FromQuestId); } if (ToQuestId > 0) { output.ToQuestState = QuestProcedures.GetQuestState(ToQuestId); } if (questConnection.QuestStateFailToId > 0) { output.FailToQuestState = QuestProcedures.GetQuestState(questConnection.QuestStateFailToId); } return(PartialView(MVC.QuestWriter.Views.QuestConnection, output)); }
public virtual ActionResult EndQuest(bool restore) { var myMembershipId = User.Identity.GetUserId(); var me = PlayerProcedures.GetPlayerFromMembership(myMembershipId); // assert that this player is in a quest if (me.InQuest <= 0) { TempData["Error"] = "You are not in a quest."; return(RedirectToAction(MVC.PvP.Play())); } var quest = QuestProcedures.GetQuest(me.InQuest); var state = QuestProcedures.GetQuestState(me.InQuestState); // assert that there is an end state to this quest state if (!state.QuestEnds.Any()) { TempData["Error"] = "You are not yet at the end of your quest!"; TempData["SubError"] = "If it is impossible for you to continue with this quest, you may abandon it."; return(RedirectToAction(MVC.Quest.Quest())); } var endType = state.QuestEnds.First().EndType; // if the player is not animate, either restore them or create a new item for them to exist as if (me.Mobility != PvPStatics.MobilityFull) { if (restore && me.Mobility != PvPStatics.MobilityFull) { PlayerProcedures.InstantRestoreToBase(me); } else if (!restore) { var newform = FormStatics.GetForm(me.FormSourceId); ItemProcedures.PlayerBecomesItem(me, newform, null); } } // fail! if (endType == (int)QuestStatics.QuestOutcomes.Failed) { QuestProcedures.PlayerEndQuest(me, (int)QuestStatics.QuestOutcomes.Failed); QuestProcedures.ClearQuestPlayerVariables(me.Id, me.InQuest); StatsProcedures.AddStat(me.MembershipId, StatsProcedures.Stat__QuestsFailed, 1); TempData["Result"] = "You unfortunately failed the quest <b>" + quest.Name + "</b>. Better luck next time! If there is one..."; return(RedirectToAction(MVC.PvP.Play())); } // pass! var victoryMessage = QuestProcedures.PlayerEndQuest(me, (int)QuestStatics.QuestOutcomes.Completed); QuestProcedures.ClearQuestPlayerVariables(me.Id, me.InQuest); StatsProcedures.AddStat(me.MembershipId, StatsProcedures.Stat__QuestsPassed, 1); TempData["Result"] = "Congratulations, you completed the quest <b>" + quest.Name + "</b>!" + victoryMessage; return(RedirectToAction(MVC.PvP.Play())); }
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())); }