package com.shade.controls;
import java.util.prefs.Preferences;
import com.shade.levels.LevelManager;
/**
* Controls which levels are available to the player.
*
* This object persists through the user preferences.
*
* @author Alexander Schearer <aschearer@gmail.com>
*/
public class LevelLock {
private static final String LEVELS_KEY = "unlocked-levels";
private static final String LEVEL_LOCKED = "0";
private static final String LEVEL_UNLOCKED = "1";
private static final String DELIMITER = ",";
private static final String STRING_EMPTY = "";
private boolean[] unlocked;
public LevelLock() {
unlocked = new boolean[LevelManager.NUM_LEVELS];
unlocked[0] = true;
unlocked = deserialize();
}
private boolean[] deserialize() {
Preferences prefs = Preferences.userNodeForPackage(this.getClass());
String serial = prefs.get(LEVELS_KEY, STRING_EMPTY);
String[] levels = serial.split(DELIMITER);
for (int i = 0; i < levels.length; i++) {
if (levels[i].equals(LEVEL_UNLOCKED)) {
unlocked[i] = true;
}
}
return unlocked;
}
public boolean isUnlocked(int level) {
return unlocked[level];
}
public boolean allUnlocked() {
for (int i = 0; i < unlocked.length; i++) {
if (!unlocked[i]) {
return false;
}
}
return true;
}
public void unlock(int level) {
if (unlocked[level]) {
return;
}
unlocked[level] = true;
save();
}
public void save() {
String[] levels = new String[unlocked.length];
for (int i = 0; i < unlocked.length; i++) {
if (unlocked[i]) {
levels[i] = LEVEL_UNLOCKED;
} else {
levels[i] = LEVEL_LOCKED;
}
}
String serial = implode(levels, DELIMITER);
Preferences prefs = Preferences.userNodeForPackage(this.getClass());
prefs.put(LEVELS_KEY, serial);
}
private String implode(String[] strings, String glue) {
StringBuilder result = new StringBuilder(strings[1]);
for (int i = 1; i < strings.length; i++) {
result.append(DELIMITER);
result.append(strings[i]);
}
return result.toString();
}
public void resetLocks() {
unlocked = new boolean[LevelManager.NUM_LEVELS];
unlocked[0] = true;
save();
}
public void freeFirst(int n) {
resetLocks();
for (int i = 1; i < LevelManager.NUM_LEVELS; i++) {
if (i < n) {
unlocked[i] = true;
}
}
save();
}
public void testAndUnlockLevels() {
int clear123 = 0;
clear123 += SerialStats.read("level-1-clear");
clear123 += SerialStats.read("level-2-clear");
clear123 += SerialStats.read("level-3-clear");
if (clear123 >= 1) {
unlock(5); // beat one of the first 3 levels
}
if (SerialStats.read("golden-mushrooms-collected") >= 25) {
unlock(6); // collect 25 gold mushrooms
}
if (SerialStats.read("mushrooms-collected") >= 100) {
unlock(7); // collect 100 mushrooms
}
int clear456 = 0;
clear456 += SerialStats.read("level-4-clear");
clear456 += SerialStats.read("level-5-clear");
clear456 += SerialStats.read("level-6-clear");
if (clear456 == 3) {
unlock(8); // beat each of the second three
}
if (SerialStats.read("level-mushrooms-collected") >= 40) {
unlock(9); // collect 40 mushrooms in a single level
}
int clear789 = 0;
clear789 += SerialStats.read("level-7-clear");
clear789 += SerialStats.read("level-8-clear");
clear789 += SerialStats.read("level-9-clear");
if (clear123 == 3 && clear456 == 3 && clear789 == 3) {
unlock(10); // beat levels 1-9
}
}
public boolean newLevelUnlocked() {
int clear123 = 0;
clear123 += SerialStats.read("level-1-clear");
clear123 += SerialStats.read("level-2-clear");
clear123 += SerialStats.read("level-3-clear");
if (!isUnlocked(5) && clear123 >= 1) {
return true; // beat one of the first 3 levels
}
if (!isUnlocked(6) && SerialStats.read("golden-mushrooms-collected") >= 25) {
return true; // collect 25 gold mushrooms
}
if (!isUnlocked(7) && SerialStats.read("mushrooms-collected") >= 100) {
return true; // collect 100 mushrooms
}
int clear456 = 0;
clear456 += SerialStats.read("level-4-clear");
clear456 += SerialStats.read("level-5-clear");
clear456 += SerialStats.read("level-6-clear");
if (!isUnlocked(8) && clear456 == 3) {
return true; // clear the second three levels
}
if (!isUnlocked(9) && SerialStats.read("level-mushrooms-collected") >= 40) {
return true; // collect 40 mushrooms in a single level
}
int clear789 = 0;
clear789 += SerialStats.read("level-7-clear");
clear789 += SerialStats.read("level-8-clear");
clear789 += SerialStats.read("level-9-clear");
if (!isUnlocked(10) && clear123 == 3 && clear456 == 3 && clear789 == 3) {
return true; // beat levels 1-9
}
return false;
}
public static void main(String[] args) {
LevelLock lock = new LevelLock();
lock.freeFirst(9); // counting 0
LevelLock l = new LevelLock();
for (int i = 0; i < l.unlocked.length; i++) {
if (l.unlocked[i]) {
System.out.println("level " + i + " unlocked");
}
}
}
}