Esempio n. 1
0
 private async Task UpdateMonsterAttackBlocks(SpawnedMonster spawnedMonster, string url)
 {
     if (spawnedMonster.IsDead())
     {
         await _slack.DeleteInteractionMessage(url);
     }
     else
     {
         await _slack.UpdateInteractionMessage(new MonsterMenu(spawnedMonster).Blocks, url);
     }
 }
Esempio n. 2
0
        public async Task HandleMonsterDeathByUser(User user, SpawnedMonster spawnedMonster, string channel)
        {
            var monster = spawnedMonster.Monster;
            var users   = FindExperienceWinners(spawnedMonster.MonsterAttackers);

            await AddMonsterLootToUser(user, monster, channel);

            _spawnedMonsterRepository.RemoveMonster(spawnedMonster.Id);

            await _slack.BroadcastMessage(string.Format(DougMessages.MonsterDied, monster.Name), channel);

            await _userService.AddExperienceFromMonster(users, monster, channel);
        }
Esempio n. 3
0
        public MonsterMenu(SpawnedMonster spawnedMonster)
        {
            var monster            = spawnedMonster.Monster;
            var monsterText        = new MarkdownText($"*{monster.Name}* `lvl {monster.Level}` \n *{monster.Health}*/{monster.MaxHealth} \n {monster.Description}");
            var monsterDescription = new Section(monsterText, new Image(monster.Image, monster.Name));

            Blocks = new List <Block>
            {
                monsterDescription,
                new ActionList(new List <Accessory> {
                    new Button(DougMessages.AttackAction, spawnedMonster.Id.ToString(), Actions.Attack.ToString())
                })
            };
        }
Esempio n. 4
0
        public async Task HandleMonsterDeathByUser(User user, SpawnedMonster spawnedMonster, string channel)
        {
            var monster    = spawnedMonster.Monster;
            var users      = spawnedMonster.MonsterAttackers.Select(attacker => attacker.User).ToList();
            var lootWinner = spawnedMonster.FindHighestDamageDealer();

            await AddMonsterLootToUser(lootWinner, monster, channel);

            _monsterRepository.RemoveMonster(spawnedMonster.Id);

            await _slack.BroadcastMessage(string.Format(DougMessages.MonsterDied, monster.Name), channel);

            var experiencePerUser = monster.ExperienceValue / users.Count;
            await _userService.AddBulkExperience(users, experiencePerUser, channel);
        }
Esempio n. 5
0
        public async Task <DougResponse> AttackMonster(User user, SpawnedMonster spawnedMonster, string channel)
        {
            if (user.IsAttackOnCooldown())
            {
                return(new DougResponse(string.Format(DougMessages.CommandOnCooldown, user.CalculateAttackCooldownRemaining())));
            }

            _statsRepository.SetAttackCooldown(user.Id, user.GetAttackCooldown());

            var attack = user.AttackTarget(spawnedMonster, _eventDispatcher);

            await DealDamageToMonster(user, attack, spawnedMonster, channel);

            return(new DougResponse());
        }
Esempio n. 6
0
        private async Task MonsterAttackUser(SpawnedMonster spawnedMonster, User user, string channel)
        {
            var monster           = spawnedMonster.Monster;
            var retaliationAttack = spawnedMonster.AttackTarget(user, _eventDispatcher);

            var retaliationMessage = retaliationAttack.Status.ToMessage($"*{monster.Name}*", _userService.Mention(user), retaliationAttack.Damage);
            await _slack.BroadcastMessage(retaliationMessage, channel);

            _spawnedMonsterRepository.SetAttackCooldown(spawnedMonster.Id, monster.GetAttackCooldown());

            if (user.IsDead())
            {
                await _userService.HandleDeath(user, channel);
            }

            _statsRepository.UpdateHealth(user.Id, user.Health);
        }
Esempio n. 7
0
        private async Task DealDamageToMonster(User user, Attack attack, SpawnedMonster spawnedMonster, string channel)
        {
            var monster = spawnedMonster.Monster;
            var message = attack.Status.ToMessage(_userService.Mention(user), $"*{monster.Name}*", attack.Damage);
            await _slack.BroadcastMessage(message, channel);

            _spawnedMonsterRepository.RegisterUserDamage(spawnedMonster.Id, user.Id, attack.Damage, spawnedMonster.Health);

            if (spawnedMonster.IsDead())
            {
                await _monsterService.HandleMonsterDeathByUser(user, spawnedMonster, channel);
            }
            else if (!spawnedMonster.IsAttackOnCooldown())
            {
                await MonsterAttackUser(spawnedMonster, user, channel);
            }
        }
Esempio n. 8
0
        public async Task <DougResponse> AttackMonster(User user, SpawnedMonster spawnedMonster, string channel)
        {
            var energy  = user.Energy - AttackEnergyCost;
            var monster = spawnedMonster.Monster;

            if (user.IsAttackOnCooldown())
            {
                return(new DougResponse(string.Format(DougMessages.CommandOnCooldown, user.CalculateAttackCooldownRemaining())));
            }

            if (energy < 0)
            {
                return(new DougResponse(DougMessages.NotEnoughEnergy));
            }

            _statsRepository.UpdateEnergy(user.Id, energy);
            _userRepository.SetAttackCooldown(user.Id, user.GetAttackCooldown());

            var attack = user.AttackTarget(monster, _eventDispatcher);

            var message = attack.Status.ToMessage(_userService.Mention(user), $"*{monster.Name}*", attack.Damage);
            await _slack.BroadcastMessage(message, channel);

            _monsterRepository.RegisterUserDamage(spawnedMonster.Id, user.Id, attack.Damage);

            if (monster.IsDead())
            {
                await _monsterService.HandleMonsterDeathByUser(user, spawnedMonster, channel);
            }
            else if (!spawnedMonster.IsAttackOnCooldown())
            {
                await MonsterAttackUser(monster, user, spawnedMonster.Id, channel);
            }

            return(new DougResponse());
        }