pet-companion-back/Services/PetInventoryService.cs

158 lines
5.1 KiB
C#

using PetCompanion.Models;
using PetCompanion.Repositories;
namespace PetCompanion.Services
{
public class PetInventoryService
{
private readonly PetInventoryRepository petInventoryRepository;
private readonly PetRepository petRepository;
private readonly GameItemsRepository gameItemsRepository;
private readonly GameItemService gameItemService;
public PetInventoryService(
PetInventoryRepository petInventoryRepository,
PetRepository petRepository,
GameItemsRepository gameItemsRepository,
GameItemService gameItemService)
{
this.petInventoryRepository = petInventoryRepository;
this.petRepository = petRepository;
this.gameItemsRepository = gameItemsRepository;
this.gameItemService = gameItemService;
}
public Inventory GetInventory(string petId, string userId)
{
var pet = petRepository.GetPetById(petId, userId);
if (pet == null)
throw new Exception("Pet not found");
return petInventoryRepository.GetPetInventory(petId);
}
public Inventory CreateInventory(string petId)
{
var inventory = new Inventory
{
PetId = petId,
Capacity = 20,
Items = new List<int>()
};
petInventoryRepository.SavePetInventory(inventory);
return inventory;
}
public Pet UseItem(string petId, string userId, int itemId)
{
var pet = petRepository.GetPetById(petId, userId);
if (pet == null)
throw new Exception("Pet not found");
if (!pet.Inventory.Items.Any(i => i == itemId))
throw new Exception("Item not found in inventory");
var gameItem = gameItemsRepository.GetById(itemId);
gameItemService.ApplyItemEffect(pet, gameItem);
pet.Inventory.Items.Remove(itemId);
return petRepository.UpdatePet(pet);
}
public Pet EquipItem(string petId, string userId, int itemId)
{
var pet = petRepository.GetPetById(petId, userId);
if (pet == null)
throw new Exception("Pet not found");
if (!pet.Inventory.Items.Any(i => i == itemId))
throw new Exception("Item not found in inventory");
var gameItem = gameItemsRepository.GetById(itemId);
if (gameItem.Type != ItemType.Equipment)
throw new Exception("Item is not equipment");
// If there's already an item equipped in that slot, unequip it first
if (pet.EquippedItems.ContainsKey(gameItem.EquipTarget))
{
var equippedItemId = pet.EquippedItems[gameItem.EquipTarget];
UnequipItem(petId, userId, equippedItemId);
}
// Apply equipment effects
gameItemService.ApplyItemEffect(pet, gameItem);
// Mark item as equipped
pet.EquippedItems[gameItem.EquipTarget] = itemId;
// Remove from inventory
pet.Inventory.Items.Remove(itemId);
petInventoryRepository.UpdateEquippedItems(petId, pet.EquippedItems);
return petRepository.UpdatePet(pet);
}
public Pet UnequipItem(string petId, string userId, int itemId)
{
var pet = petRepository.GetPetById(petId, userId);
if (pet == null)
throw new Exception("Pet not found");
var equipTarget = pet.EquippedItems.FirstOrDefault(kvp => kvp.Value == itemId).Key;
if (equipTarget == ItemEquipTarget.None)
throw new Exception("No item equipped in that slot");
var equippedItem = gameItemsRepository.GetById(itemId);
if (equippedItem != null)
{
// Remove equipment effects
gameItemService.RemoveItemEffect(pet, equippedItem);
// Add item back to inventory
pet.Inventory.Items.Add(itemId);
}
pet.EquippedItems.Remove(equipTarget);
return petRepository.UpdatePet(pet);
}
public Pet DropItem(string petId, string userId, int itemId)
{
var pet = petRepository.GetPetById(petId, userId);
if (!pet.Inventory.Items.Any(i => i == itemId))
throw new Exception("Item not found in inventory");
var gameItem = gameItemsRepository.GetById(itemId);
pet.Inventory.Items.Remove(itemId);
return petRepository.UpdatePet(pet);
}
public Pet AddItemToPet(string petId, string userId, int itemId, int quantity)
{
var pet = petRepository.GetPetById(petId, userId);
var gameItem = gameItemsRepository.GetById(itemId);
if (gameItem == null)
throw new Exception("Item not found");
for (int i = 0; i < quantity; i++)
{
pet.Inventory.Items.Add(itemId);
}
return petRepository.UpdatePet(pet);
}
}
}