package Roguelike.Screens;
import Roguelike.Ability.AbilityTree;
import Roguelike.AssetManager;
import Roguelike.Entity.GameEntity;
import Roguelike.Global;
import Roguelike.Items.Item;
import Roguelike.RoguelikeGame;
import Roguelike.Sprite.Sprite;
import Roguelike.UI.ClassList;
import Roguelike.UI.ClassList.ClassDesc;
import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.NinePatch;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.scenes.scene2d.Actor;
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.ui.Button;
import com.badlogic.gdx.scenes.scene2d.ui.ButtonGroup;
import com.badlogic.gdx.scenes.scene2d.ui.CheckBox;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.scenes.scene2d.utils.NinePatchDrawable;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
public class CharacterCreationScreen implements Screen
{
private void create()
{
skin = Global.loadSkin();
stage = new Stage( new ScreenViewport() );
batch = new SpriteBatch();
this.tileBackground = AssetManager.loadSprite( "GUI/TileBackground" );
// tileBackground.colour = Color.GREEN;
// this.tileBorder = AssetManager.loadSprite( "GUI/TileBorder" );
background = AssetManager.loadTexture( "Sprites/GUI/Background.png" );
createUI();
}
private void createUI()
{
NinePatch background = new NinePatch( AssetManager.loadTextureRegion( "Sprites/GUI/TilePanel.png" ), 12, 12, 12, 12 );
classList = new ClassList( skin, stage, tileBackground, tileBorder );
// table.debug();
Table optionsTable = new Table();
optionsTable.defaults().space( 20 );
optionsTable.background( new NinePatchDrawable( background ) );
male = new CheckBox( "Male", skin );
male.addListener( new ChangeListener() {
@Override
public void changed( ChangeEvent event, Actor actor )
{
classList.male = male.isChecked();
}
} );
female = new CheckBox( "Female", skin );
ButtonGroup<Button> group = new ButtonGroup<Button>();
group.add( male, female );
male.setChecked( true );
Table genderTable = new Table();
genderTable.add( new Label( "Gender", skin ) ).colspan( 2 );
genderTable.row();
genderTable.add( male );
genderTable.add( female );
optionsTable.add( genderTable );
final Table classTable = new Table();
classTable.defaults().uniformY().space( 10 );
// classTable.debug();
selectedClass = new Table();
selectedClass.background( new NinePatchDrawable( background ) );
classTable.add( classList ).left().fillY().expandY();
classTable.add( selectedClass ).fill().expand();
TextButton ngbutton = new TextButton( "New Game", skin, "big" );
ngbutton.addListener( new ClickListener()
{
public void clicked( InputEvent event, float x, float y )
{
GameEntity entity = male.isChecked() ? classList.chosen.male : classList.chosen.female;
Global.newGame( entity );
Global.RunFlags.put( "class", classList.chosen.name );
}
} );
TextButton mainMenubutton = new TextButton( "Main Menu", skin, "big" );
mainMenubutton.addListener( new ClickListener()
{
public void clicked( InputEvent event, float x, float y )
{
RoguelikeGame.Instance.switchScreen( RoguelikeGame.ScreenEnum.MAINMENU );
}
} );
Table table = new Table();
table.add( optionsTable ).colspan( 2 ).pad( 10 ).expandX().fillX();
table.row();
table.add( classTable ).colspan( 2 ).pad( 10 ).expand().fill();
table.row();
table.add( mainMenubutton ).expandX().width( 200 ).pad( 10 ).left();
table.add( ngbutton ).expandX().width( 200 ).pad( 10 ).right();
table.row();
table.setFillParent( true );
stage.addActor( table );
}
@Override
public void show()
{
if ( !created )
{
create();
created = true;
}
else
{
classList.reparse();
}
Gdx.input.setInputProcessor( stage );
camera = new OrthographicCamera( Global.Resolution[0], Global.Resolution[1] );
camera.translate( Global.Resolution[0] / 2, Global.Resolution[1] / 2 );
camera.setToOrtho( false, Global.Resolution[0], Global.Resolution[1] );
camera.update();
batch.setProjectionMatrix( camera.combined );
stage.getViewport().setCamera( camera );
stage.getViewport().setWorldWidth( Global.Resolution[0] );
stage.getViewport().setWorldHeight( Global.Resolution[1] );
stage.getViewport().setScreenWidth( Global.ScreenSize[0] );
stage.getViewport().setScreenHeight( Global.ScreenSize[1] );
Global.changeBGM( "Myst" );
}
// ----------------------------------------------------------------------
private float roundTo( float val, float multiple )
{
return (float) ( multiple * Math.floor( val / multiple ) );
}
private void fillClassDesc()
{
selectedClass.clearChildren();
if ( lastSelected == null ) { return; }
selectedClass.add( new Label( lastSelected.name, skin, "title" ) ).expandX().left().top();
selectedClass.row();
Label descLabel = new Label( lastSelected.description, skin );
descLabel.setWrap( true );
selectedClass.add( descLabel ).expandX().left().top();
selectedClass.row();
selectedClass.add( new Label( "Starting Abilities:", skin ) ).expandX().left().top();
selectedClass.row();
GameEntity entity = male.isChecked() ? lastSelected.male : lastSelected.female;
for (AbilityTree tree : entity.slottedAbilities)
{
if (tree != null)
{
selectedClass.add( new Label( tree.current.current.getName(), skin ) ).expandX().left().padLeft( 30 ).top();
selectedClass.row();
}
}
selectedClass.add( new Label( "Starting Inventory:", skin ) ).expandX().left().top();
selectedClass.row();
for ( Item item : entity.getInventory().m_items )
{
selectedClass.add( new Label( item.name, skin ) ).expandX().left().padLeft( 30 ).top();
selectedClass.row();
}
}
@Override
public void render( float delta )
{
if ( classList.chosen != lastSelected )
{
lastSelected = classList.chosen;
fillClassDesc();
}
stage.act();
Gdx.gl.glClearColor( 0.3f, 0.3f, 0.3f, 1 );
Gdx.gl.glClear( GL20.GL_COLOR_BUFFER_BIT );
batch.begin();
// batch.draw( background, 0, 0, Global.Resolution[0],
// Global.Resolution[1] );
batch.end();
stage.draw();
// limit fps
sleep( Global.FPS );
}
// ----------------------------------------------------------------------
private long diff, start = System.currentTimeMillis();
public void sleep( int fps )
{
if ( fps > 0 )
{
diff = System.currentTimeMillis() - start;
long targetDelay = 1000 / fps;
if ( diff < targetDelay )
{
try
{
Thread.sleep( targetDelay - diff );
}
catch ( InterruptedException e )
{
}
}
start = System.currentTimeMillis();
}
}
@Override
public void resize( int width, int height )
{
Global.ScreenSize[0] = width;
Global.ScreenSize[1] = height;
float w = 360;
float h = 480;
if ( width < height )
{
h = w * ( (float) height / (float) width );
}
else
{
w = h * ( (float) width / (float) height );
}
Global.Resolution[0] = (int) w;
Global.Resolution[1] = (int) h;
camera = new OrthographicCamera( Global.Resolution[0], Global.Resolution[1] );
camera.translate( Global.Resolution[0] / 2, Global.Resolution[1] / 2 );
camera.setToOrtho( false, Global.Resolution[0], Global.Resolution[1] );
camera.update();
batch.setProjectionMatrix( camera.combined );
stage.getViewport().setCamera( camera );
stage.getViewport().setWorldWidth( Global.Resolution[0] );
stage.getViewport().setWorldHeight( Global.Resolution[1] );
stage.getViewport().setScreenWidth( Global.ScreenSize[0] );
stage.getViewport().setScreenHeight( Global.ScreenSize[1] );
classList.setWidth( classList.getPrefWidth() );
classList.setHeight( h-40 );//roundTo( h - 40, 64 + classList.padding ) );
fillClassDesc();
}
@Override
public void pause()
{
}
@Override
public void resume()
{
}
@Override
public void hide()
{
}
@Override
public void dispose()
{
}
// ----------------------------------------------------------------------
public OrthographicCamera camera;
boolean created;
ClassList classList;
Table selectedClass;
ClassDesc lastSelected;
Stage stage;
Skin skin;
SpriteBatch batch;
CheckBox male;
CheckBox female;
Texture background;
private Sprite tileBackground;
private Sprite tileBorder;
}