package Roguelike.Ability.ActiveAbility.CostType;
import java.util.HashMap;
import net.objecthunter.exp4j.Expression;
import net.objecthunter.exp4j.ExpressionBuilder;
import Roguelike.Global;
import Roguelike.Ability.ActiveAbility.ActiveAbility;
import Roguelike.Entity.Entity.StatusEffectStack;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.XmlReader.Element;
import exp4j.Helpers.EquationHelper;
public class CostTypeStatus extends AbstractCostType
{
private String status;
private String stacksEqn;
private String[] reliesOn;
@Override
public void parse( Element xml )
{
reliesOn = xml.getAttribute( "ReliesOn", "" ).split( "," );
status = xml.getText().toLowerCase();
stacksEqn = xml.getAttribute( "Stacks", "1" ).toLowerCase();
}
@Override
public boolean isCostAvailable( ActiveAbility aa )
{
HashMap<String, Integer> variableMap = aa.getVariableMap();
for ( String name : reliesOn )
{
if ( !variableMap.containsKey( name.toLowerCase() ) )
{
variableMap.put( name.toLowerCase(), 0 );
}
}
Array<StatusEffectStack> stacks = aa.getCaster().stackStatusEffects();
int count = EquationHelper.evaluate( stacksEqn, variableMap );
if ( count == 0 )
{
return false;
}
StatusEffectStack stack = null;
for ( StatusEffectStack s : stacks )
{
if ( s.effect.name.equals( status ) )
{
stack = s;
break;
}
}
if ( stack == null || stack.count < count ) { return false; }
return true;
}
@Override
public void spendCost( ActiveAbility aa )
{
HashMap<String, Integer> variableMap = aa.getVariableMap();
for ( String name : reliesOn )
{
if ( !variableMap.containsKey( name.toLowerCase() ) )
{
variableMap.put( name.toLowerCase(), 0 );
}
}
int count = EquationHelper.evaluate( stacksEqn, variableMap );
for ( int i = 0; i < count; i++ )
{
aa.getCaster().removeStatusEffect( status );
}
}
@Override
public AbstractCostType copy()
{
CostTypeStatus consume = new CostTypeStatus();
consume.status = status;
consume.stacksEqn = stacksEqn;
consume.reliesOn = reliesOn;
return consume;
}
@Override
public String toString( ActiveAbility aa )
{
HashMap<String, Integer> variableMap = aa.getVariableMap();
for ( String name : reliesOn )
{
if ( !variableMap.containsKey( name.toLowerCase() ) )
{
variableMap.put( name.toLowerCase(), 0 );
}
}
Array<StatusEffectStack> stacks = aa.getCaster().stackStatusEffects();
int count = EquationHelper.evaluate( stacksEqn, variableMap );
StatusEffectStack stack = null;
for ( StatusEffectStack s : stacks )
{
if ( s.effect.name.equals( status ) )
{
stack = s;
break;
}
}
String line = "";
if ( stack == null || stack.count < count )
{
line += "[RED]";
}
else
{
line += "[GREEN]";
}
line += "Costs " + count + " " + status;
return line;
}
}