package Roguelike.GameEvent.OnTask; import java.util.HashMap; import net.objecthunter.exp4j.Expression; import net.objecthunter.exp4j.ExpressionBuilder; import Roguelike.Entity.Entity; import Roguelike.Entity.Tasks.AbstractTask; import Roguelike.GameEvent.IGameObject; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.XmlReader.Element; import exp4j.Helpers.EquationHelper; public final class CostTaskEvent extends AbstractOnTaskEvent { private String condition; private String[] reliesOn; private String costEqn; @Override public boolean handle( Entity entity, AbstractTask task, IGameObject parent ) { HashMap<String, Integer> variableMap = entity.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 false; } } ExpressionBuilder expB = EquationHelper.createEquationBuilder( costEqn ); EquationHelper.setVariableNames( expB, variableMap, "" ); expB.variable( "cost" ); Expression exp = EquationHelper.tryBuild( expB ); if ( exp == null ) { return false; } EquationHelper.setVariableValues( exp, variableMap, "" ); exp.setVariable( "cost", task.cost ); float cost = (float) exp.evaluate(); task.cost = cost; return true; } @Override public void parse( Element xml ) { condition = xml.getAttribute( "Condition", null ); if ( condition != null ) { condition = condition.toLowerCase(); } reliesOn = xml.getAttribute( "ReliesOn", "" ).split( "," ); costEqn = xml.getText().toLowerCase(); } @Override public Array<String> toString( HashMap<String, Integer> variableMap, String eventType, IGameObject parent ) { Array<String> lines = new Array<String>(); lines.add( eventType + " actions cost " + costEqn ); return lines; } }