/*
* Copyright (c) 2012. HappyDroids LLC, All rights reserved.
*/
package com.happydroids.droidtowers.scenes;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.input.GestureDetector;
import com.badlogic.gdx.math.Vector2;
import com.google.common.collect.Lists;
import com.google.common.eventbus.Subscribe;
import com.happydroids.droidtowers.TowerConsts;
import com.happydroids.droidtowers.WeatherService;
import com.happydroids.droidtowers.entities.CloudLayer;
import com.happydroids.droidtowers.entities.GameLayer;
import com.happydroids.droidtowers.events.RespondsToWorldSizeChange;
import com.happydroids.droidtowers.gamestate.GameSave;
import com.happydroids.droidtowers.gamestate.GameState;
import com.happydroids.droidtowers.gamestate.server.FriendCloudGameSave;
import com.happydroids.droidtowers.gamestate.server.FriendCloudGameSaveCollection;
import com.happydroids.droidtowers.graphics.CityScapeLayer;
import com.happydroids.droidtowers.graphics.GroundLayer;
import com.happydroids.droidtowers.graphics.RainLayer;
import com.happydroids.droidtowers.graphics.SkyLayer;
import com.happydroids.droidtowers.grid.NeighborGameGrid;
import com.happydroids.droidtowers.gui.NeighborMenuBuilder;
import com.happydroids.droidtowers.gui.ViewNeighborHUD;
import com.happydroids.droidtowers.input.*;
import com.happydroids.droidtowers.math.GridPoint;
import com.happydroids.droidtowers.platform.Display;
import com.happydroids.droidtowers.scenes.components.SceneManager;
import com.happydroids.droidtowers.types.TowerNameBillboard;
import com.happydroids.events.CollectionChangeEvent;
import java.util.List;
import static com.happydroids.droidtowers.TowerConsts.GAME_GRID_START_SIZE;
import static com.happydroids.droidtowers.TowerConsts.GRID_UNIT_SIZE;
public class ViewNeighborScene extends Scene {
private List<GameLayer> gameLayers;
private GestureDelegater gestureDelegater;
private GestureDetector gestureDetector;
private ViewNeighborHUD neighborHUD;
private GameLayer billboardLayer;
private GameState playerGameState;
private Vector2 worldSize;
private int neighborGameGridX;
@Override
public void create(Object... args) {
playerGameState = (GameState) args[0];
neighborHUD = new ViewNeighborHUD(playerGameState);
neighborHUD.pack();
neighborHUD.setX(0);
neighborHUD.setY(Gdx.graphics.getHeight() - neighborHUD.getHeight());
getStage().addActor(neighborHUD);
InputSystem.instance().bind(TowerConsts.NEGATIVE_BUTTON_KEYS, goBackHomeCallback);
WeatherService weatherService = new WeatherService();
gameLayers = Lists.newArrayList();
gameLayers.add(new SkyLayer(weatherService));
gameLayers.add(new CityScapeLayer());
gameLayers.add(new CloudLayer(weatherService));
gameLayers.add(new RainLayer(weatherService));
gameLayers.add(new GroundLayer());
billboardLayer = new GameLayer();
gestureDelegater = new GestureDelegater(camera, gameLayers, null, getCameraController());
gestureDetector = new GestureDetector(20, 0.5f, 2, 0.15f, gestureDelegater);
InputSystem.instance().addInputProcessor(gestureDetector, 100);
InputSystem.instance().setGestureDelegate(gestureDelegater);
InputSystem.instance().switchTool(GestureTool.PICKER, null);
updateWorldSize(new Vector2(4000, 4000));
cameraController.updateCameraConstraints(new Vector2(4000, 2000));
worldSize = new Vector2();
neighborGameGridX = 0;
createNeighborTowers(playerGameState.getCloudGameSave().getNeighborGameSaves());
playerGameState.getCloudGameSave().getNeighborGameSaves().events().register(this);
}
private void createNeighborTowers(FriendCloudGameSaveCollection friendGameSaves) {
if (friendGameSaves.isEmpty()) {
return;
}
for (final FriendCloudGameSave friendCloudGameSave : friendGameSaves.getObjects()) {
addNeighborGameGridToWorld(friendCloudGameSave);
}
updateWorldConstraints();
}
private void updateWorldConstraints() {
gameLayers.remove(billboardLayer);
gameLayers.add(billboardLayer);
updateWorldSize(worldSize);
}
private void addNeighborGameGridToWorld(FriendCloudGameSave friendCloudGameSave) {
NeighborGameGrid neighborGameGrid = new NeighborGameGrid(getCamera(), new GridPoint(neighborGameGridX, 0));
neighborGameGrid.setGridScale(1f);
GameSave gameSave = friendCloudGameSave.getGameSave();
if (!gameSave.hasGridObjects()) {
System.out.println("Skipping, no objects! " + friendCloudGameSave);
return;
}
gameSave.attachToGame(neighborGameGrid, camera, cameraController);
neighborGameGrid.findLimits();
neighborGameGridX += (neighborGameGrid.getGridSize().x + 6) * GRID_UNIT_SIZE;
neighborGameGrid.setOwnerName(friendCloudGameSave.getOwner().getFirstName());
neighborGameGrid.addListener(new NeighborMenuBuilder(this));
TowerNameBillboard billboard = new TowerNameBillboard(neighborGameGrid);
billboard.setPosition(neighborGameGrid.getWorldBounds().x - (2 * GRID_UNIT_SIZE), TowerConsts.GROUND_HEIGHT);
billboardLayer.addChild(billboard);
worldSize.y = Math.max(worldSize.y, neighborGameGrid.getWorldSize().y);
worldSize.x = neighborGameGrid.getWorldBounds().x + neighborGameGrid.getWorldBounds().width;
gameLayers.add(neighborGameGrid.getRenderer());
gameLayers.add(neighborGameGrid);
}
private void updateWorldSize(Vector2 worldSize) {
worldSize.x = Math.max(GAME_GRID_START_SIZE * GRID_UNIT_SIZE, worldSize.x);
worldSize.y = Math.max(GAME_GRID_START_SIZE * GRID_UNIT_SIZE, worldSize.y);
for (GameLayer gameLayer : gameLayers) {
if (gameLayer instanceof RespondsToWorldSizeChange) {
((RespondsToWorldSizeChange) gameLayer).updateWorldSize(worldSize);
}
}
cameraController.updateCameraConstraints(worldSize);
camera.zoom = CameraController.ZOOM_MAX / 2;
camera.position.set(worldSize.x / 2 - Display.getWidth() / 2, TowerConsts.GROUND_HEIGHT, 0f);
}
@Override
public void pause() {
InputSystem.instance().removeInputProcessor(gestureDetector);
InputSystem.instance().setGestureDelegate(null);
}
@Override
public void resume() {
InputSystem.instance().addInputProcessor(gestureDetector, 100);
InputSystem.instance().setGestureDelegate(gestureDelegater);
InputSystem.instance().switchTool(GestureTool.PICKER, null);
}
@Override
public void render(float deltaTime) {
for (GameLayer gameLayer : gameLayers) {
gameLayer.update(deltaTime);
gameLayer.render(getSpriteBatch(), getCamera());
}
}
@Override
public void dispose() {
playerGameState.getCloudGameSave().getNeighborGameSaves().events().unregister(this);
InputSystem.instance().unbind(TowerConsts.NEGATIVE_BUTTON_KEYS, goBackHomeCallback);
}
private InputCallback goBackHomeCallback = new InputCallback() {
@Override
public boolean run(float timeDelta) {
SceneManager.popScene();
return true;
}
};
public ViewNeighborHUD getNeighborHUD() {
return neighborHUD;
}
@Subscribe
public void NeighborGameSave_onChange(CollectionChangeEvent event) {
addNeighborGameGridToWorld((FriendCloudGameSave) event.object);
updateWorldConstraints();
}
}