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