package org.newdawn.slick;

import org.newdawn.slick.lwjgl.LwjglLoader;

/**
 * A basic implementation of a game to take out the boring bits
 * <p/>
 *
 * @author kevin
 */
public abstract class BasicGame implements Game, InputListener {

    static {
        LwjglLoader.loadOSSpecificFiles();
    }

    /**
     * The maximum number of controllers supported by the basic game
     */
    private static final int MAX_CONTROLLERS = 20;

    /**
     * The maximum number of controller buttons supported by the basic game
     */
    private static final int MAX_CONTROLLER_BUTTONS = 100;

    /**
     * The title of the game
     */
    private String title;

    /**
     * The state of the left control
     */
    protected boolean[] controllerLeft = new boolean[MAX_CONTROLLERS];

    /**
     * The state of the right control
     */
    protected boolean[] controllerRight = new boolean[MAX_CONTROLLERS];

    /**
     * The state of the up control
     */
    protected boolean[] controllerUp = new boolean[MAX_CONTROLLERS];

    /**
     * The state of the down control
     */
    protected boolean[] controllerDown = new boolean[MAX_CONTROLLERS];

    /**
     * The state of the button controlls
     */
    protected boolean[][] controllerButton = new boolean[MAX_CONTROLLERS][MAX_CONTROLLER_BUTTONS];

    /**
     * Create a new basic game
     * <p/>
     *
     * @param title The title for the game
     */
    public BasicGame(String title) {
        this.title = title;
    }

    /**
     * @see org.newdawn.slick.InputListener#setInput(org.newdawn.slick.Input)
     */
    public void setInput(Input input) {
    }

    /**
     * @see org.newdawn.slick.Game#closeRequested()
     */
    public boolean closeRequested() {
        return true;
    }

    /**
     * @see org.newdawn.slick.Game#getTitle()
     */
    public String getTitle() {
        return title;
    }

    /**
     * @see org.newdawn.slick.Game#init(org.newdawn.slick.GameContainer)
     */
    public abstract void init(GameContainer container) throws SlickException;

    /**
     * @see org.newdawn.slick.InputListener#keyPressed(int, char)
     */
    public void keyPressed(int key, char c) {
    }

    /**
     * @see org.newdawn.slick.InputListener#keyReleased(int, char)
     */
    public void keyReleased(int key, char c) {
    }

    /**
     * @see org.newdawn.slick.InputListener#mouseMoved(int, int, int, int)
     */
    public void mouseMoved(int oldx, int oldy, int newx, int newy) {
    }

    /**
     * @see org.newdawn.slick.InputListener#mouseDragged(int, int, int, int)
     */
    public void mouseDragged(int oldx, int oldy, int newx, int newy) {
    }

    /**
     * @see org.newdawn.slick.InputListener#mouseClicked(int, int, int, int)
     */
    public void mouseClicked(int button, int x, int y, int clickCount) {
    }

    /**
     * @see org.newdawn.slick.InputListener#mousePressed(int, int, int)
     */
    public void mousePressed(int button, int x, int y) {

    }

    /**
     * @see org.newdawn.slick.InputListener#controllerButtonPressed(int, int)
     */
    public void controllerButtonPressed(int controller, int button) {
        controllerButton[controller][button] = true;
    }

    /**
     * @see org.newdawn.slick.InputListener#controllerButtonReleased(int, int)
     */
    public void controllerButtonReleased(int controller, int button) {
        controllerButton[controller][button] = false;
    }

    /**
     * @see org.newdawn.slick.InputListener#controllerDownPressed(int)
     */
    public void controllerDownPressed(int controller) {
        controllerDown[controller] = true;
    }

    /**
     * @see org.newdawn.slick.InputListener#controllerDownReleased(int)
     */
    public void controllerDownReleased(int controller) {
        controllerDown[controller] = false;
    }

    /**
     * @see org.newdawn.slick.InputListener#controllerLeftPressed(int)
     */
    public void controllerLeftPressed(int controller) {
        controllerLeft[controller] = true;
    }

    /**
     * @see org.newdawn.slick.InputListener#controllerLeftReleased(int)
     */
    public void controllerLeftReleased(int controller) {
        controllerLeft[controller] = false;
    }

    /**
     * @see org.newdawn.slick.InputListener#controllerRightPressed(int)
     */
    public void controllerRightPressed(int controller) {
        controllerRight[controller] = true;
    }

    /**
     * @see org.newdawn.slick.InputListener#controllerRightReleased(int)
     */
    public void controllerRightReleased(int controller) {
        controllerRight[controller] = false;
    }

    /**
     * @see org.newdawn.slick.InputListener#controllerUpPressed(int)
     */
    public void controllerUpPressed(int controller) {
        controllerUp[controller] = true;
    }

    /**
     * @see org.newdawn.slick.InputListener#controllerUpReleased(int)
     */
    public void controllerUpReleased(int controller) {
        controllerUp[controller] = false;
    }

    /**
     * @see org.newdawn.slick.InputListener#mouseReleased(int, int, int)
     */
    public void mouseReleased(int button, int x, int y) {
    }

    /**
     * @see org.newdawn.slick.Game#update(org.newdawn.slick.GameContainer, int)
     */
    public abstract void update(GameContainer container, int delta) throws SlickException;

    /**
     * @see org.newdawn.slick.InputListener#mouseWheelMoved(int)
     */
    public void mouseWheelMoved(int change) {
    }

    /**
     * @see org.newdawn.slick.InputListener#isAcceptingInput()
     */
    public boolean isAcceptingInput() {
        return true;
    }

    /**
     * @see org.newdawn.slick.InputListener#inputEnded()
     */
    public void inputEnded() {

    }

    /**
     * @see org.newdawn.slick.ControlledInputReciever#inputStarted()
     */
    public void inputStarted() {

    }

}
