Example #1
0
        //XP
        public override long XpGain(long xpGain, int mod = 1)
        {
            if (mod < 1)
            {
                mod = Verify.Min(level, 1);
            }
            experience += xpGain = NumbersM.CeilParse <long>(Verify.Min((xpGain * ReferenceData.xprate) / mod, 10));
            long reqXPToLVL = Quadratic.XPCalc(level + 1);

            while (experience >= reqXPToLVL)
            {
                _ = Handlers.UniqueChannels.Instance.SendMessage("Population", displayName + " leveled up!");
                level++;
                KCoins          += level * 10;
                stats.maxhealth += 5;
                experience      -= reqXPToLVL;
                reqXPToLVL       = Quadratic.XPCalc(level + 1);
                if (role == CombatRole.None && level >= 20)
                {
                    GetCombatRole();
                }
                if (IsGainSkillPoint())
                {
                    AddStats();
                }
            }
            return(xpGain);
        }
Example #2
0
        internal void ScaleNPC(double mult = 1)
        {
            double buffPercent =
                //level/(double)baseLevel* 2
                Exponential.CreatureScale(baseLevel, level)
                * mult;

            //Stats
            stats.maxhealth = NumbersM.CeilParse <long>(stats.maxhealth * (1 + buffPercent * 5));
            stats.stamina   = NumbersM.CeilParse <int>(stats.stamina * (1 + buffPercent * 2));
            health          = Health();
            stamina         = Stamina();
            for (int i = 0; i < DmgType.Length; i++)
            {
                if (stats.damage[i] > 0)
                {
                    stats.damage[i] = NumbersM.CeilParse <long>(stats.damage[i] * (1 + buffPercent / 3));
                }
                if (stats.resistance[i] > 0)
                {
                    stats.resistance[i] = NumbersM.CeilParse <int>(stats.resistance[i] * (1 + (buffPercent / 5)));
                }
            }

            //Extra Drops
            if (Program.rng.Next(101) <= 1)
            {
                Item tempSchem = SkaviDrops.DropSchematic(race);
                if (tempSchem != null)
                {
                    AddItemToInv(tempSchem);
                }
            }
        }
        internal Item ScaleArmor(Item item, int target)
        {
            double m = ((double)target) / item.tier;
            double n = m - 1;

            #region Excluded stats
            long l = 0;
            foreach (int r in item.damage)
            {
                l += r > 0 ? NumbersM.CeilParse <long>(n * r * damage) : 0;
            }
            l += NumbersM.CeilParse <long>(
                +(item.durability + item.agility
                  + Convert.ToInt64(item.critChance)
                  + Convert.ToInt64(item.critMult)
                  + (item.perk != null ? (item.perk.tier + 1) * perk : 0)
                  ) * n);

            #endregion

            #region Included Stats
            long i =
                (item.healthBuff != 0 ? health : 0)
                + (item.staminaBuff != 0 ? stamina : 0);
            foreach (var d in item.resistance)
            {
                i += d != 0 ? resistance : 0;
            }
            #endregion

            //Update stats
            item.healthBuff = item.healthBuff != 0 ?
                              item.healthBuff = NumbersM.CeilParse <long>(
                (item.healthBuff * m) +
                ((health * (l + 0.00) / i) / health)) : 0;

            item.staminaBuff = item.staminaBuff != 0 ?
                               item.staminaBuff = NumbersM.CeilParse <int>(
                (item.staminaBuff * m) +
                ((stamina * (l + 0.00) / i) / stamina)) : 0;

            for (int k = 0; k < item.resistance.Length; k++)
            {
                if (item.resistance[k] != 0)
                {
                    item.resistance[k] = NumbersM.FloorParse <int>(
                        (item.resistance[k] * m) +
                        ((resistance * (l + 0.00) / i) / resistance));
                }
            }

            return(item);
        }
        void FollowerCheck(NPC n, Party party, bool allPlayersDead)
        {
            int s = n.HealthStatus(out string status);

            /// >= 0 Is alive
            /// -1 is Down, -2 Fainted, -3 Unconscious, -4 Dead, -5 Vaporized
            if (s < -1 || allPlayersDead)
            {
                if (n.IsPet())
                {
                    if (party != null && s <= -4)
                    {
                        party.Remove(party.NPCMembers.FindIndex
                                         (x => x.origin == n.origin), null);
                    }
                    else
                    {
                        n.health  = n.Health();
                        n.stamina = n.Stamina();
                    }
                }
                else
                {
                    if (party != null)
                    {
                        party.NPCMembers.RemoveAt(party.NPCMembers.FindIndex
                                                      (x => x.displayName == n.displayName));
                    }
                    if (s > -4)
                    {
                        n.Respawn();
                    }
                }
            }
            else if (s >= -1)
            {
                long fullHealthCost = Verify.Max(
                    NumbersM.NParse <long>(100 - (((n.health + 0.00) / n.Health()) * 100))
                    , n.KCoins);
                if (fullHealthCost > 0)
                {
                    n.KCoins -= fullHealthCost;
                    n.health += NumbersM.CeilParse <long>(n.Health() * (fullHealthCost / 100.00));
                }
                n.stamina = n.Stamina();
                n.SelfGear();
            }
        }
        internal Item ScaleWeapon(Item item, int target)
        {
            double m = (double)target / item.tier;
            double n = m - 1;
            long   l = 0;

            #region Excluded stats
            foreach (int r in item.resistance)
            {
                l += r != 0 ? NumbersM.CeilParse <int>(n * r * resistance) : 0;
            }

            try
            {
                l += NumbersM.CeilParse <long>(item.healthBuff * health * n)
                     +
                     NumbersM.CeilParse <long>(item.staminaBuff * stamina * n)
                     +
                     NumbersM.CeilParse <long>(
                    (
                        item.durability + item.agility
                        + item.critChance
                        + item.critMult
                        + (item.perk != null ? (item.perk.tier + 1) * perk : 0)
                    ) * n
                    );
            }
            catch (Exception e) { Console.WriteLine("Error in other math"); throw e; }
            #endregion

            long i = 0;
            foreach (var d in item.damage)
            {
                i += d > 0 ? damage : 0;
            }

            for (int k = 0; k < item.damage.Length; k++)
            {
                if (item.damage[k] > 0)
                {
                    item.damage[k] = NumbersM.CeilParse <long>(
                        (item.damage[k] * m) +
                        ((damage * l / i) / damage));
                }
            }

            return(item);
        }
