인벤토리 정렬(Sort) 버튼을 눌렀을 때 같은 아이템을 최대한 합치면서 재배치하도록 구현함. 기능 자체는 동작했지만, 실제 플레이 화면 스크린샷을 보니 같은 아이템 중 수량이 적은 자투리 슬롯이 맨 앞에 와 있는 걸 발견함
파란 포션을 여러 번 사용/획득해 99, 99, 98개로 세 칸에 나뉜 상태에서 정렬 버튼을 눌렀더니, 정렬은 되는데 자투리(98개)가 있는 슬롯이 맨 앞 칸에 오고 꽉 찬 칸(99개)들이 그 뒤에 오는 걸 스크린샷으로 확인함. 기대한 건 꽉 찬 슬롯이 먼저 오고 자투리가 맨 뒤로 가는 것이었음
InventoryContainer.SortSlots가 병합 후 마지막에 한 번 더 정렬하는 비교 함수
table.sort(self.slots, function(a, b)
if a.itemCnt <= 0 then return false end
if b.itemCnt <= 0 then return true end
return a.itemId < b.itemId
end)
이 비교 함수는 itemId가 같으면 "동등하다"고만 판단함. 그런데 Lua의 table.sort는 불안정 정렬(unstable sort) 이라, 비교 함수가 "동등"하다고 판단한 원소들끼리는 원래 순서가 보장되지 않음. 그래서 같은 파란 포션이라도 99/99/98 세 슬롯 사이의 상대 순서는 정렬 전 배열 상태에 따라 우연히 결정되고 있었던 것 — 지금까지 자투리가 뒤로 갔던 건 우연이었을 뿐, 코드가 그렇게 보장하고 있던 게 아니었음
같은 아이템일 때 수량 내림차순이라는 2차 정렬 기준을 추가해, 비교 함수가 사실상 완전한 순서(total order)를 만들도록 수정함
local function CompareSlot(a, b)
if a.itemCnt <= 0 then return false end
if b.itemCnt <= 0 then return true end
if a.itemId ~= b.itemId then
return a.itemId < b.itemId
end
return a.itemCnt > b.itemCnt -- 같은 아이템이면 꽉 찬 슬롯이 앞, 자투리 수량은 뒤로 밀림
end