public List<Achievement> CheckAchievements(IStatApplier statApplier, IUnitOfWork unitOfWork, Player player) { // Retrieve all achievements, which the player did not already achieve var unachievedAchievements = unitOfWork.AchievementRepository.Get(ach => player.Achievements.TrueForAll(playerAch => playerAch.Id != ach.Id), null, ""); var resList = new List<Achievement>(); // Check for achieved achievements foreach (var unachievedAchievement in unachievedAchievements) { // Check for assignments completed of certain types if (!PassedAssignmentTypes(player, unachievedAchievement)) break; // Break if achievement failed here // Check for general stat requirements if (!PassedGeneralStats(player, unachievedAchievement)) break; // Break if achievement failed here // Check for Job Point purchase requirements if (!PassedJobPointPurchases(player, unachievedAchievement)) break; // Break if achievement failed here // Achievement gotten! player.Achievements.Add(unachievedAchievement); statApplier.ApplyJobPoints(player, unachievedAchievement.JobPointReward); statApplier.ApplyGeneralStats(player, unachievedAchievement.GeneralStatRewards); resList.Add(unachievedAchievement); } return resList; // Return all newly achieved achievements }
public void LevelUp(IUnitOfWork unitOfWork, IStatApplier statApplier, Player player, AssignmentType completedAssignment) { var currentLevel = player.Level; var nextLevel = unitOfWork.LevelRepository.Get((level => level.LevelNumber == currentLevel + 1), null, "").FirstOrDefault(); // TODO: Make several games on one API ? Check if right game fds if (nextLevel == null) return; // Max level reached // Check if experience reached if (player.Experience < nextLevel.ExperienceReq) return; // Not enough experience // Check general stats foreach (var generalStatAmountReq in nextLevel.GeneralStatsReq) { var playerGeneralStatAmount = player.GeneralStats.FirstOrDefault( u => u.StatEffect.AffectedStatBonus == generalStatAmountReq.StatEffect.AffectedStatBonus); if (playerGeneralStatAmount == null) throw new Exception("Database error, player has no such general stat entry"); var res = generalStatAmountReq.CompareTo(playerGeneralStatAmount); if (res == 1) return; // No level up } // Level up reached! DING DING DING player.Level += 1; player.JobPoints += nextLevel.JobPointReward; statApplier.ApplyGeneralStats(player, nextLevel.GeneralStatRewards); }
private readonly IUnitOfWork _unitOfWork; // TODO: Shouldn't really have the whole unit of work - just the collection required in level up - or I dunno fds #endregion Fields #region Constructors public GameLogicApplier(IUnitOfWork unitOfWork, IAchievementChecker achChecker, IStatApplier genStatApp, ILevelUpChecker levelChecker) { _unitOfWork = unitOfWork; _levelUpChecker = levelChecker; _achievementChecker = achChecker; _statApplier = genStatApp; }