package net.mostlyoriginal.game.system.ship;
import com.artemis.Aspect;
import com.artemis.ComponentMapper;
import com.artemis.Entity;
import com.artemis.annotations.Wire;
import com.artemis.managers.TagManager;
import com.artemis.systems.EntityProcessingSystem;
import com.badlogic.gdx.math.MathUtils;
import net.mostlyoriginal.game.component.environment.RouteNode;
import net.mostlyoriginal.game.component.ship.CrewMember;
import net.mostlyoriginal.game.component.ship.Travels;
import net.mostlyoriginal.game.system.ui.ConstructionSystem;
import net.mostlyoriginal.game.system.ui.DilemmaSystem;
import net.mostlyoriginal.game.system.ui.RouteSystem;
/**
* @author Daan van Yperen
*/
@Wire
public class TravelSimulationSystem extends EntityProcessingSystem {
public static final int WARP_COOLDOWN = 5;
protected RouteSystem routeSystem;
protected ComponentMapper<Travels> mTravels;
protected ComponentMapper<RouteNode> mRouteNode;
private TagManager tagManager;
private boolean traveling;
private DilemmaSystem dilemmaSystem;
private InventorySystem inventorySystem;
private CrewSystem crewSystem;
private LifesupportSimulationSystem lifesupportSimulationSystem;
private ProductionSimulationSystem productionSimulationSystem;
private ConstructionSystem constructionSystem;
public TravelSimulationSystem() {
super(Aspect.getAspectForAll(Travels.class));
}
/** immediately warp, and continue warping if required */
public void warp(int speed)
{
// cost to travel to next warp point.
if (handleNoPilotsLeft()) return;
if ( inventorySystem.get(InventorySystem.Resource.FUEL) < 1 )
{
dilemmaSystem.outOfFuelDilemma();
return;
}
final Entity entity = routeSystem.gotoNext();
if ( entity != null && mRouteNode.has(entity) ) {
RouteNode.Action action = mRouteNode.get(entity).action;
// only tick when we are not skipping a step in route.
if ( action != RouteNode.Action.SKIP || speed == 0 ) {
// step the lifesupport system forward.
productionSimulationSystem.process();
lifesupportSimulationSystem.process();
}
switch (action)
{
case SKIP:
if ( speed > 0 )
{
warp(speed-1);
} else {
planWarp();
}
break;
case EVENT:
dilemmaSystem.randomDilemma();
break;
case FINISH:
dilemmaSystem.victoryDilemma();
break;
}
}
}
private boolean handleNoPilotsLeft() {
if ( crewSystem.countOf(CrewMember.Ability.PILOT) <= 0 )
{
dilemmaSystem.noPilotsDilemma();
return true;
}
return false;
}
/** schedule a warp! */
public void planWarp() {
if (handleNoPilotsLeft()) return;
constructionSystem.stopConstructionmode();
Entity shipMetadata = getShipMetadata();
if ( shipMetadata != null )
{
Travels travels = mTravels.get(shipMetadata);
if ( travels != null )
{
travels.nextJumpAfterCooldown = WARP_COOLDOWN;
}
}
}
private Entity getShipMetadata() {
return tagManager.getEntity("travels");
}
@Override
protected void process(Entity e) {
Travels travels = mTravels.get(e);
if ( travels != null )
{
if ( travels.nextJumpAfterCooldown != 0 ) {
travels.nextJumpAfterCooldown -= world.delta;
if (travels.nextJumpAfterCooldown <= 0) {
travels.nextJumpAfterCooldown=0;
warp(MathUtils.random(1, MathUtils.clamp(inventorySystem.get(InventorySystem.Resource.THRUST),1,99)));
}
}
}
}
public boolean isTraveling() {
Entity shipMetadata = getShipMetadata();
if ( shipMetadata != null )
{
Travels travels = mTravels.get(shipMetadata);
if ( travels != null )
{
return travels.nextJumpAfterCooldown > 0;
}
}
return false;
}
}