package rabbitescape.engine.menu; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.SortedMap; import java.util.TreeMap; /** * List of all level sets in the game, sorted by directory name. */ public class LevelsList implements Iterable<LevelsList.LevelSetInfo> { public static class LevelSetInfo { public final String name; public final String dirName; public final List<LevelInfo> levels; public final boolean hidden; public LevelSetInfo( String name, String dirName, List<LevelInfo> levels, boolean hidden ) { this.name = name; this.dirName = dirName; this.levels = levels; this.hidden = hidden; } public LevelSetInfo( String name, String dirName, List<LevelInfo> levels ) { this( name, dirName, levels, false ); } } public static class LevelInfo { public final String fileName; public final String name; public LevelInfo( String fileName, String name ) { this.fileName = fileName; this.name = name; } @Override public String toString() { return String.format( "LevelInfo(\"%s\",\"%s\")", fileName, name ); } @Override public boolean equals( Object objOther ) { if ( objOther.getClass() != getClass() ) { return false; } LevelInfo other = (LevelInfo)objOther; return ( other.name.equals( name ) && other.fileName.equals( fileName ) ); } @Override public int hashCode() { return 31 * name.hashCode() + fileName.hashCode(); } } // --- private final SortedMap<String, LevelSetInfo> levelSets; public LevelsList( LevelSetInfo... levelSets ) { this( Arrays.asList( levelSets ) ); } public static LevelsList excludingHidden( LevelsList levelsList ) { List<LevelSetInfo> ret = new ArrayList<LevelSetInfo>(); for ( LevelSetInfo i : levelsList ) { if ( !i.hidden ) { ret.add( i ); } } return new LevelsList( ret ); } public LevelsList( List<LevelSetInfo> levelSets ) { this.levelSets = new TreeMap<String, LevelSetInfo>(); for ( LevelSetInfo set : levelSets ) { this.levelSets.put( set.dirName, set ); } } public List<LevelInfo> inDir( String levelsDir ) { return levelSets.get( levelsDir ).levels; } public int size() { return levelSets.size(); } @Override public Iterator<LevelSetInfo> iterator() { return levelSets.values().iterator(); } }