namespace UnluckSoftware
{
	using UnityEngine;
	using System.Collections;

	public class ParticleSystemSound :MonoBehaviour
	{
		public AudioClip[] _shootSound;

		public float _shootPitchMin = 0.75f;
		public float _shootPitchMax = 1.25f;
		public float _shootVolumeMin = 0.25f;
		public float _shootVolumeMax = 0.75f;

		public AudioClip[] _explosionSound;
		public float _explosionPitchMin = 0.75f;
		public float _explosionPitchMax = 1.25f;
		public float _explosionVolumeMin = 0.25f;
		public float _explosionVolumeMax = 0.75f;

		public AudioClip[] _crackleSound;
		public float _crackleDelay = .25f;
		public int _crackleMultiplier = 3;
		public float _cracklePitchMin = 0.75f;
		public float _cracklePitchMax = 1.25f;
		public float _crackleVolumeMin = 0.25f;
		public float _crackleVolumeMax = 0.75f;

		ParticleSystem.Particle[] _particles;
		ParticleSystem _particleSystem;

		bool explodeSoundEnabled = true;
		bool shootSoundEnabled = true;

		private void Start()
		{
			_particleSystem = GetComponent<ParticleSystem>();
			if (SoundController.instance == null)
			{
				GameObject sc;
				sc = new GameObject();
				sc.AddComponent<SoundController>();
				sc.name = "Unluck Software Sound Controller";
			}
		}

		private void LateUpdate()
		{
			if (_particles == null || _particles.Length < _particleSystem.main.maxParticles)
			{
				_particles = new ParticleSystem.Particle[_particleSystem.main.maxParticles];
			}
			int length = _particleSystem.GetParticles(_particles);
			int i = 0;
			while (i < length)
			{
				if (explodeSoundEnabled && _explosionSound.Length > 0 && _particles[i].remainingLifetime < Time.deltaTime * 3f)
				{
					explodeSoundEnabled = false;
					Invoke("EnableExplode", 0.05f);
					int r = UnityEngine.Random.Range(0, _explosionSound.Length);
					SoundController.instance.Play(_explosionSound[r], UnityEngine.Random.Range(_explosionVolumeMax, _explosionVolumeMin), UnityEngine.Random.Range(_explosionPitchMin, _explosionPitchMax), _particles[i].position);
					if (_crackleSound.Length > 0)
					{
						for (int j = 0; j < _crackleMultiplier; j++)
						{
							StartCoroutine(Crackle(_particles[i].position, _crackleDelay + j * .1f));
						}
					}
				}
				if (shootSoundEnabled && _shootSound.Length > 0 && _particles[i].remainingLifetime >= _particles[i].startLifetime - Time.deltaTime)
				{
					shootSoundEnabled = false;
					Invoke("EnableShoot", 0.05f);
					SoundController.instance.Play(_shootSound[UnityEngine.Random.Range(0, _shootSound.Length)], UnityEngine.Random.Range(_shootVolumeMax, _shootVolumeMin), UnityEngine.Random.Range(_shootPitchMin, _shootPitchMax), _particles[i].position);
				}
				i++;
			}
		}


		void EnableShoot()
		{
			shootSoundEnabled = true;
		}

		void EnableExplode()
		{
			explodeSoundEnabled = true;
		}

		public IEnumerator Crackle(Vector3 pos, float delay)
		{
			yield return new WaitForSeconds(delay);
			SoundController.instance.Play(_crackleSound[UnityEngine.Random.Range(0, _crackleSound.Length)], UnityEngine.Random.Range(_crackleVolumeMax, _crackleVolumeMin), UnityEngine.Random.Range(_cracklePitchMax, _cracklePitchMin), pos);
		}
	}
}
