package com.ftloverdrive.ui.ship;
import java.util.Set;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.g2d.NinePatch;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.utils.NinePatchDrawable;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Disposable;
import com.badlogic.gdx.utils.Pools;
import com.ftloverdrive.core.OverdriveContext;
import com.ftloverdrive.model.ship.ShipCoordinate;
import com.ftloverdrive.util.OVDConstants;
/**
* All the lines for room contours on a ship.
*
* After construction, set the height, then call addTile() for all
* ShipCoordinates.
*
* The original tiles drew gray lines in the bottom-right.
* Wall lines were overlaid on any edge as needed.
* 2px black wall, 32px white, 1px gray.
* 34px white, 1px gray.
*/
public class ShipWallLinesActor extends Actor implements Disposable {
protected float tileSize = 35;
protected AssetManager assetManager;
protected Array<Image> tiles;
private int tileIndex = 0; // Micro-optimization to reuse a loop var.
public ShipWallLinesActor( OverdriveContext context ) {
super();
assetManager = context.getAssetManager();
assetManager.load( OVDConstants.FLOORPLAN_ATLAS, TextureAtlas.class );
assetManager.finishLoading();
tiles = new Array<Image>();
}
/**
* Sets a new tile size (default: 35).
*
* The clear() method should be called first, if tiles have been added.
*/
public void setTileSize( float n ) {
tileSize = n;
}
/**
* Removes all floor tiles.
*/
public void clear() {
tiles.clear();
}
@Override
public void draw( SpriteBatch batch, float parentAlpha ) {
super.draw( batch, parentAlpha );
for ( tileIndex = tiles.size-1; tileIndex >= 0; tileIndex-- ) {
tiles.get( tileIndex ).draw( batch, parentAlpha );
}
}
protected float calcTileX( ShipCoordinate coord ) {
return ( coord.x * tileSize );
}
protected float calcTileY( ShipCoordinate coord ) {
return ( this.getHeight() - ( coord.y * tileSize ) );
}
/**
* Adds a tile to represent a ShipCoordinate.
*/
public void addTile( ShipCoordinate coord, Set<ShipCoordinate> allCoords ) {
if ( coord.v != 0 ) return;
ShipCoordinate tmpCoord = Pools.get( ShipCoordinate.class ).obtain();
tmpCoord.init( coord.x, coord.y, 1 );
boolean nWall = allCoords.contains( tmpCoord ) ? true : false;
tmpCoord.init( coord.x, coord.y+1, 1 );
boolean sWall = allCoords.contains( tmpCoord ) ? true : false;
tmpCoord.init( coord.x, coord.y, 2 );
boolean wWall = allCoords.contains( tmpCoord ) ? true : false;
tmpCoord.init( coord.x+1, coord.y, 2 );
boolean eWall = allCoords.contains( tmpCoord ) ? true : false;
boolean nwCorner = false;
boolean neCorner = false;
boolean swCorner = false;
boolean seCorner = false;
tmpCoord.init( coord.x, coord.y-1, 2 );
if ( allCoords.contains( tmpCoord ) ) nwCorner = true;
tmpCoord.init( coord.x-1, coord.y, 1 );
if ( allCoords.contains( tmpCoord ) ) nwCorner = true;
/*
tmpCoord.init( coord.x+1, coord.y-1, 2 );
if ( allCoords.contains( tmpCoord ) ) neCorner = true;
tmpCoord.init( coord.x+1, coord.y, 1 );
if ( allCoords.contains( tmpCoord ) ) neCorner = true;
tmpCoord.init( coord.x, coord.y+1, 2 );
if ( allCoords.contains( tmpCoord ) ) swCorner = true;
tmpCoord.init( coord.x-1, coord.y+1, 1 );
if ( allCoords.contains( tmpCoord ) ) swCorner = true;
tmpCoord.init( coord.x+1, coord.y+1, 2 );
if ( allCoords.contains( tmpCoord ) ) seCorner = true;
tmpCoord.init( coord.x+1, coord.y+1, 1 );
if ( allCoords.contains( tmpCoord ) ) seCorner = true;
*/
String regionName = null;
if ( nWall && sWall && wWall && eWall ) {
regionName = "wall-side-n,s,e,w";
}
else if ( nwCorner && neCorner && swCorner && seCorner ) {
regionName = "wall-corner-nw,ne,sw,se";
}
else if ( nWall && !sWall && !wWall && !eWall && !swCorner && !seCorner ) {
regionName = "wall-side-n";
}
else if ( !nWall && !sWall && !wWall && eWall && !nwCorner && !swCorner ) {
regionName = "wall-side-e";
}
else if ( !nWall && sWall && !wWall && !eWall && !nwCorner && !neCorner ) {
regionName = "wall-side-s";
}
else if ( !nWall && !sWall && wWall && !eWall && !neCorner && !seCorner ) {
regionName = "wall-side-w";
}
else if ( nWall && !sWall && wWall && !eWall && !seCorner ) {
regionName = "wall-side-n,w";
}
else if ( nWall && !sWall && !wWall && eWall && !swCorner ) {
regionName = "wall-side-n,e";
}
else if ( !nWall && sWall && wWall && !eWall && !neCorner ) {
regionName = "wall-side-s,w";
}
else if ( !nWall && sWall && !wWall && eWall && !nwCorner ) {
regionName = "wall-side-s,e";
}
else if ( nWall && !sWall && wWall && eWall ) {
regionName = "wall-side-n,e,w";
}
else if ( nWall && sWall && !wWall && eWall ) {
regionName = "wall-side-n,s,e";
}
else if ( !nWall && sWall && wWall && eWall ) {
regionName = "wall-side-s,e,w";
}
else if ( nWall && sWall && wWall && !eWall ) {
regionName = "wall-side-n,s,w";
}
else if ( !nWall && !sWall && !wWall && !eWall && nwCorner && !neCorner && !swCorner && !seCorner ) {
regionName = "wall-corner-nw";
}
else if ( !nWall && !sWall && !wWall && !eWall && !nwCorner && neCorner && !swCorner && !seCorner ) {
regionName = "wall-corner-ne";
}
else if ( !nWall && !sWall && !wWall && !eWall && !nwCorner && !neCorner && swCorner && !seCorner ) {
regionName = "wall-corner-sw";
}
else if ( !nWall && !sWall && !wWall && !eWall && !nwCorner && !neCorner && !swCorner && seCorner ) {
regionName = "wall-corner-se";
}
else if ( !nWall && !sWall && !wWall && !eWall && nwCorner && neCorner && !swCorner && !seCorner ) {
regionName = "wall-corner-nw,ne";
}
else if ( !nWall && !sWall && !wWall && !eWall && !nwCorner && neCorner && !swCorner && seCorner ) {
regionName = "wall-corner-ne,se";
}
else if ( !nWall && !sWall && !wWall && !eWall && !nwCorner && !neCorner && swCorner && seCorner ) {
regionName = "wall-corner-sw,se";
}
else if ( !nWall && !sWall && !wWall && !eWall && nwCorner && !neCorner && !swCorner && !seCorner ) {
regionName = "wall-corner-nw,sw";
}
else if ( !nWall && !sWall && !wWall && !eWall && nwCorner && neCorner && swCorner && !seCorner ) {
regionName = "wall-corner-nw,ne,sw";
}
else if ( !nWall && !sWall && !wWall && !eWall && !nwCorner && neCorner && !swCorner && seCorner ) {
regionName = "wall-corner-ne,se";
}
else if ( !nWall && !sWall && !wWall && !eWall && nwCorner && neCorner && !swCorner && seCorner ) {
regionName = "wall-corner-nw,ne,se";
}
else if ( !nWall && !sWall && !wWall && !eWall && nwCorner && !neCorner && swCorner && seCorner ) {
regionName = "wall-corner-nw,sw,se";
}
else if ( nWall && !sWall && !wWall && !eWall && swCorner && !seCorner ) {
regionName = "wall-corner-n,sw";
}
else if ( !nWall && !sWall && !wWall && eWall && nwCorner && !swCorner ) {
regionName = "wall-corner-e,nw";
}
else if ( !nWall && sWall && !wWall && !eWall && !nwCorner && neCorner ) {
regionName = "wall-corner-s,ne";
}
else if ( !nWall && !sWall && wWall && !eWall && !neCorner && seCorner ) {
regionName = "wall-corner-w,se";
}
else if ( nWall && !sWall && !wWall && !eWall && swCorner && seCorner ) {
regionName = "wall-corner-n,sw,se";
}
else if ( !nWall && !sWall && !wWall && eWall && nwCorner && swCorner ) {
regionName = "wall-corner-e,nw,sw";
}
else if ( !nWall && sWall && !wWall && !eWall && nwCorner && neCorner ) {
regionName = "wall-corner-s,nw,ne";
}
else if ( !nWall && !sWall && wWall && !eWall && neCorner && seCorner ) {
regionName = "wall-corner-w,ne,se";
}
else if ( nWall && !sWall && wWall && !eWall && seCorner ) {
regionName = "wall-corner-n,w,se";
}
else if ( nWall && !sWall && !wWall && eWall && swCorner ) {
regionName = "wall-corner-n,e,sw";
}
else if ( !nWall && sWall && !wWall && eWall && nwCorner ) {
regionName = "wall-corner-s,e,nw";
}
else if ( !nWall && sWall && wWall && !eWall && neCorner ) {
regionName = "wall-corner-s,w,ne";
}
if ( regionName != null ) {
TextureAtlas floorAtlas = assetManager.get( OVDConstants.FLOORPLAN_ATLAS, TextureAtlas.class );
TextureRegion tileRegion = floorAtlas.findRegion( regionName );
NinePatchDrawable tileDrawable = new NinePatchDrawable( new NinePatch( tileRegion, 2, 2, 2, 2 ) );
Image tileImage = new Image( tileDrawable );
tileImage.setPosition( calcTileX( coord ), calcTileY( coord ) );
tileImage.setSize( tileSize, tileSize );
tiles.add( tileImage );
}
// These are different floats which can cause gaps when mixed.
// (x * size + size) != ((x+1) * size)
}
@Override
public void dispose() {
assetManager.unload( OVDConstants.FLOORPLAN_ATLAS );
}
}