/* Kevin Fleming
   Final Exam
   Due 5/11/98
   Tennis Game
*/

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class Tennis2 extends Applet implements KeyListener {
        private int ballX = 10, ballY = 100, left = 0, right = 500,  top = 0, bottom = 300, hit = 0;
        public static int paddle1X = 490, paddle1Y = 100, paddleWidth = 5, paddleHeight = 40;
        public int paddle2X = 10, paddle2Y = 100;
        private int sleepTime = 0, moveX = 10, moveY =0;
        private Image court, buffer, rScore, lScore, lSet1, lSet2, lSet3, rSet1, rSet2, rSet3;
        private MediaTracker imageTracker;
        private int currentImage = 0, rCount = 0, lCount = 0,
                serve = 0, serving = 0, lSet1Count = 0, rSet1Count = 0,lSet2Count = 0, rSet2Count = 0, lSet3Count = 0, rSet3Count = 0;
        private Thread animate;
        private Graphics gContext;


        public void init()
        {
                serving = 0;
                lSet1Count = 0;
                rSet1Count = 0;
                lSet2Count = 0;
                rSet2Count = 0;
                lSet3Count = 0;
                rSet3Count = 0;

                court = getImage(getDocumentBase(), "court.jpg");
                rScore = getImage(getDocumentBase(), "score" + rCount + ".jpg");
                lScore = getImage(getDocumentBase(), "score" + lCount + ".jpg");
                lSet1 = getImage(getDocumentBase(), "setScore" + lSet1Count + ".jpg");
                lSet2 = getImage(getDocumentBase(), "setScore" + lSet2Count + ".jpg");
                lSet3 = getImage(getDocumentBase(), "setScore" + lSet3Count + ".jpg");
                rSet1 = getImage(getDocumentBase(), "setScore" + rSet1Count + ".jpg");
                rSet2 = getImage(getDocumentBase(), "setScore" + rSet2Count + ".jpg");
                rSet3 = getImage(getDocumentBase(), "setScore" + rSet3Count + ".jpg");
                
                hit = 0;

                buffer = createImage(600, 400);
                gContext = buffer.getGraphics();

                gContext.setColor(Color.white);
                gContext.fillRect(0, 0, 500, 300);

                imageTracker = new MediaTracker(this);
                imageTracker.addImage(court, 0);

                try{ imageTracker.waitForID(0); }
                catch(InterruptedException e) {}

                addKeyListener(this);
                requestFocus();
        }

        public void start()
        {
                gContext.drawImage(court, 0, 0, this);
                gContext.drawImage(rScore, 132, 350, this);
                gContext.drawImage(lScore, 132, 313, this);
                gContext.drawImage(rSet1, 238, 350, this);
                gContext.drawImage(rSet2, 285, 350, this);
                gContext.drawImage(rSet3, 335, 350, this);
                gContext.drawImage(lSet1, 238, 313, this);
                gContext.drawImage(lSet2, 285, 313, this);
                gContext.drawImage(lSet3, 335, 313, this);
        }

        public void score1()
        {
                serve = 0;
                moveY = 0;
                paddle1X = 490;
                paddle1Y = 100;
                paddle2X = 10;
                paddle2Y = 100;

                if(lCount >= 3 && rCount < 3)
                {
                        if(lSet1Count < 6 && rSet1Count < 6)
                                lSet1Count++;
                        else if((lSet1Count == 6 || rSet1Count == 6) && lSet2Count < 6 && rSet2Count < 6)
                                lSet2Count++;
                        else if((lSet1Count == 6 || rSet1Count == 6) && (lSet2Count == 6 || rSet2Count == 6) && lSet3Count < 5 && rSet3Count < 6)
                                lSet3Count++;
                        else if(lSet1Count == 6 && lSet2Count == 6 && lSet3Count == 5)
                        {
                                lSet3Count++;
                                showStatus("Left Player Wins!");
                                serve = -1;
                        }

                        rCount = 0;
                        lCount = 0;
                        lScore = getImage(getDocumentBase(), "score" + lCount + ".jpg");
                        rScore = getImage(getDocumentBase(), "score" + rCount + ".jpg");
                        lSet1 = getImage(getDocumentBase(), "setScore" + lSet1Count + ".jpg");
                        lSet2 = getImage(getDocumentBase(), "setScore" + lSet2Count + ".jpg");
                        lSet3 = getImage(getDocumentBase(), "setScore" + lSet3Count + ".jpg");
                        rSet1 = getImage(getDocumentBase(), "setScore" + rSet1Count + ".jpg");
                        rSet2 = getImage(getDocumentBase(), "setScore" + rSet2Count + ".jpg");
                        rSet3 = getImage(getDocumentBase(), "setScore" + rSet3Count + ".jpg");


                        if(serving == 0)
                        {
                                setX();
                                hit = 1;
                                ballX = 490;
                                ballY = 100;
                                serving = 1;
                        }
                        else
                        {
                                ballX = 10;
                                ballY = 100;
                                serving = 0;
                                hit = 0;
                        }
                }
                else
                {
                        lCount++;
                        lScore = getImage(getDocumentBase(), "score" + lCount + ".jpg");

                        if(serving == 0)
                        {
                                ballX = 10;
                                ballY = 100;
                                hit = 0;
                        }
                        else
                        {
                                
                                setX();
                                ballX = 490;
                                ballY = 100;
                                hit = 1;
                        }
                }
        }

        public void score2()
        {
                serve = 0;
                moveY = 0;
                paddle1X = 490;
                paddle1Y = 100;
                paddle2X = 10;
                paddle2Y = 100;

                if(rCount >= 3 && lCount < 3)
                {
                        if(rSet1Count < 6 && lSet1Count < 6)
                                rSet1Count++;
                        else if((rSet1Count == 6 || lSet1Count == 6) && rSet2Count < 6 && lSet2Count < 6)
                                rSet2Count++;
                        else if((rSet1Count == 6 || lSet1Count == 6) && (rSet2Count == 6 || lSet2Count == 6) && rSet3Count < 5 && lSet3Count < 6)
                                rSet3Count++;
                        else if(rSet1Count == 6 && rSet2Count == 6 && rSet3Count == 5)
                        {
                                rSet3Count++;
                                showStatus("Right Player Wins!");
                                serve = -1;
                        }


                        rCount = 0;
                        lCount = 0;
                        rScore = getImage(getDocumentBase(), "score" + rCount + ".jpg");
                        lScore = getImage(getDocumentBase(), "score" + lCount + ".jpg");
                        lSet1 = getImage(getDocumentBase(), "setScore" + lSet1Count + ".jpg");
                        lSet2 = getImage(getDocumentBase(), "setScore" + lSet2Count + ".jpg");
                        lSet3 = getImage(getDocumentBase(), "setScore" + lSet3Count + ".jpg");
                        rSet1 = getImage(getDocumentBase(), "setScore" + rSet1Count + ".jpg");
                        rSet2 = getImage(getDocumentBase(), "setScore" + rSet2Count + ".jpg");
                        rSet3 = getImage(getDocumentBase(), "setScore" + rSet3Count + ".jpg");

                        if(serving == 0)
                        {
                                hit = 1;
                                ballX = 490;
                                ballY = 100;
                                serving = 1;
                        }
                        else
                        {
                                setX();
                                ballX = 10;
                                ballY = 100;
                                serving = 0;
                                hit = 0;
                        }
                }
                else
                {
                        rCount++;
                        rScore = getImage(getDocumentBase(), "score" + rCount + ".jpg");

                        if(serving == 0)
                        {
                                setX();
                                ballX = 10;
                                ballY = 100;
                                hit = 0;
                        }
                        else
                        {
                                ballX = 490;
                                ballY = 100;
                                hit = 1;
                        }
                }
        }

        public void setValues1(int x, int y)
        {
                paddle1X = x;
                paddle1Y = y;
        }

        public void setValues2(int x, int y)
        {
                paddle2X = x;
                paddle2Y = y;
        }

        public void setX()
        {
                moveX *= -1;
        }

        public void paint(Graphics g)
        {
                g.drawImage(buffer, 0, 0,this);

                if(imageTracker.checkID(currentImage, true))
                {
                        gContext.fillRect(0, 0, 500, 300);
                        gContext.drawImage(court, 0, 0, this);
                        gContext.drawImage(rScore, 132, 313, this);
                        gContext.drawImage(lScore, 132, 350, this);
                        gContext.drawImage(rSet1, 238, 313, this);
                        gContext.drawImage(rSet2, 285, 313, this);
                        gContext.drawImage(rSet3, 335, 313, this);
                        gContext.drawImage(lSet1, 238, 350, this);
                        gContext.drawImage(lSet2, 285, 350, this);
                        gContext.drawImage(lSet3, 335, 350, this);

                        gContext.setColor(Color.yellow);
                        gContext.fillOval(ballX, ballY, 7, 7);

                        gContext.setColor(Color.black);
                        gContext.fillRect(paddle1X, paddle1Y, 5, 40);
                        gContext.fillRect(paddle2X, paddle2Y, 5, 40);

                        if(serve == 1)
                        {
                                if(hit == 0)
                                {
                                        if(ballX == paddle1X)
                                        {
                                                if(ballY >= paddle1Y && ballY < (paddle1Y + 15))
                                                {       
                                                        moveY = (-1);
                                                        setX();
                                                        hit = 1;
                                                }
                                                else if(ballY >= (paddle1Y + 15) && ballY < (paddle1Y + 24))
                                                {
                                                        moveY = 0;
                                                        setX();
                                                        hit = 1;
                                                }
                                                else if(ballY >= (paddle1Y + 24) && ballY < (paddle1Y + 40))
                                                {
                                                        moveY = 1;
                                                        setX();
                                                        hit = 1;
                                                }
                                        }
                        
                                        else if(ballX > 495)
                                                score1();
                
                                        else if((ballY < 0 || ballY > 300) && (ballX > 250))
                                        {
                                                score1();
                                        }

                                        else if((ballY < 0 || ballY > 300) && (ballX < 250))
                                        {
                                                setX();
                                                score2();
                                        }
                        
                                        ballX += moveX;
                                        ballY += moveY;
                                }
                
                                if(hit == 1)
                                {
                                        if(ballX == paddle2X)
                                        {
                                                if(ballY >= paddle2Y && ballY < (paddle2Y + 15))
                                                {
                                                        moveY = (-1);
                                                        setX();
                                                        hit = 0;
                                                }
                                                else if(ballY >= (paddle2Y + 15) && ballY < (paddle2Y + 24))
                                                {
                                                        moveY = 0;
                                                        setX();
                                                        hit = 0;
                                                }
                                                else if(ballY >= (paddle2Y + 24) && ballY < (paddle2Y + 40))
                                                {
                                                        moveY = 1;
                                                        setX();
                                                        hit = 0;
                                                }
                                        }

                                        else if(ballX <= 0)
                                        {
                                                score2();
                                        } 

                                        else if((ballY < 0 || ballY > 300) && (ballX > 250))
                                        {
                                                setX();
                                                score1();
                                        }

                                        else if((ballY < 0 || ballY > 300) && (ballX < 250))
                                        {
                                                score2();
                                        }

                                        ballX += moveX;
                                        ballY += moveY;
                                }
                        }
                        else
                                showStatus("Press ENTER to serve");
                }

                try { Thread.sleep(sleepTime); }
                catch(InterruptedException e) { showStatus(e.toString()); }

                repaint();
        }

        public void update(Graphics g) {paint(g);}

        public void keyPressed(KeyEvent e)
        {
                if((e.getKeyText(e.getKeyCode())).equals("D"))
                {
                                setValues2((paddle2X + 10), paddle2Y);
                }
                else if((e.getKeyText(e.getKeyCode())).equals("W"))
                {
                                setValues2((paddle2X), (paddle2Y - 10));
                }
                else if((e.getKeyText(e.getKeyCode())).equals("X"))
                {
                                setValues2((paddle2X), (paddle2Y + 10));
                }
                else if((e.getKeyText(e.getKeyCode())).equals("A"))
                {
                                setValues2((paddle2X - 10), (paddle2Y));
                }
                else if((e.getKeyText(e.getKeyCode())).equals("C"))
                {
                                setValues2((paddle2X + 10), (paddle2Y + 10));
                }
                else if((e.getKeyText(e.getKeyCode())).equals("E"))
                {
                                setValues2((paddle2X + 10), (paddle2Y - 10));
                }
                else if((e.getKeyText(e.getKeyCode())).equals("Q"))
                {
                                setValues2((paddle2X - 10), (paddle2Y - 10));
                }
                else if((e.getKeyText(e.getKeyCode())).equals("Z"))
                {
                                setValues2((paddle2X - 10), (paddle2Y + 10));
                }
                else if((e.getKeyText(e.getKeyCode())).equals("NumPad-6"))
                {
                                setValues1((paddle1X + 10), paddle1Y);
                }
                else if((e.getKeyText(e.getKeyCode())).equals("NumPad-8"))
                {
                                setValues1((paddle1X), (paddle1Y - 10));
                }
                else if((e.getKeyText(e.getKeyCode())).equals("NumPad-2"))
                {
                                setValues1((paddle1X), (paddle1Y + 10));
                }
                else if((e.getKeyText(e.getKeyCode())).equals("NumPad-4"))
                {
                                setValues1((paddle1X - 10), (paddle1Y));
                }
                else if((e.getKeyText(e.getKeyCode())).equals("NumPad-3"))
                {
                                setValues1((paddle1X + 10), (paddle1Y + 10));
                }
                else if((e.getKeyText(e.getKeyCode())).equals("NumPad-9"))
                {
                                setValues1((paddle1X + 10), (paddle1Y - 10));
                }
                else if((e.getKeyText(e.getKeyCode())).equals("NumPad-7"))
                {
                                setValues1((paddle1X - 10), (paddle1Y - 10));
                }
                else if((e.getKeyText(e.getKeyCode())).equals("NumPad-1"))
                {
                                setValues1((paddle1X - 10), (paddle1Y + 10));
                }
                else if((e.getKeyText(e.getKeyCode())).equals("Enter"))
                {
                        if(serve == 0)
                                serve = 1;
                        else
                                showStatus("Game Over");
                }
                else
                        showStatus(e.getKeyText(e.getKeyCode()));
        }

        public void keyReleased(KeyEvent e) {}

        public void keyTyped(KeyEvent e) {}

}