--[[На сцене есть много бутыльков с разными жидкостями и три пробирки, 
в каждую из которых надо налить определенное количество какой-то конкретной жидкости.
При смешивании жидкостей разных цветов происходит какая-то реакция, и игра начинается сначала. ]]

liquids_pouring = {}

local self = liquids_pouring

self.params = {
	types = 3, -- количество типов жидкостей
	bad_effect = "", -- клип с реакцией на неверные жидкости
	taken_effect = "", -- эффект выбранности бутылька
	error_delay = 4000, -- задержка для демонстрации эффекта ошибки
	weight_num_id = "scenes_chapter04_scene03_minigame_number0", -- id циферок для весов
	sound_id = "water_pouring",  -- звук переливания
	weight_number_pos ={ -- позиции для циферок на весах
		sf.misc.FloatVector(539, 496), -- единицы 
		sf.misc.FloatVector(518, 496) -- десятки
	},
	bottles = {
		{ --1
			sum = true, -- суммируется ли весами
			group = 1, -- для первой группы жидкостей
			start_amount = 6, -- изначально пустой
			size = 10, -- сколько входит
			need = 9, -- сколько должно быть в конце. 0 означает, что неважно
			id = "scenes_chapter04_scene03_minigame_bottle01_bottle01_", --  начало id жидкости для бутыльков (жидкости должны иметь имя по шаблону "id_<количество>")
			pos = sf.misc.FloatVector(483, 126), -- позиция виджета с бутыльком
			select_clip ="bottle_shine_03", -- клип на выделение
			clip_pos = sf.misc.FloatVector(483, 126), -- координаты клипа
			select_img = "scenes_chapter04_scene03_minigame_bottle01_shine", -- картинка с выделением
			sel_pos = sf.misc.FloatVector(473, 35)
		},
		{ --2
			sum = false, -- суммируется ли весами
			group = 1, -- для первой группы жидкостей
			start_amount = 3, -- изначально 
			size = 5, -- сколько входит
			need = 0, -- сколько должно быть в конце. 0 означает, что неважно
			id = "scenes_chapter04_scene03_minigame_bottle02_bottle02_", --  начало id жидкости для бутыльков (жидкости должны иметь имя по шаблону "id_<количество>")
			pos = sf.misc.FloatVector(690, 251), -- положение картинки
			select_clip ="bottle_shine_01", -- клип на выделение
			clip_pos = sf.misc.FloatVector(690, 281), -- координаты клипа
			select_img = "scenes_chapter04_scene03_minigame_bottle02_shine", -- картинка с выделением
			sel_pos = sf.misc.FloatVector(696, 183)
		},
		{ --3
			sum = false, -- суммируется ли весами
			group = 1, -- для первой группы жидкостей
			start_amount = 1, -- изначально 
			size = 3, -- сколько входит
			need = 0, -- сколько должно быть в конце. 0 означает, что неважно
			id = "scenes_chapter04_scene03_minigame_bottle03_bottle03_", --  начало id жидкости для бутыльков (жидкости должны иметь имя по шаблону "id_<количество>")
			pos = sf.misc.FloatVector(812, 450), -- положение картинки
			select_clip ="bottle_shine_01", -- клип на выделение
			clip_pos = sf.misc.FloatVector(812, 445), -- координаты клипа
			select_img = "scenes_chapter04_scene03_minigame_bottle03_shine", -- картинка с выделением
			sel_pos = sf.misc.FloatVector(839, 380)
		},
		-- ------- вторая группа жидкостей
		{ --4
			sum = true, -- суммируется ли весами
			group = 2, -- для второй группы жидкостей
			start_amount = 6, -- изначально пустой
			size = 8, -- сколько входит
			need = 4, -- сколько должно быть в конце. 0 означает, что неважно
			id = "scenes_chapter04_scene03_minigame_bottle04_bottle04_", --  начало id жидкости для бутыльков (жидкости должны иметь имя по шаблону "id_<количество>")
			pos = sf.misc.FloatVector(293, 196), -- положение картинки
			select_clip ="bottle_shine_02", -- клип на выделение
			clip_pos = sf.misc.FloatVector(293, 196), -- координаты клипа
			select_img = "scenes_chapter04_scene03_minigame_bottle04_shine", -- картинка с выделением
			sel_pos = sf.misc.FloatVector(286, 97)
		},
		{ --5
			sum = false, -- суммируется ли весами
			group = 2, -- для второй группы жидкостей
			start_amount = 1, -- изначально 
			size = 5, -- сколько входит
			need = 0, -- сколько должно быть в конце. 0 означает, что неважно
			id = "scenes_chapter04_scene03_minigame_bottle05_bottle05_", --  начало id жидкости для бутыльков (жидкости должны иметь имя по шаблону "id_<количество>")
			pos = sf.misc.FloatVector(95, 233), -- положение картинки
			select_clip ="bottle_shine_03", -- клип на выделение
			clip_pos = sf.misc.FloatVector(95, 233), -- координаты клипа
			select_img = "scenes_chapter04_scene03_minigame_bottle05_shine", -- картинка с выделением
			sel_pos = sf.misc.FloatVector(115, 147)
		},
		{ --6
			sum = false, -- суммируется ли весами
			group = 2, -- для второй группы жидкостей
			start_amount = 1, -- изначально 
			size = 3, -- сколько входит
			need = 0, -- сколько должно быть в конце. 0 означает, что неважно
			id = "scenes_chapter04_scene03_minigame_bottle06_bottle06_", --  начало id жидкости для бутыльков (жидкости должны иметь имя по шаблону "id_<количество>")
			pos = sf.misc.FloatVector(43, 461), --  положение картинки
			select_clip ="bottle_shine_01", -- клип на выделение
			clip_pos = sf.misc.FloatVector(43, 461), -- координаты клипа
			select_img = "scenes_chapter04_scene03_minigame_bottle06_shine", -- картинка с выделением
			sel_pos = sf.misc.FloatVector(49, 407)
		}
	}
}

