public async Task ComandoAtacarAsync(CommandContext ctx, string stringIndexAlvo = "#0") { // Verifica se existe o jogador, var(naoCriouPersonagem, personagemNaoModificar) = await banco.VerificarJogador(ctx); if (naoCriouPersonagem) { return; } if (personagemNaoModificar.IsPortalAberto) { await ctx.RespondAsync($"{ctx.User.Mention}, você não pode usar este comando com o portal aberto!"); return; } if (personagemNaoModificar.Zona.Monstros.Count == 0) { await ctx.RespondAsync($"{ctx.User.Mention}, você não tem vê monstros para atacar!"); return; } // Converte o id informado. if (!stringIndexAlvo.TryParseID(out int indexAlvo)) { await ctx.RespondAsync($"{ctx.User.Mention}, o `#ID` precisa ser numérico!"); return; } // Inicia uma sessão do Mongo para não ter alteração duplicada. using (var session = await banco.StartSessionAsync()) { BancoSession banco = new BancoSession(session); RPJogador jogador = await banco.GetJogadorAsync(ctx); RPPersonagem personagem = jogador.Personagem; // Limita o id. indexAlvo = Math.Clamp(indexAlvo, 0, personagem.Zona.Monstros.Count - 1); StringBuilder resumoBatalha = new StringBuilder(); bool monstroMorreu = false; // Executa os efeitos ativos no personagem. personagem.CalcEfeitos(resumoBatalha); // Executa os ataques do inimigo. personagem.Zona.CalcAtaquesInimigos(personagem, resumoBatalha); // Exibimos a vida/mana do personagem no começo da mensagem. DiscordEmbedBuilder embed = new DiscordEmbedBuilder(); // Verifica se o personagem vai acertar o monstro bool chanceAcertoPersonagem = Calculo.DanoFisicoChanceAcerto(personagem.Precisao.Modificado, personagem.Zona.Monstros[indexAlvo].Evasao); if (chanceAcertoPersonagem) { // Randomizamos um dano médio com base no minimo e max da arma equipada. double danoPersonagem = personagem.DanoFisicoModificado.Sortear; personagem.Zona.Monstros[indexAlvo].Vida -= danoPersonagem; resumoBatalha.AppendLine($"\n{Emoji.Adaga} Você causou {danoPersonagem.Text()} de dano no {personagem.Zona.Monstros[indexAlvo].Nome}!"); // Se o monstro morrer. if (personagem.Zona.Monstros[indexAlvo].Vida <= 0) { DiscordEmoji xp = DiscordEmoji.FromGuildEmote(ctx.Client, 758439721016885308); double expGanha = Calculo.CalcularEfetividadeXP(personagem.Nivel.Atual, personagem.Zona.Monstros[indexAlvo].Nivel) * personagem.Zona.Monstros[indexAlvo].Exp; resumoBatalha.AppendLine($"{Emoji.CrossBone} {personagem.Zona.Monstros[indexAlvo].Nome.Bold()} ️{Emoji.CrossBone}\n" + $"{xp}+{expGanha.Text()}."); monstroMorreu = true; //Evento halloween int evoluiu = personagem.AddExp(expGanha); if (evoluiu != 0) { embed.AddField("Evolução".Titulo(), $"{Emoji.Up} Você evoluiu de nível!"); } // Recarrega os frascos foreach (var item in personagem.Frascos) { item.AddCarga(1); } // Dropa itens personagem.Zona.SortearItem(personagem.Zona.Monstros[indexAlvo], personagem.ChanceDrop); } } else // Caso ele erre o ataque { resumoBatalha.AppendLine($"\n{Emoji.Desapontado} Você errou o ataque!"); } // Informações complementares embed.WithDescription($"**Turno {personagem.Zona.Turno}.**\n" + $"**Inimigo restante {personagem.Zona.Monstros.Count} .**"); embed.WithColor(DiscordColor.Blue); // Se o personagem morrer, reseta ele. bool jogadorMorreu = false; if (personagem.Vida.Atual <= 0) { personagem.Resetar(); resumoBatalha.AppendLine($"{Emoji.CrossBone} Você morreu!!! {Emoji.CrossBone}".Bold()); embed.WithColor(DiscordColor.Red); embed.WithImageUrl("https://cdn.discordapp.com/attachments/758139402219159562/769397084284649472/kisspng-headstone-drawing-royalty-free-clip-art-5afd7eb3d84cb3.625146071526562483886.png"); jogadorMorreu = true; } // Exibe o resumo da batalha.. Regens e ataques. embed.AddField("Resumo da batalha".Titulo(), resumoBatalha.ToString()); embed.WithAuthor($"{ctx.User.Username} - Nível {personagem.Nivel.Atual} - {personagem.Classe} - {personagem.Nome}", iconUrl: ctx.User.AvatarUrl); embed.WithThumbnail("https://cdn.discordapp.com/attachments/758139402219159562/758425473541341214/sword-and-shield-icon-17.png"); if (personagem.Zona.ItensNoChao.Count != 0) { embed.AddField("Itens no chão".Titulo().Bold(), $":mag: {personagem.Zona.ItensNoChao.Count.Bold()} item. "); } // Adiciona nova onda. if (monstroMorreu) { if (personagem.Zona.NovaOnda(personagem.VelocidadeAtaque.Modificado, out int inimigosNovos)) { embed.AddField("Nova onda".Titulo(), $"{Emoji.ExplacamaoDupla} Apareceu {inimigosNovos} monstros!"); } } if (!jogadorMorreu) { var porcentagemVida = personagem.Vida.Atual / personagem.Vida.Maximo; var porcenagemMana = personagem.Mana.Atual / personagem.Mana.Maximo; embed.AddField($"{"Vida atual".Underline()}", $"{ConverterVida(porcentagemVida)} {(porcentagemVida * 100).Text()}%", true); embed.AddField($"{"Mana atual".Underline()}", $"{ConverterMana(porcenagemMana)} {(porcenagemMana * 100).Text()}%", true); } // Salvamos. await banco.EditJogadorAsync(jogador); await session.CommitTransactionAsync(); await ctx.RespondAsync(ctx.User.Mention, embed : embed.Build()); } }