package org.multiverseking.loader;
import com.jme3.app.SimpleApplication;
import com.simsilica.es.PersistentComponent;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.multiverseking.ability.ActionAbility;
import org.multiverseking.ability.ActionAbilityComponent;
import org.multiverseking.field.collision.CollisionComponent;
import org.multiverseking.utility.component.HealthComponent;
import org.multiverseking.field.position.component.SpeedComponent;
import org.multiverseking.field.position.component.MovementComponent;
/**
* loader to load entity units from file, Contain InitialUnitStatsComponent to
* avoids any use of it outside of the loading.
*
* @todo refactor
* @author roah
*/
public class UnitLoader {
protected final SimpleApplication app;
private final CollisionComponent collisionComponent;
private final InitialUnitStatsComponent initialUnitStatsComponent;
UnitLoader(JSONObject data, EntityLoader eLoader) {
app = eLoader.getApplication();
Number healthPoint = (Number) data.get("healthPoint");
Number atb = (Number) data.get("atb");
Number loadSpeed = (Number) data.get("loadSpeed");
Number moveRange = (Number) data.get("moveRange");
Number moveSpeed = (Number) data.get("moveSpeed");
JSONArray ability = (JSONArray) data.get("Ability");
String[] abilityList = new String[ability.size()];
for (int i = 0; i < ability.size(); i++) {
abilityList[i] = ability.get(i).toString();
}
initialUnitStatsComponent = new InitialUnitStatsComponent(
healthPoint.intValue(),
atb.byteValue(),
loadSpeed.floatValue(),
moveRange.byteValue(),
moveSpeed.floatValue(),
abilityList);
collisionComponent = new CollisionComponent(eLoader.importCollision((JSONObject) data.get("collision")));
}
public CollisionComponent getCollisionComponent() {
return collisionComponent;
}
public InitialUnitStatsComponent getInitialStatsComponent() {
return initialUnitStatsComponent;
}
public class InitialStatsComponent implements PersistentComponent {
private final int healthPoint;
private InitialStatsComponent(int healthPoint) {
this.healthPoint = healthPoint;
}
public int getHealPoint() {
return healthPoint;
}
public HealthComponent getHealthComponent() {
return new HealthComponent(healthPoint);
}
}
public class InitialUnitStatsComponent extends InitialStatsComponent {
private final byte atbSize;
private final float loadSpeed;
private final byte moveRange;
private final float moveSpeed;
private final String[] abilityList;
public InitialUnitStatsComponent(InitialUnitStatsComponent stats) {
super(stats.getHealPoint());
this.atbSize = stats.getAtbSize();
this.loadSpeed = stats.getLoadSpeed();
this.moveRange = stats.getMoveRange();
this.moveSpeed = stats.getMoveSpeed();
this.abilityList = stats.getAbilityList();
}
private InitialUnitStatsComponent(int healthPoint, byte maxAtb, float speed,
byte moveRange, float moveSpeed, String[] abilityList) {
super(healthPoint);
this.atbSize = maxAtb;
this.loadSpeed = speed;
this.moveRange = moveRange;
this.moveSpeed = moveSpeed;
this.abilityList = abilityList;
}
/**
* @return Size of the Atb.Action gauge.
*/
public byte getAtbSize() {
return atbSize;
}
/**
* @return Speed of the unit to load the gauge.
*/
public float getLoadSpeed() {
return loadSpeed;
}
public SpeedComponent getSpeedComponent() {
return new SpeedComponent(loadSpeed);
}
/**
* @return How far the unit can move (Movament gauge Size).
*/
public byte getMoveRange() {
return moveRange;
}
/**
* @return How fast the unit can move from one tile to another.
*/
public float getMoveSpeed() {
return moveSpeed;
}
public MovementComponent getMovementComponent() {
return new MovementComponent(moveRange, moveSpeed);
}
/**
* @return All ability binded to this unit.
*/
public String[] getAbilityList() {
return abilityList;
}
public ActionAbilityComponent getActionAbilityComponent() {
EntityLoader loader = new EntityLoader(app);
ActionAbility[] list = new ActionAbility[abilityList.length];
for (int i = 0; i < abilityList.length; i++) {
list[i] = loader.loadActionAbility(abilityList[i]);
}
return new ActionAbilityComponent(list);
}
}
}