package com.captstudios.games.tafl.core.es.model.ai.evaluators;
import com.captstudios.games.tafl.core.es.model.ai.optimization.BitBoard;
public class Corner {
public static final int SOUTH_WEST_CORNER = 0;
public static final int SOUTH_EAST_CORNER = 10;
public static final int NORTH_WEST_CORNER = 110;
public static final int NORTH_EAST_CORNER = 120;
private static final int[] SOUTH_WEST_BARRICADE = {
2, 12, 22
};
private static final int[] SOUTH_WEST_SECONDARY = {
3, 13, 23, 33
};
private static final int[] SOUTH_EAST_BARRICADE = {
8, 20, 32,
};
private static final int[] SOUTH_EAST_SECONDARY = {
7, 19, 31, 43
};
private static final int[] NORTH_WEST_BARRICADE = {
112, 100, 88,
};
private static final int[] NORTH_WEST_SECONDARY = {
77, 89, 101, 113
};
private static final int[] NORTH_EAST_BARRICADE = {
118, 108, 98,
};
private static final int[] NORTH_EAST_SECONDARY = {
87, 97, 107, 117
};
public static BitBoard north;
public static BitBoard south;
public static BitBoard east;
public static BitBoard west;
public int corner;
public int xBarricade;
public int diagBarricade;
public int yBarricade;
public BitBoard secondary;
public int xDirection;
public int yDirection;
public int xNearCorner;
public int yNearCorner;
public BitBoard xHemisphere;
public BitBoard yHemisphere;
public int barricadeSize;
public static Corner getSouthWestCorner(int boardSize, int dimensions) {
Corner corner = new Corner();
corner.corner = SOUTH_WEST_CORNER;
corner.xBarricade = SOUTH_WEST_BARRICADE[0];
corner.diagBarricade = SOUTH_WEST_BARRICADE[1];
corner.yBarricade = SOUTH_WEST_BARRICADE[2];
corner.secondary = new BitBoard(boardSize);
for (int i : SOUTH_WEST_SECONDARY) {
corner.secondary.set(i);
}
corner.xNearCorner = 1;
corner.yNearCorner = dimensions;
corner.xDirection = 1;
corner.yDirection = dimensions;
if (north == null) {
createHemispheres(boardSize, dimensions);
}
corner.xHemisphere = west;
corner.yHemisphere = south;
return corner;
}
public static Corner getSouthEastCorner(int boardSize, int dimensions) {
Corner corner = new Corner();
corner.corner = SOUTH_EAST_CORNER;
corner.xBarricade = SOUTH_EAST_BARRICADE[0];
corner.diagBarricade = SOUTH_EAST_BARRICADE[1];
corner.yBarricade = SOUTH_EAST_BARRICADE[2];
corner.secondary = new BitBoard(boardSize);
for (int i : SOUTH_EAST_SECONDARY) {
corner.secondary.set(i);
}
corner.xNearCorner = dimensions - 2;
corner.yNearCorner = dimensions * 2 - 1;
corner.xDirection = -1;
corner.yDirection = dimensions;
if (north == null) {
createHemispheres(boardSize, dimensions);
}
corner.xHemisphere = east;
corner.yHemisphere = south;
return corner;
}
public static Corner getNorthWestCorner(int boardSize, int dimensions) {
Corner corner = new Corner();
corner.corner = NORTH_WEST_CORNER;
corner.xBarricade = NORTH_WEST_BARRICADE[0];
corner.diagBarricade = NORTH_WEST_BARRICADE[1];
corner.yBarricade = NORTH_WEST_BARRICADE[2];
corner.secondary = new BitBoard(boardSize);
for (int i : NORTH_WEST_SECONDARY) {
corner.secondary.set(i);
}
corner.xNearCorner = dimensions * dimensions - dimensions + 1;
corner.yNearCorner = dimensions * dimensions - dimensions * 2;
corner.xDirection = 1;
corner.yDirection = -dimensions;
if (north == null) {
createHemispheres(boardSize, dimensions);
}
corner.xHemisphere = west;
corner.yHemisphere = north;
return corner;
}
public static Corner getNorthEastCorner(int boardSize, int dimensions) {
Corner corner = new Corner();
corner.corner = NORTH_EAST_CORNER;
corner.xBarricade = NORTH_EAST_BARRICADE[0];
corner.diagBarricade = NORTH_EAST_BARRICADE[1];
corner.yBarricade = NORTH_EAST_BARRICADE[2];
corner.secondary = new BitBoard(boardSize);
for (int i : NORTH_EAST_SECONDARY) {
corner.secondary.set(i);
}
corner.xNearCorner = dimensions * dimensions - 2;
corner.yNearCorner = dimensions * dimensions - dimensions - 1;
corner.xDirection = -1;
corner.yDirection = -dimensions;
if (north == null) {
createHemispheres(boardSize, dimensions);
}
corner.xHemisphere = east;
corner.yHemisphere = north;
return corner;
}
private static void createHemispheres(int boardSize, int dimensions) {
int half = dimensions / 2;
north = new BitBoard(boardSize);
south = new BitBoard(boardSize);
east = new BitBoard(boardSize);
west = new BitBoard(boardSize);
for (int i = 0; i < dimensions; i++) {
for (int j = 0; j < dimensions; j++) {
if (i < half) {
south.set(i * dimensions + j);
} else if (i > half) {
north.set(i * dimensions + j);
}
if (j < half) {
west.set(i * dimensions + j);
} else if (j > half) {
east.set(i * dimensions + j);
}
}
}
}
}