package rabbitescape.engine.textworld;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import rabbitescape.engine.World;
import rabbitescape.engine.util.Position;
import rabbitescape.engine.util.WaterUtil;
public class Chars
{
private final boolean starsMode;
private final char[][] impl;
private final Map<Position, String> stars;
private final int worldWidth, worldHeight;
private final Map<Position, String> waterAmounts;
public Chars( World world, boolean starsMode )
{
this.starsMode = starsMode;
this.worldWidth = world.size.width;
this.worldHeight = world.size.height;
this.impl = new char[worldHeight][worldWidth];
this.stars = new TreeMap<Position, String>();
this.waterAmounts = new TreeMap<Position, String>();
for( int i = 0; i < world.size.height; ++i )
{
Arrays.fill( impl[i], ' ' );
}
}
public void set( int x, int y, char ch )
{
if ( // Rabbits may try to build bridges out of bounds
x < 0
|| y < 0
|| x >= worldWidth
|| y >= worldHeight
)
{
return;
}
set( x, y, ch, null );
}
public void set( int x, int y, char ch, Map<String, String> state )
{
set( x, y, ch, state, 0 );
}
public void set( int x, int y, char ch, Map<String, String> state, int waterAmount )
{
String thisState = encodeState( state );
char currentCh = impl[y][x];
if ( !starsMode || ( thisState == "" && ( currentCh == ' ' ) ) )
{
impl[y][x] = ch;
}
else
{
Position p = new Position( x, y );
String starString = stars.get( p );
if ( starString == null )
{
starString = "";
}
impl[y][x] = '*';
if ( currentCh != '*' && currentCh != ' ' )
{
starString += currentCh;
}
starString += ch + thisState;
stars.put( p, starString );
}
if ( waterAmount > 0
&& ( ( ch == 'n' && waterAmount != WaterUtil.HALF_CAPACITY )
|| ( ch == 'N' && waterAmount != WaterUtil.MAX_CAPACITY ) ) )
{
Position p = new Position( x, y );
waterAmounts.put( p, x + "," + y + "," + waterAmount );
}
}
private String encodeState( Map<String, String> state )
{
if ( state == null || state.size() == 0 )
{
return "";
}
else
{
StringBuilder ret = new StringBuilder();
ret.append( '{' );
boolean begin = true;
for ( Map.Entry<String, String> e : new TreeMap<String, String>( state ).entrySet() )
{
if ( !begin )
{
ret.append( ',' );
}
else
{
begin = false;
}
ret.append( e.getKey() );
ret.append( ':' );
ret.append( e.getValue() );
}
ret.append( '}' );
return ret.toString();
}
}
public int numRows()
{
return impl.length;
}
public int numCols()
{
return impl[0].length;
}
public char[] line( int lineNum )
{
return impl[ lineNum ];
}
public List<String> starLines()
{
List<String> ret = new ArrayList<String>();
for ( Map.Entry<Position, String> e : stars.entrySet() )
{
ret.add( e.getValue() );
}
return ret;
}
public List<String> waterAmountLines()
{
List<String> ret = new ArrayList<String>();
for ( String amountString : waterAmounts.values() )
{
ret.add( amountString );
}
return ret;
}
}