package org.multiverseking.battle.core;
import org.multiverseking.core.MultiverseGameState;
import com.jme3.app.state.AppStateManager;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.simsilica.es.EntityData;
import com.simsilica.es.EntityId;
import org.hexgridapi.core.coordinate.HexCoordinate;
import org.hexgridapi.core.mousepicking.GridMouseControlAppState;
import org.hexgridapi.utility.Vector2Int;
import org.multiverseking.ability.ActionAbility;
import org.multiverseking.ability.ActionAbilityComponent;
import org.multiverseking.battle.core.ability.ActionSystem;
import org.multiverseking.battle.core.movement.StaminaComponent;
import org.multiverseking.battle.core.focus.MainSelectionSystem;
import org.multiverseking.battle.core.focus.MainFocusComponent;
import org.multiverseking.battle.core.focus.MainFocusSystem;
import org.multiverseking.battle.core.focus.MainTitanComponent;
import org.multiverseking.battle.core.movement.BattleMovementSystem;
import org.multiverseking.battle.gui.BattleGUI;
import org.multiverseking.core.EntityDataAppState;
import org.multiverseking.core.utility.SubSystem;
import org.multiverseking.field.collision.CollisionData;
import org.multiverseking.field.position.HexMovementSystem;
import org.multiverseking.field.position.component.HexPositionComponent;
import org.multiverseking.render.AbstractRender;
import org.multiverseking.render.RenderComponent;
import org.multiverseking.render.RenderSystem;
import org.multiverseking.render.animation.Animation;
import org.multiverseking.render.animation.AnimationComponent;
import org.multiverseking.render.animation.AnimationSystem;
import org.multiverseking.utility.ElementalAttribut;
/**
*
* @author roah
*/
public class BattleSystemTest extends MultiverseGameState implements SubSystem {
private GridMouseControlAppState mouseSystem;
private final EntityId[] playerMainUnitsID = new EntityId[4];
private RenderSystem renderSystem;
private EntityData entityData;
public BattleSystemTest() {
super(/*CollisionSystem.class,*/AnimationSystem.class, HexMovementSystem.class,
ActionSystem.class, BattleGUI.class, MainSelectionSystem.class,
BattleMovementSystem.class, MainFocusSystem.class, BattleInput.class);
}
@Override
public void initializeSystem(AppStateManager stateManager) {
this.renderSystem = app.getStateManager().getState(RenderSystem.class);
this.mouseSystem = app.getStateManager().getState(GridMouseControlAppState.class);
this.entityData = app.getStateManager().getState(EntityDataAppState.class).getEntityData();
renderSystem.registerSubSystem(this, true);
/**
* Load the player titan core to use during the battle.
*/
loadPlayerData();
}
private void loadPlayerData() {
Node playerData = (Node) app.getAssetManager().loadModel(
"Data/playerData.j3o");
playerMainUnitsID[0] = entityData.createEntity();
entityData.setComponents(playerMainUnitsID[0],
new RenderComponent((String) playerData.getUserData("coreName"),
AbstractRender.RenderType.Core, this),
new HexPositionComponent(new HexCoordinate(
HexCoordinate.Coordinate.OFFSET, Vector2Int.fromString(
(String) playerData.getChild("battle").getUserData("corePosition")))),
new AnimationComponent(Animation.SUMMON));
loadTitan(playerData.getChild("battle"));
}
private void loadTitan(Spatial data) {
// @TODO Use the titan loader to get the titan stats and ability.
for (int i = 1; i < 4; i++) {
HexCoordinate pos = new HexCoordinate(HexCoordinate.Coordinate.OFFSET,
Vector2Int.fromString((String) data.getUserData("titan" + i + "Position")));
EntityId id = entityData.createEntity();
playerMainUnitsID[i] = id;
//--------- Action Ability
CollisionData castRange = new CollisionData(0, CollisionData.Type.CIRCLE, 1, 1);
CollisionData effectRange = new CollisionData(0, new HexCoordinate());
String description = "Normal attack";
ActionAbility ability = new ActionAbility("attack", Animation.ATTACK, 25, 1,
ElementalAttribut.EARTH, description, castRange, effectRange);
//---------
entityData.setComponents(id, new RenderComponent((String) data.getUserData("titan" + i),
AbstractRender.RenderType.Titan, this),
new HexPositionComponent(pos.add(Vector2Int.fromString(
(String) data.getUserData("corePosition")))),
new AnimationComponent(Animation.SUMMON),
new StaminaComponent(),
new ActionAbilityComponent(ability),
new MainTitanComponent());
if(i == 1){
entityData.setComponents(id, new MainFocusComponent());
}
}
}
protected void updateSystem(float tpf) {
}
public EntityId[] getMainUnitsID() {
return playerMainUnitsID;
}
@Override
public void cleanupSystem() {
for (EntityId id : playerMainUnitsID) {
entityData.removeEntity(id);
}
renderSystem.removeSubSystem(this, true);
}
@Override
public void rootSystemIsRemoved() {
}
}