private static IEnumerable <InstinctData> StripperActions(IPlayerRepository playerRepo, IEnumerable <InstinctData> mcPlayers, Random rand) { // Strippers - remove random item var mcStrippers = mcPlayers.Where(p => JokeShopProcedures.STRIPPERS.Any(stripperForm => p.FormSourceId == stripperForm)).ToList(); foreach (var stripper in mcStrippers) { var stripperPlayer = playerRepo.Players.FirstOrDefault(p => p.Id == stripper.Id); var stripperItems = ItemProcedures.GetAllPlayerItems(stripperPlayer.Id) .Where(i => i.dbItem.IsEquipped && i.Item.ItemType != PvPStatics.ItemType_Pet && i.Item.ItemType != PvPStatics.ItemType_Consumable && i.Item.ItemType != PvPStatics.ItemType_Consumable_Reuseable).ToList(); if (stripperItems.Any()) { string[] adverbs = { "seductively", "cautiously", "flirtatiously", "cheekily", "obediently", "enthusiastically", "reluctantly", "hesitantly", "energetically", "sheepishly" }; var adverb = adverbs[rand.Next(adverbs.Count())]; var itemToDrop = stripperItems[rand.Next(stripperItems.Count())]; PlayerLogProcedures.AddPlayerLog(stripper.Id, $"You {adverb} remove your <b>{itemToDrop.Item.FriendlyName}</b>!", true); LocationLogProcedures.AddLocationLog(stripper.dbLocationName, $"{stripperPlayer.GetFullName()} {adverb} removes their <b>{itemToDrop.Item.FriendlyName}</b>!"); ItemProcedures.DropItem(itemToDrop.dbItem.Id); } mcPlayers = mcPlayers.Where(p => p.Id != stripper.Id); } return(mcPlayers); }
public static string RareFind(Player player, Random rand = null) { rand = rand ?? new Random(); var roll = rand.Next(3); if (roll < 1) { // Quality consumable int[] itemTypes = { ItemStatics.CurseLifterItemSourceId, ItemStatics.AutoTransmogItemSourceId, ItemStatics.WillpowerBombVolatileItemSourceId, ItemStatics.SelfRestoreItemSourceId, ItemStatics.LullabyWhistleItemSourceId, ItemStatics.SpellbookLargeItemSourceId, ItemStatics.TeleportationScrollItemSourceId }; var itemType = itemTypes[rand.Next(itemTypes.Count())]; return(ItemProcedures.GiveNewItemToPlayer(player, itemType)); } else if (roll < 2) { // Regular item var level = (int)(rand.NextDouble() * rand.NextDouble() * 6 + 1); var itemType = ItemProcedures.GetRandomPlayableItem(); var message = ItemProcedures.GiveNewItemToPlayer(player, itemType, level); // Don't permit player to carry untamed pet (pet items aren't automatically tamed) if (itemType.ItemType == PvPStatics.ItemType_Pet) { var unequippedPet = ItemProcedures.GetAllPlayerItems(player.Id).FirstOrDefault(i => i.Item.ItemType == PvPStatics.ItemType_Pet && !i.dbItem.IsEquipped); if (unequippedPet != null) { ItemProcedures.DropItem(unequippedPet.dbItem.Id); } } return(message); } else { // Rune var levelRoll = rand.Next(10); int level; if (levelRoll < 2) // 20% { level = 3; // Standard } else if (levelRoll < 9) // 70% { level = 5; // Great } else // 10% { level = 7; // Major } var runeId = DomainRegistry.Repository.FindSingle(new GetRandomRuneAtLevel { RuneLevel = level, Random = rand }); DomainRegistry.Repository.Execute(new GiveRune { ItemSourceId = runeId, PlayerId = player.Id }); return("You have found a rune!"); } }
public virtual ActionResult StripVictim(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__StripFormSourceId); if (errorsBox.HasError) { TempData["Error"] = errorsBox.Error; TempData["SubError"] = errorsBox.SubError; return(RedirectToAction(MVC.MindControl.MindControlList())); } var victimItems = ItemProcedures.GetAllPlayerItems(victim.Id).ToList(); if (victimItems.Any()) { double max = victimItems.Count(); var rand = new Random(); var num = rand.NextDouble(); var index = Convert.ToInt32(Math.Floor(num * max)); var itemToDrop = victimItems.ElementAt(index); MindControlProcedures.AddCommandUsedToMindControl(me, victim, MindControlStatics.MindControl__StripFormSourceId); var attackerMessage = ""; if (itemToDrop.Item.ItemType != PvPStatics.ItemType_Pet) { attackerMessage = "You commanded " + victim.GetFullName() + " to drop something. They let go of a " + itemToDrop.Item.FriendlyName + " that they were carrying."; } else { attackerMessage = "You commanded " + victim.GetFullName() + " to drop something. They released their pet " + itemToDrop.Item.FriendlyName + " that they had tamed."; } PlayerLogProcedures.AddPlayerLog(me.Id, attackerMessage, false); TempData["Result"] = attackerMessage; var victimMessage = ""; if (itemToDrop.Item.ItemType != PvPStatics.ItemType_Pet) { victimMessage = me.GetFullName() + " commanded you to to drop something. You had no choice but to go of a " + itemToDrop.Item.FriendlyName + " that you were carrying."; } else { victimMessage = me.GetFullName() + " commanded you to drop something. You had no choice but to release your pet " + itemToDrop.Item.FriendlyName + " that you had tamed."; } PlayerLogProcedures.AddPlayerLog(victim.Id, victimMessage, true); ItemProcedures.DropItem(itemToDrop.dbItem.Id); var locationLogMessage = victim.GetFullName() + " was forced to drop their <b>" + itemToDrop.Item.FriendlyName + "</b> by someone mind controlling them."; LocationLogProcedures.AddLocationLog(victim.dbLocationName, locationLogMessage); StatsProcedures.AddStat(me.MembershipId, StatsProcedures.Stat__MindControlCommandsIssued, 1); } else { TempData["Error"] = "It seems " + victim.GetFullName() + " was not carrying or wearing anything to drop!"; } return(RedirectToAction(MVC.PvP.Play())); }
public static List <Exception> RunPsychopathActions(WorldDetail worldDetail) { var rand = new Random(DateTime.Now.Millisecond); var errors = new List <Exception>(); IPlayerRepository playerRepo = new EFPlayerRepository(); //spawn in more bots if there are less than the default var botCount = playerRepo.Players.Count(b => b.BotId == AIStatics.PsychopathBotId && b.Mobility == PvPStatics.MobilityFull); if (botCount < PvPStatics.PsychopathDefaultAmount) { SpawnAIPsychopaths(PvPStatics.PsychopathDefaultAmount - botCount); } var bots = playerRepo.Players.Where(p => p.BotId == AIStatics.PsychopathBotId && p.Mobility == PvPStatics.MobilityFull).ToList(); foreach (var bot in bots) { try { // if bot is no longer fully animate or is null, skip them if (bot == null || bot.Mobility != PvPStatics.MobilityFull) { continue; } bot.LastActionTimestamp = DateTime.UtcNow; if (!EffectProcedures.PlayerHasActiveEffect(bot.Id, JokeShopProcedures.PSYCHOTIC_EFFECT)) { #region drop excess items var botItems = DomainRegistry.Repository.Find(new GetItemsOwnedByPsychopath { OwnerId = bot.Id }).ToList(); string[] itemTypes = { PvPStatics.ItemType_Hat, PvPStatics.ItemType_Accessory, PvPStatics.ItemType_Pants, PvPStatics.ItemType_Pet, PvPStatics.ItemType_Shirt, PvPStatics.ItemType_Shoes, PvPStatics.ItemType_Underpants, PvPStatics.ItemType_Undershirt }; foreach (var typeToDrop in itemTypes) { if (botItems.Count(i => i.ItemSource.ItemType == typeToDrop) > 1) { var dropList = botItems.Where(i => i.ItemSource.ItemType == typeToDrop).Skip(1); foreach (var i in dropList) { ItemProcedures.DropItem(i.Id); var name = "a"; if (i.FormerPlayer != null) { name = "<b>" + i.FormerPlayer.FullName + "</b> the"; } if (i.ItemSource.ItemType == PvPStatics.ItemType_Pet) { LocationLogProcedures.AddLocationLog(bot.dbLocationName, "<b>" + bot.GetFullName() + "</b> released " + name + " pet <b>" + i.ItemSource.FriendlyName + "</b> here."); } else { LocationLogProcedures.AddLocationLog(bot.dbLocationName, "<b>" + bot.GetFullName() + "</b> dropped " + name + " <b>" + i.ItemSource.FriendlyName + "</b> here."); } } } } #endregion } var botbuffs = ItemProcedures.GetPlayerBuffs(bot); var meditates = 0; // meditate if needed if (bot.Mana < bot.MaxMana * .5M) { var manaroll = (int)Math.Floor(rand.NextDouble() * 4.0D); for (var i = 0; i < manaroll; i++) { DomainRegistry.Repository.Execute(new Meditate { PlayerId = bot.Id, Buffs = botbuffs, NoValidate = true }); meditates++; } } // cleanse if needed, less if psycho has cleansed lately if (bot.Health < bot.MaxHealth * .5M) { var healthroll = (int)Math.Floor(rand.NextDouble() * 4.0D); for (var i = meditates; i < healthroll; i++) { DomainRegistry.Repository.Execute(new Cleanse { PlayerId = bot.Id, Buffs = botbuffs, NoValidate = true }); } } var directive = AIDirectiveProcedures.GetAIDirective(bot.Id); // the bot has an attack target, so go chase it if (directive.State == "attack") { var myTarget = PlayerProcedures.GetPlayer(directive.TargetPlayerId); var(mySkills, weakenSkill, inanimateSkill) = GetPsychopathSkills(bot); // if the target is offline, no longer animate, in the dungeon, or in the same form as the spells' target, go into idle mode if (PlayerProcedures.PlayerIsOffline(myTarget) || myTarget.Mobility != PvPStatics.MobilityFull || mySkills.IsEmpty() || inanimateSkill == null || myTarget.FormSourceId == inanimateSkill.StaticSkill.FormSourceId || myTarget.IsInDungeon() || myTarget.InDuel > 0 || myTarget.InQuest > 0) { AIDirectiveProcedures.SetAIDirective_Idle(bot.Id); } // the target is okay for attacking else { // the bot must move to its target location. if (myTarget.dbLocationName != bot.dbLocationName) { if (botbuffs.MoveActionPointDiscount() > -100 && CanMove(worldDetail, myTarget)) { var maxSpaces = NumPsychopathMoveSpaces(bot); var newplace = MoveTo(bot, myTarget.dbLocationName, maxSpaces); bot.dbLocationName = newplace; } } // if the bot is now in the same place as the target, attack away, so long as the target is online and animate if (bot.dbLocationName == myTarget.dbLocationName && !PlayerProcedures.PlayerIsOffline(myTarget) && myTarget.Mobility == PvPStatics.MobilityFull && CanAttack(worldDetail, bot, myTarget) ) { playerRepo.SavePlayer(bot); var numAttacks = Math.Min(3, (int)(bot.Mana / PvPStatics.AttackManaCost)); var complete = false; for (var attackIndex = 0; attackIndex < numAttacks && !complete; ++attackIndex) { var skill = SelectPsychopathSkill(myTarget, mySkills, weakenSkill, rand); (complete, _) = AttackProcedures.Attack(bot, myTarget, skill); } if (complete) { EquipDefeatedPlayer(bot, myTarget); } } } } // the bot has no target, so wander and try to find new targets and attack them. else { if (botbuffs.MoveActionPointDiscount() > -100) { var newplace = MoveTo(bot, LocationsStatics.GetRandomLocationNotInDungeon(), 5); bot.dbLocationName = newplace; } // attack stage var playersHere = playerRepo.Players.Where (p => p.dbLocationName == bot.dbLocationName && p.Mobility == PvPStatics.MobilityFull && p.Id != bot.Id && p.BotId == AIStatics.PsychopathBotId && p.Level >= bot.Level).ToList(); // filter out offline players and Lindella var onlinePlayersHere = playersHere.Where(p => !PlayerProcedures.PlayerIsOffline(p)).ToList(); if (onlinePlayersHere.Count > 0) { var roll = Math.Floor(rand.NextDouble() * onlinePlayersHere.Count); var victim = onlinePlayersHere.ElementAt((int)roll); AIDirectiveProcedures.SetAIDirective_Attack(bot.Id, victim.Id); playerRepo.SavePlayer(bot); var(mySkills, weakenSkill, inanimateSkill) = GetPsychopathSkills(bot); if (!mySkills.IsEmpty()) { var numAttacks = Math.Min(3, (int)(bot.Mana / PvPStatics.AttackManaCost)); var complete = false; for (var attackIndex = 0; attackIndex < numAttacks && !complete; ++attackIndex) { var skill = SelectPsychopathSkill(victim, mySkills, weakenSkill, rand); (complete, _) = AttackProcedures.Attack(bot, victim, skill); } if (complete) { EquipDefeatedPlayer(bot, victim); } } } } playerRepo.SavePlayer(bot); } catch (Exception e) { errors.Add(e); } } return(errors); }
public static void RunDonnaActions() { IPlayerRepository playerRepo = new EFPlayerRepository(); var worldTurnNumber = PvPWorldStatProcedures.GetWorldTurnNumber() - 1; var donna = playerRepo.Players.FirstOrDefault(p => p.BotId == AIStatics.DonnaBotId); if (donna.Mobility != PvPStatics.MobilityFull) { EndEvent(donna); } else if (donna.Mobility == PvPStatics.MobilityFull) { var donnasBuffs = ItemProcedures.GetPlayerBuffs(donna); // have donna meditate if (donna.Mana < donna.MaxMana) { DomainRegistry.Repository.Execute(new Meditate { PlayerId = donna.Id, Buffs = donnasBuffs, NoValidate = true }); DomainRegistry.Repository.Execute(new Meditate { PlayerId = donna.Id, Buffs = donnasBuffs, NoValidate = true }); } var directive = AIDirectiveProcedures.GetAIDirective(donna.Id); if (directive.State == "attack" || directive.State == "idle") { var target = playerRepo.Players.FirstOrDefault(p => p.Id == directive.TargetPlayerId); // if Donna's target goes offline, is inanimate, or in the dungeon, have her teleport back to the ranch if (target == null || target.Mobility != PvPStatics.MobilityFull || PlayerProcedures.PlayerIsOffline(target) || target.IsInDungeon() || target.InDuel > 0 || target.InQuest > 0) { if (donna.dbLocationName != "ranch_bedroom") { LocationLogProcedures.AddLocationLog(donna.dbLocationName, donna.FirstName + " " + donna.LastName + " vanished from here in a flash of smoke."); donna.dbLocationName = "ranch_bedroom"; LocationLogProcedures.AddLocationLog(donna.dbLocationName, donna.FirstName + " " + donna.LastName + " appeared here in a flash of smoke."); playerRepo.SavePlayer(donna); } AIDirectiveProcedures.SetAIDirective_Idle(donna.Id); } // Donna has a valid target; go chase it down and attack. Donna does not look for new targets. else { var newplace = AIProcedures.MoveTo(donna, target.dbLocationName, 10); donna.dbLocationName = newplace; playerRepo.SavePlayer(donna); if (target.dbLocationName == newplace) { var rand = new Random(); var roll = rand.NextDouble() * 3 + 2; for (var i = 0; i < roll; i++) { AttackProcedures.Attack(donna, target, ChooseSpell(PvPStatics.LastGameTurn)); } AIProcedures.DealBossDamage(donna, target, false, (int)roll); } else { } } } else { } // have Donna equip all the pets she owns IItemRepository itemRepo = new EFItemRepository(); IEnumerable <Item> donnasItems = itemRepo.Items.Where(i => i.OwnerId == donna.Id && !i.IsEquipped && i.Level > 3); var itemsToEquip = new List <Item>(); foreach (var i in donnasItems) { itemsToEquip.Add(i); } foreach (var i in itemsToEquip) { i.IsEquipped = true; i.dbLocationName = donna.dbLocationName; itemRepo.SaveItem(i); } //The list should only look at pets. var donnasPlayerPets = DomainRegistry.Repository.Find(new GetItemsOwnedByPlayer { OwnerId = donna.Id }).Where(i => i.ItemSource.ItemType == PvPStatics.ItemType_Pet).OrderBy(i => i.Level).ToList(); // have Donna release her weakest pet every so often if (worldTurnNumber % 6 == 0 && donnasPlayerPets.Any()) { var weakestItem = donnasPlayerPets.First(); ItemProcedures.DropItem(weakestItem.Id, donna.dbLocationName); LocationLogProcedures.AddLocationLog(donna.dbLocationName, "Donna released one of her weaker pets, " + weakestItem.FormerPlayer.FullName + ", here."); var luckyVictim = PlayerProcedures.GetPlayerWithExactName(weakestItem.FormerPlayer.FullName); PlayerLogProcedures.AddPlayerLog(luckyVictim.Id, "Donna has released you, allowing you to wander about or be tamed by a new owner.", true); } } }