function self.Init(_owner)
	sminigames.SetStandartScriptName(_owner, liquids_pouring) 
	
	self.LoadInfo(_owner)
	self.timer = __create_timer("", "qe_level")
	
	
	
	self.error_start = 0
end

function self.LoadInfo(_owner)
	self.objects = {}
	self.sum = 0 -- сумма грамм в бутыльках
	-- считываем бутыльки
	for i = 1, #self.params.bottles do
		local now = self.params.bottles[i].start_amount
		local fill = nil
		-- создаем виджет с количеством жидкости
		fill =  self.CreateFillImage(_owner, i, now)
		local label = nil
		if not self.params.bottles[i].sum then
			-- считываем label и заполняем
			local name = "bottle"
			if i < 10 then
				name = name .. 0
			end
			name = name .. i
			label = __cast(_owner.GetWidget(name, true), sf.gui.CLabelWidget)
			label.SetText(tostring(now))
		end
		local object = {
			--image = widget,
			sum = self.params.bottles[i].sum, -- стоит ли на весах
			weight = now, -- сколько сейчас
			group = self.params.bottles[i].group, -- для первой группы жидкостей
			size = self.params.bottles[i].size, -- сколько входит
			need = self.params.bottles[i].need, -- сколько должно быть в конце
			fill_image = fill,
			label = label -- где хранится информация о подписи
		}
		if object.sum then
			self.sum = self.sum + object.weight
		end
		
		table.insert(self.objects, object)
	end
	
	self.weight_widget =  __cast(_owner.GetWidget("weight_common", true), sf.gui.CLabelWidget)
	self.weight_widget.SetText("  "..self.sum.."  ")
	self.numbers = {}
	self.CountSum(_owner)
	
	
	self.selected = -1 -- выделенный объект
	self.is_error = -1 -- указание о том, что ошибок не было
end 

function self.CheckEnd(_owner)
	for i = 1, #self.objects do
		-- проверяем соответствие содержимого объекта нужному количеству
		if self.objects[i].weight ~= self.params.bottles[i].need 
			and self.params.bottles[i].need ~= 0 then
				return false
		end
	end
	
	self.RemoveFillWidgets(_owner) -- удаляем текущие картинки с количеством жидкости
	_owner.SetGameResult(1)
	_owner.OnEndGame()
end 
-- проверяет, попали ли мы в бутылку
function self.IsBottle(_pos)
	for i = 1, #self.objects do
		if misc.GetRect(self.objects[i].fill_image).IsContains(_pos.X, _pos.Y) then
			return i
		end
	end
	return nil
end 

-- выделяет объект
function self.Select(_owner, _i)
	self.Deselect(_owner)
	
	self.selected = _i
	
	
	self.selection_image = sf.gui.CImageWidget(self.params.bottles[self.selected].select_img, "", 0, 0)
	_owner.AddWidget(self.selection_image)
	local offset1 = self.params.bottles[self.selected].sel_pos
	self.selection_image.SetOffset(offset1.X, offset1.Y)
	
	self.selection_clip =  sf.gui.CClipWidget("", 0, 0)
	self.selection_clip.GetClip().Load(self.params.bottles[self.selected].select_clip, true)
	_owner.AddWidget(self.selection_clip)
	local offset = self.params.bottles[self.selected].clip_pos
	self.selection_clip.SetOffset(offset.X, offset.Y)	
end

-- снимает выделение с объекта
function self.Deselect(_owner)
	if self.selected > 0 and self.objects[self.selected].fill_image then
		self.selection_clip.GetClip().Stop()
		_owner.RemoveWidget(self.selection_clip)
		_owner.RemoveWidget(self.selection_image)
	end
	
	self.selected = -1
end

