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.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.SoundPlayer; import com.tacoid.pweek.IGameService.Achievement; import com.tacoid.pweek.Pweek.ScreenOrientation; 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.LandscapePanelActor; import com.tacoid.pweek.actors.MusicButtonActor; import com.tacoid.pweek.actors.NextPieceActor; import com.tacoid.pweek.actors.PauseMenu; 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.IA; import com.tacoid.pweek.logic.IAEasy; import com.tacoid.pweek.logic.IAHard; import com.tacoid.pweek.logic.State; import com.tacoid.tracking.TrackingManager; public class GameVersusScreen implements GameScreen { private static final int VIRTUAL_WIDTH = 1280; private static final int VIRTUAL_HEIGHT = 768; private static GameVersusScreen instance = null; private Stage stage; private GameLogic gameLogic; private GameLogic gameLogicIA; private GridActor gridActor; private GridActor gridActorIA; private NextPieceActor nextPieceActor; private NextPieceActor nextPieceActorIA; protected float elapsedTime; private int puyoSize = 48; private IA ia; private InputProcessor controller; private ControlerActor controllerActor; private PauseMenu pauseMenu; private PauseButton pauseButton; private StartActor startActor; private GameOverActor gameOver; private boolean gamePaused; private int level; private ExplosionActor explosionActor; private ExplosionActor explosionActorIA; private boolean started; private int volumeStart; private void addButton(Button button, int x, int y) { stage.addActor(button); button.setX(x); button.setY(y); } public 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; } }); } } private GameVersusScreen() { gameLogic = new GameLogic(Pweek.getInstance().getGameService(), false); gameLogicIA = new GameLogic(Pweek.getInstance().getGameService(), true); gameLogic.setOpponent(gameLogicIA); gameLogicIA.setOpponent(gameLogic); elapsedTime = 0; } public int getPuyoSize() { return puyoSize; } public void setLevel(int level) { this.level = level; if (level == 0) { gameLogic.setInitialSpeed(0.5f); gameLogicIA.setInitialSpeed(0.5f); gameLogic.setNColors(3); gameLogicIA.setNColors(4); ia = new IAEasy(gameLogicIA); } else if (level == 1) { gameLogic.setInitialSpeed(0.5f); gameLogicIA.setInitialSpeed(0.5f); gameLogic.setNColors(4); gameLogicIA.setNColors(4); ia = new IAHard(gameLogicIA); } else if (level == 2) { gameLogic.setInitialSpeed(0.3f); gameLogicIA.setInitialSpeed(0.3f); gameLogic.setNColors(4); gameLogicIA.setNColors(4); gameLogicIA.setCheatMode(true); ia = new IAHard(gameLogicIA); } else if (level == 3) { gameLogic.setInitialSpeed(0.15f); gameLogicIA.setInitialSpeed(0.3f); gameLogic.setNColors(5); gameLogicIA.setNColors(5); gameLogicIA.setCheatMode(true); ia = new IAHard(gameLogicIA); } } public int getLevel() { return level; } public void initGraphics() { stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false); controller = new Controller(gameLogic, this, stage, new Vector2(290, 660), new Vector2(990, 5)); gridActor = new GridActor(Pweek.getInstance().atlasPuyo, gameLogic,Pweek.getInstance().manager.get("images/font_score.fnt", BitmapFont.class), 296, 26, 54, puyoSize); explosionActor = new ExplosionActor(Pweek.getInstance().atlasPuyo, gameLogic,Pweek.getInstance().manager.get("images/font_score.fnt", BitmapFont.class), 296, 26, 54, puyoSize); nextPieceActor = new NextPieceActor(Pweek.getInstance().atlasPuyo, gameLogic, 95, 500, puyoSize); ScoreActor scoreActor = new ScoreActor(Pweek.getInstance().manager.get("images/font_score.fnt", BitmapFont.class), gameLogic, 550, 743); gridActorIA = new GridActor(Pweek.getInstance().atlasPuyo, gameLogicIA,Pweek.getInstance().manager.get("images/font_score.fnt", BitmapFont.class), 650, 26, 54, puyoSize); explosionActorIA = new ExplosionActor(Pweek.getInstance().atlasPuyo, gameLogicIA,Pweek.getInstance().manager.get("images/font_score.fnt", BitmapFont.class), 650, 26, 54, puyoSize); nextPieceActorIA = new NextPieceActor(Pweek.getInstance().atlasPuyo, gameLogicIA, 1066, 500, puyoSize); ScoreActor scoreActorIA = new ScoreActor(Pweek.getInstance().manager.get("images/font_score.fnt", BitmapFont.class), gameLogicIA, 830, 743); TextureRegion pauseRegion = new TextureRegion(Pweek.getInstance().atlasBouttons.findRegion("pause_button")); stage.addActor(new BackgroundActor(ScreenOrientation.LANDSCAPE)); stage.addActor(new LandscapePanelActor()); stage.addActor(gridActor); stage.addActor(nextPieceActor); stage.addActor(scoreActor); stage.addActor(gridActorIA); stage.addActor(nextPieceActorIA); stage.addActor(scoreActorIA); controllerActor = new ControlerActor(ScreenOrientation.LANDSCAPE, gameLogic); stage.addActor(controllerActor); stage.addActor(explosionActorIA); stage.addActor(explosionActor); 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().atlasPanelsLandscape, Pweek.getInstance().atlasBouttons, Pweek.getInstance().manager.get("images/font_score.fnt", BitmapFont.class), this, VIRTUAL_WIDTH/2, 8*VIRTUAL_HEIGHT/9-25); stage.addActor(gameOver); if (show) { gameOver(); } else { gameOver.hide(); } pauseMenu = new PauseMenu(Pweek.getInstance().atlasPlank, this, Pweek.getInstance().getHandler(), ScreenOrientation.LANDSCAPE, !gamePaused); stage.addActor(pauseMenu); show = true; if (startActor != null) { show = startActor.isVisible(); } startActor = new StartActor(Pweek.getInstance().atlasPlank, this); if (show) { startActor.show(); } else { startActor.setVisible(false); startActor.setTouchable(Touchable.disabled); if (gamePaused) { pauseMenu.show(); } } stage.addActor(startActor); } public static GameVersusScreen getInstance() { if (instance == null) { instance = new GameVersusScreen(); } return instance; } public static void freeInstance() { instance = null; } @Override public void dispose() { Gdx.app.log("Versus", "paused"); } @Override public void hide() { // TODO Auto-generated method stub } @Override public void pause() { if (!gamePaused && gameLogic.getState() != State.LOST) { pauseMenu.show(); } } @Override public void render(float delta) { GLCommon gl = Gdx.gl; if (gameLogic.getState() != State.LOST && gameLogicIA.getState() != State.LOST) { if (!gamePaused) { this.elapsedTime += delta; } // Update model gameLogic.update(delta); gameLogicIA.update(delta); ia.update(delta); if (gameLogic.getState() == State.LOST || gameLogicIA.getState() == State.LOST) { gameOver(); } } // clear previous frame 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(false); Pweek.getInstance().getHandler().showAds(!startActor.isVisible() && (gamePaused || gameOver.isVisible())); resize(0, 0); Gdx.input.setInputProcessor(controller); } @Override public void init() { elapsedTime = 0; started = false; gameLogic.init(); gameLogicIA.init(); gameOver.hide(); startActor.show(); } 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); } if (gameLogic.getState() == State.LOST){ gameOver.show(GameOverType.LOSE); } else { if (level == 3) { Pweek.getInstance().getGameService().unlockAchievement(Achievement.FOREVER_ALONE); } gameOver.show(GameOverType.WIN); } controllerActor.setTouchable(Touchable.disabled); pauseButton.setTouchable(Touchable.disabled); } @Override public void gamePause() { gamePaused = true; gameLogic.pause(); gameLogicIA.pause(); gridActor.setVisible(false); gridActorIA.setVisible(false); nextPieceActor.setVisible(false); nextPieceActorIA.setVisible(false); controllerActor.setTouchable(Touchable.disabled); pauseButton.setTouchable(Touchable.disabled); } public void gameStart() { if (!MusicPlayer.getInstance().isMuted()) { this.volumeStart = Pweek.getInstance().getHandler().getVolume(); } else { this.volumeStart = 0; } this.gameResume(); this.started = true; } @Override public void gameResume() { gamePaused = false; gameLogic.resume(); gameLogicIA.resume(); gridActor.setVisible(true); gridActorIA.setVisible(true); nextPieceActor.setVisible(true); nextPieceActorIA.setVisible(true); controllerActor.setTouchable(Touchable.enabled); pauseButton.setTouchable(Touchable.enabled); } @Override public ScreenOrientation getOrientation() { return ScreenOrientation.LANDSCAPE; } @Override public float getHeight() { return VIRTUAL_HEIGHT; } @Override public float getWidth() { return VIRTUAL_WIDTH; } @Override public GameType getGameType() { return GameType.VERSUS_IA; } @Override public int getScore() { if (gameLogic.getState() == State.LOST) { return 0; } else { return gameLogic.getScore() + getTimeBonus(); } } public int getTimeBonus() { return Math.max(0, 25000 - (int)(elapsedTime * 50)); } @Override public float getElapsedTime() { return elapsedTime; } @Override public void quit() { pauseMenu.hide(); GameType type = getGameType(); TrackingManager.getTracker().trackEvent("UI", "button_click",type.toString()+" Level "+ getLevel() +" quit before end", null); Pweek.getInstance().setScreen(MainMenuScreen.getInstance()); } @Override public boolean isGamePaused() { return gamePaused; } @Override public void hidePause() { pauseMenu.hide(); } @Override public boolean isGameStarted() { return started; } }