package com.fdangelo.circleworld;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.utils.Disposable;
import com.fdangelo.circleworld.universeengine.objects.Avatar;
import com.fdangelo.circleworld.universeengine.tilemap.Planet;
import com.fdangelo.circleworld.universeview.FollowCameraParameters;
import com.fdangelo.circleworld.universeview.UniverseView;
import com.fdangelo.circleworld.universeview.UniverseViewCamera;
import com.fdangelo.circleworld.universeview.tilemap.PlanetView;
import com.fdangelo.circleworld.utils.Mathf;
public class GameLogic implements Disposable {
private static GameLogic instace;
public AssetManager assetManager;
private UniverseViewCamera universeCamera;
private UniverseView universeView;
private int universeSeed;
private GameLogicState state = GameLogicState.PlayingAvatar;
private float stateTime;
private float universeTimeMultiplier = 1.0f;
public static GameLogic getInstace() {
return instace;
}
public UniverseView getUniverseView() {
return universeView;
}
public GameLogicState getState() {
return state;
}
public GameLogic() {
instace = this;
assetManager = new AssetManager();
assetManager.load("atlas/gui.atlas", TextureAtlas.class);
assetManager.load("atlas/planets.atlas", TextureAtlas.class);
assetManager.load("atlas/player1.atlas", TextureAtlas.class);
assetManager.load("atlas/ships.atlas", TextureAtlas.class);
assetManager.load("atlas/tilemap.atlas", TextureAtlas.class);
switchState(GameLogicState.Loading);
}
public void switchState(final GameLogicState toState) {
state = toState;
stateTime = 0.0f;
switch (toState) {
case Loading:
// Do nothing
break;
case PlayingAvatar:
universeCamera.followObject(getUniverseView().getAvatarView(), FollowCameraParameters.FollowRotation | FollowCameraParameters.FollowScale, true);
break;
case PlayingShip:
universeCamera.followObject(getUniverseView().getShipView(), FollowCameraParameters.None, true);
break;
case Travelling:
// Do nothing
break;
}
}
public void updateAndRender(float deltaTime) {
if (deltaTime > 0.1f) {
deltaTime = 0.1f;
}
stateTime += deltaTime;
switch (state) {
case Loading:
if (assetManager.update()) {
// Loading complete!
// Create layers
universeView = new UniverseView();
universeView.init(universeSeed);
universeCamera = new UniverseViewCamera(getUniverseView().getCamera());
switchState(GameLogicState.PlayingAvatar);
}
break;
case PlayingAvatar:
universeTimeMultiplier = Mathf.lerp(universeTimeMultiplier, 1.0f, 0.25f);
getUniverseView().updateUniverse(deltaTime * universeTimeMultiplier);
universeCamera.update(deltaTime);
break;
case PlayingShip:
universeTimeMultiplier = Mathf.lerp(universeTimeMultiplier, 1.0f, 0.25f);
getUniverseView().updateUniverse(deltaTime * universeTimeMultiplier);
universeCamera.update(deltaTime);
break;
case Travelling:
universeTimeMultiplier = Mathf.lerp(universeTimeMultiplier, 0.1f, 0.25f);
if (stateTime > 1.25f) {
switchState(GameLogicState.PlayingAvatar);
}
getUniverseView().updateUniverse(deltaTime * universeTimeMultiplier);
universeCamera.update(deltaTime);
break;
}
if (getUniverseView() != null) {
getUniverseView().updateLayers(deltaTime);
}
}
public void travelToPlanet(final PlanetView targetPlanetView) {
((Avatar) getUniverseView().getAvatarView().getUniverseObject()).travelToPlanet((Planet) targetPlanetView.getTilemapCircle());
// Force update to update AvatarView position
getUniverseView().updateUniverse(0);
switchState(GameLogicState.Travelling);
}
public void playerBoardShip() {
getUniverseView().getUniverse().getShip().beamUpAvatar(getUniverseView().getUniverse().getAvatar());
switchState(GameLogicState.PlayingShip);
}
public void playerLeaveShip(final Planet planet) {
getUniverseView().getUniverse().getShip().beamDownAvatar(getUniverseView().getUniverse().getAvatar(), planet);
switchState(GameLogicState.PlayingAvatar);
}
@Override
public void dispose() {
if (getUniverseView() != null) {
getUniverseView().dispose();
}
assetManager.dispose();
}
public void resize(final int width, final int height) {
if (getUniverseView() != null) {
getUniverseView().resize(width, height);
}
}
}