#include "Input.h"
#include "Script.h"

#include "MakeAndPlay.h"

#include "tinyxml.h"

#include "FileSystemUtils.h"

extern scriptclass script;

void updatebuttonmappings(int bind)
{
    for (
        SDL_GameControllerButton i = SDL_CONTROLLER_BUTTON_A;
        i < SDL_CONTROLLER_BUTTON_DPAD_UP;
        i = (SDL_GameControllerButton) (i + 1)
    ) {
        if (key.isDown(i))
        {
            bool dupe = false;
            if (bind == 1)
            {
                for (size_t j = 0; j < game.controllerButton_flip.size(); j += 1)
                {
                    if (i == game.controllerButton_flip[j])
                    {
                        dupe = true;
                    }
                }
                if (!dupe)
                {
                    game.controllerButton_flip.push_back(i);
                    music.playef(11);
                }
                for (size_t j = 0; j < game.controllerButton_map.size(); j += 1)
                {
                    if (i == game.controllerButton_map[j])
                    {
                        game.controllerButton_map.erase(game.controllerButton_map.begin() + j);
                    }
                }
                for (size_t j = 0; j < game.controllerButton_esc.size(); j += 1)
                {
                    if (i == game.controllerButton_esc[j])
                    {
                        game.controllerButton_esc.erase(game.controllerButton_esc.begin() + j);
                    }
                }
            }
            if (bind == 2)
            {
                for (size_t j = 0; j < game.controllerButton_map.size(); j += 1)
                {
                    if (i == game.controllerButton_map[j])
                    {
                        dupe = true;
                    }
                }
                if (!dupe)
                {
                    game.controllerButton_map.push_back(i);
                    music.playef(11);
                }
                for (size_t j = 0; j < game.controllerButton_flip.size(); j += 1)
                {
                    if (i == game.controllerButton_flip[j])
                    {
                        game.controllerButton_flip.erase(game.controllerButton_flip.begin() + j);
                    }
                }
                for (size_t j = 0; j < game.controllerButton_esc.size(); j += 1)
                {
                    if (i == game.controllerButton_esc[j])
                    {
                        game.controllerButton_esc.erase(game.controllerButton_esc.begin() + j);
                    }
                }
            }
            if (bind == 3)
            {
                for (size_t j = 0; j < game.controllerButton_esc.size(); j += 1)
                {
                    if (i == game.controllerButton_esc[j])
                    {
                        dupe = true;
                    }
                }
                if (!dupe)
                {
                    game.controllerButton_esc.push_back(i);
                    music.playef(11);
                }
                for (size_t j = 0; j < game.controllerButton_flip.size(); j += 1)
                {
                    if (i == game.controllerButton_flip[j])
                    {
                        game.controllerButton_flip.erase(game.controllerButton_flip.begin() + j);
                    }
                }
                for (size_t j = 0; j < game.controllerButton_map.size(); j += 1)
                {
                    if (i == game.controllerButton_map[j])
                    {
                        game.controllerButton_map.erase(game.controllerButton_map.begin() + j);
                    }
                }
            }
        }
    }
}

