Package com.aqpproject.worldmodel.game.state

Source Code of com.aqpproject.worldmodel.game.state.MapSelectionGameState

/*
* 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;
}
TOP

Related Classes of com.aqpproject.worldmodel.game.state.MapSelectionGameState

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.