private async Task UpdateMonsterAttackBlocks(SpawnedMonster spawnedMonster, string url) { if (spawnedMonster.IsDead()) { await _slack.DeleteInteractionMessage(url); } else { await _slack.UpdateInteractionMessage(new MonsterMenu(spawnedMonster).Blocks, url); } }
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); }
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()) }) }; }
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); }
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()); }
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); }
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); } }
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()); }