void titleinput()
{
    //game.mx = (mouseX / 4);
    //game.my = (mouseY / 4);

    //TODO bit wasteful doing this every poll
    key.setSensitivity(game.controllerSensitivity);

    game.press_left = false;
    game.press_right = false;
    game.press_action = false;
    game.press_map = false;

    if (graphics.flipmode)
    {
        if (key.isDown(KEYBOARD_LEFT) || key.isDown(KEYBOARD_DOWN) || key.isDown(KEYBOARD_a) ||  key.isDown(KEYBOARD_s) || key.controllerWantsRight(true)) game.press_left = true;
        if (key.isDown(KEYBOARD_RIGHT) || key.isDown(KEYBOARD_UP)  || key.isDown(KEYBOARD_d) ||  key.isDown(KEYBOARD_w) || key.controllerWantsLeft(true)) game.press_right = true;
    }
    else
    {
        if (key.isDown(KEYBOARD_LEFT) || key.isDown(KEYBOARD_UP) || key.isDown(KEYBOARD_a) ||  key.isDown(KEYBOARD_w) || key.controllerWantsLeft(true))
        {
            game.press_left = true;
        }
        if (key.isDown(KEYBOARD_RIGHT) || key.isDown(KEYBOARD_DOWN)  || key.isDown(KEYBOARD_d) ||  key.isDown(KEYBOARD_s) || key.controllerWantsRight(true))
        {
            game.press_right = true;
        }
    }
    if (key.isDown(KEYBOARD_z) || key.isDown(KEYBOARD_SPACE) || key.isDown(KEYBOARD_v) || key.isDown(game.controllerButton_flip)) game.press_action = true;
    //|| key.isDown(KEYBOARD_UP) || key.isDown(KEYBOARD_DOWN)) game.press_action = true; //on menus, up and down don't work as action
    if (key.isDown(KEYBOARD_ENTER)) game.press_map = true;

    //In the menu system, all keypresses are single taps rather than holds. Therefore this test has to be done for all presses
    if (!game.press_action && !game.press_left && !game.press_right) game.jumpheld = false;
    if (!game.press_map) game.mapheld = false;

    if (!game.jumpheld && graphics.fademode==0)
    {
        if (game.press_action || game.press_left || game.press_right || game.press_map)
        {
            game.jumpheld = true;
        }

        if (key.isDown(27) && game.currentmenuname != "youwannaquit" && game.menustart)
        {
            music.playef(11);
            game.previousmenuname = game.currentmenuname;
            game.createmenu("youwannaquit");
            map.nexttowercolour();
        }

        if(game.menustart)
        {
            if (game.press_left)
            {
                game.currentmenuoption--;
            }
            else if (game.press_right)
            {
                game.currentmenuoption++;
            }
        }

        if (game.currentmenuoption < 0) game.currentmenuoption = game.nummenuoptions-1;
        if (game.currentmenuoption >= game.nummenuoptions ) game.currentmenuoption = 0;

        if (game.press_action)
        {
            if (!game.menustart)
            {
                game.menustart = true;
                music.play(6);
                music.playef(18);
                game.screenshake = 10;
                game.flashlight = 5;
                map.colstate = 10;
                map.nexttowercolour();
            }
            else
            {
                if (game.currentmenuname == "mainmenu")
                {

#if defined(MAKEANDPLAY)
                    if (game.currentmenuoption == 0)
                    {
                      //Bring you to the normal playmenu
                        music.playef(11);
                        game.createmenu("playerworlds");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 1)
                    {
                        //Options
                        music.playef(11);
                        game.createmenu("graphicoptions");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 2)
                    {
                        //Options
                        music.playef(11);
                        game.createmenu("options");

                        //Add extra menu for mmmmmm mod
                        if(music.mmmmmm){
                            game.menuoptions[3] = "soundtrack";
                            game.menuoptionsactive[3] = true;
                            game.menuoptions[4] = "return";
                            game.menuoptionsactive[4] = true;
                            game.nummenuoptions = 5;
                        }
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 3)
                    {
                        //bye!
                        music.playef(2);
                        game.mainmenu = 100;
                        graphics.fademode = 2;
                    }
                }
#elif !defined(MAKEANDPLAY)
 #if defined(NO_CUSTOM_LEVELS)
                    if (game.currentmenuoption == 0)
                    {
                        //Play
                        if (game.telesummary == "" && game.quicksummary == "")
                        {
                            //No saves exist, just start a new game
                            game.mainmenu = 0;
                            graphics.fademode = 2;
                        }
                        else
                        {
                            //Bring you to the normal playmenu
                            music.playef(11);
                            game.createmenu("play");
                            map.nexttowercolour();
                        }
                    }
                    else if (game.currentmenuoption == 1)
                    {
                        //Options
                        music.playef(11);
                        game.createmenu("graphicoptions");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 2)
                    {
                        //Options
                        music.playef(11);
                        game.createmenu("options");

                        //Add extra menu for mmmmmm mod
                        if(music.mmmmmm){
                            game.menuoptions[4] = "soundtrack";
                            game.menuoptionsactive[4] = true;
                            game.menuoptions[5] = "return";
                            game.menuoptionsactive[5] = true;
                            game.nummenuoptions = 6;
                        }
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 3)
                    {
                        //Credits
                        music.playef(11);
                        game.createmenu("credits");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 4)
                    {
                        //bye!
                        music.playef(2);
                        game.mainmenu = 100;
                        graphics.fademode = 2;
                    }
 #else
                    if (game.currentmenuoption == 0)
                    {
                        //Play
                        if (game.telesummary == "" && game.quicksummary == "")
                        {
                            //No saves exist, just start a new game
                            game.mainmenu = 0;
                            graphics.fademode = 2;
                        }
                        else
                        {
                            //Bring you to the normal playmenu
                            music.playef(11);
                            game.createmenu("play");
                            map.nexttowercolour();
                        }
                    }
                    else if (game.currentmenuoption == 1)
                    {
                        //Bring you to the normal playmenu
                        music.playef(11);
                        game.createmenu("playerworlds");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 2)
                    {
                        //Options
                        music.playef(11);
                        game.createmenu("graphicoptions");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 3)
                    {
                        //Options
                        music.playef(11);
                        game.createmenu("options");

                        //Add extra menu for mmmmmm mod
                        if(music.mmmmmm){
                            game.menuoptions[4] = "soundtrack";
                            game.menuoptionsactive[4] = true;
                            game.menuoptions[5] = "return";
                            game.menuoptionsactive[5] = true;
                            game.nummenuoptions = 6;
                        }
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 4)
                    {
                        //Credits
                        music.playef(11);
                        game.createmenu("credits");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 5)
                    {
                        //bye!
                        music.playef(2);
                        game.mainmenu = 100;
                        graphics.fademode = 2;
                    }
 #endif
                }
#endif
#if !defined(NO_CUSTOM_LEVELS)
                else if(game.currentmenuname=="levellist")
                {
                    if(game.currentmenuoption==game.nummenuoptions-1){
                        //go back to menu
                        music.playef(11);
                        game.createmenu("mainmenu");
                        map.nexttowercolour();
                    }else if(game.currentmenuoption==game.nummenuoptions-2){
                        //next page
                        music.playef(11);
                        if((size_t) ((game.levelpage*8)+8) >= ed.ListOfMetaData.size()){
                            game.levelpage=0;
                        }else{
                            game.levelpage++;
                        }
                        game.createmenu("levellist");
                        game.currentmenuoption=game.nummenuoptions-2;
                        map.nexttowercolour();
                    }else{
                        //Ok, launch the level!
                        //PLAY CUSTOM LEVEL HOOK
                        music.playef(11);
                        game.playcustomlevel=(game.levelpage*8)+game.currentmenuoption;
                        game.customleveltitle=ed.ListOfMetaData[game.playcustomlevel].title;
                        game.customlevelfilename=ed.ListOfMetaData[game.playcustomlevel].filename;

                        std::string name = "saves/" + ed.ListOfMetaData[game.playcustomlevel].filename.substr(7) + ".vvv";
                        TiXmlDocument doc;
                        if (!FILESYSTEM_loadTiXmlDocument(name.c_str(), &doc)){
                            game.mainmenu = 22;
                            graphics.fademode = 2;
                        }else{
                            game.createmenu("quickloadlevel");
                            map.nexttowercolour();
                        }
                    }
                }
#endif
                else if(game.currentmenuname=="quickloadlevel")
                {
                    if(game.currentmenuoption==0){//continue save
                        game.mainmenu = 23;
                        graphics.fademode = 2;
                    }else if(game.currentmenuoption==1){
                        game.mainmenu = 22;
                        graphics.fademode = 2;
                    }else if(game.currentmenuoption==2){
                        music.playef(11);
                        game.levelpage=0;
                        game.createmenu("levellist");
                        map.nexttowercolour();
                    }
                }
#if !defined(NO_CUSTOM_LEVELS)
                else if(game.currentmenuname=="playerworlds")
                {
 #if !defined(NO_EDITOR)
                    if(game.currentmenuoption==0){

                        music.playef(11);
                        game.levelpage=0;
                        ed.getDirectoryData();
                        game.loadcustomlevelstats(); //Should only load a file if it's needed
                        game.createmenu("levellist");
                        map.nexttowercolour();
                    }else if(game.currentmenuoption==1){
                        //LEVEL EDITOR HOOK
                        music.playef(11);
                        game.mainmenu = 20;
                        graphics.fademode = 2;
                        ed.filename="";
                    }/*else if(game.currentmenuoption==2){
                        music.playef(11);
                        //"OPENFOLDERHOOK"
                        //When the player selects the "open level folder" menu option,
                        //this is where it should run the appropriate code.
                        //This code should:
                        // - Minimise the game
                        // - Open the levels folder for whatever operating system we're on
                        SDL_assert(0 && "Remove open level dir");

                    }*/else if(game.currentmenuoption==2){
                        //back
                        music.playef(11);
                        game.createmenu("mainmenu");
                        map.nexttowercolour();
                    }
 #else
                    if(game.currentmenuoption==0){
                        music.playef(11);
                        game.levelpage=0;
                        ed.getDirectoryData();
                        game.loadcustomlevelstats(); //Should only load a file if it's needed
                        game.createmenu("levellist");
                        map.nexttowercolour();
                    }else if(game.currentmenuoption==1){
                        //back
                        music.playef(11);
                        game.createmenu("mainmenu");
                        map.nexttowercolour();
                    }
 #endif
                }
#endif
                else if(game.currentmenuname=="errornostart"){
                    music.playef(11);
                    game.createmenu("mainmenu");
                    map.nexttowercolour();
                }
                else if (game.currentmenuname == "graphicoptions")
                {
                    if (game.currentmenuoption == 0){
                        music.playef(11);
                        graphics.screenbuffer->toggleFullScreen();
                        game.fullscreen = !game.fullscreen;
                        game.savestats();
                        game.createmenu("graphicoptions");
                        game.currentmenuoption = 0;
                    }else if (game.currentmenuoption == 1){
                        music.playef(11);
                        graphics.screenbuffer->toggleStretchMode();
                        game.stretchMode = (game.stretchMode + 1) % 3;
                        game.savestats();
                        game.createmenu("graphicoptions");
                        game.currentmenuoption = 1;
                    }else if (game.currentmenuoption == 2){
                        music.playef(11);
                        graphics.screenbuffer->toggleLinearFilter();
                        game.useLinearFilter = !game.useLinearFilter;
                        game.savestats();
                        game.createmenu("graphicoptions");
                        game.currentmenuoption = 2;
                    }else if (game.currentmenuoption == 3){
                        //change smoothing
                        music.playef(11);
                        game.fullScreenEffect_badSignal = !game.fullScreenEffect_badSignal;
                        //Hook the analogue thing in here: ABCDEFG
                        graphics.screenbuffer->badSignalEffect= !graphics.screenbuffer->badSignalEffect;
                        game.savestats();
                        game.createmenu("graphicoptions");
                        game.currentmenuoption = 3;
                    }else if (game.currentmenuoption == 4) {
                        //toggle mouse cursor
                        music.playef(11);
                        if (graphics.showmousecursor == true) {
                            SDL_ShowCursor(SDL_DISABLE);
                            graphics.showmousecursor = false;
                        }
                        else {
                            SDL_ShowCursor(SDL_ENABLE);
                            graphics.showmousecursor = true;
                        }
                    }
                    else
                    {
                        //back
                        music.playef(11);
                        game.createmenu("mainmenu");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "youwannaquit")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //bye!
                        music.playef(2);
                        game.mainmenu = 100;
                        graphics.fademode = 2;
                    }
                    else
                    {
                        music.playef(11);
                        game.createmenu(game.previousmenuname);
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "setinvincibility")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //back
                        music.playef(11);
                        game.createmenu("accessibility");
                        game.currentmenuoption = 3;
                        map.nexttowercolour();
                    }
                    else
                    {
                        map.invincibility = !map.invincibility;
                        game.savestats();
                        music.playef(11);
                        game.createmenu("accessibility");
                        game.currentmenuoption = 3;
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "setslowdown1")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //back
                        music.playef(11);
                        game.createmenu("accessibility");
                        game.currentmenuoption = 4;
                        map.nexttowercolour();
                    }
                    else
                    {
                        //change game speed
                        game.deletequick();
                        game.deletetele();
                        game.createmenu("setslowdown2");
                        map.nexttowercolour();
                        music.playef(11);
                    }
                }
                else if (game.currentmenuname == "setslowdown2")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //back
                        game.gameframerate=34;
                        game.slowdown = 30;
                        game.savestats();
                        music.playef(11);
                        game.createmenu("accessibility");
                        game.currentmenuoption = 4;
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 1)
                    {
                        game.gameframerate=41;
                        game.slowdown = 24;
                        game.savestats();
                        music.playef(11);
                        game.createmenu("accessibility");
                        game.currentmenuoption = 4;
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 2)
                    {
                        game.gameframerate=55;
                        game.slowdown = 18;
                        game.savestats();
                        music.playef(11);
                        game.createmenu("accessibility");
                        game.currentmenuoption = 4;
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 3)
                    {
                        game.gameframerate=83;
                        game.slowdown = 12;
                        game.savestats();
                        music.playef(11);
                        game.createmenu("accessibility");
                        game.currentmenuoption = 4;
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "accessibility")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //disable animated backgrounds
                        game.colourblindmode = !game.colourblindmode;
                        game.savestats();
                        map.tdrawback = true;
                        music.playef(11);
                    }
                    else if (game.currentmenuoption == 1)
                    {
                        //disable screeneffects
                        game.noflashingmode = !game.noflashingmode;
                        game.savestats();
                        if (!game.noflashingmode)
                        {
                            music.playef(18);
                            game.screenshake = 10;
                            game.flashlight = 5;
                        }else{
                            music.playef(11);
                        }
                    }
                    else if (game.currentmenuoption == 2)
                    {
                        //disable text outline
                        graphics.notextoutline = !graphics.notextoutline;
                        game.savestats();
                        music.playef(11);
                    }
                    else if (game.currentmenuoption == 3)
                    {
                        //invincibility
                        if (!map.invincibility)
                        {
                            game.createmenu("setinvincibility");
                            map.nexttowercolour();
                        }
                        else
                        {
                            map.invincibility = !map.invincibility;
                        }
                        music.playef(11);
                    }
                    else if (game.currentmenuoption == 4)
                    {
                        //change game speed
                        game.createmenu("setslowdown2");
                        map.nexttowercolour();
                        music.playef(11);
                    }
                    else if (game.currentmenuoption == 5)
                    {
                        // toggle fake load screen
                        game.skipfakeload = !game.skipfakeload;
                        music.playef(11);
                    }
                    else if (game.currentmenuoption == 6)
                    {
                        // toggle translucent roomname BG
                        graphics.translucentroomname = !graphics.translucentroomname;
                        music.playef(11);
                    }
                    else if (game.currentmenuoption == 7)
                    {
                        //back
                        music.playef(11);
                        game.createmenu("options");

                        //Add extra menu for mmmmmm mod
                        if(music.mmmmmm){
#if defined(MAKEANDPLAY)
                            game.menuoptions[3] = "soundtrack";
                            game.menuoptionsactive[3] = true;
                            game.menuoptions[4] = "return";
                            game.menuoptionsactive[4] = true;
                            game.nummenuoptions = 5;
#elif !defined(MAKEANDPLAY)
                            game.menuoptions[4] = "soundtrack";
                            game.menuoptionsactive[4] = true;
                            game.menuoptions[5] = "return";
                            game.menuoptionsactive[5] = true;
                            game.nummenuoptions = 6;
#endif
                        }

                        map.nexttowercolour();
                    }
                    else
                    {
                        //Can't do yet! play sad sound
                        music.playef(2);
                    }
                }
                else if (game.currentmenuname == "options")
                {

#if defined(MAKEANDPLAY)
                    if (game.currentmenuoption == 0)
                    {
                        //accessibility options
                        music.playef(11);
                        game.createmenu("accessibility");
                        map.nexttowercolour();
                    }

                    else if (game.currentmenuoption == 1)
                    {
                        //clear data menu
                        music.playef(11);
                        game.createmenu("controller");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 2)
                    {
                        //clear data menu
                        music.playef(11);
                        game.createmenu("cleardatamenu");
                        map.nexttowercolour();
                    }

                    if(music.mmmmmm){
                        if (game.currentmenuoption == 3)
                        {
                            //**** TOGGLE MMMMMM
                            if(game.usingmmmmmm > 0){
                                game.usingmmmmmm=0;
                            }else{
                                game.usingmmmmmm=1;
                            }
                            music.usingmmmmmm = !music.usingmmmmmm;
                            music.playef(11);
                            music.play(6);
                            game.savestats();
                            game.createmenu("mainmenu");
                            map.nexttowercolour();
                        }
                        if (game.currentmenuoption == 4)
                        {
                            //back
                            music.playef(11);
                            game.createmenu("mainmenu");
                            map.nexttowercolour();
                        }
                    }else{
                        if (game.currentmenuoption == 3)
                        {
                            //back
                            music.playef(11);
                            game.createmenu("mainmenu");
                            map.nexttowercolour();
                        }
                    }

#elif !defined(MAKEANDPLAY)
                    if (game.currentmenuoption == 0)
                    {
                        //accessibility options
                        music.playef(11);
                        game.createmenu("accessibility");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 1)
                    {
                        //unlock play options
                        music.playef(11);
                        game.createmenu("unlockmenu");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 2)
                    {
                        //clear data menu
                        music.playef(11);
                        game.createmenu("controller");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 3)
                    {
                        //clear data menu
                        music.playef(11);
                        game.createmenu("cleardatamenu");
                        map.nexttowercolour();
                    }

                    if(music.mmmmmm){
                        if (game.currentmenuoption == 4)
                        {
                            //**** TOGGLE MMMMMM
                            if(game.usingmmmmmm > 0){
                                game.usingmmmmmm=0;
                            }else{
                                game.usingmmmmmm=1;
                            }
                            music.usingmmmmmm = !music.usingmmmmmm;
                            music.playef(11);
                            music.play(6);
                            game.savestats();
                            game.createmenu("mainmenu");
                            map.nexttowercolour();
                        }
                        if (game.currentmenuoption == 5)
                        {
                            //back
                            music.playef(11);
                            game.createmenu("mainmenu");
                            map.nexttowercolour();
                        }
                    }else{
                        if (game.currentmenuoption == 4)
                        {
                            //back
                            music.playef(11);
                            game.createmenu("mainmenu");
                            map.nexttowercolour();
                        }
                    }
#endif
                }
                else if (game.currentmenuname == "unlockmenutrials")
                {
                    if (game.currentmenuoption == 0)   	//unlock 1
                    {
                        game.unlock[9] = true;
                        game.unlocknotify[9] = true;
                        music.playef(11);
                        game.savestats();
                        game.createmenu("unlockmenutrials");
                        game.currentmenuoption = 0;
                    }
                    else if (game.currentmenuoption == 1)   	//unlock 2
                    {
                        game.unlock[10] = true;
                        game.unlocknotify[10] = true;
                        music.playef(11);
                        game.savestats();
                        game.createmenu("unlockmenutrials");
                        game.currentmenuoption = 1;
                    }
                    else if (game.currentmenuoption == 2)   	//unlock 3
                    {
                        game.unlock[11] = true;
                        game.unlocknotify[11] = true;
                        music.playef(11);
                        game.savestats();
                        game.createmenu("unlockmenutrials");
                        game.currentmenuoption = 2;
                    }
                    else if (game.currentmenuoption == 3)   	//unlock 4
                    {
                        game.unlock[12] = true;
                        game.unlocknotify[12] = true;
                        music.playef(11);
                        game.savestats();
                        game.createmenu("unlockmenutrials");
                        game.currentmenuoption = 3;
                    }
                    else if (game.currentmenuoption == 4)   	//unlock 5
                    {
                        game.unlock[13] = true;
                        game.unlocknotify[13] = true;
                        music.playef(11);
                        game.savestats();
                        game.createmenu("unlockmenutrials");
                        game.currentmenuoption = 4;
                    }
                    else if (game.currentmenuoption == 5)   	//unlock 6
                    {
                        game.unlock[14] = true;
                        game.unlocknotify[14] = true;
                        music.playef(11);
                        game.savestats();
                        game.createmenu("unlockmenutrials");
                        game.currentmenuoption = 5;
                    }
                    else if (game.currentmenuoption == 6)   	//back
                    {
                        //back
                        music.playef(11);
                        game.createmenu("unlockmenu");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "unlockmenu")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //unlock time trials separately...
                        music.playef(11);
                        game.createmenu("unlockmenutrials");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 1)
                    {
                        //unlock intermissions
                        music.playef(11);
                        game.unlock[16] = true;
                        game.unlocknotify[16] = true;
                        game.unlock[6] = true;
                        game.unlock[7] = true;
                        game.savestats();
                        game.createmenu("unlockmenu");
                        game.currentmenuoption = 1;
                    }
                    else if (game.currentmenuoption == 2)
                    {
                        //unlock no death mode
                        music.playef(11);
                        game.unlock[17] = true;
                        game.unlocknotify[17] = true;
                        game.savestats();
                        game.createmenu("unlockmenu");
                        game.currentmenuoption = 2;
                    }
                    else if (game.currentmenuoption == 3)
                    {
                        //unlock flip mode
                        music.playef(11);
                        game.unlock[18] = true;
                        game.unlocknotify[18] = true;
                        game.savestats();
                        game.createmenu("unlockmenu");
                        game.currentmenuoption = 3;
                    }
                    else if (game.currentmenuoption == 4)
                    {
                        //unlock jukebox
                        music.playef(11);
                        game.stat_trinkets = 20;
                        game.savestats();
                        game.createmenu("unlockmenu");
                        game.currentmenuoption = 4;
                    }
                    else if (game.currentmenuoption == 5)
                    {
                        //unlock secret lab
                        music.playef(11);
                        game.unlock[8] = true;
                        game.unlocknotify[8] = true;
                        game.savestats();
                        game.createmenu("unlockmenu");
                        game.currentmenuoption = 5;
                    }
                    else
                    {
                        //back
                        music.playef(11);
                        game.createmenu("options");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "credits")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //next page
                        music.playef(11);
                        game.createmenu("credits2");
                        map.nexttowercolour();
                    }
                    else
                    {
                        //back
                        music.playef(11);
                        game.createmenu("mainmenu");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "credits2")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //next page
                        music.playef(11);
                        game.createmenu("credits25");
                        map.nexttowercolour();
                    }
                    else
                    {
                        //back
                        music.playef(11);
                        game.createmenu("mainmenu");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "credits25")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //next page
                        music.playef(11);
                        game.createmenu("credits3");
                        map.nexttowercolour();
                    }
                    else
                    {
                        //back
                        music.playef(11);
                        game.createmenu("mainmenu");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "credits3")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //next page
                        music.playef(11);
                        game.current_credits_list_index += 9;

                        if (game.current_credits_list_index >= (int)game.superpatrons.size())
                        {
                            // No more super patrons. Move to the next credits section
                            game.current_credits_list_index = 0;
                            game.createmenu("credits4");
                        }
                        else
                        {
                            // There are more super patrons. Refresh the menu with the next ones
                            game.createmenu("credits3");
                        }

                        map.nexttowercolour();
                    }
                    else
                    {
                        //back
                        music.playef(11);
                        game.current_credits_list_index = 0;
                        game.createmenu("mainmenu");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "credits4")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //next page
                        music.playef(11);
                        game.current_credits_list_index += 14;

                        if (game.current_credits_list_index >= (int)game.patrons.size())
                        {
                            // No more patrons. Move to the next credits section
                            game.current_credits_list_index = 0;
                            game.createmenu("credits5");
                        }
                        else
                        {
                            // There are more patrons. Refresh the menu with the next ones
                            game.createmenu("credits4");
                        }

                        map.nexttowercolour();
                    }
                    else
                    {
                        //back
                        music.playef(11);
                        game.current_credits_list_index = 0;
                        game.createmenu("mainmenu");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "credits5")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //next page
                        music.playef(11);
                        game.current_credits_list_index += 9;

                        if (game.current_credits_list_index >= (int)game.githubfriends.size())
                        {
                            // No more GitHub contributors. Move to the next credits section
                            game.current_credits_list_index = 0;
                            game.createmenu("credits6");
                        }
                        else
                        {
                            // There are more GitHub contributors. Refresh the menu with the next ones
                            game.createmenu("credits5");
                        }

                        map.nexttowercolour();
                    }
                    else
                    {
                        //back
                        music.playef(11);
                        game.current_credits_list_index = 0;
                        game.createmenu("mainmenu");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "credits6")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //first page
                        music.playef(11);
                        game.createmenu("credits");
                        map.nexttowercolour();
                    }
                    else
                    {
                        //back
                        music.playef(11);
                        game.createmenu("mainmenu");
                        map.nexttowercolour();
                        music.niceplay(6);
                    }
                }
                else if (game.currentmenuname == "play")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //continue
                        //right, this depends on what saves you've got
                        if (game.telesummary == "")
                        {
                            //You at least have a quicksave, or you couldn't have gotten here
                            game.mainmenu = 2;
                            graphics.fademode = 2;
                        }
                        else if (game.quicksummary == "")
                        {
                            //You at least have a telesave, or you couldn't have gotten here
                            game.mainmenu = 1;
                            graphics.fademode = 2;
                        }
                        else
                        {
                            //go to a menu!
                            music.playef(11);
                            game.loadsummary(); //Prepare save slots to display
                            game.createmenu("continue");
                            map.settowercolour(3);
                        }
                    }
                    else if (game.currentmenuoption == 1)
                    {
                        //play modes
                        music.playef(11);
                        game.createmenu("playmodes");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 2)
                    {
                        //newgame
                        music.playef(11);
                        game.createmenu("newgamewarning");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 3)
                    {
                        //back
                        music.playef(11);
                        game.createmenu("mainmenu");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "playsecretlab")
                {
                    //as above, except with an extra option...
                    if (game.currentmenuoption == 0)
                    {
                        //continue
                        //right, this depends on what saves you've got
                        if (game.telesummary == "")
                        {
                            //You at least have a quicksave, or you couldn't have gotten here
                            game.mainmenu = 2;
                            graphics.fademode = 2;
                        }
                        else if (game.quicksummary == "")
                        {
                            //You at least have a telesave, or you couldn't have gotten here
                            game.mainmenu = 1;
                            graphics.fademode = 2;
                        }
                        else
                        {
                            //go to a menu!
                            music.playef(11);
                            game.loadsummary(); //Prepare save slots to display
                            game.createmenu("continue");
                            map.settowercolour(3);
                        }
                    }
                    else if (game.currentmenuoption == 1)
                    {
                        if(!map.invincibility){
                            game.mainmenu = 11;
                            graphics.fademode = 2;
                        }else{
                            //Can't do yet! play sad sound
                            music.playef(2);
                        }
                    }
                    else if (game.currentmenuoption == 2)
                    {
                        //play modes
                        music.playef(11);
                        game.createmenu("playmodes");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 3)
                    {
                        //newgame
                        music.playef(11);
                        game.createmenu("newgamewarning");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 4)
                    {
                        //back
                        music.playef(11);
                        game.createmenu("mainmenu");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "newgamewarning")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //yep
                        game.mainmenu = 0;
                        graphics.fademode = 2;
                        game.deletequick();
                        game.deletetele();
                    }
                    else
                    {
                        //back
                        music.playef(11);
                        game.createmenu("play");
                        map.nexttowercolour();
                    }
                }

                else if (game.currentmenuname == "controller")
                {
                    if (game.currentmenuoption == 0)
                    {
                        game.controllerSensitivity++;
                        music.playef(11);
                        if(game.controllerSensitivity > 4)
                        {
                            game.controllerSensitivity = 0;
                        }
                    }

                    if (game.currentmenuoption == 4)
                    {
                        music.playef(11);
                        game.createmenu("options");

                        //Add extra menu for mmmmmm mod
                        if(music.mmmmmm){
#if defined(MAKEANDPLAY)
                            game.menuoptions[3] = "soundtrack";
                            game.menuoptionsactive[3] = true;
                            game.menuoptions[4] = "return";
                            game.menuoptionsactive[4] = true;
                            game.nummenuoptions = 5;
#elif !defined(MAKEANDPLAY)
                            game.menuoptions[4] = "soundtrack";
                            game.menuoptionsactive[4] = true;
                            game.menuoptions[5] = "return";
                            game.menuoptionsactive[5] = true;
                            game.nummenuoptions = 6;
#endif
                        }
                    }
                }
                else if (game.currentmenuname == "cleardatamenu")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //back
                        music.playef(11);
                        game.createmenu("options");

                        //Add extra menu for mmmmmm mod
                        if(music.mmmmmm){
#if defined(MAKEANDPLAY)
                            game.menuoptions[3] = "soundtrack";
                            game.menuoptionsactive[3] = true;
                            game.menuoptions[4] = "return";
                            game.menuoptionsactive[4] = true;
                            game.nummenuoptions = 5;
#elif !defined(MAKEANDPLAY)
                            game.menuoptions[4] = "soundtrack";
                            game.menuoptionsactive[4] = true;
                            game.menuoptions[5] = "return";
                            game.menuoptionsactive[5] = true;
                            game.nummenuoptions = 6;
#endif
                        }
                        map.nexttowercolour();
                    }
                    else
                    {
                        //yep
                        music.playef(23);
                        game.deletequick();
                        game.deletetele();
                        game.deletestats();
                        game.flashlight = 5;
                        game.screenshake = 15;
                        game.createmenu("mainmenu");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "playmodes")
                {
                    if (game.currentmenuoption == 0  && game.slowdown == 30 && !map.invincibility)   //go to the time trial menu
                    {
                        music.playef(11);
                        game.createmenu("timetrials");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 1 && game.unlock[16])
                    {
                        //intermission mode menu
                        music.playef(11);
                        game.createmenu("intermissionmenu");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 2 && game.unlock[17] && game.slowdown == 30 && !map.invincibility)    //start a game in no death mode
                    {
                        music.playef(11);
                        game.createmenu("startnodeathmode");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 3 && game.unlock[18])    //enable/disable flip mode
                    {
                        music.playef(18);
                        game.screenshake = 10;
                        game.flashlight = 5;
                        graphics.setflipmode = !graphics.setflipmode;
                        game.savemystats = true;
                    }
                    else if (game.currentmenuoption == 4)
                    {
                        //back
                        music.playef(11);
                        game.createmenu("play");
                        map.nexttowercolour();
                    }
                    else
                    {
                        //Can't do yet! play sad sound
                        music.playef(2);
                    }
                }
                else if (game.currentmenuname == "startnodeathmode")
                {
                    if (game.currentmenuoption == 0)   //start no death mode, disabling cutscenes
                    {
                        game.mainmenu = 10;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 1)
                    {
                        game.mainmenu = 9;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 2)
                    {
                        //back
                        music.playef(11);
                        game.createmenu("play");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "continue")
                {
                    if (game.currentmenuoption == 0)
                    {
                        game.mainmenu = 1;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 1)
                    {
                        game.mainmenu = 2;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 2)
                    {
                        //back
                        music.playef(11);
                        game.createmenu("play");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "intermissionmenu")
                {
                    if (game.currentmenuoption == 0)
                    {
                        music.playef(11);
                        music.play(6);
                        game.createmenu("playint1");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 1)
                    {
                        music.playef(11);
                        music.play(6);
                        game.createmenu("playint2");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 2)
                    {
                        //back
                        music.playef(11);
                        game.createmenu("play");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "playint1")
                {
                    if (game.currentmenuoption == 0)
                    {
                        game.mainmenu = 12;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 1)
                    {
                        game.mainmenu = 13;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 2)
                    {
                        game.mainmenu = 14;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 3)
                    {
                        game.mainmenu = 15;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 4)
                    {
                        //back
                        music.playef(11);
                        game.createmenu("play");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "playint2")
                {
                    if (game.currentmenuoption == 0)
                    {
                        game.mainmenu = 16;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 1)
                    {
                        game.mainmenu = 17;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 2)
                    {
                        game.mainmenu = 18;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 3)
                    {
                        game.mainmenu = 19;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 4)
                    {
                        //back
                        music.playef(11);
                        game.createmenu("play");
                        map.nexttowercolour();
                    }
                }
                else if (game.currentmenuname == "gameover2")
                {
                    //back
                    music.playef(11);
                    music.play(6);
                    game.createmenu("mainmenu");
                    map.nexttowercolour();
                }
                else if (game.currentmenuname == "unlocktimetrials" || game.currentmenuname == "unlocktimetrial")
                {
                    //back
                    music.playef(11);
                    game.createmenu("play");
                    map.nexttowercolour();
                }
                else if (game.currentmenuname == "unlocknodeathmode" || game.currentmenuname == "unlockintermission"
                         || game.currentmenuname == "unlockflipmode")
                {
                    //back
                    music.playef(11);
                    game.createmenu("play");
                    map.nexttowercolour();
                }
                else if (game.currentmenuname == "timetrials")
                {
                    if (game.currentmenuoption == 0 && game.unlock[9])   //space station 1
                    {
                        game.mainmenu = 3;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 1 && game.unlock[10])    //lab
                    {
                        game.mainmenu = 4;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 2 && game.unlock[11])    //tower
                    {
                        game.mainmenu = 5;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 3 && game.unlock[12])    //station 2
                    {
                        game.mainmenu = 6;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 4 && game.unlock[13])    //warp
                    {
                        game.mainmenu = 7;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 5 && game.unlock[14])    //final
                    {
                        game.mainmenu = 8;
                        graphics.fademode = 2;
                    }
                    else if (game.currentmenuoption == 6)    //go to the time trial menu
                    {
                        //back
                        music.playef(11);
                        game.createmenu("play");
                        map.nexttowercolour();
                    }
                    else
                    {
                        //Can't do yet! play sad sound
                        music.playef(2);
                    }
                }
                else if (game.currentmenuname == "timetrialcomplete3")
                {
                    if (game.currentmenuoption == 0)
                    {
                        //back
                        music.playef(11);
                        music.play(6);
                        game.createmenu("play");
                        map.nexttowercolour();
                    }
                    else if (game.currentmenuoption == 1)
                    {
                        //duplicate the above based on given time trial level!
                        if (game.timetriallevel == 0)   //space station 1
                        {
                            game.mainmenu = 3;
                            graphics.fademode = 2;
                        }
                        else if (game.timetriallevel == 1)    //lab
                        {
                            game.mainmenu = 4;
                            graphics.fademode = 2;
                        }
                        else if (game.timetriallevel == 2)    //tower
                        {
                            game.mainmenu = 5;
                            graphics.fademode = 2;
                        }
                        else if (game.timetriallevel == 3)    //station 2
                        {
                            game.mainmenu = 6;
                            graphics.fademode = 2;
                        }
                        else if (game.timetriallevel == 4)    //warp
                        {
                            game.mainmenu = 7;
                            graphics.fademode = 2;
                        }
                        else if (game.timetriallevel == 5)    //final
                        {
                            game.mainmenu = 8;
                            graphics.fademode = 2;
                        }
                    }
                }
                else if (game.currentmenuname == "gamecompletecontinue" || game.currentmenuname == "nodeathmodecomplete2")
                {
                    if (game.currentmenuoption == 0)
                    {
                        music.play(6);
                        music.playef(11);
                        game.createmenu("play");
                        map.nexttowercolour();
                    }
                }
            }
        }
        if (    game.currentmenuname == "controller" &&
                game.currentmenuoption > 0 &&
                game.currentmenuoption < 4 &&
                key.controllerButtonDown()      )
        {
            updatebuttonmappings(game.currentmenuoption);
        }

    }

    if (graphics.fademode == 1)
        script.startgamemode(game.mainmenu);
}

