예제 #1
0
        public static void AddStat(string membershipId, string type, float amount, float?cap = null)
        {
            // don't do anything if the achievement is marked as inactive or blank membershipId
            if (!StatsProcedures.StatTypesMap[type].Active || membershipId.IsNullOrEmpty())
            {
                return;
            }

            // don't keep stats for an AI characters
            if (PlayerProcedures.GetPlayerFromMembership(membershipId).BotId == AIStatics.ActivePlayerBotId)
            {
                IAchievementRepository repo = new EFAchievementRepository();
                var x = repo.Achievements.FirstOrDefault(a => a.OwnerMembershipId == membershipId && a.AchievementType == type);

                if (x == null)
                {
                    x = new Achievement
                    {
                        OwnerMembershipId = membershipId,
                        AchievementType   = type,
                        Amount            = cap.HasValue ? Math.Min(amount, cap.Value) : amount,
                        Timestamp         = DateTime.UtcNow,
                    };
                }
                else
                {
                    var newAmount = x.Amount + amount;

                    if (cap.HasValue)
                    {
                        newAmount = Math.Min(newAmount, cap.Value);
                    }

                    if (newAmount != x.Amount)
                    {
                        x.Amount    = newAmount;
                        x.Timestamp = DateTime.UtcNow;
                    }
                }

                repo.SaveAchievement(x);
            }
        }
예제 #2
0
        public virtual ActionResult SetFriendNicknameSend(SetFriendNicknameViewModel input)
        {
            var myMembershipId = User.Identity.GetUserId();

            if (input.Nickname == null)
            {
                input.Nickname = "";
            }
            input.Nickname = input.Nickname.Trim();

            // asset the nickname falls within an appropriate range
            if (input.Nickname.Length == 0)
            {
                input.Nickname = "[UNASSIGNED]";
            }
            else if (input.Nickname.Length > PvPStatics.FriendNicknameMaxLength)
            {
                TempData["Error"] = $"Friend nicknames must be {PvPStatics.FriendNicknameMaxLength} characters or less.";
                return(RedirectToAction(MVC.PvP.MyFriends()));
            }

            var me     = PlayerProcedures.GetPlayerFromMembership(myMembershipId);
            var friend = FriendProcedures.GetFriend(input.FriendshipId);

            if (friend.OwnerMembershipId != me.MembershipId && friend.FriendMembershipId != me.MembershipId)
            {
                TempData["Error"] = "This player is not a friend with you.";
                return(RedirectToAction(MVC.PvP.Play()));
            }

            // set the nickname based on whether the current player is the owner or the friend
            if (friend.OwnerMembershipId == me.MembershipId)
            {
                TempData["Result"] = FriendProcedures.OwnerSetNicknameOfFriend(friend.Id, input.Nickname);
            }
            else if (friend.FriendMembershipId == me.MembershipId)
            {
                TempData["Result"] = FriendProcedures.FriendSetNicknameOfOwner(friend.Id, input.Nickname);
            }

            return(RedirectToAction(MVC.PvP.MyFriends()));
        }
예제 #3
0
        public static IEnumerable <BountyInfo> OutstandingBounties()
        {
            var bountyStaticEffectIds    = MAPPINGS.Select(se => se.EffectSourceId);
            IEffectRepository effectRepo = new EFEffectRepository();
            var effects = effectRepo.Effects.Where(e => bountyStaticEffectIds.Contains(e.EffectSourceId));

            var results = new List <BountyInfo>();

            foreach (var effect in effects)
            {
                var entry = BountyDetails(PlayerProcedures.GetPlayer(effect.OwnerId), effect.EffectSourceId);

                if (entry != null)
                {
                    results.Add(entry);
                }
            }

            return(results);
        }
