package com.digitalwolf.drona.screens;
import com.badlogic.gdx.Application.ApplicationType;
import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.digitalwolf.drona.assets.Assets;
import com.digitalwolf.drona.sprites.Drona;
import com.digitalwolf.drona.world.World;
import com.digitalwolf.drona.world.WorldRenderer;
import com.digitalwolf.gamedata.LevelGenerator;
import com.digitalwolf.gamedata.Settings;
import com.digitalwolf.parallaxbackground.BackgroundGenerator;
import com.digitalwolf.parallaxbackground.ParallaxBackground;
import com.digitalwolf.screenhelpers.DronaWeaponSelectScreenHelper;
import com.digitalwolf.screenhelpers.GameAchievementMenuScreenHeper;
import com.digitalwolf.screenhelpers.GameLevelEndScreenHelper;
import com.digitalwolf.screenhelpers.GameOverScreenHelper;
import com.digitalwolf.screenhelpers.GamePauseScreenHelper;
import com.digitalwolf.screenhelpers.GameReadyScreenHelper;
import com.moribitotech.mtx.AbstractScreen;
import com.moribitotech.mtx.settings.AppSettings;
public class GameScreen extends AbstractScreen{
//DEFINING ALL THE SCREEN HELPERS
public GameAchievementMenuScreenHeper gameAchievementMenuScreenHeper;
public GameLevelEndScreenHelper gameLevelEndScreenHelper;
public GameOverScreenHelper gameOverScreenHelper;
public GamePauseScreenHelper gamePauseScreenHelper;
public GameReadyScreenHelper gameReadyScreenHelper;
public DronaWeaponSelectScreenHelper dronaWeaponSelectScreenHelper;
//DEFINING ALL THE SCREEN HELPER STATES
public boolean isReadyMenuDisplaying;
public boolean isPauseMenuDisplaying;
public boolean isLevelEndMenuDisplaying;
public boolean isAchievementMenuDisplaying;
public boolean isGameOverMenuDisplaying;
//DEFINING THE VARIOUS STATES OF THE GAME
public static final int GAME_READY = 0;
public static final int GAME_RUNNING = 1;
public static final int GAME_PAUSED = 2;
public static final int GAME_LEVEL_END = 3;
public static final int GAME_OVER = 4;
public static int state;
public static int currentlevel;
public boolean isGameSaved;
public SpriteBatch batch ;
public World world;
public WorldRenderer renderer;
private ParallaxBackground background;
private LevelGenerator levelGenerator;
private float buttonSize = 100*AppSettings.getWorldSizeRatio();
//VARIABLES TO CONTROL SHOOTING OF THE PLAYER
boolean reloaded = false; // Start with a reload because weapons don't reload itself
float reloadTime = 100; // This is the "timer" (The value doesn't matter)
final float startReloadTime = 100;
//VARIABLE FOR SPECIAL POWER
public static boolean isSpecialPowerActive;
//VARIABLES FOR THE RANDOM LEVEL GENERATION
boolean generateTimerReady = false;
float generationTime = 100;
public int lastScore;
public static String scoreString;
public static int gameOverInfo;
public boolean playerContinuesGame;
public GameScreen(Game game, String screenName) {
super(game, screenName);
state = GAME_READY;
setUpScreenElements();
setUpMenu();
batch = getStage().getSpriteBatch();
world = new World(currentlevel);
renderer = new WorldRenderer(world,batch);
levelGenerator = new LevelGenerator(world);
currentlevel =1;
background = BackgroundGenerator.getBackground();
lastScore =0;
gameOverInfo =-1;
isGameSaved = false;
isSpecialPowerActive = false;
}
public void sendAwayAllScreenHelpers(){
if(isAchievementMenuDisplaying){
gameAchievementMenuScreenHeper.sendAwayMenu(GameScreen.this);
}
if(isReadyMenuDisplaying){
gameReadyScreenHelper.sendAwayMenu(GameScreen.this);
}
if(isPauseMenuDisplaying){
gamePauseScreenHelper.sendAwayMenu(GameScreen.this);
}
if(isLevelEndMenuDisplaying){
gameLevelEndScreenHelper.sendAwayMenu(GameScreen.this);
}
if(isGameOverMenuDisplaying){
gameOverScreenHelper.sendAwayMenu(GameScreen.this);
}
}
private void setUpMenu() {
// TODO Auto-generated method stub
gameAchievementMenuScreenHeper = new GameAchievementMenuScreenHeper();
gameLevelEndScreenHelper = new GameLevelEndScreenHelper();
gameOverScreenHelper = new GameOverScreenHelper();
gamePauseScreenHelper = new GamePauseScreenHelper();
gameReadyScreenHelper = new GameReadyScreenHelper();
dronaWeaponSelectScreenHelper = new DronaWeaponSelectScreenHelper();
gameAchievementMenuScreenHeper.setUpMenu(GameScreen.this);
gameLevelEndScreenHelper.setUpMenu(GameScreen.this);
gameOverScreenHelper.setUpMenu(GameScreen.this);
gamePauseScreenHelper.setUpMenu(GameScreen.this);
gameReadyScreenHelper.setUpMenu(GameScreen.this);
dronaWeaponSelectScreenHelper.setUpMenu(GameScreen.this);
}
private void setUpScreenElements() {
// Set Up the background
setBackgroundTexture(Assets.bg);
}
//THIS IS THE MAIN GAME LOOP
@Override
public void render(float delta) {
super.render(delta);
update(delta);
switch(state) {
case GAME_READY:
renderReady();
break;
case GAME_RUNNING:
renderRunning(delta);
break;
case GAME_PAUSED:
renderPaused();
break;
case GAME_LEVEL_END:
renderLevelEnd();
break;
case GAME_OVER:
renderGameOver();
break;
}
}
private void renderGameOver() {
if(!isGameOverMenuDisplaying){
//Save the Scores each time the game is over
saveGameStates();
gameOverScreenHelper.sendInMenu(GameScreen.this);
}
}
private void renderLevelEnd() {
if(!isLevelEndMenuDisplaying){
gameLevelEndScreenHelper.sendInMenu(GameScreen.this);
}
}
private void renderPaused() {
//Drawing code that goes when the state is PAUSED
if(!isPauseMenuDisplaying){
gamePauseScreenHelper.sendInMenu(GameScreen.this);
}
}
private void renderRunning(float delta) {
//Drawing code that goes when the state is RUNNING
background.render(delta);
batch.begin();
//DRAW THE SCREEN HELPERS HERE
gameAchievementMenuScreenHeper.achievementTable.draw(batch, 1.0f);
Assets.whiteFont.draw(batch, "Score : "+World.score, 10, AppSettings.SCREEN_H -20);
//Assets.whiteFont.draw(batch, "conter : "+gameOverCounterForAds, 10, AppSettings.SCREEN_H -50);
//Assets.whiteFont.draw(batch, "FPS : "+Gdx.graphics.getFramesPerSecond(), 10, AppSettings.SCREEN_H -50);
/*
if(world.bossEnemy!= null){
Assets.whiteFont.draw(batch, "showVictory : "+world.showVictory+" :: L:"+world.bossEnemy.life, 10, AppSettings.SCREEN_H -80);
Assets.whiteFont.draw(batch, "Boss State : "+world.bossEnemy.getState()+" getLifeTime-->"+world.bossEnemy.getLifeTime(), 10, AppSettings.SCREEN_H -110);
Assets.whiteFont.draw(batch, "Path Size : "+world.bossEnemy.path.size, 10, AppSettings.SCREEN_H -140);
}
*/
//DRAW THE TWO PLAYER CONTROL BUTTONS ONLY WHEN THE STATE IS RUNNING
if ((Gdx.app.getType() == ApplicationType.Android) || (Gdx.app.getType() == ApplicationType.iOS)){
batch.draw(Assets.flyButton, 0f, 0f, 0f, 0f, buttonSize, buttonSize, 1f, 1f, 0f);
batch.draw(Assets.shoot_button, AppSettings.SCREEN_W -buttonSize, 0f, 0f, 0f, buttonSize, buttonSize, 1f, 1f, 0f);
}
batch.end();
//RENDER THE ACHIEVEMENTS MENU
if(!isAchievementMenuDisplaying){
gameAchievementMenuScreenHeper.sendInMenu(GameScreen.this);
}
renderer.renderDrona(delta);
if(world.pawns.size() > 0)
renderer.renderPawns(delta);
if(world.powerUp.size() > 0)
renderer.renderPowerUp(delta);
if(world.drona.getWeapons().size() > 0)
renderer.renderDronaWeapons(delta);
if(world.blackDragons.size() > 0)
renderer.renderBlackDragons(delta);
if(world.magicalPowers.size() > 0)
renderer.renderMagicalPowers(delta);
if(world.conspirators.size() > 0)
renderer.renderConspirators(delta);
renderer.effectListRenderer(delta);
if(world.bossEnemy!=null)
renderer.renderBossEnemy(delta);
}
private void renderReady() {
//Drawing code that goes when the state is READY
if(!isReadyMenuDisplaying){
gameReadyScreenHelper.sendInMenu(GameScreen.this);
}
}
private void update(float delta) {
// The update() Loop that is executed continually
if(delta > 0.1f)
delta = 0.1f;
switch(state) {
case GAME_READY:
updateReady();
break;
case GAME_RUNNING:
updateRunning(delta);
break;
case GAME_PAUSED:
updatePaused();
break;
case GAME_LEVEL_END:
updateLevelEnd();
break;
case GAME_OVER:
updateGameOver();
break;
}
}
private void updateGameOver() {
if (Gdx.input.justTouched()) {
gameOverScreenHelper.sendAwayMenu(GameScreen.this);
resetGame();
getGame().setScreen(new MainMenuScreen(getGame(), "Main Menu Screen"));
}
}
private void updateAchievementMenu(){
TextureRegion frame = null;
int healthValue = Math.max(0, Math.min(5,(int)(world.drona.health/100)));
switch(healthValue){
case 0:
frame = Assets.enerylevel1;
break;
case 1:
frame = Assets.enerylevel1;
break;
case 2:
frame = Assets.enerylevel2;
break;
case 3:
frame = Assets.enerylevel3;
break;
case 4:
frame = Assets.enerylevel4;
break;
case 5:
frame = Assets.enerylevel5;
break;
}
gameAchievementMenuScreenHeper.healthBar.setTextureExternal(frame, true);
}
public void saveGameStates() {
//GET THE EXISTING HIGHSCORES FROM PREFERENCES
int[] scoresfromdb = Settings.getHighScores();
//CHECK IF THE CURRENT SCORE IS GREATER THAN THE STORED ONE
if(lastScore > scoresfromdb[4])
scoreString = "NEW RECORD: " + lastScore;
else
scoreString = "SCORE: " + lastScore;
//ADD THE NEW SCORE TO THE PREFERENCES IN DECREASING ORDER
Settings.addScore(lastScore);
Settings.savePefs();
}
private void updateLevelEnd() {
// DO NOTHING... SCREEN HELPERS ARE DOING THE THINGS ... CHECK GameLevelEndScreenHelper.java
}
private void updatePaused() {
// DO NOTHING... SCREEN HELPERS ARE DOING THE THINGS ... CHECK GamePauseScreenHelper.java
}
private void updateRunning(float delta) {
// The most important method ... it is called continually while the game is in running state
updateAchievementMenu();
world.update(delta);
// RELOAD FOR DRONA WEAPON
if (!reloaded) {
reloadTime -= 180*delta; // As I said, this is the timer
// If the reload finished, set the timer back to the reload time
if (reloadTime <= 0) {
reloaded = true; // reloaded, we can shoot
reloadTime = startReloadTime;
}
}
if (!generateTimerReady) {
generationTime -= 100*delta; // This is again a timer .. that generates enemies at certain intervals
// If the reload finished, set the timer back to the reload time
if (generationTime <= 0) {
generateTimerReady = true; // reloaded, we can continue generating enemies to the world
generationTime = startReloadTime;
}
}
if (generateTimerReady && (world.state == World.WORLD_STATE_RUNNING)) {
levelGenerator.generateLevel(currentlevel);
levelGenerator.generateConspirators(world.drona.position.y+Drona.height/2);
generateTimerReady = false;
}
if(world.state == World.WORLD_STATE_GAME_OVER) {
state = GAME_OVER;
}
if(world.state == World.WORLD_STATE_NEXT_LEVEL) {
state = GAME_LEVEL_END;
}
//UPDATE THE PLAYER FOR USER INPUT
updatePlayerForUserInput(delta);
lastScore = World.score;
}
public void resetGame() {
// It should be called each time the game is over... reset the scores here
lastScore = World.score =0;
renderer.dispose();
}
private void updatePlayerForUserInput(float delta) {
// The two buttons .. Fly and Attack are here ...
boolean fly = false;
boolean attack = false;
boolean pause = false;
world.drona.state=Drona.FLYING;
if (Gdx.app.getType() == ApplicationType.Android || Gdx.app.getType() == ApplicationType.iOS) {
for (int i = 0; i < 2; i++) {
int x = (int)(Gdx.input.getX(i) / (float)Gdx.graphics.getWidth() * AppSettings.SCREEN_W);
int y = (int)(Gdx.input.getY(i) / (float)Gdx.graphics.getWidth() * AppSettings.SCREEN_W);
if (!Gdx.input.isTouched(i)) continue;
if(y<= AppSettings.SCREEN_H && y>= AppSettings.SCREEN_H -buttonSize){
if (x <=buttonSize) {
fly |= true;
}
if (x >= AppSettings.SCREEN_W - buttonSize && x < AppSettings.SCREEN_W) {
attack |= true;
}
}
if (x >= AppSettings.SCREEN_W -80 && y >= 0 && y <= 80) {
pause |= true;
}
}
}
// CHECK USER INPUT AND APPLY TO VELOCITY AND STATES OF THE MAIN PLAYER
if ((Gdx.input.isKeyPressed(Keys.SPACE) || fly)&& world.drona.position.y<AppSettings.SCREEN_H- Drona.height)
{
world.drona.velocity.y = world.drona.MAX_VELOCITY;
}
if (Gdx.input.isKeyPressed(Keys.UP) || attack)
{
// if(Drona.currentWeapon == Weapon.LARGE && !isSpecialPowerActive)
// return;
if(reloaded){
reloaded = false;
world.drona.fire();
}
}
if (Gdx.input.isKeyPressed(Keys.P) || pause)
{
state = GAME_PAUSED;
}
}
private void updateReady() {
// DO NOTHING... SCREEN HELPERS ARE DOING THE THINGS ... CHECK GameReadyScreenHelper.java
}
public void createNewWorld() {
// This method is called each time the player completes a level
World.score = lastScore;
world.state = World.WORLD_STATE_RUNNING;
world.distance =0;
}
}