void gameinput()
{
    //TODO mouse input
    //game.mx = (mouseX / 2);
    //game.my = (mouseY / 2);

    if(!script.running)
    {
        game.press_left = false;
        game.press_right = false;
        game.press_action = false;
        game.press_map = false;

        if (key.isDown(KEYBOARD_LEFT) || key.isDown(KEYBOARD_a) || key.controllerWantsLeft(false))
        {
            game.press_left = true;
        }
        if (key.isDown(KEYBOARD_RIGHT) || key.isDown(KEYBOARD_d) || key.controllerWantsRight(false))
        {
            game.press_right = true;
        }
        if (key.isDown(KEYBOARD_z) || key.isDown(KEYBOARD_SPACE) || key.isDown(KEYBOARD_v)
                || key.isDown(KEYBOARD_UP) || key.isDown(KEYBOARD_DOWN) || key.isDown(KEYBOARD_w) || key.isDown(KEYBOARD_s)|| key.isDown(game.controllerButton_flip))
        {
            game.press_action = true;
        };
        if (key.isDown(KEYBOARD_ENTER) || key.isDown(SDLK_KP_ENTER) || key.isDown(game.controllerButton_map)  )
        {
            game.press_map = true;
        }
    }

    if (game.advancetext)
    {
        if (game.pausescript)
        {
            game.press_action = false;
            if (key.isDown(KEYBOARD_z) || key.isDown(KEYBOARD_SPACE) || key.isDown(KEYBOARD_v)
                    || key.isDown(KEYBOARD_UP) || key.isDown(KEYBOARD_DOWN) || key.isDown(KEYBOARD_w) || key.isDown(KEYBOARD_s) || key.isDown(game.controllerButton_flip)) game.press_action = true;
        }

        if (game.press_action && !game.jumpheld)
        {
            if (game.pausescript)
            {
                game.pausescript = false;
                game.hascontrol = true;
                game.jumpheld = true;
            }
            else
            {
                if(!game.glitchrunkludge) game.state++;
                    game.jumpheld = true;
                    game.glitchrunkludge=true;
                    //Bug fix! You should only be able to do this ONCE.
            }
        }
    }

    if (!game.press_map) game.mapheld = false;

    if (game.intimetrial && graphics.fademode == 1 && game.quickrestartkludge)
    {
        //restart the time trial
        game.quickrestartkludge = false;
        script.startgamemode(game.timetriallevel + 3);
        game.deathseq = -1;
        game.completestop = false;
    }

    //Returning to editor mode must always be possible
#if !defined(NO_CUSTOM_LEVELS)
    if(map.custommode && !map.custommodeforreal){
      if ((game.press_map || key.isDown(27)) && !game.mapheld){
        game.mapheld = true;
        //Return to level editor
        if (game.activeactivity > -1 && game.press_map){
           if((int(std::abs(obj.entities[obj.getplayer()].vx))<=1) && (int(obj.entities[obj.getplayer()].vy) == 0) )
            {
                script.load(obj.blocks[game.activeactivity].script);
                obj.removeblock(game.activeactivity);
            }
        }else{
          game.gamestate = EDITORMODE;

          graphics.textboxremove();
          game.hascontrol = true;
          game.advancetext = false;
          game.completestop = false;
          game.state = 0;
          graphics.showcutscenebars = false;

          graphics.backgrounddrawn=false;
          music.fadeout();
          //If warpdir() is used during playtesting, we need to set it back after!
          for (int j = 0; j < ed.maxheight; j++)
          {
            for (int i = 0; i < ed.maxwidth; i++)
            {
              ed.level[i+(j*ed.maxwidth)].warpdir=ed.kludgewarpdir[i+(j*ed.maxwidth)];
            }
          }
        }
      }
    }
#endif

    //Entity type 0 is player controled
    for (int ie = 0; ie < obj.nentity; ++ie)
    {
        if (obj.entities[ie].rule == 0)
        {
            if (game.hascontrol && game.deathseq == -1 && game.lifeseq <= 5)
            {
                if (game.press_map && !game.mapheld)
                {
                    game.mapheld = true;

                    if (game.activetele && game.readytotele > 20 && !game.intimetrial)
                    {
                        if(!graphics.flipmode)
                        {
                            obj.flags[73] = 1; //Flip mode test
                        }
                        if(int(std::abs(obj.entities[ie].vx))<=1 && int(obj.entities[ie].vy)==0)
                        {
                            //wait! space station 2 debug thingy
                            if (game.teleportscript != "")
                            {

                                //trace(game.recordstring);
                                //We're teleporting! Yey!
                                game.activetele = false;
                                game.hascontrol = false;
                                music.fadeout();

                                int player = obj.getplayer();
                                obj.entities[player].colour = 102;

                                int teleporter = obj.getteleporter();
                                obj.entities[teleporter].tile = 6;
                                obj.entities[teleporter].colour = 102;
                                //which teleporter script do we use? it depends on the companion!
                                game.state = 4000;
                                game.statedelay = 0;
                            }
                            else if (game.companion == 0)
                            {
                                //Alright, normal teleporting
                                game.gamestate = 5;
                                graphics.menuoffset = 240; //actually this should count the roomname
                                if (map.extrarow) graphics.menuoffset -= 10;

                                BlitSurfaceStandard(graphics.menubuffer,NULL,graphics.backBuffer, NULL);

                                graphics.resumegamemode = false;

                                game.useteleporter = true;
                                game.initteleportermode();
                            }
                            else
                            {
                                //We're teleporting! Yey!
                                game.activetele = false;
                                game.hascontrol = false;
                                music.fadeout();

                                int player = obj.getplayer();
                                obj.entities[player].colour = 102;
                                int companion = obj.getcompanion();
                                if(companion>-1) obj.entities[companion].colour = 102;

                                int teleporter = obj.getteleporter();
                                obj.entities[teleporter].tile = 6;
                                obj.entities[teleporter].colour = 102;
                                //which teleporter script do we use? it depends on the companion!
                                game.state = 3000;
                                game.statedelay = 0;
                            }
                        }
                    }
                    else if (game.activeactivity > -1)
                    {
                        if((int(std::abs(obj.entities[ie].vx))<=1) && (int(obj.entities[ie].vy) == 0) )
                        {
                            script.load(obj.blocks[game.activeactivity].script);
                            obj.removeblock(game.activeactivity);
                        }
                    }
                    else if (game.swnmode == 1 && game.swngame == 1)
                    {
                        //quitting the super gravitron
                        game.mapheld = true;
                        //Quit menu, same conditions as in game menu
                        game.gamestate = MAPMODE;
                        game.gamesaved = false;
                        graphics.resumegamemode = false;
                        game.menupage = 20; // The Map Page
                        BlitSurfaceStandard(graphics.menubuffer,NULL,graphics.backBuffer, NULL);
                        graphics.menuoffset = 240; //actually this should count the roomname
                        if (map.extrarow) graphics.menuoffset -= 10;
                    }
                    else if (game.intimetrial && graphics.fademode==0)
                    {
                        //Quick restart of time trial
                        script.hardreset();
                        if (graphics.setflipmode) graphics.flipmode = true;
                        graphics.fademode = 2;
                        game.completestop = true;
                        music.fadeout();
                        game.intimetrial = true;
                        game.quickrestartkludge = true;
                    }
                    else if (graphics.fademode==0)
                    {
                        //Normal map screen, do transition later
                        game.gamestate = MAPMODE;
                        map.cursordelay = 0;
                        map.cursorstate = 0;
                        game.gamesaved = false;
                        graphics.resumegamemode = false;
                        game.menupage = 0; // The Map Page
                        BlitSurfaceStandard(graphics.menubuffer,NULL,graphics.backBuffer, NULL);
                        graphics.menuoffset = 240; //actually this should count the roomname
                        if (map.extrarow) graphics.menuoffset -= 10;
                    }
                }

                if ((key.isDown(27) || key.isDown(game.controllerButton_esc)) && (!map.custommode || map.custommodeforreal))
                {
                    game.mapheld = true;
                    //Quit menu, same conditions as in game menu
                    game.gamestate = MAPMODE;
                    game.gamesaved = false;
                    graphics.resumegamemode = false;
                    game.menupage = 10; // The Map Page

                    BlitSurfaceStandard(graphics.menubuffer,NULL,graphics.backBuffer, NULL);
                    graphics.menuoffset = 240; //actually this should count the roomname
                    if (map.extrarow) graphics.menuoffset -= 10;
                }

                if (key.keymap[SDLK_r] && game.deathseq<=0)// && map.custommode) //Have fun glitchrunners!
                {
                    game.deathseq = 30;
                }

                if (game.press_left)
                {
                    game.tapleft++;
                }
                else
                {
                    if (game.tapleft <= 4 && game.tapleft > 0)
                    {
                        if (obj.entities[ie].vx < 0.0f)
                        {
                            obj.entities[ie].vx = 0.0f;
                        }
                    }
                    game.tapleft = 0;
                }
                if (game.press_right)
                {
                    game.tapright++;
                }
                else
                {
                    if (game.tapright <= 4 && game.tapright > 0)
                    {
                        if (obj.entities[ie].vx > 0.0f)
                        {
                            obj.entities[ie].vx = 0.0f;
                        }
                    }
                    game.tapright = 0;
                }


                if(game.press_left)
                {
                    obj.entities[ie].ax = -3;
                    obj.entities[ie].dir = 0;
                }
                else if (game.press_right)
                {
                    obj.entities[ie].ax = 3;
                    obj.entities[ie].dir = 1;
                }

                if (!game.press_action)
                {
                    game.jumppressed = 0;
                    game.jumpheld = false;
                }

                if (game.press_action && !game.jumpheld)
                {
                    game.jumppressed = 5;
                    game.jumpheld = true;
                }

                if (game.jumppressed > 0)
                {
                    game.jumppressed--;
                    if (obj.entities[ie].onground>0 && game.gravitycontrol == 0)
                    {
                        game.gravitycontrol = 1;
                        obj.entities[ie].vy = -4;
                        obj.entities[ie].ay = -3;
                        music.playef(0);
                        game.jumppressed = 0;
                        game.totalflips++;
                    }
                    if (obj.entities[ie].onroof>0 && game.gravitycontrol == 1)
                    {
                        game.gravitycontrol = 0;
                        obj.entities[ie].vy = 4;
                        obj.entities[ie].ay = 3;
                        music.playef(1);
                        game.jumppressed = 0;
                        game.totalflips++;
                    }
                }
            }
            else
            {
                //Simple detection of keypresses outside player control, will probably scrap this (expand on
                //advance text function)
                if (!game.press_action)
                {
                    game.jumppressed = 0;
                    game.jumpheld = false;
                }

                if (game.press_action && !game.jumpheld)
                {
                    game.jumppressed = 5;
                    game.jumpheld = true;
                }
            }
        }
    }
}

