import java.applet.*;
import java.awt.*;
import java.net.*;

public class spriteAp extends Applet implements Runnable
{
    Thread animate;
    Playfield playfield;
    Image output;
    
    
    boolean clintonGrab;
    AudioClip win;
    AudioClip lose;
    int slide;
    int clinton = 0;
    int hillary = 1;
    int monica = 2;
    int gingrich = 3;
    
    public void init()
    {
        int numSprites;
        int numAnimSprites;
        Image background;
        URL url;
        
        
        
        slide = -1;
        
        url = getCodeBase();
        background = getImage(url,getParameter("background"));
        numSprites = Integer.parseInt(getParameter("numSprites"));
        numAnimSprites = Integer.parseInt(getParameter("numAnimSprites"));
        playfield = new Playfield(background, numSprites, numAnimSprites);
        clintonGrab = false;
        win = getAudioClip(url,"win.au");
        lose = getAudioClip(url,"doh.au");
        for (int i=0;i<numSprites;i++)
        {
            int r = Integer.parseInt(getParameter("image"+i+"r"));
            int g = Integer.parseInt(getParameter("image"+i+"g"));
            int b = Integer.parseInt(getParameter("image"+i+"b"));
            Color trans = new Color(r,g,b);
            Sprite temp = new Sprite(getImage(url,getParameter("image"+i)),trans);
            playfield.addSprite(i,temp);
        }
        
        //place all the sprites
        playfield.sprite[clinton].x = 0;
        playfield.sprite[clinton].y = 125;
        
        playfield.sprite[hillary].x = 20;
        playfield.sprite[hillary].y = 40;
        
        playfield.sprite[monica].x = 100;
        playfield.sprite[monica].y = 75;
        
        playfield.sprite[gingrich].x =90;
        playfield.sprite[gingrich].y = 140;
        
        for (int i=0;i<numAnimSprites;i++)
        {
            int r = Integer.parseInt(getParameter("anim"+i+"r"));
            int g = Integer.parseInt(getParameter("anim"+i+"g"));
            int b = Integer.parseInt(getParameter("anim"+i+"b"));
            System.out.println("rgb is "+r+" "+g+" "+b);
            Color trans = new Color(r,g,b);
            int frames = Integer.parseInt(getParameter("frames"+i));
            System.out.println("frames is "+frames);
            Image img = getImage(url,getParameter("anim"+i+"0"));
            AnimatedSprite temp = new AnimatedSprite(img,frames,trans);
            for (int j=1;j<frames;j++)
            {
                img = getImage(url,getParameter("anim"+i+""+j));
                temp.addState(j,img,0,0);//no movement in this animation
            }
            playfield.addAnimSprite(i,temp);
        }
        renderPlayfield();
    }
    
    public void start() {
        animate = new Thread(this);
        animate.start();
    }

    public void stop() {
        animate = null;
    }
    
    public boolean mouseDown(Event evt,int x,int y)
    {
        if (clintonGrab)
        {clintonGrab = false;}
        
        else if (playfield.topSprite(x,y)==0)
        {
            System.out.println("clinton is grabbed");
            clintonGrab=true;
        }
        return true;
    }
    
    public boolean mouseMove(Event evt,int x,int y)
    {
        if ((playfield.overlap(clinton,hillary))
            ||(playfield.overlap(clinton,gingrich))
            ||(playfield.overlap(clinton,monica)))
        {
            lose.play();
        }
        
        if (clintonGrab)
        {
            playfield.sprite[0].x = x;
            playfield.sprite[0].y = y;
            if ((x>130)&&(y<50))
            {
                win.play();
            }
            renderPlayfield();
        }
        
        return true;
    }
    
    public boolean mouseUp(Event evt,int x,int y)
    {
        int top = playfield.topSprite(x,y);
        if (!(top==0))
        {
            slide=top;
        }
        return true;
    }
              
    public void run() {
        while (true) {
            try {
                    animate.sleep(100);
                } catch (InterruptedException e) {
                }
                      renderPlayfield();
        }
    }
    
    public void renderPlayfield()
    {
        if (!(slide==-1))
        {
            playfield.sprite[slide].x-=10;
            if (playfield.sprite[slide].x<-playfield.sprite[slide].width)
            {
                slide=-1;
            }
        }
        
        
        playfield.Draw();
        output = playfield.toImage();
        playfield.nextState();
        repaint();
    }
    
    public void paint(Graphics g)
    {
        g.drawImage(output,0,0,this);
    }
    
    public void update(Graphics g)
    {
        paint(g);
    }
}