package Roguelike.Ability.ActiveAbility.EffectType;
import Roguelike.Ability.ActiveAbility.ActiveAbility;
import Roguelike.Entity.Entity;
import Roguelike.Entity.EnvironmentEntity;
import Roguelike.Entity.GameEntity;
import Roguelike.Global;
import Roguelike.StatusEffect.StatusEffect;
import Roguelike.Tiles.GameTile;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.XmlReader;
import exp4j.Helpers.EquationHelper;
import java.util.HashMap;
/**
* Created by Philip on 26/12/2015.
*/
public class EffectTypeSummon extends AbstractEffectType
{
String entityName;
int duration;
String[] reliesOn;
String countEqn;
@Override
public void update( ActiveAbility aa, float time, GameTile tile, GameEntity gentity, EnvironmentEntity envEntity )
{
HashMap<String, Integer> variableMap = aa.getVariableMap();
for ( String name : reliesOn )
{
if ( !variableMap.containsKey( name ) )
{
variableMap.put( name, 0 );
}
}
int count = EquationHelper.evaluate( countEqn, variableMap );
for (int i = 0; i < count; i++)
{
GameEntity entity = GameEntity.load( entityName );
entity.factions = aa.getCaster().factions;
entity.essence = 0;
StatusEffect status = StatusEffect.load( "Summon" );
status.duration = duration;
entity.addStatusEffect( status );
if ( tile.entity == null && tile.getPassable( entity.getTravelType(), entity ) )
{
tile.addGameEntity( entity );
}
else
{
for ( Global.Direction dir : Global.Direction.values() )
{
GameTile testTile = tile.level.getGameTile( tile.x + dir.getX(), tile.y + dir.getY() );
if ( testTile != null && testTile.entity == null && testTile.getPassable( entity.getTravelType(), entity ) )
{
testTile.addGameEntity( entity );
break;
}
}
}
}
}
@Override
public void parse( XmlReader.Element xml )
{
reliesOn = xml.getAttribute( "ReliesOn", "" ).toLowerCase().split( "," );
countEqn = xml.getAttribute( "Count", "1" ).toLowerCase();
entityName = xml.getText();
duration = xml.getIntAttribute( "Duration", 10 );
}
@Override
public AbstractEffectType copy()
{
EffectTypeSummon cpy = new EffectTypeSummon();
cpy.entityName = entityName;
cpy.duration = duration;
cpy.reliesOn = reliesOn;
cpy.countEqn = countEqn;
return cpy;
}
@Override
public Array<String> toString( ActiveAbility aa )
{
Array<String> lines = new Array<String>( );
lines.add( "Summons " + entityName + " for " + duration + " turns." );
return lines;
}
}