package com.tacoid.pweek.screens;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.GLCommon;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.InputListener;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.Touchable;
import com.badlogic.gdx.scenes.scene2d.ui.Button;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.tacoid.pweek.Controller;
import com.tacoid.pweek.MusicPlayer;
import com.tacoid.pweek.Pweek;
import com.tacoid.pweek.IGameService.Achievement;
import com.tacoid.pweek.Pweek.ScreenOrientation;
import com.tacoid.pweek.SoundPlayer;
import com.tacoid.pweek.ScoreManager.GameType;
import com.tacoid.pweek.SoundPlayer.SoundType;
import com.tacoid.pweek.actors.BackgroundActor;
import com.tacoid.pweek.actors.ControlerActor;
import com.tacoid.pweek.actors.ExplosionActor;
import com.tacoid.pweek.actors.GameOverActor;
import com.tacoid.pweek.actors.GridActor;
import com.tacoid.pweek.actors.MusicButtonActor;
import com.tacoid.pweek.actors.NextPieceActor;
import com.tacoid.pweek.actors.PauseMenu;
import com.tacoid.pweek.actors.PortraitPanelActor;
import com.tacoid.pweek.actors.ScoreActor;
import com.tacoid.pweek.actors.SoundButtonActor;
import com.tacoid.pweek.actors.StartActor;
import com.tacoid.pweek.actors.GameOverActor.GameOverType;
import com.tacoid.pweek.logic.GameLogic;
import com.tacoid.pweek.logic.State;
import com.tacoid.tracking.TrackingManager;
public abstract class GameScreenPortrait implements GameScreen {
protected static final int VIRTUAL_WIDTH = 768;
protected static final int VIRTUAL_HEIGHT = 1280;
private int puyoSize = 64;
protected boolean end = false;
protected float elapsedTime;
protected PauseMenu pauseMenu;
protected PauseButton pauseButton;
protected Stage stage;
protected GameLogic gameLogic;
private GridActor gridActor;
private InputProcessor controller;
private ControlerActor controllerActor;
protected boolean gamePaused;
protected GameOverActor gameOver;
private StartActor startActor;
private NextPieceActor nextPieceActor;
private ExplosionActor explosionActor;
private boolean started;
private int volumeStart;
protected class PauseButton extends Button {
public PauseButton(TextureRegion region) {
super(new TextureRegionDrawable(region));
addListener(new InputListener() {
@Override
public boolean touchDown(InputEvent event, float x, float y,
int pointer, int button) {
SoundPlayer.getInstance().playSound(SoundType.TOUCH_MENU, 0.5f, true);
pauseMenu.show();
return true;
}
});
}
}
protected void addButton(Actor button, int x, int y) {
stage.addActor(button);
button.setX(x);
button.setY(y);
}
public GameScreenPortrait() {
elapsedTime = 0;
gameLogic = new GameLogic(Pweek.getInstance().getGameService(), false);
}
public int getPuyoSize() {
return puyoSize;
}
protected void initGraphics() {
stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(),
false);
controller = new Controller(gameLogic, this, stage, new Vector2(260, 1150), new Vector2(710, 300));
gridActor = new GridActor(Pweek.getInstance().atlasPuyo, gameLogic, Pweek.getInstance().manager.get("images/font_score.fnt", BitmapFont.class), 280, 325, 70, puyoSize);
explosionActor = new ExplosionActor(Pweek.getInstance().atlasPuyo, gameLogic, Pweek.getInstance().manager.get("images/font_score.fnt", BitmapFont.class), 280, 325, 70, puyoSize);
nextPieceActor = new NextPieceActor(Pweek.getInstance().atlasPuyo, gameLogic, 68, 920, puyoSize);
ScoreActor scoreActor = new ScoreActor(Pweek.getInstance().manager.get("images/font_score.fnt", BitmapFont.class), gameLogic, 500, 1245);
TextureRegion pauseRegion = new TextureRegion(Pweek.getInstance().atlasBouttons.findRegion("pause_button"));
stage.addActor(new BackgroundActor(ScreenOrientation.PORTRAIT));
stage.addActor(new PortraitPanelActor(Pweek.getInstance().atlasPanelsPortrait));
stage.addActor(gridActor);
stage.addActor(nextPieceActor);
stage.addActor(scoreActor);
stage.addActor(explosionActor);
controllerActor = new ControlerActor(ScreenOrientation.PORTRAIT, gameLogic);
stage.addActor(controllerActor);
pauseButton = new PauseButton(pauseRegion);
addButton(pauseButton,10,VIRTUAL_HEIGHT-10-pauseRegion.getRegionHeight());
addButton(MusicButtonActor.createMusicButton(Pweek.getInstance().atlasBouttons),VIRTUAL_WIDTH-90, VIRTUAL_HEIGHT-90);
addButton(SoundButtonActor.createSoundButton(Pweek.getInstance().atlasBouttons),VIRTUAL_WIDTH-180, VIRTUAL_HEIGHT-90);
boolean show = false;
if (gameOver != null) {
show = gameOver.isVisible();
}
gameOver = new GameOverActor(Pweek.getInstance().atlasPlank, Pweek.getInstance().atlasPanelsPortrait, Pweek.getInstance().atlasBouttons, Pweek.getInstance().manager.get("images/font_score.fnt", BitmapFont.class), this, VIRTUAL_WIDTH/2, 3*VIRTUAL_HEIGHT/5);
stage.addActor(gameOver);
if (show) {
gameOver();
} else {
gameOver.hide();
}
pauseMenu = new PauseMenu(Pweek.getInstance().atlasPlank, this, Pweek.getInstance().getHandler(), ScreenOrientation.PORTRAIT, !gamePaused);
stage.addActor(pauseMenu);
show = true;
if (startActor != null) {
show = startActor.isVisible();
}
startActor = new StartActor(Pweek.getInstance().atlasPlank, this);
stage.addActor(startActor);
if (show) {
startActor.show();
} else {
startActor.setVisible(false);
startActor.setTouchable(Touchable.disabled);
if (gamePaused) {
pauseMenu.show();
}
}
}
@Override
public void dispose() {
Gdx.app.log("Portrait", "paused");
}
@Override
public void hide() {
// TODO Auto-generated method stub
}
@Override
public void pause() {
if (!gamePaused && !gameEnded()) {
pauseMenu.show();
}
}
protected boolean gameEnded() {
return gameLogic.getState() == State.LOST;
}
@Override
public void render(float delta) {
if (!gameEnded()) {
if (!gamePaused) {
this.elapsedTime += delta;
}
// Update model
gameLogic.update(delta);
if(gameEnded()) {
gameOver();
}
} else {
//Gdx.input.setInputProcessor(null);
end = true;
// TODO
}
draw(delta);
}
private void draw(float delta) {
GLCommon gl = Gdx.gl;
gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.act(delta);
stage.draw();
}
@Override
public void resize(int arg0, int arg1) {
stage.setViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, false);
stage.getCamera().position.set(VIRTUAL_WIDTH / 2, VIRTUAL_HEIGHT / 2, 0);
}
@Override
public void resume() {
show();
}
@Override
public void show() {
Pweek.getInstance().getHandler().setPortrait(true);
Pweek.getInstance().getHandler().showAds(true);
resize(0, 0);
Gdx.input.setInputProcessor(controller);
}
public float getElapsedTime() {
return elapsedTime;
}
@Override
public void init() {
gameLogic.init();
gameOver.hide();
startActor.show();
elapsedTime = 0;
started = false;
}
private void gameOver() {
int volumeEnd;
if (!MusicPlayer.getInstance().isMuted()) {
volumeEnd = Pweek.getInstance().getHandler().getVolume();
} else {
volumeEnd = 0;
}
if (volumeEnd > 80 && volumeStart > 80 && elapsedTime > 600) {
Pweek.getInstance().getGameService().unlockAchievement(Achievement.DEAF);
}
controllerActor.setTouchable(Touchable.disabled);
pauseButton.setTouchable(Touchable.disabled);
gameOver.show(GameOverType.GAMEOVER);
}
@Override
public void gamePause() {
gamePaused = true;
gameLogic.pause();
gridActor.setVisible(false);
nextPieceActor.setVisible(false);
controllerActor.setTouchable(Touchable.disabled);
pauseButton.setTouchable(Touchable.disabled);
}
@Override
public void gameStart() {
if (!MusicPlayer.getInstance().isMuted()) {
this.volumeStart = Pweek.getInstance().getHandler().getVolume();
} else {
this.volumeStart = 0;
}
this.gameResume();
this.started = true;
}
@Override
public boolean isGameStarted() {
return this.started;
}
@Override
public void gameResume() {
gamePaused = false;
gameLogic.resume();
gridActor.setVisible(true);
nextPieceActor.setVisible(true);
controllerActor.setTouchable(Touchable.enabled);
pauseButton.setTouchable(Touchable.enabled);
}
public ScreenOrientation getOrientation() {
return ScreenOrientation.PORTRAIT;
}
@Override
public float getHeight() {
return VIRTUAL_HEIGHT;
}
@Override
public float getWidth() {
return VIRTUAL_WIDTH;
}
@Override
public int getScore() {
return gameLogic.getScore();
}
@Override
public void quit() {
pauseMenu.hide();
GameType type = getGameType();
TrackingManager.getTracker().trackEvent("UI", "button_click",type.toString() + " quit before end", null);
Pweek.getInstance().setScreen(MainMenuScreen.getInstance());
}
@Override
public boolean isGamePaused() {
return gamePaused;
}
@Override
public void hidePause() {
pauseMenu.hide();
}
}