package Roguelike.desktop;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import Roguelike.AbstractApplicationChanger;
import Roguelike.Global;
import Roguelike.RoguelikeGame;
import Roguelike.Util.Controls;
import com.badlogic.gdx.Application;
import com.badlogic.gdx.Files.FileType;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Graphics.DisplayMode;
import com.badlogic.gdx.Preferences;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import com.badlogic.gdx.backends.lwjgl.LwjglPreferences;
public class LwjglApplicationChanger extends AbstractApplicationChanger
{
public Preferences prefs;
public LwjglApplicationChanger()
{
super( new LwjglPreferences( "game-settings", "settings" ) );
}
@Override
public Application createApplication( RoguelikeGame game, Preferences pref )
{
System.setProperty( "org.lwjgl.opengl.Window.undecorated", "" + pref.getBoolean( "borderless" ) );
LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration();
cfg.title = "A Skin of Others";
cfg.width = pref.getInteger( "resolutionX" );
cfg.height = pref.getInteger( "resolutionY" );
cfg.fullscreen = pref.getBoolean( "fullscreen" );
cfg.vSyncEnabled = pref.getBoolean( "vSync" );
cfg.foregroundFPS = 0;
cfg.backgroundFPS = 2;
cfg.samples = pref.getInteger( "msaa" );
cfg.addIcon( "Sprites/Unpacked/Icon32.png", FileType.Internal );
cfg.allowSoftwareMode = true;
Global.TargetResolution[0] = cfg.width;
Global.TargetResolution[1] = cfg.height;
Global.ScreenSize[0] = cfg.width;
Global.ScreenSize[1] = cfg.height;
Global.FPS = pref.getInteger( "fps" );
Global.AnimationSpeed = 1.0f / pref.getFloat( "animspeed" );
Global.MovementTypePathfind = pref.getBoolean( "pathfindMovement" );
Global.MusicVolume = pref.getFloat( "musicVolume" );
Global.AmbientVolume = pref.getFloat( "ambientVolume" );
Global.EffectVolume = pref.getFloat( "effectVolume" );
Global.updateVolume();
for ( Controls.Keys key : Controls.Keys.values() )
{
Global.Controls.setKeyMap( key, pref.getInteger( key.toString() ) );
}
return new LwjglApplication( game, cfg );
}
@Override
public void processResources()
{
if (!Global.RELEASE)
{
new QuestProcessor();
new AtlasCreator();
}
}
@Override
public void updateApplication( Preferences pref )
{
System.setProperty( "org.lwjgl.opengl.Window.undecorated", "" + pref.getBoolean( "borderless" ) );
int width = pref.getInteger( "resolutionX" );
int height = pref.getInteger( "resolutionY" );
boolean fullscreen = pref.getBoolean( "fullscreen" );
Global.TargetResolution[0] = width;
Global.TargetResolution[1] = height;
Global.FPS = pref.getInteger( "fps" );
Global.AnimationSpeed = 1.0f / pref.getFloat( "animspeed" );
Global.MovementTypePathfind = pref.getBoolean( "pathfindMovement" );
Global.MusicVolume = pref.getFloat( "musicVolume" );
Global.AmbientVolume = pref.getFloat( "ambientVolume" );
Global.EffectVolume = pref.getFloat( "effectVolume" );
Global.updateVolume();
for ( Controls.Keys key : Controls.Keys.values() )
{
Global.Controls.setKeyMap( key, pref.getInteger( key.toString() ) );
}
if (fullscreen)
{
DisplayMode mode = Gdx.graphics.getDisplayMode();
Gdx.graphics.setFullscreenMode( mode );
}
else
{
Gdx.graphics.setWindowedMode( width, height );
}
//Gdx.graphics.setVSync( pref.getBoolean( "vSync" ) );
}
@Override
public String[] getSupportedDisplayModes()
{
DisplayMode[] displayModes = Gdx.graphics.getDisplayModes();
ArrayList<String> modes = new ArrayList<String>();
for ( int i = 0; i < displayModes.length; i++ )
{
String mode = displayModes[i].width + "x" + displayModes[i].height;
boolean contained = false;
for ( String m : modes )
{
if ( m.equals( mode ) )
{
contained = true;
break;
}
}
if ( !contained )
{
modes.add( mode );
}
}
Collections.sort( modes, new Comparator<String>()
{
@Override
public int compare( String s1, String s2 )
{
int split = s1.indexOf( "x" );
int rX1 = Integer.parseInt( s1.substring( 0, split ) );
split = s2.indexOf( "x" );
int rX2 = Integer.parseInt( s2.substring( 0, split ) );
if ( rX1 < rX2 ) return -1;
else if ( rX1 > rX2 ) return 1;
return 0;
}
} );
String[] m = new String[modes.size()];
return modes.toArray( m );
}
public void setDefaultPrefs( Preferences prefs )
{
prefs.putBoolean( "pathfindMovement", false );
prefs.putFloat( "musicVolume", 1 );
prefs.putFloat( "ambientVolume", 1 );
prefs.putFloat( "effectVolume", 1 );
prefs.putInteger( "resolutionX", 800 );
prefs.putInteger( "resolutionY", 600 );
prefs.putBoolean( "fullscreen", false );
prefs.putBoolean( "borderless", false );
prefs.putBoolean( "vSync", true );
prefs.putInteger( "fps", 0 );
prefs.putFloat( "animspeed", 1 );
prefs.putInteger( "msaa", 16 );
Global.Controls.defaultArrow();
for ( Controls.Keys key : Controls.Keys.values() )
{
prefs.putInteger( key.toString(), Global.Controls.getKeyCode( key ) );
}
}
@Override
public void setToNativeResolution( Preferences prefs )
{
DisplayMode dm = Gdx.graphics.getDisplayMode();
prefs.putInteger( "resolutionX", dm.width );
prefs.putInteger( "resolutionY", dm.height );
updateApplication( prefs );
}
}