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 FlowSpreadStyle 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 ); updateAccumulator += delta; while ( updateAccumulator >= updateRate && field.stacks > 1 ) { updateAccumulator -= updateRate; Array<GameTile> validTiles = new Array<GameTile>(); for ( Direction dir : Direction.values() ) { GameTile tile = field.tile.level.getGameTile( field.tile.x + dir.getX(), field.tile.y + dir.getY() ); if (tile == null) { continue; } Field tileField = tile.fields.get( field.layer ); if ( tileField != null && tileField.fieldName.equals( field.fieldName ) ) { // same field, only flow down the gradient if ( tileField.stacks < field.stacks ) { validTiles.add( tile ); } } else if ( tile.getPassable( travelType, null ) ) { validTiles.add( tile ); } } if ( validTiles.size > 0 ) { GameTile newTile = validTiles.random(); field.trySpawnInTile( newTile, 1 ); field.stacks--; } } field.setData( "SpreadAccumulator", updateAccumulator ); } @Override public void parse( Element xml ) { updateRate = xml.getFloat( "Update", 0.5f ); travelType = Passability.parseArray( xml.get( "TravelType", "Walk,Entity" ) ); } }