int selectedLevel = 0; int unlockedLevel = 0; int cellSize = 16; int xOffset = 0; int yOffset = 0; boolean hasMultipleTargetsOrBoxes = false; String[] grid; String[] objects; int rows = 0; int columns = 0; StringList moves = new StringList(); void drawLevelSelect() { background(#000000); textAlign(CENTER, CENTER); textFont(headingFont); fill(#FFFFFF); text("Select a level", width / 2, 32); textFont(textFont); text("UP / DOWN to select, ENTER to play", width / 2, 75); for (int i = 0; i < levels.length; i++) { if (selectedLevel == i && i > unlockedLevel) { fill(#FF0000); } else if (selectedLevel == i) { fill(#00FF00); } else if (i > unlockedLevel) { fill(#555555); } else { fill(#FFFFFF); } text(levels[i][0], width / 2, 120 + i * 20); } } void keyPressedLevelSelect() { if (keyCode == ENTER) { startGame(selectedLevel); } else if (keyCode == UP) { selectedLevel--; } else if (keyCode == DOWN) { selectedLevel++; } if (selectedLevel < 0) { selectedLevel = levels.length - 1; } else if (selectedLevel >= levels.length) { selectedLevel = 0; } } void startGame(int level) { if (level > unlockedLevel) return; gameState = GAME_LEVEL_INFO; moves.clear(); String[] levelData = levels[level]; grid = new String[levelData.length - 2]; objects = new String[levelData.length - 2]; StringList targets = new StringList(); StringList boxes = new StringList(); for (int y = 0; y < levelData.length - 2; y++) { grid[y] = levelData[y + 2].replaceAll("[\\$a-z]", " ").replaceAll("\\.", "Z").replaceAll("\\*", "Z"); objects[y] = levelData[y + 2].replaceAll("@", "z").replaceAll("\\*", "z").replaceAll("[^a-z]", " "); for (int x = 0; x < grid[y].length(); x++) { char tile = grid[y].charAt(x); char box = objects[y].charAt(x); if (!targets.hasValue("" + tile) && tile >= 'A' && tile <= 'Z') { targets.push("" + tile); } if (!boxes.hasValue("" + box) && box >= 'a' && box <= 'z') { boxes.push("" + box); } } if (levelData[y + 2].indexOf("$") >= 0) { playerY = y; playerX = levelData[y + 2].indexOf("$"); } } targets.sort(); targets.lower(); boxes.sort(); hasMultipleTargetsOrBoxes = targets.size() > 1 || boxes.size() > 1 || !join(targets.array(), "").equals(join(boxes.array(), "")); columns = grid[0].length(); rows = grid.length; if (columns > rows) { cellSize = (width - 20) / columns; } else { cellSize = (height - 20) / rows; } xOffset = (width - cellSize * columns) / 2; yOffset = (height - cellSize * rows) / 2; }