-- $Id: Sound.lua 3171 2008-11-06 09:06:29Z det $
-----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------

local Sound = {}
Sound.__index = Sound

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

function Sound.GetInfo()
	return {
		name      = "Sound",
		backup    = "",
		desc      = "Plays '.wav'-files",
		layer     = 0,
	}
end

Sound.Default = {
	layer = 0,
	worldspace = true,

	file   = '',
	volume = 1.0,
	pos    = nil, --{0,0,0}
	blockfor = 55, --//in gameframes. used to block the sound for a specific amount of time (-> don't oversample the sound)
	length = 60,

	unit   = -1,

	repeatEffect = false,
	dieGameFrame = math.huge
}

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

local lastPlayed = {}

function Sound:Valid()
	return true
end

function Sound:ReInitialize()
	self:CreateParticle()
end

function Sound:CreateParticle()
	--// play sound and exit
	local pos    = self.pos

	if (self.unit) then
		local losState = Spring.GetUnitLosState(self.unit,LocalAllyTeamID) or {}
		if not(losState and losState.los) then return false end
		pos = {Spring.GetUnitPosition(self.unit)}
	end

	if (self.file) then
		if (thisGameFrame>(lastPlayed[self.file] or 0)) then  --// is the sound blocked?
			lastPlayed[self.file] = thisGameFrame + self.blockfor
			if (pos) then
				Spring.PlaySoundFile(self.file,self.volume,pos[1],pos[2],pos[3], 'sfx')
			else
				Spring.PlaySoundFile(self.file,self.volume, 'sfx')
			end
		end
	end

	self.dieGameFrame = Spring.GetGameFrame() + self.length
end

function Sound.Create(Options)
	local newObject = MergeTable(Options, Sound.Default)
	setmetatable(newObject,Sound)  -- make handle lookup
	newObject:CreateParticle()
	if (not newObject.repeatEffect) then
		--// destroy object
		return false
	end
	return newObject
end


function Sound:Destroy()
end

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

return Sound
