-- миниигра с хождением по лабиринту
walking_in_maze = {}
local self = walking_in_maze
--[[
типы клеток:
0 = стена 
 1 = есть все 4 выхода
2 = нет левого выхода
3 = нет верхнего выхода
4 = нет правого
5 = нет нижнего
6 = нет левого и верхнего
7 = нет левого и правого
8 = нет левого и нижнего
9 = нет верхнего и правого
10 = нет верхнего и нижнего
11 = нет правого и нижнего
12 = есть левый
13 = есть верхний
14 = есть правый
15 = есть нижний

id клетки должно заканчиваться 4 цифрами - 0 или 1
первая цифра = 0, если нет пути влево. если есть путь влево = 1
вторая цифра = вверх
третья цифра = вправо
четвертая = вниз
]]
self.params = {
	images_id = "scenes_chapter05_scene05_minigame_", -- id картинок с частями лабиринта
	bg_patch = "scenes_chapter05_scene05_minigame_maze_patch", -- темнота под клеточкой с лабиринтом
	maze ={
		{0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1},
		{1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0},
		{1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1},
		{1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0},
		{0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1},
		{1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1},
		{0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1},
		{0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0},
		{1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1},
		{1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0},
		{1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1},
		{1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1},
		{0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1}		
	},
	start = {i = 6, j = 1}, -- начальная позиция. i - номер строки матрицы maze, j - номер столбца
	aim = {i = 13, j = 14}, -- до куда надо дойти
	maze_left_top = {X = 117, Y = 35}, -- Смещение относительно левого верхнего угла окна виджета
	-- курсоры 
	cursor_arrow_up = "___maze_arrow_1",
	cursor_arrow_right = "___maze_arrow_2",
	cursor_arrow_down = "___maze_arrow_3",
	cursor_arrow_left = "___maze_arrow_4"
}

function self.Init(_owner)
	sminigames.SetStandartScriptName(_owner, walking_in_maze)
	
	local start = self.params.start
	self.under_cell = sf.gui.CImageWidget(self.params.bg_patch, "", 0, 0)
	_owner.AddWidget(self.under_cell)
	self.SetVisiblePos(_owner, start.i, start.j)
--	self.under_cell.SetOffset(512, 385)
	self.can_win = true
end 

function self.CheckEnd(_owner)
	if self.position.i == self.params.aim.i and 
		self.position.j == self.params.aim.j and 
		self.can_win then
			_owner.SetGameResult(1)
			_owner.OnEndGame()
	end
end

-- перемещает видимость на ячейку _i, _j
function self.SetVisiblePos(_owner, _i, _j)
	if self.cur_pos then
		-- уничтожаем виджет с предыдущей ячейкой
		_owner.RemoveWidget(self.cur_pos)
		self.cur_pos = nil
	end
	
	local name = self.params.images_id
	--local id = self.params.maze[_i][_j]
	-- влево 
	if _j == 1 or self.params.maze[_i][_j - 1] == 0 then
		name = name .. 0
	else
		name = name .. 1
	end
	
	-- вверх
	if _i == 1 or self.params.maze[_i - 1][_j] == 0 then
		name = name .. 0
	else
		name = name .. 1
	end
	-- вправо 
	if _j == #self.params.maze[_i] or self.params.maze[_i][_j + 1] == 0 then
		name = name .. 0
	else
		name = name .. 1
	end
	-- вниз 
	if _i == #self.params.maze or self.params.maze[_i + 1][_j] == 0 then
		name = name .. 0
	else
		name = name .. 1
	end
	--[[if id < 10 and id > 0 then
		name = name..0
	end
	name = name .. id]]
	self.cur_pos = sf.gui.CImageWidget(name, "maze_room", 0, 0) -- позиция, в которой находится игрок
	-- расчитываем координаты
	if not self.size then
		-- размеры виджета с ячейкой лабиринта
		self.size = {X = self.cur_pos.GetSize().X, Y = self.cur_pos.GetSize().Y}		
	end
	local offset_x = (_j - 1) * self.size.X + self.params.maze_left_top.X
	local offset_y = (_i - 1) * self.size.Y + self.params.maze_left_top.Y
	self.cur_pos.SetOffset(offset_x, offset_y)
	_owner.AddWidget(self.cur_pos)
	
	local under_x = offset_x + self.cur_pos.GetSize().X/2 - self.under_cell.GetSize().X/2
	local under_y = offset_y + self.cur_pos.GetSize().Y/2 - self.under_cell.GetSize().Y/2
	self.under_cell.SetOffset(under_x, under_y)
	
	self.position = {i = _i, j = _j}
