import java.util.Hashtable;
import java.awt.Image;
import java.awt.Color;

class AnimatedSprite extends Sprite
{
	private Hashtable tracks;
	private String state;
	private int ticksRemaining;
	private int speed;
	private int lifetime;
	private Track currentTrack;
	private Raster currentRaster;
	
	AnimatedSprite ()
	{
		super();
		tracks = new Hashtable(1);
	};
		
	AnimatedSprite (Image[] images, int sp, int life)
	{
		super(images[0]);
		speed = sp;		
		tracks = new Hashtable(1);
		currentTrack = new Track(images);
		tracks.put("default", currentTrack);
	};
	
	public void addTrack (String name, Track track)
	{
		tracks.put(name, track);
	};
	
	public void setState (String name)
	{
		currentTrack = (Track)tracks.get(name);
		state = name;
		currentTrack.reset();
	};
	
	public boolean clockTick (Sprite magnet)
	//Returns true if the sprite has finished its lifetime
	{
		int dx = x - magnet.x;
		int dy = y - magnet.y;
		double norm = Math.sqrt(dx*dx+dy*dy);
		dx = (int)(dx*3/norm);
		dy = (int)(dy*3/norm);
		x -= dx;
		y -= dy;		
		if (--lifetime==0)
			return true;
		else if (--ticksRemaining<=0)
		{
			currentTrack.nextFrame();
			currentRaster = currentTrack.getFrame();
			ticksRemaining = speed;
		};
		return false;
	};
	
	public boolean draw(Raster background)
	{
		//take snapshots of x and y, since they will change if the mouse
		//is moved during the execution of this procedure. This saves me
		//from having to use semaphores or something.
		int ySnap = y; 
		int xSnap = x;
		int maxX = background.getWidth();
		int maxY = background.getHeight();
		int Xhi = Math.min(maxX-xSnap,width);
		int Yhi = Math.min(maxY-ySnap,height);
		int Xlo = xSnap<0 ? -xSnap: 0;
		int Ylo = ySnap<0 ? -ySnap: 0;
		Color c;
		for (int i=Xlo; i<Xhi; i++)
			for (int j=Ylo; j<Yhi; j++)
			{
				c = currentRaster.getColor(i,j);
				if (!c.equals(trans))
					background.setColor(c,xSnap+i,ySnap+j);
			};
		return (true);
	};
	
};