public long XpGain(long xpGain) { double multiplier = PerkLoad.CheckPerks(this, Perk.Trigger.GainXP, ReferenceData.xprate); long gain = Convert.ToInt64(xpGain * multiplier); experience += gain; long reqXPToLVL = XpRequired(); while (experience >= reqXPToLVL) { level++; LevelNotifications(); if (Specialization != null) { Specialization.specPoints++; } experience -= reqXPToLVL; if (IsGainSkillPoint()) { skillPoints++; } reqXPToLVL = XpRequired(); } SaveFileMongo(); return(gain); }
public void StartCombat() { List <CharacterMotherClass> playerTeam = new List <CharacterMotherClass>(); if (player.Party == null) { PerkLoad.CheckPerks(player, Items.Perk.Trigger.StartFight, player, mobs); playerTeam.Add(player); } else { foreach (var m in player.Party.members) { Player p = m.id == player.userid ? player : m.LoadPlayer(); PerkLoad.CheckPerks(p, Items.Perk.Trigger.StartFight, p, mobs); playerTeam.Add(p); p.SaveFileMongo(); } foreach (var n in player.Party.NPCMembers) { PerkLoad.CheckPerks(n, Items.Perk.Trigger.StartFight, n, mobs); } playerTeam.AddRange(player.Party.NPCMembers); _ = player.Party.SaveData(); } foreach (var m in mobs) { PerkLoad.CheckPerks(m, Items.Perk.Trigger.StartFight, m, playerTeam.ToArray()); } }
internal void Turn() { foreach (CombatResult cp in playerParty) { if (!cp.character.IsDead()) { cp.ExecuteSendingTurn(GetTargetCR(cp, playerParty, mobParty)); } } foreach (CombatResult cp in mobParty) { if (!cp.character.IsDead()) { cp.ExecuteSendingTurn(GetTargetCR(cp, mobParty, playerParty)); } } foreach (CombatResult cp in playerParty) { PerkLoad.CheckPerks(cp.character, Perk.Trigger.Health, cp.character); } foreach (CombatResult cp in mobParty) { PerkLoad.CheckPerks(cp.character, Perk.Trigger.Health, cp.character); } }
internal int StaminaE(int amount) { if (amount != 0) { amount = PerkLoad.CheckPerks(this, Perk.Trigger.StaminaAmount, amount); PerkLoad.CheckPerks(this, Perk.Trigger.Stamina, this); stamina += ( amount < 0 ? Verify.Min(amount, -stamina) : Verify.Max(amount, Stamina() - stamina)); } return(amount); }
internal long Healing(long heal, bool canOverHeal = false) { if (heal != 0) { if (!canOverHeal) { heal = Verify.Max(heal, Verify.Min(Health() - health, 0)); } heal = PerkLoad.CheckPerks <long>(this, Perk.Trigger.Healing, heal); PerkLoad.CheckPerks(this, Perk.Trigger.Health, this); health += heal; } return(heal); }
private Item CraftItem(Player player, Item crafted) { ConsumeSchematicItems(player, 1); crafted = PerkLoad.CheckPerks(player, Items.Perk.Trigger.Crafting, crafted); if (crafted.isUnique) { crafted.schematic = null; } crafted.CalculateStats(true); player.CollectItem(crafted, 1); return(crafted); }
private async Task <MsgType> HandleAllMobsDead(EmbedBuilder result) { if (endDungeon) { await Database.DeleteRecord <Area>("Dungeons", MainAreaPath.path, "AreaId"); } //Get Loot into Encounter Encounter enc = new Encounter("Loot", partyLeader); (string[] kills, long koinsToGain, long xpToGain) = GetKillRewards(enc); xpToGain = await OtherLoot(enc, xpToGain); var invLoot = enc.loot.inv; string lootDisplay = DistributeCoins(ref koinsToGain); lootDisplay += EventRewards(enc, out (string name, int amount)specialCurrencyReward); await Utils.MapAsync(playerParty, async (cb, i) => { PerkLoad.CheckPerks(cb.character, Perk.Trigger.EndFight, cb.character); bool hasDied = cb.character.IsDead(); if (!hasDied) { cb.character.KCoins += koinsToGain; } if (cb.character is Player player) { lootDisplay += await PlayerOnAllMobsDead(player, specialCurrencyReward, xpToGain, kills, enc); } else if (cb.character is NPC follower) { lootDisplay += $" |-|{(follower.IsPet() ? follower.displayName : follower.name)} +{Utils.Display(follower.XpGain(xpToGain, follower.level))} XP {Environment.NewLine}"; //NPC looting if (follower.IsPet()) { follower.AddItemToInv(Item.RandomItem(follower.level, 1), follower.level); } else if (enc.loot != null && enc.loot.Count > 4) { int randomLoot = Program.rng.Next(enc.loot.Count); int amount = Program.rng.Next(1, enc.loot.GetCount(randomLoot) + 1); follower.AddItemToInv(enc.loot.GetItem(randomLoot), amount, true); enc.loot.Remove(randomLoot, amount); } else { follower.AddItemToInv(Item.RandomItem(follower.level * 5)); } // FollowerCheck(follower, party, allPlayersDead); } }); //Manage Encounters if (party != null) { enc?.Save(); } currentEncounter = null; FinalizeResultEmbed(invLoot, result, lootDisplay); return(MsgType.Loot); }
private async Task <MsgType> HandleAllPlayersDead(EmbedBuilder result) { NPC mob = (NPC)Utils.RandomElement(mobParty).character; string lostInfo = allMobsDead ? "No one is left standing to claim victory." : "You have been defeated." + Environment.NewLine; if (currentArea.IsDungeon) { await Database.DeleteRecord <Area>("Dungeons", MainAreaPath.path, "AreaId"); } MsgType msgType = MsgType.Main; Encounter encounter = await ChallengeEnd(); if (encounter != null) { msgType = encounter.Name switch { Encounter.Names.Loot => MsgType.Loot, _ => msgType, }; } bool deathCost = msgType == MsgType.Main; foreach (var cb in playerParty) { PerkLoad.CheckPerks(cb.character, Perk.Trigger.EndFight, cb.character); if (encounter != null) { if (encounter.koinsToGain > 0) { cb.character.KCoins += encounter.koinsToGain; } if (encounter.xpToGain > 0) { cb.character.XpGain(encounter.xpToGain, 1); } } if (cb.character is Player player) { if (!allMobsDead && deathCost) { lostInfo += DefeatCost(player, mob, 0.5) + Environment.NewLine; } await player.Respawn(false); if (endDungeon) { player.AreaInfo = ParentAreaPath(currentArea, partyLeader.AreaInfo.floor); } player.SaveFileMongo(); } else if (cb.character is NPC n) { FollowerCheck(n, party, allPlayersDead); } } result.AddField("Defeat", lostInfo); if (encounter != null) { string loot = null; if (encounter.loot != null && encounter.loot.Count > 0) { int c = Math.Min(encounter.loot.Count, 10); for (int i = 0; i < c; i++) { loot += $"{i + 1}|" + encounter.loot[i] + Environment.NewLine; } if (c < encounter.loot.Count) { loot += $"And {encounter.loot.Count - c} more..."; } } string extraResult = (encounter.koinsToGain > 0 ? $"+{encounter.koinsToGain} Kuts" + Environment.NewLine : null) + (encounter.xpToGain > 0 ? $"+{encounter.xpToGain} XP" + Environment.NewLine : null) + loot; result.AddField("Rewards", extraResult.Length != 0 ? extraResult : "None"); encounter.koinsToGain = 0; encounter.xpToGain = 0; if (party != null) { partyLeader.NewEncounter(encounter); } } if (!allMobsDead && currentEncounter.Name != Encounter.Names.Bounty && currentArea.type != AreaType.Dungeon && currentArea.type != AreaType.Arena) { PopulationHandler.Add(currentArea, mob); } return(msgType); }
public long Health(bool bonus = true) { return(stats.MaxHealth() + equipment.Health() + (bonus ? PerkLoad.CheckPerks <long>(this, Perk.Trigger.MaxHealth, 0) : 0)); }