/*
	A basic extension of the java.applet.Applet class
 */

import java.awt.*;
import java.applet.*;

//import java.awt.image.*;

public class kenny extends Applet implements Runnable
{
    
    // Background Raster
    Playfield backGround, screenRaster;
    
    // sprites used
    kennyClass kennySprite;
    anvilClass anvilSprite;
    Sprite iconOn, iconOff;
    
    // "They killed kenny..."
    AudioClip killedKenny;
    
    //keeps tracks of ehwat keys are pressed
    boolean kbLeft = false, kbRight = false;
    
    Thread gT = new Thread(this);
    
    
    // Master Image to speed paint() calls, holds the image version of
    // screen Raster
    Image masterImage;
    
    // temp variables for debugging
    int x = 100;
    int y = 100;
    
    // constants for position of icons
    final int iconx = 380;
    final int icony = 331;
    
	public void init()
	{
		// Take out this line if you don't use symantec.itools.net.RelativeURL or symantec.itools.awt.util.StatusScroller
		// symantec.itools.lang.Context.setApplet(this);

		// This code is automatically generated by Visual Cafe when you add
		// components to the visual environment. It instantiates and initializes
		// the components. To modify the code, only use code syntax that matches
		// what Visual Cafe can generate, or Visual Cafe may be unable to back
		// parse your Java file into its visual environment.
		//{{INIT_CONTROLS
		setLayout(null);
		setSize(500,400);
		//}}
		
		// Set the cursor... CROSSHAIR_CURSOR
		setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
				
		// Download images into Applet, and put into relevent classes
		Image tmpImg = getImage(getCodeBase(), "back.jpg");
		//backGround = new Playfield(tmpImg);
		screenRaster = new Playfield(tmpImg);
		
		tmpImg = getImage(getCodeBase(), "kenny.gif");
		kennySprite = new kennyClass(tmpImg);
		
		// init sound
		killedKenny = getAudioClip(getCodeBase(), "killken.au");
		
		// kenny's head
		tmpImg = getImage(getCodeBase(), "head.gif");
		kennySprite.setDead(new Sprite(tmpImg), killedKenny);
		kennySprite.setManual(false);
		
		// anvil
		tmpImg = getImage(getCodeBase(), "anvil.gif");
		anvilSprite = new anvilClass(tmpImg);
		
		// initialze kenny onto playfield
		screenRaster.putSprite(kennySprite, 200, 200);
		screenRaster.setFloor(280);
		
		// on/off icon for computer control
		tmpImg = getImage(getCodeBase(), "icon.gif");
		iconOn = new Sprite(tmpImg);
		tmpImg = getImage(getCodeBase(), "icon2.gif");
		iconOff = new Sprite(tmpImg);
		screenRaster.putSprite(iconOn, iconx, icony);
		
		// initialzes masterimage from screenRaster for faster update
		masterImage = screenRaster.toImage(this);
		/*debug*/// masterImage = kennySprite.toImage(this);
		

		//{{REGISTER_LISTENERS
		SymMouse aSymMouse = new SymMouse();
		this.addMouseListener(aSymMouse);
		SymKey aSymKey = new SymKey();
		this.addKeyListener(aSymKey);
		//}}
		
		requestFocus();
		
		// start the Thread up!
		
		gT.start();

	}
	
	/**
	 * run method for game thread that handles game
	 * used Runnable implementation for simplicity
	 */
	public void run()
	{

	    while(true)
	    {
	        //kbChecks
	        if(kennySprite.isManual())
	        {
    	        if(kbLeft) kennySprite.xacc = -10;
    	        else if(kbRight) kennySprite.xacc = 10;
    	        else kennySprite.xacc = 0;
    	    }
	        
	        // this should be done in a playfield method
    	    try {
    	        if(kennySprite.getState() != Sprite.NON)
    	        {
    	            kennySprite.update(screenRaster);
    	        }
    	        if(anvilSprite.getState() != Sprite.NON)
    	        {
    	            anvilSprite.update(screenRaster);
    	        }
    	    } catch(Exception e) {
    	        System.out.println("Caught in run() " + e );
    	        Thread.dumpStack();
    	    }
    	        
    	    
    		masterImage = screenRaster.toImage(this);
    	    repaint();
    	    
    	    // Sleep and then repeat hopefully
    	    try {
    	        gT.sleep(100);
    	        gT.yield();
    	    } catch(Exception e) {
    	        System.out.println("Caught in run() " + e);
    	        return;
    	    }
	    }
	}

	
	public void paint(Graphics g)
	{
	    g.drawImage(masterImage, 0, 0, this);  
	    //g.drawImage(jpgimg, 0, 0, this);
	    //g.drawString("hello world", x += 10, y += 10);
	}
	
