--[[Игра "Проявление картинки"]]

reveal_image = {}

local self = reveal_image

self.params = {
	piece_id = "piece", -- id картинки с частью рисунка (dsfrontend)
	speed = 5, -- скорость проявления картинок
	min_alpha = 100, -- минимальное значение альфы, при котором картинка считается проявленной
	neighbour_alpha = 5, -- на сколько увеличивается альфа у соседей
	cursor = "scenes_chapter02_scene04_minigame_coal", -- id  картинки для курсора (не из dsfrontend, а полное название из resources.xml)
	cursor_height = 40, -- высота курсора
	cursor_width = 60, -- ширина курсора
	--clip = "coal_dust", -- id клипа с эффектом пыли от угля
	particle_to_stay = "", -- партикля от угля, которая остается
	particle_main = "EffectOnDraw",--"TakeObject", -- партикля от угля, которая 
	tail_fade_time = 200, -- сколько держится хвост
	particle_to_stay_shift = sf.misc.FloatVector(-160, -140), -- смещение
	particle_main_shift = sf.misc.FloatVector(-160, -140), -- смещение
	
	sound_id = "crumble_coal_write", 
	positions = { -- позиции кусков проявляемой картинки и номера соседних кусков
		{X = 147, Y = 44, neighbour = {2, 8} }, -- piece01
		{X = 192, Y = 41, neighbour = {1, 7}}, -- piece02
		{X = 451, Y = 53, neighbour = {2, 5, 4, 9}}, -- piece03
		{X = 541, Y = 132, neighbour = {3, 9, 14}}, -- piece04
		{X = 366, Y = 94, neighbour = {3, 6, 10}}, -- piece05  
		{X = 279, Y = 85, neighbour = {5, 7, 11}}, -- piece06 
		{X = 191, Y = 85, neighbour = {6, 2, 8, 12}}, -- piece07
		{X = 105, Y = 85, neighbour = {1, 7, 13}}, -- piece08
		{X = 454, Y = 173, neighbour = {3, 4, 14, 10}}, -- piece09 
		{X = 366, Y = 170, neighbour = {9, 5, 11, 15}}, -- piece010
		
		{X = 278, Y = 173, neighbour = {10, 16, 6, 12}}, -- piece011
		{X = 190, Y = 173, neighbour = {11, 7, 17, 13}}, -- piece012
		{X = 131, Y = 173, neighbour = {12, 8, 18}}, -- piece013
		{X = 455, Y = 261, neighbour = {4, 9, 15}}, -- piece014
		{X = 366, Y = 259, neighbour = {14, 16, 10}}, -- piece015
		{X = 279, Y = 260, neighbour = {15, 17, 11}}, -- piece016
		{X = 191, Y = 261, neighbour = {18, 16, 12}}, -- piece017
		{X = 125, Y = 261, neighbour = {17, 13}}  -- piece018
	}
}

------ луа виджет для эффектов
reveal_image_effects = reveal_image_effects or {}

__inherite(reveal_image_effects, null_lua_widget_handler()) --default_lua_widget_handler

local effects = reveal_image_effects

function effects.__CreateInstance()
    return "reveal_image_effects"
end

function effects.DoUpdate(_this)
	if  sf.core.g_Application.GetTimeManager().GetTimer(_T("qe_level")).GetK() < 0.01 then
		return
	end
	
	if effects.effects_list then
		effects.effects_list:Update()
		local now = self.timer.Get().GetTime()
		for i, eff in ipairs(effects.effects_manage_table) do
			-- убиваем старые эффекты
			if not eff.drag and eff.main then
				if ( now - eff.start) >= self.params.tail_fade_time  then
					eff.effect:Kill(true)
					eff.dead = true
				end				
			end
		end
		if self.dragging > 0 then
			local pos = sf.gui.g_Cursor.Instance().GetPosition()
			for i, eff in ipairs(effects.effects_manage_table) do
			-- тащим тот эффект, который еще тянется
				if eff.drag then
					eff.effect:SetPos( self.params.particle_main_shift +sf.misc.FloatVector(pos.X, pos.Y))
				end
			end
		else
			for i, eff in ipairs(effects.effects_manage_table) do
			-- отменяем, что мы тащим эти эффекты
				if eff.drag then
					eff.drag = false
					eff.start = now
				end
			end
		end
		local i, n = 1, #effects.effects_manage_table 
		while i <= n do
			if effects.effects_manage_table[i].dead then
				table.remove(effects.effects_manage_table, i)
				n = n - 1
			else
				i = i + 1
			end
		end
		
	end
    return true
end

function effects.DoDraw(_this, _renderer)
	if effects.effects_list then
		effects.effects_list:PreDraw(_renderer)
		effects.effects_list:PostDraw(_renderer)
	end
    return true
end


