internal static async Task ChooseRace(Player player, IMessageChannel channel) { EmbedBuilder race = new EmbedBuilder(); race.WithTitle($"{player.name}'s Race"); race.WithDescription("Select a race using the reactions, each has a unique perk. You may not change this option later."); // race.AddField($"{EUI.GetLetter(7)} | **Human** {Environment.NewLine}", $"Basic Humans{Environment.NewLine}" + $"Perk: {PerkLoad.Load("Human Adaptation").desc}{Environment.NewLine}"); // race.AddField($"{EUI.GetLetter(19)} | **Tsiun** {Environment.NewLine}", $"Black or dark color skinned, thin, pointy ears, large eyes and pupils which fill " + $"the entire eye, prefer darker areas, learn well by observing others{Environment.NewLine}" + $"Perk: {PerkLoad.Load("Tsiun Trickery").desc}{Environment.NewLine}"); // race.AddField($"{EUI.GetLetter(20)} | **Uskavian** {Environment.NewLine}", $"Large creatures, not known as a smart race, not very creative and usually does" + $" what they know works, brown or darker skin color with some patterns sometimes{Environment.NewLine}" + $"Perk: {PerkLoad.Load("Uskavian Learning").desc}{Environment.NewLine}"); // race.AddField($"{EUI.GetLetter(12)} | **Miganan** {Environment.NewLine}", $"Similar to humans but with only pale skin variants, mostly white up to grey-ish" + $" with a touch of slight beige, very strong skin, grows no hair{Environment.NewLine}" + $"Perk: {PerkLoad.Load("Migana Skin").desc}{Environment.NewLine}"); // race.AddField($"{EUI.GetLetter(8)} | **Ireskian** {Environment.NewLine}", $"Usually around a feet or two shorter than humans, like to craft and creating things," + $" artistic folks, longingly keep their young appearance{Environment.NewLine}" + $"Perk: {PerkLoad.Load("Ireskian Talent").desc}{Environment.NewLine}"); await player.NewUI(null, race.Build(), channel, MsgType.ChooseRace); }
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); }
internal EmbedBuilder PerkListEmbed(Player player, out string available) { EmbedBuilder e = new EmbedBuilder(); List <string> perks = GetPerkList(); available = ""; for (int i = 0; i < perks.Count; i++) { string r = null; if (player.HasPerk(perks[i]) > -1) { r = " [Owned]"; } else if (specPoints < 20) { r += $" [Missing {20 - specPoints} Spec Points]"; } else { available += $";{i}"; } e.AddField($"{EUI.GetNum(i)} {perks[i]} {r}", PerkLoad.Load(perks[i]).desc); } e.WithFooter($"{specPoints} Specialization Points"); return(e); }
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()); } }
private int Status(int index, int turn = 1, int intensity = 1) { bool changed = false; if (status[index].rank < turn) { status[index].rank = turn; if (status[index].maxRank < turn) { status[index].maxRank = turn; } changed = true; } if (status[index].tier < intensity) { status[index].tier = intensity; changed = true; } if (changed) { status[index].desc = PerkLoad.Effect(status[index].name, status[index].rank, status[index].tier).desc; return(0); } return(-1); }
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 static async Task AutoCharacter(Player player, IMessageChannel channel, bool ask) { if (ask) { EmbedBuilder em = DUtils.BuildEmbed("Character Creation", $"{EUI.ok} - Randomize {Environment.NewLine} {EUI.next} - Manual (Advanced)" + Environment.NewLine + Environment.NewLine + $"{EUI.info} - More Info", null, default); await player.NewUI(null, em.Build(), channel, MsgType.AutoNewCharacter); } else { int[] rolls = GetRolls(); var s = player.stats; s.endurance = rolls[0]; s.intelligence = rolls[1]; s.strength = rolls[2]; s.charisma = rolls[3]; s.dexterity = rolls[4]; s.perception = rolls[5]; // player.abilities.Add(Ability.Load("Strike")); player.abilities.Add(Ability.Load("Shelter")); // player.race = Utils.RandomElement <ReferenceData.HumanoidRaces>(); switch (player.race) { case ReferenceData.HumanoidRaces.Human: player.perks.Add(PerkLoad.Load("Human Adaptation")); break; case ReferenceData.HumanoidRaces.Tsiun: player.perks.Add(PerkLoad.Load("Tsiun Trickery")); break; case ReferenceData.HumanoidRaces.Uskavian: player.perks.Add(PerkLoad.Load("Uskavian Learning")); break; case ReferenceData.HumanoidRaces.Miganan: player.perks.Add(PerkLoad.Load("Migana Skin")); break; case ReferenceData.HumanoidRaces.Ireskian: player.perks.Add(PerkLoad.Load("Ireskian Talent")); break; } // player.level = 0; player.health = player.Health(); player.stamina = player.Stamina(); player.SaveFileMongo(); await GameCommands.StatsDisplay(player, channel); await channel.SendMessageAsync("Welcome to Neitsillia, Traveler. To guide you, you've been given the \"Tutorial\" Quest line." + Environment.NewLine + "Use the `Quest` command to view your quest list and inspect the quest using the assigned emote. Follow the Tutorial quest to learn to play."); } }
/// <summary> /// /// </summary> /// <param name="name">name of the perk</param> /// <param name="turn">rank that will be given to the perk and will be used /// as a turn counter until the perk is no longer in effect</param> /// <param name="intensity">will be set as the perk's tier, if applicable, /// will increase the effect of the perk</param> /// <returns>-1: no changes, 0: perk was updated, 1: perk was added</returns> internal int Status(string aname, int turn = 1, int intensity = 1) { int index = status.FindIndex(item => item.name == aname); if (index > -1) { return(Status(index, turn, intensity)); } return(Status(PerkLoad.Effect(aname, turn, intensity), true)); }
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); }
void NPCSetUp() { GearNPC(); int p = 0; for (int k = baseLevel; k < level;) { k += p += 5; AddStats(); } //for (int i = 0; i < abilities.Count; i++) // abilities[i] = Ability.Load(abilities[i].name); for (int i = 0; i < perks.Count; i++) { if (perks[i].name == "-Random") { perks[i] = PerkLoad.RandomPerk(perks[i].tier, "Character"); } else { perks[i] = PerkLoad.Load(perks[i].name); } } switch (race) { case "Human": perks.Add(PerkLoad.Load("Human Adaptation")); break; case "Tsiun": perks.Add(PerkLoad.Load("Tsiun Trickery")); break; case "Uskavian": perks.Add(PerkLoad.Load("Uskavian Learning")); break; case "Miganan": perks.Add(PerkLoad.Load("Migana Skin")); break; case "Ireskian": perks.Add(PerkLoad.Load("Ireskian Talent")); break; } health = Health(); stamina = Stamina(); if (level >= 20) { GetCombatRole(); } }
public async Task ChooseRace(SocketReaction reaction, IUserMessage msg) { bool selected = true; switch (reaction.Emote.ToString()) { case "🇭": { player.race = ReferenceData.HumanoidRaces.Human; player.perks.Add(PerkLoad.Load("Human Adaptation")); } break; case "🇹": { player.race = ReferenceData.HumanoidRaces.Tsiun; player.perks.Add(PerkLoad.Load("Tsiun Trickery")); } break; case "🇺": { player.race = ReferenceData.HumanoidRaces.Uskavian; player.perks.Add(PerkLoad.Load("Uskavian Learning")); } break; case "🇲": { player.race = ReferenceData.HumanoidRaces.Miganan; player.perks.Add(PerkLoad.Load("Migana Skin")); } break; case "🇮": { player.race = ReferenceData.HumanoidRaces.Ireskian; player.perks.Add(PerkLoad.Load("Ireskian Talent")); } break; default: selected = false; break; } if (selected) { player.SaveFileMongo(); await TryMSGDel(msg); await CharacterCommands.StarterAbilities(player, reaction.Channel, 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); }
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 void GetCombatRole() { int[] rolls = new int[Enum.GetValues(typeof(CombatRole)).Length]; for (int i = 1; i < rolls.Length; i++) { rolls[i] = Program.rng.Next(1, 101); } //Stat var rolls[1] += stats.GetINT(); rolls[2] += stats.GetSTR(); //Get Highest roll int c = 0; for (int j = 0; j < rolls.Length; j++) { if (rolls[j] > rolls[c]) { c = j; } } //Apply new role role = (CombatRole)c; string[] avPerks = null; switch (role) { case CombatRole.Healer: abilities.Add(Ability.Load("Healing Spore", Math.Min(level, 40))); avPerks = new[] { "Adrenaline", "Energizing Touch", "Adaptation", }; stats.intelligence += 3; break; case CombatRole.Fighter: abilities.Add(Ability.Load("Execute", Math.Min(level / 2, 25))); avPerks = new[] { "Unstoppable Force", "Precision Enhancement", "Fighting Spirit" }; stats.strength += 3; break; } if (avPerks != null) { perks.Add(PerkLoad.Load(Utils.RandomElement(avPerks))); } }
public async Task ApplyPerk(int index, string perkName) { if (await IsGMLevel(4)) { Item item = Context.Player.inventory.GetItem(index - 1); if (item != null && item.CanBeEquip()) { item.perk = PerkLoad.Load(perkName); Context.Player.SaveFileMongo(); await ReplyAsync("Perks replaced"); } else { await ReplyAsync("item is not gear"); } } }
internal string PurchasePerk(Player player, int i) { if (specPoints >= 20) { List <string> list = GetPerkList(); if (player.HasPerk(list[i]) == -1) { PerksObtained.Add(list[i]); player.perks.Add(PerkLoad.Load(list[i])); specPoints -= 20; player.SaveFileMongo(); return(list[i]); } return($"Player already has perk {list[i]}"); } return($"Missing {20-specPoints} spec points"); }
//Evolves public void Evolve(int intensity = 1, bool inventory = true, bool perkGain = true, string skaviCat = null) { for (int i = 0; i < intensity; i++) { AddStats(); } ScaleNPC(intensity / 100.0); if (inventory) { string[] icollection = MobDrops(Program.rng.Next(intensity, 5 + intensity)); if (icollection != null) { foreach (string i in icollection) { if (i != null) { AddItemToInv(SpawnItem(i), 1, false); } } } int dropType = -1; int x = Program.rng.Next(101) - intensity; if (x <= 10) { AddItemToInv(SkaviDrops.FromArea(skaviCat)); } else { if (x <= 30) { dropType = 5; } AddItemToInv(Item.RandomItem(level, dropType), 1); } if (Program.Chance(20)) { AddItemToInv(Item.CreateRepairKit(1), Program.rng.Next(1, 6)); } } if (perkGain && Program.rng.Next(101) <= 15) { perks.Add(PerkLoad.RandomPerk(0, "Character")); } }
public async Task Grant_Perk(IUser user, [Remainder] string name) { if (await IsGMLevel(3)) { string perkName = StringM.UpperAt(name); Player p = Player.Load(user.Id, Player.IgnoreException.All); int i = p.HasPerk(perkName); if (i == -1) { p.perks.Add(PerkLoad.Load(perkName)); p.SaveFileMongo(); await DUtils.DeleteContextMessageAsync(Context); } else { await DUtils.Replydb(Context, $"{p.name} already has the perk {perkName}", lifetime : 0.5); } } }
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); }
internal static async Task FixFile(Player player, ISocketMessageChannel chan) { string message = null; int errorsFixed = 0; //Character Info if (player.userSheet == null) { player.userSheet = new Sheet(); errorsFixed++; } if (player.userSheet.appearance == null) { player.userSheet.appearance = "Unknown"; errorsFixed++; } if (player.userSheet.gender == null) { player.userSheet.gender = "Unknown"; errorsFixed++; } if (player.userSheet.lore == null) { player.userSheet.lore = "Unknown"; errorsFixed++; } if (player.userSheet.personality == null) { player.userSheet.personality = "Unknown"; errorsFixed++; } //End Character //Inventory if (player.inventory == null) { player.inventory = new Neitsillia.Collections.Inventory(); errorsFixed++; } // if (player.schematics == null) { player.schematics = new List <Schematic>(); errorsFixed++; } player.schematics.Sort((x, y) => x.name.CompareTo(y.name)); for (int i = 0; i < player.schematics.Count;) { if (player.schematics[i].path != player.schematics[i].name) { player.schematics[i].path = player.schematics[i].name; errorsFixed++; } if (i > 0 && player.schematics[i].name == player.schematics[i - 1].name) { player.schematics.RemoveAt(i); errorsFixed++; } else { i++; } } // foreach (Perk perk in player.perks) { Perk update = PerkLoad.Load(perk.name); if (perk.desc != update.desc) { errorsFixed++; perk.desc = update.desc; } if (perk.trigger != update.trigger) { errorsFixed++; perk.trigger = update.trigger; } if (perk.end != update.end) { errorsFixed++; perk.end = update.end; } } for (int i = 0; i < Neitsillia.Collections.Equipment.gearCount; i++) { Item gear = player.equipment.GetGear(i); if (gear != null && gear.perk != null) { if (gear.perk.name == "-Random") { gear.LoadPerk(); } Perk update = PerkLoad.Load(gear.perk.name); if (gear.perk.desc != update.desc) { errorsFixed++; gear.perk.desc = update.desc; } if (gear.perk.trigger != update.trigger) { errorsFixed++; gear.perk.trigger = update.trigger; } if (gear.perk.end != update.end) { errorsFixed++; gear.perk.end = update.end; } } } //Abilities foreach (Ability a in player.abilities) { Ability update = Ability.Load(a.name, a.level); if (a.staminaDrain != update.staminaDrain) { a.staminaDrain = update.staminaDrain; errorsFixed++; } if (a.maxLevel != update.maxLevel) { a.maxLevel = update.maxLevel; errorsFixed++; } if (a.tier != update.tier) { a.tier = update.tier; errorsFixed++; } if (a.description != update.description) { a.description = update.description; errorsFixed++; } if (a.evolves != update.evolves || ((a.evolves != null && update.evolves != null) && !a.evolves.SequenceEqual(update.evolves))) { a.evolves = update.evolves; errorsFixed++; } } //Area if (player.AreaInfo == null) { await player.SetArea(Area.LoadFromName("Atsauka")); } errorsFixed++; message += "You were brought back to Atsauka | "; //End Area player.SaveFileMongo(); message = errorsFixed + " Error(s) found and fixed"; if (errorsFixed == 0) { message += " If you are still encountering issues please contact an Administrator or GM"; } await chan.SendMessageAsync($"{player.name}({player.userid}) : {message}"); }
public long Health(bool bonus = true) { return(stats.MaxHealth() + equipment.Health() + (bonus ? PerkLoad.CheckPerks <long>(this, Perk.Trigger.MaxHealth, 0) : 0)); }