예제 #4
0
        public static IEnumerable <MindControlViewModel> GetAllMindControlVMsWithPlayer(Player player)
        {
            IMindControlRepository mcRepo = new EFMindControlRepository();
            var mcs = mcRepo.MindControls.Where(m => m.MasterId == player.Id || m.VictimId == player.Id).ToList();

            var output = new List <MindControlViewModel>();

            foreach (var mc in mcs)
            {
                var addme = new MindControlViewModel
                {
                    MindControl      = mc,
                    Victim           = PlayerProcedures.GetPlayerFormViewModel(mc.VictimId),
                    Master           = PlayerProcedures.GetPlayerFormViewModel(mc.MasterId),
                    TypeFriendlyName = GetMCFriendlyName(mc.FormSourceId),
                };
                output.Add(addme);
            }
            return(output);
        }
예제 #5
0
        public virtual ActionResult SubmitCaptcha()
        {
            var myMembershipId = User.Identity.GetUserId();
            var me             = PlayerProcedures.GetPlayerFromMembership(myMembershipId);

            if (FeatureContext.IsEnabled <UseCaptcha>() && DomainRegistry.Repository.FindSingle(new UserCaptchaIsExpired {
                UserId = me.MembershipId
            }))
            {
                var recaptchaHelper = this.GetRecaptchaVerificationHelper();
                if (String.IsNullOrEmpty(recaptchaHelper.Response))
                {
                    TempData["Error"] = "You must correctly answer the captcha in order to do this.";
                    return(RedirectToAction(MVC.PvP.Play()));
                }
                var recaptchaResult = recaptchaHelper.VerifyRecaptchaResponse();
                if (recaptchaResult != RecaptchaVerificationResult.Success)
                {
                    DomainRegistry.Repository.Execute(new UpdateCaptchaEntry
                    {
                        UserId         = me.MembershipId,
                        AddFailAttempt = true,
                        AddPassAttempt = false
                    });

                    TempData["Error"] = "Captcha incorrect.  Please try again.";
                    return(RedirectToAction(MVC.PvP.Play()));
                }
                else if (recaptchaResult == RecaptchaVerificationResult.Success)
                {
                    DomainRegistry.Repository.Execute(new UpdateCaptchaEntry
                    {
                        UserId         = me.MembershipId,
                        AddFailAttempt = false,
                        AddPassAttempt = true
                    });
                }
            }
            TempData["Result"] = "Captcha successfully submitted!  You will not be prompted to do this again for a while.";
            return(RedirectToAction(MVC.PvP.Play()));
        }
예제 #6
0
        public virtual ActionResult MyInventory()
        {
            var myMembershipId = User.Identity.GetUserId();
            var me             = PlayerProcedures.GetPlayerFromMembership(myMembershipId);

            if (me.MembershipId == myMembershipId)
            {
                ViewBag.BelongsToPlayer = "block";
            }
            else
            {
                ViewBag.BelongsToPlayer = "none";
            }


            var output = new InventoryBonusesViewModel
            {
                Items = DomainRegistry.Repository.Find(new GetItemsOwnedByPlayer {
                    OwnerId = me.Id
                }).Where(i => i.EmbeddedOnItem == null),
                Bonuses           = ItemProcedures.GetPlayerBuffs(me),
                Health            = me.Health,
                MaxHealth         = me.MaxHealth,
                Mana              = me.Mana,
                MaxMana           = me.MaxMana,
                CurrentCarryCount = DomainRegistry.Repository.FindSingle(new GetCurrentCarryWeight {
                    PlayerId = me.Id
                }),
                MaxInventorySize = ItemProcedures.GetInventoryMaxSize(me)
            };

            ViewBag.ErrorMessage    = TempData["Error"];
            ViewBag.SubErrorMessage = TempData["SubError"];
            ViewBag.Result          = TempData["Result"];

            ViewBag.ShowDetailLinks   = true;
            ViewBag.ItemsUsedThisTurn = me.ItemsUsedThisTurn;


            return(View(MVC.PvP.Views.Inventory, output));
        }
