package vooga.scroller.level_management;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.List;
import util.input.Input;
import vooga.scroller.scrollingmanager.ScrollingManager;
import vooga.scroller.sprites.interfaces.IDoor;
import vooga.scroller.sprites.superclasses.Player;
import vooga.scroller.util.IGameComponent;
import vooga.scroller.view.GameView;
import vooga.scroller.level_editor.Level;
import vooga.scroller.level_management.splash_page.SplashPage;
/**
* Manages the flow and order of levels in gameplay.
*
* @author Scott Valentine
*
*/
public class LevelManager {
// TODO: this string exists somewhere else (need to consolidate)
//TODO: fix design such that there is no need for developer to specify default (we could
// just make a place holder file... seems like a cop-out
private static final String DEFAULT_INPUT_CONTROLS = "vooga/scroller/marioGame/controls/SplashMapping";
private Input myInput;
private IGameComponent myInitialLevel;
private IGameComponent myCurrentLevel;
private GameView myView;
/**
* Creates a new level manager based on the view used by individual levels.
* @param gameView to be used in constructing individual levels.
*/
public LevelManager(ScrollingManager sm, GameView gameView, Player player, SplashPage splashPage, String ...levelFileNames) {
myView = gameView;
LevelFactory lf = new LevelFactory(this, sm, gameView);
myInitialLevel = lf.linkLevels(splashPage, lf.generateLevels(levelFileNames));
//myCurrentLevel = myLevels.get(DEFAULT_START_LEVEL_ID);
myInput = new Input(DEFAULT_INPUT_CONTROLS, gameView);
setCurrentLevel(myInitialLevel);
myCurrentLevel.addPlayer(player);
}
/**
* Creates a new level manager based on the view used by individual levels.
* @param gameView to be used in constructing individual levels.
*/
public LevelManager(ScrollingManager sm, GameView gameView, Player player, SplashPage splashPage, Level ...levels) {
myView = gameView;
LevelFactory lf = new LevelFactory(this, sm, gameView);
List<IGameComponent> gameComponents = new ArrayList<IGameComponent>();
for (int i=0; i<levels.length; i++) {
gameComponents.add(levels[i]);
}
myInitialLevel = lf.linkLevels(splashPage, gameComponents);
//myCurrentLevel = myLevels.get(DEFAULT_START_LEVEL_ID);
myInput = new Input(DEFAULT_INPUT_CONTROLS, gameView);
setCurrentLevel(myInitialLevel);
myCurrentLevel.addPlayer(player);
}
/**
* Gives the current level.
*
* @return The current level
*/
public IGameComponent getCurrentLevel() {
return myCurrentLevel;
}
/**
* Sets the current level to the specified ID.
*
* @param id of the level to become the current level.
*/
public void setCurrentLevel(IGameComponent level) {
if(myCurrentLevel != null){
myCurrentLevel.removeInputListeners(myInput);
Player p = myCurrentLevel.getPlayer();
myCurrentLevel = level;
myCurrentLevel.addPlayer(p);
p.setLevel(myCurrentLevel);
}
else{
myCurrentLevel = level;
}
myCurrentLevel.addInputListeners(myInput);
}
/**
* Map a door to a starting point. Bind door to this level manager.
*/
public void put(IDoor door, IGameComponent nextLevel) {
door.setNextLevel(nextLevel);
door.setManager(this);
}
public void updateLevel(double elapsedTime, Dimension bounds) {
myCurrentLevel.update(elapsedTime, bounds, myView);
}
}