// Decompiled by Jad v1.5.7f. Copyright 2000 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   Boggle.java

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import java.util.Vector;

public class Boggle extends Frame
    implements ActionListener
{

    public static void main(String args[])
    {
        new Boggle();
    }

    Boggle()
    {
        super("Boggle");
        board = new char[5][5];
        boardVisible = false;
        running = false;
        rand = new Random();
        mb = new MenuBar();
        setMenuBar(mb);
        MenuGame = new Menu("Game");
        MItemNew = new MenuItem("New Game", new MenuShortcut(110));
        MItemPause = new MenuItem("Pause Game", new MenuShortcut(112));
        MItemExit = new MenuItem("Exit Game", new MenuShortcut(120));
        MItemNew.setActionCommand("New");
        MItemPause.setActionCommand("Pause");
        MItemExit.setActionCommand("Exit");
        MItemNew.addActionListener(this);
        MItemPause.addActionListener(this);
        MItemExit.addActionListener(this);
        MenuGame.add(MItemNew);
        MenuGame.add(MItemPause);
        MenuGame.add(MItemExit);
        mb.add(MenuGame);
        addNotify();
        setSize(getInsets().left + getInsets().right + 400, getInsets().top + getInsets().bottom + 400);
        setVisible(true);
    }

    void newGame()
    {
        running = true;
        shake();
        if(boardVisible)
        {
            boardVisible = false;
            repaint();
        }
        bd = new ButtonDialog(this, "Hit OK when ready...", ok);
        boardVisible = true;
        side = 0;
        paintBoard();
        startTimer();
    }

    void pauseGame()
    {
        boardVisible = false;
        repaint();
        timer.toggle();
        bd = new ButtonDialog(this, "Paused...", ok);
        boardVisible = true;
        repaint();
        timer.toggle();
    }

    void endGame()
    {
        running = false;
        boardVisible = false;
        repaint();
        bd = new ButtonDialog(this, "Time's Up!", ok);
        boardVisible = true;
        repaint();
    }

    public void actionPerformed(ActionEvent actionevent)
    {
        String s = actionevent.getActionCommand();
        if(s.equals("BEEP! BEEP!"))
        {
            Toolkit.getDefaultToolkit().beep();
            if(++side > 3)
            {
                endGame();
                return;
            } else
            {
                paintBoard();
                startTimer();
                return;
            }
        }
        if(!s.equals("TICK! TOCK!"))
            if(s.equals("New"))
            {
                if(!running)
                {
                    running = true;
                    newGame();
                    return;
                }
            } else
            if(s.equals("Pause"))
            {
                if(running)
                {
                    pauseGame();
                    return;
                }
            } else
            if(s.equals("Exit"))
                System.exit(0);
    }

    public void paint(Graphics g)
    {
        if(boardImage != null && boardVisible)
        {
            g.drawImage(boardImage, getInsets().left, getInsets().top, null);
            return;
        } else
        {
            g.setColor(getBackground());
            g.fillRect(getInsets().left, getInsets().top, 400, 400);
            return;
        }
    }

    public void update(Graphics g)
    {
        if(boardImage != null && boardVisible)
        {
            g.drawImage(boardImage, getInsets().left, getInsets().top, null);
            return;
        } else
        {
            g.setColor(getBackground());
            g.fillRect(getInsets().left, getInsets().top, 400, 400);
            return;
        }
    }

    private void paintBoard()
    {
        if(boardImage == null)
            boardImage = createImage(400, 400);
        Graphics g = boardImage.getGraphics();
        g.setColor(Color.lightGray);
        g.fillRect(0, 0, 400, 400);
        for(int i = 0; i < 4; i++)
        {
            for(int j = 0; j < 4; j++);
        }

        switch(side)
        {
        default:
            break;

        case 0: // '\0'
            for(int k = 0; k < 5; k++)
            {
                for(int k1 = 0; k1 < 5; k1++)
                    paintDie(k, k1, board[k][k1]);

            }

            break;

        case 1: // '\001'
            for(int l = 0; l < 5; l++)
            {
                for(int l1 = 0; l1 < 5; l1++)
                    paintDie(l, l1, board[4 - l][l1]);

            }

            break;

        case 2: // '\002'
            for(int i1 = 0; i1 < 5; i1++)
            {
                for(int i2 = 0; i2 < 5; i2++)
                    paintDie(i1, i2, board[4 - i1][4 - i2]);

            }

            break;

        case 3: // '\003'
            for(int j1 = 0; j1 < 5; j1++)
            {
                for(int j2 = 0; j2 < 5; j2++)
                    paintDie(j1, j2, board[j1][4 - j2]);

            }

            break;
        }
        repaint();
    }

    private void paintDie(int i, int j, char c)
    {
        String s;
        if(c == '*')
            s = "Qu";
        else
            s = new String(String.valueOf(c));
        Graphics g = boardImage.getGraphics();
        g.setColor(new Color(130, 100, 30));
        g.fillRoundRect(i * 80 + 6, j * 80 + 6, 68, 68, 20, 20);
        g.setColor(new Color(80, 60, 0));
        g.fillRoundRect(i * 80 + 8, j * 80 + 8, 68, 68, 20, 20);
        g.setFont(new Font("Monospaced", 1, 30));
        g.setColor(Color.white);
        g.drawString(s, i * 80 + (80 - g.getFontMetrics().stringWidth(s)) / 2 + 2, j * 80 + 52);
    }

    private void startTimer()
    {
        timer = new Timer();
        timer.addActionListener(this);
        timer.setAlarm(45L);
        timer.start();
    }

    private void shake()
    {
        Vector vector = new Vector();
        for(int k = 0; k < 25; k++)
        {
            int i = (int)Math.floor(rand.nextFloat() * 6F);
            vector.addElement(new Character(cubes[k][i]));
        }

        for(int l = 0; l < 5; l++)
        {
            for(int i1 = 0; i1 < 5; i1++)
            {
                int j = (int)Math.floor(rand.nextFloat() * (float)vector.size());
                board[l][i1] = ((Character)vector.elementAt(j)).charValue();
                vector.removeElementAt(j);
            }

        }

    }

    String ok[] = {
        "Ok"
    };
    String yesNo[] = {
        "Yes", "No"
    };
    char board[][];
    char cubes[][] = {
        {
            'a', 'a', 'a', 's', 'r', 'f'
        }, {
            'e', 'e', 'e', 'e', 'm', 'a'
        }, {
            'i', 'i', 'i', 't', 't', 'e'
        }, {
            'o', 'o', 'o', 't', 't', 'u'
        }, {
            'r', 'r', 'r', 'i', 'p', 'y'
        }, {
            'e', 'e', 'e', 'e', 'a', 'a'
        }, {
            'w', 'o', 'u', 'n', 't', 'o'
        }, {
            'p', 'i', 's', 't', 'e', 'c'
        }, {
            '*', 'k', 'x', 'j', 'z', 'b'
        }, {
            's', 's', 's', 'n', 'e', 'u'
        }, {
            'a', 'r', 'f', 's', 'i', 'y'
        }, {
            's', 'i', 'f', 'p', 'r', 'y'
        }, {
            'n', 'a', 'g', 'e', 'm', 'n'
        }, {
            'n', 'h', 'r', 'd', 'l', 'o'
        }, {
            'e', 'e', 'a', 'g', 'm', 'u'
        }, {
            'n', 'n', 'd', 'e', 'a', 'n'
        }, {
            'i', 'l', 'c', 'i', 'e', 't'
        }, {
            'e', 't', 'c', 'p', 'l', 'i'
        }, {
            'o', 'e', 't', 't', 't', 'm'
        }, {
            'f', 's', 'a', 'r', 'a', 'i'
        }, {
            'r', 'o', 'l', 'h', 'h', 'd'
        }, {
            'd', 't', 'd', 'h', 'o', 'n'
        }, {
            'n', 'd', 'o', 'l', 'r', 'h'
        }, {
            'r', 'g', 'w', 'r', 'v', 'o'
        }, {
            'e', 'c', 't', 'c', 's', 'n'
        }
    };
    int side;
    int time;
    Image boardImage;
    boolean boardVisible;
    boolean running;
    Random rand;
    ButtonDialog bd;
    Timer timer;
    Menu MenuGame;
    MenuItem MItemNew;
    MenuItem MItemExit;
    MenuItem MItemPause;
    MenuBar mb;
}

