Esempio n. 1
0
        public async Task ComandoStatusAsync(CommandContext ctx)
        {
            var jog = await banco.GetJogadorAsync(ctx);

            var per   = jog.Personagem;
            var embed = jog.CriarEmbed();

            embed.WithThumbnail(ctx.User.AvatarUrl);

            if (per.TryGetEquipamento(EquipamentoType.PrimeiraMao, out var item))
            {
                var maoPrimaria = item as WafclastItemArma;
                var str         = new StringBuilder();

                str.AppendLine($"Dano: {maoPrimaria.DanoMax}");
                str.AppendLine($"Precisão: {maoPrimaria.Precisao}");
                str.AppendLine($"Velocidade: {maoPrimaria.AtaqueVelocidadeMax}");
                embed.AddField("Mão Primária", str.ToString(), true);
            }

            if (per.TryGetEquipamento(EquipamentoType.SegundaMao, out item))
            {
                if (item is WafclastItemArma)
                {
                    var maoSec = item as WafclastItemArma;
                    var str    = new StringBuilder();

                    str.AppendLine($"Dano: {maoSec.DanoMax}");
                    str.AppendLine($"Precisão: {maoSec.Precisao}");
                    str.AppendLine($"Velocidade: {maoSec.AtaqueVelocidadeMax}");
                    embed.AddField("Mão Sec.", str.ToString(), true);
                }
            }

            var perVida = per.GetHabilidade(ProficienciaType.Constituicao) as WafclastProficienciaConstituicao;

            embed.AddField($"{Emoji.GerarVidaEmoji((double)perVida.Vida / perVida.CalcularVida())} {"Vida".Titulo()}", $"{ perVida.Vida}/{ perVida.CalcularVida()}");

            embed.AddField($"_Porta-Níqueis_", $"{Emoji.Coins} {per.PortaNiqueis}");

            await ctx.RespondAsync(embed : embed.Build());
        }