Example #6
0
 public object[] TakeOnMe(CombatResult owner, CombatResult enemy)
 {
     if (enemy.abilityUsed.type == Ability.AType.Elemental ||
         enemy.abilityUsed.type == Ability.AType.Enchantment ||
         enemy.abilityUsed.type == Ability.AType.Martial)
     {
         if (!enemy.SentHit && RNG(101) <= 15)
         {
             enemy.sentHit = true;
         }
         if (enemy.SentHit && RNG(101) <= 10)
         {
             long healed = owner.character.Healing(NumbersM.CeilParse <long>(owner.character.Health() * 0.10), true);
             owner.perkProcs.Add($"{owner.Name} proc'ed {name}'s healing [+{healed} health]");
         }
     }
     return(new object[] { owner, enemy });
 }
Example #7
0
        internal bool ConsumeHealing()
        {
            int index = inventory.FindIndex(Item.IType.Healing);

            if (index > -1)
            {
                Item meds      = inventory.GetItem(index);
                long missingHP = Health() - health;
                int  m         = NumbersM.CeilParse <int>(missingHP / (meds.healthBuff + 0f));
                int  amount    = Verify.Max(m, inventory.GetCount(index));

                Healing(meds.healthBuff * amount);
                StaminaE(meds.staminaBuff * amount);
                inventory.Remove(index, amount);
                return(true);
            }
            return(false);
        }
Example #8
0
        internal static async Task ViewSchems(Player player, ISocketMessageChannel chan, int displayPage = 1)
        {
            int count = player.schematics.Count;

            if (count == 0)
            {
                throw NeitsilliaError.ReplyError("No known schematics.");
            }

            const int itemPerPage = 15;
            int       pages       = NumbersM.CeilParse <int>(count / (double)itemPerPage);

            displayPage = Verify.MinMax(displayPage, pages, 1);

            int    start = (displayPage - 1) * itemPerPage;
            string desc  = string.Join(Environment.NewLine, player.schematics.GetRange(
                                           start, start + itemPerPage > count ? count - start : itemPerPage));

            EmbedBuilder schems = DUtils.BuildEmbed($"{player.name}'s Schematics", desc, $"Page {displayPage}/{pages}", player.userSettings.Color);

            await player.NewUI(await chan.SendMessageAsync(embed: schems.Build()), MsgType.Schems, displayPage.ToString());
        }
Example #9
0
        EmbedBuilder DailyReward(Player player)
        {
            int    coinsgain = ReferenceData.dailyCoinsRates + (player.level * 3);
            string itemsLoot = null;
            string temp      = null;
            //
            StackedItems dailyHealthItem = GetDailyScale(player.level);

            if (!player.CollectItem(dailyHealthItem))
            {
                long kgain = dailyHealthItem.item.baseValue * dailyHealthItem.count;
                player.KCoins += (kgain);
                temp          += "+ " + (kgain) + " Kutsyei coins";
            }
            else
            {
                temp = dailyHealthItem.ToString();
            }
            itemsLoot += temp + Environment.NewLine;
            //
            StackedItems dailyressource = new StackedItems(Item.RandomItem(player.level,
                                                                           Program.rng.Next(3)), 1);

            if (dailyressource.item.tier < player.level * 1.5)
            {
                dailyressource.count = Verify.MinMax(NumbersM.CeilParse <int>((player.level / 5.00) - dailyressource.item.tier), 10, 1);
            }
            if (!player.CollectItem(dailyressource))
            {
                player.KCoins += dailyressource.item.baseValue * dailyressource.count;
                temp           = "+ " + (dailyressource.item.baseValue * dailyressource.count) + "Kutsyei coins";
            }
            else
            {
                temp = dailyressource.ToString();
            }
            itemsLoot += temp + Environment.NewLine;
            //
            itemsLoot += GetDailyGear(player, player.level * 5) + Environment.NewLine;

            if (player.level < 9)
            {
                itemsLoot += GetDailyGear(player, 10, (int)Item.IType.Weapon) + Environment.NewLine;
            }

            EmbedBuilder loot = new EmbedBuilder();

            //
            if (Program.dblAPI.connected && false)
            {
                loot.WithFooter("Vote on DiscordBot List to receive and open Crates for more rewards. " +
                                Program.dblAPI.WebsiteUrl);
            }

            player.KCoins += coinsgain;
            //

            loot.WithTitle("Daily Rations");
            player.UserEmbedColor(loot);
            loot.AddField("Kutsyei Coins", $"+{coinsgain}~~K~~");
            if (itemsLoot == null)
            {
                itemsLoot = "None";
            }
            loot.AddField("Items", itemsLoot);
            //
            player.userTimers.dailyLoot = DateTime.UtcNow.AddDays(1);
            player.SaveFileMongo();
            //
            return(loot);
        }