제작 개수 제한 처리

제작 개수는 무한정 늘어날 수 없다.
현재 보유한 재료와 인벤토리 공간을 기준으로 실제 제작 가능한 최대 개수까지만 올라가야 한다.

그래서 제작 개수를 변경할 때는 먼저 최대 제작 가능 개수를 계산하고, 그 범위 안에서만 값이 바뀌도록 했다.

ClampedCount = FMath::Clamp(NewCount, MinCraftCount, MaxCraftableCount);

예를 들어, 현재 최대 7개까지 만들 수 있는데 +10 버튼을 눌렀다면, 제작 개수는 11이나 12가 되는 것이 아니라 7에서 멈춘다.

RefreshCraftCountText();
RefreshDetail();

또한, 제작 개수만 변경될 때는 전체 UI를 새로 만들지 않고, 제작 개수 텍스트와 상세 정보만 갱신했다.
왼쪽 설비 목록까지 다시 만들 필요는 없기 때문이다.


제작 가능 여부 기준 수정

현재 제작 개수만큼 만들 수 있는지를 확인해야 하므로 제작 가능 여부를 확인할 때 제작 개수를 함께 넘겼다.

CanCraftFactory(FactoryId, InCraftCount)

이 함수는 선택한 설비를 InCraftCount개 제작할 수 있는지 확인한다.
내부에서는 제작 비용에 제작 개수를 곱해 필요한 총 재료 수를 계산하고, 인벤토리에 해당 재료가 충분한지 검사한다.

RequiredCount = Cost.Value * InCraftCount;

인벤토리 공간 검사

제작 개수 기능을 추가하면서 재료만 충분한지 확인하는 것으로는 부족했다.
재료는 충분해도 설비가 인벤토리에 들어갈 공간이 없다면 제작이 실패해야 한다.

1. 재료 차감
2. 설비 지급

제작은 재료를 먼저 차감한 뒤, 설비를 지급한다.
따라서 인벤토리 공간도 현재 상태가 아니라, 재료가 차감된 이후의 상태를 기준으로 판단해야 한다.

예를 들어, 인벤토리가 가득 차 있어도 제작에 사용되는 재료가 모두 소모되면 그 슬롯이 비게 되고, 그 빈 슬롯에 제작된 설비가 들어갈 수 있다.
그래서 실제 인벤토리를 바로 수정하지 않고, 인벤토리 슬롯을 복사한 뒤 그 복사본에서 재료 차감을 시뮬레이션하는 방식으로 처리했다.

TArray<FKOItemSlot> SimulatedSlots = Slots;

복사된 슬롯에서 필요한 재료를 제거하고, 그 상태에서 결과 설비가 몇 개까지 들어갈 수 있는지 계산했다.

GetAddableCountInSlots(SimulatedSlots, AddKind, AddItemId, AddCount);

 

실제 추가 함수와 계산 함수 분리

기존 인벤토리 컴포넌트에는 실제로 아이템을 추가하는 TryAddItem()이 있었다.
하지만, 제작 가능 여부를 검사할 때 TryAddItem()을 직접 사용할 수는 없다. 이 함수는 실제로 인벤토리 상태를 변경하기 때문이다.

그래서 역할을 분리했다.

TryAddItem()
→ 실제로 아이템을 인벤토리에 추가한다.

TryRemoveItem()
→ 실제로 아이템을 인벤토리에서 제거한다.

GetAddableCountAfterRemoving()
→ 실제 인벤토리는 바꾸지 않고, 재료 제거 후 결과물이 들어갈 수 있는지만 계산한다.

제작 가능 여부를 확인하는 단계에서는 계산 전용 함수를 사용하고, 실제 제작 버튼을 눌렀을 때만 TryRemoveItem()과 TryAddItem()을 사용하도록 했다.


실제 제작 처리

실제 제작에서는 현재 제작 개수만큼 재료를 차감하고, 결과 설비도 제작 개수만큼 지급했다.

RequiredCount = Cost.Value * CraftCount;

재료 차감이 끝나면 설비를 지급한다.

TryAddItem(EKOSlotKind::Factory, SelectedFactoryId, CraftCount);

만약, 설비 지급에 실패하면 이미 차감한 재료를 다시 복구한다.
제작 가능 여부를 미리 검사하더라도 실제 제작 과정에서 상태가 바뀔 가능성이 있기 때문에, 복구 로직은 안전장치로 유지했다.


정리

제작 개수에 따라 필요한 재료량을 다시 계산하고, 제작 가능한 최대 개수를 제한하며, 인벤토리 공간까지 고려하도록 구조를 수정했다.

인벤토리 공간 검사는 현재 공간만 보는 것이 아니라, 재료가 차감된 이후의 상태를 기준으로 계산해야 했다. 이를 위해 인벤토리 컴포넌트에 슬롯 복사 기반의 시뮬레이션 로직을 추가했고, 실제 인벤토리를 변경하지 않은 상태에서 제작 가능 여부를 판단할 수 있게 만들었다.