예제 #1
0
        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()));
        }
예제 #2
0
        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));
        }
예제 #4
0
        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()));
        }
예제 #5
0
        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()));
        }