예제 #7
0
        public virtual ActionResult ReadConversation(int messageId, bool reversed = false)
        {
            var myMembershipId = User.Identity.GetUserId();
            var me             = PlayerProcedures.GetPlayerFromMembership(myMembershipId);

            if (!DomainRegistry.Repository.FindSingle(new PlayerOwnsMessage {
                MessageId = messageId, OwnerId = me.Id
            }))
            {
                TempData["Error"]    = "You can't read this conversation.";
                TempData["SubError"] = "It wasn't sent to you.";
                return(RedirectToAction(MVC.Messages.Index()));
            }

            var message = DomainRegistry.Repository.FindSingle(new GetMessage {
                MessageId = messageId, OwnerId = me.Id
            });

            IEnumerable <MessageDetail> messages;

            try
            {
                messages =
                    DomainRegistry.Repository.Find(new GetMessagesInConversation
                {
                    conversationId = message.ConversationId
                });

                if (reversed)
                {
                    messages = messages.Reverse();
                }

                return(PartialView(MVC.Messages.Views.partial.Conversation, messages));
            }
            catch
            {
                TempData["Error"] = "No conversation found";
                return(RedirectToAction(MVC.Messages.Index()));
            }
        }
예제 #8
0
        public virtual ActionResult AdvanceTurn()
        {
            var myMembershipId = User.Identity.GetUserId();
            var me             = PlayerProcedures.GetPlayerFromMembership(myMembershipId);

            if (me.InDuel <= 0)
            {
                TempData["Error"] = "You are not in a duel.";
                return(RedirectToAction(MVC.PvP.Play()));
            }

            var duel = DuelProcedures.GetDuel(me.InDuel);

            var combatants = DuelProcedures.GetPlayerViewModelsInDuel(duel.Id);

            if (!PvPStatics.ChaosMode)
            {
                foreach (var p in combatants)
                {
                    if (p.Player.TimesAttackingThisUpdate < PvPStatics.MaxAttacksPerUpdate)
                    {
                        TempData["Error"] = "Cannot advance this turn." + p.Player.GetFullName() + " has not used up all of their attacks.";
                        return(RedirectToAction(MVC.PvP.Play()));
                    }
                }
            }

            foreach (var p in combatants)
            {
                PlayerProcedures.SetAttackCount(p.Player.ToDbPlayer(), 0);
                PlayerProcedures.SetCleanseMeditateCount(p.Player.ToDbPlayer(), 0);
                var message = "<b>" + me.GetFullName() + " has advanced the duel turn.  Attacks and cleanse/meditate limits have been reset.  Attacks may resume in 20 seconds.</b>";
                PlayerLogProcedures.AddPlayerLog(p.Player.Id, message, true);
                NoticeService.PushNotice(p.Player.Id, message, NoticeService.PushType__PlayerLog);
            }

            DuelProcedures.SetLastDuelAttackTimestamp(duel.Id);

            TempData["Result"] = "Duel turn advanced.  All combatants have had their attack and cleanse/meditate limits reset.  Attacks may resume in 20 seconds.";
            return(RedirectToAction(MVC.PvP.Play()));
        }
예제 #9
0
        public override Task OnDisconnected()
        {
            var connectionId = Context.ConnectionId;
            var me           = PlayerProcedures.GetPlayerFormViewModel_FromMembership(Context.User.Identity.GetUserId()).Player;
            var room         = _chatPersistenceService.GetRoom(me.MembershipId, connectionId);

            _chatPersistenceService.TrackDisconnect(me.MembershipId, connectionId);

            if (string.IsNullOrWhiteSpace(room) || _chatPersistenceService.GetRoomsPlayerIsIn(me.MembershipId).Contains(room))
            {
                return(base.OnDisconnected());
            }

            /* Disabling this notice until a better fix can be implemented.
             * SendNoticeToRoom(room, me, " has left the room.");
             */

            UpdateUserList(room, false);

            return(base.OnDisconnected());
        }
예제 #10
0
        public virtual ActionResult MarkAsAbusivePreview(int id)
        {
            var me = PlayerProcedures.GetPlayerFromMembership(User.Identity.GetUserId());

            MessageDetail message;

            try
            {
                message = DomainRegistry.Repository.FindSingle(new GetMessage {
                    MessageId = id, OwnerId = me.Id
                });
            }
            catch (DomainException)
            {
                TempData["Error"]    = "You can't read this message.";
                TempData["SubError"] = "It wasn't sent to you.";
                return(RedirectToAction(MVC.Messages.Index()));
            }

            return(View(MVC.Messages.Views.MarkAsAbusivePreview, message));
        }