function effects.CreateEffectTail(_pos1)
--__message("checkpoint 1")
	local pos = self.params.particle_main_shift + sf.misc.FloatVector(_pos1.X, _pos1.Y)
	if self.params.particle_main and self.params.particle_main ~= "" then
		local eff = effects.effects_list:CreateEffect(self.params.particle_main, pos)
	--__message("checkpoint 2")
		local now = self.timer.Get().GetTime()
	
		table.insert(effects.effects_manage_table, {effect = eff, drag = true, main = true})
	end
	if self.params.particle_to_stay and self.params.particle_to_stay ~= "" then
		local pos1 = self.params.particle_to_stay_shift + sf.misc.FloatVector(_pos1.X, _pos1.Y)
		local eff = effects.effects_list:CreateEffect(self.params.particle_to_stay, pos1)
		--__message("checkpoint 2")
		local now = self.timer.Get().GetTime()
	
		table.insert(effects.effects_manage_table, {effect = eff, drag = true})
	end
end

------ эффекты закончились
function self.Init(_owner)
	sminigames.SetStandartScriptName(_owner, reveal_image) 
	
	self.LoadInfo(_owner)
	
	self.dragging = -1 -- тащим? 
end

function self.LoadInfo(_owner)
	self.pieces = {}
	for i = 1, #self.params.positions do
		local widget = __cast(_owner.GetWidget(self.params.piece_id..i, true), sf.gui.CImageWidget)
		__assert(widget, "Нет виджета в dsfrontend: "..self.params.piece_id..i)
		widget.SetOffset(self.params.positions[i].X, self.params.positions[i].Y)
		local color = sf.graphics.Color(widget.GetColor())
		color.Alpha = 0
		widget.SetColor(color)
		
		table.insert(self.pieces, widget)
	end
	
	self.timer = __create_timer("", "qe_level")
	
	effects.effects_list = visual_effects.CreateEffectsList()
	effects.effects_manage_table = {}
end
-- начинаем событие drag-and-drop
function self.OnMouseDown(_owner, _pos, _button, _keyboard_state, _broadcast)
	self.dragging = 1
	
	self.OnMouseMove(_owner, _pos, _keyboard_state, _broadcast)
	effects.CreateEffectTail(_pos)
	return true
end 
-- заканчиваем событие drag-and-drop
function self.OnMouseUp(_owner, _pos, _button, _keyboard_state, _broadcast)
	self.dragging = -1

	return true
end 
-- должен проверить, не тащимся ли мы по объекту, и если так, то надо увеличить его альфу
function self.OnMouseMove(_owner, _pos, _keyboard_state, _broadcast)
	if self.win then
		return true
	end

	local cursor = sf.gui.CImageWidget(self.params.cursor, "cursor", 1, 0)
	if cursor then
		sf.gui.g_Cursor.Instance().SetCustomCursor(cursor.GetImage().GetTexture())
	end
	
	if self.dragging < 0 then return false end
	if self.params.sound_id then
		sound(self.params.sound_id)
	end

	local ind = self.IsPiece(_pos)
	if ind then
		local color = sf.graphics.Color(self.pieces[ind].GetColor())
		color.Alpha = color.Alpha + self.params.speed
		if color.Alpha > 255 then
			color.Alpha = 255
		end
		self.pieces[ind].SetColor(color)
		-- меняем альфу у соседей
		for i= 1, #self.params.positions[ind].neighbour do
			local index = self.params.positions[ind].neighbour[i]
			local color = sf.graphics.Color(self.pieces[index].GetColor())
			color.Alpha = color.Alpha + self.params.neighbour_alpha
			if color.Alpha > 255 then
				color.Alpha = 255
			end
			self.pieces[index].SetColor(color)
		end
		self.CheckEnd(_owner)
	end
	local sz = _owner.GetSize()
	if _pos.X <= 20 or _pos.Y <= 10 or _pos.X >= sz.X-20 or _pos.Y >= sz.Y-20 then
		self.dragging = -1
	end
	
	return true 
end 
-- возвращает элемент, на который сейчас указываем
function self.IsPiece(_pos)
	for i = 1, #self.pieces do
		if  misc.GetRect(self.pieces[i]).IsContains(_pos.X, _pos.Y) 
			and sminigames.IsVisiblePoint(self.pieces[i].GetImage(), 
										_pos.X - self.pieces[i].GetOffset().X, 
										_pos.Y - self.pieces[i].GetOffset().Y) then
				return i				
		end
	end
	return nil
end 

function self.CheckEnd(_owner)
	for i = 1, #self.pieces do
		local color = sf.graphics.Color(self.pieces[i].GetColor())
		if color.Alpha < self.params.min_alpha then
			return false
		end
	end 
	self.win = true
	_owner.SetGameResult(1)
	_owner.OnEndGame()
	return true
end 



