package Roguelike.Fields.SpreadStyle;
import Roguelike.Global.Direction;
import Roguelike.Global.Passability;
import Roguelike.Fields.Field;
import Roguelike.Tiles.GameTile;
import Roguelike.Util.EnumBitflag;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.XmlReader.Element;
public class WanderSpreadStyle extends AbstractSpreadStyle
{
private EnumBitflag<Passability> travelType;
private float updateRate;
@Override
public void update( float delta, Field field )
{
float updateAccumulator = (Float) field.getData( "SpreadAccumulator", 0.0f );
Direction lastMove = (Direction) field.getData( "LastMove", Direction.CENTER );
updateAccumulator += delta;
while ( updateAccumulator >= updateRate && field.stacks > 0 )
{
updateAccumulator -= updateRate;
Array<Direction> validDirs = new Array<Direction>();
for ( Direction dir : Direction.values() )
{
if ( dir == Direction.CENTER )
{
continue;
}
// prevent going backwards
if ( dir.getX() != lastMove.getX() * -1 || dir.getY() != lastMove.getY() * -1 )
{
GameTile tile = field.tile.level.getGameTile( field.tile.x + dir.getX(), field.tile.y + dir.getY() );
if ( tile.tileData.passableBy.intersect( travelType ) )
{
if ( tile.environmentEntity != null
&& !tile.environmentEntity.canTakeDamage
&& !tile.environmentEntity.passableBy.intersect( travelType ) )
{
// treat as impassible tile
}
else
{
validDirs.add( dir );
}
}
}
}
if ( validDirs.size > 0 )
{
Direction dir = validDirs.random();
GameTile newTile = field.tile.level.getGameTile( field.tile.x + dir.getX(), field.tile.y + dir.getY() );
field.trySpawnInTile( newTile, field.stacks - 1 );
field.tile.clearField( field.layer );
Field newField = newTile.fields.get( field.layer );
if ( newField != null && newField.fieldName.equals( field.fieldName ) )
{
newField.data.put( "LastMove", dir );
if ( field.stacks - 1 == 0 )
{
field.onNaturalDeath();
}
}
return;
}
}
field.setData( "SpreadAccumulator", updateAccumulator );
}
@Override
public void parse( Element xml )
{
updateRate = xml.getFloat( "Update", 0.5f );
travelType = Passability.parseArray( xml.get( "TravelType", "Walk" ) );
}
}