/*
* Copyright 2012 Benjamin Glatzel <benjamin.glatzel@me.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.terasology.game.modes;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.glClear;
import static org.lwjgl.opengl.GL11.glLoadIdentity;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.spout.api.gamestate.GameState;
import org.terasology.game.TerasologyEngine;
import org.terasology.logic.manager.AudioManager;
import org.terasology.logic.manager.Config;
import org.terasology.logic.manager.GUIManager;
import org.terasology.rendering.gui.components.UIButton;
import org.terasology.rendering.gui.framework.IClickListener;
import org.terasology.rendering.gui.framework.UIDisplayElement;
import org.terasology.rendering.gui.menus.UIConfigMenu;
import org.terasology.rendering.gui.menus.UIMainMenu;
import org.terasology.rendering.gui.menus.UISelectWorldMenu;
/**
* The class implements the main game menu.
* <p/>
* TODO: Add screen "Single Player"
* TODO: Add screen "Multiplayer"
* TODO: Add animated background
* TODO: Add screen "Generation/Load/Delete World."
*
* @author Benjamin Glatzel <benjamin.glatzel@me.com>
* @author Anton Kireev <adeon.k87@gmail.com>
* @version 0.1
*/
public class StateMainMenu extends GameState {
/* SCREENS */
private UIMainMenu _mainMenu;
private UIConfigMenu _configMenu;
private UISelectWorldMenu _selectWorldMenu;
private TerasologyEngine _gameInstance = null;
public StateMainMenu(TerasologyEngine gameEngine) {
_gameInstance = gameEngine;
}
@Override
public void initialize() {
setupMainMenu();
setupSelectWorldMenu();
setupConfigMenu();
GUIManager.getInstance().addWindow(_mainMenu, "main");
GUIManager.getInstance().addWindow(_configMenu, "config");
GUIManager.getInstance().addWindow(_selectWorldMenu, "selectWorld");
}
private void setupMainMenu() {
_mainMenu = new UIMainMenu();
_mainMenu.setVisible(true);
UIButton singlePlayerButton = (UIButton) _mainMenu.getElementById("singlePlayerButton");
UIButton configButton = (UIButton) _mainMenu.getElementById("configButton");
UIButton exitButton = (UIButton) _mainMenu.getElementById("exitButton");
singlePlayerButton.addClickListener(new IClickListener() {
@Override
public void clicked(UIDisplayElement element) {
// _mainMenu.setVisible(false);
// _selectWorldMenu.setVisible(true);
_selectWorldMenu.fillList();
GUIManager.getInstance().setFocusedWindow(_selectWorldMenu);
}
});
exitButton.addClickListener(new IClickListener() {
@Override
public void clicked(UIDisplayElement element) {
_gameInstance.stop();
}
});
configButton.addClickListener(new IClickListener() {
@Override
public void clicked(UIDisplayElement element) {
GUIManager.getInstance().setFocusedWindow(_configMenu);
}
});
}
private void setupSelectWorldMenu() {
_selectWorldMenu = new UISelectWorldMenu();
_selectWorldMenu.setVisible(false);
UIButton goToBack = (UIButton) _selectWorldMenu.getElementById("goToBackButton");
goToBack.addClickListener(new IClickListener() {
@Override
public void clicked(UIDisplayElement element) {
GUIManager.getInstance().setFocusedWindow(_mainMenu);
}
});
}
private void setupConfigMenu() {
_configMenu = new UIConfigMenu();
_configMenu.setVisible(false);
UIButton backToMainMenuButton = (UIButton) _configMenu.getElementById("backToMainMenuButton");
UIButton graphicsQualityButton = (UIButton) _configMenu.getElementById("graphicsQualityButton");
UIButton FOVButton = (UIButton) _configMenu.getElementById("fovButton");
UIButton viewingDistanceButton = (UIButton) _configMenu.getElementById("viewingDistanceButton");
backToMainMenuButton.addClickListener(new IClickListener() {
@Override
public void clicked(UIDisplayElement element) {
_mainMenu.setVisible(true);
_configMenu.setVisible(false);
}
});
graphicsQualityButton.addClickListener(new IClickListener() {
@Override
public void clicked(UIDisplayElement element) {
UIButton button = (UIButton) element;
if (button.getLabel().getText().equals("Graphics Quality: Ugly")) {
Config.getInstance().setGraphicsQuality(1);
button.getLabel().setText("Graphics Quality: Nice");
} else if (button.getLabel().getText().equals("Graphics Quality: Nice")) {
Config.getInstance().setGraphicsQuality(2);
button.getLabel().setText("Graphics Quality: Epic");
} else if (button.getLabel().getText().equals("Graphics Quality: Epic")) {
Config.getInstance().setGraphicsQuality(0);
button.getLabel().setText("Graphics Quality: Ugly");
}
}
});
FOVButton.addClickListener(new IClickListener() {
@Override
public void clicked(UIDisplayElement element) {
UIButton button = (UIButton) element;
// TODO: Replace with a slider later on
if (button.getLabel().getText().equals("Field of View: 75")) {
button.getLabel().setText("Field of View: 80");
Config.getInstance().setFov(80);
} else if (button.getLabel().getText().equals("Field of View: 80")) {
button.getLabel().setText("Field of View: 85");
Config.getInstance().setFov(85);
} else if (button.getLabel().getText().equals("Field of View: 85")) {
button.getLabel().setText("Field of View: 90");
Config.getInstance().setFov(90);
} else if (button.getLabel().getText().equals("Field of View: 90")) {
button.getLabel().setText("Field of View: 95");
Config.getInstance().setFov(95);
} else if (button.getLabel().getText().equals("Field of View: 95")) {
button.getLabel().setText("Field of View: 100");
Config.getInstance().setFov(100);
} else if (button.getLabel().getText().equals("Field of View: 100")) {
button.getLabel().setText("Field of View: 105");
Config.getInstance().setFov(105);
} else if (button.getLabel().getText().equals("Field of View: 105")) {
button.getLabel().setText("Field of View: 110");
Config.getInstance().setFov(110);
} else if (button.getLabel().getText().equals("Field of View: 110")) {
button.getLabel().setText("Field of View: 115");
Config.getInstance().setFov(115);
} else if (button.getLabel().getText().equals("Field of View: 115")) {
button.getLabel().setText("Field of View: 120");
Config.getInstance().setFov(120);
} else if (button.getLabel().getText().equals("Field of View: 120")) {
button.getLabel().setText("Field of View: 75");
Config.getInstance().setFov(75);
}
}
});
viewingDistanceButton.addClickListener(new IClickListener() {
@Override
public void clicked(UIDisplayElement element) {
UIButton button = (UIButton) element;
if (button.getLabel().getText().equals("Viewing Distance: Near")) {
button.getLabel().setText("Viewing Distance: Moderate");
Config.getInstance().setViewingDistanceById(1);
} else if (button.getLabel().getText().equals("Viewing Distance: Moderate")) {
button.getLabel().setText("Viewing Distance: Far");
Config.getInstance().setViewingDistanceById(2);
} else if (button.getLabel().getText().equals("Viewing Distance: Far")) {
Config.getInstance().setViewingDistanceById(3);
button.getLabel().setText("Viewing Distance: Ultra");
} else if (button.getLabel().getText().equals("Viewing Distance: Ultra")) {
Config.getInstance().setViewingDistanceById(0);
button.getLabel().setText("Viewing Distance: Near");
}
}
});
}
@Override
public void loadResources() {
Mouse.setGrabbed(false);
playBackgroundMusic();
GUIManager.getInstance().getWindowById("main").setVisible(true);
GUIManager.getInstance().getWindowById("config").setVisible(false);
GUIManager.getInstance().getWindowById("selectWorld").setVisible(false);
GUIManager.getInstance().getWindowById("generate_world").setVisible(false);
GUIManager.getInstance().setFocusedWindow("main");
UIButton graphicsQualityButton = (UIButton) _configMenu.getElementById("graphicsQualityButton");
UIButton FOVButton = (UIButton) _configMenu.getElementById("fovButton");
UIButton viewingDistanceButton = (UIButton) _configMenu.getElementById("viewingDistanceButton");
if (Config.getInstance().getActiveViewingDistanceId() == 3)
viewingDistanceButton.getLabel().setText("Viewing Distance: Ultra");
else if (Config.getInstance().getActiveViewingDistanceId() == 1)
viewingDistanceButton.getLabel().setText("Viewing Distance: Moderate");
else if (Config.getInstance().getActiveViewingDistanceId() == 2)
viewingDistanceButton.getLabel().setText("Viewing Distance: Far");
else
viewingDistanceButton.getLabel().setText("Viewing Distance: Near");
if (Config.getInstance().getGraphicsQuality() == 1)
graphicsQualityButton.getLabel().setText("Graphics Quality: Nice");
else if (Config.getInstance().getGraphicsQuality() == 2)
graphicsQualityButton.getLabel().setText("Graphics Quality: Epic");
else
graphicsQualityButton.getLabel().setText("Graphics Quality: Ugly");
// TODO: Replace with a slider later on
FOVButton.getLabel().setText("Field of View: " + (int) Config.getInstance().getFov());
}
@Override
public void unloadResources() {
stopBackgroundMusic();
GUIManager.getInstance().closeWindows();
}
private void playBackgroundMusic() {
AudioManager.playMusic("engine:resurface");
}
private void stopBackgroundMusic() {
AudioManager.getInstance().stopAllSounds();
}
public void handleInput(float delta) {
processKeyboardInput();
processMouseInput();
}
@Override
public void onRender(float delta) {
updateUserInterface();
// Render
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
renderUserInterface();
handleInput(delta);
}
public void renderUserInterface() {
GUIManager.getInstance().render();
}
private void updateUserInterface() {
GUIManager.getInstance().update();
}
/**
* Process keyboard input - first look for "system" like events, then otherwise pass to the Player object
*/
private void processKeyboardInput() {
while (Keyboard.next()) {
if (Keyboard.getEventKeyState()) {
int key = Keyboard.getEventKey();
if (!Keyboard.isRepeatEvent()) {
if (key == Keyboard.KEY_ESCAPE && !Keyboard.isRepeatEvent() && Keyboard.getEventKeyState()) {
_gameInstance.stop();
return;
}
}
GUIManager.getInstance().processKeyboardInput(key);
}
}
}
/*
* Process mouse input - nothing system-y, so just passing it to the Player class
*/
private void processMouseInput() {
while (Mouse.next()) {
int button = Mouse.getEventButton();
int wheelMoved = Mouse.getEventDWheel();
GUIManager.getInstance().processMouseInput(button, Mouse.getEventButtonState(), wheelMoved);
}
}
}