// 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; 
}