public void Setup() { battle = new AutoBattle(); p1 = new Player("Test Player", WeaponType.Untyped, new List <string>() { "Default1", "Default2", "Default3", "Default4", "Default5" }); p2 = new Player("Test Player", WeaponType.Untyped, new List <string>() { "Default1", "Default2", "Default3", "Default4", "Default5" }); }
/// <summary> /// Do automatic battle encounter /// </summary> /// <param name="session">Database session. One should be open anyway to get encounter info</param> /// <param name="cmdCtx">Discord command context</param> /// <param name="player">Player doing the encounter</param> /// <returns></returns> public async Task DoBattleEncounter(IAsyncDocumentSession session, CommandContext cmdCtx, Player player) { var templates = (await session.LoadAsync <EncounterTemplate>(Templates)).Values .Where(t => t.LevelRangeMin >= player.Level && player.Level <= t.LevelRangeMin || t.AdjustToPlayerLevel) .ToList(); if (templates.Count == 0) { await cmdCtx.ConfirmMessage("Nothing to see here"); return; } var template = templates.GetRandomEntry(); var enemy = new Enemy(template, player.Level); var encounterEmbed = new DiscordEmbedBuilder() .WithTitle($"Encounter with {enemy.Name}"); var body = new System.Text.StringBuilder(); body.AppendLine($"{cmdCtx.User.Mention} has encountered a lvl{enemy.Level} {enemy.Name} with {enemy.HpCurrent}hp."); var combat = new AutoBattle(player, enemy, cmdCtx); await combat.StartCombatAsync(); var result = await combat.GetCombatResultAsync(); string xpMsg = string.Empty; switch (result.Outcome) { case CombatOutcome.Attacker: { var xpGain = GetActualXpReward(player.Level, enemy.Level); await player.AddXpAsync(xpGain, cmdCtx); xpMsg = $"Gained {xpGain}xp"; break; } case CombatOutcome.Defender: { var xpLost = await player.SetFaintedAsync(); xpMsg = $"Lost {xpLost}xp."; break; } case CombatOutcome.Tie: { var xpGain = GetActualXpReward(player.Level, enemy.Level); await player.AddXpAsync(xpGain, cmdCtx); var xpLost = await player.SetFaintedAsync(); xpMsg = $"Gained {xpGain}xp, but lost {xpLost}xp."; break; } } encounterEmbed.WithFooter(xpMsg); body.AppendLine(); body.AppendLine("*Last lines of Combat Log*"); body.AppendLine("*...*"); foreach (var line in combat.CombatLog.Skip(System.Math.Max(0, combat.CombatLog.Count - 3))) { body.AppendLine(line); } body.AppendLine(); body.AppendLine(result.Message); encounterEmbed.WithDescription(body.ToString()); await player.SetActionAsync(Constants.ACTION_REST, "Recovering from combat", System.TimeSpan.FromMinutes(1)); player.SetIdleAction("Resting"); await cmdCtx.RespondAsync(embed : encounterEmbed.Build()); }