function self.OnMouseDown(_owner, _pos, _button, _keyboard_state, _broadcast)
	if self.is_error > 0 then return false end
	
	local ind = self.IsBottle(_pos) -- проверяем, попали ли мы в бутылку
	
	if not ind then return false end
	-- обработка попадания
	
	if self.selected == ind then
		-- повторный клик снимает выделение
		self.Deselect(_owner)
	else
		if self.selected < 0  then
			if self.objects[ind].weight ~= 0 then
				self.Select(_owner, ind) -- выделяем бутылек
			end
		else
			-- уже был выделен бутылек, выполняем переливание
			-- переливаем
			if self.objects[self.selected].group == self.objects[ind].group then
				self.Pour(_owner, self.selected, ind)
			
				self.CountSum(_owner)
				self.CheckEnd(_owner)
			end
			self.Deselect(_owner)
		end
	end
	
	return true
end 

-- функция, которая собственно изменяет количество жидкости в бутыльках
function self.Pour(_owner, _from, _where)
	-- вычисляем, сколько свободного места в бутыльке
	if self.params.sound_id then
		sound(self.params.sound_id)
	end
	local free_space = self.objects[_where].size - self.objects[_where].weight 
	local has = self.objects[_from].weight -- сколько есть в бутыльке-исходнике
	
	local amount = math.min(has, free_space) -- сколько переливаем
	-- меняем количества в бутыльках
	self.objects[_where].weight = self.objects[_where].weight + amount
	self.objects[_from].weight = self.objects[_from].weight - amount
	
	-- создаем виджет с количеством жидкости для одного бутылька
	if self.objects[_where].fill_image then -- удаляем старый виджет
		_owner.RemoveWidget(self.objects[_where].fill_image)
		self.objects[_where].fill_image = nil
	end
	if self.objects[_where].weight < 0 then -- создаем новый
		self.objects[_where].weight = 0
	end
	local fill =  self.CreateFillImage(_owner, _where, self.objects[_where].weight)
	self.objects[_where].fill_image = fill

	if self.objects[_where].label then
		self.objects[_where].label.SetText(tostring(self.objects[_where].weight))
	end
	
	-- создаем виджет с количеством жидкости для другого бутылька
	if self.objects[_from].fill_image then -- удаляем старый виджет
		_owner.RemoveWidget(self.objects[_from].fill_image)
		self.objects[_from].fill_image = nil
	end
	if self.objects[_from].weight < 0 then -- создаем новый
		self.objects[_from].weight = 0
	end
	local fill =  self.CreateFillImage(_owner, _from, self.objects[_from].weight)
	self.objects[_from].fill_image = fill

	if self.objects[_from].label then
		self.objects[_from].label.SetText(tostring(self.objects[_from].weight))
	end
end 
-- создает для бутылька _num виджет с заполнением бутылька на _amount 
function self.CreateFillImage(_owner, _num, _amount)
	local id = self.params.bottles[_num].id
	if _amount < 10 then
		id = id .. 0
	end
	id = id .. _amount
	local fill =  sf.gui.CImageWidget(id, "", 2, 0)
	local cur_x = self.params.bottles[_num].pos.X
	local cur_y = self.params.bottles[_num].pos.Y
	fill.SetOffset(cur_x, cur_y)
	_owner.AddWidget(fill)
	
	return fill
end 

-- пересчитывает сумму бутыльков на весах
function self.CountSum(_owner)
	self.sum = 0
	for i = 1, #self.objects do
		if self.objects[i].sum then
			self.sum = self.sum + self.objects[i].weight
		end
	end
	
	self.weight_widget.SetText("  "..self.sum.."  ")
	
	-- устанавливаем картиночки для циферок на весах в нужных местах
	local tens = math.floor(self.sum / 10)
	local ones = self.sum % 10
	
	self.RemoveNumWidgets(_owner)
	local widg = sf.gui.CImageWidget(self.params.weight_num_id..ones, "", 0, 0)
	widg.SetOffset(self.params.weight_number_pos[1].X, self.params.weight_number_pos[1].Y)
	_owner.AddWidget(widg)
	table.insert(self.numbers, widg)
	if tens > 0 then
		local widg1 = sf.gui.CImageWidget(self.params.weight_num_id..tens, "", 0, 0)
		widg1.SetOffset(self.params.weight_number_pos[2].X, self.params.weight_number_pos[2].Y)
		_owner.AddWidget(widg1)
		table.insert(self.numbers, widg1)
	end
	
end 
-- удаляет циферки
function self.RemoveNumWidgets(_owner)
	local n = #self.numbers
	while n > 0 do
		_owner.RemoveWidget(self.numbers[n])
		table.remove(self.numbers, n)
		n = n - 1
	end
end
-- вызывается перед рестартом игры
function self.RemoveFillWidgets(_owner)
	for i = 1, #self.objects do
		if self.objects[i].fill_image then
			_owner.RemoveWidget(self.objects[i].fill_image)
			self.objects[i].fill_image = nil
		end
	end
	
	self.RemoveNumWidgets(_owner)
end 