package Roguelike.Ability.ActiveAbility.EffectType; import Roguelike.Ability.ActiveAbility.ActiveAbility; import Roguelike.Entity.Entity; import Roguelike.Entity.EnvironmentEntity; import Roguelike.Entity.GameEntity; import Roguelike.GameEvent.Damage.DamageObject; import Roguelike.GameEvent.Damage.StatusEvent; import Roguelike.Global; import Roguelike.StatusEffect.StatusEffect; import Roguelike.Tiles.GameTile; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.XmlReader.Element; import exp4j.Helpers.EquationHelper; import net.objecthunter.exp4j.Expression; import net.objecthunter.exp4j.ExpressionBuilder; import java.util.HashMap; public class EffectTypeStatus extends AbstractEffectType { public String condition; public Element statusData; public String stacksEqn; public boolean self = false; private String[] reliesOn; @Override public void parse( Element xml ) { reliesOn = xml.getAttribute( "ReliesOn", "" ).split( "," ); condition = xml.getAttribute( "Condition", null ); if ( condition != null ) { condition = condition.toLowerCase(); } statusData = xml; self = xml.getBooleanAttribute( "Self", false ); stacksEqn = xml.getAttribute( "Stacks", null ); if ( stacksEqn != null ) { stacksEqn = stacksEqn.toLowerCase(); } StatusEffect.load( statusData, null ); } @Override public void update( ActiveAbility aa, float time, GameTile tile, GameEntity entity, EnvironmentEntity envEntity ) { if ( self ) { handle( aa, aa.getCaster() ); } else { if ( entity != null ) { handle( aa, entity ); } if ( envEntity != null ) { handle( aa, envEntity ); } } } public void handle( ActiveAbility aa, Entity target ) { HashMap<String, Integer> variableMap = aa.getVariableMap(); for ( String name : reliesOn ) { if ( !variableMap.containsKey( name ) ) { variableMap.put(name, 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 ); } for ( int i = 0; i < stacks; i++ ) { StatusEffect status = StatusEffect.load( statusData, aa ); status.extraData.add( new Object[]{ "level", aa.tree.level } ); target.addStatusEffect( status ); } } @Override public AbstractEffectType copy() { EffectTypeStatus e = new EffectTypeStatus(); e.condition = condition; e.statusData = statusData; e.stacksEqn = stacksEqn; e.reliesOn = reliesOn; e.self = self; return e; } @Override public Array<String> toString( ActiveAbility aa ) { Array<String> lines = new Array<String>(); lines.add( "Spawns a status:" ); StatusEffect status = StatusEffect.load( statusData, aa ); lines.addAll( status.toString( aa.getVariableMap(), false ) ); return lines; } }