 /**
  *  GameSprite contains the Sprite class for the Epsilon game.
  *  Epsilon is a simple space-shooter-vertical-scroller game.
  *
  *  Epsilon is available for non-commercial use only!
  *  You can learn from this sources and you can modify them
  *  for learning purposes.
  * 
  *  @author      Ziga Hajdukovic
  *  @version     1.0
  *  
  *  
  *  CHANGES
  *  + frameId
  *  + frameIdMax
  *  + imageId replaced Image object
  *  + spriteImageFrameWidths[]
  *  
  */  

class GameSprite {

	//  used for all x,y and vx,vy
	public static final byte SHIFT_FACTOR = 4;
	
	public int x;
	public int y;
	
	public int w;
	public int h;
	
	public int vx;
	public int vy;
	
	public short energy;
	public short energyMax;
	
	public short damage;
	public short score;

	public byte spriteId;

	public byte imageId;
	
	public byte frameId;
	public byte frameIdMax;

	public byte fire_cooldown_frames_counter;
	
	public boolean visible;
	
	//public byte spriteId;
	
	public static final byte[] spriteImageFrameWidths =
	{
		26,	// SPRITE_IMAGE_PLAYER
		 4, // SPRITE_IMAGE_FIRE
		45, // SPRITE_IMAGE_BOSS1
		47, // SPRITE_IMAGE_BOSS2
		20, // SPRITE_IMAGE_ENEMY1
		20, // SPRITE_IMAGE_ENEMY2
		20, // SPRITE_IMAGE_ENEMY3
		16, // SPRITE_IMAGE_ENEMY4
		20, // SPRITE_IMAGE_EXPLOSION
	};

	public static final byte SPRITE_DATA_INDEX_IMG_ID = 0;
	public static final byte SPRITE_DATA_INDEX_MAX_ENERGY = 1;
	public static final byte SPRITE_DATA_INDEX_DAMAGE = 2;
	public static final byte SPRITE_DATA_INDEX_SCORE = 3;
	
	// spriteData[sprite_id][data_index],  image_id, energyMax, damage, score
	public static final short[][] spriteData = {
		{ GameCanvas.SPRITE_IMAGE_PLAYER, 200, 20, 0 },		//	SPRITE_ID_PLAYER
		{ GameCanvas.SPRITE_IMAGE_ENEMY1, 40, 30, 20 },		//	SPRITE_ID_ENEMY1
		{ GameCanvas.SPRITE_IMAGE_ENEMY1, 40, 30, 40 },		//	SPRITE_ID_ENEMY1_SHOOTING
		{ GameCanvas.SPRITE_IMAGE_ENEMY2, 20, 20, 10 },		//	SPRITE_ID_ENEMY3
		{ GameCanvas.SPRITE_IMAGE_ENEMY2, 20, 20, 20 },		//	SPRITE_ID_ENEMY2_SHOOTING
		{ GameCanvas.SPRITE_IMAGE_ENEMY3, 60, 40, 30 },		//	SPRITE_ID_ENEMY3
		{ GameCanvas.SPRITE_IMAGE_ENEMY3, 60, 40, 60 },		//	SPRITE_ID_ENEMY3_SINUS
		{ GameCanvas.SPRITE_IMAGE_ENEMY3, 60, 20,100 },		//	SPRITE_ID_ENEMY3_SINUS_SHOOTING
		{ GameCanvas.SPRITE_IMAGE_ENEMY4, 40, 20, 20 },		//	SPRITE_ID_ENEMY4_SHOOTING
		{ GameCanvas.SPRITE_IMAGE_BOSS1, 500, 100, 100 },	//	SPRITE_ID_BOSS1
		{ GameCanvas.SPRITE_IMAGE_BOSS2, 750, 100, 300 },	//	SPRITE_ID_BOSS2
		{ GameCanvas.SPRITE_IMAGE_EXPLOSION, 0, 0, 0 },		//	SPRITE_ID_EXPLOSION
		{ GameCanvas.SPRITE_IMAGE_FIRE, 0, 20, 0 },			//	SPRITE_ID_FIRE1  // player fire
		{ GameCanvas.SPRITE_IMAGE_FIRE, 0, 20, 0 },			//	SPRITE_ID_FIRE2  // blue fire
		{ GameCanvas.SPRITE_IMAGE_FIRE, 0, 10, 0 },			//	SPRITE_ID_FIRE3  // green round bullet
	};
	
	public static final byte EXPLOSION_FRAME_SMOKE_START = 2;

	GameSprite( byte sprite_id )
	{
		spriteId = sprite_id;
		imageId = (byte) spriteData[sprite_id][SPRITE_DATA_INDEX_IMG_ID];
		w = spriteImageFrameWidths[imageId];
		h = GameCanvas.spriteImages[imageId].getHeight();
		frameId = 0;
		frameIdMax = (byte) (GameCanvas.spriteImages[imageId].getWidth() / w - 1);
		vx = 4 << SHIFT_FACTOR;
		vy = 4 << SHIFT_FACTOR;
		energyMax = spriteData[sprite_id][SPRITE_DATA_INDEX_MAX_ENERGY];;
		energy = energyMax;

		damage = (byte) spriteData[sprite_id][SPRITE_DATA_INDEX_DAMAGE];
		score = (byte) spriteData[sprite_id][SPRITE_DATA_INDEX_SCORE];
		
		// optimization
		visible = false;
	}

	public boolean collidesWith(GameSprite sprite)
	{
		return (x+(w << GameSprite.SHIFT_FACTOR) > sprite.x) && (x < sprite.x + (sprite.w << GameSprite.SHIFT_FACTOR)) &&
			   (y+(h << GameSprite.SHIFT_FACTOR) > sprite.y) && (y < sprite.y + (sprite.h << GameSprite.SHIFT_FACTOR));
	}
}

