package gr.sullenart.games.fruitcatcher;
import gr.sullenart.games.fruitcatcher.HighScoreManager.HighScore;
import gr.sullenart.games.fruitcatcher.StateManager.StateBundle;
import gr.sullenart.games.fruitcatcher.images.ImageProvider;
import gr.sullenart.games.fruitcatcher.models.GameModel;
import gr.sullenart.games.fruitcatcher.models.GameModelFactory;
import gr.sullenart.games.fruitcatcher.models.GameState;
import gr.sullenart.games.fruitcatcher.screens.GameScreen;
import gr.sullenart.games.fruitcatcher.screens.GameScreenState;
import gr.sullenart.games.fruitcatcher.screens.HelpScreen;
import gr.sullenart.games.fruitcatcher.screens.LevelScreen;
import gr.sullenart.games.fruitcatcher.screens.MenuScreen;
import gr.sullenart.games.fruitcatcher.sound.SoundManager;
import gr.sullenart.games.fruitcatcher.text.TextResources;
import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
public class FruitCatcherGame extends Game {
private MenuScreen menuScreen;
private LevelScreen levelScreen;
private GameScreen gameScreen;
private ImageProvider imageProvider;
private SoundManager soundManager;
private GameModelFactory gameModelFactory;
private GameState gameState;
private StateManager stateManager;
private HighScoreManager highScoreManager;
private GameEventListener gameEventListener;
private int highScore;
private String locale;
private TextResources textResources;
public FruitCatcherGame(GameEventListener gameEventListener, String locale) {
this.gameEventListener = gameEventListener;
this.locale = locale;
}
public int getTotalScore() {
return gameState.getTotalScore();
}
public void setTotalScore(int totalScore) {
gameState.setTotalScore(totalScore);
}
public GameModel getModel(int level, int challenge) {
return gameModelFactory.getGameModel(level, challenge);
}
public ImageProvider getImageProvider() {
return imageProvider;
}
public SoundManager getSoundManager() {
return soundManager;
}
public GameState getGameState() {
return gameState;
}
public GameModel getGameModel() {
if (gameState.isKidsMode()) {
return gameModelFactory.getKidsGameModel();
}
int level = gameState.getLevel();
int challenge = gameState.getChallenge();
return gameModelFactory.getGameModel(level, challenge);
}
public void startGame(int level) {
gameState.setActive(true);
gameState.setTotalScore(0);
gameState.setLevel(level);
gameState.setChallenge(0);
gameEventListener.showAds(false);
}
public void startGameKidsMode() {
gameState.setActive(true);
gameState.setTotalScore(0);
gameState.setKidsMode(true);
gameState.setLevel(0);
gameState.setChallenge(0);
}
public void endGame(int score) {
gameState.setActive(false);
gameState.setKidsMode(false);
persist(new GameScreenState());
if (highScoreManager.isHighScore(score)) {
if (gameEventListener != null) {
highScore = score;
gameEventListener.getHighScoreName();
}
}
gameEventListener.showAds(true);
}
public void addHighScore(String name) {
Gdx.app.log(this.getClass().getName(), "New high score: " + highScore +
" for " + name );
highScoreManager.addHighScore(name, highScore);
}
public void restartLevel() {
startGame(gameState.getLevel());
}
public void gotoNextGame() {
if (gameState.isKidsMode()) {
return;
}
int level = gameState.getLevel();
int challenge = gameState.getChallenge();
if (challenge < GameModelFactory.CHALLENGE_COUNT - 1) {
challenge++;
gameState.setChallenge(challenge);
}
else if (level < GameModelFactory.LEVEL_COUNT - 1) {
level++;
challenge = 0;
gameState.setChallenge(challenge);
gameState.setLevel(level);
}
else {
challenge = 0;
gameState.setChallenge(challenge);
}
}
@Override
public void create() {
textResources = new TextResources(locale);
imageProvider = new ImageProvider(locale);
imageProvider.load();
soundManager = new SoundManager();
soundManager.load();
menuScreen = new MenuScreen(this);
levelScreen = new LevelScreen(this);
gameScreen = new GameScreen(this, null);
gameModelFactory = new GameModelFactory();
gameModelFactory.init();
stateManager = new StateManager();
highScoreManager = new HighScoreManager(textResources);
for(HighScore highScore: highScoreManager.getHighScores()) {
Gdx.app.log(this.getClass().getName(), highScore.name + " " + highScore.score);
}
StateBundle stateBundle = stateManager.retrieveState();
if (stateBundle == null) {
gameState = new GameState();
gotoMenuScreen();
}
else {
gameState = stateBundle.gameState;
if (gameState.isActive()){
gotoGameScreen(stateBundle.gameScreenState);
}
else {
gotoMenuScreen();
}
}
}
public void gotoMenuScreen() {
setScreen(new MenuScreen(this));
}
public void gotoLevelScreen() {
setScreen(new LevelScreen(this));
}
public void gotoGameScreen(GameScreenState gameScreenState) {
setScreen(new GameScreen(this, gameScreenState));
}
public void persist(GameScreenState gameScreenState) {
stateManager.persist(gameScreenState, gameState);
}
public void showHelp() {
setScreen(new HelpScreen(this));
}
public TextResources getTextResources() {
return textResources;
}
public void showHighscores() {
if (gameEventListener != null) {
gameEventListener.showScores(highScoreManager.getHighScores());
}
}
@Override
public void dispose() {
imageProvider.dispose();
soundManager.dispose();
menuScreen.dispose();
levelScreen.dispose();
gameScreen.dispose();
}
}