예제 #11
0
        public virtual ActionResult UnembedRunes()
        {
            var me = PlayerProcedures.GetPlayerFromMembership(User.Identity.GetUserId());

            try
            {
                TempData["Result"] = DomainRegistry.Repository.Execute(new UnembedAllRunes {
                    PlayerId = me.Id
                });
                IPlayerRepository playerRepo = new EFPlayerRepository();
                var newMe = playerRepo.Players.FirstOrDefault(p => p.Id == me.Id);
                newMe.ReadjustMaxes(ItemProcedures.GetPlayerBuffs(newMe));
                playerRepo.SavePlayer(newMe);
            }
            catch (DomainException e)
            {
                TempData["Error"] = e.Message;
            }

            return(RedirectToAction(MVC.Item.MyInventory()));
        }
예제 #12
0
        public static IEnumerable <PlayerAchievementViewModel> GetLeaderPlayersInStat(string type)
        {
            IAchievementRepository repo = new EFAchievementRepository();

            var x      = repo.Achievements.Where(a => a.AchievementType == type).OrderByDescending(s => s.Amount).ThenBy(a => a.Timestamp).Take(10).ToList();
            var output = new List <PlayerAchievementViewModel>();

            foreach (var a in x)
            {
                if (a != null)
                {
                    var addMe = new PlayerAchievementViewModel
                    {
                        Player     = PlayerProcedures.GetPlayerFormViewModel_FromMembership(a.OwnerMembershipId),
                        Achivement = a,
                    };
                    output.Add(addMe);
                }
            }
            return(output);
        }
예제 #13
0
        public void ReadjustMaxes(BuffBox buffs)
        {
            // readjust this health/mana by grabbing base amount plus effects from buffs
            this.MaxHealth = Convert.ToDecimal(PlayerProcedures.GetWillpowerBaseByLevel(this.Level)) * (1.0M + (buffs.HealthBonusPercent() / 100.0M));
            this.MaxMana   = Convert.ToDecimal(PlayerProcedures.GetManaBaseByLevel(this.Level)) * (1.0M + (buffs.ManaBonusPercent() / 100.0M));


            // keep this's health within proper bounds
            if (this.MaxHealth < 1)
            {
                this.MaxHealth = 1;
            }

            if (this.MaxMana < 1)
            {
                this.MaxMana = 1;
            }


            if (this.Health > this.MaxHealth)
            {
                this.Health = this.MaxHealth;
            }
            if (this.Mana > this.MaxMana)
            {
                this.Mana = this.MaxMana;
            }
            if (this.Health < 0)
            {
                this.Health = 0;
            }
            if (this.Mana < 0)
            {
                this.Mana = 0;
            }

            this.ExtraInventory     = buffs.ExtraInventorySpace();
            SneakPercent            = buffs.SneakPercent();
            MoveActionPointDiscount = buffs.MoveActionPointDiscount();
        }
예제 #14
0
        /// <summary>
        /// Determines whether Narcissa is currently chasing someone who is valid to be transformed still
        /// </summary>
        /// <param name="directive">AI Directive containing target Id</param>
        /// <returns>True if target is valid, false if not</returns>
        private static bool HasValidTarget(AIDirective directive)
        {
            if (directive == null || directive.Var1 == 0)
            {
                return(false);
            }

            var target = PlayerProcedures.GetPlayer((int)directive.Var1);

            // TODO:  This can probably be swapped out with Arrhae's "CanBeAttacked" method in the future.  But for now...
            if (target == null ||
                target.Mobility != PvPStatics.MobilityFull ||
                PlayerProcedures.PlayerIsOffline(target) ||
                target.IsInDungeon() ||
                target.InDuel > 0 ||
                target.InQuest > 0)
            {
                return(false);
            }

            return(true);
        }
