/*
 * World.java
 *
 * Created on 5 of December 2006, 2:20
 */
/**
 *
 * @author Eng. Paulo Roque Silva
 */
public class World {
    
    final static int // Orientação do robô 
    	NORTH = 1,      // Move para Norte - NÃO ALTERAR
        EAST  = 2,      // Move para Este  - NÃO ALTERAR
        SOUTH = 3,      // Move para Norte - NÃO ALTERAR
        WEST  = 4;      // Move para Este  - NÃO ALTERAR
    public static final int // Elementos do Mundo
    	EARTH = 1,
        WATER = 2,
        FOOD  = 3;
    // Elementos do mundo
    public static final int
    	WALL  = 65;
    // elements[local] retorna comida, água e terra
    int         []elements =
    	{EARTH, EARTH, EARTH, EARTH, EARTH, EARTH, WATER,
    	EARTH,  EARTH, EARTH, EARTH, EARTH, EARTH, EARTH,
    	EARTH,  EARTH, EARTH, EARTH, EARTH, EARTH, EARTH,
    	EARTH,  EARTH, EARTH, EARTH, EARTH, EARTH, EARTH,
    	EARTH,  EARTH, EARTH, EARTH, EARTH, EARTH, EARTH,
    	EARTH,  EARTH, EARTH, EARTH, EARTH, EARTH, EARTH,
    	EARTH,  EARTH, EARTH, EARTH, EARTH, EARTH, EARTH,
    	EARTH,  EARTH, EARTH, EARTH, EARTH, EARTH, EARTH,
        EARTH, EARTH, EARTH, EARTH,  FOOD,  EARTH, EARTH,
        EARTH};
    // place[local][orientation] retorna o próximo local ou
    // WALL
    // local de 0 a 7; orientation de Norte para Oeste
    // no sentido dos ponteiros do relógio
    int         [][]place = {{WALL,    2,    9, WALL},
                             {WALL,    3, WALL,    1},
                             {WALL,    4, WALL,    2},
                             {WALL, WALL,   12,    3},
                             {WALL,    6,   13, WALL},
                             {WALL, WALL,   14,    5},
                             {WALL, WALL,   15, WALL},
                             {WALL, WALL,   16, WALL},
                             {   1, WALL,   17, WALL},
                             {WALL,   11,   18, WALL},
                             {WALL, WALL, WALL,   10},
                             {   4, WALL,   20, WALL},
                             {   5, WALL, WALL, WALL},
                             {   6,   15,   22, WALL},
                             {   7,   16, WALL,   14},
                             {   8, WALL, WALL,   15},
                             {   9, WALL,   25, WALL},
                             {  10, WALL,   26, WALL},
                             {WALL,   20,   27, WALL},
                             {  12,   21, WALL,   19},
                             {WALL,   22, WALL,   20},
                             {  14,   23,   30,   21},
                             {WALL,   24, WALL,   22},
                             {WALL, WALL, WALL,   23},
                             {  17,   26, WALL, WALL},
                             {  18, WALL, WALL,   25},
                             {  19, WALL,   35, WALL},
                             {WALL,   29, WALL, WALL},
                             {WALL,   30, WALL,   28},
                             {  22, WALL, WALL,   29},
                             {WALL,   32,   39, WALL},
                             {WALL, WALL, WALL,   31},
                             {WALL,   34, WALL, WALL},
                             {WALL,   35, WALL,   33},
                             {  27,   36,   43,   34},
                             {WALL,   37, WALL,   35},
                             {WALL,   38, WALL,   36},
                             {WALL,   39, WALL,   37},
                             {  31,   40, WALL,   38},
                             {WALL, WALL, WALL,   39},
                             {WALL,   42,   49, WALL},
                             {WALL,   43,   50,   41},
                             {  35,   44, WALL,   42},
                             {WALL,   45, WALL,   43},
                             {WALL,   46,   53,   44},
                             {WALL,   47, WALL,   45},
                             {WALL,   48, WALL,   46},
                             {WALL, WALL, WALL,   47},
                             {  41, WALL, WALL, WALL},
                             {  42, WALL,   58, WALL},
                             {WALL,   52, WALL, WALL},
                             {WALL, WALL,   60,   51},
                             {  45,   54,   61, WALL},
                             {WALL,   55, WALL,   53},
                             {WALL,   56, WALL,   54},
                             {WALL, WALL,   64,   55},
                             {WALL,   58, WALL, WALL},
                             {  50,   59, WALL,   57},
                             {WALL,   60, WALL,   58},
                             {  52, WALL, WALL,   59},
                             {  53, WALL, WALL, WALL},
                             {WALL,   63, WALL, WALL},
                             {WALL,   64, WALL,   62},
                             {  56, WALL, WALL,   63}};
    int         [][]place2 = {{WALL,    2,    9, WALL},
            {WALL,    3, WALL,    1},
            {WALL,    4, WALL,    2},
            {WALL, WALL,   12,    3},
            {WALL,    6,   13, WALL},
            {WALL, WALL,   14,    5},
            {WALL, WALL,   15, WALL},
            {WALL, WALL,   16, WALL},
            {   1, WALL,   17, WALL},
            {WALL,   11,   18, WALL},
            {WALL, WALL, WALL,   10},
            {   4, WALL,   20, WALL},
            {   5, WALL, WALL, WALL},
            {   6,   15,   22, WALL},
            {   7,   16, WALL,   14},
            {   8, WALL, WALL,   15},
            {   9, WALL,   25, WALL},
            {  10, WALL,   26, WALL},
            {WALL,   20,   27, WALL},
            {  12,   21, WALL,   19},
            {WALL,   22, WALL,   20},
            {  14,   23,   30,   21},
            {WALL,   24, WALL,   22},
            {WALL, WALL, WALL,   23},
            {  17,   26, WALL, WALL},
            {  18, WALL, WALL,   25},
            {  19, WALL,   35, WALL},
            {WALL,   29, WALL, WALL},
            {WALL,   30, WALL,   28},
            {  22, WALL, WALL,   29},
            {WALL,   32,   39, WALL},
            {WALL, WALL, WALL,   31},
            {WALL,   34, WALL, WALL},
            {WALL,   35, WALL,   33},
            {  27,   36,   43,   34},
            {WALL,   37, WALL,   35},
            {WALL,   38, WALL,   36},
            {WALL,   39, WALL,   37},
            {  31,   40, WALL,   38},
            {WALL, WALL, WALL,   39},
            {WALL,   42,   49, WALL},
            {WALL,   43,   50,   41},
            {  35,   44, WALL,   42},
            {WALL,   45, WALL,   43},
            {WALL,   46,   53,   44},
            {WALL,   47, WALL,   45},
            {WALL,   48, WALL,   46},
            {WALL, WALL, WALL,   47},
            {  41, WALL, WALL, WALL},
            {  42, WALL,   58, WALL},
            {WALL,   52, WALL, WALL},
            {WALL, WALL,   60,   51},
            {  45,   54,   61, WALL},
            {WALL,   55, WALL,   53},
            {WALL,   56, WALL,   54},
            {WALL, WALL,   64,   55},
            {WALL,   58, WALL, WALL},
            {  50,   59, WALL,   57},
            {WALL,   60, WALL,   58},
            {  52, WALL, WALL,   59},
            {  53, WALL, WALL, WALL},
            {WALL,   63, WALL, WALL},
            {WALL,   64, WALL,   62},
            {  56, WALL, WALL,   63}};
    // orientation[orientationBefore][roboTurn] retorna a
    // nova orientação do robô
    // orientationBefore: de Norte para Oeste - no sentido
    // dos ponteiros do relógio
    // roboTurn: 0 virar esquerda e 1 virar direita
    int         [][]orientation = {{ WEST,  EAST},
                                   {NORTH, SOUTH},
                                   { EAST,  WEST},
                                   {SOUTH, NORTH}};
    
    /** Creates a new instance of World */
    public World() {
    }

    // O Liberu move em frente, de <localBefore> na
    // <orientation>, retorna o novo <local> ou WALL
    public int move(int localBefore, int orientation) {
        
        return place[localBefore-1][orientation-1];
    }
    
    // Para cada local retorna o elemento
    public int element(int local) {
        
        return elements[local-1];
    }
    
    // Para uma orientationBefore e roboTurn retorna a
    // nova orientation
    public int orientate(int orientationBefore, int roboTurn) {
        
        return orientation[orientationBefore - 1]
        				  [roboTurn - Brain.TURN_LEFT];
    }
    
    // Para um local e orientation retorna o próximo local
    public int vision(int local, int orientation) {
        
        return move(local, orientation);
    }
}