local function move(map, startX, startY, dX, dY)
local targetX, targetY = startX + dX, startY + dY
if not map[targetX][targetY] then return startX, startY; end
if map[targetX][targetY].isBox then
local slideX, slideY = targetX + dX, targetY + dY
if not (map[slideX] and map[slideX][slideY] and map[slideX][slideY].isWalkable) then return startX, startY; end
local empty, boxTile = map[slideX][slideY], map[targetX][targetY]
local sprite = boxTile.box
sprite.x, sprite.y = empty.x, empty.y
empty.box = boxTile.box
empty.isBox = true
empty.isWalkable = false
boxTile.box = nil
boxTile.isWalkable = true
boxTile.isBox = false
end
if map[targetX][targetY].isWalkable then
local target, origin = map[targetX][targetY], map[startX][startY]
hero.x, hero.y = target.x, target.y
target.isHero = true
target.isWalkable = false
origin.isHero = false
origin.isWalkable = true
return targetX, targetY
end
return startX, startY
end
Comments