예제 #15
0
        public virtual async Task <ActionResult> ItemLeaderboard()
        {
            var myMembershipId = User.Identity.GetUserId();

            if (myMembershipId.IsNullOrEmpty())
            {
                ViewBag.MyName = "";
                ViewBag.MyId   = "";
            }
            else
            {
                var me = PlayerProcedures.GetPlayerFromMembership(myMembershipId);
                ViewBag.MyName = me == null ? "" : me.GetFullName();
                ViewBag.MyId   = me.Id;
            }

            var output = await mediator.Send(new ItemLeaderboardRequest { Limit = 100 });

            var castedOutput = output.Select(i => (ItemFormerPlayerDetail)i).Memoize();

            return(View(MVC.Leaderboard.Views.ItemLeaderboard, castedOutput));
        }
예제 #16
0
        public static string DiceGame(Player player)
        {
            var target = 69;

            // /roll 4d20
            var die1  = PlayerProcedures.RollDie(20);
            var die2  = PlayerProcedures.RollDie(20);
            var die3  = PlayerProcedures.RollDie(20);
            var die4  = PlayerProcedures.RollDie(20);
            var total = die1 + die2 + die3 + die4;

            // Arbitrary score calculation, trying to avoid any big advantage for those who roll more often
            int score;

            if (total == target)
            {
                score = total;
            }
            else
            {
                var distance = Math.Abs(total - target);

                if (distance <= 11)
                {
                    score = (11 - distance) * 4;
                }
                else
                {
                    score = (11 - distance) / 10;
                }
            }

            StatsProcedures.AddStat(player.MembershipId, StatsProcedures.Stat__DiceGameScore, score);

            LocationLogProcedures.AddLocationLog(player.dbLocationName, $"{player.GetFullName()} rolls {die1}, {die2}, {die3} and {die4}, giving a total of <b>{total}</b>.");

            return($"You pick up four 20-sided dice and roll {die1}, {die2}, {die3} and {die4}, giving a total of <b>{total}</b>.  Your score is <b>{score}</b>.");
        }
예제 #17
0
        public virtual ActionResult Settings()
        {
            var myMembershipId = User.Identity.GetUserId();
            var me             = PlayerProcedures.GetPlayerFromMembership(myMembershipId);

            var output = new SettingsPageViewModel
            {
                TimeUntilReroll = Math.Round(RerollProcedures.GetTimeUntilReroll(me).TotalMinutes),
                TimeUntilLogout = TurnTimesStatics.GetOfflineAfterXMinutes() - Math.Abs(Math.Floor(me.LastActionTimestamp.Subtract(DateTime.UtcNow).TotalMinutes)),
                Player          = me,
                PlayerItem      = DomainRegistry.Repository.FindSingle(new GetItemByFormerPlayer {
                    PlayerId = me.Id
                }),
                Strikes = DomainRegistry.Repository.Find(new GetUserStrikes {
                    UserId = myMembershipId
                }),
                ChaosChangesEnabled = DomainRegistry.Repository.FindSingle(new IsChaosChangesEnabled {
                    UserId = myMembershipId
                })
            };

            return(View(MVC.Settings.Views.Settings, output));
        }
예제 #18
0
        public virtual ActionResult CovenantWideMessage()
        {
            var me = PlayerProcedures.GetPlayerFromMembership(User.Identity.GetUserId());

            // assert that player is in a covenant
            if (me.Covenant == null || me.Covenant <= 0)
            {
                TempData["Error"] = "You are not in a covenant and cannot send out mass messages to your members.";
                return(RedirectToAction(MVC.Covenant.MyCovenant()));
            }

            // assert that the player is a covenant leader
            var myCov = CovenantProcedures.GetDbCovenant((int)me.Covenant);

            if (myCov.LeaderId != me.Id)
            {
                TempData["Error"]    = "You are not the leader of your covenant.";
                TempData["SubError"] = "Only covenant leaders can send out mass messages.";
                return(RedirectToAction(MVC.Covenant.MyCovenant()));
            }

            return(View(MVC.Messages.Views.CovenantWideMessage));
        }
