Beispiel #1
0
        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());
            }
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
 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);
 }
Beispiel #5
0
 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);
 }
Beispiel #6
0
        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);
        }
Beispiel #9
0
 public long Health(bool bonus = true)
 {
     return(stats.MaxHealth() + equipment.Health() + (bonus ? PerkLoad.CheckPerks <long>(this, Perk.Trigger.MaxHealth, 0) : 0));
 }