void mapinput()
{
    //TODO Mouse Input!
    //game.mx = (mouseX / 2);
    //game.my = (mouseY / 2);

    game.press_left = false;
    game.press_right = false;
    game.press_action = false;
    game.press_map = false;

    if(graphics.menuoffset==0)
    {
        if (graphics.flipmode)
        {
            if (key.isDown(KEYBOARD_LEFT) || key.isDown(KEYBOARD_DOWN) || key.isDown(KEYBOARD_a) ||  key.isDown(KEYBOARD_s) || key.controllerWantsLeft(false) ) game.press_left = true;
            if (key.isDown(KEYBOARD_RIGHT) || key.isDown(KEYBOARD_UP) || key.isDown(KEYBOARD_d) ||  key.isDown(KEYBOARD_w) || key.controllerWantsRight(false)) game.press_right = true;
        }
        else
        {
            if (key.isDown(KEYBOARD_LEFT) || key.isDown(KEYBOARD_UP) || key.isDown(KEYBOARD_a) ||  key.isDown(KEYBOARD_w)|| key.controllerWantsLeft(false))
            {
                game.press_left = true;
            }
            if (key.isDown(KEYBOARD_RIGHT) || key.isDown(KEYBOARD_DOWN) || key.isDown(KEYBOARD_d) ||  key.isDown(KEYBOARD_s)|| key.controllerWantsRight(false))
            {
                game.press_right = true;
            }
        }
        if (key.isDown(KEYBOARD_z) || key.isDown(KEYBOARD_SPACE) || key.isDown(KEYBOARD_v) || key.isDown(game.controllerButton_flip))
        {
            game.press_action = true;
        }
        if (game.menupage < 9)
        {
            if (key.isDown(KEYBOARD_ENTER) || key.isDown(game.controllerButton_map) ) game.press_map = true;
            if (key.isDown(27))
            {
                game.mapheld = true;
                game.menupage = 10;
            }
        }
        else
        {
            if (key.isDown(KEYBOARD_ENTER) || key.isDown(27)|| key.isDown(game.controllerButton_map) ) game.press_map = true;
        }

        //In the menu system, all keypresses are single taps rather than holds. Therefore this test has to be done for all presses
        if (!game.press_action && !game.press_left && !game.press_right)
        {
            game.jumpheld = false;
        }
        if (!game.press_map && !key.isDown(27))
        {
            game.mapheld = false;
        }
    }
    else
    {
        game.mapheld = true;
        game.jumpheld = true;
    }

    if (!game.mapheld)
    {
        if(game.press_map && game.menupage < 10)
        {
            //Normal map screen, do transition later
            graphics.resumegamemode = true;
        }
    }

    if (graphics.fademode == 1)
    {
        FillRect(graphics.menubuffer, 0x000000);
        graphics.resumegamemode = true;
        obj.removeallblocks();
        game.menukludge = false;
        if (game.menupage >= 20)
        {
            game.state = 96;
            game.statedelay = 0;
        }
        else
        {
            game.state = 80;
            game.statedelay = 0;
        }
    }

    if (!game.jumpheld)
    {
        if (game.press_action || game.press_left || game.press_right || game.press_map)
        {
            game.jumpheld = true;
        }

        if (game.press_left)
        {
            game.menupage--;
        }
        else if (game.press_right)
        {
            game.menupage++;
        }

        if (game.menupage == 1 && obj.flags[67] == 1 && game.press_action && !game.insecretlab && !map.custommode)
        {
            //Warp back to the ship
            graphics.resumegamemode = true;

            game.teleport_to_x = 2;
            game.teleport_to_y = 11;

            //trace(game.recordstring);
            //We're teleporting! Yey!
            game.activetele = false;
            game.hascontrol = false;

            int i = obj.getplayer();
            obj.entities[i].colour = 102;

            //which teleporter script do we use? it depends on the companion!
            game.state = 4000;
            game.statedelay = 0;
        }

        if (game.menupage == 3 && !game.gamesaved && game.press_action && !game.intimetrial
                && !game.nodeathmode && !game.insecretlab && !game.inintermission)
        {
            game.flashlight = 5;
            game.screenshake = 10;
            music.playef(18);
            game.gamesaved = true;

            game.savetime = game.timestring();
            game.savearea = map.currentarea(map.area(game.roomx, game.roomy));
            game.savetrinkets = game.trinkets;

            if (game.roomx >= 102 && game.roomx <= 104 && game.roomy >= 110 && game.roomy <= 111) game.savearea = "The Ship";

#if !defined(NO_CUSTOM_LEVELS)
            if(map.custommodeforreal)
            {
                game.customsavequick(ed.ListOfMetaData[game.playcustomlevel].filename);
            }
            else
#endif
            {
                game.savequick();
            }
        }

        if (game.menupage == 10 && game.press_action)
        {
            //return to game
            graphics.resumegamemode = true;
        }
        if (game.menupage == 11 && game.press_action)
        {
            //quit to menu
            if (graphics.fademode == 0)
            {
                //Kill contents of offset render buffer, since we do that for some reason.
                //This fixes an apparent frame flicker.
                FillRect(graphics.tempBuffer, 0x000000);
                if (game.intimetrial || game.insecretlab || game.nodeathmode) game.menukludge = true;
                script.hardreset();
                if(graphics.setflipmode) graphics.flipmode = true;
                graphics.fademode = 2;
                music.fadeout();
                map.nexttowercolour();
            }
        }

        if (game.menupage == 20 && game.press_action)
        {
            //return to game
            graphics.resumegamemode = true;
        }
        if (game.menupage == 21 && game.press_action)
        {
            //quit to menu
            if (graphics.fademode == 0)
            {
                game.swnmode = false;
                graphics.fademode = 2;
                music.fadeout();
            }
        }

        if (game.menupage < 0) game.menupage = 3;
        if (game.menupage > 3 && game.menupage < 9) game.menupage = 0;

        if (game.menupage == 9) game.menupage = 11;
        if (game.menupage == 12) game.menupage = 10;

        if (game.menupage == 19) game.menupage = 21;
        if (game.menupage == 22) game.menupage = 20;

    }
}