예제 #19
0
        public virtual ActionResult DuelDetail(int id)
        {
            var myMembershipId = User.Identity.GetUserId();
            var me             = PlayerProcedures.GetPlayerFromMembership(myMembershipId);
            var duel           = DuelProcedures.GetDuel(id);

            if (me.InDuel != duel.Id)
            {
                TempData["Error"] = "You are not in this duel.";
                return(RedirectToAction(MVC.PvP.Play()));
            }

            var output = new DuelPlayersViewModel
            {
                Duel       = duel,
                Combatants = DuelProcedures.GetPlayerViewModelsInDuel(duel.Id)
            };

            ViewBag.CurrentTurn    = PvPWorldStatProcedures.GetWorldTurnNumber();
            ViewBag.TurnsRemaining = PvPStatics.MaximumDuelTurnLength - (ViewBag.CurrentTurn - duel.StartTurn);

            return(View(MVC.Duel.Views.DuelDetail, output));
        }
예제 #20
0
        public virtual ActionResult AuthorArtistBio(string id)
        {
            var myMembershipId     = User.Identity.GetUserId();
            var output             = SettingsProcedures.GetAuthorArtistBio(id);
            var artistIngamePlayer = PlayerProcedures.GetPlayerFromMembership(id);
            var me = PlayerProcedures.GetPlayerFromMembership(myMembershipId);

            ViewBag.IngameCharacter = "This artist does not currently have a character ingame.";

            var friends = FriendProcedures.MemberIsMyFriend(id, myMembershipId);

            ViewBag.IAmFriendsWithArtist = friends;

            if (artistIngamePlayer != null)
            {
                ViewBag.IngameCharacter = "This artist current has a character under the name of " + artistIngamePlayer.GetFullName() + ".";
            }
            // assert visibility setting is okay
            if (output.PlayerNamePrivacyLevel == 1 && !friends)
            {
                TempData["Error"] = "This artist bio is only visible to his or her friends.";
                return(RedirectToAction(MVC.PvP.Play()));
            }

            if (output.PlayerNamePrivacyLevel == 2)
            {
                TempData["Error"] = "This artist's biography is currently entirely disabled.  Check again later.";
                return(RedirectToAction(MVC.PvP.Play()));
            }

            if (output.Text != null)
            {
                output.Text = output.Text.Replace("[br]", "<br>").Replace("[p]", "<p>").Replace("[/p]", "</p>").Replace("[h1]", "<h1>").Replace("[/h1]", "</h1>").Replace("[h2]", "<h2>").Replace("[/h2]", "</h2>").Replace("[h3]", "<h3>").Replace("[/h3]", "</h3>");
            }

            return(View(MVC.Settings.Views.AuthorArtistBio, output));
        }
예제 #21
0
        public virtual ActionResult DeleteMessage(bool deleteAll, int messageId)
        {
            var myMembershipId = User.Identity.GetUserId();
            var me             = PlayerProcedures.GetPlayerFromMembership(myMembershipId);

            if (DomainRegistry.Repository.FindSingle(new IsAccountLockedOut {
                userId = me.MembershipId
            }))
            {
                return(RedirectToAction(MVC.PvP.Play()));
            }

            if (deleteAll)
            {
                DomainRegistry.Repository.Execute(new DeleteAllMessagesOwnedByPlayer()
                {
                    OwnerId = me.Id
                });
                TempData["Result"] = "Your messages have been deleted.";
                return(RedirectToAction(MVC.Messages.Index()));
            }

            try
            {
                DomainRegistry.Repository.Execute(new DeleteMessage {
                    MessageId = messageId, OwnerId = me.Id
                });
            }
            catch (DomainException)
            {
                TempData["Error"]    = "You can't delete this message.";
                TempData["SubError"] = "It wasn't sent to you.";
                return(RedirectToAction(MVC.Messages.Index()));
            }

            return(RedirectToAction(MVC.Messages.Index()));
        }
