package rabbitescape.engine.menu;
import static rabbitescape.engine.config.ConfigKeys.*;
import java.util.Locale;
import java.util.Set;
import rabbitescape.engine.config.Config;
import rabbitescape.engine.config.ConfigTools;
import rabbitescape.engine.err.RabbitEscapeException;
import rabbitescape.engine.util.Util;
public class ByNameConfigBasedLevelsCompleted implements LevelsCompleted
{
public static class EmptyLevelName extends RabbitEscapeException
{
private static final long serialVersionUID = 1L;
}
private static final Locale en_UK = Locale.UK;
private final Config config;
private final LevelsList levelsList;
// ---
public ByNameConfigBasedLevelsCompleted(
Config config, LevelsList levelsList
)
{
this.config = config;
this.levelsList = levelsList;
}
@Override
public int highestLevelCompleted( String levelsDir )
{
Set<String> completed = ConfigTools.getSet(
config, CFG_LEVELS_COMPLETED, String.class );
int i = 0;
for ( LevelsList.LevelInfo level : levelsList.inDir( levelsDir ) )
{
if ( !completed.contains( canonicalName( level.name ) ) )
{
break;
}
++i;
}
return i;
}
@Override
public void setCompletedLevel( String levelsDir, int levelNum )
{
Set<String> completed = ConfigTools.getSet(
config, CFG_LEVELS_COMPLETED, String.class );
LevelsList.LevelInfo newlyCompleted =
levelsList.inDir( levelsDir ).get( levelNum - 1 );
String completedName = canonicalName( newlyCompleted.name );
if ( !completed.contains( completedName ) )
{
completed.add( completedName );
ConfigTools.setSet( config, CFG_LEVELS_COMPLETED, completed );
config.save();
}
}
// ---
public static String canonicalName( String name )
{
if ( Util.isEmpty( name ) )
{
throw new EmptyLevelName();
}
else
{
return name.toLowerCase( en_UK ).replaceAll( "[^a-z0-9]", "_" );
}
}
}