/*
* AQP Project
* http://http://code.google.com/p/aqp-project/
* Alexandre Gomez - Clément Troesch - Fabrice Latterner
*/
package com.aqpproject.worldmodel.game.state;
import com.aqpproject.game.Singleton;
import com.aqpproject.sound.SoundController;
import com.aqpproject.tools.Vector2D;
import com.aqpproject.worldmodel.Control;
import com.aqpproject.worldmodel.GameState;
import com.aqpproject.worldmodel.game.entity.WEAlphaTextButton;
import com.aqpproject.worldmodel.game.entity.WEMenu;
import com.aqpproject.worldmodel.game.entity.WorldEntity;
import com.aqpproject.worldmodel.game.entity.WorldTextEntity;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import java.awt.Rectangle;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
*
* @author Alexandre
*/
public class HostMenuGameState implements GameState {
/**
* Constructor
*/
public HostMenuGameState() {
m_initialized = false;
}
/**
* @see WorldModel#initialize()
*/
@Override
public void initialize() {
if (!m_initialized) { //If not initialized
m_worldEntities = new HashMap<>();
m_worldTextEntities = new HashMap<>();
m_modesList = new ArrayList<>();
m_mapDisplayList = new HashMap<>();
m_spritesNameList = new HashMap<>();
m_modesList.add("Course");
m_modesList.add("Arena");
m_selectedMap = Singleton.getOptionsController().getMap();
try {
sc = Singleton.getAudioController();
Singleton.getVisualisation().loadSprites("config/mainmenu.xml");
loadMapList("config/mapselection.xml");
loadCarList("config/carselection.xml");
} catch (ParserConfigurationException | SAXException | IOException ex) {
Logger.getLogger(HostMenuGameState.class.getName()).log(Level.SEVERE, null, ex);
}
m_position = 0;
m_lastInput = 0;
m_waitTime = 200;
m_isServerUp = false;
m_resolution = Singleton.getVisualisation().getResolution();
m_minX = 1420 - m_resolution.x / 2;
m_minY = 1750 - m_resolution.y / 2;
m_menuX = 975 - m_minX;
m_menuWidth = Singleton.getVisualisation().getSpriteSize("bandeauY").x;
m_gameMode = Singleton.getOptionsController().getGameMode();
m_previousGameMode = -1;
m_playersNum = Math.max(Singleton.getOptionsController().getPlayersNum(), 1);
m_previousPlayersNum = -1;
m_pseudo = Singleton.getOptionsController().getPseudo();
m_keyboardState = new HashMap();
for (Control c : Singleton.getInput().getKeyboardState().keySet()) {
m_keyboardState.put(c, false);
}
createEntities();
//Initialisation
m_initialized = true;
}
}
/**
* @see WorldModel#destroy()
*/
@Override
public void destroy() {
//Entities
for (WorldEntity e : m_worldEntities.values()) {
e.destroy();
}
for (WorldTextEntity e : m_worldTextEntities.values()) {
e.destroy();
}
}
/**
* Create the entities
*/
private void createEntities() {
Singleton.getVisualisation().createMap(Singleton.getWorldModel().getMaps().get("MapMenu").getPath());
Singleton.getVisualisation().setCameraPosition(1420, 1750);
m_worldEntities.put("bandeauY1", new WEMenu("bandeauY1", "bandeauY", new Vector2D(975, 1000), 0, 1));
float textWidth = calcWidth("Create game", "ar30whi");
m_worldTextEntities.put("Title", new WEAlphaTextButton("Title", m_menuX + m_menuWidth / 2 - textWidth / 2, m_resolution.y - 50, "Create game", "ar30whi"));
m_worldTextEntities.put("Mode", new WEAlphaTextButton("Mode", m_menuX + 50, m_resolution.y - 150, "Mode", "ar30whi"));
m_worldTextEntities.put("ModeName", new WEAlphaTextButton("ModeName", m_menuX + m_menuWidth - 300, m_resolution.y - 150, m_modesList.get(m_gameMode), "ar30whi"));
m_worldTextEntities.put("Map", new WEAlphaTextButton("Map", m_menuX + 50, m_resolution.y - 200, "Map", "ar30whi"));
m_worldTextEntities.put("MapName", new WEAlphaTextButton("MapName", m_menuX + m_menuWidth - 300, m_resolution.y - 200, m_mapDisplayList.get(m_selectedMap), "ar30whi"));
m_worldTextEntities.put("Players", new WEAlphaTextButton("Players", m_menuX + 50, m_resolution.y - 250, "Players #", "ar30whi"));
m_worldTextEntities.put("PlayersNum", new WEAlphaTextButton("PlayersNum", m_menuX + m_menuWidth - 300, m_resolution.y - 250, String.valueOf(m_playersNum), "ar30whi"));
m_worldTextEntities.put("Name", new WEAlphaTextButton("Name", m_menuX + 50, m_resolution.y - 350, "Name", "ar30whi"));
m_worldTextEntities.put("Pseudo", new WEAlphaTextButton("Pseudo", m_menuX + m_menuWidth - 300, m_resolution.y - 350, "Pseudo", "ar30whi"));
m_worldTextEntities.put("Car", new WEAlphaTextButton("Car", m_menuX + 50, m_resolution.y - 400, "Car", "ar30whi"));
m_worldTextEntities.put("Ok", new WEAlphaTextButton("Ok", m_menuX + 50, m_resolution.y - 500, "Create", "ar30whi"));
m_worldTextEntities.put("Cancel", new WEAlphaTextButton("Cancel", m_menuX + 50, m_resolution.y - 600, "Cancel", "ar30whi"));
//Initialisation
((WEAlphaTextButton) m_worldTextEntities.get("Mode")).m_setMInitialize(true);
((WEAlphaTextButton) m_worldTextEntities.get("Mode")).setSelect(true);
((WEAlphaTextButton) m_worldTextEntities.get("ModeName")).m_setMInitialize(true);
((WEAlphaTextButton) m_worldTextEntities.get("ModeName")).setSelect(true);
((WEAlphaTextButton) m_worldTextEntities.get("Map")).m_setMInitialize(true);
((WEAlphaTextButton) m_worldTextEntities.get("MapName")).m_setMInitialize(true);
((WEAlphaTextButton) m_worldTextEntities.get("Players")).m_setMInitialize(true);
((WEAlphaTextButton) m_worldTextEntities.get("PlayersNum")).m_setMInitialize(true);
((WEAlphaTextButton) m_worldTextEntities.get("Name")).m_setMInitialize(true);
((WEAlphaTextButton) m_worldTextEntities.get("Pseudo")).m_setMInitialize(true);
((WEAlphaTextButton) m_worldTextEntities.get("Car")).m_setMInitialize(true);
((WEAlphaTextButton) m_worldTextEntities.get("Ok")).m_setMInitialize(true);
((WEAlphaTextButton) m_worldTextEntities.get("Cancel")).m_setMInitialize(true);
//Car miniature
m_worldEntities.put("car_mini", new WEMenu("car_mini", m_spritesNameList.get(Singleton.getOptionsController().getCar()), new Vector2D(m_minX + m_menuX + m_menuWidth - 300, m_resolution.y + m_minY - 428), 0, 1));
//Arrows
m_worldEntities.put("arrow_mode", new WEMenu("arrow_mode", "arrow", new Vector2D(m_minX + m_menuX + 10, m_resolution.y + m_minY - 178), 0, 1));
m_worldEntities.put("arrow_map", new WEMenu("arrow_map", "arrow", new Vector2D(m_minX + m_menuX + 10, m_resolution.y + m_minY - 228), 0, 2));
m_worldEntities.put("arrow_players", new WEMenu("arrow_players", "arrow", new Vector2D(m_minX + m_menuX + 10, m_resolution.y + m_minY - 278), 0, 2));
m_worldEntities.put("arrow_name", new WEMenu("arrow_name", "arrow", new Vector2D(m_minX + m_menuX + 10, m_resolution.y + m_minY - 378), 0, 2));
m_worldEntities.put("arrow_car", new WEMenu("arrow_car", "arrow", new Vector2D(m_minX + m_menuX + 10, m_resolution.y + m_minY - 428), 0, 2));
m_worldEntities.put("arrow_ok", new WEMenu("arrow_ok", "arrow", new Vector2D(m_minX + m_menuX + 10, m_resolution.y + m_minY - 528), 0, 2));
m_worldEntities.put("arrow_cancel", new WEMenu("arrow_cancel", "arrow", new Vector2D(m_minX + m_menuX + 10, m_resolution.y + m_minY - 628), 0, 2));
}
/**
* @see WorldModel#update()
*/
@Override
public void update() {
if (m_initialized) {
((WEAlphaTextButton) m_worldTextEntities.get("Mode")).setSelect(m_position == 0 ? true : false);
((WEAlphaTextButton) m_worldTextEntities.get("ModeName")).setSelect(m_position == 0 ? true : false);
((WEAlphaTextButton) m_worldTextEntities.get("Map")).setSelect(m_position == 1 ? true : false);
((WEAlphaTextButton) m_worldTextEntities.get("MapName")).setSelect(m_position == 1 ? true : false);
((WEAlphaTextButton) m_worldTextEntities.get("Players")).setSelect(m_position == 2 ? true : false);
((WEAlphaTextButton) m_worldTextEntities.get("PlayersNum")).setSelect(m_position == 2 ? true : false);
((WEAlphaTextButton) m_worldTextEntities.get("Name")).setSelect(m_position == 3 ? true : false);
((WEAlphaTextButton) m_worldTextEntities.get("Pseudo")).setSelect(m_position == 3 ? true : false);
((WEAlphaTextButton) m_worldTextEntities.get("Car")).setSelect(m_position == 4 ? true : false);
((WEAlphaTextButton) m_worldTextEntities.get("Ok")).setSelect(m_position == 5 ? true : false);
((WEAlphaTextButton) m_worldTextEntities.get("Cancel")).setSelect(m_position == 6 ? true : false);
if (!m_isServerUp) {
((WEAlphaTextButton) m_worldTextEntities.get("Ok")).updateText("Create");
} else {
((WEAlphaTextButton) m_worldTextEntities.get("Ok")).updateText("Start !");
}
Singleton.getVisualisation().updateActorFrame("arrow_mode", m_position == 0 ? 1 : 2);
Singleton.getVisualisation().updateActorFrame("arrow_map", m_position == 1 ? 1 : 2);
Singleton.getVisualisation().updateActorFrame("arrow_players", m_position == 2 ? 1 : 2);
Singleton.getVisualisation().updateActorFrame("arrow_name", m_position == 3 ? 1 : 2);
Singleton.getVisualisation().updateActorFrame("arrow_car", m_position == 4 ? 1 : 2);
Singleton.getVisualisation().updateActorFrame("arrow_ok", m_position == 5 ? 1 : 2);
Singleton.getVisualisation().updateActorFrame("arrow_cancel", m_position == 6 ? 1 : 2);
//Update of keyboard state
HashMap<Control, Boolean> kbState = Singleton.getInput().getKeyboardState();
for (Map.Entry e : kbState.entrySet()) {
if (!(boolean) e.getValue()) {
m_keyboardState.put((Control) e.getKey(), false);
}
}
((WEAlphaTextButton) m_worldTextEntities.get("Pseudo")).updateText(m_pseudo);
if (m_previousPlayersNum != m_playersNum) {
((WEAlphaTextButton) m_worldTextEntities.get("PlayersNum")).updateText(String.valueOf(m_playersNum));
m_previousPlayersNum = m_playersNum;
}
if (m_previousGameMode != m_gameMode) {
((WEAlphaTextButton) m_worldTextEntities.get("ModeName")).updateText(m_modesList.get(m_gameMode));
m_previousGameMode = m_gameMode;
}
long time = Singleton.getWorldModel().getTime();
for (WorldTextEntity e : m_worldTextEntities.values()) {
e.update(time);
}
}
}
/**
* @see WorldModel#controlEntity(java.lang.String,
* com.aqpproject.worldmodel.Control)
*/
@Override
public void control(Control control) {
if (control == Control.UP && m_lastInput + m_waitTime < Singleton.getWorldModel().getTime()) {
m_position--;
sc.playSound("ding", false);
if (m_position < 0) {
m_position = 6;
}
m_lastInput = Singleton.getWorldModel().getTime();
}
if (control == Control.DOWN && m_lastInput + m_waitTime < Singleton.getWorldModel().getTime()) {
m_position++;
sc.playSound("ding", false);
if (m_position > 6) {
m_position = 0;
}
m_lastInput = Singleton.getWorldModel().getTime();
}
if (m_position == 3) {
if (control.compareTo(Control.A) >= 0 && control.compareTo(Control.Z) <= 0) {
if ((!m_keyboardState.get(control) || m_lastInput + m_waitTime / 2 < Singleton.getWorldModel().getTime()) && m_pseudo.length() < 9) {
m_pseudo += control.toString();
m_keyboardState.put(control, true);
m_lastInput = Singleton.getWorldModel().getTime();
}
}
if (control == Control.RETURN) {
if ((!m_keyboardState.get(Control.RETURN) || m_lastInput + m_waitTime / 2 < Singleton.getWorldModel().getTime()) && m_pseudo.length() > 0) {
m_pseudo = m_pseudo.substring(0, m_pseudo.length() - 1);
m_keyboardState.put(control, true);
m_lastInput = Singleton.getWorldModel().getTime();
}
}
}
if (control == Control.LEFT && m_lastInput + m_waitTime < Singleton.getWorldModel().getTime()) {
switch (m_position) {
case 0:
m_previousGameMode = m_gameMode;
m_gameMode++;
if (m_gameMode >= m_modesList.size()) {
m_gameMode = 0;
}
break;
case 2:
m_previousPlayersNum = m_playersNum;
m_playersNum--;
if (m_playersNum < 1) {
m_playersNum = 8;
}
break;
}
m_lastInput = Singleton.getWorldModel().getTime();
}
if (control == Control.RIGHT && m_lastInput + m_waitTime < Singleton.getWorldModel().getTime()) {
switch (m_position) {
case 0:
m_previousGameMode = m_gameMode;
m_gameMode--;
if (m_gameMode < 0) {
m_gameMode = m_modesList.size() - 1;
}
break;
case 2:
m_previousPlayersNum = m_playersNum;
m_playersNum++;
if (m_playersNum > 8) {
m_playersNum = 1;
}
break;
}
m_lastInput = Singleton.getWorldModel().getTime();
}
if (control == Control.ENTER && m_lastInput + m_waitTime < Singleton.getWorldModel().getTime()) {
switch (m_position) {
case 1:
//Save current config
Singleton.getOptionsController().setPlayersNum(m_playersNum);
Singleton.getOptionsController().setGameMode(m_gameMode);
Singleton.getOptionsController().setPseudo(m_pseudo);
Singleton.getWorldModel().setNextState(new MapSelectionGameState());
//Map selection
break;
case 4:
//Car selection
Singleton.getOptionsController().setPlayersNum(m_playersNum);
Singleton.getOptionsController().setGameMode(m_gameMode);
Singleton.getOptionsController().setPseudo(m_pseudo);
Singleton.getWorldModel().setNextState(new CarSelectionGameState());
break;
case 5:
//Create server / launch game
if (!m_isServerUp) {
Singleton.getNetwork().createServer();
m_isServerUp = true;
} else {
//launch game
Singleton.getOptionsController().setPseudo(m_pseudo);
Singleton.getNetwork().setMustStart(true);
}
break;
case 6:
//Cancel
if (!m_isServerUp) {
Singleton.getOptionsController().setPlayersNum(1);
Singleton.getOptionsController().setMapToDefault();
Singleton.getOptionsController().setCarToDefault();
Singleton.getWorldModel().setNextState(new MultiplayersMenuGameState());
} else {
Singleton.getNetwork().closeServer();
m_isServerUp = false;
}
break;
}
m_lastInput = Singleton.getWorldModel().getTime();
}
if (control == Control.ESCAPE) {
Singleton.getWorldModel().setNextState(new MultiplayersMenuGameState());
}
}
/**
* @see WorldModel#updateActorTransform()
*/
@Override
public void updateActorTransform() {
//Camera
//Singleton.getVisualisation().setCameraPosition(0, 0);
//Entities
/*
* for (WorldEntity e : m_worldEntities.values()) {
* e.updateActorTransform(); } /*
*/
}
/**
* @see WorldModel#saveEntitiesState()
*/
@Override
public void saveEntitiesState() {
/*
* for (WorldEntity e : m_worldEntities.values()) { e.saveTransform(); }
*
*/
}
@Override
public boolean isInitialized() {
return m_initialized;
}
@Override
public void startContact(String firstEntity, String secondEntity, Vector2D normal, Vector2D point) {
}
@Override
public void stopContact(String firstEntity, String secondEntity, Vector2D normal, Vector2D point) {
}
public void addTextEntity(String name, WorldTextEntity entity) {
m_worldTextEntities.put(name, entity);
}
private void loadMapList(String path) throws ParserConfigurationException, SAXException, IOException {
if (path != null) {
File file = new File(path);
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(file);
doc.getDocumentElement().normalize();
Element root = doc.getDocumentElement();
NodeList children = root.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node n = children.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE) {
Element e = (Element) n;
m_mapDisplayList.put(e.getAttribute("correspondingMap"), e.getAttribute("displayName"));
}
}
}
}
private void loadCarList(String path) throws ParserConfigurationException, SAXException, IOException {
if (path != null) {
File file = new File(path);
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(file);
doc.getDocumentElement().normalize();
Element root = doc.getDocumentElement();
NodeList children = root.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node n = children.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE) {
Element e = (Element) n;
String name = e.getAttribute("name");
String spritePath = e.getAttribute("path");
String spriteName = e.getAttribute("spriteName");
int x = Integer.parseInt(e.getAttribute("x"));
int y = Integer.parseInt(e.getAttribute("y"));
int width = Integer.parseInt(e.getAttribute("width"));
int height = Integer.parseInt(e.getAttribute("height"));
int frame = Integer.parseInt(e.getAttribute("frame"));
m_spritesNameList.put(name, spriteName);
Singleton.getVisualisation().createSprite(spriteName, spritePath, new Rectangle(x, y, width, height), frame);
}
}
}
}
public float calcWidth(String s, String font) {
BitmapFont myFont = new BitmapFont(Gdx.files.internal("data/font/" + font + ".fnt"), Gdx.files.internal("data/font/" + font + ".png"), false); //TODO: change the font/size
float res = myFont.getBounds(s).width;
return res;
}
@Override
public HashMap<String, WorldEntity> getWorldEntities() {
return m_worldEntities;
}
@Override
public void control(Control control, String entity) {
throw new UnsupportedOperationException("Not supported yet.");
}
/////////////////////////////////////////
// Attributes
/////////////////////////////////////////
protected HashMap<String, WorldEntity> m_worldEntities;
protected HashMap<String, WorldTextEntity> m_worldTextEntities;
protected HashMap<String, String> m_mapDisplayList;
protected HashMap<String, String> m_spritesNameList;
protected ArrayList<String> m_modesList;
protected boolean m_initialized;
protected int m_position;
protected int m_gameMode;
protected int m_previousGameMode;
protected int m_playersNum;
protected int m_previousPlayersNum;
protected String m_selectedMap;
protected long m_lastInput;
protected long m_waitTime;
protected SoundController sc;
protected float m_minX;
protected float m_minY;
protected float m_menuX;
protected float m_menuWidth;
protected Vector2D m_resolution;
protected boolean m_isServerUp;
protected HashMap<Control, Boolean> m_keyboardState;
protected String m_pseudo;
}