/*
 * Copyright (c) 2000 Mark B. Allan. All rights reserved.
 *
 * "Chromium B.S.U." is free software; you can redistribute
 * it and/or use it and/or modify it under the terms of the
 * "Clarified Artistic License"
 */
#ifndef Explosions_h
#define Explosions_h

#ifdef HAVE_CONFIG_H
#include <chromium-bsu-config.h>
#endif

#include "compatibility.h"

#if defined(HAVE_APPLE_OPENGL_FRAMEWORK) || defined(HAVE_OPENGL_GL_H)
#include <OpenGL/gl.h>
#else
#include <GL/gl.h>
#endif

class Global;
class Explo;

//====================================================================
class Explosions
{
public:
	enum ExploType {	EnemyDestroyed, EnemyDamage,
						EnemyAmmo00, EnemyAmmo01, EnemyAmmo02, EnemyAmmo03, EnemyAmmo04,
						HeroDestroyed, HeroDamage,
						HeroAmmo00, HeroAmmo01, HeroAmmo02,
						HeroShields,
						PowerBurst,
						AddLife, LoseLife, ScoreLife,
						Electric, Glitter,
						NumExploTypes };
	Explosions();
	~Explosions();

	Explo	*addExplo(ExploType t, float p[3], int age = 0, float size = 1.0);
	Explo	*addElectric(float p[3], float v[3], float clr[4], int age = 0, float size = 1.0);
	Explo	*addGlitter(float p[3], float v[3], float clr[4], int age = 0, float size = 1.0);

	void	update();
	void	drawGL();
	void	clear();

	void	loadTextures();
	void	deleteTextures();

private:
	Explo	*exploRoot[NumExploTypes];
	Explo	*exploPool;
	GLuint	tex[NumExploTypes];
	float	exploSize[NumExploTypes][2];
	float	exploStay[NumExploTypes];
	float	exploPause[NumExploTypes][3];	/**< # frames to not allow explosions. [0] = count, [1] = base, [2] = flag */

	void	drawExplo(ExploType);
	void	drawAmmo(ExploType);
	void	drawBurst(ExploType);
	void	drawShields(ExploType);
	void	drawLife(ExploType);
	void	drawElectric(ExploType);
	void	drawGlitter(ExploType);

	Explo	*getNewExplo();
	void 	killExplo(Explo *dead);

private:
	Global	*game;
};

//====================================================================
class Explo
{
public:
	Explo();
	~Explo();

	void	init(float p[3], int a = 0, float s = 1.0);
	void	init(float p[3], float v[3], float c[4], int a = 0, float s = 1.0);

	float	pos[3];
	float	vel[3];
	float	clr[4];
	int		age;
	float	size;

	Explo *back;
	Explo *next;

private:
	static int exploCount;
};

#endif // Explosions_h
