using PetCompanion.Models; using PetCompanion.Repositories; namespace PetCompanion.Services { public class PetService { private readonly PetRepository petRepository; private readonly PetClassService petClassService; private readonly GameItemService gameItemService; private readonly GameItemsRepository gameItemsRepository; private readonly PetInventoryService petInventoryService; public PetService( PetRepository petRepository, PetClassService petClassService, GameItemService gameItemService, GameItemsRepository gameItemsRepository, PetInventoryService petInventoryService) { this.petRepository = petRepository; this.petClassService = petClassService; this.gameItemService = gameItemService; this.gameItemsRepository = gameItemsRepository; this.petInventoryService = petInventoryService; } public IEnumerable GetAllPets(Guid userId) { return petRepository.GetPetsByUserId(userId.ToString()); } public Pet CreatePet(Guid userId, PetCreationRequest petRequest) { var petId = Guid.NewGuid().ToString(); var pet = new Pet { Id = petId, UserId = userId.ToString(), Name = petRequest.Name, Class = petRequest.Class, Health = 100, MaxHealth = 100, Level = 1, Experience = 0, Stats = PetStats.BuildFromClass(petRequest.Class), Resources = new Resources(), GatherActionSince = DateTime.UtcNow, PetGatherAction = PetActionGather.IDLE, IsDead = false }; var createdPet = petRepository.CreatePet(pet); var inventory = petInventoryService.CreateInventory(petId); return createdPet; } public Pet UpdatePetAction(string petId, string userId, PetUpdateActionRequest actionRequest) { var pet = petRepository.GetPetById(petId, userId); if (pet == null) { throw new Exception("Pet not found"); } if (actionRequest.BasicAction.HasValue) { var currentTime = DateTime.UtcNow; if (pet.PetBasicAction != PetBasicAction.UNKNOWN && currentTime < pet.BasicActionCooldown.ToUniversalTime().AddSeconds(10)) { throw new Exception("Pet is still on cooldown"); } pet.BasicActionCooldown = DateTime.UtcNow.AddMinutes(GetCooldownForBasicAction(actionRequest.BasicAction.Value)); pet.PetBasicAction = actionRequest.BasicAction.Value; switch (actionRequest.BasicAction.Value) { case PetBasicAction.FEED: pet.Resources.Food -= 1; pet.IncrementStrength(1); pet.Health = Math.Min(pet.Health + 5, pet.MaxHealth); break; case PetBasicAction.SLEEP: pet.IncrementIntelligence(1); pet.IncrementStrength(1); pet.Health = Math.Min(pet.Health + 15, pet.MaxHealth); break; case PetBasicAction.PLAY: pet.Resources.Junk -= 1; pet.IncrementCharisma(1); break; } return petRepository.UpdatePetBasicAction(pet); } else if (actionRequest.GatherAction.HasValue) { pet.PetGatherAction = actionRequest.GatherAction.Value; pet.GatherActionSince = DateTime.UtcNow; return petRepository.UpdatePetGatherAction(pet); } return pet; } // returns in minutes private int GetCooldownForBasicAction(PetBasicAction value) { switch (value) { case PetBasicAction.FEED: return 5; case PetBasicAction.PLAY: return 10; case PetBasicAction.SLEEP: return 15; default: return 0; } } public Resources GetGatheredResources(string petId, string userId) { var pet = petRepository.GetPetById(petId, userId); if (pet == null) { throw new Exception("Pet not found"); } return petClassService.CalculateGatheredResources(pet.Stats, pet.Level, pet.PetGatherAction, pet.GatherActionSince); } public Pet UpdatePetResources(string petId, string userId) { var pet = petRepository.GetPetById(petId, userId); if (pet == null) { throw new Exception("Pet not found"); } var gatheredResources = petClassService.CalculateGatheredResources(pet.Stats, pet.Level, pet.PetGatherAction, pet.GatherActionSince); pet.Resources.Wisdom += gatheredResources.Wisdom; pet.Resources.Gold += gatheredResources.Gold; pet.Resources.Food += gatheredResources.Food; pet.Resources.Junk += gatheredResources.Junk; pet.GatherActionSince = DateTime.UtcNow; return petRepository.UpdatePetResources(pet); } public Pet GetPet(string petId, string userId) { var pet = petRepository.GetPetById(petId, userId); if (pet == null) throw new Exception("Pet not found"); return pet; } } }