public static string UseFurniture(int furnitureId, Player user) { IFurnitureRepository furnRepo = new EFFurnitureRepository(); var dbFurniture = furnRepo.Furnitures.FirstOrDefault(f => f.Id == furnitureId); dbFurniture.LastUseTimestamp = DateTime.UtcNow; dbFurniture.LastUsersIds = user.Id.ToString(); furnRepo.SaveFurniture(dbFurniture); var furnitureStatic = furnRepo.DbStaticFurniture.FirstOrDefault(f => f.dbType == dbFurniture.dbType); var logMessage = "<b>" + user.GetFullName() + "</b> used <b>" + dbFurniture.HumanName + "</b>."; CovenantProcedures.WriteCovenantLog(logMessage, (int)user.Covenant, false); // furniture gives AP reserve bonus if (furnitureStatic.APReserveRefillAmount > 0) { IPlayerRepository playerRepo = new EFPlayerRepository(); var dbPlayer = playerRepo.Players.FirstOrDefault(p => p.Id == user.Id); dbPlayer.ActionPoints_Refill += furnitureStatic.APReserveRefillAmount; if (dbPlayer.ActionPoints_Refill > TurnTimesStatics.GetActionPointReserveLimit()) { dbPlayer.ActionPoints_Refill = TurnTimesStatics.GetActionPointReserveLimit(); } dbPlayer.LastActionTimestamp = DateTime.UtcNow; playerRepo.SavePlayer(dbPlayer); return("You used " + dbFurniture.HumanName + ", a human voluntarily transformed into furniture and leased by your covenant, and gained " + furnitureStatic.APReserveRefillAmount + " reserve action points."); } // furniture gives effect else if (furnitureStatic.GivesEffectSourceId != null) { EffectProcedures.GivePerkToPlayer(furnitureStatic.GivesEffectSourceId.Value, user); PlayerProcedures.SetTimestampToNow(user); return("You used " + dbFurniture.HumanName + ", a human voluntarily transformed into furniture and leased by your covenant, and gained the " + EffectStatics.GetDbStaticEffect(furnitureStatic.GivesEffectSourceId.Value).FriendlyName + " effect."); } //furniture gives item else if (furnitureStatic.GivesItemSourceId != null) { ItemProcedures.GiveNewItemToPlayer(user, furnitureStatic.GivesItemSourceId.Value); PlayerProcedures.SetTimestampToNow(user); var itemGained = ItemStatics.GetStaticItem(furnitureStatic.GivesItemSourceId.Value); return("You used " + dbFurniture.HumanName + ", a human voluntarily transformed into furniture and leased by your covenant, gaining a " + itemGained.FriendlyName + "."); } return("ERROR"); }
public virtual ActionResult RemoveCurseSend(int curseEffectSourceId, int id) { var myMembershipId = User.Identity.GetUserId(); var me = PlayerProcedures.GetPlayerFromMembership(myMembershipId); // assert player is animate if (me.Mobility != PvPStatics.MobilityFull) { TempData["Error"] = "You must be animate in order to use this."; return(RedirectToAction(MVC.PvP.Play())); } // assert player has not already used an item this turn if (me.ItemsUsedThisTurn >= PvPStatics.MaxItemUsesPerUpdate) { TempData["Error"] = "You've already used an item this turn."; TempData["SubError"] = "You will be able to use another consumable next turn."; return(RedirectToAction(MVC.Item.MyInventory())); } // assert player owns this item var itemToUse = ItemProcedures.GetItemViewModel(id); if (itemToUse == null || itemToUse.dbItem.OwnerId != me.Id) { TempData["Error"] = "You do not own the item needed to do this."; return(RedirectToAction(MVC.PvP.Play())); } // assert that the item can remove curses and is not any old item if (itemToUse.dbItem.ItemSourceId != ItemStatics.CurseLifterItemSourceId && itemToUse.dbItem.ItemSourceId != ItemStatics.ButtPlugItemSourceId) { TempData["Error"] = "This item cannot remove curses."; return(RedirectToAction(MVC.PvP.Play())); } var curseToRemove = EffectStatics.GetDbStaticEffect(curseEffectSourceId); // assert this curse is removable if (!curseToRemove.IsRemovable) { TempData["Error"] = "This curse is too strong to be lifted."; return(RedirectToAction(MVC.PvP.Play())); } // back on your feet curse/buff -- just delete outright if (curseToRemove.Id == PvPStatics.Effect_BackOnYourFeetSourceId) { EffectProcedures.RemovePerkFromPlayer(curseToRemove.Id, me); } // regular curse; set duration to 0 but keep cooldown else { EffectProcedures.SetPerkDurationToZero(curseToRemove.Id, me); } // if the item is a consumable type, delete it. Otherwise reset its cooldown if (itemToUse.Item.ItemType == PvPStatics.ItemType_Consumable) { ItemProcedures.DeleteItem(itemToUse.dbItem.Id); } // else if (itemToUse.Item.ItemType == PvPStatics.ItemType_Consumable_Reuseable) else { ItemProcedures.ResetUseCooldown(itemToUse); } PlayerProcedures.AddItemUses(me.Id, 1); var result = $"You have successfully removed the curse <b>{curseToRemove.FriendlyName}</b> from your body!"; TempData["Result"] = result; var playerMessage = itemToUse.Item.UsageMessage_Player; if (string.IsNullOrEmpty(playerMessage)) { PlayerLogProcedures.AddPlayerLog(me.Id, result, false); } else { PlayerLogProcedures.AddPlayerLog(me.Id, $"{playerMessage}<br />{result}", itemToUse.dbItem.FormerPlayerId != null); } if (itemToUse.dbItem.ItemSourceId == ItemStatics.ButtPlugItemSourceId && itemToUse.dbItem.FormerPlayerId != null) { var itemMessage = itemToUse.Item.UsageMessage_Item; var context = $"Your owner just used you to remove the curse <b>{curseToRemove.FriendlyName}</b>! Doesn't that make you feel all warm and tingly?"; itemMessage = string.IsNullOrEmpty(itemMessage) ? context : $"{itemMessage}<br />{context}"; PlayerLogProcedures.AddPlayerLog((int)itemToUse.dbItem.FormerPlayerId, itemMessage, true); } return(RedirectToAction(MVC.PvP.Play())); }
public static string PlayerEndQuest(Player player, int endType) { var message = ""; IPlayerRepository playerRepo = new EFPlayerRepository(); var dbPlayer = playerRepo.Players.FirstOrDefault(p => p.Id == player.Id); dbPlayer.InQuest = 0; dbPlayer.InQuestState = 0; playerRepo.SavePlayer(dbPlayer); IQuestRepository questRepo = new EFQuestRepository(); var questPlayerStatus = questRepo.QuestPlayerStatuses.FirstOrDefault(q => q.PlayerId == player.Id && q.QuestId == player.InQuest); if (questPlayerStatus == null) { questPlayerStatus = new QuestPlayerStatus { PlayerId = player.Id, QuestId = player.InQuest, }; } questPlayerStatus.LastEndedTurn = PvPWorldStatProcedures.GetWorldTurnNumber(); questPlayerStatus.Outcome = endType; questRepo.SaveQuestPlayerStatus(questPlayerStatus); // assing completion bonuses if (endType == (int)QuestStatics.QuestOutcomes.Completed) { var questState = GetQuestState(player.InQuestState); decimal xpGain = 0; foreach (var q in questState.QuestEnds) { // experience gain if (q.RewardType == (int)QuestStatics.RewardType.Experience) { xpGain += Int32.Parse(q.RewardAmount); } // item gain else if (q.RewardType == (int)QuestStatics.RewardType.Item) { var item = ItemStatics.GetStaticItem(System.Convert.ToInt32(q.RewardAmount)); ItemProcedures.GiveNewItemToPlayer(player, item); message += " <br>You received a <b>" + item.FriendlyName + "</b>."; } // effect gain else if (q.RewardType == (int)QuestStatics.RewardType.Effect) { var effect = EffectStatics.GetDbStaticEffect(System.Convert.ToInt32(q.RewardAmount)); EffectProcedures.GivePerkToPlayer(effect.Id, player.Id); message += "<br>You received the effect <b>" + effect.FriendlyName + "</b>."; } // spell gain else if (q.RewardType == (int)QuestStatics.RewardType.Spell) { var spell = SkillStatics.GetStaticSkill(System.Convert.ToInt32(q.RewardAmount)); SkillProcedures.GiveSkillToPlayer(player.Id, spell.Id); message += "<br>You learned the spell <b>" + spell.FriendlyName + "</b>."; } } if (xpGain > 0) { message += "<br>You earned <b>" + xpGain + "</b> XP."; } PlayerProcedures.GiveXP(player, xpGain); } // delete all of the player's quest variables var vars = QuestProcedures.GetAllQuestPlayerVariablesFromQuest(player.InQuest, player.Id).ToList(); foreach (var v in vars) { questRepo.DeleteQuestPlayerVariable(v.Id); } return(message); }
public static (bool, string) Attack(Player attackingPlayer, Player attackedPlayer, SkillViewModel skillBeingUsed, bool timestamp = true) { var result = ""; var attacker = PlayerProcedures.GetPlayer(attackingPlayer.Id); var victim = PlayerProcedures.GetPlayer(attackedPlayer.Id); if (victim.Mobility != PvPStatics.MobilityFull || attacker.Mobility != PvPStatics.MobilityFull || victim.GameMode == (int)GameModeStatics.GameModes.Invisible || attacker.GameMode == (int)GameModeStatics.GameModes.Invisible) { return(false, ""); } var complete = false; var logs = new LogBox(); // all of our checks seem to be okay. So let's lower the player's mana and action points PlayerProcedures.ChangePlayerActionMana(-PvPStatics.AttackCost, 0, -PvPStatics.AttackManaCost, attacker.Id, timestamp); PlayerProcedures.LogCombatTimestampsAndAddAttackCount(victim, attacker); var attackerFullName = attacker.GetFullName(); var victimFullName = victim.GetFullName(); // if the spell is a curse, give the effect and that's all if (skillBeingUsed.StaticSkill.GivesEffectSourceId != null) { var effectBeingGiven = EffectStatics.GetDbStaticEffect(skillBeingUsed.StaticSkill.GivesEffectSourceId.Value); EffectProcedures.GivePerkToPlayer(skillBeingUsed.StaticSkill.GivesEffectSourceId.Value, victim); if (attacker.Gender == PvPStatics.GenderMale && !effectBeingGiven.AttackerWhenHit_M.IsNullOrEmpty()) { logs.AttackerLog += effectBeingGiven.AttackerWhenHit_M; } else if (attacker.Gender == PvPStatics.GenderFemale && !effectBeingGiven.AttackerWhenHit_F.IsNullOrEmpty()) { logs.AttackerLog += effectBeingGiven.AttackerWhenHit_F; } else { logs.AttackerLog += effectBeingGiven.AttackerWhenHit; } if (!String.IsNullOrEmpty(logs.AttackerLog)) { logs.AttackerLog += "<br><br>"; } logs.LocationLog = "<span class='playerAttackNotification'>" + attackerFullName + " cursed " + victimFullName + " with " + skillBeingUsed.StaticSkill.FriendlyName + ".</span>"; logs.AttackerLog += "You cursed " + victimFullName + " with " + skillBeingUsed.StaticSkill.FriendlyName + "."; logs.AttackerLog += " (+1 XP) "; logs.AttackerLog += PlayerProcedures.GiveXP(attacker, 1); logs.VictimLog = effectBeingGiven.MessageWhenHit; logs.VictimLog += " <span class='playerAttackNotification'>" + attackerFullName + " cursed you with <b>" + skillBeingUsed.StaticSkill.FriendlyName + "</b>.</b></span> "; result = logs.AttackerLog; } // the spell is a regular attack else { logs.LocationLog = "<span class='playerAttackNotification'>" + attackerFullName + " cast " + skillBeingUsed.StaticSkill.FriendlyName + " against " + victimFullName + ".</span>"; logs.AttackerLog = "You cast " + skillBeingUsed.StaticSkill.FriendlyName + " against " + victimFullName + ". "; logs.VictimLog = "<span class='playerAttackNotification'>" + attackerFullName + " cast " + skillBeingUsed.StaticSkill.FriendlyName + " against you.</span> "; var meBuffs = ItemProcedures.GetPlayerBuffs(attacker); var targetedBuffs = ItemProcedures.GetPlayerBuffs(victim); var rand = new Random(Guid.NewGuid().GetHashCode()); var basehitChance = rand.NextDouble() * 100; var meDmgExtra = meBuffs.SpellExtraHealthDamagePercent(); var criticalMissPercentChance = PvPStatics.CriticalMissPercentChance - meBuffs.SpellMisfireChanceReduction(); var criticalPercentChance = meBuffs.ExtraSkillCriticalPercent() + PvPStatics.CriticalHitPercentChance; var evasionPercentChance = targetedBuffs.EvasionPercent() - meBuffs.EvasionNegationPercent(); var evasionUpgrade = false; var failedAttack = false; // clamp modifiedEvasion at 50% max if (evasionPercentChance > 50) { evasionPercentChance = 50; } // critical miss! damage caster instead if (basehitChance < (double)criticalMissPercentChance) { // check if there is a health damage aspect to this spell if (skillBeingUsed.StaticSkill.HealthDamageAmount > 0) { var amountToDamage = skillBeingUsed.StaticSkill.HealthDamageAmount * (1 + meDmgExtra / 100); PlayerProcedures.DamagePlayerHealth(attacker.Id, amountToDamage); logs.AttackerLog += $"Misfire! Your spell accidentally lowered your own willpower by {amountToDamage:N2}. "; logs.VictimLog += $"Misfire! {GetPronoun_HisHer(attacker.Gender)} spell accidentally lowered {GetPronoun_hisher(attacker.Gender)} own willpower by {amountToDamage:N2}."; result += logs.AttackerLog; } failedAttack = true; } // spell is evaded else if (basehitChance < (double)criticalMissPercentChance + (double)evasionPercentChance) { // Check for a crit to upgrade the miss to a hit var criticalHitChance = rand.NextDouble() * 100; if (criticalHitChance < (double)criticalPercentChance) { evasionUpgrade = true; } else { logs.AttackerLog += victimFullName + " managed to leap out of the way of your spell."; logs.VictimLog += "You managed to leap out of the way " + attackerFullName + "'s spell."; result = logs.AttackerLog; failedAttack = true; } } // not a miss, so let's deal some damage, possibly if (!failedAttack) { decimal criticalModifier = 1; if (evasionUpgrade) { logs.AttackerLog += "<b>Piercing hit!</b> "; logs.VictimLog += "<b>Piercing hit!</b> "; } else if (rand.NextDouble() * 100 < (double)criticalPercentChance) { criticalModifier = 2; logs.AttackerLog += "<b>Critical hit!</b> "; logs.VictimLog += "<b>Critical hit!</b> "; } var initialVictimHealth = victim.Health; // check if there is a health damage aspect to this spell if (skillBeingUsed.StaticSkill.HealthDamageAmount > 0) { var targetProt = targetedBuffs.SpellHealthDamageResistance(); // calculator the modifier as extra attack - defense. 15 - 20 = -5 modifier var willpowerDamageModifierFromBonuses = 1 + ((meDmgExtra - targetProt) / 100.0M); // cap the modifier at at 50 % IF the target is a human if (willpowerDamageModifierFromBonuses < .5M) { willpowerDamageModifierFromBonuses = .5M; } // cap the modifier at 200 % IF the target is a human if (willpowerDamageModifierFromBonuses > 2 && victim.BotId == AIStatics.ActivePlayerBotId) { willpowerDamageModifierFromBonuses = 2; } var totalHealthDamage = skillBeingUsed.StaticSkill.HealthDamageAmount * willpowerDamageModifierFromBonuses * criticalModifier; // make sure damage is never in the negatives (which would heal instead) if (totalHealthDamage < 0) { totalHealthDamage = 0; } PlayerProcedures.DamagePlayerHealth(victim.Id, totalHealthDamage); // even though it's been done in the db, change the player health here as well victim.Health -= totalHealthDamage; logs.AttackerLog += $"Your spell lowered {GetPronoun_hisher(victim.Gender)} willpower by {Math.Round(totalHealthDamage, 2)}. "; logs.VictimLog += $"{GetPronoun_HisHer(attacker.Gender)} spell lowered your willpower by {Math.Round(totalHealthDamage, 2)}. "; result += logs.AttackerLog; } // if this skill has any TF power, add energy and check for form change if (skillBeingUsed.StaticSkill.TFPointsAmount > 0) { var TFEnergyDmg = meBuffs.SpellExtraTFEnergyPercent(); var TFEnergyArmor = targetedBuffs.SpellTFEnergyDamageResistance(); // calculator the modifier as extra attack - defense. var tfEnergyDamageModifierFromBonuses = 1 + ((TFEnergyDmg - TFEnergyArmor) / 100.0M); // cap the modifier at at 50 % IF the target is a human if (tfEnergyDamageModifierFromBonuses < .5M) { tfEnergyDamageModifierFromBonuses = .5M; } // cap the modifier at at 200 % IF the target is a human if (tfEnergyDamageModifierFromBonuses > 2 && victim.BotId == AIStatics.ActivePlayerBotId) { tfEnergyDamageModifierFromBonuses = 2; } var totalTFEnergyModifier = criticalModifier * tfEnergyDamageModifierFromBonuses; LogBox tfEnergyResult; (complete, tfEnergyResult) = TFEnergyProcedures.AddTFEnergyToPlayer(victim, attacker, skillBeingUsed, totalTFEnergyModifier, initialVictimHealth); logs.Add(tfEnergyResult); result = logs.AttackerLog; } } } LocationLogProcedures.AddLocationLog(attacker.dbLocationName, logs.LocationLog); PlayerLogProcedures.AddPlayerLog(attacker.Id, logs.AttackerLog, false); PlayerLogProcedures.AddPlayerLog(victim.Id, logs.VictimLog, true); DomainRegistry.AttackNotificationBroker.Notify(victim.Id, logs.VictimLog); // if this is a psycho-on-psycho battle, have a chance for the victim bot to switch targets to the attacker bot if (attacker.BotId == AIStatics.PsychopathBotId && victim.BotId == AIStatics.PsychopathBotId) { var rand = new Random(Guid.NewGuid().GetHashCode()); var botAggroRoll = rand.NextDouble(); if (botAggroRoll < .08) { AIDirectiveProcedures.SetAIDirective_Attack(victim.Id, attacker.Id); } } return(complete, result); }
public static MvcHtmlString GetEffectFriendlyName(int effectSourceId) { return(new MvcHtmlString(EffectStatics.GetDbStaticEffect(effectSourceId).FriendlyName)); }
public static string GivePerkToPlayer(int effectSourceId, Player player, int?Duration = null, int?Cooldown = null) { IEffectRepository effectRepo = new EFEffectRepository(); // see if this player already has this perk. If so, reject it var possibleSamePerk = effectRepo.Effects.FirstOrDefault(e => e.EffectSourceId == effectSourceId && e.OwnerId == player.Id); if (possibleSamePerk != null) { return("You already have this perk. Choose another."); } // grab the static part of this effect var effectPlus = EffectStatics.GetDbStaticEffect(effectSourceId); if (effectPlus.isLevelUpPerk) { // assert that the perk doesn't require a level higher than the player if (effectPlus.AvailableAtLevel > player.Level) { return("You are not at a high enough level to earn this perk."); } // assert that the perk doesn't require a prerequisite that the player does not yet have if (effectPlus.PreRequisiteEffectSourceId != null) { var requiredPrerequisite = effectRepo.Effects.FirstOrDefault(e => e.OwnerId == player.Id && e.EffectSourceId == effectPlus.PreRequisiteEffectSourceId); if (requiredPrerequisite == null) { return("This perk requires the <b>" + EffectStatics.GetDbStaticEffect(effectPlus.PreRequisiteEffectSourceId.Value).FriendlyName + "</b> prerequisite perk which you do not have."); } } } var cmd = new CreateEffect(); cmd.EffectSourceId = EffectStatics.GetDbStaticEffect(effectSourceId).Id; cmd.OwnerId = player.Id; // this effect is a permanent levelup perk if (effectPlus.AvailableAtLevel > 0) { cmd.Duration = 99999; cmd.Cooldown = 99999; cmd.IsPermanent = true; cmd.Level = 1; } // this effect is temporary, grab some of its stats from the effect static if (effectPlus.AvailableAtLevel == 0) { var duration = Duration ?? effectPlus.Duration; var cooldown = Cooldown.HasValue ? Math.Max(duration, Cooldown.Value) : effectPlus.Cooldown; cmd.Duration = duration; cmd.Cooldown = cooldown; cmd.IsPermanent = false; } // okay to proceed--give this player this perk. DomainRegistry.Repository.Execute(cmd); IPlayerRepository playerRepo = new EFPlayerRepository(); var person = playerRepo.Players.FirstOrDefault(p => p.Id == player.Id); var logMessage = $"You have gained the perk {effectPlus.FriendlyName}."; if (cmd.IsPermanent) { // this is a level up perk so just return a simple message PlayerLogProcedures.AddPlayerLog(player.Id, logMessage, false); //remove an unused perk from the player person.UnusedLevelUpPerks--; } else { // this is a temporary perk so return the flavor text if (player.Gender == PvPStatics.GenderMale && !effectPlus.MessageWhenHit_M.IsNullOrEmpty()) { logMessage = effectPlus.MessageWhenHit_M; } else if (player.Gender == PvPStatics.GenderFemale && !effectPlus.MessageWhenHit_F.IsNullOrEmpty()) { logMessage = effectPlus.MessageWhenHit_F; } else { logMessage = effectPlus.MessageWhenHit; } PlayerLogProcedures.AddPlayerLog(player.Id, logMessage, false); } person.ReadjustMaxes(ItemProcedures.GetPlayerBuffs(person)); playerRepo.SavePlayer(person); return(logMessage); }