end 

function self.CheckCursorPosition(_pos)
	local pos = self.cur_pos.GetOffset()
	if (_pos.X >= pos.X and _pos.X <= pos.X + self.size.X) then -- может быть сверху, снизу или внутри
		if (_pos.Y <= pos.Y) then -- сверху
			return 1
		elseif (_pos.Y >= pos.Y + self.size.Y) then -- снизу 
			return 3
		end
	elseif (_pos.Y >= pos.Y and _pos.Y <= pos.Y + self.size.Y) then -- может быть слева или справа
		if (_pos.X <= pos.X) then -- слева 
			return 4
		elseif (_pos.X >= pos.X + self.size.X) then -- справа 
			return 2
		end
	end
	return 0 -- внутри или не по бокам, а на диагонали
end

-- меняем курсор
function self.OnMouseMove(_owner, _pos, _keyboard_state, _broadcast)
	if self.cur_pos then
		-- определяем, надо ли показывать стрелку вверх, вниз, влево или вправо
		local cursor_name = nil
		local cursor_position_type = self.CheckCursorPosition(_pos)
		if (cursor_position_type == 1) then -- сверху
			local ind = {i = self.position.i - 1, j = self.position.j}
			if ind.i > 0 and self.params.maze[ind.i][ind.j] > 0 then -- нет смысла менять курсор, если там ничего нет
				cursor_name = self.params.cursor_arrow_up
			end
		elseif (cursor_position_type == 3) then -- снизу 
			local ind = {i = self.position.i + 1, j = self.position.j}
			if ind.i <= #self.params.maze and self.params.maze[ind.i][ind.j] > 0 then
				cursor_name = self.params.cursor_arrow_down
			end
		elseif (cursor_position_type == 4) then -- слева 
			local ind = {i = self.position.i, j = self.position.j - 1}
			if ind.j > 0 and self.params.maze[ind.i][ind.j] > 0 then 
				cursor_name = self.params.cursor_arrow_left 
			end
		elseif (cursor_position_type == 2) then -- справа 
			local ind = {i = self.position.i, j = self.position.j + 1}
			--__message("ind ("..ind.i..", "..ind.j..")")
			if ind.j <= #self.params.maze[ind.i] and self.params.maze[ind.i][ind.j] > 0 then 
			--	__message("справа")
				cursor_name = self.params.cursor_arrow_right 
			end
		end

		if cursor_name then
			local cursor = sf.gui.CImageWidget(cursor_name, "cursor", 1, 0)
			if cursor then
				sf.gui.g_Cursor.Instance().SetCustomCursor(cursor.GetImage().GetTexture())
			end
		end
	end
	
	return true
end 

function self.OnMouseDown(_owner, _pos, _button, _keyboard_state, _broadcast)
	local cursor_position_type = self.CheckCursorPosition(_pos)
	local ind = nil
	local flag = false
	if (cursor_position_type == 1) then -- сверху
		ind = {i = self.position.i - 1, j = self.position.j}
		if ind.i > 0 and self.params.maze[ind.i][ind.j] > 0 then -- нет смысла биться об стену
			flag = true
		end
	elseif (cursor_position_type == 3) then -- снизу 
		ind = {i = self.position.i + 1, j = self.position.j}
		if ind.i <= #self.params.maze and self.params.maze[ind.i][ind.j] > 0 then
			flag = true
		end
	elseif (cursor_position_type == 4) then -- слева 
		ind = {i = self.position.i, j = self.position.j - 1}
		if ind.j > 0 and self.params.maze[ind.i][ind.j] > 0 then 
			flag = true
		end
	elseif (cursor_position_type == 2) then -- справа 
		ind = {i = self.position.i, j = self.position.j + 1}
		if ind.j <= #self.params.maze[ind.i] and self.params.maze[ind.i][ind.j] > 0 then 
			flag = true
		end
	end
	
	if ind and flag then
		self.SetVisiblePos(_owner, ind.i, ind.j)
		self.CheckEnd(_owner)
	end
	
	return true
end 