pg = pg or {}
slot1 = class("IsometricMap")
pg.IsometricMap = slot1

function slot1.Ctor(slot0, slot1, slot2)
	slot0.sizeX = slot1
	slot0.sizeY = slot2
	slot0.depths = {}
	slot0.dependInfo = {}
	slot0.allItems = {}
	slot0.sortedFlag = false
	slot0.sortedItems = {}

	slot0:ResetDepth()
end

function slot1.SetAfterFunc(slot0, slot1)
	slot0.afterSortFunc = slot1
end

function slot1.GetDepth(slot0, slot1, slot2)
	return slot0.depths[slot0:GetIndex(slot1, slot2)]
end

function slot1.InsertChar(slot0, slot1)
	slot1:SetDepth(slot0:GetDepth(slot1.posX, slot1.posY))

	for slot6, slot7 in ipairs(slot0.sortedItems) do
		if slot7.posZ < slot2 then
			table.insert(slot0.sortedItems, slot6, slot1)
			slot0:checkCharByIndex()

			return slot6 - 1
		end
	end

	slot3 = #slot0.sortedItems

	table.insert(slot0.sortedItems, slot3 + 1, slot1)
	slot0:checkCharByIndex()

	return slot3
end

function slot1.checkCharByIndex(slot0)
	for slot4 = 1, #slot0.sortedItems do
		slot5 = math.min(slot4 + 1, #slot0.sortedItems)
	end
end

function slot1.RemoveChar(slot0, slot1)
	table.removebyvalue(slot0.sortedItems, slot1)
end

function slot1.CreateItem(slot0, slot1, slot2, slot3)
	return {
		maxY = 0,
		sortedFlag = true,
		maxX = 0,
		posY = 0,
		posX = 0,
		posZ = 0,
		ob = slot3,
		sizeX = slot1,
		sizeY = slot2,
		SetPos = function (slot0, slot1, slot2)
			slot0.posX = slot1
			slot0.posY = slot2
			slot0.maxX = slot1 + slot0.sizeX - 1
			slot0.maxY = slot2 + slot0.sizeY - 1
		end,
		SetDepth = function (slot0, slot1)
			slot0.posZ = slot1
		end
	}
end

function slot1.GetIndex(slot0, slot1, slot2)
	return (slot2 - 1) * slot0.sizeX + slot1
end

function slot1.ResetDepth(slot0)
	slot1 = slot0.depths

	for slot5 = 1, slot0.sizeX do
		for slot9 = 1, slot0.sizeY do
			slot1[slot0:GetIndex(slot5, slot9)] = slot5 + slot9 - 1
		end
	end
end

function slot1.AddDepth(slot0, slot1, slot2, slot3)
	slot4 = slot0.depths

	for slot8 = 1, slot1 do
		for slot12 = 1, slot2 do
			slot13 = slot0:GetIndex(slot8, slot12)
			slot4[slot13] = slot4[slot13] + slot3
		end
	end
end

function slot1.ModifyDepth(slot0, slot1)
	slot2 = slot0.depths

	if slot2[slot0:GetIndex(slot1.maxX, slot1.posY)] == slot2[slot0:GetIndex(slot1.posX, slot1.maxY)] then
		slot1:SetDepth(slot7)

		return
	end

	if slot7 < slot8 then
		if slot3 > 1 and slot7 - 1 - slot2[slot0:GetIndex(slot3 - 1, slot6)] < 0 then
			slot0:AddDepth(slot3 - 1, slot6, slot9)
		end

		slot1:SetDepth(slot7)

		return
	else
		if slot4 > 1 and slot8 - 1 - slot2[slot0:GetIndex(slot5, slot4 - 1)] < 0 then
			slot0:AddDepth(slot5, slot4 - 1, slot9)
		end

		slot1:SetDepth(slot8)

		return
	end
end

function slot1.PlaceItem(slot0, slot1, slot2, slot3)
	slot3:SetPos(slot1, slot2)

	slot4 = slot3.maxX
	slot5 = slot3.maxY
	slot0.dependInfo[slot3] = {}

	for slot10, slot11 in ipairs(slot0.allItems) do
		if slot1 <= slot11.maxX and slot2 <= slot11.maxY then
			slot6[#slot6 + 1] = slot11
		elseif slot11.posX <= slot4 and slot11.posY <= slot5 then
			table.insert(slot0.dependInfo[slot11], slot3)
		end
	end

	table.insert(slot0.allItems, slot3)

	slot3.sortedFlag = slot0.sortedFlag

	slot0:SortAndCalcDepth()

	if slot0.afterSortFunc then
		slot7(slot0.sortedItems)
	end
end

function slot1.sortItemByDepth(slot0, slot1)
	return slot1.posZ < slot0.posZ
end

function slot1.SortAndCalcDepth(slot0)
	slot0.sortedItems = {}
	slot0.sortedFlag = not slot0.sortedFlag

	for slot5, slot6 in ipairs(slot0.allItems) do
		slot0:AddItemAndDepend(slot6)
	end

	slot0:ResetDepth()

	for slot5, slot6 in ipairs(slot1) do
		slot0:ModifyDepth(slot6)
	end

	table.sort(slot1, uv0.sortItemByDepth)
end

function slot1.AddItemAndDepend(slot0, slot1)
	if slot1.sortedFlag == slot0.sortedFlag then
		return
	end

	for slot5, slot6 in ipairs(slot0.dependInfo[slot1]) do
		slot0:AddItemAndDepend(slot6)
	end

	table.insert(slot0.sortedItems, slot1)

	slot1.sortedFlag = slot0.sortedFlag
end

function slot1.RemoveItem(slot0, slot1)
	slot2 = slot1.posX
	slot3 = slot1.posY

	table.removebyvalue(slot0.allItems, slot1)

	slot0.dependInfo[slot1] = nil

	for slot10, slot11 in ipairs(slot0.allItems) do
		if slot11.posX <= slot1.maxX and slot11.posY <= slot1.maxY then
			table.removebyvalue(slot6[slot11], slot1)
		end
	end

	slot1:SetPos(0, 0)
	slot0:SortAndCalcDepth()
	table.removebyvalue(slot0.sortedItems, slot1)
end