void teleporterinput()
{
    //Todo Mouseinput!
    //game.mx = (mouseX / 2);
    //game.my = (mouseY / 2);

    int tempx, tempy;

    game.press_left = false;
    game.press_right = false;
    game.press_action = false;
    game.press_map = false;

    if(graphics.menuoffset==0)
    {
        if (key.isDown(KEYBOARD_LEFT)|| key.isDown(KEYBOARD_a) || key.controllerWantsLeft(false) ) game.press_left = true;
        if (key.isDown(KEYBOARD_RIGHT) || key.isDown(KEYBOARD_d)|| key.controllerWantsRight(false) ) game.press_right = true;
        if (key.isDown(KEYBOARD_z) || key.isDown(KEYBOARD_SPACE) || key.isDown(KEYBOARD_v)
                || key.isDown(KEYBOARD_UP) || key.isDown(KEYBOARD_DOWN)||  key.isDown(KEYBOARD_w)||  key.isDown(KEYBOARD_s) || key.isDown(game.controllerButton_flip)) game.press_action = true;
        if (key.isDown(KEYBOARD_ENTER) || key.isDown(game.controllerButton_map)) game.press_map = true;

        //In the menu system, all keypresses are single taps rather than holds. Therefore this test has to be done for all presses
        if (!game.press_action && !game.press_left && !game.press_right) game.jumpheld = false;
        if (!game.press_map) game.mapheld = false;
    }
    else
    {
        game.mapheld = true;
        game.jumpheld = true;
    }

    if (!game.jumpheld)
    {
        if (game.press_action || game.press_left || game.press_right || game.press_map)
        {
            game.jumpheld = true;
        }

        if (game.press_left)
        {
            game.teleport_to_teleporter--;
            if (game.teleport_to_teleporter < 0) game.teleport_to_teleporter = map.numteleporters - 1;
            tempx = map.teleporters[game.teleport_to_teleporter].x;
            tempy = map.teleporters[game.teleport_to_teleporter].y;
            while (map.explored[tempx + (20 * tempy)] == 0)
            {
                game.teleport_to_teleporter--;
                if (game.teleport_to_teleporter < 0) game.teleport_to_teleporter = map.numteleporters - 1;
                tempx = map.teleporters[game.teleport_to_teleporter].x;
                tempy = map.teleporters[game.teleport_to_teleporter].y;
            }
        }
        else if (game.press_right)
        {
            game.teleport_to_teleporter++;
            if (game.teleport_to_teleporter >= map.numteleporters) game.teleport_to_teleporter = 0;
            tempx = map.teleporters[game.teleport_to_teleporter].x;
            tempy = map.teleporters[game.teleport_to_teleporter].y;
            while (map.explored[tempx + (20 * tempy)] == 0)
            {
                game.teleport_to_teleporter++;
                if (game.teleport_to_teleporter >= map.numteleporters) game.teleport_to_teleporter = 0;
                tempx = map.teleporters[game.teleport_to_teleporter].x;
                tempy = map.teleporters[game.teleport_to_teleporter].y;
            }
        }

        if (game.press_map)
        {
            tempx = map.teleporters[game.teleport_to_teleporter].x;
            tempy = map.teleporters[game.teleport_to_teleporter].y;
            if (game.roomx == tempx + 100 && game.roomy == tempy + 100)
            {
                //cancel!
                graphics.resumegamemode = true;
            }
            else
            {
                //teleport
                graphics.resumegamemode = true;
                game.teleport_to_x = tempx;
                game.teleport_to_y = tempy;

                //trace(game.recordstring);
                //We're teleporting! Yey!
                game.activetele = false;
                game.hascontrol = false;

                int i = obj.getplayer();
                obj.entities[i].colour = 102;

                i = obj.getteleporter();
                obj.entities[i].tile = 6;
                obj.entities[i].colour = 102;
                //which teleporter script do we use? it depends on the companion!
                game.state = 4000;
                game.statedelay = 0;
            }
        }
    }
}

