package Roguelike.Levels;
import Roguelike.DungeonGeneration.DungeonFileParser;
import Roguelike.Entity.GameEntity;
import Roguelike.Global;
import Roguelike.Items.Item;
import Roguelike.Levels.TownEvents.EventList;
import Roguelike.Quests.QuestManager;
import Roguelike.RoguelikeGame;
import Roguelike.Save.SaveLevel;
import Roguelike.Screens.GameScreen;
import Roguelike.Screens.LoadingScreen;
import Roguelike.UI.ButtonKeyboardHelper;
import Roguelike.UI.ClassList;
import Roguelike.UI.Seperator;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.ui.*;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.XmlReader;
import java.io.IOException;
/**
* Created by Philip on 02-Feb-16.
*/
public class TownCreator
{
public Array<Building> buildings = new Array<Building>( );
public Building houses = new Building( "House", null );
public TownCreator()
{
XmlReader reader = new XmlReader();
XmlReader.Element xml = null;
try
{
xml = reader.parse( Gdx.files.internal( "Levels/Town/BuildingList.xml" ) );
}
catch ( IOException e )
{
e.printStackTrace();
}
for (int i = 0; i < xml.getChildCount(); i++)
{
XmlReader.Element el = xml.getChild( i );
buildings.add( new Building( el.getName(), el.getText() ) );
}
}
public void create()
{
// Get extra rooms
Array<DungeonFileParser.DFPRoom> rooms = new Array<DungeonFileParser.DFPRoom>( );
for (Building building : buildings)
{
if ( Global.WorldFlags.containsKey( building.key ) )
{
int index = Integer.parseInt( Global.WorldFlags.get( building.key ) ) - 1;
index = Math.min( index, building.rooms.size-1 );
rooms.add( building.rooms.get( index ) );
}
}
for (int i = 0; i < 3; i++)
{
rooms.add(houses.rooms.get( 0 ));
}
// Build changed flag list and evaluate events
ObjectMap<String, String> validFlags = new ObjectMap<String, String>( );
validFlags.putAll( Global.RunFlags );
for (String key : Global.WorldFlags.keys())
{
String value = Global.WorldFlags.get( key );
if (!value.equals( Global.WorldFlagsCopy.get( key ) ) )
{
validFlags.put( key, value );
}
}
EventList eventList = new EventList();
eventList.evaluate(validFlags);
// Update the flag copy
Global.WorldFlagsCopy.clear();
Global.WorldFlagsCopy.putAll( Global.WorldFlags );
//Begin the new game
Array<ClassList.ClassDesc> classes = ClassList.parse();
createCharGenTable(classes);
Global.LevelManager = new LevelManager();
Global.QuestManager = new QuestManager();
Global.RunFlags.clear();
SaveLevel level = new SaveLevel( "Town", 0, rooms, 0 );
Global.LevelManager.current.currentLevel = level;
LoadingScreen.Instance.set( level, classes.get( 0 ).male, "Tavern", null );
RoguelikeGame.Instance.switchScreen( RoguelikeGame.ScreenEnum.LOADING );
}
private void createCharGenTable( final Array<ClassList.ClassDesc> classes )
{
Skin skin = Global.loadSkin();
ButtonKeyboardHelper keyboardHelper = new ButtonKeyboardHelper( );
Global.CharGenMode = true;
Table table = new Table();
table.defaults().pad( 5 );
Label title = new Label( "Character Creation", skin, "title" );
table.add( title ).expandX().left();
table.row();
table.add( new Seperator( skin ) ).expandX().fillX();
table.row();
ButtonGroup<CheckBox> genderGroup = new ButtonGroup<CheckBox>( );
final ButtonGroup<TextButton> classGroup = new ButtonGroup<TextButton>( );
Table genderTable = new Table( );
genderTable.defaults().padLeft( 20 );
Label genderLabel = new Label( "Gender: ", skin );
genderTable.add( genderLabel ).width( 100 );
final CheckBox male = new CheckBox( " Male", skin );
male.addListener( new ChangeListener() {
@Override
public void changed( ChangeEvent event, Actor actor )
{
if (classGroup.getChecked() != null)
{
String selected = "" + classGroup.getChecked().getText();
selected = selected.substring( 1 );
for ( ClassList.ClassDesc desc : classes )
{
if ( desc.name.equals( selected ) )
{
GameEntity newPlayer = male.isChecked() ? desc.male : desc.female;
Global.CurrentLevel.player.tile[ 0 ][ 0 ].addGameEntity( newPlayer );
Global.CurrentLevel.player = newPlayer;
break;
}
}
}
}
} );
CheckBox female = new CheckBox( " Female", skin );
genderGroup.add( male, female );
genderTable.add( male );
genderTable.add( female );
keyboardHelper.add( male, female );
table.add( genderTable ).expandX().left();
table.row();
table.add( new Seperator( skin ) ).expandX().fillX();
table.row();
Table classSection = new Table();
Label classTitle = new Label("Class:", skin);
classSection.add( classTitle ).padLeft( 20 ).width( 100 ).expandY().top();
Table choiceTable = new Table( );
choiceTable.defaults().padBottom( 20 );
final Label classDescription = new Label( classes.get( 0 ).description, skin );
classDescription.setWrap( true );
for ( final ClassList.ClassDesc desc : classes )
{
if (desc.unlockedBy != null && !Global.WorldFlags.containsKey( desc.unlockedBy ))
{
continue;
}
final CheckBox checkBox = new CheckBox( " " + desc.name, skin );
checkBox.addListener( new ChangeListener()
{
@Override
public void changed( ChangeEvent event, Actor actor )
{
if (checkBox.isChecked() && Global.CurrentLevel != null && Global.CurrentLevel.player != null)
{
GameEntity newPlayer = male.isChecked() ? desc.male : desc.female;
Global.CurrentLevel.player.tile[0][0].addGameEntity( newPlayer );
Global.CurrentLevel.player = newPlayer;
classDescription.setText( desc.description );
}
}
});
choiceTable.add( checkBox );
choiceTable.row();
classGroup.add( checkBox );
keyboardHelper.add( checkBox );
}
ScrollPane scrollPane = new ScrollPane( choiceTable, skin );
scrollPane.setScrollingDisabled( true, false );
scrollPane.setVariableSizeKnobs( true );
scrollPane.setFadeScrollBars( false );
scrollPane.setScrollbarsOnTop( false );
//scrollPane.setForceScroll( false, true );
scrollPane.setFlickScroll( false );
classSection.add( scrollPane ).padLeft( 20 ).expandY().top();
classSection.add( new Seperator( skin, true ) ).expandY().fillY().pad( 15, 25, 15, 25 );
classSection.add( classDescription ).expand().fillX().top();
table.add( classSection ).expand().fill();
table.row();
table.add( new Seperator( skin ) ).expandX().fillX();
table.row();
TextButton startButton = new TextButton( "Begin", skin );
startButton.addListener( new ClickListener( )
{
public void clicked( InputEvent event, float x, float y )
{
Global.CharGenMode = false;
GameScreen.Instance.clearContextMenu( true );
Item money = Item.load( "Treasure/Money" );
money.count = Integer.parseInt( Global.WorldFlags.get( "startingfunds" ) );
Global.CurrentLevel.player.inventory.addItem( money );
}
} );
table.add( startButton ).expandX().fillX();
table.row();
keyboardHelper.add( startButton );
GameScreen.Instance.queueContextMenu( table, keyboardHelper );
}
public static class Building
{
public String name;
public String key;
public Array<DungeonFileParser.DFPRoom> rooms = new Array<DungeonFileParser.DFPRoom>( );
public Building(String name, String key)
{
this.name = name.toLowerCase();
this.key = key != null ? key.toLowerCase() : null;
XmlReader reader = new XmlReader();
XmlReader.Element xml = null;
try
{
xml = reader.parse( Gdx.files.internal( "Levels/Town/" + name + ".xml" ) );
}
catch ( IOException e )
{
e.printStackTrace();
}
XmlReader.Element roomsElement = xml.getChildByName( "Rooms" );
for ( int i = 0; i < roomsElement.getChildCount(); i++ )
{
XmlReader.Element roomElement = roomsElement.getChild( i );
DungeonFileParser.DFPRoom room = DungeonFileParser.DFPRoom.parse( roomElement );
rooms.add( room );
}
}
}
}