	public void update(Graphics g)
	{
	    paint(g);
	}

	//{{DECLARE_CONTROLS
	//}}

	class SymMouse extends java.awt.event.MouseAdapter
	{
		public void mousePressed(java.awt.event.MouseEvent event)
		{
			Object object = event.getSource();
			if (object == kenny.this)
				kenny_MousePressed(event);
		}
	}
	
	/* stops the applet
	 */
	public void stop()
	{
	    gT.stop();
	    super.stop();
	}
	
	// reinitializes after kenny has been killed
	// resets states, picks random starting position
	protected void reinit()
	{
	    kennySprite.setState(Sprite.REGULAR1);
	    double coin = java.lang.Math.random();
	    int ystart = (int)(150 + coin * 100);
	    coin = java.lang.Math.random();
	    int xstart = (int)(100 + coin * 300);
	    screenRaster.setFloor(ystart + kennySprite.height );
	    screenRaster.putSprite(kennySprite, xstart, ystart );
	    
	}


	void kenny_MousePressed(java.awt.event.MouseEvent event)
	{
		// to do: code goes here.
		
		if( kennySprite.getState() == Sprite.DEAD ||kennySprite.getState() == Sprite.DEAD2 )
		{
		    reinit();
		    return;
		}
		if( screenRaster.containsSprite(anvilSprite) )
		{
		    return;
		}
		
		anvilSprite.setState(Sprite.REGULAR1);
		int myX = event.getX() - (anvilSprite.width >> 1);
		int myY = 10;
		screenRaster.putSprite(anvilSprite, myX, myY);
		
		// initialzes masterimage from screenRaster for faster update
		// masterImage = screenRaster.toImage(this);
		/*debug*/// masterImage = kennySprite.toImage(this);
		
			 
		//{{CONNECTION
		//}}
	}

	class SymKey extends java.awt.event.KeyAdapter
	{
		public void keyReleased(java.awt.event.KeyEvent event)
		{
			Object object = event.getSource();
			if (object == kenny.this)
				kenny_KeyReleased(event);
		}

		public void keyTyped(java.awt.event.KeyEvent event)
		{
		    Object object = event.getSource();
			if (object == kenny.this)
				kenny_KeyTyped(event);
		}

		public void keyPressed(java.awt.event.KeyEvent event)
		{
			Object object = event.getSource();
			if (object == kenny.this)
				kenny_KeyPressed(event);
		}
	}

    // keyboard control of Kenny
	void kenny_KeyPressed(java.awt.event.KeyEvent event)
	{
		// to do: code goes here.
		
		if( event.getKeyCode() == event.VK_LEFT )
		{
		    kbLeft = true;
		}
		if( event.getKeyCode() == event.VK_RIGHT )
		{
		    kbRight = true;
		}
			 
		//{{CONNECTION
		//}}
	}
	
	// keyboard control of kenny
	void kenny_KeyReleased(java.awt.event.KeyEvent event)
	{
		// to do: code goes here.
		if( event.getKeyCode() == event.VK_LEFT )
		{
		    kbLeft = false;
		}
		if( event.getKeyCode() == event.VK_RIGHT )
		{
		    kbRight = false;
		}
			 
		//{{CONNECTION
		//}}
	}

	void kenny_KeyTyped(java.awt.event.KeyEvent event)
	{
		// to do: code goes here.
		// toggles manual control on and off
		if(event.getKeyChar() == ' ')
		{
		    if(screenRaster.isSprite(iconOn))
		    {
    		    screenRaster.removeSprite(iconOn);
	    	    screenRaster.putSprite(iconOff, iconx, icony);
	    	    kennySprite.setManual(true);
	    	    kennySprite.xvel = 0;
	    	}
	    	else
	    	{
    		    screenRaster.removeSprite(iconOff);
	    	    screenRaster.putSprite(iconOn, iconx, icony);
	    	    kennySprite.setManual(false);
	    	}
	    }
			 
		//{{CONNECTION
		//}}
	}

}
