package edu.ups.gamedev.terrain.tile;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Random;
import java.util.Set;
import javax.imageio.ImageIO;
import com.jme.image.Texture;
import com.jme.math.Vector2f;
import com.jme.math.Vector3f;
import com.jme.renderer.Renderer;
import com.jmex.terrain.util.ImageBasedHeightMap;
public class TileMap {
private int tilesWide;
private int tilesHigh;
private int[][] tileData;
private Tile[][] tileStore;
private TileTexture[] tileTextures;
private ImageBasedHeightMap heightMap;
private static Hashtable<String,Vector2f> ht = null;
public TileMap(File tileMapFile, ImageBasedHeightMap heightMap, File[] tiles) {
this.heightMap = heightMap;
BufferedImage bf;
try {
bf = ImageIO.read(tileMapFile);
tilesHigh = bf.getHeight();
tilesWide = bf.getWidth();
tileStore = new Tile[tilesWide][tilesHigh];
tileData = new int[tilesWide][tilesHigh];
for (int x = 0; x < tilesWide; x++) {
for (int y = 0; y < tilesHigh; y++) {
tileData[x][y] = bf.getRGB(x, y);
}
}
} catch (IOException e) {
e.printStackTrace();
}
tileTextures = new TileTexture[tiles.length];
int tileOrder = 0;
for (File tile : tiles) {
tileTextures[tileOrder] = new TileTexture(tile, tileOrder);
tileOrder++;
}
genTileCoords();
}
public int getTilesWide() {
return tilesWide;
}
public int getTilesHigh() {
return tilesHigh;
}
public Tile getTileAtPoint(Vector2f point) {
return getTileAtPoint((int) point.x, (int) point.y);
}
public Tile getTileAtPoint(int x, int y) {
if (tileStore[x][y] == null) {
tileStore[x][y] = createTileAtPoint(x, y);
}
return tileStore[x][y];
}
public int tileIndexForColor( int color ){
switch( color ) {
case -16776961:
return 0;
case -16711936:
return 1;
case -65536:
return 2;
case -1:
return 0;
default:
System.out.println( "Couldn't handle color " + color );
return 0;
}
}
public Set<String> keys = new HashSet<String>();
public Tile createTileAtPoint(int x, int y) {
Tile result = null;
System.out.println( x + ", " + y );
Vector3f origin = new Vector3f( (float)x * 1.99f, (float)y * 1.99f, 0.0f );
if (x > 1 && y > 1 && x+1 < tilesWide && y+1 < tilesHigh) {
int same = tileData[x][y];
int different = -1;
String key = "";
for( int k = -1; k < 2; k++ ) {
for( int j = 1; j >= -1; j-- ) {
int sample = tileData[x+j][y+k];
if( sample == same ) {
key += "S";
} else {
key += "D";
different = sample;
}
}
}
Vector2f coords = ht.get( key );
int baseTexture = tileIndexForColor( same );
int overTexture = tileIndexForColor( different );
if( coords == null || baseTexture > overTexture ) {
Vector2f newCoord = new Vector2f( 0.0f, 0.0f );
if( ! key.equals( "SSSSSSSSS" )) {
System.out.println( key );
keys.add( key );
} else {
Random r = new Random();
int k = r.nextInt(1000);
if (k > 700) {
int t = r.nextInt(3) + 4;
int b = r.nextInt(4);
newCoord.x = Math.abs(t) * TileTexture.TILE_WIDTH;
newCoord.y = Math.abs(b) * TileTexture.TILE_HEIGHT;
}
}
result = new Tile( origin, heightMap.getHeightMap(), tileTextures[baseTexture].getTexture(), newCoord );
} else {
result = new Tile( origin, heightMap.getHeightMap(), tileTextures[baseTexture].getTexture(), tileTextures[overTexture].getTexture(), new Vector2f(0.0f, 0.0f), coords);
}
}
if( result == null ) {
result = new Tile( origin, heightMap.getHeightMap(), tileTextures[0].getTexture(), new Vector2f(0.0f, 0.0f));
}
return result;
}
public void genTileCoords() {
if( ht == null ) {
ht = new Hashtable<String,Vector2f>();
}
// autogen
ht.put("SDD" +"SSD" +"SDD",new Vector2f( 4 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put("DDS" +"DSS" +"DDD",new Vector2f( 5 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put("SSD" +"SSS" +"SSD",new Vector2f( 5 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
ht.put("DSD" +"DSS" +"DDS",new Vector2f( 6 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("DDD" +"SSS" +"SDD",new Vector2f( 7 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("SDD" +"SSS" +"SSD",new Vector2f( 4 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put("DSD" +"DSD" +"DDS",new Vector2f( 5 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put("DSS" +"SSS" +"DDS",new Vector2f( 5 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
ht.put("SDD" +"SSD" +"DSD",new Vector2f( 5 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
ht.put("SSS" +"SSS" +"DDD",new Vector2f( 6 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
ht.put("SDD" +"DSD" +"DSD",new Vector2f( 4 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("DDD" +"SSD" +"DDD",new Vector2f( 5 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("SSD" +"SSS" +"DDD",new Vector2f( 6 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("DSD" +"DSD" +"DSS",new Vector2f( 5 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put("SSD" +"DSD" +"DSS",new Vector2f( 6 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put("DSS" +"DSD" +"DDD",new Vector2f( 4 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
ht.put("SSD" +"SSD" +"SSD",new Vector2f( 5 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
ht.put("SDD" +"SSD" +"DDD",new Vector2f( 7 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
ht.put("DDD" +"SSS" +"SSS",new Vector2f( 4 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("SSD" +"DSD" +"DSD",new Vector2f( 6 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put("DSS" +"DSS" +"DSD",new Vector2f( 4 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
ht.put("DSD" +"DSS" +"DSS",new Vector2f( 7 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
ht.put("DSS" +"DSS" +"DSS",new Vector2f( 4 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
ht.put("SSD" +"SSS" +"DDS",new Vector2f( 7 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
// RIGHT EDGE
ht.put("SSD" +
"SSD" +
"SSD",
new Vector2f( 2 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
ht.put("SSS" +"SSD" +"SSS",new Vector2f( 2 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
ht.put("SSD" +"SSD" +"SDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT)); // RIGHT HAND TURN
ht.put("SSS" +"SSS" +"SSD",new Vector2f( 2 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put("SSS" +"SSD" +"SSD",new Vector2f( 2 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
ht.put("SSD" +"SSD" +"DDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));// RIGHT HAND TURN
ht.put("SSS" +"SSS" +"SDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put("SSS" +"SSD" +"SDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
ht.put("SSS" +"SSD" +"DDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
// LEFT SMALL
ht.put("SSS" +"SSS" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put("SSS" +"DSS" +"DDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
ht.put("SSS" +"SSS" +"DDS",new Vector2f( 3 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put("DSS" +"SSS" +"SSS",new Vector2f( 0 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
ht.put("DDS" +"SSS" +"SSS",new Vector2f( 0 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("DDD" +"DSS" +"SSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
//back towards right
ht.put("DSS" +"DSS" +"DDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
ht.put("SSS" +"DSS" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
ht.put("DSS" +"DSS" +"DDS",new Vector2f( 3 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
ht.put("DDS" +"DSS" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("DSS" +"DSS" +"SSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
ht.put("DDD" +"SSD" +"SSS",new Vector2f( 2 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("SSD" +"SSS" +"SSS",new Vector2f( 0 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
ht.put("SDD" +"SSS" +"SSS",new Vector2f( 0 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("DDD" +"DSS" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("DDS" +"DSS" +"SSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("SSS" +"DSS" +"DDS",new Vector2f( 3 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
ht.put("SSD" +"SSD" +"SSS",new Vector2f( 2 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
ht.put("DDD" +"SSD" +"SSD",new Vector2f( 2 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("SDD" +"SSD" +"SSD",new Vector2f( 2 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("SDD" +"SSD" +"SSS",new Vector2f( 2 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("SSD" +"SSS" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put("SSD" +"SSD" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put("SSD" +"DSS" +"DDD",new Vector2f( 3 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
ht.put("SDD" +"SSS" +"DDS",new Vector2f( 3 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put("DDD" +"SSD" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put("SSD" +"DSS" +"DSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
// BOTTOM EDGE
ht.put("SSS" +
"SSS" +
"DDD",
new Vector2f( 3 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
// LEFT EDGE
ht.put("DSS" +
"DSS" +
"DSS",
new Vector2f( 1 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
ht.put("SSS" +"DSS" +"SSS",new Vector2f( 1 * TileTexture.TILE_WIDTH, 1 * TileTexture.TILE_HEIGHT));
// TOP EDGE
ht.put("DDD" +
"SSS" +
"SSS",
new Vector2f( 0 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
ht.put("SDS" +"SSS" +"SSS",new Vector2f( 0 * TileTexture.TILE_WIDTH, 3 * TileTexture.TILE_HEIGHT));
// corner A
/* ht.put( "SSD" +
"SSD" +
"SDD",
new Vector2f( 2 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
// corner (above A)
ht.put( "SSS" +
"SSD" +
"SSD",
new Vector2f( 2 * TileTexture.TILE_WIDTH, 0 * TileTexture.TILE_HEIGHT));
ht.put( "SSD" +
"SSD" +
"DDD",
new Vector2f( 2 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
ht.put( "DDSSSSSSS" +
"" +
"",
new Vector2f( 6 * TileTexture.TILE_WIDTH, 2 * TileTexture.TILE_HEIGHT));
*/
/*
*
*
* SSSSSSSSD
SSDSSDDDD
DDSSSSSSS
*/
}
}