172 lines
6.3 KiB
C#
172 lines
6.3 KiB
C#
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<GameItem>().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;
|
|
}
|
|
}
|
|
}
|
|
}
|