package Roguelike.Quests;
import Roguelike.Global;
import Roguelike.Quests.Input.AbstractQuestInput;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.ObjectSet;
import com.badlogic.gdx.utils.XmlReader;
import java.io.IOException;
import java.util.Random;
/**
* Created by Philip on 23-Jan-16.
*/
public class QuestManager
{
public Array<Quest> availableQuests = new Array<Quest>( );
public ObjectSet<String> usedQuests = new ObjectSet<String>( );
public ObjectMap<String, String> deferredFlags = new ObjectMap<String, String>( );
public QuestManager()
{
XmlReader reader = new XmlReader();
XmlReader.Element xml = null;
try
{
xml = reader.parse( Gdx.files.internal( "Quests/QuestList.xml" ) );
}
catch ( IOException e )
{
e.printStackTrace();
}
for (int i = 0; i < xml.getChildCount(); i++)
{
XmlReader.Element questEl = xml.getChild( i );
Quest quest = Quest.load( questEl.getText() );
availableQuests.add( quest );
}
}
public Quest getQuest( String level, Random ran )
{
Array<Quest> validQuests = new Array<Quest>( );
for (Quest quest : availableQuests)
{
if (!usedQuests.contains(quest.path) &&
(quest.allowedLevels.contains( "all" ) || quest.allowedLevels.contains( level )) &&
quest.evaluateInputs())
{
validQuests.add( quest );
}
}
if (validQuests.size == 0)
{
return null;
}
Array<Quest> worldQuests = new Array<Quest>( );
Array<Quest> runQuests = new Array<Quest>( );
for (Quest quest : validQuests)
{
boolean run = false;
for ( AbstractQuestInput input : quest.inputs )
{
if ( Global.RunFlags.containsKey( input.key ) )
{
run = true;
break;
}
}
Array<Quest> chosenList = null;
if (run)
{
chosenList = runQuests;
}
else
{
chosenList = worldQuests;
}
// do rarity
int rarity = (Global.Rarity.values().length - quest.rarity.ordinal()) + 1;
for (int i = 0; i < rarity; i++)
{
chosenList.add( quest );
}
}
Quest chosen = null;
if (runQuests.size > 0)
{
chosen = runQuests.get( ran.nextInt( runQuests.size ) );
}
else
{
chosen = worldQuests.get( ran.nextInt( worldQuests.size ) );
}
usedQuests.add( chosen.path );
return chosen;
}
}