package io.github.lonamiwebs.klooni;
import com.badlogic.gdx.Application;
import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Preferences;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.NinePatch;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import io.github.lonamiwebs.klooni.screens.MainMenuScreen;
import io.github.lonamiwebs.klooni.screens.TransitionScreen;
public class Klooni extends Game {
//region Members
// TODO Not sure whether the theme should be static or not since it might load textures
public static Theme theme;
public Skin skin;
public ShareChallenge shareChallenge;
public static boolean onDesktop;
private final static float SCORE_TO_MONEY = 1f / 100f;
public static final int GAME_HEIGHT = 680;
public static final int GAME_WIDTH = 408;
//endregion
//region Creation
// TODO Possibly implement a 'ShareChallenge'
// for other platforms instead passing null
public Klooni(final ShareChallenge shareChallenge) {
this.shareChallenge = shareChallenge;
}
@Override
public void create() {
onDesktop = Gdx.app.getType().equals(Application.ApplicationType.Desktop);
prefs = Gdx.app.getPreferences("io.github.lonamiwebs.klooni.game");
// Load the best match for the skin (depending on the device screen dimensions)
skin = SkinLoader.loadSkin();
// Use only one instance for the theme, so anyone using it uses the most up-to-date
Theme.skin = skin; // Not the best idea
final String themeName = prefs.getString("themeName", "default");
if (Theme.exists(themeName))
theme = Theme.getTheme(themeName);
else
theme = Theme.getTheme("default");
Gdx.input.setCatchBackKey(true); // To show the pause menu
setScreen(new MainMenuScreen(this));
}
//endregion
//region Screen
// TransitionScreen will also dispose by default the previous screen
public void transitionTo(Screen screen) {
transitionTo(screen, true);
}
public void transitionTo(Screen screen, boolean disposeAfter) {
setScreen(new TransitionScreen(this, getScreen(), screen, disposeAfter));
}
//endregion
//region Disposing
@Override
public void dispose() {
super.dispose();
skin.dispose();
theme.dispose();
}
//endregion
//region Settings
private static Preferences prefs;
// Score related
public static int getMaxScore() {
return prefs.getInteger("maxScore", 0);
}
public static int getMaxTimeScore() {
return prefs.getInteger("maxTimeScore", 0);
}
public static void setMaxScore(int score) {
prefs.putInteger("maxScore", score).flush();
}
public static void setMaxTimeScore(int maxTimeScore) {
prefs.putInteger("maxTimeScore", maxTimeScore).flush();
}
// Settings related
public static boolean soundsEnabled() {
return !prefs.getBoolean("muteSound", false);
}
public static boolean toggleSound() {
final boolean result = soundsEnabled();
prefs.putBoolean("muteSound", result).flush();
return !result;
}
public static boolean shouldSnapToGrid() {
return prefs.getBoolean("snapToGrid", false);
}
public static boolean toggleSnapToGrid() {
final boolean result = !shouldSnapToGrid();
prefs.putBoolean("snapToGrid", result).flush();
return result;
}
// Themes related
public static boolean isThemeBought(Theme theme) {
if (theme.getPrice() == 0)
return true;
String[] themes = prefs.getString("boughtThemes", "").split(":");
for (String t : themes)
if (t.equals(theme.getName()))
return true;
return false;
}
public static boolean buyTheme(Theme theme) {
final float money = getRealMoney();
if (theme.getPrice() > money)
return false;
setMoney(money - theme.getPrice());
String bought = prefs.getString("boughtThemes", "");
if (bought.equals(""))
bought = theme.getName();
else
bought += ":" + theme.getName();
prefs.putString("boughtThemes", bought);
return true;
}
public static void updateTheme(Theme newTheme) {
prefs.putString("themeName", newTheme.getName()).flush();
theme.update(newTheme.getName());
}
// Money related
public static void addMoneyFromScore(int score) {
setMoney(getRealMoney() + score * SCORE_TO_MONEY);
}
private static void setMoney(float money) {
prefs.putFloat("money", money).flush();
}
public static int getMoney() {
return (int)getRealMoney();
}
private static float getRealMoney() {
return prefs.getFloat("money");
}
//endregion
}