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

package Scrabble;

import KennethTam.Debug;
import java.awt.Label;
import java.awt.Point;
import java.io.PrintStream;
import java.util.*;

// Referenced classes of package Scrabble:
//            Board, BoardSquare, Client, PlayedTile, 
//            Tile

public class ClientGameState
{

    public ClientGameState(Client client)
    {
        _app = client;
        beginNewGame();
    }

    public synchronized void beginNewGame()
    {
        _nPlayers = 0;
        _playerNum = 0;
        _tileInHand = null;
        _currentPlayer = -99;
        _turnNum = 0;
        _playedTiles = new Hashtable(13);
        _scores = new int[4];
        for(int i = 0; i < 4; i++)
            _scores[i] = 0;

    }

    public synchronized void setPlayerInfo(int i, int j)
    {
        Debug.assert(_nPlayers == 0 && _tileInHand == null, "Bad state when setPlayerInfo called");
        _nPlayers = j;
        _playerNum = i;
    }

    public synchronized void setCurrentPlayer(int i)
    {
        Debug.assert(i < _nPlayers, "Invalid player number");
        _currentPlayer = i;
        _playedTiles.clear();
    }

    public synchronized void setTurnNum(int i)
    {
        _turnNum = i;
    }

    public synchronized int getTurnNum()
    {
        return _turnNum;
    }

    public synchronized void setScores(String s)
    {
        StringTokenizer stringtokenizer = new StringTokenizer(s);
        Debug.assert(stringtokenizer.countTokens() == 2 + _nPlayers, "Invalid format for scorestate");
        Debug.assert(_nPlayers > 0, "Must have more than 0 players!");
        stringtokenizer.nextToken();
        stringtokenizer.nextToken();
        for(int i = 0; i < _nPlayers; i++)
            _app._scoreLabels[i].setText(stringtokenizer.nextToken());

    }

    public synchronized int getPlayerNum()
    {
        return _playerNum;
    }

    public synchronized boolean isMyTurn()
    {
        return _currentPlayer == _playerNum;
    }

    public synchronized boolean hasPlayedTileAt(int i, int j)
    {
        Debug.assert(i >= 0 && i < 15 && j >= 0 && j < 15, "Invalid row or col");
        Point point = new Point(j, i);
        return _playedTiles.containsKey(point.toString());
    }

    public synchronized void addPlayedTileAt(int i, int j, Tile tile)
    {
        Debug.assert(i >= 0 && i < 15 && j >= 0 && j < 15, "Invalid row or col");
        PlayedTile playedtile = new PlayedTile(i, j, tile);
        Debug.assert(!_playedTiles.containsKey(playedtile.toString()), "Coord already has a played tile!");
        _playedTiles.put(playedtile.toString(), playedtile);
    }

    public synchronized Tile removePlayedTileAt(int i, int j)
    {
        Debug.assert(i >= 0 && i < 15 && j >= 0 && j < 15, "Invalid row or col");
        Point point = new Point(j, i);
        PlayedTile playedtile = (PlayedTile)_playedTiles.remove(point.toString());
        if(playedtile != null)
            return playedtile._tile;
        else
            return null;
    }

    public synchronized boolean haveActiveTile()
    {
        return _tileInHand != null;
    }

    public synchronized void pickupActiveTile(Tile tile)
    {
        Debug.assert(tile != null, "NULL tile");
        Debug.assert(_tileInHand == null, "Should drop before setting");
        _tileInHand = tile;
    }

    public synchronized void dropActiveTile()
    {
        _tileInHand = null;
    }

    public synchronized Tile putActiveTile()
    {
        Tile tile = _tileInHand;
        _tileInHand = null;
        return tile;
    }

    public synchronized String submitMove()
    {
        String s = new String("C MOVE_BEGIN " + getPlayerNum() + "\n");
        if(_playedTiles.size() == 0)
        {
            s = s + "C PASS\n";
        } else
        {
            for(Enumeration enumeration = _playedTiles.elements(); enumeration.hasMoreElements();)
            {
                PlayedTile playedtile = (PlayedTile)enumeration.nextElement();
                s = s + "C " + playedtile._coord.y + " " + playedtile._coord.x + " " + playedtile._tile.letter() + " " + playedtile._tile.score() + "\n";
            }

        }
        s = s + "C MOVE_END\n";
        return s;
    }

