package Roguelike.GameEvent.Damage; import java.util.HashMap; import Roguelike.Entity.Entity; import net.objecthunter.exp4j.Expression; import net.objecthunter.exp4j.ExpressionBuilder; import Roguelike.Global; import Roguelike.GameEvent.IGameObject; import Roguelike.StatusEffect.StatusEffect; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.XmlReader.Element; import exp4j.Helpers.EquationHelper; public final class StatusEvent extends AbstractOnDamageEvent { public String condition; public Element statusData; public String stacksEqn; private String[] reliesOn; @Override public void applyQuality( int quality ) { condition = condition.replace( "quality", ""+quality ); stacksEqn = stacksEqn.replace( "quality", ""+quality ); } @Override public boolean handle( Entity entity, DamageObject obj, IGameObject parent ) { HashMap<String, Integer> variableMap = entity.getVariableMap(); for ( String name : reliesOn ) { if ( !variableMap.containsKey( name.toLowerCase() ) ) { variableMap.put( name.toLowerCase(), 0 ); } } variableMap.put( "damage", obj.damage ); if ( condition != null ) { int conditionVal = EquationHelper.evaluate( condition, variableMap ); if ( conditionVal == 0 ) { return false; } } int stacks = 1; if ( stacksEqn != null ) { stacks = EquationHelper.evaluate( stacksEqn, variableMap ); } for ( int i = 0; i < stacks; i++ ) { entity.addStatusEffect( StatusEffect.load( statusData, parent ) ); } return true; } @Override public void parse( Element xml ) { reliesOn = xml.getAttribute( "ReliesOn", "" ).split( "," ); condition = xml.getAttribute( "Condition", null ); if ( condition != null ) { condition = condition.toLowerCase(); } stacksEqn = xml.getAttribute( "Stacks", null ); if ( stacksEqn != null ) { stacksEqn = stacksEqn.toLowerCase(); } statusData = xml; } @Override public Array<String> toString( HashMap<String, Integer> variableMap, IGameObject parent ) { Array<String> lines = new Array<String>(); lines.add( "Spawns a status:" ); StatusEffect status = StatusEffect.load( statusData, parent ); lines.addAll( status.toString( variableMap, false ) ); return lines; } }