/*
* 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.WorldModelGame;
import com.aqpproject.worldmodel.game.entity.*;
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.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.text.TextAction;
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, Fabrice
*/
public class MapSelectionGameState implements GameState {
/**
* Constructor
*/
public MapSelectionGameState() {
m_initialized = false;
//Keyboard state
HashMap keyboardState = Singleton.getInput().getKeyboardState();
if ((boolean) keyboardState.get(Control.ESCAPE)) {
m_escapeReady = false;
} else {
m_escapeReady = true;
}
}
/**
* @see WorldModel#initialize()
*/
@Override
public void initialize() {
if (!m_initialized) { //If not initialized
m_worldEntities = new HashMap<>();
m_worldTextEntities = new HashMap<>();
m_mapsList = new ArrayList();
m_difficultyList = new HashMap<>();
m_spritesNameList = new HashMap<>();
m_displayNameList = new HashMap<>();
m_correspondingMapList = new HashMap<>();
m_descriptionList = new HashMap<>();
m_map_count = 0;
try {
sc = Singleton.getAudioController();
Singleton.getVisualisation().loadSprites("config/mainmenu.xml");
loadMapList("config/mapselection.xml");
} catch (Exception ex) {
Logger.getLogger(WorldModelGame.class.getName()).log(Level.SEVERE, null, ex);
}
m_currentSelectedMap = getMap();
m_previousSelectedMap = -1;
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_decX = 1420;
m_decY = 1750;
m_menuWidth = Singleton.getVisualisation().getSpriteSize("bandeauY").x;
m_lastInput = 0;
m_waitTime = 125;
m_position = 0;
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));
// m_worldEntities.put("bandeauY2", new WEMenu("bandeauY2", "bandeauY", new Vector2D(1385, 1000), 0, 1));
float textWidth = calcWidth("Map selection", "ar30whi");
m_worldTextEntities.put("Title", new WEAlphaTextButton("Title", m_menuX + m_menuWidth / 2 - textWidth / 2, Singleton.getVisualisation().getResolution().y - 50, "Map selection", "ar30whi"));
//Map
String current_map = m_mapsList.get(m_currentSelectedMap);
m_worldTextEntities.put("Map", new WEAlphaTextButton("Map", m_menuX + 50, m_resolution.y - 150, m_displayNameList.get(current_map), "ar30whi"));
((WEAlphaTextButton) m_worldTextEntities.get("Map")).m_setMInitialize(true);
((WEAlphaTextButton) m_worldTextEntities.get("Map")).setSelect(true);
//Miniature
m_worldEntities.put("preview", new WEMenu("preview", m_spritesNameList.get(current_map), new Vector2D(m_minX + m_menuX + 50, m_minY + m_resolution.y - 400), 0, 1));
//Description
m_worldTextEntities.put("Description", new WEAlphaTextButton("Description", m_menuX + 50, m_resolution.y - 420, m_descriptionList.get(current_map), "ar14whi"));
//((WEAlphaTextButton)m_worldTextEntities.get("Description")).m_setMInitialize(true);
//Difficulty
for (int i = 0; i < 5; i++) {
m_worldEntities.put("dif" + i, new WEMenu("dif" + i, "bug", new Vector2D(m_minX + m_menuX + m_menuWidth - 32 * 5 - 10 + 32 * i, m_resolution.y + m_minY - 178), 0, 2));
}
//Select; Cancel
m_worldTextEntities.put("Select", new WEAlphaTextButton("Select", m_menuX + 50, m_resolution.y - 500, "Select", "ar30whi"));
((WEAlphaTextButton) m_worldTextEntities.get("Select")).m_setMInitialize(true);
m_worldTextEntities.put("Cancel", new WEAlphaTextButton("Cancel", m_menuX + 50, m_resolution.y - 550, "Cancel", "ar30whi"));
((WEAlphaTextButton) m_worldTextEntities.get("Cancel")).m_setMInitialize(true);
//Arrows
m_worldEntities.put("arrow_map", new WEMenu("arrow_map", "arrow", new Vector2D(m_minX + m_menuX + 10, m_resolution.y + m_minY - 178), 0, 1));
m_worldEntities.put("arrow_select", new WEMenu("arrow_select", "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 - 578), 0, 2));
}
/**
* @see WorldModel#update()
*/
@Override
public void update() {
if (m_initialized) {
long time = Singleton.getWorldModel().getTime();
//Keyboard state
HashMap keyboardState = Singleton.getInput().getKeyboardState();
if (!(boolean) keyboardState.get(Control.ESCAPE)) {
m_escapeReady = true;
}
((WEAlphaTextButton) m_worldTextEntities.get("Map")).setSelect(m_position == 0 ? true : false);
((WEAlphaTextButton) m_worldTextEntities.get("Select")).setSelect(m_position == 1 ? true : false);
((WEAlphaTextButton) m_worldTextEntities.get("Cancel")).setSelect(m_position == 2 ? true : false);
Singleton.getVisualisation().updateActorFrame("arrow_map", m_position == 0 ? 1 : 2);
Singleton.getVisualisation().updateActorFrame("arrow_select", m_position == 1 ? 1 : 2);
Singleton.getVisualisation().updateActorFrame("arrow_cancel", m_position == 2 ? 1 : 2);
for (WorldTextEntity e : m_worldTextEntities.values()) {
e.update(time);
}
if (m_currentSelectedMap != m_previousSelectedMap) {
updateDisplayName();
updateMiniature();
updateDifficulty();
updateDescription();
m_previousSelectedMap = m_currentSelectedMap;
}
}
}
/**
* @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 = 2;
}
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 > 2) {
m_position = 0;
}
m_lastInput = Singleton.getWorldModel().getTime();
}
if (control == Control.RIGHT && m_position == 0 && m_lastInput + m_waitTime < Singleton.getWorldModel().getTime()) {
m_previousSelectedMap = m_currentSelectedMap;
m_currentSelectedMap++;
if (m_currentSelectedMap >= m_map_count) {
m_currentSelectedMap = 0;
}
m_lastInput = Singleton.getWorldModel().getTime();
}
if (control == Control.LEFT && m_position == 0 && m_lastInput + m_waitTime < Singleton.getWorldModel().getTime()) {
m_previousSelectedMap = m_currentSelectedMap;
m_currentSelectedMap--;
if (m_currentSelectedMap < 0) {
m_currentSelectedMap = m_map_count - 1;
}
m_lastInput = Singleton.getWorldModel().getTime();
}
if (control == Control.ENTER && m_lastInput + m_waitTime < Singleton.getWorldModel().getTime()) {
switch (m_position) {
case 1:
String current_map = m_mapsList.get(m_currentSelectedMap);
Singleton.getOptionsController().setMap(m_correspondingMapList.get(current_map));
if (Singleton.getOptionsController().getMode().equals("MONO")) {
Singleton.getWorldModel().setNextState(new CarSelectionGameState());
}
if (Singleton.getOptionsController().getMode().equals("MULTI")) {
for (int i = 0; i < 8; i++) {
Singleton.getNetwork().setSendMessage(i, true);
}
Singleton.getWorldModel().setNextState(new HostMenuGameState());
}
break;
case 2:
if (Singleton.getOptionsController().getMode().equals("MONO")) {
Singleton.getOptionsController().setMapToDefault();
Singleton.getOptionsController().setCarToDefault();
Singleton.getWorldModel().setNextState(new MainMenuGameState());
}
if (Singleton.getOptionsController().getMode().equals("MULTI")) {
Singleton.getWorldModel().setNextState(new HostMenuGameState());
}
break;
}
}
if (control == Control.ESCAPE && m_escapeReady) {
if (Singleton.getOptionsController().getMode().equals("MONO")) {
Singleton.getOptionsController().setMapToDefault();
Singleton.getOptionsController().setCarToDefault();
Singleton.getWorldModel().setNextState(new MainMenuGameState());
}
if (Singleton.getOptionsController().getMode().equals("MULTI")) {
Singleton.getWorldModel().setNextState(new HostMenuGameState());
}
}
}
/**
* @see WorldModel#updateActorTransform()
*/
@Override
public void updateActorTransform() {
}
public void updateDisplayName() {
String current_map = m_mapsList.get(m_currentSelectedMap);
m_worldTextEntities.get("Map").updateText(m_displayNameList.get(current_map));
}
public void updateMiniature() {
String current_map = m_mapsList.get(m_currentSelectedMap);
m_worldEntities.get("preview").destroy();
m_worldEntities.put("preview", new WEMenu("preview", m_spritesNameList.get(current_map), new Vector2D(m_minX + m_menuX + 50, m_minY + m_resolution.y - 400), 0, 1));
}
public void updateDifficulty() {
String current_map = m_mapsList.get(m_currentSelectedMap);
int difficulty = m_difficultyList.get(current_map);
for (int i = 0; i < 5; i++) {
if (difficulty > i) {
Singleton.getVisualisation().updateActorFrame("dif" + i, 1);
} else {
Singleton.getVisualisation().updateActorFrame("dif" + i, 2);
}
}
}
public void updateDescription() {
String current_map = m_mapsList.get(m_currentSelectedMap);
m_worldTextEntities.get("Description").updateText(m_descriptionList.get(current_map));
}
/**
* @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_map_count++;
String name = e.getAttribute("name");
m_mapsList.add(name);
m_spritesNameList.put(name, e.getAttribute("spriteName"));
m_correspondingMapList.put(name, e.getAttribute("correspondingMap"));
m_displayNameList.put(name, e.getAttribute("displayName"));
m_difficultyList.put(name, Integer.parseInt(e.getAttribute("difficulty")));
String desc = e.getAttribute("description");
desc = desc.replace("\\n", "\n");
m_descriptionList.put(name, desc);
}
}
}
}
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;
}
private int getMap() {
String current_map = Singleton.getOptionsController().getMap();
for (Entry e : m_correspondingMapList.entrySet()) {
if (((String) e.getValue()).equals(current_map)) {
return m_mapsList.indexOf(e.getKey());
}
}
return 0;
}
@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 ArrayList<String> m_mapsList;
protected HashMap<String, Integer> m_difficultyList;
protected HashMap<String, String> m_spritesNameList;
protected HashMap<String, String> m_displayNameList;
protected HashMap<String, String> m_correspondingMapList;
protected HashMap<String, String> m_descriptionList;
protected boolean m_initialized;
protected int m_carte;
protected int m_position;
protected long m_lastInput;
protected long m_waitTime;
protected int m_map_count;
protected int m_currentSelectedMap;
protected int m_previousSelectedMap;
protected SoundController sc;
protected Vector2D m_resolution;
protected float m_minX;
protected float m_minY;
protected float m_menuX;
protected float m_menuWidth;
protected int m_decY;
protected int m_decX;
protected boolean m_escapeReady;
}