    public synchronized boolean isMoveLegal()
    {
        if(_playedTiles.size() == 0)
            return _turnNum != 0;
        int i = -1;
        int j = -1;
        boolean flag = true;
        boolean flag1 = true;
        boolean flag2 = false;
        Enumeration enumeration = _playedTiles.elements();
        PlayedTile playedtile = (PlayedTile)enumeration.nextElement();
        j = playedtile._coord.x;
        i = playedtile._coord.y;
        while(enumeration.hasMoreElements()) 
        {
            PlayedTile playedtile1 = (PlayedTile)enumeration.nextElement();
            if(playedtile1._coord.y != i)
                flag = false;
            if(playedtile1._coord.x != j)
                flag1 = false;
        }
        if(!flag1 && !flag)
        {
            System.out.println(" Illegal: not in same row or col");
            return false;
        }
        int k = j;
        int l = i;
        if(flag)
        {
            for(k = j; k < 15; k++)
            {
                if(_app._board.letterAt(l, k) == 100)
                    break;
                Point point = new Point(k, l);
                PlayedTile playedtile2 = (PlayedTile)_playedTiles.get(point.toString());
                if(playedtile2 != null)
                    playedtile2._bFound = true;
            }

            for(k = j; k >= 0; k--)
            {
                if(_app._board.letterAt(l, k) == 100)
                    break;
                Point point1 = new Point(k, l);
                PlayedTile playedtile3 = (PlayedTile)_playedTiles.get(point1.toString());
                if(playedtile3 != null)
                    playedtile3._bFound = true;
            }

            for(Enumeration enumeration1 = _playedTiles.elements(); enumeration1.hasMoreElements();)
            {
                PlayedTile playedtile4 = (PlayedTile)enumeration1.nextElement();
                if(!playedtile4._bFound)
                    flag2 = true;
                playedtile4._bFound = false;
            }

            if(flag2)
            {
                System.out.println(" Illegal: not connected");
                return false;
            }
        } else
        {
            Debug.assert(flag1, "Same col must be true here!");
            for(int i1 = i; i1 < 15; i1++)
            {
                if(_app._board.letterAt(i1, k) == 100)
                    break;
                Point point2 = new Point(k, i1);
                PlayedTile playedtile5 = (PlayedTile)_playedTiles.get(point2.toString());
                if(playedtile5 != null)
                    playedtile5._bFound = true;
            }

            for(int j1 = i; j1 >= 0; j1--)
            {
                if(_app._board.letterAt(j1, k) == 100)
                    break;
                Point point3 = new Point(k, j1);
                PlayedTile playedtile6 = (PlayedTile)_playedTiles.get(point3.toString());
                if(playedtile6 != null)
                    playedtile6._bFound = true;
            }

            for(Enumeration enumeration2 = _playedTiles.elements(); enumeration2.hasMoreElements();)
            {
                PlayedTile playedtile7 = (PlayedTile)enumeration2.nextElement();
                if(!playedtile7._bFound)
                    flag2 = true;
                playedtile7._bFound = false;
            }

            if(flag2)
            {
                System.out.println(" Illegal: not connected");
                return false;
            }
        }
        if(_turnNum == 0)
            return true;
        boolean flag3 = false;
        for(Enumeration enumeration3 = _playedTiles.elements(); enumeration3.hasMoreElements();)
        {
            PlayedTile playedtile8 = (PlayedTile)enumeration3.nextElement();
            if(_app._board.hasExistingTileAdjacentTo(playedtile8._coord.y, playedtile8._coord.x))
            {
                flag3 = true;
                break;
            }
        }

        if(!flag3)
            System.out.println(" Illegal: not adjacent");
        return flag3;
    }

    private static final int MAX_PLAYERS = 4;
    private Client _app;
    private int _scores[];
    private int _nPlayers;
    private int _playerNum;
    private int _currentPlayer;
    private int _turnNum;
    private Tile _tileInHand;
    private Hashtable _playedTiles;
}
