package Roguelike.Ability.ActiveAbility.EffectType;
import java.util.HashMap;
import Roguelike.Entity.EnvironmentEntity;
import Roguelike.Entity.GameEntity;
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.Entity.Entity;
import Roguelike.Tiles.GameTile;
import com.badlogic.gdx.utils.XmlReader.Element;
import exp4j.Helpers.EquationHelper;
public class EffectTypeHeal extends AbstractEffectType
{
private boolean self;
private String equation;
private String[] reliesOn;
@Override
public void parse( Element xml )
{
reliesOn = xml.getAttribute( "ReliesOn", "" ).split( "," );
equation = xml.getText().toLowerCase();
self = xml.getBooleanAttribute( "Self", false );
}
@Override
public void update( ActiveAbility aa, float time, GameTile tile, GameEntity entity, EnvironmentEntity envEntity )
{
if (self)
{
applyToEntity( aa.getCaster(), aa);
}
else
{
if ( entity != null )
{
applyToEntity( entity, aa );
}
if ( envEntity != null )
{
applyToEntity( envEntity, aa );
}
}
}
private void applyToEntity( Entity e, ActiveAbility aa )
{
int raw = getHealing( aa );
e.applyHealing( raw );
}
private int getHealing( ActiveAbility aa )
{
HashMap<String, Integer> variableMap = aa.getVariableMap();
for ( String name : reliesOn )
{
if ( !variableMap.containsKey( name.toLowerCase() ) )
{
variableMap.put( name.toLowerCase(), 0 );
}
}
return EquationHelper.evaluate( equation, variableMap );
}
@Override
public AbstractEffectType copy()
{
EffectTypeHeal heal = new EffectTypeHeal();
heal.equation = equation;
heal.reliesOn = reliesOn;
heal.self = self;
return heal;
}
@Override
public Array<String> toString( ActiveAbility aa )
{
Array<String> lines = new Array<String>( );
lines.add( "Heals " + getHealing( aa ) + " health" );
return lines;
}
}