
.namespace SpriteZoom

---------------------------copier coller de "progressive action"-------------------------------------------------------
CurrentAction={}
TIMER=0.03 --valeur que l'on peut changer aprés, selon la fluidité
g_timer = nil

function Act() --function spécifique à chaque script
	return
end

function CheckEnd()
	return false
end

function Finish()

end

function StartTimer()
    g_timer=GlobalFunctions.CreateTimerSystem(self.Name,TIMER,false,true,false, self)
    g_timer.Enabled=true
    g_timer.Start()
	self.CanTimeOut=true
end

--a appelé lors du lancement
function CheckTimer()
	if g_timer == nil then
		StartTimer()
	end
end

function OnUpdateUnit()

end

function OnUpdate(dt)
	self.CanTimeOut=true
	OnUpdateUnit(dt)
end

function OnTimeOut()

	if self.CanTimeOut then
		if CurrentAction==nil then
			OPLog.Log('erreur ! CurrentAction=nil '..self.Name)
		end
		if table.getn(CurrentAction) == 0 then
			OPUnitFactory.CloseUnit(g_timer)
			g_timer = nil
		end
		
		for u,action in pairs(CurrentAction) do
			if not CheckEnd(action) then
				newact = Act(action)
				if newact~=nil then
					CurrentAction[u] = newact
				end
			else
				table.remove(CurrentAction,u)
				Finish(action)
			end
		end
		self.CanTimeOut=false
	end
end

--------------------------------------------------------------------------

--on utilise les vecteurs 2d
function Zoom(ut,scaleaim,length,utnotify,refpos)
	--out : si true fade out, on revient au visible
	--refpos est la position de référencequand on déplace le zoom
	CheckTimer()
	
    local action={}
	
	if refpos == nil then
		refpos = Vector:new(ut)
	end	
	
    --on vérifie d'abord si cette unit n'est pas dans la liste des move--
    for u,v in pairs(CurrentAction) do
        if v.ut.Name==ut.Name and v.channel==channel then
            v.scaleaim=scaleaim
            v.utnotify=utnotify
			v.ut=ut
			v.length=length
			v.initpos = refpos
			v.scalestart = ut.Scale_X
            return true
        end
    end
    
	action.scalestart = ut.Scale_X
	action.scaleaim=scaleaim
	action.utnotify=utnotify
	action.ut=ut
	action.length=length
	action.initpos = refpos
	action.starttime = OPTime.GetTime()
	
    table.insert(CurrentAction,action)
	
	CheckTimer()
end

function Act(action)
	-- on zoom par rapport au centre
	
	local coeff = (OPTime.GetTime() - action.starttime) / action.length
	
	action.ut.Scale_X = coeff * action.scaleaim + (1-coeff) * action.scalestart
	action.ut.Scale_Y = action.ut.Scale_X
	action.ut.Position_X = action.initpos.x + (1-action.ut.Scale_X)/2*action.ut.Dimension_Width
	action.ut.Position_Y = action.initpos.y + (1-action.ut.Scale_Y)/2*action.ut.Dimension_Height
	--OPLog.Log("zoom "..action.ut.Name.." "..action.ut.Scale_X)
end

function CheckEnd(action)
	local coeff = (OPTime.GetTime() - action.starttime) / action.length
	
	if coeff > 1 then
		return true
	end
	return false
end

function Finish(action)
	if action.utnotify~=nil and action.utnotify.OnZoomEnd ~= nil then
		action.utnotify.OnZoomEnd(action.ut)
	end
end

function Stop(name)
	for u,action in pairs(CurrentAction) do
		if action.ut.Name == name then
			table.remove(CurrentAction,u)
		end
	end
end
