// LAB SIX DOT COM SFCAVE LEET MIX
// www.lab6.com/sfcave/JavaCave.java

import java.applet.Applet;
import java.awt.*;



public class JavaCave extends Applet implements Runnable 
{
    public void start()
    {
        if(m_JavaCave == null)
        {
            m_JavaCave = new Thread(this);
            m_JavaCave.start();
        }
        MainStart();
    }

    void MainStart()
    {
        setGameState(0);
    }

    public void stop()
    {
        if(m_JavaCave != null)
        {
            m_JavaCave.stop();
            m_JavaCave = null;
        }
    }

    public boolean keyUp(Event event, int i)
    {
        if(i == 32)
            keyPushed = false;
        return true;
    }

    public boolean mouseMove(Event event, int i, int j)
    {
        mouseX = i;
        mouseY = j;
        return true;
    }

    void setGameState(int i)
    {
        GameState = i;
        GameCount = 0;
    }

    public boolean mouseDown(Event event, int i, int j)
    {
        mouseX = i;
        mouseY = j;
        mousePushed = true;
        mouseClicked = true;
        return true;
    }

    public boolean keyDown(Event event, int i)
    {
        if(i == 32)
            keyPushed = true;
        return true;
    }

    public String getAppletInfo()
    {
        return "Lab6 SFCave";
    }

    public boolean mouseUp(Event event, int i, int j)
    {
        mouseX = i;
        mouseY = j;
        mousePushed = false;
        return true;
    }

    public void run()
    {
        do
            try
            {
                Thread.sleep(100L);
                repaint();
            }
            catch(InterruptedException _ex)
            {
                stop();
            }
        while(true);
    }

    public JavaCave()
    {
        map = new int[4][32];
    }

