// 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:   GameState.java

package Scrabble;

import KennethTam.Debug;
import java.awt.Point;
import java.io.PrintStream;
import java.util.Enumeration;
import java.util.Hashtable;

// Referenced classes of package Scrabble:
//            BoardSquare, BoardState, ComputerPlayer, DAWG, 
//            PlayedTile, ServerRackState, Tile, TileBag

public class GameState
{

    public GameState(Integer integer, int i, DAWG dawg)
    {
        Debug.assert(i > 0, "Num players < 0!");
        Debug.assert(dawg != null, "NULL dawg");
        _board = new BoardState();
        _tilebag = new TileBag();
        _turnNum = 0;
        _nPlayers = i;
        _currentPlayerNum = 0;
        _racks = new ServerRackState[4];
        for(int j = 0; j < _nPlayers; j++)
            _racks[j] = new ServerRackState(_tilebag);

        _scores = new int[4];
        for(int k = 0; k < 4; k++)
            _scores[k] = 0;

        _moveScore = 0;
        _playedTiles = new Hashtable(13);
        _dawg = dawg;
        _bGameOver = false;
        _cp = new ComputerPlayer(_board, _racks[1], _dawg, 1, integer);
        _cp2 = new ComputerPlayer(_board, _racks[0], _dawg, 0, integer);
    }

    public boolean playTileAt(int i, int j, int k, int l, int i1)
    {
        Debug.assert(_currentPlayerNum == i, "Wrong player playing tile!");
        Tile tile = null;
        if(i1 == 0)
        {
            tile = _racks[i].playTile(26);
            Debug.assert(tile != null, "Tried to play a tile not in rack!");
            Debug.assert(tile.isBlank(), "Bug in playTile");
            tile.setBlankTile(l);
        } else
        {
            tile = _racks[i].playTile(l);
        }
        Debug.assert(tile != null, "Tried to play a tile not in rack!");
        Debug.assert(_board.letterAt(j, k) == 100, "Tried to play on an occupied square!");
        boolean flag = _board.putTileAt(j, k, tile);
        Debug.assert(flag, "Shouldn't fail to play; everything checks!");
        PlayedTile playedtile = new PlayedTile(j, k, tile);
        Debug.assert(!_playedTiles.containsKey(playedtile.toString()), "Coord already has a played tile!");
        _playedTiles.put(playedtile.toString(), playedtile);
        return flag;
    }

    public void unplayAllTiles(int i)
    {
        Tile tile;
        for(Enumeration enumeration = _playedTiles.elements(); enumeration.hasMoreElements(); _racks[i].returnTile(tile))
        {
            PlayedTile playedtile = (PlayedTile)enumeration.nextElement();
            int j = playedtile._coord.y;
            int k = playedtile._coord.x;
            tile = _board.pickupTileAt(j, k);
            Debug.assert(tile != null, "No tile where playlist indicated one!");
            tile.resetBlankTile();
        }

        _playedTiles.clear();
        _moveScore = 0;
    }

    public void playerPasses(int i)
    {
        Debug.assert(_currentPlayerNum == i, "Wrong player passing!");
        _racks[i].exchangeAllTiles(_tilebag);
    }

    public boolean acceptPlayerMove(int i)
    {
        Debug.assert(_currentPlayerNum == i, "Wrong player making move!");
        if(_playedTiles.size() == 7)
            _moveScore += 50;
        _playedTiles.clear();
        _racks[i].drawFrom(_tilebag);
        _scores[i] += _moveScore;
        _moveScore = 0;
        if(_racks[i].numTiles() == 0)
        {
            _bGameOver = true;
            endGameScoreAdjustment();
            return false;
        } else
        {
            return true;
        }
    }

    public boolean computerPlayerMoves(int i, PrintStream printstream)
    {
        ComputerPlayer computerplayer = null;
        if(i == 1)
        {
            computerplayer = _cp;
        } else
        {
            Debug.assert(i == 0, "Only 2 computers allowed so far");
            computerplayer = _cp2;
        }
        int j = computerplayer.generateMove(_turnNum, printstream);
        Debug.assert(computerplayer._rs == _racks[i], "Wrong rack?!");
        if(j == 0)
            _racks[i].exchangeAllTiles(_tilebag);
        else
            _racks[i].drawFrom(_tilebag);
        _scores[i] += j;
        if(_racks[i].numTiles() == 0)
        {
            _bGameOver = true;
            endGameScoreAdjustment();
            return false;
        } else
        {
            return true;
        }
    }

