package Roguelike.Fields.SpreadStyle; import Roguelike.Global.Direction; import Roguelike.Global.Passability; import Roguelike.Fields.Field; import Roguelike.Fields.Field.FieldLayer; import Roguelike.Tiles.GameTile; import Roguelike.Util.EnumBitflag; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.XmlReader.Element; public class AdjacentSpreadStyle extends AbstractSpreadStyle { private EnumBitflag<Passability> travelType; private String[] spreadTags; 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 > 0 ) { updateAccumulator -= updateRate; Array<GameTile> validTiles = new Array<GameTile>(); for ( Direction dir : Direction.values() ) { if ( dir == Direction.CENTER ) { continue; } GameTile tile = field.tile.level.getGameTile( field.tile.x + dir.getX(), field.tile.y + dir.getY() ); boolean check = false; if ( tile == null ) { } else if ( tile.entity != null ) { check = true; } else if ( tile.environmentEntity != null && tile.environmentEntity.canTakeDamage ) { check = true; } else if ( tile.fields.size > 0 && spreadTags.length > 0 ) { outer: for ( FieldLayer layer : FieldLayer.values() ) { Field otherfield = tile.fields.get( layer ); if ( otherfield != null ) { for ( String spreadTag : spreadTags ) { for ( String tag : otherfield.tags ) { if ( spreadTag.equals( tag ) ) { check = true; break outer; } } } } } } if ( check && tile.tileData.passableBy.intersect( travelType ) ) { validTiles.add( tile ); } } if ( validTiles.size > 0 ) { GameTile newTile = validTiles.random(); field.trySpawnInTile( newTile, 1 ); } } field.setData( "SpreadAccumulator", updateAccumulator ); } @Override public void parse( Element xml ) { updateRate = xml.getFloat( "Update", 2 ); travelType = Passability.parseArray( xml.get( "TravelType", "Walk" ) ); spreadTags = xml.get( "SpreadTags", "" ).toLowerCase().split( "," ); } }