예제 #22
0
        public virtual ActionResult MoveVictim(int id)
        {
            var myMembershipId = User.Identity.GetUserId();
            var me             = PlayerProcedures.GetPlayerFromMembership(myMembershipId);
            var victim         = PlayerProcedures.GetPlayer(id);

            // run generic MC checks
            var errorsBox = MindControlProcedures.AssertBasicMindControlConditions(me, victim, MindControlStatics.MindControl__MovementFormSourceId);

            if (errorsBox.HasError)
            {
                TempData["Error"]    = errorsBox.Error;
                TempData["SubError"] = errorsBox.SubError;
                return(RedirectToAction(MVC.MindControl.MindControlList()));
            }

            ViewBag.Victim = victim;

            var output = victim.IsInDungeon()
                ? LocationsStatics.LocationList.GetLocation.Where(l => l.dbName != "" && l.Region == "dungeon" && l.dbName != victim.dbLocationName)
                : LocationsStatics.LocationList.GetLocation.Where(l => l.dbName != "" && l.Region != "dungeon" && l.dbName != victim.dbLocationName);

            return(View(MVC.MindControl.Views.MoveVictim, output.OrderBy(l => MindControlProcedures.GetAPCostToMove(victim, l.dbName)).ThenBy(l => l.Name)));
        }
예제 #23
0
        public static string CancelFriendRequest(int id, string membershipId)
        {
            IFriendRepository friendRepo = new EFFriendRepository();
            var friend = friendRepo.Friends.FirstOrDefault(f => f.Id == id);


            // assert exists
            if (friend == null)
            {
                return("Error");
            }

            // assert you've sent this, or else it was sent to you
            else if (friend.OwnerMembershipId == membershipId || friend.FriendMembershipId == membershipId)
            {
                friendRepo.DeleteFriend(friend.Id);

                var me = PlayerProcedures.GetPlayerFromMembership(membershipId);
                var otherMembership = (friend.OwnerMembershipId == membershipId) ? friend.FriendMembershipId : friend.OwnerMembershipId;
                var nonFriend       = PlayerProcedures.GetPlayerFromMembership(otherMembership);
                if (friend.IsAccepted)
                {
                    PlayerLogProcedures.AddPlayerLog(me.Id, $"You are no longer friends with {nonFriend?.GetFullName()}.", false);
                }
                else
                {
                    PlayerLogProcedures.AddPlayerLog(me.Id, $"You have declined {nonFriend?.GetFullName()}'s friend request.", false);
                }

                return("");
            }
            else
            {
                return("");
            }
        }
예제 #24
0
        /// <summary>
        /// Allows a player to claim a new base form if they have earned one.
        /// </summary>
        /// <returns></returns>
        public virtual ActionResult SetBaseForm(int baseId)
        {
            var myMembershipId = User.Identity.GetUserId();
            var me             = PlayerProcedures.GetPlayerFromMembership(myMembershipId);

            if (baseId == me.OriginalFormSourceId)
            {
                TempData["Error"] = "You already have this form selected as your base.";
                return(RedirectToAction(MVC.PvP.Play()));
            }

            // Prevent switching to existing form as a means of quickly escaping a TG orb's effects
            if (baseId == me.FormSourceId && me.Mobility == PvPStatics.MobilityFull)
            {
                TempData["Error"] = "You cannot select your current form as your base form.";
                return(RedirectToAction(MVC.PvP.Play()));
            }

            // Look for a match among custom forms
            IContributorCustomFormRepository repo = new EFContributorCustomFormRepository();
            var match = repo.ContributorCustomForms.Where(c => c.OwnerMembershipId == myMembershipId &&
                                                          c.CustomForm.Id == baseId)
                        .Select(c => c.CustomForm).FirstOrDefault();

            if (match == null)
            {
                // Look for a match among standard starter forms
                var formRepo = new EFDbStaticFormRepository();
                match = formRepo.DbStaticForms.Where(f => f.Id == baseId &&
                                                     (f.FriendlyName == "Regular Guy" || f.FriendlyName == "Regular Girl")).FirstOrDefault();

                if (match == null)
                {
                    TempData["Error"] = "You do not own that custom base form.";
                    return(RedirectToAction(MVC.PvP.Play()));
                }
            }

            var instant = false;

            // When player is already in their base form change them instantly.
            if (me.FormSourceId == me.OriginalFormSourceId)
            {
                PlayerProcedures.SetCustomBase(me, baseId);
                me.OriginalFormSourceId = baseId;
                PlayerProcedures.InstantRestoreToBase(me);
                instant = true;
            }
            else
            {
                PlayerProcedures.SetCustomBase(me, baseId);
            }

            if (me.Mobility == PvPStatics.MobilityFull)
            {
                if (instant)
                {
                    TempData["Result"] = $"You are suddenly overwhelmed as you spontaneously transform into a {match.FriendlyName}!";
                }
                else
                {
                    TempData["Result"] = $"Your inner {match.FriendlyName} is begging to be let out, if only you could return yourself to base form...";
                }
            }
            else
            {
                TempData["Result"] = $"Your dreams of becoming a {match.FriendlyName} could come true, if only you could return to animacy...";
            }

            return(RedirectToAction(MVC.PvP.Play()));
        }