    public int getCurrentPlayer()
    {
        return _currentPlayerNum;
    }

    public void switchToNextPlayer()
    {
        _turnNum++;
        _currentPlayerNum = (_currentPlayerNum + 1) % _nPlayers;
    }

    public boolean isOver()
    {
        return _bGameOver;
    }

    public String toString()
    {
        String s = new String("");
        s = s + "S TURNNUM " + _turnNum + "\n";
        s = s + "S NUMPLAYERS " + _nPlayers + "\n";
        s = s + "S CURRENTPLAYER " + _currentPlayerNum + "\n";
        s = s + "S SCORESTATE ";
        for(int k = 0; k < _nPlayers; k++)
            s = s + _scores[k] + " ";

        s = s + "\n";
        for(int l = 0; l < _nPlayers; l++)
            s = s + "S RACKSTATE " + l + " " + _racks[l].toString() + "\n";

        for(int i = 0; i < 15; i++)
        {
            s = s + "S BOARDSTATE " + i + " ";
            for(int j = 0; j < 15; j++)
            {
                int i1 = _board.letterAt(i, j);
                s = s + (i1 == 100 ? ". " : i1 + " ");
            }

            s = s + "\n";
        }

        if(_bGameOver)
            s = s + "S MESSAGE Game Over!\n";
        return s;
    }

