package Roguelike.Ability.ActiveAbility.EffectType;
import Roguelike.Entity.EnvironmentEntity;
import Roguelike.Entity.GameEntity;
import Roguelike.Fields.FieldInteractionTypes.AbstractFieldInteractionType;
import Roguelike.Util.FastEnumMap;
import com.badlogic.gdx.utils.Array;
import net.objecthunter.exp4j.Expression;
import net.objecthunter.exp4j.ExpressionBuilder;
import Roguelike.Global;
import Roguelike.Ability.ActiveAbility.ActiveAbility;
import Roguelike.Fields.Field;
import Roguelike.Tiles.GameTile;
import com.badlogic.gdx.utils.XmlReader.Element;
import exp4j.Helpers.EquationHelper;
import java.util.HashMap;
public class EffectTypeFieldInteraction extends AbstractEffectType
{
public String condition;
public String[] tags;
public String stacksEqn;
private String[] reliesOn;
@Override
public void parse( Element xml )
{
reliesOn = xml.getAttribute( "ReliesOn", "" ).toLowerCase().split( "," );
condition = xml.getAttribute( "Condition", null );
if ( condition != null )
{
condition = condition.toLowerCase();
}
tags = xml.getText().toLowerCase().split( "," );
stacksEqn = xml.getAttribute( "Stacks", null );
if ( stacksEqn != null )
{
stacksEqn = stacksEqn.toLowerCase();
}
}
@Override
public void update( ActiveAbility aa, float time, GameTile tile, GameEntity entity, EnvironmentEntity envEntity )
{
if ( !tile.hasFields )
{
return;
}
HashMap<String, Integer> variableMap = aa.getVariableMap();
for ( String name : reliesOn )
{
if ( !variableMap.containsKey( name.toLowerCase() ) )
{
variableMap.put( name.toLowerCase(), 0 );
}
}
if ( condition != null )
{
int conditionVal = EquationHelper.evaluate( condition, variableMap );
if ( conditionVal == 0 ) { return; }
}
int stacks = 1;
if ( stacksEqn != null )
{
stacks = EquationHelper.evaluate( stacksEqn, variableMap );
}
if ( stacks > 0 )
{
Field test = new Field();
test.tags = tags;
test.stacks = stacks;
FastEnumMap<Field.FieldLayer, Field> fieldStore = new FastEnumMap<Field.FieldLayer, Field>( Field.FieldLayer.class );
for ( Field.FieldLayer layer : Field.FieldLayer.values() )
{
Field tileField = tile.fields.get( layer );
if ( tileField != null )
{
// First check for interaction on self
Field srcField = tileField;
Field dstField = test;
AbstractFieldInteractionType interaction = Field.getInteraction( srcField.fieldInteractions, dstField );
if ( interaction != null )
{
if ( !fieldStore.containsKey( layer ) )
{
fieldStore.put( layer, null );
}
tile.fields.put( layer, null );
Field field = interaction.process( srcField, dstField );
if ( field != null )
{
fieldStore.put( field.layer, field );
}
}
else
{
fieldStore.put( tileField.layer, tileField );
}
}
}
for ( Field.FieldLayer layer : Field.FieldLayer.values() )
{
if ( fieldStore.containsKey( layer ) )
{
Field field = fieldStore.get( layer );
if ( field == null )
{
tile.clearField( layer );
}
else
{
tile.addField( field );
}
}
}
}
}
@Override
public AbstractEffectType copy()
{
EffectTypeFieldInteraction e = new EffectTypeFieldInteraction();
e.condition = condition;
e.tags = tags;
e.stacksEqn = stacksEqn;
e.reliesOn = reliesOn;
return e;
}
@Override
public Array<String> toString( ActiveAbility aa )
{
return new Array<String>( );
}
}