Esempio n. 2
0
        public async Task ComandoExplorarAsync(CommandContext ctx, string stringTicks = "4")
        {
            /*
             * Monstro e Jogador batalham entre sí por x(ticks) tempo.
             * Caso o monstro já tenha morrido, faz aparecer outro.
             * Caso o jogador morra, ele perde todos os itens da mochila e equipados, voltando assim para a região 0.
             * Caso o monstro morra, ele continua no chão para ser usado no comando saquear.
             */

            // Trava o jogador de inicializar outro comando.
            using (await banco.LockAsync(ctx.User.Id))
            {
                if (!int.TryParse(stringTicks, out int ticks))
                {
                    await ctx.RespondAsync($"{ctx.User.Mention}, ticks informado é inválido.");

                    return;
                }
                // Limitamos para não ultrapassar o limite de caracteres do Discord.
                ticks = Math.Clamp(ticks, 2, 20);

                var jogador = await banco.GetJogadorAsync(ctx);

                var per = jogador.Personagem;

                // Sempre precisa ter inimigos para batalhar.
                if (per.InimigoMonstro == null || per.InimigoMonstro.Vida <= 0)
                {
                    var reg = await jogador.GetRegiaoAsync();

                    per.InimigoMonstro = rdg.Sortear(reg.Monstros);
                }

                var batalha = new StringBuilder();
                DiscordEmbedBuilder embed = new DiscordEmbedBuilder().Inicializar(ctx.User);
                embed.WithDescription($"Ataque durou {Emoji.Relogio} **{(ticks * 0.6):N0}s**");

                // Ataques
                var habAtaque          = per.GetHabilidade(ProficienciaType.Ataque) as WafclastProficienciaAtaque;
                var habForca           = per.GetHabilidade(ProficienciaType.Forca) as WafclastProficienciaForca;
                WafclastItemArma arma1 = null;
                WafclastItemArma arma2 = null;
                var  chance            = habAtaque.ChanceAcerto(habAtaque.Precisao, per.InimigoMonstro.GetDefesa());
                bool temArma           = false;
                while (ticks > 0)
                {
                    if (per.TryGetEquipamento(EquipamentoType.PrimeiraMao, out var item))
                    {
                        temArma = true;
                        arma1   = item as WafclastItemArma;
                        if (Atacar(chance, arma1, habForca, habAtaque, per, batalha))
                        {
                            break;
                        }
                    }

                    if (per.TryGetEquipamento(EquipamentoType.SegundaMao, out item))
                    {
                        if (item is WafclastItemArma)
                        {
                            temArma = true;
                            arma2   = item as WafclastItemArma;
                            if (Atacar(chance, arma2, habForca, habAtaque, per, batalha))
                            {
                                break;
                            }
                        }
                    }
                    if (!temArma)
                    {
                        await ctx.RespondAsync($"{ctx.User.Mention}, é necessário estar equipado com uma arma para explorar.");

                        return;
                    }

                    per.InimigoMonstro.AtaqueVelocidade++;
                    if (per.InimigoMonstro.AtaqueVelocidade == per.InimigoMonstro.AtaqueVelocidadeMax)
                    {
                        per.InimigoMonstro.AtaqueVelocidade = 0;
                        var habDefesa = per.GetHabilidade(ProficienciaType.Defesa) as WafclastProficienciaDefesa;

                        chance = habAtaque.ChanceAcerto(per.InimigoMonstro.GetPrecisao(), habDefesa.Defesa);
                        if (rdg.Chance(chance))
                        {
                            var dano = rdg.Sortear(1, per.InimigoMonstro.DanoMax);
                            if (per.ReceberDano(dano))
                            {
                                batalha.AppendLine($"{Emoji.CrossBone} **Você morreu!** {Emoji.CrossBone}");
                                batalha.AppendLine($"{Emoji.CrossBone} **Você perdeu seus itens!** {Emoji.CrossBone}");
                                per.Morrer();
                                arma1.AtaqueVelocidade = 0;
                                if (arma2 is WafclastItemArma)
                                {
                                    arma2.AtaqueVelocidade = 0;
                                }
                                embed.WithColor(DiscordColor.Red);
                                embed.WithImageUrl("https://cdn.discordapp.com/attachments/758139402219159562/769397084284649472/kisspng-headstone-drawing-royalty-free-clip-art-5afd7eb3d84cb3.625146071526562483886.png");
                                await ctx.RespondAsync(embed : embed.Build());

                                await jogador.Salvar();

                                return;
                            }
                            else
                            {
                                batalha.AppendLine($"{Emoji.Mago} {ctx.User.Mention} recebeu {Emoji.Adaga} **{dano}** por {per.InimigoMonstro.Nome}!");
                                habDefesa.AddExperience(dano * 0.133);
                            }
                        }
                        batalha.AppendLine($"{Emoji.Mago} **{ctx.User.Mention} defendeu!** {Emoji.Escudo}");
                    }
                    ticks--;
                }


                batalha.AppendLine(Emoji.Vazio);
                embed.AddField("Resumo".Titulo(), "\n" + batalha.ToString());
                embed.WithDescription($"Inimigo {per.InimigoMonstro.Nome}!");

                var cont     = per.GetHabilidade(ProficienciaType.Constituicao) as WafclastProficienciaConstituicao;
                var perVida  = (double)cont.Vida / cont.CalcularVida();
                var inimVida = (double)per.InimigoMonstro.Vida / per.InimigoMonstro.VidaMax;
                embed.AddField(Formatter.Underline(ctx.User.Username), $"{Emoji.GerarVidaEmoji(perVida)} {cont.Vida}", true);
                embed.AddField(Formatter.Underline(per.InimigoMonstro.Nome), $"{Emoji.GerarVidaEmoji(inimVida)} {per.InimigoMonstro.Vida}", true);
                embed.WithColor(DiscordColor.Purple);
                embed.WithThumbnail("https://cdn.discordapp.com/attachments/758139402219159562/758425473541341214/sword-and-shield-icon-17.png");

                await ctx.RespondAsync(ctx.User.Mention, embed : embed.Build());

                await jogador.Salvar();
            }
        }