    public boolean arePlayedWordsRecognized(PrintStream printstream)
    {
        _moveScore = 0;
        printstream.println("Turn " + _turnNum + ": Player " + _currentPlayerNum);
        if(_playedTiles.size() == 0)
        {
            printstream.println(" Passing..");
            return true;
        }
        int i = -1;
        int j = -1;
        boolean flag = true;
        boolean flag1 = true;
        StringBuffer stringbuffer = new StringBuffer();
        int ai[] = new int[1];
        boolean flag2 = false;
        Enumeration enumeration = _playedTiles.elements();
        PlayedTile playedtile = (PlayedTile)enumeration.nextElement();
        j = playedtile._coord.x;
        i = playedtile._coord.y;
        int l2 = i;
        int j3 = j;
        if(i == 7 && j == 7)
            flag2 = true;
        while(enumeration.hasMoreElements()) 
        {
            PlayedTile playedtile1 = (PlayedTile)enumeration.nextElement();
            if(playedtile1._coord.y != i)
                flag = false;
            if(playedtile1._coord.x != j)
                flag1 = false;
            if(playedtile1._coord.x == 7 && playedtile1._coord.y == 7)
                flag2 = true;
        }
        if(_turnNum == 0 && !flag2)
        {
            printstream.println(" First turn and didn't play in center.");
            return false;
        }
        Debug.assert(flag1 || flag, "Played tiles must be in same row or col by the time server gets move");
        if(flag1)
        {
            for(; _board.letterAt(l2 - 1, j) != 100; l2--);
            stringbuffer.setLength(0);
            int l1 = 0;
            ai[0] = 1;
            int l;
            while((l = _board.letterAt(l2, j)) != 100) 
            {
                char c = (char)(l += 65);
                stringbuffer.append(c);
                l1 += _board.scoreAt(l2, j, _playedTiles, ai);
                l2++;
            }
            if(stringbuffer.length() > 1)
            {
                l1 *= ai[0];
                System.out.println(" Found down-word: " + stringbuffer + ", score=" + l1);
                if(!_dawg.recognizes(stringbuffer.toString()))
                {
                    System.out.println("  " + stringbuffer + " not recognized!");
                    printstream.println(" " + stringbuffer + " not recognized!");
                    return false;
                }
                printstream.println(" D:" + stringbuffer + ", score=" + l1);
                _moveScore += l1;
            }
            for(Enumeration enumeration1 = _playedTiles.elements(); enumeration1.hasMoreElements();)
            {
                PlayedTile playedtile2 = (PlayedTile)enumeration1.nextElement();
                j3 = playedtile2._coord.x;
                for(i = playedtile2._coord.y; _board.letterAt(i, j3 - 1) != 100; j3--);
                stringbuffer.setLength(0);
                int i2 = 0;
                ai[0] = 1;
                int i1;
                while((i1 = _board.letterAt(i, j3)) != 100) 
                {
                    char c1 = (char)(i1 += 65);
                    stringbuffer.append(c1);
                    i2 += _board.scoreAt(i, j3, _playedTiles, ai);
                    j3++;
                }
                if(stringbuffer.length() > 1)
                {
                    i2 *= ai[0];
                    System.out.println(" Found across-word: " + stringbuffer + ", score=" + i2);
                    if(!_dawg.recognizes(stringbuffer.toString()))
                    {
                        System.out.println("  " + stringbuffer + " not recognized!");
                        printstream.println(" " + stringbuffer + " not recognized!");
                        return false;
                    }
                    printstream.println(" A:" + stringbuffer + ", score=" + i2);
                    _moveScore += i2;
                }
            }

        } else
        {
            for(; _board.letterAt(i, j3 - 1) != 100; j3--);
            stringbuffer.setLength(0);
            int j2 = 0;
            ai[0] = 1;
            int j1;
            while((j1 = _board.letterAt(i, j3)) != 100) 
            {
                char c2 = (char)(j1 += 65);
                stringbuffer.append(c2);
                j2 += _board.scoreAt(i, j3, _playedTiles, ai);
                j3++;
            }
            if(stringbuffer.length() > 1)
            {
                j2 *= ai[0];
                System.out.println(" Found across-word: " + stringbuffer + ", score=" + j2);
                if(!_dawg.recognizes(stringbuffer.toString()))
                {
                    System.out.println("  " + stringbuffer + " not recognized!");
                    printstream.println(" " + stringbuffer + " not recognized!");
                    return false;
                }
                printstream.println(" A:" + stringbuffer + ", score=" + j2);
                _moveScore += j2;
            }
            for(Enumeration enumeration2 = _playedTiles.elements(); enumeration2.hasMoreElements();)
            {
                PlayedTile playedtile3 = (PlayedTile)enumeration2.nextElement();
                int k = playedtile3._coord.x;
                int i3;
                for(i3 = playedtile3._coord.y; _board.letterAt(i3 - 1, k) != 100; i3--);
                stringbuffer.setLength(0);
                int k2 = 0;
                ai[0] = 1;
                int k1;
                while((k1 = _board.letterAt(i3, k)) != 100) 
                {
                    char c3 = (char)(k1 += 65);
                    stringbuffer.append(c3);
                    k2 += _board.scoreAt(i3, k, _playedTiles, ai);
                    i3++;
                }
                if(stringbuffer.length() > 1)
                {
                    k2 *= ai[0];
                    System.out.println(" Found down-word: " + stringbuffer + ", score=" + k2);
                    if(!_dawg.recognizes(stringbuffer.toString()))
                    {
                        System.out.println("  " + stringbuffer + " not recognized!");
                        printstream.println(" " + stringbuffer + " not recognized!");
                        return false;
                    }
                    printstream.println(" D:" + stringbuffer + ", score=" + k2);
                    _moveScore += k2;
                }
            }

        }
        return true;
    }

    private void endGameScoreAdjustment()
    {
        for(int i = 0; i < _nPlayers; i++)
            _scores[i] -= _racks[i].rackScore();

    }

    private static final int NUMSQR = 15;
    private static final int MAX_PLAYERS = 4;
    private BoardState _board;
    private TileBag _tilebag;
    private int _turnNum;
    private int _nPlayers;
    private int _currentPlayerNum;
    private ServerRackState _racks[];
    private int _scores[];
    private int _moveScore;
    private Hashtable _playedTiles;
    private DAWG _dawg;
    private boolean _bGameOver;
    public ComputerPlayer _cp;
    public ComputerPlayer _cp2;
}
