using CsvHelper; using System.Globalization; using PetCompanion.Models; using PetCompanion.Repositories; namespace PetCompanion.Services { public class GameItemService { private readonly GameItemsRepository gameItemsRepository; public GameItemService(GameItemsRepository gameItemsRepository) { this.gameItemsRepository = gameItemsRepository; } public void LoadItemsFromCsv(string filePath) { using var reader = new StreamReader(filePath); using var csv = new CsvReader(reader, CultureInfo.InvariantCulture); var items = csv.GetRecords().ToList(); foreach (var item in items) { var existingItem = gameItemsRepository.GetById(item.Id); if (existingItem == null) { gameItemsRepository.Add(item); } else { //gameItemsRepository.Update(item); } } } public GameItem GetRandomItem() { var items = gameItemsRepository.GetAll(); var random = new Random(); var index = random.Next(items.Count()); return items.ElementAt(index); } public void ApplyItemEffect(Pet pet, GameItem item) { var effects = item.Effect.Split(';'); foreach (var effect in effects) { ApplySingleEffect(pet, effect.Trim()); } } public void RemoveItemEffect(Pet pet, GameItem item) { var effects = item.Effect.Split(';'); foreach (var effect in effects) { RemoveSingleEffect(pet, effect.Trim()); } } private void ApplySingleEffect(Pet pet, string effect) { if (effect == "Nothing") return; var parts = effect.Split('_'); var action = parts[0]; var target = parts[1]; var value = parts.Length > 2 ? int.Parse(parts[2]) : 0; switch ($"{action}_{target}") { case "ADD_FOOD": pet.Resources.Food += value; break; case "ADD_INTELLIGENCE": pet.IncrementIntelligence(value); break; case "REDUCE_COOLDOWN": pet.BasicActionCooldown = pet.BasicActionCooldown.AddMinutes(-value); break; case "ADD_HEALTH": pet.Health = Math.Min(pet.Health + value, pet.MaxHealth); break; case "ADD_CHARISMA": pet.IncrementCharisma(value); break; case "ADD_STRENGTH": pet.IncrementStrength(value); break; case "ADD_RANDOMSTAT": var random = new Random(); var stat = random.Next(4); switch (stat) { case 0: pet.IncrementStrength(value); break; case 1: pet.IncrementIntelligence(value); break; case 2: pet.IncrementCharisma(value); break; case 3: pet.Health = Math.Min(pet.Health + value, pet.MaxHealth); break; } break; case "RESTORE_STATS": pet.Health = pet.MaxHealth; pet.Stats.Intelligence = pet.Stats.MaxIntelligence; pet.Stats.Strength = pet.Stats.MaxStrength; pet.Stats.Charisma = pet.Stats.MaxCharisma; break; case "ADD_MAXHEALTH": pet.MaxHealth += value; break; case "ADD_MAXINTELLIGENCE": pet.Stats.MaxIntelligence += value; break; case "ADD_MAXSTRENGTH": pet.Stats.MaxStrength += value; break; case "ADD_MAXCHARISMA": pet.Stats.MaxCharisma += value; break; case "ADD_MAXALLSTATS": pet.MaxHealth += value; pet.Stats.MaxIntelligence += value; pet.Stats.MaxStrength += value; pet.Stats.MaxCharisma += value; break; } } private void RemoveSingleEffect(Pet pet, string effect) { if (effect == "Nothing") return; var parts = effect.Split('_'); var action = parts[0]; var target = parts[1]; var value = parts.Length > 2 ? int.Parse(parts[2]) : 0; switch ($"{action}_{target}") { case "ADD_MAXHEALTH": pet.MaxHealth -= value; pet.Health = Math.Min(pet.Health, pet.MaxHealth); break; case "ADD_MAXINTELLIGENCE": pet.Stats.MaxIntelligence -= value; pet.Stats.Intelligence = Math.Min(pet.Stats.Intelligence, pet.Stats.MaxIntelligence); break; case "ADD_MAXSTRENGTH": pet.Stats.MaxStrength -= value; pet.Stats.Strength = Math.Min(pet.Stats.Strength, pet.Stats.MaxStrength); break; case "ADD_MAXCHARISMA": pet.Stats.MaxCharisma -= value; pet.Stats.Charisma = Math.Min(pet.Stats.Charisma, pet.Stats.MaxCharisma); break; case "ADD_MAXALLSTATS": pet.MaxHealth -= value; pet.Stats.MaxIntelligence -= value; pet.Stats.MaxStrength -= value; pet.Stats.MaxCharisma -= value; pet.Health = Math.Min(pet.Health, pet.MaxHealth); pet.Stats.Intelligence = Math.Min(pet.Stats.Intelligence, pet.Stats.MaxIntelligence); pet.Stats.Strength = Math.Min(pet.Stats.Strength, pet.Stats.MaxStrength); pet.Stats.Charisma = Math.Min(pet.Stats.Charisma, pet.Stats.MaxCharisma); break; } } } }