예제 #25
0
        public virtual ActionResult DumpWillpower(string amount)
        {
            var myMembershipId = User.Identity.GetUserId();
            var me             = PlayerProcedures.GetPlayerFromMembership(myMembershipId);

            if (me.Mobility != PvPStatics.MobilityFull)
            {
                TempData["Error"] = "You must be fully animate and in protection mode in order to drop your willpower.";
                return(RedirectToAction(MVC.PvP.Play()));
            }

            // assert player is not a duel
            if (me.InDuel > 0)
            {
                TempData["Error"] = "You must finish your duel before you can drop your willpower.";
                return(RedirectToAction(MVC.PvP.Play()));
            }

            // assert player is not a quest
            if (me.InQuest > 0)
            {
                TempData["Error"] = "You must finish your quest before you can drop your willpower.";
                return(RedirectToAction(MVC.PvP.Play()));
            }

            if (me.GameMode == (int)GameModeStatics.GameModes.PvP)
            {
                TempData["Error"] = "You must be fully animate and in Protection or SuperProtection mode in order to drop your willpower.";
                return(RedirectToAction(MVC.PvP.Play()));
            }

            decimal drop = 0;

            if (amount == "half")
            {
                var halfHealth = me.MaxHealth / 2;
                if (halfHealth < me.Health)
                {
                    drop = me.Health - halfHealth;
                    PlayerProcedures.ChangePlayerActionMana(0, -drop, 0, me.Id, false);
                    TempData["Result"] = "You voluntarily lower your willpower down to half of its maximum, making yourself completely vulnerable to animate transformations.";
                    return(RedirectToAction(MVC.PvP.Play()));
                }
                else
                {
                    TempData["Error"] = "Your willpower is already lower than half of its maximum.";
                    return(RedirectToAction(MVC.PvP.Play()));
                }
            }
            else if (amount == PvPStatics.MobilityFull)
            {
                if (me.Health > 0)
                {
                    // drop = me.MaxHealth - me.Health;
                    PlayerProcedures.ChangePlayerActionMana(0, -me.Health, 0, me.Id, false);
                    TempData["Result"] = "You voluntarily decrease your willpower to nothing, making yourself vulnerable to any type of transformation.";
                    return(RedirectToAction(MVC.PvP.Play()));
                }
            }

            TempData["Error"] = "That is not a valid amount to decrease your willpower to.";
            return(RedirectToAction(MVC.PvP.Play()));
        }
예제 #26
0
 public void Should_retrieve_correct_wp_base_by_level(int level, int expectedWillpower)
 {
     Assert.That(PlayerProcedures.GetWillpowerBaseByLevel(level), Is.EqualTo(expectedWillpower));
 }
예제 #27
0
 public void Should_retrieve_correct_mana_base_by_level(int level, int expectedMana)
 {
     Assert.That(PlayerProcedures.GetManaBaseByLevel(level), Is.EqualTo(expectedMana));
 }
예제 #28
0
 public void Should_retrieve_correct_xp_requirement_for_levelup(int level, int expectedXp)
 {
     Assert.That(PlayerProcedures.GetXPNeededForLevelUp(level), Is.EqualTo(expectedXp));
 }
예제 #29
0
 internal override PlayerFormViewModel FindSingle()
 {
     return(PlayerProcedures.GetPlayerFormViewModel_FromMembership(MembershipId));
 }
예제 #30
0
 internal override void InternalExecute()
 {
     PlayerProcedures.MarkOnlineActivityTimestamp(Player);
 }