]> git.jsancho.org Git - lugaru.git/blobdiff - Source/GameTick.cpp
merge
[lugaru.git] / Source / GameTick.cpp
index f662c5a36951a13297c2593c47d1cc9ea096fbd5..273c7f6d64c5411d49125def785bfccf8cb2897a 100644 (file)
@@ -27,6 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include <direct.h>
 #endif
 
+#include <limits>
 #include <ctime>
 #include "Game.h"
 #include "openal_wrapper.h"
@@ -77,7 +78,7 @@ extern bool keyboardfrozen;
 extern bool loadingstuff;
 extern XYZ windvector;
 extern bool debugmode;
-static int music1;
+static int leveltheme;
 extern int mainmenu;
 extern bool visibleloading;
 extern XYZ envsound[30];
@@ -495,7 +496,7 @@ static void ch_size(Game *game, const char *args)
 static int find_closest()
 {
   int closest = 0;
-  float closestdist = 1.0/0.0;
+  float closestdist = std::numeric_limits<float>::max();
 
   for (int i = 1; i < numplayers; i++) {
     float distance;
@@ -639,7 +640,7 @@ static void set_clothes(int pnum, Game *game, const char *args)
   char buf[64];
   snprintf(buf, 63, ":Data:Textures:%s.png", args);
 
-  if (!game->AddClothes(buf,0,1,&player[pnum].skeleton.skinText[pnum],&player[pnum].skeleton.skinsize))
+  if (!game->AddClothes(buf,&player[pnum].skeleton.skinText[pnum]))
     return;
 
   player[pnum].DoMipmaps();
@@ -1129,8 +1130,6 @@ void Screenshot   (void)
        save_image(temp);
 }
 
-
-
 void Game::SetUpLighting(){
        if(environment==snowyenvironment)
         light.setColors(.65,.65,.7,.4,.4,.44);
@@ -1262,7 +1261,7 @@ int Game::checkcollide(XYZ startpoint,XYZ endpoint,int what){
        return -1;
 }
 
-void   Game::Setenvironment(int which)
+void Game::Setenvironment(int which)
 {
        LOGFUNC;
 
@@ -1271,9 +1270,9 @@ void      Game::Setenvironment(int which)
        float temptexdetail;
        environment=which;
 
-       pause_sound(stream_music1snow);
-       pause_sound(stream_music1grass);
-       pause_sound(stream_music1desert);
+       pause_sound(stream_snowtheme);
+       pause_sound(stream_grasstheme);
+       pause_sound(stream_deserttheme);
        pause_sound(stream_wind);
        pause_sound(stream_desertambient);
 
@@ -1316,8 +1315,7 @@ void      Game::Setenvironment(int which)
 
 
                texdetail=temptexdetail;
-       }
-       if(environment==desertenvironment){
+       } else if(environment==desertenvironment){
                windvector=0;
                windvector.z=2;
                LoadTexture(":Data:Textures:deserttree.png",&objects.treetextureptr,0,1);
@@ -1355,8 +1353,7 @@ void      Game::Setenvironment(int which)
 
 
                texdetail=temptexdetail;
-       }
-       if(environment==grassyenvironment){
+       } else if(environment==grassyenvironment){
                windvector=0;
                windvector.z=2;
                LoadTexture(":Data:Textures:tree.png",&objects.treetextureptr,0,1);
@@ -1400,27 +1397,24 @@ void    Game::Setenvironment(int which)
        texdetail=temptexdetail;
 }
 
-
 void Game::Loadlevel(int which){
        stealthloading=0;
        whichlevel=which;
 
-       if (which == -1) {
+       if(which == -1){
            tutoriallevel = -1;
            Loadlevel("tutorial");
-       } else if (which >= 0 && which <= 15) {
+       }else if(which >= 0 && which <= 15){
            char buf[32];
            snprintf(buf, 32, "map%d", which + 1);
            Loadlevel(buf);
-       } else
+       }else
            Loadlevel("mapsave");
 }
 
 void Game::Loadlevel(const char *name){
-       static int oldlevel;
        int templength;
        float lamefloat;
-       int lameint;
        static const char *pfx = ":Data:Maps:";
        char *buf;
 
@@ -1452,8 +1446,6 @@ void Game::Loadlevel(const char *name){
                tutorialmaxtime=1;
        }
        loadingstuff=1;
-       if(!firstload)
-               oldlevel=50;
        pause_sound(whooshsound);
        pause_sound(stream_firesound);
 
@@ -1642,8 +1634,6 @@ void Game::Loadlevel(const char *name){
                     funpackf(tfile, "Bf", &dialogueboxcolor[k][l][2]);
                     funpackf(tfile, "Bi", &dialogueboxsound[k][l]);
 
-                    bool doneread;
-
                     funpackf(tfile, "Bi",&templength);
                     if(templength>128||templength<=0)
                         templength=128;
@@ -1723,11 +1713,11 @@ void Game::Loadlevel(const char *name){
 
                        float maxdistance=0;
                        float tempdist;
-                       int whichclosest;
+                       //~ int whichclosest;
                        for(int i=0;i<objects.numobjects;i++){
                                tempdist=findDistancefast(&objects.center,&objects.position[i]);
                                if(tempdist>maxdistance){
-                                       whichclosest=i;
+                                       //~ whichclosest=i;
                                        maxdistance=tempdist;
                                }
                        }
@@ -1879,9 +1869,6 @@ void Game::Loadlevel(const char *name){
 
                fclose(tfile);
 
-               oldlevel=whichlevel;
-
-
                if(numplayers>maxplayers-1)
             numplayers=maxplayers-1;
                for(int i=0;i<numplayers;i++){
@@ -1945,8 +1932,8 @@ void Game::Loadlevel(const char *name){
                        }
 
 
-                       int texsize;
-                       texsize=512*512*3/texdetail/texdetail;
+                       //~ int texsize;
+                       //~ texsize=512*512*3/texdetail/texdetail;
 
                        LoadTextureSave(creatureskin[player[i].creature][player[i].whichskin],&player[i].skeleton.drawmodel.textureptr,1,&player[i].skeleton.skinText[0],&player[i].skeleton.skinsize);
 
@@ -1955,7 +1942,7 @@ void Game::Loadlevel(const char *name){
                                        tintr=player[i].clothestintr[j];
                                        tintg=player[i].clothestintg[j];
                                        tintb=player[i].clothestintb[j];
-                                       AddClothes((char *)player[i].clothes[j],0,1,&player[i].skeleton.skinText[0],&player[i].skeleton.skinsize);
+                                       AddClothes((char *)player[i].clothes[j],&player[i].skeleton.skinText[0]);
                                }
                                player[i].DoMipmaps();
                        }
@@ -2126,402 +2113,356 @@ void Game::Loadlevel(const char *name){
        visibleloading=0;
 }
 
-
-
+/*
+Values of mainmenu :
+1 Main menu
+2 Menu pause (resume/end game)
+3 Option menu
+4 Controls configuration menu
+5 Main game menu (choose level or challenge)
+6 Deleting user menu
+7 User managment menu (select/add)
+8 Choose difficulty menu
+9 Challenge level selection menu
+10 End of the campaign congratulation (is that really a menu?)
+11 Same that 9 ??? => unused
+18 stereo configuration
+*/
+    
 void Game::MenuTick(){
     //menu buttons
-    if(mainmenu==1||mainmenu==2){
-        if(Input::MouseClicked()&&selected==1){
-            if(!gameon){
-                fireSound(firestartsound);
-                flash();
-                //new game
-                if(accountactive) {
-                    mainmenu=5;
-                } else {
-                    mainmenu=7;
-                }
-                selected=-1;
-            }else{
-                //resume
-                mainmenu=0;
-                pause_sound(stream_music3);
-                resume_stream(music1);
-            }
-        }
-
-        if(Input::MouseClicked()&&selected==2){
-            fireSound();
-            flash();
-            //options
-            mainmenu=3;
-            if(newdetail>2)newdetail=detail;
-            if(newdetail<0)newdetail=detail;
-            if(newscreenwidth>3000)newscreenwidth=screenwidth;
-            if(newscreenwidth<0)newscreenwidth=screenwidth;
-            if(newscreenheight>3000)newscreenheight=screenheight;
-            if(newscreenheight<0)newscreenheight=screenheight;
-        }
-
-        if(Input::MouseClicked()&&selected==3){
-            fireSound();
-            flash();
-            if(!gameon){
-                //quit
-                tryquit=1;
-                pause_sound(stream_music3);
-            }else{
-                //end game
-                gameon=0;
-                mainmenu=1;
-            }
-        }
-    }
-    if(mainmenu==3){
-        if(Input::MouseClicked()){
-
-            if(selected!=-1)
-                fireSound();
-
-            switch(selected){
-                case 0: {
-                    extern SDL_Rect **resolutions;
-                    bool isCustomResolution = true;
-                    bool found = false;
-                    for(int i = 0; (!found) && (resolutions[i]); i++){
-                        if((resolutions[i]->w == screenwidth) && (resolutions[i]->h == screenwidth))
-                            isCustomResolution = false;
-
-                        if((resolutions[i]->w == newscreenwidth) && (resolutions[i]->h == newscreenheight)){
-                            i++;
-                            if(resolutions[i] != NULL){
-                                newscreenwidth = (int) resolutions[i]->w;
-                                newscreenheight = (int) resolutions[i]->h;
-                            }else if(isCustomResolution){
-                                if((screenwidth == newscreenwidth) && (screenheight == newscreenheight)){
-                                    newscreenwidth = (int) resolutions[0]->w;
-                                    newscreenheight = (int) resolutions[0]->h;
-                                }else{
-                                    newscreenwidth = screenwidth;
-                                    newscreenheight = screenheight;
-                                }
-                            }else{
-                                newscreenwidth = (int) resolutions[0]->w;
-                                newscreenheight = (int) resolutions[0]->h;
-                            }
-                            found = true;
-                        }
-                    }
-
-                    if(!found){
-                        newscreenwidth = (int) resolutions[0]->w;
-                        newscreenheight = (int) resolutions[0]->h;
-                    }
-                    } break;
-                case 1:
-                    newdetail++;
-                    if(newdetail>2)newdetail=0;
-                    break;
-                case 2:
-                    bloodtoggle++;
-                    if(bloodtoggle>2)bloodtoggle=0;
-                    break;
-                case 3:
-                    difficulty++;
-                    if(difficulty>2)difficulty=0;
-                    break;
-                case 4:
-                    ismotionblur=1-ismotionblur;
-                    break;
-                case 5:
-                    decals=1-decals;
-                    break;
-                case 6:
-                    musictoggle=1-musictoggle;
-
-                    if(!musictoggle){
-                        pause_sound(music1);
-                        pause_sound(stream_music2);
-                        pause_sound(stream_music3);
-
-                        for(int i=0;i<4;i++){
-                            oldmusicvolume[i]=0;
-                            musicvolume[i]=0;
-                        }
-                    }
-
-                    if(musictoggle)
-                      emit_stream_np(stream_music3);
-                    break;
-                case 7:
-                    flash();
-                    //options
-                    mainmenu=4;
-                    selected=-1;
-                    keyselect=-1;
-                    break;
-                case 8:
-                    flash();
-
-                    if(newdetail>2)newdetail=detail;
-                    if(newdetail<0)newdetail=detail;
-                    if(newscreenwidth<0)newscreenwidth=screenwidth;
-                    if(newscreenheight<0)newscreenheight=screenheight;
-
-                    SaveSettings(*this);
-                    if(mainmenu==3&&gameon)mainmenu=2;
-                    if(mainmenu==3&&!gameon)mainmenu=1;
-                    break;
-                case 9:
-                    invertmouse=1-invertmouse;
-                    break;
-                case 10:
-                    usermousesensitivity+=.2;
-                    if(usermousesensitivity>2)usermousesensitivity=.2;
-                    break;
-                case 11:
-                    volume+=.1f;
-                    if(volume>1.0001f)volume=0;
-                    OPENAL_SetSFXMasterVolume((int)(volume*255));
-                    break;
-                case 12:
-                    flash();
-                    
-                    newstereomode = stereomode;
-                    mainmenu=18;
-                    keyselect=-1;
-                    break;
-                case 13:
-                    showdamagebar=!showdamagebar;
-                    break;
-            }
-        }
-    }
-    if(mainmenu==4){
-        if(Input::MouseClicked()&&selected!=-1&&!waiting){
-            fireSound();
-            if(selected<9&&keyselect==-1)
-                keyselect=selected;
-            if(keyselect!=-1)
-                setKeySelected();
-            if(selected==9){
-                flash();
-
-                mainmenu=3;
-
-                if(newdetail>2)newdetail=detail;
-                if(newdetail<0)newdetail=detail;
-                if(newscreenwidth>3000)newscreenwidth=screenwidth;
-                if(newscreenwidth<0)newscreenwidth=screenwidth;
-                if(newscreenheight>3000)newscreenheight=screenheight;
-                if(newscreenheight<0)newscreenheight=screenheight;
-            }
-        }
-    }
+    
+    // some specific case where we do something even if the left mouse button is not pressed.
+       if((mainmenu==5) && (endgame==2)) {
+               accountactive->endGame();
+               endgame=0;
+       }
+       if(mainmenu==10)
+               endgame=2;
+       if( (mainmenu==18) && Input::isKeyPressed(MOUSEBUTTON2) && (selected==1) )
+               stereoseparation-=0.001;
+               
+    if(Input::MouseClicked() && (selected >= 0)) { // handling of the left mouse clic in menus
+               switch(mainmenu) {
+                       case 1:
+                       case 2:
+                               switch(selected) {
+                                       case 1:
+                                               if(gameon) { //resume
+                                                       mainmenu=0;
+                                                       pause_sound(stream_menutheme);
+                                                       resume_stream(leveltheme);
+                                               } else { //new game
+                                                       fireSound(firestartsound);
+                                                       flash();
+                                                       mainmenu=(accountactive?5:7);
+                                                       selected=-1;
+                                               }
+                                               break;
+                                       case 2: //options
+                                               fireSound();
+                                               flash();
+                                               mainmenu=3;
+                                               if(newdetail>2) newdetail=detail;
+                                               if(newdetail<0) newdetail=detail;
+                                               if(newscreenwidth>3000) newscreenwidth=screenwidth;
+                                               if(newscreenwidth<0) newscreenwidth=screenwidth;
+                                               if(newscreenheight>3000) newscreenheight=screenheight;
+                                               if(newscreenheight<0) newscreenheight=screenheight;
+                                               break;
+                                       case 3:
+                                               fireSound();
+                                               flash();
+                                               if(gameon){ //end game
+                                                       gameon=0;
+                                                       mainmenu=1;
+                                               } else { //quit
+                                                       tryquit=1;
+                                                       pause_sound(stream_menutheme);
+                                               }
+                                               break;
+                               }
+                               break;
+                       case 3:
+                               fireSound();
+                               bool isCustomResolution,found;
+                               switch(selected){
+                                       case 0:
+                                               extern SDL_Rect **resolutions;
+                                               isCustomResolution = true;
+                                               found = false;
+                                               for(int i = 0; (!found) && (resolutions[i]); i++) {
+                                                       if((resolutions[i]->w == screenwidth) && (resolutions[i]->h == screenwidth))
+                                                               isCustomResolution = false;
+
+                                                       if((resolutions[i]->w == newscreenwidth) && (resolutions[i]->h == newscreenheight)) {
+                                                               i++;
+                                                               if(resolutions[i] != NULL) {
+                                                                       newscreenwidth = (int) resolutions[i]->w;
+                                                                       newscreenheight = (int) resolutions[i]->h;
+                                                               } else if(isCustomResolution){
+                                                                       if((screenwidth == newscreenwidth) && (screenheight == newscreenheight)) {
+                                                                               newscreenwidth = (int) resolutions[0]->w;
+                                                                               newscreenheight = (int) resolutions[0]->h;
+                                                                       } else {
+                                                                               newscreenwidth = screenwidth;
+                                                                               newscreenheight = screenheight;
+                                                                       }
+                                                               } else {
+                                                                       newscreenwidth = (int) resolutions[0]->w;
+                                                                       newscreenheight = (int) resolutions[0]->h;
+                                                               }
+                                                               found = true;
+                                                       }
+                                               }
 
-    if(mainmenu==5){
+                                               if(!found) {
+                                                       newscreenwidth = (int) resolutions[0]->w;
+                                                       newscreenheight = (int) resolutions[0]->h;
+                                               }
+                                               break;
+                                       case 1:
+                                               newdetail++;
+                                               if(newdetail>2) newdetail=0;
+                                               break;
+                                       case 2:
+                                               bloodtoggle++;
+                                               if(bloodtoggle>2) bloodtoggle=0;
+                                               break;
+                                       case 3:
+                                               difficulty++;
+                                               if(difficulty>2) difficulty=0;
+                                               break;
+                                       case 4:
+                                               ismotionblur = !ismotionblur;
+                                               break;
+                                       case 5:
+                                               decals = !decals;
+                                               break;
+                                       case 6:
+                                               musictoggle = !musictoggle;
+
+                                               if(musictoggle) {
+                                                 emit_stream_np(stream_menutheme);
+                                               } else {
+                                                       pause_sound(leveltheme);
+                                                       pause_sound(stream_fighttheme);
+                                                       pause_sound(stream_menutheme);
+
+                                                       for(int i=0;i<4;i++){
+                                                               oldmusicvolume[i]=0;
+                                                               musicvolume[i]=0;
+                                                       }
+                                               }
 
-        if(endgame==2){
-            accountactive->endGame();
-            endgame=0;
-        }
+                                               break;
+                                       case 7: // controls
+                                               flash();
+                                               mainmenu=4;
+                                               selected=-1;
+                                               keyselect=-1;
+                                               break;
+                                       case 8:
+                                               flash();
+                                               
+                                               SaveSettings(*this);
+                                               mainmenu=gameon?2:1;
+                                               break;
+                                       case 9:
+                                               invertmouse = !invertmouse;
+                                               break;
+                                       case 10:
+                                               usermousesensitivity+=.2;
+                                               if(usermousesensitivity>2) usermousesensitivity=.2;
+                                               break;
+                                       case 11:
+                                               volume+=.1f;
+                                               if(volume>1.0001f) volume=0;
+                                               OPENAL_SetSFXMasterVolume((int)(volume*255));
+                                               break;
+                                       case 12:
+                                               flash();
+                                               
+                                               newstereomode = stereomode;
+                                               mainmenu=18;
+                                               keyselect=-1;
+                                               break;
+                                       case 13:
+                                               showdamagebar = !showdamagebar;
+                                               break;
+                               }
+                               break;
+                       case 4:
+                               if(!waiting) {
+                                       fireSound();
+                                       if(selected<9 && keyselect==-1)
+                                               keyselect=selected;
+                                       if(keyselect!=-1)
+                                               setKeySelected();
+                                       if(selected==9){
+                                               flash();
 
-        if(Input::MouseClicked()){
-            if((selected-7>=accountactive->getCampaignChoicesMade())){
-                fireSound();
-                flash();
-                startbonustotal=0;
-
-                loading=2;
-                loadtime=0;
-                targetlevel=7;
-                if(firstload) TickOnceAfter();
-                else LoadStuff();
-                whichchoice=selected-7-accountactive->getCampaignChoicesMade();
-                visibleloading=1;
-                stillloading=1;
-                Loadlevel(campaignmapname[campaignchoicewhich[selected-7-accountactive->getCampaignChoicesMade()]]);
-                //Loadlevel(campaignmapname[levelorder[selected-7]]);
-                campaign=1;
-                mainmenu=0;
-                gameon=1;
-                pause_sound(stream_music3);
-            }
-            if(selected>=1 && selected<=5){
-                fireSound();
-                flash();
-            }
-            switch(selected){
-                case 1:
-                    startbonustotal=0;
-
-                    loading=2;
-                    loadtime=0;
-                    targetlevel=-1;
-                    if(firstload)TickOnceAfter();
-                    if(!firstload)LoadStuff();
-                    else {
-                        Loadlevel(-1);
-                    }
+                                               mainmenu=3;
+                                       }
+                               }
+                               break;
+                       case 5:
+                               fireSound();
+                               flash();
+                               if((selected-7 >= accountactive->getCampaignChoicesMade())) {
+                                       startbonustotal=0;
 
-                    mainmenu=0;
-                    gameon=1;
-                    pause_sound(stream_music3);
-                    break;
-                case 2:
-                    mainmenu=9;
-                    break;
-                case 3:
-                    mainmenu=6;
-                    break;
-                case 4:
-                    if(mainmenu==5&&gameon)mainmenu=2;
-                    if(mainmenu==5&&!gameon)mainmenu=1;
-                    break;
-                case 5:
-                    mainmenu=7;
-                    break;
-            }
-        }
-    }
-    else if(mainmenu==9){
-        if(Input::MouseClicked()&&selected<numchallengelevels&&selected>=0&&selected<=accountactive->getProgress()){
-            fireSound();
-            flash();
-
-            startbonustotal=0;
-
-            loading=2;
-            loadtime=0;
-            targetlevel=selected;
-            if(firstload)TickOnceAfter();
-            if(!firstload)LoadStuff();
-            else {
-                Loadlevel(selected);
-            }
-            campaign=0;
+                                       loading=2;
+                                       loadtime=0;
+                                       targetlevel=7;
+                                       if(firstload)
+                                               TickOnceAfter();
+                                       else
+                                               LoadStuff();
+                                       whichchoice=selected-7-accountactive->getCampaignChoicesMade();
+                                       visibleloading=1;
+                                       stillloading=1;
+                                       Loadlevel(campaignmapname[campaignchoicewhich[selected-7-accountactive->getCampaignChoicesMade()]]);
+                                       campaign=1;
+                                       mainmenu=0;
+                                       gameon=1;
+                                       pause_sound(stream_menutheme);
+                               }
+                               switch(selected){
+                                       case 1:
+                                               startbonustotal=0;
+
+                                               loading=2;
+                                               loadtime=0;
+                                               targetlevel=-1;
+                                               if(firstload) {
+                                                       TickOnceAfter();
+                                                       Loadlevel(-1);
+                                               } else
+                                                       LoadStuff();
+
+                                               mainmenu=0;
+                                               gameon=1;
+                                               pause_sound(stream_menutheme);
+                                               break;
+                                       case 2:
+                                               mainmenu=9;
+                                               break;
+                                       case 3:
+                                               mainmenu=6;
+                                               break;
+                                       case 4:
+                                               mainmenu=(gameon?2:1);
+                                               break;
+                                       case 5:
+                                               mainmenu=7;
+                                               break;
+                               }
+                               break;
+                       case 6:
+                               fireSound();
+                               if(selected==1) {
+                                       flash();
+                                       accountactive = Account::destroy(accountactive);
+                                       mainmenu=7;
+                               } else if(selected==2) {
+                                       flash();
+                                       mainmenu=5;
+                               }
+                               break;
+                       case 7:
+                               fireSound();
+                               if(selected==0 && Account::getNbAccounts()<8){
+                                       entername=1;
+                               } else if (selected < Account::getNbAccounts()+1) {
+                                       flash();
+                                       mainmenu=5;
+                                       accountactive=Account::get(selected-1);
+                               } else if (selected == Account::getNbAccounts()+1) {
+                                       flash();
+                                       mainmenu=5;
+                                       for(int j=0;j<255;j++){
+                                               displaytext[0][j]=0;
+                                       }
+                                       displaychars[0]=0;
+                                       displayselected=0;
+                                       entername=0;
+                               }
+                               break;
+                       case 8:
+                               fireSound();
+                               flash();
+                               if(selected<=2)
+                                       accountactive->setDifficulty(selected);
+                               mainmenu=5;
+                               break;
+                       case 9:
+                               if(selected<numchallengelevels && selected<=accountactive->getProgress()){
+                                       fireSound();
+                                       flash();
 
-            mainmenu=0;
-            gameon=1;
-            pause_sound(stream_music3);
-        }
-        if(Input::MouseClicked()&&selected==numchallengelevels){
-            fireSound();
-            flash();
-            mainmenu=5;
-        }
-    }
-    if(mainmenu==10){
-        endgame=2;
-        if(Input::MouseClicked()&&selected==3){
-            fireSound();
-            flash();
-            mainmenu=5;
-        }
-    }
+                                       startbonustotal=0;
 
-    if(mainmenu==6){
-        if(Input::MouseClicked()) {
-            if(selected>-1){
-                fireSound();
-                if(selected==1) {
-                    flash();
-                    accountactive = Account::destroy(accountactive);
-                    mainmenu=7;
-                } else if(selected==2) {
-                    flash();
-                    mainmenu=5;
-                }
-            }
-        }
-    }
-    if(mainmenu==7){
-        if(Input::MouseClicked()) {
-            if(selected!=-1){
-                fireSound();
-                if(selected==0&&Account::getNbAccounts()<8){
-                    entername=1;
-                } else if (selected<Account::getNbAccounts()+1) {
-                    accountactive=Account::get(selected-1);
-                    mainmenu=5;
-                    flash();
-                } else if (selected==Account::getNbAccounts()+1) {
-                    flash();
-
-                    mainmenu=1;
-
-                    for(int j=0;j<255;j++){
-                        displaytext[0][j]=' ';
-                    }
-                    displaychars[0]=0;
-                    displayselected=0;
-                    entername=0;
-                }
-            }
-        }
-    }
-    if(mainmenu==8){
-        if(Input::MouseClicked()&&selected>-1){
-            fireSound();
-            flash();
-            if(selected<=2)
-                accountactive->setDifficulty(selected);
-            mainmenu=5;
-        }
-    }
-    if (mainmenu==18) {                        
-        if(Input::MouseClicked()&&selected==0) {
-            newstereomode = (StereoMode)(newstereomode + 1);
-            while(!CanInitStereo(newstereomode)) {
-                printf("Failed to initialize mode %s (%i)\n", StereoModeName(newstereomode), newstereomode);
-                newstereomode = (StereoMode)(newstereomode + 1);
-                if ( newstereomode >= stereoCount ) {
-                    newstereomode = stereoNone;
-                }
-            }
-        }
-        
-        if(Input::isKeyPressed(MOUSEBUTTON1)&&selected==1)
-            stereoseparation+=0.001;
-        if(Input::isKeyPressed(MOUSEBUTTON2)&&selected==1)
-            stereoseparation-=0.001;
+                                       loading=2;
+                                       loadtime=0;
+                                       targetlevel=selected;
+                                       if(firstload)TickOnceAfter();
+                                       if(!firstload)LoadStuff();
+                                       else Loadlevel(selected);
+                                       campaign=0;
 
-        if(Input::MouseClicked()&&selected==2) {
-            stereoreverse =! stereoreverse;
-        }
-        
-        if(Input::MouseClicked()&&selected==3) {
-            flash();
+                                       mainmenu=0;
+                                       gameon=1;
+                                       pause_sound(stream_menutheme);
+                               }
+                               if(selected==numchallengelevels){
+                                       fireSound();
+                                       flash();
+                                       mainmenu=5;
+                               }
+                               break;
+                       case 10:
+                               if(selected==3){
+                                       fireSound();
+                                       flash();
+                                       mainmenu=5;
+                               }
+                               break;
+                       case 18:
+                               if(selected==1)
+                                       stereoseparation+=0.001;
+                               else {
+                                       fireSound();
+                                       if(selected==0){
+                                               newstereomode = (StereoMode)(newstereomode + 1);
+                                               while(!CanInitStereo(newstereomode)){
+                                                       printf("Failed to initialize mode %s (%i)\n", StereoModeName(newstereomode), newstereomode);
+                                                       newstereomode = (StereoMode)(newstereomode + 1);
+                                                       if(newstereomode >= stereoCount)
+                                                               newstereomode = stereoNone;
+                                               }
+                                       } else if(selected==2) {
+                                               stereoreverse = !stereoreverse;
+                                       } else if(selected==3) {
+                                               flash();
+                                               mainmenu=3;
 
-            stereomode = newstereomode;
-            InitStereo(stereomode);
-            
-            mainmenu=3;
-        }
-    }
+                                               stereomode = newstereomode;
+                                               InitStereo(stereomode);
+                                       }
+                               }
+                               break;
+               }
+       }
 
-    if(Input::isKeyDown(SDLK_q)&&Input::isKeyDown(SDLK_LMETA)){
+    if(Input::isKeyDown(SDLK_q) && Input::isKeyDown(SDLK_LMETA)){
         tryquit=1;
-        if(mainmenu==3){
-            if(newdetail>2)newdetail=detail;
-            if(newdetail<0)newdetail=detail;
-            if(newscreenwidth<0)newscreenwidth=screenwidth;
-            if(newscreenheight<0)newscreenheight=screenheight;
-
+        if(mainmenu==3) {
             SaveSettings(*this);
         }
     }
 
-    if(mainmenu==1||mainmenu==2){
-        if(loaddistrib>4)transition+=multiplier/8;
-        if(transition>1){
-            transition=0;
-            anim++;
-            if(anim>4)anim=0;
-            loaddistrib=0;
-        }
-    }
-    OPENAL_SetFrequency(channels[stream_music3], 22050);
+    OPENAL_SetFrequency(channels[stream_menutheme], 22050);
 
     if(entername) {
         inputText(displaytext[0],&displayselected,&displaychars[0]);
@@ -2536,7 +2477,7 @@ void Game::MenuTick(){
                 fireSound(firestartsound);
 
                 for(int i=0;i<255;i++){
-                    displaytext[0][i]=' ';
+                    displaytext[0][i]=0;
                 }
                 displaychars[0]=0;
 
@@ -2948,60 +2889,9 @@ void Game::doTutorial(){
     }
 }
 
-
-
 void Game::doDebugKeys(){
        float headprop,bodyprop,armprop,legprop;
     if(debugmode){
-               if(Input::isKeyPressed(SDLK_v)){
-                       freeze=1-freeze;
-                       if(freeze){
-                               OPENAL_SetFrequency(OPENAL_ALL, 0.001);
-                       }
-               }
-
-               if(Input::isKeyPressed(SDLK_BACKQUOTE)){
-                       console=1-console;
-                       if(console){
-                               OPENAL_SetFrequency(OPENAL_ALL, 0.001);
-                       } else {
-                               freeze=0;
-                               waiting=false;
-                       }
-               }
-
-               if(console)
-            freeze=1;
-               if(console&&!Input::isKeyDown(SDLK_LMETA)){
-                       inputText(consoletext[0],&consoleselected,&consolechars[0]);
-                       if(!waiting) {
-                               archiveselected=0;
-                               cmd_dispatch(this, consoletext[0]);
-                               if(consolechars[0]>0){
-
-                                       for(int k=14;k>=1;k--){
-                                               for(int j=0;j<255;j++){
-                                                       consoletext[k][j]=consoletext[k-1][j];
-                                               }
-                                               consolechars[k]=consolechars[k-1];
-                                       }
-                                       for(int j=0;j<255;j++){
-                                               consoletext[0][j]=' ';
-                                       }
-                                       consolechars[0]=0;
-                                       consoleselected=0;
-                               }
-                       }
-
-                       consoleblinkdelay-=multiplier;
-                       if(consoleblinkdelay<=0){
-                               consoleblinkdelay=.3;
-                               consoleblink=1-consoleblink;
-                       }
-               }
-
-
-
         if(Input::isKeyPressed(SDLK_h)){
             player[0].damagetolerance=200000;
             player[0].damage=0;
@@ -3148,7 +3038,7 @@ void Game::doDebugKeys(){
                     tintr=player[closest].clothestintr[i];
                     tintg=player[closest].clothestintg[i];
                     tintb=player[closest].clothestintb[i];
-                    AddClothes((char *)player[closest].clothes[i],0,1,&player[closest].skeleton.skinText[0],&player[closest].skeleton.skinsize);
+                    AddClothes((char *)player[closest].clothes[i],&player[closest].skeleton.skinText[0]);
                 }
                 player[closest].DoMipmaps();
             }
@@ -3418,9 +3308,6 @@ void Game::doDebugKeys(){
         }
 
         if(Input::isKeyPressed(SDLK_n)&&Input::isKeyDown(SDLK_LCTRL)){
-            int closest=-1;
-            float closestdist=-1;
-            float distance;
             for(int i=0;i<objects.numobjects;i++){
                 if(objects.type[i]==treeleavestype){
                     objects.scale[i]*=.9;
@@ -3628,7 +3515,7 @@ void Game::doDebugKeys(){
                             tintr=player[numplayers].clothestintr[i];
                             tintg=player[numplayers].clothestintg[i];
                             tintb=player[numplayers].clothestintb[i];
-                            AddClothes((char *)player[numplayers].clothes[i],0,1,&player[numplayers].skeleton.skinText[0],&player[numplayers].skeleton.skinsize);
+                            AddClothes((char *)player[numplayers].clothes[i],&player[numplayers].skeleton.skinText[0]);
                         }
                     if(player[numplayers].numclothes){
                         player[numplayers].DoMipmaps();
@@ -3792,8 +3679,6 @@ void Game::doDebugKeys(){
     }
 }
 
-
-
 void Game::doJumpReversals(){
     for(int k=0;k<numplayers;k++)
         for(int i=k;i<numplayers;i++){
@@ -4690,7 +4575,7 @@ void Game::doAttacks(){
                                                          player[i].skeleton.longdead<300&&
                                                          player[k].lastattack!=spinkickanim&&
                                                          player[i].skeleton.free)&&
-                                                        (!player[i].dead||musictype!=stream_music2)){
+                                                        (!player[i].dead||musictype!=stream_fighttheme)){
                                                     player[k].targetanimation=dropkickanim;
                                                     for(int j=0;j<terrain.numdecals;j++){
                                                         if((terrain.decaltype[j]==blooddecal||terrain.decaltype[j]==blooddecalslow)&&
@@ -5002,8 +4887,6 @@ void Game::doPlayerCollisions(){
             }
 }
 
-
-
 void Game::doAI(int i){
     static bool connected;
     if(player[i].aitype!=playercontrolled&&indialogue==-1){
@@ -5979,14 +5862,10 @@ void Game::doAI(int i){
     }
 }
 
-
-
 void Game::Tick(){
        static XYZ facing,flatfacing;
        static int target;
 
-       int templength;
-
        for(int i=0;i<15;i++){
                displaytime[i]+=multiplier;
        }
@@ -6029,60 +5908,68 @@ void Game::Tick(){
                emit_sound_np(consolefailsound, 128.);
        }
 
+    /*
+    Values of mainmenu :
+    1 Main menu
+    2 Menu pause (resume/end game)
+    3 Option menu
+    4 Controls configuration menu
+    5 Main game menu (choose level or challenge)
+    6 Deleting user menu
+    7 User managment menu (select/add)
+    8 Choose difficulty menu
+    9 Challenge level selection menu
+    10 End of the campaign congratulation (is that really a menu?)
+    11 Same that 9 ??? => unused
+    18 stereo configuration
+    */
+        
        if(!console){
-               if(mainmenu&&endgame==1)mainmenu=10;
-        // menu back
-               if( (Input::isKeyPressed(SDLK_ESCAPE)
-                    ||(mainmenu==0
-                        &&((Input::isKeyPressed(jumpkey)
-                                ||Input::isKeyPressed(SDLK_SPACE)
-                                ||(campaign)))
-                        &&campaign
-                        &&winfreeze))
-                && (!mainmenu||gameon||mainmenu==3||mainmenu==4||mainmenu==5||mainmenu==6||(mainmenu==7&&!entername)||mainmenu==9||mainmenu==10)){
+        //campaign over?
+               if(mainmenu&&endgame==1)
+            mainmenu=10;
+        //escape key pressed
+        //TODO: there must be code somewhere else that handles clicking the Back button, merge it with this
+               if(Input::isKeyPressed(SDLK_ESCAPE)&&
+                (gameon||mainmenu==0||(mainmenu>=3&&mainmenu!=8&&!(mainmenu==7&&entername)))){
                        selected=-1;
-                       if(mainmenu==1||mainmenu==2||mainmenu==0){
-                               if(mainmenu==0&&!winfreeze)mainmenu=2;
-                               else if(mainmenu==0&&winfreeze&&(campaignchoosenext[campaignchoicewhich[whichchoice]])==1)mainmenu=100;
-                               else if(mainmenu==0&&winfreeze){ }
-                               else if(mainmenu==1||mainmenu==2)mainmenu=0;
-                               if(mainmenu&&musictoggle){
-                                       if(mainmenu==1||mainmenu==2||mainmenu==100){
-                                               OPENAL_SetFrequency(OPENAL_ALL, 0.001);
-                                               emit_stream_np(stream_music3);
-                                               pause_sound(music1);
-                                       }
-                               }
-                               if(!mainmenu){
-                                       pause_sound(stream_music3);
-                                       resume_stream(music1);
-                               }
-                       }
+            if(mainmenu==0&&!winfreeze)
+                mainmenu=2; //pause
+            else if(mainmenu==0&&winfreeze&&campaignchoosenext[campaignchoicewhich[whichchoice]]==1){
+                mainmenu=100;
+                gameon=0;
+                winfreeze=0;
+            }else if(mainmenu==1||mainmenu==2)
+                mainmenu=0; //unpause
+            //play menu theme
+            if(musictoggle&&(mainmenu==1||mainmenu==2||mainmenu==100)){
+                OPENAL_SetFrequency(OPENAL_ALL, 0.001);
+                emit_stream_np(stream_menutheme);
+                pause_sound(leveltheme);
+            }
+            //on resume, play level music
+            if(!mainmenu){
+                pause_sound(stream_menutheme);
+                resume_stream(leveltheme);
+            }
+            //finished with settings menu
                        if(mainmenu==3){
-                               if(newdetail>2)newdetail=detail;
-                               if(newdetail<0)newdetail=detail;
-                               if(newscreenwidth<0)newscreenwidth=screenwidth;
-                               if(newscreenheight<0)newscreenheight=screenheight;
                                SaveSettings(*this);
                        }
-                       if((mainmenu>=3 && mainmenu<=7)||mainmenu==9||mainmenu==10||mainmenu==100){
+            //effects
+                       if(mainmenu>=3&&mainmenu!=8){
                                fireSound();
                                flash();
                        }
-                       if(mainmenu==3&&gameon)mainmenu=2;
-                       if(mainmenu==3&&!gameon)mainmenu=1;
-                       if(mainmenu==5&&gameon)mainmenu=2;
-                       if(mainmenu==5&&!gameon)mainmenu=1;
-                       if(mainmenu==4)mainmenu=3;
-                       if(mainmenu==6)mainmenu=5;
-                       if(mainmenu==7)mainmenu=1;
-                       if(mainmenu==9)mainmenu=5;
-                       if(mainmenu==10)mainmenu=5;
-                       if(mainmenu==100){
-                               mainmenu=5;
-                               gameon=0;
-                               winfreeze=0;
-                       }
+            //go back
+            switch(mainmenu){
+                case 3: case 5:
+                    mainmenu=gameon?2:1; break;
+                case 4: case 18:
+                    mainmenu=3; break;
+                case 6: case 7: case 9: case 10: case 100:
+                    mainmenu=5; break;
+            }
                }
        }
 
@@ -6096,11 +5983,11 @@ void Game::Tick(){
                if(!winfreeze)leveltime+=multiplier;
 
         //keys
-               if(Input::isKeyDown(SDLK_ESCAPE)){
-                       chatting=0;
-                       console=0;
-                       freeze=0;
-                       displaychars[0]=0;
+               if(Input::isKeyPressed(SDLK_v)&&debugmode){
+                       freeze=1-freeze;
+                       if(freeze){
+                               OPENAL_SetFrequency(OPENAL_ALL, 0.001);
+                       }
                }
 
                if(Input::isKeyPressed(chatkey)&&!console&&!chatting&&debugmode)
@@ -6110,9 +5997,8 @@ void Game::Tick(){
                        inputText(displaytext[0],&displayselected,&displaychars[0]);
                        if(!waiting) {
                                if(displaychars[0]){
-                                       for(int j=0;j<255;j++){
-                                               displaytext[0][j]=' ';
-                                       }
+                                       for(int j=0;j<255;j++)
+                                               displaytext[0][j]=0;
                                        displaychars[0]=0;
                                        displayselected=0;
                                }       
@@ -6128,14 +6014,49 @@ void Game::Tick(){
                if(chatting)
             keyboardfrozen=1;
 
+               if(Input::isKeyPressed(SDLK_BACKQUOTE)&&debugmode){
+                       console=1-console;
+                       if(console){
+                               OPENAL_SetFrequency(OPENAL_ALL, 0.001);
+                       } else {
+                               freeze=0;
+                               waiting=false;
+                       }
+               }
+
+               if(console)
+            freeze=1;
+               if(console&&!Input::isKeyDown(SDLK_LMETA)){
+                       inputText(consoletext[0],&consoleselected,&consolechars[0]);
+                       if(!waiting) {
+                               archiveselected=0;
+                               if(consolechars[0]>0){
+                    consoletext[0][consolechars[0]]=' ';
+                    cmd_dispatch(this, consoletext[0]);
+                                       for(int k=14;k>=1;k--){
+                                               for(int j=0;j<255;j++)
+                                                       consoletext[k][j]=consoletext[k-1][j];
+                                               consolechars[k]=consolechars[k-1];
+                                       }
+                                       for(int j=0;j<255;j++)
+                                               consoletext[0][j]=0;
+                                       consolechars[0]=0;
+                                       consoleselected=0;
+                               }
+                       }
+
+                       consoleblinkdelay-=multiplier;
+                       if(consoleblinkdelay<=0){
+                               consoleblinkdelay=.3;
+                               consoleblink=1-consoleblink;
+                       }
+               }
+
+
+
                if(Input::isKeyDown(SDLK_q)&&Input::isKeyDown(SDLK_LMETA)){
                        tryquit=1;
-                       if(mainmenu==3){
-                               if(newdetail>2)newdetail=detail;
-                               if(newdetail<0)newdetail=detail;
-                               if(newscreenwidth<0)newscreenwidth=screenwidth;
-                               if(newscreenheight<0)newscreenheight=screenheight;
-
+                       if(mainmenu==3) {
                                SaveSettings(*this);
                        }
                }
@@ -6153,11 +6074,16 @@ void Game::Tick(){
                if((Input::isKeyPressed(jumpkey)||Input::isKeyPressed(SDLK_SPACE))&&!campaign)
                        if(winfreeze)
                 winfreeze=0;
-               if((Input::isKeyDown(SDLK_ESCAPE))&&!campaign&&gameon)
-                       if(winfreeze){
+               if((Input::isKeyDown(SDLK_ESCAPE))&&!campaign&&gameon){
+            if(console){
+                console=0;
+                freeze=0;
+            }else if(winfreeze){
                                mainmenu=9;
                                gameon=0;
                        }
+        }
+
 
 
         //TODO: what is this test?
@@ -6510,8 +6436,6 @@ void Game::Tick(){
                 }
             }
 
-            static float keyrefreshdelay=0,bigrefreshdelay=0;
-
             if(!player[0].jumpkeydown){
                 player[0].jumptogglekeydown=0;
             }
@@ -6534,8 +6458,6 @@ void Game::Tick(){
 
                 hawkcalldelay=16+abs(Random()%8);
             }
-            static float temptexdetail;
-
 
             doDebugKeys();
 
@@ -6649,8 +6571,6 @@ void Game::Tick(){
                         player[i].targetheadrotation2=pitch(participantfacing[whichdialogue][indialogue][i]);
                     }
 
-                    bool pause;
-
                     if(leveltime<.5)
                         numenvsounds=0;
 
@@ -7055,7 +6975,7 @@ void Game::Tick(){
                             player[i].attackkeydown){
                         if(weapons.bloody[player[i].weaponids[player[i].weaponactive]]&&
                                 player[i].onterrain&&
-                                bloodtoggle&&musictype!=stream_music2){
+                                bloodtoggle&&musictype!=stream_fighttheme){
                             if(weapons.type[player[i].weaponids[player[i].weaponactive]]==knife)
                                 setAnimation(i,crouchstabanim);
                             if(weapons.type[player[i].weaponids[player[i].weaponactive]]==sword)
@@ -7496,7 +7416,7 @@ void Game::Tick(){
                         OPENAL_StopSound(OPENAL_ALL);  // hack...OpenAL renderer isn't stopping music after tutorial goes to level menu...
                         OPENAL_SetFrequency(OPENAL_ALL, 0.001);
 
-                        emit_stream_np(stream_music3);
+                        emit_stream_np(stream_menutheme);
 
                         gameon=0;
                         mainmenu=5;
@@ -7586,9 +7506,7 @@ void Game::Tick(){
                Screenshot();
 }
 
-
-
-void   Game::TickOnce(){
+void Game::TickOnce(){
        if(mainmenu)
                rotation+=multiplier*5;
        else
@@ -7605,12 +7523,11 @@ void    Game::TickOnce(){
                }
 }
 
-void   Game::TickOnceAfter(){
+void Game::TickOnceAfter(){
        static XYZ colviewer;
        static XYZ coltarget;
        static XYZ target;
        static XYZ col;
-       static float brotate;
        static XYZ facing;
        static float changedelay;
        static bool alldead;
@@ -7620,15 +7537,15 @@ void    Game::TickOnceAfter(){
        if(!mainmenu){
 
                if(environment==snowyenvironment)
-            music1=stream_music1snow;
+            leveltheme=stream_snowtheme;
                if(environment==grassyenvironment)
-            music1=stream_music1grass;
+            leveltheme=stream_grasstheme;
                if(environment==desertenvironment)
-            music1=stream_music1desert;
+            leveltheme=stream_deserttheme;
 
                realthreat=0;
 
-               musictype=music1;
+               musictype=leveltheme;
                for(int i=0;i<numplayers;i++){
                        if((player[i].aitype==attacktypecutoff||
                         player[i].aitype==getweapontype||
@@ -7638,26 +7555,26 @@ void    Game::TickOnceAfter(){
                     (player[i].targetanimation!=sneakattackedanim&&
                      player[i].targetanimation!=knifesneakattackedanim&&
                      player[i].targetanimation!=swordsneakattackedanim)){
-                               musictype=stream_music2;
+                               musictype=stream_fighttheme;
                                realthreat=1;
                        }
                }
                if(player[0].dead)
-            musictype=stream_music3;
+            musictype=stream_menutheme;
 
 
-               if(musictype==stream_music2)
+               if(musictype==stream_fighttheme)
                        unseendelay=1;
 
-               if(oldmusictype==stream_music2&&musictype!=stream_music2){
+               if(oldmusictype==stream_fighttheme&&musictype!=stream_fighttheme){
                        unseendelay-=multiplier;
                        if(unseendelay>0)
-                               musictype=stream_music2;
+                               musictype=stream_fighttheme;
                }
 
 
                if(loading==2){
-                       musictype=stream_music3;
+                       musictype=stream_menutheme;
                        musicvolume[2]=512;
                        musicvolume[0]=0;
                        musicvolume[1]=0;
@@ -7665,19 +7582,19 @@ void    Game::TickOnceAfter(){
                }
 
                if(musictoggle)
-                       if(musictype!=oldmusictype&&musictype==stream_music2)
+                       if(musictype!=oldmusictype&&musictype==stream_fighttheme)
                                emit_sound_np(alarmsound);
                musicselected=musictype;
 
-               if(musicselected==music1)
+               if(musicselected==leveltheme)
             musicvolume[0]+=multiplier*450;
                else
             musicvolume[0]-=multiplier*450;
-               if(musicselected==stream_music2)
+               if(musicselected==stream_fighttheme)
             musicvolume[1]+=multiplier*450;
                else
             musicvolume[1]-=multiplier*450;
-               if(musicselected==stream_music3)
+               if(musicselected==stream_menutheme)
             musicvolume[2]+=multiplier*450;
                else
             musicvolume[2]-=multiplier*450;
@@ -7694,31 +7611,31 @@ void    Game::TickOnceAfter(){
 
                if(musictoggle){
                        if(musicvolume[0]>0&&oldmusicvolume[0]<=0)
-                         emit_stream_np(music1, musicvolume[0]);
+                         emit_stream_np(leveltheme, musicvolume[0]);
                        if(musicvolume[1]>0&&oldmusicvolume[1]<=0)
-                         emit_stream_np(stream_music2, musicvolume[1]);
+                         emit_stream_np(stream_fighttheme, musicvolume[1]);
                        if(musicvolume[2]>0&&oldmusicvolume[2]<=0)
-                         emit_stream_np(stream_music3, musicvolume[2]);
+                         emit_stream_np(stream_menutheme, musicvolume[2]);
                        if(musicvolume[0]<=0&&oldmusicvolume[0]>0)
-                               pause_sound(music1);
+                               pause_sound(leveltheme);
                        if(musicvolume[1]<=0&&oldmusicvolume[1]>0)
-                               pause_sound(stream_music2);
+                               pause_sound(stream_fighttheme);
                        if(musicvolume[2]<=0&&oldmusicvolume[2]>0)
-                               pause_sound(stream_music3);
+                               pause_sound(stream_menutheme);
 
                        if(musicvolume[0]!=oldmusicvolume[0])
-                               OPENAL_SetVolume(channels[music1], musicvolume[0]);
+                               OPENAL_SetVolume(channels[leveltheme], musicvolume[0]);
                        if(musicvolume[1]!=oldmusicvolume[1])
-                               OPENAL_SetVolume(channels[stream_music2], musicvolume[1]);
+                               OPENAL_SetVolume(channels[stream_fighttheme], musicvolume[1]);
                        if(musicvolume[2]!=oldmusicvolume[2])
-                               OPENAL_SetVolume(channels[stream_music3], musicvolume[2]);
+                               OPENAL_SetVolume(channels[stream_menutheme], musicvolume[2]);
 
                        for(int i=0;i<3;i++)
                                oldmusicvolume[i]=musicvolume[i];
                } else {
-                       pause_sound(music1);
-                       pause_sound(stream_music2);
-                       pause_sound(stream_music3);
+                       pause_sound(leveltheme);
+                       pause_sound(stream_fighttheme);
+                       pause_sound(stream_menutheme);
 
                        for(int i=0;i<4;i++){
                                oldmusicvolume[i]=0;
@@ -7781,12 +7698,12 @@ void    Game::TickOnceAfter(){
                                if(targetlevel>numchallengelevels-1)targetlevel=0;
                        }
 
-                       if(changedelay>0&&!player[0].dead&&!won){
+                       if(changedelay>0&&!player[0].dead&&!won) {
                                //high scores, awards, win
-                               if(campaign){
+                               if(campaign) {
                                        accountactive->winCampaignLevel(whichchoice, bonustotal, leveltime);
                                        scoreadded=1;
-                               }else{
+                               } else {
                                        accountactive->winLevel(whichlevel,bonustotal-startbonustotal,leveltime);
                                }
                                won=1;
@@ -7871,8 +7788,6 @@ void      Game::TickOnceAfter(){
                         stealthloading=0;
 
                                        if(!stealthloading){
-                                               float gLoc[3]={0,0,0};
-                                               float vel[3]={0,0,0};
                                                fireSound(firestartsound);
 
                                                flash();
@@ -7880,72 +7795,13 @@ void    Game::TickOnceAfter(){
 
                                        startbonustotal=0;
 
-                                       ifstream ipstream(ConvertFileName(":Data:Campaigns:main.txt"));
-                                       ipstream.ignore(256,':');
-                                       ipstream >> campaignnumlevels;
-                                       for(int i=0;i<campaignnumlevels;i++){
-                                               ipstream.ignore(256,':');
-                                               ipstream.ignore(256,':');
-                                               ipstream.ignore(256,' ');
-                                               ipstream >> campaignmapname[i];
-                                               ipstream.ignore(256,':');
-                                               ipstream >> campaigndescription[i];
-                                               for(int j=0;j<256;j++){
-                                                       if(campaigndescription[i][j]=='_')campaigndescription[i][j]=' ';
-                                               }
-                                               ipstream.ignore(256,':');
-                                               ipstream >> campaignchoosenext[i];
-                                               ipstream.ignore(256,':');
-                                               ipstream >> campaignnumnext[i];
-                                               for(int j=0;j<campaignnumnext[i];j++){
-                                                       ipstream.ignore(256,':');
-                                                       ipstream >> campaignnextlevel[i][j];
-                                                       campaignnextlevel[i][j]-=1;
-                                               }
-                                               ipstream.ignore(256,':');
-                                               ipstream >> campaignlocationx[i];
-                                               ipstream.ignore(256,':');
-                                               ipstream >> campaignlocationy[i];
-                                       }
-                                       ipstream.close();
-
-                                       for(int i=0;i<campaignnumlevels;i++){
-                                               levelvisible[i]=0;
-                                               levelhighlight[i]=0;
-                                       }
-
-
-                                       for(int i=0;i<campaignnumlevels;i++){
-                                               levelvisible[i]=0;
-                                               levelhighlight[i]=0;
-                                       }
-
-                                       levelorder[0]=0;
-                                       levelvisible[0]=1;
-                                       for(int i=0;i<accountactive->getCampaignChoicesMade();i++){
-                                               levelorder[i+1]=campaignnextlevel[levelorder[i]][accountactive->getCampaignChoice(i)];
-                                               levelvisible[levelorder[i+1]]=1;
-                                       }
-                                       int whichlevelstart;
-                                       whichlevelstart=accountactive->getCampaignChoicesMade()-1;
-                                       if(whichlevelstart<0){
-                                               campaignchoicenum=1;
-                                               campaignchoicewhich[0]=0;
-                                       }
-                                       else
-                                       {
-                                               campaignchoicenum=campaignnumnext[levelorder[whichlevelstart]];
-                                               for(int i=0;i<campaignchoicenum;i++){
-                                                       campaignchoicewhich[i]=campaignnextlevel[levelorder[whichlevelstart]][i];
-                                                       levelvisible[campaignnextlevel[levelorder[whichlevelstart]][i]]=1;
-                                                       levelhighlight[campaignnextlevel[levelorder[whichlevelstart]][i]]=1;
-                                               }
-                                       }
+                                       LoadCampaign();
 
                                        loading=2;
                                        loadtime=0;
                                        targetlevel=7;
-                                       if(!firstload)LoadStuff();
+                                       if(!firstload)
+                                               LoadStuff();
                                        whichchoice=0;
                                        visibleloading=1;
                                        stillloading=1;
@@ -7953,7 +7809,7 @@ void      Game::TickOnceAfter(){
                                        campaign=1;
                                        mainmenu=0;
                                        gameon=1;
-                                       pause_sound(stream_music3);
+                                       pause_sound(stream_menutheme);
 
                                        stealthloading=0;
                                }
@@ -7973,7 +7829,6 @@ void      Game::TickOnceAfter(){
        facing=DoRotation(facing,0,0-rotation,0);
        viewerfacing=facing;
 
-       brotate=0;
        if(!cameramode){
                if((animation[player[0].targetanimation].attack!=3&&animation[player[0].currentanimation].attack!=3)||player[0].skeleton.free)target=player[0].coords+player[0].currentoffset*(1-player[0].target)*player[0].scale+player[0].targetoffset*player[0].target*player[0].scale-player[0].facing*.05;
                else target=player[0].oldcoords+player[0].currentoffset*(1-player[0].target)*player[0].scale+player[0].targetoffset*player[0].target*player[0].scale-player[0].facing*.05;