void gamecompleteinput()
{
    game.press_left = false;
    game.press_right = false;
    game.press_action = false;
    game.press_map = false;

    if (key.isDown(KEYBOARD_z) || key.isDown(KEYBOARD_SPACE) || key.isDown(KEYBOARD_v) || key.isDown(game.controllerButton_flip))
    {
        game.creditposition -= 6;
        if (game.creditposition <= -game.creditmaxposition)
        {
            if(graphics.fademode==0)
            {
                graphics.fademode = 2;
            }
            game.creditposition = -game.creditmaxposition;
        }
        else
        {
            map.bypos += 6;
            map.bscroll = +6;
        }
        game.press_action = true;
    }
    if (key.isDown(KEYBOARD_ENTER)|| key.isDown(game.controllerButton_map)) game.press_map = true;

    if (!game.mapheld)
    {
        if(game.press_map)
        {
            //Return to game
            if(graphics.fademode==0)
            {
                graphics.fademode = 2;
            }
        }
    }
}

void gamecompleteinput2()
{
    game.press_left = false;
    game.press_right = false;
    game.press_action = false;
    game.press_map = false;


    if (key.isDown(KEYBOARD_z) || key.isDown(KEYBOARD_SPACE) || key.isDown(KEYBOARD_v) || key.isDown(game.controllerButton_flip))
    {
        game.creditposx++;
        if (game.creditposy >= 30)
        {
            if(graphics.fademode==0)
            {
                graphics.fademode = 2;
                music.fadeout();
            }
        }
        game.press_action = true;
    }
    if (key.isDown(KEYBOARD_ENTER) || key.isDown(game.controllerButton_map)) game.press_map = true;

    if (!game.mapheld)
    {
        if(game.press_map)
        {
            //Return to game
            if(graphics.fademode==0)
            {
                graphics.fademode = 2;
                music.fadeout();
            }
        }
    }
}
