Example #1
0
        public static WafclastItemArma BronzeDaggerAb()
        {
            var arma = new WafclastItemArma(2, "Adaga de Bronze", 168, 1, 4, PrimeiraMao)
            {
                Examinar = "Pequeno mas pontudo"
            };

            return(arma);
        }
Example #2
0
        public bool Atacar(double chance, WafclastItemArma arma, WafclastProficienciaForca habForca, WafclastProficienciaAtaque habAtaque, WafclastPersonagem per, StringBuilder batalha)
        {
            arma.AtaqueVelocidade++;
            if (arma.AtaqueVelocidade >= arma.AtaqueVelocidadeMax)
            {
                arma.AtaqueVelocidade = 0;
                if (rdg.Chance(chance))
                {
                    var dano = rdg.Sortear(1, habForca.Dano);
                    batalha.AppendLine($"{Emoji.Demonio} **{per.InimigoMonstro.Nome}** recebeu **{Emoji.Adaga} {dano}** por {arma.Nome}!");
                    if (per.InimigoMonstro.ReceberDano(dano))
                    {
                        batalha.AppendLine($"{Emoji.CrossBone} {per.InimigoMonstro.Nome} {Emoji.CrossBone}");
                        habForca.AddExperience(per.InimigoMonstro.VidaMax * 0.133);
                        habAtaque.AddExperience(per.InimigoMonstro.VidaMax * 0.133);

                        // Sortear itens que podem cair do inimigo.
                        var dropchance = per.InimigoMonstro.Drops;
                        per.InimigoMonstro.Drops = new List <Game.Entidades.NPC.WafclastMonstroDrop>();
                        foreach (var item in dropchance)
                        {
                            if (rdg.Chance(item.Chance.Chance))
                            {
                                var sorteado = item;
                                // Sorteia quantidade e reutiliza
                                sorteado.QuantidadeMin = rdg.Sortear(sorteado.QuantidadeMin, sorteado.QuantidadeMax);
                                per.InimigoMonstro.Drops.Add(sorteado);
                            }
                        }
                        batalha.AppendLine($"Caiu {per.InimigoMonstro.Drops.Count} item.");

                        return(true);
                    }
                }
                else
                {
                    batalha.AppendLine($"{Emoji.Demonio} **{per.InimigoMonstro.Nome} defendeu!** {Emoji.Escudo}");
                }
            }
            return(false);
        }
Example #3
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();
            }
        }