    private void OnPeriod()
    {
        GameCount++;
        switch(GameState)
        {
        default:
            break;

// MAIN SCREEN TURN ON

        case 0: // '\0'
            if(GameCount == 1)
            {
                flag1 = false;
                if(HiScore < Score)
                    HiScore = Score;
            }
// background            
            Canvas.setColor(new Color(255, 128, 0));
            Canvas.fillRect(0, 0, 128, 160);
// hypnosis            
            Canvas.setColor(Color.black);
            int i = (int)((Math.sin((double)GameCount / 10D) + 1.0D) * 20D) + 20;
            Canvas.fillOval(64 - i, 64 - i, i * 2, i * 2);
// text            
            Canvas.setFont(new Font("Arial", 1, 14));
            Canvas.setColor(Color.black);  // black
            Canvas.drawString("Lab6 SFCave", 25, 50);
            Canvas.setColor(Color.white); //white
            Canvas.drawString("Lab6 SFCave", 20, 45);
            Canvas.setFont(new Font("Arial", 1, 12));
            Canvas.setColor(Color.white); //white
            Canvas.drawString("Click to scain!", 25, 80);
            Canvas.setColor(Color.white); //white
            Canvas.drawString("Score : " + Score, 30, 110);
            
            if(!flag1 && !mousePushed)
            {
                flag1 = true;
                mouseClicked = false;
            }
            if(flag1 && mouseClicked)
            {
                if(mouseX < 20 || mouseX > 108 || mouseY < 140 || mouseY > 155)
                    setGameState(1);
                return;
            }
            break;

// MOVE ZIG

        case 1: // '\001'
            if(GameCount == 1)
            {
                Score = 0;
                my = 10;
                mh = 108;
                mv = 0;
                y = oy = 50;
                vy = -5;
                int j1 = 0;
                do
                {
                    int j = Math.abs(j1 % 16 - 8) * 16;
// start walls
                    Canvas.setColor(Color.black);
                    Canvas.fillRect(j1 * 4, 0, 4, 128);
// start background
                    Canvas.setColor(Color.white);
                    Canvas.fillRect(j1 * 4, my, 4, mh);
                    map[0][j1] = my;
                    map[1][j1] = my + mh;
                    map[2][j1] = -1;
                }
                while(++j1 < 32);
                Canvas.setFont(new Font("Arial", 1, 16));
            }
            Score+=2;
            if(mousePushed || keyPushed)
                vy--;
            else
                vy++;
            if(vy < -8)
                vy = -8;
            else
            if(vy > 8)
                vy = 8;
            y = y + vy;
            if(GameCount % 10 == 0)
                mh--;
            if(Math.random() < 0.10000000000000001D)
                mv = (int)(Math.random() * 10D - 5D);
            my = my + mv;
            if(my < 1)
            {
                my = 1;
                mv = Math.abs(mv);
            }
            if(my > 126 - mh)
            {
                my = 126 - mh;
                mv = -Math.abs(mv);
            }
            
// score background
            Canvas.setColor(Color.black);  
            Canvas.fillRect(0, 128, 128, 32);
// score text
            Canvas.setColor(Color.white);    
            Canvas.drawString("Score: " + Score, 30, 150);

            
            Canvas.copyArea(2, 0, 126, 128, -4, 0);
            int k1 = 0;
            do
            {
                int l1 = 0;
                do
                    map[l1][k1] = map[l1][k1 + 1];
                while(++l1 < 4);
            }
            while(++k1 < 31);
// zig
            Canvas.setColor(new Color(255, 128, 0));      
            Canvas.drawLine(30, oy - 1, 34, y - 1);
            Canvas.drawLine(30, oy, 34, y);
            Canvas.drawLine(30, oy + 1, 34, y + 1);
            int k = Math.abs(GameCount % 16 - 8) * 16;  
// moving walls
            Canvas.setColor(Color.black);                 
            Canvas.fillRect(124, 0, 4, 128);
// moving background
            Canvas.setColor(Color.white);
            Canvas.fillRect(124, my, 4, mh);
            map[0][31] = my;
            map[1][31] = my + mh;
            if(GameCount % 10 == 0)
            {
                int l = (int)(Math.random() * (double)(mh - 16) + (double)my);
                Canvas.setColor(new Color(255, 128, 0));  // blocks
                Canvas.fillRect(124, l, 4, 16);
                map[2][31] = l;
            }
            else
            {
                map[2][31] = -1;
            }
            oy = y;
            if(y < map[0][8] || map[1][8] < y || map[2][8] != -1 && map[2][8] < y && y < map[2][8] + 16)
                setGameState(2);
            return;

// SOMEONE SET UP US THE BOMB

        case 2: // '\002'
            if(GameCount == 1)
                flag1 = false;
            if(GameCount < 20)
            {
// b00m
                Canvas.setColor(new Color(255, 128, 0));   
                int i1 = GameCount * 2;
                Canvas.drawOval(32 - i1, y - i1, i1 * 2, i1 * 2);
            }
            if(GameCount == 20)
            {
                Canvas.setFont(new Font("Arial", 1, 24));
// gay
                Canvas.setColor(Color.black);  
                Canvas.drawString("Bainer!", 20, 50);

// woo
                if(HiScore < Score)
                {
                    Canvas.setColor(new Color(255, 128, 0));  
                    Canvas.drawString("Hi Score!", 13, 100);
                }
            }
            if(GameCount == 100)
            {
                flag1 = true;
                mouseClicked = true;
            }
            if(GameCount <= 20)
                break;
            if(!flag1 && !mousePushed)
            {
                flag1 = true;
                mouseClicked = false;
            }
            if(flag1 && mouseClicked)
                setGameState(0);
            break;

        }
    }

    public void destroy()
    {
    }

    public void init()
    {
        resize(128, 160);
        OffScreen = createImage(128, 160);
        Canvas = OffScreen.getGraphics();
    }

    public void update(Graphics g)
    {
        OnPeriod();
        g.drawImage(OffScreen, 0, 0, this);
    }

    Thread m_JavaCave;
    Image OffScreen;
    Graphics Canvas;
    Dimension OffScreenSize;
    int mouseX;
    int mouseY;
    boolean mousePushed;
    boolean mouseClicked;
    static final int SizeX = 128;
    static final int SizeY = 160;
    static final int SLeft = 0;
    static final int STop = 0;
    static final int TimeOut = 100;
    boolean keyPushed;
    static final int GS_TITLE = 0;
    static final int GS_GAME = 1;
    static final int GS_OVER = 2;
    static final int GC_FIRST = 1;
    int GameState;
    int GameCount;
    boolean flag1;
    int HiScore;
    int Score;
    int map[][];
    int my;
    int mh;
    int mv;
    int oy;
    int y;
    int vy;
}

