]> git.jsancho.org Git - lugaru.git/commitdiff
BEAUTIFIED ALL SOURCE CODE
authorsf17k <sf171k@gmail.com>
Mon, 15 Apr 2013 00:29:22 +0000 (20:29 -0400)
committersf17k <sf171k@gmail.com>
Mon, 15 Apr 2013 00:29:22 +0000 (20:29 -0400)
AStyle.exe --style=kr --pad-header --pad-oper *.c *.cpp *.h

63 files changed:
Source/Account.cpp
Source/Account.h
Source/Animation.cpp
Source/Animation.h
Source/Awards.cpp
Source/Awards.h
Source/Frustum.cpp
Source/Frustum.h
Source/Game.cpp
Source/Game.h
Source/GameDraw.cpp
Source/GameInitDispose.cpp
Source/GameTick.cpp
Source/Globals.cpp
Source/Input.cpp
Source/Input.h
Source/Lights.cpp
Source/Lights.h
Source/MacCompatibility.cpp
Source/MacCompatibility.h
Source/Menu.cpp
Source/Menu.h
Source/Models.cpp
Source/Models.h
Source/Objects.cpp
Source/Objects.h
Source/OpenGL_Windows.cpp
Source/Person.cpp
Source/PhysicsMath.h
Source/Quaternions.cpp
Source/Quaternions.h
Source/Random.h
Source/Settings.cpp
Source/Settings.h
Source/Skeleton.cpp
Source/Skybox.cpp
Source/Skybox.h
Source/Sounds.cpp
Source/Sounds.h
Source/Sprite.cpp
Source/Sprite.h
Source/Stereo.cpp
Source/Stereo.h
Source/TGALoader.cpp
Source/TGALoader.h
Source/Terrain.cpp
Source/Terrain.h
Source/Text.cpp
Source/Text.h
Source/Texture.cpp
Source/Texture.h
Source/Weapons.cpp
Source/Weapons.h
Source/WinDefs.cpp
Source/WinDefs.h
Source/alstubs.h
Source/binio.h
Source/openal_wrapper.cpp
Source/openal_wrapper.h
Source/pack.c
Source/private.c
Source/private.h
Source/unpack.c

index 354713570c9ea43522b8cca03ca3fa403302b6e0..09bf0d1ef3ac4f285f5f4c5c2e5b831a6a1ea146 100644 (file)
@@ -11,7 +11,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -32,235 +32,231 @@ extern bool debugmode;
 
 vector<Account*> Account::accounts = vector<Account*>();
 
-Account::Account(string n) : campaignProgress() {
-       name = string(n);
-       difficulty = 0;
-       progress = 0;
-       points = 0;
-       memset(highscore, 0, sizeof(highscore));
-       memset(fasttime, 0, sizeof(fasttime));
-       memset(unlocked, 0, sizeof(unlocked));
-       
-       setCurrentCampaign("main");
+Account::Account(string n) : campaignProgress()
+{
+    name = string(n);
+    difficulty = 0;
+    progress = 0;
+    points = 0;
+    memset(highscore, 0, sizeof(highscore));
+    memset(fasttime, 0, sizeof(fasttime));
+    memset(unlocked, 0, sizeof(unlocked));
+
+    setCurrentCampaign("main");
 }
 
-void Account::setCurrentCampaign(string name) {
-       currentCampaign = name;
+void Account::setCurrentCampaign(string name)
+{
+    currentCampaign = name;
 }
 
-Account* Account::add(string name) {
-       accounts.push_back(new Account(name));
-       return accounts.back();
+Account* Account::add(string name)
+{
+    accounts.push_back(new Account(name));
+    return accounts.back();
 }
 
-Account* Account::get(int i) {
-       
-       if((i>=0)&&(i<accounts.size())) {
-               return accounts[i];
-       } else
-               return NULL;
+Account* Account::get(int i)
+{
+
+    if ((i >= 0) && (i < accounts.size())) {
+        return accounts[i];
+    } else
+        return NULL;
 }
 
-void Account::destroy(int i) {
-       accounts.erase(accounts.begin()+i);
+void Account::destroy(int i)
+{
+    accounts.erase(accounts.begin() + i);
 }
-Account* Account::destroy(Account* a) {
-       for(int i=0; i<accounts.size(); i++) {
-               if(accounts[i]==a) {
-                       accounts.erase(accounts.begin()+i);
-                       return NULL;
-               }
-       }
-       printf("Unexpected error : User %s not found\n",a->getName());
-       return accounts.front();
+Account* Account::destroy(Account* a)
+{
+    for (int i = 0; i < accounts.size(); i++) {
+        if (accounts[i] == a) {
+            accounts.erase(accounts.begin() + i);
+            return NULL;
+        }
+    }
+    printf("Unexpected error : User %s not found\n", a->getName());
+    return accounts.front();
 }
 
-int Account::getDifficulty() {
-       return difficulty;
+int Account::getDifficulty()
+{
+    return difficulty;
 }
 
-void Account::endGame() {
-       campaignProgress[currentCampaign].choices.clear();
-       campaignProgress[currentCampaign].score=0;
-       campaignProgress[currentCampaign].time=0;
+void Account::endGame()
+{
+    campaignProgress[currentCampaign].choices.clear();
+    campaignProgress[currentCampaign].score = 0;
+    campaignProgress[currentCampaign].time = 0;
 }
 
-void Account::winCampaignLevel(int choice, float score, float time) {
-       campaignProgress[currentCampaign].choices.push_back(choice);
-       setCampaignScore(campaignProgress[currentCampaign].score+score);
-       campaignProgress[currentCampaign].time = time;
+void Account::winCampaignLevel(int choice, float score, float time)
+{
+    campaignProgress[currentCampaign].choices.push_back(choice);
+    setCampaignScore(campaignProgress[currentCampaign].score + score);
+    campaignProgress[currentCampaign].time = time;
 }
 
-void Account::winLevel(int level, float score, float time) {
-       if(!debugmode) {
-               if(score>highscore[level])
-                       highscore[level]=score;
-               if(time<fasttime[level]||fasttime[level]==0)
-                       fasttime[level]=time;
-       }
-       if(progress<level+1)
-               progress=level+1;
+void Account::winLevel(int level, float score, float time)
+{
+    if (!debugmode) {
+        if (score > highscore[level])
+            highscore[level] = score;
+        if (time < fasttime[level] || fasttime[level] == 0)
+            fasttime[level] = time;
+    }
+    if (progress < level + 1)
+        progress = level + 1;
 }
 
-Account* Account::loadFile(string filename) {
-       FILE *tfile;
-       int numaccounts;
-       int accountactive;
-       
-       tfile=fopen(ConvertFileName(filename.c_str()), "rb" );
-       
-       if(tfile)
-       {
-               funpackf(tfile, "Bi", &numaccounts);
-               funpackf(tfile, "Bi", &accountactive);
-               printf("number of accounts %d\n",numaccounts);
-               for(int i=0;i<numaccounts;i++)
-               {
-                       printf("loading account %d/%d\n",i,numaccounts);
-                       Account* acc = new Account();
-                       funpackf(tfile, "Bi", &(acc->difficulty));
-                       funpackf(tfile, "Bi", &(acc->progress));
-                       int nbCampaigns;
-                       funpackf(tfile, "Bi", &nbCampaigns);
-                       //~ printf("loading %d campaign progress info\n",nbCampaigns);
-                       
-                       for(int k=0;k<nbCampaigns;++k) {
-                               string campaignName = "";
-                               int t;
-                               char c;
-                               funpackf(tfile, "Bi",  &t);
-                               for(int j=0;j<t;j++)
-                               {
-                                       funpackf(tfile, "Bb",  &c);
-                                       campaignName.append(1,c);
-                               }
-                               //~ printf("loading %s campaign progress info\n",campaignName.c_str());
-                               funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].time));
-                               funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].score));
-                               funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].fasttime));
-                               funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].highscore));
-                               int campaignchoicesmade,campaignchoice;
-                               funpackf(tfile, "Bi", &campaignchoicesmade);
-                               for(int j=0;j<campaignchoicesmade;j++)
-                               {
-                                       funpackf(tfile, "Bi", &campaignchoice);
-                                       if (campaignchoice >= 10) // what is that for?
-                                       {
-                                               campaignchoice = 0;
-                                       }
-                                       acc->campaignProgress[campaignName].choices.push_back(campaignchoice);
-                               }
-                       }
-                       
-                       acc->currentCampaign = "";
-                       int t;
-                       char c;
-                       funpackf(tfile, "Bi",  &t);
-                       for(int i=0;i<t;i++)
-                       {
-                               funpackf(tfile, "Bb",  &c);
-                               acc->currentCampaign.append(1,c);
-                       }
-                       
-                       funpackf(tfile, "Bf", &(acc->points));
-                       for(int i=0;i<50;i++)
-                       {
-                               funpackf(tfile, "Bf", &(acc->highscore[i]));
-                               funpackf(tfile, "Bf", &(acc->fasttime[i]));
-                       }
-                       for(int i=0;i<60;i++)
-                       {
-                               funpackf(tfile, "Bb",  &(acc->unlocked[i]));
-                       }
-                       int temp;
-                       char ctemp;
-                       funpackf(tfile, "Bi",  &temp);
-                       for(int i=0;i<temp;i++)
-                       {
-                               funpackf(tfile, "Bb",  &ctemp);
-                               acc->name.append(1,ctemp);
-                       }
-                       if(!strcmp(acc->name.c_str(),""))
-                               acc->name="Lugaru Player"; // no empty player name security.
-                       accounts.push_back(acc);
-               }
-
-               fclose(tfile);
-               return get(accountactive);
-       } else {
-               printf("filenotfound\n");
-               return NULL;
-       }
+Account* Account::loadFile(string filename)
+{
+    FILE *tfile;
+    int numaccounts;
+    int accountactive;
+
+    tfile = fopen(ConvertFileName(filename.c_str()), "rb" );
+
+    if (tfile) {
+        funpackf(tfile, "Bi", &numaccounts);
+        funpackf(tfile, "Bi", &accountactive);
+        printf("number of accounts %d\n", numaccounts);
+        for (int i = 0; i < numaccounts; i++) {
+            printf("loading account %d/%d\n", i, numaccounts);
+            Account* acc = new Account();
+            funpackf(tfile, "Bi", &(acc->difficulty));
+            funpackf(tfile, "Bi", &(acc->progress));
+            int nbCampaigns;
+            funpackf(tfile, "Bi", &nbCampaigns);
+            //~ printf("loading %d campaign progress info\n",nbCampaigns);
+
+            for (int k = 0; k < nbCampaigns; ++k) {
+                string campaignName = "";
+                int t;
+                char c;
+                funpackf(tfile, "Bi",  &t);
+                for (int j = 0; j < t; j++) {
+                    funpackf(tfile, "Bb",  &c);
+                    campaignName.append(1, c);
+                }
+                //~ printf("loading %s campaign progress info\n",campaignName.c_str());
+                funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].time));
+                funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].score));
+                funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].fasttime));
+                funpackf(tfile, "Bf", &(acc->campaignProgress[campaignName].highscore));
+                int campaignchoicesmade, campaignchoice;
+                funpackf(tfile, "Bi", &campaignchoicesmade);
+                for (int j = 0; j < campaignchoicesmade; j++) {
+                    funpackf(tfile, "Bi", &campaignchoice);
+                    if (campaignchoice >= 10) { // what is that for?
+                        campaignchoice = 0;
+                    }
+                    acc->campaignProgress[campaignName].choices.push_back(campaignchoice);
+                }
+            }
+
+            acc->currentCampaign = "";
+            int t;
+            char c;
+            funpackf(tfile, "Bi",  &t);
+            for (int i = 0; i < t; i++) {
+                funpackf(tfile, "Bb",  &c);
+                acc->currentCampaign.append(1, c);
+            }
+
+            funpackf(tfile, "Bf", &(acc->points));
+            for (int i = 0; i < 50; i++) {
+                funpackf(tfile, "Bf", &(acc->highscore[i]));
+                funpackf(tfile, "Bf", &(acc->fasttime[i]));
+            }
+            for (int i = 0; i < 60; i++) {
+                funpackf(tfile, "Bb",  &(acc->unlocked[i]));
+            }
+            int temp;
+            char ctemp;
+            funpackf(tfile, "Bi",  &temp);
+            for (int i = 0; i < temp; i++) {
+                funpackf(tfile, "Bb",  &ctemp);
+                acc->name.append(1, ctemp);
+            }
+            if (!strcmp(acc->name.c_str(), ""))
+                acc->name = "Lugaru Player"; // no empty player name security.
+            accounts.push_back(acc);
+        }
+
+        fclose(tfile);
+        return get(accountactive);
+    } else {
+        printf("filenotfound\n");
+        return NULL;
+    }
 }
 
-void Account::saveFile(string filename, Account* accountactive) {
-       FILE *tfile;
-       int j;
-       
-       tfile=fopen(ConvertFileName(filename.c_str(), "wb"), "wb" );
-       if(tfile)
-       {
-               printf("writing %d accounts :\n",getNbAccounts());
-               fpackf(tfile, "Bi", getNbAccounts());
-               fpackf(tfile, "Bi", indice(accountactive));
-               
-               for(int i=0;i<getNbAccounts();i++)
-               {
-                       Account* a = Account::get(i);
-                       printf("writing account %d/%d (%s)\n",i+1,getNbAccounts(),a->getName());
-                       fpackf(tfile, "Bi", a->difficulty);
-                       fpackf(tfile, "Bi", a->progress);
-                       fpackf(tfile, "Bi", a->campaignProgress.size());
-                       
-                       map<string,CampaignProgress>::const_iterator it;
-                       for( it=a->campaignProgress.begin(); it!= a->campaignProgress.end(); ++it) {
-                               fpackf(tfile, "Bi",  it->first.size());
-                               for(j=0;j<it->first.size();j++)
-                               {
-                                       fpackf(tfile, "Bb",  it->first[j]);
-                               }
-                               fpackf(tfile, "Bf", it->second.time);
-                               fpackf(tfile, "Bf", it->second.score);
-                               fpackf(tfile, "Bf", it->second.fasttime);
-                               fpackf(tfile, "Bf", it->second.highscore);
-                               fpackf(tfile, "Bi", it->second.choices.size());
-                               for(j=0;j<it->second.choices.size();j++)
-                               {
-                                       fpackf(tfile, "Bi", it->second.choices[j]);
-                               }
-                       }
-                       
-                       fpackf(tfile, "Bi", a->getCurrentCampaign().size());
-                       for(j=0;j<a->getCurrentCampaign().size();j++)
-                       {
-                               fpackf(tfile, "Bb", a->getCurrentCampaign()[j]);
-                       }
-                       
-                       fpackf(tfile, "Bf", a->points);
-                       for(j=0;j<50;j++)
-                       {
-                               fpackf(tfile, "Bf", a->highscore[j]);
-                               fpackf(tfile, "Bf", a->fasttime[j]);
-                       }
-                       for(j=0;j<60;j++)
-                       {
-                               fpackf(tfile, "Bb",  a->unlocked[j]);
-                       }
-                       fpackf(tfile, "Bi",  a->name.size());
-                       for(j=0;j<a->name.size();j++)
-                       {
-                               fpackf(tfile, "Bb",  a->name[j]);
-                       }
-               }
-
-               fclose(tfile);
-       }
+void Account::saveFile(string filename, Account* accountactive)
+{
+    FILE *tfile;
+    int j;
+
+    tfile = fopen(ConvertFileName(filename.c_str(), "wb"), "wb" );
+    if (tfile) {
+        printf("writing %d accounts :\n", getNbAccounts());
+        fpackf(tfile, "Bi", getNbAccounts());
+        fpackf(tfile, "Bi", indice(accountactive));
+
+        for (int i = 0; i < getNbAccounts(); i++) {
+            Account* a = Account::get(i);
+            printf("writing account %d/%d (%s)\n", i + 1, getNbAccounts(), a->getName());
+            fpackf(tfile, "Bi", a->difficulty);
+            fpackf(tfile, "Bi", a->progress);
+            fpackf(tfile, "Bi", a->campaignProgress.size());
+
+            map<string, CampaignProgress>::const_iterator it;
+            for ( it = a->campaignProgress.begin(); it != a->campaignProgress.end(); ++it) {
+                fpackf(tfile, "Bi",  it->first.size());
+                for (j = 0; j < it->first.size(); j++) {
+                    fpackf(tfile, "Bb",  it->first[j]);
+                }
+                fpackf(tfile, "Bf", it->second.time);
+                fpackf(tfile, "Bf", it->second.score);
+                fpackf(tfile, "Bf", it->second.fasttime);
+                fpackf(tfile, "Bf", it->second.highscore);
+                fpackf(tfile, "Bi", it->second.choices.size());
+                for (j = 0; j < it->second.choices.size(); j++) {
+                    fpackf(tfile, "Bi", it->second.choices[j]);
+                }
+            }
+
+            fpackf(tfile, "Bi", a->getCurrentCampaign().size());
+            for (j = 0; j < a->getCurrentCampaign().size(); j++) {
+                fpackf(tfile, "Bb", a->getCurrentCampaign()[j]);
+            }
+
+            fpackf(tfile, "Bf", a->points);
+            for (j = 0; j < 50; j++) {
+                fpackf(tfile, "Bf", a->highscore[j]);
+                fpackf(tfile, "Bf", a->fasttime[j]);
+            }
+            for (j = 0; j < 60; j++) {
+                fpackf(tfile, "Bb",  a->unlocked[j]);
+            }
+            fpackf(tfile, "Bi",  a->name.size());
+            for (j = 0; j < a->name.size(); j++) {
+                fpackf(tfile, "Bb",  a->name[j]);
+            }
+        }
+
+        fclose(tfile);
+    }
 }
 
-int Account::indice(Account* a) {
-       for(int i=0; i < accounts.size(); i++) {
-               if(accounts[i]==a)
-                       return i;
-       }
-       return -1;
+int Account::indice(Account* a)
+{
+    for (int i = 0; i < accounts.size(); i++) {
+        if (accounts[i] == a)
+            return i;
+    }
+    return -1;
 }
index 7d550e81e7534597a6f0161a349aa1739a0fe187..b937dd7f67b8c84f996b0e4f2f9ce06ca5e4550f 100644 (file)
@@ -11,7 +11,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -29,75 +29,102 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include <fstream>
 
 struct CampaignProgress {
-       float highscore;
-       float fasttime;
-       float score;
-       float time;
-       std::vector<int> choices;
-       CampaignProgress() {
-               highscore = 0;
-               fasttime = 0;
-               score = 0;
-               time = 0;
-       }
+    float highscore;
+    float fasttime;
+    float score;
+    float time;
+    std::vector<int> choices;
+    CampaignProgress() {
+        highscore = 0;
+        fasttime = 0;
+        score = 0;
+        time = 0;
+    }
 };
 
-class Account {
-       public:
-               static void destroy(int i);
-               static Account* destroy(Account* a);
-               static Account* add(std::string name);
-               static Account* get(int i);
-               static Account* loadFile(std::string filename);
-               static void saveFile(std::string filename, Account* accountactive);
-               static int indice(Account* a);
-               
-               void endGame();
-               void winCampaignLevel(int choice, float score, float time);
-               void winLevel(int level, float score, float time);
-               
-               // getter and setters
-               int getDifficulty();
-               void setDifficulty(int i) { difficulty = i; };
-               const char* getName() { return name.c_str(); };
-               float getCampaignScore() { return campaignProgress[currentCampaign].score; };
-               int getCampaignChoicesMade() { return campaignProgress[currentCampaign].choices.size(); };
-               int getCampaignChoice(int i) { return campaignProgress[currentCampaign].choices[i]; };
-               void setCampaignScore(int s) {
-                       campaignProgress[currentCampaign].score=s;
-                       if(s>campaignProgress[currentCampaign].highscore)
-                               campaignProgress[currentCampaign].highscore=s;
-               };
-               void setCampaignFinalTime(float t) {
-                               campaignProgress[currentCampaign].time = t;
-                               if((t<campaignProgress[currentCampaign].fasttime) || (campaignProgress[currentCampaign].fasttime==0) && (t!=0))
-                                       campaignProgress[currentCampaign].fasttime = t;
-               };
-               float getCampaignFasttime() { return campaignProgress[currentCampaign].fasttime; };
-               void resetFasttime() { campaignProgress[currentCampaign].fasttime = 0; };
-               float getCampaignHighScore() { return campaignProgress[currentCampaign].highscore; };
-               float getHighScore(int i) { return highscore[i]; };
-               float getFastTime(int i) { return fasttime[i]; };
-               int getProgress() { return progress; };
-               std::string getCurrentCampaign() { return currentCampaign; };
-               void setCurrentCampaign(std::string name);
-               
-               static int getNbAccounts() { return accounts.size(); };
-       private:
-               Account(std::string n="");
-               int difficulty;
-               int progress; // progress in challenge levels
-               float points;
-               float highscore[50];
-               float fasttime[50];
-               bool unlocked[60];
-               std::string name;
-               
-               std::string currentCampaign;
-               std::map<std::string,CampaignProgress> campaignProgress;
-       
-       //statics
-               static std::vector<Account*> accounts;
+class Account
+{
+public:
+    static void destroy(int i);
+    static Account* destroy(Account* a);
+    static Account* add(std::string name);
+    static Account* get(int i);
+    static Account* loadFile(std::string filename);
+    static void saveFile(std::string filename, Account* accountactive);
+    static int indice(Account* a);
+
+    void endGame();
+    void winCampaignLevel(int choice, float score, float time);
+    void winLevel(int level, float score, float time);
+
+    // getter and setters
+    int getDifficulty();
+    void setDifficulty(int i) {
+        difficulty = i;
+    };
+    const char* getName() {
+        return name.c_str();
+    };
+    float getCampaignScore() {
+        return campaignProgress[currentCampaign].score;
+    };
+    int getCampaignChoicesMade() {
+        return campaignProgress[currentCampaign].choices.size();
+    };
+    int getCampaignChoice(int i) {
+        return campaignProgress[currentCampaign].choices[i];
+    };
+    void setCampaignScore(int s) {
+        campaignProgress[currentCampaign].score = s;
+        if (s > campaignProgress[currentCampaign].highscore)
+            campaignProgress[currentCampaign].highscore = s;
+    };
+    void setCampaignFinalTime(float t) {
+        campaignProgress[currentCampaign].time = t;
+        if ((t < campaignProgress[currentCampaign].fasttime) || (campaignProgress[currentCampaign].fasttime == 0) && (t != 0))
+            campaignProgress[currentCampaign].fasttime = t;
+    };
+    float getCampaignFasttime() {
+        return campaignProgress[currentCampaign].fasttime;
+    };
+    void resetFasttime() {
+        campaignProgress[currentCampaign].fasttime = 0;
+    };
+    float getCampaignHighScore() {
+        return campaignProgress[currentCampaign].highscore;
+    };
+    float getHighScore(int i) {
+        return highscore[i];
+    };
+    float getFastTime(int i) {
+        return fasttime[i];
+    };
+    int getProgress() {
+        return progress;
+    };
+    std::string getCurrentCampaign() {
+        return currentCampaign;
+    };
+    void setCurrentCampaign(std::string name);
+
+    static int getNbAccounts() {
+        return accounts.size();
+    };
+private:
+    Account(std::string n = "");
+    int difficulty;
+    int progress; // progress in challenge levels
+    float points;
+    float highscore[50];
+    float fasttime[50];
+    bool unlocked[60];
+    std::string name;
+
+    std::string currentCampaign;
+    std::map<std::string, CampaignProgress> campaignProgress;
+
+    //statics
+    static std::vector<Account*> accounts;
 };
 
 #endif
index 4e5a65fb005414fde791bc4aa4dd4f5106e413bb..5f230d84d20a2731d568671705e7d4e5185b8f8b 100644 (file)
@@ -22,11 +22,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "Skeleton.h"
 #include "Animation.h"
 
-struct animation_data_elt
-{
-  const char *filename;
-  int height;
-  int attack;
+struct animation_data_elt {
+    const char *filename;
+    int height;
+    int attack;
 };
 
 static animation_data_elt animation_data[animation_count] = {
@@ -37,9 +36,8 @@ static animation_data_elt animation_data[animation_count] = {
 
 void loadAllAnimations()
 {
-  for (int i = 0; i < loadable_anim_end; i++)
-    {
-      animation_data_elt *e = animation_data + i;
-      animation[i].Load(e->filename, e->height, e->attack);
+    for (int i = 0; i < loadable_anim_end; i++) {
+        animation_data_elt *e = animation_data + i;
+        animation[i].Load(e->filename, e->height, e->attack);
     }
 }
index 668cac3456e5d482c255f4ffbbb17320ae6da7fc..8c8d5e55c6f55b72dc49a6f25ff73159df27d00c 100644 (file)
@@ -23,11 +23,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #define        ANIMATION_H
 
 enum anim_attack_type {
-  neutral, normalattack, reversed, reversal
+    neutral, normalattack, reversed, reversal
 };
 
 enum anim_height_type {
-  lowheight, middleheight, highheight
+    lowheight, middleheight, highheight
 };
 
 
@@ -35,14 +35,14 @@ enum animation_types {
 #define DECLARE_ANIM(id, ...) id,
 #include "Animation.def"
 #undef DECLARE_ANIM
-animation_count
+    animation_count
 };
 
 enum animation_bit_offsets {
 #define DECLARE_ANIM_BIT(bit) o_##bit,
 #include "Animation.def"
 #undef DECLARE_ANIM_BIT
-animation_bit_count
+    animation_bit_count
 };
 
 enum animation_bits_def {
index 726eaec8d1d9cdbb5696bb818b014e39b40d1c12..426ad7a334fb28798f3338fdb4ba0c1a39b25aae 100644 (file)
@@ -39,11 +39,11 @@ static const int bonus_values[bonus_count] = {
 void
 award_bonus(int playerid, int bonusid, int alt_value)
 {
-  if (playerid != 0)
-    return;
-  bonus = bonusid;
-  bonustime = 0;
-  bonusvalue = alt_value ? alt_value : bonus_values[bonusid];
+    if (playerid != 0)
+        return;
+    bonus = bonusid;
+    bonustime = 0;
+    bonusvalue = alt_value ? alt_value : bonus_values[bonusid];
 }
 
 // FIXME: make these per-player
@@ -67,78 +67,78 @@ int maxalarmed;
 
 int award_awards(int *awards)
 {
-  int numawards = 0, i;
-  if(damagetaken==0&&player[0].bloodloss==0){
-    awards[numawards]=awardflawless;
-    numawards++;
-  }
-  bool alldead = true;
-  for(i=1;i<numplayers;i++){
-    if(player[i].dead!=2)alldead=0;
-  }
-  if(alldead){
-    awards[numawards]=awardalldead;
-    numawards++;
-  }
-  alldead=1;
-  for(i=1;i<numplayers;i++){
-    if(player[i].dead!=1)alldead=0;
-  }
-  if(alldead){
-    awards[numawards]=awardnodead;
-    numawards++;
-  }
-  if(numresponded==0&&!numthrowkill){
-    awards[numawards]=awardstealth;
-    numawards++;
-  }
-  if(numattacks==numstaffattack&&numattacks>0){
-    awards[numawards]=awardbojutsu;
-    numawards++;
-  }
-  if(numattacks==numswordattack&&numattacks>0){
-    awards[numawards]=awardswordsman;
-    numawards++;
-  }
-  if(numattacks==numknifeattack&&numattacks>0){
-    awards[numawards]=awardknifefighter;
-    numawards++;
-  }
-  if(numattacks==numunarmedattack&&numthrowkill==0&&weapons.size()>0){
-    awards[numawards]=awardkungfu;
-    numawards++;
-  }
-  if(numescaped>0){
-    awards[numawards]=awardevasion;
-    numawards++;
-  }
-  if(numflipfail==0&&numflipped+numwallflipped*2>20){
-    awards[numawards]=awardacrobat;
-    numawards++;
-  }
-  if(numthrowkill==numplayers-1){
-    awards[numawards]=awardlongrange;
-    numawards++;
-  }
-  alldead=1;
-  for(i=1;i<numplayers;i++){
-    if(player[i].dead!=2)alldead=0;
-  }
-  if(numafterkill>0&&alldead){
-    awards[numawards]=awardbrutal;
-    numawards++;
-  }
-  if(numreversals>((float)numattacks)*.8&&numreversals>3){
-    awards[numawards]=awardaikido;
-    numawards++;
-  }
-  if(maxalarmed==1&&numplayers>2){
-    awards[numawards]=awardstrategy;
-    numawards++;
-  }
-  if(numflipfail>3){
-    awards[numawards]=awardklutz;
-    numawards++;
-  }
-  return numawards;
+    int numawards = 0, i;
+    if (damagetaken == 0 && player[0].bloodloss == 0) {
+        awards[numawards] = awardflawless;
+        numawards++;
+    }
+    bool alldead = true;
+    for (i = 1; i < numplayers; i++) {
+        if (player[i].dead != 2)alldead = 0;
+    }
+    if (alldead) {
+        awards[numawards] = awardalldead;
+        numawards++;
+    }
+    alldead = 1;
+    for (i = 1; i < numplayers; i++) {
+        if (player[i].dead != 1)alldead = 0;
+    }
+    if (alldead) {
+        awards[numawards] = awardnodead;
+        numawards++;
+    }
+    if (numresponded == 0 && !numthrowkill) {
+        awards[numawards] = awardstealth;
+        numawards++;
+    }
+    if (numattacks == numstaffattack && numattacks > 0) {
+        awards[numawards] = awardbojutsu;
+        numawards++;
+    }
+    if (numattacks == numswordattack && numattacks > 0) {
+        awards[numawards] = awardswordsman;
+        numawards++;
+    }
+    if (numattacks == numknifeattack && numattacks > 0) {
+        awards[numawards] = awardknifefighter;
+        numawards++;
+    }
+    if (numattacks == numunarmedattack && numthrowkill == 0 && weapons.size() > 0) {
+        awards[numawards] = awardkungfu;
+        numawards++;
+    }
+    if (numescaped > 0) {
+        awards[numawards] = awardevasion;
+        numawards++;
+    }
+    if (numflipfail == 0 && numflipped + numwallflipped * 2 > 20) {
+        awards[numawards] = awardacrobat;
+        numawards++;
+    }
+    if (numthrowkill == numplayers - 1) {
+        awards[numawards] = awardlongrange;
+        numawards++;
+    }
+    alldead = 1;
+    for (i = 1; i < numplayers; i++) {
+        if (player[i].dead != 2)alldead = 0;
+    }
+    if (numafterkill > 0 && alldead) {
+        awards[numawards] = awardbrutal;
+        numawards++;
+    }
+    if (numreversals > ((float)numattacks)*.8 && numreversals > 3) {
+        awards[numawards] = awardaikido;
+        numawards++;
+    }
+    if (maxalarmed == 1 && numplayers > 2) {
+        awards[numawards] = awardstrategy;
+        numawards++;
+    }
+    if (numflipfail > 3) {
+        awards[numawards] = awardklutz;
+        numawards++;
+    }
+    return numawards;
 }
index 83b61c09643a2ef874cb5f260754ff6ca8c31864..8e45a680b211bf1a9999ffc04e54ffa7586059b9 100644 (file)
@@ -26,7 +26,7 @@ enum bonus_types {
 #define DECLARE_BONUS(id, ...) id,
 #include "Bonuses.def"
 #undef DECLARE_BONUS
-bonus_count
+    bonus_count
 };
 
 static const char *bonus_names[bonus_count] = {
@@ -48,7 +48,7 @@ enum award_types {
 #define DECLARE_AWARD(id, name) id,
 #include "Awards.def"
 #undef DECLARE_AWARD
-award_count
+    award_count
 };
 
 static const char *award_names[award_count] = {
index f8fb2f51758380d9e169cd464a27715d9c087c80..84d4b8def826429125c09983ee0f14d49f6b3148 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -26,150 +26,154 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 
 void FRUSTUM::
-       GetFrustum() {
-       static float projmatrix[16];
-       static float mvmatrix[16];
-       static float clip[16];
-       
-       glGetFloatv(GL_PROJECTION_MATRIX, projmatrix);
-       glGetFloatv(GL_MODELVIEW_MATRIX, mvmatrix);
-       
-       // Combine the matrices
-       clip[0] = mvmatrix[0] * projmatrix[0] + mvmatrix[1] * projmatrix[4] + mvmatrix[2] * projmatrix[8] + mvmatrix[3] * projmatrix[12];
-       clip[1] = mvmatrix[0] * projmatrix[1] + mvmatrix[1] * projmatrix[5] + mvmatrix[2] * projmatrix[9] + mvmatrix[3] * projmatrix[13];
-       clip[2] = mvmatrix[0] * projmatrix[2] + mvmatrix[1] * projmatrix[6] + mvmatrix[2] * projmatrix[10] + mvmatrix[3] * projmatrix[14];
-       clip[3] = mvmatrix[0] * projmatrix[3] + mvmatrix[1] * projmatrix[7] + mvmatrix[2] * projmatrix[11] + mvmatrix[3] * projmatrix[15];
-       
-       clip[4] = mvmatrix[4] * projmatrix[0] + mvmatrix[5] * projmatrix[4] + mvmatrix[6] * projmatrix[8] + mvmatrix[7] * projmatrix[12];
-       clip[5] = mvmatrix[4] * projmatrix[1] + mvmatrix[5] * projmatrix[5] + mvmatrix[6] * projmatrix[9] + mvmatrix[7] * projmatrix[13];
-       clip[6] = mvmatrix[4] * projmatrix[2] + mvmatrix[5] * projmatrix[6] + mvmatrix[6] * projmatrix[10] + mvmatrix[7] * projmatrix[14];
-       clip[7] = mvmatrix[4] * projmatrix[3] + mvmatrix[5] * projmatrix[7] + mvmatrix[6] * projmatrix[11] + mvmatrix[7] * projmatrix[15];
-       
-       clip[8] = mvmatrix[8] * projmatrix[0] + mvmatrix[9] * projmatrix[4] + mvmatrix[10] * projmatrix[8] + mvmatrix[11] * projmatrix[12];
-       clip[9] = mvmatrix[8] * projmatrix[1] + mvmatrix[9] * projmatrix[5] + mvmatrix[10] * projmatrix[9] + mvmatrix[11] * projmatrix[13];
-       clip[10] = mvmatrix[8] * projmatrix[2] + mvmatrix[9] * projmatrix[6] + mvmatrix[10] * projmatrix[10] + mvmatrix[11] * projmatrix[14];
-       clip[11] = mvmatrix[8] * projmatrix[3] + mvmatrix[9] * projmatrix[7] + mvmatrix[10] * projmatrix[11] + mvmatrix[11] * projmatrix[15];
-       
-       clip[12] = mvmatrix[12] * projmatrix[0] + mvmatrix[13] * projmatrix[4] + mvmatrix[14] * projmatrix[8] + mvmatrix[15] * projmatrix[12];
-       clip[13] = mvmatrix[12] * projmatrix[1] + mvmatrix[13] * projmatrix[5] + mvmatrix[14] * projmatrix[9] + mvmatrix[15] * projmatrix[13];
-       clip[14] = mvmatrix[12] * projmatrix[2] + mvmatrix[13] * projmatrix[6] + mvmatrix[14] * projmatrix[10] + mvmatrix[15] * projmatrix[14];
-       clip[15] = mvmatrix[12] * projmatrix[3] + mvmatrix[13] * projmatrix[7] + mvmatrix[14] * projmatrix[11] + mvmatrix[15] * projmatrix[15];
-       
-       // Right plane
-       frustum[0][0] = clip[3] - clip[0];
-       frustum[0][1] = clip[7] - clip[4];
-       frustum[0][2] = clip[11] - clip[8];
-       frustum[0][3] = clip[15] - clip[12];
-       
-       // Left plane
-       frustum[1][0] = clip[3] + clip[0];
-       frustum[1][1] = clip[7] + clip[4];
-       frustum[1][2] = clip[11] + clip[8];
-       frustum[1][3] = clip[15] + clip[12];
-       
-       // Bottom plane
-       frustum[2][0] = clip[3] + clip[1];
-       frustum[2][1] = clip[7] + clip[5];
-       frustum[2][2] = clip[11] + clip[9];
-       frustum[2][3] = clip[15] + clip[13];
-       
-       // Top plane
-       frustum[3][0] = clip[3] - clip[1];
-       frustum[3][1] = clip[7] - clip[5];
-       frustum[3][2] = clip[11] - clip[9];
-       frustum[3][3] = clip[15] - clip[13];
-       
-       // Far plane
-       frustum[4][0] = clip[3] - clip[2];
-       frustum[4][1] = clip[7] - clip[6];
-       frustum[4][2] = clip[11] - clip[10];
-       frustum[4][3] = clip[15] - clip[14];
-       
-       // Near plane
-       frustum[5][0] = clip[3] + clip[2];
-       frustum[5][1] = clip[7] + clip[6];
-       frustum[5][2] = clip[11] + clip[10];
-       frustum[5][3] = clip[15] + clip[14];
+GetFrustum()
+{
+    static float projmatrix[16];
+    static float mvmatrix[16];
+    static float clip[16];
+
+    glGetFloatv(GL_PROJECTION_MATRIX, projmatrix);
+    glGetFloatv(GL_MODELVIEW_MATRIX, mvmatrix);
+
+    // Combine the matrices
+    clip[0]    = mvmatrix[0] * projmatrix[0] + mvmatrix[1] * projmatrix[4] + mvmatrix[2] * projmatrix[8] + mvmatrix[3] * projmatrix[12];
+    clip[1] = mvmatrix[0] * projmatrix[1] + mvmatrix[1] * projmatrix[5] + mvmatrix[2] * projmatrix[9] + mvmatrix[3] * projmatrix[13];
+    clip[2] = mvmatrix[0] * projmatrix[2] + mvmatrix[1] * projmatrix[6] + mvmatrix[2] * projmatrix[10] + mvmatrix[3] * projmatrix[14];
+    clip[3] = mvmatrix[0] * projmatrix[3] + mvmatrix[1] * projmatrix[7] + mvmatrix[2] * projmatrix[11] + mvmatrix[3] * projmatrix[15];
+
+    clip[4] = mvmatrix[4] * projmatrix[0] + mvmatrix[5] * projmatrix[4] + mvmatrix[6] * projmatrix[8] + mvmatrix[7] * projmatrix[12];
+    clip[5] = mvmatrix[4] * projmatrix[1] + mvmatrix[5] * projmatrix[5] + mvmatrix[6] * projmatrix[9] + mvmatrix[7] * projmatrix[13];
+    clip[6] = mvmatrix[4] * projmatrix[2] + mvmatrix[5] * projmatrix[6] + mvmatrix[6] * projmatrix[10] + mvmatrix[7] * projmatrix[14];
+    clip[7] = mvmatrix[4] * projmatrix[3] + mvmatrix[5] * projmatrix[7] + mvmatrix[6] * projmatrix[11] + mvmatrix[7] * projmatrix[15];
+
+    clip[8] = mvmatrix[8] * projmatrix[0] + mvmatrix[9] * projmatrix[4] + mvmatrix[10] * projmatrix[8] + mvmatrix[11] * projmatrix[12];
+    clip[9] = mvmatrix[8] * projmatrix[1] + mvmatrix[9] * projmatrix[5] + mvmatrix[10] * projmatrix[9] + mvmatrix[11] * projmatrix[13];
+    clip[10] = mvmatrix[8] * projmatrix[2] + mvmatrix[9] * projmatrix[6] + mvmatrix[10] * projmatrix[10] + mvmatrix[11] * projmatrix[14];
+    clip[11] = mvmatrix[8] * projmatrix[3] + mvmatrix[9] * projmatrix[7] + mvmatrix[10] * projmatrix[11] + mvmatrix[11] * projmatrix[15];
+
+    clip[12] = mvmatrix[12] * projmatrix[0] + mvmatrix[13] * projmatrix[4] + mvmatrix[14] * projmatrix[8] + mvmatrix[15] * projmatrix[12];
+    clip[13] = mvmatrix[12] * projmatrix[1] + mvmatrix[13] * projmatrix[5] + mvmatrix[14] * projmatrix[9] + mvmatrix[15] * projmatrix[13];
+    clip[14] = mvmatrix[12] * projmatrix[2] + mvmatrix[13] * projmatrix[6] + mvmatrix[14] * projmatrix[10] + mvmatrix[15] * projmatrix[14];
+    clip[15] = mvmatrix[12] * projmatrix[3] + mvmatrix[13] * projmatrix[7] + mvmatrix[14] * projmatrix[11] + mvmatrix[15] * projmatrix[15];
+
+    // Right plane
+    frustum[0][0] = clip[3] - clip[0];
+    frustum[0][1] = clip[7] - clip[4];
+    frustum[0][2] = clip[11] - clip[8];
+    frustum[0][3] = clip[15] - clip[12];
+
+    // Left plane
+    frustum[1][0] = clip[3] + clip[0];
+    frustum[1][1] = clip[7] + clip[4];
+    frustum[1][2] = clip[11] + clip[8];
+    frustum[1][3] = clip[15] + clip[12];
+
+    // Bottom plane
+    frustum[2][0] = clip[3] + clip[1];
+    frustum[2][1] = clip[7] + clip[5];
+    frustum[2][2] = clip[11] + clip[9];
+    frustum[2][3] = clip[15] + clip[13];
+
+    // Top plane
+    frustum[3][0] = clip[3] - clip[1];
+    frustum[3][1] = clip[7] - clip[5];
+    frustum[3][2] = clip[11] - clip[9];
+    frustum[3][3] = clip[15] - clip[13];
+
+    // Far plane
+    frustum[4][0] = clip[3] - clip[2];
+    frustum[4][1] = clip[7] - clip[6];
+    frustum[4][2] = clip[11] - clip[10];
+    frustum[4][3] = clip[15] - clip[14];
+
+    // Near plane
+    frustum[5][0] = clip[3] + clip[2];
+    frustum[5][1] = clip[7] + clip[6];
+    frustum[5][2] = clip[11] + clip[10];
+    frustum[5][3] = clip[15] + clip[14];
 }
 
 int FRUSTUM::
-       CubeInFrustum(float x, float y, float z, float size) {
-       static int c, c2;
-       
-       for(int i=0; i<6; i++) {
-               c=0;
-               if(frustum[i][0] * (x-size) + frustum[i][1] * (y-size) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
-                       c++;
-               if(frustum[i][0] * (x+size) + frustum[i][1] * (y-size) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
-                       c++;
-               if(frustum[i][0] * (x-size) + frustum[i][1] * (y+size) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
-                       c++;
-               if(frustum[i][0] * (x+size) + frustum[i][1] * (y+size) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
-                       c++;
-               if(frustum[i][0] * (x-size) + frustum[i][1] * (y-size) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
-                       c++;
-               if(frustum[i][0] * (x+size) + frustum[i][1] * (y-size) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
-                       c++;
-               if(frustum[i][0] * (x-size) + frustum[i][1] * (y+size) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
-                       c++;
-               if(frustum[i][0] * (x+size) + frustum[i][1] * (y+size) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
-                       c++;
-               if(c==0)
-                       return 0;
-               if(c==8)
-                       c2++;
-       }
-       if(c2>=6)
-               return 2;
-       else
-               return 1;
+CubeInFrustum(float x, float y, float z, float size)
+{
+    static int c, c2;
+
+    for (int i = 0; i < 6; i++) {
+        c = 0;
+        if (frustum[i][0] * (x - size) + frustum[i][1] * (y - size) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+            c++;
+        if (frustum[i][0] * (x + size) + frustum[i][1] * (y - size) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+            c++;
+        if (frustum[i][0] * (x - size) + frustum[i][1] * (y + size) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+            c++;
+        if (frustum[i][0] * (x + size) + frustum[i][1] * (y + size) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+            c++;
+        if (frustum[i][0] * (x - size) + frustum[i][1] * (y - size) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+            c++;
+        if (frustum[i][0] * (x + size) + frustum[i][1] * (y - size) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+            c++;
+        if (frustum[i][0] * (x - size) + frustum[i][1] * (y + size) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+            c++;
+        if (frustum[i][0] * (x + size) + frustum[i][1] * (y + size) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+            c++;
+        if (c == 0)
+            return 0;
+        if (c == 8)
+            c2++;
+    }
+    if (c2 >= 6)
+        return 2;
+    else
+        return 1;
 }
 
 int FRUSTUM::
-       CubeInFrustum(float x, float y, float z, float size, float height) {
-       static int c, c2;
-       
-       for(int i=0; i<6; i++) {
-               c=0;
-               if(frustum[i][0] * (x-size) + frustum[i][1] * (y-height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
-                       c++;
-               if(frustum[i][0] * (x+size) + frustum[i][1] * (y-height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
-                       c++;
-               if(frustum[i][0] * (x-size) + frustum[i][1] * (y+height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
-                       c++;
-               if(frustum[i][0] * (x+size) + frustum[i][1] * (y+height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
-                       c++;
-               if(frustum[i][0] * (x-size) + frustum[i][1] * (y-height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
-                       c++;
-               if(frustum[i][0] * (x+size) + frustum[i][1] * (y-height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
-                       c++;
-               if(frustum[i][0] * (x-size) + frustum[i][1] * (y+height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
-                       c++;
-               if(frustum[i][0] * (x+size) + frustum[i][1] * (y+height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
-                       c++;
-               if(c==0)
-                       return 0;
-               if(c==8)
-                       c2++;
-       }
-       if(c2>=6)
-               return 2;
-       else
-               return 1;
+CubeInFrustum(float x, float y, float z, float size, float height)
+{
+    static int c, c2;
+
+    for (int i = 0; i < 6; i++) {
+        c = 0;
+        if (frustum[i][0] * (x - size) + frustum[i][1] * (y - height) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+            c++;
+        if (frustum[i][0] * (x + size) + frustum[i][1] * (y - height) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+            c++;
+        if (frustum[i][0] * (x - size) + frustum[i][1] * (y + height) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+            c++;
+        if (frustum[i][0] * (x + size) + frustum[i][1] * (y + height) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
+            c++;
+        if (frustum[i][0] * (x - size) + frustum[i][1] * (y - height) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+            c++;
+        if (frustum[i][0] * (x + size) + frustum[i][1] * (y - height) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+            c++;
+        if (frustum[i][0] * (x - size) + frustum[i][1] * (y + height) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+            c++;
+        if (frustum[i][0] * (x + size) + frustum[i][1] * (y + height) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
+            c++;
+        if (c == 0)
+            return 0;
+        if (c == 8)
+            c2++;
+    }
+    if (c2 >= 6)
+        return 2;
+    else
+        return 1;
 }
 
 int FRUSTUM::
-       SphereInFrustum(float x, float y, float z, float radius) {
-       static int  c2;
-       
-       for(int i=0; i<6; i++) {
-               if(frustum[i][0] * x + frustum[i][1] * y + frustum[i][2] * z + frustum[i][3] > -1*radius)
-                       c2++;
-               else
-                       return 0;
-       }
-       if(c2>=6)
-               return 2;
-       else
-               return 1;
+SphereInFrustum(float x, float y, float z, float radius)
+{
+    static int  c2;
+
+    for (int i = 0; i < 6; i++) {
+        if (frustum[i][0] * x + frustum[i][1] * y + frustum[i][2] * z + frustum[i][3] > -1 * radius)
+            c2++;
+        else
+            return 0;
+    }
+    if (c2 >= 6)
+        return 2;
+    else
+        return 1;
 }
index 7f96db86608ea726e3015eda03748b35a0963725..da9a4455288398afbcc745827086c07dd468693f 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -22,13 +22,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #ifndef FRUSTUM_H
 #define FRUSTUM_H
 
-class FRUSTUM {
+class FRUSTUM
+{
 public:
-       float frustum[6][4];
-       void GetFrustum();
-       int CubeInFrustum(float, float, float, float);
-       int CubeInFrustum(float, float, float, float, float);
-       int SphereInFrustum(float, float, float, float);
+    float frustum[6][4];
+    void GetFrustum();
+    int CubeInFrustum(float, float, float, float);
+    int CubeInFrustum(float, float, float, float, float);
+    int SphereInFrustum(float, float, float, float);
 };
 
 #endif
index debf51a872ea7cf40714da3f7967b693593e4253..3e6b25c8f79d1e941c615ceb48610dd32be9e745 100644 (file)
@@ -26,231 +26,246 @@ int directing;
 float dialoguetime;
 int dialoguegonethrough[20];
 
-namespace Game{
-    Texture terraintexture;
-    Texture terraintexture2;
-    Texture loadscreentexture;
-    Texture Maparrowtexture;
-    Texture Mapboxtexture;
-    Texture Mapcircletexture;
-    Texture cursortexture;
-    GLuint screentexture = 0;
-    GLuint screentexture2 = 0;
-    Texture Mainmenuitems[10];
+namespace Game
+{
+Texture terraintexture;
+Texture terraintexture2;
+Texture loadscreentexture;
+Texture Maparrowtexture;
+Texture Mapboxtexture;
+Texture Mapcircletexture;
+Texture cursortexture;
+GLuint screentexture = 0;
+GLuint screentexture2 = 0;
+Texture Mainmenuitems[10];
 
-    int selected = 0;
-    int keyselect = 0;
+int selected = 0;
+int keyselect = 0;
 
-    int newdetail = 0;
-    int newscreenwidth = 0;
-    int newscreenheight = 0;
+int newdetail = 0;
+int newscreenwidth = 0;
+int newscreenheight = 0;
 
-    bool gameon = 0;
-    float deltah = 0;
-    float deltav = 0;
-    int mousecoordh = 0;
-    int mousecoordv = 0;
-    int oldmousecoordh = 0;
-    int oldmousecoordv = 0;
-    float yaw = 0;
-    float pitch = 0;
-    SkyBox *skybox = NULL;
-    bool cameramode = 0;
-    bool firstload = 0;
+bool gameon = 0;
+float deltah = 0;
+float deltav = 0;
+int mousecoordh = 0;
+int mousecoordv = 0;
+int oldmousecoordh = 0;
+int oldmousecoordv = 0;
+float yaw = 0;
+float pitch = 0;
+SkyBox *skybox = NULL;
+bool cameramode = 0;
+bool firstload = 0;
 
-       Texture hawktexture;
-       float hawkyaw = 0;
-       float hawkcalldelay = 0;
-    float leveltime = 0;
-    float loadtime = 0;
+Texture hawktexture;
+float hawkyaw = 0;
+float hawkcalldelay = 0;
+float leveltime = 0;
+float loadtime = 0;
 
-    Model hawk;
-    XYZ hawkcoords;
-    XYZ realhawkcoords;
+Model hawk;
+XYZ hawkcoords;
+XYZ realhawkcoords;
 
-    Model eye;
-    Model iris;
-    Model cornea;
+Model eye;
+Model iris;
+Model cornea;
 
-    bool stealthloading = 0;
+bool stealthloading = 0;
 
-    int musictype = 0;
+int musictype = 0;
 
-    XYZ mapcenter;
-    float mapradius = 0;
+XYZ mapcenter;
+float mapradius = 0;
 
-    Text *text = NULL;
-    float fps = 0;
+Text *text = NULL;
+float fps = 0;
 
-    bool editorenabled = 0;
-    int editortype = 0;
-    float editorsize = 0;
-    float editoryaw = 0;
-    float editorpitch = 0;
+bool editorenabled = 0;
+int editortype = 0;
+float editorsize = 0;
+float editoryaw = 0;
+float editorpitch = 0;
 
-    int tryquit = 0;
+int tryquit = 0;
 
-    XYZ pathpoint[30];
-    int numpathpoints = 0;
-    int numpathpointconnect[30] = {};
-    int pathpointconnect[30][30] = {};
-    int pathpointselected = 0;
+XYZ pathpoint[30];
+int numpathpoints = 0;
+int numpathpointconnect[30] = {};
+int pathpointconnect[30][30] = {};
+int pathpointselected = 0;
 
-    int endgame = 0;
-    bool scoreadded = 0;
-    int numchallengelevels = 0;
+int endgame = 0;
+bool scoreadded = 0;
+int numchallengelevels = 0;
 
-    bool console = false;
-    char consoletext[15][256] = {};
-    int consolechars[15] = {};
-    bool chatting = 0;
-    char displaytext[15][256] = {};
-    int displaychars[15] = {};
-    float displaytime[15] = {};
-    float displayblinkdelay = 0;
-    bool displayblink = 0;
-    int displayselected = 0;
-    float consoleblinkdelay = 0;
-    bool consoleblink = 0;
-    int consoleselected = 0;
+bool console = false;
+char consoletext[15][256] = {};
+int consolechars[15] = {};
+bool chatting = 0;
+char displaytext[15][256] = {};
+int displaychars[15] = {};
+float displaytime[15] = {};
+float displayblinkdelay = 0;
+bool displayblink = 0;
+int displayselected = 0;
+float consoleblinkdelay = 0;
+bool consoleblink = 0;
+int consoleselected = 0;
 
-    unsigned short crouchkey=0,jumpkey=0,forwardkey=0,chatkey=0,backkey=0,leftkey=0,rightkey=0,drawkey=0,throwkey=0,attackkey=0;
-    unsigned short consolekey=0;
+unsigned short crouchkey = 0, jumpkey = 0, forwardkey = 0, chatkey = 0, backkey = 0, leftkey = 0, rightkey = 0, drawkey = 0, throwkey = 0, attackkey = 0;
+unsigned short consolekey = 0;
 
-    int loading = 0;
-    
-    int oldenvironment = 0;
-    int targetlevel = 0;
-    float changedelay = 0;
+int loading = 0;
 
-    bool waiting = false;
-    Account* accountactive = NULL;
+int oldenvironment = 0;
+int targetlevel = 0;
+float changedelay = 0;
+
+bool waiting = false;
+Account* accountactive = NULL;
 }
 
-void Game::fireSound(int sound) {
-       emit_sound_at(sound);
+void Game::fireSound(int sound)
+{
+    emit_sound_at(sound);
 }
 
-void Game::inputText(char* str, int* charselected, int* nb_chars) {
-       SDL_Event evenement;
-       
-       if(!waiting) {
-               waiting=true;
-               SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL);
-               SDL_EnableUNICODE(true);
-       }
+void Game::inputText(char* str, int* charselected, int* nb_chars)
+{
+    SDL_Event evenement;
+
+    if (!waiting) {
+        waiting = true;
+        SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
+        SDL_EnableUNICODE(true);
+    }
 
-       while(SDL_PollEvent(&evenement)) {
-       
-               switch(evenement.type) {
-                       case SDL_KEYDOWN:
-                               if(evenement.key.keysym.sym == SDLK_ESCAPE) {
-                                       for(int i=0;i<255;i++)
-                                               str[i]=0;
-                                       *nb_chars=0;
-                                       *charselected=0;
-                                       waiting=false;
-                               } else if(evenement.key.keysym.sym==SDLK_BACKSPACE){
-                                       if((*charselected)!=0) {
-                                               for(int i=(*charselected)-1;i<255;i++)
-                                                       str[i]=str[i+1];
-                                               str[255]=0;
-                                               (*charselected)--;
-                                               (*nb_chars)--;
-                                       }
-                               } else if(evenement.key.keysym.sym==SDLK_DELETE){
-                                       if((*charselected)<(*nb_chars)){
-                                               for(int i=(*charselected);i<255;i++)
-                                                       str[i]=str[i+1];
-                                               str[255]=0;
-                                               (*nb_chars)--;
-                                       }
-                               } else if(evenement.key.keysym.sym==SDLK_HOME){
-                                       (*charselected)=0;
-                               } else if(evenement.key.keysym.sym==SDLK_END){
-                                       (*charselected)=(*nb_chars);
-                               } else if(evenement.key.keysym.sym==SDLK_LEFT){
-                                       if((*charselected)!=0)
-                                               (*charselected)--;
-                               } else if(evenement.key.keysym.sym==SDLK_RIGHT){
-                                       if((*charselected)<(*nb_chars))
-                                               (*charselected)++;
-                               } else if(evenement.key.keysym.sym==SDLK_RETURN) {
-                                       waiting=false;
-                               } else if(evenement.key.keysym.unicode>=32&&evenement.key.keysym.unicode<127&&(*nb_chars)<60){
-                                       for(int i=255;i>=(*charselected)+1;i--)
-                                               str[i]=str[i-1];
-                                       str[*charselected]=evenement.key.keysym.unicode;
-                                       (*charselected)++;
-                                       (*nb_chars)++;
-                               }
-                       break;
-               }
-       }
-       
-       if(!waiting) {
-               SDL_EnableKeyRepeat(0,0); // disable key repeat
-               SDL_EnableUNICODE(false);
-       }
+    while (SDL_PollEvent(&evenement)) {
+
+        switch (evenement.type) {
+        case SDL_KEYDOWN:
+            if (evenement.key.keysym.sym == SDLK_ESCAPE) {
+                for (int i = 0; i < 255; i++)
+                    str[i] = 0;
+                *nb_chars = 0;
+                *charselected = 0;
+                waiting = false;
+            } else if (evenement.key.keysym.sym == SDLK_BACKSPACE) {
+                if ((*charselected) != 0) {
+                    for (int i = (*charselected) - 1; i < 255; i++)
+                        str[i] = str[i + 1];
+                    str[255] = 0;
+                    (*charselected)--;
+                    (*nb_chars)--;
+                }
+            } else if (evenement.key.keysym.sym == SDLK_DELETE) {
+                if ((*charselected) < (*nb_chars)) {
+                    for (int i = (*charselected); i < 255; i++)
+                        str[i] = str[i + 1];
+                    str[255] = 0;
+                    (*nb_chars)--;
+                }
+            } else if (evenement.key.keysym.sym == SDLK_HOME) {
+                (*charselected) = 0;
+            } else if (evenement.key.keysym.sym == SDLK_END) {
+                (*charselected) = (*nb_chars);
+            } else if (evenement.key.keysym.sym == SDLK_LEFT) {
+                if ((*charselected) != 0)
+                    (*charselected)--;
+            } else if (evenement.key.keysym.sym == SDLK_RIGHT) {
+                if ((*charselected) < (*nb_chars))
+                    (*charselected)++;
+            } else if (evenement.key.keysym.sym == SDLK_RETURN) {
+                waiting = false;
+            } else if (evenement.key.keysym.unicode >= 32 && evenement.key.keysym.unicode < 127 && (*nb_chars) < 60) {
+                for (int i = 255; i >= (*charselected) + 1; i--)
+                    str[i] = str[i - 1];
+                str[*charselected] = evenement.key.keysym.unicode;
+                (*charselected)++;
+                (*nb_chars)++;
+            }
+            break;
+        }
+    }
+
+    if (!waiting) {
+        SDL_EnableKeyRepeat(0, 0); // disable key repeat
+        SDL_EnableUNICODE(false);
+    }
 }
 
-int setKeySelected_thread(void* data) {
+int setKeySelected_thread(void* data)
+{
     using namespace Game;
-       int keycode=-1;
-       SDL_Event evenement;
-       while(keycode==-1) {
-               SDL_WaitEvent(&evenement);
-               switch(evenement.type) {
-                       case SDL_KEYDOWN:
-                               keycode = evenement.key.keysym.sym;
-                       break;
-                       case SDL_MOUSEBUTTONDOWN:
-                               keycode = SDLK_LAST+evenement.button.button;
-                       break;
-                       default:
-                       break;
-               }
-       }
-       if(keycode != SDLK_ESCAPE) {
-               fireSound();
-               switch(keyselect) {
-                       case 0: forwardkey=keycode;
-                       break;
-                       case 1: backkey=keycode;
-                       break;
-                       case 2: leftkey=keycode;
-                       break;
-                       case 3: rightkey=keycode;
-                       break;
-                       case 4: crouchkey=keycode;
-                       break;
-                       case 5: jumpkey=keycode;
-                       break;
-                       case 6: drawkey=keycode;
-                       break;
-                       case 7: throwkey=keycode;
-                       break;
-                       case 8: attackkey=keycode;
-                       break;
-                       case 9: consolekey=keycode;
-                       break;
-                       default:
-                       break;
-               }
-       }
-       keyselect=-1;
-       waiting=false;
+    int keycode = -1;
+    SDL_Event evenement;
+    while (keycode == -1) {
+        SDL_WaitEvent(&evenement);
+        switch (evenement.type) {
+        case SDL_KEYDOWN:
+            keycode = evenement.key.keysym.sym;
+            break;
+        case SDL_MOUSEBUTTONDOWN:
+            keycode = SDLK_LAST + evenement.button.button;
+            break;
+        default:
+            break;
+        }
+    }
+    if (keycode != SDLK_ESCAPE) {
+        fireSound();
+        switch (keyselect) {
+        case 0:
+            forwardkey = keycode;
+            break;
+        case 1:
+            backkey = keycode;
+            break;
+        case 2:
+            leftkey = keycode;
+            break;
+        case 3:
+            rightkey = keycode;
+            break;
+        case 4:
+            crouchkey = keycode;
+            break;
+        case 5:
+            jumpkey = keycode;
+            break;
+        case 6:
+            drawkey = keycode;
+            break;
+        case 7:
+            throwkey = keycode;
+            break;
+        case 8:
+            attackkey = keycode;
+            break;
+        case 9:
+            consolekey = keycode;
+            break;
+        default:
+            break;
+        }
+    }
+    keyselect = -1;
+    waiting = false;
     LoadMenu();
     return 0;
 }
 
-void Game::setKeySelected() {
-       waiting=true;
+void Game::setKeySelected()
+{
+    waiting = true;
     printf("launch thread\n");
-       SDL_Thread* thread = SDL_CreateThread(setKeySelected_thread,NULL);
+    SDL_Thread* thread = SDL_CreateThread(setKeySelected_thread, NULL);
     if ( thread == NULL ) {
         fprintf(stderr, "Unable to create thread: %s\n", SDL_GetError());
-               waiting=false;
+        waiting = false;
         return;
     }
 }
index a378efcd28b3fb249a06d6f4c04769ac97ef4f01..eb07d20c8ce7b9ddb9ef49a8b51f3cc1fc0c9f9e 100644 (file)
@@ -62,123 +62,124 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #define NB_CAMPAIGN_MENU_ITEM 7
 
-namespace Game {
-    extern Texture terraintexture;
-    extern Texture terraintexture2;
-    extern Texture loadscreentexture;
-    extern Texture Maparrowtexture;
-    extern Texture Mapboxtexture;
-    extern Texture Mapcircletexture;
-    extern Texture cursortexture;
-    extern GLuint screentexture;
-    extern GLuint screentexture2;
-    extern Texture Mainmenuitems[10];
-
-    extern int selected;
-    extern int keyselect;
-
-    extern int newdetail;
-    extern int newscreenwidth;
-    extern int newscreenheight;
-
-    extern bool gameon;
-    extern float deltah,deltav;
-    extern int mousecoordh,mousecoordv;
-    extern int oldmousecoordh,oldmousecoordv;
-    extern float yaw,pitch;
-    extern SkyBox *skybox;
-    extern bool cameramode;
-    extern bool firstload;
-
-    extern float leveltime;
-    extern float loadtime;
-
-    extern Model hawk;
-    extern XYZ hawkcoords;
-    extern XYZ realhawkcoords;
-    extern Texture hawktexture;
-    extern float hawkyaw;
-    extern float hawkcalldelay;
-
-    extern Model eye;
-    extern Model iris;
-    extern Model cornea;
-
-    extern bool stealthloading;
-    extern int loading;
-
-    extern int musictype;
-
-    extern XYZ mapcenter;
-    extern float mapradius;
-
-    extern Text *text;
-    extern float fps;
-
-    extern bool editorenabled;
-    extern int editortype;
-    extern float editorsize;
-    extern float editoryaw;
-    extern float editorpitch;
-
-    extern int tryquit;
-
-    extern XYZ pathpoint[30];
-    extern int numpathpoints;
-    extern int numpathpointconnect[30];
-    extern int pathpointconnect[30][30];
-    extern int pathpointselected;
-
-    extern int endgame;
-    extern bool scoreadded;
-    extern int numchallengelevels;
-
-    extern bool console;
-    extern char consoletext[15][256];
-    extern int consolechars[15];
-    extern bool chatting;
-    extern char displaytext[15][256];
-    extern int displaychars[15];
-    extern float displaytime[15];
-    extern float displayblinkdelay;
-    extern bool displayblink;
-    extern int displayselected;
-    extern float consoleblinkdelay;
-    extern bool consoleblink;
-    extern int consoleselected;
-
-    extern int oldenvironment;
-    extern int targetlevel;
-    extern float changedelay;
-
-    extern bool waiting;
-    extern Account* accountactive;
-
-    extern unsigned short crouchkey,jumpkey,forwardkey,chatkey,backkey,leftkey,rightkey,drawkey,throwkey,attackkey;
-    extern unsigned short consolekey;
-
-    void newGame();
-    void deleteGame();
-
-    void InitGame();
-    void LoadStuff();
-    void LoadScreenTexture();
-    void LoadingScreen();
-    int DrawGLScene(StereoSide side);
-    void LoadMenu();
-    void Tick();
-    void TickOnce();
-    void TickOnceAfter();
-    void SetUpLighting();
-    GLvoid ReSizeGLScene(float fov, float near);
-    int checkcollide(XYZ startpoint, XYZ endpoint);
-    int checkcollide(XYZ startpoint, XYZ endpoint, int what);
-    
-    void fireSound(int sound=fireendsound);
-    void setKeySelected();
-
-    void inputText(char* str, int* charselected, int* nb_chars);
-    void flash();
+namespace Game
+{
+extern Texture terraintexture;
+extern Texture terraintexture2;
+extern Texture loadscreentexture;
+extern Texture Maparrowtexture;
+extern Texture Mapboxtexture;
+extern Texture Mapcircletexture;
+extern Texture cursortexture;
+extern GLuint screentexture;
+extern GLuint screentexture2;
+extern Texture Mainmenuitems[10];
+
+extern int selected;
+extern int keyselect;
+
+extern int newdetail;
+extern int newscreenwidth;
+extern int newscreenheight;
+
+extern bool gameon;
+extern float deltah, deltav;
+extern int mousecoordh, mousecoordv;
+extern int oldmousecoordh, oldmousecoordv;
+extern float yaw, pitch;
+extern SkyBox *skybox;
+extern bool cameramode;
+extern bool firstload;
+
+extern float leveltime;
+extern float loadtime;
+
+extern Model hawk;
+extern XYZ hawkcoords;
+extern XYZ realhawkcoords;
+extern Texture hawktexture;
+extern float hawkyaw;
+extern float hawkcalldelay;
+
+extern Model eye;
+extern Model iris;
+extern Model cornea;
+
+extern bool stealthloading;
+extern int loading;
+
+extern int musictype;
+
+extern XYZ mapcenter;
+extern float mapradius;
+
+extern Text *text;
+extern float fps;
+
+extern bool editorenabled;
+extern int editortype;
+extern float editorsize;
+extern float editoryaw;
+extern float editorpitch;
+
+extern int tryquit;
+
+extern XYZ pathpoint[30];
+extern int numpathpoints;
+extern int numpathpointconnect[30];
+extern int pathpointconnect[30][30];
+extern int pathpointselected;
+
+extern int endgame;
+extern bool scoreadded;
+extern int numchallengelevels;
+
+extern bool console;
+extern char consoletext[15][256];
+extern int consolechars[15];
+extern bool chatting;
+extern char displaytext[15][256];
+extern int displaychars[15];
+extern float displaytime[15];
+extern float displayblinkdelay;
+extern bool displayblink;
+extern int displayselected;
+extern float consoleblinkdelay;
+extern bool consoleblink;
+extern int consoleselected;
+
+extern int oldenvironment;
+extern int targetlevel;
+extern float changedelay;
+
+extern bool waiting;
+extern Account* accountactive;
+
+extern unsigned short crouchkey, jumpkey, forwardkey, chatkey, backkey, leftkey, rightkey, drawkey, throwkey, attackkey;
+extern unsigned short consolekey;
+
+void newGame();
+void deleteGame();
+
+void InitGame();
+void LoadStuff();
+void LoadScreenTexture();
+void LoadingScreen();
+int DrawGLScene(StereoSide side);
+void LoadMenu();
+void Tick();
+void TickOnce();
+void TickOnceAfter();
+void SetUpLighting();
+GLvoid ReSizeGLScene(float fov, float near);
+int checkcollide(XYZ startpoint, XYZ endpoint);
+int checkcollide(XYZ startpoint, XYZ endpoint, int what);
+
+void fireSound(int sound = fireendsound);
+void setKeySelected();
+
+void inputText(char* str, int* charselected, int* nb_chars);
+void flash();
 }
 
 #ifndef __forceinline
@@ -192,7 +193,9 @@ static __forceinline void swap_gl_buffers(void)
     SDL_GL_SwapBuffers();
 }
 
-extern "C" { void UndefinedSymbolToExposeStubbedCode(void); }
+extern "C" {
+    void UndefinedSymbolToExposeStubbedCode(void);
+}
 //#define STUBBED(x) UndefinedSymbolToExposeStubbedCode();
 #define STUBBED(x) { static bool seen = false; if (!seen) { seen = true; fprintf(stderr, "STUBBED: %s at %s:%d\n", x, __FILE__, __LINE__); } }
 //#define STUBBED(x)
@@ -224,8 +227,8 @@ extern float dialoguetime;
 extern int dialoguegonethrough[20];
 
 enum maptypes {
-  mapkilleveryone, mapgosomewhere,
-  mapkillsomeone, mapkillmost // These two are unused
+    mapkilleveryone, mapgosomewhere,
+    mapkillsomeone, mapkillmost // These two are unused
 };
 
 enum pathtypes {wpkeepwalking, wppause};
@@ -233,11 +236,12 @@ enum pathtypes {wpkeepwalking, wppause};
 static const char *pathtypenames[] = {"keepwalking", "pause"};
 
 enum editortypes {typeactive, typesitting, typesittingwall, typesleeping,
-                 typedead1, typedead2, typedead3, typedead4};
+                  typedead1, typedead2, typedead3, typedead4
+                 };
 
 static const char *editortypenames[] = {
-  "active", "sitting", "sitting wall", "sleeping",
-  "dead1", "dead2", "dead3", "dead4"
+    "active", "sitting", "sitting wall", "sleeping",
+    "dead1", "dead2", "dead3", "dead4"
 };
 
 #endif
index a6ab119d200f9277b7db76344693dfaa5e94d679..bb3f00cbe8ae8d06161120bc3264a86382e96867 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -35,7 +35,7 @@ extern float multiplier;
 extern float sps;
 extern float viewdistance;
 extern float fadestart;
-extern float screenwidth,screenheight;
+extern float screenwidth, screenheight;
 extern int kTextureSize;
 extern FRUSTUM frustum;
 extern Light light;
@@ -57,7 +57,7 @@ extern float targetblurness;
 extern float playerdist;
 extern bool cellophane;
 extern bool freeze;
-extern float flashamount,flashr,flashg,flashb;
+extern float flashamount, flashr, flashg, flashb;
 extern int flashdelay;
 extern int netstate;
 extern float motionbluramount;
@@ -117,16 +117,17 @@ int change = 0;
 
 
 enum drawmodes {
-  normalmode, motionblurmode, radialzoommode,
-  realmotionblurmode, doublevisionmode, glowmode,
+    normalmode, motionblurmode, radialzoommode,
+    realmotionblurmode, doublevisionmode, glowmode,
 };
 
-void Game::flash() { // shouldn't be that way, these should be attributes and Person class should not change rendering.
-       flashr=1;
-       flashg=0;
-       flashb=0;
-       flashamount=1;
-       flashdelay=1;
+void Game::flash()   // shouldn't be that way, these should be attributes and Person class should not change rendering.
+{
+    flashr = 1;
+    flashg = 0;
+    flashb = 0;
+    flashamount = 1;
+    flashdelay = 1;
 }
 
 void DrawMenu();
@@ -134,869 +135,873 @@ void DrawMenu();
 /*********************> DrawGLScene() <*****/
 int Game::DrawGLScene(StereoSide side)
 {
-       static float texcoordwidth,texcoordheight;
-       static float texviewwidth, texviewheight;
-       static int i,j,k,l;
-       static GLubyte color;
-       static XYZ checkpoint;
-       static float tempmult;
-       float tutorialopac;
-       static char string[256]="";
-       static char string2[256]="";
-       static char string3[256]="";
+    static float texcoordwidth, texcoordheight;
+    static float texviewwidth, texviewheight;
+    static int i, j, k, l;
+    static GLubyte color;
+    static XYZ checkpoint;
+    static float tempmult;
+    float tutorialopac;
+    static char string[256] = "";
+    static char string2[256] = "";
+    static char string3[256] = "";
     static int drawmode = 0;
 
-       if ( stereomode == stereoAnaglyph ) {
-               switch(side) {
-                       case stereoLeft: glColorMask( 0.0, 1.0, 1.0, 1.0 ); break;
-                       case stereoRight: glColorMask( 1.0, 0.0, 0.0, 1.0 ); break;
-               }
-       } else {
-               glColorMask( 1.0, 1.0, 1.0, 1.0 );
-               
-               if ( stereomode == stereoHorizontalInterlaced || stereomode == stereoVerticalInterlaced ) {
-                       glStencilFunc(side == stereoLeft ? GL_NOTEQUAL : GL_EQUAL, 0x01, 0x01);
-               }
-       }
-
-       if(freeze||winfreeze||(mainmenu&&gameon)||(!gameon&&gamestarted)){
-               tempmult=multiplier;
-               multiplier=0;
-       }
-
-       if(!mainmenu){
-               if(editorenabled){
-                       numboundaries=mapradius*2;
-                       if(numboundaries>360)numboundaries=360;
-                       for(i=0;i<numboundaries;i++){
-                               boundary[i]=0;
-                               boundary[i].z=1;
-                               boundary[i]=mapcenter+DoRotation(boundary[i]*mapradius,0,i*(360/((float)(numboundaries))),0);
-                       }
-               }
-
-               SetUpLighting();
-
-               static int changed;
-               changed=0;
-
-               int olddrawmode=drawmode;
-               if(ismotionblur&&!loading){
-                       if((findLengthfast(&player[0].velocity)>200)&&velocityblur&&!cameramode){
-                               drawmode=motionblurmode;
-                               motionbluramount=200/(findLengthfast(&player[0].velocity));
-                               changed=1;
-                       }
-                       if(player[0].damage-player[0].superpermanentdamage>(player[0].damagetolerance-player[0].superpermanentdamage)*1/2&&damageeffects&&!cameramode){
-                               drawmode=doublevisionmode;
-                               changed=1;
-                       }
-               }
-
-               if(slomo&&!loading){
-                       if(ismotionblur)
-                               drawmode=motionblurmode;
-                       motionbluramount=.2;
-                       slomodelay-=multiplier;
-                       if(slomodelay<0)
-                slomo=0;
-                       camerashake=0;
-                       changed=1;
-               }
-               if((!changed&&!slomo)||loading){
-                       drawmode=normalmode;
-                       if(ismotionblur&&(/*fps>100||*/alwaysblur)){
-                               if(olddrawmode!=realmotionblurmode)
-                    change=1;
-                               else
-                    change=0;
-                               drawmode=realmotionblurmode;
-                       }else if(olddrawmode==realmotionblurmode)
-                change=2;
-                       else
-                change=0;
-               }
-
-               if(freeze||winfreeze||(mainmenu&&gameon)||(!gameon&&gamestarted))
-            drawmode=normalmode;
-               if((freeze||winfreeze)&&ismotionblur&&!mainmenu)
-            drawmode=radialzoommode;
-
-               if(winfreeze||mainmenu)drawmode=normalmode;
+    if ( stereomode == stereoAnaglyph ) {
+        switch (side) {
+        case stereoLeft:
+            glColorMask( 0.0, 1.0, 1.0, 1.0 );
+            break;
+        case stereoRight:
+            glColorMask( 1.0, 0.0, 0.0, 1.0 );
+            break;
+        }
+    } else {
+        glColorMask( 1.0, 1.0, 1.0, 1.0 );
+
+        if ( stereomode == stereoHorizontalInterlaced || stereomode == stereoVerticalInterlaced ) {
+            glStencilFunc(side == stereoLeft ? GL_NOTEQUAL : GL_EQUAL, 0x01, 0x01);
+        }
+    }
+
+    if (freeze || winfreeze || (mainmenu && gameon) || (!gameon && gamestarted)) {
+        tempmult = multiplier;
+        multiplier = 0;
+    }
+
+    if (!mainmenu) {
+        if (editorenabled) {
+            numboundaries = mapradius * 2;
+            if (numboundaries > 360)numboundaries = 360;
+            for (i = 0; i < numboundaries; i++) {
+                boundary[i] = 0;
+                boundary[i].z = 1;
+                boundary[i] = mapcenter + DoRotation(boundary[i] * mapradius, 0, i * (360 / ((float)(numboundaries))), 0);
+            }
+        }
+
+        SetUpLighting();
+
+        static int changed;
+        changed = 0;
+
+        int olddrawmode = drawmode;
+        if (ismotionblur && !loading) {
+            if ((findLengthfast(&player[0].velocity) > 200) && velocityblur && !cameramode) {
+                drawmode = motionblurmode;
+                motionbluramount = 200 / (findLengthfast(&player[0].velocity));
+                changed = 1;
+            }
+            if (player[0].damage - player[0].superpermanentdamage > (player[0].damagetolerance - player[0].superpermanentdamage) * 1 / 2 && damageeffects && !cameramode) {
+                drawmode = doublevisionmode;
+                changed = 1;
+            }
+        }
+
+        if (slomo && !loading) {
+            if (ismotionblur)
+                drawmode = motionblurmode;
+            motionbluramount = .2;
+            slomodelay -= multiplier;
+            if (slomodelay < 0)
+                slomo = 0;
+            camerashake = 0;
+            changed = 1;
+        }
+        if ((!changed && !slomo) || loading) {
+            drawmode = normalmode;
+            if (ismotionblur && (/*fps>100||*/alwaysblur)) {
+                if (olddrawmode != realmotionblurmode)
+                    change = 1;
+                else
+                    change = 0;
+                drawmode = realmotionblurmode;
+            } else if (olddrawmode == realmotionblurmode)
+                change = 2;
+            else
+                change = 0;
+        }
+
+        if (freeze || winfreeze || (mainmenu && gameon) || (!gameon && gamestarted))
+            drawmode = normalmode;
+        if ((freeze || winfreeze) && ismotionblur && !mainmenu)
+            drawmode = radialzoommode;
+
+        if (winfreeze || mainmenu)drawmode = normalmode;
 
 #if PLATFORM_MACOSX
-               if(drawmode==glowmode){
-                       RGBColor color2;
-                       color2.red=0;
-                       color2.green=0;
-                       color2.blue=0;
-                       DSpContext_FadeGamma(NULL,200,&color2);
-               }
+        if (drawmode == glowmode) {
+            RGBColor color2;
+            color2.red = 0;
+            color2.green = 0;
+            color2.blue = 0;
+            DSpContext_FadeGamma(NULL, 200, &color2);
+        }
 #endif
 
-               if(drawtoggle!=2)
-            drawtoggle=1-drawtoggle;
-
-               if(!texcoordwidth){
-                       texviewwidth=kTextureSize;
-                       if(texviewwidth>screenwidth)
-                texviewwidth=screenwidth;
-                       texviewheight=kTextureSize;
-                       if(texviewheight>screenheight)
-                texviewheight=screenheight;
-
-                       texcoordwidth=screenwidth/kTextureSize;
-                       texcoordheight=screenheight/kTextureSize;
-                       if(texcoordwidth>1)
-                texcoordwidth=1;
-                       if(texcoordheight>1)
-                texcoordheight=1;
-               }
-
-               glDrawBuffer(GL_BACK);
-               glReadBuffer(GL_BACK);
-
-               //glFinish();
-               static XYZ terrainlight;
-               static float distance;
-               if(drawmode==normalmode)
-            Game::ReSizeGLScene(90,.1f);
-               if(drawmode!=normalmode)
-            glViewport(0,0,texviewwidth,texviewheight);        
-               glDepthFunc(GL_LEQUAL);
-               glDepthMask(1);
-               glAlphaFunc(GL_GREATER, 0.0001f);
-               glEnable(GL_ALPHA_TEST);
-               glClearColor(0.25f, 0.25f, 0.25f, 1.0f);
-               glClear(GL_DEPTH_BUFFER_BIT);
-
-               glMatrixMode (GL_MODELVIEW);
-               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-               glLoadIdentity ();
-               
-               // Move the camera for the current eye's point of view.
-               // Reverse the movement if we're reversing stereo
-               glTranslatef((stereoseparation/2) * side * (stereoreverse  ? -1 : 1), 0, 0);
-               
+        if (drawtoggle != 2)
+            drawtoggle = 1 - drawtoggle;
+
+        if (!texcoordwidth) {
+            texviewwidth = kTextureSize;
+            if (texviewwidth > screenwidth)
+                texviewwidth = screenwidth;
+            texviewheight = kTextureSize;
+            if (texviewheight > screenheight)
+                texviewheight = screenheight;
+
+            texcoordwidth = screenwidth / kTextureSize;
+            texcoordheight = screenheight / kTextureSize;
+            if (texcoordwidth > 1)
+                texcoordwidth = 1;
+            if (texcoordheight > 1)
+                texcoordheight = 1;
+        }
+
+        glDrawBuffer(GL_BACK);
+        glReadBuffer(GL_BACK);
+
+        //glFinish();
+        static XYZ terrainlight;
+        static float distance;
+        if (drawmode == normalmode)
+            Game::ReSizeGLScene(90, .1f);
+        if (drawmode != normalmode)
+            glViewport(0, 0, texviewwidth, texviewheight);
+        glDepthFunc(GL_LEQUAL);
+        glDepthMask(1);
+        glAlphaFunc(GL_GREATER, 0.0001f);
+        glEnable(GL_ALPHA_TEST);
+        glClearColor(0.25f, 0.25f, 0.25f, 1.0f);
+        glClear(GL_DEPTH_BUFFER_BIT);
+
+        glMatrixMode (GL_MODELVIEW);
+        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+        glLoadIdentity ();
+
+        // Move the camera for the current eye's point of view.
+        // Reverse the movement if we're reversing stereo
+        glTranslatef((stereoseparation / 2) * side * (stereoreverse  ? -1 : 1), 0, 0);
+
         //camera effects
-               if(!cameramode&&!freeze&&!winfreeze){
+        if (!cameramode && !freeze && !winfreeze) {
             //shake
-                       glRotatef(float(Random()%100)/10*camerashake/*+(woozy*woozy)/10*/,0,0,1);
+            glRotatef(float(Random() % 100) / 10 * camerashake/*+(woozy*woozy)/10*/, 0, 0, 1);
             //sway
-                       glRotatef(pitch+sin(woozy/2)*(player[0].damage/player[0].damagetolerance)*5,1,0,0);
-                       glRotatef(yaw+sin(woozy)*(player[0].damage/player[0].damagetolerance)*5,0,1,0);
-               }
-               if(cameramode||freeze||winfreeze){
-                       glRotatef(pitch,1,0,0);
-                       glRotatef(yaw,0,1,0);
-               }
-
-               if(environment==desertenvironment){
-                       glRotatef((float)(abs(Random()%100))/3000-1,1,0,0);
-                       glRotatef((float)(abs(Random()%100))/3000-1,0,1,0);
-               }
-               SetUpLight(&light,0);
-               glPushMatrix();
+            glRotatef(pitch + sin(woozy / 2) * (player[0].damage / player[0].damagetolerance) * 5, 1, 0, 0);
+            glRotatef(yaw + sin(woozy) * (player[0].damage / player[0].damagetolerance) * 5, 0, 1, 0);
+        }
+        if (cameramode || freeze || winfreeze) {
+            glRotatef(pitch, 1, 0, 0);
+            glRotatef(yaw, 0, 1, 0);
+        }
+
+        if (environment == desertenvironment) {
+            glRotatef((float)(abs(Random() % 100)) / 3000 - 1, 1, 0, 0);
+            glRotatef((float)(abs(Random() % 100)) / 3000 - 1, 0, 1, 0);
+        }
+        SetUpLight(&light, 0);
+        glPushMatrix();
 
         //heat blur effect in desert
-               if(abs(blurness-targetblurness)<multiplier*10||abs(blurness-targetblurness)>2){
-                       blurness=targetblurness;
-                       targetblurness=(float)(abs(Random()%100))/40;
-               }
-               if(blurness<targetblurness) 
-                       blurness+=multiplier*5;
-               else
-                       blurness-=multiplier*5;
-
-               if(environment==desertenvironment&&detail==2)
-            glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, blurness+.4 );
-               if(environment==desertenvironment){
-                       glRotatef((float)(abs(Random()%100))/1000,1,0,0);
-                       glRotatef((float)(abs(Random()%100))/1000,0,1,0);
-               }       
-               skybox->draw();
-               glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0);
-               glPopMatrix();
-               glTranslatef(-viewer.x,-viewer.y,-viewer.z);
-               frustum.GetFrustum();
-
-               //make shadow decals on terrain and objects
-               static XYZ point;
-               static float size,opacity,rotation;
-               rotation=0;
-               for(k=0;k<numplayers;k++){
-                       if(!player[k].skeleton.free&&player[k].playerdetail&&player[k].howactive<typesleeping)
-                               if(frustum.SphereInFrustum(player[k].coords.x,player[k].coords.y+player[k].scale*3,player[k].coords.z,player[k].scale*7)&&player[k].occluded<25)
-                                       for(i=0;i<player[k].skeleton.num_joints;i++){
-                                               if(player[k].skeleton.joints[i].label==leftknee||player[k].skeleton.joints[i].label==rightknee||player[k].skeleton.joints[i].label==groin){
-                                                       point=DoRotation(player[k].skeleton.joints[i].position,0,player[k].yaw,0)*player[k].scale+player[k].coords;
-                                                       size=.4f;
-                                                       opacity=.4-player[k].skeleton.joints[i].position.y*player[k].scale/5-(player[k].coords.y-terrain.getHeight(player[k].coords.x,player[k].coords.z))/10;
-                                                       if(k!=0&&tutoriallevel==1){
-                                                               opacity=.2+.2*sin(smoketex*6+i)-player[k].skeleton.joints[i].position.y*player[k].scale/5-(player[k].coords.y-terrain.getHeight(player[k].coords.x,player[k].coords.z))/10;
-                                                       }
-                                                       terrain.MakeDecal(shadowdecal,point,size,opacity,rotation);
-                                                       for(l=0;l<terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz];l++){
-                                                               j=terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
-                                                               if(objects.position[j].y<player[k].coords.y||objects.type[j]==tunneltype||objects.type[j]==weirdtype){
-                                                                       point=DoRotation(DoRotation(player[k].skeleton.joints[i].position,0,player[k].yaw,0)*player[k].scale+player[k].coords-objects.position[j],0,-objects.yaw[j],0);
-                                                                       size=.4f;
-                                                                       opacity=.4f;
-                                                                       if(k!=0&&tutoriallevel==1){
-                                                                               opacity=.2+.2*sin(smoketex*6+i);
-                                                                       }
-                                                                       objects.model[j].MakeDecal(shadowdecal,&point,&size,&opacity,&rotation);
-                                                               }
-                                                       }
-                                               }
-                                       }
-            if((player[k].skeleton.free||player[k].howactive>=typesleeping)&&player[k].playerdetail)
-                if(frustum.SphereInFrustum(player[k].coords.x,player[k].coords.y,player[k].coords.z,player[k].scale*5)&&player[k].occluded<25)
-                    for(i=0;i<player[k].skeleton.num_joints;i++){
-                        if(player[k].skeleton.joints[i].label==leftknee||player[k].skeleton.joints[i].label==rightknee||player[k].skeleton.joints[i].label==groin||player[k].skeleton.joints[i].label==leftelbow||player[k].skeleton.joints[i].label==rightelbow||player[k].skeleton.joints[i].label==neck){
-                            if(player[k].skeleton.free)
-                                point=player[k].skeleton.joints[i].position*player[k].scale+player[k].coords;
+        if (abs(blurness - targetblurness) < multiplier * 10 || abs(blurness - targetblurness) > 2) {
+            blurness = targetblurness;
+            targetblurness = (float)(abs(Random() % 100)) / 40;
+        }
+        if (blurness < targetblurness)
+            blurness += multiplier * 5;
+        else
+            blurness -= multiplier * 5;
+
+        if (environment == desertenvironment && detail == 2)
+            glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, blurness + .4 );
+        if (environment == desertenvironment) {
+            glRotatef((float)(abs(Random() % 100)) / 1000, 1, 0, 0);
+            glRotatef((float)(abs(Random() % 100)) / 1000, 0, 1, 0);
+        }
+        skybox->draw();
+        glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0);
+        glPopMatrix();
+        glTranslatef(-viewer.x, -viewer.y, -viewer.z);
+        frustum.GetFrustum();
+
+        //make shadow decals on terrain and objects
+        static XYZ point;
+        static float size, opacity, rotation;
+        rotation = 0;
+        for (k = 0; k < numplayers; k++) {
+            if (!player[k].skeleton.free && player[k].playerdetail && player[k].howactive < typesleeping)
+                if (frustum.SphereInFrustum(player[k].coords.x, player[k].coords.y + player[k].scale * 3, player[k].coords.z, player[k].scale * 7) && player[k].occluded < 25)
+                    for (i = 0; i < player[k].skeleton.num_joints; i++) {
+                        if (player[k].skeleton.joints[i].label == leftknee || player[k].skeleton.joints[i].label == rightknee || player[k].skeleton.joints[i].label == groin) {
+                            point = DoRotation(player[k].skeleton.joints[i].position, 0, player[k].yaw, 0) * player[k].scale + player[k].coords;
+                            size = .4f;
+                            opacity = .4 - player[k].skeleton.joints[i].position.y * player[k].scale / 5 - (player[k].coords.y - terrain.getHeight(player[k].coords.x, player[k].coords.z)) / 10;
+                            if (k != 0 && tutoriallevel == 1) {
+                                opacity = .2 + .2 * sin(smoketex * 6 + i) - player[k].skeleton.joints[i].position.y * player[k].scale / 5 - (player[k].coords.y - terrain.getHeight(player[k].coords.x, player[k].coords.z)) / 10;
+                            }
+                            terrain.MakeDecal(shadowdecal, point, size, opacity, rotation);
+                            for (l = 0; l < terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz]; l++) {
+                                j = terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
+                                if (objects.position[j].y < player[k].coords.y || objects.type[j] == tunneltype || objects.type[j] == weirdtype) {
+                                    point = DoRotation(DoRotation(player[k].skeleton.joints[i].position, 0, player[k].yaw, 0) * player[k].scale + player[k].coords - objects.position[j], 0, -objects.yaw[j], 0);
+                                    size = .4f;
+                                    opacity = .4f;
+                                    if (k != 0 && tutoriallevel == 1) {
+                                        opacity = .2 + .2 * sin(smoketex * 6 + i);
+                                    }
+                                    objects.model[j].MakeDecal(shadowdecal, &point, &size, &opacity, &rotation);
+                                }
+                            }
+                        }
+                    }
+            if ((player[k].skeleton.free || player[k].howactive >= typesleeping) && player[k].playerdetail)
+                if (frustum.SphereInFrustum(player[k].coords.x, player[k].coords.y, player[k].coords.z, player[k].scale * 5) && player[k].occluded < 25)
+                    for (i = 0; i < player[k].skeleton.num_joints; i++) {
+                        if (player[k].skeleton.joints[i].label == leftknee || player[k].skeleton.joints[i].label == rightknee || player[k].skeleton.joints[i].label == groin || player[k].skeleton.joints[i].label == leftelbow || player[k].skeleton.joints[i].label == rightelbow || player[k].skeleton.joints[i].label == neck) {
+                            if (player[k].skeleton.free)
+                                point = player[k].skeleton.joints[i].position * player[k].scale + player[k].coords;
                             else
-                                point=DoRotation(player[k].skeleton.joints[i].position,0,player[k].yaw,0)*player[k].scale+player[k].coords;
-                            size=.4f;
-                            opacity=.4-player[k].skeleton.joints[i].position.y*player[k].scale/5-(player[k].coords.y-terrain.getHeight(player[k].coords.x,player[k].coords.z))/5;
-                            if(k!=0&&tutoriallevel==1){
-                                opacity=.2+.2*sin(smoketex*6+i)-player[k].skeleton.joints[i].position.y*player[k].scale/5-(player[k].coords.y-terrain.getHeight(player[k].coords.x,player[k].coords.z))/10;
+                                point = DoRotation(player[k].skeleton.joints[i].position, 0, player[k].yaw, 0) * player[k].scale + player[k].coords;
+                            size = .4f;
+                            opacity = .4 - player[k].skeleton.joints[i].position.y * player[k].scale / 5 - (player[k].coords.y - terrain.getHeight(player[k].coords.x, player[k].coords.z)) / 5;
+                            if (k != 0 && tutoriallevel == 1) {
+                                opacity = .2 + .2 * sin(smoketex * 6 + i) - player[k].skeleton.joints[i].position.y * player[k].scale / 5 - (player[k].coords.y - terrain.getHeight(player[k].coords.x, player[k].coords.z)) / 10;
                             }
-                            terrain.MakeDecal(shadowdecal,point,size,opacity*.7,rotation);
-                            for(l=0;l<terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz];l++){
-                                j=terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
-                                if(objects.position[j].y<player[k].coords.y||objects.type[j]==tunneltype||objects.type[j]==weirdtype){
-                                    if(player[k].skeleton.free)point=DoRotation(player[k].skeleton.joints[i].position*player[k].scale+player[k].coords-objects.position[j],0,-objects.yaw[j],0);
-                                    else point=DoRotation(DoRotation(player[k].skeleton.joints[i].position,0,player[k].yaw,0)*player[k].scale+player[k].coords-objects.position[j],0,-objects.yaw[j],0);
-                                    size=.4f;
-                                    opacity=.4f;
-                                    if(k!=0&&tutoriallevel==1){
-                                        opacity=.2+.2*sin(smoketex*6+i);
+                            terrain.MakeDecal(shadowdecal, point, size, opacity * .7, rotation);
+                            for (l = 0; l < terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz]; l++) {
+                                j = terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
+                                if (objects.position[j].y < player[k].coords.y || objects.type[j] == tunneltype || objects.type[j] == weirdtype) {
+                                    if (player[k].skeleton.free)point = DoRotation(player[k].skeleton.joints[i].position * player[k].scale + player[k].coords - objects.position[j], 0, -objects.yaw[j], 0);
+                                    else point = DoRotation(DoRotation(player[k].skeleton.joints[i].position, 0, player[k].yaw, 0) * player[k].scale + player[k].coords - objects.position[j], 0, -objects.yaw[j], 0);
+                                    size = .4f;
+                                    opacity = .4f;
+                                    if (k != 0 && tutoriallevel == 1) {
+                                        opacity = .2 + .2 * sin(smoketex * 6 + i);
                                     }
-                                    objects.model[j].MakeDecal(shadowdecal,&point,&size,&opacity,&rotation);
+                                    objects.model[j].MakeDecal(shadowdecal, &point, &size, &opacity, &rotation);
                                 }
                             }
                         }
                     }
 
-            if(!player[k].playerdetail)
-                if(frustum.SphereInFrustum(player[k].coords.x,player[k].coords.y,player[k].coords.z,player[k].scale*5)){
-                    point=player[k].coords;
-                    size=.7;
-                    opacity=.4-(player[k].coords.y-terrain.getHeight(player[k].coords.x,player[k].coords.z))/5;
-                    terrain.MakeDecal(shadowdecal,point,size,opacity*.7,rotation);
-                    for(l=0;l<terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz];l++){
-                        j=terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
-                        point=DoRotation(player[k].coords-objects.position[j],0,-objects.yaw[j],0);
-                        size=.7;
-                        opacity=.4f;
-                        objects.model[j].MakeDecal(shadowdecal,&point,&size,&opacity,&rotation);
+            if (!player[k].playerdetail)
+                if (frustum.SphereInFrustum(player[k].coords.x, player[k].coords.y, player[k].coords.z, player[k].scale * 5)) {
+                    point = player[k].coords;
+                    size = .7;
+                    opacity = .4 - (player[k].coords.y - terrain.getHeight(player[k].coords.x, player[k].coords.z)) / 5;
+                    terrain.MakeDecal(shadowdecal, point, size, opacity * .7, rotation);
+                    for (l = 0; l < terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz]; l++) {
+                        j = terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
+                        point = DoRotation(player[k].coords - objects.position[j], 0, -objects.yaw[j], 0);
+                        size = .7;
+                        opacity = .4f;
+                        objects.model[j].MakeDecal(shadowdecal, &point, &size, &opacity, &rotation);
                     }
                 }
-               }
-
-               //Terrain
-               glEnable(GL_TEXTURE_2D);
-               glDepthMask(1);
-               glEnable(GL_DEPTH_TEST);
-               glEnable(GL_CULL_FACE);
-               glDisable(GL_BLEND);
-               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
-               terraintexture.bind();
-               terrain.draw(0);
-               terraintexture2.bind();
-               terrain.draw(1);
-               //glBindTexture( GL_TEXTURE_2D, terraintexture3);
-               //glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-               //terrain.draw(2);
-
-               terrain.drawdecals();
-
-               //Model
-               glEnable(GL_CULL_FACE);
-               glEnable(GL_LIGHTING);
-               glDisable(GL_BLEND);
-               glEnable(GL_TEXTURE_2D);
-               glDepthMask(1);
-
-               glEnable(GL_COLOR_MATERIAL);
-
-               test=2;
-               tilt2weird=0;
-               tiltweird=0;
-               midweird=0;
-               proportionweird=0;
-               vertexweird[0]=0;
-               vertexweird[1]=0;
-               vertexweird[2]=0;
-               vertexweird[3]=0;
-               vertexweird[4]=0;
-               vertexweird[5]=0;
-
-               if(!cellophane){
-                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                       glEnable(GL_CULL_FACE);
-                       glCullFace(GL_FRONT);
-                       glDepthMask(1);
-                       for(k=0;k<numplayers;k++){
-                               if(k==0||tutoriallevel!=1){
-                                       glEnable(GL_BLEND);
-                                       glEnable(GL_LIGHTING);
-                                       terrainlight=terrain.getLighting(player[k].coords.x,player[k].coords.z);
-                                       distance=distsq(&viewer,&player[k].coords);
-                                       distance=(viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance;
-                                       glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance);
-                                       if(distance>=1)
+        }
+
+        //Terrain
+        glEnable(GL_TEXTURE_2D);
+        glDepthMask(1);
+        glEnable(GL_DEPTH_TEST);
+        glEnable(GL_CULL_FACE);
+        glDisable(GL_BLEND);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+        terraintexture.bind();
+        terrain.draw(0);
+        terraintexture2.bind();
+        terrain.draw(1);
+        //glBindTexture( GL_TEXTURE_2D, terraintexture3);
+        //glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+        //terrain.draw(2);
+
+        terrain.drawdecals();
+
+        //Model
+        glEnable(GL_CULL_FACE);
+        glEnable(GL_LIGHTING);
+        glDisable(GL_BLEND);
+        glEnable(GL_TEXTURE_2D);
+        glDepthMask(1);
+
+        glEnable(GL_COLOR_MATERIAL);
+
+        test = 2;
+        tilt2weird = 0;
+        tiltweird = 0;
+        midweird = 0;
+        proportionweird = 0;
+        vertexweird[0] = 0;
+        vertexweird[1] = 0;
+        vertexweird[2] = 0;
+        vertexweird[3] = 0;
+        vertexweird[4] = 0;
+        vertexweird[5] = 0;
+
+        if (!cellophane) {
+            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            glEnable(GL_CULL_FACE);
+            glCullFace(GL_FRONT);
+            glDepthMask(1);
+            for (k = 0; k < numplayers; k++) {
+                if (k == 0 || tutoriallevel != 1) {
+                    glEnable(GL_BLEND);
+                    glEnable(GL_LIGHTING);
+                    terrainlight = terrain.getLighting(player[k].coords.x, player[k].coords.z);
+                    distance = distsq(&viewer, &player[k].coords);
+                    distance = (viewdistance * viewdistance - (distance - (viewdistance * viewdistance * fadestart)) * (1 / (1 - fadestart))) / viewdistance / viewdistance;
+                    glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, distance);
+                    if (distance >= 1)
                         glDisable(GL_BLEND);
-                                       if(distance>=.5){
-                                               checkpoint=DoRotation(player[k].skeleton.joints[abs(Random()%player[k].skeleton.num_joints)].position,0,player[k].yaw,0)*player[k].scale+player[k].coords;
-                                               checkpoint.y+=1;
-                                               if(!player[k].occluded==0)
-                            i=checkcollide(viewer,checkpoint,player[k].lastoccluded);
-                                               if(i==-1||player[k].occluded==0)
-                            i=checkcollide(viewer,checkpoint);
-                                               if(i!=-1){
-                                                       player[k].occluded+=1;
-                                                       player[k].lastoccluded=i;
-                                               }else
-                            player[k].occluded=0;
-                                               if(player[k].occluded<25)
+                    if (distance >= .5) {
+                        checkpoint = DoRotation(player[k].skeleton.joints[abs(Random() % player[k].skeleton.num_joints)].position, 0, player[k].yaw, 0) * player[k].scale + player[k].coords;
+                        checkpoint.y += 1;
+                        if (!player[k].occluded == 0)
+                            i = checkcollide(viewer, checkpoint, player[k].lastoccluded);
+                        if (i == -1 || player[k].occluded == 0)
+                            i = checkcollide(viewer, checkpoint);
+                        if (i != -1) {
+                            player[k].occluded += 1;
+                            player[k].lastoccluded = i;
+                        else
+                            player[k].occluded = 0;
+                        if (player[k].occluded < 25)
                             player[k].DrawSkeleton();
-                                       }
-                               }
-                       }
-               }
-
-               if(!cameramode&&musictype==stream_fighttheme)
-            playerdist=distsqflat(&player[0].coords,&viewer);
-               else
-            playerdist=-100;
-               glPushMatrix();
-               glCullFace(GL_BACK);
-               glEnable(GL_TEXTURE_2D);
-               objects.Draw();
-               glPopMatrix();
+                    }
+                }
+            }
+        }
+
+        if (!cameramode && musictype == stream_fighttheme)
+            playerdist = distsqflat(&player[0].coords, &viewer);
+        else
+            playerdist = -100;
+        glPushMatrix();
+        glCullFace(GL_BACK);
+        glEnable(GL_TEXTURE_2D);
+        objects.Draw();
+        glPopMatrix();
 
         //draw hawk
-               glPushMatrix();
-               if(frustum.SphereInFrustum(realhawkcoords.x+hawk.boundingspherecenter.x,realhawkcoords.y+hawk.boundingspherecenter.y,realhawkcoords.z+hawk.boundingspherecenter.z,2)){   
-                       glAlphaFunc(GL_GREATER, 0.0001f);
-                       glDepthMask(1);
-                       glDisable(GL_CULL_FACE);
-                       glDisable(GL_LIGHTING);
-                       glEnable(GL_BLEND);
-                       glTranslatef(hawkcoords.x,hawkcoords.y,hawkcoords.z);
-                       glRotatef(hawkyaw,0,1,0);
-                       glTranslatef(25,0,0);
-                       distance=distsq(&viewer,&realhawkcoords)*1.2;
-                       glColor4f(light.color[0],light.color[1],light.color[2],(viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance);
-                       if((viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance>1)
-                glColor4f(light.color[0],light.color[1],light.color[2],1);
-                       if((viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance>0)
-                               hawk.drawdifftex(hawktexture);
-               }
-               glPopMatrix();
-
-               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-               glEnable(GL_CULL_FACE);
-               glCullFace(GL_FRONT);
-               glDepthMask(1);
-               for(k=0;k<numplayers;k++){
-                       if(!(k==0||tutoriallevel!=1)){
-                               glEnable(GL_BLEND);
-                               glEnable(GL_LIGHTING);
-                               terrainlight=terrain.getLighting(player[k].coords.x,player[k].coords.z);
-                               distance=distsq(&viewer,&player[k].coords);
-                               distance=(viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance;
-                               glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance);
-                               if(distance>=1)
+        glPushMatrix();
+        if (frustum.SphereInFrustum(realhawkcoords.x + hawk.boundingspherecenter.x, realhawkcoords.y + hawk.boundingspherecenter.y, realhawkcoords.z + hawk.boundingspherecenter.z, 2)) {
+            glAlphaFunc(GL_GREATER, 0.0001f);
+            glDepthMask(1);
+            glDisable(GL_CULL_FACE);
+            glDisable(GL_LIGHTING);
+            glEnable(GL_BLEND);
+            glTranslatef(hawkcoords.x, hawkcoords.y, hawkcoords.z);
+            glRotatef(hawkyaw, 0, 1, 0);
+            glTranslatef(25, 0, 0);
+            distance = distsq(&viewer, &realhawkcoords) * 1.2;
+            glColor4f(light.color[0], light.color[1], light.color[2], (viewdistance * viewdistance - (distance - (viewdistance * viewdistance * fadestart)) * (1 / (1 - fadestart))) / viewdistance / viewdistance);
+            if ((viewdistance * viewdistance - (distance - (viewdistance * viewdistance * fadestart)) * (1 / (1 - fadestart))) / viewdistance / viewdistance > 1)
+                glColor4f(light.color[0], light.color[1], light.color[2], 1);
+            if ((viewdistance * viewdistance - (distance - (viewdistance * viewdistance * fadestart)) * (1 / (1 - fadestart))) / viewdistance / viewdistance > 0)
+                hawk.drawdifftex(hawktexture);
+        }
+        glPopMatrix();
+
+        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+        glEnable(GL_CULL_FACE);
+        glCullFace(GL_FRONT);
+        glDepthMask(1);
+        for (k = 0; k < numplayers; k++) {
+            if (!(k == 0 || tutoriallevel != 1)) {
+                glEnable(GL_BLEND);
+                glEnable(GL_LIGHTING);
+                terrainlight = terrain.getLighting(player[k].coords.x, player[k].coords.z);
+                distance = distsq(&viewer, &player[k].coords);
+                distance = (viewdistance * viewdistance - (distance - (viewdistance * viewdistance * fadestart)) * (1 / (1 - fadestart))) / viewdistance / viewdistance;
+                glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, distance);
+                if (distance >= 1)
                     glDisable(GL_BLEND);
-                               if(distance>=.5){
-                                       checkpoint=DoRotation(player[k].skeleton.joints[abs(Random()%player[k].skeleton.num_joints)].position,0,player[k].yaw,0)*player[k].scale+player[k].coords;
-                                       checkpoint.y+=1;
-                                       if(!player[k].occluded==0)
-                        i=checkcollide(viewer,checkpoint,player[k].lastoccluded);
-                                       if(i==-1||player[k].occluded==0)
-                        i=checkcollide(viewer,checkpoint);
-                                       if(i!=-1){
-                                               player[k].occluded+=1;
-                                               player[k].lastoccluded=i;
-                                       }else
-                        player[k].occluded=0;
-                                       if(player[k].occluded<25)
+                if (distance >= .5) {
+                    checkpoint = DoRotation(player[k].skeleton.joints[abs(Random() % player[k].skeleton.num_joints)].position, 0, player[k].yaw, 0) * player[k].scale + player[k].coords;
+                    checkpoint.y += 1;
+                    if (!player[k].occluded == 0)
+                        i = checkcollide(viewer, checkpoint, player[k].lastoccluded);
+                    if (i == -1 || player[k].occluded == 0)
+                        i = checkcollide(viewer, checkpoint);
+                    if (i != -1) {
+                        player[k].occluded += 1;
+                        player[k].lastoccluded = i;
+                    else
+                        player[k].occluded = 0;
+                    if (player[k].occluded < 25)
                         player[k].DrawSkeleton();
-                               }
-                       }
-               }
+                }
+            }
+        }
 
-               glPushMatrix();
-               glEnable(GL_TEXTURE_2D);
-               weapons.Draw();
-               glPopMatrix();
-               glCullFace(GL_BACK);
+        glPushMatrix();
+        glEnable(GL_TEXTURE_2D);
+        weapons.Draw();
+        glPopMatrix();
+        glCullFace(GL_BACK);
 
-               glDisable(GL_COLOR_MATERIAL);
+        glDisable(GL_COLOR_MATERIAL);
 
-               glDisable(GL_LIGHTING);
-               glDisable(GL_TEXTURE_2D);
+        glDisable(GL_LIGHTING);
+        glDisable(GL_TEXTURE_2D);
 
-               glDepthMask(0);
+        glDepthMask(0);
 
-               Sprite::Draw();
+        Sprite::Draw();
 
         //waypoints, pathpoints in editor
-               if(editorenabled){
-                       glEnable(GL_BLEND);
-                       glDisable(GL_LIGHTING);
-                       glDisable(GL_TEXTURE_2D);
-                       glDisable(GL_COLOR_MATERIAL);
-                       glColor4f(1,1,0,1);
-
-                       for(k=0;k<numplayers;k++){
-                               if(player[k].numwaypoints>1){
-                                       glBegin(GL_LINE_LOOP);
-                                       for(i=0;i<player[k].numwaypoints;i++){
-                                               glVertex3f(player[k].waypoints[i].x,player[k].waypoints[i].y+.5,player[k].waypoints[i].z);
-                                       }
-                                       glEnd();
-                               }
-                       }
-
-
-                       if(numpathpoints>1){
-                               glColor4f(0,1,0,1);
-                               for(k=0;k<numpathpoints;k++){
-                                       if(numpathpointconnect[k]){
-                                               for(i=0;i<numpathpointconnect[k];i++){
-                                                       glBegin(GL_LINE_LOOP);
-                                                       glVertex3f(pathpoint[k].x,pathpoint[k].y+.5,pathpoint[k].z);
-                                                       glVertex3f(pathpoint[pathpointconnect[k][i]].x,pathpoint[pathpointconnect[k][i]].y+.5,pathpoint[pathpointconnect[k][i]].z);                                     
-                                                       glEnd();
-                                               }
-                                       }
-                               }
-                               glColor4f(1,1,1,1);
-                               glPointSize(4);
-                               glBegin(GL_POINTS);
-                               glVertex3f(pathpoint[pathpointselected].x,pathpoint[pathpointselected].y+.5,pathpoint[pathpointselected].z);
-                               glEnd();
-                       }
-               }
-
-               //Text
-
-               glEnable(GL_TEXTURE_2D);
-               glColor4f(.5,.5,.5,1);
-               if(!console) {
-                       sprintf (string, " ",(int)(fps));
-                       text->glPrint(10,30,string,0,.8,screenwidth,screenheight);
-
-                       if(!tutoriallevel)
-                               if(bonus>0&&bonustime<1&&!winfreeze&&indialogue==-1/*bonustime<4*/){
-                                       const char *bonus_name;
-                                       if (bonus < bonus_count)
-                                         bonus_name = bonus_names[bonus];
-                                       else
-                                         bonus_name = "Excellent!"; // When does this happen?
-
-                                       glColor4f(0,0,0,1-bonustime);
-                                       text->glPrintOutline(1024/2-10*strlen(bonus_name)-4,768/16-4+768*4/5,bonus_name,1,2.5,1024,768);
-                                       glColor4f(1,0,0,1-bonustime);
-                                       text->glPrint(1024/2-10*strlen(bonus_name),768/16+768*4/5,bonus_name,1,2,1024,768);
-
-                                       sprintf (string, "%d",(int)bonusvalue);
-                                       glColor4f(0,0,0,1-bonustime);
-                                       text->glPrintOutline(1024/2-10*strlen(string)-4,768/16-4-20+768*4/5,string,1,2.5*.8,1024,768);
-                                       glColor4f(1,0,0,1-bonustime);
-                                       text->glPrint(1024/2-10*strlen(string),768/16-20+768*4/5,string,1,2*.8,1024,768);
-                                       glColor4f(.5,.5,.5,1);
-                               }
-
-            if(tutoriallevel==1){
-                tutorialopac=tutorialmaxtime-tutorialstagetime;
-                if(tutorialopac>1)tutorialopac=1;
-                if(tutorialopac<0)tutorialopac=0;
+        if (editorenabled) {
+            glEnable(GL_BLEND);
+            glDisable(GL_LIGHTING);
+            glDisable(GL_TEXTURE_2D);
+            glDisable(GL_COLOR_MATERIAL);
+            glColor4f(1, 1, 0, 1);
+
+            for (k = 0; k < numplayers; k++) {
+                if (player[k].numwaypoints > 1) {
+                    glBegin(GL_LINE_LOOP);
+                    for (i = 0; i < player[k].numwaypoints; i++) {
+                        glVertex3f(player[k].waypoints[i].x, player[k].waypoints[i].y + .5, player[k].waypoints[i].z);
+                    }
+                    glEnd();
+                }
+            }
+
+
+            if (numpathpoints > 1) {
+                glColor4f(0, 1, 0, 1);
+                for (k = 0; k < numpathpoints; k++) {
+                    if (numpathpointconnect[k]) {
+                        for (i = 0; i < numpathpointconnect[k]; i++) {
+                            glBegin(GL_LINE_LOOP);
+                            glVertex3f(pathpoint[k].x, pathpoint[k].y + .5, pathpoint[k].z);
+                            glVertex3f(pathpoint[pathpointconnect[k][i]].x, pathpoint[pathpointconnect[k][i]].y + .5, pathpoint[pathpointconnect[k][i]].z);
+                            glEnd();
+                        }
+                    }
+                }
+                glColor4f(1, 1, 1, 1);
+                glPointSize(4);
+                glBegin(GL_POINTS);
+                glVertex3f(pathpoint[pathpointselected].x, pathpoint[pathpointselected].y + .5, pathpoint[pathpointselected].z);
+                glEnd();
+            }
+        }
+
+        //Text
+
+        glEnable(GL_TEXTURE_2D);
+        glColor4f(.5, .5, .5, 1);
+        if (!console) {
+            sprintf (string, " ", (int)(fps));
+            text->glPrint(10, 30, string, 0, .8, screenwidth, screenheight);
+
+            if (!tutoriallevel)
+                if (bonus > 0 && bonustime < 1 && !winfreeze && indialogue == -1/*bonustime<4*/) {
+                    const char *bonus_name;
+                    if (bonus < bonus_count)
+                        bonus_name = bonus_names[bonus];
+                    else
+                        bonus_name = "Excellent!"; // When does this happen?
+
+                    glColor4f(0, 0, 0, 1 - bonustime);
+                    text->glPrintOutline(1024 / 2 - 10 * strlen(bonus_name) - 4, 768 / 16 - 4 + 768 * 4 / 5, bonus_name, 1, 2.5, 1024, 768);
+                    glColor4f(1, 0, 0, 1 - bonustime);
+                    text->glPrint(1024 / 2 - 10 * strlen(bonus_name), 768 / 16 + 768 * 4 / 5, bonus_name, 1, 2, 1024, 768);
+
+                    sprintf (string, "%d", (int)bonusvalue);
+                    glColor4f(0, 0, 0, 1 - bonustime);
+                    text->glPrintOutline(1024 / 2 - 10 * strlen(string) - 4, 768 / 16 - 4 - 20 + 768 * 4 / 5, string, 1, 2.5 * .8, 1024, 768);
+                    glColor4f(1, 0, 0, 1 - bonustime);
+                    text->glPrint(1024 / 2 - 10 * strlen(string), 768 / 16 - 20 + 768 * 4 / 5, string, 1, 2 * .8, 1024, 768);
+                    glColor4f(.5, .5, .5, 1);
+                }
+
+            if (tutoriallevel == 1) {
+                tutorialopac = tutorialmaxtime - tutorialstagetime;
+                if (tutorialopac > 1)tutorialopac = 1;
+                if (tutorialopac < 0)tutorialopac = 0;
 
                 sprintf (string, " ");
                 sprintf (string2, " ");
                 sprintf (string3, " ");
-                if(tutorialstage==0){
+                if (tutorialstage == 0) {
                     sprintf (string, " ");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==1){
+                if (tutorialstage == 1) {
                     sprintf (string, "Welcome to the Lugaru training level!");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==2){
+                if (tutorialstage == 2) {
                     sprintf (string, "BASIC MOVEMENT:");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==3){
+                if (tutorialstage == 3) {
                     sprintf (string, "You can move the mouse to rotate the camera.");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==4){
-                    sprintf (string, "Try using the %s, %s, %s and %s keys to move around.",Input::keyToChar(forwardkey),Input::keyToChar(leftkey),Input::keyToChar(backkey),Input::keyToChar(rightkey));
+                if (tutorialstage == 4) {
+                    sprintf (string, "Try using the %s, %s, %s and %s keys to move around.", Input::keyToChar(forwardkey), Input::keyToChar(leftkey), Input::keyToChar(backkey), Input::keyToChar(rightkey));
                     sprintf (string2, "All movement is relative to the camera.");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==5){
-                    sprintf (string, "Please press %s to jump.",Input::keyToChar(jumpkey));
+                if (tutorialstage == 5) {
+                    sprintf (string, "Please press %s to jump.", Input::keyToChar(jumpkey));
                     sprintf (string2, "You can hold it longer to jump higher.");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==6){
-                    sprintf (string, "You can press %s to crouch.",Input::keyToChar(crouchkey));
+                if (tutorialstage == 6) {
+                    sprintf (string, "You can press %s to crouch.", Input::keyToChar(crouchkey));
                     sprintf (string2, "You can jump higher from a crouching position.");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==7){
-                    sprintf (string, "While running, you can press %s to roll.",Input::keyToChar(crouchkey));
+                if (tutorialstage == 7) {
+                    sprintf (string, "While running, you can press %s to roll.", Input::keyToChar(crouchkey));
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==8){
+                if (tutorialstage == 8) {
                     sprintf (string, "While crouching, you can sneak around silently");
                     sprintf (string2, "using the movement keys.");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==9){
+                if (tutorialstage == 9) {
                     sprintf (string, "Release the crouch key while sneaking and hold the movement keys");
                     sprintf (string2, "to run animal-style.");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==10){
+                if (tutorialstage == 10) {
                     sprintf (string, "ADVANCED MOVEMENT:");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==11){
-                    sprintf (string, "When you jump at a wall, you can hold %s again",Input::keyToChar(jumpkey));
+                if (tutorialstage == 11) {
+                    sprintf (string, "When you jump at a wall, you can hold %s again", Input::keyToChar(jumpkey));
                     sprintf (string2, "during impact to perform a walljump.");
                     sprintf (string3, "Be sure to use the movement keys to press against the wall");
                 }
-                if(tutorialstage==12){
-                    sprintf (string, "While in the air, you can press crouch to flip.",Input::keyToChar(jumpkey));
+                if (tutorialstage == 12) {
+                    sprintf (string, "While in the air, you can press crouch to flip.", Input::keyToChar(jumpkey));
                     sprintf (string2, "Walljumps and flips confuse enemies and give you more control.");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==13){
+                if (tutorialstage == 13) {
                     sprintf (string, "BASIC COMBAT:");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==14){
+                if (tutorialstage == 14) {
                     sprintf (string, "There is now an imaginary enemy");
                     sprintf (string2, "in the middle of the training area.");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==15){
-                    if(attackkey==MOUSEBUTTON1)sprintf (string, "Click to attack when you are near an enemy.");
-                    else sprintf (string, "Press %s to attack when you are near an enemy.",Input::keyToChar(attackkey));
+                if (tutorialstage == 15) {
+                    if (attackkey == MOUSEBUTTON1)sprintf (string, "Click to attack when you are near an enemy.");
+                    else sprintf (string, "Press %s to attack when you are near an enemy.", Input::keyToChar(attackkey));
                     sprintf (string2, "You can punch by standing still near an enemy and attacking.");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==16){
+                if (tutorialstage == 16) {
                     sprintf (string, "If you are close, you will perform a weak punch.");
                     sprintf (string2, "The weak punch is excellent for starting attack combinations.");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==17){
+                if (tutorialstage == 17) {
                     sprintf (string, "Attacking while running results in a spin kick.");
                     sprintf (string2, "This is one of your most powerful ground attacks.");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==18){
+                if (tutorialstage == 18) {
                     sprintf (string, "Sweep the enemy's legs out by attacking while crouched.");
                     sprintf (string2, "This is a very fast attack, and easy to follow up.");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==19){
+                if (tutorialstage == 19) {
                     sprintf (string, "When an enemy is on the ground, you can deal some extra");
                     sprintf (string2, "damage by running up and drop-kicking him.");
                     sprintf (string3, "(Try knocking them down with a sweep first)");
                 }
-                if(tutorialstage==20){
+                if (tutorialstage == 20) {
                     sprintf (string, "Your most powerful individual attack is the rabbit kick.");
-                    if(attackkey==MOUSEBUTTON1)sprintf (string2, "Run at the enemy while holding the mouse button, and press");
+                    if (attackkey == MOUSEBUTTON1)sprintf (string2, "Run at the enemy while holding the mouse button, and press");
                     else sprintf (string2, "Run at the enemy while holding %s, and press", Input::keyToChar(attackkey));
-                    sprintf (string3, "the jump key (%s) to attack.",Input::keyToChar(jumpkey));
+                    sprintf (string3, "the jump key (%s) to attack.", Input::keyToChar(jumpkey));
                 }
-                if(tutorialstage==21){
+                if (tutorialstage == 21) {
                     sprintf (string, "This attack is devastating if timed correctly.");
                     sprintf (string2, "Even if timed incorrectly, it will knock the enemy over.");
-                    if(againbonus)sprintf (string3, "Try rabbit-kicking the imaginary enemy again.");
+                    if (againbonus)sprintf (string3, "Try rabbit-kicking the imaginary enemy again.");
                     else sprintf (string3, "Try rabbit-kicking the imaginary enemy.");
                 }
-                if(tutorialstage==22){
+                if (tutorialstage == 22) {
                     sprintf (string, "If you sneak behind an enemy unnoticed, you can kill");
                     sprintf (string2, "him instantly. Move close behind this enemy");
                     sprintf (string3, "and attack.");
                 }
-                if(tutorialstage==23){
+                if (tutorialstage == 23) {
                     sprintf (string, "Another important attack is the wall kick. When an enemy");
                     sprintf (string2, "is near a wall, perform a walljump nearby and hold");
                     sprintf (string3, "the attack key during impact with the wall.");
                 }
-                if(tutorialstage==24){
+                if (tutorialstage == 24) {
                     sprintf (string, "You can tackle enemies by running at them animal-style");
-                    if(attackkey==MOUSEBUTTON1)sprintf (string2, "and pressing jump (%s) or attack(mouse button).",Input::keyToChar(jumpkey));
-                    else sprintf (string2, "and pressing jump (%s) or attack(%s).",Input::keyToChar(jumpkey),Input::keyToChar(attackkey));
+                    if (attackkey == MOUSEBUTTON1)sprintf (string2, "and pressing jump (%s) or attack(mouse button).", Input::keyToChar(jumpkey));
+                    else sprintf (string2, "and pressing jump (%s) or attack(%s).", Input::keyToChar(jumpkey), Input::keyToChar(attackkey));
                     sprintf (string3, "This is especially useful when they are running away.");
                 }
-                if(tutorialstage==25){
+                if (tutorialstage == 25) {
                     sprintf (string, "Dodge by pressing back and attack. Dodging is essential");
                     sprintf (string2, "against enemies with swords or other long weapons.");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==26){
+                if (tutorialstage == 26) {
                     sprintf (string, "REVERSALS AND COUNTER-REVERSALS");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==27){
+                if (tutorialstage == 27) {
                     sprintf (string, "The enemy can now reverse your attacks.");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==28){
+                if (tutorialstage == 28) {
                     sprintf (string, "If you attack, you will notice that the enemy now sometimes");
                     sprintf (string2, "catches your attack and uses it against you. Hold");
-                    sprintf (string3, "crouch (%s) after attacking to escape from reversals.",Input::keyToChar(crouchkey));
+                    sprintf (string3, "crouch (%s) after attacking to escape from reversals.", Input::keyToChar(crouchkey));
                 }
-                if(tutorialstage==29){
+                if (tutorialstage == 29) {
                     sprintf (string, "Try escaping from two more reversals in a row.");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==30){
+                if (tutorialstage == 30) {
                     sprintf (string, "Good!");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==31){
-                    sprintf (string, "To reverse an attack, you must tap crouch (%s) during the",Input::keyToChar(crouchkey));
+                if (tutorialstage == 31) {
+                    sprintf (string, "To reverse an attack, you must tap crouch (%s) during the", Input::keyToChar(crouchkey));
                     sprintf (string2, "enemy's attack. You must also be close to the enemy;");
                     sprintf (string3, "this is especially important against armed opponents.");
                 }
-                if(tutorialstage==32){
-                    sprintf (string, "The enemy can attack in %d seconds.", (int)(tutorialmaxtime-tutorialstagetime));
+                if (tutorialstage == 32) {
+                    sprintf (string, "The enemy can attack in %d seconds.", (int)(tutorialmaxtime - tutorialstagetime));
                     sprintf (string2, "This imaginary opponents attacks will be highlighted");
                     sprintf (string3, "to make this easier.");
                 }
-                if(tutorialstage==33){
+                if (tutorialstage == 33) {
                     sprintf (string, "Reverse three enemy attacks!");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==34){
+                if (tutorialstage == 34) {
                     sprintf (string, "Reverse two more enemy attacks!");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==35){
+                if (tutorialstage == 35) {
                     sprintf (string, "Reverse one more enemy attack!");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==36){
+                if (tutorialstage == 36) {
                     sprintf (string, "Excellent!");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==37){
-                    sprintf (string, "Now spar with the enemy for %d more seconds.", (int)(tutorialmaxtime-tutorialstagetime));
-                    sprintf (string2, "Damage dealt: %d",(int)damagedealt);
-                    sprintf (string3, "Damage taken: %d.",(int)damagetaken);
+                if (tutorialstage == 37) {
+                    sprintf (string, "Now spar with the enemy for %d more seconds.", (int)(tutorialmaxtime - tutorialstagetime));
+                    sprintf (string2, "Damage dealt: %d", (int)damagedealt);
+                    sprintf (string3, "Damage taken: %d.", (int)damagetaken);
                 }
-                if(tutorialstage==38){
+                if (tutorialstage == 38) {
                     sprintf (string, "WEAPONS:");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==39){
+                if (tutorialstage == 39) {
                     sprintf (string, "There is now an imaginary knife");
                     sprintf (string2, "in the center of the training area.");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==40){
+                if (tutorialstage == 40) {
                     sprintf (string, "Stand, roll or handspring over the knife");
-                    sprintf (string2, "while pressing %s to pick it up.",Input::keyToChar(throwkey));
+                    sprintf (string2, "while pressing %s to pick it up.", Input::keyToChar(throwkey));
                     sprintf (string3, "You can crouch and press the same key to drop it again.");
                 }
-                if(tutorialstage==41){
-                    sprintf (string, "You can equip and unequip weapons using the %s key.",Input::keyToChar(drawkey));
+                if (tutorialstage == 41) {
+                    sprintf (string, "You can equip and unequip weapons using the %s key.", Input::keyToChar(drawkey));
                     sprintf (string2, "Sometimes it is best to keep them unequipped to");
                     sprintf (string3, "prevent enemies from taking them. ");
                 }
-                if(tutorialstage==42){
+                if (tutorialstage == 42) {
                     sprintf (string, "The knife is the smallest weapon and the least encumbering.");
                     sprintf (string2, "You can equip or unequip it while standing, crouching,");
                     sprintf (string3, "running or flipping.");
                 }
-                if(tutorialstage==43){
+                if (tutorialstage == 43) {
                     sprintf (string, "You perform weapon attacks the same way as unarmed attacks,");
                     sprintf (string2, "but sharp weapons cause permanent damage, instead of the");
                     sprintf (string3, "temporary trauma from blunt weapons, fists and feet.");
                 }
-                if(tutorialstage==44){
+                if (tutorialstage == 44) {
                     sprintf (string, "The enemy now has your knife!");
                     sprintf (string2, "Please reverse two of his knife attacks.");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==45){
+                if (tutorialstage == 45) {
                     sprintf (string, "Please reverse one more of his knife attacks.");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==46){
+                if (tutorialstage == 46) {
                     sprintf (string, "Now he has a sword!");
                     sprintf (string2, "The sword has longer reach than your arms, so you");
                     sprintf (string3, "must move close to reverse the sword slash.");
                 }
-                if(tutorialstage==47){
+                if (tutorialstage == 47) {
                     sprintf (string, "Long weapons like the sword and staff are also useful for defense;");
                     sprintf (string2, "you can parry enemy weapon attacks by pressing the attack key");
                     sprintf (string3, "at the right time. Please try parrying the enemy's attacks!");
                 }
-                if(tutorialstage==48){
+                if (tutorialstage == 48) {
                     sprintf (string, "The staff is like the sword, but has two main attacks.");
                     sprintf (string2, "The standing smash is fast and effective, and the running");
                     sprintf (string3, "spin smash is slower and more powerful.");
                 }
-                if(tutorialstage==49){
-                    sprintf (string, "When facing an enemy, you can throw the knife with %s.",Input::keyToChar(throwkey));
+                if (tutorialstage == 49) {
+                    sprintf (string, "When facing an enemy, you can throw the knife with %s.", Input::keyToChar(throwkey));
                     sprintf (string2, "It is possible to throw the knife while flipping,");
                     sprintf (string3, "but it is very inaccurate.");
                 }
-                if(tutorialstage==50){
+                if (tutorialstage == 50) {
                     sprintf (string, "You now know everything you can learn from training.");
                     sprintf (string2, "Everything else you must learn from experience!");
                     sprintf (string3, " ");
                 }
-                if(tutorialstage==51){
+                if (tutorialstage == 51) {
                     sprintf (string, "Walk out of the training area to return to the main menu.");
                     sprintf (string2, " ");
                     sprintf (string3, " ");
                 }
 
-                glColor4f(0,0,0,tutorialopac);
-                text->glPrintOutline(screenwidth/2-7.6*strlen(string)*screenwidth/1024-4,screenheight/16-4+screenheight*4/5,string,1,1.5*1.25*screenwidth/1024,screenwidth,screenheight);
-                text->glPrintOutline(screenwidth/2-7.6*strlen(string2)*screenwidth/1024-4,screenheight/16-4+screenheight*4/5-20*screenwidth/1024,string2,1,1.5*1.25*screenwidth/1024,screenwidth,screenheight);
-                text->glPrintOutline(screenwidth/2-7.6*strlen(string3)*screenwidth/1024-4,screenheight/16-4+screenheight*4/5-40*screenwidth/1024,string3,1,1.5*1.25*screenwidth/1024,screenwidth,screenheight);
-                glColor4f(1,1,1,tutorialopac);
-                text->glPrint(screenwidth/2-7.6*strlen(string)*screenwidth/1024,screenheight/16+screenheight*4/5,string,1,1.5*screenwidth/1024,screenwidth,screenheight);
-                text->glPrint(screenwidth/2-7.6*strlen(string2)*screenwidth/1024,screenheight/16+screenheight*4/5-20*screenwidth/1024,string2,1,1.5*screenwidth/1024,screenwidth,screenheight);
-                text->glPrint(screenwidth/2-7.6*strlen(string3)*screenwidth/1024,screenheight/16+screenheight*4/5-40*screenwidth/1024,string3,1,1.5*screenwidth/1024,screenwidth,screenheight);
+                glColor4f(0, 0, 0, tutorialopac);
+                text->glPrintOutline(screenwidth / 2 - 7.6 * strlen(string)*screenwidth / 1024 - 4, screenheight / 16 - 4 + screenheight * 4 / 5, string, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight);
+                text->glPrintOutline(screenwidth / 2 - 7.6 * strlen(string2)*screenwidth / 1024 - 4, screenheight / 16 - 4 + screenheight * 4 / 5 - 20 * screenwidth / 1024, string2, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight);
+                text->glPrintOutline(screenwidth / 2 - 7.6 * strlen(string3)*screenwidth / 1024 - 4, screenheight / 16 - 4 + screenheight * 4 / 5 - 40 * screenwidth / 1024, string3, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight);
+                glColor4f(1, 1, 1, tutorialopac);
+                text->glPrint(screenwidth / 2 - 7.6 * strlen(string)*screenwidth / 1024, screenheight / 16 + screenheight * 4 / 5, string, 1, 1.5 * screenwidth / 1024, screenwidth, screenheight);
+                text->glPrint(screenwidth / 2 - 7.6 * strlen(string2)*screenwidth / 1024, screenheight / 16 + screenheight * 4 / 5 - 20 * screenwidth / 1024, string2, 1, 1.5 * screenwidth / 1024, screenwidth, screenheight);
+                text->glPrint(screenwidth / 2 - 7.6 * strlen(string3)*screenwidth / 1024, screenheight / 16 + screenheight * 4 / 5 - 40 * screenwidth / 1024, string3, 1, 1.5 * screenwidth / 1024, screenwidth, screenheight);
 
-                sprintf (string, "Press 'tab' to skip to the next item.",Input::keyToChar(jumpkey));
+                sprintf (string, "Press 'tab' to skip to the next item.", Input::keyToChar(jumpkey));
                 sprintf (string2, "Press escape at any time to");
                 sprintf (string3, "pause or exit the tutorial.");
 
-                glColor4f(0,0,0,1);
-                text->glPrintOutline(screenwidth/2-7.6*strlen(string)*screenwidth/1024*.8-4,0-4+screenheight*1/10,string,1,1.5*1.25*screenwidth/1024*.8,screenwidth,screenheight);
-                text->glPrintOutline(screenwidth/2-7.6*strlen(string2)*screenwidth/1024*.8-4,0-4+screenheight*1/10-20*.8*screenwidth/1024,string2,1,1.5*1.25*screenwidth/1024*.8,screenwidth,screenheight);
-                text->glPrintOutline(screenwidth/2-7.6*strlen(string3)*screenwidth/1024*.8-4,0-4+screenheight*1/10-40*.8*screenwidth/1024,string3,1,1.5*1.25*screenwidth/1024*.8,screenwidth,screenheight);
-                glColor4f(0.5,0.5,0.5,1);
-                text->glPrint(screenwidth/2-7.6*strlen(string)*screenwidth/1024*.8,0+screenheight*1/10,string,1,1.5*screenwidth/1024*.8,screenwidth,screenheight);
-                text->glPrint(screenwidth/2-7.6*strlen(string2)*screenwidth/1024*.8,0+screenheight*1/10-20*.8*screenwidth/1024,string2,1,1.5*screenwidth/1024*.8,screenwidth,screenheight);
-                text->glPrint(screenwidth/2-7.6*strlen(string3)*screenwidth/1024*.8,0+screenheight*1/10-40*.8*screenwidth/1024,string3,1,1.5*screenwidth/1024*.8,screenwidth,screenheight);
+                glColor4f(0, 0, 0, 1);
+                text->glPrintOutline(screenwidth / 2 - 7.6 * strlen(string)*screenwidth / 1024 * .8 - 4, 0 - 4 + screenheight * 1 / 10, string, 1, 1.5 * 1.25 * screenwidth / 1024 * .8, screenwidth, screenheight);
+                text->glPrintOutline(screenwidth / 2 - 7.6 * strlen(string2)*screenwidth / 1024 * .8 - 4, 0 - 4 + screenheight * 1 / 10 - 20 * .8 * screenwidth / 1024, string2, 1, 1.5 * 1.25 * screenwidth / 1024 * .8, screenwidth, screenheight);
+                text->glPrintOutline(screenwidth / 2 - 7.6 * strlen(string3)*screenwidth / 1024 * .8 - 4, 0 - 4 + screenheight * 1 / 10 - 40 * .8 * screenwidth / 1024, string3, 1, 1.5 * 1.25 * screenwidth / 1024 * .8, screenwidth, screenheight);
+                glColor4f(0.5, 0.5, 0.5, 1);
+                text->glPrint(screenwidth / 2 - 7.6 * strlen(string)*screenwidth / 1024 * .8, 0 + screenheight * 1 / 10, string, 1, 1.5 * screenwidth / 1024 * .8, screenwidth, screenheight);
+                text->glPrint(screenwidth / 2 - 7.6 * strlen(string2)*screenwidth / 1024 * .8, 0 + screenheight * 1 / 10 - 20 * .8 * screenwidth / 1024, string2, 1, 1.5 * screenwidth / 1024 * .8, screenwidth, screenheight);
+                text->glPrint(screenwidth / 2 - 7.6 * strlen(string3)*screenwidth / 1024 * .8, 0 + screenheight * 1 / 10 - 40 * .8 * screenwidth / 1024, string3, 1, 1.5 * screenwidth / 1024 * .8, screenwidth, screenheight);
             }
-            //Hot spots        
-
-            if(numhotspots&&(bonustime>=1||bonus<=0||bonustime<0)&&!tutoriallevel){
-                int closest=-1;
-                float closestdist=-1;
-                float distance=0;
-                closest=currenthotspot;
-                for(i=0;i<numhotspots;i++){
-                    distance=distsq(&player[0].coords,&hotspot[i]);
-                    if(closestdist==-1||distance<closestdist){
-                        if(distsq(&player[0].coords,&hotspot[i])<hotspotsize[i]&&((hotspottype[i]<=10&&hotspottype[i]>=0)||(hotspottype[i]<=40&&hotspottype[i]>=20))){
-                            closestdist=distance;
-                            closest=i;
+            //Hot spots
+
+            if (numhotspots && (bonustime >= 1 || bonus <= 0 || bonustime < 0) && !tutoriallevel) {
+                int closest = -1;
+                float closestdist = -1;
+                float distance = 0;
+                closest = currenthotspot;
+                for (i = 0; i < numhotspots; i++) {
+                    distance = distsq(&player[0].coords, &hotspot[i]);
+                    if (closestdist == -1 || distance < closestdist) {
+                        if (distsq(&player[0].coords, &hotspot[i]) < hotspotsize[i] && ((hotspottype[i] <= 10 && hotspottype[i] >= 0) || (hotspottype[i] <= 40 && hotspottype[i] >= 20))) {
+                            closestdist = distance;
+                            closest = i;
                         }
                     }
                 }
-                if(closest!=-1)
-                    currenthotspot=closest;
-                if(currenthotspot!=-1){
-                    if(hotspottype[closest]<=10){
-                        if(distsq(&player[0].coords,&hotspot[closest])<hotspotsize[closest])
-                            tutorialstagetime=0;
-                        tutorialmaxtime=1;
-                        tutorialopac=tutorialmaxtime-tutorialstagetime;
-                        if(tutorialopac>1)tutorialopac=1;
-                        if(tutorialopac<0)tutorialopac=0;
+                if (closest != -1)
+                    currenthotspot = closest;
+                if (currenthotspot != -1) {
+                    if (hotspottype[closest] <= 10) {
+                        if (distsq(&player[0].coords, &hotspot[closest]) < hotspotsize[closest])
+                            tutorialstagetime = 0;
+                        tutorialmaxtime = 1;
+                        tutorialopac = tutorialmaxtime - tutorialstagetime;
+                        if (tutorialopac > 1)tutorialopac = 1;
+                        if (tutorialopac < 0)tutorialopac = 0;
 
                         sprintf (string, "%s", hotspottext[closest]);
 
                         int lastline = 0;
                         int line = 0;
                         bool done = false;
-                        i=0;
-                        while(!done){
-                            if(string[i]=='\n'||string[i]>'z'||string[i]<' '||string[i]=='\0'){
-                                glColor4f(0,0,0,tutorialopac);
-                                text->glPrintOutline(screenwidth/2-7.6*(i-lastline)*screenwidth/1024-4,screenheight/16-4+screenheight*4/5-20*screenwidth/1024*line,string,1,1.5*1.25*screenwidth/1024,screenwidth,screenheight,lastline,i);
-                                glColor4f(1,1,1,tutorialopac);
-                                text->glPrint(screenwidth/2-7.6*(i-lastline)*screenwidth/1024,screenheight/16+screenheight*4/5-20*screenwidth/1024*line,string,1,1.5*screenwidth/1024,screenwidth,screenheight,lastline,i);
-                                lastline=i+1;
+                        i = 0;
+                        while (!done) {
+                            if (string[i] == '\n' || string[i] > 'z' || string[i] < ' ' || string[i] == '\0') {
+                                glColor4f(0, 0, 0, tutorialopac);
+                                text->glPrintOutline(screenwidth / 2 - 7.6 * (i - lastline)*screenwidth / 1024 - 4, screenheight / 16 - 4 + screenheight * 4 / 5 - 20 * screenwidth / 1024 * line, string, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight, lastline, i);
+                                glColor4f(1, 1, 1, tutorialopac);
+                                text->glPrint(screenwidth / 2 - 7.6 * (i - lastline)*screenwidth / 1024, screenheight / 16 + screenheight * 4 / 5 - 20 * screenwidth / 1024 * line, string, 1, 1.5 * screenwidth / 1024, screenwidth, screenheight, lastline, i);
+                                lastline = i + 1;
                                 line++;
-                                if(string[i]=='\0')done=1;
+                                if (string[i] == '\0')done = 1;
                             }
-                            if(i>=255)done=1;
+                            if (i >= 255)done = 1;
                             i++;
                         }
-                    } else if (hotspottype[closest]>=20&&dialoguegonethrough[hotspottype[closest]-20]==0){
-                        whichdialogue=hotspottype[closest]-20;
-                        for(j=0;j<numdialogueboxes[whichdialogue];j++){
-                            player[participantfocus[whichdialogue][j]].coords=participantlocation[whichdialogue][participantfocus[whichdialogue][j]];
-                            player[participantfocus[whichdialogue][j]].yaw=participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
-                            player[participantfocus[whichdialogue][j]].targetyaw=participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
-                            player[participantfocus[whichdialogue][j]].velocity=0;
-                            player[participantfocus[whichdialogue][j]].animTarget=player[participantfocus[whichdialogue][j]].getIdle();
-                            player[participantfocus[whichdialogue][j]].frameTarget=0;
+                    } else if (hotspottype[closest] >= 20 && dialoguegonethrough[hotspottype[closest] - 20] == 0) {
+                        whichdialogue = hotspottype[closest] - 20;
+                        for (j = 0; j < numdialogueboxes[whichdialogue]; j++) {
+                            player[participantfocus[whichdialogue][j]].coords = participantlocation[whichdialogue][participantfocus[whichdialogue][j]];
+                            player[participantfocus[whichdialogue][j]].yaw = participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
+                            player[participantfocus[whichdialogue][j]].targetyaw = participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
+                            player[participantfocus[whichdialogue][j]].velocity = 0;
+                            player[participantfocus[whichdialogue][j]].animTarget = player[participantfocus[whichdialogue][j]].getIdle();
+                            player[participantfocus[whichdialogue][j]].frameTarget = 0;
                         }
-                        directing=0;
-                        indialogue=0;
+                        directing = 0;
+                        indialogue = 0;
                         dialoguegonethrough[whichdialogue]++;
-                        if(dialogueboxsound[whichdialogue][indialogue]!=0){
+                        if (dialogueboxsound[whichdialogue][indialogue] != 0) {
                             int whichsoundplay;
-                            if(dialogueboxsound[whichdialogue][indialogue]==1)whichsoundplay=rabbitchitter;
-                            if(dialogueboxsound[whichdialogue][indialogue]==2)whichsoundplay=rabbitchitter2;
-                            if(dialogueboxsound[whichdialogue][indialogue]==3)whichsoundplay=rabbitpainsound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==4)whichsoundplay=rabbitpain1sound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==5)whichsoundplay=rabbitattacksound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==6)whichsoundplay=rabbitattack2sound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==7)whichsoundplay=rabbitattack3sound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==8)whichsoundplay=rabbitattack4sound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==9)whichsoundplay=growlsound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==10)whichsoundplay=growl2sound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==11)whichsoundplay=snarlsound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==12)whichsoundplay=snarl2sound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==13)whichsoundplay=barksound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==14)whichsoundplay=bark2sound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==15)whichsoundplay=bark3sound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==16)whichsoundplay=barkgrowlsound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==-1)whichsoundplay=fireendsound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==-2)whichsoundplay=firestartsound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==-3)whichsoundplay=consolesuccesssound;
-                            if(dialogueboxsound[whichdialogue][indialogue]==-4)whichsoundplay=consolefailsound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 1)whichsoundplay = rabbitchitter;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 2)whichsoundplay = rabbitchitter2;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 3)whichsoundplay = rabbitpainsound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 4)whichsoundplay = rabbitpain1sound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 5)whichsoundplay = rabbitattacksound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 6)whichsoundplay = rabbitattack2sound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 7)whichsoundplay = rabbitattack3sound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 8)whichsoundplay = rabbitattack4sound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 9)whichsoundplay = growlsound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 10)whichsoundplay = growl2sound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 11)whichsoundplay = snarlsound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 12)whichsoundplay = snarl2sound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 13)whichsoundplay = barksound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 14)whichsoundplay = bark2sound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 15)whichsoundplay = bark3sound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == 16)whichsoundplay = barkgrowlsound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == -1)whichsoundplay = fireendsound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == -2)whichsoundplay = firestartsound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == -3)whichsoundplay = consolesuccesssound;
+                            if (dialogueboxsound[whichdialogue][indialogue] == -4)whichsoundplay = consolefailsound;
                             emit_sound_at(whichsoundplay, player[participantfocus[whichdialogue][indialogue]].coords);
                         }
                     }
                 }
             }
 
-            if(indialogue!=-1&&!mainmenu){
+            if (indialogue != -1 && !mainmenu) {
                 glDisable(GL_DEPTH_TEST);                                                      // Disables Depth Testing
                 glDisable(GL_CULL_FACE);
                 glDisable(GL_LIGHTING);
@@ -1005,16 +1010,16 @@ int Game::DrawGLScene(StereoSide side)
                 glMatrixMode(GL_PROJECTION);                                           // Select The Projection Matrix
                 glPushMatrix();                                                                                // Store The Projection Matrix
                 glLoadIdentity();                                                                      // Reset The Projection Matrix
-                glOrtho(0,screenwidth,0,screenheight,-100,100);                                                // Set Up An Ortho Screen
+                glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                           // Set Up An Ortho Screen
                 glMatrixMode(GL_MODELVIEW);                                                    // Select The Modelview Matrix
                 glPushMatrix();                                                                                // Store The Modelview Matrix
                 glLoadIdentity();                                                              // Reset The Modelview Matrix
-                if(dialogueboxlocation[whichdialogue][indialogue]==1)glTranslatef(0,screenheight*3/4,0);
-                glScalef(screenwidth,screenheight/4,1);
-                glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+                if (dialogueboxlocation[whichdialogue][indialogue] == 1)glTranslatef(0, screenheight * 3 / 4, 0);
+                glScalef(screenwidth, screenheight / 4, 1);
+                glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
                 glEnable(GL_BLEND);
 
-                glColor4f(dialogueboxcolor[whichdialogue][indialogue][0],dialogueboxcolor[whichdialogue][indialogue][1],dialogueboxcolor[whichdialogue][indialogue][2],0.7);
+                glColor4f(dialogueboxcolor[whichdialogue][indialogue][0], dialogueboxcolor[whichdialogue][indialogue][1], dialogueboxcolor[whichdialogue][indialogue][2], 0.7);
                 glBegin(GL_QUADS);
                 glVertex3f(0,          0,       0.0f);
                 glVertex3f(1,  0,       0.0f);
@@ -1031,52 +1036,50 @@ int Game::DrawGLScene(StereoSide side)
                 glDepthMask(1);
                 glEnable(GL_TEXTURE_2D);
 
-                tutorialopac=1;
+                tutorialopac = 1;
 
                 float startx;
                 float starty;
 
-                startx=screenwidth*1/5;
-                if(dialogueboxlocation[whichdialogue][indialogue]==1)
-                    starty=screenheight/16+screenheight*4/5;
-                if(dialogueboxlocation[whichdialogue][indialogue]==2)
-                    starty=screenheight*1/5-screenheight/16;
+                startx = screenwidth * 1 / 5;
+                if (dialogueboxlocation[whichdialogue][indialogue] == 1)
+                    starty = screenheight / 16 + screenheight * 4 / 5;
+                if (dialogueboxlocation[whichdialogue][indialogue] == 2)
+                    starty = screenheight * 1 / 5 - screenheight / 16;
 
                 char tempname[264];
                 bool goodchar;
-                int tempnum=0;
-                for(i=0;i<264;i++){
-                    tempname[i]='\0';
+                int tempnum = 0;
+                for (i = 0; i < 264; i++) {
+                    tempname[i] = '\0';
                 }
 
-                for(i=0;i<(int)strlen(dialoguename[whichdialogue][indialogue]);i++){
-                    tempname[tempnum]=dialoguename[whichdialogue][indialogue][i];
-                    goodchar=1;
-                    if(dialoguename[whichdialogue][indialogue][i]=='#'||dialoguename[whichdialogue][indialogue][i]=='\0')goodchar=0;
-                    if(goodchar)
+                for (i = 0; i < (int)strlen(dialoguename[whichdialogue][indialogue]); i++) {
+                    tempname[tempnum] = dialoguename[whichdialogue][indialogue][i];
+                    goodchar = 1;
+                    if (dialoguename[whichdialogue][indialogue][i] == '#' || dialoguename[whichdialogue][indialogue][i] == '\0')goodchar = 0;
+                    if (goodchar)
                         tempnum++;
                     else
-                        tempname[tempnum]='\0';
+                        tempname[tempnum] = '\0';
                 }
 
                 sprintf (string, "%s: ", tempname);
 
-                if(dialogueboxcolor[whichdialogue][indialogue][0]+dialogueboxcolor[whichdialogue][indialogue][1]+dialogueboxcolor[whichdialogue][indialogue][2]<1.5){
-                    glColor4f(0,0,0,tutorialopac);
-                    text->glPrintOutline(startx-2*7.6*strlen(string)*screenwidth/1024-4,starty-4,string,1,1.5*1.25*screenwidth/1024,screenwidth,screenheight);
-                    glColor4f(0.7,0.7,0.7,tutorialopac);
-                    text->glPrint(startx-2*7.6*strlen(string)*screenwidth/1024,starty,string,1,1.5*screenwidth/1024,screenwidth,screenheight);
-                }
-                else
-                {
-                    glColor4f(0,0,0,tutorialopac);
-                    text->glPrintOutline(startx-2*7.6*strlen(string)*screenwidth/1024-4,starty-4,string,1,1.5*1.25*screenwidth/1024,screenwidth,screenheight);
+                if (dialogueboxcolor[whichdialogue][indialogue][0] + dialogueboxcolor[whichdialogue][indialogue][1] + dialogueboxcolor[whichdialogue][indialogue][2] < 1.5) {
+                    glColor4f(0, 0, 0, tutorialopac);
+                    text->glPrintOutline(startx - 2 * 7.6 * strlen(string)*screenwidth / 1024 - 4, starty - 4, string, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight);
+                    glColor4f(0.7, 0.7, 0.7, tutorialopac);
+                    text->glPrint(startx - 2 * 7.6 * strlen(string)*screenwidth / 1024, starty, string, 1, 1.5 * screenwidth / 1024, screenwidth, screenheight);
+                } else {
+                    glColor4f(0, 0, 0, tutorialopac);
+                    text->glPrintOutline(startx - 2 * 7.6 * strlen(string)*screenwidth / 1024 - 4, starty - 4, string, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight);
                 }
 
-                tempnum=0;
-                for(i=0;i<(int)strlen(dialoguetext[whichdialogue][indialogue])+1;i++){
-                    tempname[tempnum]=dialoguetext[whichdialogue][indialogue][i];
-                    if(dialoguetext[whichdialogue][indialogue][i]!='#')tempnum++;
+                tempnum = 0;
+                for (i = 0; i < (int)strlen(dialoguetext[whichdialogue][indialogue]) + 1; i++) {
+                    tempname[tempnum] = dialoguetext[whichdialogue][indialogue][i];
+                    if (dialoguetext[whichdialogue][indialogue][i] != '#')tempnum++;
                 }
 
                 sprintf (string, "%s", tempname);
@@ -1084,42 +1087,40 @@ int Game::DrawGLScene(StereoSide side)
                 int lastline = 0;
                 int line = 0;
                 bool done = false;
-                i=0;
-                while(!done){
-                    if(string[i]=='\n'||string[i]>'z'||string[i]<' '||string[i]=='\0'){
-                        if(dialogueboxcolor[whichdialogue][indialogue][0]+dialogueboxcolor[whichdialogue][indialogue][1]+dialogueboxcolor[whichdialogue][indialogue][2]<1.5){
-                            glColor4f(0,0,0,tutorialopac);
-                            text->glPrintOutline(startx/*-7.6*(i-lastline)*screenwidth/1024*/-4,starty-4-20*screenwidth/1024*line,string,1,1.5*1.25*screenwidth/1024,screenwidth,screenheight,lastline,i);
-                            glColor4f(1,1,1,tutorialopac);
-                            text->glPrint(startx/*-7.6*(i-lastline)*screenwidth/1024*/,starty-20*screenwidth/1024*line,string,1,1.5*screenwidth/1024,screenwidth,screenheight,lastline,i);
-                        }
-                        else
-                        {
-                            glColor4f(0,0,0,tutorialopac);
-                            text->glPrint(startx/*-7.6*(i-lastline)*screenwidth/1024*/,starty-20*screenwidth/1024*line,string,1,1.5*screenwidth/1024,screenwidth,screenheight,lastline,i);
+                i = 0;
+                while (!done) {
+                    if (string[i] == '\n' || string[i] > 'z' || string[i] < ' ' || string[i] == '\0') {
+                        if (dialogueboxcolor[whichdialogue][indialogue][0] + dialogueboxcolor[whichdialogue][indialogue][1] + dialogueboxcolor[whichdialogue][indialogue][2] < 1.5) {
+                            glColor4f(0, 0, 0, tutorialopac);
+                            text->glPrintOutline(startx/*-7.6*(i-lastline)*screenwidth/1024*/ - 4, starty - 4 - 20 * screenwidth / 1024 * line, string, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight, lastline, i);
+                            glColor4f(1, 1, 1, tutorialopac);
+                            text->glPrint(startx/*-7.6*(i-lastline)*screenwidth/1024*/, starty - 20 * screenwidth / 1024 * line, string, 1, 1.5 * screenwidth / 1024, screenwidth, screenheight, lastline, i);
+                        } else {
+                            glColor4f(0, 0, 0, tutorialopac);
+                            text->glPrint(startx/*-7.6*(i-lastline)*screenwidth/1024*/, starty - 20 * screenwidth / 1024 * line, string, 1, 1.5 * screenwidth / 1024, screenwidth, screenheight, lastline, i);
                         }
-                        lastline=i+1;
+                        lastline = i + 1;
                         line++;
-                        if(string[i]=='\0')done=1;
+                        if (string[i] == '\0')done = 1;
                     }
-                    if(i>=255)done=1;
+                    if (i >= 255)done = 1;
                     i++;
                 }
             }
 
-            if(!tutoriallevel&&!winfreeze&&indialogue==-1&&!mainmenu){
-                if(campaign){
-                    if(scoreadded)
+            if (!tutoriallevel && !winfreeze && indialogue == -1 && !mainmenu) {
+                if (campaign) {
+                    if (scoreadded)
                         sprintf (string, "Score: %d", (int)accountactive->getCampaignScore());
                     else
-                        sprintf (string, "Score: %d", (int)accountactive->getCampaignScore()+(int)bonustotal);
-                }
-                if(!campaign)sprintf (string, "Score: %d", (int)bonustotal);
-                glColor4f(0,0,0,1);
-                text->glPrintOutline(1024/40-4,768/16-4+768*14/16,string,1,1.5*1.25,1024,768);
-                glColor4f(1,0,0,1);
-                text->glPrint(1024/40,768/16+768*14/16,string,1,1.5,1024,768);
-                if(showdamagebar) {
+                        sprintf (string, "Score: %d", (int)accountactive->getCampaignScore() + (int)bonustotal);
+                }
+                if (!campaign)sprintf (string, "Score: %d", (int)bonustotal);
+                glColor4f(0, 0, 0, 1);
+                text->glPrintOutline(1024 / 40 - 4, 768 / 16 - 4 + 768 * 14 / 16, string, 1, 1.5 * 1.25, 1024, 768);
+                glColor4f(1, 0, 0, 1);
+                text->glPrint(1024 / 40, 768 / 16 + 768 * 14 / 16, string, 1, 1.5, 1024, 768);
+                if (showdamagebar) {
                     glDisable(GL_DEPTH_TEST);                                                  // Disables Depth Testing
                     glDisable(GL_CULL_FACE);
                     glDisable(GL_LIGHTING);
@@ -1128,64 +1129,64 @@ int Game::DrawGLScene(StereoSide side)
                     glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
                     glPushMatrix();                                                                            // Store The Projection Matrix
                     glLoadIdentity();                                                                  // Reset The Projection Matrix
-                    glOrtho(0,screenwidth,0,screenheight,-100,100);            // Set Up An Ortho Screen
+                    glOrtho(0, screenwidth, 0, screenheight, -100, 100);               // Set Up An Ortho Screen
                     glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
                     glPushMatrix();                                                                            // Store The Modelview Matrix
                     glLoadIdentity();                                                                  // Reset The Modelview Matrix
-                    glTranslatef(15,screenheight*17.5/20,0);
-                    glScalef(screenwidth/3+20,screenheight/20,1);
-                    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+                    glTranslatef(15, screenheight * 17.5 / 20, 0);
+                    glScalef(screenwidth / 3 + 20, screenheight / 20, 1);
+                    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
                     glEnable(GL_BLEND);
-                    glColor4f(0.0,0.4,0.0,0.7);
-                    float bar=((float)player[0].damage)/player[0].damagetolerance;
+                    glColor4f(0.0, 0.4, 0.0, 0.7);
+                    float bar = ((float)player[0].damage) / player[0].damagetolerance;
                     glBegin(GL_QUADS);
-                    glVertex3f((bar<1?bar:1),0,0.0f);
-                    glVertex3f(1,0,0.0f);
-                    glVertex3f(1,1,0.0f);
-                    glVertex3f((bar<1?bar:1),1,0.0f);
+                    glVertex3f((bar < 1 ? bar : 1), 0, 0.0f);
+                    glVertex3f(1, 0, 0.0f);
+                    glVertex3f(1, 1, 0.0f);
+                    glVertex3f((bar < 1 ? bar : 1), 1, 0.0f);
                     glEnd();
-                    glColor4f(0.1,0.0,0.0,1);
-                    bar = ((float)player[0].bloodloss)/player[0].damagetolerance;
+                    glColor4f(0.1, 0.0, 0.0, 1);
+                    bar = ((float)player[0].bloodloss) / player[0].damagetolerance;
                     glBegin(GL_QUADS);
-                    glVertex3f(0,0,0.0f);
-                    glVertex3f((bar<1?bar:1),0,0.0f);
-                    glVertex3f((bar<1?bar:1),1,0.0f);
-                    glVertex3f(0,1,0.0f);
+                    glVertex3f(0, 0, 0.0f);
+                    glVertex3f((bar < 1 ? bar : 1), 0, 0.0f);
+                    glVertex3f((bar < 1 ? bar : 1), 1, 0.0f);
+                    glVertex3f(0, 1, 0.0f);
                     glEnd();
-                    glColor4f(0.4,0.0,0.0,0.7);
-                    bar = ((float)player[0].damage)/player[0].damagetolerance;
+                    glColor4f(0.4, 0.0, 0.0, 0.7);
+                    bar = ((float)player[0].damage) / player[0].damagetolerance;
                     glBegin(GL_QUADS);
-                    glVertex3f(0,0,0.0f);
-                    glVertex3f((bar<1?bar:1),0,0.0f);
-                    glVertex3f((bar<1?bar:1),1,0.0f);
-                    glVertex3f(0,1,0.0f);
+                    glVertex3f(0, 0, 0.0f);
+                    glVertex3f((bar < 1 ? bar : 1), 0, 0.0f);
+                    glVertex3f((bar < 1 ? bar : 1), 1, 0.0f);
+                    glVertex3f(0, 1, 0.0f);
                     glEnd();
-                    glColor4f(0.4,0.0,0.0,0.7);
-                    bar = ((float)player[0].permanentdamage)/player[0].damagetolerance;
+                    glColor4f(0.4, 0.0, 0.0, 0.7);
+                    bar = ((float)player[0].permanentdamage) / player[0].damagetolerance;
                     glBegin(GL_QUADS);
-                    glVertex3f(0,0,0.0f);
-                    glVertex3f((bar<1?bar:1),0,0.0f);
-                    glVertex3f((bar<1?bar:1),1,0.0f);
-                    glVertex3f(0,1,0.0f);
+                    glVertex3f(0, 0, 0.0f);
+                    glVertex3f((bar < 1 ? bar : 1), 0, 0.0f);
+                    glVertex3f((bar < 1 ? bar : 1), 1, 0.0f);
+                    glVertex3f(0, 1, 0.0f);
                     glEnd();
-                    glColor4f(0.4,0.0,0.0,0.7);
-                    bar = ((float)player[0].superpermanentdamage)/player[0].damagetolerance;
+                    glColor4f(0.4, 0.0, 0.0, 0.7);
+                    bar = ((float)player[0].superpermanentdamage) / player[0].damagetolerance;
                     glBegin(GL_QUADS);
-                    glVertex3f(0,0,0.0f);
-                    glVertex3f((bar<1?bar:1),0,0.0f);
-                    glVertex3f((bar<1?bar:1),1,0.0f);
-                    glVertex3f(0,1,0.0f);
+                    glVertex3f(0, 0, 0.0f);
+                    glVertex3f((bar < 1 ? bar : 1), 0, 0.0f);
+                    glVertex3f((bar < 1 ? bar : 1), 1, 0.0f);
+                    glVertex3f(0, 1, 0.0f);
                     glEnd();
-                    glColor4f(0.0,0.0,0.0,0.7);
+                    glColor4f(0.0, 0.0, 0.0, 0.7);
                     glLineWidth(2.0);
                     glBegin(GL_LINE_STRIP);
-                    glVertex3f(0,0,0.0f);
-                    glVertex3f(1,0,0.0f);
-                    glVertex3f(1,1,0.0f);
-                    glVertex3f(0,1,0.0f);
-                    glVertex3f(0,0,0.0f);
+                    glVertex3f(0, 0, 0.0f);
+                    glVertex3f(1, 0, 0.0f);
+                    glVertex3f(1, 1, 0.0f);
+                    glVertex3f(0, 1, 0.0f);
+                    glVertex3f(0, 0, 0.0f);
                     glEnd();
-                    
+
                     glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
                     glPopMatrix();                                                                             // Restore The Old Projection Matrix
                     glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
@@ -1195,977 +1196,976 @@ int Game::DrawGLScene(StereoSide side)
                     glDisable(GL_BLEND);
                     glDepthMask(1);
                     glEnable(GL_TEXTURE_2D);
-                    
-                    // writing the numbers : 
-                    sprintf (string, "Damages : %d/%d (%d)",(int)(player[0].damage),(int)(player[0].damagetolerance),(int)(player[0].bloodloss));
-                    glColor4f(0,0,0,1);
-                    text->glPrintOutline(1024/40-4,768/16-4+768*14/16-40,string,1,1.5*1.25,1024,768);
-                    glColor4f(1,0,0,1);
-                    text->glPrint(1024/40,768/16+768*14/16-40,string,1,1.5,1024,768);
+
+                    // writing the numbers :
+                    sprintf (string, "Damages : %d/%d (%d)", (int)(player[0].damage), (int)(player[0].damagetolerance), (int)(player[0].bloodloss));
+                    glColor4f(0, 0, 0, 1);
+                    text->glPrintOutline(1024 / 40 - 4, 768 / 16 - 4 + 768 * 14 / 16 - 40, string, 1, 1.5 * 1.25, 1024, 768);
+                    glColor4f(1, 0, 0, 1);
+                    text->glPrint(1024 / 40, 768 / 16 + 768 * 14 / 16 - 40, string, 1, 1.5, 1024, 768);
                 }
             }
 
-            glColor4f(.5,.5,.5,1);
+            glColor4f(.5, .5, .5, 1);
 
 
-            if((texttoggle||editorenabled)&&debugmode&&!mainmenu){
-                sprintf (string, "The framespersecond is %d.",(int)(fps));
-                text->glPrint(10,30,string,0,.8,1024,768);
+            if ((texttoggle || editorenabled) && debugmode && !mainmenu) {
+                sprintf (string, "The framespersecond is %d.", (int)(fps));
+                text->glPrint(10, 30, string, 0, .8, 1024, 768);
 
-                if(editorenabled)
+                if (editorenabled)
                     sprintf (string, "Map editor enabled.");
                 else
                     sprintf (string, "Map editor disabled.");
-                text->glPrint(10,60,string,0,.8,1024,768);
-                if(editorenabled){
-                    sprintf (string, "Object size: %f",editorsize);
-                    text->glPrint(10,75,string,0,.8,1024,768);
-                    if(editoryaw>=0)sprintf (string, "Object yaw: %f",editoryaw);
+                text->glPrint(10, 60, string, 0, .8, 1024, 768);
+                if (editorenabled) {
+                    sprintf (string, "Object size: %f", editorsize);
+                    text->glPrint(10, 75, string, 0, .8, 1024, 768);
+                    if (editoryaw >= 0)sprintf (string, "Object yaw: %f", editoryaw);
                     else sprintf (string, "Object yaw: Random");
-                    text->glPrint(10,90,string,0,.8,1024,768);
-                    if(editorpitch>=0)sprintf (string, "Object pitch: %f",editorpitch);
+                    text->glPrint(10, 90, string, 0, .8, 1024, 768);
+                    if (editorpitch >= 0)sprintf (string, "Object pitch: %f", editorpitch);
                     else sprintf (string, "Object pitch: Random");
-                    text->glPrint(10,105,string,0,.8,1024,768);
-                    sprintf (string, "Object type: %d",editortype);
-                    text->glPrint(10,120,string,0,.8,1024,768);
-                    switch(editortype) {
-                        case boxtype: 
-                            sprintf (string, "(box)");
-                            break;
-                        case treetrunktype: 
-                            sprintf (string, "(tree)");
-                            break;
-                        case walltype: 
-                            sprintf (string, "(wall)");
-                            break;
-                        case weirdtype: 
-                            sprintf (string, "(weird)");
-                            break;
-                        case spiketype: 
-                            sprintf (string, "(spike)");
-                            break;
-                        case rocktype: 
-                            sprintf (string, "(rock)");
-                            break;
-                        case bushtype: 
-                            sprintf (string, "(bush)");
-                            break;
-                        case tunneltype: 
-                            sprintf (string, "(tunnel)");
-                            break;
-                        case chimneytype: 
-                            sprintf (string, "(chimney)");
-                            break;
-                        case platformtype: 
-                            sprintf (string, "(platform)");
-                            break;
-                        case cooltype: 
-                            sprintf (string, "(cool)");
-                            break;
-                        case firetype: 
-                            sprintf (string, "(fire)");
-                            break;
+                    text->glPrint(10, 105, string, 0, .8, 1024, 768);
+                    sprintf (string, "Object type: %d", editortype);
+                    text->glPrint(10, 120, string, 0, .8, 1024, 768);
+                    switch (editortype) {
+                    case boxtype:
+                        sprintf (string, "(box)");
+                        break;
+                    case treetrunktype:
+                        sprintf (string, "(tree)");
+                        break;
+                    case walltype:
+                        sprintf (string, "(wall)");
+                        break;
+                    case weirdtype:
+                        sprintf (string, "(weird)");
+                        break;
+                    case spiketype:
+                        sprintf (string, "(spike)");
+                        break;
+                    case rocktype:
+                        sprintf (string, "(rock)");
+                        break;
+                    case bushtype:
+                        sprintf (string, "(bush)");
+                        break;
+                    case tunneltype:
+                        sprintf (string, "(tunnel)");
+                        break;
+                    case chimneytype:
+                        sprintf (string, "(chimney)");
+                        break;
+                    case platformtype:
+                        sprintf (string, "(platform)");
+                        break;
+                    case cooltype:
+                        sprintf (string, "(cool)");
+                        break;
+                    case firetype:
+                        sprintf (string, "(fire)");
+                        break;
                     }
-                    text->glPrint(130,120,string,0,.8,1024,768);
+                    text->glPrint(130, 120, string, 0, .8, 1024, 768);
 
-                    sprintf (string, "Numplayers: %d",numplayers);
-                    text->glPrint(10,155,string,0,.8,1024,768);
-                    sprintf (string, "Player %d: numwaypoints: %d",numplayers,player[numplayers-1].numwaypoints);
-                    text->glPrint(10,140,string,0,.8,1024,768);
+                    sprintf (string, "Numplayers: %d", numplayers);
+                    text->glPrint(10, 155, string, 0, .8, 1024, 768);
+                    sprintf (string, "Player %d: numwaypoints: %d", numplayers, player[numplayers - 1].numwaypoints);
+                    text->glPrint(10, 140, string, 0, .8, 1024, 768);
                 }
-                sprintf (string, "Difficulty: %d",difficulty);
-                text->glPrint(10,240,string,0,.8,1024,768);
+                sprintf (string, "Difficulty: %d", difficulty);
+                text->glPrint(10, 240, string, 0, .8, 1024, 768);
 
             }
-               }
-
-               if(drawmode==glowmode){
-                       glDisable(GL_DEPTH_TEST);                                                       // Disables Depth Testing
-                       glDisable(GL_CULL_FACE);
-                       glDisable(GL_LIGHTING);
-                       glDisable(GL_TEXTURE_2D);
-                       glDepthMask(0);
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPushMatrix();                                                                         // Store The Projection Matrix
-                       glLoadIdentity();                                                                       // Reset The Projection Matrix
-                       glOrtho(0,screenwidth,0,screenheight,-100,100);                                         // Set Up An Ortho Screen
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPushMatrix();                                                                         // Store The Modelview Matrix
-                       glLoadIdentity();                                                               // Reset The Modelview Matrix
-                       glScalef(screenwidth,screenheight,1);
-                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                       glEnable(GL_BLEND);
-                       glColor4f(0,0,0,.5);
-                       glBegin(GL_QUADS);
-                       glVertex3f(0,           0,       0.0f);
-                       glVertex3f(256, 0,       0.0f);
-                       glVertex3f(256, 256, 0.0f);
-                       glVertex3f(0,   256, 0.0f);
-                       glEnd();
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glEnable(GL_DEPTH_TEST);                                                        // Enables Depth Testing
-                       glEnable(GL_CULL_FACE);
-                       glDisable(GL_BLEND);
-                       glDepthMask(1);
-               }
-
-               if((((blackout&&damageeffects)||(player[0].bloodloss>0&&damageeffects&&player[0].blooddimamount>0)||player[0].dead)&&!cameramode)||console){
-                       glDisable(GL_DEPTH_TEST);                                                       // Disables Depth Testing
-                       glDisable(GL_CULL_FACE);
-                       glDisable(GL_LIGHTING);
-                       glDisable(GL_TEXTURE_2D);
-                       glDepthMask(0);
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPushMatrix();                                                                         // Store The Projection Matrix
-                       glLoadIdentity();                                                                       // Reset The Projection Matrix
-                       glOrtho(0,screenwidth,0,screenheight,-100,100);                                         // Set Up An Ortho Screen
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPushMatrix();                                                                         // Store The Modelview Matrix
-                       glLoadIdentity();                                                               // Reset The Modelview Matrix
-                       glScalef(screenwidth,screenheight,1);
-                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                       glEnable(GL_BLEND);
-                       if(player[0].dead)blackout+=multiplier*3;
-                       if(player[0].dead==1)blackout=.4f;
-                       if(player[0].dead==2&&blackout>.6)blackout=.6;
-                       glColor4f(0,0,0,blackout);
-                       if(!player[0].dead){
-                               if((player[0].bloodloss/player[0].damagetolerance*(sin(woozy)/4+.5))*.3<.3){
-                                       glColor4f(0,0,0,player[0].blooddimamount*player[0].bloodloss/player[0].damagetolerance*(sin(woozy)/4+.5)*.3);
-                                       blackout=player[0].blooddimamount*player[0].bloodloss/player[0].damagetolerance*(sin(woozy)/4+.5)*.3;
-                               }
-                               else {
-                                       glColor4f(0,0,0,player[0].blooddimamount*.3);
-                                       blackout=player[0].blooddimamount*.3;
-                               }
-                       }
-                       if(console)glColor4f(.7,0,0,.2);
-                       glBegin(GL_QUADS);
-                       glVertex3f(0,           0,       0.0f);
-                       glVertex3f(256, 0,       0.0f);
-                       glVertex3f(256, 256, 0.0f);
-                       glVertex3f(0,   256, 0.0f);
-                       glEnd();
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glEnable(GL_DEPTH_TEST);                                                        // Enables Depth Testing
-                       glEnable(GL_CULL_FACE);
-                       glDisable(GL_BLEND);
-                       glDepthMask(1);
-               }
-
-               if(flashamount>0&&damageeffects) {
-                       if(flashamount>1)flashamount=1;
-                       if(flashdelay<=0)flashamount-=multiplier;
-                       flashdelay--;
-                       if(flashamount<0)flashamount=0;
-                       glDisable(GL_DEPTH_TEST);                                                       // Disables Depth Testing
-                       glDisable(GL_CULL_FACE);
-                       glDisable(GL_LIGHTING);
-                       glDepthMask(0);
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPushMatrix();                                                                         // Store The Projection Matrix
-                       glLoadIdentity();                                                                       // Reset The Projection Matrix
-                       glOrtho(0,screenwidth,0,screenheight,-100,100);                                         // Set Up An Ortho Screen
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPushMatrix();                                                                         // Store The Modelview Matrix
-                       glLoadIdentity();                                                               // Reset The Modelview Matrix
-                       glScalef(screenwidth,screenheight,1);
-                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                       glEnable(GL_BLEND);
-                       glColor4f(flashr,flashg,flashb,flashamount);
-                       glBegin(GL_QUADS);
-                       glVertex3f(0,           0,       0.0f);
-                       glVertex3f(256, 0,       0.0f);
-                       glVertex3f(256, 256, 0.0f);
-                       glVertex3f(0,   256, 0.0f);
-                       glEnd();
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glEnable(GL_DEPTH_TEST);                                                        // Enables Depth Testing
-                       glEnable(GL_CULL_FACE);
-                       glDisable(GL_BLEND);
-                       glDepthMask(1);
-               }       
-
-               if(!console) {
-                       displaytime[0]=0;
-                       glEnable(GL_TEXTURE_2D);
-                       glColor4f(1,1,1,1);
-                       if(chatting){
-                               sprintf (string, " ]");
-                               text->glPrint(10,30+screenheight-330,string,0,1,screenwidth,screenheight);
-                               if(displayblink){
-                                       sprintf (string, "_");
-                                       text->glPrint(30+(float)(displayselected)*10,30+(screenheight-330),string,0,1,screenwidth,screenheight);
-                               }
-                       }
-                       for(i=0;i<15;i++)
-                               if((i!=0||chatting)&&displaytime[i]<4)
-                                       for(j=0;j<displaychars[i];j++) {
-                                               glColor4f(1,1,1,4-displaytime[i]);
-                                               if(j<displaychars[i]) {
-                                                       sprintf (string, "%c",displaytext[i][j]);
-                                                       text->glPrint(30+j*10,30+i*20+(screenheight-330),string,0,1,screenwidth,screenheight);
-                                               }
-                                       }
-               }
-
-               if(difficulty<2&&indialogue==-1){  // minimap
-                       float mapviewdist = 20000;
-
-                       glDisable(GL_DEPTH_TEST);
-                       glColor3f (1.0, 1.0, 1.0); // no coloring
-
-                       glEnable(GL_TEXTURE_2D);
-                       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
-                       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
-                       glDisable(GL_DEPTH_TEST);                                                       // Disables Depth Testing
-                       glDisable(GL_CULL_FACE);
-                       glDisable(GL_LIGHTING);
-                       glDepthMask(0);
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPushMatrix();                                                                         // Store The Projection Matrix
-                       glLoadIdentity();                                                                       // Reset The Projection Matrix
-                       glOrtho(0,screenwidth,0,screenheight,-100,100);                                         // Set Up An Ortho Screen
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPushMatrix();                                                                         // Store The Modelview Matrix
-                       glLoadIdentity();                                                               // Reset The Modelview Matrix
-                       glScalef((float)screenwidth/2,(float)screenwidth/2,1);
-                       glTranslatef(1.75,.25,0);
-                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                       glEnable(GL_BLEND);
-                       glColor4f(1,1,1,1);
-                       glPushMatrix();
-                       float opac = .7;
-                       XYZ center;
-                       float radius;
-                       float distcheck;
-                       int numliveplayers=0;
-                       center = 0;
-                       for(i=0;i<numplayers;i++){
-                               if(!player[i].dead) numliveplayers++;
-                       }
-
-                       int numadd = 0;
-
-                       for(i=0;i<objects.numobjects;i++){
-                               if(objects.type[i]==treetrunktype||objects.type[i]==boxtype){
-                                       center+=objects.position[i];    
-                                       numadd++;
-                               }
-                       }
-                       for(i=0;i<numplayers;i++){
-                               if(!player[i].dead)center+=player[i].coords;    
-                       }
-                       center/=numadd+numliveplayers;
-
-                       center=player[0].coords;
-
-                       float maxdistance=0;
-                       float tempdist;
-                       //~ int whichclosest;
-                       for(i=0;i<objects.numobjects;i++){
-                               tempdist=distsq(&center,&objects.position[i]);
-                               if(tempdist>maxdistance){
-                                       //~ whichclosest=i;
-                                       maxdistance=tempdist;
-                               }
-                       }
-                       for(i=0;i<numplayers;i++){
-                               if(!player[i].dead){
-                                       tempdist=distsq(&center,&player[i].coords);
-                                       if(tempdist>maxdistance){
-                                               //~ whichclosest=i;
-                                               maxdistance=tempdist;
-                                       }
-                               }
-                       }
-                       radius=fast_sqrt(maxdistance);
-
-                       radius=110;
-
-                       glScalef(.25/radius*256*terrain.scale*.4,.25/radius*256*terrain.scale*.4,1);
-                       glPushMatrix();
-                       glScalef(1/(1/radius*256*terrain.scale*.4),1/(1/radius*256*terrain.scale*.4),1);
-                       glPopMatrix();
-                       glRotatef(player[0].lookyaw*-1+180,0,0,1);
-                       glTranslatef(-(center.x/terrain.scale/256*-2+1),(center.z/terrain.scale/256*-2+1),0);
-                       for(i=0;i<objects.numobjects;i++){
-                               if(objects.type[i]==treetrunktype){
-                                       distcheck=distsq(&player[0].coords,&objects.position[i]);
-                                       if(distcheck<mapviewdist){
+        }
+
+        if (drawmode == glowmode) {
+            glDisable(GL_DEPTH_TEST);                                                  // Disables Depth Testing
+            glDisable(GL_CULL_FACE);
+            glDisable(GL_LIGHTING);
+            glDisable(GL_TEXTURE_2D);
+            glDepthMask(0);
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPushMatrix();                                                                            // Store The Projection Matrix
+            glLoadIdentity();                                                                  // Reset The Projection Matrix
+            glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                               // Set Up An Ortho Screen
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPushMatrix();                                                                            // Store The Modelview Matrix
+            glLoadIdentity();                                                          // Reset The Modelview Matrix
+            glScalef(screenwidth, screenheight, 1);
+            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            glEnable(GL_BLEND);
+            glColor4f(0, 0, 0, .5);
+            glBegin(GL_QUADS);
+            glVertex3f(0,              0,       0.0f);
+            glVertex3f(256,    0,       0.0f);
+            glVertex3f(256,    256, 0.0f);
+            glVertex3f(0,      256, 0.0f);
+            glEnd();
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glEnable(GL_DEPTH_TEST);                                                   // Enables Depth Testing
+            glEnable(GL_CULL_FACE);
+            glDisable(GL_BLEND);
+            glDepthMask(1);
+        }
+
+        if ((((blackout && damageeffects) || (player[0].bloodloss > 0 && damageeffects && player[0].blooddimamount > 0) || player[0].dead) && !cameramode) || console) {
+            glDisable(GL_DEPTH_TEST);                                                  // Disables Depth Testing
+            glDisable(GL_CULL_FACE);
+            glDisable(GL_LIGHTING);
+            glDisable(GL_TEXTURE_2D);
+            glDepthMask(0);
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPushMatrix();                                                                            // Store The Projection Matrix
+            glLoadIdentity();                                                                  // Reset The Projection Matrix
+            glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                               // Set Up An Ortho Screen
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPushMatrix();                                                                            // Store The Modelview Matrix
+            glLoadIdentity();                                                          // Reset The Modelview Matrix
+            glScalef(screenwidth, screenheight, 1);
+            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            glEnable(GL_BLEND);
+            if (player[0].dead)blackout += multiplier * 3;
+            if (player[0].dead == 1)blackout = .4f;
+            if (player[0].dead == 2 && blackout > .6)blackout = .6;
+            glColor4f(0, 0, 0, blackout);
+            if (!player[0].dead) {
+                if ((player[0].bloodloss / player[0].damagetolerance * (sin(woozy) / 4 + .5))*.3 < .3) {
+                    glColor4f(0, 0, 0, player[0].blooddimamount * player[0].bloodloss / player[0].damagetolerance * (sin(woozy) / 4 + .5)*.3);
+                    blackout = player[0].blooddimamount * player[0].bloodloss / player[0].damagetolerance * (sin(woozy) / 4 + .5) * .3;
+                } else {
+                    glColor4f(0, 0, 0, player[0].blooddimamount * .3);
+                    blackout = player[0].blooddimamount * .3;
+                }
+            }
+            if (console)glColor4f(.7, 0, 0, .2);
+            glBegin(GL_QUADS);
+            glVertex3f(0,              0,       0.0f);
+            glVertex3f(256,    0,       0.0f);
+            glVertex3f(256,    256, 0.0f);
+            glVertex3f(0,      256, 0.0f);
+            glEnd();
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glEnable(GL_DEPTH_TEST);                                                   // Enables Depth Testing
+            glEnable(GL_CULL_FACE);
+            glDisable(GL_BLEND);
+            glDepthMask(1);
+        }
+
+        if (flashamount > 0 && damageeffects) {
+            if (flashamount > 1)flashamount = 1;
+            if (flashdelay <= 0)flashamount -= multiplier;
+            flashdelay--;
+            if (flashamount < 0)flashamount = 0;
+            glDisable(GL_DEPTH_TEST);                                                  // Disables Depth Testing
+            glDisable(GL_CULL_FACE);
+            glDisable(GL_LIGHTING);
+            glDepthMask(0);
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPushMatrix();                                                                            // Store The Projection Matrix
+            glLoadIdentity();                                                                  // Reset The Projection Matrix
+            glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                               // Set Up An Ortho Screen
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPushMatrix();                                                                            // Store The Modelview Matrix
+            glLoadIdentity();                                                          // Reset The Modelview Matrix
+            glScalef(screenwidth, screenheight, 1);
+            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            glEnable(GL_BLEND);
+            glColor4f(flashr, flashg, flashb, flashamount);
+            glBegin(GL_QUADS);
+            glVertex3f(0,              0,       0.0f);
+            glVertex3f(256,    0,       0.0f);
+            glVertex3f(256,    256, 0.0f);
+            glVertex3f(0,      256, 0.0f);
+            glEnd();
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glEnable(GL_DEPTH_TEST);                                                   // Enables Depth Testing
+            glEnable(GL_CULL_FACE);
+            glDisable(GL_BLEND);
+            glDepthMask(1);
+        }
+
+        if (!console) {
+            displaytime[0] = 0;
+            glEnable(GL_TEXTURE_2D);
+            glColor4f(1, 1, 1, 1);
+            if (chatting) {
+                sprintf (string, " ]");
+                text->glPrint(10, 30 + screenheight - 330, string, 0, 1, screenwidth, screenheight);
+                if (displayblink) {
+                    sprintf (string, "_");
+                    text->glPrint(30 + (float)(displayselected) * 10, 30 + (screenheight - 330), string, 0, 1, screenwidth, screenheight);
+                }
+            }
+            for (i = 0; i < 15; i++)
+                if ((i != 0 || chatting) && displaytime[i] < 4)
+                    for (j = 0; j < displaychars[i]; j++) {
+                        glColor4f(1, 1, 1, 4 - displaytime[i]);
+                        if (j < displaychars[i]) {
+                            sprintf (string, "%c", displaytext[i][j]);
+                            text->glPrint(30 + j * 10, 30 + i * 20 + (screenheight - 330), string, 0, 1, screenwidth, screenheight);
+                        }
+                    }
+        }
+
+        if (difficulty < 2 && indialogue == -1) { // minimap
+            float mapviewdist = 20000;
+
+            glDisable(GL_DEPTH_TEST);
+            glColor3f (1.0, 1.0, 1.0); // no coloring
+
+            glEnable(GL_TEXTURE_2D);
+            glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+            glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+            glDisable(GL_DEPTH_TEST);                                                  // Disables Depth Testing
+            glDisable(GL_CULL_FACE);
+            glDisable(GL_LIGHTING);
+            glDepthMask(0);
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPushMatrix();                                                                            // Store The Projection Matrix
+            glLoadIdentity();                                                                  // Reset The Projection Matrix
+            glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                               // Set Up An Ortho Screen
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPushMatrix();                                                                            // Store The Modelview Matrix
+            glLoadIdentity();                                                          // Reset The Modelview Matrix
+            glScalef((float)screenwidth / 2, (float)screenwidth / 2, 1);
+            glTranslatef(1.75, .25, 0);
+            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            glEnable(GL_BLEND);
+            glColor4f(1, 1, 1, 1);
+            glPushMatrix();
+            float opac = .7;
+            XYZ center;
+            float radius;
+            float distcheck;
+            int numliveplayers = 0;
+            center = 0;
+            for (i = 0; i < numplayers; i++) {
+                if (!player[i].dead) numliveplayers++;
+            }
+
+            int numadd = 0;
+
+            for (i = 0; i < objects.numobjects; i++) {
+                if (objects.type[i] == treetrunktype || objects.type[i] == boxtype) {
+                    center += objects.position[i];
+                    numadd++;
+                }
+            }
+            for (i = 0; i < numplayers; i++) {
+                if (!player[i].dead)center += player[i].coords;
+            }
+            center /= numadd + numliveplayers;
+
+            center = player[0].coords;
+
+            float maxdistance = 0;
+            float tempdist;
+            //~ int whichclosest;
+            for (i = 0; i < objects.numobjects; i++) {
+                tempdist = distsq(&center, &objects.position[i]);
+                if (tempdist > maxdistance) {
+                    //~ whichclosest=i;
+                    maxdistance = tempdist;
+                }
+            }
+            for (i = 0; i < numplayers; i++) {
+                if (!player[i].dead) {
+                    tempdist = distsq(&center, &player[i].coords);
+                    if (tempdist > maxdistance) {
+                        //~ whichclosest=i;
+                        maxdistance = tempdist;
+                    }
+                }
+            }
+            radius = fast_sqrt(maxdistance);
+
+            radius = 110;
+
+            glScalef(.25 / radius * 256 * terrain.scale * .4, .25 / radius * 256 * terrain.scale * .4, 1);
+            glPushMatrix();
+            glScalef(1 / (1 / radius * 256 * terrain.scale * .4), 1 / (1 / radius * 256 * terrain.scale * .4), 1);
+            glPopMatrix();
+            glRotatef(player[0].lookyaw * -1 + 180, 0, 0, 1);
+            glTranslatef(-(center.x / terrain.scale / 256 * -2 + 1), (center.z / terrain.scale / 256 * -2 + 1), 0);
+            for (i = 0; i < objects.numobjects; i++) {
+                if (objects.type[i] == treetrunktype) {
+                    distcheck = distsq(&player[0].coords, &objects.position[i]);
+                    if (distcheck < mapviewdist) {
                         Mapcircletexture.bind();
-                                               glColor4f(0,.3,0,opac*(1-distcheck/mapviewdist));
-                                               glPushMatrix();
-                                               glTranslatef(objects.position[i].x/terrain.scale/256*-2+1,objects.position[i].z/terrain.scale/256*2-1,0);
-                                               glRotatef(objects.yaw[i],0,0,1);
-                                               glScalef(.003,.003,.003);
-                                               glBegin(GL_QUADS);
-                                               glTexCoord2f(0,0);
-                                               glVertex3f(-1,          -1,      0.0f);
-                                               glTexCoord2f(1,0);
-                                               glVertex3f(1,   -1,      0.0f);
-                                               glTexCoord2f(1,1);
-                                               glVertex3f(1,   1, 0.0f);
-                                               glTexCoord2f(0,1);
-                                               glVertex3f(-1,  1, 0.0f);
-                                               glEnd();
-                                               glPopMatrix();
-                                       }
-                               }
-                               if(objects.type[i]==boxtype){
-                                       distcheck=distsq(&player[0].coords,&objects.position[i]);
-                                       if(distcheck<mapviewdist){
-                                               Mapboxtexture.bind();
-                                               glColor4f(.4,.4,.4,opac*(1-distcheck/mapviewdist));
-                                               glPushMatrix();
-                                               glTranslatef(objects.position[i].x/terrain.scale/256*-2+1,objects.position[i].z/terrain.scale/256*2-1,0);
-                                               glRotatef(objects.yaw[i],0,0,1);
-                                               glScalef(.01*objects.scale[i],.01*objects.scale[i],.01*objects.scale[i]);
-                                               glBegin(GL_QUADS);
-                                               glTexCoord2f(0,0);
-                                               glVertex3f(-1,          -1,      0.0f);
-                                               glTexCoord2f(1,0);
-                                               glVertex3f(1,   -1,      0.0f);
-                                               glTexCoord2f(1,1);
-                                               glVertex3f(1,   1, 0.0f);
-                                               glTexCoord2f(0,1);
-                                               glVertex3f(-1,  1, 0.0f);
-                                               glEnd();
-                                               glPopMatrix();
-                                       }
-                               }
-                       }
-                       if(editorenabled){
-                               Mapcircletexture.bind();
-                               for(i=0;i<numboundaries;i++){
-                                       glColor4f(0,0,0,opac/3);
-                                       glPushMatrix();
-                                       glTranslatef(boundary[i].x/terrain.scale/256*-2+1,boundary[i].z/terrain.scale/256*2-1,0);
-                                       glScalef(.002,.002,.002);
-                                       glBegin(GL_QUADS);
-                                       glTexCoord2f(0,0);
-                                       glVertex3f(-1,          -1,      0.0f);
-                                       glTexCoord2f(1,0);
-                                       glVertex3f(1,   -1,      0.0f);
-                                       glTexCoord2f(1,1);
-                                       glVertex3f(1,   1, 0.0f);
-                                       glTexCoord2f(0,1);
-                                       glVertex3f(-1,  1, 0.0f);
-                                       glEnd();
-                                       glPopMatrix();
-                               }
-                       }
-                       for(i=0;i<numplayers;i++){
-                               distcheck=distsq(&player[0].coords,&player[i].coords);
-                               if(distcheck<mapviewdist){
-                                       glPushMatrix();
+                        glColor4f(0, .3, 0, opac * (1 - distcheck / mapviewdist));
+                        glPushMatrix();
+                        glTranslatef(objects.position[i].x / terrain.scale / 256 * -2 + 1, objects.position[i].z / terrain.scale / 256 * 2 - 1, 0);
+                        glRotatef(objects.yaw[i], 0, 0, 1);
+                        glScalef(.003, .003, .003);
+                        glBegin(GL_QUADS);
+                        glTexCoord2f(0, 0);
+                        glVertex3f(-1,         -1,      0.0f);
+                        glTexCoord2f(1, 0);
+                        glVertex3f(1,  -1,      0.0f);
+                        glTexCoord2f(1, 1);
+                        glVertex3f(1,  1, 0.0f);
+                        glTexCoord2f(0, 1);
+                        glVertex3f(-1,         1, 0.0f);
+                        glEnd();
+                        glPopMatrix();
+                    }
+                }
+                if (objects.type[i] == boxtype) {
+                    distcheck = distsq(&player[0].coords, &objects.position[i]);
+                    if (distcheck < mapviewdist) {
+                        Mapboxtexture.bind();
+                        glColor4f(.4, .4, .4, opac * (1 - distcheck / mapviewdist));
+                        glPushMatrix();
+                        glTranslatef(objects.position[i].x / terrain.scale / 256 * -2 + 1, objects.position[i].z / terrain.scale / 256 * 2 - 1, 0);
+                        glRotatef(objects.yaw[i], 0, 0, 1);
+                        glScalef(.01 * objects.scale[i], .01 * objects.scale[i], .01 * objects.scale[i]);
+                        glBegin(GL_QUADS);
+                        glTexCoord2f(0, 0);
+                        glVertex3f(-1,         -1,      0.0f);
+                        glTexCoord2f(1, 0);
+                        glVertex3f(1,  -1,      0.0f);
+                        glTexCoord2f(1, 1);
+                        glVertex3f(1,  1, 0.0f);
+                        glTexCoord2f(0, 1);
+                        glVertex3f(-1,         1, 0.0f);
+                        glEnd();
+                        glPopMatrix();
+                    }
+                }
+            }
+            if (editorenabled) {
+                Mapcircletexture.bind();
+                for (i = 0; i < numboundaries; i++) {
+                    glColor4f(0, 0, 0, opac / 3);
+                    glPushMatrix();
+                    glTranslatef(boundary[i].x / terrain.scale / 256 * -2 + 1, boundary[i].z / terrain.scale / 256 * 2 - 1, 0);
+                    glScalef(.002, .002, .002);
+                    glBegin(GL_QUADS);
+                    glTexCoord2f(0, 0);
+                    glVertex3f(-1,             -1,      0.0f);
+                    glTexCoord2f(1, 0);
+                    glVertex3f(1,      -1,      0.0f);
+                    glTexCoord2f(1, 1);
+                    glVertex3f(1,      1, 0.0f);
+                    glTexCoord2f(0, 1);
+                    glVertex3f(-1,     1, 0.0f);
+                    glEnd();
+                    glPopMatrix();
+                }
+            }
+            for (i = 0; i < numplayers; i++) {
+                distcheck = distsq(&player[0].coords, &player[i].coords);
+                if (distcheck < mapviewdist) {
+                    glPushMatrix();
                     Maparrowtexture.bind();
-                                       if(i==0)glColor4f(1,1,1,opac);
-                                       else if(player[i].dead==2||player[i].howactive>typesleeping)glColor4f(0,0,0,opac*(1-distcheck/mapviewdist));
-                                       else if(player[i].dead)glColor4f(.3,.3,.3,opac*(1-distcheck/mapviewdist));
-                                       else if(player[i].aitype==attacktypecutoff)glColor4f(1,0,0,opac*(1-distcheck/mapviewdist));
-                                       else if(player[i].aitype==passivetype)glColor4f(0,1,0,opac*(1-distcheck/mapviewdist));
-                                       else glColor4f(1,1,0,1);
-                                       glTranslatef(player[i].coords.x/terrain.scale/256*-2+1,player[i].coords.z/terrain.scale/256*2-1,0);
-                                       glRotatef(player[i].yaw+180,0,0,1);
-                                       glScalef(.005,.005,.005);
-                                       glBegin(GL_QUADS);
-                                       glTexCoord2f(0,0);
-                                       glVertex3f(-1,          -1,      0.0f);
-                                       glTexCoord2f(1,0);
-                                       glVertex3f(1,   -1,      0.0f);
-                                       glTexCoord2f(1,1);
-                                       glVertex3f(1,   1, 0.0f);
-                                       glTexCoord2f(0,1);
-                                       glVertex3f(-1,  1, 0.0f);
-                                       glEnd();
-                                       glPopMatrix();
-                               }
-                       }
-                       glPopMatrix();
-                       glDisable(GL_TEXTURE_2D);
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glEnable(GL_DEPTH_TEST);                                                        // Enables Depth Testing
-                       glEnable(GL_CULL_FACE);
-                       glDisable(GL_BLEND);
-                       glDepthMask(1);
-               }
-
-               if(loading&&!stealthloading&&(!campaign||player[0].dead)){
-                       glDisable(GL_DEPTH_TEST);                                                       // Disables Depth Testing
-                       glDisable(GL_CULL_FACE);
-                       glDisable(GL_LIGHTING);
-                       glDisable(GL_TEXTURE_2D);
-                       glDepthMask(0);
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPushMatrix();                                                                         // Store The Projection Matrix
-                       glLoadIdentity();                                                                       // Reset The Projection Matrix
-                       glOrtho(0,screenwidth,0,screenheight,-100,100);                                         // Set Up An Ortho Screen
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPushMatrix();                                                                         // Store The Modelview Matrix
-                       glLoadIdentity();                                                               // Reset The Modelview Matrix
-                       glScalef(screenwidth,screenheight,1);
-                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                       glEnable(GL_BLEND);
-                       glColor4f(0,0,0,.7);
-                       glBegin(GL_QUADS);
-                       glVertex3f(0,           0,       0.0f);
-                       glVertex3f(256, 0,       0.0f);
-                       glVertex3f(256, 256, 0.0f);
-                       glVertex3f(0,   256, 0.0f);
-                       glEnd();
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glEnable(GL_DEPTH_TEST);                                                        // Enables Depth Testing
-                       glEnable(GL_CULL_FACE);
-                       glDisable(GL_BLEND);
-                       glDepthMask(1);
-
-                       //logo
-                       glDisable(GL_DEPTH_TEST);
-                       glColor3f (1.0, 1.0, 1.0); // no coloring
-
-                       glEnable(GL_TEXTURE_2D);
-
-                       //Minimap
-
-                       if(loading!=4){                         
-                               glEnable(GL_TEXTURE_2D);
-                               glColor4f(1,1,1,1);
-                               sprintf (string, "Loading...");
-                               text->glPrint(1024/2-90,768/2,string,1,2,1024,768);
-                       }
-                       loading=2;
-                       //if(ismotionblur)drawmode=motionblurmode;
-                       drawmode=normalmode;
-               }
-
-               if(winfreeze&&!campaign){
-                       glDisable(GL_DEPTH_TEST);                                                       // Disables Depth Testing
-                       glDisable(GL_CULL_FACE);
-                       glDisable(GL_LIGHTING);
-                       glDisable(GL_TEXTURE_2D);
-                       glDepthMask(0);
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPushMatrix();                                                                         // Store The Projection Matrix
-                       glLoadIdentity();                                                                       // Reset The Projection Matrix
-                       glOrtho(0,screenwidth,0,screenheight,-100,100);                                         // Set Up An Ortho Screen
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPushMatrix();                                                                         // Store The Modelview Matrix
-                       glLoadIdentity();                                                               // Reset The Modelview Matrix
-                       glScalef(screenwidth,screenheight,1);
-                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                       glEnable(GL_BLEND);
-                       glColor4f(0,0,0,.4);
-                       glBegin(GL_QUADS);
-                       glVertex3f(0,           0,       0.0f);
-                       glVertex3f(256, 0,       0.0f);
-                       glVertex3f(256, 256, 0.0f);
-                       glVertex3f(0,   256, 0.0f);
-                       glEnd();
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glEnable(GL_DEPTH_TEST);                                                        // Enables Depth Testing
-                       glEnable(GL_CULL_FACE);
-                       glDisable(GL_BLEND);
-                       glDepthMask(1);
-
-                       //logo
-                       glDisable(GL_DEPTH_TEST);
-                       glColor3f (1.0, 1.0, 1.0); // no coloring
-
-                       glEnable(GL_TEXTURE_2D);
-
-                       //Win Screen Won Victory
-
-                       glEnable(GL_TEXTURE_2D);
-                       glColor4f(1,1,1,1);
-                       sprintf (string, "Level Cleared!");
-                       text->glPrintOutlined(1024/2-strlen(string)*10,768*7/8,string,1,2,1024,768);
-
-                       sprintf (string, "Score:     %d",(int)(bonustotal-startbonustotal));
-                       text->glPrintOutlined(1024/30,768*6/8,string,1,2,1024,768);
-
-                       if(campaign)
-                               sprintf (string, "Press Escape or Space to continue");
-                       else
-                               sprintf (string, "Press Escape to return to menu or Space to continue");
-                       text->glPrintOutlined(640/2-strlen(string)*5,480*1/16,string,1,1,640,480);
-
-                       char temp[255];
-
-                       for(i=0;i<255;i++)string[i]='\0';
-                       sprintf (temp, "Time:      %d:",(int)(((int)leveltime-(int)(leveltime)%60)/60));
-                       strcat(string,temp);
-                       if((int)(leveltime)%60<10)strcat(string,"0");
-                       sprintf (temp, "%d",(int)(leveltime)%60);
-                       strcat(string,temp);
-                       text->glPrintOutlined(1024/30,768*6/8-40,string,1,2,1024,768);
-
-                       //Awards
-                       int awards[award_count];
-                       int numawards = award_awards(awards);
-
-                       for (i = 0; i < numawards && i < 6; i++)
-                         text->glPrintOutlined(1024/30,768*6/8-90-40*i,award_names[awards[i]],1,2,1024,768);
-               }
-
-               if(drawmode!=normalmode){
-                       glEnable(GL_TEXTURE_2D);
-                       glFinish();
-                       if(!drawtoggle||drawmode!=realmotionblurmode||(drawtoggle==2||change==1)){
-                               if(screentexture){
-
-                                       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
-                                       GLfloat subtractColor[4] = { 0.5, 0.5, 0.5, 0.0 };
-                                       glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, subtractColor);
-                                       //glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_SUBTRACT);
-                                       glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE);
-                                       glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_CONSTANT_EXT);
-                                       glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 2.0f);
-
-                                       glBindTexture( GL_TEXTURE_2D, screentexture);
-                                       glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texviewwidth, texviewheight);         
-                               }
-                       }
-                       if((drawtoggle||change==1)&&drawmode==realmotionblurmode){
-                               if(screentexture2){
-                                       glBindTexture( GL_TEXTURE_2D, screentexture2);
-                                       glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texviewwidth, texviewheight);         
-                               }
-                               if(!screentexture2){
-                                       glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
-
-                                       glGenTextures( 1, &screentexture2 );
-                                       glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
-
-                                       glEnable(GL_TEXTURE_2D);
-                                       glBindTexture( GL_TEXTURE_2D, screentexture2);
-                                       glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
-                                       glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
-
-                                       glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, kTextureSize, kTextureSize, 0);                
-                               }
-                       }
-                       //glFlush();
-               }
-
-               glClear(GL_DEPTH_BUFFER_BIT);
-        Game::ReSizeGLScene(90,.1f);
-               glViewport(0,0,screenwidth,screenheight);       
-
-               if(drawmode!=normalmode){
-                       glDisable(GL_DEPTH_TEST);
-                       if(drawmode==motionblurmode){
-                               glDrawBuffer(GL_FRONT);
-                               glReadBuffer(GL_BACK);
-                       }
-                       glColor3f (1.0, 1.0, 1.0); // no coloring
-
-                       glEnable(GL_TEXTURE_2D);
-                       glBindTexture( GL_TEXTURE_2D, screentexture);
-                       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
-                       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
-                       glDisable(GL_DEPTH_TEST);                                                       // Disables Depth Testing
-                       glDisable(GL_CULL_FACE);
-                       glDisable(GL_LIGHTING);
-                       glDepthMask(0);
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPushMatrix();                                                                         // Store The Projection Matrix
-                       glLoadIdentity();                                                                       // Reset The Projection Matrix
-                       glOrtho(0,screenwidth,0,screenheight,-100,100);                                         // Set Up An Ortho Screen
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPushMatrix();                                                                         // Store The Modelview Matrix
-                       glLoadIdentity();                                                               // Reset The Modelview Matrix
-                       glScalef((float)screenwidth/2,(float)screenheight/2,1);
-                       glTranslatef(1,1,0);
-                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                       glEnable(GL_BLEND);
-                       if(drawmode==motionblurmode){
-                               if(motionbluramount<.2)motionbluramount=.2;
-                               //glColor4f(1,1,1,fast_sqrt(multiplier)*2.9*motionbluramount);
-                               glColor4f(1,1,1,motionbluramount);
-                               glPushMatrix();
-                               glBegin(GL_QUADS);
-                               glTexCoord2f(0,0);
-                               glVertex3f(-1,          -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,0);
-                               glVertex3f(1,   -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,texcoordheight);
-                               glVertex3f(1,   1, 0.0f);
-                               glTexCoord2f(0,texcoordheight);
-                               glVertex3f(-1,  1, 0.0f);
-                               glEnd();
-                               glPopMatrix();
-                       }
-                       if(drawmode==realmotionblurmode){
-                               glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
-                               glClear(GL_COLOR_BUFFER_BIT);
-                               glBlendFunc(GL_SRC_ALPHA,GL_ONE);
-                               glBindTexture( GL_TEXTURE_2D, screentexture);
-                               glColor4f(1,1,1,.5);
-                               glPushMatrix();
-                               glBegin(GL_QUADS);
-                               glTexCoord2f(0,0);
-                               glVertex3f(-1,          -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,0);
-                               glVertex3f(1,   -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,texcoordheight);
-                               glVertex3f(1,   1, 0.0f);
-                               glTexCoord2f(0,texcoordheight);
-                               glVertex3f(-1,  1, 0.0f);
-                               glEnd();
-                               glPopMatrix();
-                               glBindTexture( GL_TEXTURE_2D, screentexture2);
-                               glColor4f(1,1,1,.5);
-                               glPushMatrix();
-                               glBegin(GL_QUADS);
-                               glTexCoord2f(0,0);
-                               glVertex3f(-1,          -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,0);
-                               glVertex3f(1,   -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,texcoordheight);
-                               glVertex3f(1,   1, 0.0f);
-                               glTexCoord2f(0,texcoordheight);
-                               glVertex3f(-1,  1, 0.0f);
-                               glEnd();
-                               glPopMatrix();
-                               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                       }
-                       if(drawmode==doublevisionmode){
-                               static float crosseyedness;
-                               crosseyedness=abs(player[0].damage-player[0].superpermanentdamage-(player[0].damagetolerance-player[0].superpermanentdamage)*1/2)/30;
-                               if(crosseyedness>1)crosseyedness=1;
-                               if(crosseyedness<0)crosseyedness=0;
-                               glColor4f(1,1,1,1);
-                               glDisable(GL_BLEND);
-                               glPushMatrix();
-                               glScalef(1,1,1);
-                               glBegin(GL_QUADS);
-                               glTexCoord2f(0,0);
-                               glVertex3f(-1,          -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,0);
-                               glVertex3f(1,   -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,texcoordheight);
-                               glVertex3f(1,   1, 0.0f);
-                               glTexCoord2f(0,texcoordheight);
-                               glVertex3f(-1,  1, 0.0f);
-                               glEnd();
-                               glPopMatrix();
-                               if(crosseyedness){
-                                       glColor4f(1,1,1,.5);
-                                       glEnable(GL_BLEND);
-                                       glPushMatrix();
-                                       glTranslatef(.015*crosseyedness,0,0);
-                                       glScalef(1,1,1);
-                                       glBegin(GL_QUADS);
-                                       glTexCoord2f(0,0);
-                                       glVertex3f(-1,          -1,      0.0f);
-                                       glTexCoord2f(texcoordwidth,0);
-                                       glVertex3f(1,   -1,      0.0f);
-                                       glTexCoord2f(texcoordwidth,texcoordheight);
-                                       glVertex3f(1,   1, 0.0f);
-                                       glTexCoord2f(0,texcoordheight);
-                                       glVertex3f(-1,  1, 0.0f);
-                                       glEnd();
-                                       glPopMatrix();
-                               }
-                       }
-                       if(drawmode==glowmode){
-                               glColor4f(.5,.5,.5,.5);
-                               glEnable(GL_BLEND);
-                               glBlendFunc(GL_SRC_ALPHA,GL_ONE);
-                               glPushMatrix();
-                               glTranslatef(.01,0,0);
-                               glBegin(GL_QUADS);
-                               glTexCoord2f(0,0);
-                               glVertex3f(-1,          -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,0);
-                               glVertex3f(1,   -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,texcoordheight);
-                               glVertex3f(1,   1, 0.0f);
-                               glTexCoord2f(0,texcoordheight);
-                               glVertex3f(-1,  1, 0.0f);
-                               glEnd();
-                               glPopMatrix();
-                               glPushMatrix();
-                               glTranslatef(-.01,0,0);
-                               glBegin(GL_QUADS);
-                               glTexCoord2f(0,0);
-                               glVertex3f(-1,          -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,0);
-                               glVertex3f(1,   -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,texcoordheight);
-                               glVertex3f(1,   1, 0.0f);
-                               glTexCoord2f(0,texcoordheight);
-                               glVertex3f(-1,  1, 0.0f);
-                               glEnd();
-                               glPopMatrix();
-                               glPushMatrix();
-                               glTranslatef(.0,.01,0);
-                               glBegin(GL_QUADS);
-                               glTexCoord2f(0,0);
-                               glVertex3f(-1,          -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,0);
-                               glVertex3f(1,   -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,texcoordheight);
-                               glVertex3f(1,   1, 0.0f);
-                               glTexCoord2f(0,texcoordheight);
-                               glVertex3f(-1,  1, 0.0f);
-                               glEnd();
-                               glPopMatrix();
-                               glPushMatrix();
-                               glTranslatef(0,-.01,0);
-                               glBegin(GL_QUADS);
-                               glTexCoord2f(0,0);
-                               glVertex3f(-1,          -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,0);
-                               glVertex3f(1,   -1,      0.0f);
-                               glTexCoord2f(texcoordwidth,texcoordheight);
-                               glVertex3f(1,   1, 0.0f);
-                               glTexCoord2f(0,texcoordheight);
-                               glVertex3f(-1,  1, 0.0f);
-                               glEnd();
-                               glPopMatrix();
-                       }
-                       if(drawmode==radialzoommode){
-                               for(i=0;i<3;i++){
-                                       //glRotatef((float)i*.1,0,0,1);
-                                       glColor4f(1,1,1,1/((float)i+1));
-                                       glPushMatrix();
-                                       glScalef(1+(float)i*.01,1+(float)i*.01,1);
-                                       glBegin(GL_QUADS);
-                                       glTexCoord2f(0,0);
-                                       glVertex3f(-1,          -1,      0.0f);
-                                       glTexCoord2f(texcoordwidth,0);
-                                       glVertex3f(1,   -1,      0.0f);
-                                       glTexCoord2f(texcoordwidth,texcoordheight);
-                                       glVertex3f(1,   1, 0.0f);
-                                       glTexCoord2f(0,texcoordheight);
-                                       glVertex3f(-1,  1, 0.0f);
-                                       glEnd();
-                                       glPopMatrix();
-                               }
-                       }
-                       glDisable(GL_TEXTURE_2D);
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glEnable(GL_DEPTH_TEST);                                                        // Enables Depth Testing
-                       glEnable(GL_CULL_FACE);
-                       glDisable(GL_BLEND);
-                       glDepthMask(1);
-               }
-
-               if(console){
-                       glEnable(GL_TEXTURE_2D);
-                       glColor4f(1,1,1,1);
-                       int offset = 0;
-                       if(consoleselected>=60)
-                               offset=consoleselected-60;
-                       sprintf (string, " ]");
-                       text->glPrint(10,30,string,0,1,1024,768);
-                       if(consoleblink){
-                               sprintf (string, "_");
-                               text->glPrint(30+(float)(consoleselected)*10-offset*10,30,string,0,1,1024,768);
-                       }
-                       for(i=0;i<15;i++)
-                               for(j=0;j<consolechars[i];j++){
-                                       glColor4f(1,1,1,1-(float)(i)/16);
-                                       if(j<consolechars[i]){
-                                               sprintf (string, "%c",consoletext[i][j]);
-                                               text->glPrint(30+j*10-offset*10,30+i*20,string,0,1,1024,768);
-                                       }
-                               }
-               }
-       }
-
-       if(freeze||winfreeze||(mainmenu&&gameon)||(!gameon&&gamestarted)){
-               multiplier=tempmult;
-       }
-
-       if(mainmenu){
-               DrawMenu();
-       }
-
-       if(freeze||winfreeze||(mainmenu&&gameon)||(!gameon&&gamestarted)){
-               tempmult=multiplier;
-               multiplier=0;
-       }
-
-       //glFlush();
-       if ( side == stereoRight || side == stereoCenter ) {
-               if(drawmode!=motionblurmode||mainmenu){
-                       swap_gl_buffers();
-               }
-       }
-
-       //myassert(glGetError() == GL_NO_ERROR);
-       glDrawBuffer(GL_BACK);
-       glReadBuffer(GL_BACK);
-       //glFlush();
-
-       weapons.DoStuff();
-
-       if(drawtoggle==2)drawtoggle=0;
-
-       if(freeze||winfreeze||(mainmenu&&gameon)||(!gameon&&gamestarted)){
-               multiplier=tempmult;
-       }
-       //Jordan fixed your warning!
-       return 0;
+                    if (i == 0)glColor4f(1, 1, 1, opac);
+                    else if (player[i].dead == 2 || player[i].howactive > typesleeping)glColor4f(0, 0, 0, opac * (1 - distcheck / mapviewdist));
+                    else if (player[i].dead)glColor4f(.3, .3, .3, opac * (1 - distcheck / mapviewdist));
+                    else if (player[i].aitype == attacktypecutoff)glColor4f(1, 0, 0, opac * (1 - distcheck / mapviewdist));
+                    else if (player[i].aitype == passivetype)glColor4f(0, 1, 0, opac * (1 - distcheck / mapviewdist));
+                    else glColor4f(1, 1, 0, 1);
+                    glTranslatef(player[i].coords.x / terrain.scale / 256 * -2 + 1, player[i].coords.z / terrain.scale / 256 * 2 - 1, 0);
+                    glRotatef(player[i].yaw + 180, 0, 0, 1);
+                    glScalef(.005, .005, .005);
+                    glBegin(GL_QUADS);
+                    glTexCoord2f(0, 0);
+                    glVertex3f(-1,             -1,      0.0f);
+                    glTexCoord2f(1, 0);
+                    glVertex3f(1,      -1,      0.0f);
+                    glTexCoord2f(1, 1);
+                    glVertex3f(1,      1, 0.0f);
+                    glTexCoord2f(0, 1);
+                    glVertex3f(-1,     1, 0.0f);
+                    glEnd();
+                    glPopMatrix();
+                }
+            }
+            glPopMatrix();
+            glDisable(GL_TEXTURE_2D);
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glEnable(GL_DEPTH_TEST);                                                   // Enables Depth Testing
+            glEnable(GL_CULL_FACE);
+            glDisable(GL_BLEND);
+            glDepthMask(1);
+        }
+
+        if (loading && !stealthloading && (!campaign || player[0].dead)) {
+            glDisable(GL_DEPTH_TEST);                                                  // Disables Depth Testing
+            glDisable(GL_CULL_FACE);
+            glDisable(GL_LIGHTING);
+            glDisable(GL_TEXTURE_2D);
+            glDepthMask(0);
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPushMatrix();                                                                            // Store The Projection Matrix
+            glLoadIdentity();                                                                  // Reset The Projection Matrix
+            glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                               // Set Up An Ortho Screen
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPushMatrix();                                                                            // Store The Modelview Matrix
+            glLoadIdentity();                                                          // Reset The Modelview Matrix
+            glScalef(screenwidth, screenheight, 1);
+            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            glEnable(GL_BLEND);
+            glColor4f(0, 0, 0, .7);
+            glBegin(GL_QUADS);
+            glVertex3f(0,              0,       0.0f);
+            glVertex3f(256,    0,       0.0f);
+            glVertex3f(256,    256, 0.0f);
+            glVertex3f(0,      256, 0.0f);
+            glEnd();
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glEnable(GL_DEPTH_TEST);                                                   // Enables Depth Testing
+            glEnable(GL_CULL_FACE);
+            glDisable(GL_BLEND);
+            glDepthMask(1);
+
+            //logo
+            glDisable(GL_DEPTH_TEST);
+            glColor3f (1.0, 1.0, 1.0); // no coloring
+
+            glEnable(GL_TEXTURE_2D);
+
+            //Minimap
+
+            if (loading != 4) {
+                glEnable(GL_TEXTURE_2D);
+                glColor4f(1, 1, 1, 1);
+                sprintf (string, "Loading...");
+                text->glPrint(1024 / 2 - 90, 768 / 2, string, 1, 2, 1024, 768);
+            }
+            loading = 2;
+            //if(ismotionblur)drawmode=motionblurmode;
+            drawmode = normalmode;
+        }
+
+        if (winfreeze && !campaign) {
+            glDisable(GL_DEPTH_TEST);                                                  // Disables Depth Testing
+            glDisable(GL_CULL_FACE);
+            glDisable(GL_LIGHTING);
+            glDisable(GL_TEXTURE_2D);
+            glDepthMask(0);
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPushMatrix();                                                                            // Store The Projection Matrix
+            glLoadIdentity();                                                                  // Reset The Projection Matrix
+            glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                               // Set Up An Ortho Screen
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPushMatrix();                                                                            // Store The Modelview Matrix
+            glLoadIdentity();                                                          // Reset The Modelview Matrix
+            glScalef(screenwidth, screenheight, 1);
+            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            glEnable(GL_BLEND);
+            glColor4f(0, 0, 0, .4);
+            glBegin(GL_QUADS);
+            glVertex3f(0,              0,       0.0f);
+            glVertex3f(256,    0,       0.0f);
+            glVertex3f(256,    256, 0.0f);
+            glVertex3f(0,      256, 0.0f);
+            glEnd();
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glEnable(GL_DEPTH_TEST);                                                   // Enables Depth Testing
+            glEnable(GL_CULL_FACE);
+            glDisable(GL_BLEND);
+            glDepthMask(1);
+
+            //logo
+            glDisable(GL_DEPTH_TEST);
+            glColor3f (1.0, 1.0, 1.0); // no coloring
+
+            glEnable(GL_TEXTURE_2D);
+
+            //Win Screen Won Victory
+
+            glEnable(GL_TEXTURE_2D);
+            glColor4f(1, 1, 1, 1);
+            sprintf (string, "Level Cleared!");
+            text->glPrintOutlined(1024 / 2 - strlen(string) * 10, 768 * 7 / 8, string, 1, 2, 1024, 768);
+
+            sprintf (string, "Score:     %d", (int)(bonustotal - startbonustotal));
+            text->glPrintOutlined(1024 / 30, 768 * 6 / 8, string, 1, 2, 1024, 768);
+
+            if (campaign)
+                sprintf (string, "Press Escape or Space to continue");
+            else
+                sprintf (string, "Press Escape to return to menu or Space to continue");
+            text->glPrintOutlined(640 / 2 - strlen(string) * 5, 480 * 1 / 16, string, 1, 1, 640, 480);
+
+            char temp[255];
+
+            for (i = 0; i < 255; i++)string[i] = '\0';
+            sprintf (temp, "Time:      %d:", (int)(((int)leveltime - (int)(leveltime) % 60) / 60));
+            strcat(string, temp);
+            if ((int)(leveltime) % 60 < 10)strcat(string, "0");
+            sprintf (temp, "%d", (int)(leveltime) % 60);
+            strcat(string, temp);
+            text->glPrintOutlined(1024 / 30, 768 * 6 / 8 - 40, string, 1, 2, 1024, 768);
+
+            //Awards
+            int awards[award_count];
+            int numawards = award_awards(awards);
+
+            for (i = 0; i < numawards && i < 6; i++)
+                text->glPrintOutlined(1024 / 30, 768 * 6 / 8 - 90 - 40 * i, award_names[awards[i]], 1, 2, 1024, 768);
+        }
+
+        if (drawmode != normalmode) {
+            glEnable(GL_TEXTURE_2D);
+            glFinish();
+            if (!drawtoggle || drawmode != realmotionblurmode || (drawtoggle == 2 || change == 1)) {
+                if (screentexture) {
+
+                    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
+                    GLfloat subtractColor[4] = { 0.5, 0.5, 0.5, 0.0 };
+                    glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, subtractColor);
+                    //glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_SUBTRACT);
+                    glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_TEXTURE);
+                    glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_CONSTANT_EXT);
+                    glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 2.0f);
+
+                    glBindTexture( GL_TEXTURE_2D, screentexture);
+                    glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texviewwidth, texviewheight);
+                }
+            }
+            if ((drawtoggle || change == 1) && drawmode == realmotionblurmode) {
+                if (screentexture2) {
+                    glBindTexture( GL_TEXTURE_2D, screentexture2);
+                    glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texviewwidth, texviewheight);
+                }
+                if (!screentexture2) {
+                    glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
+
+                    glGenTextures( 1, &screentexture2 );
+                    glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+
+                    glEnable(GL_TEXTURE_2D);
+                    glBindTexture( GL_TEXTURE_2D, screentexture2);
+                    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+                    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+
+                    glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, kTextureSize, kTextureSize, 0);
+                }
+            }
+            //glFlush();
+        }
+
+        glClear(GL_DEPTH_BUFFER_BIT);
+        Game::ReSizeGLScene(90, .1f);
+        glViewport(0, 0, screenwidth, screenheight);
+
+        if (drawmode != normalmode) {
+            glDisable(GL_DEPTH_TEST);
+            if (drawmode == motionblurmode) {
+                glDrawBuffer(GL_FRONT);
+                glReadBuffer(GL_BACK);
+            }
+            glColor3f (1.0, 1.0, 1.0); // no coloring
+
+            glEnable(GL_TEXTURE_2D);
+            glBindTexture( GL_TEXTURE_2D, screentexture);
+            glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+            glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+            glDisable(GL_DEPTH_TEST);                                                  // Disables Depth Testing
+            glDisable(GL_CULL_FACE);
+            glDisable(GL_LIGHTING);
+            glDepthMask(0);
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPushMatrix();                                                                            // Store The Projection Matrix
+            glLoadIdentity();                                                                  // Reset The Projection Matrix
+            glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                               // Set Up An Ortho Screen
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPushMatrix();                                                                            // Store The Modelview Matrix
+            glLoadIdentity();                                                          // Reset The Modelview Matrix
+            glScalef((float)screenwidth / 2, (float)screenheight / 2, 1);
+            glTranslatef(1, 1, 0);
+            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            glEnable(GL_BLEND);
+            if (drawmode == motionblurmode) {
+                if (motionbluramount < .2)motionbluramount = .2;
+                //glColor4f(1,1,1,fast_sqrt(multiplier)*2.9*motionbluramount);
+                glColor4f(1, 1, 1, motionbluramount);
+                glPushMatrix();
+                glBegin(GL_QUADS);
+                glTexCoord2f(0, 0);
+                glVertex3f(-1,         -1,      0.0f);
+                glTexCoord2f(texcoordwidth, 0);
+                glVertex3f(1,  -1,      0.0f);
+                glTexCoord2f(texcoordwidth, texcoordheight);
+                glVertex3f(1,  1, 0.0f);
+                glTexCoord2f(0, texcoordheight);
+                glVertex3f(-1,         1, 0.0f);
+                glEnd();
+                glPopMatrix();
+            }
+            if (drawmode == realmotionblurmode) {
+                glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+                glClear(GL_COLOR_BUFFER_BIT);
+                glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+                glBindTexture( GL_TEXTURE_2D, screentexture);
+                glColor4f(1, 1, 1, .5);
+                glPushMatrix();
+                glBegin(GL_QUADS);
+                glTexCoord2f(0, 0);
+                glVertex3f(-1,         -1,      0.0f);
+                glTexCoord2f(texcoordwidth, 0);
+                glVertex3f(1,  -1,      0.0f);
+                glTexCoord2f(texcoordwidth, texcoordheight);
+                glVertex3f(1,  1, 0.0f);
+                glTexCoord2f(0, texcoordheight);
+                glVertex3f(-1,         1, 0.0f);
+                glEnd();
+                glPopMatrix();
+                glBindTexture( GL_TEXTURE_2D, screentexture2);
+                glColor4f(1, 1, 1, .5);
+                glPushMatrix();
+                glBegin(GL_QUADS);
+                glTexCoord2f(0, 0);
+                glVertex3f(-1,         -1,      0.0f);
+                glTexCoord2f(texcoordwidth, 0);
+                glVertex3f(1,  -1,      0.0f);
+                glTexCoord2f(texcoordwidth, texcoordheight);
+                glVertex3f(1,  1, 0.0f);
+                glTexCoord2f(0, texcoordheight);
+                glVertex3f(-1,         1, 0.0f);
+                glEnd();
+                glPopMatrix();
+                glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            }
+            if (drawmode == doublevisionmode) {
+                static float crosseyedness;
+                crosseyedness = abs(player[0].damage - player[0].superpermanentdamage - (player[0].damagetolerance - player[0].superpermanentdamage) * 1 / 2) / 30;
+                if (crosseyedness > 1)crosseyedness = 1;
+                if (crosseyedness < 0)crosseyedness = 0;
+                glColor4f(1, 1, 1, 1);
+                glDisable(GL_BLEND);
+                glPushMatrix();
+                glScalef(1, 1, 1);
+                glBegin(GL_QUADS);
+                glTexCoord2f(0, 0);
+                glVertex3f(-1,         -1,      0.0f);
+                glTexCoord2f(texcoordwidth, 0);
+                glVertex3f(1,  -1,      0.0f);
+                glTexCoord2f(texcoordwidth, texcoordheight);
+                glVertex3f(1,  1, 0.0f);
+                glTexCoord2f(0, texcoordheight);
+                glVertex3f(-1,         1, 0.0f);
+                glEnd();
+                glPopMatrix();
+                if (crosseyedness) {
+                    glColor4f(1, 1, 1, .5);
+                    glEnable(GL_BLEND);
+                    glPushMatrix();
+                    glTranslatef(.015 * crosseyedness, 0, 0);
+                    glScalef(1, 1, 1);
+                    glBegin(GL_QUADS);
+                    glTexCoord2f(0, 0);
+                    glVertex3f(-1,             -1,      0.0f);
+                    glTexCoord2f(texcoordwidth, 0);
+                    glVertex3f(1,      -1,      0.0f);
+                    glTexCoord2f(texcoordwidth, texcoordheight);
+                    glVertex3f(1,      1, 0.0f);
+                    glTexCoord2f(0, texcoordheight);
+                    glVertex3f(-1,     1, 0.0f);
+                    glEnd();
+                    glPopMatrix();
+                }
+            }
+            if (drawmode == glowmode) {
+                glColor4f(.5, .5, .5, .5);
+                glEnable(GL_BLEND);
+                glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+                glPushMatrix();
+                glTranslatef(.01, 0, 0);
+                glBegin(GL_QUADS);
+                glTexCoord2f(0, 0);
+                glVertex3f(-1,         -1,      0.0f);
+                glTexCoord2f(texcoordwidth, 0);
+                glVertex3f(1,  -1,      0.0f);
+                glTexCoord2f(texcoordwidth, texcoordheight);
+                glVertex3f(1,  1, 0.0f);
+                glTexCoord2f(0, texcoordheight);
+                glVertex3f(-1,         1, 0.0f);
+                glEnd();
+                glPopMatrix();
+                glPushMatrix();
+                glTranslatef(-.01, 0, 0);
+                glBegin(GL_QUADS);
+                glTexCoord2f(0, 0);
+                glVertex3f(-1,         -1,      0.0f);
+                glTexCoord2f(texcoordwidth, 0);
+                glVertex3f(1,  -1,      0.0f);
+                glTexCoord2f(texcoordwidth, texcoordheight);
+                glVertex3f(1,  1, 0.0f);
+                glTexCoord2f(0, texcoordheight);
+                glVertex3f(-1,         1, 0.0f);
+                glEnd();
+                glPopMatrix();
+                glPushMatrix();
+                glTranslatef(.0, .01, 0);
+                glBegin(GL_QUADS);
+                glTexCoord2f(0, 0);
+                glVertex3f(-1,         -1,      0.0f);
+                glTexCoord2f(texcoordwidth, 0);
+                glVertex3f(1,  -1,      0.0f);
+                glTexCoord2f(texcoordwidth, texcoordheight);
+                glVertex3f(1,  1, 0.0f);
+                glTexCoord2f(0, texcoordheight);
+                glVertex3f(-1,         1, 0.0f);
+                glEnd();
+                glPopMatrix();
+                glPushMatrix();
+                glTranslatef(0, -.01, 0);
+                glBegin(GL_QUADS);
+                glTexCoord2f(0, 0);
+                glVertex3f(-1,         -1,      0.0f);
+                glTexCoord2f(texcoordwidth, 0);
+                glVertex3f(1,  -1,      0.0f);
+                glTexCoord2f(texcoordwidth, texcoordheight);
+                glVertex3f(1,  1, 0.0f);
+                glTexCoord2f(0, texcoordheight);
+                glVertex3f(-1,         1, 0.0f);
+                glEnd();
+                glPopMatrix();
+            }
+            if (drawmode == radialzoommode) {
+                for (i = 0; i < 3; i++) {
+                    //glRotatef((float)i*.1,0,0,1);
+                    glColor4f(1, 1, 1, 1 / ((float)i + 1));
+                    glPushMatrix();
+                    glScalef(1 + (float)i * .01, 1 + (float)i * .01, 1);
+                    glBegin(GL_QUADS);
+                    glTexCoord2f(0, 0);
+                    glVertex3f(-1,             -1,      0.0f);
+                    glTexCoord2f(texcoordwidth, 0);
+                    glVertex3f(1,      -1,      0.0f);
+                    glTexCoord2f(texcoordwidth, texcoordheight);
+                    glVertex3f(1,      1, 0.0f);
+                    glTexCoord2f(0, texcoordheight);
+                    glVertex3f(-1,     1, 0.0f);
+                    glEnd();
+                    glPopMatrix();
+                }
+            }
+            glDisable(GL_TEXTURE_2D);
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glEnable(GL_DEPTH_TEST);                                                   // Enables Depth Testing
+            glEnable(GL_CULL_FACE);
+            glDisable(GL_BLEND);
+            glDepthMask(1);
+        }
+
+        if (console) {
+            glEnable(GL_TEXTURE_2D);
+            glColor4f(1, 1, 1, 1);
+            int offset = 0;
+            if (consoleselected >= 60)
+                offset = consoleselected - 60;
+            sprintf (string, " ]");
+            text->glPrint(10, 30, string, 0, 1, 1024, 768);
+            if (consoleblink) {
+                sprintf (string, "_");
+                text->glPrint(30 + (float)(consoleselected) * 10 - offset * 10, 30, string, 0, 1, 1024, 768);
+            }
+            for (i = 0; i < 15; i++)
+                for (j = 0; j < consolechars[i]; j++) {
+                    glColor4f(1, 1, 1, 1 - (float)(i) / 16);
+                    if (j < consolechars[i]) {
+                        sprintf (string, "%c", consoletext[i][j]);
+                        text->glPrint(30 + j * 10 - offset * 10, 30 + i * 20, string, 0, 1, 1024, 768);
+                    }
+                }
+        }
+    }
+
+    if (freeze || winfreeze || (mainmenu && gameon) || (!gameon && gamestarted)) {
+        multiplier = tempmult;
+    }
+
+    if (mainmenu) {
+        DrawMenu();
+    }
+
+    if (freeze || winfreeze || (mainmenu && gameon) || (!gameon && gamestarted)) {
+        tempmult = multiplier;
+        multiplier = 0;
+    }
+
+    //glFlush();
+    if ( side == stereoRight || side == stereoCenter ) {
+        if (drawmode != motionblurmode || mainmenu) {
+            swap_gl_buffers();
+        }
+    }
+
+    //myassert(glGetError() == GL_NO_ERROR);
+    glDrawBuffer(GL_BACK);
+    glReadBuffer(GL_BACK);
+    //glFlush();
+
+    weapons.DoStuff();
+
+    if (drawtoggle == 2)drawtoggle = 0;
+
+    if (freeze || winfreeze || (mainmenu && gameon) || (!gameon && gamestarted)) {
+        multiplier = tempmult;
+    }
+    //Jordan fixed your warning!
+    return 0;
 }
 
-void DrawMenu() {
-       // !!! FIXME: hack: clamp framerate in menu so text input works correctly on fast systems.
-       SDL_Delay(15);
+void DrawMenu()
+{
+    // !!! FIXME: hack: clamp framerate in menu so text input works correctly on fast systems.
+    SDL_Delay(15);
 
-       glDrawBuffer(GL_BACK);
-       glReadBuffer(GL_BACK);
-       glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
-    Game::ReSizeGLScene(90,.1f);
+    glDrawBuffer(GL_BACK);
+    glReadBuffer(GL_BACK);
+    glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+    Game::ReSizeGLScene(90, .1f);
 
     //draw menu background
-       glClear(GL_DEPTH_BUFFER_BIT);
-       glEnable(GL_ALPHA_TEST);
-       glAlphaFunc(GL_GREATER, 0.001f);
-       glEnable(GL_TEXTURE_2D);
-       glDisable(GL_DEPTH_TEST);                                                       // Disables Depth Testing
-       glDisable(GL_CULL_FACE);
-       glDisable(GL_LIGHTING);
-       glDepthMask(0);
-       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-       glPushMatrix();                                                                         // Store The Projection Matrix
-               glLoadIdentity();                                                                       // Reset The Projection Matrix
-               glOrtho(0,screenwidth,0,screenheight,-100,100);                                         // Set Up An Ortho Screen
-               glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPushMatrix();                                                                         // Store The Modelview Matrix
-                       glLoadIdentity();                                                               // Reset The Modelview Matrix
-                       glTranslatef(screenwidth/2,screenheight/2,0);
-                       glPushMatrix();
-                               glScalef((float)screenwidth/2,(float)screenheight/2,1);
-                               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                               glDisable(GL_BLEND);
-                               glColor4f(0,0,0,1.0);
-                               glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
-                               glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
-                               glDisable(GL_TEXTURE_2D);
-                                       glBegin(GL_QUADS);
-                                       glVertex3f(-1,-1,0);
-                                       glVertex3f(+1,-1,0);
-                                       glVertex3f(+1,+1,0);
-                                       glVertex3f(-1,+1,0);
-                                       glEnd();
-                               glEnable(GL_BLEND);
-                               glColor4f(0.4,0.4,0.4,1.0);
-                               glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
-                               glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
-                               glEnable(GL_TEXTURE_2D);
-                               Game::Mainmenuitems[4].bind();
-                                       glBegin(GL_QUADS);
-                                       glTexCoord2f(0,0);
-                                       glVertex3f(-1,-1,0);
-                                       glTexCoord2f(1,0);
-                                       glVertex3f(+1,-1,0);
-                                       glTexCoord2f(1,1);
-                                       glVertex3f(+1,+1,0);
-                                       glTexCoord2f(0,1);
-                                       glVertex3f(-1,+1,0);
-                                       glEnd();
-                       glPopMatrix();
-               glPopMatrix();
-               glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-       glPopMatrix();
-       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-
-
-
-       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-       glPushMatrix();                                                                         // Store The Projection Matrix
-       glLoadIdentity();                                                                       // Reset The Projection Matrix
-       glOrtho(0,640,0,480,-100,100);                                          // Set Up An Ortho Screen
-       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-       glPushMatrix();                                                                         // Store The Modelview Matrix
-       glLoadIdentity();                                                               // Reset The Modelview Matrix
-       glEnable(GL_TEXTURE_2D);
-       
+    glClear(GL_DEPTH_BUFFER_BIT);
+    glEnable(GL_ALPHA_TEST);
+    glAlphaFunc(GL_GREATER, 0.001f);
+    glEnable(GL_TEXTURE_2D);
+    glDisable(GL_DEPTH_TEST);                                                  // Disables Depth Testing
+    glDisable(GL_CULL_FACE);
+    glDisable(GL_LIGHTING);
+    glDepthMask(0);
+    glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+    glPushMatrix();                                                                            // Store The Projection Matrix
+    glLoadIdentity();                                                                  // Reset The Projection Matrix
+    glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                               // Set Up An Ortho Screen
+    glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+    glPushMatrix();                                                                            // Store The Modelview Matrix
+    glLoadIdentity();                                                          // Reset The Modelview Matrix
+    glTranslatef(screenwidth / 2, screenheight / 2, 0);
+    glPushMatrix();
+    glScalef((float)screenwidth / 2, (float)screenheight / 2, 1);
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+    glDisable(GL_BLEND);
+    glColor4f(0, 0, 0, 1.0);
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
+    glDisable(GL_TEXTURE_2D);
+    glBegin(GL_QUADS);
+    glVertex3f(-1, -1, 0);
+    glVertex3f(+1, -1, 0);
+    glVertex3f(+1, +1, 0);
+    glVertex3f(-1, +1, 0);
+    glEnd();
+    glEnable(GL_BLEND);
+    glColor4f(0.4, 0.4, 0.4, 1.0);
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
+    glEnable(GL_TEXTURE_2D);
+    Game::Mainmenuitems[4].bind();
+    glBegin(GL_QUADS);
+    glTexCoord2f(0, 0);
+    glVertex3f(-1, -1, 0);
+    glTexCoord2f(1, 0);
+    glVertex3f(+1, -1, 0);
+    glTexCoord2f(1, 1);
+    glVertex3f(+1, +1, 0);
+    glTexCoord2f(0, 1);
+    glVertex3f(-1, +1, 0);
+    glEnd();
+    glPopMatrix();
+    glPopMatrix();
+    glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+    glPopMatrix();
+    glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+
+
+
+    glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+    glPushMatrix();                                                                            // Store The Projection Matrix
+    glLoadIdentity();                                                                  // Reset The Projection Matrix
+    glOrtho(0, 640, 0, 480, -100, 100);                                                // Set Up An Ortho Screen
+    glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+    glPushMatrix();                                                                            // Store The Modelview Matrix
+    glLoadIdentity();                                                          // Reset The Modelview Matrix
+    glEnable(GL_TEXTURE_2D);
+
     Menu::drawItems();
 
     //draw mouse cursor
-       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-       glPopMatrix();
-       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-       glPopMatrix();
-
-               glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-               glPushMatrix();                                                                         // Store The Projection Matrix
-                       glLoadIdentity();                                                                       // Reset The Projection Matrix
-                       glOrtho(0,screenwidth,0,screenheight,-100,100);                                         // Set Up An Ortho Screen
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPushMatrix();                                                                         // Store The Modelview Matrix
-                               glLoadIdentity();                                                               // Reset The Modelview Matrix
-                               glTranslatef(screenwidth/2,screenheight/2,0);
-                               glPushMatrix();
-                                       glScalef((float)screenwidth/2,(float)screenheight/2,1);
-                                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                                       glEnable(GL_BLEND);
-                                       glEnable(GL_TEXTURE_2D);
-                                       glColor4f(1,1,1,1);
-                                       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
-                                       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
-                               glPopMatrix();
-                               if(!Game::waiting) { // hide the cursor while waiting for a key
-                                       glPushMatrix();
-                                               glTranslatef(Game::mousecoordh-screenwidth/2,Game::mousecoordv*-1+screenheight/2,0);
-                                               glScalef((float)screenwidth/64,(float)screenwidth/64,1);
-                                               glTranslatef(1,-1,0);
-                                               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                                               glColor4f(1,1,1,1);
-                        Game::cursortexture.bind();
-                                               glPushMatrix();
-                                                       //glScalef(.25,.25,.25);
-                                                       glBegin(GL_QUADS);
-                                                       glTexCoord2f(0,0);
-                                                       glVertex3f(-1, -1, 0.0f);
-                                                       glTexCoord2f(1,0);
-                                                       glVertex3f(1, -1, 0.0f);
-                                                       glTexCoord2f(1,1);
-                                                       glVertex3f(1, 1, 0.0f);
-                                                       glTexCoord2f(0,1);
-                                                       glVertex3f(-1, 1, 0.0f);
-                                                       glEnd();
-                                               glPopMatrix();
-                                       glPopMatrix();
-                               }
-                       glPopMatrix();
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-               glPopMatrix();
+    glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+    glPopMatrix();
+    glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+    glPopMatrix();
+
+    glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+    glPushMatrix();                                                                            // Store The Projection Matrix
+    glLoadIdentity();                                                                  // Reset The Projection Matrix
+    glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                               // Set Up An Ortho Screen
+    glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+    glPushMatrix();                                                                            // Store The Modelview Matrix
+    glLoadIdentity();                                                          // Reset The Modelview Matrix
+    glTranslatef(screenwidth / 2, screenheight / 2, 0);
+    glPushMatrix();
+    glScalef((float)screenwidth / 2, (float)screenheight / 2, 1);
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+    glEnable(GL_BLEND);
+    glEnable(GL_TEXTURE_2D);
+    glColor4f(1, 1, 1, 1);
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
+    glPopMatrix();
+    if (!Game::waiting) { // hide the cursor while waiting for a key
+        glPushMatrix();
+        glTranslatef(Game::mousecoordh - screenwidth / 2, Game::mousecoordv * -1 + screenheight / 2, 0);
+        glScalef((float)screenwidth / 64, (float)screenwidth / 64, 1);
+        glTranslatef(1, -1, 0);
+        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+        glColor4f(1, 1, 1, 1);
+        Game::cursortexture.bind();
+        glPushMatrix();
+        //glScalef(.25,.25,.25);
+        glBegin(GL_QUADS);
+        glTexCoord2f(0, 0);
+        glVertex3f(-1, -1, 0.0f);
+        glTexCoord2f(1, 0);
+        glVertex3f(1, -1, 0.0f);
+        glTexCoord2f(1, 1);
+        glVertex3f(1, 1, 0.0f);
+        glTexCoord2f(0, 1);
+        glVertex3f(-1, 1, 0.0f);
+        glEnd();
+        glPopMatrix();
+        glPopMatrix();
+    }
+    glPopMatrix();
+    glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+    glPopMatrix();
 
 
     //draw screen flash
-    if(flashamount>0)
-    {
-        if(flashamount>1)flashamount=1;
-        if(flashdelay<=0)flashamount-=multiplier;
+    if (flashamount > 0) {
+        if (flashamount > 1)flashamount = 1;
+        if (flashdelay <= 0)flashamount -= multiplier;
         flashdelay--;
-        if(flashamount<0)flashamount=0;
+        if (flashamount < 0)flashamount = 0;
         glDisable(GL_DEPTH_TEST);                                                      // Disables Depth Testing
         glDisable(GL_CULL_FACE);
         glDisable(GL_LIGHTING);
@@ -2173,23 +2173,23 @@ void DrawMenu() {
         glDepthMask(0);
         glMatrixMode(GL_PROJECTION);                                           // Select The Projection Matrix
         glPushMatrix();                                                                                // Store The Projection Matrix
-            glLoadIdentity();                                                                  // Reset The Projection Matrix
-            glOrtho(0,screenwidth,0,screenheight,-100,100);                                            // Set Up An Ortho Screen
-            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
-            glPushMatrix();                                                                            // Store The Modelview Matrix
-                glLoadIdentity();                                                              // Reset The Modelview Matrix
-                glScalef(screenwidth,screenheight,1);
-                glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                glEnable(GL_BLEND);
-                glColor4f(flashr,flashg,flashb,flashamount);
-                glBegin(GL_QUADS);
-                glVertex3f(0,          0,       0.0f);
-                glVertex3f(256,        0,       0.0f);
-                glVertex3f(256,        256, 0.0f);
-                glVertex3f(0,  256, 0.0f);
-                glEnd();
-                glMatrixMode(GL_PROJECTION);                                           // Select The Projection Matrix
-            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+        glLoadIdentity();                                                                      // Reset The Projection Matrix
+        glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                           // Set Up An Ortho Screen
+        glMatrixMode(GL_MODELVIEW);                                                    // Select The Modelview Matrix
+        glPushMatrix();                                                                                // Store The Modelview Matrix
+        glLoadIdentity();                                                              // Reset The Modelview Matrix
+        glScalef(screenwidth, screenheight, 1);
+        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+        glEnable(GL_BLEND);
+        glColor4f(flashr, flashg, flashb, flashamount);
+        glBegin(GL_QUADS);
+        glVertex3f(0,          0,       0.0f);
+        glVertex3f(256,        0,       0.0f);
+        glVertex3f(256,        256, 0.0f);
+        glVertex3f(0,  256, 0.0f);
+        glEnd();
+        glMatrixMode(GL_PROJECTION);                                           // Select The Projection Matrix
+        glPopMatrix();                                                                         // Restore The Old Projection Matrix
         glMatrixMode(GL_MODELVIEW);                                                    // Select The Modelview Matrix
         glPopMatrix();                                                                         // Restore The Old Projection Matrix
         glEnable(GL_DEPTH_TEST);                                                       // Enables Depth Testing
index 5d6f579302b30f4e2363124dc54bfa02626156c2..827c923e74cdb49da7c009d7839122aaf7bc5a89 100644 (file)
@@ -24,7 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "Animation.h"
 #include "Texture.h"
 
-extern float screenwidth,screenheight;
+extern float screenwidth, screenheight;
 extern float viewdistance;
 extern XYZ viewer;
 extern XYZ lightlocation;
@@ -43,8 +43,8 @@ extern float volume;
 extern Objects objects;
 extern int detail;
 extern bool cellophane;
-extern GLubyte bloodText[512*512*3];
-extern GLubyte wolfbloodText[512*512*3];
+extern GLubyte bloodText[512 * 512 * 3];
+extern GLubyte wolfbloodText[512 * 512 * 3];
 extern bool ismotionblur;
 extern bool trilinear;
 extern bool osx;
@@ -60,12 +60,12 @@ extern short vRefNum;
 extern long dirID;
 extern int mainmenu;
 extern bool visibleloading;
-extern float flashamount,flashr,flashg,flashb;
+extern float flashamount, flashr, flashg, flashb;
 extern int flashdelay;
 extern int whichjointstartarray[26];
 extern int whichjointendarray[26];
 extern int difficulty;
-extern float tintr,tintg,tintb;
+extern float tintr, tintg, tintb;
 extern float slomospeed;
 extern bool gamestarted;
 
@@ -99,47 +99,47 @@ void LOG(const std::string &fmt, ...)
 
 void Dispose()
 {
-       LOGFUNC;
+    LOGFUNC;
 
-       if(Game::endgame==2){
+    if (Game::endgame == 2) {
         Game::accountactive->endGame();
-        Game::endgame=0;
-       }
+        Game::endgame = 0;
+    }
 
-       Account::saveFile(":Data:Users", Game::accountactive);
+    Account::saveFile(":Data:Users", Game::accountactive);
 
-       //textures.clear();
+    //textures.clear();
 
-       LOG("Shutting down sound system...");
+    LOG("Shutting down sound system...");
 
-       OPENAL_StopSound(OPENAL_ALL);
+    OPENAL_StopSound(OPENAL_ALL);
 
 // this is causing problems on Linux, but we'll force an _exit() a little
 //  later in the shutdown process.  --ryan.
 #if !PLATFORM_LINUX
 
-       for (int i=0; i < sounds_count; ++i)
-       {
-               OPENAL_Sample_Free(samp[i]);
-       }
-
-       OPENAL_Close();
-       if (texture.data)
-       {
-               free(texture.data);
-       }
-       texture.data = 0;
+    for (int i = 0; i < sounds_count; ++i) {
+        OPENAL_Sample_Free(samp[i]);
+    }
+
+    OPENAL_Close();
+    if (texture.data) {
+        free(texture.data);
+    }
+    texture.data = 0;
 #endif
 }
 
-void Game::newGame(){
+void Game::newGame()
+{
     text = new Text();
     skybox = new SkyBox();
 }
 
-void Game::deleteGame(){
-    if(skybox) delete skybox;
-    if(text) delete text;
+void Game::deleteGame()
+{
+    if (skybox) delete skybox;
+    if (text) delete text;
     terraintexture.destroy();
     terraintexture2.destroy();
     cursortexture.destroy();
@@ -149,54 +149,54 @@ void Game::deleteGame(){
     hawktexture.destroy();
     loadscreentexture.destroy();
 
-    for(int i=0;i<10;i++)
+    for (int i = 0; i < 10; i++)
         Mainmenuitems[i].destroy();
 
-    glDeleteTextures(1,&screentexture);
-    glDeleteTextures(1,&screentexture2);
+    glDeleteTextures(1, &screentexture);
+    glDeleteTextures(1, &screentexture2);
 
     Dispose();
 }
 
 
 
-void LoadSave(const char *fileName, GLuint *textureid,bool mipmap,GLubyte *array, int *skinsize)
+void LoadSave(const char *fileName, GLuint *textureid, bool mipmap, GLubyte *array, int *skinsize)
 {
-       int i;
-       int bytesPerPixel;
-
-       LOGFUNC;
-
-       LOG(std::string("Loading (S)...") + fileName);
-
-       //Load Image
-       float temptexdetail=texdetail;
-       texdetail=1;
-       //upload_image( fileName );
-       //LoadTGA( fileName );
-
-       // Converting file to something os specific
-       char * fixedFN = ConvertFileName(fileName);
-
-       //Load Image
-       unsigned char fileNamep[256];
-       CopyCStringToPascal(fixedFN, fileNamep);
-       //Load Image
-       upload_image( fileNamep ,0);
-       texdetail=temptexdetail;
-
-       //Is it valid?
-       if(1==1){
-               bytesPerPixel=texture.bpp/8;
-
-               int tempnum=0;
-               for(i=0;i<(int)(texture.sizeY*texture.sizeX*bytesPerPixel);i++){
-                       if((i+1)%4||bytesPerPixel==3){
-                               array[tempnum]=texture.data[i];
-                               tempnum++;
-                       }
-               }
-       }
+    int i;
+    int bytesPerPixel;
+
+    LOGFUNC;
+
+    LOG(std::string("Loading (S)...") + fileName);
+
+    //Load Image
+    float temptexdetail = texdetail;
+    texdetail = 1;
+    //upload_image( fileName );
+    //LoadTGA( fileName );
+
+    // Converting file to something os specific
+    char * fixedFN = ConvertFileName(fileName);
+
+    //Load Image
+    unsigned char fileNamep[256];
+    CopyCStringToPascal(fixedFN, fileNamep);
+    //Load Image
+    upload_image( fileNamep , 0);
+    texdetail = temptexdetail;
+
+    //Is it valid?
+    if (1 == 1) {
+        bytesPerPixel = texture.bpp / 8;
+
+        int tempnum = 0;
+        for (i = 0; i < (int)(texture.sizeY * texture.sizeX * bytesPerPixel); i++) {
+            if ((i + 1) % 4 || bytesPerPixel == 3) {
+                array[tempnum] = texture.data[i];
+                tempnum++;
+            }
+        }
+    }
 }
 
 
@@ -204,439 +204,438 @@ void LoadSave(const char *fileName, GLuint *textureid,bool mipmap,GLubyte *array
 //***************> ResizeGLScene() <******/
 GLvoid Game::ReSizeGLScene(float fov, float pnear)
 {
-       if (screenheight==0)
-       {
-               screenheight=1;
-       }
+    if (screenheight == 0) {
+        screenheight = 1;
+    }
 
-       glViewport(0,0,screenwidth,screenheight);
+    glViewport(0, 0, screenwidth, screenheight);
 
-       glMatrixMode(GL_PROJECTION);
-       glLoadIdentity();
+    glMatrixMode(GL_PROJECTION);
+    glLoadIdentity();
 
-       gluPerspective(fov,(GLfloat)screenwidth/(GLfloat)screenheight,pnear,viewdistance);
+    gluPerspective(fov, (GLfloat)screenwidth / (GLfloat)screenheight, pnear, viewdistance);
 
-       glMatrixMode(GL_MODELVIEW);
-       glLoadIdentity();
+    glMatrixMode(GL_MODELVIEW);
+    glLoadIdentity();
 }
 
 void Game::LoadingScreen()
 {
-       static float loadprogress;
-       static AbsoluteTime time = {0,0};
-       static AbsoluteTime frametime = {0,0};
-       AbsoluteTime currTime = UpTime ();
-       double deltaTime = (float) AbsoluteDeltaToDuration (currTime, frametime);
+    static float loadprogress;
+    static AbsoluteTime time = {0, 0};
+    static AbsoluteTime frametime = {0, 0};
+    AbsoluteTime currTime = UpTime ();
+    double deltaTime = (float) AbsoluteDeltaToDuration (currTime, frametime);
 
-       if (0 > deltaTime)      // if negative microseconds
-               deltaTime /= -1000000.0;
-       else                            // else milliseconds
-               deltaTime /= 1000.0;
+    if (0 > deltaTime) // if negative microseconds
+        deltaTime /= -1000000.0;
+    else                               // else milliseconds
+        deltaTime /= 1000.0;
 
-       multiplier=deltaTime;
-       if(multiplier<.001)multiplier=.001;
-       if(multiplier>10)multiplier=10;
-       if(multiplier>.05){
-               frametime = currTime;   // reset for next time interval
+    multiplier = deltaTime;
+    if (multiplier < .001)multiplier = .001;
+    if (multiplier > 10)multiplier = 10;
+    if (multiplier > .05) {
+        frametime = currTime;  // reset for next time interval
 
-               glLoadIdentity();
-               //Clear to black
-               glClearColor(0,0,0,1);
-               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+        glLoadIdentity();
+        //Clear to black
+        glClearColor(0, 0, 0, 1);
+        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
 
-               loadtime+=multiplier*4;
+        loadtime += multiplier * 4;
 
-               loadprogress=loadtime;
-               if(loadprogress>100)loadprogress=100;
+        loadprogress = loadtime;
+        if (loadprogress > 100)loadprogress = 100;
 
-               //loadprogress=abs(Random()%100);
+        //loadprogress=abs(Random()%100);
 
-               //Background
+        //Background
 
-               glEnable(GL_TEXTURE_2D);
+        glEnable(GL_TEXTURE_2D);
         loadscreentexture.bind();
-               glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
-               glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
-               glDisable(GL_DEPTH_TEST);                                                       // Disables Depth Testing
-               glDisable(GL_CULL_FACE);
-               glDisable(GL_LIGHTING);
-               glDepthMask(0);
-               glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-               glPushMatrix();                                                                         // Store The Projection Matrix
-               glLoadIdentity();                                                                       // Reset The Projection Matrix
-               glOrtho(0,screenwidth,0,screenheight,-100,100);                                         // Set Up An Ortho Screen
-               glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-               glPushMatrix();                                                                         // Store The Modelview Matrix
-               glLoadIdentity();                                                               // Reset The Modelview Matrix
-               glTranslatef(screenwidth/2,screenheight/2,0);
-               glScalef((float)screenwidth/2,(float)screenheight/2,1);
-               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-               glDisable(GL_BLEND);
-               glColor4f(loadprogress/100,loadprogress/100,loadprogress/100,1);
-               glPushMatrix();
-               //glScalef(.25,.25,.25);
-               glBegin(GL_QUADS);
-               glTexCoord2f(.1-loadprogress/100,0+loadprogress/100+.3);
-               glVertex3f(-1,          -1,      0.0f);
-               glTexCoord2f(.1-loadprogress/100,0+loadprogress/100+.3);
-               glVertex3f(1,   -1,      0.0f);
-               glTexCoord2f(.1-loadprogress/100,1+loadprogress/100+.3);
-               glVertex3f(1,   1, 0.0f);
-               glTexCoord2f(.1-loadprogress/100,1+loadprogress/100+.3);
-               glVertex3f(-1,  1, 0.0f);
-               glEnd();
-               glPopMatrix();
-               glEnable(GL_BLEND);
-               glPushMatrix();
-               //glScalef(.25,.25,.25);
-               glBegin(GL_QUADS);
-               glTexCoord2f(.4+loadprogress/100,0+loadprogress/100);
-               glVertex3f(-1,          -1,      0.0f);
-               glTexCoord2f(.4+loadprogress/100,0+loadprogress/100);
-               glVertex3f(1,   -1,      0.0f);
-               glTexCoord2f(.4+loadprogress/100,1+loadprogress/100);
-               glVertex3f(1,   1, 0.0f);
-               glTexCoord2f(.4+loadprogress/100,1+loadprogress/100);
-               glVertex3f(-1,  1, 0.0f);
-               glEnd();
-               glPopMatrix();
-               glDisable(GL_TEXTURE_2D);
-               glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-               glPopMatrix();                                                                          // Restore The Old Projection Matrix
-               glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-               glPopMatrix();                                                                          // Restore The Old Projection Matrix
-               glDisable(GL_BLEND);
-               glDepthMask(1);
-
-               glEnable(GL_TEXTURE_2D);
+        glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+        glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+        glDisable(GL_DEPTH_TEST);                                                      // Disables Depth Testing
+        glDisable(GL_CULL_FACE);
+        glDisable(GL_LIGHTING);
+        glDepthMask(0);
+        glMatrixMode(GL_PROJECTION);                                           // Select The Projection Matrix
+        glPushMatrix();                                                                                // Store The Projection Matrix
+        glLoadIdentity();                                                                      // Reset The Projection Matrix
+        glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                           // Set Up An Ortho Screen
+        glMatrixMode(GL_MODELVIEW);                                                    // Select The Modelview Matrix
+        glPushMatrix();                                                                                // Store The Modelview Matrix
+        glLoadIdentity();                                                              // Reset The Modelview Matrix
+        glTranslatef(screenwidth / 2, screenheight / 2, 0);
+        glScalef((float)screenwidth / 2, (float)screenheight / 2, 1);
+        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+        glDisable(GL_BLEND);
+        glColor4f(loadprogress / 100, loadprogress / 100, loadprogress / 100, 1);
+        glPushMatrix();
+        //glScalef(.25,.25,.25);
+        glBegin(GL_QUADS);
+        glTexCoord2f(.1 - loadprogress / 100, 0 + loadprogress / 100 + .3);
+        glVertex3f(-1,         -1,      0.0f);
+        glTexCoord2f(.1 - loadprogress / 100, 0 + loadprogress / 100 + .3);
+        glVertex3f(1,  -1,      0.0f);
+        glTexCoord2f(.1 - loadprogress / 100, 1 + loadprogress / 100 + .3);
+        glVertex3f(1,  1, 0.0f);
+        glTexCoord2f(.1 - loadprogress / 100, 1 + loadprogress / 100 + .3);
+        glVertex3f(-1, 1, 0.0f);
+        glEnd();
+        glPopMatrix();
+        glEnable(GL_BLEND);
+        glPushMatrix();
+        //glScalef(.25,.25,.25);
+        glBegin(GL_QUADS);
+        glTexCoord2f(.4 + loadprogress / 100, 0 + loadprogress / 100);
+        glVertex3f(-1,         -1,      0.0f);
+        glTexCoord2f(.4 + loadprogress / 100, 0 + loadprogress / 100);
+        glVertex3f(1,  -1,      0.0f);
+        glTexCoord2f(.4 + loadprogress / 100, 1 + loadprogress / 100);
+        glVertex3f(1,  1, 0.0f);
+        glTexCoord2f(.4 + loadprogress / 100, 1 + loadprogress / 100);
+        glVertex3f(-1, 1, 0.0f);
+        glEnd();
+        glPopMatrix();
+        glDisable(GL_TEXTURE_2D);
+        glMatrixMode(GL_PROJECTION);                                           // Select The Projection Matrix
+        glPopMatrix();                                                                         // Restore The Old Projection Matrix
+        glMatrixMode(GL_MODELVIEW);                                                    // Select The Modelview Matrix
+        glPopMatrix();                                                                         // Restore The Old Projection Matrix
+        glDisable(GL_BLEND);
+        glDepthMask(1);
+
+        glEnable(GL_TEXTURE_2D);
         loadscreentexture.bind();
-               glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
-               glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
-               glDisable(GL_DEPTH_TEST);                                                       // Disables Depth Testing
-               glDisable(GL_CULL_FACE);
-               glDisable(GL_LIGHTING);
-               glDepthMask(0);
-               glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-               glPushMatrix();                                                                         // Store The Projection Matrix
-               glLoadIdentity();                                                                       // Reset The Projection Matrix
-               glOrtho(0,screenwidth,0,screenheight,-100,100);                                         // Set Up An Ortho Screen
-               glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-               glPushMatrix();                                                                         // Store The Modelview Matrix
-               glLoadIdentity();                                                               // Reset The Modelview Matrix
-               glTranslatef(screenwidth/2,screenheight/2,0);
-               glScalef((float)screenwidth/2*(1.5-(loadprogress)/200),(float)screenheight/2*(1.5-(loadprogress)/200),1);
-               glBlendFunc(GL_SRC_ALPHA,GL_ONE);
-               glEnable(GL_BLEND);
-               //glColor4f(loadprogress/100,loadprogress/100,loadprogress/100,1);
-               glColor4f(loadprogress/100,loadprogress/100,loadprogress/100,1);
-               glPushMatrix();
-               //glScalef(.25,.25,.25);
-               glBegin(GL_QUADS);
-               glTexCoord2f(0+.5,0+.5);
-               glVertex3f(-1,          -1,      0.0f);
-               glTexCoord2f(1+.5,0+.5);
-               glVertex3f(1,   -1,      0.0f);
-               glTexCoord2f(1+.5,1+.5);
-               glVertex3f(1,   1, 0.0f);
-               glTexCoord2f(0+.5,1+.5);
-               glVertex3f(-1,  1, 0.0f);
-               glEnd();
-               glPopMatrix();
-               glDisable(GL_TEXTURE_2D);
-               glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-               glPopMatrix();                                                                          // Restore The Old Projection Matrix
-               glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-               glPopMatrix();                                                                          // Restore The Old Projection Matrix
-               glDisable(GL_BLEND);
-               glDepthMask(1);
-
-               glEnable(GL_TEXTURE_2D);
+        glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+        glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+        glDisable(GL_DEPTH_TEST);                                                      // Disables Depth Testing
+        glDisable(GL_CULL_FACE);
+        glDisable(GL_LIGHTING);
+        glDepthMask(0);
+        glMatrixMode(GL_PROJECTION);                                           // Select The Projection Matrix
+        glPushMatrix();                                                                                // Store The Projection Matrix
+        glLoadIdentity();                                                                      // Reset The Projection Matrix
+        glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                           // Set Up An Ortho Screen
+        glMatrixMode(GL_MODELVIEW);                                                    // Select The Modelview Matrix
+        glPushMatrix();                                                                                // Store The Modelview Matrix
+        glLoadIdentity();                                                              // Reset The Modelview Matrix
+        glTranslatef(screenwidth / 2, screenheight / 2, 0);
+        glScalef((float)screenwidth / 2 * (1.5 - (loadprogress) / 200), (float)screenheight / 2 * (1.5 - (loadprogress) / 200), 1);
+        glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+        glEnable(GL_BLEND);
+        //glColor4f(loadprogress/100,loadprogress/100,loadprogress/100,1);
+        glColor4f(loadprogress / 100, loadprogress / 100, loadprogress / 100, 1);
+        glPushMatrix();
+        //glScalef(.25,.25,.25);
+        glBegin(GL_QUADS);
+        glTexCoord2f(0 + .5, 0 + .5);
+        glVertex3f(-1,         -1,      0.0f);
+        glTexCoord2f(1 + .5, 0 + .5);
+        glVertex3f(1,  -1,      0.0f);
+        glTexCoord2f(1 + .5, 1 + .5);
+        glVertex3f(1,  1, 0.0f);
+        glTexCoord2f(0 + .5, 1 + .5);
+        glVertex3f(-1, 1, 0.0f);
+        glEnd();
+        glPopMatrix();
+        glDisable(GL_TEXTURE_2D);
+        glMatrixMode(GL_PROJECTION);                                           // Select The Projection Matrix
+        glPopMatrix();                                                                         // Restore The Old Projection Matrix
+        glMatrixMode(GL_MODELVIEW);                                                    // Select The Modelview Matrix
+        glPopMatrix();                                                                         // Restore The Old Projection Matrix
+        glDisable(GL_BLEND);
+        glDepthMask(1);
+
+        glEnable(GL_TEXTURE_2D);
         loadscreentexture.bind();
-               glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
-               glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
-               glDisable(GL_DEPTH_TEST);                                                       // Disables Depth Testing
-               glDisable(GL_CULL_FACE);
-               glDisable(GL_LIGHTING);
-               glDepthMask(0);
-               glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-               glPushMatrix();                                                                         // Store The Projection Matrix
-               glLoadIdentity();                                                                       // Reset The Projection Matrix
-               glOrtho(0,screenwidth,0,screenheight,-100,100);                                         // Set Up An Ortho Screen
-               glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-               glPushMatrix();                                                                         // Store The Modelview Matrix
-               glLoadIdentity();                                                               // Reset The Modelview Matrix
-               glTranslatef(screenwidth/2,screenheight/2,0);
-               glScalef((float)screenwidth/2*(100+loadprogress)/100,(float)screenheight/2*(100+loadprogress)/100,1);
-               glBlendFunc(GL_SRC_ALPHA,GL_ONE);
-               glEnable(GL_BLEND);
-               glColor4f(loadprogress/100,loadprogress/100,loadprogress/100,.4);
-               glPushMatrix();
-               //glScalef(.25,.25,.25);
-               glBegin(GL_QUADS);
-               glTexCoord2f(0+.2,0+.8);
-               glVertex3f(-1,          -1,      0.0f);
-               glTexCoord2f(1+.2,0+.8);
-               glVertex3f(1,   -1,      0.0f);
-               glTexCoord2f(1+.2,1+.8);
-               glVertex3f(1,   1, 0.0f);
-               glTexCoord2f(0+.2,1+.8);
-               glVertex3f(-1,  1, 0.0f);
-               glEnd();
-               glPopMatrix();
-               glDisable(GL_TEXTURE_2D);
-               glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-               glPopMatrix();                                                                          // Restore The Old Projection Matrix
-               glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-               glPopMatrix();                                                                          // Restore The Old Projection Matrix
-               glDisable(GL_BLEND);
-               glDepthMask(1);
-
-               //Text
-
-               if(flashamount>0){
-                       if(flashamount>1)flashamount=1;
-                       if(flashdelay<=0)flashamount-=multiplier;
-                       flashdelay--;
-                       if(flashamount<0)flashamount=0;
-                       glDisable(GL_DEPTH_TEST);                                                       // Disables Depth Testing
-                       glDisable(GL_CULL_FACE);
-                       glDisable(GL_LIGHTING);
-                       glDisable(GL_TEXTURE_2D);
-                       glDepthMask(0);
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPushMatrix();                                                                         // Store The Projection Matrix
-                       glLoadIdentity();                                                                       // Reset The Projection Matrix
-                       glOrtho(0,screenwidth,0,screenheight,-100,100);                                         // Set Up An Ortho Screen
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPushMatrix();                                                                         // Store The Modelview Matrix
-                       glLoadIdentity();                                                               // Reset The Modelview Matrix
-                       glScalef(screenwidth,screenheight,1);
-                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                       glEnable(GL_BLEND);
-                       glColor4f(flashr,flashg,flashb,flashamount);
-                       glBegin(GL_QUADS);
-                       glVertex3f(0,           0,       0.0f);
-                       glVertex3f(256, 0,       0.0f);
-                       glVertex3f(256, 256, 0.0f);
-                       glVertex3f(0,   256, 0.0f);
-                       glEnd();
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-                       glEnable(GL_DEPTH_TEST);                                                        // Enables Depth Testing
-                       glEnable(GL_CULL_FACE);
-                       glDisable(GL_BLEND);
-                       glDepthMask(1);
-               }
-
-               swap_gl_buffers();
-       }
+        glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+        glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+        glDisable(GL_DEPTH_TEST);                                                      // Disables Depth Testing
+        glDisable(GL_CULL_FACE);
+        glDisable(GL_LIGHTING);
+        glDepthMask(0);
+        glMatrixMode(GL_PROJECTION);                                           // Select The Projection Matrix
+        glPushMatrix();                                                                                // Store The Projection Matrix
+        glLoadIdentity();                                                                      // Reset The Projection Matrix
+        glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                           // Set Up An Ortho Screen
+        glMatrixMode(GL_MODELVIEW);                                                    // Select The Modelview Matrix
+        glPushMatrix();                                                                                // Store The Modelview Matrix
+        glLoadIdentity();                                                              // Reset The Modelview Matrix
+        glTranslatef(screenwidth / 2, screenheight / 2, 0);
+        glScalef((float)screenwidth / 2 * (100 + loadprogress) / 100, (float)screenheight / 2 * (100 + loadprogress) / 100, 1);
+        glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+        glEnable(GL_BLEND);
+        glColor4f(loadprogress / 100, loadprogress / 100, loadprogress / 100, .4);
+        glPushMatrix();
+        //glScalef(.25,.25,.25);
+        glBegin(GL_QUADS);
+        glTexCoord2f(0 + .2, 0 + .8);
+        glVertex3f(-1,         -1,      0.0f);
+        glTexCoord2f(1 + .2, 0 + .8);
+        glVertex3f(1,  -1,      0.0f);
+        glTexCoord2f(1 + .2, 1 + .8);
+        glVertex3f(1,  1, 0.0f);
+        glTexCoord2f(0 + .2, 1 + .8);
+        glVertex3f(-1, 1, 0.0f);
+        glEnd();
+        glPopMatrix();
+        glDisable(GL_TEXTURE_2D);
+        glMatrixMode(GL_PROJECTION);                                           // Select The Projection Matrix
+        glPopMatrix();                                                                         // Restore The Old Projection Matrix
+        glMatrixMode(GL_MODELVIEW);                                                    // Select The Modelview Matrix
+        glPopMatrix();                                                                         // Restore The Old Projection Matrix
+        glDisable(GL_BLEND);
+        glDepthMask(1);
+
+        //Text
+
+        if (flashamount > 0) {
+            if (flashamount > 1)flashamount = 1;
+            if (flashdelay <= 0)flashamount -= multiplier;
+            flashdelay--;
+            if (flashamount < 0)flashamount = 0;
+            glDisable(GL_DEPTH_TEST);                                                  // Disables Depth Testing
+            glDisable(GL_CULL_FACE);
+            glDisable(GL_LIGHTING);
+            glDisable(GL_TEXTURE_2D);
+            glDepthMask(0);
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPushMatrix();                                                                            // Store The Projection Matrix
+            glLoadIdentity();                                                                  // Reset The Projection Matrix
+            glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                               // Set Up An Ortho Screen
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPushMatrix();                                                                            // Store The Modelview Matrix
+            glLoadIdentity();                                                          // Reset The Modelview Matrix
+            glScalef(screenwidth, screenheight, 1);
+            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            glEnable(GL_BLEND);
+            glColor4f(flashr, flashg, flashb, flashamount);
+            glBegin(GL_QUADS);
+            glVertex3f(0,              0,       0.0f);
+            glVertex3f(256,    0,       0.0f);
+            glVertex3f(256,    256, 0.0f);
+            glVertex3f(0,      256, 0.0f);
+            glEnd();
+            glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPopMatrix();                                                                             // Restore The Old Projection Matrix
+            glEnable(GL_DEPTH_TEST);                                                   // Enables Depth Testing
+            glEnable(GL_CULL_FACE);
+            glDisable(GL_BLEND);
+            glDepthMask(1);
+        }
+
+        swap_gl_buffers();
+    }
 }
 
 void FadeLoadingScreen(float howmuch)
 {
-       static float loadprogress;
-
-       glLoadIdentity();
-       //Clear to black
-       glClearColor(0,0,0,1);
-       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-       loadprogress=howmuch;
-
-       //loadprogress=abs(Random()%100);
-
-       //Background
-
-       //glEnable(GL_TEXTURE_2D);
-       glDisable(GL_TEXTURE_2D);
-       //glBindTexture( GL_TEXTURE_2D, loadscreentexture);
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
-       glDisable(GL_DEPTH_TEST);                                                       // Disables Depth Testing
-       glDisable(GL_CULL_FACE);
-       glDisable(GL_LIGHTING);
-       glDepthMask(0);
-       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-       glPushMatrix();                                                                         // Store The Projection Matrix
-       glLoadIdentity();                                                                       // Reset The Projection Matrix
-       glOrtho(0,screenwidth,0,screenheight,-100,100);                                         // Set Up An Ortho Screen
-       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-       glPushMatrix();                                                                         // Store The Modelview Matrix
-       glLoadIdentity();                                                               // Reset The Modelview Matrix
-       glTranslatef(screenwidth/2,screenheight/2,0);
-       glScalef((float)screenwidth/2,(float)screenheight/2,1);
-       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-       glDisable(GL_BLEND);
-       glColor4f(loadprogress/100,0,0,1);
-       glPushMatrix();
-       //glScalef(.25,.25,.25);
-       glBegin(GL_QUADS);
-       glTexCoord2f(0,0);
-       glVertex3f(-1,          -1,      0.0f);
-       glTexCoord2f(1,0);
-       glVertex3f(1,   -1,      0.0f);
-       glTexCoord2f(1,1);
-       glVertex3f(1,   1, 0.0f);
-       glTexCoord2f(0,1);
-       glVertex3f(-1,  1, 0.0f);
-       glEnd();
-       glPopMatrix();
-       glDisable(GL_TEXTURE_2D);
-       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-       glDisable(GL_BLEND);
-       glDepthMask(1);
-       //Text
-       swap_gl_buffers();
+    static float loadprogress;
+
+    glLoadIdentity();
+    //Clear to black
+    glClearColor(0, 0, 0, 1);
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+    loadprogress = howmuch;
+
+    //loadprogress=abs(Random()%100);
+
+    //Background
+
+    //glEnable(GL_TEXTURE_2D);
+    glDisable(GL_TEXTURE_2D);
+    //glBindTexture( GL_TEXTURE_2D, loadscreentexture);
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+    glDisable(GL_DEPTH_TEST);                                                  // Disables Depth Testing
+    glDisable(GL_CULL_FACE);
+    glDisable(GL_LIGHTING);
+    glDepthMask(0);
+    glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+    glPushMatrix();                                                                            // Store The Projection Matrix
+    glLoadIdentity();                                                                  // Reset The Projection Matrix
+    glOrtho(0, screenwidth, 0, screenheight, -100, 100);                                               // Set Up An Ortho Screen
+    glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+    glPushMatrix();                                                                            // Store The Modelview Matrix
+    glLoadIdentity();                                                          // Reset The Modelview Matrix
+    glTranslatef(screenwidth / 2, screenheight / 2, 0);
+    glScalef((float)screenwidth / 2, (float)screenheight / 2, 1);
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+    glDisable(GL_BLEND);
+    glColor4f(loadprogress / 100, 0, 0, 1);
+    glPushMatrix();
+    //glScalef(.25,.25,.25);
+    glBegin(GL_QUADS);
+    glTexCoord2f(0, 0);
+    glVertex3f(-1,             -1,      0.0f);
+    glTexCoord2f(1, 0);
+    glVertex3f(1,      -1,      0.0f);
+    glTexCoord2f(1, 1);
+    glVertex3f(1,      1, 0.0f);
+    glTexCoord2f(0, 1);
+    glVertex3f(-1,     1, 0.0f);
+    glEnd();
+    glPopMatrix();
+    glDisable(GL_TEXTURE_2D);
+    glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+    glPopMatrix();                                                                             // Restore The Old Projection Matrix
+    glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+    glPopMatrix();                                                                             // Restore The Old Projection Matrix
+    glDisable(GL_BLEND);
+    glDepthMask(1);
+    //Text
+    swap_gl_buffers();
 }
 
 
 extern bool cmdline(const char *cmd);
-    
+
 void Game::InitGame()
 {
 #if PLATFORM_MACOSX
-       ProcessSerialNumber PSN;
-       ProcessInfoRec pinfo;
-       FSSpec pspec;
-       OSStatus err;
-       /* set up process serial number */
-       PSN.highLongOfPSN = 0;
-       PSN.lowLongOfPSN = kCurrentProcess;
-       /* set up info block */
-       pinfo.processInfoLength = sizeof(pinfo);
-       pinfo.processName = NULL;
-       pinfo.processAppSpec = &pspec;
-       /* grab the vrefnum and directory */
-       err = GetProcessInformation(&PSN, &pinfo);
-       if (err == noErr) {
-               vRefNum = pspec.vRefNum;
-               dirID = pspec.parID;
-       }
+    ProcessSerialNumber PSN;
+    ProcessInfoRec pinfo;
+    FSSpec pspec;
+    OSStatus err;
+    /* set up process serial number */
+    PSN.highLongOfPSN = 0;
+    PSN.lowLongOfPSN = kCurrentProcess;
+    /* set up info block */
+    pinfo.processInfoLength = sizeof(pinfo);
+    pinfo.processName = NULL;
+    pinfo.processAppSpec = &pspec;
+    /* grab the vrefnum and directory */
+    err = GetProcessInformation(&PSN, &pinfo);
+    if (err == noErr) {
+        vRefNum = pspec.vRefNum;
+        dirID = pspec.parID;
+    }
 #endif
 
-       LOGFUNC;
+    LOGFUNC;
 
-       numchallengelevels=14;
+    numchallengelevels = 14;
 
-       accountactive=Account::loadFile(":Data:Users");
+    accountactive = Account::loadFile(":Data:Users");
 
-       tintr=1;
-       tintg=1;
-       tintb=1;
+    tintr = 1;
+    tintg = 1;
+    tintb = 1;
 
-       whichjointstartarray[0]=righthip;
-       whichjointendarray[0]=rightfoot;
+    whichjointstartarray[0] = righthip;
+    whichjointendarray[0] = rightfoot;
 
-       whichjointstartarray[1]=righthip;
-       whichjointendarray[1]=rightankle;
+    whichjointstartarray[1] = righthip;
+    whichjointendarray[1] = rightankle;
 
-       whichjointstartarray[2]=righthip;
-       whichjointendarray[2]=rightknee;
+    whichjointstartarray[2] = righthip;
+    whichjointendarray[2] = rightknee;
 
-       whichjointstartarray[3]=rightknee;
-       whichjointendarray[3]=rightankle;
+    whichjointstartarray[3] = rightknee;
+    whichjointendarray[3] = rightankle;
 
-       whichjointstartarray[4]=rightankle;
-       whichjointendarray[4]=rightfoot;
+    whichjointstartarray[4] = rightankle;
+    whichjointendarray[4] = rightfoot;
 
-       whichjointstartarray[5]=lefthip;
-       whichjointendarray[5]=leftfoot;
+    whichjointstartarray[5] = lefthip;
+    whichjointendarray[5] = leftfoot;
 
-       whichjointstartarray[6]=lefthip;
-       whichjointendarray[6]=leftankle;
+    whichjointstartarray[6] = lefthip;
+    whichjointendarray[6] = leftankle;
 
-       whichjointstartarray[7]=lefthip;
-       whichjointendarray[7]=leftknee;
+    whichjointstartarray[7] = lefthip;
+    whichjointendarray[7] = leftknee;
 
-       whichjointstartarray[8]=leftknee;
-       whichjointendarray[8]=leftankle;
+    whichjointstartarray[8] = leftknee;
+    whichjointendarray[8] = leftankle;
 
-       whichjointstartarray[9]=leftankle;
-       whichjointendarray[9]=leftfoot;
+    whichjointstartarray[9] = leftankle;
+    whichjointendarray[9] = leftfoot;
 
-       whichjointstartarray[10]=abdomen;
-       whichjointendarray[10]=rightshoulder;
+    whichjointstartarray[10] = abdomen;
+    whichjointendarray[10] = rightshoulder;
 
-       whichjointstartarray[11]=abdomen;
-       whichjointendarray[11]=rightelbow;
+    whichjointstartarray[11] = abdomen;
+    whichjointendarray[11] = rightelbow;
 
-       whichjointstartarray[12]=abdomen;
-       whichjointendarray[12]=rightwrist;
+    whichjointstartarray[12] = abdomen;
+    whichjointendarray[12] = rightwrist;
 
-       whichjointstartarray[13]=abdomen;
-       whichjointendarray[13]=righthand;
+    whichjointstartarray[13] = abdomen;
+    whichjointendarray[13] = righthand;
 
-       whichjointstartarray[14]=rightshoulder;
-       whichjointendarray[14]=rightelbow;
+    whichjointstartarray[14] = rightshoulder;
+    whichjointendarray[14] = rightelbow;
 
-       whichjointstartarray[15]=rightelbow;
-       whichjointendarray[15]=rightwrist;
+    whichjointstartarray[15] = rightelbow;
+    whichjointendarray[15] = rightwrist;
 
-       whichjointstartarray[16]=rightwrist;
-       whichjointendarray[16]=righthand;
+    whichjointstartarray[16] = rightwrist;
+    whichjointendarray[16] = righthand;
 
-       whichjointstartarray[17]=abdomen;
-       whichjointendarray[17]=leftshoulder;
+    whichjointstartarray[17] = abdomen;
+    whichjointendarray[17] = leftshoulder;
 
-       whichjointstartarray[18]=abdomen;
-       whichjointendarray[18]=leftelbow;
+    whichjointstartarray[18] = abdomen;
+    whichjointendarray[18] = leftelbow;
 
-       whichjointstartarray[19]=abdomen;
-       whichjointendarray[19]=leftwrist;
+    whichjointstartarray[19] = abdomen;
+    whichjointendarray[19] = leftwrist;
 
-       whichjointstartarray[20]=abdomen;
-       whichjointendarray[20]=lefthand;
+    whichjointstartarray[20] = abdomen;
+    whichjointendarray[20] = lefthand;
 
-       whichjointstartarray[21]=leftshoulder;
-       whichjointendarray[21]=leftelbow;
+    whichjointstartarray[21] = leftshoulder;
+    whichjointendarray[21] = leftelbow;
 
-       whichjointstartarray[22]=leftelbow;
-       whichjointendarray[22]=leftwrist;
+    whichjointstartarray[22] = leftelbow;
+    whichjointendarray[22] = leftwrist;
 
-       whichjointstartarray[23]=leftwrist;
-       whichjointendarray[23]=lefthand;
+    whichjointstartarray[23] = leftwrist;
+    whichjointendarray[23] = lefthand;
 
-       whichjointstartarray[24]=abdomen;
-       whichjointendarray[24]=neck;
+    whichjointstartarray[24] = abdomen;
+    whichjointendarray[24] = neck;
 
-       whichjointstartarray[25]=neck;
-       whichjointendarray[25]=head;
+    whichjointstartarray[25] = neck;
+    whichjointendarray[25] = head;
 
-       FadeLoadingScreen(0);
+    FadeLoadingScreen(0);
 
-       stillloading=1;
+    stillloading = 1;
 
-       texture.data = ( GLubyte* )malloc( 1024*1024*4 );
+    texture.data = ( GLubyte* )malloc( 1024 * 1024 * 4 );
 
-       int temptexdetail=texdetail;
-       texdetail=1;
-       text->LoadFontTexture(":Data:Textures:Font.png");
-       text->BuildFont();
-       texdetail=temptexdetail;
+    int temptexdetail = texdetail;
+    texdetail = 1;
+    text->LoadFontTexture(":Data:Textures:Font.png");
+    text->BuildFont();
+    texdetail = temptexdetail;
 
-       FadeLoadingScreen(10);
+    FadeLoadingScreen(10);
 
-       if(detail==2){
-               texdetail=1;
-       }
-       if(detail==1){
-               texdetail=2;
-       }
-       if(detail==0){
-               texdetail=4;
-       }
+    if (detail == 2) {
+        texdetail = 1;
+    }
+    if (detail == 1) {
+        texdetail = 2;
+    }
+    if (detail == 0) {
+        texdetail = 4;
+    }
 
-       LOG("Initializing sound system...");
+    LOG("Initializing sound system...");
 
-    #if PLATFORM_LINUX
+#if PLATFORM_LINUX
     int output = -1;
-    
+
     unsigned char rc = 0;
     output = OPENAL_OUTPUT_ALSA;  // Try alsa first...
     if (cmdline("forceoss"))      //  ...but let user override that.
@@ -645,76 +644,74 @@ void Game::InitGame()
         output = OPENAL_OUTPUT_NOSOUND;
 
     OPENAL_SetOutput(output);
-       if ((rc = OPENAL_Init(44100, 32, 0)) == false)
-    {
+    if ((rc = OPENAL_Init(44100, 32, 0)) == false) {
         // if we tried ALSA and failed, fall back to OSS.
-        if ( (output == OPENAL_OUTPUT_ALSA) && (!cmdline("forcealsa")) )
-        {
+        if ( (output == OPENAL_OUTPUT_ALSA) && (!cmdline("forcealsa")) ) {
             OPENAL_Close();
             output = OPENAL_OUTPUT_OSS;
             OPENAL_SetOutput(output);
-               rc = OPENAL_Init(44100, 32, 0);
+            rc = OPENAL_Init(44100, 32, 0);
         }
     }
 
-    if (rc == false)
-    {
+    if (rc == false) {
         OPENAL_Close();
         output = OPENAL_OUTPUT_NOSOUND;  // we tried! just do silence.
         OPENAL_SetOutput(output);
-           rc = OPENAL_Init(44100, 32, 0);
+        rc = OPENAL_Init(44100, 32, 0);
     }
-    #else
-       OPENAL_Init(44100, 32, 0);
-    #endif
+#else
+    OPENAL_Init(44100, 32, 0);
+#endif
+
+    OPENAL_SetSFXMasterVolume((int)(volume * 255));
+    loadAllSounds();
 
-       OPENAL_SetSFXMasterVolume((int)(volume*255));
-       loadAllSounds();
+    if (musictoggle)
+        emit_stream_np(stream_menutheme);
 
-       if(musictoggle)
-         emit_stream_np(stream_menutheme);
+    cursortexture.load(":Data:Textures:Cursor.png", 0, 1);
 
-       cursortexture.load(":Data:Textures:Cursor.png",0,1);
+    Mapcircletexture.load(":Data:Textures:MapCircle.png", 0, 1);
+    Mapboxtexture.load(":Data:Textures:MapBox.png", 0, 1);
+    Maparrowtexture.load(":Data:Textures:MapArrow.png", 0, 1);
 
-       Mapcircletexture.load(":Data:Textures:MapCircle.png",0,1);
-       Mapboxtexture.load(":Data:Textures:MapBox.png",0,1);
-       Maparrowtexture.load(":Data:Textures:MapArrow.png",0,1);
+    temptexdetail = texdetail;
+    if (texdetail > 2)texdetail = 2;
+    Mainmenuitems[0].load(":Data:Textures:Lugaru.png", 0, 0);
+    Mainmenuitems[1].load(":Data:Textures:Newgame.png", 0, 0);
+    Mainmenuitems[2].load(":Data:Textures:Options.png", 0, 0);
+    Mainmenuitems[3].load(":Data:Textures:Quit.png", 0, 0);
+    Mainmenuitems[4].load(":Data:Textures:Eyelid.png", 0, 1);
+    Mainmenuitems[5].load(":Data:Textures:Resume.png", 0, 0);
+    Mainmenuitems[6].load(":Data:Textures:Endgame.png", 0, 0);
 
-       temptexdetail=texdetail;
-       if(texdetail>2)texdetail=2;
-       Mainmenuitems[0].load(":Data:Textures:Lugaru.png",0,0);
-       Mainmenuitems[1].load(":Data:Textures:Newgame.png",0,0);
-       Mainmenuitems[2].load(":Data:Textures:Options.png",0,0);
-       Mainmenuitems[3].load(":Data:Textures:Quit.png",0,0);
-       Mainmenuitems[4].load(":Data:Textures:Eyelid.png",0,1);
-       Mainmenuitems[5].load(":Data:Textures:Resume.png",0,0);
-       Mainmenuitems[6].load(":Data:Textures:Endgame.png",0,0);
-       
-       //LoadTexture(":Data:Textures:Eye.jpg",&Mainmenuitems[5],0,1);
-       //~ LoadTexture(":Data:Textures:World.png",&Mainmenuitems[7],0,0); // LoadCampaign will take care of that
-       texdetail=temptexdetail;
+    //LoadTexture(":Data:Textures:Eye.jpg",&Mainmenuitems[5],0,1);
+    //~ LoadTexture(":Data:Textures:World.png",&Mainmenuitems[7],0,0); // LoadCampaign will take care of that
+    texdetail = temptexdetail;
 
-       FadeLoadingScreen(95);
+    FadeLoadingScreen(95);
 
 
-       gameon=0;
-       mainmenu=1;
+    gameon = 0;
+    mainmenu = 1;
 
-       stillloading=0;
-       firstload=0;
+    stillloading = 0;
+    firstload = 0;
 
-       newdetail=detail;
-       newscreenwidth=screenwidth;
-       newscreenheight=screenheight;
+    newdetail = detail;
+    newscreenwidth = screenwidth;
+    newscreenheight = screenheight;
 
     LoadMenu();
 }
 
 
-void Game::LoadScreenTexture() {
+void Game::LoadScreenTexture()
+{
     glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
 
-    if(!Game::screentexture)
+    if (!Game::screentexture)
         glGenTextures( 1, &Game::screentexture );
     glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
 
@@ -730,255 +727,255 @@ void Game::LoadScreenTexture() {
 //TODO: move LoadStuff() closer to GameTick.cpp to get rid of various vars shared in Game.h
 void Game::LoadStuff()
 {
-       static float temptexdetail;
-       static float viewdistdetail;
-       static int i,j;
-       float megascale =1;
-
-       LOGFUNC;
-
-       loadtime=0;
-
-       stillloading=1;
-
-       for(i=0;i<maxplayers;i++)
-               player[i].skeleton.drawmodel.textureptr.destroy();
-
-       i=abs(Random()%4);
-       visibleloading=0; //don't use loadscreentexture yet
-       loadscreentexture.load(":Data:Textures:fire.jpg",1,0);
-       visibleloading=1;
-
-       temptexdetail=texdetail;
-       texdetail=1;
-       text->LoadFontTexture(":Data:Textures:Font.png");
-       text->BuildFont();
-       texdetail=temptexdetail;
-
-       numsounds=71;
-
-       viewdistdetail=2;
-       viewdistance=50*megascale*viewdistdetail;
-
-       if(detail==2){
-               texdetail=1;
-       }
-       if(detail==1){
-               texdetail=2;
-       }
-       if(detail==0){
-               texdetail=4;
-       }
-
-       realtexdetail=texdetail;
-
-       numplayers=1;
-
-
-       LOG("Loading weapon data...");
-
-       Weapon::knifetextureptr.load(":Data:Textures:knife.png",0,1);
-       Weapon::bloodknifetextureptr.load(":Data:Textures:bloodknife.png",0,1);
-       Weapon::lightbloodknifetextureptr.load(":Data:Textures:lightbloodknife.png",0,1);
-       Weapon::swordtextureptr.load(":Data:Textures:sword.jpg",1,0);
-       Weapon::bloodswordtextureptr.load(":Data:Textures:Swordblood.jpg",1,0);
-       Weapon::lightbloodswordtextureptr.load(":Data:Textures:Swordbloodlight.jpg",1,0);
-       Weapon::stafftextureptr.load(":Data:Textures:Staff.jpg",1,0);
-
-       Weapon::throwingknifemodel.load((char *)":Data:Models:throwingknife.solid",1);
-       Weapon::throwingknifemodel.Scale(.001,.001,.001);
-       //Weapon::throwingknifemodel.Rotate(0,0,-90);
-       Weapon::throwingknifemodel.Rotate(90,0,0);
-       Weapon::throwingknifemodel.Rotate(0,90,0);
-       Weapon::throwingknifemodel.flat=0;
-       Weapon::throwingknifemodel.CalculateNormals(1);
-       //Weapon::throwingknifemodel.ScaleNormals(-1,-1,-1);
-
-       Weapon::swordmodel.load((char *)":Data:Models:sword.solid",1);
-       Weapon::swordmodel.Scale(.001,.001,.001);
-       //Weapon::swordmodel.Rotate(0,0,-90);
-       Weapon::swordmodel.Rotate(90,0,0);
-       Weapon::swordmodel.Rotate(0,90,0);
-       Weapon::swordmodel.Rotate(0,0,90);
-       Weapon::swordmodel.flat=1;
-       Weapon::swordmodel.CalculateNormals(1);
-       //Weapon::swordmodel.ScaleNormals(-1,-1,-1);
-
-       Weapon::staffmodel.load((char *)":Data:Models:staff.solid",1);
-       Weapon::staffmodel.Scale(.005,.005,.005);
-       //Weapon::staffmodel.Rotate(0,0,-90);
-       Weapon::staffmodel.Rotate(90,0,0);
-       Weapon::staffmodel.Rotate(0,90,0);
-       Weapon::staffmodel.Rotate(0,0,90);
-       Weapon::staffmodel.flat=1;
-       Weapon::staffmodel.CalculateNormals(1);
-       //Weapon::staffmodel.ScaleNormals(-1,-1,-1);
-
-       terrain.shadowtexture.load(":Data:Textures:shadow.png",0,1);
-       terrain.bloodtexture.load(":Data:Textures:blood.png",0,1);
-       terrain.breaktexture.load(":Data:Textures:break.png",0,1);
-       terrain.bloodtexture2.load(":Data:Textures:blood.png",0,1);
-
-
-       terrain.footprinttexture.load(":Data:Textures:footprint.png",0,1);
-       terrain.bodyprinttexture.load(":Data:Textures:bodyprint.png",0,1);
-       hawktexture.load(":Data:Textures:hawk.png",0,1);
-
-
-       Sprite::cloudtexture.load(":Data:Textures:cloud.png",1,1);
-       Sprite::cloudimpacttexture.load(":Data:Textures:cloudimpact.png",1,1);
-       Sprite::bloodtexture.load(":Data:Textures:bloodparticle.png",1,1);
-       Sprite::snowflaketexture.load(":Data:Textures:snowflake.png",1,1);
-       Sprite::flametexture.load(":Data:Textures:flame.png",1,1);
-       Sprite::bloodflametexture.load(":Data:Textures:bloodflame.png",1,1);
-       Sprite::smoketexture.load(":Data:Textures:smoke.png",1,1);
-       Sprite::shinetexture.load(":Data:Textures:shine.png",1,0);
-       Sprite::splintertexture.load(":Data:Textures:splinter.png",1,1);
-       Sprite::leaftexture.load(":Data:Textures:leaf.png",1,1);
-       Sprite::toothtexture.load(":Data:Textures:tooth.png",1,1);
-
-       yaw=0;
-       pitch=0;
-       ReSizeGLScene(90,.01);
-
-       viewer=0;
-
-
-       if(detail)kTextureSize=1024;
-       if(detail==1)kTextureSize=512;
-       if(detail==0)kTextureSize=256;
-       
-       //Set up distant light
-       light.color[0]=.95;
-       light.color[1]=.95;
-       light.color[2]=1;
-       light.ambient[0]=.2;
-       light.ambient[1]=.2;
-       light.ambient[2]=.24;
-       light.location.x=1;
-       light.location.y=1;
-       light.location.z=-.2;
-       Normalise(&light.location);
-
-       LoadingScreen();
-
-       SetUpLighting();
-
-
-       fadestart=.6;
-       gravity=-10;
-
-       texscale=.2/megascale/viewdistdetail;
-       terrain.scale=3*megascale*viewdistdetail;
-
-       viewer.x=terrain.size/2*terrain.scale;
-       viewer.z=terrain.size/2*terrain.scale;
-
-       hawk.load((char *)":Data:Models:hawk.solid",1);
-       hawk.Scale(.03,.03,.03);
-       hawk.Rotate(90,1,1);
-       hawk.CalculateNormals(0);
-       hawk.ScaleNormals(-1,-1,-1);
-       hawkcoords.x=terrain.size/2*terrain.scale-5-7;
-       hawkcoords.z=terrain.size/2*terrain.scale-5-7;
-       hawkcoords.y=terrain.getHeight(hawkcoords.x,hawkcoords.z)+25;
-
-       eye.load((char *)":Data:Models:eye.solid",1);
-       eye.Scale(.03,.03,.03);
-       eye.CalculateNormals(0);
-
-       cornea.load((char *)":Data:Models:cornea.solid",1);
-       cornea.Scale(.03,.03,.03);
-       cornea.CalculateNormals(0);
-
-       iris.load((char *)":Data:Models:iris.solid",1);
-       iris.Scale(.03,.03,.03);
-       iris.CalculateNormals(0);
-
-       LoadSave(":Data:Textures:Bloodfur.png",0,1,&bloodText[0],0);
-       LoadSave(":Data:Textures:Wolfbloodfur.png",0,1,&wolfbloodText[0],0);
-
-       oldenvironment=-4;
-
-       gameon=1;
-       mainmenu=0;
-
-       firstload=0;
-
-       loadAllAnimations();
-       //Fix knife stab, too lazy to do it manually
-       XYZ moveamount;
-       moveamount=0;
-       moveamount.z=2;
-       for(i=0;i<player[0].skeleton.num_joints;i++){
-               for(j=0;j<animation[knifesneakattackanim].numframes;j++){
-                       animation[knifesneakattackanim].position[i][j]+=moveamount;
-               }
-       }
-
-       LoadingScreen();
-
-       for(i=0;i<player[0].skeleton.num_joints;i++){
-               for(j=0;j<animation[knifesneakattackedanim].numframes;j++){
-                       animation[knifesneakattackedanim].position[i][j]+=moveamount;
-               }
-       }
-
-       LoadingScreen();
-
-       for(i=0;i<player[0].skeleton.num_joints;i++){
-               animation[dead1anim].position[i][1]=animation[dead1anim].position[i][0];
-               animation[dead2anim].position[i][1]=animation[dead2anim].position[i][0];
-               animation[dead3anim].position[i][1]=animation[dead3anim].position[i][0];
-               animation[dead4anim].position[i][1]=animation[dead4anim].position[i][0];
-       }
-       animation[dead1anim].speed[0]=0.001;
-       animation[dead2anim].speed[0]=0.001;
-       animation[dead3anim].speed[0]=0.001;
-       animation[dead4anim].speed[0]=0.001;
-
-       animation[dead1anim].speed[1]=0.001;
-       animation[dead2anim].speed[1]=0.001;
-       animation[dead3anim].speed[1]=0.001;
-       animation[dead4anim].speed[1]=0.001;
-
-       for(i=0;i<player[0].skeleton.num_joints;i++){
-               for(j=0;j<animation[swordsneakattackanim].numframes;j++){
-                       animation[swordsneakattackanim].position[i][j]+=moveamount;
-               }
-       }
-       LoadingScreen();
-       for(j=0;j<animation[swordsneakattackanim].numframes;j++){
-               animation[swordsneakattackanim].weapontarget[j]+=moveamount;
-       }
-
-       LoadingScreen();
-
-       for(i=0;i<player[0].skeleton.num_joints;i++){
-               for(j=0;j<animation[swordsneakattackedanim].numframes;j++){
-                       animation[swordsneakattackedanim].position[i][j]+=moveamount;
-               }
-       }
-       
-       LoadingScreen();
-       temptexdetail=texdetail;
-       texdetail=1;
-       texdetail=temptexdetail;
-
-       LoadingScreen();
-
-       if(!screentexture){
+    static float temptexdetail;
+    static float viewdistdetail;
+    static int i, j;
+    float megascale = 1;
+
+    LOGFUNC;
+
+    loadtime = 0;
+
+    stillloading = 1;
+
+    for (i = 0; i < maxplayers; i++)
+        player[i].skeleton.drawmodel.textureptr.destroy();
+
+    i = abs(Random() % 4);
+    visibleloading = 0; //don't use loadscreentexture yet
+    loadscreentexture.load(":Data:Textures:fire.jpg", 1, 0);
+    visibleloading = 1;
+
+    temptexdetail = texdetail;
+    texdetail = 1;
+    text->LoadFontTexture(":Data:Textures:Font.png");
+    text->BuildFont();
+    texdetail = temptexdetail;
+
+    numsounds = 71;
+
+    viewdistdetail = 2;
+    viewdistance = 50 * megascale * viewdistdetail;
+
+    if (detail == 2) {
+        texdetail = 1;
+    }
+    if (detail == 1) {
+        texdetail = 2;
+    }
+    if (detail == 0) {
+        texdetail = 4;
+    }
+
+    realtexdetail = texdetail;
+
+    numplayers = 1;
+
+
+    LOG("Loading weapon data...");
+
+    Weapon::knifetextureptr.load(":Data:Textures:knife.png", 0, 1);
+    Weapon::bloodknifetextureptr.load(":Data:Textures:bloodknife.png", 0, 1);
+    Weapon::lightbloodknifetextureptr.load(":Data:Textures:lightbloodknife.png", 0, 1);
+    Weapon::swordtextureptr.load(":Data:Textures:sword.jpg", 1, 0);
+    Weapon::bloodswordtextureptr.load(":Data:Textures:Swordblood.jpg", 1, 0);
+    Weapon::lightbloodswordtextureptr.load(":Data:Textures:Swordbloodlight.jpg", 1, 0);
+    Weapon::stafftextureptr.load(":Data:Textures:Staff.jpg", 1, 0);
+
+    Weapon::throwingknifemodel.load((char *)":Data:Models:throwingknife.solid", 1);
+    Weapon::throwingknifemodel.Scale(.001, .001, .001);
+    //Weapon::throwingknifemodel.Rotate(0,0,-90);
+    Weapon::throwingknifemodel.Rotate(90, 0, 0);
+    Weapon::throwingknifemodel.Rotate(0, 90, 0);
+    Weapon::throwingknifemodel.flat = 0;
+    Weapon::throwingknifemodel.CalculateNormals(1);
+    //Weapon::throwingknifemodel.ScaleNormals(-1,-1,-1);
+
+    Weapon::swordmodel.load((char *)":Data:Models:sword.solid", 1);
+    Weapon::swordmodel.Scale(.001, .001, .001);
+    //Weapon::swordmodel.Rotate(0,0,-90);
+    Weapon::swordmodel.Rotate(90, 0, 0);
+    Weapon::swordmodel.Rotate(0, 90, 0);
+    Weapon::swordmodel.Rotate(0, 0, 90);
+    Weapon::swordmodel.flat = 1;
+    Weapon::swordmodel.CalculateNormals(1);
+    //Weapon::swordmodel.ScaleNormals(-1,-1,-1);
+
+    Weapon::staffmodel.load((char *)":Data:Models:staff.solid", 1);
+    Weapon::staffmodel.Scale(.005, .005, .005);
+    //Weapon::staffmodel.Rotate(0,0,-90);
+    Weapon::staffmodel.Rotate(90, 0, 0);
+    Weapon::staffmodel.Rotate(0, 90, 0);
+    Weapon::staffmodel.Rotate(0, 0, 90);
+    Weapon::staffmodel.flat = 1;
+    Weapon::staffmodel.CalculateNormals(1);
+    //Weapon::staffmodel.ScaleNormals(-1,-1,-1);
+
+    terrain.shadowtexture.load(":Data:Textures:shadow.png", 0, 1);
+    terrain.bloodtexture.load(":Data:Textures:blood.png", 0, 1);
+    terrain.breaktexture.load(":Data:Textures:break.png", 0, 1);
+    terrain.bloodtexture2.load(":Data:Textures:blood.png", 0, 1);
+
+
+    terrain.footprinttexture.load(":Data:Textures:footprint.png", 0, 1);
+    terrain.bodyprinttexture.load(":Data:Textures:bodyprint.png", 0, 1);
+    hawktexture.load(":Data:Textures:hawk.png", 0, 1);
+
+
+    Sprite::cloudtexture.load(":Data:Textures:cloud.png", 1, 1);
+    Sprite::cloudimpacttexture.load(":Data:Textures:cloudimpact.png", 1, 1);
+    Sprite::bloodtexture.load(":Data:Textures:bloodparticle.png", 1, 1);
+    Sprite::snowflaketexture.load(":Data:Textures:snowflake.png", 1, 1);
+    Sprite::flametexture.load(":Data:Textures:flame.png", 1, 1);
+    Sprite::bloodflametexture.load(":Data:Textures:bloodflame.png", 1, 1);
+    Sprite::smoketexture.load(":Data:Textures:smoke.png", 1, 1);
+    Sprite::shinetexture.load(":Data:Textures:shine.png", 1, 0);
+    Sprite::splintertexture.load(":Data:Textures:splinter.png", 1, 1);
+    Sprite::leaftexture.load(":Data:Textures:leaf.png", 1, 1);
+    Sprite::toothtexture.load(":Data:Textures:tooth.png", 1, 1);
+
+    yaw = 0;
+    pitch = 0;
+    ReSizeGLScene(90, .01);
+
+    viewer = 0;
+
+
+    if (detail)kTextureSize = 1024;
+    if (detail == 1)kTextureSize = 512;
+    if (detail == 0)kTextureSize = 256;
+
+    //Set up distant light
+    light.color[0] = .95;
+    light.color[1] = .95;
+    light.color[2] = 1;
+    light.ambient[0] = .2;
+    light.ambient[1] = .2;
+    light.ambient[2] = .24;
+    light.location.x = 1;
+    light.location.y = 1;
+    light.location.z = -.2;
+    Normalise(&light.location);
+
+    LoadingScreen();
+
+    SetUpLighting();
+
+
+    fadestart = .6;
+    gravity = -10;
+
+    texscale = .2 / megascale / viewdistdetail;
+    terrain.scale = 3 * megascale * viewdistdetail;
+
+    viewer.x = terrain.size / 2 * terrain.scale;
+    viewer.z = terrain.size / 2 * terrain.scale;
+
+    hawk.load((char *)":Data:Models:hawk.solid", 1);
+    hawk.Scale(.03, .03, .03);
+    hawk.Rotate(90, 1, 1);
+    hawk.CalculateNormals(0);
+    hawk.ScaleNormals(-1, -1, -1);
+    hawkcoords.x = terrain.size / 2 * terrain.scale - 5 - 7;
+    hawkcoords.z = terrain.size / 2 * terrain.scale - 5 - 7;
+    hawkcoords.y = terrain.getHeight(hawkcoords.x, hawkcoords.z) + 25;
+
+    eye.load((char *)":Data:Models:eye.solid", 1);
+    eye.Scale(.03, .03, .03);
+    eye.CalculateNormals(0);
+
+    cornea.load((char *)":Data:Models:cornea.solid", 1);
+    cornea.Scale(.03, .03, .03);
+    cornea.CalculateNormals(0);
+
+    iris.load((char *)":Data:Models:iris.solid", 1);
+    iris.Scale(.03, .03, .03);
+    iris.CalculateNormals(0);
+
+    LoadSave(":Data:Textures:Bloodfur.png", 0, 1, &bloodText[0], 0);
+    LoadSave(":Data:Textures:Wolfbloodfur.png", 0, 1, &wolfbloodText[0], 0);
+
+    oldenvironment = -4;
+
+    gameon = 1;
+    mainmenu = 0;
+
+    firstload = 0;
+
+    loadAllAnimations();
+    //Fix knife stab, too lazy to do it manually
+    XYZ moveamount;
+    moveamount = 0;
+    moveamount.z = 2;
+    for (i = 0; i < player[0].skeleton.num_joints; i++) {
+        for (j = 0; j < animation[knifesneakattackanim].numframes; j++) {
+            animation[knifesneakattackanim].position[i][j] += moveamount;
+        }
+    }
+
+    LoadingScreen();
+
+    for (i = 0; i < player[0].skeleton.num_joints; i++) {
+        for (j = 0; j < animation[knifesneakattackedanim].numframes; j++) {
+            animation[knifesneakattackedanim].position[i][j] += moveamount;
+        }
+    }
+
+    LoadingScreen();
+
+    for (i = 0; i < player[0].skeleton.num_joints; i++) {
+        animation[dead1anim].position[i][1] = animation[dead1anim].position[i][0];
+        animation[dead2anim].position[i][1] = animation[dead2anim].position[i][0];
+        animation[dead3anim].position[i][1] = animation[dead3anim].position[i][0];
+        animation[dead4anim].position[i][1] = animation[dead4anim].position[i][0];
+    }
+    animation[dead1anim].speed[0] = 0.001;
+    animation[dead2anim].speed[0] = 0.001;
+    animation[dead3anim].speed[0] = 0.001;
+    animation[dead4anim].speed[0] = 0.001;
+
+    animation[dead1anim].speed[1] = 0.001;
+    animation[dead2anim].speed[1] = 0.001;
+    animation[dead3anim].speed[1] = 0.001;
+    animation[dead4anim].speed[1] = 0.001;
+
+    for (i = 0; i < player[0].skeleton.num_joints; i++) {
+        for (j = 0; j < animation[swordsneakattackanim].numframes; j++) {
+            animation[swordsneakattackanim].position[i][j] += moveamount;
+        }
+    }
+    LoadingScreen();
+    for (j = 0; j < animation[swordsneakattackanim].numframes; j++) {
+        animation[swordsneakattackanim].weapontarget[j] += moveamount;
+    }
+
+    LoadingScreen();
+
+    for (i = 0; i < player[0].skeleton.num_joints; i++) {
+        for (j = 0; j < animation[swordsneakattackedanim].numframes; j++) {
+            animation[swordsneakattackedanim].position[i][j] += moveamount;
+        }
+    }
+
+    LoadingScreen();
+    temptexdetail = texdetail;
+    texdetail = 1;
+    texdetail = temptexdetail;
+
+    LoadingScreen();
+
+    if (!screentexture) {
         LoadScreenTexture();
-       }
+    }
 
-       if(targetlevel!=7){
-               emit_sound_at(fireendsound);
-       }
+    if (targetlevel != 7) {
+        emit_sound_at(fireendsound);
+    }
 
-       stillloading=0;
-       loading=0;
-       changedelay=1;
+    stillloading = 0;
+    loading = 0;
+    changedelay = 1;
 
-       visibleloading=0;
+    visibleloading = 0;
 }
 
index 2cd513a952fe556f2eef614c7c43fdbc5d0aaed4..806d24e16c63f9af5d5189f22cadcd7d52a25dbd 100644 (file)
@@ -45,8 +45,8 @@ using namespace Game;
 
 // Added more evilness needed for MSVC
 #ifdef _MSC_VER
-       #define strncasecmp(s1, s2, n) _strnicmp(s1, s2, n)
-       #define snprintf(buf, size, format, ...) _sprintf_p(buf, size, format)
+#define strncasecmp(s1, s2, n) _strnicmp(s1, s2, n)
+#define snprintf(buf, size, format, ...) _sprintf_p(buf, size, format)
 #endif
 
 
@@ -54,7 +54,7 @@ extern float multiplier;
 extern XYZ viewer;
 extern int environment;
 extern Terrain terrain;
-extern float screenwidth,screenheight;
+extern float screenwidth, screenheight;
 extern float gravity;
 extern int detail;
 extern float texdetail;
@@ -95,7 +95,7 @@ extern float usermousesensitivity;
 extern bool ismotionblur;
 extern bool showdamagebar; // (des)activate the damage bar
 extern bool decals;
-extern float tintr,tintg,tintb;
+extern float tintr, tintg, tintb;
 extern bool skyboxtexture;
 extern float skyboxr;
 extern float skyboxg;
@@ -148,67 +148,80 @@ void Loadlevel(const char *name);
 
 
 
-class CampaignLevel {
+class CampaignLevel
+{
 private:
-       int width;
-       struct Position { int x,y; };
-public: 
-       std::string mapname;
-       std::string description;
-       int choosenext;
-               /*      
-               0 = Immediately load next level at the end of this one.
-               1 = Go back to the world map.
-               2 = Don't bring up the Fiery loading screen. Maybe other things, I've not investigated.
-               */
-       //int numnext; // 0 on final level. As David said: he meant to add story branching, but he eventually hadn't. 
-       std::vector<int> nextlevel;
-       Position location;
-       CampaignLevel() : width(10) {
-               choosenext = 1;
-               location.x = 0;
-               location.y = 0;
-       }
-       int getStartX() { return 30+120+location.x*400/512; }
-       int getStartY() { return 30+30+(512-location.y)*400/512; }
-       int getEndX() { return getStartX()+width; }
-       int getEndY() { return getStartY()+width; }
-       XYZ getCenter() {
-               XYZ center;
-               center.x=getStartX()+width/2;
-               center.y=getStartY()+width/2;
-               return center;
-       }
-       int getWidth() { return width; }
-       istream& operator<< (istream& is) {
-               is.ignore(256,':');
-               is.ignore(256,':');
-               is.ignore(256,' ');
-               is >> mapname;
-               is.ignore(256,':');
-               is >> description;
-               for(int pos = description.find('_');pos!=string::npos;pos = description.find('_',pos)) {
-                       description.replace(pos,1,1,' ');
-               }
-               is.ignore(256,':');
-               is >> choosenext;
-               is.ignore(256,':');
-               int numnext,next;
-               is >> numnext;
-               for(int j=0;j<numnext;j++) {
-                       is.ignore(256,':');
-                       is >> next;
-                       nextlevel.push_back(next-1);
-               }
-               is.ignore(256,':');
-               is >> location.x;
-               is.ignore(256,':');
-               is >> location.y;
-               return is;
-       }
-       friend istream& operator>> (istream& is, CampaignLevel& cl) {
-               return cl << is;
-       }
+    int width;
+    struct Position {
+        int x, y;
+    };
+public:
+    std::string mapname;
+    std::string description;
+    int choosenext;
+    /*
+    0 = Immediately load next level at the end of this one.
+    1 = Go back to the world map.
+    2 = Don't bring up the Fiery loading screen. Maybe other things, I've not investigated.
+    */
+    //int numnext; // 0 on final level. As David said: he meant to add story branching, but he eventually hadn't.
+    std::vector<int> nextlevel;
+    Position location;
+    CampaignLevel() : width(10) {
+        choosenext = 1;
+        location.x = 0;
+        location.y = 0;
+    }
+    int getStartX() {
+        return 30 + 120 + location.x * 400 / 512;
+    }
+    int getStartY() {
+        return 30 + 30 + (512 - location.y) * 400 / 512;
+    }
+    int getEndX() {
+        return getStartX() + width;
+    }
+    int getEndY() {
+        return getStartY() + width;
+    }
+    XYZ getCenter() {
+        XYZ center;
+        center.x = getStartX() + width / 2;
+        center.y = getStartY() + width / 2;
+        return center;
+    }
+    int getWidth() {
+        return width;
+    }
+    istream& operator<< (istream& is) {
+        is.ignore(256, ':');
+        is.ignore(256, ':');
+        is.ignore(256, ' ');
+        is >> mapname;
+        is.ignore(256, ':');
+        is >> description;
+        for (int pos = description.find('_'); pos != string::npos; pos = description.find('_', pos)) {
+            description.replace(pos, 1, 1, ' ');
+        }
+        is.ignore(256, ':');
+        is >> choosenext;
+        is.ignore(256, ':');
+        int numnext, next;
+        is >> numnext;
+        for (int j = 0; j < numnext; j++) {
+            is.ignore(256, ':');
+            is >> next;
+            nextlevel.push_back(next - 1);
+        }
+        is.ignore(256, ':');
+        is >> location.x;
+        is.ignore(256, ':');
+        is >> location.y;
+        return is;
+    }
+    friend istream& operator>> (istream& is, CampaignLevel& cl) {
+        return cl << is;
+    }
 };
 
 int indemo = 0;
@@ -231,22 +244,22 @@ int musicselected = 0;
 
 
 static const char *rabbitskin[] = {
-":Data:Textures:Fur3.jpg",
-":Data:Textures:Fur.jpg",
-":Data:Textures:Fur2.jpg",
-":Data:Textures:Lynx.jpg",
-":Data:Textures:Otter.jpg",
-":Data:Textures:Opal.jpg",
-":Data:Textures:Sable.jpg",
-":Data:Textures:Chocolate.jpg",
-":Data:Textures:BW2.jpg",
-":Data:Textures:WB2.jpg"
+    ":Data:Textures:Fur3.jpg",
+    ":Data:Textures:Fur.jpg",
+    ":Data:Textures:Fur2.jpg",
+    ":Data:Textures:Lynx.jpg",
+    ":Data:Textures:Otter.jpg",
+    ":Data:Textures:Opal.jpg",
+    ":Data:Textures:Sable.jpg",
+    ":Data:Textures:Chocolate.jpg",
+    ":Data:Textures:BW2.jpg",
+    ":Data:Textures:WB2.jpg"
 };
 
 static const char *wolfskin[] = {
-":Data:Textures:Wolf.jpg",
-":Data:Textures:Darkwolf.jpg",
-":Data:Textures:Snowwolf.jpg"
+    ":Data:Textures:Wolf.jpg",
+    ":Data:Textures:Darkwolf.jpg",
+    ":Data:Textures:Snowwolf.jpg"
 };
 
 #define STATIC_ASSERT(x) extern int s_a_dummy[2 * (!!(x)) - 1];
@@ -257,7 +270,7 @@ static const char **creatureskin[] = {rabbitskin, wolfskin};
 /* Return true if PFX is a prefix of STR (case-insensitive).  */
 static bool stripfx(const char *str, const char *pfx)
 {
-  return !strncasecmp(str, pfx, strlen(pfx));
+    return !strncasecmp(str, pfx, strlen(pfx));
 }
 
 static const char *cmd_names[] = {
@@ -283,130 +296,183 @@ static console_handler cmd_handlers[] = {
 // utility functions
 
 // TODO: this is slightly incorrect
-inline float roughDirection(XYZ vec){
+inline float roughDirection(XYZ vec)
+{
     Normalise(&vec);
-    float angle=-asin(-vec.x)*180/M_PI;
-    if(vec.z<0)
-        angle=180-angle;
+    float angle = -asin(-vec.x) * 180 / M_PI;
+    if (vec.z < 0)
+        angle = 180 - angle;
     return angle;
 }
-inline float roughDirectionTo(XYZ start, XYZ end){
-    return roughDirection(end-start);
+inline float roughDirectionTo(XYZ start, XYZ end)
+{
+    return roughDirection(end - start);
 }
-inline float pitchOf(XYZ vec){
+inline float pitchOf(XYZ vec)
+{
     Normalise(&vec);
-    return -asin(vec.y)*180/M_PI;
+    return -asin(vec.y) * 180 / M_PI;
+}
+inline float pitchTo(XYZ start, XYZ end)
+{
+    return pitchOf(end - start);
 }
-inline float pitchTo(XYZ start, XYZ end){
-    return pitchOf(end-start);
+inline float sq(float n)
+{
+    return n * n;
 }
-inline float sq(float n) { return n*n; }
-inline float stepTowardf(float from, float to, float by){
-    if(fabs(from-to)<by) return to;
-    else if(from>to) return from-by;
-    else return from+by;
+inline float stepTowardf(float from, float to, float by)
+{
+    if (fabs(from - to) < by) return to;
+    else if (from > to) return from - by;
+    else return from + by;
 }
 
-void playdialogueboxsound(){
+void playdialogueboxsound()
+{
     XYZ temppos;
-    temppos=player[participantfocus[whichdialogue][indialogue]].coords;
-    temppos=temppos-viewer;
+    temppos = player[participantfocus[whichdialogue][indialogue]].coords;
+    temppos = temppos - viewer;
     Normalise(&temppos);
-    temppos+=viewer;
-
-    int sound=-1;
-    switch(dialogueboxsound[whichdialogue][indialogue]){
-        case -6: sound=alarmsound; break;
-        case -4: sound=consolefailsound; break;
-        case -3: sound=consolesuccesssound; break;
-        case -2: sound=firestartsound; break;
-        case -1: sound=fireendsound; break;
-        case 1: sound=rabbitchitter; break;
-        case 2: sound=rabbitchitter2; break;
-        case 3: sound=rabbitpainsound; break;
-        case 4: sound=rabbitpain1sound; break;
-        case 5: sound=rabbitattacksound; break;
-        case 6: sound=rabbitattack2sound; break;
-        case 7: sound=rabbitattack3sound; break;
-        case 8: sound=rabbitattack4sound; break;
-        case 9: sound=growlsound; break;
-        case 10: sound=growl2sound; break;
-        case 11: sound=snarlsound; break;
-        case 12: sound=snarl2sound; break;
-        case 13: sound=barksound; break;
-        case 14: sound=bark2sound; break;
-        case 15: sound=bark3sound; break;
-        case 16: sound=barkgrowlsound; break;
-        default: break;
+    temppos += viewer;
+
+    int sound = -1;
+    switch (dialogueboxsound[whichdialogue][indialogue]) {
+    case -6:
+        sound = alarmsound;
+        break;
+    case -4:
+        sound = consolefailsound;
+        break;
+    case -3:
+        sound = consolesuccesssound;
+        break;
+    case -2:
+        sound = firestartsound;
+        break;
+    case -1:
+        sound = fireendsound;
+        break;
+    case 1:
+        sound = rabbitchitter;
+        break;
+    case 2:
+        sound = rabbitchitter2;
+        break;
+    case 3:
+        sound = rabbitpainsound;
+        break;
+    case 4:
+        sound = rabbitpain1sound;
+        break;
+    case 5:
+        sound = rabbitattacksound;
+        break;
+    case 6:
+        sound = rabbitattack2sound;
+        break;
+    case 7:
+        sound = rabbitattack3sound;
+        break;
+    case 8:
+        sound = rabbitattack4sound;
+        break;
+    case 9:
+        sound = growlsound;
+        break;
+    case 10:
+        sound = growl2sound;
+        break;
+    case 11:
+        sound = snarlsound;
+        break;
+    case 12:
+        sound = snarl2sound;
+        break;
+    case 13:
+        sound = barksound;
+        break;
+    case 14:
+        sound = bark2sound;
+        break;
+    case 15:
+        sound = bark3sound;
+        break;
+    case 16:
+        sound = barkgrowlsound;
+        break;
+    default:
+        break;
     }
-    if(sound!=-1)
+    if (sound != -1)
         emit_sound_at(sound, temppos);
 }
 
 // ================================================================
 
-bool AddClothes(const char *fileName, GLubyte *array) {
-       LOGFUNC;
-       //Load Image
-       unsigned char fileNamep[256];
-       CopyCStringToPascal(fileName,fileNamep);
-       bool opened;
-       opened=upload_image( fileNamep ,1);
-
-       float alphanum;
-       //Is it valid?
-       if(opened){
-               if(tintr>1)tintr=1;
-               if(tintg>1)tintg=1;
-               if(tintb>1)tintb=1;
-
-               if(tintr<0)tintr=0;
-               if(tintg<0)tintg=0;
-               if(tintb<0)tintb=0;
-
-               int bytesPerPixel=texture.bpp/8;
-
-               int tempnum=0;
-               alphanum=255;
-               for(int i=0;i<(int)(texture.sizeY*texture.sizeX*bytesPerPixel);i++){
-                       if(bytesPerPixel==3)alphanum=255;
-                       else if((i+1)%4==0)alphanum=texture.data[i];
-                       //alphanum/=2;
-                       if((i+1)%4||bytesPerPixel==3){
-                               if((i%4)==0)texture.data[i]*=tintr;
-                               if((i%4)==1)texture.data[i]*=tintg;
-                               if((i%4)==2)texture.data[i]*=tintb;
-                               array[tempnum]=(float)array[tempnum]*(1-alphanum/255)+(float)texture.data[i]*(alphanum/255);
-                               tempnum++;
-                       }
-               }
-       }
-       else return 0;
-       return 1;
+bool AddClothes(const char *fileName, GLubyte *array)
+{
+    LOGFUNC;
+    //Load Image
+    unsigned char fileNamep[256];
+    CopyCStringToPascal(fileName, fileNamep);
+    bool opened;
+    opened = upload_image( fileNamep , 1);
+
+    float alphanum;
+    //Is it valid?
+    if (opened) {
+        if (tintr > 1)tintr = 1;
+        if (tintg > 1)tintg = 1;
+        if (tintb > 1)tintb = 1;
+
+        if (tintr < 0)tintr = 0;
+        if (tintg < 0)tintg = 0;
+        if (tintb < 0)tintb = 0;
+
+        int bytesPerPixel = texture.bpp / 8;
+
+        int tempnum = 0;
+        alphanum = 255;
+        for (int i = 0; i < (int)(texture.sizeY * texture.sizeX * bytesPerPixel); i++) {
+            if (bytesPerPixel == 3)alphanum = 255;
+            else if ((i + 1) % 4 == 0)alphanum = texture.data[i];
+            //alphanum/=2;
+            if ((i + 1) % 4 || bytesPerPixel == 3) {
+                if ((i % 4) == 0)texture.data[i] *= tintr;
+                if ((i % 4) == 1)texture.data[i] *= tintg;
+                if ((i % 4) == 2)texture.data[i] *= tintb;
+                array[tempnum] = (float)array[tempnum] * (1 - alphanum / 255) + (float)texture.data[i] * (alphanum / 255);
+                tempnum++;
+            }
+        }
+    } else return 0;
+    return 1;
 }
 
 
 
 static void ch_quit(const char *args)
 {
-  tryquit = 1;
+    tryquit = 1;
 }
 
 static void ch_map(const char *args)
 {
-  Loadlevel(args);
-  whichlevel = -2;
-  campaign = 0;
+    Loadlevel(args);
+    whichlevel = -2;
+    campaign = 0;
 }
 
-static void ch_save(const char *args){
+static void ch_save(const char *args)
+{
     char buf[64];
     snprintf(buf, 63, ":Data:Maps:%s", args);
 
     int mapvers = 12;
 
     FILE *tfile;
-    tfile=fopen( ConvertFileName(buf), "wb" );
+    tfile = fopen( ConvertFileName(buf), "wb" );
     fpackf(tfile, "Bi", mapvers);
     fpackf(tfile, "Bi", maptype);
     fpackf(tfile, "Bi", hostile);
@@ -414,10 +480,10 @@ static void ch_save(const char *args){
     fpackf(tfile, "Bb Bf Bf Bf", skyboxtexture, skyboxr, skyboxg, skyboxb);
     fpackf(tfile, "Bf Bf Bf", skyboxlightr, skyboxlightg, skyboxlightb);
     fpackf(tfile, "Bf Bf Bf Bf Bf Bi", player[0].coords.x, player[0].coords.y, player[0].coords.z,
-            player[0].yaw, player[0].targetyaw, player[0].num_weapons);
-    if(player[0].num_weapons>0&&player[0].num_weapons<5)
-        for(int j=0;j<player[0].num_weapons;j++)
-          fpackf(tfile, "Bi", weapons[player[0].weaponids[j]].getType());
+           player[0].yaw, player[0].targetyaw, player[0].num_weapons);
+    if (player[0].num_weapons > 0 && player[0].num_weapons < 5)
+        for (int j = 0; j < player[0].num_weapons; j++)
+            fpackf(tfile, "Bi", weapons[player[0].weaponids[j]].getType());
 
     fpackf(tfile, "Bf Bf Bf", player[0].armorhead, player[0].armorhigh, player[0].armorlow);
     fpackf(tfile, "Bf Bf Bf", player[0].protectionhead, player[0].protectionhigh, player[0].protectionlow);
@@ -430,93 +496,93 @@ static void ch_save(const char *args){
 
     fpackf(tfile, "Bi", numdialogues);
 
-       for(int k=0;k<numdialogues;k++){
-               fpackf(tfile, "Bi", numdialogueboxes[k]);
-               fpackf(tfile, "Bi", dialoguetype[k]);
-               for(int l=0;l<10;l++){
-                       fpackf(tfile, "Bf Bf Bf", participantlocation[k][l].x, participantlocation[k][l].y, participantlocation[k][l].z);
-                       fpackf(tfile, "Bf", participantyaw[k][l]);
-               }
-               for(int l=0;l<numdialogueboxes[k];l++){
-                       fpackf(tfile, "Bi", dialogueboxlocation[k][l]);
-                       fpackf(tfile, "Bf", dialogueboxcolor[k][l][0]);
-                       fpackf(tfile, "Bf", dialogueboxcolor[k][l][1]);
-                       fpackf(tfile, "Bf", dialogueboxcolor[k][l][2]);
-                       fpackf(tfile, "Bi", dialogueboxsound[k][l]);
-
-                       int templength=strlen(dialoguetext[k][l]);
-                       fpackf(tfile, "Bi",(templength));
-                       for(int m=0;m<templength;m++){
-                               fpackf(tfile, "Bb", dialoguetext[k][l][m]);
-                               if(dialoguetext[k][l][m]=='\0')
+    for (int k = 0; k < numdialogues; k++) {
+        fpackf(tfile, "Bi", numdialogueboxes[k]);
+        fpackf(tfile, "Bi", dialoguetype[k]);
+        for (int l = 0; l < 10; l++) {
+            fpackf(tfile, "Bf Bf Bf", participantlocation[k][l].x, participantlocation[k][l].y, participantlocation[k][l].z);
+            fpackf(tfile, "Bf", participantyaw[k][l]);
+        }
+        for (int l = 0; l < numdialogueboxes[k]; l++) {
+            fpackf(tfile, "Bi", dialogueboxlocation[k][l]);
+            fpackf(tfile, "Bf", dialogueboxcolor[k][l][0]);
+            fpackf(tfile, "Bf", dialogueboxcolor[k][l][1]);
+            fpackf(tfile, "Bf", dialogueboxcolor[k][l][2]);
+            fpackf(tfile, "Bi", dialogueboxsound[k][l]);
+
+            int templength = strlen(dialoguetext[k][l]);
+            fpackf(tfile, "Bi", (templength));
+            for (int m = 0; m < templength; m++) {
+                fpackf(tfile, "Bb", dialoguetext[k][l][m]);
+                if (dialoguetext[k][l][m] == '\0')
                     break;
-                       }
+            }
 
-                       templength=strlen(dialoguename[k][l]);
-                       fpackf(tfile, "Bi",templength);
-                       for(int m=0;m<templength;m++){
-                               fpackf(tfile, "Bb", dialoguename[k][l][m]);
-                               if(dialoguename[k][l][m]=='\0')
+            templength = strlen(dialoguename[k][l]);
+            fpackf(tfile, "Bi", templength);
+            for (int m = 0; m < templength; m++) {
+                fpackf(tfile, "Bb", dialoguename[k][l][m]);
+                if (dialoguename[k][l][m] == '\0')
                     break;
-                       }
+            }
 
-                       fpackf(tfile, "Bf Bf Bf", dialoguecamera[k][l].x, dialoguecamera[k][l].y, dialoguecamera[k][l].z);
-                       fpackf(tfile, "Bi", participantfocus[k][l]);
-                       fpackf(tfile, "Bi", participantaction[k][l]);
+            fpackf(tfile, "Bf Bf Bf", dialoguecamera[k][l].x, dialoguecamera[k][l].y, dialoguecamera[k][l].z);
+            fpackf(tfile, "Bi", participantfocus[k][l]);
+            fpackf(tfile, "Bi", participantaction[k][l]);
 
-                       for(int m=0;m<10;m++)
-                               fpackf(tfile, "Bf Bf Bf", participantfacing[k][l][m].x, participantfacing[k][l][m].y, participantfacing[k][l][m].z);
+            for (int m = 0; m < 10; m++)
+                fpackf(tfile, "Bf Bf Bf", participantfacing[k][l][m].x, participantfacing[k][l][m].y, participantfacing[k][l][m].z);
 
-                       fpackf(tfile, "Bf Bf",dialoguecamerayaw[k][l],dialoguecamerapitch[k][l]);
-               }
-       }
+            fpackf(tfile, "Bf Bf", dialoguecamerayaw[k][l], dialoguecamerapitch[k][l]);
+        }
+    }
 
-       for(int k=0;k<player[0].numclothes;k++){
-               int templength=strlen(player[0].clothes[k]);
-               fpackf(tfile, "Bi", templength);
-               for(int l=0;l<templength;l++)
-                       fpackf(tfile, "Bb", player[0].clothes[k][l]);
-               fpackf(tfile, "Bf Bf Bf", player[0].clothestintr[k], player[0].clothestintg[k], player[0].clothestintb[k]);
-       }
+    for (int k = 0; k < player[0].numclothes; k++) {
+        int templength = strlen(player[0].clothes[k]);
+        fpackf(tfile, "Bi", templength);
+        for (int l = 0; l < templength; l++)
+            fpackf(tfile, "Bb", player[0].clothes[k][l]);
+        fpackf(tfile, "Bf Bf Bf", player[0].clothestintr[k], player[0].clothestintg[k], player[0].clothestintb[k]);
+    }
 
     fpackf(tfile, "Bi", environment);
 
     fpackf(tfile, "Bi", objects.numobjects);
 
-    for(int k=0;k<objects.numobjects;k++)
+    for (int k = 0; k < objects.numobjects; k++)
         fpackf(tfile, "Bi Bf Bf Bf Bf Bf Bf", objects.type[k], objects.yaw[k], objects.pitch[k],
-            objects.position[k].x, objects.position[k].y, objects.position[k].z, objects.scale[k]);
+               objects.position[k].x, objects.position[k].y, objects.position[k].z, objects.scale[k]);
 
     fpackf(tfile, "Bi", numhotspots);
-       for(int i=0;i<numhotspots;i++){
-               fpackf(tfile, "Bi Bf Bf Bf Bf", hotspottype[i],hotspotsize[i],hotspot[i].x,hotspot[i].y,hotspot[i].z);
-               int templength=strlen(hotspottext[i]);
-               fpackf(tfile, "Bi",templength);
-               for(int l=0;l<templength;l++)
-                       fpackf(tfile, "Bb", hotspottext[i][l]);
-       }
+    for (int i = 0; i < numhotspots; i++) {
+        fpackf(tfile, "Bi Bf Bf Bf Bf", hotspottype[i], hotspotsize[i], hotspot[i].x, hotspot[i].y, hotspot[i].z);
+        int templength = strlen(hotspottext[i]);
+        fpackf(tfile, "Bi", templength);
+        for (int l = 0; l < templength; l++)
+            fpackf(tfile, "Bb", hotspottext[i][l]);
+    }
 
     fpackf(tfile, "Bi", numplayers);
-    if(numplayers<maxplayers)
-        for(int j=1;j<numplayers;j++){
+    if (numplayers < maxplayers)
+        for (int j = 1; j < numplayers; j++) {
             fpackf(tfile, "Bi Bi Bf Bf Bf Bi Bi Bf Bb Bf", player[j].whichskin, player[j].creature,
-                    player[j].coords.x, player[j].coords.y, player[j].coords.z,
-                    player[j].num_weapons, player[j].howactive, player[j].scale, player[j].immobile, player[j].yaw);
-            if(player[j].num_weapons<5)
-                for(int k=0;k<player[j].num_weapons;k++)
+                   player[j].coords.x, player[j].coords.y, player[j].coords.z,
+                   player[j].num_weapons, player[j].howactive, player[j].scale, player[j].immobile, player[j].yaw);
+            if (player[j].num_weapons < 5)
+                for (int k = 0; k < player[j].num_weapons; k++)
                     fpackf(tfile, "Bi", weapons[player[j].weaponids[k]].getType());
-            if(player[j].numwaypoints<30){
+            if (player[j].numwaypoints < 30) {
                 fpackf(tfile, "Bi", player[j].numwaypoints);
-                for(int k=0;k<player[j].numwaypoints;k++){
+                for (int k = 0; k < player[j].numwaypoints; k++) {
                     fpackf(tfile, "Bf", player[j].waypoints[k].x);
                     fpackf(tfile, "Bf", player[j].waypoints[k].y);
                     fpackf(tfile, "Bf", player[j].waypoints[k].z);
                     fpackf(tfile, "Bi", player[j].waypointtype[k]);
                 }
                 fpackf(tfile, "Bi", player[j].waypoint);
-            }else{
-                player[j].numwaypoints=0;
-                player[j].waypoint=0;
+            } else {
+                player[j].numwaypoints = 0;
+                player[j].waypoint = 0;
                 fpackf(tfile, "Bi Bi Bi", player[j].numwaypoints, player[j].waypoint, player[j].waypoint);
             }
 
@@ -526,38 +592,38 @@ static void ch_save(const char *args){
             fpackf(tfile, "Bf Bf", player[j].power, player[j].speedmult);
 
             float headprop, bodyprop, armprop, legprop;
-            if(player[j].creature==wolftype){
-                headprop=player[j].proportionhead.x/1.1;
-                bodyprop=player[j].proportionbody.x/1.1;
-                armprop=player[j].proportionarms.x/1.1;
-                legprop=player[j].proportionlegs.x/1.1;
-            }else if(player[j].creature==rabbittype){
-                headprop=player[j].proportionhead.x/1.2;
-                bodyprop=player[j].proportionbody.x/1.05;
-                armprop=player[j].proportionarms.x/1.00;
-                legprop=player[j].proportionlegs.x/1.1;
+            if (player[j].creature == wolftype) {
+                headprop = player[j].proportionhead.x / 1.1;
+                bodyprop = player[j].proportionbody.x / 1.1;
+                armprop = player[j].proportionarms.x / 1.1;
+                legprop = player[j].proportionlegs.x / 1.1;
+            } else if (player[j].creature == rabbittype) {
+                headprop = player[j].proportionhead.x / 1.2;
+                bodyprop = player[j].proportionbody.x / 1.05;
+                armprop = player[j].proportionarms.x / 1.00;
+                legprop = player[j].proportionlegs.x / 1.1;
             }
 
             fpackf(tfile, "Bf Bf Bf Bf", headprop, bodyprop, armprop, legprop);
 
             fpackf(tfile, "Bi", player[j].numclothes);
-            if(player[j].numclothes)
-                for(int k=0;k<player[j].numclothes;k++){
+            if (player[j].numclothes)
+                for (int k = 0; k < player[j].numclothes; k++) {
                     int templength;
-                    templength=strlen(player[j].clothes[k]);
+                    templength = strlen(player[j].clothes[k]);
                     fpackf(tfile, "Bi", templength);
-                    for(int l=0;l<templength;l++)
+                    for (int l = 0; l < templength; l++)
                         fpackf(tfile, "Bb", player[j].clothes[k][l]);
                     fpackf(tfile, "Bf Bf Bf", player[j].clothestintr[k], player[j].clothestintg[k], player[j].clothestintb[k]);
                 }
         }
 
     fpackf(tfile, "Bi", numpathpoints);
-       for(int j=0;j<numpathpoints;j++){
-               fpackf(tfile, "Bf Bf Bf Bi", pathpoint[j].x, pathpoint[j].y, pathpoint[j].z, numpathpointconnect[j]);
-               for(int k=0;k<numpathpointconnect[j];k++)
-                       fpackf(tfile, "Bi", pathpointconnect[j][k]);
-       }
+    for (int j = 0; j < numpathpoints; j++) {
+        fpackf(tfile, "Bf Bf Bf Bi", pathpoint[j].x, pathpoint[j].y, pathpoint[j].z, numpathpointconnect[j]);
+        for (int k = 0; k < numpathpointconnect[j]; k++)
+            fpackf(tfile, "Bi", pathpointconnect[j][k]);
+    }
 
     fpackf(tfile, "Bf Bf Bf Bf", mapcenter.x, mapcenter.y, mapcenter.z, mapradius);
 
@@ -566,56 +632,57 @@ static void ch_save(const char *args){
 
 static void ch_cellar(const char *args)
 {
-  player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Furdarko.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+    player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Furdarko.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
 }
 
 static void ch_tint(const char *args)
 {
-  sscanf(args, "%f%f%f", &tintr, &tintg, &tintb);
+    sscanf(args, "%f%f%f", &tintr, &tintg, &tintb);
 }
 
 static void ch_tintr(const char *args)
 {
-  tintr = atof(args);
+    tintr = atof(args);
 }
 
 static void ch_tintg(const char *args)
 {
-  tintg = atof(args);
+    tintg = atof(args);
 }
 
 static void ch_tintb(const char *args)
 {
-  tintb = atof(args);
+    tintb = atof(args);
 }
 
 static void ch_speed(const char *args)
 {
-  player[0].speedmult = atof(args);
+    player[0].speedmult = atof(args);
 }
 
 static void ch_strength(const char *args)
 {
-  player[0].power = atof(args);
+    player[0].power = atof(args);
 }
 
 static void ch_power(const char *args)
 {
-  player[0].power = atof(args);
+    player[0].power = atof(args);
 }
 
 static void ch_size(const char *args)
 {
-  player[0].scale = atof(args) * .2;
+    player[0].scale = atof(args) * .2;
 }
 
-static int findClosestPlayer(){
+static int findClosestPlayer()
+{
     int closest = -1;
     float closestdist = std::numeric_limits<float>::max();
 
-    for(int i=1; i<numplayers; i++){
+    for (int i = 1; i < numplayers; i++) {
         float distance = distsq(&player[i].coords, &player[0].coords);
-        if(distance < closestdist){
+        if (distance < closestdist) {
             closestdist = distance;
             closest = i;
         }
@@ -623,13 +690,14 @@ static int findClosestPlayer(){
     return closest;
 }
 
-static int findClosestObject(){
+static int findClosestObject()
+{
     int closest = -1;
     float closestdist = std::numeric_limits<float>::max();
 
-    for(int i=0; i<objects.numobjects; i++){
+    for (int i = 0; i < objects.numobjects; i++) {
         float distance = distsq(&objects.position[i], &player[0].coords);
-        if(distance < closestdist){
+        if (distance < closestdist) {
             closestdist = distance;
             closest = i;
         }
@@ -639,1180 +707,1186 @@ static int findClosestObject(){
 
 static void ch_sizenear(const char *args)
 {
-  int closest = findClosestPlayer();
-  if(closest>=0)
-    player[closest].scale = atof(args) * .2;
+    int closest = findClosestPlayer();
+    if (closest >= 0)
+        player[closest].scale = atof(args) * .2;
 }
 
 static void set_proportion(int pnum, const char *args)
 {
-  float headprop,bodyprop,armprop,legprop;
-
-  sscanf(args, "%f%f%f%f", &headprop, &bodyprop, &armprop, &legprop);
-
-  if(player[pnum].creature==wolftype){
-    player[pnum].proportionhead=1.1*headprop;
-    player[pnum].proportionbody=1.1*bodyprop;
-    player[pnum].proportionarms=1.1*armprop;
-    player[pnum].proportionlegs=1.1*legprop;
-  } else if(player[pnum].creature==rabbittype){
-    player[pnum].proportionhead=1.2*headprop;
-    player[pnum].proportionbody=1.05*bodyprop;
-    player[pnum].proportionarms=1.00*armprop;
-    player[pnum].proportionlegs=1.1*legprop;
-    player[pnum].proportionlegs.y=1.05*legprop;
-  }
+    float headprop, bodyprop, armprop, legprop;
+
+    sscanf(args, "%f%f%f%f", &headprop, &bodyprop, &armprop, &legprop);
+
+    if (player[pnum].creature == wolftype) {
+        player[pnum].proportionhead = 1.1 * headprop;
+        player[pnum].proportionbody = 1.1 * bodyprop;
+        player[pnum].proportionarms = 1.1 * armprop;
+        player[pnum].proportionlegs = 1.1 * legprop;
+    } else if (player[pnum].creature == rabbittype) {
+        player[pnum].proportionhead = 1.2 * headprop;
+        player[pnum].proportionbody = 1.05 * bodyprop;
+        player[pnum].proportionarms = 1.00 * armprop;
+        player[pnum].proportionlegs = 1.1 * legprop;
+        player[pnum].proportionlegs.y = 1.05 * legprop;
+    }
 }
 
 static void ch_proportion(const char *args)
 {
-  set_proportion(0, args);
+    set_proportion(0, args);
 }
 
 static void ch_proportionnear(const char *args)
 {
-  int closest = findClosestPlayer();
-  if(closest>=0)
-    set_proportion(closest, args);
+    int closest = findClosestPlayer();
+    if (closest >= 0)
+        set_proportion(closest, args);
 }
 
 static void set_protection(int pnum, const char *args)
 {
-  float head, high, low;
-  sscanf(args, "%f%f%f", &head, &high, &low);
+    float head, high, low;
+    sscanf(args, "%f%f%f", &head, &high, &low);
 
-  player[pnum].protectionhead = head;
-  player[pnum].protectionhigh = high;
-  player[pnum].protectionlow  = low;
+    player[pnum].protectionhead = head;
+    player[pnum].protectionhigh = high;
+    player[pnum].protectionlow  = low;
 }
 
 static void ch_protection(const char *args)
 {
-  set_protection(0, args);
+    set_protection(0, args);
 }
 
 static void ch_protectionnear(const char *args)
 {
-  int closest = findClosestPlayer();
-  if(closest>=0)
-    set_protection(closest, args);
+    int closest = findClosestPlayer();
+    if (closest >= 0)
+        set_protection(closest, args);
 }
 
 static void set_armor(int pnum, const char *args)
 {
-  float head, high, low;
-  sscanf(args, "%f%f%f", &head, &high, &low);
+    float head, high, low;
+    sscanf(args, "%f%f%f", &head, &high, &low);
 
-  player[pnum].armorhead = head;
-  player[pnum].armorhigh = high;
-  player[pnum].armorlow  = low;
+    player[pnum].armorhead = head;
+    player[pnum].armorhigh = high;
+    player[pnum].armorlow  = low;
 }
 
 static void ch_armor(const char *args)
 {
-  set_armor(0, args);
+    set_armor(0, args);
 }
 
 static void ch_armornear(const char *args)
 {
-  int closest = findClosestPlayer();
-  if(closest>=0)
-    set_armor(closest, args);
+    int closest = findClosestPlayer();
+    if (closest >= 0)
+        set_armor(closest, args);
 }
 
 static void ch_protectionreset(const char *args)
 {
-  set_protection(0, "1 1 1");
-  set_armor(0, "1 1 1");
+    set_protection(0, "1 1 1");
+    set_armor(0, "1 1 1");
 }
 
 static void set_metal(int pnum, const char *args)
 {
-  float head, high, low;
-  sscanf(args, "%f%f%f", &head, &high, &low);
+    float head, high, low;
+    sscanf(args, "%f%f%f", &head, &high, &low);
 
-  player[pnum].metalhead = head;
-  player[pnum].metalhigh = high;
-  player[pnum].metallow  = low;
+    player[pnum].metalhead = head;
+    player[pnum].metalhigh = high;
+    player[pnum].metallow  = low;
 }
 
 static void ch_metal(const char *args)
 {
-  set_metal(0, args);
+    set_metal(0, args);
 }
 
 static void set_noclothes(int pnum, const char *args)
 {
-  player[pnum].numclothes = 0;
-  player[pnum].skeleton.drawmodel.textureptr.load(
-          creatureskin[player[pnum].creature][player[pnum].whichskin],1,
-          &player[pnum].skeleton.skinText[0],&player[pnum].skeleton.skinsize);
+    player[pnum].numclothes = 0;
+    player[pnum].skeleton.drawmodel.textureptr.load(
+        creatureskin[player[pnum].creature][player[pnum].whichskin], 1,
+        &player[pnum].skeleton.skinText[0], &player[pnum].skeleton.skinsize);
 }
 
 static void ch_noclothes(const char *args)
 {
-  set_noclothes(0, args);
+    set_noclothes(0, args);
 }
 
 static void ch_noclothesnear(const char *args)
 {
-  int closest = findClosestPlayer();
-  if(closest>=0)
-    set_noclothes(closest, args);
+    int closest = findClosestPlayer();
+    if (closest >= 0)
+        set_noclothes(closest, args);
 }
 
 
 static void set_clothes(int pnum, const char *args)
 {
-  char buf[64];
-  snprintf(buf, 63, ":Data:Textures:%s.png", args);
-
-  if (!AddClothes(buf,&player[pnum].skeleton.skinText[pnum]))
-    return;
-
-  player[pnum].DoMipmaps();
-  strcpy(player[pnum].clothes[player[pnum].numclothes],buf);
-  player[pnum].clothestintr[player[pnum].numclothes]=tintr;
-  player[pnum].clothestintg[player[pnum].numclothes]=tintg;
-  player[pnum].clothestintb[player[pnum].numclothes]=tintb;
-  player[pnum].numclothes++;
+    char buf[64];
+    snprintf(buf, 63, ":Data:Textures:%s.png", args);
+
+    if (!AddClothes(buf, &player[pnum].skeleton.skinText[pnum]))
+        return;
+
+    player[pnum].DoMipmaps();
+    strcpy(player[pnum].clothes[player[pnum].numclothes], buf);
+    player[pnum].clothestintr[player[pnum].numclothes] = tintr;
+    player[pnum].clothestintg[player[pnum].numclothes] = tintg;
+    player[pnum].clothestintb[player[pnum].numclothes] = tintb;
+    player[pnum].numclothes++;
 }
 
 static void ch_clothes(const char *args)
 {
-  set_clothes(0, args);
+    set_clothes(0, args);
 }
 
 static void ch_clothesnear(const char *args)
 {
-  int closest = findClosestPlayer();
-  if(closest>=0)
-    set_clothes(closest, args);
+    int closest = findClosestPlayer();
+    if (closest >= 0)
+        set_clothes(closest, args);
 }
 
 static void ch_belt(const char *args)
 {
-  player[0].skeleton.clothes = !player[0].skeleton.clothes;
+    player[0].skeleton.clothes = !player[0].skeleton.clothes;
 }
 
 
 static void ch_cellophane(const char *args)
 {
-  cellophane = !cellophane;
-  float mul = cellophane ? 0 : 1;
-
-  for (int i = 0; i < numplayers; i++) {
-    player[i].proportionhead.z = player[i].proportionhead.x * mul;
-    player[i].proportionbody.z = player[i].proportionbody.x * mul;
-    player[i].proportionarms.z = player[i].proportionarms.x * mul;
-    player[i].proportionlegs.z = player[i].proportionlegs.x * mul;
-  }
+    cellophane = !cellophane;
+    float mul = cellophane ? 0 : 1;
+
+    for (int i = 0; i < numplayers; i++) {
+        player[i].proportionhead.z = player[i].proportionhead.x * mul;
+        player[i].proportionbody.z = player[i].proportionbody.x * mul;
+        player[i].proportionarms.z = player[i].proportionarms.x * mul;
+        player[i].proportionlegs.z = player[i].proportionlegs.x * mul;
+    }
 }
 
 static void ch_funnybunny(const char *args)
 {
-  player[0].skeleton.id=0;
-  player[0].skeleton.Load(":Data:Skeleton:Basic Figure",":Data:Skeleton:Basic Figurelow",
-                         ":Data:Skeleton:Rabbitbelt",":Data:Models:Body.solid",
-                         ":Data:Models:Body2.solid",":Data:Models:Body3.solid",
-                         ":Data:Models:Body4.solid",":Data:Models:Body5.solid",
-                         ":Data:Models:Body6.solid",":Data:Models:Body7.solid",
-                         ":Data:Models:Bodylow.solid",":Data:Models:Belt.solid",1);
-  player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur3.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-  player[0].creature=rabbittype;
-  player[0].scale=.2;
-  player[0].headless=0;
-  player[0].damagetolerance=200;
-  set_proportion(0, "1 1 1 1");
+    player[0].skeleton.id = 0;
+    player[0].skeleton.Load(":Data:Skeleton:Basic Figure", ":Data:Skeleton:Basic Figurelow",
+                            ":Data:Skeleton:Rabbitbelt", ":Data:Models:Body.solid",
+                            ":Data:Models:Body2.solid", ":Data:Models:Body3.solid",
+                            ":Data:Models:Body4.solid", ":Data:Models:Body5.solid",
+                            ":Data:Models:Body6.solid", ":Data:Models:Body7.solid",
+                            ":Data:Models:Bodylow.solid", ":Data:Models:Belt.solid", 1);
+    player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur3.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
+    player[0].creature = rabbittype;
+    player[0].scale = .2;
+    player[0].headless = 0;
+    player[0].damagetolerance = 200;
+    set_proportion(0, "1 1 1 1");
 }
 
 static void ch_wolfie(const char *args)
 {
-  player[0].skeleton.id=0;
-  player[0].skeleton.Load(":Data:Skeleton:Basic Figure Wolf",":Data:Skeleton:Basic Figure Wolf Low",
-                         ":Data:Skeleton:Rabbitbelt",":Data:Models:Wolf.solid",
-                         ":Data:Models:Wolf2.solid",":Data:Models:Wolf3.solid",
-                         ":Data:Models:Wolf4.solid",":Data:Models:Wolf5.solid",
-                         ":Data:Models:Wolf6.solid",":Data:Models:Wolf7.solid",
-                         ":Data:Models:Wolflow.solid",":Data:Models:Belt.solid",0);
-  player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-  player[0].creature=wolftype;
-  player[0].damagetolerance=300;
-  set_proportion(0, "1 1 1 1");
+    player[0].skeleton.id = 0;
+    player[0].skeleton.Load(":Data:Skeleton:Basic Figure Wolf", ":Data:Skeleton:Basic Figure Wolf Low",
+                            ":Data:Skeleton:Rabbitbelt", ":Data:Models:Wolf.solid",
+                            ":Data:Models:Wolf2.solid", ":Data:Models:Wolf3.solid",
+                            ":Data:Models:Wolf4.solid", ":Data:Models:Wolf5.solid",
+                            ":Data:Models:Wolf6.solid", ":Data:Models:Wolf7.solid",
+                            ":Data:Models:Wolflow.solid", ":Data:Models:Belt.solid", 0);
+    player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
+    player[0].creature = wolftype;
+    player[0].damagetolerance = 300;
+    set_proportion(0, "1 1 1 1");
 }
 
 static void ch_wolfieisgod(const char *args)
 {
-  ch_wolfie(args);
+    ch_wolfie(args);
 }
 
 static void ch_wolf(const char *args)
 {
-  player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+    player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
 }
 
 static void ch_snowwolf(const char *args)
 {
-  player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:SnowWolf.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+    player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:SnowWolf.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
 }
 
 static void ch_darkwolf(const char *args)
 {
-  player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:DarkWolf.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+    player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:DarkWolf.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
 }
 
 static void ch_lizardwolf(const char *args)
 {
-  player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Lizardwolf.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+    player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:Lizardwolf.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
 }
 
 static void ch_white(const char *args)
 {
-  player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+    player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
 }
 
 static void ch_brown(const char *args)
 {
-  player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur3.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+    player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur3.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
 }
 
 static void ch_black(const char *args)
 {
-  player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur2.jpg",1,&player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
+    player[0].skeleton.drawmodel.textureptr.load(":Data:Textures:fur2.jpg", 1, &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
 }
 
 static void ch_sizemin(const char *args)
 {
-  for (int i = 1; i < numplayers; i++)
-    if (player[i].scale < 0.8 * 0.2)
-      player[i].scale = 0.8 * 0.2;
+    for (int i = 1; i < numplayers; i++)
+        if (player[i].scale < 0.8 * 0.2)
+            player[i].scale = 0.8 * 0.2;
 }
 
 static void ch_tutorial(const char *args)
 {
-  tutoriallevel = atoi(args);
+    tutoriallevel = atoi(args);
 }
 
 static void ch_hostile(const char *args)
 {
-  hostile = atoi(args);
+    hostile = atoi(args);
 }
 
 static void ch_indemo(const char *args)
 {
-  indemo=1;
-  hotspot[numhotspots]=player[0].coords;
-  hotspotsize[numhotspots]=0;
-  hotspottype[numhotspots]=-111;
-  strcpy(hotspottext[numhotspots],"mapname");
-  numhotspots++;
+    indemo = 1;
+    hotspot[numhotspots] = player[0].coords;
+    hotspotsize[numhotspots] = 0;
+    hotspottype[numhotspots] = -111;
+    strcpy(hotspottext[numhotspots], "mapname");
+    numhotspots++;
 }
 
 static void ch_notindemo(const char *args)
 {
-  indemo=0;
-  numhotspots--;
+    indemo = 0;
+    numhotspots--;
 }
 
 static void ch_type(const char *args)
 {
-  int n = sizeof(editortypenames) / sizeof(editortypenames[0]);
-       for (int i = 0; i < n; i++)
-               if (stripfx(args, editortypenames[i])) {
-                       editoractive = i;
-                       break;
-               }
+    int n = sizeof(editortypenames) / sizeof(editortypenames[0]);
+    for (int i = 0; i < n; i++)
+        if (stripfx(args, editortypenames[i])) {
+            editoractive = i;
+            break;
+        }
 }
 
 static void ch_path(const char *args)
 {
-  int n = sizeof(pathtypenames) / sizeof(pathtypenames[0]);
-  for (int i = 0; i < n; i++)
-    if (stripfx(args, pathtypenames[i])) {
-               editorpathtype = i;
-               break;
-    }
+    int n = sizeof(pathtypenames) / sizeof(pathtypenames[0]);
+    for (int i = 0; i < n; i++)
+        if (stripfx(args, pathtypenames[i])) {
+            editorpathtype = i;
+            break;
+        }
 }
 
 static void ch_hs(const char *args)
 {
-  hotspot[numhotspots]=player[0].coords;
+    hotspot[numhotspots] = player[0].coords;
 
-  float size;
-  int type, shift;
-  sscanf(args, "%f%d %n", &size, &type, &shift);
+    float size;
+    int type, shift;
+    sscanf(args, "%f%d %n", &size, &type, &shift);
 
-  hotspotsize[numhotspots] = size;
-  hotspottype[numhotspots] = type;
+    hotspotsize[numhotspots] = size;
+    hotspottype[numhotspots] = type;
 
-  strcpy(hotspottext[numhotspots], args + shift);
-  strcat(hotspottext[numhotspots], "\n");
+    strcpy(hotspottext[numhotspots], args + shift);
+    strcat(hotspottext[numhotspots], "\n");
 
-  numhotspots++;
+    numhotspots++;
 }
 
 static void ch_dialogue(const char *args)
 {
-  int dlg;
-  char buf1[32], buf2[64];
-
-  sscanf(args, "%d %31s", &dlg, buf1);
-  snprintf(buf2, 63, ":Data:Dialogues:%s.txt", buf1);
-
-  dialoguetype[numdialogues] = dlg;
-
-  memset(dialoguetext[numdialogues], 0, sizeof(dialoguetext[numdialogues]));
-  memset(dialoguename[numdialogues], 0, sizeof(dialoguename[numdialogues]));
-
-  ifstream ipstream(ConvertFileName(buf2));
-  ipstream.ignore(256,':');
-  ipstream >> numdialogueboxes[numdialogues];
-  for(int i=0;i<numdialogueboxes[numdialogues];i++){
-    ipstream.ignore(256,':');
-    ipstream.ignore(256,':');
-    ipstream.ignore(256,' ');
-    ipstream >> dialogueboxlocation[numdialogues][i];
-    ipstream.ignore(256,':');
-    ipstream >> dialogueboxcolor[numdialogues][i][0];
-    ipstream >> dialogueboxcolor[numdialogues][i][1];
-    ipstream >> dialogueboxcolor[numdialogues][i][2];
-    ipstream.ignore(256,':');
-    ipstream.getline(dialoguename[numdialogues][i],64);
-    ipstream.ignore(256,':');
-    ipstream.ignore(256,' ');
-    ipstream.getline(dialoguetext[numdialogues][i],128);
-    for(int j=0;j<128;j++){
-      if(dialoguetext[numdialogues][i][j]=='\\')dialoguetext[numdialogues][i][j]='\n';
+    int dlg;
+    char buf1[32], buf2[64];
+
+    sscanf(args, "%d %31s", &dlg, buf1);
+    snprintf(buf2, 63, ":Data:Dialogues:%s.txt", buf1);
+
+    dialoguetype[numdialogues] = dlg;
+
+    memset(dialoguetext[numdialogues], 0, sizeof(dialoguetext[numdialogues]));
+    memset(dialoguename[numdialogues], 0, sizeof(dialoguename[numdialogues]));
+
+    ifstream ipstream(ConvertFileName(buf2));
+    ipstream.ignore(256, ':');
+    ipstream >> numdialogueboxes[numdialogues];
+    for (int i = 0; i < numdialogueboxes[numdialogues]; i++) {
+        ipstream.ignore(256, ':');
+        ipstream.ignore(256, ':');
+        ipstream.ignore(256, ' ');
+        ipstream >> dialogueboxlocation[numdialogues][i];
+        ipstream.ignore(256, ':');
+        ipstream >> dialogueboxcolor[numdialogues][i][0];
+        ipstream >> dialogueboxcolor[numdialogues][i][1];
+        ipstream >> dialogueboxcolor[numdialogues][i][2];
+        ipstream.ignore(256, ':');
+        ipstream.getline(dialoguename[numdialogues][i], 64);
+        ipstream.ignore(256, ':');
+        ipstream.ignore(256, ' ');
+        ipstream.getline(dialoguetext[numdialogues][i], 128);
+        for (int j = 0; j < 128; j++) {
+            if (dialoguetext[numdialogues][i][j] == '\\')dialoguetext[numdialogues][i][j] = '\n';
+        }
+        ipstream.ignore(256, ':');
+        ipstream >> dialogueboxsound[numdialogues][i];
     }
-    ipstream.ignore(256,':');
-    ipstream >> dialogueboxsound[numdialogues][i];
-  }
 
-  for(int i=0;i<numdialogueboxes[numdialogues];i++){
-    for(int j=0;j<numplayers;j++){
-      participantfacing[numdialogues][i][j]=player[j].facing;
+    for (int i = 0; i < numdialogueboxes[numdialogues]; i++) {
+        for (int j = 0; j < numplayers; j++) {
+            participantfacing[numdialogues][i][j] = player[j].facing;
+        }
     }
-  }
-  ipstream.close();
+    ipstream.close();
 
-  directing=1;
-  indialogue=0;
-  whichdialogue=numdialogues;
+    directing = 1;
+    indialogue = 0;
+    whichdialogue = numdialogues;
 
-  numdialogues++;
+    numdialogues++;
 }
 
 static void ch_fixdialogue(const char *args)
 {
-  char buf1[32], buf2[64];
-  int whichdi;
-
-  sscanf(args, "%d %31s", &whichdi, buf1);
-  snprintf(buf2, 63, ":Data:Dialogues:%s.txt", buf1);
-
-  memset(dialoguetext[whichdi], 0, sizeof(dialoguetext[whichdi]));
-  memset(dialoguename[whichdi], 0, sizeof(dialoguename[whichdi]));
-
-  ifstream ipstream(ConvertFileName(buf2));
-  ipstream.ignore(256,':');
-  ipstream >> numdialogueboxes[whichdi];
-  for(int i=0;i<numdialogueboxes[whichdi];i++){
-    ipstream.ignore(256,':');
-    ipstream.ignore(256,':');
-    ipstream.ignore(256,' ');
-    ipstream >> dialogueboxlocation[whichdi][i];
-    ipstream.ignore(256,':');
-    ipstream >> dialogueboxcolor[whichdi][i][0];
-    ipstream >> dialogueboxcolor[whichdi][i][1];
-    ipstream >> dialogueboxcolor[whichdi][i][2];
-    ipstream.ignore(256,':');
-    ipstream.getline(dialoguename[whichdi][i],64);
-    ipstream.ignore(256,':');
-    ipstream.ignore(256,' ');
-    ipstream.getline(dialoguetext[whichdi][i],128);
-    for(int j=0;j<128;j++){
-      if(dialoguetext[whichdi][i][j]=='\\')dialoguetext[whichdi][i][j]='\n';
+    char buf1[32], buf2[64];
+    int whichdi;
+
+    sscanf(args, "%d %31s", &whichdi, buf1);
+    snprintf(buf2, 63, ":Data:Dialogues:%s.txt", buf1);
+
+    memset(dialoguetext[whichdi], 0, sizeof(dialoguetext[whichdi]));
+    memset(dialoguename[whichdi], 0, sizeof(dialoguename[whichdi]));
+
+    ifstream ipstream(ConvertFileName(buf2));
+    ipstream.ignore(256, ':');
+    ipstream >> numdialogueboxes[whichdi];
+    for (int i = 0; i < numdialogueboxes[whichdi]; i++) {
+        ipstream.ignore(256, ':');
+        ipstream.ignore(256, ':');
+        ipstream.ignore(256, ' ');
+        ipstream >> dialogueboxlocation[whichdi][i];
+        ipstream.ignore(256, ':');
+        ipstream >> dialogueboxcolor[whichdi][i][0];
+        ipstream >> dialogueboxcolor[whichdi][i][1];
+        ipstream >> dialogueboxcolor[whichdi][i][2];
+        ipstream.ignore(256, ':');
+        ipstream.getline(dialoguename[whichdi][i], 64);
+        ipstream.ignore(256, ':');
+        ipstream.ignore(256, ' ');
+        ipstream.getline(dialoguetext[whichdi][i], 128);
+        for (int j = 0; j < 128; j++) {
+            if (dialoguetext[whichdi][i][j] == '\\')dialoguetext[whichdi][i][j] = '\n';
+        }
+        ipstream.ignore(256, ':');
+        ipstream >> dialogueboxsound[whichdi][i];
     }
-    ipstream.ignore(256,':');
-    ipstream >> dialogueboxsound[whichdi][i];
-  }
 
-  ipstream.close();
+    ipstream.close();
 }
 
 static void ch_fixtype(const char *args)
 {
-  int dlg;
-  sscanf(args, "%d", &dlg);
-  dialoguetype[0] = dlg;
+    int dlg;
+    sscanf(args, "%d", &dlg);
+    dialoguetype[0] = dlg;
 }
 
 static void ch_fixrotation(const char *args)
 {
-  participantyaw[whichdialogue][participantfocus[whichdialogue][indialogue]]=player[participantfocus[whichdialogue][indialogue]].yaw;
+    participantyaw[whichdialogue][participantfocus[whichdialogue][indialogue]] = player[participantfocus[whichdialogue][indialogue]].yaw;
 }
 
 static void ch_ddialogue(const char *args)
 {
-  if (numdialogues)
-    numdialogues--;
+    if (numdialogues)
+        numdialogues--;
 }
 
 static void ch_dhs(const char *args)
 {
-  if (numhotspots)
-    numhotspots--;
+    if (numhotspots)
+        numhotspots--;
 }
 
 static void ch_immobile(const char *args)
 {
-  player[0].immobile = 1;
+    player[0].immobile = 1;
 }
 
 static void ch_allimmobile(const char *args)
 {
-  for (int i = 1; i < numplayers; i++)
-    player[i].immobile = 1;
+    for (int i = 1; i < numplayers; i++)
+        player[i].immobile = 1;
 }
 
 static void ch_mobile(const char *args)
 {
-  player[0].immobile = 0;
+    player[0].immobile = 0;
 }
 
 static void ch_default(const char *args)
 {
-  player[0].armorhead=1;
-  player[0].armorhigh=1;
-  player[0].armorlow=1;
-  player[0].protectionhead=1;
-  player[0].protectionhigh=1;
-  player[0].protectionlow=1;
-  player[0].metalhead=1;
-  player[0].metalhigh=1;
-  player[0].metallow=1;
-  player[0].power=1;
-  player[0].speedmult=1;
-  player[0].scale=1;
-
-  if(player[0].creature==wolftype){
-    player[0].proportionhead=1.1;
-    player[0].proportionbody=1.1;
-    player[0].proportionarms=1.1;
-    player[0].proportionlegs=1.1;
-  } else if(player[0].creature==rabbittype){
-    player[0].proportionhead=1.2;
-    player[0].proportionbody=1.05;
-    player[0].proportionarms=1.00;
-    player[0].proportionlegs=1.1;
-    player[0].proportionlegs.y=1.05;
-  }
-
-  player[0].numclothes=0;
-  player[0].skeleton.drawmodel.textureptr.load(
-          creatureskin[player[0].creature][player[0].whichskin],1,
-          &player[0].skeleton.skinText[0],&player[0].skeleton.skinsize);
-
-  editoractive=typeactive;
-  player[0].immobile=0;
+    player[0].armorhead = 1;
+    player[0].armorhigh = 1;
+    player[0].armorlow = 1;
+    player[0].protectionhead = 1;
+    player[0].protectionhigh = 1;
+    player[0].protectionlow = 1;
+    player[0].metalhead = 1;
+    player[0].metalhigh = 1;
+    player[0].metallow = 1;
+    player[0].power = 1;
+    player[0].speedmult = 1;
+    player[0].scale = 1;
+
+    if (player[0].creature == wolftype) {
+        player[0].proportionhead = 1.1;
+        player[0].proportionbody = 1.1;
+        player[0].proportionarms = 1.1;
+        player[0].proportionlegs = 1.1;
+    } else if (player[0].creature == rabbittype) {
+        player[0].proportionhead = 1.2;
+        player[0].proportionbody = 1.05;
+        player[0].proportionarms = 1.00;
+        player[0].proportionlegs = 1.1;
+        player[0].proportionlegs.y = 1.05;
+    }
+
+    player[0].numclothes = 0;
+    player[0].skeleton.drawmodel.textureptr.load(
+        creatureskin[player[0].creature][player[0].whichskin], 1,
+        &player[0].skeleton.skinText[0], &player[0].skeleton.skinsize);
+
+    editoractive = typeactive;
+    player[0].immobile = 0;
 }
 
 static void ch_play(const char *args)
 {
-  int dlg;
-  sscanf(args, "%d", &dlg);
-  whichdialogue = dlg;
-
-  if (whichdialogue >= numdialogues)
-    return;
-
-  for(int i=0;i<numdialogueboxes[whichdialogue];i++){
-    player[participantfocus[whichdialogue][i]].coords=participantlocation[whichdialogue][participantfocus[whichdialogue][i]];
-    player[participantfocus[whichdialogue][i]].yaw=participantyaw[whichdialogue][participantfocus[whichdialogue][i]];
-    player[participantfocus[whichdialogue][i]].targetyaw=participantyaw[whichdialogue][participantfocus[whichdialogue][i]];
-    player[participantfocus[whichdialogue][i]].velocity=0;
-    player[participantfocus[whichdialogue][i]].animTarget=player[participantfocus[whichdialogue][i]].getIdle();
-    player[participantfocus[whichdialogue][i]].frameTarget=0;
-  }
-
-  directing=0;
-  indialogue=0;
-
-  playdialogueboxsound();
+    int dlg;
+    sscanf(args, "%d", &dlg);
+    whichdialogue = dlg;
+
+    if (whichdialogue >= numdialogues)
+        return;
+
+    for (int i = 0; i < numdialogueboxes[whichdialogue]; i++) {
+        player[participantfocus[whichdialogue][i]].coords = participantlocation[whichdialogue][participantfocus[whichdialogue][i]];
+        player[participantfocus[whichdialogue][i]].yaw = participantyaw[whichdialogue][participantfocus[whichdialogue][i]];
+        player[participantfocus[whichdialogue][i]].targetyaw = participantyaw[whichdialogue][participantfocus[whichdialogue][i]];
+        player[participantfocus[whichdialogue][i]].velocity = 0;
+        player[participantfocus[whichdialogue][i]].animTarget = player[participantfocus[whichdialogue][i]].getIdle();
+        player[participantfocus[whichdialogue][i]].frameTarget = 0;
+    }
+
+    directing = 0;
+    indialogue = 0;
+
+    playdialogueboxsound();
 }
 
 static void ch_mapkilleveryone(const char *args)
 {
-  maptype = mapkilleveryone;
+    maptype = mapkilleveryone;
 }
 
 static void ch_mapkillmost(const char *args)
 {
-  maptype = mapkillmost;
+    maptype = mapkillmost;
 }
 
 static void ch_mapkillsomeone(const char *args)
 {
-  maptype = mapkillsomeone;
+    maptype = mapkillsomeone;
 }
 
 static void ch_mapgosomewhere(const char *args)
 {
-  maptype = mapgosomewhere;
+    maptype = mapgosomewhere;
 }
 
 static void ch_viewdistance(const char *args)
 {
-  viewdistance = atof(args)*100;
+    viewdistance = atof(args) * 100;
 }
 
 static void ch_fadestart(const char *args)
 {
-  fadestart = atof(args);
+    fadestart = atof(args);
 }
 
 static void ch_slomo(const char *args)
 {
-  slomospeed = atof(args);
-  slomo = !slomo;
-  slomodelay = 1000;
+    slomospeed = atof(args);
+    slomo = !slomo;
+    slomodelay = 1000;
 }
 
 static void ch_slofreq(const char *args)
 {
-  slomofreq = atof(args);
+    slomofreq = atof(args);
 }
 
 static void ch_skytint(const char *args)
 {
-  sscanf(args, "%f%f%f", &skyboxr, &skyboxg, &skyboxb);
+    sscanf(args, "%f%f%f", &skyboxr, &skyboxg, &skyboxb);
 
-  skyboxlightr=skyboxr;
-  skyboxlightg=skyboxg;
-  skyboxlightb=skyboxb;
+    skyboxlightr = skyboxr;
+    skyboxlightg = skyboxg;
+    skyboxlightb = skyboxb;
 
-  SetUpLighting();
+    SetUpLighting();
 
-  terrain.DoShadows();
-  objects.DoShadows();
+    terrain.DoShadows();
+    objects.DoShadows();
 }
 
 static void ch_skylight(const char *args)
 {
-  sscanf(args, "%f%f%f", &skyboxlightr, &skyboxlightg, &skyboxlightb);
+    sscanf(args, "%f%f%f", &skyboxlightr, &skyboxlightg, &skyboxlightb);
 
-  SetUpLighting();
+    SetUpLighting();
 
-  terrain.DoShadows();
-  objects.DoShadows();
+    terrain.DoShadows();
+    objects.DoShadows();
 }
 
 static void ch_skybox(const char *args)
 {
-  skyboxtexture = !skyboxtexture;
+    skyboxtexture = !skyboxtexture;
 
-  SetUpLighting();
+    SetUpLighting();
 
-  terrain.DoShadows();
-  objects.DoShadows();
+    terrain.DoShadows();
+    objects.DoShadows();
 }
 
 static void cmd_dispatch(const string cmd)
 {
-  int i, n_cmds = sizeof(cmd_names) / sizeof(cmd_names[0]);
-
-  for (i = 0; i < n_cmds; i++)
-    if (cmd.substr(0,cmd.find(' '))==string(cmd_names[i]))
-      {
-                 cout << "|" << cmd.substr(cmd.find(' ')+1) << "|" << endl;
-               cmd_handlers[i](cmd.substr(cmd.find(' ')+1).c_str());
-               break;
-      }
-  emit_sound_np(i < n_cmds ? consolesuccesssound : consolefailsound);
+    int i, n_cmds = sizeof(cmd_names) / sizeof(cmd_names[0]);
+
+    for (i = 0; i < n_cmds; i++)
+        if (cmd.substr(0, cmd.find(' ')) == string(cmd_names[i])) {
+            cout << "|" << cmd.substr(cmd.find(' ') + 1) << "|" << endl;
+            cmd_handlers[i](cmd.substr(cmd.find(' ') + 1).c_str());
+            break;
+        }
+    emit_sound_np(i < n_cmds ? consolesuccesssound : consolefailsound);
 }
 
 /********************> Tick() <*****/
 extern bool save_image(const char * fname);
 void Screenshot        (void)
 {
-       char temp[1024];
-       time_t  t = time(NULL);
-       struct  tm *tme = localtime(&t);
-       sprintf(temp, "Screenshots/Screenshot_%04d_%02d_%02d--%02d_%02d_%02d.png", tme->tm_year + 1900, tme->tm_mon + 1, tme->tm_mday, tme->tm_hour, tme->tm_min, tme->tm_sec);
-
-       #if defined(_WIN32)
-       mkdir("Screenshots");
-       #else
-       mkdir("Screenshots", S_IRWXU);
-       #endif
-       
-       save_image(temp);
+    char temp[1024];
+    time_t     t = time(NULL);
+    struct     tm *tme = localtime(&t);
+    sprintf(temp, "Screenshots/Screenshot_%04d_%02d_%02d--%02d_%02d_%02d.png", tme->tm_year + 1900, tme->tm_mon + 1, tme->tm_mday, tme->tm_hour, tme->tm_min, tme->tm_sec);
+
+#if defined(_WIN32)
+    mkdir("Screenshots");
+#else
+    mkdir("Screenshots", S_IRWXU);
+#endif
+
+    save_image(temp);
 }
 
-void Game::SetUpLighting(){
-       if(environment==snowyenvironment)
-        light.setColors(.65,.65,.7,.4,.4,.44);
-       if(environment==desertenvironment)
-        light.setColors(.95,.95,.95,.4,.35,.3);
-       if(environment==grassyenvironment)
-        light.setColors(.95,.95,1,.4,.4,.44);
-       if(!skyboxtexture)
-        light.setColors(1,1,1,.4,.4,.4);
-       float average;
-       average=(skyboxlightr+skyboxlightg+skyboxlightb)/3;
-       light.color[0]*=(skyboxlightr+average)/2;
-       light.color[1]*=(skyboxlightg+average)/2;
-       light.color[2]*=(skyboxlightb+average)/2;
-       light.ambient[0]*=(skyboxlightr+average)/2;
-       light.ambient[1]*=(skyboxlightg+average)/2;
-       light.ambient[2]*=(skyboxlightb+average)/2;
+void Game::SetUpLighting()
+{
+    if (environment == snowyenvironment)
+        light.setColors(.65, .65, .7, .4, .4, .44);
+    if (environment == desertenvironment)
+        light.setColors(.95, .95, .95, .4, .35, .3);
+    if (environment == grassyenvironment)
+        light.setColors(.95, .95, 1, .4, .4, .44);
+    if (!skyboxtexture)
+        light.setColors(1, 1, 1, .4, .4, .4);
+    float average;
+    average = (skyboxlightr + skyboxlightg + skyboxlightb) / 3;
+    light.color[0] *= (skyboxlightr + average) / 2;
+    light.color[1] *= (skyboxlightg + average) / 2;
+    light.color[2] *= (skyboxlightb + average) / 2;
+    light.ambient[0] *= (skyboxlightr + average) / 2;
+    light.ambient[1] *= (skyboxlightg + average) / 2;
+    light.ambient[2] *= (skyboxlightb + average) / 2;
 }
 
-int findPathDist(int start,int end){
-       int smallestcount,count,connected;
-       int last,last2,last3,last4;
-       int closest;
-
-       smallestcount=1000;
-       for(int i=0;i<50;i++){
-               count=0;
-               last=start;
-               last2=-1;
-               last3=-1;
-               last4=-1;
-               while(last!=end&&count<30){
-                       closest=-1;
-                       for(int j=0;j<numpathpoints;j++){
-                               if(j!=last&&j!=last2&&j!=last3&&j!=last4)
-                               {
-                                       connected=0;
-                                       if(numpathpointconnect[j])
-                                               for(int k=0;k<numpathpointconnect[j];k++){
-                                                       if(pathpointconnect[j][k]==last)connected=1;
-                                               }
-                    if(!connected)
-                        if(numpathpointconnect[last])
-                            for(int k=0;k<numpathpointconnect[last];k++){
-                                if(pathpointconnect[last][k]==j)connected=1;
+int findPathDist(int start, int end)
+{
+    int smallestcount, count, connected;
+    int last, last2, last3, last4;
+    int closest;
+
+    smallestcount = 1000;
+    for (int i = 0; i < 50; i++) {
+        count = 0;
+        last = start;
+        last2 = -1;
+        last3 = -1;
+        last4 = -1;
+        while (last != end && count < 30) {
+            closest = -1;
+            for (int j = 0; j < numpathpoints; j++) {
+                if (j != last && j != last2 && j != last3 && j != last4) {
+                    connected = 0;
+                    if (numpathpointconnect[j])
+                        for (int k = 0; k < numpathpointconnect[j]; k++) {
+                            if (pathpointconnect[j][k] == last)connected = 1;
+                        }
+                    if (!connected)
+                        if (numpathpointconnect[last])
+                            for (int k = 0; k < numpathpointconnect[last]; k++) {
+                                if (pathpointconnect[last][k] == j)connected = 1;
                             }
-                    if(connected)
-                        if(closest==-1||Random()%2==0){
-                            closest=j;
+                    if (connected)
+                        if (closest == -1 || Random() % 2 == 0) {
+                            closest = j;
                         }
-                               }
-                       }
-                       last4=last3;
-                       last3=last2;
-                       last2=last;
-                       last=closest;
-                       count++;
-               }
-               if(count<smallestcount)smallestcount=count;
-       }
-       return smallestcount;
+                }
+            }
+            last4 = last3;
+            last3 = last2;
+            last2 = last;
+            last = closest;
+            count++;
+        }
+        if (count < smallestcount)smallestcount = count;
+    }
+    return smallestcount;
 }
 
-int Game::checkcollide(XYZ startpoint,XYZ endpoint){
-       static XYZ colpoint,colviewer,coltarget;
-       static float minx,minz,maxx,maxz,miny,maxy;
-
-    minx=min(startpoint.x,endpoint.x)-1;
-    miny=min(startpoint.y,endpoint.y)-1;
-    minz=min(startpoint.z,endpoint.z)-1;
-    maxx=max(startpoint.x,endpoint.x)+1;
-    maxy=max(startpoint.y,endpoint.y)+1;
-    maxz=max(startpoint.z,endpoint.z)+1;
-
-       for(int i=0;i<objects.numobjects;i++){
-               if(     objects.position[i].x>minx-objects.model[i].boundingsphereradius&&
-                objects.position[i].x<maxx+objects.model[i].boundingsphereradius&&
-                objects.position[i].y>miny-objects.model[i].boundingsphereradius&&
-                objects.position[i].y<maxy+objects.model[i].boundingsphereradius&&
-                objects.position[i].z>minz-objects.model[i].boundingsphereradius&&
-                objects.position[i].z<maxz+objects.model[i].boundingsphereradius){
-                       if(     objects.type[i]!=treeleavestype&&
-                    objects.type[i]!=bushtype&&
-                    objects.type[i]!=firetype){
-                               colviewer=startpoint;
-                               coltarget=endpoint;
-                               if(objects.model[i].LineCheck(&colviewer,&coltarget,&colpoint,&objects.position[i],&objects.yaw[i])!=-1)return i;
-                       }
-               }
-       }
-
-       //if(terrain.lineTerrain(startpoint,endpoint,&colpoint)!=-1)return 1000;
-
-       return -1;
+int Game::checkcollide(XYZ startpoint, XYZ endpoint)
+{
+    static XYZ colpoint, colviewer, coltarget;
+    static float minx, minz, maxx, maxz, miny, maxy;
+
+    minx = min(startpoint.x, endpoint.x) - 1;
+    miny = min(startpoint.y, endpoint.y) - 1;
+    minz = min(startpoint.z, endpoint.z) - 1;
+    maxx = max(startpoint.x, endpoint.x) + 1;
+    maxy = max(startpoint.y, endpoint.y) + 1;
+    maxz = max(startpoint.z, endpoint.z) + 1;
+
+    for (int i = 0; i < objects.numobjects; i++) {
+        if (     objects.position[i].x > minx - objects.model[i].boundingsphereradius &&
+                 objects.position[i].x < maxx + objects.model[i].boundingsphereradius &&
+                 objects.position[i].y > miny - objects.model[i].boundingsphereradius &&
+                 objects.position[i].y < maxy + objects.model[i].boundingsphereradius &&
+                 objects.position[i].z > minz - objects.model[i].boundingsphereradius &&
+                 objects.position[i].z < maxz + objects.model[i].boundingsphereradius) {
+            if (     objects.type[i] != treeleavestype &&
+                     objects.type[i] != bushtype &&
+                     objects.type[i] != firetype) {
+                colviewer = startpoint;
+                coltarget = endpoint;
+                if (objects.model[i].LineCheck(&colviewer, &coltarget, &colpoint, &objects.position[i], &objects.yaw[i]) != -1)return i;
+            }
+        }
+    }
+
+    //if(terrain.lineTerrain(startpoint,endpoint,&colpoint)!=-1)return 1000;
+
+    return -1;
 }
 
-int Game::checkcollide(XYZ startpoint,XYZ endpoint,int what){
-       static XYZ colpoint,colviewer,coltarget;
-       static float minx,minz,maxx,maxz,miny,maxy;
-       static int i; //FIXME: see below
-
-    minx=min(startpoint.x,endpoint.x)-1;
-    miny=min(startpoint.y,endpoint.y)-1;
-    minz=min(startpoint.z,endpoint.z)-1;
-    maxx=max(startpoint.x,endpoint.x)+1;
-    maxy=max(startpoint.y,endpoint.y)+1;
-    maxz=max(startpoint.z,endpoint.z)+1;
-
-       if(what!=1000){
-               if(     objects.position[what].x>minx-objects.model[what].boundingsphereradius&&
-                objects.position[what].x<maxx+objects.model[what].boundingsphereradius&&
-                objects.position[what].y>miny-objects.model[what].boundingsphereradius&&
-                objects.position[what].y<maxy+objects.model[what].boundingsphereradius&&
-                objects.position[what].z>minz-objects.model[what].boundingsphereradius&&
-                objects.position[what].z<maxz+objects.model[what].boundingsphereradius){
-                       if(     objects.type[what]!=treeleavestype&&
-                    objects.type[what]!=bushtype&&
-                    objects.type[what]!=firetype){
-                               colviewer=startpoint;
-                               coltarget=endpoint;
+int Game::checkcollide(XYZ startpoint, XYZ endpoint, int what)
+{
+    static XYZ colpoint, colviewer, coltarget;
+    static float minx, minz, maxx, maxz, miny, maxy;
+    static int i; //FIXME: see below
+
+    minx = min(startpoint.x, endpoint.x) - 1;
+    miny = min(startpoint.y, endpoint.y) - 1;
+    minz = min(startpoint.z, endpoint.z) - 1;
+    maxx = max(startpoint.x, endpoint.x) + 1;
+    maxy = max(startpoint.y, endpoint.y) + 1;
+    maxz = max(startpoint.z, endpoint.z) + 1;
+
+    if (what != 1000) {
+        if (     objects.position[what].x > minx - objects.model[what].boundingsphereradius &&
+                 objects.position[what].x < maxx + objects.model[what].boundingsphereradius &&
+                 objects.position[what].y > miny - objects.model[what].boundingsphereradius &&
+                 objects.position[what].y < maxy + objects.model[what].boundingsphereradius &&
+                 objects.position[what].z > minz - objects.model[what].boundingsphereradius &&
+                 objects.position[what].z < maxz + objects.model[what].boundingsphereradius) {
+            if (     objects.type[what] != treeleavestype &&
+                     objects.type[what] != bushtype &&
+                     objects.type[what] != firetype) {
+                colviewer = startpoint;
+                coltarget = endpoint;
                 //FIXME: i/what
-                               if(objects.model[what].LineCheck(&colviewer,&coltarget,&colpoint,&objects.position[what],&objects.yaw[what])!=-1)return i;
-                       }
-               }
-       }
+                if (objects.model[what].LineCheck(&colviewer, &coltarget, &colpoint, &objects.position[what], &objects.yaw[what]) != -1)return i;
+            }
+        }
+    }
 
-       if(what==1000)if(terrain.lineTerrain(startpoint,endpoint,&colpoint)!=-1)return 1000;
+    if (what == 1000)if (terrain.lineTerrain(startpoint, endpoint, &colpoint) != -1)return 1000;
 
-       return -1;
+    return -1;
 }
 
 void Setenvironment(int which)
 {
-       LOGFUNC;
+    LOGFUNC;
 
-       LOG(" Setting environment...");
+    LOG(" Setting environment...");
 
-       float temptexdetail;
-       environment=which;
+    float temptexdetail;
+    environment = which;
 
-       pause_sound(stream_snowtheme);
-       pause_sound(stream_grasstheme);
-       pause_sound(stream_deserttheme);
-       pause_sound(stream_wind);
-       pause_sound(stream_desertambient);
+    pause_sound(stream_snowtheme);
+    pause_sound(stream_grasstheme);
+    pause_sound(stream_deserttheme);
+    pause_sound(stream_wind);
+    pause_sound(stream_desertambient);
 
 
-       if(environment==snowyenvironment){
-               windvector=0;
-               windvector.z=3;
-               if(ambientsound)
-                 emit_stream_np(stream_wind);
+    if (environment == snowyenvironment) {
+        windvector = 0;
+        windvector.z = 3;
+        if (ambientsound)
+            emit_stream_np(stream_wind);
 
-               objects.treetextureptr.load(":Data:Textures:snowtree.png",0,1);
-               objects.bushtextureptr.load(":Data:Textures:bushsnow.png",0,1);
-               objects.rocktextureptr.load(":Data:Textures:bouldersnow.jpg",1,0);
-               objects.boxtextureptr.load(":Data:Textures:snowbox.jpg",1,0);
+        objects.treetextureptr.load(":Data:Textures:snowtree.png", 0, 1);
+        objects.bushtextureptr.load(":Data:Textures:bushsnow.png", 0, 1);
+        objects.rocktextureptr.load(":Data:Textures:bouldersnow.jpg", 1, 0);
+        objects.boxtextureptr.load(":Data:Textures:snowbox.jpg", 1, 0);
 
-               footstepsound = footstepsn1;
-               footstepsound2 = footstepsn2;
-               footstepsound3 = footstepst1;
-               footstepsound4 = footstepst2;
+        footstepsound = footstepsn1;
+        footstepsound2 = footstepsn2;
+        footstepsound3 = footstepst1;
+        footstepsound4 = footstepst2;
 
-               terraintexture.load(":Data:Textures:snow.jpg",1,0);
-               terraintexture2.load(":Data:Textures:rock.jpg",1,0);
+        terraintexture.load(":Data:Textures:snow.jpg", 1, 0);
+        terraintexture2.load(":Data:Textures:rock.jpg", 1, 0);
 
-               //LoadTexture(":Data:Textures:detailgrain.png",&terraintexture3,1);
+        //LoadTexture(":Data:Textures:detailgrain.png",&terraintexture3,1);
 
 
 
 
-               temptexdetail=texdetail;
-               if(texdetail>1)texdetail=4;
-               skybox->load(   ":Data:Textures:Skybox(snow):Front.jpg",
-                       ":Data:Textures:Skybox(snow):Left.jpg",
-                       ":Data:Textures:Skybox(snow):Back.jpg",
-                       ":Data:Textures:Skybox(snow):Right.jpg",
-                       ":Data:Textures:Skybox(snow):Up.jpg",
-                       ":Data:Textures:Skybox(snow):Down.jpg");
+        temptexdetail = texdetail;
+        if (texdetail > 1)texdetail = 4;
+        skybox->load(  ":Data:Textures:Skybox(snow):Front.jpg",
+                        ":Data:Textures:Skybox(snow):Left.jpg",
+                        ":Data:Textures:Skybox(snow):Back.jpg",
+                        ":Data:Textures:Skybox(snow):Right.jpg",
+                        ":Data:Textures:Skybox(snow):Up.jpg",
+                        ":Data:Textures:Skybox(snow):Down.jpg");
 
 
 
 
-               texdetail=temptexdetail;
-       } else if(environment==desertenvironment){
-               windvector=0;
-               windvector.z=2;
-               objects.treetextureptr.load(":Data:Textures:deserttree.png",0,1);
-               objects.bushtextureptr.load(":Data:Textures:bushdesert.png",0,1);
-               objects.rocktextureptr.load(":Data:Textures:boulderdesert.jpg",1,0);
-               objects.boxtextureptr.load(":Data:Textures:desertbox.jpg",1,0);
+        texdetail = temptexdetail;
+    } else if (environment == desertenvironment) {
+        windvector = 0;
+        windvector.z = 2;
+        objects.treetextureptr.load(":Data:Textures:deserttree.png", 0, 1);
+        objects.bushtextureptr.load(":Data:Textures:bushdesert.png", 0, 1);
+        objects.rocktextureptr.load(":Data:Textures:boulderdesert.jpg", 1, 0);
+        objects.boxtextureptr.load(":Data:Textures:desertbox.jpg", 1, 0);
 
 
-               if(ambientsound)
-                 emit_stream_np(stream_desertambient);
+        if (ambientsound)
+            emit_stream_np(stream_desertambient);
 
-               footstepsound = footstepsn1;
-               footstepsound2 = footstepsn2;
-               footstepsound3 = footstepsn1;
-               footstepsound4 = footstepsn2;
+        footstepsound = footstepsn1;
+        footstepsound2 = footstepsn2;
+        footstepsound3 = footstepsn1;
+        footstepsound4 = footstepsn2;
 
-               terraintexture.load(":Data:Textures:sand.jpg",1,0);
-               terraintexture2.load(":Data:Textures:sandslope.jpg",1,0);
+        terraintexture.load(":Data:Textures:sand.jpg", 1, 0);
+        terraintexture2.load(":Data:Textures:sandslope.jpg", 1, 0);
 
-               //LoadTexture(":Data:Textures:detailgrain.png",&terraintexture3,1);
+        //LoadTexture(":Data:Textures:detailgrain.png",&terraintexture3,1);
 
 
 
-               temptexdetail=texdetail;
-               if(texdetail>1)texdetail=4;
-               skybox->load(   ":Data:Textures:Skybox(sand):Front.jpg",
-                       ":Data:Textures:Skybox(sand):Left.jpg",
-                       ":Data:Textures:Skybox(sand):Back.jpg",
-                       ":Data:Textures:Skybox(sand):Right.jpg",
-                       ":Data:Textures:Skybox(sand):Up.jpg",
-                       ":Data:Textures:Skybox(sand):Down.jpg");
+        temptexdetail = texdetail;
+        if (texdetail > 1)texdetail = 4;
+        skybox->load(  ":Data:Textures:Skybox(sand):Front.jpg",
+                        ":Data:Textures:Skybox(sand):Left.jpg",
+                        ":Data:Textures:Skybox(sand):Back.jpg",
+                        ":Data:Textures:Skybox(sand):Right.jpg",
+                        ":Data:Textures:Skybox(sand):Up.jpg",
+                        ":Data:Textures:Skybox(sand):Down.jpg");
 
 
 
 
-               texdetail=temptexdetail;
-       } else if(environment==grassyenvironment){
-               windvector=0;
-               windvector.z=2;
-               objects.treetextureptr.load(":Data:Textures:tree.png",0,1);
-               objects.bushtextureptr.load(":Data:Textures:bush.png",0,1);
-               objects.rocktextureptr.load(":Data:Textures:boulder.jpg",1,0);
-               objects.boxtextureptr.load(":Data:Textures:grassbox.jpg",1,0);
+        texdetail = temptexdetail;
+    } else if (environment == grassyenvironment) {
+        windvector = 0;
+        windvector.z = 2;
+        objects.treetextureptr.load(":Data:Textures:tree.png", 0, 1);
+        objects.bushtextureptr.load(":Data:Textures:bush.png", 0, 1);
+        objects.rocktextureptr.load(":Data:Textures:boulder.jpg", 1, 0);
+        objects.boxtextureptr.load(":Data:Textures:grassbox.jpg", 1, 0);
 
-               if(ambientsound)
-                 emit_stream_np(stream_wind, 100.);
+        if (ambientsound)
+            emit_stream_np(stream_wind, 100.);
 
-               footstepsound = footstepgr1;
-               footstepsound2 = footstepgr2;
-               footstepsound3 = footstepst1;
-               footstepsound4 = footstepst2;
+        footstepsound = footstepgr1;
+        footstepsound2 = footstepgr2;
+        footstepsound3 = footstepst1;
+        footstepsound4 = footstepst2;
 
-               terraintexture.load(":Data:Textures:grassdirt.jpg",1,0);
-               terraintexture2.load(":Data:Textures:mossrock.jpg",1,0);
+        terraintexture.load(":Data:Textures:grassdirt.jpg", 1, 0);
+        terraintexture2.load(":Data:Textures:mossrock.jpg", 1, 0);
 
-               //LoadTexture(":Data:Textures:detail.png",&terraintexture3,1);
+        //LoadTexture(":Data:Textures:detail.png",&terraintexture3,1);
 
 
 
-               temptexdetail=texdetail;
-               if(texdetail>1)texdetail=4;
-               skybox->load(   ":Data:Textures:Skybox(grass):Front.jpg",
-                       ":Data:Textures:Skybox(grass):Left.jpg",
-                       ":Data:Textures:Skybox(grass):Back.jpg",
-                       ":Data:Textures:Skybox(grass):Right.jpg",
-                       ":Data:Textures:Skybox(grass):Up.jpg",
-                       ":Data:Textures:Skybox(grass):Down.jpg");
+        temptexdetail = texdetail;
+        if (texdetail > 1)texdetail = 4;
+        skybox->load(  ":Data:Textures:Skybox(grass):Front.jpg",
+                        ":Data:Textures:Skybox(grass):Left.jpg",
+                        ":Data:Textures:Skybox(grass):Back.jpg",
+                        ":Data:Textures:Skybox(grass):Right.jpg",
+                        ":Data:Textures:Skybox(grass):Up.jpg",
+                        ":Data:Textures:Skybox(grass):Down.jpg");
 
 
 
-               texdetail=temptexdetail;
-       }
-       temptexdetail=texdetail;
-       texdetail=1;
-       terrain.load(":Data:Textures:heightmap.png");
+        texdetail = temptexdetail;
+    }
+    temptexdetail = texdetail;
+    texdetail = 1;
+    terrain.load(":Data:Textures:heightmap.png");
 
-       texdetail=temptexdetail;
+    texdetail = temptexdetail;
 }
 
-void LoadCampaign() {
-       if(!accountactive)
-               return;
-       ifstream ipstream(ConvertFileName((":Data:Campaigns:"+accountactive->getCurrentCampaign()+".txt").c_str()));
-       ipstream.ignore(256,':');
-       int numlevels;
-       ipstream >> numlevels;
-       campaignlevels.clear();
-       for(int i=0;i<numlevels;i++) {
-               CampaignLevel cl;
-               ipstream >> cl;
-               campaignlevels.push_back(cl);
-       }
-       ipstream.close();
-
-       ifstream test(ConvertFileName((":Data:Textures:"+accountactive->getCurrentCampaign()+":World.png").c_str()));
-       if(test.good()) {
-               Mainmenuitems[7].load((":Data:Textures:"+accountactive->getCurrentCampaign()+":World.png").c_str(),0,0);
-       } else {
-               Mainmenuitems[7].load(":Data:Textures:World.png",0,0);
-       }
-
-       if(accountactive->getCampaignChoicesMade()==0) {
-               accountactive->setCampaignScore(0);
-               accountactive->resetFasttime();
-       }
+void LoadCampaign()
+{
+    if (!accountactive)
+        return;
+    ifstream ipstream(ConvertFileName((":Data:Campaigns:" + accountactive->getCurrentCampaign() + ".txt").c_str()));
+    ipstream.ignore(256, ':');
+    int numlevels;
+    ipstream >> numlevels;
+    campaignlevels.clear();
+    for (int i = 0; i < numlevels; i++) {
+        CampaignLevel cl;
+        ipstream >> cl;
+        campaignlevels.push_back(cl);
+    }
+    ipstream.close();
+
+    ifstream test(ConvertFileName((":Data:Textures:" + accountactive->getCurrentCampaign() + ":World.png").c_str()));
+    if (test.good()) {
+        Mainmenuitems[7].load((":Data:Textures:" + accountactive->getCurrentCampaign() + ":World.png").c_str(), 0, 0);
+    } else {
+        Mainmenuitems[7].load(":Data:Textures:World.png", 0, 0);
+    }
+
+    if (accountactive->getCampaignChoicesMade() == 0) {
+        accountactive->setCampaignScore(0);
+        accountactive->resetFasttime();
+    }
 }
 
-vector<string> ListCampaigns() {
-       DIR *campaigns = opendir(ConvertFileName(":Data:Campaigns"));
-       struct dirent *campaign = NULL;
-       if(!campaigns) {
-               perror("Problem while loading campaigns");
-               cerr << "campaign folder was : " << ConvertFileName(":Data:Campaigns") << endl;
-               exit(EXIT_FAILURE);
-       }
-       vector<string> campaignNames;
-       while ((campaign = readdir(campaigns)) != NULL) {
-               string name(campaign->d_name);
-               if(name.length()<5)
-                       continue;
-               if(!name.compare(name.length()-4,4,".txt")) {
-                       campaignNames.push_back(name.substr(0,name.length()-4));
-               }
-       }
-       closedir(campaigns);
-       return campaignNames;
+vector<string> ListCampaigns()
+{
+    DIR *campaigns = opendir(ConvertFileName(":Data:Campaigns"));
+    struct dirent *campaign = NULL;
+    if (!campaigns) {
+        perror("Problem while loading campaigns");
+        cerr << "campaign folder was : " << ConvertFileName(":Data:Campaigns") << endl;
+        exit(EXIT_FAILURE);
+    }
+    vector<string> campaignNames;
+    while ((campaign = readdir(campaigns)) != NULL) {
+        string name(campaign->d_name);
+        if (name.length() < 5)
+            continue;
+        if (!name.compare(name.length() - 4, 4, ".txt")) {
+            campaignNames.push_back(name.substr(0, name.length() - 4));
+        }
+    }
+    closedir(campaigns);
+    return campaignNames;
 }
 
-void Loadlevel(int which) {
-       stealthloading=0;
-       whichlevel=which;
-
-       if(which == -1) {
-           tutoriallevel = -1;
-           Loadlevel("tutorial");
-       } else if(which >= 0 && which <= 15) {
-           char buf[32];
-           snprintf(buf, 32, "map%d", which + 1); // challenges
-           Loadlevel(buf);
-       } else
-           Loadlevel("mapsave");
+void Loadlevel(int which)
+{
+    stealthloading = 0;
+    whichlevel = which;
+
+    if (which == -1) {
+        tutoriallevel = -1;
+        Loadlevel("tutorial");
+    } else if (which >= 0 && which <= 15) {
+        char buf[32];
+        snprintf(buf, 32, "map%d", which + 1); // challenges
+        Loadlevel(buf);
+    } else
+        Loadlevel("mapsave");
 }
 
-void Loadlevel(const char *name) {
-       int templength;
-       float lamefloat;
-       static const char *pfx = ":Data:Maps:";
-       char *buf;
-
-       float headprop,legprop,armprop,bodyprop;
-
-       LOGFUNC;
-
-       LOG(std::string("Loading level...") + name);
-
-       if(!gameon)
-        visibleloading=1;
-       if(stealthloading)
-        visibleloading=0;
-       if(!stillloading)
-        loadtime=0;
-       gamestarted=1;
-
-       numenvsounds=0;
-
-       if(tutoriallevel!=-1)
-        tutoriallevel=0;
-       else
-        tutoriallevel=1;
-
-       if(tutoriallevel==1)
-        tutorialstage=0;
-       if(tutorialstage==0) {
-               tutorialstagetime=0;
-               tutorialmaxtime=1;
-       }
-       loadingstuff=1;
-       pause_sound(whooshsound);
-       pause_sound(stream_firesound);
-
-       // Change the map filename into something that is os specific
-       buf = (char*) alloca(strlen(pfx) + strlen(name) + 1);
-       sprintf(buf, "%s%s", pfx, name);
-       const char *FixedFN = ConvertFileName(buf);
-
-       int mapvers;
-       FILE *tfile;
-       //~ char* buff=getcwd(NULL,0);
-       //~ cout << buff << " " << FixedFN << endl;
-       //~ free(buff);
-       tfile=fopen( FixedFN, "rb" );
-       if(tfile) {
-               pause_sound(stream_firesound);
-               scoreadded=0;
-               windialogue=false;
-               hostiletime=0;
-               won=0;
-
-               animation[bounceidleanim].Load((char *)"Idle",middleheight,neutral);
-
-               numdialogues=0;
-
-               for(int i=0;i<20;i++)
-                       dialoguegonethrough[i]=0;
-
-               indialogue=-1;
-               cameramode=0;
-
-               damagedealt=0;
-               damagetaken=0;
-
-               if(accountactive)
-            difficulty=accountactive->getDifficulty();
-
-               numhotspots=0;
-               currenthotspot=-1;
-               bonustime=1;
-
-               skyboxtexture=1;
-               skyboxr=1;
-               skyboxg=1;
-               skyboxb=1;
-
-               freeze=0;
-               winfreeze=0;
-
-               for(int i=0;i<100;i++)
-                       bonusnum[i]=0;
-
-               numfalls=0;
-               numflipfail=0;
-               numseen=0;
-               numstaffattack=0;
-               numswordattack=0;
-               numknifeattack=0;
-               numunarmedattack=0;
-               numescaped=0;
-               numflipped=0;
-               numwallflipped=0;
-               numthrowkill=0;
-               numafterkill=0;
-               numreversals=0;
-               numattacks=0;
-               maxalarmed=0;
-               numresponded=0;
-
-               bonustotal=startbonustotal;
-               bonus=0;
-               gameon=1;
-               changedelay=0;
-               if(console){
-                       emit_sound_np(consolesuccesssound);
-                       freeze=0;
-                       console=false;
-               }
-
-               if(!stealthloading){
-                       terrain.numdecals=0;
-                       Sprite::deleteSprites();
-                       for(int i=0;i<objects.numobjects;i++)
-                               objects.model[i].numdecals=0;
-
-                       int j=objects.numobjects;
-                       for(int i=0;i<j;i++){
-                               objects.DeleteObject(0);
-                               if(visibleloading)
+void Loadlevel(const char *name)
+{
+    int templength;
+    float lamefloat;
+    static const char *pfx = ":Data:Maps:";
+    char *buf;
+
+    float headprop, legprop, armprop, bodyprop;
+
+    LOGFUNC;
+
+    LOG(std::string("Loading level...") + name);
+
+    if (!gameon)
+        visibleloading = 1;
+    if (stealthloading)
+        visibleloading = 0;
+    if (!stillloading)
+        loadtime = 0;
+    gamestarted = 1;
+
+    numenvsounds = 0;
+
+    if (tutoriallevel != -1)
+        tutoriallevel = 0;
+    else
+        tutoriallevel = 1;
+
+    if (tutoriallevel == 1)
+        tutorialstage = 0;
+    if (tutorialstage == 0) {
+        tutorialstagetime = 0;
+        tutorialmaxtime = 1;
+    }
+    loadingstuff = 1;
+    pause_sound(whooshsound);
+    pause_sound(stream_firesound);
+
+    // Change the map filename into something that is os specific
+    buf = (char*) alloca(strlen(pfx) + strlen(name) + 1);
+    sprintf(buf, "%s%s", pfx, name);
+    const char *FixedFN = ConvertFileName(buf);
+
+    int mapvers;
+    FILE *tfile;
+    //~ char* buff=getcwd(NULL,0);
+    //~ cout << buff << " " << FixedFN << endl;
+    //~ free(buff);
+    tfile = fopen( FixedFN, "rb" );
+    if (tfile) {
+        pause_sound(stream_firesound);
+        scoreadded = 0;
+        windialogue = false;
+        hostiletime = 0;
+        won = 0;
+
+        animation[bounceidleanim].Load((char *)"Idle", middleheight, neutral);
+
+        numdialogues = 0;
+
+        for (int i = 0; i < 20; i++)
+            dialoguegonethrough[i] = 0;
+
+        indialogue = -1;
+        cameramode = 0;
+
+        damagedealt = 0;
+        damagetaken = 0;
+
+        if (accountactive)
+            difficulty = accountactive->getDifficulty();
+
+        numhotspots = 0;
+        currenthotspot = -1;
+        bonustime = 1;
+
+        skyboxtexture = 1;
+        skyboxr = 1;
+        skyboxg = 1;
+        skyboxb = 1;
+
+        freeze = 0;
+        winfreeze = 0;
+
+        for (int i = 0; i < 100; i++)
+            bonusnum[i] = 0;
+
+        numfalls = 0;
+        numflipfail = 0;
+        numseen = 0;
+        numstaffattack = 0;
+        numswordattack = 0;
+        numknifeattack = 0;
+        numunarmedattack = 0;
+        numescaped = 0;
+        numflipped = 0;
+        numwallflipped = 0;
+        numthrowkill = 0;
+        numafterkill = 0;
+        numreversals = 0;
+        numattacks = 0;
+        maxalarmed = 0;
+        numresponded = 0;
+
+        bonustotal = startbonustotal;
+        bonus = 0;
+        gameon = 1;
+        changedelay = 0;
+        if (console) {
+            emit_sound_np(consolesuccesssound);
+            freeze = 0;
+            console = false;
+        }
+
+        if (!stealthloading) {
+            terrain.numdecals = 0;
+            Sprite::deleteSprites();
+            for (int i = 0; i < objects.numobjects; i++)
+                objects.model[i].numdecals = 0;
+
+            int j = objects.numobjects;
+            for (int i = 0; i < j; i++) {
+                objects.DeleteObject(0);
+                if (visibleloading)
                     LoadingScreen();
-                       }
+            }
 
-                       for(int i=0;i<subdivision;i++)
-                               for(int j=0;j<subdivision;j++)
-                                       terrain.patchobjectnum[i][j]=0;
-                       if(visibleloading)
+            for (int i = 0; i < subdivision; i++)
+                for (int j = 0; j < subdivision; j++)
+                    terrain.patchobjectnum[i][j] = 0;
+            if (visibleloading)
                 LoadingScreen();
-               }
+        }
 
-               weapons.clear();
+        weapons.clear();
 
-               funpackf(tfile, "Bi", &mapvers);
-               if(mapvers>=15)
+        funpackf(tfile, "Bi", &mapvers);
+        if (mapvers >= 15)
             funpackf(tfile, "Bi", &indemo);
-               else
-            indemo=0;
-               if(mapvers>=5)
+        else
+            indemo = 0;
+        if (mapvers >= 5)
             funpackf(tfile, "Bi", &maptype);
-               else
-            maptype=mapkilleveryone;
-               if(mapvers>=6)
+        else
+            maptype = mapkilleveryone;
+        if (mapvers >= 6)
             funpackf(tfile, "Bi", &hostile);
-               else
-            hostile=1;
-               if(mapvers>=4)
+        else
+            hostile = 1;
+        if (mapvers >= 4)
             funpackf(tfile, "Bf Bf", &viewdistance, &fadestart);
-               else{
-                       viewdistance=100;
-                       fadestart=.6;
-               }
-               if(mapvers>=2)
+        else {
+            viewdistance = 100;
+            fadestart = .6;
+        }
+        if (mapvers >= 2)
             funpackf(tfile, "Bb Bf Bf Bf", &skyboxtexture, &skyboxr, &skyboxg, &skyboxb);
-               else{
-                       skyboxtexture=1;
-                       skyboxr=1;
-                       skyboxg=1;
-                       skyboxb=1;
-               }
-               if(mapvers>=10)
+        else {
+            skyboxtexture = 1;
+            skyboxr = 1;
+            skyboxg = 1;
+            skyboxb = 1;
+        }
+        if (mapvers >= 10)
             funpackf(tfile, "Bf Bf Bf", &skyboxlightr, &skyboxlightg, &skyboxlightb);
-               else{
-                       skyboxlightr=skyboxr;
-                       skyboxlightg=skyboxg;
-                       skyboxlightb=skyboxb;
-               }
-               if(!stealthloading)
-            funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &player[0].coords.x,&player[0].coords.y,&player[0].coords.z,&player[0].yaw,&player[0].targetyaw, &player[0].num_weapons);
-               if(stealthloading)
-            funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &lamefloat,&lamefloat,&lamefloat,&lamefloat,&lamefloat, &player[0].num_weapons);
-               player[0].originalcoords=player[0].coords;
-               if(player[0].num_weapons>0&&player[0].num_weapons<5)
-                       for(int j=0;j<player[0].num_weapons;j++){
-                               player[0].weaponids[j]=weapons.size();
-                               int type;
-                               funpackf(tfile, "Bi", &type);
-                               weapons.push_back(Weapon(type,0));
-                       }
-
-               if(visibleloading)
+        else {
+            skyboxlightr = skyboxr;
+            skyboxlightg = skyboxg;
+            skyboxlightb = skyboxb;
+        }
+        if (!stealthloading)
+            funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &player[0].coords.x, &player[0].coords.y, &player[0].coords.z, &player[0].yaw, &player[0].targetyaw, &player[0].num_weapons);
+        if (stealthloading)
+            funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &lamefloat, &lamefloat, &lamefloat, &lamefloat, &lamefloat, &player[0].num_weapons);
+        player[0].originalcoords = player[0].coords;
+        if (player[0].num_weapons > 0 && player[0].num_weapons < 5)
+            for (int j = 0; j < player[0].num_weapons; j++) {
+                player[0].weaponids[j] = weapons.size();
+                int type;
+                funpackf(tfile, "Bi", &type);
+                weapons.push_back(Weapon(type, 0));
+            }
+
+        if (visibleloading)
             LoadingScreen();
 
-               funpackf(tfile, "Bf Bf Bf", &player[0].armorhead, &player[0].armorhigh, &player[0].armorlow);
-               funpackf(tfile, "Bf Bf Bf", &player[0].protectionhead, &player[0].protectionhigh, &player[0].protectionlow);
-               funpackf(tfile, "Bf Bf Bf", &player[0].metalhead, &player[0].metalhigh, &player[0].metallow);
-               funpackf(tfile, "Bf Bf", &player[0].power, &player[0].speedmult);
+        funpackf(tfile, "Bf Bf Bf", &player[0].armorhead, &player[0].armorhigh, &player[0].armorlow);
+        funpackf(tfile, "Bf Bf Bf", &player[0].protectionhead, &player[0].protectionhigh, &player[0].protectionlow);
+        funpackf(tfile, "Bf Bf Bf", &player[0].metalhead, &player[0].metalhigh, &player[0].metallow);
+        funpackf(tfile, "Bf Bf", &player[0].power, &player[0].speedmult);
 
-               funpackf(tfile, "Bi", &player[0].numclothes);
+        funpackf(tfile, "Bi", &player[0].numclothes);
 
-               if(mapvers>=9)
-                       funpackf(tfile, "Bi Bi", &player[0].whichskin, &player[0].creature);
-               else{
-                       player[0].whichskin=0;
-                       player[0].creature=rabbittype;
-               }
+        if (mapvers >= 9)
+            funpackf(tfile, "Bi Bi", &player[0].whichskin, &player[0].creature);
+        else {
+            player[0].whichskin = 0;
+            player[0].creature = rabbittype;
+        }
 
-               player[0].lastattack=-1;
-               player[0].lastattack2=-1;
-               player[0].lastattack3=-1;
+        player[0].lastattack = -1;
+        player[0].lastattack2 = -1;
+        player[0].lastattack3 = -1;
 
         //dialogues
-               if(mapvers>=8){
-                       funpackf(tfile, "Bi", &numdialogues);
-            for(int k=0;k<numdialogues;k++){
+        if (mapvers >= 8) {
+            funpackf(tfile, "Bi", &numdialogues);
+            for (int k = 0; k < numdialogues; k++) {
                 funpackf(tfile, "Bi", &numdialogueboxes[k]);
                 funpackf(tfile, "Bi", &dialoguetype[k]);
-                for(int l=0;l<10;l++){
+                for (int l = 0; l < 10; l++) {
                     funpackf(tfile, "Bf Bf Bf", &participantlocation[k][l].x, &participantlocation[k][l].y, &participantlocation[k][l].z);
                     funpackf(tfile, "Bf", &participantyaw[k][l]);
                 }
-                for(int l=0;l<numdialogueboxes[k];l++){
+                for (int l = 0; l < numdialogueboxes[k]; l++) {
                     funpackf(tfile, "Bi", &dialogueboxlocation[k][l]);
                     funpackf(tfile, "Bf", &dialogueboxcolor[k][l][0]);
                     funpackf(tfile, "Bf", &dialogueboxcolor[k][l][1]);
                     funpackf(tfile, "Bf", &dialogueboxcolor[k][l][2]);
                     funpackf(tfile, "Bi", &dialogueboxsound[k][l]);
 
-                    funpackf(tfile, "Bi",&templength);
-                    if(templength>128||templength<=0)
-                        templength=128;
+                    funpackf(tfile, "Bi", &templength);
+                    if (templength > 128 || templength <= 0)
+                        templength = 128;
                     int m;
-                    for(m=0;m<templength;m++){
+                    for (m = 0; m < templength; m++) {
                         funpackf(tfile, "Bb", &dialoguetext[k][l][m]);
-                        if(dialoguetext[k][l][m]=='\0')
+                        if (dialoguetext[k][l][m] == '\0')
                             break;
                     }
                     dialoguetext[k][l][m] = 0;
 
-                    funpackf(tfile, "Bi",&templength);
-                    if(templength>64||templength<=0)templength=64;
-                    for(m=0;m<templength;m++){
+                    funpackf(tfile, "Bi", &templength);
+                    if (templength > 64 || templength <= 0)templength = 64;
+                    for (m = 0; m < templength; m++) {
                         funpackf(tfile, "Bb", &dialoguename[k][l][m]);
-                        if(dialoguename[k][l][m]=='\0')
+                        if (dialoguename[k][l][m] == '\0')
                             break;
                     }
                     dialoguename[k][l][m] = 0;
@@ -1820,233 +1894,233 @@ void Loadlevel(const char *name) {
                     funpackf(tfile, "Bi", &participantfocus[k][l]);
                     funpackf(tfile, "Bi", &participantaction[k][l]);
 
-                    for(m=0;m<10;m++)
+                    for (m = 0; m < 10; m++)
                         funpackf(tfile, "Bf Bf Bf", &participantfacing[k][l][m].x, &participantfacing[k][l][m].y, &participantfacing[k][l][m].z);
 
-                    funpackf(tfile, "Bf Bf",&dialoguecamerayaw[k][l],&dialoguecamerapitch[k][l]);
+                    funpackf(tfile, "Bf Bf", &dialoguecamerayaw[k][l], &dialoguecamerapitch[k][l]);
                 }
             }
-               }else
-            numdialogues=0;
+        else
+            numdialogues = 0;
 
-        for(int k=0;k<player[0].numclothes;k++){
+        for (int k = 0; k < player[0].numclothes; k++) {
             funpackf(tfile, "Bi", &templength);
-            for(int l=0;l<templength;l++)
+            for (int l = 0; l < templength; l++)
                 funpackf(tfile, "Bb", &player[0].clothes[k][l]);
-            player[0].clothes[k][templength]='\0';
+            player[0].clothes[k][templength] = '\0';
             funpackf(tfile, "Bf Bf Bf", &player[0].clothestintr[k], &player[0].clothestintg[k], &player[0].clothestintb[k]);
         }
 
-               funpackf(tfile, "Bi", &environment);
+        funpackf(tfile, "Bi", &environment);
 
-               funpackf(tfile, "Bi", &objects.numobjects);
-        for(int i=0;i<objects.numobjects;i++){
-            funpackf(tfile, "Bi Bf Bf Bf Bf Bf Bf", &objects.type[i],&objects.yaw[i],&objects.pitch[i], &objects.position[i].x, &objects.position[i].y, &objects.position[i].z,&objects.scale[i]);
-            if(objects.type[i]==treeleavestype)
-                objects.scale[i]=objects.scale[i-1];
+        funpackf(tfile, "Bi", &objects.numobjects);
+        for (int i = 0; i < objects.numobjects; i++) {
+            funpackf(tfile, "Bi Bf Bf Bf Bf Bf Bf", &objects.type[i], &objects.yaw[i], &objects.pitch[i], &objects.position[i].x, &objects.position[i].y, &objects.position[i].z, &objects.scale[i]);
+            if (objects.type[i] == treeleavestype)
+                objects.scale[i] = objects.scale[i - 1];
         }
 
-               if(mapvers>=7){
-                       funpackf(tfile, "Bi", &numhotspots);
-            for(int i=0;i<numhotspots;i++){
-                funpackf(tfile, "Bi Bf Bf Bf Bf", &hotspottype[i],&hotspotsize[i],&hotspot[i].x,&hotspot[i].y,&hotspot[i].z);
+        if (mapvers >= 7) {
+            funpackf(tfile, "Bi", &numhotspots);
+            for (int i = 0; i < numhotspots; i++) {
+                funpackf(tfile, "Bi Bf Bf Bf Bf", &hotspottype[i], &hotspotsize[i], &hotspot[i].x, &hotspot[i].y, &hotspot[i].z);
                 funpackf(tfile, "Bi", &templength);
-                if(templength)
-                    for(int l=0;l<templength;l++)
+                if (templength)
+                    for (int l = 0; l < templength; l++)
                         funpackf(tfile, "Bb", &hotspottext[i][l]);
-                hotspottext[i][templength]='\0';
-                if(hotspottype[i]==-111)
-                    indemo=1;
+                hotspottext[i][templength] = '\0';
+                if (hotspottype[i] == -111)
+                    indemo = 1;
             }
-               }else
-            numhotspots=0;
+        else
+            numhotspots = 0;
 
-               if(visibleloading)
+        if (visibleloading)
             LoadingScreen();
 
-               if(!stealthloading){
-                       objects.center=0;
-                       for(int i=0;i<objects.numobjects;i++)
-                               objects.center+=objects.position[i];
-                       objects.center/=objects.numobjects;
+        if (!stealthloading) {
+            objects.center = 0;
+            for (int i = 0; i < objects.numobjects; i++)
+                objects.center += objects.position[i];
+            objects.center /= objects.numobjects;
 
 
-                       if(visibleloading)
+            if (visibleloading)
                 LoadingScreen();
 
-                       float maxdistance=0;
-                       float tempdist;
-                       //~ int whichclosest;
-                       for(int i=0;i<objects.numobjects;i++){
-                               tempdist=distsq(&objects.center,&objects.position[i]);
-                               if(tempdist>maxdistance){
-                                       //~ whichclosest=i;
-                                       maxdistance=tempdist;
-                               }
-                       }
-                       objects.radius=fast_sqrt(maxdistance);
-               }
-
-               if(visibleloading)
+            float maxdistance = 0;
+            float tempdist;
+            //~ int whichclosest;
+            for (int i = 0; i < objects.numobjects; i++) {
+                tempdist = distsq(&objects.center, &objects.position[i]);
+                if (tempdist > maxdistance) {
+                    //~ whichclosest=i;
+                    maxdistance = tempdist;
+                }
+            }
+            objects.radius = fast_sqrt(maxdistance);
+        }
+
+        if (visibleloading)
             LoadingScreen();
-               //mapcenter=objects.center;
-               //mapradius=objects.radius;
-
-               funpackf(tfile, "Bi", &numplayers);
-               int howmanyremoved=0;
-               bool removeanother=0;
-               if(numplayers>1&&numplayers<maxplayers){
-                       for(int i=1;i<numplayers;i++){
-                               if(visibleloading)
+        //mapcenter=objects.center;
+        //mapradius=objects.radius;
+
+        funpackf(tfile, "Bi", &numplayers);
+        int howmanyremoved = 0;
+        bool removeanother = 0;
+        if (numplayers > 1 && numplayers < maxplayers) {
+            for (int i = 1; i < numplayers; i++) {
+                if (visibleloading)
                     LoadingScreen();
-                               removeanother=0;
-
-                               funpackf(tfile, "Bi Bi Bf Bf Bf Bi",&player[i-howmanyremoved].whichskin,&player[i-howmanyremoved].creature, &player[i-howmanyremoved].coords.x,&player[i-howmanyremoved].coords.y,&player[i-howmanyremoved].coords.z,&player[i-howmanyremoved].num_weapons);
-                               if(mapvers>=5)
-                    funpackf(tfile, "Bi", &player[i-howmanyremoved].howactive);
-                               else
-                    player[i-howmanyremoved].howactive=typeactive;
-                               if(mapvers>=3)
-                    funpackf(tfile, "Bf",&player[i-howmanyremoved].scale);
-                               else
-                    player[i-howmanyremoved].scale=-1;
-                               if(mapvers>=11)
-                    funpackf(tfile, "Bb",&player[i-howmanyremoved].immobile);
-                               else
-                    player[i-howmanyremoved].immobile=0;
-                               if(mapvers>=12)
-                    funpackf(tfile, "Bf",&player[i-howmanyremoved].yaw);
-                               else
-                    player[i-howmanyremoved].yaw=0;
-                               player[i-howmanyremoved].targetyaw=player[i-howmanyremoved].yaw;
-                               if(player[i-howmanyremoved].num_weapons<0||player[i-howmanyremoved].num_weapons>5){
-                                       removeanother=1;
-                                       howmanyremoved++;
-                               }
-                               if(!removeanother){
-                                       if(player[i-howmanyremoved].num_weapons>0&&player[i-howmanyremoved].num_weapons<5){
-                                               for(int j=0;j<player[i-howmanyremoved].num_weapons;j++){
-                                                       player[i-howmanyremoved].weaponids[j]=weapons.size();
-                                                       int type;
-                                                       funpackf(tfile, "Bi", &type);
-                                                       weapons.push_back(Weapon(type,i));
-                                               }
-                                       }
-                                       funpackf(tfile, "Bi", &player[i-howmanyremoved].numwaypoints);
-                                       //player[i-howmanyremoved].numwaypoints=10;
-                                       for(int j=0;j<player[i-howmanyremoved].numwaypoints;j++){
-                                               funpackf(tfile, "Bf", &player[i-howmanyremoved].waypoints[j].x);
-                                               funpackf(tfile, "Bf", &player[i-howmanyremoved].waypoints[j].y);
-                                               funpackf(tfile, "Bf", &player[i-howmanyremoved].waypoints[j].z);
-                                               if(mapvers>=5)
-                            funpackf(tfile, "Bi", &player[i-howmanyremoved].waypointtype[j]);
-                                               else
-                            player[i-howmanyremoved].waypointtype[j] = wpkeepwalking;
-                                       }
-
-                                       funpackf(tfile, "Bi", &player[i-howmanyremoved].waypoint);
-                                       if(player[i-howmanyremoved].waypoint>player[i-howmanyremoved].numwaypoints-1)
-                        player[i-howmanyremoved].waypoint=0;
-
-                                       funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].armorhead, &player[i-howmanyremoved].armorhigh, &player[i-howmanyremoved].armorlow);
-                                       funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].protectionhead, &player[i-howmanyremoved].protectionhigh, &player[i-howmanyremoved].protectionlow);
-                                       funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].metalhead, &player[i-howmanyremoved].metalhigh, &player[i-howmanyremoved].metallow);
-                                       funpackf(tfile, "Bf Bf", &player[i-howmanyremoved].power, &player[i-howmanyremoved].speedmult);
-
-                                       if(mapvers>=4)
+                removeanother = 0;
+
+                funpackf(tfile, "Bi Bi Bf Bf Bf Bi", &player[i - howmanyremoved].whichskin, &player[i - howmanyremoved].creature, &player[i - howmanyremoved].coords.x, &player[i - howmanyremoved].coords.y, &player[i - howmanyremoved].coords.z, &player[i - howmanyremoved].num_weapons);
+                if (mapvers >= 5)
+                    funpackf(tfile, "Bi", &player[i - howmanyremoved].howactive);
+                else
+                    player[i - howmanyremoved].howactive = typeactive;
+                if (mapvers >= 3)
+                    funpackf(tfile, "Bf", &player[i - howmanyremoved].scale);
+                else
+                    player[i - howmanyremoved].scale = -1;
+                if (mapvers >= 11)
+                    funpackf(tfile, "Bb", &player[i - howmanyremoved].immobile);
+                else
+                    player[i - howmanyremoved].immobile = 0;
+                if (mapvers >= 12)
+                    funpackf(tfile, "Bf", &player[i - howmanyremoved].yaw);
+                else
+                    player[i - howmanyremoved].yaw = 0;
+                player[i - howmanyremoved].targetyaw = player[i - howmanyremoved].yaw;
+                if (player[i - howmanyremoved].num_weapons < 0 || player[i - howmanyremoved].num_weapons > 5) {
+                    removeanother = 1;
+                    howmanyremoved++;
+                }
+                if (!removeanother) {
+                    if (player[i - howmanyremoved].num_weapons > 0 && player[i - howmanyremoved].num_weapons < 5) {
+                        for (int j = 0; j < player[i - howmanyremoved].num_weapons; j++) {
+                            player[i - howmanyremoved].weaponids[j] = weapons.size();
+                            int type;
+                            funpackf(tfile, "Bi", &type);
+                            weapons.push_back(Weapon(type, i));
+                        }
+                    }
+                    funpackf(tfile, "Bi", &player[i - howmanyremoved].numwaypoints);
+                    //player[i-howmanyremoved].numwaypoints=10;
+                    for (int j = 0; j < player[i - howmanyremoved].numwaypoints; j++) {
+                        funpackf(tfile, "Bf", &player[i - howmanyremoved].waypoints[j].x);
+                        funpackf(tfile, "Bf", &player[i - howmanyremoved].waypoints[j].y);
+                        funpackf(tfile, "Bf", &player[i - howmanyremoved].waypoints[j].z);
+                        if (mapvers >= 5)
+                            funpackf(tfile, "Bi", &player[i - howmanyremoved].waypointtype[j]);
+                        else
+                            player[i - howmanyremoved].waypointtype[j] = wpkeepwalking;
+                    }
+
+                    funpackf(tfile, "Bi", &player[i - howmanyremoved].waypoint);
+                    if (player[i - howmanyremoved].waypoint > player[i - howmanyremoved].numwaypoints - 1)
+                        player[i - howmanyremoved].waypoint = 0;
+
+                    funpackf(tfile, "Bf Bf Bf", &player[i - howmanyremoved].armorhead, &player[i - howmanyremoved].armorhigh, &player[i - howmanyremoved].armorlow);
+                    funpackf(tfile, "Bf Bf Bf", &player[i - howmanyremoved].protectionhead, &player[i - howmanyremoved].protectionhigh, &player[i - howmanyremoved].protectionlow);
+                    funpackf(tfile, "Bf Bf Bf", &player[i - howmanyremoved].metalhead, &player[i - howmanyremoved].metalhigh, &player[i - howmanyremoved].metallow);
+                    funpackf(tfile, "Bf Bf", &player[i - howmanyremoved].power, &player[i - howmanyremoved].speedmult);
+
+                    if (mapvers >= 4)
                         funpackf(tfile, "Bf Bf Bf Bf", &headprop, &bodyprop, &armprop, &legprop);
-                                       else{
-                                               headprop=1;
-                                               bodyprop=1;
-                                               armprop=1;
-                                               legprop=1;
-                                       }
-                                       if(player[i-howmanyremoved].creature==wolftype){
-                                               player[i-howmanyremoved].proportionhead=1.1*headprop;
-                                               player[i-howmanyremoved].proportionbody=1.1*bodyprop;
-                                               player[i-howmanyremoved].proportionarms=1.1*armprop;
-                                               player[i-howmanyremoved].proportionlegs=1.1*legprop;
-                                       }
-
-                                       if(player[i-howmanyremoved].creature==rabbittype){
-                                               player[i-howmanyremoved].proportionhead=1.2*headprop;
-                                               player[i-howmanyremoved].proportionbody=1.05*bodyprop;
-                                               player[i-howmanyremoved].proportionarms=1.00*armprop;
-                                               player[i-howmanyremoved].proportionlegs=1.1*legprop;
-                                               player[i-howmanyremoved].proportionlegs.y=1.05*legprop;
-                                       }
-
-                                       funpackf(tfile, "Bi", &player[i-howmanyremoved].numclothes);
-                                       if(player[i-howmanyremoved].numclothes){
-                                               for(int k=0;k<player[i-howmanyremoved].numclothes;k++){
-                                                       int templength;
-                                                       funpackf(tfile, "Bi", &templength);
-                                                       for(int l=0;l<templength;l++)
-                                                               funpackf(tfile, "Bb", &player[i-howmanyremoved].clothes[k][l]);
-                                                       player[i-howmanyremoved].clothes[k][templength]='\0';
-                                                       funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].clothestintr[k], &player[i-howmanyremoved].clothestintg[k], &player[i-howmanyremoved].clothestintb[k]);
-                                               }
-                                       }
-                               }
-                       }
-               }
-               if(visibleloading)
+                    else {
+                        headprop = 1;
+                        bodyprop = 1;
+                        armprop = 1;
+                        legprop = 1;
+                    }
+                    if (player[i - howmanyremoved].creature == wolftype) {
+                        player[i - howmanyremoved].proportionhead = 1.1 * headprop;
+                        player[i - howmanyremoved].proportionbody = 1.1 * bodyprop;
+                        player[i - howmanyremoved].proportionarms = 1.1 * armprop;
+                        player[i - howmanyremoved].proportionlegs = 1.1 * legprop;
+                    }
+
+                    if (player[i - howmanyremoved].creature == rabbittype) {
+                        player[i - howmanyremoved].proportionhead = 1.2 * headprop;
+                        player[i - howmanyremoved].proportionbody = 1.05 * bodyprop;
+                        player[i - howmanyremoved].proportionarms = 1.00 * armprop;
+                        player[i - howmanyremoved].proportionlegs = 1.1 * legprop;
+                        player[i - howmanyremoved].proportionlegs.y = 1.05 * legprop;
+                    }
+
+                    funpackf(tfile, "Bi", &player[i - howmanyremoved].numclothes);
+                    if (player[i - howmanyremoved].numclothes) {
+                        for (int k = 0; k < player[i - howmanyremoved].numclothes; k++) {
+                            int templength;
+                            funpackf(tfile, "Bi", &templength);
+                            for (int l = 0; l < templength; l++)
+                                funpackf(tfile, "Bb", &player[i - howmanyremoved].clothes[k][l]);
+                            player[i - howmanyremoved].clothes[k][templength] = '\0';
+                            funpackf(tfile, "Bf Bf Bf", &player[i - howmanyremoved].clothestintr[k], &player[i - howmanyremoved].clothestintg[k], &player[i - howmanyremoved].clothestintb[k]);
+                        }
+                    }
+                }
+            }
+        }
+        if (visibleloading)
             LoadingScreen();
 
-               numplayers-=howmanyremoved;
-               funpackf(tfile, "Bi", &numpathpoints);
-               if(numpathpoints>30||numpathpoints<0)
-                       numpathpoints=0;
-        for(int j=0;j<numpathpoints;j++){
-            funpackf(tfile, "Bf Bf Bf Bi", &pathpoint[j].x,&pathpoint[j].y,&pathpoint[j].z,&numpathpointconnect[j]);
-            for(int k=0;k<numpathpointconnect[j];k++){
+        numplayers -= howmanyremoved;
+        funpackf(tfile, "Bi", &numpathpoints);
+        if (numpathpoints > 30 || numpathpoints < 0)
+            numpathpoints = 0;
+        for (int j = 0; j < numpathpoints; j++) {
+            funpackf(tfile, "Bf Bf Bf Bi", &pathpoint[j].x, &pathpoint[j].y, &pathpoint[j].z, &numpathpointconnect[j]);
+            for (int k = 0; k < numpathpointconnect[j]; k++) {
                 funpackf(tfile, "Bi", &pathpointconnect[j][k]);
             }
         }
-               if(visibleloading)
+        if (visibleloading)
             LoadingScreen();
 
-               funpackf(tfile, "Bf Bf Bf Bf", &mapcenter.x,&mapcenter.y,&mapcenter.z,&mapradius);
+        funpackf(tfile, "Bf Bf Bf Bf", &mapcenter.x, &mapcenter.y, &mapcenter.z, &mapradius);
 
-               SetUpLighting();
-               if(environment!=oldenvironment)
+        SetUpLighting();
+        if (environment != oldenvironment)
             Setenvironment(environment);
-               oldenvironment=environment;
-
-               if(!stealthloading){
-                       int j=objects.numobjects;
-                       objects.numobjects=0;
-                       for(int i=0;i<j;i++){
-                               objects.MakeObject(objects.type[i],objects.position[i],objects.yaw[i],objects.pitch[i],objects.scale[i]);
-                               if(visibleloading)
+        oldenvironment = environment;
+
+        if (!stealthloading) {
+            int j = objects.numobjects;
+            objects.numobjects = 0;
+            for (int i = 0; i < j; i++) {
+                objects.MakeObject(objects.type[i], objects.position[i], objects.yaw[i], objects.pitch[i], objects.scale[i]);
+                if (visibleloading)
                     LoadingScreen();
-                       }
+            }
 
-                       terrain.DoShadows();
-                       if(visibleloading)
+            terrain.DoShadows();
+            if (visibleloading)
                 LoadingScreen();
-                       objects.DoShadows();
-                       if(visibleloading)
+            objects.DoShadows();
+            if (visibleloading)
                 LoadingScreen();
-               }
+        }
 
-               fclose(tfile);
+        fclose(tfile);
 
-               if(numplayers>maxplayers-1)
-            numplayers=maxplayers-1;
-               for(int i=0;i<numplayers;i++){
-                       if(visibleloading)
+        if (numplayers > maxplayers - 1)
+            numplayers = maxplayers - 1;
+        for (int i = 0; i < numplayers; i++) {
+            if (visibleloading)
                 LoadingScreen();
-                       player[i].burnt=0;
-                       player[i].bled=0;
-                       player[i].onfire=0;
-                       if(i==0||player[i].scale<0)
-                player[i].scale=.2;
-                       player[i].skeleton.free=0;
-                       player[i].skeleton.id=i;
-                       if(i==0&&mapvers<9)
-                player[i].creature=rabbittype;
-                       if(player[i].creature!=wolftype){
+            player[i].burnt = 0;
+            player[i].bled = 0;
+            player[i].onfire = 0;
+            if (i == 0 || player[i].scale < 0)
+                player[i].scale = .2;
+            player[i].skeleton.free = 0;
+            player[i].skeleton.id = i;
+            if (i == 0 && mapvers < 9)
+                player[i].creature = rabbittype;
+            if (player[i].creature != wolftype) {
                 player[i].skeleton.Load(
                     (char *)":Data:Skeleton:Basic Figure",
                     (char *)":Data:Skeleton:Basic Figurelow",
@@ -2059,868 +2133,982 @@ void Loadlevel(const char *name) {
                     (char *)":Data:Models:Body6.solid",
                     (char *)":Data:Models:Body7.solid",
                     (char *)":Data:Models:Bodylow.solid",
-                    (char *)":Data:Models:Belt.solid",0);
-            }else{
-                               if(player[i].creature!=wolftype){
-                                       player[i].skeleton.Load(
-                            (char *)":Data:Skeleton:Basic Figure",
-                            (char *)":Data:Skeleton:Basic Figurelow",
-                            (char *)":Data:Skeleton:Rabbitbelt",
-                            (char *)":Data:Models:Body.solid",
-                            (char *)":Data:Models:Body2.solid",
-                            (char *)":Data:Models:Body3.solid",
-                            (char *)":Data:Models:Body4.solid",
-                            (char *)":Data:Models:Body5.solid",
-                            (char *)":Data:Models:Body6.solid",
-                            (char *)":Data:Models:Body7.solid",
-                            (char *)":Data:Models:Bodylow.solid",
-                            (char *)":Data:Models:Belt.solid",1);
-                                       player[i].skeleton.drawmodelclothes.textureptr.load(":Data:Textures:Belt.png",1,1);
-                               }
-                               if(player[i].creature==wolftype){
-                                       player[i].skeleton.Load(
-                            (char *)":Data:Skeleton:Basic Figure Wolf",
-                            (char *)":Data:Skeleton:Basic Figure Wolf Low",
-                            (char *)":Data:Skeleton:Rabbitbelt",
-                            (char *)":Data:Models:Wolf.solid",
-                            (char *)":Data:Models:Wolf2.solid",
-                            (char *)":Data:Models:Wolf3.solid",
-                            (char *)":Data:Models:Wolf4.solid",
-                            (char *)":Data:Models:Wolf5.solid",
-                            (char *)":Data:Models:Wolf6.solid",
-                            (char *)":Data:Models:Wolf7.solid",
-                            (char *)":Data:Models:Wolflow.solid",
-                            (char *)":Data:Models:Belt.solid",0);
-                               }
-                       }
-
-
-                       //~ int texsize;
-                       //~ texsize=512*512*3/texdetail/texdetail;
-
-                       player[i].skeleton.drawmodel.textureptr.load(creatureskin[player[i].creature][player[i].whichskin],1,&player[i].skeleton.skinText[0],&player[i].skeleton.skinsize);
-
-                       if(player[i].numclothes){
-                               for(int j=0;j<player[i].numclothes;j++){
-                                       tintr=player[i].clothestintr[j];
-                                       tintg=player[i].clothestintg[j];
-                                       tintb=player[i].clothestintb[j];
-                                       AddClothes((char *)player[i].clothes[j],&player[i].skeleton.skinText[0]);
-                               }
-                               player[i].DoMipmaps();
-                       }
-
-                       player[i].animCurrent=bounceidleanim;
-                       player[i].animTarget=bounceidleanim;
-                       player[i].frameCurrent=0;
-                       player[i].frameTarget=1;
-                       player[i].target=0;
-                       player[i].speed=1+(float)(Random()%100)/1000;
-                       if(difficulty==0)
-                player[i].speed-=.2;
-                       if(difficulty==1)
-                player[i].speed-=.1;
-
-                       player[i].velocity=0;
-                       player[i].oldcoords=player[i].coords;
-                       player[i].realoldcoords=player[i].coords;
-
-                       player[i].id=i;
-                       player[i].skeleton.id=i;
-                       player[i].updatedelay=0;
-                       player[i].normalsupdatedelay=0;
-
-                       player[i].aitype=passivetype;
-                       player[i].madskills=0;
-
-                       if(i==0){
-                               player[i].proportionhead=1.2;
-                               player[i].proportionbody=1.05;
-                               player[i].proportionarms=1.00;
-                               player[i].proportionlegs=1.1;
-                               player[i].proportionlegs.y=1.05;
-                       }
-                       player[i].headless=0;
-                       player[i].currentoffset=0;
-                       player[i].targetoffset=0;
-
-                       player[i].damagetolerance=200;
-
-                       if(player[i].creature==wolftype){
-                               if(i==0||player[i].scale<0)
-                    player[i].scale=.23;
-                               player[i].damagetolerance=300;
-                       }
-
-                       if(visibleloading)
-                LoadingScreen();
-                       if(cellophane){
-                               player[i].proportionhead.z=0;
-                               player[i].proportionbody.z=0;
-                               player[i].proportionarms.z=0;
-                               player[i].proportionlegs.z=0;
-                       }
-
-                       player[i].tempanimation.Load((char *)"Tempanim",0,0);
-
-                       player[i].headmorphness=0;
-                       player[i].targetheadmorphness=1;
-                       player[i].headmorphstart=0;
-                       player[i].headmorphend=0;
-
-                       player[i].pausetime=0;
-
-                       player[i].dead=0;
-                       player[i].jumppower=5;
-                       player[i].damage=0;
-                       player[i].permanentdamage=0;
-                       player[i].superpermanentdamage=0;
-
-                       player[i].forwardkeydown=0;
-                       player[i].leftkeydown=0;
-                       player[i].backkeydown=0;
-                       player[i].rightkeydown=0;
-                       player[i].jumpkeydown=0;
-                       player[i].crouchkeydown=0;
-                       player[i].throwkeydown=0;
-
-                       player[i].collided=-10;
-                       player[i].loaded=1;
-                       player[i].bloodloss=0;
-                       player[i].weaponactive=-1;
-                       player[i].weaponstuck=-1;
-                       player[i].bleeding=0;
-                       player[i].deathbleeding=0;
-                       player[i].stunned=0;
-                       player[i].hasvictim=0;
-                       player[i].wentforweapon=0;
-               }
-
-               player[0].aitype=playercontrolled;
-               player[0].weaponactive=-1;
-
-               if(difficulty==1)
-                       player[0].power=1/.9;
-
-               if(difficulty==0)
-                       player[0].power=1/.8;
-
-               if(difficulty==1)
-            player[0].damagetolerance=250;
-               if(difficulty==0)
-            player[0].damagetolerance=300;
-               if(difficulty==0)
-            player[0].armorhead*=1.5;
-               if(difficulty==0)
-            player[0].armorhigh*=1.5;
-               if(difficulty==0)
-            player[0].armorlow*=1.5;
-               cameraloc=player[0].coords;
-               cameraloc.y+=5;
-               yaw=player[0].yaw;
-
-               hawkcoords=player[0].coords;
-               hawkcoords.y+=30;
-
-               if(visibleloading)
-            LoadingScreen();
-               //~ for(int i=0;i<weapons.size();i++){
-               //~ }
-               
-               LOG("Starting background music...");
-
-               OPENAL_StopSound(OPENAL_ALL);
-               if(environment==snowyenvironment){
-                       if(ambientsound)
-                         emit_stream_np(stream_wind);
-               }else if(environment==desertenvironment){
-                       if(ambientsound)
-                         emit_stream_np(stream_desertambient);
-               }else if(environment==grassyenvironment){
-                       if(ambientsound)
-                         emit_stream_np(stream_wind, 100.);
-               }
-               oldmusicvolume[0]=0;
-               oldmusicvolume[1]=0;
-               oldmusicvolume[2]=0;
-               oldmusicvolume[3]=0;
-
-               if(!firstload)
-                       firstload=1;
-       } else {
-               perror("Problem");
-       }
-       leveltime=0;
-       loadingstuff=0;
-       visibleloading=0;
-}
-
-void doTutorial(){
-    if(tutorialstagetime>tutorialmaxtime){
-        tutorialstage++;
-        tutorialsuccess=0;
-        if(tutorialstage<=1){
-            canattack=0;
-            cananger=0;
-            reversaltrain=0;
-        }
-        switch(tutorialstage){
-            case 1:
-                tutorialmaxtime=5;
-            break; case 2:
-                tutorialmaxtime=2;
-            break; case 3:
-                tutorialmaxtime=600;
-            break; case 4:
-                tutorialmaxtime=1000;
-            break; case 5:
-                tutorialmaxtime=600;
-            break; case 6:
-                tutorialmaxtime=600;
-            break; case 7:
-                tutorialmaxtime=600;
-            break; case 8:
-                tutorialmaxtime=600;
-            break; case 9:
-                tutorialmaxtime=600;
-            break; case 10:
-                tutorialmaxtime=2;
-            break; case 11:
-                tutorialmaxtime=1000;
-            break; case 12:
-                tutorialmaxtime=1000;
-            break; case 13:
-                tutorialmaxtime=2;
-            break; case 14: {
-                tutorialmaxtime=3;
-
-                XYZ temp,temp2;
-
-                temp.x=1011;
-                temp.y=84;
-                temp.z=491;
-                temp2.x=1025;
-                temp2.y=75;
-                temp2.z=447;
-
-                player[1].coords=(temp+temp2)/2;
-
-                emit_sound_at(fireendsound, player[1].coords);
-
-                for(int i=0;i<player[1].skeleton.num_joints;i++){
-                    if(Random()%2==0){
-                        if(!player[1].skeleton.free)temp2=(player[1].coords-player[1].oldcoords)/multiplier/2;//velocity/2;
-                        if(player[1].skeleton.free)temp2=player[1].skeleton.joints[i].velocity*player[1].scale/2;
-                        if(!player[1].skeleton.free)temp=DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position,0,0,player[1].tilt),player[1].tilt2,0,0),0,player[1].yaw,0)*player[1].scale+player[1].coords;
-                        if(player[1].skeleton.free)temp=player[1].skeleton.joints[i].position*player[1].scale+player[1].coords;
-                        Sprite::MakeSprite(breathsprite, temp,temp2, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
-                    }
-                }
-            }
-            break; case 15:
-                tutorialmaxtime=500;
-            break; case 16:
-                tutorialmaxtime=500;
-            break; case 17:
-                tutorialmaxtime=500;
-            break; case 18:
-                tutorialmaxtime=500;
-            break; case 19:
-                tutorialstage=20;
-                //tutorialmaxtime=500;
-            break; case 20:
-                tutorialmaxtime=500;
-            break; case 21:
-                tutorialmaxtime=500;
-                if(bonus==cannon){
-                    bonus=Slicebonus;
-                    againbonus=1;
+                    (char *)":Data:Models:Belt.solid", 0);
+            } else {
+                if (player[i].creature != wolftype) {
+                    player[i].skeleton.Load(
+                        (char *)":Data:Skeleton:Basic Figure",
+                        (char *)":Data:Skeleton:Basic Figurelow",
+                        (char *)":Data:Skeleton:Rabbitbelt",
+                        (char *)":Data:Models:Body.solid",
+                        (char *)":Data:Models:Body2.solid",
+                        (char *)":Data:Models:Body3.solid",
+                        (char *)":Data:Models:Body4.solid",
+                        (char *)":Data:Models:Body5.solid",
+                        (char *)":Data:Models:Body6.solid",
+                        (char *)":Data:Models:Body7.solid",
+                        (char *)":Data:Models:Bodylow.solid",
+                        (char *)":Data:Models:Belt.solid", 1);
+                    player[i].skeleton.drawmodelclothes.textureptr.load(":Data:Textures:Belt.png", 1, 1);
                 }
-                else againbonus=0;
-            break; case 22:
-                tutorialmaxtime=500;
-            break; case 23:
-                tutorialmaxtime=500;
-            break; case 24:
-                tutorialmaxtime=500;
-            break; case 25:
-                tutorialmaxtime=500;
-            break; case 26:
-                tutorialmaxtime=2;
-            break; case 27:
-                tutorialmaxtime=4;
-                reversaltrain=1;
-                cananger=1;
-                player[1].aitype=attacktypecutoff;
-            break; case 28:
-                tutorialmaxtime=400;
-            break; case 29:
-                tutorialmaxtime=400;
-                player[0].escapednum=0;
-            break; case 30:
-                tutorialmaxtime=4;
-                reversaltrain=0;
-                cananger=0;
-                player[1].aitype=passivetype;
-            break; case 31:
-                tutorialmaxtime=13;
-            break; case 32:
-                tutorialmaxtime=8;
-            break; case 33:
-                tutorialmaxtime=400;
-                cananger=1;
-                canattack=1;
-                player[1].aitype=attacktypecutoff;
-            break; case 34:
-                tutorialmaxtime=400;
-            break; case 35:
-                tutorialmaxtime=400;
-            break; case 36:
-                tutorialmaxtime=2;
-                reversaltrain=0;
-                cananger=0;
-                player[1].aitype=passivetype;
-            break; case 37:
-                damagedealt=0;
-                damagetaken=0;
-                tutorialmaxtime=50;
-                cananger=1;
-                canattack=1;
-                player[1].aitype=attacktypecutoff;
-            break; case 38:
-                tutorialmaxtime=4;
-                canattack=0;
-                cananger=0;
-                player[1].aitype=passivetype;
-            break; case 39: {
-                XYZ temp,temp2;
-
-                temp.x=1011;
-                temp.y=84;
-                temp.z=491;
-                temp2.x=1025;
-                temp2.y=75;
-                temp2.z=447;
-
-                               Weapon w(knife,-1);
-                w.position=(temp+temp2)/2;
-                w.tippoint=(temp+temp2)/2;
-
-                w.velocity=0.1;
-                w.tipvelocity=0.1;
-                w.missed=1;
-                w.hitsomething=0;
-                w.freetime=0;
-                w.firstfree=1;
-                w.physics=1;
-
-                weapons.push_back(w);
-            }
-            break; case 40:
-                tutorialmaxtime=300;
-            break; case 41:
-                tutorialmaxtime=300;
-            break; case 42:
-                tutorialmaxtime=8;
-            break; case 43:
-                tutorialmaxtime=300;
-            break; case 44:
-                weapons[0].owner=1;
-                player[0].weaponactive=-1;
-                player[0].num_weapons=0;
-                player[1].weaponactive=0;
-                player[1].num_weapons=1;
-                player[1].weaponids[0]=0;
-
-                cananger=1;
-                canattack=1;
-                player[1].aitype=attacktypecutoff;
-
-                tutorialmaxtime=300;
-            break; case 45:
-                weapons[0].owner=1;
-                player[0].weaponactive=-1;
-                player[0].num_weapons=0;
-                player[1].weaponactive=0;
-                player[1].num_weapons=1;
-                player[1].weaponids[0]=0;
-
-                tutorialmaxtime=300;
-            break; case 46:
-                weapons[0].owner=1;
-                player[0].weaponactive=-1;
-                player[0].num_weapons=0;
-                player[1].weaponactive=0;
-                player[1].num_weapons=1;
-                player[1].weaponids[0]=0;
-
-                weapons[0].setType(sword);
-
-                tutorialmaxtime=300;
-            break; case 47: {
-                tutorialmaxtime=10;
-
-                XYZ temp,temp2;
-
-                temp.x=1011;
-                temp.y=84;
-                temp.z=491;
-                temp2.x=1025;
-                temp2.y=75;
-                temp2.z=447;
-
-                               Weapon w(sword,-1);
-                w.position=(temp+temp2)/2;
-                w.tippoint=(temp+temp2)/2;
-
-                w.velocity=0.1;
-                w.tipvelocity=0.1;
-                w.missed=1;
-                w.hitsomething=0;
-                w.freetime=0;
-                w.firstfree=1;
-                w.physics=1;
-                
-                weapons.push_back(w);
-
-                weapons[0].owner=1;
-                weapons[1].owner=0;
-                player[0].weaponactive=0;
-                player[0].num_weapons=1;
-                player[0].weaponids[0]=1;
-                player[1].weaponactive=0;
-                player[1].num_weapons=1;
-                player[1].weaponids[0]=0;
-
-            }
-            break; case 48:
-                canattack=0;
-                cananger=0;
-                player[1].aitype=passivetype;
-
-                tutorialmaxtime=15;
-
-                weapons[0].owner=1;
-                weapons[1].owner=0;
-                player[0].weaponactive=0;
-                player[0].num_weapons=1;
-                player[0].weaponids[0]=1;
-                player[1].weaponactive=0;
-                player[1].num_weapons=1;
-                player[1].weaponids[0]=0;
-
-                if(player[0].weaponactive!=-1)
-                                       weapons[player[0].weaponids[player[0].weaponactive]].setType(staff);
-                else 
-                                       weapons[0].setType(staff);
-            break; case 49:
-                canattack=0;
-                cananger=0;
-                player[1].aitype=passivetype;
-
-                tutorialmaxtime=200;
-
-                weapons[1].position=1000;
-                weapons[1].tippoint=1000;
-
-                weapons[0].setType(knife);
-
-                weapons[0].owner=0;
-                player[1].weaponactive=-1;
-                player[1].num_weapons=0;
-                player[0].weaponactive=0;
-                player[0].num_weapons=1;
-                player[0].weaponids[0]=0;
-
-            break; case 50: {
-                tutorialmaxtime=8;
-
-                XYZ temp,temp2;
-                emit_sound_at(fireendsound, player[1].coords);
-
-                for(int i=0;i<player[1].skeleton.num_joints;i++){
-                    if(Random()%2==0){
-                        if(!player[1].skeleton.free)temp2=(player[1].coords-player[1].oldcoords)/multiplier/2;//velocity/2;
-                        if(player[1].skeleton.free)temp2=player[1].skeleton.joints[i].velocity*player[1].scale/2;
-                        if(!player[1].skeleton.free)temp=DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position,0,0,player[1].tilt),player[1].tilt2,0,0),0,player[1].yaw,0)*player[1].scale+player[1].coords;
-                        if(player[1].skeleton.free)temp=player[1].skeleton.joints[i].position*player[1].scale+player[1].coords;
-                        Sprite::MakeSprite(breathsprite, temp,temp2, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
-                    }
+                if (player[i].creature == wolftype) {
+                    player[i].skeleton.Load(
+                        (char *)":Data:Skeleton:Basic Figure Wolf",
+                        (char *)":Data:Skeleton:Basic Figure Wolf Low",
+                        (char *)":Data:Skeleton:Rabbitbelt",
+                        (char *)":Data:Models:Wolf.solid",
+                        (char *)":Data:Models:Wolf2.solid",
+                        (char *)":Data:Models:Wolf3.solid",
+                        (char *)":Data:Models:Wolf4.solid",
+                        (char *)":Data:Models:Wolf5.solid",
+                        (char *)":Data:Models:Wolf6.solid",
+                        (char *)":Data:Models:Wolf7.solid",
+                        (char *)":Data:Models:Wolflow.solid",
+                        (char *)":Data:Models:Belt.solid", 0);
                 }
-
-                player[1].num_weapons=0;
-                player[1].weaponstuck=-1;
-                player[1].weaponactive=-1;
-
-                weapons.clear();
             }
-            break; case 51:
-                tutorialmaxtime=80000;
-            break; default: break;
-        }
-        if(tutorialstage<=51)tutorialstagetime=0;
-    }
-
-    //Tutorial success
-    if(tutorialstagetime<tutorialmaxtime-3){
-        switch(tutorialstage){
-            case 3: if(deltah||deltav)tutorialsuccess+=multiplier;
-            break; case 4: if(player[0].forwardkeydown||player[0].backkeydown||player[0].leftkeydown||player[0].rightkeydown)tutorialsuccess+=multiplier;
-            break; case 5: if(player[0].jumpkeydown)tutorialsuccess=1;
-            break; case 6: if(player[0].isCrouch())tutorialsuccess=1;
-            break; case 7: if(player[0].animTarget==rollanim)tutorialsuccess=1;
-            break; case 8: if(player[0].animTarget==sneakanim)tutorialsuccess+=multiplier;
-            break; case 9: if(player[0].animTarget==rabbitrunninganim||player[0].animTarget==wolfrunninganim)tutorialsuccess+=multiplier;
-            break; case 11: if(player[0].isWallJump())tutorialsuccess=1;
-            break; case 12: if(player[0].animTarget==flipanim)tutorialsuccess=1;
-            break; case 15: if(player[0].animTarget==upunchanim||player[0].animTarget==winduppunchanim)tutorialsuccess=1;
-            break; case 16: if(player[0].animTarget==winduppunchanim)tutorialsuccess=1;
-            break; case 17: if(player[0].animTarget==spinkickanim)tutorialsuccess=1;
-            break; case 18: if(player[0].animTarget==sweepanim)tutorialsuccess=1;
-            break; case 19: if(player[0].animTarget==dropkickanim)tutorialsuccess=1;
-            break; case 20: if(player[0].animTarget==rabbitkickanim)tutorialsuccess=1;
-            break; case 21: if(bonus==cannon)tutorialsuccess=1;
-            break; case 22: if(bonus==spinecrusher)tutorialsuccess=1;
-            break; case 23: if(player[0].animTarget==walljumprightkickanim||player[0].animTarget==walljumpleftkickanim)tutorialsuccess=1;
-            break; case 24: if(player[0].animTarget==rabbittacklinganim)tutorialsuccess=1;
-            break; case 25: if(player[0].animTarget==backhandspringanim)tutorialsuccess=1;
-            break; case 28: if(animation[player[0].animTarget].attack==reversed&&player[0].feint)tutorialsuccess=1;
-            break; case 29:
-                if(player[0].escapednum==2) {
-                    tutorialsuccess=1;
-                    reversaltrain=0;
-                    cananger=0;
-                    player[1].aitype=passivetype;
-                }
-            break; case 33: if(animation[player[0].animTarget].attack==reversal)tutorialsuccess=1;
-            break; case 34: if(animation[player[0].animTarget].attack==reversal)tutorialsuccess=1;
-            break; case 35:
-                if(animation[player[0].animTarget].attack==reversal){
-                    tutorialsuccess=1;
-                    reversaltrain=0;
-                    cananger=0;
-                    player[1].aitype=passivetype;
-                }
-            break; case 40: if(player[0].num_weapons>0)tutorialsuccess=1;
-            break; case 41: if(player[0].weaponactive==-1&&player[0].num_weapons>0)tutorialsuccess=1;
-            break; case 43: if(player[0].animTarget==knifeslashstartanim)tutorialsuccess=1;
-            break; case 44: if(animation[player[0].animTarget].attack==reversal)tutorialsuccess=1;
-            break; case 45: if(animation[player[0].animTarget].attack==reversal)tutorialsuccess=1;
-            break; case 46: if(animation[player[0].animTarget].attack==reversal)tutorialsuccess=1;
-            break; case 49: if(player[1].weaponstuck!=-1)tutorialsuccess=1;
-            break; default: break;
-        }
-        if(tutorialsuccess>=1)tutorialstagetime=tutorialmaxtime-3;
 
 
-        if(tutorialstagetime==tutorialmaxtime-3){
-            emit_sound_np(consolesuccesssound);
-        }
+            //~ int texsize;
+            //~ texsize=512*512*3/texdetail/texdetail;
 
-        if(tutorialsuccess>=1){
-            if(tutorialstage==34||tutorialstage==35)
-                tutorialstagetime=tutorialmaxtime-1;
-        }
-    }
+            player[i].skeleton.drawmodel.textureptr.load(creatureskin[player[i].creature][player[i].whichskin], 1, &player[i].skeleton.skinText[0], &player[i].skeleton.skinsize);
 
-    if(tutorialstage<14||tutorialstage>=50){
-        player[1].coords.y=300;
-        player[1].velocity=0;
-    }
-}
+            if (player[i].numclothes) {
+                for (int j = 0; j < player[i].numclothes; j++) {
+                    tintr = player[i].clothestintr[j];
+                    tintg = player[i].clothestintg[j];
+                    tintb = player[i].clothestintb[j];
+                    AddClothes((char *)player[i].clothes[j], &player[i].skeleton.skinText[0]);
+                }
+                player[i].DoMipmaps();
+            }
 
-void doDebugKeys(){
-       float headprop,bodyprop,armprop,legprop;
-    if(debugmode){
-        if(Input::isKeyPressed(SDLK_h)){
-            player[0].damagetolerance=200000;
-            player[0].damage=0;
-            player[0].burnt=0;
-            player[0].permanentdamage=0;
-            player[0].superpermanentdamage=0;
-        }
+            player[i].animCurrent = bounceidleanim;
+            player[i].animTarget = bounceidleanim;
+            player[i].frameCurrent = 0;
+            player[i].frameTarget = 1;
+            player[i].target = 0;
+            player[i].speed = 1 + (float)(Random() % 100) / 1000;
+            if (difficulty == 0)
+                player[i].speed -= .2;
+            if (difficulty == 1)
+                player[i].speed -= .1;
+
+            player[i].velocity = 0;
+            player[i].oldcoords = player[i].coords;
+            player[i].realoldcoords = player[i].coords;
+
+            player[i].id = i;
+            player[i].skeleton.id = i;
+            player[i].updatedelay = 0;
+            player[i].normalsupdatedelay = 0;
+
+            player[i].aitype = passivetype;
+            player[i].madskills = 0;
+
+            if (i == 0) {
+                player[i].proportionhead = 1.2;
+                player[i].proportionbody = 1.05;
+                player[i].proportionarms = 1.00;
+                player[i].proportionlegs = 1.1;
+                player[i].proportionlegs.y = 1.05;
+            }
+            player[i].headless = 0;
+            player[i].currentoffset = 0;
+            player[i].targetoffset = 0;
 
-        if(Input::isKeyPressed(SDLK_j)){
-            environment++;
-            if(environment>2)
-                environment=0;
-            Setenvironment(environment);
-        }
+            player[i].damagetolerance = 200;
 
-        if(Input::isKeyPressed(SDLK_c)){
-            cameramode=1-cameramode;
-        }
+            if (player[i].creature == wolftype) {
+                if (i == 0 || player[i].scale < 0)
+                    player[i].scale = .23;
+                player[i].damagetolerance = 300;
+            }
 
-        if(Input::isKeyPressed(SDLK_x)&&!Input::isKeyDown(SDLK_LSHIFT)){
-            if(player[0].num_weapons>0){
-                if(weapons[player[0].weaponids[0]].getType()==sword)
-                                       weapons[player[0].weaponids[0]].setType(staff);
-                else if(weapons[player[0].weaponids[0]].getType()==staff)
-                                       weapons[player[0].weaponids[0]].setType(knife);
-                else
-                                       weapons[player[0].weaponids[0]].setType(sword);
+            if (visibleloading)
+                LoadingScreen();
+            if (cellophane) {
+                player[i].proportionhead.z = 0;
+                player[i].proportionbody.z = 0;
+                player[i].proportionarms.z = 0;
+                player[i].proportionlegs.z = 0;
             }
+
+            player[i].tempanimation.Load((char *)"Tempanim", 0, 0);
+
+            player[i].headmorphness = 0;
+            player[i].targetheadmorphness = 1;
+            player[i].headmorphstart = 0;
+            player[i].headmorphend = 0;
+
+            player[i].pausetime = 0;
+
+            player[i].dead = 0;
+            player[i].jumppower = 5;
+            player[i].damage = 0;
+            player[i].permanentdamage = 0;
+            player[i].superpermanentdamage = 0;
+
+            player[i].forwardkeydown = 0;
+            player[i].leftkeydown = 0;
+            player[i].backkeydown = 0;
+            player[i].rightkeydown = 0;
+            player[i].jumpkeydown = 0;
+            player[i].crouchkeydown = 0;
+            player[i].throwkeydown = 0;
+
+            player[i].collided = -10;
+            player[i].loaded = 1;
+            player[i].bloodloss = 0;
+            player[i].weaponactive = -1;
+            player[i].weaponstuck = -1;
+            player[i].bleeding = 0;
+            player[i].deathbleeding = 0;
+            player[i].stunned = 0;
+            player[i].hasvictim = 0;
+            player[i].wentforweapon = 0;
         }
 
-        if(Input::isKeyPressed(SDLK_x)&&Input::isKeyDown(SDLK_LSHIFT)){
-            int closest=findClosestPlayer();
-            if(closest>=0){
-                if(player[closest].num_weapons){
-                    if(weapons[player[closest].weaponids[0]].getType()==sword)
-                        weapons[player[closest].weaponids[0]].setType(staff);
-                    else if(weapons[player[closest].weaponids[0]].getType()==staff)
-                        weapons[player[closest].weaponids[0]].setType(knife);
-                    else
-                                               weapons[player[closest].weaponids[0]].setType(sword);
-                }
-                if(!player[closest].num_weapons){
-                    player[closest].weaponids[0]=weapons.size();
-                    
-                    weapons.push_back(Weapon(knife,closest));
-                    
-                    player[closest].num_weapons=1;
-                }
-            }
+        player[0].aitype = playercontrolled;
+        player[0].weaponactive = -1;
+
+        if (difficulty == 1)
+            player[0].power = 1 / .9;
+
+        if (difficulty == 0)
+            player[0].power = 1 / .8;
+
+        if (difficulty == 1)
+            player[0].damagetolerance = 250;
+        if (difficulty == 0)
+            player[0].damagetolerance = 300;
+        if (difficulty == 0)
+            player[0].armorhead *= 1.5;
+        if (difficulty == 0)
+            player[0].armorhigh *= 1.5;
+        if (difficulty == 0)
+            player[0].armorlow *= 1.5;
+        cameraloc = player[0].coords;
+        cameraloc.y += 5;
+        yaw = player[0].yaw;
+
+        hawkcoords = player[0].coords;
+        hawkcoords.y += 30;
+
+        if (visibleloading)
+            LoadingScreen();
+        //~ for(int i=0;i<weapons.size();i++){
+        //~ }
+
+        LOG("Starting background music...");
+
+        OPENAL_StopSound(OPENAL_ALL);
+        if (environment == snowyenvironment) {
+            if (ambientsound)
+                emit_stream_np(stream_wind);
+        } else if (environment == desertenvironment) {
+            if (ambientsound)
+                emit_stream_np(stream_desertambient);
+        } else if (environment == grassyenvironment) {
+            if (ambientsound)
+                emit_stream_np(stream_wind, 100.);
         }
+        oldmusicvolume[0] = 0;
+        oldmusicvolume[1] = 0;
+        oldmusicvolume[2] = 0;
+        oldmusicvolume[3] = 0;
+
+        if (!firstload)
+            firstload = 1;
+    } else {
+        perror("Problem");
+    }
+    leveltime = 0;
+    loadingstuff = 0;
+    visibleloading = 0;
+}
 
-        if(Input::isKeyDown(SDLK_u)){
-            int closest=findClosestPlayer();
-            if(closest>=0){
-                player[closest].yaw+=multiplier*50;
-                player[closest].targetyaw=player[closest].yaw;
-            }
+void doTutorial()
+{
+    if (tutorialstagetime > tutorialmaxtime) {
+        tutorialstage++;
+        tutorialsuccess = 0;
+        if (tutorialstage <= 1) {
+            canattack = 0;
+            cananger = 0;
+            reversaltrain = 0;
         }
+        switch (tutorialstage) {
+        case 1:
+            tutorialmaxtime = 5;
+            break;
+        case 2:
+            tutorialmaxtime = 2;
+            break;
+        case 3:
+            tutorialmaxtime = 600;
+            break;
+        case 4:
+            tutorialmaxtime = 1000;
+            break;
+        case 5:
+            tutorialmaxtime = 600;
+            break;
+        case 6:
+            tutorialmaxtime = 600;
+            break;
+        case 7:
+            tutorialmaxtime = 600;
+            break;
+        case 8:
+            tutorialmaxtime = 600;
+            break;
+        case 9:
+            tutorialmaxtime = 600;
+            break;
+        case 10:
+            tutorialmaxtime = 2;
+            break;
+        case 11:
+            tutorialmaxtime = 1000;
+            break;
+        case 12:
+            tutorialmaxtime = 1000;
+            break;
+        case 13:
+            tutorialmaxtime = 2;
+            break;
+        case 14: {
+            tutorialmaxtime = 3;
 
+            XYZ temp, temp2;
 
-        if(Input::isKeyPressed(SDLK_o)&&!Input::isKeyDown(SDLK_LSHIFT)){
-            int closest=findClosestPlayer();
-            if(Input::isKeyDown(SDLK_LCTRL))
-                closest=0;
+            temp.x = 1011;
+            temp.y = 84;
+            temp.z = 491;
+            temp2.x = 1025;
+            temp2.y = 75;
+            temp2.z = 447;
 
-            if(closest>=0){
-                player[closest].whichskin++;
-                if(player[closest].whichskin>9)
-                    player[closest].whichskin=0;
-                if(player[closest].whichskin>2&&player[closest].creature==wolftype)
-                    player[closest].whichskin=0;
+            player[1].coords = (temp + temp2) / 2;
 
-                player[closest].skeleton.drawmodel.textureptr.load(creatureskin[player[closest].creature][player[closest].whichskin],1,
-                        &player[closest].skeleton.skinText[0],&player[closest].skeleton.skinsize);
-            }
+            emit_sound_at(fireendsound, player[1].coords);
 
-            if(player[closest].numclothes){
-                for(int i=0;i<player[closest].numclothes;i++){
-                    tintr=player[closest].clothestintr[i];
-                    tintg=player[closest].clothestintg[i];
-                    tintb=player[closest].clothestintb[i];
-                    AddClothes((char *)player[closest].clothes[i],&player[closest].skeleton.skinText[0]);
+            for (int i = 0; i < player[1].skeleton.num_joints; i++) {
+                if (Random() % 2 == 0) {
+                    if (!player[1].skeleton.free)temp2 = (player[1].coords - player[1].oldcoords) / multiplier / 2; //velocity/2;
+                    if (player[1].skeleton.free)temp2 = player[1].skeleton.joints[i].velocity * player[1].scale / 2;
+                    if (!player[1].skeleton.free)temp = DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position, 0, 0, player[1].tilt), player[1].tilt2, 0, 0), 0, player[1].yaw, 0) * player[1].scale + player[1].coords;
+                    if (player[1].skeleton.free)temp = player[1].skeleton.joints[i].position * player[1].scale + player[1].coords;
+                    Sprite::MakeSprite(breathsprite, temp, temp2, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1);
                 }
-                player[closest].DoMipmaps();
             }
         }
-
-        if(Input::isKeyPressed(SDLK_o)&&Input::isKeyDown(SDLK_LSHIFT)){
-            int closest=findClosestPlayer();
-            if(closest>=0){
-                if(player[closest].creature==wolftype){
-                    headprop=player[closest].proportionhead.x/1.1;
-                    bodyprop=player[closest].proportionbody.x/1.1;
-                    armprop=player[closest].proportionarms.x/1.1;
-                    legprop=player[closest].proportionlegs.x/1.1;
-                }
-
-                if(player[closest].creature==rabbittype){
-                    headprop=player[closest].proportionhead.x/1.2;
-                    bodyprop=player[closest].proportionbody.x/1.05;
-                    armprop=player[closest].proportionarms.x/1.00;
-                    legprop=player[closest].proportionlegs.x/1.1;
-                }
-
-
-                if(player[closest].creature==rabbittype){
-                    player[closest].skeleton.id=closest;
-                    player[closest].skeleton.Load((char *)":Data:Skeleton:Basic Figure Wolf",(char *)":Data:Skeleton:Basic Figure Wolf Low",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Wolf.solid",(char *)":Data:Models:Wolf2.solid",(char *)":Data:Models:Wolf3.solid",(char *)":Data:Models:Wolf4.solid",(char *)":Data:Models:Wolf5.solid",(char *)":Data:Models:Wolf6.solid",(char *)":Data:Models:Wolf7.solid",(char *)":Data:Models:Wolflow.solid",(char *)":Data:Models:Belt.solid",0);
-                    player[closest].skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg",1,&player[closest].skeleton.skinText[closest],&player[closest].skeleton.skinsize);
-                    player[closest].whichskin=0;
-                    player[closest].creature=wolftype;
-
-                    player[closest].proportionhead=1.1;
-                    player[closest].proportionbody=1.1;
-                    player[closest].proportionarms=1.1;
-                    player[closest].proportionlegs=1.1;
-                    player[closest].proportionlegs.y=1.1;
-                    player[closest].scale=.23*5*player[0].scale;
-
-                    player[closest].damagetolerance=300;
-                }
+        break;
+        case 15:
+            tutorialmaxtime = 500;
+            break;
+        case 16:
+            tutorialmaxtime = 500;
+            break;
+        case 17:
+            tutorialmaxtime = 500;
+            break;
+        case 18:
+            tutorialmaxtime = 500;
+            break;
+        case 19:
+            tutorialstage = 20;
+            //tutorialmaxtime=500;
+            break;
+        case 20:
+            tutorialmaxtime = 500;
+            break;
+        case 21:
+            tutorialmaxtime = 500;
+            if (bonus == cannon) {
+                bonus = Slicebonus;
+                againbonus = 1;
+            } else againbonus = 0;
+            break;
+        case 22:
+            tutorialmaxtime = 500;
+            break;
+        case 23:
+            tutorialmaxtime = 500;
+            break;
+        case 24:
+            tutorialmaxtime = 500;
+            break;
+        case 25:
+            tutorialmaxtime = 500;
+            break;
+        case 26:
+            tutorialmaxtime = 2;
+            break;
+        case 27:
+            tutorialmaxtime = 4;
+            reversaltrain = 1;
+            cananger = 1;
+            player[1].aitype = attacktypecutoff;
+            break;
+        case 28:
+            tutorialmaxtime = 400;
+            break;
+        case 29:
+            tutorialmaxtime = 400;
+            player[0].escapednum = 0;
+            break;
+        case 30:
+            tutorialmaxtime = 4;
+            reversaltrain = 0;
+            cananger = 0;
+            player[1].aitype = passivetype;
+            break;
+        case 31:
+            tutorialmaxtime = 13;
+            break;
+        case 32:
+            tutorialmaxtime = 8;
+            break;
+        case 33:
+            tutorialmaxtime = 400;
+            cananger = 1;
+            canattack = 1;
+            player[1].aitype = attacktypecutoff;
+            break;
+        case 34:
+            tutorialmaxtime = 400;
+            break;
+        case 35:
+            tutorialmaxtime = 400;
+            break;
+        case 36:
+            tutorialmaxtime = 2;
+            reversaltrain = 0;
+            cananger = 0;
+            player[1].aitype = passivetype;
+            break;
+        case 37:
+            damagedealt = 0;
+            damagetaken = 0;
+            tutorialmaxtime = 50;
+            cananger = 1;
+            canattack = 1;
+            player[1].aitype = attacktypecutoff;
+            break;
+        case 38:
+            tutorialmaxtime = 4;
+            canattack = 0;
+            cananger = 0;
+            player[1].aitype = passivetype;
+            break;
+        case 39: {
+            XYZ temp, temp2;
+
+            temp.x = 1011;
+            temp.y = 84;
+            temp.z = 491;
+            temp2.x = 1025;
+            temp2.y = 75;
+            temp2.z = 447;
+
+            Weapon w(knife, -1);
+            w.position = (temp + temp2) / 2;
+            w.tippoint = (temp + temp2) / 2;
+
+            w.velocity = 0.1;
+            w.tipvelocity = 0.1;
+            w.missed = 1;
+            w.hitsomething = 0;
+            w.freetime = 0;
+            w.firstfree = 1;
+            w.physics = 1;
+
+            weapons.push_back(w);
+        }
+        break;
+        case 40:
+            tutorialmaxtime = 300;
+            break;
+        case 41:
+            tutorialmaxtime = 300;
+            break;
+        case 42:
+            tutorialmaxtime = 8;
+            break;
+        case 43:
+            tutorialmaxtime = 300;
+            break;
+        case 44:
+            weapons[0].owner = 1;
+            player[0].weaponactive = -1;
+            player[0].num_weapons = 0;
+            player[1].weaponactive = 0;
+            player[1].num_weapons = 1;
+            player[1].weaponids[0] = 0;
+
+            cananger = 1;
+            canattack = 1;
+            player[1].aitype = attacktypecutoff;
+
+            tutorialmaxtime = 300;
+            break;
+        case 45:
+            weapons[0].owner = 1;
+            player[0].weaponactive = -1;
+            player[0].num_weapons = 0;
+            player[1].weaponactive = 0;
+            player[1].num_weapons = 1;
+            player[1].weaponids[0] = 0;
+
+            tutorialmaxtime = 300;
+            break;
+        case 46:
+            weapons[0].owner = 1;
+            player[0].weaponactive = -1;
+            player[0].num_weapons = 0;
+            player[1].weaponactive = 0;
+            player[1].num_weapons = 1;
+            player[1].weaponids[0] = 0;
+
+            weapons[0].setType(sword);
+
+            tutorialmaxtime = 300;
+            break;
+        case 47: {
+            tutorialmaxtime = 10;
+
+            XYZ temp, temp2;
+
+            temp.x = 1011;
+            temp.y = 84;
+            temp.z = 491;
+            temp2.x = 1025;
+            temp2.y = 75;
+            temp2.z = 447;
+
+            Weapon w(sword, -1);
+            w.position = (temp + temp2) / 2;
+            w.tippoint = (temp + temp2) / 2;
+
+            w.velocity = 0.1;
+            w.tipvelocity = 0.1;
+            w.missed = 1;
+            w.hitsomething = 0;
+            w.freetime = 0;
+            w.firstfree = 1;
+            w.physics = 1;
+
+            weapons.push_back(w);
+
+            weapons[0].owner = 1;
+            weapons[1].owner = 0;
+            player[0].weaponactive = 0;
+            player[0].num_weapons = 1;
+            player[0].weaponids[0] = 1;
+            player[1].weaponactive = 0;
+            player[1].num_weapons = 1;
+            player[1].weaponids[0] = 0;
+
+        }
+        break;
+        case 48:
+            canattack = 0;
+            cananger = 0;
+            player[1].aitype = passivetype;
+
+            tutorialmaxtime = 15;
+
+            weapons[0].owner = 1;
+            weapons[1].owner = 0;
+            player[0].weaponactive = 0;
+            player[0].num_weapons = 1;
+            player[0].weaponids[0] = 1;
+            player[1].weaponactive = 0;
+            player[1].num_weapons = 1;
+            player[1].weaponids[0] = 0;
+
+            if (player[0].weaponactive != -1)
+                weapons[player[0].weaponids[player[0].weaponactive]].setType(staff);
+            else
+                weapons[0].setType(staff);
+            break;
+        case 49:
+            canattack = 0;
+            cananger = 0;
+            player[1].aitype = passivetype;
+
+            tutorialmaxtime = 200;
+
+            weapons[1].position = 1000;
+            weapons[1].tippoint = 1000;
+
+            weapons[0].setType(knife);
+
+            weapons[0].owner = 0;
+            player[1].weaponactive = -1;
+            player[1].num_weapons = 0;
+            player[0].weaponactive = 0;
+            player[0].num_weapons = 1;
+            player[0].weaponids[0] = 0;
+
+            break;
+        case 50: {
+            tutorialmaxtime = 8;
+
+            XYZ temp, temp2;
+            emit_sound_at(fireendsound, player[1].coords);
+
+            for (int i = 0; i < player[1].skeleton.num_joints; i++) {
+                if (Random() % 2 == 0) {
+                    if (!player[1].skeleton.free)temp2 = (player[1].coords - player[1].oldcoords) / multiplier / 2; //velocity/2;
+                    if (player[1].skeleton.free)temp2 = player[1].skeleton.joints[i].velocity * player[1].scale / 2;
+                    if (!player[1].skeleton.free)temp = DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position, 0, 0, player[1].tilt), player[1].tilt2, 0, 0), 0, player[1].yaw, 0) * player[1].scale + player[1].coords;
+                    if (player[1].skeleton.free)temp = player[1].skeleton.joints[i].position * player[1].scale + player[1].coords;
+                    Sprite::MakeSprite(breathsprite, temp, temp2, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1);
+                }
+            }
+
+            player[1].num_weapons = 0;
+            player[1].weaponstuck = -1;
+            player[1].weaponactive = -1;
+
+            weapons.clear();
+        }
+        break;
+        case 51:
+            tutorialmaxtime = 80000;
+            break;
+        default:
+            break;
+        }
+        if (tutorialstage <= 51)tutorialstagetime = 0;
+    }
+
+    //Tutorial success
+    if (tutorialstagetime < tutorialmaxtime - 3) {
+        switch (tutorialstage) {
+        case 3:
+            if (deltah || deltav)tutorialsuccess += multiplier;
+            break;
+        case 4:
+            if (player[0].forwardkeydown || player[0].backkeydown || player[0].leftkeydown || player[0].rightkeydown)tutorialsuccess += multiplier;
+            break;
+        case 5:
+            if (player[0].jumpkeydown)tutorialsuccess = 1;
+            break;
+        case 6:
+            if (player[0].isCrouch())tutorialsuccess = 1;
+            break;
+        case 7:
+            if (player[0].animTarget == rollanim)tutorialsuccess = 1;
+            break;
+        case 8:
+            if (player[0].animTarget == sneakanim)tutorialsuccess += multiplier;
+            break;
+        case 9:
+            if (player[0].animTarget == rabbitrunninganim || player[0].animTarget == wolfrunninganim)tutorialsuccess += multiplier;
+            break;
+        case 11:
+            if (player[0].isWallJump())tutorialsuccess = 1;
+            break;
+        case 12:
+            if (player[0].animTarget == flipanim)tutorialsuccess = 1;
+            break;
+        case 15:
+            if (player[0].animTarget == upunchanim || player[0].animTarget == winduppunchanim)tutorialsuccess = 1;
+            break;
+        case 16:
+            if (player[0].animTarget == winduppunchanim)tutorialsuccess = 1;
+            break;
+        case 17:
+            if (player[0].animTarget == spinkickanim)tutorialsuccess = 1;
+            break;
+        case 18:
+            if (player[0].animTarget == sweepanim)tutorialsuccess = 1;
+            break;
+        case 19:
+            if (player[0].animTarget == dropkickanim)tutorialsuccess = 1;
+            break;
+        case 20:
+            if (player[0].animTarget == rabbitkickanim)tutorialsuccess = 1;
+            break;
+        case 21:
+            if (bonus == cannon)tutorialsuccess = 1;
+            break;
+        case 22:
+            if (bonus == spinecrusher)tutorialsuccess = 1;
+            break;
+        case 23:
+            if (player[0].animTarget == walljumprightkickanim || player[0].animTarget == walljumpleftkickanim)tutorialsuccess = 1;
+            break;
+        case 24:
+            if (player[0].animTarget == rabbittacklinganim)tutorialsuccess = 1;
+            break;
+        case 25:
+            if (player[0].animTarget == backhandspringanim)tutorialsuccess = 1;
+            break;
+        case 28:
+            if (animation[player[0].animTarget].attack == reversed && player[0].feint)tutorialsuccess = 1;
+            break;
+        case 29:
+            if (player[0].escapednum == 2) {
+                tutorialsuccess = 1;
+                reversaltrain = 0;
+                cananger = 0;
+                player[1].aitype = passivetype;
+            }
+            break;
+        case 33:
+            if (animation[player[0].animTarget].attack == reversal)tutorialsuccess = 1;
+            break;
+        case 34:
+            if (animation[player[0].animTarget].attack == reversal)tutorialsuccess = 1;
+            break;
+        case 35:
+            if (animation[player[0].animTarget].attack == reversal) {
+                tutorialsuccess = 1;
+                reversaltrain = 0;
+                cananger = 0;
+                player[1].aitype = passivetype;
+            }
+            break;
+        case 40:
+            if (player[0].num_weapons > 0)tutorialsuccess = 1;
+            break;
+        case 41:
+            if (player[0].weaponactive == -1 && player[0].num_weapons > 0)tutorialsuccess = 1;
+            break;
+        case 43:
+            if (player[0].animTarget == knifeslashstartanim)tutorialsuccess = 1;
+            break;
+        case 44:
+            if (animation[player[0].animTarget].attack == reversal)tutorialsuccess = 1;
+            break;
+        case 45:
+            if (animation[player[0].animTarget].attack == reversal)tutorialsuccess = 1;
+            break;
+        case 46:
+            if (animation[player[0].animTarget].attack == reversal)tutorialsuccess = 1;
+            break;
+        case 49:
+            if (player[1].weaponstuck != -1)tutorialsuccess = 1;
+            break;
+        default:
+            break;
+        }
+        if (tutorialsuccess >= 1)tutorialstagetime = tutorialmaxtime - 3;
+
+
+        if (tutorialstagetime == tutorialmaxtime - 3) {
+            emit_sound_np(consolesuccesssound);
+        }
+
+        if (tutorialsuccess >= 1) {
+            if (tutorialstage == 34 || tutorialstage == 35)
+                tutorialstagetime = tutorialmaxtime - 1;
+        }
+    }
+
+    if (tutorialstage < 14 || tutorialstage >= 50) {
+        player[1].coords.y = 300;
+        player[1].velocity = 0;
+    }
+}
+
+void doDebugKeys()
+{
+    float headprop, bodyprop, armprop, legprop;
+    if (debugmode) {
+        if (Input::isKeyPressed(SDLK_h)) {
+            player[0].damagetolerance = 200000;
+            player[0].damage = 0;
+            player[0].burnt = 0;
+            player[0].permanentdamage = 0;
+            player[0].superpermanentdamage = 0;
+        }
+
+        if (Input::isKeyPressed(SDLK_j)) {
+            environment++;
+            if (environment > 2)
+                environment = 0;
+            Setenvironment(environment);
+        }
+
+        if (Input::isKeyPressed(SDLK_c)) {
+            cameramode = 1 - cameramode;
+        }
+
+        if (Input::isKeyPressed(SDLK_x) && !Input::isKeyDown(SDLK_LSHIFT)) {
+            if (player[0].num_weapons > 0) {
+                if (weapons[player[0].weaponids[0]].getType() == sword)
+                    weapons[player[0].weaponids[0]].setType(staff);
+                else if (weapons[player[0].weaponids[0]].getType() == staff)
+                    weapons[player[0].weaponids[0]].setType(knife);
                 else
-                {
-                    player[closest].skeleton.id=closest;
-                    player[closest].skeleton.Load((char *)":Data:Skeleton:Basic Figure",(char *)":Data:Skeleton:Basic Figurelow",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Body.solid",(char *)":Data:Models:Body2.solid",(char *)":Data:Models:Body3.solid",(char *)":Data:Models:Body4.solid",(char *)":Data:Models:Body5.solid",(char *)":Data:Models:Body6.solid",(char *)":Data:Models:Body7.solid",(char *)":Data:Models:Bodylow.solid",(char *)":Data:Models:Belt.solid",1);
-                    player[closest].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur3.jpg",1,&player[closest].skeleton.skinText[0],&player[closest].skeleton.skinsize);
-                    player[closest].whichskin=0;
-                    player[closest].creature=rabbittype;
-
-                    player[closest].proportionhead=1.2;
-                    player[closest].proportionbody=1.05;
-                    player[closest].proportionarms=1.00;
-                    player[closest].proportionlegs=1.1;
-                    player[closest].proportionlegs.y=1.05;
-                    player[closest].scale=.2*5*player[0].scale;
-
-                    player[closest].damagetolerance=200;
+                    weapons[player[0].weaponids[0]].setType(sword);
+            }
+        }
+
+        if (Input::isKeyPressed(SDLK_x) && Input::isKeyDown(SDLK_LSHIFT)) {
+            int closest = findClosestPlayer();
+            if (closest >= 0) {
+                if (player[closest].num_weapons) {
+                    if (weapons[player[closest].weaponids[0]].getType() == sword)
+                        weapons[player[closest].weaponids[0]].setType(staff);
+                    else if (weapons[player[closest].weaponids[0]].getType() == staff)
+                        weapons[player[closest].weaponids[0]].setType(knife);
+                    else
+                        weapons[player[closest].weaponids[0]].setType(sword);
                 }
+                if (!player[closest].num_weapons) {
+                    player[closest].weaponids[0] = weapons.size();
 
-                if(player[closest].creature==wolftype){
-                    player[closest].proportionhead=1.1*headprop;
-                    player[closest].proportionbody=1.1*bodyprop;
-                    player[closest].proportionarms=1.1*armprop;
-                    player[closest].proportionlegs=1.1*legprop;
+                    weapons.push_back(Weapon(knife, closest));
+
+                    player[closest].num_weapons = 1;
                 }
+            }
+        }
+
+        if (Input::isKeyDown(SDLK_u)) {
+            int closest = findClosestPlayer();
+            if (closest >= 0) {
+                player[closest].yaw += multiplier * 50;
+                player[closest].targetyaw = player[closest].yaw;
+            }
+        }
+
+
+        if (Input::isKeyPressed(SDLK_o) && !Input::isKeyDown(SDLK_LSHIFT)) {
+            int closest = findClosestPlayer();
+            if (Input::isKeyDown(SDLK_LCTRL))
+                closest = 0;
+
+            if (closest >= 0) {
+                player[closest].whichskin++;
+                if (player[closest].whichskin > 9)
+                    player[closest].whichskin = 0;
+                if (player[closest].whichskin > 2 && player[closest].creature == wolftype)
+                    player[closest].whichskin = 0;
+
+                player[closest].skeleton.drawmodel.textureptr.load(creatureskin[player[closest].creature][player[closest].whichskin], 1,
+                        &player[closest].skeleton.skinText[0], &player[closest].skeleton.skinsize);
+            }
 
-                if(player[closest].creature==rabbittype){
-                    player[closest].proportionhead=1.2*headprop;
-                    player[closest].proportionbody=1.05*bodyprop;
-                    player[closest].proportionarms=1.00*armprop;
-                    player[closest].proportionlegs=1.1*legprop;
-                    player[closest].proportionlegs.y=1.05*legprop;
+            if (player[closest].numclothes) {
+                for (int i = 0; i < player[closest].numclothes; i++) {
+                    tintr = player[closest].clothestintr[i];
+                    tintg = player[closest].clothestintg[i];
+                    tintb = player[closest].clothestintb[i];
+                    AddClothes((char *)player[closest].clothes[i], &player[closest].skeleton.skinText[0]);
+                }
+                player[closest].DoMipmaps();
+            }
+        }
+
+        if (Input::isKeyPressed(SDLK_o) && Input::isKeyDown(SDLK_LSHIFT)) {
+            int closest = findClosestPlayer();
+            if (closest >= 0) {
+                if (player[closest].creature == wolftype) {
+                    headprop = player[closest].proportionhead.x / 1.1;
+                    bodyprop = player[closest].proportionbody.x / 1.1;
+                    armprop = player[closest].proportionarms.x / 1.1;
+                    legprop = player[closest].proportionlegs.x / 1.1;
+                }
+
+                if (player[closest].creature == rabbittype) {
+                    headprop = player[closest].proportionhead.x / 1.2;
+                    bodyprop = player[closest].proportionbody.x / 1.05;
+                    armprop = player[closest].proportionarms.x / 1.00;
+                    legprop = player[closest].proportionlegs.x / 1.1;
+                }
+
+
+                if (player[closest].creature == rabbittype) {
+                    player[closest].skeleton.id = closest;
+                    player[closest].skeleton.Load((char *)":Data:Skeleton:Basic Figure Wolf", (char *)":Data:Skeleton:Basic Figure Wolf Low", (char *)":Data:Skeleton:Rabbitbelt", (char *)":Data:Models:Wolf.solid", (char *)":Data:Models:Wolf2.solid", (char *)":Data:Models:Wolf3.solid", (char *)":Data:Models:Wolf4.solid", (char *)":Data:Models:Wolf5.solid", (char *)":Data:Models:Wolf6.solid", (char *)":Data:Models:Wolf7.solid", (char *)":Data:Models:Wolflow.solid", (char *)":Data:Models:Belt.solid", 0);
+                    player[closest].skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg", 1, &player[closest].skeleton.skinText[closest], &player[closest].skeleton.skinsize);
+                    player[closest].whichskin = 0;
+                    player[closest].creature = wolftype;
+
+                    player[closest].proportionhead = 1.1;
+                    player[closest].proportionbody = 1.1;
+                    player[closest].proportionarms = 1.1;
+                    player[closest].proportionlegs = 1.1;
+                    player[closest].proportionlegs.y = 1.1;
+                    player[closest].scale = .23 * 5 * player[0].scale;
+
+                    player[closest].damagetolerance = 300;
+                } else {
+                    player[closest].skeleton.id = closest;
+                    player[closest].skeleton.Load((char *)":Data:Skeleton:Basic Figure", (char *)":Data:Skeleton:Basic Figurelow", (char *)":Data:Skeleton:Rabbitbelt", (char *)":Data:Models:Body.solid", (char *)":Data:Models:Body2.solid", (char *)":Data:Models:Body3.solid", (char *)":Data:Models:Body4.solid", (char *)":Data:Models:Body5.solid", (char *)":Data:Models:Body6.solid", (char *)":Data:Models:Body7.solid", (char *)":Data:Models:Bodylow.solid", (char *)":Data:Models:Belt.solid", 1);
+                    player[closest].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur3.jpg", 1, &player[closest].skeleton.skinText[0], &player[closest].skeleton.skinsize);
+                    player[closest].whichskin = 0;
+                    player[closest].creature = rabbittype;
+
+                    player[closest].proportionhead = 1.2;
+                    player[closest].proportionbody = 1.05;
+                    player[closest].proportionarms = 1.00;
+                    player[closest].proportionlegs = 1.1;
+                    player[closest].proportionlegs.y = 1.05;
+                    player[closest].scale = .2 * 5 * player[0].scale;
+
+                    player[closest].damagetolerance = 200;
+                }
+
+                if (player[closest].creature == wolftype) {
+                    player[closest].proportionhead = 1.1 * headprop;
+                    player[closest].proportionbody = 1.1 * bodyprop;
+                    player[closest].proportionarms = 1.1 * armprop;
+                    player[closest].proportionlegs = 1.1 * legprop;
+                }
+
+                if (player[closest].creature == rabbittype) {
+                    player[closest].proportionhead = 1.2 * headprop;
+                    player[closest].proportionbody = 1.05 * bodyprop;
+                    player[closest].proportionarms = 1.00 * armprop;
+                    player[closest].proportionlegs = 1.1 * legprop;
+                    player[closest].proportionlegs.y = 1.05 * legprop;
                 }
 
             }
         }
 
-        if(Input::isKeyPressed(SDLK_b)&&!Input::isKeyDown(SDLK_LSHIFT)){
-            slomo=1-slomo;
-            slomodelay=1000;
+        if (Input::isKeyPressed(SDLK_b) && !Input::isKeyDown(SDLK_LSHIFT)) {
+            slomo = 1 - slomo;
+            slomodelay = 1000;
         }
 
 
-        if(((Input::isKeyPressed(SDLK_i)&&!Input::isKeyDown(SDLK_LSHIFT)))){
+        if (((Input::isKeyPressed(SDLK_i) && !Input::isKeyDown(SDLK_LSHIFT)))) {
             int closest = -1;
             float closestdist = std::numeric_limits<float>::max();
 
-            for(int i=1; i<numplayers; i++){
+            for (int i = 1; i < numplayers; i++) {
                 float distance = distsq(&player[i].coords, &player[0].coords);
-                if(!player[i].headless)
-                    if(distance < closestdist){
+                if (!player[i].headless)
+                    if (distance < closestdist) {
                         closestdist = distance;
                         closest = i;
                     }
             }
 
-            XYZ flatfacing2,flatvelocity2;
+            XYZ flatfacing2, flatvelocity2;
             XYZ blah;
-            if(closest!=-1 && distsq(&player[closest].coords, &player[0].coords)<144){
+            if (closest != -1 && distsq(&player[closest].coords, &player[0].coords) < 144) {
                 blah = player[closest].coords;
                 XYZ headspurtdirection;
                 //int i = player[closest].skeleton.jointlabels[head];
-                Joint& headjoint= player[closest].joint(head);
-                for(int k=0;k<player[closest].skeleton.num_joints; k++){
-                    if(!player[closest].skeleton.free)
-                        flatvelocity2=player[closest].velocity;
-                    if(player[closest].skeleton.free)
-                        flatvelocity2=headjoint.velocity;
-                    if(!player[closest].skeleton.free)
-                        flatfacing2=DoRotation(DoRotation(DoRotation(headjoint.position,0,0,player[closest].tilt),player[closest].tilt2,0,0),0,player[closest].yaw,0)*player[closest].scale+player[closest].coords;
-                    if(player[closest].skeleton.free)
-                        flatfacing2=headjoint.position*player[closest].scale+player[closest].coords;
-                    flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
-                    flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
-                    flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
-                    headspurtdirection=headjoint.position-player[closest].jointPos(neck);
+                Joint& headjoint = player[closest].joint(head);
+                for (int k = 0; k < player[closest].skeleton.num_joints; k++) {
+                    if (!player[closest].skeleton.free)
+                        flatvelocity2 = player[closest].velocity;
+                    if (player[closest].skeleton.free)
+                        flatvelocity2 = headjoint.velocity;
+                    if (!player[closest].skeleton.free)
+                        flatfacing2 = DoRotation(DoRotation(DoRotation(headjoint.position, 0, 0, player[closest].tilt), player[closest].tilt2, 0, 0), 0, player[closest].yaw, 0) * player[closest].scale + player[closest].coords;
+                    if (player[closest].skeleton.free)
+                        flatfacing2 = headjoint.position * player[closest].scale + player[closest].coords;
+                    flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
+                    flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
+                    flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
+                    headspurtdirection = headjoint.position - player[closest].jointPos(neck);
                     Normalise(&headspurtdirection);
-                    Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2, 1,1,1, .6, 1);
-                    flatvelocity2+=headspurtdirection*8;
-                    Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2/2, 1,1,1, .16, 1);
+                    Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2, 1, 1, 1, .6, 1);
+                    flatvelocity2 += headspurtdirection * 8;
+                    Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2 / 2, 1, 1, 1, .16, 1);
                 }
-                Sprite::MakeSprite(cloudsprite, flatfacing2,flatvelocity2*0, .6,0,0, 1, .5);
+                Sprite::MakeSprite(cloudsprite, flatfacing2, flatvelocity2 * 0, .6, 0, 0, 1, .5);
 
                 emit_sound_at(splattersound, blah);
                 emit_sound_at(breaksound2, blah, 100.);
 
-                if(player[closest].skeleton.free==2)player[closest].skeleton.free=0;
+                if (player[closest].skeleton.free == 2)player[closest].skeleton.free = 0;
                 player[closest].RagDoll(0);
-                player[closest].dead=2;
-                player[closest].headless=1;
-                player[closest].DoBloodBig(3,165);
+                player[closest].dead = 2;
+                player[closest].headless = 1;
+                player[closest].DoBloodBig(3, 165);
 
-                camerashake+=.3;
+                camerashake += .3;
             }
         }
 
-        if(((Input::isKeyPressed(SDLK_i)&&Input::isKeyDown(SDLK_LSHIFT)))){
-            int closest=findClosestPlayer();
-            XYZ flatfacing2,flatvelocity2;
+        if (((Input::isKeyPressed(SDLK_i) && Input::isKeyDown(SDLK_LSHIFT)))) {
+            int closest = findClosestPlayer();
+            XYZ flatfacing2, flatvelocity2;
             XYZ blah;
-            if(closest>=0 && distsq(&player[closest].coords,&player[0].coords)<144){
-                blah=player[closest].coords;
+            if (closest >= 0 && distsq(&player[closest].coords, &player[0].coords) < 144) {
+                blah = player[closest].coords;
                 emit_sound_at(splattersound, blah);
                 emit_sound_at(breaksound2, blah);
 
-                for(int i=0;i<player[closest].skeleton.num_joints; i++){
-                    if(!player[closest].skeleton.free)flatvelocity2=player[closest].velocity;
-                    if(player[closest].skeleton.free)flatvelocity2=player[closest].skeleton.joints[i].velocity;
-                    if(!player[closest].skeleton.free)flatfacing2=DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position,0,0,player[closest].tilt),player[closest].tilt2,0,0),0,player[closest].yaw,0)*player[closest].scale+player[closest].coords;
-                    if(player[closest].skeleton.free)flatfacing2=player[closest].skeleton.joints[i].position*player[closest].scale+player[closest].coords;
-                    flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
-                    flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
-                    flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
-                    Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2, 1,1,1, 3, 1);
-                    Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2, 1,1,1, .3, 1);
-                    Sprite::MakeSprite(cloudsprite, flatfacing2,flatvelocity2*0, .6,0,0, 1, .5);
+                for (int i = 0; i < player[closest].skeleton.num_joints; i++) {
+                    if (!player[closest].skeleton.free)flatvelocity2 = player[closest].velocity;
+                    if (player[closest].skeleton.free)flatvelocity2 = player[closest].skeleton.joints[i].velocity;
+                    if (!player[closest].skeleton.free)flatfacing2 = DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position, 0, 0, player[closest].tilt), player[closest].tilt2, 0, 0), 0, player[closest].yaw, 0) * player[closest].scale + player[closest].coords;
+                    if (player[closest].skeleton.free)flatfacing2 = player[closest].skeleton.joints[i].position * player[closest].scale + player[closest].coords;
+                    flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
+                    flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
+                    flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
+                    Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2, 1, 1, 1, 3, 1);
+                    Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2, 1, 1, 1, .3, 1);
+                    Sprite::MakeSprite(cloudsprite, flatfacing2, flatvelocity2 * 0, .6, 0, 0, 1, .5);
                 }
 
-                for(int i=0;i<player[closest].skeleton.num_joints; i++){
-                    if(!player[closest].skeleton.free)flatvelocity2=player[closest].velocity;
-                    if(player[closest].skeleton.free)flatvelocity2=player[closest].skeleton.joints[i].velocity;
-                    if(!player[closest].skeleton.free)flatfacing2=DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position,0,0,player[closest].tilt),player[closest].tilt2,0,0),0,player[closest].yaw,0)*player[closest].scale+player[closest].coords;
-                    if(player[closest].skeleton.free)flatfacing2=player[closest].skeleton.joints[i].position*player[closest].scale+player[closest].coords;
-                    flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
-                    flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
-                    flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
-                    Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2, 1,1,1, 3, 1);
-                    Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2, 1,1,1, .4, 1);
+                for (int i = 0; i < player[closest].skeleton.num_joints; i++) {
+                    if (!player[closest].skeleton.free)flatvelocity2 = player[closest].velocity;
+                    if (player[closest].skeleton.free)flatvelocity2 = player[closest].skeleton.joints[i].velocity;
+                    if (!player[closest].skeleton.free)flatfacing2 = DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position, 0, 0, player[closest].tilt), player[closest].tilt2, 0, 0), 0, player[closest].yaw, 0) * player[closest].scale + player[closest].coords;
+                    if (player[closest].skeleton.free)flatfacing2 = player[closest].skeleton.joints[i].position * player[closest].scale + player[closest].coords;
+                    flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
+                    flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
+                    flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
+                    Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2, 1, 1, 1, 3, 1);
+                    Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2, 1, 1, 1, .4, 1);
                 }
 
-                for(int i=0;i<player[closest].skeleton.num_joints; i++){
-                    if(!player[closest].skeleton.free)flatvelocity2=player[closest].velocity;
-                    if(player[closest].skeleton.free)flatvelocity2=player[closest].skeleton.joints[i].velocity;
-                    if(!player[closest].skeleton.free)flatfacing2=DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position,0,0,player[closest].tilt),player[closest].tilt2,0,0),0,player[closest].yaw,0)*player[closest].scale+player[closest].coords;
-                    if(player[closest].skeleton.free)flatfacing2=player[closest].skeleton.joints[i].position*player[closest].scale+player[closest].coords;
-                    flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
-                    flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
-                    flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
-                    Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2*2, 1,1,1, 3, 1);
-                    Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2*2, 1,1,1, .4, 1);
+                for (int i = 0; i < player[closest].skeleton.num_joints; i++) {
+                    if (!player[closest].skeleton.free)flatvelocity2 = player[closest].velocity;
+                    if (player[closest].skeleton.free)flatvelocity2 = player[closest].skeleton.joints[i].velocity;
+                    if (!player[closest].skeleton.free)flatfacing2 = DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position, 0, 0, player[closest].tilt), player[closest].tilt2, 0, 0), 0, player[closest].yaw, 0) * player[closest].scale + player[closest].coords;
+                    if (player[closest].skeleton.free)flatfacing2 = player[closest].skeleton.joints[i].position * player[closest].scale + player[closest].coords;
+                    flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
+                    flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
+                    flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
+                    Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, 3, 1);
+                    Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, .4, 1);
                 }
 
-                for(int i=0;i<player[closest].skeleton.num_joints; i++){
-                    if(!player[closest].skeleton.free)flatvelocity2=player[closest].velocity;
-                    if(player[closest].skeleton.free)flatvelocity2=player[closest].skeleton.joints[i].velocity;
-                    if(!player[closest].skeleton.free)flatfacing2=DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position,0,0,player[closest].tilt),player[closest].tilt2,0,0),0,player[closest].yaw,0)*player[closest].scale+player[closest].coords;
-                    if(player[closest].skeleton.free)flatfacing2=player[closest].skeleton.joints[i].position*player[closest].scale+player[closest].coords;
-                    flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
-                    flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
-                    flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
-                    Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2*2, 1,1,1, 3, 1);
-                    Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2*2, 1,1,1, .4, 1);
+                for (int i = 0; i < player[closest].skeleton.num_joints; i++) {
+                    if (!player[closest].skeleton.free)flatvelocity2 = player[closest].velocity;
+                    if (player[closest].skeleton.free)flatvelocity2 = player[closest].skeleton.joints[i].velocity;
+                    if (!player[closest].skeleton.free)flatfacing2 = DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position, 0, 0, player[closest].tilt), player[closest].tilt2, 0, 0), 0, player[closest].yaw, 0) * player[closest].scale + player[closest].coords;
+                    if (player[closest].skeleton.free)flatfacing2 = player[closest].skeleton.joints[i].position * player[closest].scale + player[closest].coords;
+                    flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
+                    flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
+                    flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
+                    Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, 3, 1);
+                    Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, .4, 1);
                 }
 
                 XYZ temppos;
-                for(int j=0;j<numplayers; j++){
-                    if(j!=closest){
-                        if(distsq(&player[j].coords,&player[closest].coords)<25){
-                            player[j].DoDamage((25-distsq(&player[j].coords,&player[closest].coords))*60);
-                            if(player[j].skeleton.free==2)
-                                player[j].skeleton.free=1;
-                            player[j].skeleton.longdead=0;
+                for (int j = 0; j < numplayers; j++) {
+                    if (j != closest) {
+                        if (distsq(&player[j].coords, &player[closest].coords) < 25) {
+                            player[j].DoDamage((25 - distsq(&player[j].coords, &player[closest].coords)) * 60);
+                            if (player[j].skeleton.free == 2)
+                                player[j].skeleton.free = 1;
+                            player[j].skeleton.longdead = 0;
                             player[j].RagDoll(0);
-                            for(int i=0;i<player[j].skeleton.num_joints; i++){
-                                temppos=player[j].skeleton.joints[i].position+player[j].coords;
-                                if(distsq(&temppos,&player[closest].coords)<25){
-                                    flatvelocity2=temppos-player[closest].coords;
+                            for (int i = 0; i < player[j].skeleton.num_joints; i++) {
+                                temppos = player[j].skeleton.joints[i].position + player[j].coords;
+                                if (distsq(&temppos, &player[closest].coords) < 25) {
+                                    flatvelocity2 = temppos - player[closest].coords;
                                     Normalise(&flatvelocity2);
-                                    player[j].skeleton.joints[i].velocity+=flatvelocity2*((20-distsq(&temppos,&player[closest].coords))*20);
+                                    player[j].skeleton.joints[i].velocity += flatvelocity2 * ((20 - distsq(&temppos, &player[closest].coords)) * 20);
                                 }
                             }
                         }
@@ -2929,27 +3117,27 @@ void doDebugKeys(){
 
                 player[closest].DoDamage(10000);
                 player[closest].RagDoll(0);
-                player[closest].dead=2;
-                player[closest].coords=20;
-                player[closest].skeleton.free=2;
+                player[closest].dead = 2;
+                player[closest].coords = 20;
+                player[closest].skeleton.free = 2;
 
-                camerashake+=.6;
+                camerashake += .6;
 
             }
         }
 
-        if(Input::isKeyPressed(SDLK_f)){
-            player[0].onfire=1-player[0].onfire;
-            if(player[0].onfire){
+        if (Input::isKeyPressed(SDLK_f)) {
+            player[0].onfire = 1 - player[0].onfire;
+            if (player[0].onfire) {
                 player[0].CatchFire();
             }
-            if(!player[0].onfire){
+            if (!player[0].onfire) {
                 emit_sound_at(fireendsound, player[0].coords);
                 pause_sound(stream_firesound);
             }
         }
 
-        if(Input::isKeyPressed(SDLK_n)&&!Input::isKeyDown(SDLK_LCTRL)){
+        if (Input::isKeyPressed(SDLK_n) && !Input::isKeyDown(SDLK_LCTRL)) {
             //if(!player[0].skeleton.free)player[0].damage+=500;
             player[0].RagDoll(0);
             //player[0].spurt=1;
@@ -2958,649 +3146,642 @@ void doDebugKeys(){
             emit_sound_at(whooshsound, player[0].coords, 128.);
         }
 
-        if(Input::isKeyPressed(SDLK_n)&&Input::isKeyDown(SDLK_LCTRL)){
-            for(int i=0;i<objects.numobjects;i++){
-                if(objects.type[i]==treeleavestype){
-                    objects.scale[i]*=.9;
+        if (Input::isKeyPressed(SDLK_n) && Input::isKeyDown(SDLK_LCTRL)) {
+            for (int i = 0; i < objects.numobjects; i++) {
+                if (objects.type[i] == treeleavestype) {
+                    objects.scale[i] *= .9;
                 }
             }
         }
 
-        if(Input::isKeyPressed(SDLK_m)&&Input::isKeyDown(SDLK_LSHIFT)){
-            editorenabled=1-editorenabled;
-            if(editorenabled){
-                player[0].damagetolerance=100000;
+        if (Input::isKeyPressed(SDLK_m) && Input::isKeyDown(SDLK_LSHIFT)) {
+            editorenabled = 1 - editorenabled;
+            if (editorenabled) {
+                player[0].damagetolerance = 100000;
             } else {
-                player[0].damagetolerance=200;
+                player[0].damagetolerance = 200;
             }
-            player[0].damage=0; // these lines were in both if and else, but I think they would better fit in the if
-            player[0].permanentdamage=0;
-            player[0].superpermanentdamage=0;
-            player[0].bloodloss=0;
-            player[0].deathbleeding=0;
+            player[0].damage = 0; // these lines were in both if and else, but I think they would better fit in the if
+            player[0].permanentdamage = 0;
+            player[0].superpermanentdamage = 0;
+            player[0].bloodloss = 0;
+            player[0].deathbleeding = 0;
         }
 
         //skip level
-        if(whichlevel!=-2&&Input::isKeyPressed(SDLK_k)&&Input::isKeyDown(SDLK_LSHIFT)&&!editorenabled){
+        if (whichlevel != -2 && Input::isKeyPressed(SDLK_k) && Input::isKeyDown(SDLK_LSHIFT) && !editorenabled) {
             targetlevel++;
-            if(targetlevel>numchallengelevels-1)
-                targetlevel=0;
-            loading=1;
-            leveltime=5;
+            if (targetlevel > numchallengelevels - 1)
+                targetlevel = 0;
+            loading = 1;
+            leveltime = 5;
         }
 
-        if(editorenabled){
-            if(Input::isKeyPressed(SDLK_DELETE)&&Input::isKeyDown(SDLK_LSHIFT)){
-                int closest=findClosestPlayer();
-                if(closest>=0){
+        if (editorenabled) {
+            if (Input::isKeyPressed(SDLK_DELETE) && Input::isKeyDown(SDLK_LSHIFT)) {
+                int closest = findClosestPlayer();
+                if (closest >= 0) {
                     //player[closest]=player[numplayers-1];
                     //player[closest].skeleton=player[numplayers-1].skeleton;
                     numplayers--;
                 }
             }
 
-            if(Input::isKeyPressed(SDLK_DELETE)&&Input::isKeyDown(SDLK_LCTRL)){
-                int closest=findClosestObject();
-                if(closest>=0)
-                    objects.position[closest].y-=500;
+            if (Input::isKeyPressed(SDLK_DELETE) && Input::isKeyDown(SDLK_LCTRL)) {
+                int closest = findClosestObject();
+                if (closest >= 0)
+                    objects.position[closest].y -= 500;
             }
 
-            if(Input::isKeyPressed(SDLK_m)&&Input::isKeyDown(SDLK_LSHIFT)){
+            if (Input::isKeyPressed(SDLK_m) && Input::isKeyDown(SDLK_LSHIFT)) {
                 //drawmode++;
                 //if(drawmode>2)drawmode=0;
-                if(objects.numobjects<max_objects-1){
+                if (objects.numobjects < max_objects - 1) {
                     XYZ boxcoords;
-                    boxcoords.x=player[0].coords.x;
-                    boxcoords.z=player[0].coords.z;
-                    boxcoords.y=player[0].coords.y-3;
-                    if(editortype==bushtype)boxcoords.y=player[0].coords.y-.5;
-                    if(editortype==firetype)boxcoords.y=player[0].coords.y-.5;
+                    boxcoords.x = player[0].coords.x;
+                    boxcoords.z = player[0].coords.z;
+                    boxcoords.y = player[0].coords.y - 3;
+                    if (editortype == bushtype)boxcoords.y = player[0].coords.y - .5;
+                    if (editortype == firetype)boxcoords.y = player[0].coords.y - .5;
                     //objects.MakeObject(abs(Random()%3),boxcoords,Random()%360);
-                    float temprotat,temprotat2;
-                    temprotat=editoryaw;
-                    temprotat2=editorpitch;
-                    if(temprotat<0||editortype==bushtype)temprotat=Random()%360;
-                    if(temprotat2<0)temprotat2=Random()%360;
-
-                    objects.MakeObject(editortype,boxcoords,(int)temprotat-((int)temprotat)%30,(int)temprotat2,editorsize);
-                    if(editortype==treetrunktype)
-                        objects.MakeObject(treeleavestype,boxcoords,Random()%360*(temprotat2<2)+(int)editoryaw-((int)editoryaw)%30,editorpitch,editorsize);
+                    float temprotat, temprotat2;
+                    temprotat = editoryaw;
+                    temprotat2 = editorpitch;
+                    if (temprotat < 0 || editortype == bushtype)temprotat = Random() % 360;
+                    if (temprotat2 < 0)temprotat2 = Random() % 360;
+
+                    objects.MakeObject(editortype, boxcoords, (int)temprotat - ((int)temprotat) % 30, (int)temprotat2, editorsize);
+                    if (editortype == treetrunktype)
+                        objects.MakeObject(treeleavestype, boxcoords, Random() % 360 * (temprotat2 < 2) + (int)editoryaw - ((int)editoryaw) % 30, editorpitch, editorsize);
                 }
             }
 
-            if(Input::isKeyPressed(SDLK_p)&&Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){
-                if(numplayers<maxplayers-1){
-                    player[numplayers].scale=.2*5*player[0].scale;
-                    player[numplayers].creature=rabbittype;
-                    player[numplayers].howactive=editoractive;
-                    player[numplayers].skeleton.id=numplayers;
-                    player[numplayers].skeleton.Load((char *)":Data:Skeleton:Basic Figure",(char *)":Data:Skeleton:Basic Figurelow",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Body.solid",(char *)":Data:Models:Body2.solid",(char *)":Data:Models:Body3.solid",(char *)":Data:Models:Body4.solid",(char *)":Data:Models:Body5.solid",(char *)":Data:Models:Body6.solid",(char *)":Data:Models:Body7.solid",(char *)":Data:Models:Bodylow.solid",(char *)":Data:Models:Belt.solid",1);
+            if (Input::isKeyPressed(SDLK_p) && Input::isKeyDown(SDLK_LSHIFT) && !Input::isKeyDown(SDLK_LCTRL)) {
+                if (numplayers < maxplayers - 1) {
+                    player[numplayers].scale = .2 * 5 * player[0].scale;
+                    player[numplayers].creature = rabbittype;
+                    player[numplayers].howactive = editoractive;
+                    player[numplayers].skeleton.id = numplayers;
+                    player[numplayers].skeleton.Load((char *)":Data:Skeleton:Basic Figure", (char *)":Data:Skeleton:Basic Figurelow", (char *)":Data:Skeleton:Rabbitbelt", (char *)":Data:Models:Body.solid", (char *)":Data:Models:Body2.solid", (char *)":Data:Models:Body3.solid", (char *)":Data:Models:Body4.solid", (char *)":Data:Models:Body5.solid", (char *)":Data:Models:Body6.solid", (char *)":Data:Models:Body7.solid", (char *)":Data:Models:Bodylow.solid", (char *)":Data:Models:Belt.solid", 1);
 
                     //texsize=512*512*3/texdetail/texdetail;
                     //if(!player[numplayers].loaded)player[numplayers].skeleton.skinText = new GLubyte[texsize];
                     //player[numplayers].skeleton.skinText.resize(texsize);
 
-                    int k=abs(Random()%2)+1;
-                    if(k==0){
-                        player[numplayers].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur3.jpg",1,&player[numplayers].skeleton.skinText[0],&player[numplayers].skeleton.skinsize);
-                        player[numplayers].whichskin=0;
-                    }
-                    else if(k==1){
-                        player[numplayers].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur.jpg",1,&player[numplayers].skeleton.skinText[0],&player[numplayers].skeleton.skinsize);
-                        player[numplayers].whichskin=1;
-                    }
-                    else {
-                        player[numplayers].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur2.jpg",1,&player[numplayers].skeleton.skinText[0],&player[numplayers].skeleton.skinsize);
-                        player[numplayers].whichskin=2;
+                    int k = abs(Random() % 2) + 1;
+                    if (k == 0) {
+                        player[numplayers].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur3.jpg", 1, &player[numplayers].skeleton.skinText[0], &player[numplayers].skeleton.skinsize);
+                        player[numplayers].whichskin = 0;
+                    } else if (k == 1) {
+                        player[numplayers].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur.jpg", 1, &player[numplayers].skeleton.skinText[0], &player[numplayers].skeleton.skinsize);
+                        player[numplayers].whichskin = 1;
+                    } else {
+                        player[numplayers].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur2.jpg", 1, &player[numplayers].skeleton.skinText[0], &player[numplayers].skeleton.skinsize);
+                        player[numplayers].whichskin = 2;
                     }
 
-                    player[numplayers].skeleton.drawmodelclothes.textureptr.load(":Data:Textures:Belt.png",1,1);
-                    player[numplayers].power=1;
-                    player[numplayers].speedmult=1;
-                    player[numplayers].animCurrent=bounceidleanim;
-                    player[numplayers].animTarget=bounceidleanim;
-                    player[numplayers].frameCurrent=0;
-                    player[numplayers].frameTarget=1;
-                    player[numplayers].target=0;
-                    player[numplayers].bled=0;
-                    player[numplayers].speed=1+(float)(Random()%100)/1000;
-
-                    player[numplayers].targetyaw=player[0].targetyaw;
-                    player[numplayers].yaw=player[0].yaw;
-
-                    player[numplayers].velocity=0;
-                    player[numplayers].coords=player[0].coords;
-                    player[numplayers].oldcoords=player[numplayers].coords;
-                    player[numplayers].realoldcoords=player[numplayers].coords;
-
-                    player[numplayers].id=numplayers;
-                    player[numplayers].skeleton.id=numplayers;
-                    player[numplayers].updatedelay=0;
-                    player[numplayers].normalsupdatedelay=0;
-
-                    player[numplayers].aitype=passivetype;
-
-                    if(player[0].creature==wolftype){
-                        headprop=player[0].proportionhead.x/1.1;
-                        bodyprop=player[0].proportionbody.x/1.1;
-                        armprop=player[0].proportionarms.x/1.1;
-                        legprop=player[0].proportionlegs.x/1.1;
+                    player[numplayers].skeleton.drawmodelclothes.textureptr.load(":Data:Textures:Belt.png", 1, 1);
+                    player[numplayers].power = 1;
+                    player[numplayers].speedmult = 1;
+                    player[numplayers].animCurrent = bounceidleanim;
+                    player[numplayers].animTarget = bounceidleanim;
+                    player[numplayers].frameCurrent = 0;
+                    player[numplayers].frameTarget = 1;
+                    player[numplayers].target = 0;
+                    player[numplayers].bled = 0;
+                    player[numplayers].speed = 1 + (float)(Random() % 100) / 1000;
+
+                    player[numplayers].targetyaw = player[0].targetyaw;
+                    player[numplayers].yaw = player[0].yaw;
+
+                    player[numplayers].velocity = 0;
+                    player[numplayers].coords = player[0].coords;
+                    player[numplayers].oldcoords = player[numplayers].coords;
+                    player[numplayers].realoldcoords = player[numplayers].coords;
+
+                    player[numplayers].id = numplayers;
+                    player[numplayers].skeleton.id = numplayers;
+                    player[numplayers].updatedelay = 0;
+                    player[numplayers].normalsupdatedelay = 0;
+
+                    player[numplayers].aitype = passivetype;
+
+                    if (player[0].creature == wolftype) {
+                        headprop = player[0].proportionhead.x / 1.1;
+                        bodyprop = player[0].proportionbody.x / 1.1;
+                        armprop = player[0].proportionarms.x / 1.1;
+                        legprop = player[0].proportionlegs.x / 1.1;
                     }
 
-                    if(player[0].creature==rabbittype){
-                        headprop=player[0].proportionhead.x/1.2;
-                        bodyprop=player[0].proportionbody.x/1.05;
-                        armprop=player[0].proportionarms.x/1.00;
-                        legprop=player[0].proportionlegs.x/1.1;
+                    if (player[0].creature == rabbittype) {
+                        headprop = player[0].proportionhead.x / 1.2;
+                        bodyprop = player[0].proportionbody.x / 1.05;
+                        armprop = player[0].proportionarms.x / 1.00;
+                        legprop = player[0].proportionlegs.x / 1.1;
                     }
 
-                    if(player[numplayers].creature==wolftype){
-                        player[numplayers].proportionhead=1.1*headprop;
-                        player[numplayers].proportionbody=1.1*bodyprop;
-                        player[numplayers].proportionarms=1.1*armprop;
-                        player[numplayers].proportionlegs=1.1*legprop;
+                    if (player[numplayers].creature == wolftype) {
+                        player[numplayers].proportionhead = 1.1 * headprop;
+                        player[numplayers].proportionbody = 1.1 * bodyprop;
+                        player[numplayers].proportionarms = 1.1 * armprop;
+                        player[numplayers].proportionlegs = 1.1 * legprop;
                     }
 
-                    if(player[numplayers].creature==rabbittype){
-                        player[numplayers].proportionhead=1.2*headprop;
-                        player[numplayers].proportionbody=1.05*bodyprop;
-                        player[numplayers].proportionarms=1.00*armprop;
-                        player[numplayers].proportionlegs=1.1*legprop;
-                        player[numplayers].proportionlegs.y=1.05*legprop;
+                    if (player[numplayers].creature == rabbittype) {
+                        player[numplayers].proportionhead = 1.2 * headprop;
+                        player[numplayers].proportionbody = 1.05 * bodyprop;
+                        player[numplayers].proportionarms = 1.00 * armprop;
+                        player[numplayers].proportionlegs = 1.1 * legprop;
+                        player[numplayers].proportionlegs.y = 1.05 * legprop;
                     }
 
-                    player[numplayers].headless=0;
-                    player[numplayers].onfire=0;
+                    player[numplayers].headless = 0;
+                    player[numplayers].onfire = 0;
 
-                    if(cellophane){
-                        player[numplayers].proportionhead.z=0;
-                        player[numplayers].proportionbody.z=0;
-                        player[numplayers].proportionarms.z=0;
-                        player[numplayers].proportionlegs.z=0;
+                    if (cellophane) {
+                        player[numplayers].proportionhead.z = 0;
+                        player[numplayers].proportionbody.z = 0;
+                        player[numplayers].proportionarms.z = 0;
+                        player[numplayers].proportionlegs.z = 0;
                     }
 
-                    player[numplayers].tempanimation.Load((char *)"Tempanim",0,0);
+                    player[numplayers].tempanimation.Load((char *)"Tempanim", 0, 0);
 
-                    player[numplayers].damagetolerance=200;
+                    player[numplayers].damagetolerance = 200;
 
-                    player[numplayers].protectionhead=player[0].protectionhead;
-                    player[numplayers].protectionhigh=player[0].protectionhigh;
-                    player[numplayers].protectionlow=player[0].protectionlow;
-                    player[numplayers].armorhead=player[0].armorhead;
-                    player[numplayers].armorhigh=player[0].armorhigh;
-                    player[numplayers].armorlow=player[0].armorlow;
-                    player[numplayers].metalhead=player[0].metalhead;
-                    player[numplayers].metalhigh=player[0].metalhigh;
-                    player[numplayers].metallow=player[0].metallow;
+                    player[numplayers].protectionhead = player[0].protectionhead;
+                    player[numplayers].protectionhigh = player[0].protectionhigh;
+                    player[numplayers].protectionlow = player[0].protectionlow;
+                    player[numplayers].armorhead = player[0].armorhead;
+                    player[numplayers].armorhigh = player[0].armorhigh;
+                    player[numplayers].armorlow = player[0].armorlow;
+                    player[numplayers].metalhead = player[0].metalhead;
+                    player[numplayers].metalhigh = player[0].metalhigh;
+                    player[numplayers].metallow = player[0].metallow;
 
-                    player[numplayers].immobile=player[0].immobile;
+                    player[numplayers].immobile = player[0].immobile;
 
-                    player[numplayers].numclothes=player[0].numclothes;
-                    if(player[numplayers].numclothes)
-                        for(int i=0;i<player[numplayers].numclothes;i++){
+                    player[numplayers].numclothes = player[0].numclothes;
+                    if (player[numplayers].numclothes)
+                        for (int i = 0; i < player[numplayers].numclothes; i++) {
                             strcpy(player[numplayers].clothes[i], player[0].clothes[i]);
-                            player[numplayers].clothestintr[i]=player[0].clothestintr[i];
-                            player[numplayers].clothestintg[i]=player[0].clothestintg[i];
-                            player[numplayers].clothestintb[i]=player[0].clothestintb[i];
-                            tintr=player[numplayers].clothestintr[i];
-                            tintg=player[numplayers].clothestintg[i];
-                            tintb=player[numplayers].clothestintb[i];
-                            AddClothes((char *)player[numplayers].clothes[i],&player[numplayers].skeleton.skinText[0]);
+                            player[numplayers].clothestintr[i] = player[0].clothestintr[i];
+                            player[numplayers].clothestintg[i] = player[0].clothestintg[i];
+                            player[numplayers].clothestintb[i] = player[0].clothestintb[i];
+                            tintr = player[numplayers].clothestintr[i];
+                            tintg = player[numplayers].clothestintg[i];
+                            tintb = player[numplayers].clothestintb[i];
+                            AddClothes((char *)player[numplayers].clothes[i], &player[numplayers].skeleton.skinText[0]);
                         }
-                    if(player[numplayers].numclothes){
+                    if (player[numplayers].numclothes) {
                         player[numplayers].DoMipmaps();
                     }
 
-                    player[numplayers].power=player[0].power;
-                    player[numplayers].speedmult=player[0].speedmult;
-
-                    player[numplayers].damage=0;
-                    player[numplayers].permanentdamage=0;
-                    player[numplayers].superpermanentdamage=0;
-                    player[numplayers].deathbleeding=0;
-                    player[numplayers].bleeding=0;
-                    player[numplayers].numwaypoints=0;
-                    player[numplayers].waypoint=0;
-                    player[numplayers].jumppath=0;
-                    player[numplayers].weaponstuck=-1;
-                    player[numplayers].weaponactive=-1;
-                    player[numplayers].num_weapons=0;
-                    player[numplayers].bloodloss=0;
-                    player[numplayers].dead=0;
-
-                    player[numplayers].loaded=1;
+                    player[numplayers].power = player[0].power;
+                    player[numplayers].speedmult = player[0].speedmult;
+
+                    player[numplayers].damage = 0;
+                    player[numplayers].permanentdamage = 0;
+                    player[numplayers].superpermanentdamage = 0;
+                    player[numplayers].deathbleeding = 0;
+                    player[numplayers].bleeding = 0;
+                    player[numplayers].numwaypoints = 0;
+                    player[numplayers].waypoint = 0;
+                    player[numplayers].jumppath = 0;
+                    player[numplayers].weaponstuck = -1;
+                    player[numplayers].weaponactive = -1;
+                    player[numplayers].num_weapons = 0;
+                    player[numplayers].bloodloss = 0;
+                    player[numplayers].dead = 0;
+
+                    player[numplayers].loaded = 1;
 
                     numplayers++;
                 }
             }
 
-            if(Input::isKeyPressed(SDLK_p)&&Input::isKeyDown(SDLK_LSHIFT)){
-                if(player[numplayers-1].numwaypoints<90){
-                    player[numplayers-1].waypoints[player[numplayers-1].numwaypoints]=player[0].coords;
-                    player[numplayers-1].waypointtype[player[numplayers-1].numwaypoints]=editorpathtype;
-                    player[numplayers-1].numwaypoints++;
+            if (Input::isKeyPressed(SDLK_p) && Input::isKeyDown(SDLK_LSHIFT)) {
+                if (player[numplayers - 1].numwaypoints < 90) {
+                    player[numplayers - 1].waypoints[player[numplayers - 1].numwaypoints] = player[0].coords;
+                    player[numplayers - 1].waypointtype[player[numplayers - 1].numwaypoints] = editorpathtype;
+                    player[numplayers - 1].numwaypoints++;
                 }
             }
 
-            if(Input::isKeyPressed(SDLK_p)&&Input::isKeyDown(SDLK_LCTRL)){
-                if(numpathpoints<30){
-                    bool connected,alreadyconnected;
-                    connected=0;
-                    if(numpathpoints>1)
-                        for(int i=0;i<numpathpoints;i++){
-                            if(distsq(&pathpoint[i],&player[0].coords)<.5&&i!=pathpointselected&&!connected){
-                                alreadyconnected=0;
-                                for(int j=0;j<numpathpointconnect[pathpointselected];j++){
-                                    if(pathpointconnect[pathpointselected][j]==i)alreadyconnected=1;
+            if (Input::isKeyPressed(SDLK_p) && Input::isKeyDown(SDLK_LCTRL)) {
+                if (numpathpoints < 30) {
+                    bool connected, alreadyconnected;
+                    connected = 0;
+                    if (numpathpoints > 1)
+                        for (int i = 0; i < numpathpoints; i++) {
+                            if (distsq(&pathpoint[i], &player[0].coords) < .5 && i != pathpointselected && !connected) {
+                                alreadyconnected = 0;
+                                for (int j = 0; j < numpathpointconnect[pathpointselected]; j++) {
+                                    if (pathpointconnect[pathpointselected][j] == i)alreadyconnected = 1;
                                 }
-                                if(!alreadyconnected){
+                                if (!alreadyconnected) {
                                     numpathpointconnect[pathpointselected]++;
-                                    connected=1;
-                                    pathpointconnect[pathpointselected][numpathpointconnect[pathpointselected]-1]=i;
+                                    connected = 1;
+                                    pathpointconnect[pathpointselected][numpathpointconnect[pathpointselected] - 1] = i;
                                 }
                             }
                         }
-                    if(!connected){
+                    if (!connected) {
                         numpathpoints++;
-                        pathpoint[numpathpoints-1]=player[0].coords;
-                        numpathpointconnect[numpathpoints-1]=0;
-                        if(numpathpoints>1&&pathpointselected!=-1){
+                        pathpoint[numpathpoints - 1] = player[0].coords;
+                        numpathpointconnect[numpathpoints - 1] = 0;
+                        if (numpathpoints > 1 && pathpointselected != -1) {
                             numpathpointconnect[pathpointselected]++;
-                            pathpointconnect[pathpointselected][numpathpointconnect[pathpointselected]-1]=numpathpoints-1;
+                            pathpointconnect[pathpointselected][numpathpointconnect[pathpointselected] - 1] = numpathpoints - 1;
                         }
-                        pathpointselected=numpathpoints-1;
+                        pathpointselected = numpathpoints - 1;
                     }
                 }
             }
 
-            if(Input::isKeyPressed(SDLK_PERIOD)){
+            if (Input::isKeyPressed(SDLK_PERIOD)) {
                 pathpointselected++;
-                if(pathpointselected>=numpathpoints)
-                    pathpointselected=-1;
+                if (pathpointselected >= numpathpoints)
+                    pathpointselected = -1;
             }
-            if(Input::isKeyPressed(SDLK_COMMA)&&!Input::isKeyDown(SDLK_LSHIFT)){
+            if (Input::isKeyPressed(SDLK_COMMA) && !Input::isKeyDown(SDLK_LSHIFT)) {
                 pathpointselected--;
-                if(pathpointselected<=-2)
-                    pathpointselected=numpathpoints-1;
+                if (pathpointselected <= -2)
+                    pathpointselected = numpathpoints - 1;
             }
-            if(Input::isKeyPressed(SDLK_COMMA)&&Input::isKeyDown(SDLK_LSHIFT)){
-                if(pathpointselected!=-1){
+            if (Input::isKeyPressed(SDLK_COMMA) && Input::isKeyDown(SDLK_LSHIFT)) {
+                if (pathpointselected != -1) {
                     numpathpoints--;
-                    pathpoint[pathpointselected]=pathpoint[numpathpoints];
-                    numpathpointconnect[pathpointselected]=numpathpointconnect[numpathpoints];
-                    for(int i=0;i<numpathpointconnect[pathpointselected];i++){
-                        pathpointconnect[pathpointselected][i]=pathpointconnect[numpathpoints][i];
+                    pathpoint[pathpointselected] = pathpoint[numpathpoints];
+                    numpathpointconnect[pathpointselected] = numpathpointconnect[numpathpoints];
+                    for (int i = 0; i < numpathpointconnect[pathpointselected]; i++) {
+                        pathpointconnect[pathpointselected][i] = pathpointconnect[numpathpoints][i];
                     }
-                    for(int i=0;i<numpathpoints;i++){
-                        for(int j=0;j<numpathpointconnect[i];j++){
-                            if(pathpointconnect[i][j]==pathpointselected){
-                                pathpointconnect[i][j]=pathpointconnect[i][numpathpointconnect[i]-1];
+                    for (int i = 0; i < numpathpoints; i++) {
+                        for (int j = 0; j < numpathpointconnect[i]; j++) {
+                            if (pathpointconnect[i][j] == pathpointselected) {
+                                pathpointconnect[i][j] = pathpointconnect[i][numpathpointconnect[i] - 1];
                                 numpathpointconnect[i]--;
                             }
-                            if(pathpointconnect[i][j]==numpathpoints){
-                                pathpointconnect[i][j]=pathpointselected;
+                            if (pathpointconnect[i][j] == numpathpoints) {
+                                pathpointconnect[i][j] = pathpointselected;
                             }
                         }
                     }
-                    pathpointselected=numpathpoints-1;
+                    pathpointselected = numpathpoints - 1;
                 }
             }
 
-            if(Input::isKeyPressed(SDLK_LEFT)&&Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){
+            if (Input::isKeyPressed(SDLK_LEFT) && Input::isKeyDown(SDLK_LSHIFT) && !Input::isKeyDown(SDLK_LCTRL)) {
                 editortype--;
-                if(editortype==treeleavestype||editortype==10)editortype--;
-                if(editortype<0)editortype=firetype;
+                if (editortype == treeleavestype || editortype == 10)editortype--;
+                if (editortype < 0)editortype = firetype;
             }
 
-            if(Input::isKeyPressed(SDLK_RIGHT)&&Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){
+            if (Input::isKeyPressed(SDLK_RIGHT) && Input::isKeyDown(SDLK_LSHIFT) && !Input::isKeyDown(SDLK_LCTRL)) {
                 editortype++;
-                if(editortype==treeleavestype||editortype==10)editortype++;
-                if(editortype>firetype)editortype=0;
+                if (editortype == treeleavestype || editortype == 10)editortype++;
+                if (editortype > firetype)editortype = 0;
             }
 
-            if(Input::isKeyDown(SDLK_LEFT)&&!Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){
-                editoryaw-=multiplier*100;
-                if(editoryaw<-.01)editoryaw=-.01;
+            if (Input::isKeyDown(SDLK_LEFT) && !Input::isKeyDown(SDLK_LSHIFT) && !Input::isKeyDown(SDLK_LCTRL)) {
+                editoryaw -= multiplier * 100;
+                if (editoryaw < -.01)editoryaw = -.01;
             }
 
-            if(Input::isKeyDown(SDLK_RIGHT)&&!Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){
-                editoryaw+=multiplier*100;
+            if (Input::isKeyDown(SDLK_RIGHT) && !Input::isKeyDown(SDLK_LSHIFT) && !Input::isKeyDown(SDLK_LCTRL)) {
+                editoryaw += multiplier * 100;
             }
 
-            if(Input::isKeyDown(SDLK_UP)&&!Input::isKeyDown(SDLK_LCTRL)){
-                editorsize+=multiplier;
+            if (Input::isKeyDown(SDLK_UP) && !Input::isKeyDown(SDLK_LCTRL)) {
+                editorsize += multiplier;
             }
 
-            if(Input::isKeyDown(SDLK_DOWN)&&!Input::isKeyDown(SDLK_LCTRL)){
-                editorsize-=multiplier;
-                if(editorsize<.1)editorsize=.1;
+            if (Input::isKeyDown(SDLK_DOWN) && !Input::isKeyDown(SDLK_LCTRL)) {
+                editorsize -= multiplier;
+                if (editorsize < .1)editorsize = .1;
             }
 
 
-            if(Input::isKeyPressed(SDLK_LEFT)&&Input::isKeyDown(SDLK_LSHIFT)&&Input::isKeyDown(SDLK_LCTRL)){
-                mapradius-=multiplier*10;
+            if (Input::isKeyPressed(SDLK_LEFT) && Input::isKeyDown(SDLK_LSHIFT) && Input::isKeyDown(SDLK_LCTRL)) {
+                mapradius -= multiplier * 10;
             }
 
-            if(Input::isKeyPressed(SDLK_RIGHT)&&Input::isKeyDown(SDLK_LSHIFT)&&Input::isKeyDown(SDLK_LCTRL)){
-                mapradius+=multiplier*10;
+            if (Input::isKeyPressed(SDLK_RIGHT) && Input::isKeyDown(SDLK_LSHIFT) && Input::isKeyDown(SDLK_LCTRL)) {
+                mapradius += multiplier * 10;
             }
-            if(Input::isKeyDown(SDLK_UP)&&Input::isKeyDown(SDLK_LCTRL)){
-                editorpitch+=multiplier*100;
+            if (Input::isKeyDown(SDLK_UP) && Input::isKeyDown(SDLK_LCTRL)) {
+                editorpitch += multiplier * 100;
             }
 
-            if(Input::isKeyDown(SDLK_DOWN)&&Input::isKeyDown(SDLK_LCTRL)){
-                editorpitch-=multiplier*100;
-                if(editorpitch<-.01)editorpitch=-.01;
+            if (Input::isKeyDown(SDLK_DOWN) && Input::isKeyDown(SDLK_LCTRL)) {
+                editorpitch -= multiplier * 100;
+                if (editorpitch < -.01)editorpitch = -.01;
             }
-            if(Input::isKeyPressed(SDLK_DELETE)&&objects.numobjects&&Input::isKeyDown(SDLK_LSHIFT)){
-                int closest=findClosestObject();
-                if(closest>=0)
+            if (Input::isKeyPressed(SDLK_DELETE) && objects.numobjects && Input::isKeyDown(SDLK_LSHIFT)) {
+                int closest = findClosestObject();
+                if (closest >= 0)
                     objects.DeleteObject(closest);
             }
         }
     }
 }
 
-void doJumpReversals(){
-    for(int k=0;k<numplayers;k++)
-        for(int i=k;i<numplayers;i++){
-            if(i==k)continue;
-            if(     player[k].skeleton.free==0&&
-                    player[i].skeleton.oldfree==0&&
-                    (player[i].animTarget==jumpupanim||
-                     player[k].animTarget==jumpupanim)&&
-                    (player[i].aitype==playercontrolled||
-                     player[k].aitype==playercontrolled)&&
-                    (player[i].aitype==attacktypecutoff&&player[i].stunned<=0||
-                     player[k].aitype==attacktypecutoff&&player[k].stunned<=0)){
-                if(     distsq(&player[i].coords,&player[k].coords)<10*sq((player[i].scale+player[k].scale)*2.5)&&
-                        distsqflat(&player[i].coords,&player[k].coords)<2*sq((player[i].scale+player[k].scale)*2.5)){
+void doJumpReversals()
+{
+    for (int k = 0; k < numplayers; k++)
+        for (int i = k; i < numplayers; i++) {
+            if (i == k)continue;
+            if (     player[k].skeleton.free == 0 &&
+                     player[i].skeleton.oldfree == 0 &&
+                     (player[i].animTarget == jumpupanim ||
+                      player[k].animTarget == jumpupanim) &&
+                     (player[i].aitype == playercontrolled ||
+                      player[k].aitype == playercontrolled) &&
+                     (player[i].aitype == attacktypecutoff && player[i].stunned <= 0 ||
+                      player[k].aitype == attacktypecutoff && player[k].stunned <= 0)) {
+                if (     distsq(&player[i].coords, &player[k].coords) < 10 * sq((player[i].scale + player[k].scale) * 2.5) &&
+                         distsqflat(&player[i].coords, &player[k].coords) < 2 * sq((player[i].scale + player[k].scale) * 2.5)) {
                     //TODO: refactor two huge similar ifs
-                    if(player[i].animTarget==jumpupanim&&
-                            player[k].animTarget!=getupfrombackanim&&
-                            player[k].animTarget!=getupfromfrontanim&&
-                            animation[player[k].animTarget].height==middleheight&&
-                            normaldotproduct(player[i].velocity,player[k].coords-player[i].coords)<0&&
-                            (player[k].aitype==playercontrolled&&player[k].attackkeydown||
-                             player[k].aitype!=playercontrolled)){
-                        player[i].victim=&player[k];
-                        player[i].velocity=0;
-                        player[i].animCurrent=jumpreversedanim;
-                        player[i].animTarget=jumpreversedanim;
-                        player[i].frameCurrent=0;
-                        player[i].frameTarget=1;
-                        player[i].targettilt2=0;
-                        player[k].victim=&player[i];
-                        player[k].velocity=0;
-                        player[k].animCurrent=jumpreversalanim;
-                        player[k].animTarget=jumpreversalanim;
-                        player[k].frameCurrent=0;
-                        player[k].frameTarget=1;
-                        player[k].targettilt2=0;
-                        if(player[i].coords.y<player[k].coords.y+1){
-                            player[i].animCurrent=rabbitkickreversedanim;
-                            player[i].animTarget=rabbitkickreversedanim;
-                            player[i].frameCurrent=1;
-                            player[i].frameTarget=2;
-                            player[k].animCurrent=rabbitkickreversalanim;
-                            player[k].animTarget=rabbitkickreversalanim;
-                            player[k].frameCurrent=1;
-                            player[k].frameTarget=2;
+                    if (player[i].animTarget == jumpupanim &&
+                            player[k].animTarget != getupfrombackanim &&
+                            player[k].animTarget != getupfromfrontanim &&
+                            animation[player[k].animTarget].height == middleheight &&
+                            normaldotproduct(player[i].velocity, player[k].coords - player[i].coords) < 0 &&
+                            (player[k].aitype == playercontrolled && player[k].attackkeydown ||
+                             player[k].aitype != playercontrolled)) {
+                        player[i].victim = &player[k];
+                        player[i].velocity = 0;
+                        player[i].animCurrent = jumpreversedanim;
+                        player[i].animTarget = jumpreversedanim;
+                        player[i].frameCurrent = 0;
+                        player[i].frameTarget = 1;
+                        player[i].targettilt2 = 0;
+                        player[k].victim = &player[i];
+                        player[k].velocity = 0;
+                        player[k].animCurrent = jumpreversalanim;
+                        player[k].animTarget = jumpreversalanim;
+                        player[k].frameCurrent = 0;
+                        player[k].frameTarget = 1;
+                        player[k].targettilt2 = 0;
+                        if (player[i].coords.y < player[k].coords.y + 1) {
+                            player[i].animCurrent = rabbitkickreversedanim;
+                            player[i].animTarget = rabbitkickreversedanim;
+                            player[i].frameCurrent = 1;
+                            player[i].frameTarget = 2;
+                            player[k].animCurrent = rabbitkickreversalanim;
+                            player[k].animTarget = rabbitkickreversalanim;
+                            player[k].frameCurrent = 1;
+                            player[k].frameTarget = 2;
                         }
-                        player[i].target=0;
-                        player[k].oldcoords=player[k].coords;
-                        player[i].coords=player[k].coords;
-                        player[k].targetyaw=player[i].targetyaw;
-                        player[k].yaw=player[i].targetyaw;
-                        if(player[k].aitype==attacktypecutoff)
-                            player[k].stunned=.5;
+                        player[i].target = 0;
+                        player[k].oldcoords = player[k].coords;
+                        player[i].coords = player[k].coords;
+                        player[k].targetyaw = player[i].targetyaw;
+                        player[k].yaw = player[i].targetyaw;
+                        if (player[k].aitype == attacktypecutoff)
+                            player[k].stunned = .5;
                     }
-                    if(player[k].animTarget==jumpupanim&&
-                            player[i].animTarget!=getupfrombackanim&&
-                            player[i].animTarget!=getupfromfrontanim&&
-                            animation[player[i].animTarget].height==middleheight&&
-                            normaldotproduct(player[k].velocity,player[i].coords-player[k].coords)<0&&
-                            ((player[i].aitype==playercontrolled&&player[i].attackkeydown)||
-                             player[i].aitype!=playercontrolled)){
-                        player[k].victim=&player[i];
-                        player[k].velocity=0;
-                        player[k].animCurrent=jumpreversedanim;
-                        player[k].animTarget=jumpreversedanim;
-                        player[k].frameCurrent=0;
-                        player[k].frameTarget=1;
-                        player[k].targettilt2=0;
-                        player[i].victim=&player[k];
-                        player[i].velocity=0;
-                        player[i].animCurrent=jumpreversalanim;
-                        player[i].animTarget=jumpreversalanim;
-                        player[i].frameCurrent=0;
-                        player[i].frameTarget=1;
-                        player[i].targettilt2=0;
-                        if(player[k].coords.y<player[i].coords.y+1){
-                            player[k].animTarget=rabbitkickreversedanim;
-                            player[k].animCurrent=rabbitkickreversedanim;
-                            player[i].animCurrent=rabbitkickreversalanim;
-                            player[i].animTarget=rabbitkickreversalanim;
-                            player[k].frameCurrent=1;
-                            player[k].frameTarget=2;
-                            player[i].frameCurrent=1;
-                            player[i].frameTarget=2;
+                    if (player[k].animTarget == jumpupanim &&
+                            player[i].animTarget != getupfrombackanim &&
+                            player[i].animTarget != getupfromfrontanim &&
+                            animation[player[i].animTarget].height == middleheight &&
+                            normaldotproduct(player[k].velocity, player[i].coords - player[k].coords) < 0 &&
+                            ((player[i].aitype == playercontrolled && player[i].attackkeydown) ||
+                             player[i].aitype != playercontrolled)) {
+                        player[k].victim = &player[i];
+                        player[k].velocity = 0;
+                        player[k].animCurrent = jumpreversedanim;
+                        player[k].animTarget = jumpreversedanim;
+                        player[k].frameCurrent = 0;
+                        player[k].frameTarget = 1;
+                        player[k].targettilt2 = 0;
+                        player[i].victim = &player[k];
+                        player[i].velocity = 0;
+                        player[i].animCurrent = jumpreversalanim;
+                        player[i].animTarget = jumpreversalanim;
+                        player[i].frameCurrent = 0;
+                        player[i].frameTarget = 1;
+                        player[i].targettilt2 = 0;
+                        if (player[k].coords.y < player[i].coords.y + 1) {
+                            player[k].animTarget = rabbitkickreversedanim;
+                            player[k].animCurrent = rabbitkickreversedanim;
+                            player[i].animCurrent = rabbitkickreversalanim;
+                            player[i].animTarget = rabbitkickreversalanim;
+                            player[k].frameCurrent = 1;
+                            player[k].frameTarget = 2;
+                            player[i].frameCurrent = 1;
+                            player[i].frameTarget = 2;
                         }
-                        player[k].target=0;
-                        player[i].oldcoords=player[i].coords;
-                        player[k].coords=player[i].coords;
-                        player[i].targetyaw=player[k].targetyaw;
-                        player[i].yaw=player[k].targetyaw;
-                        if(player[i].aitype==attacktypecutoff)
-                            player[i].stunned=.5;
+                        player[k].target = 0;
+                        player[i].oldcoords = player[i].coords;
+                        player[k].coords = player[i].coords;
+                        player[i].targetyaw = player[k].targetyaw;
+                        player[i].yaw = player[k].targetyaw;
+                        if (player[i].aitype == attacktypecutoff)
+                            player[i].stunned = .5;
                     }
                 }
             }
         }
 }
 
-void doAerialAcrobatics(){
-       static XYZ facing,flatfacing;
-    for(int k=0;k<numplayers;k++){
-        player[k].turnspeed=500;
-
-        if((player[k].isRun()&&
-                    ((player[k].targetyaw!=rabbitrunninganim&&
-                      player[k].targetyaw!=wolfrunninganim)||
-                     player[k].frameTarget==4))||
-                player[k].animTarget==removeknifeanim||
-                player[k].animTarget==crouchremoveknifeanim||
-                player[k].animTarget==flipanim||
-                player[k].animTarget==fightsidestep||
-                player[k].animTarget==walkanim){
-            player[k].yaw=stepTowardf(player[k].yaw, player[k].targetyaw, multiplier*player[k].turnspeed);
+void doAerialAcrobatics()
+{
+    static XYZ facing, flatfacing;
+    for (int k = 0; k < numplayers; k++) {
+        player[k].turnspeed = 500;
+
+        if ((player[k].isRun() &&
+                ((player[k].targetyaw != rabbitrunninganim &&
+                  player[k].targetyaw != wolfrunninganim) ||
+                 player[k].frameTarget == 4)) ||
+                player[k].animTarget == removeknifeanim ||
+                player[k].animTarget == crouchremoveknifeanim ||
+                player[k].animTarget == flipanim ||
+                player[k].animTarget == fightsidestep ||
+                player[k].animTarget == walkanim) {
+            player[k].yaw = stepTowardf(player[k].yaw, player[k].targetyaw, multiplier * player[k].turnspeed);
         }
 
 
-        if(player[k].isStop()||
-                player[k].isLanding()||
-                player[k].animTarget==staggerbackhighanim||
-                (player[k].animTarget==sneakanim&&player[k].animCurrent==sneakanim)||
-                player[k].animTarget==staggerbackhardanim||
-                player[k].animTarget==backhandspringanim||
-                player[k].animTarget==dodgebackanim||
-                player[k].animTarget==rollanim||
-                (animation[player[k].animTarget].attack&&
-                 player[k].animTarget!=rabbitkickanim&&
-                 (player[k].animTarget!=crouchstabanim||player[k].hasvictim)&&
-                 (player[k].animTarget!=swordgroundstabanim||player[k].hasvictim))){
-            player[k].yaw=stepTowardf(player[k].yaw, player[k].targetyaw, multiplier*player[k].turnspeed*2);
+        if (player[k].isStop() ||
+                player[k].isLanding() ||
+                player[k].animTarget == staggerbackhighanim ||
+                (player[k].animTarget == sneakanim && player[k].animCurrent == sneakanim) ||
+                player[k].animTarget == staggerbackhardanim ||
+                player[k].animTarget == backhandspringanim ||
+                player[k].animTarget == dodgebackanim ||
+                player[k].animTarget == rollanim ||
+                (animation[player[k].animTarget].attack &&
+                 player[k].animTarget != rabbitkickanim &&
+                 (player[k].animTarget != crouchstabanim || player[k].hasvictim) &&
+                 (player[k].animTarget != swordgroundstabanim || player[k].hasvictim))) {
+            player[k].yaw = stepTowardf(player[k].yaw, player[k].targetyaw, multiplier * player[k].turnspeed * 2);
         }
 
-        if(player[k].animTarget==sneakanim&&player[k].animCurrent!=sneakanim){
-            player[k].yaw=stepTowardf(player[k].yaw, player[k].targetyaw, multiplier*player[k].turnspeed*4);
+        if (player[k].animTarget == sneakanim && player[k].animCurrent != sneakanim) {
+            player[k].yaw = stepTowardf(player[k].yaw, player[k].targetyaw, multiplier * player[k].turnspeed * 4);
         }
 
         /*if(player[k].aitype!=passivetype||(distsq(&player[k].coords,&viewer)<viewdistance*viewdistance))*/
         player[k].DoStuff();
-        if(player[k].immobile&&k!=0)
-            player[k].coords=player[k].realoldcoords;
+        if (player[k].immobile && k != 0)
+            player[k].coords = player[k].realoldcoords;
 
         //if player's position has changed (?)
-        if(distsq(&player[k].coords,&player[k].realoldcoords)>0&&
-                !player[k].skeleton.free&&
-                player[k].animTarget!=climbanim&&
-                player[k].animTarget!=hanganim){
-            XYZ lowpoint,lowpointtarget,lowpoint2,lowpointtarget2,lowpoint3,lowpointtarget3,lowpoint4,lowpointtarget4,lowpoint5,lowpointtarget5,lowpoint6,lowpointtarget6,lowpoint7,lowpointtarget7,colpoint,colpoint2;
+        if (distsq(&player[k].coords, &player[k].realoldcoords) > 0 &&
+                !player[k].skeleton.free &&
+                player[k].animTarget != climbanim &&
+                player[k].animTarget != hanganim) {
+            XYZ lowpoint, lowpointtarget, lowpoint2, lowpointtarget2, lowpoint3, lowpointtarget3, lowpoint4, lowpointtarget4, lowpoint5, lowpointtarget5, lowpoint6, lowpointtarget6, lowpoint7, lowpointtarget7, colpoint, colpoint2;
             int whichhit;
-            bool tempcollide=0;
+            bool tempcollide = 0;
 
-            if(player[k].collide<-.3)
-                player[k].collide=-.3;
-            if(player[k].collide>1)
-                player[k].collide=1;
-            player[k].collide-=multiplier*30;
+            if (player[k].collide < -.3)
+                player[k].collide = -.3;
+            if (player[k].collide > 1)
+                player[k].collide = 1;
+            player[k].collide -= multiplier * 30;
 
             //clip to terrain
-            player[k].coords.y=max(player[k].coords.y, terrain.getHeight(player[k].coords.x,player[k].coords.z));
-
-            for(int l=0;l<terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz];l++){
-                int i=terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
-                if(objects.type[i]!=rocktype||
-                        objects.scale[i]>.5&&player[k].aitype==playercontrolled||
-                        objects.position[i].y>player[k].coords.y){
-                    lowpoint=player[k].coords;
-                    if(player[k].animTarget!=jumpupanim&&
-                            player[k].animTarget!=jumpdownanim&&
+            player[k].coords.y = max(player[k].coords.y, terrain.getHeight(player[k].coords.x, player[k].coords.z));
+
+            for (int l = 0; l < terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz]; l++) {
+                int i = terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
+                if (objects.type[i] != rocktype ||
+                        objects.scale[i] > .5 && player[k].aitype == playercontrolled ||
+                        objects.position[i].y > player[k].coords.y) {
+                    lowpoint = player[k].coords;
+                    if (player[k].animTarget != jumpupanim &&
+                            player[k].animTarget != jumpdownanim &&
                             !player[k].isFlip())
-                        lowpoint.y+=1.25;
+                        lowpoint.y += 1.25;
                     else
-                        lowpoint.y+=1.3;
-                    if(     player[k].coords.y<terrain.getHeight(player[k].coords.x,player[k].coords.z)&&
-                            player[k].coords.y>terrain.getHeight(player[k].coords.x,player[k].coords.z)-.1)
-                        player[k].coords.y=terrain.getHeight(player[k].coords.x,player[k].coords.z);
-                    if(player[k].SphereCheck(&lowpoint, 1.3, &colpoint, &objects.position[i], &objects.yaw[i], &objects.model[i])!=-1){
-                        flatfacing=lowpoint-player[k].coords;
-                        player[k].coords=lowpoint;
-                        player[k].coords.y-=1.3;
-                        player[k].collide=1;
-                        tempcollide=1;
+                        lowpoint.y += 1.3;
+                    if (     player[k].coords.y < terrain.getHeight(player[k].coords.x, player[k].coords.z) &&
+                             player[k].coords.y > terrain.getHeight(player[k].coords.x, player[k].coords.z) - .1)
+                        player[k].coords.y = terrain.getHeight(player[k].coords.x, player[k].coords.z);
+                    if (player[k].SphereCheck(&lowpoint, 1.3, &colpoint, &objects.position[i], &objects.yaw[i], &objects.model[i]) != -1) {
+                        flatfacing = lowpoint - player[k].coords;
+                        player[k].coords = lowpoint;
+                        player[k].coords.y -= 1.3;
+                        player[k].collide = 1;
+                        tempcollide = 1;
                         //wall jumps
                         //TODO: refactor four similar blocks
-                        if(player[k].aitype==playercontrolled&&
-                                (player[k].animTarget==jumpupanim||
-                                 player[k].animTarget==jumpdownanim||
-                                 player[k].isFlip())&&
-                                !player[k].jumptogglekeydown&&
-                                player[k].jumpkeydown){
-                            lowpointtarget=lowpoint+DoRotation(player[k].facing,0,-90,0)*1.5;
-                            XYZ tempcoords1=lowpoint;
-                            whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.yaw[i]);
-                            if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){
+                        if (player[k].aitype == playercontrolled &&
+                                (player[k].animTarget == jumpupanim ||
+                                 player[k].animTarget == jumpdownanim ||
+                                 player[k].isFlip()) &&
+                                !player[k].jumptogglekeydown &&
+                                player[k].jumpkeydown) {
+                            lowpointtarget = lowpoint + DoRotation(player[k].facing, 0, -90, 0) * 1.5;
+                            XYZ tempcoords1 = lowpoint;
+                            whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
+                            if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) {
                                 player[k].setAnimation(walljumpleftanim);
                                 emit_sound_at(movewhooshsound, player[k].coords);
-                                if(k==0)
+                                if (k == 0)
                                     pause_sound(whooshsound);
 
-                                lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.yaw[i],0);
-                                player[k].yaw=-asin(0-lowpointtarget.x)*180/M_PI;
-                                if(lowpointtarget.z<0)
-                                    player[k].yaw=180-player[k].yaw;
-                                player[k].targetyaw=player[k].yaw;
-                                player[k].lowyaw=player[k].yaw;
-                                if(k==0)
+                                lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0);
+                                player[k].yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
+                                if (lowpointtarget.z < 0)
+                                    player[k].yaw = 180 - player[k].yaw;
+                                player[k].targetyaw = player[k].yaw;
+                                player[k].lowyaw = player[k].yaw;
+                                if (k == 0)
                                     numwallflipped++;
-                            }
-                            else
-                            {
-                                lowpoint=tempcoords1;
-                                lowpointtarget=lowpoint+DoRotation(player[k].facing,0,90,0)*1.5;
-                                whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.yaw[i]);
-                                if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){
+                            } else {
+                                lowpoint = tempcoords1;
+                                lowpointtarget = lowpoint + DoRotation(player[k].facing, 0, 90, 0) * 1.5;
+                                whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
+                                if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) {
                                     player[k].setAnimation(walljumprightanim);
                                     emit_sound_at(movewhooshsound, player[k].coords);
-                                    if(k==0)pause_sound(whooshsound);
-
-                                    lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.yaw[i],0);
-                                    player[k].yaw=-asin(0-lowpointtarget.x)*180/M_PI;
-                                    if(lowpointtarget.z<0)player[k].yaw=180-player[k].yaw;
-                                    player[k].targetyaw=player[k].yaw;
-                                    player[k].lowyaw=player[k].yaw;
-                                    if(k==0)numwallflipped++;
-                                }
-                                else
-                                {
-                                    lowpoint=tempcoords1;
-                                    lowpointtarget=lowpoint+player[k].facing*2;
-                                    whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.yaw[i]);
-                                    if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){
+                                    if (k == 0)pause_sound(whooshsound);
+
+                                    lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0);
+                                    player[k].yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
+                                    if (lowpointtarget.z < 0)player[k].yaw = 180 - player[k].yaw;
+                                    player[k].targetyaw = player[k].yaw;
+                                    player[k].lowyaw = player[k].yaw;
+                                    if (k == 0)numwallflipped++;
+                                } else {
+                                    lowpoint = tempcoords1;
+                                    lowpointtarget = lowpoint + player[k].facing * 2;
+                                    whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
+                                    if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) {
                                         player[k].setAnimation(walljumpbackanim);
                                         emit_sound_at(movewhooshsound, player[k].coords);
-                                        if(k==0)pause_sound(whooshsound);
-
-                                        lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.yaw[i],0);
-                                        player[k].yaw=-asin(0-lowpointtarget.x)*180/M_PI;
-                                        if(lowpointtarget.z<0)player[k].yaw=180-player[k].yaw;
-                                        player[k].targetyaw=player[k].yaw;
-                                        player[k].lowyaw=player[k].yaw;
-                                        if(k==0)numwallflipped++;
-                                    }
-                                    else
-                                    {
-                                        lowpoint=tempcoords1;
-                                        lowpointtarget=lowpoint-player[k].facing*2;
-                                        whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.yaw[i]);
-                                        if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){
+                                        if (k == 0)pause_sound(whooshsound);
+
+                                        lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0);
+                                        player[k].yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
+                                        if (lowpointtarget.z < 0)player[k].yaw = 180 - player[k].yaw;
+                                        player[k].targetyaw = player[k].yaw;
+                                        player[k].lowyaw = player[k].yaw;
+                                        if (k == 0)numwallflipped++;
+                                    } else {
+                                        lowpoint = tempcoords1;
+                                        lowpointtarget = lowpoint - player[k].facing * 2;
+                                        whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
+                                        if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) {
                                             player[k].setAnimation(walljumpfrontanim);
                                             emit_sound_at(movewhooshsound, player[k].coords);
-                                            if(k==0)pause_sound(whooshsound);
-
-                                            lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.yaw[i],0);
-                                            player[k].yaw=-asin(0-lowpointtarget.x)*180/M_PI;
-                                            if(lowpointtarget.z<0)player[k].yaw=180-player[k].yaw;
-                                            player[k].yaw+=180;
-                                            player[k].targetyaw=player[k].yaw;
-                                            player[k].lowyaw=player[k].yaw;
-                                            if(k==0)numwallflipped++;
+                                            if (k == 0)pause_sound(whooshsound);
+
+                                            lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0);
+                                            player[k].yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
+                                            if (lowpointtarget.z < 0)player[k].yaw = 180 - player[k].yaw;
+                                            player[k].yaw += 180;
+                                            player[k].targetyaw = player[k].yaw;
+                                            player[k].lowyaw = player[k].yaw;
+                                            if (k == 0)numwallflipped++;
                                         }
                                     }
                                 }
                             }
                         }
                     }
-                }
-                else if(objects.type[i]==rocktype){
-                    lowpoint2=player[k].coords;
-                    lowpoint=player[k].coords;
-                    lowpoint.y+=2;
-                    if(objects.model[i].LineCheck(&lowpoint,&lowpoint2,&colpoint,&objects.position[i],&objects.yaw[i])!=-1){
-                        player[k].coords=colpoint;
-                        player[k].collide=1;
-                        tempcollide=1;
-
-                        if(player[k].animTarget==jumpdownanim||player[k].isFlip()){
+                } else if (objects.type[i] == rocktype) {
+                    lowpoint2 = player[k].coords;
+                    lowpoint = player[k].coords;
+                    lowpoint.y += 2;
+                    if (objects.model[i].LineCheck(&lowpoint, &lowpoint2, &colpoint, &objects.position[i], &objects.yaw[i]) != -1) {
+                        player[k].coords = colpoint;
+                        player[k].collide = 1;
+                        tempcollide = 1;
+
+                        if (player[k].animTarget == jumpdownanim || player[k].isFlip()) {
                             //flipped into a rock
-                            if(player[k].isFlip()&&animation[player[k].animTarget].label[player[k].frameTarget]==7)
+                            if (player[k].isFlip() && animation[player[k].animTarget].label[player[k].frameTarget] == 7)
                                 player[k].RagDoll(0);
 
-                            if(player[k].animTarget==jumpupanim){
-                                player[k].jumppower=-4;
-                                player[k].animTarget=player[k].getIdle();
+                            if (player[k].animTarget == jumpupanim) {
+                                player[k].jumppower = -4;
+                                player[k].animTarget = player[k].getIdle();
                             }
-                            player[k].target=0;
-                            player[k].frameTarget=0;
-                            player[k].onterrain=1;
+                            player[k].target = 0;
+                            player[k].frameTarget = 0;
+                            player[k].onterrain = 1;
 
-                            if(player[k].id==0){
+                            if (player[k].id == 0) {
                                 pause_sound(whooshsound);
                                 OPENAL_SetVolume(channels[whooshsound], 0);
                             }
 
                             //landing
-                            if((player[k].animTarget==jumpdownanim||player[k].isFlip())&&!player[k].wasLanding()){
-                                if(player[k].isFlip())
-                                    player[k].jumppower=-4;
-                                player[k].animTarget=player[k].getLanding();
+                            if ((player[k].animTarget == jumpdownanim || player[k].isFlip()) && !player[k].wasLanding()) {
+                                if (player[k].isFlip())
+                                    player[k].jumppower = -4;
+                                player[k].animTarget = player[k].getLanding();
                                 emit_sound_at(landsound, player[k].coords, 128.);
-                                if(k==0){
-                                    envsound[numenvsounds]=player[k].coords;
-                                    envsoundvol[numenvsounds]=16;
-                                    envsoundlife[numenvsounds]=.4;
+                                if (k == 0) {
+                                    envsound[numenvsounds] = player[k].coords;
+                                    envsoundvol[numenvsounds] = 16;
+                                    envsoundlife[numenvsounds] = .4;
                                     numenvsounds++;
                                 }
 
@@ -3610,127 +3791,127 @@ void doAerialAcrobatics(){
                 }
             }
 
-            if(tempcollide&&(/*player[k].jumptogglekeydown*/1==1||player[k].aitype!=playercontrolled))
-                for(int l=0;l<terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz];l++){
-                    int i=terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
-                    lowpoint=player[k].coords;
-                    lowpoint.y+=1.35;
-                    if(objects.type[i]!=rocktype)
-                        if(player[k].SphereCheck(&lowpoint,1.33,&colpoint,&objects.position[i],&objects.yaw[i],&objects.model[i])!=-1){
-                            if(player[k].animTarget!=jumpupanim&&
-                                    player[k].animTarget!=jumpdownanim&&
+            if (tempcollide && (/*player[k].jumptogglekeydown*/1 == 1 || player[k].aitype != playercontrolled))
+                for (int l = 0; l < terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz]; l++) {
+                    int i = terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
+                    lowpoint = player[k].coords;
+                    lowpoint.y += 1.35;
+                    if (objects.type[i] != rocktype)
+                        if (player[k].SphereCheck(&lowpoint, 1.33, &colpoint, &objects.position[i], &objects.yaw[i], &objects.model[i]) != -1) {
+                            if (player[k].animTarget != jumpupanim &&
+                                    player[k].animTarget != jumpdownanim &&
                                     player[k].onterrain)
-                                player[k].avoidcollided=1;
-                            player[k].coords=lowpoint;
-                            player[k].coords.y-=1.35;
-                            player[k].collide=1;
-
-                            if((player[k].grabdelay<=0||player[k].aitype!=playercontrolled)&&
-                                    (player[k].animCurrent!=climbanim&&
-                                     player[k].animCurrent!=hanganim&&
-                                     !player[k].isWallJump()||
-                                     player[k].animTarget==jumpupanim||
-                                     player[k].animTarget==jumpdownanim)){
-                                lowpoint=player[k].coords;
+                                player[k].avoidcollided = 1;
+                            player[k].coords = lowpoint;
+                            player[k].coords.y -= 1.35;
+                            player[k].collide = 1;
+
+                            if ((player[k].grabdelay <= 0 || player[k].aitype != playercontrolled) &&
+                                    (player[k].animCurrent != climbanim &&
+                                     player[k].animCurrent != hanganim &&
+                                     !player[k].isWallJump() ||
+                                     player[k].animTarget == jumpupanim ||
+                                     player[k].animTarget == jumpdownanim)) {
+                                lowpoint = player[k].coords;
                                 objects.model[i].SphereCheckPossible(&lowpoint, 1.5, &objects.position[i], &objects.yaw[i]);
-                                lowpoint=player[k].coords;
-                                lowpoint.y+=.05;
-                                facing=0;
-                                facing.z=-1;
-                                facing=DoRotation(facing,0,player[k].targetyaw+180,0);
-                                lowpointtarget=lowpoint+facing*1.4;
-                                whichhit=objects.model[i].LineCheckPossible(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.yaw[i]);
-                                if(whichhit!=-1){
-                                    lowpoint=player[k].coords;
-                                    lowpoint.y+=.1;
-                                    lowpointtarget=lowpoint+facing*1.4;
-                                    lowpoint2=lowpoint;
-                                    lowpointtarget2=lowpointtarget;
-                                    lowpoint3=lowpoint;
-                                    lowpointtarget3=lowpointtarget;
-                                    lowpoint4=lowpoint;
-                                    lowpointtarget4=lowpointtarget;
-                                    lowpoint5=lowpoint;
-                                    lowpointtarget5=lowpointtarget;
-                                    lowpoint6=lowpoint;
-                                    lowpointtarget6=lowpointtarget;
-                                    lowpoint7=lowpoint;
-                                    lowpointtarget7=lowpoint;
-                                    lowpoint2.x+=.1;
-                                    lowpointtarget2.x+=.1;
-                                    lowpoint3.z+=.1;
-                                    lowpointtarget3.z+=.1;
-                                    lowpoint4.x-=.1;
-                                    lowpointtarget4.x-=.1;
-                                    lowpoint5.z-=.1;
-                                    lowpointtarget5.z-=.1;
-                                    lowpoint6.y+=45/13;
-                                    lowpointtarget6.y+=45/13;
-                                    lowpointtarget6+=facing*.6;
-                                    lowpointtarget7.y+=90/13;
-                                    whichhit=objects.model[i].LineCheckPossible(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.yaw[i]);
-                                    if(objects.friction[i]>.5)
-                                        if(whichhit!=-1){
-                                            if(whichhit!=-1&&player[k].animTarget!=jumpupanim&&player[k].animTarget!=jumpdownanim)
-                                                player[k].collided=1;
-                                            if(checkcollide(lowpoint7,lowpointtarget7)==-1)
-                                                if(checkcollide(lowpoint6,lowpointtarget6)==-1)
-                                                    if(     objects.model[i].LineCheckPossible(&lowpoint2,&lowpointtarget2,
-                                                                &colpoint,&objects.position[i],&objects.yaw[i])!=-1&&
-                                                            objects.model[i].LineCheckPossible(&lowpoint3,&lowpointtarget3,
-                                                                &colpoint,&objects.position[i],&objects.yaw[i])!=-1&&
-                                                            objects.model[i].LineCheckPossible(&lowpoint4,&lowpointtarget4,
-                                                                &colpoint,&objects.position[i],&objects.yaw[i])!=-1&&
-                                                            objects.model[i].LineCheckPossible(&lowpoint5,&lowpointtarget5,
-                                                                &colpoint,&objects.position[i],&objects.yaw[i])!=-1)
-                                                        for(int j=0;j<45;j++){
-                                                            lowpoint=player[k].coords;
-                                                            lowpoint.y+=(float)j/13;
-                                                            lowpointtarget=lowpoint+facing*1.4;
-                                                            if(objects.model[i].LineCheckPossible(&lowpoint,&lowpointtarget,
-                                                                        &colpoint2,&objects.position[i],&objects.yaw[i])==-1){
-                                                                if(j<=6||j<=25&&player[k].animTarget==jumpdownanim)
+                                lowpoint = player[k].coords;
+                                lowpoint.y += .05;
+                                facing = 0;
+                                facing.z = -1;
+                                facing = DoRotation(facing, 0, player[k].targetyaw + 180, 0);
+                                lowpointtarget = lowpoint + facing * 1.4;
+                                whichhit = objects.model[i].LineCheckPossible(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
+                                if (whichhit != -1) {
+                                    lowpoint = player[k].coords;
+                                    lowpoint.y += .1;
+                                    lowpointtarget = lowpoint + facing * 1.4;
+                                    lowpoint2 = lowpoint;
+                                    lowpointtarget2 = lowpointtarget;
+                                    lowpoint3 = lowpoint;
+                                    lowpointtarget3 = lowpointtarget;
+                                    lowpoint4 = lowpoint;
+                                    lowpointtarget4 = lowpointtarget;
+                                    lowpoint5 = lowpoint;
+                                    lowpointtarget5 = lowpointtarget;
+                                    lowpoint6 = lowpoint;
+                                    lowpointtarget6 = lowpointtarget;
+                                    lowpoint7 = lowpoint;
+                                    lowpointtarget7 = lowpoint;
+                                    lowpoint2.x += .1;
+                                    lowpointtarget2.x += .1;
+                                    lowpoint3.z += .1;
+                                    lowpointtarget3.z += .1;
+                                    lowpoint4.x -= .1;
+                                    lowpointtarget4.x -= .1;
+                                    lowpoint5.z -= .1;
+                                    lowpointtarget5.z -= .1;
+                                    lowpoint6.y += 45 / 13;
+                                    lowpointtarget6.y += 45 / 13;
+                                    lowpointtarget6 += facing * .6;
+                                    lowpointtarget7.y += 90 / 13;
+                                    whichhit = objects.model[i].LineCheckPossible(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
+                                    if (objects.friction[i] > .5)
+                                        if (whichhit != -1) {
+                                            if (whichhit != -1 && player[k].animTarget != jumpupanim && player[k].animTarget != jumpdownanim)
+                                                player[k].collided = 1;
+                                            if (checkcollide(lowpoint7, lowpointtarget7) == -1)
+                                                if (checkcollide(lowpoint6, lowpointtarget6) == -1)
+                                                    if (     objects.model[i].LineCheckPossible(&lowpoint2, &lowpointtarget2,
+                                                             &colpoint, &objects.position[i], &objects.yaw[i]) != -1 &&
+                                                             objects.model[i].LineCheckPossible(&lowpoint3, &lowpointtarget3,
+                                                                     &colpoint, &objects.position[i], &objects.yaw[i]) != -1 &&
+                                                             objects.model[i].LineCheckPossible(&lowpoint4, &lowpointtarget4,
+                                                                     &colpoint, &objects.position[i], &objects.yaw[i]) != -1 &&
+                                                             objects.model[i].LineCheckPossible(&lowpoint5, &lowpointtarget5,
+                                                                     &colpoint, &objects.position[i], &objects.yaw[i]) != -1)
+                                                        for (int j = 0; j < 45; j++) {
+                                                            lowpoint = player[k].coords;
+                                                            lowpoint.y += (float)j / 13;
+                                                            lowpointtarget = lowpoint + facing * 1.4;
+                                                            if (objects.model[i].LineCheckPossible(&lowpoint, &lowpointtarget,
+                                                                                                   &colpoint2, &objects.position[i], &objects.yaw[i]) == -1) {
+                                                                if (j <= 6 || j <= 25 && player[k].animTarget == jumpdownanim)
                                                                     break;
-                                                                if(player[k].animTarget==jumpupanim||player[k].animTarget==jumpdownanim){
-                                                                    lowpoint=DoRotation(objects.model[i].facenormals[whichhit],0,objects.yaw[k],0);
-                                                                    lowpoint=player[k].coords;
-                                                                    lowpoint.y+=(float)j/13;
-                                                                    lowpointtarget=lowpoint+facing*1.3;
-                                                                    flatfacing=player[k].coords;
-                                                                    player[k].coords=colpoint-DoRotation(objects.model[i].facenormals[whichhit],0,objects.yaw[k],0)*.01;
-                                                                    player[k].coords.y=lowpointtarget.y-.07;
-                                                                    player[k].currentoffset=(flatfacing-player[k].coords)/player[k].scale;
-
-                                                                    if(j>10||!player[k].isRun()){
-                                                                        if(player[k].animTarget==jumpdownanim||player[k].animTarget==jumpupanim){
-                                                                            if(k==0)
+                                                                if (player[k].animTarget == jumpupanim || player[k].animTarget == jumpdownanim) {
+                                                                    lowpoint = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[k], 0);
+                                                                    lowpoint = player[k].coords;
+                                                                    lowpoint.y += (float)j / 13;
+                                                                    lowpointtarget = lowpoint + facing * 1.3;
+                                                                    flatfacing = player[k].coords;
+                                                                    player[k].coords = colpoint - DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[k], 0) * .01;
+                                                                    player[k].coords.y = lowpointtarget.y - .07;
+                                                                    player[k].currentoffset = (flatfacing - player[k].coords) / player[k].scale;
+
+                                                                    if (j > 10 || !player[k].isRun()) {
+                                                                        if (player[k].animTarget == jumpdownanim || player[k].animTarget == jumpupanim) {
+                                                                            if (k == 0)
                                                                                 pause_sound(whooshsound);
                                                                         }
                                                                         emit_sound_at(jumpsound, player[k].coords, 128.);
 
-                                                                        lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.yaw[i],0);
-                                                                        player[k].yaw=-asin(0-lowpointtarget.x)*180/M_PI;
-                                                                        if(lowpointtarget.z<0)
-                                                                            player[k].yaw=180-player[k].yaw;
-                                                                        player[k].targetyaw=player[k].yaw;
-                                                                        player[k].lowyaw=player[k].yaw;
+                                                                        lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0);
+                                                                        player[k].yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
+                                                                        if (lowpointtarget.z < 0)
+                                                                            player[k].yaw = 180 - player[k].yaw;
+                                                                        player[k].targetyaw = player[k].yaw;
+                                                                        player[k].lowyaw = player[k].yaw;
 
                                                                         //player[k].velocity=lowpointtarget*.03;
-                                                                        player[k].velocity=0;
+                                                                        player[k].velocity = 0;
 
                                                                         //climb ledge (?)
-                                                                        if(player[k].animTarget==jumpupanim){
-                                                                            player[k].animTarget=climbanim;
-                                                                            player[k].jumppower=0;
-                                                                            player[k].jumpclimb=1;
+                                                                        if (player[k].animTarget == jumpupanim) {
+                                                                            player[k].animTarget = climbanim;
+                                                                            player[k].jumppower = 0;
+                                                                            player[k].jumpclimb = 1;
                                                                         }
-                                                                        player[k].transspeed=6;
-                                                                        player[k].target=0;
-                                                                        player[k].frameTarget=1;
+                                                                        player[k].transspeed = 6;
+                                                                        player[k].target = 0;
+                                                                        player[k].frameTarget = 1;
                                                                         //hang ledge (?)
-                                                                        if(j>25){
+                                                                        if (j > 25) {
                                                                             player[k].setAnimation(hanganim);
-                                                                            player[k].jumppower=0;
+                                                                            player[k].jumppower = 0;
                                                                         }
                                                                     }
                                                                     break;
@@ -3742,564 +3923,573 @@ void doAerialAcrobatics(){
                             }
                         }
                 }
-            if(player[k].collide<=0){
+            if (player[k].collide <= 0) {
                 //in the air
-                if(!player[k].onterrain&&
-                        player[k].animTarget!=jumpupanim&&
-                        player[k].animTarget!=jumpdownanim&&
-                        player[k].animTarget!=climbanim&&
-                        player[k].animTarget!=hanganim&&
-                        !player[k].isWallJump()&&
-                        !player[k].isFlip()){
-                    if(player[k].animCurrent!=climbanim&&
-                            player[k].animCurrent!=tempanim&&
-                            player[k].animTarget!=backhandspringanim&&
-                            (player[k].animTarget!=rollanim||
-                             player[k].frameTarget<2||
-                             player[k].frameTarget>6)){
+                if (!player[k].onterrain &&
+                        player[k].animTarget != jumpupanim &&
+                        player[k].animTarget != jumpdownanim &&
+                        player[k].animTarget != climbanim &&
+                        player[k].animTarget != hanganim &&
+                        !player[k].isWallJump() &&
+                        !player[k].isFlip()) {
+                    if (player[k].animCurrent != climbanim &&
+                            player[k].animCurrent != tempanim &&
+                            player[k].animTarget != backhandspringanim &&
+                            (player[k].animTarget != rollanim ||
+                             player[k].frameTarget < 2 ||
+                             player[k].frameTarget > 6)) {
                         //stagger off ledge (?)
-                        if(player[k].animTarget==staggerbackhighanim||player[k].animTarget==staggerbackhardanim)
+                        if (player[k].animTarget == staggerbackhighanim || player[k].animTarget == staggerbackhardanim)
                             player[k].RagDoll(0);
                         player[k].setAnimation(jumpdownanim);
 
-                        if(!k)
-                          emit_sound_at(whooshsound, player[k].coords, 128.);
+                        if (!k)
+                            emit_sound_at(whooshsound, player[k].coords, 128.);
                     }
                     //gravity
-                    player[k].velocity.y+=gravity;
+                    player[k].velocity.y += gravity;
                 }
             }
         }
-        player[k].realoldcoords=player[k].coords;
+        player[k].realoldcoords = player[k].coords;
     }
 }
 
-void doAttacks(){
+void doAttacks()
+{
     static XYZ relative;
     static int randattack;
-    static bool playerrealattackkeydown=0;
-
-    if(!Input::isKeyDown(attackkey))
-        oldattackkey=0;
-    if(oldattackkey)
-        player[0].attackkeydown=0;
-    if(oldattackkey)
-        playerrealattackkeydown=0;
-    if(!oldattackkey)
-        playerrealattackkeydown=Input::isKeyDown(attackkey);
-    if((player[0].parriedrecently<=0||
-                player[0].weaponactive==-1)&&
-            (!oldattackkey||
-             (realthreat&&
-              player[0].lastattack!=swordslashanim&&
-              player[0].lastattack!=knifeslashstartanim&&
-              player[0].lastattack!=staffhitanim&&
-              player[0].lastattack!=staffspinhitanim)))
-        player[0].attackkeydown=Input::isKeyDown(attackkey);
-    if(Input::isKeyDown(attackkey)&&
-            !oldattackkey&&
-            !player[0].backkeydown){
-        for(int k=0;k<numplayers;k++){
-            if((player[k].animTarget==swordslashanim||
-                        player[k].animTarget==staffhitanim||
-                        player[k].animTarget==staffspinhitanim)&&
-                    player[0].animCurrent!=dodgebackanim&&
+    static bool playerrealattackkeydown = 0;
+
+    if (!Input::isKeyDown(attackkey))
+        oldattackkey = 0;
+    if (oldattackkey)
+        player[0].attackkeydown = 0;
+    if (oldattackkey)
+        playerrealattackkeydown = 0;
+    if (!oldattackkey)
+        playerrealattackkeydown = Input::isKeyDown(attackkey);
+    if ((player[0].parriedrecently <= 0 ||
+            player[0].weaponactive == -1) &&
+            (!oldattackkey ||
+             (realthreat &&
+              player[0].lastattack != swordslashanim &&
+              player[0].lastattack != knifeslashstartanim &&
+              player[0].lastattack != staffhitanim &&
+              player[0].lastattack != staffspinhitanim)))
+        player[0].attackkeydown = Input::isKeyDown(attackkey);
+    if (Input::isKeyDown(attackkey) &&
+            !oldattackkey &&
+            !player[0].backkeydown) {
+        for (int k = 0; k < numplayers; k++) {
+            if ((player[k].animTarget == swordslashanim ||
+                    player[k].animTarget == staffhitanim ||
+                    player[k].animTarget == staffspinhitanim) &&
+                    player[0].animCurrent != dodgebackanim &&
                     !player[k].skeleton.free)
                 player[k].Reverse();
         }
     }
 
-    if(!hostile||indialogue!=-1)player[0].attackkeydown=0;
+    if (!hostile || indialogue != -1)player[0].attackkeydown = 0;
 
-    for(int k=0;k<numplayers;k++){
-        if(indialogue!=-1)player[k].attackkeydown=0;
-        if(player[k].animTarget!=rabbitrunninganim&&player[k].animTarget!=wolfrunninganim){
-            if(player[k].aitype!=playercontrolled)
-                player[k].victim=&player[0];
+    for (int k = 0; k < numplayers; k++) {
+        if (indialogue != -1)player[k].attackkeydown = 0;
+        if (player[k].animTarget != rabbitrunninganim && player[k].animTarget != wolfrunninganim) {
+            if (player[k].aitype != playercontrolled)
+                player[k].victim = &player[0];
             //attack key pressed
-            if(player[k].attackkeydown){
+            if (player[k].attackkeydown) {
                 //dodge backward
-                if(player[k].backkeydown&&
-                        player[k].animTarget!=backhandspringanim&&
-                        (player[k].isIdle()||
-                         player[k].isStop()||
-                         player[k].isRun()||
-                         player[k].animTarget==walkanim)){
-                    if(player[k].jumppower<=1){
-                        player[k].jumppower-=2;
-                    }else{
-                        for(int i=0;i<numplayers;i++){
-                            if(i==k)continue;
-                            if(player[i].animTarget==swordslashanim||
-                                    player[i].animTarget==knifeslashstartanim||
-                                    player[i].animTarget==staffhitanim||
-                                    player[i].animTarget==staffspinhitanim)
-                                if(distsq(&player[k].coords,&player[i].coords)<6.5&&!player[i].skeleton.free){
+                if (player[k].backkeydown &&
+                        player[k].animTarget != backhandspringanim &&
+                        (player[k].isIdle() ||
+                         player[k].isStop() ||
+                         player[k].isRun() ||
+                         player[k].animTarget == walkanim)) {
+                    if (player[k].jumppower <= 1) {
+                        player[k].jumppower -= 2;
+                    } else {
+                        for (int i = 0; i < numplayers; i++) {
+                            if (i == k)continue;
+                            if (player[i].animTarget == swordslashanim ||
+                                    player[i].animTarget == knifeslashstartanim ||
+                                    player[i].animTarget == staffhitanim ||
+                                    player[i].animTarget == staffspinhitanim)
+                                if (distsq(&player[k].coords, &player[i].coords) < 6.5 && !player[i].skeleton.free) {
                                     player[k].setAnimation(dodgebackanim);
-                                    player[k].targetyaw=roughDirectionTo(player[k].coords,player[i].coords);
-                                    player[k].targettilt2=pitchTo(player[k].coords,player[i].coords);
+                                    player[k].targetyaw = roughDirectionTo(player[k].coords, player[i].coords);
+                                    player[k].targettilt2 = pitchTo(player[k].coords, player[i].coords);
                                 }
                         }
-                        if(player[k].animTarget!=dodgebackanim){
-                            if(k==0)numflipped++;
+                        if (player[k].animTarget != dodgebackanim) {
+                            if (k == 0)numflipped++;
                             player[k].setAnimation(backhandspringanim);
-                            player[k].targetyaw=-yaw+180;
-                            if(player[k].leftkeydown)
-                                player[k].targetyaw-=45;
-                            if(player[k].rightkeydown)
-                                player[k].targetyaw+=45;
-                            player[k].yaw=player[k].targetyaw;
-                            player[k].jumppower-=2;
+                            player[k].targetyaw = -yaw + 180;
+                            if (player[k].leftkeydown)
+                                player[k].targetyaw -= 45;
+                            if (player[k].rightkeydown)
+                                player[k].targetyaw += 45;
+                            player[k].yaw = player[k].targetyaw;
+                            player[k].jumppower -= 2;
                         }
                     }
                 }
                 //attack
-                if(!animation[player[k].animTarget].attack&&
-                        !player[k].backkeydown&&
-                        (player[k].isIdle()||
-                         player[k].isRun()||
-                         player[k].animTarget==walkanim||
-                         player[k].animTarget==sneakanim||
-                         player[k].isCrouch())){
-                    const int attackweapon=player[k].weaponactive==-1?0:weapons[player[k].weaponids[player[k].weaponactive]].getType();
+                if (!animation[player[k].animTarget].attack &&
+                        !player[k].backkeydown &&
+                        (player[k].isIdle() ||
+                         player[k].isRun() ||
+                         player[k].animTarget == walkanim ||
+                         player[k].animTarget == sneakanim ||
+                         player[k].isCrouch())) {
+                    const int attackweapon = player[k].weaponactive == -1 ? 0 : weapons[player[k].weaponids[player[k].weaponactive]].getType();
                     //normal attacks (?)
-                    player[k].hasvictim=0;
-                    if(numplayers>1)
-                        for(int i=0;i<numplayers;i++){
-                            if(i==k||!(k==0||i==0))continue;
-                            if(!player[k].hasvictim)
-                                if(animation[player[k].animTarget].attack!=reversal){
+                    player[k].hasvictim = 0;
+                    if (numplayers > 1)
+                        for (int i = 0; i < numplayers; i++) {
+                            if (i == k || !(k == 0 || i == 0))continue;
+                            if (!player[k].hasvictim)
+                                if (animation[player[k].animTarget].attack != reversal) {
                                     //choose an attack
-                                    const float distance=distsq(&player[k].coords,&player[i].coords);
-                                    if(distance<4.5&&
-                                            !player[i].skeleton.free&&
-                                            player[i].howactive<typedead1&&
-                                            player[i].animTarget!=jumpreversedanim&&
-                                            player[i].animTarget!=rabbitkickreversedanim&&
-                                            player[i].animTarget!=rabbitkickanim&&
-                                            player[k].animTarget!=rabbitkickanim&&
-                                            player[i].animTarget!=getupfrombackanim&&
-                                            (player[i].animTarget!=staggerbackhighanim&&
-                                             (player[i].animTarget!=staggerbackhardanim||
-                                              animation[staggerbackhardanim].label[player[i].frameTarget]==6))&&
-                                            player[i].animTarget!=jumpdownanim&&
-                                            player[i].animTarget!=jumpupanim&&
-                                            player[i].animTarget!=getupfromfrontanim){
-                                        player[k].victim=&player[i];
-                                        player[k].hasvictim=1;
-                                        if(player[k].aitype==playercontrolled){ //human player
+                                    const float distance = distsq(&player[k].coords, &player[i].coords);
+                                    if (distance < 4.5 &&
+                                            !player[i].skeleton.free &&
+                                            player[i].howactive < typedead1 &&
+                                            player[i].animTarget != jumpreversedanim &&
+                                            player[i].animTarget != rabbitkickreversedanim &&
+                                            player[i].animTarget != rabbitkickanim &&
+                                            player[k].animTarget != rabbitkickanim &&
+                                            player[i].animTarget != getupfrombackanim &&
+                                            (player[i].animTarget != staggerbackhighanim &&
+                                             (player[i].animTarget != staggerbackhardanim ||
+                                              animation[staggerbackhardanim].label[player[i].frameTarget] == 6)) &&
+                                            player[i].animTarget != jumpdownanim &&
+                                            player[i].animTarget != jumpupanim &&
+                                            player[i].animTarget != getupfromfrontanim) {
+                                        player[k].victim = &player[i];
+                                        player[k].hasvictim = 1;
+                                        if (player[k].aitype == playercontrolled) { //human player
                                             //sweep
-                                            if(distance<2.5*sq(player[k].scale*5)&&
-                                                    player[k].crouchkeydown&&
-                                                    animation[player[i].animTarget].height!=lowheight)
-                                                player[k].animTarget=sweepanim;
+                                            if (distance < 2.5 * sq(player[k].scale * 5) &&
+                                                    player[k].crouchkeydown &&
+                                                    animation[player[i].animTarget].height != lowheight)
+                                                player[k].animTarget = sweepanim;
                                             //winduppunch
-                                            else if(distance<1.5*sq(player[k].scale*5)&&
-                                                    animation[player[i].animTarget].height!=lowheight&&
-                                                    !player[k].forwardkeydown&&
-                                                    !player[k].leftkeydown&&
-                                                    !player[k].rightkeydown&&
-                                                    !player[k].crouchkeydown&&
-                                                    !attackweapon&&
-                                                    !reversaltrain)
-                                                player[k].animTarget=winduppunchanim;
+                                            else if (distance < 1.5 * sq(player[k].scale * 5) &&
+                                                     animation[player[i].animTarget].height != lowheight &&
+                                                     !player[k].forwardkeydown &&
+                                                     !player[k].leftkeydown &&
+                                                     !player[k].rightkeydown &&
+                                                     !player[k].crouchkeydown &&
+                                                     !attackweapon &&
+                                                     !reversaltrain)
+                                                player[k].animTarget = winduppunchanim;
                                             //upunch
-                                            else if(distance<2.5*sq(player[k].scale*5)&&
-                                                    animation[player[i].animTarget].height!=lowheight&&
-                                                    !player[k].forwardkeydown&&
-                                                    !player[k].leftkeydown&&
-                                                    !player[k].rightkeydown&&
-                                                    !player[k].crouchkeydown&&
-                                                    !attackweapon)
-                                                player[k].animTarget=upunchanim;
+                                            else if (distance < 2.5 * sq(player[k].scale * 5) &&
+                                                     animation[player[i].animTarget].height != lowheight &&
+                                                     !player[k].forwardkeydown &&
+                                                     !player[k].leftkeydown &&
+                                                     !player[k].rightkeydown &&
+                                                     !player[k].crouchkeydown &&
+                                                     !attackweapon)
+                                                player[k].animTarget = upunchanim;
                                             //knifefollow
-                                            else if(distance<2.5*sq(player[k].scale*5)&&
-                                                    player[i].staggerdelay>0&&
-                                                    attackweapon==knife&&
-                                                    player[i].bloodloss>player[i].damagetolerance/2)
-                                                player[k].animTarget=knifefollowanim;
+                                            else if (distance < 2.5 * sq(player[k].scale * 5) &&
+                                                     player[i].staggerdelay > 0 &&
+                                                     attackweapon == knife &&
+                                                     player[i].bloodloss > player[i].damagetolerance / 2)
+                                                player[k].animTarget = knifefollowanim;
                                             //knifeslashstart
-                                            else if(distance<2.5*sq(player[k].scale*5)&&
-                                                    animation[player[i].animTarget].height!=lowheight&&
-                                                    !player[k].forwardkeydown&&
-                                                    !player[k].leftkeydown&&
-                                                    !player[k].rightkeydown&&
-                                                    !player[k].crouchkeydown&&
-                                                    attackweapon==knife&&
-                                                    player[k].weaponmissdelay<=0)
-                                                player[k].animTarget=knifeslashstartanim;
+                                            else if (distance < 2.5 * sq(player[k].scale * 5) &&
+                                                     animation[player[i].animTarget].height != lowheight &&
+                                                     !player[k].forwardkeydown &&
+                                                     !player[k].leftkeydown &&
+                                                     !player[k].rightkeydown &&
+                                                     !player[k].crouchkeydown &&
+                                                     attackweapon == knife &&
+                                                     player[k].weaponmissdelay <= 0)
+                                                player[k].animTarget = knifeslashstartanim;
                                             //swordslash
-                                            else if(distance<4.5*sq(player[k].scale*5)&&
-                                                    animation[player[i].animTarget].height!=lowheight&&
-                                                    !player[k].crouchkeydown&&
-                                                    attackweapon==sword&&
-                                                    player[k].weaponmissdelay<=0)
-                                                player[k].animTarget=swordslashanim;
+                                            else if (distance < 4.5 * sq(player[k].scale * 5) &&
+                                                     animation[player[i].animTarget].height != lowheight &&
+                                                     !player[k].crouchkeydown &&
+                                                     attackweapon == sword &&
+                                                     player[k].weaponmissdelay <= 0)
+                                                player[k].animTarget = swordslashanim;
                                             //staffhit
-                                            else if(distance<4.5*sq(player[k].scale*5)&&
-                                                    animation[player[i].animTarget].height!=lowheight&&
-                                                    !player[k].crouchkeydown&&
-                                                    attackweapon==staff&&
-                                                    player[k].weaponmissdelay<=0&&
-                                                    !player[k].leftkeydown&&
-                                                    !player[k].rightkeydown&&
-                                                    !player[k].forwardkeydown)
-                                                player[k].animTarget=staffhitanim;
+                                            else if (distance < 4.5 * sq(player[k].scale * 5) &&
+                                                     animation[player[i].animTarget].height != lowheight &&
+                                                     !player[k].crouchkeydown &&
+                                                     attackweapon == staff &&
+                                                     player[k].weaponmissdelay <= 0 &&
+                                                     !player[k].leftkeydown &&
+                                                     !player[k].rightkeydown &&
+                                                     !player[k].forwardkeydown)
+                                                player[k].animTarget = staffhitanim;
                                             //staffspinhit
-                                            else if(distance<4.5*sq(player[k].scale*5)&&
-                                                    animation[player[i].animTarget].height!=lowheight&&
-                                                    !player[k].crouchkeydown&&
-                                                    attackweapon==staff&&
-                                                    player[k].weaponmissdelay<=0)
-                                                player[k].animTarget=staffspinhitanim;
+                                            else if (distance < 4.5 * sq(player[k].scale * 5) &&
+                                                     animation[player[i].animTarget].height != lowheight &&
+                                                     !player[k].crouchkeydown &&
+                                                     attackweapon == staff &&
+                                                     player[k].weaponmissdelay <= 0)
+                                                player[k].animTarget = staffspinhitanim;
                                             //spinkick
-                                            else if(distance<2.5*sq(player[k].scale*5)&&
-                                                    animation[player[i].animTarget].height!=lowheight)
-                                                player[k].animTarget=spinkickanim;
+                                            else if (distance < 2.5 * sq(player[k].scale * 5) &&
+                                                     animation[player[i].animTarget].height != lowheight)
+                                                player[k].animTarget = spinkickanim;
                                             //lowkick
-                                            else if(distance<2.5*sq(player[k].scale*5)&&
-                                                    animation[player[i].animTarget].height==lowheight&&
-                                                    animation[player[k].animTarget].attack!=normalattack)
-                                                player[k].animTarget=lowkickanim;
+                                            else if (distance < 2.5 * sq(player[k].scale * 5) &&
+                                                     animation[player[i].animTarget].height == lowheight &&
+                                                     animation[player[k].animTarget].attack != normalattack)
+                                                player[k].animTarget = lowkickanim;
                                         } else { //AI player
-                                            if(distance<4.5*sq(player[k].scale*5)){
-                                                randattack=abs(Random()%5);
-                                                if(!attackweapon&&distance<2.5*sq(player[k].scale*5)){
+                                            if (distance < 4.5 * sq(player[k].scale * 5)) {
+                                                randattack = abs(Random() % 5);
+                                                if (!attackweapon && distance < 2.5 * sq(player[k].scale * 5)) {
                                                     //sweep
-                                                    if(randattack==0&&animation[player[i].animTarget].height!=lowheight)
-                                                        player[k].animTarget=sweepanim;
+                                                    if (randattack == 0 && animation[player[i].animTarget].height != lowheight)
+                                                        player[k].animTarget = sweepanim;
                                                     //upunch
-                                                    else if(randattack==1&&animation[player[i].animTarget].height!=lowheight&&
-                                                            !attackweapon)
-                                                        player[k].animTarget=upunchanim;
+                                                    else if (randattack == 1 && animation[player[i].animTarget].height != lowheight &&
+                                                             !attackweapon)
+                                                        player[k].animTarget = upunchanim;
                                                     //spinkick
-                                                    else if(randattack==2&&animation[player[i].animTarget].height!=lowheight)
-                                                        player[k].animTarget=spinkickanim;
+                                                    else if (randattack == 2 && animation[player[i].animTarget].height != lowheight)
+                                                        player[k].animTarget = spinkickanim;
                                                     //lowkick
-                                                    else if(animation[player[i].animTarget].height==lowheight)
-                                                        player[k].animTarget=lowkickanim;
+                                                    else if (animation[player[i].animTarget].height == lowheight)
+                                                        player[k].animTarget = lowkickanim;
                                                 }
-                                                if(attackweapon){
+                                                if (attackweapon) {
                                                     //sweep
-                                                    if((tutoriallevel!=1||!attackweapon)&&
-                                                            distance<2.5*sq(player[k].scale*5)&&
-                                                            randattack==0&&
-                                                            animation[player[i].animTarget].height!=lowheight)
-                                                        player[k].animTarget=sweepanim;
+                                                    if ((tutoriallevel != 1 || !attackweapon) &&
+                                                            distance < 2.5 * sq(player[k].scale * 5) &&
+                                                            randattack == 0 &&
+                                                            animation[player[i].animTarget].height != lowheight)
+                                                        player[k].animTarget = sweepanim;
                                                     //knifeslashstart
-                                                    else if(distance<2.5*sq(player[k].scale*5)&&
-                                                            attackweapon==knife&&
-                                                            player[k].weaponmissdelay<=0)
-                                                        player[k].animTarget=knifeslashstartanim;
+                                                    else if (distance < 2.5 * sq(player[k].scale * 5) &&
+                                                             attackweapon == knife &&
+                                                             player[k].weaponmissdelay <= 0)
+                                                        player[k].animTarget = knifeslashstartanim;
                                                     //swordslash
-                                                    else if(!(player[0].victim==&player[i]&&
-                                                                player[0].hasvictim&&
-                                                                player[0].animTarget==swordslashanim)&&
-                                                            attackweapon==sword&&
-                                                            player[k].weaponmissdelay<=0)
-                                                        player[k].animTarget=swordslashanim;
+                                                    else if (!(player[0].victim == &player[i] &&
+                                                               player[0].hasvictim &&
+                                                               player[0].animTarget == swordslashanim) &&
+                                                             attackweapon == sword &&
+                                                             player[k].weaponmissdelay <= 0)
+                                                        player[k].animTarget = swordslashanim;
                                                     //staffhit
-                                                    else if(!(player[0].victim==&player[i]&&
-                                                                player[0].hasvictim&&
-                                                                player[0].animTarget==swordslashanim)&&
-                                                            attackweapon==staff&&
-                                                            player[k].weaponmissdelay<=0&&
-                                                            randattack<3)
-                                                        player[k].animTarget=staffhitanim;
+                                                    else if (!(player[0].victim == &player[i] &&
+                                                               player[0].hasvictim &&
+                                                               player[0].animTarget == swordslashanim) &&
+                                                             attackweapon == staff &&
+                                                             player[k].weaponmissdelay <= 0 &&
+                                                             randattack < 3)
+                                                        player[k].animTarget = staffhitanim;
                                                     //staffspinhit
-                                                    else if(!(player[0].victim==&player[i]&&
-                                                                player[0].hasvictim&&
-                                                                player[0].animTarget==swordslashanim)&&
-                                                            attackweapon==staff&&
-                                                            player[k].weaponmissdelay<=0&&
-                                                            randattack>=3)
-                                                        player[k].animTarget=staffspinhitanim;
+                                                    else if (!(player[0].victim == &player[i] &&
+                                                               player[0].hasvictim &&
+                                                               player[0].animTarget == swordslashanim) &&
+                                                             attackweapon == staff &&
+                                                             player[k].weaponmissdelay <= 0 &&
+                                                             randattack >= 3)
+                                                        player[k].animTarget = staffspinhitanim;
                                                     //spinkick
-                                                    else if((tutoriallevel!=1||!attackweapon)&&
-                                                            distance<2.5*sq(player[k].scale*5)&&
-                                                            randattack==1&&
-                                                            animation[player[i].animTarget].height!=lowheight)
-                                                        player[k].animTarget=spinkickanim;
+                                                    else if ((tutoriallevel != 1 || !attackweapon) &&
+                                                             distance < 2.5 * sq(player[k].scale * 5) &&
+                                                             randattack == 1 &&
+                                                             animation[player[i].animTarget].height != lowheight)
+                                                        player[k].animTarget = spinkickanim;
                                                     //lowkick
-                                                    else if(distance<2.5*sq(player[k].scale*5)&&
-                                                            animation[player[i].animTarget].height==lowheight&&
-                                                            animation[player[k].animTarget].attack!=normalattack)
-                                                        player[k].animTarget=lowkickanim;
+                                                    else if (distance < 2.5 * sq(player[k].scale * 5) &&
+                                                             animation[player[i].animTarget].height == lowheight &&
+                                                             animation[player[k].animTarget].attack != normalattack)
+                                                        player[k].animTarget = lowkickanim;
                                                 }
                                             }
                                         }
                                         //upunch becomes wolfslap
-                                        if(player[k].animTarget==upunchanim&&player[k].creature==wolftype)
-                                            player[k].animTarget=wolfslapanim;
+                                        if (player[k].animTarget == upunchanim && player[k].creature == wolftype)
+                                            player[k].animTarget = wolfslapanim;
                                     }
                                     //sneak attacks
-                                    if((k==0)&&(tutoriallevel!=1||tutorialstage==22)&&
-                                            player[i].howactive<typedead1&&
-                                            distance<1.5*sq(player[k].scale*5)&&
-                                            !player[i].skeleton.free&&
-                                            player[i].animTarget!=getupfrombackanim&&
-                                            player[i].animTarget!=getupfromfrontanim&&
-                                            (player[i].stunned>0&&player[k].madskills||
-                                             player[i].surprised>0||
-                                             player[i].aitype==passivetype||
-                                             attackweapon&&player[i].stunned>0)&&
-                                            normaldotproduct(player[i].facing,player[i].coords-player[k].coords)>0){
+                                    if ((k == 0) && (tutoriallevel != 1 || tutorialstage == 22) &&
+                                            player[i].howactive < typedead1 &&
+                                            distance < 1.5 * sq(player[k].scale * 5) &&
+                                            !player[i].skeleton.free &&
+                                            player[i].animTarget != getupfrombackanim &&
+                                            player[i].animTarget != getupfromfrontanim &&
+                                            (player[i].stunned > 0 && player[k].madskills ||
+                                             player[i].surprised > 0 ||
+                                             player[i].aitype == passivetype ||
+                                             attackweapon && player[i].stunned > 0) &&
+                                            normaldotproduct(player[i].facing, player[i].coords - player[k].coords) > 0) {
                                         //sneakattack
-                                        if(!attackweapon){
-                                            player[k].animCurrent=sneakattackanim;
-                                            player[k].animTarget=sneakattackanim;
-                                            player[i].animCurrent=sneakattackedanim;
-                                            player[i].animTarget=sneakattackedanim;
-                                            player[k].oldcoords=player[k].coords;
-                                            player[k].coords=player[i].coords;
+                                        if (!attackweapon) {
+                                            player[k].animCurrent = sneakattackanim;
+                                            player[k].animTarget = sneakattackanim;
+                                            player[i].animCurrent = sneakattackedanim;
+                                            player[i].animTarget = sneakattackedanim;
+                                            player[k].oldcoords = player[k].coords;
+                                            player[k].coords = player[i].coords;
                                         }
                                         //knifesneakattack
-                                        if(attackweapon==knife){
-                                            player[k].animCurrent=knifesneakattackanim;
-                                            player[k].animTarget=knifesneakattackanim;
-                                            player[i].animCurrent=knifesneakattackedanim;
-                                            player[i].animTarget=knifesneakattackedanim;
-                                            player[i].oldcoords=player[i].coords;
-                                            player[i].coords=player[k].coords;
+                                        if (attackweapon == knife) {
+                                            player[k].animCurrent = knifesneakattackanim;
+                                            player[k].animTarget = knifesneakattackanim;
+                                            player[i].animCurrent = knifesneakattackedanim;
+                                            player[i].animTarget = knifesneakattackedanim;
+                                            player[i].oldcoords = player[i].coords;
+                                            player[i].coords = player[k].coords;
                                         }
                                         //swordsneakattack
-                                        if(attackweapon==sword){
-                                            player[k].animCurrent=swordsneakattackanim;
-                                            player[k].animTarget=swordsneakattackanim;
-                                            player[i].animCurrent=swordsneakattackedanim;
-                                            player[i].animTarget=swordsneakattackedanim;
-                                            player[i].oldcoords=player[i].coords;
-                                            player[i].coords=player[k].coords;
+                                        if (attackweapon == sword) {
+                                            player[k].animCurrent = swordsneakattackanim;
+                                            player[k].animTarget = swordsneakattackanim;
+                                            player[i].animCurrent = swordsneakattackedanim;
+                                            player[i].animTarget = swordsneakattackedanim;
+                                            player[i].oldcoords = player[i].coords;
+                                            player[i].coords = player[k].coords;
                                         }
-                                        if(attackweapon!=staff){
-                                            player[k].victim=&player[i];
-                                            player[k].hasvictim=1;
-                                            player[i].targettilt2=0;
-                                            player[i].frameTarget=1;
-                                            player[i].frameCurrent=0;
-                                            player[i].target=0;
-                                            player[i].velocity=0;
-                                            player[k].targettilt2=player[i].targettilt2;
-                                            player[k].frameCurrent=player[i].frameCurrent;
-                                            player[k].frameTarget=player[i].frameTarget;
-                                            player[k].target=player[i].target;
-                                            player[k].velocity=0;
-                                            player[k].targetyaw=player[i].yaw;
-                                            player[k].yaw=player[i].yaw;
-                                            player[i].targetyaw=player[i].yaw;
+                                        if (attackweapon != staff) {
+                                            player[k].victim = &player[i];
+                                            player[k].hasvictim = 1;
+                                            player[i].targettilt2 = 0;
+                                            player[i].frameTarget = 1;
+                                            player[i].frameCurrent = 0;
+                                            player[i].target = 0;
+                                            player[i].velocity = 0;
+                                            player[k].targettilt2 = player[i].targettilt2;
+                                            player[k].frameCurrent = player[i].frameCurrent;
+                                            player[k].frameTarget = player[i].frameTarget;
+                                            player[k].target = player[i].target;
+                                            player[k].velocity = 0;
+                                            player[k].targetyaw = player[i].yaw;
+                                            player[k].yaw = player[i].yaw;
+                                            player[i].targetyaw = player[i].yaw;
                                         }
                                     }
-                                    if(animation[player[k].animTarget].attack==normalattack&&
-                                            player[k].victim==&player[i]&&
-                                            (!player[i].skeleton.free)){
-                                        oldattackkey=1;
-                                        player[k].frameTarget=0;
-                                        player[k].target=0;
-
-                                        player[k].targetyaw=roughDirectionTo(player[k].coords,player[i].coords);
-                                        player[k].targettilt2=pitchTo(player[k].coords,player[i].coords);
-                                        player[k].lastattack3=player[k].lastattack2;
-                                        player[k].lastattack2=player[k].lastattack;
-                                        player[k].lastattack=player[k].animTarget;
+                                    if (animation[player[k].animTarget].attack == normalattack &&
+                                            player[k].victim == &player[i] &&
+                                            (!player[i].skeleton.free)) {
+                                        oldattackkey = 1;
+                                        player[k].frameTarget = 0;
+                                        player[k].target = 0;
+
+                                        player[k].targetyaw = roughDirectionTo(player[k].coords, player[i].coords);
+                                        player[k].targettilt2 = pitchTo(player[k].coords, player[i].coords);
+                                        player[k].lastattack3 = player[k].lastattack2;
+                                        player[k].lastattack2 = player[k].lastattack;
+                                        player[k].lastattack = player[k].animTarget;
                                     }
-                                    if(player[k].animTarget==knifefollowanim&&
-                                            player[k].victim==&player[i]){
-                                        oldattackkey=1;
-                                        player[k].targetyaw=roughDirectionTo(player[k].coords,player[i].coords);
-                                        player[k].targettilt2=pitchTo(player[k].coords,player[i].coords);
-                                        player[k].victim=&player[i];
-                                        player[k].hasvictim=1;
-                                        player[i].animTarget=knifefollowedanim;
-                                        player[i].animCurrent=knifefollowedanim;
-                                        player[i].targettilt2=0;
-                                        player[i].targettilt2=player[k].targettilt2;
-                                        player[i].frameTarget=1;
-                                        player[i].frameCurrent=0;
-                                        player[i].target=0;
-                                        player[i].velocity=0;
-                                        player[k].animCurrent=knifefollowanim;
-                                        player[k].animTarget=knifefollowanim;
-                                        player[k].targettilt2=player[i].targettilt2;
-                                        player[k].frameCurrent=player[i].frameCurrent;
-                                        player[k].frameTarget=player[i].frameTarget;
-                                        player[k].target=player[i].target;
-                                        player[k].velocity=0;
-                                        player[k].oldcoords=player[k].coords;
-                                        player[i].coords=player[k].coords;
-                                        player[i].targetyaw=player[k].targetyaw;
-                                        player[i].yaw=player[k].targetyaw;
-                                        player[k].yaw=player[k].targetyaw;
-                                        player[i].yaw=player[k].targetyaw;
+                                    if (player[k].animTarget == knifefollowanim &&
+                                            player[k].victim == &player[i]) {
+                                        oldattackkey = 1;
+                                        player[k].targetyaw = roughDirectionTo(player[k].coords, player[i].coords);
+                                        player[k].targettilt2 = pitchTo(player[k].coords, player[i].coords);
+                                        player[k].victim = &player[i];
+                                        player[k].hasvictim = 1;
+                                        player[i].animTarget = knifefollowedanim;
+                                        player[i].animCurrent = knifefollowedanim;
+                                        player[i].targettilt2 = 0;
+                                        player[i].targettilt2 = player[k].targettilt2;
+                                        player[i].frameTarget = 1;
+                                        player[i].frameCurrent = 0;
+                                        player[i].target = 0;
+                                        player[i].velocity = 0;
+                                        player[k].animCurrent = knifefollowanim;
+                                        player[k].animTarget = knifefollowanim;
+                                        player[k].targettilt2 = player[i].targettilt2;
+                                        player[k].frameCurrent = player[i].frameCurrent;
+                                        player[k].frameTarget = player[i].frameTarget;
+                                        player[k].target = player[i].target;
+                                        player[k].velocity = 0;
+                                        player[k].oldcoords = player[k].coords;
+                                        player[i].coords = player[k].coords;
+                                        player[i].targetyaw = player[k].targetyaw;
+                                        player[i].yaw = player[k].targetyaw;
+                                        player[k].yaw = player[k].targetyaw;
+                                        player[i].yaw = player[k].targetyaw;
                                     }
                                 }
                         }
-                    const bool hasstaff=attackweapon==staff;
-                    if(k==0&&numplayers>1)
-                        for(int i=0;i<numplayers;i++){
-                            if(i==k)continue;
-                            if((playerrealattackkeydown||player[i].dead||!hasstaff)&&
-                                    animation[player[k].animTarget].attack==neutral){
-                                const float distance=distsq(&player[k].coords,&player[i].coords);
-                                if(!player[i].dead||!realthreat||(!attackweapon&&player[k].crouchkeydown))
-                                    if(player[i].skeleton.free)
-                                        if(distance<3.5*sq(player[k].scale*5)&&
-                                                (player[i].dead||
-                                                 player[i].skeleton.longdead>1000||
-                                                 player[k].isRun()||
-                                                 hasstaff||
-                                                 (attackweapon&&
-                                                  (player[i].skeleton.longdead>2000||
-                                                   player[i].damage>player[i].damagetolerance/8||
-                                                   player[i].bloodloss>player[i].damagetolerance/2)&&
-                                                  distance<1.5*sq(player[k].scale*5)))){
-                                            player[k].victim=&player[i];
-                                            player[k].hasvictim=1;
-                                            if(attackweapon&&tutoriallevel!=1){
+                    const bool hasstaff = attackweapon == staff;
+                    if (k == 0 && numplayers > 1)
+                        for (int i = 0; i < numplayers; i++) {
+                            if (i == k)continue;
+                            if ((playerrealattackkeydown || player[i].dead || !hasstaff) &&
+                                    animation[player[k].animTarget].attack == neutral) {
+                                const float distance = distsq(&player[k].coords, &player[i].coords);
+                                if (!player[i].dead || !realthreat || (!attackweapon && player[k].crouchkeydown))
+                                    if (player[i].skeleton.free)
+                                        if (distance < 3.5 * sq(player[k].scale * 5) &&
+                                                (player[i].dead ||
+                                                 player[i].skeleton.longdead > 1000 ||
+                                                 player[k].isRun() ||
+                                                 hasstaff ||
+                                                 (attackweapon &&
+                                                  (player[i].skeleton.longdead > 2000 ||
+                                                   player[i].damage > player[i].damagetolerance / 8 ||
+                                                   player[i].bloodloss > player[i].damagetolerance / 2) &&
+                                                  distance < 1.5 * sq(player[k].scale * 5)))) {
+                                            player[k].victim = &player[i];
+                                            player[k].hasvictim = 1;
+                                            if (attackweapon && tutoriallevel != 1) {
                                                 //crouchstab
-                                                if(player[k].crouchkeydown&&attackweapon==knife&&distance<1.5*sq(player[k].scale*5))
-                                                    player[k].animTarget=crouchstabanim;
+                                                if (player[k].crouchkeydown && attackweapon == knife && distance < 1.5 * sq(player[k].scale * 5))
+                                                    player[k].animTarget = crouchstabanim;
                                                 //swordgroundstab
-                                                if(player[k].crouchkeydown&&distance<1.5*sq(player[k].scale*5)&&attackweapon==sword)
-                                                    player[k].animTarget=swordgroundstabanim;
+                                                if (player[k].crouchkeydown && distance < 1.5 * sq(player[k].scale * 5) && attackweapon == sword)
+                                                    player[k].animTarget = swordgroundstabanim;
                                                 //staffgroundsmash
-                                                if(distance<3.5*sq(player[k].scale*5)&&attackweapon==staff)
-                                                    player[k].animTarget=staffgroundsmashanim;
+                                                if (distance < 3.5 * sq(player[k].scale * 5) && attackweapon == staff)
+                                                    player[k].animTarget = staffgroundsmashanim;
                                             }
-                                            if(distance<2.5&&
-                                                    player[k].crouchkeydown&&
-                                                    player[k].animTarget!=crouchstabanim&&
-                                                    !attackweapon&&
-                                                    player[i].dead&&
-                                                    player[i].skeleton.free&&
-                                                    player[i].skeleton.longdead>1000){
-                                                player[k].animTarget=killanim;
+                                            if (distance < 2.5 &&
+                                                    player[k].crouchkeydown &&
+                                                    player[k].animTarget != crouchstabanim &&
+                                                    !attackweapon &&
+                                                    player[i].dead &&
+                                                    player[i].skeleton.free &&
+                                                    player[i].skeleton.longdead > 1000) {
+                                                player[k].animTarget = killanim;
                                                 //TODO: refactor this out, what does it do?
-                                                for(int j=0;j<terrain.numdecals;j++){
-                                                    if((terrain.decaltype[j]==blooddecal||terrain.decaltype[j]==blooddecalslow)&&
-                                                            terrain.decalalivetime[j]<2)
+                                                for (int j = 0; j < terrain.numdecals; j++) {
+                                                    if ((terrain.decaltype[j] == blooddecal || terrain.decaltype[j] == blooddecalslow) &&
+                                                            terrain.decalalivetime[j] < 2)
                                                         terrain.DeleteDecal(j);
                                                 }
-                                                for(int l=0;l<objects.numobjects;l++){
-                                                    if(objects.model[l].type==decalstype)
-                                                        for(int j=0;j<objects.model[l].numdecals;j++){
-                                                            if((objects.model[l].decaltype[j]==blooddecal||
-                                                                    objects.model[l].decaltype[j]==blooddecalslow)&&
-                                                                    objects.model[l].decalalivetime[j]<2)
+                                                for (int l = 0; l < objects.numobjects; l++) {
+                                                    if (objects.model[l].type == decalstype)
+                                                        for (int j = 0; j < objects.model[l].numdecals; j++) {
+                                                            if ((objects.model[l].decaltype[j] == blooddecal ||
+                                                                    objects.model[l].decaltype[j] == blooddecalslow) &&
+                                                                    objects.model[l].decalalivetime[j] < 2)
                                                                 objects.model[l].DeleteDecal(j);
                                                         }
                                                 }
                                             }
-                                            if(!player[i].dead||musictype!=2)
-                                                if(distance<3.5&&
-                                                        (player[k].isRun()||player[k].isIdle()&&player[k].attackkeydown)&&
-                                                        player[k].staggerdelay<=0&&
-                                                        (player[i].dead||
-                                                         player[i].skeleton.longdead<300&&
-                                                         player[k].lastattack!=spinkickanim&&
-                                                         player[i].skeleton.free)&&
-                                                        (!player[i].dead||musictype!=stream_fighttheme)){
-                                                    player[k].animTarget=dropkickanim;
-                                                    for(int j=0;j<terrain.numdecals;j++){
-                                                        if((terrain.decaltype[j]==blooddecal||terrain.decaltype[j]==blooddecalslow)&&
-                                                                terrain.decalalivetime[j]<2){
+                                            if (!player[i].dead || musictype != 2)
+                                                if (distance < 3.5 &&
+                                                        (player[k].isRun() || player[k].isIdle() && player[k].attackkeydown) &&
+                                                        player[k].staggerdelay <= 0 &&
+                                                        (player[i].dead ||
+                                                         player[i].skeleton.longdead < 300 &&
+                                                         player[k].lastattack != spinkickanim &&
+                                                         player[i].skeleton.free) &&
+                                                        (!player[i].dead || musictype != stream_fighttheme)) {
+                                                    player[k].animTarget = dropkickanim;
+                                                    for (int j = 0; j < terrain.numdecals; j++) {
+                                                        if ((terrain.decaltype[j] == blooddecal || terrain.decaltype[j] == blooddecalslow) &&
+                                                                terrain.decalalivetime[j] < 2) {
                                                             terrain.DeleteDecal(j);
                                                         }
                                                     }
-                                                    for(int l=0;l<objects.numobjects;l++){
-                                                        if(objects.model[l].type==decalstype)
-                                                            for(int j=0;j<objects.model[l].numdecals;j++){
-                                                                if((objects.model[l].decaltype[j]==blooddecal||
-                                                                        objects.model[l].decaltype[j]==blooddecalslow)&&
-                                                                        objects.model[l].decalalivetime[j]<2){
+                                                    for (int l = 0; l < objects.numobjects; l++) {
+                                                        if (objects.model[l].type == decalstype)
+                                                            for (int j = 0; j < objects.model[l].numdecals; j++) {
+                                                                if ((objects.model[l].decaltype[j] == blooddecal ||
+                                                                        objects.model[l].decaltype[j] == blooddecalslow) &&
+                                                                        objects.model[l].decalalivetime[j] < 2) {
                                                                     objects.model[l].DeleteDecal(j);
                                                                 }
                                                             }
                                                     }
                                                 }
                                         }
-                                if(animation[player[k].animTarget].attack==normalattack&&
-                                        player[k].victim==&player[i]&&
-                                        (!player[i].skeleton.free||
-                                         player[k].animTarget==killanim||
-                                         player[k].animTarget==crouchstabanim||
-                                         player[k].animTarget==swordgroundstabanim||
-                                         player[k].animTarget==staffgroundsmashanim||
-                                         player[k].animTarget==dropkickanim)){
-                                    oldattackkey=1;
-                                    player[k].frameTarget=0;
-                                    player[k].target=0;
-
-                                    XYZ targetpoint=player[i].coords;
-                                    if(player[k].animTarget==crouchstabanim||
-                                            player[k].animTarget==swordgroundstabanim||
-                                            player[k].animTarget==staffgroundsmashanim){
-                                        targetpoint+=(player[i].jointPos(abdomen)+
-                                                 player[i].jointPos(neck))/2*
-                                                player[i].scale;
+                                if (animation[player[k].animTarget].attack == normalattack &&
+                                        player[k].victim == &player[i] &&
+                                        (!player[i].skeleton.free ||
+                                         player[k].animTarget == killanim ||
+                                         player[k].animTarget == crouchstabanim ||
+                                         player[k].animTarget == swordgroundstabanim ||
+                                         player[k].animTarget == staffgroundsmashanim ||
+                                         player[k].animTarget == dropkickanim)) {
+                                    oldattackkey = 1;
+                                    player[k].frameTarget = 0;
+                                    player[k].target = 0;
+
+                                    XYZ targetpoint = player[i].coords;
+                                    if (player[k].animTarget == crouchstabanim ||
+                                            player[k].animTarget == swordgroundstabanim ||
+                                            player[k].animTarget == staffgroundsmashanim) {
+                                        targetpoint += (player[i].jointPos(abdomen) +
+                                                        player[i].jointPos(neck)) / 2 *
+                                                       player[i].scale;
                                     }
-                                    player[k].targetyaw=roughDirectionTo(player[k].coords,targetpoint);
-                                    player[k].targettilt2=pitchTo(player[k].coords,targetpoint);
+                                    player[k].targetyaw = roughDirectionTo(player[k].coords, targetpoint);
+                                    player[k].targettilt2 = pitchTo(player[k].coords, targetpoint);
 
-                                    if(player[k].animTarget==crouchstabanim||player[k].animTarget==swordgroundstabanim){
-                                        player[k].targetyaw+=(float)(abs(Random()%100)-50)/4;
+                                    if (player[k].animTarget == crouchstabanim || player[k].animTarget == swordgroundstabanim) {
+                                        player[k].targetyaw += (float)(abs(Random() % 100) - 50) / 4;
                                     }
 
-                                    if(player[k].animTarget==staffgroundsmashanim)
-                                        player[k].targettilt2+=10;
+                                    if (player[k].animTarget == staffgroundsmashanim)
+                                        player[k].targettilt2 += 10;
 
-                                    player[k].lastattack3=player[k].lastattack2;
-                                    player[k].lastattack2=player[k].lastattack;
-                                    player[k].lastattack=player[k].animTarget;
+                                    player[k].lastattack3 = player[k].lastattack2;
+                                    player[k].lastattack2 = player[k].lastattack;
+                                    player[k].lastattack = player[k].animTarget;
 
-                                    if(player[k].animTarget==swordgroundstabanim){
-                                        player[k].targetyaw+=30;
+                                    if (player[k].animTarget == swordgroundstabanim) {
+                                        player[k].targetyaw += 30;
                                     }
                                 }
                             }
                         }
-                    if(!player[k].hasvictim){
+                    if (!player[k].hasvictim) {
                         //find victim
-                        for(int i=0;i<numplayers;i++){
-                            if(i==k||!(i==0||k==0))continue;
-                            if(!player[i].skeleton.free){
-                                if(player[k].hasvictim){
-                                    if(distsq(&player[k].coords,&player[i].coords)<
-                                       distsq(&player[k].coords,&player[k].victim->coords))
-                                        player[k].victim=&player[i];
-                                }else{
-                                    player[k].victim=&player[i];
-                                    player[k].hasvictim=1;
+                        for (int i = 0; i < numplayers; i++) {
+                            if (i == k || !(i == 0 || k == 0))continue;
+                            if (!player[i].skeleton.free) {
+                                if (player[k].hasvictim) {
+                                    if (distsq(&player[k].coords, &player[i].coords) <
+                                            distsq(&player[k].coords, &player[k].victim->coords))
+                                        player[k].victim = &player[i];
+                                } else {
+                                    player[k].victim = &player[i];
+                                    player[k].hasvictim = 1;
                                 }
                             }
                         }
                     }
-                    if(player[k].aitype==playercontrolled)
+                    if (player[k].aitype == playercontrolled)
                         //rabbit kick
-                        if(player[k].attackkeydown&&
-                                player[k].isRun()&&
-                                player[k].wasRun()&&
-                                ((player[k].hasvictim&&
-                                  distsq(&player[k].coords,&player[k].victim->coords)<12*sq(player[k].scale*5)&&
-                                  distsq(&player[k].coords,&player[k].victim->coords)>7*sq(player[k].scale*5)&&
-                                  !player[k].victim->skeleton.free&&
-                                  player[k].victim->animTarget!=getupfrombackanim&&
-                                  player[k].victim->animTarget!=getupfromfrontanim&&
-                                  animation[player[k].victim->animTarget].height!=lowheight&&
-                                  player[k].aitype!=playercontrolled&& //wat???
-                                  normaldotproduct(player[k].facing,player[k].victim->coords-player[k].coords)>0&&
-                                  player[k].rabbitkickenabled)||
-                                 player[k].jumpkeydown)){
-                            oldattackkey=1;
+                        if (player[k].attackkeydown &&
+                                player[k].isRun() &&
+                                player[k].wasRun() &&
+                                ((player[k].hasvictim &&
+                                  distsq(&player[k].coords, &player[k].victim->coords) < 12 * sq(player[k].scale * 5) &&
+                                  distsq(&player[k].coords, &player[k].victim->coords) > 7 * sq(player[k].scale * 5) &&
+                                  !player[k].victim->skeleton.free &&
+                                  player[k].victim->animTarget != getupfrombackanim &&
+                                  player[k].victim->animTarget != getupfromfrontanim &&
+                                  animation[player[k].victim->animTarget].height != lowheight &&
+                                  player[k].aitype != playercontrolled && //wat???
+                                  normaldotproduct(player[k].facing, player[k].victim->coords - player[k].coords) > 0 &&
+                                  player[k].rabbitkickenabled) ||
+                                 player[k].jumpkeydown)) {
+                            oldattackkey = 1;
                             player[k].setAnimation(rabbitkickanim);
                         }
                     //update counts
-                    if(animation[player[k].animTarget].attack&&k==0){
+                    if (animation[player[k].animTarget].attack && k == 0) {
                         numattacks++;
-                        switch(attackweapon){
-                            case 0: numunarmedattack++; break;
-                            case knife: numknifeattack++; break;
-                            case sword: numswordattack++; break;
-                            case staff: numstaffattack++; break;
+                        switch (attackweapon) {
+                        case 0:
+                            numunarmedattack++;
+                            break;
+                        case knife:
+                            numknifeattack++;
+                            break;
+                        case sword:
+                            numswordattack++;
+                            break;
+                        case staff:
+                            numstaffattack++;
+                            break;
                         }
                     }
                 }
@@ -4308,550 +4498,550 @@ void doAttacks(){
     }
 }
 
-void doPlayerCollisions(){
-       static XYZ rotatetarget;
+void doPlayerCollisions()
+{
+    static XYZ rotatetarget;
     static float collisionradius;
-    if(numplayers>1)
-        for(int k=0;k<numplayers;k++)
-            for(int i=k+1;i<numplayers;i++){
+    if (numplayers > 1)
+        for (int k = 0; k < numplayers; k++)
+            for (int i = k + 1; i < numplayers; i++) {
                 //neither player is part of a reversal
-                if((animation[player[i].animTarget].attack!=reversed&&
-                            animation[player[i].animTarget].attack!=reversal&&
-                            animation[player[k].animTarget].attack!=reversed&&
-                            animation[player[k].animTarget].attack!=reversal)||(i!=0&&k!=0))
-                if((animation[player[i].animCurrent].attack!=reversed&&
-                            animation[player[i].animCurrent].attack!=reversal&&
-                            animation[player[k].animCurrent].attack!=reversed&&
-                            animation[player[k].animCurrent].attack!=reversal)||(i!=0&&k!=0))
-                //neither is sleeping
-                if(player[i].howactive<=typesleeping&&player[k].howactive<=typesleeping)
-                if(player[i].howactive!=typesittingwall&&player[k].howactive!=typesittingwall)
-                //in same patch, neither is climbing
-                if(player[i].whichpatchx==player[k].whichpatchx&&
-                        player[i].whichpatchz==player[k].whichpatchz&&
-                        player[k].skeleton.oldfree==player[k].skeleton.free&&
-                        player[i].skeleton.oldfree==player[i].skeleton.free&&
-                        player[i].animTarget!=climbanim&&
-                        player[i].animTarget!=hanganim&&
-                        player[k].animTarget!=climbanim&&
-                        player[k].animTarget!=hanganim)
-                //players are close (bounding box test)
-                if(player[i].coords.y>player[k].coords.y-3)
-                if(player[i].coords.y<player[k].coords.y+3)
-                if(player[i].coords.x>player[k].coords.x-3)
-                if(player[i].coords.x<player[k].coords.x+3)
-                if(player[i].coords.z>player[k].coords.z-3)
-                if(player[i].coords.z<player[k].coords.z+3){
-                    //spread fire from player to player
-                    if(distsq(&player[i].coords,&player[k].coords)
-                            <3*sq((player[i].scale+player[k].scale)*2.5)){
-                        if(player[i].onfire||player[k].onfire){
-                            if(!player[i].onfire)player[i].CatchFire();
-                            if(!player[k].onfire)player[k].CatchFire();
-                        }
-                    }
-
-                    XYZ tempcoords1=player[i].coords;
-                    XYZ tempcoords2=player[k].coords;
-                    if(!player[i].skeleton.oldfree)
-                        tempcoords1.y+=player[i].jointPos(abdomen).y*player[i].scale;
-                    if(!player[k].skeleton.oldfree)
-                        tempcoords2.y+=player[k].jointPos(abdomen).y*player[k].scale;
-                    collisionradius=1.2*sq((player[i].scale+player[k].scale)*2.5);
-                    if(player[0].hasvictim)
-                        if(player[0].animTarget==rabbitkickanim&&(k==0||i==0)&&!player[0].victim->skeleton.free)
-                            collisionradius=3;
-                    if((!player[i].skeleton.oldfree||!player[k].skeleton.oldfree)&&
-                            (distsq(&tempcoords1,&tempcoords2)<collisionradius||
-                             distsq(&player[i].coords,&player[k].coords)<collisionradius)){
-                        //jump down on a dead body
-                        if(k==0||i==0){
-                            int l=i?i:k;
-                            if(player[0].animTarget==jumpdownanim&&
-                                    !player[0].skeleton.oldfree&&
-                                    !player[0].skeleton.free&&
-                                    player[l].skeleton.oldfree&&
-                                    player[l].skeleton.free&&
-                                    player[l].dead&&
-                                    player[0].lastcollide<=0&&
-                                    fabs(player[l].coords.y-player[0].coords.y)<.2&&
-                                    distsq(&player[0].coords,&player[l].coords)<.7*sq((player[l].scale+player[0].scale)*2.5)){
-                                player[0].coords.y=player[l].coords.y;
-                                player[l].velocity=player[0].velocity;
-                                player[l].skeleton.free=0;
-                                player[l].yaw=0;
-                                player[l].RagDoll(0);
-                                player[l].DoDamage(20);
-                                camerashake+=.3;
-                                player[l].skeleton.longdead=0;
-                                player[0].lastcollide=1;
-                            }
-                        }
-
-                        if(     (player[i].skeleton.oldfree==1&&findLengthfast(&player[i].velocity)>1)||
-                                (player[k].skeleton.oldfree==1&&findLengthfast(&player[k].velocity)>1)||
-                                (player[i].skeleton.oldfree==0&&player[k].skeleton.oldfree==0)){
-                            rotatetarget=player[k].velocity-player[i].velocity;
-                            if((player[i].animTarget!=getupfrombackanim&&player[i].animTarget!=getupfromfrontanim||
-                                        player[i].skeleton.free)&&
-                                    (player[k].animTarget!=getupfrombackanim&&player[k].animTarget!=getupfromfrontanim||
-                                     player[k].skeleton.free))
-                                if((((k!=0&&findLengthfast(&rotatetarget)>150||
-                                                    k==0&&findLengthfast(&rotatetarget)>50&&player[0].rabbitkickragdoll)&&
-                                                normaldotproduct(rotatetarget,player[k].coords-player[i].coords)>0)&&
-                                            (k==0||
-                                             k!=0&&player[i].skeleton.oldfree==1&&animation[player[k].animCurrent].attack==neutral||
-                                         /*i!=0&&*/player[k].skeleton.oldfree==1&&animation[player[i].animCurrent].attack==neutral))||
-                                        (player[i].animTarget==jumpupanim||player[i].animTarget==jumpdownanim||player[i].isFlip())&&
-                                        (player[k].animTarget==jumpupanim||player[k].animTarget==jumpdownanim||player[k].isFlip())&&
-                                        k==0&&!player[i].skeleton.oldfree&&!player[k].skeleton.oldfree){
-                                    //If hit by body
-                                    if(     (i!=0||player[i].skeleton.free)&&
-                                            (k!=0||player[k].skeleton.free)||
-                                            (animation[player[i].animTarget].height==highheight&&
-                                             animation[player[k].animTarget].height==highheight)){
-                                        if(tutoriallevel!=1){
-                                            emit_sound_at(heavyimpactsound, player[i].coords);
-                                        }
-
-                                        player[i].RagDoll(0);
-                                        if(player[i].damage>player[i].damagetolerance-findLengthfast(&rotatetarget)/4&&!player[i].dead){
-                                          award_bonus(0, aimbonus);
-                                        }
-                                        player[i].DoDamage(findLengthfast(&rotatetarget)/4);
-                                        player[k].RagDoll(0);
-                                        if(player[k].damage>player[k].damagetolerance-findLengthfast(&rotatetarget)/4&&!player[k].dead){
-                                          award_bonus(0, aimbonus); // Huh, again?
-                                        }
-                                        player[k].DoDamage(findLengthfast(&rotatetarget)/4);
+                if ((animation[player[i].animTarget].attack != reversed &&
+                        animation[player[i].animTarget].attack != reversal &&
+                        animation[player[k].animTarget].attack != reversed &&
+                        animation[player[k].animTarget].attack != reversal) || (i != 0 && k != 0))
+                    if ((animation[player[i].animCurrent].attack != reversed &&
+                            animation[player[i].animCurrent].attack != reversal &&
+                            animation[player[k].animCurrent].attack != reversed &&
+                            animation[player[k].animCurrent].attack != reversal) || (i != 0 && k != 0))
+                        //neither is sleeping
+                        if (player[i].howactive <= typesleeping && player[k].howactive <= typesleeping)
+                            if (player[i].howactive != typesittingwall && player[k].howactive != typesittingwall)
+                                //in same patch, neither is climbing
+                                if (player[i].whichpatchx == player[k].whichpatchx &&
+                                        player[i].whichpatchz == player[k].whichpatchz &&
+                                        player[k].skeleton.oldfree == player[k].skeleton.free &&
+                                        player[i].skeleton.oldfree == player[i].skeleton.free &&
+                                        player[i].animTarget != climbanim &&
+                                        player[i].animTarget != hanganim &&
+                                        player[k].animTarget != climbanim &&
+                                        player[k].animTarget != hanganim)
+                                    //players are close (bounding box test)
+                                    if (player[i].coords.y > player[k].coords.y - 3)
+                                        if (player[i].coords.y < player[k].coords.y + 3)
+                                            if (player[i].coords.x > player[k].coords.x - 3)
+                                                if (player[i].coords.x < player[k].coords.x + 3)
+                                                    if (player[i].coords.z > player[k].coords.z - 3)
+                                                        if (player[i].coords.z < player[k].coords.z + 3) {
+                                                            //spread fire from player to player
+                                                            if (distsq(&player[i].coords, &player[k].coords)
+                                                                    < 3 * sq((player[i].scale + player[k].scale) * 2.5)) {
+                                                                if (player[i].onfire || player[k].onfire) {
+                                                                    if (!player[i].onfire)player[i].CatchFire();
+                                                                    if (!player[k].onfire)player[k].CatchFire();
+                                                                }
+                                                            }
 
-                                        for(int j=0;j<player[i].skeleton.num_joints;j++){
-                                            player[i].skeleton.joints[j].velocity=player[i].skeleton.joints[j].velocity/5+player[k].velocity;
-                                        }
-                                        for(int j=0;j<player[k].skeleton.num_joints;j++){
-                                            player[k].skeleton.joints[j].velocity=player[k].skeleton.joints[j].velocity/5+player[i].velocity;
-                                        }
+                                                            XYZ tempcoords1 = player[i].coords;
+                                                            XYZ tempcoords2 = player[k].coords;
+                                                            if (!player[i].skeleton.oldfree)
+                                                                tempcoords1.y += player[i].jointPos(abdomen).y * player[i].scale;
+                                                            if (!player[k].skeleton.oldfree)
+                                                                tempcoords2.y += player[k].jointPos(abdomen).y * player[k].scale;
+                                                            collisionradius = 1.2 * sq((player[i].scale + player[k].scale) * 2.5);
+                                                            if (player[0].hasvictim)
+                                                                if (player[0].animTarget == rabbitkickanim && (k == 0 || i == 0) && !player[0].victim->skeleton.free)
+                                                                    collisionradius = 3;
+                                                            if ((!player[i].skeleton.oldfree || !player[k].skeleton.oldfree) &&
+                                                                    (distsq(&tempcoords1, &tempcoords2) < collisionradius ||
+                                                                     distsq(&player[i].coords, &player[k].coords) < collisionradius)) {
+                                                                //jump down on a dead body
+                                                                if (k == 0 || i == 0) {
+                                                                    int l = i ? i : k;
+                                                                    if (player[0].animTarget == jumpdownanim &&
+                                                                            !player[0].skeleton.oldfree &&
+                                                                            !player[0].skeleton.free &&
+                                                                            player[l].skeleton.oldfree &&
+                                                                            player[l].skeleton.free &&
+                                                                            player[l].dead &&
+                                                                            player[0].lastcollide <= 0 &&
+                                                                            fabs(player[l].coords.y - player[0].coords.y) < .2 &&
+                                                                            distsq(&player[0].coords, &player[l].coords) < .7 * sq((player[l].scale + player[0].scale) * 2.5)) {
+                                                                        player[0].coords.y = player[l].coords.y;
+                                                                        player[l].velocity = player[0].velocity;
+                                                                        player[l].skeleton.free = 0;
+                                                                        player[l].yaw = 0;
+                                                                        player[l].RagDoll(0);
+                                                                        player[l].DoDamage(20);
+                                                                        camerashake += .3;
+                                                                        player[l].skeleton.longdead = 0;
+                                                                        player[0].lastcollide = 1;
+                                                                    }
+                                                                }
 
-                                    }
-                                }
-                            if(     (animation[player[i].animTarget].attack==neutral||
-                                     animation[player[i].animTarget].attack==normalattack)&&
-                                    (animation[player[k].animTarget].attack==neutral||
-                                     animation[player[k].animTarget].attack==normalattack)){
-                                //If bumped
-                                if(player[i].skeleton.oldfree==0&&player[k].skeleton.oldfree==0){
-                                    if(distsq(&player[k].coords,&player[i].coords)<.5*sq((player[i].scale+player[k].scale)*2.5)){
-                                        rotatetarget=player[k].coords-player[i].coords;
-                                        Normalise(&rotatetarget);
-                                        player[k].coords=(player[k].coords+player[i].coords)/2;
-                                        player[i].coords=player[k].coords-rotatetarget*fast_sqrt(.6)/2
-                                            *sq((player[i].scale+player[k].scale)*2.5);
-                                        player[k].coords+=rotatetarget*fast_sqrt(.6)/2*sq((player[i].scale+player[k].scale)*2.5);
-                                        if(player[k].howactive==typeactive||hostile)
-                                            if(player[k].isIdle()){
-                                                if(player[k].howactive<typesleeping)
-                                                    player[k].setAnimation(player[k].getStop());
-                                                else if(player[k].howactive==typesleeping)
-                                                    player[k].setAnimation(getupfromfrontanim);
-                                                if(!editorenabled)
-                                                    player[k].howactive=typeactive;
-                                            }
-                                        if(player[i].howactive==typeactive||hostile)
-                                            if(player[i].isIdle()){
-                                                if(player[i].howactive<typesleeping)
-                                                    player[i].setAnimation(player[k].getStop());
-                                                else
-                                                    player[i].setAnimation(getupfromfrontanim);
-                                                if(!editorenabled)
-                                                    player[i].howactive=typeactive;
-                                            }
-                                    }
-                                    //jump down on player
-                                    if(hostile){
-                                        if(k==0&&i!=0&&player[k].animTarget==jumpdownanim&&
-                                                !player[i].isCrouch()&&
-                                                player[i].animTarget!=rollanim&&
-                                                !player[k].skeleton.oldfree&&!
-                                                player[k].skeleton.free&&
-                                                player[k].lastcollide<=0&&
-                                                player[k].velocity.y<-10){
-                                            player[i].velocity=player[k].velocity;
-                                            player[k].velocity=player[k].velocity*-.5;
-                                            player[k].velocity.y=player[i].velocity.y;
-                                            player[i].DoDamage(20);
-                                            player[i].RagDoll(0);
-                                            player[k].lastcollide=1;
-                                            award_bonus(k, AboveBonus);
-                                        }
-                                        if(i==0&&k!=0&&player[i].animTarget==jumpdownanim&&
-                                                !player[k].isCrouch()&&
-                                                player[k].animTarget!=rollanim&&
-                                                !player[i].skeleton.oldfree&&
-                                                !player[i].skeleton.free&&
-                                                player[i].lastcollide<=0&&
-                                                player[i].velocity.y<-10){
-                                            player[k].velocity=player[i].velocity;
-                                            player[i].velocity=player[i].velocity*-.3;
-                                            player[i].velocity.y=player[k].velocity.y;
-                                            player[k].DoDamage(20);
-                                            player[k].RagDoll(0);
-                                            player[i].lastcollide=1;
-                                            award_bonus(i, AboveBonus);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                        player[i].CheckKick();
-                        player[k].CheckKick();
-                    }
-                }
+                                                                if (     (player[i].skeleton.oldfree == 1 && findLengthfast(&player[i].velocity) > 1) ||
+                                                                         (player[k].skeleton.oldfree == 1 && findLengthfast(&player[k].velocity) > 1) ||
+                                                                         (player[i].skeleton.oldfree == 0 && player[k].skeleton.oldfree == 0)) {
+                                                                    rotatetarget = player[k].velocity - player[i].velocity;
+                                                                    if ((player[i].animTarget != getupfrombackanim && player[i].animTarget != getupfromfrontanim ||
+                                                                            player[i].skeleton.free) &&
+                                                                            (player[k].animTarget != getupfrombackanim && player[k].animTarget != getupfromfrontanim ||
+                                                                             player[k].skeleton.free))
+                                                                        if ((((k != 0 && findLengthfast(&rotatetarget) > 150 ||
+                                                                                k == 0 && findLengthfast(&rotatetarget) > 50 && player[0].rabbitkickragdoll) &&
+                                                                                normaldotproduct(rotatetarget, player[k].coords - player[i].coords) > 0) &&
+                                                                                (k == 0 ||
+                                                                                 k != 0 && player[i].skeleton.oldfree == 1 && animation[player[k].animCurrent].attack == neutral ||
+                                                                                 /*i!=0&&*/player[k].skeleton.oldfree == 1 && animation[player[i].animCurrent].attack == neutral)) ||
+                                                                                (player[i].animTarget == jumpupanim || player[i].animTarget == jumpdownanim || player[i].isFlip()) &&
+                                                                                (player[k].animTarget == jumpupanim || player[k].animTarget == jumpdownanim || player[k].isFlip()) &&
+                                                                                k == 0 && !player[i].skeleton.oldfree && !player[k].skeleton.oldfree) {
+                                                                            //If hit by body
+                                                                            if (     (i != 0 || player[i].skeleton.free) &&
+                                                                                     (k != 0 || player[k].skeleton.free) ||
+                                                                                     (animation[player[i].animTarget].height == highheight &&
+                                                                                      animation[player[k].animTarget].height == highheight)) {
+                                                                                if (tutoriallevel != 1) {
+                                                                                    emit_sound_at(heavyimpactsound, player[i].coords);
+                                                                                }
+
+                                                                                player[i].RagDoll(0);
+                                                                                if (player[i].damage > player[i].damagetolerance - findLengthfast(&rotatetarget) / 4 && !player[i].dead) {
+                                                                                    award_bonus(0, aimbonus);
+                                                                                }
+                                                                                player[i].DoDamage(findLengthfast(&rotatetarget) / 4);
+                                                                                player[k].RagDoll(0);
+                                                                                if (player[k].damage > player[k].damagetolerance - findLengthfast(&rotatetarget) / 4 && !player[k].dead) {
+                                                                                    award_bonus(0, aimbonus); // Huh, again?
+                                                                                }
+                                                                                player[k].DoDamage(findLengthfast(&rotatetarget) / 4);
+
+                                                                                for (int j = 0; j < player[i].skeleton.num_joints; j++) {
+                                                                                    player[i].skeleton.joints[j].velocity = player[i].skeleton.joints[j].velocity / 5 + player[k].velocity;
+                                                                                }
+                                                                                for (int j = 0; j < player[k].skeleton.num_joints; j++) {
+                                                                                    player[k].skeleton.joints[j].velocity = player[k].skeleton.joints[j].velocity / 5 + player[i].velocity;
+                                                                                }
+
+                                                                            }
+                                                                        }
+                                                                    if (     (animation[player[i].animTarget].attack == neutral ||
+                                                                              animation[player[i].animTarget].attack == normalattack) &&
+                                                                             (animation[player[k].animTarget].attack == neutral ||
+                                                                              animation[player[k].animTarget].attack == normalattack)) {
+                                                                        //If bumped
+                                                                        if (player[i].skeleton.oldfree == 0 && player[k].skeleton.oldfree == 0) {
+                                                                            if (distsq(&player[k].coords, &player[i].coords) < .5 * sq((player[i].scale + player[k].scale) * 2.5)) {
+                                                                                rotatetarget = player[k].coords - player[i].coords;
+                                                                                Normalise(&rotatetarget);
+                                                                                player[k].coords = (player[k].coords + player[i].coords) / 2;
+                                                                                player[i].coords = player[k].coords - rotatetarget * fast_sqrt(.6) / 2
+                                                                                                   * sq((player[i].scale + player[k].scale) * 2.5);
+                                                                                player[k].coords += rotatetarget * fast_sqrt(.6) / 2 * sq((player[i].scale + player[k].scale) * 2.5);
+                                                                                if (player[k].howactive == typeactive || hostile)
+                                                                                    if (player[k].isIdle()) {
+                                                                                        if (player[k].howactive < typesleeping)
+                                                                                            player[k].setAnimation(player[k].getStop());
+                                                                                        else if (player[k].howactive == typesleeping)
+                                                                                            player[k].setAnimation(getupfromfrontanim);
+                                                                                        if (!editorenabled)
+                                                                                            player[k].howactive = typeactive;
+                                                                                    }
+                                                                                if (player[i].howactive == typeactive || hostile)
+                                                                                    if (player[i].isIdle()) {
+                                                                                        if (player[i].howactive < typesleeping)
+                                                                                            player[i].setAnimation(player[k].getStop());
+                                                                                        else
+                                                                                            player[i].setAnimation(getupfromfrontanim);
+                                                                                        if (!editorenabled)
+                                                                                            player[i].howactive = typeactive;
+                                                                                    }
+                                                                            }
+                                                                            //jump down on player
+                                                                            if (hostile) {
+                                                                                if (k == 0 && i != 0 && player[k].animTarget == jumpdownanim &&
+                                                                                        !player[i].isCrouch() &&
+                                                                                        player[i].animTarget != rollanim &&
+                                                                                        !player[k].skeleton.oldfree && !
+                                                                                        player[k].skeleton.free &&
+                                                                                        player[k].lastcollide <= 0 &&
+                                                                                        player[k].velocity.y < -10) {
+                                                                                    player[i].velocity = player[k].velocity;
+                                                                                    player[k].velocity = player[k].velocity * -.5;
+                                                                                    player[k].velocity.y = player[i].velocity.y;
+                                                                                    player[i].DoDamage(20);
+                                                                                    player[i].RagDoll(0);
+                                                                                    player[k].lastcollide = 1;
+                                                                                    award_bonus(k, AboveBonus);
+                                                                                }
+                                                                                if (i == 0 && k != 0 && player[i].animTarget == jumpdownanim &&
+                                                                                        !player[k].isCrouch() &&
+                                                                                        player[k].animTarget != rollanim &&
+                                                                                        !player[i].skeleton.oldfree &&
+                                                                                        !player[i].skeleton.free &&
+                                                                                        player[i].lastcollide <= 0 &&
+                                                                                        player[i].velocity.y < -10) {
+                                                                                    player[k].velocity = player[i].velocity;
+                                                                                    player[i].velocity = player[i].velocity * -.3;
+                                                                                    player[i].velocity.y = player[k].velocity.y;
+                                                                                    player[k].DoDamage(20);
+                                                                                    player[k].RagDoll(0);
+                                                                                    player[i].lastcollide = 1;
+                                                                                    award_bonus(i, AboveBonus);
+                                                                                }
+                                                                            }
+                                                                        }
+                                                                    }
+                                                                }
+                                                                player[i].CheckKick();
+                                                                player[k].CheckKick();
+                                                            }
+                                                        }
             }
 }
 
-void doAI(int i){
+void doAI(int i)
+{
     static bool connected;
-    if(player[i].aitype!=playercontrolled&&indialogue==-1){
-        player[i].jumpclimb=0;
+    if (player[i].aitype != playercontrolled && indialogue == -1) {
+        player[i].jumpclimb = 0;
         //disable movement in editor
-        if(editorenabled)
-            player[i].stunned=1;
+        if (editorenabled)
+            player[i].stunned = 1;
 
-        player[i].pause=0;
-        if(distsqflat(&player[0].coords,&player[i].coords)<30&&
-                player[0].coords.y>player[i].coords.y+2&&
+        player[i].pause = 0;
+        if (distsqflat(&player[0].coords, &player[i].coords) < 30 &&
+                player[0].coords.y > player[i].coords.y + 2 &&
                 !player[0].onterrain)
-            player[i].pause=1;
+            player[i].pause = 1;
 
         //pathfinding
-        if(player[i].aitype==pathfindtype){
-            if(player[i].finalpathfindpoint==-1){
+        if (player[i].aitype == pathfindtype) {
+            if (player[i].finalpathfindpoint == -1) {
                 float closestdistance;
                 float tempdist;
                 int closest;
                 XYZ colpoint;
-                closest=-1;
-                closestdistance=-1;
-                for(int j=0;j<numpathpoints;j++)
-                    if(closest==-1||distsq(&player[i].finalfinaltarget,&pathpoint[j])<closestdistance){
-                        closestdistance=distsq(&player[i].finalfinaltarget,&pathpoint[j]);
-                        closest=j;
-                        player[i].finaltarget=pathpoint[j];
+                closest = -1;
+                closestdistance = -1;
+                for (int j = 0; j < numpathpoints; j++)
+                    if (closest == -1 || distsq(&player[i].finalfinaltarget, &pathpoint[j]) < closestdistance) {
+                        closestdistance = distsq(&player[i].finalfinaltarget, &pathpoint[j]);
+                        closest = j;
+                        player[i].finaltarget = pathpoint[j];
                     }
-                player[i].finalpathfindpoint=closest;
-                for(int j=0;j<numpathpoints;j++)
-                    for(int k=0;k<numpathpointconnect[j];k++){
-                        DistancePointLine(&player[i].finalfinaltarget, &pathpoint[j], &pathpoint[pathpointconnect[j][k]], &tempdist,&colpoint );
-                        if(sq(tempdist)<closestdistance)
-                            if(findDistance(&colpoint,&pathpoint[j])+findDistance(&colpoint,&pathpoint[pathpointconnect[j][k]])<
-                                    findDistance(&pathpoint[j],&pathpoint[pathpointconnect[j][k]])+.1){
-                                closestdistance=sq(tempdist);
-                                closest=j;
-                                player[i].finaltarget=colpoint;
+                player[i].finalpathfindpoint = closest;
+                for (int j = 0; j < numpathpoints; j++)
+                    for (int k = 0; k < numpathpointconnect[j]; k++) {
+                        DistancePointLine(&player[i].finalfinaltarget, &pathpoint[j], &pathpoint[pathpointconnect[j][k]], &tempdist, &colpoint );
+                        if (sq(tempdist) < closestdistance)
+                            if (findDistance(&colpoint, &pathpoint[j]) + findDistance(&colpoint, &pathpoint[pathpointconnect[j][k]]) <
+                                    findDistance(&pathpoint[j], &pathpoint[pathpointconnect[j][k]]) + .1) {
+                                closestdistance = sq(tempdist);
+                                closest = j;
+                                player[i].finaltarget = colpoint;
                             }
                     }
-                player[i].finalpathfindpoint=closest;
+                player[i].finalpathfindpoint = closest;
 
             }
-            if(player[i].targetpathfindpoint==-1){
+            if (player[i].targetpathfindpoint == -1) {
                 float closestdistance;
                 float tempdist;
                 int closest;
                 XYZ colpoint;
-                closest=-1;
-                closestdistance=-1;
-                if(player[i].lastpathfindpoint==-1){
-                    for(int j=0;j<numpathpoints;j++){
-                        if(j!=player[i].lastpathfindpoint)
-                            if(closest==-1||(distsq(&player[i].coords,&pathpoint[j])<closestdistance)){
-                                closestdistance=distsq(&player[i].coords,&pathpoint[j]);
-                                closest=j;
+                closest = -1;
+                closestdistance = -1;
+                if (player[i].lastpathfindpoint == -1) {
+                    for (int j = 0; j < numpathpoints; j++) {
+                        if (j != player[i].lastpathfindpoint)
+                            if (closest == -1 || (distsq(&player[i].coords, &pathpoint[j]) < closestdistance)) {
+                                closestdistance = distsq(&player[i].coords, &pathpoint[j]);
+                                closest = j;
                             }
                     }
-                    player[i].targetpathfindpoint=closest;
-                    for(int j=0;j<numpathpoints;j++)
-                        if(j!=player[i].lastpathfindpoint)
-                            for(int k=0;k<numpathpointconnect[j];k++){
-                                DistancePointLine(&player[i].coords, &pathpoint[j], &pathpoint[pathpointconnect[j][k]], &tempdist,&colpoint );
-                                if(sq(tempdist)<closestdistance){
-                                    if(findDistance(&colpoint,&pathpoint[j])+findDistance(&colpoint,&pathpoint[pathpointconnect[j][k]])<
-                                            findDistance(&pathpoint[j],&pathpoint[pathpointconnect[j][k]])+.1){
-                                        closestdistance=sq(tempdist);
-                                        closest=j;
+                    player[i].targetpathfindpoint = closest;
+                    for (int j = 0; j < numpathpoints; j++)
+                        if (j != player[i].lastpathfindpoint)
+                            for (int k = 0; k < numpathpointconnect[j]; k++) {
+                                DistancePointLine(&player[i].coords, &pathpoint[j], &pathpoint[pathpointconnect[j][k]], &tempdist, &colpoint );
+                                if (sq(tempdist) < closestdistance) {
+                                    if (findDistance(&colpoint, &pathpoint[j]) + findDistance(&colpoint, &pathpoint[pathpointconnect[j][k]]) <
+                                            findDistance(&pathpoint[j], &pathpoint[pathpointconnect[j][k]]) + .1) {
+                                        closestdistance = sq(tempdist);
+                                        closest = j;
                                     }
                                 }
                             }
-                    player[i].targetpathfindpoint=closest;
-                }
-                else
-                {
-                    for(int j=0;j<numpathpoints;j++)
-                        if(j!=player[i].lastpathfindpoint&&
-                                j!=player[i].lastpathfindpoint2&&
-                                j!=player[i].lastpathfindpoint3&&
-                                j!=player[i].lastpathfindpoint4){
-                            connected=0;
-                            if(numpathpointconnect[j])
-                                for(int k=0;k<numpathpointconnect[j];k++)
-                                    if(pathpointconnect[j][k]==player[i].lastpathfindpoint)
-                                        connected=1;
-                            if(!connected)
-                                if(numpathpointconnect[player[i].lastpathfindpoint])
-                                    for(int k=0;k<numpathpointconnect[player[i].lastpathfindpoint];k++)
-                                        if(pathpointconnect[player[i].lastpathfindpoint][k]==j)
-                                            connected=1;
-                            if(connected){
-                                tempdist=findPathDist(j,player[i].finalpathfindpoint);
-                                if(closest==-1||tempdist<closestdistance){
-                                    closestdistance=tempdist;
-                                    closest=j;
+                    player[i].targetpathfindpoint = closest;
+                } else {
+                    for (int j = 0; j < numpathpoints; j++)
+                        if (j != player[i].lastpathfindpoint &&
+                                j != player[i].lastpathfindpoint2 &&
+                                j != player[i].lastpathfindpoint3 &&
+                                j != player[i].lastpathfindpoint4) {
+                            connected = 0;
+                            if (numpathpointconnect[j])
+                                for (int k = 0; k < numpathpointconnect[j]; k++)
+                                    if (pathpointconnect[j][k] == player[i].lastpathfindpoint)
+                                        connected = 1;
+                            if (!connected)
+                                if (numpathpointconnect[player[i].lastpathfindpoint])
+                                    for (int k = 0; k < numpathpointconnect[player[i].lastpathfindpoint]; k++)
+                                        if (pathpointconnect[player[i].lastpathfindpoint][k] == j)
+                                            connected = 1;
+                            if (connected) {
+                                tempdist = findPathDist(j, player[i].finalpathfindpoint);
+                                if (closest == -1 || tempdist < closestdistance) {
+                                    closestdistance = tempdist;
+                                    closest = j;
                                 }
                             }
                         }
-                    player[i].targetpathfindpoint=closest;
+                    player[i].targetpathfindpoint = closest;
                 }
             }
-            player[i].losupdatedelay-=multiplier;
+            player[i].losupdatedelay -= multiplier;
 
-            player[i].targetyaw=roughDirectionTo(player[i].coords,pathpoint[player[i].targetpathfindpoint]);
-            player[i].lookyaw=player[i].targetyaw;
+            player[i].targetyaw = roughDirectionTo(player[i].coords, pathpoint[player[i].targetpathfindpoint]);
+            player[i].lookyaw = player[i].targetyaw;
 
             //reached target point
-            if(distsqflat(&player[i].coords,&pathpoint[player[i].targetpathfindpoint])<.6){
-                player[i].lastpathfindpoint4=player[i].lastpathfindpoint3;
-                player[i].lastpathfindpoint3=player[i].lastpathfindpoint2;
-                player[i].lastpathfindpoint2=player[i].lastpathfindpoint;
-                player[i].lastpathfindpoint=player[i].targetpathfindpoint;
-                if(player[i].lastpathfindpoint2==-1)
-                    player[i].lastpathfindpoint2=player[i].lastpathfindpoint;
-                if(player[i].lastpathfindpoint3==-1)
-                    player[i].lastpathfindpoint3=player[i].lastpathfindpoint2;
-                if(player[i].lastpathfindpoint4==-1)
-                    player[i].lastpathfindpoint4=player[i].lastpathfindpoint3;
-                player[i].targetpathfindpoint=-1;
-            }
-            if(     distsqflat(&player[i].coords,&player[i].finalfinaltarget)<
-                    distsqflat(&player[i].coords,&player[i].finaltarget)||
-                    distsqflat(&player[i].coords,&player[i].finaltarget)<.6*sq(player[i].scale*5)||
-                    player[i].lastpathfindpoint==player[i].finalpathfindpoint) {
-                player[i].aitype=passivetype;
-            }
-
-            player[i].forwardkeydown=1;
-            player[i].leftkeydown=0;
-            player[i].backkeydown=0;
-            player[i].rightkeydown=0;
-            player[i].crouchkeydown=0;
-            player[i].attackkeydown=0;
-            player[i].throwkeydown=0;
-
-            if(player[i].avoidcollided>.8 && !player[i].jumpkeydown && player[i].collided<.8)
-                player[i].targetyaw+=90*(player[i].whichdirection*2-1);
-
-            if(player[i].collided<1||player[i].animTarget!=jumpupanim)
-                player[i].jumpkeydown=0;
-            if((player[i].collided>.8&&player[i].jumppower>=5))
-                player[i].jumpkeydown=1;
-
-            if((tutoriallevel!=1||cananger)&&
-                    hostile&&
-                    !player[0].dead&&
-                    distsq(&player[i].coords,&player[0].coords)<400&&
-                    player[i].occluded<25){
-                if(distsq(&player[i].coords,&player[0].coords)<12&&
-                        animation[player[0].animTarget].height!=lowheight&&
-                        !editorenabled&&
-                        (player[0].coords.y<player[i].coords.y+5||player[0].onterrain))
-                    player[i].aitype=attacktypecutoff;
-                if(distsq(&player[i].coords,&player[0].coords)<30&&
-                        animation[player[0].animTarget].height==highheight&&
+            if (distsqflat(&player[i].coords, &pathpoint[player[i].targetpathfindpoint]) < .6) {
+                player[i].lastpathfindpoint4 = player[i].lastpathfindpoint3;
+                player[i].lastpathfindpoint3 = player[i].lastpathfindpoint2;
+                player[i].lastpathfindpoint2 = player[i].lastpathfindpoint;
+                player[i].lastpathfindpoint = player[i].targetpathfindpoint;
+                if (player[i].lastpathfindpoint2 == -1)
+                    player[i].lastpathfindpoint2 = player[i].lastpathfindpoint;
+                if (player[i].lastpathfindpoint3 == -1)
+                    player[i].lastpathfindpoint3 = player[i].lastpathfindpoint2;
+                if (player[i].lastpathfindpoint4 == -1)
+                    player[i].lastpathfindpoint4 = player[i].lastpathfindpoint3;
+                player[i].targetpathfindpoint = -1;
+            }
+            if (     distsqflat(&player[i].coords, &player[i].finalfinaltarget) <
+                     distsqflat(&player[i].coords, &player[i].finaltarget) ||
+                     distsqflat(&player[i].coords, &player[i].finaltarget) < .6 * sq(player[i].scale * 5) ||
+                     player[i].lastpathfindpoint == player[i].finalpathfindpoint) {
+                player[i].aitype = passivetype;
+            }
+
+            player[i].forwardkeydown = 1;
+            player[i].leftkeydown = 0;
+            player[i].backkeydown = 0;
+            player[i].rightkeydown = 0;
+            player[i].crouchkeydown = 0;
+            player[i].attackkeydown = 0;
+            player[i].throwkeydown = 0;
+
+            if (player[i].avoidcollided > .8 && !player[i].jumpkeydown && player[i].collided < .8)
+                player[i].targetyaw += 90 * (player[i].whichdirection * 2 - 1);
+
+            if (player[i].collided < 1 || player[i].animTarget != jumpupanim)
+                player[i].jumpkeydown = 0;
+            if ((player[i].collided > .8 && player[i].jumppower >= 5))
+                player[i].jumpkeydown = 1;
+
+            if ((tutoriallevel != 1 || cananger) &&
+                    hostile &&
+                    !player[0].dead &&
+                    distsq(&player[i].coords, &player[0].coords) < 400 &&
+                    player[i].occluded < 25) {
+                if (distsq(&player[i].coords, &player[0].coords) < 12 &&
+                        animation[player[0].animTarget].height != lowheight &&
+                        !editorenabled &&
+                        (player[0].coords.y < player[i].coords.y + 5 || player[0].onterrain))
+                    player[i].aitype = attacktypecutoff;
+                if (distsq(&player[i].coords, &player[0].coords) < 30 &&
+                        animation[player[0].animTarget].height == highheight &&
                         !editorenabled)
-                    player[i].aitype=attacktypecutoff;
-
-                if(player[i].losupdatedelay<0&&!editorenabled&&player[i].occluded<2){
-                    player[i].losupdatedelay=.2;
-                    for(int j=0;j<numplayers;j++)
-                        if(j==0||player[j].skeleton.free||player[j].aitype!=passivetype)
-                            if(abs(Random()%2)||animation[player[j].animTarget].height!=lowheight||j!=0)
-                                if(distsq(&player[i].coords,&player[j].coords)<400)
-                                    if(normaldotproduct(player[i].facing,player[j].coords-player[i].coords)>0)
-                                        if(player[j].coords.y<player[i].coords.y+5||player[j].onterrain)
-                                            if(!player[j].isWallJump()&&-1==checkcollide(
-                                                            DoRotation(player[i].jointPos(head),0,player[i].yaw,0)
-                                                                *player[i].scale+player[i].coords,
-                                                            DoRotation(player[j].jointPos(head),0,player[j].yaw,0)
-                                                                *player[j].scale+player[j].coords)||
-                                                    (player[j].animTarget==hanganim&&
-                                                     normaldotproduct(player[j].facing,player[i].coords-player[j].coords)<0)){
-                                                player[i].aitype=searchtype;
-                                                player[i].lastchecktime=12;
-                                                player[i].lastseen=player[j].coords;
-                                                player[i].lastseentime=12;
+                    player[i].aitype = attacktypecutoff;
+
+                if (player[i].losupdatedelay < 0 && !editorenabled && player[i].occluded < 2) {
+                    player[i].losupdatedelay = .2;
+                    for (int j = 0; j < numplayers; j++)
+                        if (j == 0 || player[j].skeleton.free || player[j].aitype != passivetype)
+                            if (abs(Random() % 2) || animation[player[j].animTarget].height != lowheight || j != 0)
+                                if (distsq(&player[i].coords, &player[j].coords) < 400)
+                                    if (normaldotproduct(player[i].facing, player[j].coords - player[i].coords) > 0)
+                                        if (player[j].coords.y < player[i].coords.y + 5 || player[j].onterrain)
+                                            if (!player[j].isWallJump() && -1 == checkcollide(
+                                                        DoRotation(player[i].jointPos(head), 0, player[i].yaw, 0)
+                                                        *player[i].scale + player[i].coords,
+                                                        DoRotation(player[j].jointPos(head), 0, player[j].yaw, 0)
+                                                        *player[j].scale + player[j].coords) ||
+                                                    (player[j].animTarget == hanganim &&
+                                                     normaldotproduct(player[j].facing, player[i].coords - player[j].coords) < 0)) {
+                                                player[i].aitype = searchtype;
+                                                player[i].lastchecktime = 12;
+                                                player[i].lastseen = player[j].coords;
+                                                player[i].lastseentime = 12;
                                             }
                 }
             }
-            if(player[i].aitype==attacktypecutoff&&musictype!=2)
-                if(player[i].creature!=wolftype){
-                    player[i].stunned=.6;
-                    player[i].surprised=.6;
+            if (player[i].aitype == attacktypecutoff && musictype != 2)
+                if (player[i].creature != wolftype) {
+                    player[i].stunned = .6;
+                    player[i].surprised = .6;
                 }
         }
 
-        if(player[i].aitype!=passivetype&&leveltime>.5)
-            player[i].howactive=typeactive;
-
-        if(player[i].aitype==passivetype){
-            player[i].aiupdatedelay-=multiplier;
-            player[i].losupdatedelay-=multiplier;
-            player[i].lastseentime+=multiplier;
-            player[i].pausetime-=multiplier;
-            if(player[i].lastseentime>1)
-                player[i].lastseentime=1;
-
-            if(player[i].aiupdatedelay<0){
-                if(player[i].numwaypoints>1&&player[i].howactive==typeactive&&player[i].pausetime<=0){
-                    player[i].targetyaw=roughDirectionTo(player[i].coords,player[i].waypoints[player[i].waypoint]);
-                    player[i].lookyaw=player[i].targetyaw;
-                    player[i].aiupdatedelay=.05;
-
-                    if(distsqflat(&player[i].coords,&player[i].waypoints[player[i].waypoint])<1){
-                        if(player[i].waypointtype[player[i].waypoint]==wppause)
-                            player[i].pausetime=4;
+        if (player[i].aitype != passivetype && leveltime > .5)
+            player[i].howactive = typeactive;
+
+        if (player[i].aitype == passivetype) {
+            player[i].aiupdatedelay -= multiplier;
+            player[i].losupdatedelay -= multiplier;
+            player[i].lastseentime += multiplier;
+            player[i].pausetime -= multiplier;
+            if (player[i].lastseentime > 1)
+                player[i].lastseentime = 1;
+
+            if (player[i].aiupdatedelay < 0) {
+                if (player[i].numwaypoints > 1 && player[i].howactive == typeactive && player[i].pausetime <= 0) {
+                    player[i].targetyaw = roughDirectionTo(player[i].coords, player[i].waypoints[player[i].waypoint]);
+                    player[i].lookyaw = player[i].targetyaw;
+                    player[i].aiupdatedelay = .05;
+
+                    if (distsqflat(&player[i].coords, &player[i].waypoints[player[i].waypoint]) < 1) {
+                        if (player[i].waypointtype[player[i].waypoint] == wppause)
+                            player[i].pausetime = 4;
                         player[i].waypoint++;
-                        if(player[i].waypoint>player[i].numwaypoints-1)
-                            player[i].waypoint=0;
+                        if (player[i].waypoint > player[i].numwaypoints - 1)
+                            player[i].waypoint = 0;
 
                     }
                 }
 
-                if(player[i].numwaypoints>1&&player[i].howactive==typeactive&&player[i].pausetime<=0)
-                    player[i].forwardkeydown=1;
+                if (player[i].numwaypoints > 1 && player[i].howactive == typeactive && player[i].pausetime <= 0)
+                    player[i].forwardkeydown = 1;
                 else
-                    player[i].forwardkeydown=0;
-                player[i].leftkeydown=0;
-                player[i].backkeydown=0;
-                player[i].rightkeydown=0;
-                player[i].crouchkeydown=0;
-                player[i].attackkeydown=0;
-                player[i].throwkeydown=0;
-
-                if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){
-                    if(!player[i].avoidsomething)
-                        player[i].targetyaw+=90*(player[i].whichdirection*2-1);
-                    else{
-                        XYZ leftpos,rightpos;
-                        float leftdist,rightdist;
-                        leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0);
-                        rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0);
+                    player[i].forwardkeydown = 0;
+                player[i].leftkeydown = 0;
+                player[i].backkeydown = 0;
+                player[i].rightkeydown = 0;
+                player[i].crouchkeydown = 0;
+                player[i].attackkeydown = 0;
+                player[i].throwkeydown = 0;
+
+                if (player[i].avoidcollided > .8 && !player[i].jumpkeydown && player[i].collided < .8) {
+                    if (!player[i].avoidsomething)
+                        player[i].targetyaw += 90 * (player[i].whichdirection * 2 - 1);
+                    else {
+                        XYZ leftpos, rightpos;
+                        float leftdist, rightdist;
+                        leftpos = player[i].coords + DoRotation(player[i].facing, 0, 90, 0);
+                        rightpos = player[i].coords - DoRotation(player[i].facing, 0, 90, 0);
                         leftdist = distsq(&leftpos, &player[i].avoidwhere);
                         rightdist = distsq(&rightpos, &player[i].avoidwhere);
-                        if(leftdist<rightdist)
-                            player[i].targetyaw+=90;
+                        if (leftdist < rightdist)
+                            player[i].targetyaw += 90;
                         else
-                            player[i].targetyaw-=90;
+                            player[i].targetyaw -= 90;
                     }
                 }
             }
-            if(player[i].collided<1||player[i].animTarget!=jumpupanim)
-                player[i].jumpkeydown=0;
-            if((player[i].collided>.8&&player[i].jumppower>=5))
-                player[i].jumpkeydown=1;
+            if (player[i].collided < 1 || player[i].animTarget != jumpupanim)
+                player[i].jumpkeydown = 0;
+            if ((player[i].collided > .8 && player[i].jumppower >= 5))
+                player[i].jumpkeydown = 1;
 
 
             //hearing sounds
-            if(!editorenabled){
-                if(player[i].howactive<=typesleeping)
-                    if(numenvsounds>0&&(tutoriallevel!=1||cananger)&&hostile)
-                        for(int j=0;j<numenvsounds;j++){
-                            float vol=player[i].howactive==typesleeping?envsoundvol[j]-14:envsoundvol[j];
-                            if(vol>0&&distsq(&player[i].coords,&envsound[j])<
-                                    2*(vol+vol*(player[i].creature==rabbittype)*3))
-                                player[i].aitype=attacktypecutoff;
+            if (!editorenabled) {
+                if (player[i].howactive <= typesleeping)
+                    if (numenvsounds > 0 && (tutoriallevel != 1 || cananger) && hostile)
+                        for (int j = 0; j < numenvsounds; j++) {
+                            float vol = player[i].howactive == typesleeping ? envsoundvol[j] - 14 : envsoundvol[j];
+                            if (vol > 0 && distsq(&player[i].coords, &envsound[j]) <
+                                    2 * (vol + vol * (player[i].creature == rabbittype) * 3))
+                                player[i].aitype = attacktypecutoff;
                         }
 
-                if(player[i].aitype!=passivetype){
-                    if(player[i].howactive==typesleeping)
+                if (player[i].aitype != passivetype) {
+                    if (player[i].howactive == typesleeping)
                         player[i].setAnimation(getupfromfrontanim);
-                    player[i].howactive=typeactive;
+                    player[i].howactive = typeactive;
                 }
             }
 
-            if(player[i].howactive<typesleeping&&
-                    ((tutoriallevel!=1||cananger)&&hostile)&&
-                    !player[0].dead&&
-                    distsq(&player[i].coords,&player[0].coords)<400&&
-                    player[i].occluded<25){
-                if(distsq(&player[i].coords,&player[0].coords)<12&&
-                        animation[player[0].animTarget].height!=lowheight&&!editorenabled)
-                    player[i].aitype=attacktypecutoff;
-                if(distsq(&player[i].coords,&player[0].coords)<30&&
-                        animation[player[0].animTarget].height==highheight&&!editorenabled)
-                    player[i].aitype=attacktypecutoff;
+            if (player[i].howactive < typesleeping &&
+                    ((tutoriallevel != 1 || cananger) && hostile) &&
+                    !player[0].dead &&
+                    distsq(&player[i].coords, &player[0].coords) < 400 &&
+                    player[i].occluded < 25) {
+                if (distsq(&player[i].coords, &player[0].coords) < 12 &&
+                        animation[player[0].animTarget].height != lowheight && !editorenabled)
+                    player[i].aitype = attacktypecutoff;
+                if (distsq(&player[i].coords, &player[0].coords) < 30 &&
+                        animation[player[0].animTarget].height == highheight && !editorenabled)
+                    player[i].aitype = attacktypecutoff;
 
                 //wolf smell
-                if(player[i].creature==wolftype){
+                if (player[i].creature == wolftype) {
                     XYZ windsmell;
-                    for(int j=0;j<numplayers;j++){
-                        if(j==0||(player[j].dead&&player[j].bloodloss>0)){
-                            float smelldistance=50;
-                            if(j==0&&player[j].num_weapons>0){
-                                if(weapons[player[j].weaponids[0]].bloody)
-                                    smelldistance=100;
-                                if(player[j].num_weapons==2)
-                                    if(weapons[player[j].weaponids[1]].bloody)
-                                        smelldistance=100;
+                    for (int j = 0; j < numplayers; j++) {
+                        if (j == 0 || (player[j].dead && player[j].bloodloss > 0)) {
+                            float smelldistance = 50;
+                            if (j == 0 && player[j].num_weapons > 0) {
+                                if (weapons[player[j].weaponids[0]].bloody)
+                                    smelldistance = 100;
+                                if (player[j].num_weapons == 2)
+                                    if (weapons[player[j].weaponids[1]].bloody)
+                                        smelldistance = 100;
                             }
-                            if(j!=0)
-                                smelldistance=100;
-                            windsmell=windvector;
+                            if (j != 0)
+                                smelldistance = 100;
+                            windsmell = windvector;
                             Normalise(&windsmell);
-                            windsmell=windsmell*2+player[j].coords;
-                            if(distsq(&player[i].coords,&windsmell)<smelldistance&&!editorenabled)
-                                player[i].aitype=attacktypecutoff;
+                            windsmell = windsmell * 2 + player[j].coords;
+                            if (distsq(&player[i].coords, &windsmell) < smelldistance && !editorenabled)
+                                player[i].aitype = attacktypecutoff;
                         }
                     }
                 }
 
-                if(player[i].howactive<typesleeping&&player[i].losupdatedelay<0&&!editorenabled&&player[i].occluded<2){
-                    player[i].losupdatedelay=.2;
-                    for(int j=0;j<numplayers;j++){
-                        if(j==0||player[j].skeleton.free||player[j].aitype!=passivetype){
-                            if(abs(Random()%2)||animation[player[j].animTarget].height!=lowheight||j!=0)
-                                if(distsq(&player[i].coords,&player[j].coords)<400)
-                                    if(normaldotproduct(player[i].facing,player[j].coords-player[i].coords)>0)
-                                        if((-1==checkcollide(
-                                                        DoRotation(player[i].jointPos(head),0,player[i].yaw,0)*
-                                                            player[i].scale+player[i].coords,
-                                                        DoRotation(player[j].jointPos(head),0,player[j].yaw,0)*
-                                                            player[j].scale+player[j].coords)&&
-                                                    !player[j].isWallJump())||
-                                                (player[j].animTarget==hanganim&&
-                                                 normaldotproduct(player[j].facing,player[i].coords-player[j].coords)<0)){
-                                            player[i].lastseentime-=.2;
-                                            if(j==0&&animation[player[j].animTarget].height==lowheight)
-                                                player[i].lastseentime-=.4;
+                if (player[i].howactive < typesleeping && player[i].losupdatedelay < 0 && !editorenabled && player[i].occluded < 2) {
+                    player[i].losupdatedelay = .2;
+                    for (int j = 0; j < numplayers; j++) {
+                        if (j == 0 || player[j].skeleton.free || player[j].aitype != passivetype) {
+                            if (abs(Random() % 2) || animation[player[j].animTarget].height != lowheight || j != 0)
+                                if (distsq(&player[i].coords, &player[j].coords) < 400)
+                                    if (normaldotproduct(player[i].facing, player[j].coords - player[i].coords) > 0)
+                                        if ((-1 == checkcollide(
+                                                    DoRotation(player[i].jointPos(head), 0, player[i].yaw, 0)*
+                                                    player[i].scale + player[i].coords,
+                                                    DoRotation(player[j].jointPos(head), 0, player[j].yaw, 0)*
+                                                    player[j].scale + player[j].coords) &&
+                                                !player[j].isWallJump()) ||
+                                                (player[j].animTarget == hanganim &&
+                                                 normaldotproduct(player[j].facing, player[i].coords - player[j].coords) < 0)) {
+                                            player[i].lastseentime -= .2;
+                                            if (j == 0 && animation[player[j].animTarget].height == lowheight)
+                                                player[i].lastseentime -= .4;
                                             else
-                                                player[i].lastseentime-=.6;
+                                                player[i].lastseentime -= .6;
                                         }
-                            if(player[i].lastseentime<=0){
-                                player[i].aitype=searchtype;
-                                player[i].lastchecktime=12;
-                                player[i].lastseen=player[j].coords;
-                                player[i].lastseentime=12;
+                            if (player[i].lastseentime <= 0) {
+                                player[i].aitype = searchtype;
+                                player[i].lastchecktime = 12;
+                                player[i].lastseen = player[j].coords;
+                                player[i].lastseentime = 12;
                             }
                         }
                     }
                 }
             }
             //alerted surprise
-            if(player[i].aitype==attacktypecutoff&&musictype!=2){
-                if(player[i].creature!=wolftype){
-                    player[i].stunned=.6;
-                    player[i].surprised=.6;
+            if (player[i].aitype == attacktypecutoff && musictype != 2) {
+                if (player[i].creature != wolftype) {
+                    player[i].stunned = .6;
+                    player[i].surprised = .6;
                 }
-                if(player[i].creature==wolftype){
-                    player[i].stunned=.47;
-                    player[i].surprised=.47;
+                if (player[i].creature == wolftype) {
+                    player[i].stunned = .47;
+                    player[i].surprised = .47;
                 }
                 numseen++;
             }
@@ -4859,687 +5049,689 @@ void doAI(int i){
 
         //search for player
         int j;
-        if(player[i].aitype==searchtype){
-            player[i].aiupdatedelay-=multiplier;
-            player[i].losupdatedelay-=multiplier;
-            if(!player[i].pause)
-                player[i].lastseentime-=multiplier;
-            player[i].lastchecktime-=multiplier;
-
-            if(player[i].isRun()&&!player[i].onground){
-                if(player[i].coords.y>terrain.getHeight(player[i].coords.x,player[i].coords.z)+10){
-                    XYZ test2=player[i].coords+player[i].facing;
-                    test2.y+=5;
-                    XYZ test=player[i].coords+player[i].facing;
-                    test.y-=10;
-                    j=checkcollide(test2,test,player[i].laststanding);
-                    if(j==-1)
-                        j=checkcollide(test2,test);
-                    if(j==-1){
-                        player[i].velocity=0;
+        if (player[i].aitype == searchtype) {
+            player[i].aiupdatedelay -= multiplier;
+            player[i].losupdatedelay -= multiplier;
+            if (!player[i].pause)
+                player[i].lastseentime -= multiplier;
+            player[i].lastchecktime -= multiplier;
+
+            if (player[i].isRun() && !player[i].onground) {
+                if (player[i].coords.y > terrain.getHeight(player[i].coords.x, player[i].coords.z) + 10) {
+                    XYZ test2 = player[i].coords + player[i].facing;
+                    test2.y += 5;
+                    XYZ test = player[i].coords + player[i].facing;
+                    test.y -= 10;
+                    j = checkcollide(test2, test, player[i].laststanding);
+                    if (j == -1)
+                        j = checkcollide(test2, test);
+                    if (j == -1) {
+                        player[i].velocity = 0;
                         player[i].setAnimation(player[i].getStop());
-                        player[i].targetyaw+=180;
-                        player[i].stunned=.5;
+                        player[i].targetyaw += 180;
+                        player[i].stunned = .5;
                         //player[i].aitype=passivetype;
-                        player[i].aitype=pathfindtype;
-                        player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint];
-                        player[i].finalpathfindpoint=-1;
-                        player[i].targetpathfindpoint=-1;
-                        player[i].lastpathfindpoint=-1;
-                        player[i].lastpathfindpoint2=-1;
-                        player[i].lastpathfindpoint3=-1;
-                        player[i].lastpathfindpoint4=-1;
-                    }
-                    else player[i].laststanding=j;
+                        player[i].aitype = pathfindtype;
+                        player[i].finalfinaltarget = player[i].waypoints[player[i].waypoint];
+                        player[i].finalpathfindpoint = -1;
+                        player[i].targetpathfindpoint = -1;
+                        player[i].lastpathfindpoint = -1;
+                        player[i].lastpathfindpoint2 = -1;
+                        player[i].lastpathfindpoint3 = -1;
+                        player[i].lastpathfindpoint4 = -1;
+                    } else player[i].laststanding = j;
                 }
             }
             //check out last seen location
-            if(player[i].aiupdatedelay<0){
-                player[i].targetyaw=roughDirectionTo(player[i].coords,player[i].lastseen);
-                player[i].lookyaw=player[i].targetyaw;
-                player[i].aiupdatedelay=.05;
-                player[i].forwardkeydown=1;
-
-                if(distsqflat(&player[i].coords,&player[i].lastseen)<1*sq(player[i].scale*5)||player[i].lastchecktime<0){
-                    player[i].forwardkeydown=0;
-                    player[i].aiupdatedelay=1;
-                    player[i].lastseen.x+=(float(Random()%100)-50)/25;
-                    player[i].lastseen.z+=(float(Random()%100)-50)/25;
-                    player[i].lastchecktime=3;
+            if (player[i].aiupdatedelay < 0) {
+                player[i].targetyaw = roughDirectionTo(player[i].coords, player[i].lastseen);
+                player[i].lookyaw = player[i].targetyaw;
+                player[i].aiupdatedelay = .05;
+                player[i].forwardkeydown = 1;
+
+                if (distsqflat(&player[i].coords, &player[i].lastseen) < 1 * sq(player[i].scale * 5) || player[i].lastchecktime < 0) {
+                    player[i].forwardkeydown = 0;
+                    player[i].aiupdatedelay = 1;
+                    player[i].lastseen.x += (float(Random() % 100) - 50) / 25;
+                    player[i].lastseen.z += (float(Random() % 100) - 50) / 25;
+                    player[i].lastchecktime = 3;
                 }
 
-                player[i].leftkeydown=0;
-                player[i].backkeydown=0;
-                player[i].rightkeydown=0;
-                player[i].crouchkeydown=0;
-                player[i].attackkeydown=0;
-                player[i].throwkeydown=0;
-
-                if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){
-                    if(!player[i].avoidsomething)player[i].targetyaw+=90*(player[i].whichdirection*2-1);
-                    else{
-                        XYZ leftpos,rightpos;
-                        float leftdist,rightdist;
-                        leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0);
-                        rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0);
+                player[i].leftkeydown = 0;
+                player[i].backkeydown = 0;
+                player[i].rightkeydown = 0;
+                player[i].crouchkeydown = 0;
+                player[i].attackkeydown = 0;
+                player[i].throwkeydown = 0;
+
+                if (player[i].avoidcollided > .8 && !player[i].jumpkeydown && player[i].collided < .8) {
+                    if (!player[i].avoidsomething)player[i].targetyaw += 90 * (player[i].whichdirection * 2 - 1);
+                    else {
+                        XYZ leftpos, rightpos;
+                        float leftdist, rightdist;
+                        leftpos = player[i].coords + DoRotation(player[i].facing, 0, 90, 0);
+                        rightpos = player[i].coords - DoRotation(player[i].facing, 0, 90, 0);
                         leftdist = distsq(&leftpos, &player[i].avoidwhere);
                         rightdist = distsq(&rightpos, &player[i].avoidwhere);
-                        if(leftdist<rightdist)player[i].targetyaw+=90;
-                        else player[i].targetyaw-=90;
+                        if (leftdist < rightdist)player[i].targetyaw += 90;
+                        else player[i].targetyaw -= 90;
                     }
                 }
             }
-            if(player[i].collided<1||player[i].animTarget!=jumpupanim)
-                player[i].jumpkeydown=0;
-            if((player[i].collided>.8&&player[i].jumppower>=5))
-                player[i].jumpkeydown=1;
-
-            if(numenvsounds>0&&((tutoriallevel!=1||cananger)&&hostile))
-                for(int k=0;k<numenvsounds;k++){
-                    if(distsq(&player[i].coords,&envsound[k])<2*(envsoundvol[k]+envsoundvol[k]*(player[i].creature==rabbittype)*3)){
-                        player[i].aitype=attacktypecutoff;
+            if (player[i].collided < 1 || player[i].animTarget != jumpupanim)
+                player[i].jumpkeydown = 0;
+            if ((player[i].collided > .8 && player[i].jumppower >= 5))
+                player[i].jumpkeydown = 1;
+
+            if (numenvsounds > 0 && ((tutoriallevel != 1 || cananger) && hostile))
+                for (int k = 0; k < numenvsounds; k++) {
+                    if (distsq(&player[i].coords, &envsound[k]) < 2 * (envsoundvol[k] + envsoundvol[k] * (player[i].creature == rabbittype) * 3)) {
+                        player[i].aitype = attacktypecutoff;
                     }
                 }
 
-            if(!player[0].dead&&
-                    player[i].losupdatedelay<0&&
-                    !editorenabled&&
-                    player[i].occluded<2&&
-                    ((tutoriallevel!=1||cananger)&&hostile)){
-                player[i].losupdatedelay=.2;
-                if(distsq(&player[i].coords,&player[0].coords)<4&&animation[player[i].animTarget].height!=lowheight){
-                    player[i].aitype=attacktypecutoff;
-                    player[i].lastseentime=1;
+            if (!player[0].dead &&
+                    player[i].losupdatedelay < 0 &&
+                    !editorenabled &&
+                    player[i].occluded < 2 &&
+                    ((tutoriallevel != 1 || cananger) && hostile)) {
+                player[i].losupdatedelay = .2;
+                if (distsq(&player[i].coords, &player[0].coords) < 4 && animation[player[i].animTarget].height != lowheight) {
+                    player[i].aitype = attacktypecutoff;
+                    player[i].lastseentime = 1;
                 }
-                if(abs(Random()%2)||animation[player[i].animTarget].height!=lowheight)
+                if (abs(Random() % 2) || animation[player[i].animTarget].height != lowheight)
                     //TODO: factor out canSeePlayer()
-                    if(distsq(&player[i].coords,&player[0].coords)<400)
-                        if(normaldotproduct(player[i].facing,player[0].coords-player[i].coords)>0)
-                            if((checkcollide(
-                                        DoRotation(player[i].jointPos(head),0,player[i].yaw,0)*
-                                            player[i].scale+player[i].coords,
-                                        DoRotation(player[0].jointPos(head),0,player[0].yaw,0)*
-                                            player[0].scale+player[0].coords)==-1)||
-                                    (player[0].animTarget==hanganim&&normaldotproduct(
-                                        player[0].facing,player[i].coords-player[0].coords)<0)){
-                                    /* //TODO: changed j to 0 on a whim, make sure this is correct
-                                    (player[j].animTarget==hanganim&&normaldotproduct(
-                                        player[j].facing,player[i].coords-player[j].coords)<0)
-                                    */
-                                player[i].aitype=attacktypecutoff;
-                                player[i].lastseentime=1;
+                    if (distsq(&player[i].coords, &player[0].coords) < 400)
+                        if (normaldotproduct(player[i].facing, player[0].coords - player[i].coords) > 0)
+                            if ((checkcollide(
+                                        DoRotation(player[i].jointPos(head), 0, player[i].yaw, 0)*
+                                        player[i].scale + player[i].coords,
+                                        DoRotation(player[0].jointPos(head), 0, player[0].yaw, 0)*
+                                        player[0].scale + player[0].coords) == -1) ||
+                                    (player[0].animTarget == hanganim && normaldotproduct(
+                                         player[0].facing, player[i].coords - player[0].coords) < 0)) {
+                                /* //TODO: changed j to 0 on a whim, make sure this is correct
+                                (player[j].animTarget==hanganim&&normaldotproduct(
+                                    player[j].facing,player[i].coords-player[j].coords)<0)
+                                */
+                                player[i].aitype = attacktypecutoff;
+                                player[i].lastseentime = 1;
                             }
             }
             //player escaped
-            if(player[i].lastseentime<0){
+            if (player[i].lastseentime < 0) {
                 //player[i].aitype=passivetype;
                 numescaped++;
-                player[i].aitype=pathfindtype;
-                player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint];
-                player[i].finalpathfindpoint=-1;
-                player[i].targetpathfindpoint=-1;
-                player[i].lastpathfindpoint=-1;
-                player[i].lastpathfindpoint2=-1;
-                player[i].lastpathfindpoint3=-1;
-                player[i].lastpathfindpoint4=-1;
+                player[i].aitype = pathfindtype;
+                player[i].finalfinaltarget = player[i].waypoints[player[i].waypoint];
+                player[i].finalpathfindpoint = -1;
+                player[i].targetpathfindpoint = -1;
+                player[i].lastpathfindpoint = -1;
+                player[i].lastpathfindpoint2 = -1;
+                player[i].lastpathfindpoint3 = -1;
+                player[i].lastpathfindpoint4 = -1;
             }
         }
 
-        if(player[i].aitype!=gethelptype)
-            player[i].runninghowlong=0;
+        if (player[i].aitype != gethelptype)
+            player[i].runninghowlong = 0;
 
         //get help from buddies
-        if(player[i].aitype==gethelptype) {
-            player[i].runninghowlong+=multiplier;
-            player[i].aiupdatedelay-=multiplier;
+        if (player[i].aitype == gethelptype) {
+            player[i].runninghowlong += multiplier;
+            player[i].aiupdatedelay -= multiplier;
 
-            if(player[i].aiupdatedelay<0||player[i].ally==0) {
-                player[i].aiupdatedelay=.2;
+            if (player[i].aiupdatedelay < 0 || player[i].ally == 0) {
+                player[i].aiupdatedelay = .2;
 
                 //find closest ally
                 //TODO: factor out closest search somehow
-                if(!player[i].ally) {
-                    int closest=-1;
-                    float closestdist=-1;
-                    for(int k=0;k<numplayers;k++) {
-                        if(k!=i&&k!=0&&!player[k].dead&&
-                                player[k].howactive<typedead1&&
-                                !player[k].skeleton.free&&
-                                player[k].aitype==passivetype) {
-                            float distance=distsq(&player[i].coords,&player[k].coords);
-                            if(closestdist==-1||distance<closestdist) {
-                                closestdist=distance;
-                                closest=k;
+                if (!player[i].ally) {
+                    int closest = -1;
+                    float closestdist = -1;
+                    for (int k = 0; k < numplayers; k++) {
+                        if (k != i && k != 0 && !player[k].dead &&
+                                player[k].howactive < typedead1 &&
+                                !player[k].skeleton.free &&
+                                player[k].aitype == passivetype) {
+                            float distance = distsq(&player[i].coords, &player[k].coords);
+                            if (closestdist == -1 || distance < closestdist) {
+                                closestdist = distance;
+                                closest = k;
                             }
-                            closest=k;
+                            closest = k;
                         }
                     }
-                    if(closest!=-1)
-                        player[i].ally=closest;
+                    if (closest != -1)
+                        player[i].ally = closest;
                     else
-                        player[i].ally=0;
-                    player[i].lastseen=player[0].coords;
-                    player[i].lastseentime=12;
+                        player[i].ally = 0;
+                    player[i].lastseen = player[0].coords;
+                    player[i].lastseentime = 12;
                 }
 
 
-                player[i].lastchecktime=12;
+                player[i].lastchecktime = 12;
 
-                XYZ facing=player[i].coords;
-                XYZ flatfacing=player[player[i].ally].coords;
-                facing.y+=player[i].jointPos(head).y*player[i].scale;
-                flatfacing.y+=player[player[i].ally].jointPos(head).y*player[player[i].ally].scale;
-                if(-1!=checkcollide(facing,flatfacing))
-                    player[i].lastseentime-=.1;
+                XYZ facing = player[i].coords;
+                XYZ flatfacing = player[player[i].ally].coords;
+                facing.y += player[i].jointPos(head).y * player[i].scale;
+                flatfacing.y += player[player[i].ally].jointPos(head).y * player[player[i].ally].scale;
+                if (-1 != checkcollide(facing, flatfacing))
+                    player[i].lastseentime -= .1;
 
                 //no available ally, run back to player
-                if(player[i].ally<=0||
-                        player[player[i].ally].skeleton.free||
-                        player[player[i].ally].aitype!=passivetype||
-                        player[i].lastseentime<=0){
-                    player[i].aitype=searchtype;
-                    player[i].lastseentime=12;
+                if (player[i].ally <= 0 ||
+                        player[player[i].ally].skeleton.free ||
+                        player[player[i].ally].aitype != passivetype ||
+                        player[i].lastseentime <= 0) {
+                    player[i].aitype = searchtype;
+                    player[i].lastseentime = 12;
                 }
 
                 //seek out ally
-                if(player[i].ally>0){
-                    player[i].targetyaw=roughDirectionTo(player[i].coords,player[player[i].ally].coords);
-                    player[i].lookyaw=player[i].targetyaw;
-                    player[i].aiupdatedelay=.05;
-                    player[i].forwardkeydown=1;
-
-                    if(distsqflat(&player[i].coords,&player[player[i].ally].coords)<3){
-                        player[i].aitype=searchtype;
-                        player[i].lastseentime=12;
-                        player[player[i].ally].aitype=searchtype;
-                        if(player[player[i].ally].lastseentime<player[i].lastseentime){
-                            player[player[i].ally].lastseen=player[i].lastseen;
-                            player[player[i].ally].lastseentime=player[i].lastseentime;
-                            player[player[i].ally].lastchecktime=player[i].lastchecktime;
+                if (player[i].ally > 0) {
+                    player[i].targetyaw = roughDirectionTo(player[i].coords, player[player[i].ally].coords);
+                    player[i].lookyaw = player[i].targetyaw;
+                    player[i].aiupdatedelay = .05;
+                    player[i].forwardkeydown = 1;
+
+                    if (distsqflat(&player[i].coords, &player[player[i].ally].coords) < 3) {
+                        player[i].aitype = searchtype;
+                        player[i].lastseentime = 12;
+                        player[player[i].ally].aitype = searchtype;
+                        if (player[player[i].ally].lastseentime < player[i].lastseentime) {
+                            player[player[i].ally].lastseen = player[i].lastseen;
+                            player[player[i].ally].lastseentime = player[i].lastseentime;
+                            player[player[i].ally].lastchecktime = player[i].lastchecktime;
                         }
                     }
 
-                    if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){
-                        if(!player[i].avoidsomething)
-                            player[i].targetyaw+=90*(player[i].whichdirection*2-1);
-                        else{
-                            XYZ leftpos,rightpos;
-                            float leftdist,rightdist;
-                            leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0);
-                            rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0);
+                    if (player[i].avoidcollided > .8 && !player[i].jumpkeydown && player[i].collided < .8) {
+                        if (!player[i].avoidsomething)
+                            player[i].targetyaw += 90 * (player[i].whichdirection * 2 - 1);
+                        else {
+                            XYZ leftpos, rightpos;
+                            float leftdist, rightdist;
+                            leftpos = player[i].coords + DoRotation(player[i].facing, 0, 90, 0);
+                            rightpos = player[i].coords - DoRotation(player[i].facing, 0, 90, 0);
                             leftdist = distsq(&leftpos, &player[i].avoidwhere);
                             rightdist = distsq(&rightpos, &player[i].avoidwhere);
-                            if(leftdist<rightdist)
-                                player[i].targetyaw+=90;
+                            if (leftdist < rightdist)
+                                player[i].targetyaw += 90;
                             else
-                                player[i].targetyaw-=90;
+                                player[i].targetyaw -= 90;
                         }
                     }
                 }
 
-                player[i].leftkeydown=0;
-                player[i].backkeydown=0;
-                player[i].rightkeydown=0;
-                player[i].crouchkeydown=0;
-                player[i].attackkeydown=0;
+                player[i].leftkeydown = 0;
+                player[i].backkeydown = 0;
+                player[i].rightkeydown = 0;
+                player[i].crouchkeydown = 0;
+                player[i].attackkeydown = 0;
             }
-            if(player[i].collided<1||player[i].animTarget!=jumpupanim)
-                player[i].jumpkeydown=0;
-            if(player[i].collided>.8&&player[i].jumppower>=5)
-                player[i].jumpkeydown=1;
+            if (player[i].collided < 1 || player[i].animTarget != jumpupanim)
+                player[i].jumpkeydown = 0;
+            if (player[i].collided > .8 && player[i].jumppower >= 5)
+                player[i].jumpkeydown = 1;
         }
 
         //retreiving a weapon on the ground
-        if(player[i].aitype==getweapontype){
-            player[i].aiupdatedelay-=multiplier;
-            player[i].lastchecktime-=multiplier;
+        if (player[i].aitype == getweapontype) {
+            player[i].aiupdatedelay -= multiplier;
+            player[i].lastchecktime -= multiplier;
 
-            if(player[i].aiupdatedelay<0){
-                player[i].aiupdatedelay=.2;
+            if (player[i].aiupdatedelay < 0) {
+                player[i].aiupdatedelay = .2;
 
                 //ALLY IS WEPON
-                if(player[i].ally<0){
-                    int closest=-1;
-                    float closestdist=-1;
-                    for(int k=0;k<weapons.size();k++)
-                        if(weapons[k].owner==-1){
-                            float distance=distsq(&player[i].coords,&weapons[k].position);
-                            if(closestdist==-1||distance<closestdist){
-                                closestdist=distance;
-                                closest=k;
+                if (player[i].ally < 0) {
+                    int closest = -1;
+                    float closestdist = -1;
+                    for (int k = 0; k < weapons.size(); k++)
+                        if (weapons[k].owner == -1) {
+                            float distance = distsq(&player[i].coords, &weapons[k].position);
+                            if (closestdist == -1 || distance < closestdist) {
+                                closestdist = distance;
+                                closest = k;
                             }
-                            closest=k;
+                            closest = k;
                         }
-                    if(closest!=-1)
-                        player[i].ally=closest;
+                    if (closest != -1)
+                        player[i].ally = closest;
                     else
-                        player[i].ally=-1;
+                        player[i].ally = -1;
                 }
 
-                player[i].lastseentime=12;
+                player[i].lastseentime = 12;
 
-                if(!player[0].dead&&((tutoriallevel!=1||cananger)&&hostile))
-                    if(player[i].ally<0||player[i].weaponactive!=-1||player[i].lastchecktime<=0){
-                        player[i].aitype=attacktypecutoff;
-                        player[i].lastseentime=1;
+                if (!player[0].dead && ((tutoriallevel != 1 || cananger) && hostile))
+                    if (player[i].ally < 0 || player[i].weaponactive != -1 || player[i].lastchecktime <= 0) {
+                        player[i].aitype = attacktypecutoff;
+                        player[i].lastseentime = 1;
                     }
-                if(!player[0].dead)
-                    if(player[i].ally>=0){
-                        if(weapons[player[i].ally].owner!=-1||
-                                distsq(&player[i].coords,&weapons[player[i].ally].position)>16){
-                            player[i].aitype=attacktypecutoff;
-                            player[i].lastseentime=1;
+                if (!player[0].dead)
+                    if (player[i].ally >= 0) {
+                        if (weapons[player[i].ally].owner != -1 ||
+                                distsq(&player[i].coords, &weapons[player[i].ally].position) > 16) {
+                            player[i].aitype = attacktypecutoff;
+                            player[i].lastseentime = 1;
                         }
                         //TODO: factor these out as moveToward()
-                        player[i].targetyaw=roughDirectionTo(player[i].coords,weapons[player[i].ally].position);
-                        player[i].lookyaw=player[i].targetyaw;
-                        player[i].aiupdatedelay=.05;
-                        player[i].forwardkeydown=1;
-
-
-                        if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){
-                            if(!player[i].avoidsomething)
-                                player[i].targetyaw+=90*(player[i].whichdirection*2-1);
-                            else{
-                                XYZ leftpos,rightpos;
-                                float leftdist,rightdist;
-                                leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0);
-                                rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0);
+                        player[i].targetyaw = roughDirectionTo(player[i].coords, weapons[player[i].ally].position);
+                        player[i].lookyaw = player[i].targetyaw;
+                        player[i].aiupdatedelay = .05;
+                        player[i].forwardkeydown = 1;
+
+
+                        if (player[i].avoidcollided > .8 && !player[i].jumpkeydown && player[i].collided < .8) {
+                            if (!player[i].avoidsomething)
+                                player[i].targetyaw += 90 * (player[i].whichdirection * 2 - 1);
+                            else {
+                                XYZ leftpos, rightpos;
+                                float leftdist, rightdist;
+                                leftpos = player[i].coords + DoRotation(player[i].facing, 0, 90, 0);
+                                rightpos = player[i].coords - DoRotation(player[i].facing, 0, 90, 0);
                                 leftdist = distsq(&leftpos, &player[i].avoidwhere);
                                 rightdist = distsq(&rightpos, &player[i].avoidwhere);
-                                if(leftdist<rightdist)
-                                    player[i].targetyaw+=90;
+                                if (leftdist < rightdist)
+                                    player[i].targetyaw += 90;
                                 else
-                                    player[i].targetyaw-=90;
+                                    player[i].targetyaw -= 90;
                             }
                         }
                     }
 
-                player[i].leftkeydown=0;
-                player[i].backkeydown=0;
-                player[i].rightkeydown=0;
-                player[i].attackkeydown=0;
-                player[i].throwkeydown=1;
-                player[i].crouchkeydown=0;
-                if(player[i].animTarget!=crouchremoveknifeanim&&
-                        player[i].animTarget!=removeknifeanim)
-                    player[i].throwtogglekeydown=0;
-                player[i].drawkeydown=0;
-            }
-            if(player[i].collided<1||player[i].animTarget!=jumpupanim)
-                player[i].jumpkeydown=0;
-            if((player[i].collided>.8&&player[i].jumppower>=5))
-                player[i].jumpkeydown=1;
+                player[i].leftkeydown = 0;
+                player[i].backkeydown = 0;
+                player[i].rightkeydown = 0;
+                player[i].attackkeydown = 0;
+                player[i].throwkeydown = 1;
+                player[i].crouchkeydown = 0;
+                if (player[i].animTarget != crouchremoveknifeanim &&
+                        player[i].animTarget != removeknifeanim)
+                    player[i].throwtogglekeydown = 0;
+                player[i].drawkeydown = 0;
+            }
+            if (player[i].collided < 1 || player[i].animTarget != jumpupanim)
+                player[i].jumpkeydown = 0;
+            if ((player[i].collided > .8 && player[i].jumppower >= 5))
+                player[i].jumpkeydown = 1;
         }
 
-        if(player[i].aitype==attacktypecutoff){
-            player[i].aiupdatedelay-=multiplier;
+        if (player[i].aitype == attacktypecutoff) {
+            player[i].aiupdatedelay -= multiplier;
             //dodge or reverse rabbit kicks, knife throws, flips
-            if(player[i].damage<player[i].damagetolerance*2/3)
-                if((player[0].animTarget==rabbitkickanim||
-                            player[0].animTarget==knifethrowanim||
-                            (player[0].isFlip()&&
-                             normaldotproduct(player[0].facing,player[0].coords-player[i].coords)<0))&&
-                        !player[0].skeleton.free&&
-                        (player[i].aiupdatedelay<.1)){
-                    player[i].attackkeydown=0;
-                    if(player[i].isIdle())
-                        player[i].crouchkeydown=1;
-                    if(player[0].animTarget!=rabbitkickanim&&player[0].weaponactive!=-1){
-                        if(weapons[player[0].weaponids[0]].getType()==knife){
-                            if(player[i].isIdle()||player[i].isCrouch()||player[i].isRun()||player[i].isFlip()){
-                                if(abs(Random()%2==0))
+            if (player[i].damage < player[i].damagetolerance * 2 / 3)
+                if ((player[0].animTarget == rabbitkickanim ||
+                        player[0].animTarget == knifethrowanim ||
+                        (player[0].isFlip() &&
+                         normaldotproduct(player[0].facing, player[0].coords - player[i].coords) < 0)) &&
+                        !player[0].skeleton.free &&
+                        (player[i].aiupdatedelay < .1)) {
+                    player[i].attackkeydown = 0;
+                    if (player[i].isIdle())
+                        player[i].crouchkeydown = 1;
+                    if (player[0].animTarget != rabbitkickanim && player[0].weaponactive != -1) {
+                        if (weapons[player[0].weaponids[0]].getType() == knife) {
+                            if (player[i].isIdle() || player[i].isCrouch() || player[i].isRun() || player[i].isFlip()) {
+                                if (abs(Random() % 2 == 0))
                                     player[i].setAnimation(backhandspringanim);
                                 else
                                     player[i].setAnimation(rollanim);
-                                player[i].targetyaw+=90*(abs(Random()%2)*2-1);
-                                player[i].wentforweapon=0;
+                                player[i].targetyaw += 90 * (abs(Random() % 2) * 2 - 1);
+                                player[i].wentforweapon = 0;
                             }
-                            if(player[i].animTarget==jumpupanim||player[i].animTarget==jumpdownanim)
+                            if (player[i].animTarget == jumpupanim || player[i].animTarget == jumpdownanim)
                                 player[i].setAnimation(flipanim);
                         }
                     }
-                    player[i].forwardkeydown=0;
-                    player[i].aiupdatedelay=.02;
+                    player[i].forwardkeydown = 0;
+                    player[i].aiupdatedelay = .02;
                 }
             //get confused by flips
-            if(player[0].isFlip()&&
-                    !player[0].skeleton.free&&
-                    player[0].animTarget!=walljumprightkickanim&&
-                    player[0].animTarget!=walljumpleftkickanim){
-                if(distsq(&player[0].coords,&player[i].coords)<25)
-                    if((1-player[i].damage/player[i].damagetolerance)>.5)
-                        player[i].stunned=1;
+            if (player[0].isFlip() &&
+                    !player[0].skeleton.free &&
+                    player[0].animTarget != walljumprightkickanim &&
+                    player[0].animTarget != walljumpleftkickanim) {
+                if (distsq(&player[0].coords, &player[i].coords) < 25)
+                    if ((1 - player[i].damage / player[i].damagetolerance) > .5)
+                        player[i].stunned = 1;
             }
             //go for weapon on the ground
-            if(player[i].wentforweapon<3)
-                for(int k=0;k<weapons.size();k++)
-                    if(player[i].creature!=wolftype)
-                        if(player[i].num_weapons==0&&
-                                weapons[k].owner==-1&&
-                                weapons[i].velocity.x==0&&
-                                weapons[i].velocity.z==0&&
-                                weapons[i].velocity.y==0){
-                            if(distsq(&player[i].coords,&weapons[k].position)<16) {
+            if (player[i].wentforweapon < 3)
+                for (int k = 0; k < weapons.size(); k++)
+                    if (player[i].creature != wolftype)
+                        if (player[i].num_weapons == 0 &&
+                                weapons[k].owner == -1 &&
+                                weapons[i].velocity.x == 0 &&
+                                weapons[i].velocity.z == 0 &&
+                                weapons[i].velocity.y == 0) {
+                            if (distsq(&player[i].coords, &weapons[k].position) < 16) {
                                 player[i].wentforweapon++;
-                                player[i].lastchecktime=6;
-                                player[i].aitype=getweapontype;
-                                player[i].ally=-1;
+                                player[i].lastchecktime = 6;
+                                player[i].aitype = getweapontype;
+                                player[i].ally = -1;
                             }
                         }
             //dodge/reverse walljump kicks
-            if(player[i].damage<player[i].damagetolerance/2)
-                if(animation[player[i].animTarget].height!=highheight)
-                    if(player[i].damage<player[i].damagetolerance*.5&&
-                            ((player[0].animTarget==walljumprightkickanim||
-                              player[0].animTarget==walljumpleftkickanim)&&
-                             ((player[i].aiupdatedelay<.15&&
-                               difficulty==2)||
-                              (player[i].aiupdatedelay<.08&&
-                               difficulty!=2)))){
-                        player[i].crouchkeydown=1;
+            if (player[i].damage < player[i].damagetolerance / 2)
+                if (animation[player[i].animTarget].height != highheight)
+                    if (player[i].damage < player[i].damagetolerance * .5 &&
+                            ((player[0].animTarget == walljumprightkickanim ||
+                              player[0].animTarget == walljumpleftkickanim) &&
+                             ((player[i].aiupdatedelay < .15 &&
+                               difficulty == 2) ||
+                              (player[i].aiupdatedelay < .08 &&
+                               difficulty != 2)))) {
+                        player[i].crouchkeydown = 1;
                     }
             //walked off a ledge (?)
-            if(player[i].isRun()&&!player[i].onground)
-                if(player[i].coords.y>terrain.getHeight(player[i].coords.x,player[i].coords.z)+10){
-                    XYZ test2=player[i].coords+player[i].facing;
-                    test2.y+=5;
-                    XYZ test=player[i].coords+player[i].facing;
-                    test.y-=10;
-                    j=checkcollide(test2,test,player[i].laststanding);
-                    if(j==-1)
-                        j=checkcollide(test2,test);
-                    if(j==-1) {
-                        player[i].velocity=0;
+            if (player[i].isRun() && !player[i].onground)
+                if (player[i].coords.y > terrain.getHeight(player[i].coords.x, player[i].coords.z) + 10) {
+                    XYZ test2 = player[i].coords + player[i].facing;
+                    test2.y += 5;
+                    XYZ test = player[i].coords + player[i].facing;
+                    test.y -= 10;
+                    j = checkcollide(test2, test, player[i].laststanding);
+                    if (j == -1)
+                        j = checkcollide(test2, test);
+                    if (j == -1) {
+                        player[i].velocity = 0;
                         player[i].setAnimation(player[i].getStop());
-                        player[i].targetyaw+=180;
-                        player[i].stunned=.5;
-                        player[i].aitype=pathfindtype;
-                        player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint];
-                        player[i].finalpathfindpoint=-1;
-                        player[i].targetpathfindpoint=-1;
-                        player[i].lastpathfindpoint=-1;
-                        player[i].lastpathfindpoint2=-1;
-                        player[i].lastpathfindpoint3=-1;
-                        player[i].lastpathfindpoint4=-1;
+                        player[i].targetyaw += 180;
+                        player[i].stunned = .5;
+                        player[i].aitype = pathfindtype;
+                        player[i].finalfinaltarget = player[i].waypoints[player[i].waypoint];
+                        player[i].finalpathfindpoint = -1;
+                        player[i].targetpathfindpoint = -1;
+                        player[i].lastpathfindpoint = -1;
+                        player[i].lastpathfindpoint2 = -1;
+                        player[i].lastpathfindpoint3 = -1;
+                        player[i].lastpathfindpoint4 = -1;
                     } else
-                        player[i].laststanding=j;
+                        player[i].laststanding = j;
                 }
             //lose sight of player in the air (?)
-            if(player[0].coords.y>player[i].coords.y+5&&
-                    animation[player[0].animTarget].height!=highheight&&
-                    !player[0].onterrain){
-                player[i].aitype=pathfindtype;
-                player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint];
-                player[i].finalpathfindpoint=-1;
-                player[i].targetpathfindpoint=-1;
-                player[i].lastpathfindpoint=-1;
-                player[i].lastpathfindpoint2=-1;
-                player[i].lastpathfindpoint3=-1;
-                player[i].lastpathfindpoint4=-1;
+            if (player[0].coords.y > player[i].coords.y + 5 &&
+                    animation[player[0].animTarget].height != highheight &&
+                    !player[0].onterrain) {
+                player[i].aitype = pathfindtype;
+                player[i].finalfinaltarget = player[i].waypoints[player[i].waypoint];
+                player[i].finalpathfindpoint = -1;
+                player[i].targetpathfindpoint = -1;
+                player[i].lastpathfindpoint = -1;
+                player[i].lastpathfindpoint2 = -1;
+                player[i].lastpathfindpoint3 = -1;
+                player[i].lastpathfindpoint4 = -1;
             }
             //it's time to think (?)
-            if(player[i].aiupdatedelay<0&&
-                    !animation[player[i].animTarget].attack&&
-                    player[i].animTarget!=staggerbackhighanim&&
-                    player[i].animTarget!=staggerbackhardanim&&
-                    player[i].animTarget!=backhandspringanim&&
-                    player[i].animTarget!=dodgebackanim){
+            if (player[i].aiupdatedelay < 0 &&
+                    !animation[player[i].animTarget].attack &&
+                    player[i].animTarget != staggerbackhighanim &&
+                    player[i].animTarget != staggerbackhardanim &&
+                    player[i].animTarget != backhandspringanim &&
+                    player[i].animTarget != dodgebackanim) {
                 //draw weapon
-                if(player[i].weaponactive==-1&&player[i].num_weapons>0)
-                    player[i].drawkeydown=Random()%2;
+                if (player[i].weaponactive == -1 && player[i].num_weapons > 0)
+                    player[i].drawkeydown = Random() % 2;
                 else
-                    player[i].drawkeydown=0;
-                player[i].rabbitkickenabled=Random()%2;
+                    player[i].drawkeydown = 0;
+                player[i].rabbitkickenabled = Random() % 2;
                 //chase player
-                XYZ rotatetarget=player[0].coords+player[0].velocity;
-                XYZ targetpoint=player[0].coords;
-                if(distsq(&player[0].coords,&player[i].coords)<
-                        distsq(&rotatetarget,&player[i].coords))
-                    targetpoint+=player[0].velocity*
-                        findDistance(&player[0].coords,&player[i].coords)/findLength(&player[i].velocity);
-                player[i].targetyaw=roughDirectionTo(player[i].coords,targetpoint);
-                player[i].lookyaw=player[i].targetyaw;
-                player[i].aiupdatedelay=.2+fabs((float)(Random()%100)/1000);
-
-                if(distsq(&player[i].coords,&player[0].coords)>5&&(player[0].weaponactive==-1||player[i].weaponactive!=-1))
-                    player[i].forwardkeydown=1;
-                else if((distsq(&player[i].coords,&player[0].coords)>16||
-                            distsq(&player[i].coords,&player[0].coords)<9)&&
-                        player[0].weaponactive!=-1)
-                    player[i].forwardkeydown=1;
-                else if(Random()%6==0||(player[i].creature==wolftype&&Random()%3==0))
-                    player[i].forwardkeydown=1;
+                XYZ rotatetarget = player[0].coords + player[0].velocity;
+                XYZ targetpoint = player[0].coords;
+                if (distsq(&player[0].coords, &player[i].coords) <
+                        distsq(&rotatetarget, &player[i].coords))
+                    targetpoint += player[0].velocity *
+                                   findDistance(&player[0].coords, &player[i].coords) / findLength(&player[i].velocity);
+                player[i].targetyaw = roughDirectionTo(player[i].coords, targetpoint);
+                player[i].lookyaw = player[i].targetyaw;
+                player[i].aiupdatedelay = .2 + fabs((float)(Random() % 100) / 1000);
+
+                if (distsq(&player[i].coords, &player[0].coords) > 5 && (player[0].weaponactive == -1 || player[i].weaponactive != -1))
+                    player[i].forwardkeydown = 1;
+                else if ((distsq(&player[i].coords, &player[0].coords) > 16 ||
+                          distsq(&player[i].coords, &player[0].coords) < 9) &&
+                         player[0].weaponactive != -1)
+                    player[i].forwardkeydown = 1;
+                else if (Random() % 6 == 0 || (player[i].creature == wolftype && Random() % 3 == 0))
+                    player[i].forwardkeydown = 1;
                 else
-                    player[i].forwardkeydown=0;
+                    player[i].forwardkeydown = 0;
                 //chill out around the corpse
-                if(player[0].dead){
-                    player[i].forwardkeydown=0;
-                    if(Random()%10==0)
-                        player[i].forwardkeydown=1;
-                    if(Random()%100==0){
-                        player[i].aitype=pathfindtype;
-                        player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint];
-                        player[i].finalpathfindpoint=-1;
-                        player[i].targetpathfindpoint=-1;
-                        player[i].lastpathfindpoint=-1;
-                        player[i].lastpathfindpoint2=-1;
-                        player[i].lastpathfindpoint3=-1;
-                        player[i].lastpathfindpoint4=-1;
+                if (player[0].dead) {
+                    player[i].forwardkeydown = 0;
+                    if (Random() % 10 == 0)
+                        player[i].forwardkeydown = 1;
+                    if (Random() % 100 == 0) {
+                        player[i].aitype = pathfindtype;
+                        player[i].finalfinaltarget = player[i].waypoints[player[i].waypoint];
+                        player[i].finalpathfindpoint = -1;
+                        player[i].targetpathfindpoint = -1;
+                        player[i].lastpathfindpoint = -1;
+                        player[i].lastpathfindpoint2 = -1;
+                        player[i].lastpathfindpoint3 = -1;
+                        player[i].lastpathfindpoint4 = -1;
                     }
                 }
-                player[i].leftkeydown=0;
-                player[i].backkeydown=0;
-                player[i].rightkeydown=0;
-                player[i].crouchkeydown=0;
-                player[i].throwkeydown=0;
-
-                if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8)
-                    player[i].targetyaw+=90*(player[i].whichdirection*2-1);
+                player[i].leftkeydown = 0;
+                player[i].backkeydown = 0;
+                player[i].rightkeydown = 0;
+                player[i].crouchkeydown = 0;
+                player[i].throwkeydown = 0;
+
+                if (player[i].avoidcollided > .8 && !player[i].jumpkeydown && player[i].collided < .8)
+                    player[i].targetyaw += 90 * (player[i].whichdirection * 2 - 1);
                 //attack!!!
-                if(Random()%2==0||player[i].weaponactive!=-1||player[i].creature==wolftype)
-                    player[i].attackkeydown=1;
+                if (Random() % 2 == 0 || player[i].weaponactive != -1 || player[i].creature == wolftype)
+                    player[i].attackkeydown = 1;
                 else
-                    player[i].attackkeydown=0;
-                if(player[i].isRun()&&Random()%6&&distsq(&player[i].coords,&player[0].coords)>7)
-                    player[i].attackkeydown=0;
+                    player[i].attackkeydown = 0;
+                if (player[i].isRun() && Random() % 6 && distsq(&player[i].coords, &player[0].coords) > 7)
+                    player[i].attackkeydown = 0;
 
                 //TODO: wat
-                if(player[i].aitype!=playercontrolled&&
-                        (player[i].isIdle()||
-                         player[i].isCrouch()||
-                         player[i].isRun())){
-                    int target=-2;
-                    for(int j=0;j<numplayers;j++)
-                        if(j!=i&&!player[j].skeleton.free&&
-                                player[j].hasvictim&&
-                                (tutoriallevel==1&&reversaltrain||
-                                 Random()%2==0&&difficulty==2||
-                                 Random()%4==0&&difficulty==1||
-                                 Random()%8==0&&difficulty==0||
-                                 player[j].lastattack2==player[j].animTarget&&
-                                 player[j].lastattack3==player[j].animTarget&&
-                                 (Random()%2==0||difficulty==2)||
-                                 (player[i].isIdle()||player[i].isRun())&&
-                                 player[j].weaponactive!=-1||
-                                 player[j].animTarget==swordslashanim&&
-                                 player[i].weaponactive!=-1||
-                                 player[j].animTarget==staffhitanim||
-                                 player[j].animTarget==staffspinhitanim))
-                            if(distsq(&player[j].coords,&player[j].victim->coords)<4&&
-                                    player[j].victim==&player[i]&&
-                                    (player[j].animTarget==sweepanim||
-                                     player[j].animTarget==spinkickanim||
-                                     player[j].animTarget==staffhitanim||
-                                     player[j].animTarget==staffspinhitanim||
-                                     player[j].animTarget==winduppunchanim||
-                                     player[j].animTarget==upunchanim||
-                                     player[j].animTarget==wolfslapanim||
-                                     player[j].animTarget==knifeslashstartanim||
-                                     player[j].animTarget==swordslashanim&&
-                                      (distsq(&player[j].coords,&player[i].coords)<2||
-                                       player[i].weaponactive!=-1))){
-                                if(target>=0)
-                                    target=-1;
+                if (player[i].aitype != playercontrolled &&
+                        (player[i].isIdle() ||
+                         player[i].isCrouch() ||
+                         player[i].isRun())) {
+                    int target = -2;
+                    for (int j = 0; j < numplayers; j++)
+                        if (j != i && !player[j].skeleton.free &&
+                                player[j].hasvictim &&
+                                (tutoriallevel == 1 && reversaltrain ||
+                                 Random() % 2 == 0 && difficulty == 2 ||
+                                 Random() % 4 == 0 && difficulty == 1 ||
+                                 Random() % 8 == 0 && difficulty == 0 ||
+                                 player[j].lastattack2 == player[j].animTarget &&
+                                 player[j].lastattack3 == player[j].animTarget &&
+                                 (Random() % 2 == 0 || difficulty == 2) ||
+                                 (player[i].isIdle() || player[i].isRun()) &&
+                                 player[j].weaponactive != -1 ||
+                                 player[j].animTarget == swordslashanim &&
+                                 player[i].weaponactive != -1 ||
+                                 player[j].animTarget == staffhitanim ||
+                                 player[j].animTarget == staffspinhitanim))
+                            if (distsq(&player[j].coords, &player[j].victim->coords) < 4 &&
+                                    player[j].victim == &player[i] &&
+                                    (player[j].animTarget == sweepanim ||
+                                     player[j].animTarget == spinkickanim ||
+                                     player[j].animTarget == staffhitanim ||
+                                     player[j].animTarget == staffspinhitanim ||
+                                     player[j].animTarget == winduppunchanim ||
+                                     player[j].animTarget == upunchanim ||
+                                     player[j].animTarget == wolfslapanim ||
+                                     player[j].animTarget == knifeslashstartanim ||
+                                     player[j].animTarget == swordslashanim &&
+                                     (distsq(&player[j].coords, &player[i].coords) < 2 ||
+                                      player[i].weaponactive != -1))) {
+                                if (target >= 0)
+                                    target = -1;
                                 else
-                                    target=j;
+                                    target = j;
                             }
-                    if(target>=0)
+                    if (target >= 0)
                         player[target].Reverse();
                 }
 
-                if(player[i].collided<1)
-                    player[i].jumpkeydown=0;
-                if(player[i].collided>.8&&player[i].jumppower>=5||
-                        distsq(&player[i].coords,&player[0].coords)>400&&
-                        player[i].onterrain&&
-                        player[i].creature==rabbittype)
-                    player[i].jumpkeydown=1;
+                if (player[i].collided < 1)
+                    player[i].jumpkeydown = 0;
+                if (player[i].collided > .8 && player[i].jumppower >= 5 ||
+                        distsq(&player[i].coords, &player[0].coords) > 400 &&
+                        player[i].onterrain &&
+                        player[i].creature == rabbittype)
+                    player[i].jumpkeydown = 1;
                 //TODO: why are we controlling the human?
-                if(normaldotproduct(player[i].facing,player[0].coords-player[i].coords)>0)
-                    player[0].jumpkeydown=0;
-                if(player[0].animTarget==jumpdownanim&&
-                        distsq(&player[0].coords,&player[i].coords)<40)
-                    player[i].crouchkeydown=1;
-                if(player[i].jumpkeydown)
-                    player[i].attackkeydown=0;
-
-                if(tutoriallevel==1)
-                    if(!canattack)
-                        player[i].attackkeydown=0;
-
-
-                XYZ facing=player[i].coords;
-                XYZ flatfacing=player[0].coords;
-                facing.y+=player[i].jointPos(head).y*player[i].scale;
-                flatfacing.y+=player[0].jointPos(head).y*player[0].scale;
-                if(player[i].occluded>=2)
-                    if(-1!=checkcollide(facing,flatfacing)){
-                        if(!player[i].pause)
-                            player[i].lastseentime-=.2;
-                        if(player[i].lastseentime<=0&&
-                                (player[i].creature!=wolftype||
-                                 player[i].weaponstuck==-1)){
-                            player[i].aitype=searchtype;
-                            player[i].lastchecktime=12;
-                            player[i].lastseen=player[0].coords;
-                            player[i].lastseentime=12;
+                if (normaldotproduct(player[i].facing, player[0].coords - player[i].coords) > 0)
+                    player[0].jumpkeydown = 0;
+                if (player[0].animTarget == jumpdownanim &&
+                        distsq(&player[0].coords, &player[i].coords) < 40)
+                    player[i].crouchkeydown = 1;
+                if (player[i].jumpkeydown)
+                    player[i].attackkeydown = 0;
+
+                if (tutoriallevel == 1)
+                    if (!canattack)
+                        player[i].attackkeydown = 0;
+
+
+                XYZ facing = player[i].coords;
+                XYZ flatfacing = player[0].coords;
+                facing.y += player[i].jointPos(head).y * player[i].scale;
+                flatfacing.y += player[0].jointPos(head).y * player[0].scale;
+                if (player[i].occluded >= 2)
+                    if (-1 != checkcollide(facing, flatfacing)) {
+                        if (!player[i].pause)
+                            player[i].lastseentime -= .2;
+                        if (player[i].lastseentime <= 0 &&
+                                (player[i].creature != wolftype ||
+                                 player[i].weaponstuck == -1)) {
+                            player[i].aitype = searchtype;
+                            player[i].lastchecktime = 12;
+                            player[i].lastseen = player[0].coords;
+                            player[i].lastseentime = 12;
                         }
-                    }else
-                        player[i].lastseentime=1;
+                    } else
+                        player[i].lastseentime = 1;
             }
         }
-        if(animation[player[0].animTarget].height==highheight&&
-                (player[i].aitype==attacktypecutoff||
-                 player[i].aitype==searchtype))
-            if(player[0].coords.y>terrain.getHeight(player[0].coords.x,player[0].coords.z)+10){
-                XYZ test=player[0].coords;
-                test.y-=40;
-                if(-1==checkcollide(player[0].coords,test))
-                    player[i].stunned=1;
+        if (animation[player[0].animTarget].height == highheight &&
+                (player[i].aitype == attacktypecutoff ||
+                 player[i].aitype == searchtype))
+            if (player[0].coords.y > terrain.getHeight(player[0].coords.x, player[0].coords.z) + 10) {
+                XYZ test = player[0].coords;
+                test.y -= 40;
+                if (-1 == checkcollide(player[0].coords, test))
+                    player[i].stunned = 1;
             }
         //stunned
-        if(player[i].aitype==passivetype&&!(player[i].numwaypoints>1)||
-                player[i].stunned>0||
-                player[i].pause&&player[i].damage>player[i].superpermanentdamage){
-            if(player[i].pause)
-                player[i].lastseentime=1;
-            player[i].targetyaw=player[i].yaw;
-            player[i].forwardkeydown=0;
-            player[i].leftkeydown=0;
-            player[i].backkeydown=0;
-            player[i].rightkeydown=0;
-            player[i].jumpkeydown=0;
-            player[i].attackkeydown=0;
-            player[i].crouchkeydown=0;
-            player[i].throwkeydown=0;
+        if (player[i].aitype == passivetype && !(player[i].numwaypoints > 1) ||
+                player[i].stunned > 0 ||
+                player[i].pause && player[i].damage > player[i].superpermanentdamage) {
+            if (player[i].pause)
+                player[i].lastseentime = 1;
+            player[i].targetyaw = player[i].yaw;
+            player[i].forwardkeydown = 0;
+            player[i].leftkeydown = 0;
+            player[i].backkeydown = 0;
+            player[i].rightkeydown = 0;
+            player[i].jumpkeydown = 0;
+            player[i].attackkeydown = 0;
+            player[i].crouchkeydown = 0;
+            player[i].throwkeydown = 0;
         }
 
 
         XYZ facing;
-        facing=0;
-        facing.z=-1;
-
-        XYZ flatfacing=DoRotation(facing,0,player[i].yaw+180,0);
-        facing=flatfacing;
-
-        if(player[i].aitype==attacktypecutoff){
-            player[i].targetheadyaw=180-roughDirectionTo(player[i].coords,player[0].coords);
-            player[i].targetheadpitch=pitchTo(player[i].coords,player[0].coords);
-        }else if(player[i].howactive>=typesleeping){
-            player[i].targetheadyaw=player[i].targetyaw;
-            player[i].targetheadpitch=0;
-        }else{
-            if(player[i].interestdelay<=0){
-                player[i].interestdelay=.7+(float)(abs(Random()%100))/100;
-                player[i].headtarget=player[i].coords;
-                player[i].headtarget.x+=(float)(abs(Random()%200)-100)/100;
-                player[i].headtarget.z+=(float)(abs(Random()%200)-100)/100;
-                player[i].headtarget.y+=(float)(abs(Random()%200)-100)/300;
-                player[i].headtarget+=player[i].facing*1.5;
-            }
-            player[i].targetheadyaw=180-roughDirectionTo(player[i].coords,player[i].headtarget);
-            player[i].targetheadpitch=pitchTo(player[i].coords,player[i].headtarget);
+        facing = 0;
+        facing.z = -1;
+
+        XYZ flatfacing = DoRotation(facing, 0, player[i].yaw + 180, 0);
+        facing = flatfacing;
+
+        if (player[i].aitype == attacktypecutoff) {
+            player[i].targetheadyaw = 180 - roughDirectionTo(player[i].coords, player[0].coords);
+            player[i].targetheadpitch = pitchTo(player[i].coords, player[0].coords);
+        } else if (player[i].howactive >= typesleeping) {
+            player[i].targetheadyaw = player[i].targetyaw;
+            player[i].targetheadpitch = 0;
+        } else {
+            if (player[i].interestdelay <= 0) {
+                player[i].interestdelay = .7 + (float)(abs(Random() % 100)) / 100;
+                player[i].headtarget = player[i].coords;
+                player[i].headtarget.x += (float)(abs(Random() % 200) - 100) / 100;
+                player[i].headtarget.z += (float)(abs(Random() % 200) - 100) / 100;
+                player[i].headtarget.y += (float)(abs(Random() % 200) - 100) / 300;
+                player[i].headtarget += player[i].facing * 1.5;
+            }
+            player[i].targetheadyaw = 180 - roughDirectionTo(player[i].coords, player[i].headtarget);
+            player[i].targetheadpitch = pitchTo(player[i].coords, player[i].headtarget);
         }
     }
 }
 
 
 
-void updateSettingsMenu(){
+void updateSettingsMenu()
+{
     char sbuf[256];
-    if((float)newscreenwidth>(float)newscreenheight*1.61||(float)newscreenwidth<(float)newscreenheight*1.59)
-        sprintf (sbuf, "Resolution: %d*%d",(int)newscreenwidth,(int)newscreenheight);
+    if ((float)newscreenwidth > (float)newscreenheight * 1.61 || (float)newscreenwidth < (float)newscreenheight * 1.59)
+        sprintf (sbuf, "Resolution: %d*%d", (int)newscreenwidth, (int)newscreenheight);
     else
-        sprintf (sbuf, "Resolution: %d*%d (widescreen)",(int)newscreenwidth,(int)newscreenheight);
-    Menu::setText(0,sbuf);
-    if(newdetail==0) Menu::setText(1,"Detail: Low");
-    if(newdetail==1) Menu::setText(1,"Detail: Medium");
-    if(newdetail==2) Menu::setText(1,"Detail: High");
-    if(bloodtoggle==0) Menu::setText(2,"Blood: Off");
-    if(bloodtoggle==1) Menu::setText(2,"Blood: On, low detail");
-    if(bloodtoggle==2) Menu::setText(2,"Blood: On, high detail (slower)");
-    if(difficulty==0) Menu::setText(3,"Difficulty: Easier");
-    if(difficulty==1) Menu::setText(3,"Difficulty: Difficult");
-    if(difficulty==2) Menu::setText(3,"Difficulty: Insane");
-    Menu::setText(4,ismotionblur?"Blur Effects: Enabled (less compatible)":"Blur Effects: Disabled (more compatible)");
-    Menu::setText(5,decals?"Decals: Enabled (slower)":"Decals: Disabled");
-    Menu::setText(6,musictoggle?"Music: Enabled":"Music: Disabled");
-    Menu::setText(9,invertmouse?"Invert mouse: Yes":"Invert mouse: No");
-    sprintf (sbuf, "Mouse Speed: %d", (int)(usermousesensitivity*5));
-    Menu::setText(10,sbuf);
-    sprintf (sbuf, "Volume: %d%%", (int)(volume*100));
-    Menu::setText(11,sbuf);
-    Menu::setText(13,showdamagebar?"Damage Bar: On":"Damage Bar: Off");
-    if(newdetail==detail&&newscreenheight==(int)screenheight&&newscreenwidth==(int)screenwidth)
+        sprintf (sbuf, "Resolution: %d*%d (widescreen)", (int)newscreenwidth, (int)newscreenheight);
+    Menu::setText(0, sbuf);
+    if (newdetail == 0) Menu::setText(1, "Detail: Low");
+    if (newdetail == 1) Menu::setText(1, "Detail: Medium");
+    if (newdetail == 2) Menu::setText(1, "Detail: High");
+    if (bloodtoggle == 0) Menu::setText(2, "Blood: Off");
+    if (bloodtoggle == 1) Menu::setText(2, "Blood: On, low detail");
+    if (bloodtoggle == 2) Menu::setText(2, "Blood: On, high detail (slower)");
+    if (difficulty == 0) Menu::setText(3, "Difficulty: Easier");
+    if (difficulty == 1) Menu::setText(3, "Difficulty: Difficult");
+    if (difficulty == 2) Menu::setText(3, "Difficulty: Insane");
+    Menu::setText(4, ismotionblur ? "Blur Effects: Enabled (less compatible)" : "Blur Effects: Disabled (more compatible)");
+    Menu::setText(5, decals ? "Decals: Enabled (slower)" : "Decals: Disabled");
+    Menu::setText(6, musictoggle ? "Music: Enabled" : "Music: Disabled");
+    Menu::setText(9, invertmouse ? "Invert mouse: Yes" : "Invert mouse: No");
+    sprintf (sbuf, "Mouse Speed: %d", (int)(usermousesensitivity * 5));
+    Menu::setText(10, sbuf);
+    sprintf (sbuf, "Volume: %d%%", (int)(volume * 100));
+    Menu::setText(11, sbuf);
+    Menu::setText(13, showdamagebar ? "Damage Bar: On" : "Damage Bar: Off");
+    if (newdetail == detail && newscreenheight == (int)screenheight && newscreenwidth == (int)screenwidth)
         sprintf (sbuf, "Back");
     else
         sprintf (sbuf, "Back (some changes take effect next time Lugaru is opened)");
-    Menu::setText(8,sbuf);
+    Menu::setText(8, sbuf);
 }
 
-void updateStereoConfigMenu(){
+void updateStereoConfigMenu()
+{
     char sbuf[256];
     sprintf(sbuf, "Stereo mode: %s", StereoModeName(newstereomode));
-    Menu::setText(0,sbuf);
+    Menu::setText(0, sbuf);
     sprintf(sbuf, "Stereo separation: %.3f", stereoseparation);
-    Menu::setText(1,sbuf);
+    Menu::setText(1, sbuf);
     sprintf(sbuf, "Reverse stereo: %s", stereoreverse ? "Yes" : "No");
-    Menu::setText(2,sbuf);
+    Menu::setText(2, sbuf);
 }
 
-void updateControlsMenu(){
-    Menu::setText(0,(string)"Forwards: "+(keyselect==0?"_":Input::keyToChar(forwardkey)));
-    Menu::setText(1,(string)"Back: "    +(keyselect==1?"_":Input::keyToChar(backkey)));
-    Menu::setText(2,(string)"Left: "    +(keyselect==2?"_":Input::keyToChar(leftkey)));
-    Menu::setText(3,(string)"Right: "   +(keyselect==3?"_":Input::keyToChar(rightkey)));
-    Menu::setText(4,(string)"Crouch: "  +(keyselect==4?"_":Input::keyToChar(crouchkey)));
-    Menu::setText(5,(string)"Jump: "    +(keyselect==5?"_":Input::keyToChar(jumpkey)));
-    Menu::setText(6,(string)"Draw: "    +(keyselect==6?"_":Input::keyToChar(drawkey)));
-    Menu::setText(7,(string)"Throw: "   +(keyselect==7?"_":Input::keyToChar(throwkey)));
-    Menu::setText(8,(string)"Attack: "  +(keyselect==8?"_":Input::keyToChar(attackkey)));
-    if(debugmode)
-        Menu::setText(9,(string)"Console: "+(keyselect==9?"_":Input::keyToChar(consolekey)));
+void updateControlsMenu()
+{
+    Menu::setText(0, (string)"Forwards: " + (keyselect == 0 ? "_" : Input::keyToChar(forwardkey)));
+    Menu::setText(1, (string)"Back: "    + (keyselect == 1 ? "_" : Input::keyToChar(backkey)));
+    Menu::setText(2, (string)"Left: "    + (keyselect == 2 ? "_" : Input::keyToChar(leftkey)));
+    Menu::setText(3, (string)"Right: "   + (keyselect == 3 ? "_" : Input::keyToChar(rightkey)));
+    Menu::setText(4, (string)"Crouch: "  + (keyselect == 4 ? "_" : Input::keyToChar(crouchkey)));
+    Menu::setText(5, (string)"Jump: "    + (keyselect == 5 ? "_" : Input::keyToChar(jumpkey)));
+    Menu::setText(6, (string)"Draw: "    + (keyselect == 6 ? "_" : Input::keyToChar(drawkey)));
+    Menu::setText(7, (string)"Throw: "   + (keyselect == 7 ? "_" : Input::keyToChar(throwkey)));
+    Menu::setText(8, (string)"Attack: "  + (keyselect == 8 ? "_" : Input::keyToChar(attackkey)));
+    if (debugmode)
+        Menu::setText(9, (string)"Console: " + (keyselect == 9 ? "_" : Input::keyToChar(consolekey)));
 }
 
 /*
@@ -5558,599 +5750,604 @@ Values of mainmenu :
 18 stereo configuration
 */
 
-void Game::LoadMenu(){
+void Game::LoadMenu()
+{
     Menu::clearMenu();
-    switch(mainmenu) {
-        case 1:
-        case 2:
-            Menu::addImage(0,Mainmenuitems[0],150,480-128,256,128);
-            Menu::addButtonImage(1,Mainmenuitems[mainmenu==1?1:5],18,480-152-32,128,32);
-            Menu::addButtonImage(2,Mainmenuitems[2],18,480-228-32,112,32);
-            Menu::addButtonImage(3,Mainmenuitems[mainmenu==1?3:6],18,480-306-32,mainmenu==1?68:132,32);
+    switch (mainmenu) {
+    case 1:
+    case 2:
+        Menu::addImage(0, Mainmenuitems[0], 150, 480 - 128, 256, 128);
+        Menu::addButtonImage(1, Mainmenuitems[mainmenu == 1 ? 1 : 5], 18, 480 - 152 - 32, 128, 32);
+        Menu::addButtonImage(2, Mainmenuitems[2], 18, 480 - 228 - 32, 112, 32);
+        Menu::addButtonImage(3, Mainmenuitems[mainmenu == 1 ? 3 : 6], 18, 480 - 306 - 32, mainmenu == 1 ? 68 : 132, 32);
         break;
-        case 3:
-            Menu::addButton( 0,"",10+20,440);
-            Menu::addButton( 1,"",10+60,405);
-            Menu::addButton( 2,"",10+70,370);
-            Menu::addButton( 3,"",10+20-1000,335-1000);
-            Menu::addButton( 4,"",10   ,335);
-            Menu::addButton( 5,"",10+60,300);
-            Menu::addButton( 6,"",10+70,265);
-            Menu::addButton( 9,"",10   ,230);
-            Menu::addButton(10,"",20   ,195);
-            Menu::addButton(11,"",10+60,160);
-            Menu::addButton(13,"",30   ,125);
-            Menu::addButton( 7,"-Configure Controls-",10+15, 90);
-            Menu::addButton(12,"-Configure Stereo -",10+15, 55);
-            Menu::addButton(8,"Back",10,10);
-            updateSettingsMenu();
+    case 3:
+        Menu::addButton( 0, "", 10 + 20, 440);
+        Menu::addButton( 1, "", 10 + 60, 405);
+        Menu::addButton( 2, "", 10 + 70, 370);
+        Menu::addButton( 3, "", 10 + 20 - 1000, 335 - 1000);
+        Menu::addButton( 4, "", 10   , 335);
+        Menu::addButton( 5, "", 10 + 60, 300);
+        Menu::addButton( 6, "", 10 + 70, 265);
+        Menu::addButton( 9, "", 10   , 230);
+        Menu::addButton(10, "", 20   , 195);
+        Menu::addButton(11, "", 10 + 60, 160);
+        Menu::addButton(13, "", 30   , 125);
+        Menu::addButton( 7, "-Configure Controls-", 10 + 15, 90);
+        Menu::addButton(12, "-Configure Stereo -", 10 + 15, 55);
+        Menu::addButton(8, "Back", 10, 10);
+        updateSettingsMenu();
         break;
-        case 4:
-            Menu::addButton(0,"",10   ,400);
-            Menu::addButton(1,"",10+40,360);
-            Menu::addButton(2,"",10+40,320);
-            Menu::addButton(3,"",10+30,280);
-            Menu::addButton(4,"",10+20,240);
-            Menu::addButton(5,"",10+40,200);
-            Menu::addButton(6,"",10+40,160);
-            Menu::addButton(7,"",10+30,120);
-            Menu::addButton(8,"",10+20,80);
-            if(debugmode)
-                Menu::addButton(9,"",10+10,40);
-            Menu::addButton(debugmode?10:9,"Back",10,10);
-            updateControlsMenu();
+    case 4:
+        Menu::addButton(0, "", 10   , 400);
+        Menu::addButton(1, "", 10 + 40, 360);
+        Menu::addButton(2, "", 10 + 40, 320);
+        Menu::addButton(3, "", 10 + 30, 280);
+        Menu::addButton(4, "", 10 + 20, 240);
+        Menu::addButton(5, "", 10 + 40, 200);
+        Menu::addButton(6, "", 10 + 40, 160);
+        Menu::addButton(7, "", 10 + 30, 120);
+        Menu::addButton(8, "", 10 + 20, 80);
+        if (debugmode)
+            Menu::addButton(9, "", 10 + 10, 40);
+        Menu::addButton(debugmode ? 10 : 9, "Back", 10, 10);
+        updateControlsMenu();
         break;
-        case 5: {
-            LoadCampaign();
-            Menu::addLabel(-1,accountactive->getName(),5,400);
-            Menu::addButton(1,"Tutorial",5,300);
-            Menu::addButton(2,"Challenge",5,240);
-            Menu::addButton(3,"Delete User",400,10);
-            Menu::addButton(4,"Main Menu",5,10);
-            Menu::addButton(5,"Change User",5,180);
-            Menu::addButton(6,"Campaign : "+accountactive->getCurrentCampaign(),200,420);
-
-            //show campaign map
-            //with (2,-5) offset from old code
-            Menu::addImage(-1,Mainmenuitems[7],150+2,60-5,400,400);
-            //show levels
-            int numlevels = accountactive->getCampaignChoicesMade();
-            numlevels += numlevels>0 ? campaignlevels[numlevels-1].nextlevel.size() : 1;
-            for(int i=0;i<numlevels;i++){
-                XYZ midpoint=campaignlevels[i].getCenter();
-                float itemsize=campaignlevels[i].getWidth();
-                const bool active=i>=accountactive->getCampaignChoicesMade();
-                if(!active)
-                    itemsize/=2;
-
-                if(i>=1){
-                    XYZ start=campaignlevels[i-1].getCenter();
-                    Menu::addMapLine(start.x,start.y,midpoint.x-start.x,midpoint.y-start.y,0.5,active?1:0.5,active?1:0.5,0,0);
-                }
-                Menu::addMapMarker(NB_CAMPAIGN_MENU_ITEM+i, Mapcircletexture,
-                        midpoint.x-itemsize/2, midpoint.y-itemsize/2, itemsize, itemsize, active?1:0.5, 0, 0);
+    case 5: {
+        LoadCampaign();
+        Menu::addLabel(-1, accountactive->getName(), 5, 400);
+        Menu::addButton(1, "Tutorial", 5, 300);
+        Menu::addButton(2, "Challenge", 5, 240);
+        Menu::addButton(3, "Delete User", 400, 10);
+        Menu::addButton(4, "Main Menu", 5, 10);
+        Menu::addButton(5, "Change User", 5, 180);
+        Menu::addButton(6, "Campaign : " + accountactive->getCurrentCampaign(), 200, 420);
+
+        //show campaign map
+        //with (2,-5) offset from old code
+        Menu::addImage(-1, Mainmenuitems[7], 150 + 2, 60 - 5, 400, 400);
+        //show levels
+        int numlevels = accountactive->getCampaignChoicesMade();
+        numlevels += numlevels > 0 ? campaignlevels[numlevels - 1].nextlevel.size() : 1;
+        for (int i = 0; i < numlevels; i++) {
+            XYZ midpoint = campaignlevels[i].getCenter();
+            float itemsize = campaignlevels[i].getWidth();
+            const bool active = i >= accountactive->getCampaignChoicesMade();
+            if (!active)
+                itemsize /= 2;
+
+            if (i >= 1) {
+                XYZ start = campaignlevels[i - 1].getCenter();
+                Menu::addMapLine(start.x, start.y, midpoint.x - start.x, midpoint.y - start.y, 0.5, active ? 1 : 0.5, active ? 1 : 0.5, 0, 0);
+            }
+            Menu::addMapMarker(NB_CAMPAIGN_MENU_ITEM + i, Mapcircletexture,
+                               midpoint.x - itemsize / 2, midpoint.y - itemsize / 2, itemsize, itemsize, active ? 1 : 0.5, 0, 0);
 
-                if(active){
-                    Menu::addMapLabel(-2,campaignlevels[i].description,
-                            campaignlevels[i].getStartX()+10,
-                            campaignlevels[i].getStartY()-4);
-                }
+            if (active) {
+                Menu::addMapLabel(-2, campaignlevels[i].description,
+                                  campaignlevels[i].getStartX() + 10,
+                                  campaignlevels[i].getStartY() - 4);
             }
-        } break;
-        case 6:
-            Menu::addLabel(-1,"Are you sure you want to delete this user?",10,400);
-            Menu::addButton(1,"Yes",10,360);
-            Menu::addButton(2,"No",10,320);
-            break;
-        case 7:
-            if(Account::getNbAccounts()<8)
-                Menu::addButton(0,"New User",10,400);
-            else
-                Menu::addLabel(0,"No More Users",10,400);
-            Menu::addLabel(-2,"",20,400);
-            Menu::addButton(Account::getNbAccounts()+1,"Back",10,10);
-            for(int i=0;i<Account::getNbAccounts();i++)
-                Menu::addButton(i+1,Account::get(i)->getName(),10,340-20*(i+1));
-            break;
-        case 8:
-            Menu::addButton(0,"Easier",10,400);
-            Menu::addButton(1,"Difficult",10,360);
-            Menu::addButton(2,"Insane",10,320);
-            break;
-        case 9:
-            for(int i=0;i<numchallengelevels;i++){
-                char temp[255];
-                string name="";
-                sprintf (temp, "Level %d",i+1);
-                for(int j=strlen(temp);j<17;j++)
-                        strcat(temp," ");
-                name+=temp;
-                sprintf (temp, "%d",(int)accountactive->getHighScore(i));
-                for(int j=strlen(temp);j<(32-17);j++)
-                        strcat(temp," ");
-                name+=temp;
-                sprintf (temp, "%d:",(int)(((int)accountactive->getFastTime(i)-(int)(accountactive->getFastTime(i))%60)/60));
-                if((int)(accountactive->getFastTime(i))%60<10)strcat(temp,"0");
-                name+=temp;
-                sprintf (temp, "%d",(int)(accountactive->getFastTime(i))%60);
-                name+=temp;
-
-                Menu::addButton(i,name,10,400-i*25,i>accountactive->getProgress()?0.5:1,0,0);
-            }
-
-            Menu::addButton(-1,"             High Score      Best Time",10,440);
-            Menu::addButton(numchallengelevels,"Back",10,10);
-            break;
-        case 10: {
-            Menu::addLabel(0,"Congratulations!",220,330);
-            Menu::addLabel(1,"You have avenged your family and",140,300);
-            Menu::addLabel(2,"restored peace to the island of Lugaru.",110,270);
-            Menu::addButton(3,"Back",10,10);
-            char sbuf[256];
-            sprintf(sbuf,"Your score:         %d",(int)accountactive->getCampaignScore());
-            Menu::addLabel(4,sbuf,190,200);
-            sprintf(sbuf,"Highest score:      %d",(int)accountactive->getCampaignHighScore());
-            Menu::addLabel(5,sbuf,190,180);
-        } break;
-        case 18:
-            Menu::addButton(0,"",70,400);
-            Menu::addButton(1,"",10,360);
-            Menu::addButton(2,"",40,320);
-            Menu::addButton(3,"Back",10,10);
-            updateStereoConfigMenu();
+        }
+    }
+    break;
+    case 6:
+        Menu::addLabel(-1, "Are you sure you want to delete this user?", 10, 400);
+        Menu::addButton(1, "Yes", 10, 360);
+        Menu::addButton(2, "No", 10, 320);
+        break;
+    case 7:
+        if (Account::getNbAccounts() < 8)
+            Menu::addButton(0, "New User", 10, 400);
+        else
+            Menu::addLabel(0, "No More Users", 10, 400);
+        Menu::addLabel(-2, "", 20, 400);
+        Menu::addButton(Account::getNbAccounts() + 1, "Back", 10, 10);
+        for (int i = 0; i < Account::getNbAccounts(); i++)
+            Menu::addButton(i + 1, Account::get(i)->getName(), 10, 340 - 20 * (i + 1));
+        break;
+    case 8:
+        Menu::addButton(0, "Easier", 10, 400);
+        Menu::addButton(1, "Difficult", 10, 360);
+        Menu::addButton(2, "Insane", 10, 320);
+        break;
+    case 9:
+        for (int i = 0; i < numchallengelevels; i++) {
+            char temp[255];
+            string name = "";
+            sprintf (temp, "Level %d", i + 1);
+            for (int j = strlen(temp); j < 17; j++)
+                strcat(temp, " ");
+            name += temp;
+            sprintf (temp, "%d", (int)accountactive->getHighScore(i));
+            for (int j = strlen(temp); j < (32 - 17); j++)
+                strcat(temp, " ");
+            name += temp;
+            sprintf (temp, "%d:", (int)(((int)accountactive->getFastTime(i) - (int)(accountactive->getFastTime(i)) % 60) / 60));
+            if ((int)(accountactive->getFastTime(i)) % 60 < 10)strcat(temp, "0");
+            name += temp;
+            sprintf (temp, "%d", (int)(accountactive->getFastTime(i)) % 60);
+            name += temp;
+
+            Menu::addButton(i, name, 10, 400 - i * 25, i > accountactive->getProgress() ? 0.5 : 1, 0, 0);
+        }
+
+        Menu::addButton(-1, "             High Score      Best Time", 10, 440);
+        Menu::addButton(numchallengelevels, "Back", 10, 10);
+        break;
+    case 10: {
+        Menu::addLabel(0, "Congratulations!", 220, 330);
+        Menu::addLabel(1, "You have avenged your family and", 140, 300);
+        Menu::addLabel(2, "restored peace to the island of Lugaru.", 110, 270);
+        Menu::addButton(3, "Back", 10, 10);
+        char sbuf[256];
+        sprintf(sbuf, "Your score:         %d", (int)accountactive->getCampaignScore());
+        Menu::addLabel(4, sbuf, 190, 200);
+        sprintf(sbuf, "Highest score:      %d", (int)accountactive->getCampaignHighScore());
+        Menu::addLabel(5, sbuf, 190, 180);
+    }
+    break;
+    case 18:
+        Menu::addButton(0, "", 70, 400);
+        Menu::addButton(1, "", 10, 360);
+        Menu::addButton(2, "", 40, 320);
+        Menu::addButton(3, "Back", 10, 10);
+        updateStereoConfigMenu();
         break;
     }
 }
 
 extern SDL_Rect **resolutions;
 
-void MenuTick(){
+void MenuTick()
+{
     //menu buttons
-    selected=Menu::getSelected(mousecoordh*640/screenwidth,480-mousecoordv*480/screenheight);
+    selected = Menu::getSelected(mousecoordh * 640 / screenwidth, 480 - mousecoordv * 480 / 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 ((mainmenu == 5) && (endgame == 2)) {
+        accountactive->endGame();
+        endgame = 0;
+    }
+    if (mainmenu == 10)
+        endgame = 2;
+    if (mainmenu == 18 && Input::isKeyPressed(MOUSEBUTTON2) && selected == 1) {
+        stereoseparation -= 0.001;
         updateStereoConfigMenu();
     }
 
-    static int oldmainmenu=mainmenu;
+    static int oldmainmenu = mainmenu;
 
     char sbuf[256];
 
-    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:
-                                               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(!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;
-                                                       }
-                                               }
-                                               break;
-                                       case 7: // controls
-                                               flash();
-                                               mainmenu=4;
-                                               selected=-1;
-                                               keyselect=-1;
-                                               break;
-                                       case 8:
-                                               flash();
-                                               SaveSettings();
-                                               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;
-                               }
-                updateSettingsMenu();
-                               break;
-                       case 4:
-                               if(!waiting) {
-                                       fireSound();
-                                       if(selected<(debugmode?10:9) && keyselect==-1)
-                                               keyselect=selected;
-                                       if(keyselect!=-1)
-                                               setKeySelected();
-                                       if(selected==(debugmode?10:9)){
-                                               flash();
-                                               mainmenu=3;
-                                       }
-                               }
-                updateControlsMenu();
-                               break;
-                       case 5:
-                               fireSound();
-                               flash();
-                               if((selected-NB_CAMPAIGN_MENU_ITEM >= accountactive->getCampaignChoicesMade())) {
-                                       startbonustotal=0;
-
-                                       loading=2;
-                                       loadtime=0;
-                                       targetlevel=7;
-                                       if(firstload)
-                                               TickOnceAfter();
-                                       else
-                                               LoadStuff();
-                                       whichchoice=selected-NB_CAMPAIGN_MENU_ITEM-accountactive->getCampaignChoicesMade();
-                                       actuallevel=(accountactive->getCampaignChoicesMade()>0?campaignlevels[accountactive->getCampaignChoicesMade()-1].nextlevel[whichchoice]:0);
-                                       visibleloading=1;
-                                       stillloading=1;
-                                       Loadlevel(campaignlevels[actuallevel].mapname.c_str());
-                                       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();
-                                               } else
-                                                       LoadStuff();
-                                               Loadlevel(-1);
-
-                                               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;
-                                       case 6:
-                                               vector<string> campaigns = ListCampaigns();
-                                               vector<string>::iterator c;
-                                               if ((c = find(campaigns.begin(),campaigns.end(),accountactive->getCurrentCampaign()))==campaigns.end()) {
-                                                       if(!campaigns.empty())
-                                                               accountactive->setCurrentCampaign(campaigns.front());
-                                               } else {
-                                                       c++;
-                                                       if(c==campaigns.end())
-                                                               c=campaigns.begin();
-                                                       accountactive->setCurrentCampaign(*c);
-                                               }
-                                               LoadMenu();
-                                               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();
-                    if(accountactive)
-                        mainmenu=5;
-                    else
-                        mainmenu=1;
-                                       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();
-
-                                       startbonustotal=0;
-
-                                       loading=2;
-                                       loadtime=0;
-                                       targetlevel=selected;
-                                       if(firstload)
-                                               TickOnceAfter();
-                                       else
-                                               LoadStuff();
-                                       Loadlevel(selected);
-                                       campaign=0;
-
-                                       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);
-                                       }
-                               }
-                updateStereoConfigMenu();
-                               break;
-               }
-       }
-
-    if(Input::isKeyDown(SDLK_q) && Input::isKeyDown(SDLK_LMETA)){
-        tryquit=1;
-        if(mainmenu==3) {
+    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:
+                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 (!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;
+                    }
+                }
+                break;
+            case 7: // controls
+                flash();
+                mainmenu = 4;
+                selected = -1;
+                keyselect = -1;
+                break;
+            case 8:
+                flash();
+                SaveSettings();
+                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;
+            }
+            updateSettingsMenu();
+            break;
+        case 4:
+            if (!waiting) {
+                fireSound();
+                if (selected < (debugmode ? 10 : 9) && keyselect == -1)
+                    keyselect = selected;
+                if (keyselect != -1)
+                    setKeySelected();
+                if (selected == (debugmode ? 10 : 9)) {
+                    flash();
+                    mainmenu = 3;
+                }
+            }
+            updateControlsMenu();
+            break;
+        case 5:
+            fireSound();
+            flash();
+            if ((selected - NB_CAMPAIGN_MENU_ITEM >= accountactive->getCampaignChoicesMade())) {
+                startbonustotal = 0;
+
+                loading = 2;
+                loadtime = 0;
+                targetlevel = 7;
+                if (firstload)
+                    TickOnceAfter();
+                else
+                    LoadStuff();
+                whichchoice = selected - NB_CAMPAIGN_MENU_ITEM - accountactive->getCampaignChoicesMade();
+                actuallevel = (accountactive->getCampaignChoicesMade() > 0 ? campaignlevels[accountactive->getCampaignChoicesMade() - 1].nextlevel[whichchoice] : 0);
+                visibleloading = 1;
+                stillloading = 1;
+                Loadlevel(campaignlevels[actuallevel].mapname.c_str());
+                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();
+                } else
+                    LoadStuff();
+                Loadlevel(-1);
+
+                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;
+            case 6:
+                vector<string> campaigns = ListCampaigns();
+                vector<string>::iterator c;
+                if ((c = find(campaigns.begin(), campaigns.end(), accountactive->getCurrentCampaign())) == campaigns.end()) {
+                    if (!campaigns.empty())
+                        accountactive->setCurrentCampaign(campaigns.front());
+                } else {
+                    c++;
+                    if (c == campaigns.end())
+                        c = campaigns.begin();
+                    accountactive->setCurrentCampaign(*c);
+                }
+                LoadMenu();
+                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();
+                if (accountactive)
+                    mainmenu = 5;
+                else
+                    mainmenu = 1;
+                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();
+
+                startbonustotal = 0;
+
+                loading = 2;
+                loadtime = 0;
+                targetlevel = selected;
+                if (firstload)
+                    TickOnceAfter();
+                else
+                    LoadStuff();
+                Loadlevel(selected);
+                campaign = 0;
+
+                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);
+                }
+            }
+            updateStereoConfigMenu();
+            break;
+        }
+    }
+
+    if (Input::isKeyDown(SDLK_q) && Input::isKeyDown(SDLK_LMETA)) {
+        tryquit = 1;
+        if (mainmenu == 3) {
             SaveSettings();
         }
     }
 
     OPENAL_SetFrequency(channels[stream_menutheme], 22050);
 
-    if(entername){
-        inputText(displaytext[0],&displayselected,&displaychars[0]);
-        if(!waiting) { // the input as finished
-            if(displaychars[0]){ // with enter
+    if (entername) {
+        inputText(displaytext[0], &displayselected, &displaychars[0]);
+        if (!waiting) { // the input as finished
+            if (displaychars[0]) { // with enter
                 accountactive = Account::add(string(displaytext[0]));
 
-                mainmenu=8;
+                mainmenu = 8;
 
                 flash();
 
                 fireSound(firestartsound);
 
-                for(int i=0;i<255;i++){
-                    displaytext[0][i]=0;
+                for (int i = 0; i < 255; i++) {
+                    displaytext[0][i] = 0;
                 }
-                displaychars[0]=0;
+                displaychars[0] = 0;
 
-                displayselected=0;
+                displayselected = 0;
             }
-            entername=0;
+            entername = 0;
             LoadMenu();
         }
-        
-        displayblinkdelay-=multiplier;
-        if(displayblinkdelay<=0){
-            displayblinkdelay=.3;
-            displayblink=1-displayblink;
+
+        displayblinkdelay -= multiplier;
+        if (displayblinkdelay <= 0) {
+            displayblinkdelay = .3;
+            displayblink = 1 - displayblink;
         }
     }
 
-    if(entername){
-        Menu::setText(0,displaytext[0],20,400,-1,-1);
-        Menu::setText(-2,displayblink?"_":"",20+displayselected*10,400,-1,-1);
+    if (entername) {
+        Menu::setText(0, displaytext[0], 20, 400, -1, -1);
+        Menu::setText(-2, displayblink ? "_" : "", 20 + displayselected * 10, 400, -1, -1);
     }
 
-    if(oldmainmenu!=mainmenu)
+    if (oldmainmenu != mainmenu)
         LoadMenu();
-       oldmainmenu=mainmenu;
+    oldmainmenu = mainmenu;
 
 }
 
-void Game::Tick(){
-       static XYZ facing,flatfacing;
-       static int target;
+void Game::Tick()
+{
+    static XYZ facing, flatfacing;
+    static int target;
 
-       for(int i=0;i<15;i++){
-               displaytime[i]+=multiplier;
-       }
+    for (int i = 0; i < 15; i++) {
+        displaytime[i] += multiplier;
+    }
 
-       keyboardfrozen=false;
+    keyboardfrozen = false;
     Input::Tick();
 
-       if(Input::isKeyPressed(SDLK_F6)){
-               if(Input::isKeyDown(SDLK_LSHIFT))
-                       stereoreverse=true;
-               else
-                       stereoreverse=false;
-
-               if(stereoreverse)
-                       printf("Stereo reversed\n");
-               else
-                       printf("Stereo unreversed\n");
-       }
-
-       if(Input::isKeyDown(SDLK_F7)){
-               if(Input::isKeyDown(SDLK_LSHIFT))
-                       stereoseparation -= 0.001;
-               else
-                       stereoseparation -= 0.010;
-               printf("Stereo decreased increased to %f\n", stereoseparation);
-       }
-
-       if(Input::isKeyDown(SDLK_F8)){
-               if(Input::isKeyDown(SDLK_LSHIFT))
-                       stereoseparation += 0.001;
-               else
-                       stereoseparation += 0.010;
-               printf("Stereo separation increased to %f\n", stereoseparation);
-       }
-
-
-       if(Input::isKeyPressed(SDLK_TAB)&&tutoriallevel){
-               if(tutorialstage!=51)
-                       tutorialstagetime=tutorialmaxtime;
-               emit_sound_np(consolefailsound, 128.);
-       }
+    if (Input::isKeyPressed(SDLK_F6)) {
+        if (Input::isKeyDown(SDLK_LSHIFT))
+            stereoreverse = true;
+        else
+            stereoreverse = false;
+
+        if (stereoreverse)
+            printf("Stereo reversed\n");
+        else
+            printf("Stereo unreversed\n");
+    }
+
+    if (Input::isKeyDown(SDLK_F7)) {
+        if (Input::isKeyDown(SDLK_LSHIFT))
+            stereoseparation -= 0.001;
+        else
+            stereoseparation -= 0.010;
+        printf("Stereo decreased increased to %f\n", stereoseparation);
+    }
+
+    if (Input::isKeyDown(SDLK_F8)) {
+        if (Input::isKeyDown(SDLK_LSHIFT))
+            stereoseparation += 0.001;
+        else
+            stereoseparation += 0.010;
+        printf("Stereo separation increased to %f\n", stereoseparation);
+    }
+
+
+    if (Input::isKeyPressed(SDLK_TAB) && tutoriallevel) {
+        if (tutorialstage != 51)
+            tutorialstagetime = tutorialmaxtime;
+        emit_sound_np(consolefailsound, 128.);
+    }
 
     /*
     Values of mainmenu :
@@ -6167,324 +6364,327 @@ void Game::Tick(){
     11 Same that 9 ??? => unused
     18 stereo configuration
     */
-        
-       if(!console) {
+
+    if (!console) {
         //campaign over?
-               if(mainmenu&&endgame==1)
-            mainmenu=10;
+        if (mainmenu && endgame == 1)
+            mainmenu = 10;
         //go to level select after completing a campaign level
-        if(campaign&&winfreeze&&mainmenu==0&&campaignlevels[actuallevel].choosenext==1) {
-            mainmenu=5;
-            gameon=0;
-            winfreeze=0;
+        if (campaign && winfreeze && mainmenu == 0 && campaignlevels[actuallevel].choosenext == 1) {
+            mainmenu = 5;
+            gameon = 0;
+            winfreeze = 0;
             fireSound();
             flash();
-            if(musictoggle) {
+            if (musictoggle) {
                 OPENAL_SetFrequency(OPENAL_ALL, 0.001);
                 emit_stream_np(stream_menutheme);
                 pause_sound(leveltheme);
             }
-                       LoadMenu();
+            LoadMenu();
         }
         //escape key pressed
-               if(Input::isKeyPressed(SDLK_ESCAPE)&&
-                (gameon||mainmenu==0||(mainmenu>=3&&mainmenu!=8&&!(mainmenu==7&&entername)))) {
-                       selected=-1;
-            if(mainmenu==0&&!winfreeze)
-                mainmenu=2; //pause
-            else if(mainmenu==1||mainmenu==2){
-                mainmenu=0; //unpause
+        if (Input::isKeyPressed(SDLK_ESCAPE) &&
+                (gameon || mainmenu == 0 || (mainmenu >= 3 && mainmenu != 8 && !(mainmenu == 7 && entername)))) {
+            selected = -1;
+            if (mainmenu == 0 && !winfreeze)
+                mainmenu = 2; //pause
+            else if (mainmenu == 1 || mainmenu == 2) {
+                mainmenu = 0; //unpause
             }
             //play menu theme
-            if(musictoggle&&(mainmenu==1||mainmenu==2)){
+            if (musictoggle && (mainmenu == 1 || mainmenu == 2)) {
                 OPENAL_SetFrequency(OPENAL_ALL, 0.001);
                 emit_stream_np(stream_menutheme);
                 pause_sound(leveltheme);
             }
             //on resume, play level music
-            if(!mainmenu){
+            if (!mainmenu) {
                 pause_sound(stream_menutheme);
                 resume_stream(leveltheme);
             }
             //finished with settings menu
-                       if(mainmenu==3){
-                               SaveSettings();
-                       }
+            if (mainmenu == 3) {
+                SaveSettings();
+            }
             //effects
-                       if(mainmenu>=3&&mainmenu!=8){
-                               fireSound();
-                               flash();
-                       }
+            if (mainmenu >= 3 && mainmenu != 8) {
+                fireSound();
+                flash();
+            }
             //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:
-                    mainmenu=5; break;
-            }
-               }
-       }
-
-       if(mainmenu) {
+            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:
+                mainmenu = 5;
+                break;
+            }
+        }
+    }
+
+    if (mainmenu) {
         MenuTick();
-       }
+    }
 
-       if(!mainmenu) {
-               if(hostile==1)hostiletime+=multiplier;
-               else hostiletime=0;
-               if(!winfreeze)leveltime+=multiplier;
+    if (!mainmenu) {
+        if (hostile == 1)hostiletime += multiplier;
+        else hostiletime = 0;
+        if (!winfreeze)leveltime += multiplier;
 
         //keys
-               if(Input::isKeyPressed(SDLK_v)&&debugmode){
-                       freeze=1-freeze;
-                       if(freeze){
-                               OPENAL_SetFrequency(OPENAL_ALL, 0.001);
-                       }
-               }
-
-               if(Input::isKeyPressed(chatkey)&&!console&&!chatting&&debugmode)
-                       chatting=1;
-
-               if(chatting){
-                       inputText(displaytext[0],&displayselected,&displaychars[0]);
-                       if(!waiting) {
-                               if(displaychars[0]){
-                                       for(int j=0;j<255;j++)
-                                               displaytext[0][j]=0;
-                                       displaychars[0]=0;
-                                       displayselected=0;
-                               }       
-                               chatting=0;             
-                       }
-
-                       displayblinkdelay-=multiplier;
-                       if(displayblinkdelay<=0){
-                               displayblinkdelay=.3;
-                               displayblink=1-displayblink;
-                       }
-               }
-               if(chatting)
-            keyboardfrozen=true;
-
-               if(Input::isKeyPressed(consolekey)&&debugmode) {
-                       console=!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) {
-                               if(consolechars[0]>0) {
-                    consoletext[0][consolechars[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)
+            chatting = 1;
+
+        if (chatting) {
+            inputText(displaytext[0], &displayselected, &displaychars[0]);
+            if (!waiting) {
+                if (displaychars[0]) {
+                    for (int j = 0; j < 255; j++)
+                        displaytext[0][j] = 0;
+                    displaychars[0] = 0;
+                    displayselected = 0;
+                }
+                chatting = 0;
+            }
+
+            displayblinkdelay -= multiplier;
+            if (displayblinkdelay <= 0) {
+                displayblinkdelay = .3;
+                displayblink = 1 - displayblink;
+            }
+        }
+        if (chatting)
+            keyboardfrozen = true;
+
+        if (Input::isKeyPressed(consolekey) && debugmode) {
+            console = !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) {
+                if (consolechars[0] > 0) {
+                    consoletext[0][consolechars[0]] = '\0';
                     cmd_dispatch(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) {
-                               SaveSettings();
-                       }
-               }
-
-               static int oldwinfreeze;
-               if(winfreeze&&!oldwinfreeze){
-                       OPENAL_SetFrequency(OPENAL_ALL, 0.001);
-                       emit_sound_np(consolesuccesssound);
-               }
-               if(winfreeze==0)
-            oldwinfreeze=winfreeze;
-               else
+                    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) {
+                SaveSettings();
+            }
+        }
+
+        static int oldwinfreeze;
+        if (winfreeze && !oldwinfreeze) {
+            OPENAL_SetFrequency(OPENAL_ALL, 0.001);
+            emit_sound_np(consolesuccesssound);
+        }
+        if (winfreeze == 0)
+            oldwinfreeze = winfreeze;
+        else
             oldwinfreeze++;
 
-               if((Input::isKeyPressed(jumpkey)||Input::isKeyPressed(SDLK_SPACE))&&!campaign)
-                       if(winfreeze)
-                winfreeze=0;
-               if((Input::isKeyDown(SDLK_ESCAPE))&&!campaign&&gameon){
-            if(console){
-                console=false;
-                freeze=0;
-            } else if(winfreeze) {
-                               mainmenu=9;
-                               gameon=0;
-                       }
+        if ((Input::isKeyPressed(jumpkey) || Input::isKeyPressed(SDLK_SPACE)) && !campaign)
+            if (winfreeze)
+                winfreeze = 0;
+        if ((Input::isKeyDown(SDLK_ESCAPE)) && !campaign && gameon) {
+            if (console) {
+                console = false;
+                freeze = 0;
+            } else if (winfreeze) {
+                mainmenu = 9;
+                gameon = 0;
+            }
         }
 
 
 
-               if(!freeze&&!winfreeze&&!(mainmenu&&gameon)&&(gameon||!gamestarted)){
+        if (!freeze && !winfreeze && !(mainmenu && gameon) && (gameon || !gamestarted)) {
 
             //dialogues
             static float talkdelay = 0;
 
-                       if(indialogue!=-1)
-                talkdelay=1;
-                       talkdelay-=multiplier;
+            if (indialogue != -1)
+                talkdelay = 1;
+            talkdelay -= multiplier;
 
-                       if(talkdelay<=0&&indialogue==-1&&animation[player[0].animTarget].height!=highheight)
-                for(int i=0;i<numdialogues;i++){
+            if (talkdelay <= 0 && indialogue == -1 && animation[player[0].animTarget].height != highheight)
+                for (int i = 0; i < numdialogues; i++) {
                     int realdialoguetype;
                     bool special;
-                    if(dialoguetype[i]>49){
-                        realdialoguetype=dialoguetype[i]-50;
-                        special=1;
+                    if (dialoguetype[i] > 49) {
+                        realdialoguetype = dialoguetype[i] - 50;
+                        special = 1;
+                    } else if (dialoguetype[i] > 39) {
+                        realdialoguetype = dialoguetype[i] - 40;
+                        special = 1;
+                    } else if (dialoguetype[i] > 29) {
+                        realdialoguetype = dialoguetype[i] - 30;
+                        special = 1;
+                    } else if (dialoguetype[i] > 19) {
+                        realdialoguetype = dialoguetype[i] - 20;
+                        special = 1;
+                    } else if (dialoguetype[i] > 9) {
+                        realdialoguetype = dialoguetype[i] - 10;
+                        special = 1;
+                    } else {
+                        realdialoguetype = dialoguetype[i];
+                        special = 0;
                     }
-                    else if(dialoguetype[i]>39){
-                        realdialoguetype=dialoguetype[i]-40;
-                        special=1;
-                    }
-                    else if(dialoguetype[i]>29){
-                        realdialoguetype=dialoguetype[i]-30;
-                        special=1;
-                    }
-                    else if(dialoguetype[i]>19){
-                        realdialoguetype=dialoguetype[i]-20;
-                        special=1;
-                    }
-                    else if(dialoguetype[i]>9){
-                        realdialoguetype=dialoguetype[i]-10;
-                        special=1;
-                    }
-                    else {
-                        realdialoguetype=dialoguetype[i];
-                        special=0;
-                    }
-                    if((!hostile||dialoguetype[i]>40&&dialoguetype[i]<50)&&
-                            realdialoguetype<numplayers&&
-                            realdialoguetype>0&&
-                            (dialoguegonethrough[i]==0||!special)&&
-                            (special||Input::isKeyPressed(attackkey))){
-                        if(distsq(&player[0].coords,&player[realdialoguetype].coords)<6||
-                                player[realdialoguetype].howactive>=typedead1||
-                                dialoguetype[i]>40&&dialoguetype[i]<50){
-                            whichdialogue=i;
-                            for(int j=0;j<numdialogueboxes[whichdialogue];j++){
-                                player[participantfocus[whichdialogue][j]].coords=participantlocation[whichdialogue][participantfocus[whichdialogue][j]];
-                                player[participantfocus[whichdialogue][j]].yaw=participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
-                                player[participantfocus[whichdialogue][j]].targetyaw=participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
-                                player[participantfocus[whichdialogue][j]].velocity=0;
-                                player[participantfocus[whichdialogue][j]].animTarget=player[participantfocus[whichdialogue][j]].getIdle();
-                                player[participantfocus[whichdialogue][j]].frameTarget=0;
+                    if ((!hostile || dialoguetype[i] > 40 && dialoguetype[i] < 50) &&
+                            realdialoguetype < numplayers &&
+                            realdialoguetype > 0 &&
+                            (dialoguegonethrough[i] == 0 || !special) &&
+                            (special || Input::isKeyPressed(attackkey))) {
+                        if (distsq(&player[0].coords, &player[realdialoguetype].coords) < 6 ||
+                                player[realdialoguetype].howactive >= typedead1 ||
+                                dialoguetype[i] > 40 && dialoguetype[i] < 50) {
+                            whichdialogue = i;
+                            for (int j = 0; j < numdialogueboxes[whichdialogue]; j++) {
+                                player[participantfocus[whichdialogue][j]].coords = participantlocation[whichdialogue][participantfocus[whichdialogue][j]];
+                                player[participantfocus[whichdialogue][j]].yaw = participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
+                                player[participantfocus[whichdialogue][j]].targetyaw = participantyaw[whichdialogue][participantfocus[whichdialogue][j]];
+                                player[participantfocus[whichdialogue][j]].velocity = 0;
+                                player[participantfocus[whichdialogue][j]].animTarget = player[participantfocus[whichdialogue][j]].getIdle();
+                                player[participantfocus[whichdialogue][j]].frameTarget = 0;
                             }
-                            directing=0;
-                            indialogue=0;
-                            dialoguetime=0;
+                            directing = 0;
+                            indialogue = 0;
+                            dialoguetime = 0;
                             dialoguegonethrough[i]++;
-                            if(dialogueboxsound[whichdialogue][indialogue]!=0){
+                            if (dialogueboxsound[whichdialogue][indialogue] != 0) {
                                 playdialogueboxsound();
                             }
                         }
                     }
                 }
 
-            windvar+=multiplier;
-            smoketex+=multiplier;
-            tutorialstagetime+=multiplier;
+            windvar += multiplier;
+            smoketex += multiplier;
+            tutorialstagetime += multiplier;
 
             //hotspots
             static float hotspotvisual[40];
-            if(numhotspots){
+            if (numhotspots) {
                 XYZ hotspotsprite;
-                if(editorenabled)
-                    for(int i=0;i<numhotspots;i++)
-                        hotspotvisual[i]-=multiplier/320;
+                if (editorenabled)
+                    for (int i = 0; i < numhotspots; i++)
+                        hotspotvisual[i] -= multiplier / 320;
 
-                for(int i=0;i<numhotspots;i++){
+                for (int i = 0; i < numhotspots; i++) {
                     //if(hotspottype[i]<=10)
-                    while(hotspotvisual[i]<0){
-                        hotspotsprite=0;
-                        hotspotsprite.x=float(abs(Random()%100000))/100000*hotspotsize[i];
-                        hotspotsprite=DoRotation(hotspotsprite,0,0,Random()%360);
-                        hotspotsprite=DoRotation(hotspotsprite,0,Random()%360,0);
-                        hotspotsprite+=hotspot[i];
-                        Sprite::MakeSprite(breathsprite, hotspotsprite, hotspotsprite*0, 1,0.5,0, 7, 0.4);
-                        hotspotvisual[i]+=0.1/hotspotsize[i]/hotspotsize[i]/hotspotsize[i];
+                    while (hotspotvisual[i] < 0) {
+                        hotspotsprite = 0;
+                        hotspotsprite.x = float(abs(Random() % 100000)) / 100000 * hotspotsize[i];
+                        hotspotsprite = DoRotation(hotspotsprite, 0, 0, Random() % 360);
+                        hotspotsprite = DoRotation(hotspotsprite, 0, Random() % 360, 0);
+                        hotspotsprite += hotspot[i];
+                        Sprite::MakeSprite(breathsprite, hotspotsprite, hotspotsprite * 0, 1, 0.5, 0, 7, 0.4);
+                        hotspotvisual[i] += 0.1 / hotspotsize[i] / hotspotsize[i] / hotspotsize[i];
                     }
                 }
 
-                for(int i=0;i<numhotspots;i++){
-                    if(hotspottype[i]<=10&&hotspottype[i]>0){
-                        hotspot[i]=player[hotspottype[i]].coords;
+                for (int i = 0; i < numhotspots; i++) {
+                    if (hotspottype[i] <= 10 && hotspottype[i] > 0) {
+                        hotspot[i] = player[hotspottype[i]].coords;
                     }
                 }
             }
 
             //Tutorial
-            if(tutoriallevel){
+            if (tutoriallevel) {
                 doTutorial();
             }
 
             //bonuses
-            if(tutoriallevel!=1){
-                if(bonustime==0&&
-                        bonus!=solidhit&&
-                        bonus!=spinecrusher&&
-                        bonus!=tracheotomy&&
-                        bonus!=backstab&&
-                        bonusvalue>10){
+            if (tutoriallevel != 1) {
+                if (bonustime == 0 &&
+                        bonus != solidhit &&
+                        bonus != spinecrusher &&
+                        bonus != tracheotomy &&
+                        bonus != backstab &&
+                        bonusvalue > 10) {
                     emit_sound_np(consolesuccesssound);
                 }
-            } else if(bonustime==0){
+            } else if (bonustime == 0) {
                 emit_sound_np(fireendsound);
             }
-            if(bonustime==0){
-                if(bonus!=solidhit&&
-                        bonus!=twoxcombo&&
-                        bonus!=threexcombo&&
-                        bonus!=fourxcombo&&
-                        bonus!=megacombo)
+            if (bonustime == 0) {
+                if (bonus != solidhit &&
+                        bonus != twoxcombo &&
+                        bonus != threexcombo &&
+                        bonus != fourxcombo &&
+                        bonus != megacombo)
                     bonusnum[bonus]++;
                 else
-                    bonusnum[bonus]+=0.15;
-                if(tutoriallevel)
-                    bonusvalue=0;
-                bonusvalue/=bonusnum[bonus];
-                bonustotal+=bonusvalue;
+                    bonusnum[bonus] += 0.15;
+                if (tutoriallevel)
+                    bonusvalue = 0;
+                bonusvalue /= bonusnum[bonus];
+                bonustotal += bonusvalue;
             }
-            bonustime+=multiplier;
+            bonustime += multiplier;
 
             //snow effects
-            if(environment==snowyenvironment){
-                precipdelay-=multiplier;
-                while(precipdelay<0){
-                    precipdelay+=.04;
-                    if(!detail)
-                        precipdelay+=.04;
-                    XYZ footvel,footpoint;
-
-                    footvel=0;
-                    footpoint=viewer+viewerfacing*6;
-                    footpoint.y+=((float)abs(Random()%1200))/100-6;
-                    footpoint.x+=((float)abs(Random()%1200))/100-6;
-                    footpoint.z+=((float)abs(Random()%1200))/100-6;
-                    Sprite::MakeSprite(snowsprite, footpoint,footvel, 1,1,1, .1, 1);
+            if (environment == snowyenvironment) {
+                precipdelay -= multiplier;
+                while (precipdelay < 0) {
+                    precipdelay += .04;
+                    if (!detail)
+                        precipdelay += .04;
+                    XYZ footvel, footpoint;
+
+                    footvel = 0;
+                    footpoint = viewer + viewerfacing * 6;
+                    footpoint.y += ((float)abs(Random() % 1200)) / 100 - 6;
+                    footpoint.x += ((float)abs(Random() % 1200)) / 100 - 6;
+                    footpoint.z += ((float)abs(Random() % 1200)) / 100 - 6;
+                    Sprite::MakeSprite(snowsprite, footpoint, footvel, 1, 1, 1, .1, 1);
                 }
             }
 
@@ -6495,194 +6695,192 @@ void Game::Tick(){
             static XYZ oldviewer;
 
             //control keys
-            if(indialogue==-1){
-                player[0].forwardkeydown=Input::isKeyDown(forwardkey);
-                player[0].leftkeydown=Input::isKeyDown(leftkey);
-                player[0].backkeydown=Input::isKeyDown(backkey);
-                player[0].rightkeydown=Input::isKeyDown(rightkey);
-                player[0].jumpkeydown=Input::isKeyDown(jumpkey);
-                player[0].crouchkeydown=Input::isKeyDown(crouchkey);
-                player[0].drawkeydown=Input::isKeyDown(drawkey);
-                player[0].throwkeydown=Input::isKeyDown(throwkey);
+            if (indialogue == -1) {
+                player[0].forwardkeydown = Input::isKeyDown(forwardkey);
+                player[0].leftkeydown = Input::isKeyDown(leftkey);
+                player[0].backkeydown = Input::isKeyDown(backkey);
+                player[0].rightkeydown = Input::isKeyDown(rightkey);
+                player[0].jumpkeydown = Input::isKeyDown(jumpkey);
+                player[0].crouchkeydown = Input::isKeyDown(crouchkey);
+                player[0].drawkeydown = Input::isKeyDown(drawkey);
+                player[0].throwkeydown = Input::isKeyDown(throwkey);
+            } else {
+                player[0].forwardkeydown = 0;
+                player[0].leftkeydown = 0;
+                player[0].backkeydown = 0;
+                player[0].rightkeydown = 0;
+                player[0].jumpkeydown = 0;
+                player[0].crouchkeydown = 0;
+                player[0].drawkeydown = 0;
+                player[0].throwkeydown = 0;
             }
-            else
-            {
-                player[0].forwardkeydown=0;
-                player[0].leftkeydown=0;
-                player[0].backkeydown=0;
-                player[0].rightkeydown=0;
-                player[0].jumpkeydown=0;
-                player[0].crouchkeydown=0;
-                player[0].drawkeydown=0;
-                player[0].throwkeydown=0;
-            }
-
-            if(!player[0].jumpkeydown)
-                player[0].jumpclimb=0;
-
-
-            if(indialogue!=-1){
-                cameramode=1;
-                if(directing){
-                    facing=0;
-                    facing.z=-1;
-
-                    facing=DoRotation(facing,-pitch,0,0);
-                    facing=DoRotation(facing,0,0-yaw,0);
-
-                    flatfacing=0;
-                    flatfacing.z=-1;
-
-                    flatfacing=DoRotation(flatfacing,0,-yaw,0);
-
-                    if(Input::isKeyDown(forwardkey))
-                        viewer+=facing*multiplier*4;
-                    if(Input::isKeyDown(backkey))
-                        viewer-=facing*multiplier*4;
-                    if(Input::isKeyDown(leftkey))
-                        viewer+=DoRotation(flatfacing*multiplier,0,90,0)*4;
-                    if(Input::isKeyDown(rightkey))
-                        viewer+=DoRotation(flatfacing*multiplier,0,-90,0)*4;
-                    if(Input::isKeyDown(jumpkey))
-                        viewer.y+=multiplier*4;
-                    if(Input::isKeyDown(crouchkey))
-                        viewer.y-=multiplier*4;
-                    if(     Input::isKeyPressed(SDLK_1)||
-                            Input::isKeyPressed(SDLK_2)||
-                            Input::isKeyPressed(SDLK_3)||
-                            Input::isKeyPressed(SDLK_4)||
-                            Input::isKeyPressed(SDLK_5)||
-                            Input::isKeyPressed(SDLK_6)||
-                            Input::isKeyPressed(SDLK_7)||
-                            Input::isKeyPressed(SDLK_8)||
-                            Input::isKeyPressed(SDLK_9)||
-                            Input::isKeyPressed(SDLK_0)||
-                            Input::isKeyPressed(SDLK_MINUS)){
+
+            if (!player[0].jumpkeydown)
+                player[0].jumpclimb = 0;
+
+
+            if (indialogue != -1) {
+                cameramode = 1;
+                if (directing) {
+                    facing = 0;
+                    facing.z = -1;
+
+                    facing = DoRotation(facing, -pitch, 0, 0);
+                    facing = DoRotation(facing, 0, 0 - yaw, 0);
+
+                    flatfacing = 0;
+                    flatfacing.z = -1;
+
+                    flatfacing = DoRotation(flatfacing, 0, -yaw, 0);
+
+                    if (Input::isKeyDown(forwardkey))
+                        viewer += facing * multiplier * 4;
+                    if (Input::isKeyDown(backkey))
+                        viewer -= facing * multiplier * 4;
+                    if (Input::isKeyDown(leftkey))
+                        viewer += DoRotation(flatfacing * multiplier, 0, 90, 0) * 4;
+                    if (Input::isKeyDown(rightkey))
+                        viewer += DoRotation(flatfacing * multiplier, 0, -90, 0) * 4;
+                    if (Input::isKeyDown(jumpkey))
+                        viewer.y += multiplier * 4;
+                    if (Input::isKeyDown(crouchkey))
+                        viewer.y -= multiplier * 4;
+                    if (     Input::isKeyPressed(SDLK_1) ||
+                             Input::isKeyPressed(SDLK_2) ||
+                             Input::isKeyPressed(SDLK_3) ||
+                             Input::isKeyPressed(SDLK_4) ||
+                             Input::isKeyPressed(SDLK_5) ||
+                             Input::isKeyPressed(SDLK_6) ||
+                             Input::isKeyPressed(SDLK_7) ||
+                             Input::isKeyPressed(SDLK_8) ||
+                             Input::isKeyPressed(SDLK_9) ||
+                             Input::isKeyPressed(SDLK_0) ||
+                             Input::isKeyPressed(SDLK_MINUS)) {
                         int whichend;
-                        if(Input::isKeyPressed(SDLK_1))whichend=1;
-                        if(Input::isKeyPressed(SDLK_2))whichend=2;
-                        if(Input::isKeyPressed(SDLK_3))whichend=3;
-                        if(Input::isKeyPressed(SDLK_4))whichend=4;
-                        if(Input::isKeyPressed(SDLK_5))whichend=5;
-                        if(Input::isKeyPressed(SDLK_6))whichend=6;
-                        if(Input::isKeyPressed(SDLK_7))whichend=7;
-                        if(Input::isKeyPressed(SDLK_8))whichend=8;
-                        if(Input::isKeyPressed(SDLK_9))whichend=9;
-                        if(Input::isKeyPressed(SDLK_0))whichend=0;
-                        if(Input::isKeyPressed(SDLK_MINUS))
-                            whichend=-1;
-                        if(whichend!=-1){
-                            participantfocus[whichdialogue][indialogue]=whichend;
-                            participantlocation[whichdialogue][whichend]=player[whichend].coords;
-                            participantyaw[whichdialogue][whichend]=player[whichend].yaw;
+                        if (Input::isKeyPressed(SDLK_1))whichend = 1;
+                        if (Input::isKeyPressed(SDLK_2))whichend = 2;
+                        if (Input::isKeyPressed(SDLK_3))whichend = 3;
+                        if (Input::isKeyPressed(SDLK_4))whichend = 4;
+                        if (Input::isKeyPressed(SDLK_5))whichend = 5;
+                        if (Input::isKeyPressed(SDLK_6))whichend = 6;
+                        if (Input::isKeyPressed(SDLK_7))whichend = 7;
+                        if (Input::isKeyPressed(SDLK_8))whichend = 8;
+                        if (Input::isKeyPressed(SDLK_9))whichend = 9;
+                        if (Input::isKeyPressed(SDLK_0))whichend = 0;
+                        if (Input::isKeyPressed(SDLK_MINUS))
+                            whichend = -1;
+                        if (whichend != -1) {
+                            participantfocus[whichdialogue][indialogue] = whichend;
+                            participantlocation[whichdialogue][whichend] = player[whichend].coords;
+                            participantyaw[whichdialogue][whichend] = player[whichend].yaw;
                         }
-                        if(whichend==-1){
-                            participantfocus[whichdialogue][indialogue]=-1;
+                        if (whichend == -1) {
+                            participantfocus[whichdialogue][indialogue] = -1;
                         }
-                        if(player[participantfocus[whichdialogue][indialogue]].dead){
-                            indialogue=-1;
-                            directing=0;
-                            cameramode=0;
+                        if (player[participantfocus[whichdialogue][indialogue]].dead) {
+                            indialogue = -1;
+                            directing = 0;
+                            cameramode = 0;
                         }
-                        dialoguecamera[whichdialogue][indialogue]=viewer;
-                        dialoguecamerayaw[whichdialogue][indialogue]=yaw;
-                        dialoguecamerapitch[whichdialogue][indialogue]=pitch;
+                        dialoguecamera[whichdialogue][indialogue] = viewer;
+                        dialoguecamerayaw[whichdialogue][indialogue] = yaw;
+                        dialoguecamerapitch[whichdialogue][indialogue] = pitch;
                         indialogue++;
-                        if(indialogue<numdialogueboxes[whichdialogue]){
-                            if(dialogueboxsound[whichdialogue][indialogue]!=0){
+                        if (indialogue < numdialogueboxes[whichdialogue]) {
+                            if (dialogueboxsound[whichdialogue][indialogue] != 0) {
                                 playdialogueboxsound();
                             }
                         }
 
-                        for(int j=0;j<numplayers;j++){
-                            participantfacing[whichdialogue][indialogue][j]=participantfacing[whichdialogue][indialogue-1][j];
+                        for (int j = 0; j < numplayers; j++) {
+                            participantfacing[whichdialogue][indialogue][j] = participantfacing[whichdialogue][indialogue - 1][j];
                         }
                     }
                     //TODO: should these be KeyDown or KeyPressed?
-                    if(     Input::isKeyDown(SDLK_KP1)||
-                            Input::isKeyDown(SDLK_KP2)||
-                            Input::isKeyDown(SDLK_KP3)||
-                            Input::isKeyDown(SDLK_KP4)||
-                            Input::isKeyDown(SDLK_KP5)||
-                            Input::isKeyDown(SDLK_KP6)||
-                            Input::isKeyDown(SDLK_KP7)||
-                            Input::isKeyDown(SDLK_KP8)||
-                            Input::isKeyDown(SDLK_KP9)||
-                            Input::isKeyDown(SDLK_KP0)){
+                    if (     Input::isKeyDown(SDLK_KP1) ||
+                             Input::isKeyDown(SDLK_KP2) ||
+                             Input::isKeyDown(SDLK_KP3) ||
+                             Input::isKeyDown(SDLK_KP4) ||
+                             Input::isKeyDown(SDLK_KP5) ||
+                             Input::isKeyDown(SDLK_KP6) ||
+                             Input::isKeyDown(SDLK_KP7) ||
+                             Input::isKeyDown(SDLK_KP8) ||
+                             Input::isKeyDown(SDLK_KP9) ||
+                             Input::isKeyDown(SDLK_KP0)) {
                         int whichend;
-                        if(Input::isKeyDown(SDLK_KP1))whichend=1;
-                        if(Input::isKeyDown(SDLK_KP2))whichend=2;
-                        if(Input::isKeyDown(SDLK_KP3))whichend=3;
-                        if(Input::isKeyDown(SDLK_KP4))whichend=4;
-                        if(Input::isKeyDown(SDLK_KP5))whichend=5;
-                        if(Input::isKeyDown(SDLK_KP6))whichend=6;
-                        if(Input::isKeyDown(SDLK_KP7))whichend=7;
-                        if(Input::isKeyDown(SDLK_KP8))whichend=8;
-                        if(Input::isKeyDown(SDLK_KP9))whichend=9;
-                        if(Input::isKeyDown(SDLK_KP0))whichend=0;
-                        participantfacing[whichdialogue][indialogue][whichend]=facing;
+                        if (Input::isKeyDown(SDLK_KP1))whichend = 1;
+                        if (Input::isKeyDown(SDLK_KP2))whichend = 2;
+                        if (Input::isKeyDown(SDLK_KP3))whichend = 3;
+                        if (Input::isKeyDown(SDLK_KP4))whichend = 4;
+                        if (Input::isKeyDown(SDLK_KP5))whichend = 5;
+                        if (Input::isKeyDown(SDLK_KP6))whichend = 6;
+                        if (Input::isKeyDown(SDLK_KP7))whichend = 7;
+                        if (Input::isKeyDown(SDLK_KP8))whichend = 8;
+                        if (Input::isKeyDown(SDLK_KP9))whichend = 9;
+                        if (Input::isKeyDown(SDLK_KP0))whichend = 0;
+                        participantfacing[whichdialogue][indialogue][whichend] = facing;
                     }
-                    if(indialogue>=numdialogueboxes[whichdialogue]){
-                        indialogue=-1;
-                        directing=0;
-                        cameramode=0;
+                    if (indialogue >= numdialogueboxes[whichdialogue]) {
+                        indialogue = -1;
+                        directing = 0;
+                        cameramode = 0;
                     }
                 }
-                if(!directing){
+                if (!directing) {
                     pause_sound(whooshsound);
-                    viewer=dialoguecamera[whichdialogue][indialogue];
-                    viewer.y=max((double)viewer.y,terrain.getHeight(viewer.x,viewer.z)+.1);
-                    yaw=dialoguecamerayaw[whichdialogue][indialogue];
-                    pitch=dialoguecamerapitch[whichdialogue][indialogue];
-                    if(dialoguetime>0.5)
-                        if(     Input::isKeyPressed(SDLK_1)||
-                                Input::isKeyPressed(SDLK_2)||
-                                Input::isKeyPressed(SDLK_3)||
-                                Input::isKeyPressed(SDLK_4)||
-                                Input::isKeyPressed(SDLK_5)||
-                                Input::isKeyPressed(SDLK_6)||
-                                Input::isKeyPressed(SDLK_7)||
-                                Input::isKeyPressed(SDLK_8)||
-                                Input::isKeyPressed(SDLK_9)||
-                                Input::isKeyPressed(SDLK_0)||
-                                Input::isKeyPressed(SDLK_MINUS)||
-                                Input::isKeyPressed(attackkey)){
+                    viewer = dialoguecamera[whichdialogue][indialogue];
+                    viewer.y = max((double)viewer.y, terrain.getHeight(viewer.x, viewer.z) + .1);
+                    yaw = dialoguecamerayaw[whichdialogue][indialogue];
+                    pitch = dialoguecamerapitch[whichdialogue][indialogue];
+                    if (dialoguetime > 0.5)
+                        if (     Input::isKeyPressed(SDLK_1) ||
+                                 Input::isKeyPressed(SDLK_2) ||
+                                 Input::isKeyPressed(SDLK_3) ||
+                                 Input::isKeyPressed(SDLK_4) ||
+                                 Input::isKeyPressed(SDLK_5) ||
+                                 Input::isKeyPressed(SDLK_6) ||
+                                 Input::isKeyPressed(SDLK_7) ||
+                                 Input::isKeyPressed(SDLK_8) ||
+                                 Input::isKeyPressed(SDLK_9) ||
+                                 Input::isKeyPressed(SDLK_0) ||
+                                 Input::isKeyPressed(SDLK_MINUS) ||
+                                 Input::isKeyPressed(attackkey)) {
                             indialogue++;
-                            if(indialogue<numdialogueboxes[whichdialogue]){
-                                if(dialogueboxsound[whichdialogue][indialogue]!=0){
+                            if (indialogue < numdialogueboxes[whichdialogue]) {
+                                if (dialogueboxsound[whichdialogue][indialogue] != 0) {
                                     playdialogueboxsound();
-                                    if(dialogueboxsound[whichdialogue][indialogue]==-5){
-                                        hotspot[numhotspots]=player[0].coords;
-                                        hotspotsize[numhotspots]=10;
-                                        hotspottype[numhotspots]=-1;
+                                    if (dialogueboxsound[whichdialogue][indialogue] == -5) {
+                                        hotspot[numhotspots] = player[0].coords;
+                                        hotspotsize[numhotspots] = 10;
+                                        hotspottype[numhotspots] = -1;
 
                                         numhotspots++;
                                     }
-                                    if(dialogueboxsound[whichdialogue][indialogue]==-6){
-                                        hostile=1;
+                                    if (dialogueboxsound[whichdialogue][indialogue] == -6) {
+                                        hostile = 1;
                                     }
 
-                                    if(player[participantfocus[whichdialogue][indialogue]].dead){
-                                        indialogue=-1;
-                                        directing=0;
-                                        cameramode=0;
+                                    if (player[participantfocus[whichdialogue][indialogue]].dead) {
+                                        indialogue = -1;
+                                        directing = 0;
+                                        cameramode = 0;
                                     }
                                 }
                             }
                         }
-                    if(indialogue>=numdialogueboxes[whichdialogue]){
-                        indialogue=-1;
-                        directing=0;
-                        cameramode=0;
-                        if(dialoguetype[whichdialogue]>19&&dialoguetype[whichdialogue]<30){
-                            hostile=1;
+                    if (indialogue >= numdialogueboxes[whichdialogue]) {
+                        indialogue = -1;
+                        directing = 0;
+                        cameramode = 0;
+                        if (dialoguetype[whichdialogue] > 19 && dialoguetype[whichdialogue] < 30) {
+                            hostile = 1;
                         }
-                        if(dialoguetype[whichdialogue]>29&&dialoguetype[whichdialogue]<40){
-                            windialogue=true;
+                        if (dialoguetype[whichdialogue] > 29 && dialoguetype[whichdialogue] < 40) {
+                            windialogue = true;
                         }
-                        if(dialoguetype[whichdialogue]>49&&dialoguetype[whichdialogue]<60){
-                            hostile=1;
-                            for(int i=1;i<numplayers;i++){
+                        if (dialoguetype[whichdialogue] > 49 && dialoguetype[whichdialogue] < 60) {
+                            hostile = 1;
+                            for (int i = 1; i < numplayers; i++) {
                                 player[i].aitype = attacktypecutoff;
                             }
                         }
@@ -6690,27 +6888,27 @@ void Game::Tick(){
                 }
             }
 
-            if(!player[0].jumpkeydown){
-                player[0].jumptogglekeydown=0;
+            if (!player[0].jumpkeydown) {
+                player[0].jumptogglekeydown = 0;
             }
-            if(player[0].jumpkeydown&&
-                    player[0].animTarget!=jumpupanim&&
-                    player[0].animTarget!=jumpdownanim&&
+            if (player[0].jumpkeydown &&
+                    player[0].animTarget != jumpupanim &&
+                    player[0].animTarget != jumpdownanim &&
                     !player[0].isFlip())
-                player[0].jumptogglekeydown=1;
+                player[0].jumptogglekeydown = 1;
 
 
-            dialoguetime+=multiplier;
-            hawkyaw+=multiplier*25;
-            realhawkcoords=0;
-            realhawkcoords.x=25;
-            realhawkcoords=DoRotation(realhawkcoords,0,hawkyaw,0)+hawkcoords;
-            hawkcalldelay-=multiplier/2;
+            dialoguetime += multiplier;
+            hawkyaw += multiplier * 25;
+            realhawkcoords = 0;
+            realhawkcoords.x = 25;
+            realhawkcoords = DoRotation(realhawkcoords, 0, hawkyaw, 0) + hawkcoords;
+            hawkcalldelay -= multiplier / 2;
 
-            if(hawkcalldelay<=0){
+            if (hawkcalldelay <= 0) {
                 emit_sound_at(hawksound, realhawkcoords);
 
-                hawkcalldelay=16+abs(Random()%8);
+                hawkcalldelay = 16 + abs(Random() % 8);
             }
 
             doDebugKeys();
@@ -6721,13 +6919,13 @@ void Game::Tick(){
 
             doJumpReversals();
 
-            for(int k=0;k<numplayers;k++)
-                if(k!=0&&player[k].immobile)
-                    player[k].coords=player[k].realoldcoords;
+            for (int k = 0; k < numplayers; k++)
+                if (k != 0 && player[k].immobile)
+                    player[k].coords = player[k].realoldcoords;
 
-            for(int k=0;k<numplayers;k++){
-                if(!isnormal(player[k].coords.x)||!isnormal(player[k].coords.y)||!isnormal(player[k].coords.z)){
-                    if(!isnormal(player[k].coords.x)||!isnormal(player[k].coords.y)||!isnormal(player[k].coords.z)){
+            for (int k = 0; k < numplayers; k++) {
+                if (!isnormal(player[k].coords.x) || !isnormal(player[k].coords.y) || !isnormal(player[k].coords.z)) {
+                    if (!isnormal(player[k].coords.x) || !isnormal(player[k].coords.y) || !isnormal(player[k].coords.z)) {
                         player[k].DoDamage(1000);
                     }
                 }
@@ -6735,23 +6933,23 @@ void Game::Tick(){
 
             //respawn
             static bool respawnkeydown;
-            if(!editorenabled&&
-                    (whichlevel!=-2&&
-                     (Input::isKeyDown(SDLK_z)&&
-                      Input::isKeyDown(SDLK_LMETA)&&
-                      debugmode)||
-                     (Input::isKeyDown(jumpkey)&&
-                      !respawnkeydown&&
-                      !oldattackkey&&
-                      player[0].dead))){
-                targetlevel=whichlevel;
-                loading=1;
-                leveltime=5;
+            if (!editorenabled &&
+                    (whichlevel != -2 &&
+                     (Input::isKeyDown(SDLK_z) &&
+                      Input::isKeyDown(SDLK_LMETA) &&
+                      debugmode) ||
+                     (Input::isKeyDown(jumpkey) &&
+                      !respawnkeydown &&
+                      !oldattackkey &&
+                      player[0].dead))) {
+                targetlevel = whichlevel;
+                loading = 1;
+                leveltime = 5;
             }
-            if(!Input::isKeyDown(jumpkey))
-                respawnkeydown=0;
-            if(Input::isKeyDown(jumpkey))
-                respawnkeydown=1;
+            if (!Input::isKeyDown(jumpkey))
+                respawnkeydown = 0;
+            if (Input::isKeyDown(jumpkey))
+                respawnkeydown = 1;
 
 
 
@@ -6759,427 +6957,427 @@ void Game::Tick(){
             static bool movekey;
 
             //?
-            for(int i=0;i<numplayers;i++){
+            for (int i = 0; i < numplayers; i++) {
                 static float oldtargetyaw;
-                if(!player[i].skeleton.free){
-                    oldtargetyaw=player[i].targetyaw;
-                    if(i==0&&indialogue==-1){
+                if (!player[i].skeleton.free) {
+                    oldtargetyaw = player[i].targetyaw;
+                    if (i == 0 && indialogue == -1) {
                         //TODO: refactor repetitive code
-                        if(!animation[player[0].animTarget].attack&&
-                                player[0].animTarget!=staggerbackhighanim&&
-                                player[0].animTarget!=staggerbackhardanim&&
-                                player[0].animTarget!=crouchremoveknifeanim&&
-                                player[0].animTarget!=removeknifeanim&&
-                                player[0].animTarget!=backhandspringanim&&
-                                player[0].animTarget!=dodgebackanim&&
-                                player[0].animTarget!=walljumprightkickanim&&
-                                player[0].animTarget!=walljumpleftkickanim){
-                            if(cameramode)
-                                player[0].targetyaw=0;
+                        if (!animation[player[0].animTarget].attack &&
+                                player[0].animTarget != staggerbackhighanim &&
+                                player[0].animTarget != staggerbackhardanim &&
+                                player[0].animTarget != crouchremoveknifeanim &&
+                                player[0].animTarget != removeknifeanim &&
+                                player[0].animTarget != backhandspringanim &&
+                                player[0].animTarget != dodgebackanim &&
+                                player[0].animTarget != walljumprightkickanim &&
+                                player[0].animTarget != walljumpleftkickanim) {
+                            if (cameramode)
+                                player[0].targetyaw = 0;
                             else
-                                player[0].targetyaw=-yaw+180;
+                                player[0].targetyaw = -yaw + 180;
                         }
 
-                        facing=0;
-                        facing.z=-1;
+                        facing = 0;
+                        facing.z = -1;
 
-                        flatfacing=DoRotation(facing,0,player[i].yaw+180,0);
-                        if(cameramode){
-                            facing=flatfacing;
-                        }else{
-                            facing=DoRotation(facing,-pitch,0,0);
-                            facing=DoRotation(facing,0,0-yaw,0);
+                        flatfacing = DoRotation(facing, 0, player[i].yaw + 180, 0);
+                        if (cameramode) {
+                            facing = flatfacing;
+                        } else {
+                            facing = DoRotation(facing, -pitch, 0, 0);
+                            facing = DoRotation(facing, 0, 0 - yaw, 0);
                         }
 
-                        player[0].lookyaw=-yaw;
+                        player[0].lookyaw = -yaw;
 
-                        player[i].targetheadyaw=yaw;
-                        player[i].targetheadpitch=pitch;
+                        player[i].targetheadyaw = yaw;
+                        player[i].targetheadpitch = pitch;
                     }
-                    if(i!=0&&player[i].aitype==playercontrolled&&indialogue==-1){
-                        if(!animation[player[i].animTarget].attack&&
-                                player[i].animTarget!=staggerbackhighanim&&
-                                player[i].animTarget!=staggerbackhardanim&&
-                                player[i].animTarget!=crouchremoveknifeanim&&
-                                player[i].animTarget!=removeknifeanim&&
-                                player[i].animTarget!=backhandspringanim&&
-                                player[i].animTarget!=dodgebackanim&&
-                                player[i].animTarget!=walljumprightkickanim&&
-                                player[i].animTarget!=walljumpleftkickanim){
-                            player[i].targetyaw=-player[i].lookyaw+180;
+                    if (i != 0 && player[i].aitype == playercontrolled && indialogue == -1) {
+                        if (!animation[player[i].animTarget].attack &&
+                                player[i].animTarget != staggerbackhighanim &&
+                                player[i].animTarget != staggerbackhardanim &&
+                                player[i].animTarget != crouchremoveknifeanim &&
+                                player[i].animTarget != removeknifeanim &&
+                                player[i].animTarget != backhandspringanim &&
+                                player[i].animTarget != dodgebackanim &&
+                                player[i].animTarget != walljumprightkickanim &&
+                                player[i].animTarget != walljumpleftkickanim) {
+                            player[i].targetyaw = -player[i].lookyaw + 180;
                         }
 
-                        facing=0;
-                        facing.z=-1;
+                        facing = 0;
+                        facing.z = -1;
 
-                        flatfacing=DoRotation(facing,0,player[i].yaw+180,0);
+                        flatfacing = DoRotation(facing, 0, player[i].yaw + 180, 0);
 
-                        facing=DoRotation(facing,-player[i].lookpitch,0,0);
-                        facing=DoRotation(facing,0,0-player[i].lookyaw,0);
+                        facing = DoRotation(facing, -player[i].lookpitch, 0, 0);
+                        facing = DoRotation(facing, 0, 0 - player[i].lookyaw, 0);
 
-                        player[i].targetheadyaw=player[i].lookyaw;
-                        player[i].targetheadpitch=player[i].lookpitch;
+                        player[i].targetheadyaw = player[i].lookyaw;
+                        player[i].targetheadpitch = player[i].lookpitch;
                     }
-                    if(indialogue!=-1){
-                        player[i].targetheadyaw=180-roughDirection(participantfacing[whichdialogue][indialogue][i]);
-                        player[i].targetheadpitch=pitchOf(participantfacing[whichdialogue][indialogue][i]);
+                    if (indialogue != -1) {
+                        player[i].targetheadyaw = 180 - roughDirection(participantfacing[whichdialogue][indialogue][i]);
+                        player[i].targetheadpitch = pitchOf(participantfacing[whichdialogue][indialogue][i]);
                     }
 
-                    if(leveltime<.5)
-                        numenvsounds=0;
+                    if (leveltime < .5)
+                        numenvsounds = 0;
 
-                    player[i].avoidsomething=0;
+                    player[i].avoidsomething = 0;
 
                     //avoid flaming things
-                    for(int j=0;j<objects.numobjects;j++)
-                        if(objects.onfire[j])
-                            if(distsq(&player[i].coords,&objects.position[j])<sq(objects.scale[j])*200)
-                                if(     distsq(&player[i].coords,&objects.position[j])<
-                                        distsq(&player[i].coords,&player[0].coords)){
-                                    player[i].collided=0;
-                                    player[i].avoidcollided=1;
-                                    if(player[i].avoidsomething==0||
-                                            distsq(&player[i].coords,&objects.position[j])<
-                                            distsq(&player[i].coords,&player[i].avoidwhere)){
-                                        player[i].avoidwhere=objects.position[j];
-                                        player[i].avoidsomething=1;
+                    for (int j = 0; j < objects.numobjects; j++)
+                        if (objects.onfire[j])
+                            if (distsq(&player[i].coords, &objects.position[j]) < sq(objects.scale[j]) * 200)
+                                if (     distsq(&player[i].coords, &objects.position[j]) <
+                                         distsq(&player[i].coords, &player[0].coords)) {
+                                    player[i].collided = 0;
+                                    player[i].avoidcollided = 1;
+                                    if (player[i].avoidsomething == 0 ||
+                                            distsq(&player[i].coords, &objects.position[j]) <
+                                            distsq(&player[i].coords, &player[i].avoidwhere)) {
+                                        player[i].avoidwhere = objects.position[j];
+                                        player[i].avoidsomething = 1;
                                     }
                                 }
 
                     //avoid flaming players
-                    for(int j=0;j<numplayers;j++)
-                        if(player[j].onfire)
-                            if(distsq(&player[j].coords,&player[i].coords)<sq(0.3)*200)
-                                if(     distsq(&player[i].coords,&player[j].coords)<
-                                        distsq(&player[i].coords,&player[0].coords)){
-                                    player[i].collided=0;
-                                    player[i].avoidcollided=1;
-                                    if(player[i].avoidsomething==0||
-                                            distsq(&player[i].coords,&player[j].coords)<
-                                            distsq(&player[i].coords,&player[i].avoidwhere)){
-                                        player[i].avoidwhere=player[j].coords;
-                                        player[i].avoidsomething=1;
+                    for (int j = 0; j < numplayers; j++)
+                        if (player[j].onfire)
+                            if (distsq(&player[j].coords, &player[i].coords) < sq(0.3) * 200)
+                                if (     distsq(&player[i].coords, &player[j].coords) <
+                                         distsq(&player[i].coords, &player[0].coords)) {
+                                    player[i].collided = 0;
+                                    player[i].avoidcollided = 1;
+                                    if (player[i].avoidsomething == 0 ||
+                                            distsq(&player[i].coords, &player[j].coords) <
+                                            distsq(&player[i].coords, &player[i].avoidwhere)) {
+                                        player[i].avoidwhere = player[j].coords;
+                                        player[i].avoidsomething = 1;
                                     }
                                 }
 
-                    if(player[i].collided>.8)
-                        player[i].avoidcollided=0;
+                    if (player[i].collided > .8)
+                        player[i].avoidcollided = 0;
 
                     doAI(i);
 
-                    if(animation[player[i].animTarget].attack==reversed){
+                    if (animation[player[i].animTarget].attack == reversed) {
                         //player[i].targetyaw=player[i].yaw;
-                        player[i].forwardkeydown=0;
-                        player[i].leftkeydown=0;
-                        player[i].backkeydown=0;
-                        player[i].rightkeydown=0;
-                        player[i].jumpkeydown=0;
-                        player[i].attackkeydown=0;
+                        player[i].forwardkeydown = 0;
+                        player[i].leftkeydown = 0;
+                        player[i].backkeydown = 0;
+                        player[i].rightkeydown = 0;
+                        player[i].jumpkeydown = 0;
+                        player[i].attackkeydown = 0;
                         //player[i].crouchkeydown=0;
-                        player[i].throwkeydown=0;
+                        player[i].throwkeydown = 0;
                     }
 
-                    if(indialogue!=-1){
-                        player[i].forwardkeydown=0;
-                        player[i].leftkeydown=0;
-                        player[i].backkeydown=0;
-                        player[i].rightkeydown=0;
-                        player[i].jumpkeydown=0;
-                        player[i].crouchkeydown=0;
-                        player[i].drawkeydown=0;
-                        player[i].throwkeydown=0;
+                    if (indialogue != -1) {
+                        player[i].forwardkeydown = 0;
+                        player[i].leftkeydown = 0;
+                        player[i].backkeydown = 0;
+                        player[i].rightkeydown = 0;
+                        player[i].jumpkeydown = 0;
+                        player[i].crouchkeydown = 0;
+                        player[i].drawkeydown = 0;
+                        player[i].throwkeydown = 0;
                     }
 
-                    if(player[i].collided<-.3)
-                        player[i].collided=-.3;
-                    if(player[i].collided>1)
-                        player[i].collided=1;
-                    player[i].collided-=multiplier*4;
-                    player[i].whichdirectiondelay-=multiplier;
-                    if(player[i].avoidcollided<-.3||player[i].whichdirectiondelay<=0){
-                        player[i].avoidcollided=-.3;
-                        player[i].whichdirection=abs(Random()%2);
-                        player[i].whichdirectiondelay=.4;
+                    if (player[i].collided < -.3)
+                        player[i].collided = -.3;
+                    if (player[i].collided > 1)
+                        player[i].collided = 1;
+                    player[i].collided -= multiplier * 4;
+                    player[i].whichdirectiondelay -= multiplier;
+                    if (player[i].avoidcollided < -.3 || player[i].whichdirectiondelay <= 0) {
+                        player[i].avoidcollided = -.3;
+                        player[i].whichdirection = abs(Random() % 2);
+                        player[i].whichdirectiondelay = .4;
                     }
-                    if(player[i].avoidcollided>1)
-                        player[i].avoidcollided=1;
-                    player[i].avoidcollided-=multiplier/4;
-                    if(!player[i].skeleton.free){
-                        player[i].stunned-=multiplier;
-                        player[i].surprised-=multiplier;
+                    if (player[i].avoidcollided > 1)
+                        player[i].avoidcollided = 1;
+                    player[i].avoidcollided -= multiplier / 4;
+                    if (!player[i].skeleton.free) {
+                        player[i].stunned -= multiplier;
+                        player[i].surprised -= multiplier;
                     }
-                    if(i!=0&&player[i].surprised<=0&&
-                            player[i].aitype==attacktypecutoff&&
-                            !player[i].dead&&
-                            !player[i].skeleton.free&&
-                            animation[player[i].animTarget].attack==neutral)
-                        numresponded=1;
+                    if (i != 0 && player[i].surprised <= 0 &&
+                            player[i].aitype == attacktypecutoff &&
+                            !player[i].dead &&
+                            !player[i].skeleton.free &&
+                            animation[player[i].animTarget].attack == neutral)
+                        numresponded = 1;
 
-                    if(!player[i].throwkeydown)
-                        player[i].throwtogglekeydown=0;
+                    if (!player[i].throwkeydown)
+                        player[i].throwtogglekeydown = 0;
 
                     //pick up weapon
-                    if(player[i].throwkeydown&&!player[i].throwtogglekeydown){
-                        if(player[i].weaponactive==-1&&
-                                player[i].num_weapons<2&&
-                                (player[i].isIdle()||
-                                 player[i].isCrouch()||
-                                 player[i].animTarget==sneakanim||
-                                 player[i].animTarget==rollanim||
-                                 player[i].animTarget==backhandspringanim||
-                                 player[i].isFlip()||
-                                 player[i].isFlip()||
-                                 player[i].aitype!=playercontrolled)){
-                            for(int j=0;j<weapons.size();j++){
-                                if((weapons[j].velocity.x==0&&weapons[j].velocity.y==0&&weapons[j].velocity.z==0||
-                                            player[i].aitype==playercontrolled)&&
-                                        weapons[j].owner==-1&&
-                                        player[i].weaponactive==-1)
-                                    if(distsqflat(&player[i].coords,&weapons[j].position)<2){
-                                        if(distsq(&player[i].coords,&weapons[j].position)<2){
-                                            if(player[i].isCrouch()||
-                                                    player[i].animTarget==sneakanim||
-                                                    player[i].isRun()||
-                                                    player[i].isIdle()||
-                                                    player[i].aitype!=playercontrolled){
-                                                player[i].throwtogglekeydown=1;
+                    if (player[i].throwkeydown && !player[i].throwtogglekeydown) {
+                        if (player[i].weaponactive == -1 &&
+                                player[i].num_weapons < 2 &&
+                                (player[i].isIdle() ||
+                                 player[i].isCrouch() ||
+                                 player[i].animTarget == sneakanim ||
+                                 player[i].animTarget == rollanim ||
+                                 player[i].animTarget == backhandspringanim ||
+                                 player[i].isFlip() ||
+                                 player[i].isFlip() ||
+                                 player[i].aitype != playercontrolled)) {
+                            for (int j = 0; j < weapons.size(); j++) {
+                                if ((weapons[j].velocity.x == 0 && weapons[j].velocity.y == 0 && weapons[j].velocity.z == 0 ||
+                                        player[i].aitype == playercontrolled) &&
+                                        weapons[j].owner == -1 &&
+                                        player[i].weaponactive == -1)
+                                    if (distsqflat(&player[i].coords, &weapons[j].position) < 2) {
+                                        if (distsq(&player[i].coords, &weapons[j].position) < 2) {
+                                            if (player[i].isCrouch() ||
+                                                    player[i].animTarget == sneakanim ||
+                                                    player[i].isRun() ||
+                                                    player[i].isIdle() ||
+                                                    player[i].aitype != playercontrolled) {
+                                                player[i].throwtogglekeydown = 1;
                                                 player[i].setAnimation(crouchremoveknifeanim);
-                                                player[i].targetyaw=roughDirectionTo(player[i].coords,weapons[j].position);
-                                                player[i].hasvictim=0;
+                                                player[i].targetyaw = roughDirectionTo(player[i].coords, weapons[j].position);
+                                                player[i].hasvictim = 0;
                                             }
-                                            if(player[i].animTarget==rollanim||player[i].animTarget==backhandspringanim){
-                                                player[i].throwtogglekeydown=1;
-                                                player[i].hasvictim=0;
-
-                                                if((weapons[j].velocity.x==0&&weapons[j].velocity.y==0&&weapons[j].velocity.z==0||
-                                                                player[i].aitype==playercontrolled)&&
-                                                            weapons[j].owner==-1||
-                                                        player[i].victim&&
-                                                        weapons[j].owner==player[i].victim->id)
-                                                    if(distsqflat(&player[i].coords,&weapons[j].position)<2&&player[i].weaponactive==-1)
-                                                        if(distsq(&player[i].coords,&weapons[j].position)<1||player[i].victim){
-                                                            if(weapons[j].getType()!=staff)
+                                            if (player[i].animTarget == rollanim || player[i].animTarget == backhandspringanim) {
+                                                player[i].throwtogglekeydown = 1;
+                                                player[i].hasvictim = 0;
+
+                                                if ((weapons[j].velocity.x == 0 && weapons[j].velocity.y == 0 && weapons[j].velocity.z == 0 ||
+                                                        player[i].aitype == playercontrolled) &&
+                                                        weapons[j].owner == -1 ||
+                                                        player[i].victim &&
+                                                        weapons[j].owner == player[i].victim->id)
+                                                    if (distsqflat(&player[i].coords, &weapons[j].position) < 2 && player[i].weaponactive == -1)
+                                                        if (distsq(&player[i].coords, &weapons[j].position) < 1 || player[i].victim) {
+                                                            if (weapons[j].getType() != staff)
                                                                 emit_sound_at(knifedrawsound, player[i].coords, 128.);
 
-                                                            player[i].weaponactive=0;
-                                                            weapons[j].owner=player[i].id;
-                                                            if(player[i].num_weapons>0)
-                                                                player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0];
+                                                            player[i].weaponactive = 0;
+                                                            weapons[j].owner = player[i].id;
+                                                            if (player[i].num_weapons > 0)
+                                                                player[i].weaponids[player[i].num_weapons] = player[i].weaponids[0];
                                                             player[i].num_weapons++;
-                                                            player[i].weaponids[0]=j;
+                                                            player[i].weaponids[0] = j;
                                                         }
                                             }
-                                        }else if((player[i].isIdle()||
-                                                    player[i].isFlip()||
-                                                    player[i].aitype!=playercontrolled)&&
-                                                distsq(&player[i].coords,&weapons[j].position)<5&&
-                                                player[i].coords.y<weapons[j].position.y){
-                                            if(!player[i].isFlip()){
-                                                player[i].throwtogglekeydown=1;
+                                        } else if ((player[i].isIdle() ||
+                                                    player[i].isFlip() ||
+                                                    player[i].aitype != playercontrolled) &&
+                                                   distsq(&player[i].coords, &weapons[j].position) < 5 &&
+                                                   player[i].coords.y < weapons[j].position.y) {
+                                            if (!player[i].isFlip()) {
+                                                player[i].throwtogglekeydown = 1;
                                                 player[i].setAnimation(removeknifeanim);
-                                                player[i].targetyaw=roughDirectionTo(player[i].coords,weapons[j].position);
+                                                player[i].targetyaw = roughDirectionTo(player[i].coords, weapons[j].position);
                                             }
-                                            if(player[i].isFlip()){
-                                                player[i].throwtogglekeydown=1;
-                                                player[i].hasvictim=0;
-
-                                                for(int k=0;k<weapons.size();k++){
-                                                    if(player[i].weaponactive==-1)
-                                                        if((weapons[k].velocity.x==0&&weapons[k].velocity.y==0&&weapons[k].velocity.z==0||
-                                                                        player[i].aitype==playercontrolled)&&
-                                                                    weapons[k].owner==-1||
-                                                                player[i].victim&&
-                                                                 weapons[k].owner==player[i].victim->id)
-                                                            if(distsqflat(&player[i].coords,&weapons[k].position)<3&&
-                                                                    player[i].weaponactive==-1){
-                                                                if(weapons[k].getType()!=staff)
+                                            if (player[i].isFlip()) {
+                                                player[i].throwtogglekeydown = 1;
+                                                player[i].hasvictim = 0;
+
+                                                for (int k = 0; k < weapons.size(); k++) {
+                                                    if (player[i].weaponactive == -1)
+                                                        if ((weapons[k].velocity.x == 0 && weapons[k].velocity.y == 0 && weapons[k].velocity.z == 0 ||
+                                                                player[i].aitype == playercontrolled) &&
+                                                                weapons[k].owner == -1 ||
+                                                                player[i].victim &&
+                                                                weapons[k].owner == player[i].victim->id)
+                                                            if (distsqflat(&player[i].coords, &weapons[k].position) < 3 &&
+                                                                    player[i].weaponactive == -1) {
+                                                                if (weapons[k].getType() != staff)
                                                                     emit_sound_at(knifedrawsound, player[i].coords, 128.);
 
-                                                                player[i].weaponactive=0;
-                                                                weapons[k].owner=player[i].id;
-                                                                if(player[i].num_weapons>0)
-                                                                    player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0];
+                                                                player[i].weaponactive = 0;
+                                                                weapons[k].owner = player[i].id;
+                                                                if (player[i].num_weapons > 0)
+                                                                    player[i].weaponids[player[i].num_weapons] = player[i].weaponids[0];
                                                                 player[i].num_weapons++;
-                                                                player[i].weaponids[0]=k;
+                                                                player[i].weaponids[0] = k;
                                                             }
                                                 }
                                             }
                                         }
                                     }
                             }
-                            if(player[i].isCrouch()||
-                                    player[i].animTarget==sneakanim||
-                                    player[i].isRun()||
-                                    player[i].isIdle()||player[i].animTarget==rollanim||
-                                    player[i].animTarget==backhandspringanim){
-                                if(numplayers>1)
-                                    for(int j=0;j<numplayers;j++){
-                                        if(player[i].weaponactive==-1)
-                                            if(j!=i)
-                                                if(player[j].num_weapons&&
-                                                        player[j].skeleton.free&&
-                                                        distsq(&player[i].coords,&player[j].coords)<2/*&&player[j].dead*/&&
-                                                        (((player[j].skeleton.forward.y<0&&
-                                                           player[j].weaponstuckwhere==0)||
-                                                          (player[j].skeleton.forward.y>0&&
-                                                           player[j].weaponstuckwhere==1))||
-                                                         player[j].weaponstuck==-1||
-                                                         player[j].num_weapons>1)){
-                                                    if(player[i].animTarget!=rollanim&&player[i].animTarget!=backhandspringanim){
-                                                        player[i].throwtogglekeydown=1;
-                                                        player[i].victim=&player[j];
-                                                        player[i].hasvictim=1;
+                            if (player[i].isCrouch() ||
+                                    player[i].animTarget == sneakanim ||
+                                    player[i].isRun() ||
+                                    player[i].isIdle() || player[i].animTarget == rollanim ||
+                                    player[i].animTarget == backhandspringanim) {
+                                if (numplayers > 1)
+                                    for (int j = 0; j < numplayers; j++) {
+                                        if (player[i].weaponactive == -1)
+                                            if (j != i)
+                                                if (player[j].num_weapons &&
+                                                        player[j].skeleton.free &&
+                                                        distsq(&player[i].coords, &player[j].coords) < 2/*&&player[j].dead*/ &&
+                                                        (((player[j].skeleton.forward.y < 0 &&
+                                                           player[j].weaponstuckwhere == 0) ||
+                                                          (player[j].skeleton.forward.y > 0 &&
+                                                           player[j].weaponstuckwhere == 1)) ||
+                                                         player[j].weaponstuck == -1 ||
+                                                         player[j].num_weapons > 1)) {
+                                                    if (player[i].animTarget != rollanim && player[i].animTarget != backhandspringanim) {
+                                                        player[i].throwtogglekeydown = 1;
+                                                        player[i].victim = &player[j];
+                                                        player[i].hasvictim = 1;
                                                         player[i].setAnimation(crouchremoveknifeanim);
-                                                        player[i].targetyaw=roughDirectionTo(player[i].coords,player[j].coords);
+                                                        player[i].targetyaw = roughDirectionTo(player[i].coords, player[j].coords);
                                                     }
-                                                    if(player[i].animTarget==rollanim||player[i].animTarget==backhandspringanim){
-                                                        player[i].throwtogglekeydown=1;
-                                                        player[i].victim=&player[j];
-                                                        player[i].hasvictim=1;
+                                                    if (player[i].animTarget == rollanim || player[i].animTarget == backhandspringanim) {
+                                                        player[i].throwtogglekeydown = 1;
+                                                        player[i].victim = &player[j];
+                                                        player[i].hasvictim = 1;
                                                         int k = player[j].weaponids[0];
-                                                        if(player[i].hasvictim){
+                                                        if (player[i].hasvictim) {
                                                             bool fleshstuck;
-                                                            fleshstuck=0;
-                                                            if(player[i].victim->weaponstuck!=-1){
-                                                                if(player[i].victim->weaponids[player[i].victim->weaponstuck]==k){
-                                                                    fleshstuck=1;
+                                                            fleshstuck = 0;
+                                                            if (player[i].victim->weaponstuck != -1) {
+                                                                if (player[i].victim->weaponids[player[i].victim->weaponstuck] == k) {
+                                                                    fleshstuck = 1;
                                                                 }
                                                             }
-                                                            if(!fleshstuck){
-                                                                if(weapons[k].getType()!=staff)
-                                                                  emit_sound_at(knifedrawsound, player[i].coords, 128.);
+                                                            if (!fleshstuck) {
+                                                                if (weapons[k].getType() != staff)
+                                                                    emit_sound_at(knifedrawsound, player[i].coords, 128.);
                                                             }
-                                                            if(fleshstuck)
-                                                              emit_sound_at(fleshstabremovesound, player[i].coords, 128.);
+                                                            if (fleshstuck)
+                                                                emit_sound_at(fleshstabremovesound, player[i].coords, 128.);
 
-                                                            player[i].weaponactive=0;
-                                                            if(weapons[k].owner!=-1){
-                                                                if(player[i].victim->num_weapons==1)player[i].victim->num_weapons=0;
-                                                                else player[i].victim->num_weapons=1;
+                                                            player[i].weaponactive = 0;
+                                                            if (weapons[k].owner != -1) {
+                                                                if (player[i].victim->num_weapons == 1)player[i].victim->num_weapons = 0;
+                                                                else player[i].victim->num_weapons = 1;
 
-                                                                player[i].victim->skeleton.longdead=0;
-                                                                player[i].victim->skeleton.free=1;
-                                                                player[i].victim->skeleton.broken=0;
+                                                                player[i].victim->skeleton.longdead = 0;
+                                                                player[i].victim->skeleton.free = 1;
+                                                                player[i].victim->skeleton.broken = 0;
 
-                                                                for(int l=0;l<player[i].victim->skeleton.num_joints;l++){
-                                                                    player[i].victim->skeleton.joints[l].velchange=0;
-                                                                    player[i].victim->skeleton.joints[l].locked=0;
+                                                                for (int l = 0; l < player[i].victim->skeleton.num_joints; l++) {
+                                                                    player[i].victim->skeleton.joints[l].velchange = 0;
+                                                                    player[i].victim->skeleton.joints[l].locked = 0;
                                                                 }
 
                                                                 XYZ relative;
-                                                                relative=0;
-                                                                relative.y=10;
+                                                                relative = 0;
+                                                                relative.y = 10;
                                                                 Normalise(&relative);
-                                                                XYZ footvel,footpoint;
-                                                                footvel=0;
-                                                                footpoint=weapons[k].position;
-                                                                if(player[i].victim->weaponstuck!=-1){
-                                                                    if(player[i].victim->weaponids[player[i].victim->weaponstuck]==k){
-                                                                        if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3);
-                                                                        weapons[k].bloody=2;
-                                                                        weapons[k].blooddrip=5;
-                                                                        player[i].victim->weaponstuck=-1;
-                                                                        player[i].victim->bloodloss+=2000;
+                                                                XYZ footvel, footpoint;
+                                                                footvel = 0;
+                                                                footpoint = weapons[k].position;
+                                                                if (player[i].victim->weaponstuck != -1) {
+                                                                    if (player[i].victim->weaponids[player[i].victim->weaponstuck] == k) {
+                                                                        if (bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .8, .3);
+                                                                        weapons[k].bloody = 2;
+                                                                        weapons[k].blooddrip = 5;
+                                                                        player[i].victim->weaponstuck = -1;
+                                                                        player[i].victim->bloodloss += 2000;
                                                                         player[i].victim->DoDamage(2000);
                                                                     }
                                                                 }
-                                                                if(player[i].victim->num_weapons>0){
-                                                                    if(player[i].victim->weaponstuck!=0&&player[i].victim->weaponstuck!=-1)player[i].victim->weaponstuck=0;
-                                                                    if(player[i].victim->weaponids[0]==k)
-                                                                        player[i].victim->weaponids[0]=player[i].victim->weaponids[player[i].victim->num_weapons];
+                                                                if (player[i].victim->num_weapons > 0) {
+                                                                    if (player[i].victim->weaponstuck != 0 && player[i].victim->weaponstuck != -1)player[i].victim->weaponstuck = 0;
+                                                                    if (player[i].victim->weaponids[0] == k)
+                                                                        player[i].victim->weaponids[0] = player[i].victim->weaponids[player[i].victim->num_weapons];
                                                                 }
 
-                                                                player[i].victim->weaponactive=-1;
+                                                                player[i].victim->weaponactive = -1;
 
-                                                                player[i].victim->jointVel(abdomen)+=relative*6;
-                                                                player[i].victim->jointVel(neck)+=relative*6;
-                                                                player[i].victim->jointVel(rightshoulder)+=relative*6;
-                                                                player[i].victim->jointVel(leftshoulder)+=relative*6;
+                                                                player[i].victim->jointVel(abdomen) += relative * 6;
+                                                                player[i].victim->jointVel(neck) += relative * 6;
+                                                                player[i].victim->jointVel(rightshoulder) += relative * 6;
+                                                                player[i].victim->jointVel(leftshoulder) += relative * 6;
                                                             }
-                                                            weapons[k].owner=i;
-                                                            if(player[i].num_weapons>0){
-                                                                player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0];
+                                                            weapons[k].owner = i;
+                                                            if (player[i].num_weapons > 0) {
+                                                                player[i].weaponids[player[i].num_weapons] = player[i].weaponids[0];
                                                             }
                                                             player[i].num_weapons++;
-                                                            player[i].weaponids[0]=k;
+                                                            player[i].weaponids[0] = k;
                                                         }
                                                     }
                                                 }
                                     }
                             }
                         }
-                        if(player[i].weaponactive!=-1&&player[i].aitype==playercontrolled){
-                            if(weapons[player[i].weaponids[0]].getType()==knife){
-                                if(player[i].isIdle()||
-                                        player[i].isRun()||
-                                        player[i].isCrouch()||
-                                        player[i].animTarget==sneakanim||
+                        if (player[i].weaponactive != -1 && player[i].aitype == playercontrolled) {
+                            if (weapons[player[i].weaponids[0]].getType() == knife) {
+                                if (player[i].isIdle() ||
+                                        player[i].isRun() ||
+                                        player[i].isCrouch() ||
+                                        player[i].animTarget == sneakanim ||
                                         player[i].isFlip())
-                                    if(numplayers>1)
-                                        for(int j=0;j<numplayers;j++){
-                                            if(i!=j)
-                                                if(tutoriallevel!=1||tutorialstage==49)
-                                                    if(hostile)
-                                                        if(normaldotproduct(player[i].facing,player[i].coords-player[j].coords)<0&&
-                                                                distsq(&player[i].coords,&player[j].coords)<100&&
-                                                                distsq(&player[i].coords,&player[j].coords)>1.5&&
-                                                                !player[j].skeleton.free&&
-                                                                -1==checkcollide(DoRotation(player[j].jointPos(head),0,player[j].yaw,0)*player[j].scale+player[j].coords,DoRotation(player[i].jointPos(head),0,player[i].yaw,0)*player[i].scale+player[i].coords)){
-                                                            if(!player[i].isFlip()){
-                                                                player[i].throwtogglekeydown=1;
-                                                                player[i].victim=&player[j];
+                                    if (numplayers > 1)
+                                        for (int j = 0; j < numplayers; j++) {
+                                            if (i != j)
+                                                if (tutoriallevel != 1 || tutorialstage == 49)
+                                                    if (hostile)
+                                                        if (normaldotproduct(player[i].facing, player[i].coords - player[j].coords) < 0 &&
+                                                                distsq(&player[i].coords, &player[j].coords) < 100 &&
+                                                                distsq(&player[i].coords, &player[j].coords) > 1.5 &&
+                                                                !player[j].skeleton.free &&
+                                                                -1 == checkcollide(DoRotation(player[j].jointPos(head), 0, player[j].yaw, 0)*player[j].scale + player[j].coords, DoRotation(player[i].jointPos(head), 0, player[i].yaw, 0)*player[i].scale + player[i].coords)) {
+                                                            if (!player[i].isFlip()) {
+                                                                player[i].throwtogglekeydown = 1;
+                                                                player[i].victim = &player[j];
                                                                 player[i].setAnimation(knifethrowanim);
-                                                                player[i].targetyaw=roughDirectionTo(player[i].coords,player[j].coords);
-                                                                player[i].targettilt2=pitchTo(player[i].coords,player[j].coords);
+                                                                player[i].targetyaw = roughDirectionTo(player[i].coords, player[j].coords);
+                                                                player[i].targettilt2 = pitchTo(player[i].coords, player[j].coords);
                                                             }
-                                                            if(player[i].isFlip()){
-                                                                if(player[i].weaponactive!=-1){
-                                                                    player[i].throwtogglekeydown=1;
-                                                                    player[i].victim=&player[j];
+                                                            if (player[i].isFlip()) {
+                                                                if (player[i].weaponactive != -1) {
+                                                                    player[i].throwtogglekeydown = 1;
+                                                                    player[i].victim = &player[j];
                                                                     XYZ aim;
-                                                                    weapons[player[i].weaponids[0]].owner=-1;
-                                                                    aim=player[i].victim->coords+DoRotation(player[i].victim->jointPos(abdomen),0,player[i].victim->yaw,0)*player[i].victim->scale+player[i].victim->velocity*findDistance(&player[i].victim->coords,&player[i].coords)/50-(player[i].coords+DoRotation(player[i].jointPos(righthand),0,player[i].yaw,0)*player[i].scale);
+                                                                    weapons[player[i].weaponids[0]].owner = -1;
+                                                                    aim = player[i].victim->coords + DoRotation(player[i].victim->jointPos(abdomen), 0, player[i].victim->yaw, 0) * player[i].victim->scale + player[i].victim->velocity * findDistance(&player[i].victim->coords, &player[i].coords) / 50 - (player[i].coords + DoRotation(player[i].jointPos(righthand), 0, player[i].yaw, 0) * player[i].scale);
                                                                     Normalise(&aim);
 
-                                                                    aim=DoRotation(aim,(float)abs(Random()%30)-15,(float)abs(Random()%30)-15,0);
+                                                                    aim = DoRotation(aim, (float)abs(Random() % 30) - 15, (float)abs(Random() % 30) - 15, 0);
 
-                                                                    weapons[player[i].weaponids[0]].velocity=aim*50;
-                                                                    weapons[player[i].weaponids[0]].tipvelocity=aim*50;
-                                                                    weapons[player[i].weaponids[0]].missed=0;
-                                                                    weapons[player[i].weaponids[0]].freetime=0;
-                                                                    weapons[player[i].weaponids[0]].firstfree=1;
-                                                                    weapons[player[i].weaponids[0]].physics=0;
+                                                                    weapons[player[i].weaponids[0]].velocity = aim * 50;
+                                                                    weapons[player[i].weaponids[0]].tipvelocity = aim * 50;
+                                                                    weapons[player[i].weaponids[0]].missed = 0;
+                                                                    weapons[player[i].weaponids[0]].freetime = 0;
+                                                                    weapons[player[i].weaponids[0]].firstfree = 1;
+                                                                    weapons[player[i].weaponids[0]].physics = 0;
                                                                     player[i].num_weapons--;
-                                                                    if(player[i].num_weapons){
-                                                                        player[i].weaponids[0]=player[i].weaponids[player[i].num_weapons];
+                                                                    if (player[i].num_weapons) {
+                                                                        player[i].weaponids[0] = player[i].weaponids[player[i].num_weapons];
                                                                     }
-                                                                    player[i].weaponactive=-1;
+                                                                    player[i].weaponactive = -1;
                                                                 }
                                                             }
                                                         }
                                         }
                             }
                         }
-                        if(player[i].weaponactive!=-1&&player[i].aitype==playercontrolled){
-                            if(player[i].isCrouch()||player[i].animTarget==sneakanim){
-                                player[i].throwtogglekeydown=1;
-                                weapons[player[i].weaponids[0]].owner=-1;
-                                weapons[player[i].weaponids[0]].velocity=player[i].velocity*.2;
-                                if(weapons[player[i].weaponids[0]].velocity.x==0)weapons[player[i].weaponids[0]].velocity.x=.1;
-                                weapons[player[i].weaponids[0]].tipvelocity=weapons[player[i].weaponids[0]].velocity;
-                                weapons[player[i].weaponids[0]].missed=1;
-                                weapons[player[i].weaponids[0]].freetime=0;
-                                weapons[player[i].weaponids[0]].firstfree=1;
-                                weapons[player[i].weaponids[0]].physics=1;
+                        if (player[i].weaponactive != -1 && player[i].aitype == playercontrolled) {
+                            if (player[i].isCrouch() || player[i].animTarget == sneakanim) {
+                                player[i].throwtogglekeydown = 1;
+                                weapons[player[i].weaponids[0]].owner = -1;
+                                weapons[player[i].weaponids[0]].velocity = player[i].velocity * .2;
+                                if (weapons[player[i].weaponids[0]].velocity.x == 0)weapons[player[i].weaponids[0]].velocity.x = .1;
+                                weapons[player[i].weaponids[0]].tipvelocity = weapons[player[i].weaponids[0]].velocity;
+                                weapons[player[i].weaponids[0]].missed = 1;
+                                weapons[player[i].weaponids[0]].freetime = 0;
+                                weapons[player[i].weaponids[0]].firstfree = 1;
+                                weapons[player[i].weaponids[0]].physics = 1;
                                 player[i].num_weapons--;
-                                if(player[i].num_weapons){
-                                    player[i].weaponids[0]=player[i].weaponids[player[i].num_weapons];
-                                    if(player[i].weaponstuck==player[i].num_weapons)player[i].weaponstuck=0;
+                                if (player[i].num_weapons) {
+                                    player[i].weaponids[0] = player[i].weaponids[player[i].num_weapons];
+                                    if (player[i].weaponstuck == player[i].num_weapons)player[i].weaponstuck = 0;
                                 }
 
-                                player[i].weaponactive=-1;
-                                for(int j=0;j<numplayers;j++){
-                                    player[j].wentforweapon=0;
+                                player[i].weaponactive = -1;
+                                for (int j = 0; j < numplayers; j++) {
+                                    player[j].wentforweapon = 0;
                                 }
                             }
                         }
@@ -7187,528 +7385,527 @@ void Game::Tick(){
                     }
 
                     //draw weapon
-                    if(i==0||!player[0].dead||player[i].weaponactive!=-1) {
-                        if(player[i].drawkeydown&&!player[i].drawtogglekeydown||
-                                player[i].num_weapons==2&&
-                                player[i].weaponactive==-1&&
-                                player[i].isIdle()||
-                                player[0].dead&&
-                                player[i].weaponactive!=-1&&
-                                i!=0) {
-                            bool isgood=true;
-                            if(player[i].weaponactive!=-1)
-                                if(weapons[player[i].weaponids[player[i].weaponactive]].getType()==staff)
-                                    isgood=false;
-                            if(isgood&&player[i].creature!=wolftype){
-                                if(player[i].isIdle()&&player[i].num_weapons&&weapons[player[i].weaponids[0]].getType()==knife){
+                    if (i == 0 || !player[0].dead || player[i].weaponactive != -1) {
+                        if (player[i].drawkeydown && !player[i].drawtogglekeydown ||
+                                player[i].num_weapons == 2 &&
+                                player[i].weaponactive == -1 &&
+                                player[i].isIdle() ||
+                                player[0].dead &&
+                                player[i].weaponactive != -1 &&
+                                i != 0) {
+                            bool isgood = true;
+                            if (player[i].weaponactive != -1)
+                                if (weapons[player[i].weaponids[player[i].weaponactive]].getType() == staff)
+                                    isgood = false;
+                            if (isgood && player[i].creature != wolftype) {
+                                if (player[i].isIdle() && player[i].num_weapons && weapons[player[i].weaponids[0]].getType() == knife) {
                                     player[i].setAnimation(drawrightanim);
-                                    player[i].drawtogglekeydown=1;
+                                    player[i].drawtogglekeydown = 1;
                                 }
-                                if((player[i].isIdle()||
-                                            (player[i].aitype!=playercontrolled&&
-                                             player[0].weaponactive!=-1&&
-                                             player[i].isRun()))&&
-                                        player[i].num_weapons&&
-                                        weapons[player[i].weaponids[0]].getType()==sword){
+                                if ((player[i].isIdle() ||
+                                        (player[i].aitype != playercontrolled &&
+                                         player[0].weaponactive != -1 &&
+                                         player[i].isRun())) &&
+                                        player[i].num_weapons &&
+                                        weapons[player[i].weaponids[0]].getType() == sword) {
                                     player[i].setAnimation(drawleftanim);
-                                    player[i].drawtogglekeydown=1;
+                                    player[i].drawtogglekeydown = 1;
                                 }
-                                if(player[i].isCrouch()&&player[i].num_weapons&&weapons[player[i].weaponids[0]].getType()==knife){
+                                if (player[i].isCrouch() && player[i].num_weapons && weapons[player[i].weaponids[0]].getType() == knife) {
                                     player[i].setAnimation(crouchdrawrightanim);
-                                    player[i].drawtogglekeydown=1;
+                                    player[i].drawtogglekeydown = 1;
                                 }
                             }
                         }
                     }
-                    
+
                     //clean weapon
-                    if(player[i].weaponactive!=-1) {
-                                               if (player[i].isCrouch()&&
-                                                       weapons[player[i].weaponids[player[i].weaponactive]].bloody&&
-                                                       bloodtoggle&&
-                                                       player[i].onterrain&&
-                                                       player[i].num_weapons&&
-                                                       player[i].attackkeydown&&
-                                                       musictype!=stream_fighttheme) {
-                                                               if(weapons[player[i].weaponids[player[i].weaponactive]].getType()==knife)
-                                                                       player[i].setAnimation(crouchstabanim);
-                                                               if(weapons[player[i].weaponids[player[i].weaponactive]].getType()==sword)
-                                                                       player[i].setAnimation(swordgroundstabanim);
-                                                               player[i].hasvictim=0;
-                                               }
-                                       }
-
-                    if(!player[i].drawkeydown)
-                        player[i].drawtogglekeydown=0;
+                    if (player[i].weaponactive != -1) {
+                        if (player[i].isCrouch() &&
+                                weapons[player[i].weaponids[player[i].weaponactive]].bloody &&
+                                bloodtoggle &&
+                                player[i].onterrain &&
+                                player[i].num_weapons &&
+                                player[i].attackkeydown &&
+                                musictype != stream_fighttheme) {
+                            if (weapons[player[i].weaponids[player[i].weaponactive]].getType() == knife)
+                                player[i].setAnimation(crouchstabanim);
+                            if (weapons[player[i].weaponids[player[i].weaponactive]].getType() == sword)
+                                player[i].setAnimation(swordgroundstabanim);
+                            player[i].hasvictim = 0;
+                        }
+                    }
+
+                    if (!player[i].drawkeydown)
+                        player[i].drawtogglekeydown = 0;
 
                     XYZ absflatfacing;
-                    if(i==0) {
-                        absflatfacing=0;
-                        absflatfacing.z=-1;
+                    if (i == 0) {
+                        absflatfacing = 0;
+                        absflatfacing.z = -1;
 
-                        absflatfacing=DoRotation(absflatfacing,0,-yaw,0);
+                        absflatfacing = DoRotation(absflatfacing, 0, -yaw, 0);
                     } else
-                                               absflatfacing=flatfacing;
-
-                    if(indialogue!=-1){
-                        player[i].forwardkeydown=0;
-                        player[i].leftkeydown=0;
-                        player[i].backkeydown=0;
-                        player[i].rightkeydown=0;
-                        player[i].jumpkeydown=0;
-                        player[i].crouchkeydown=0;
-                        player[i].drawkeydown=0;
-                        player[i].throwkeydown=0;
+                        absflatfacing = flatfacing;
+
+                    if (indialogue != -1) {
+                        player[i].forwardkeydown = 0;
+                        player[i].leftkeydown = 0;
+                        player[i].backkeydown = 0;
+                        player[i].rightkeydown = 0;
+                        player[i].jumpkeydown = 0;
+                        player[i].crouchkeydown = 0;
+                        player[i].drawkeydown = 0;
+                        player[i].throwkeydown = 0;
                     }
-                    movekey=0;
+                    movekey = 0;
                     //Do controls
-                    if(!animation[player[i].animTarget].attack&&
-                            player[i].animTarget!=staggerbackhighanim&&
-                            player[i].animTarget!=staggerbackhardanim&&
-                            player[i].animTarget!=backhandspringanim&&
-                            player[i].animTarget!=dodgebackanim){
-                        if(!player[i].forwardkeydown)
-                            player[i].forwardstogglekeydown=0;
-                        if(player[i].crouchkeydown){
+                    if (!animation[player[i].animTarget].attack &&
+                            player[i].animTarget != staggerbackhighanim &&
+                            player[i].animTarget != staggerbackhardanim &&
+                            player[i].animTarget != backhandspringanim &&
+                            player[i].animTarget != dodgebackanim) {
+                        if (!player[i].forwardkeydown)
+                            player[i].forwardstogglekeydown = 0;
+                        if (player[i].crouchkeydown) {
                             //Crouch
-                            target=-2;
-                            if(i==0){
-                                player[i].superruntoggle=1;
-                                if(numplayers>1)
-                                    for(int j=0;j<numplayers;j++)
-                                        if(j!=i&&!player[j].skeleton.free&&player[j].aitype==passivetype)
-                                            if(distsq(&player[j].coords,&player[i].coords)<16)
-                                                player[i].superruntoggle=0;
+                            target = -2;
+                            if (i == 0) {
+                                player[i].superruntoggle = 1;
+                                if (numplayers > 1)
+                                    for (int j = 0; j < numplayers; j++)
+                                        if (j != i && !player[j].skeleton.free && player[j].aitype == passivetype)
+                                            if (distsq(&player[j].coords, &player[i].coords) < 16)
+                                                player[i].superruntoggle = 0;
                             }
 
-                            if(numplayers>1)
-                                for(int j=0;j<numplayers;j++){
-                                    if(j!=i&&!player[j].skeleton.free&&player[j].victim&&player[i].lowreversaldelay<=0){
-                                        if(distsq(&player[j].coords,&player[j].victim->coords)<3&&
-                                                player[j].victim==&player[i]&&
-                                                (player[j].animTarget==sweepanim||
-                                                 player[j].animTarget==upunchanim||
-                                                 player[j].animTarget==wolfslapanim||
-                                                 ((player[j].animTarget==swordslashanim||
-                                                   player[j].animTarget==knifeslashstartanim||
-                                                   player[j].animTarget==staffhitanim||
-                                                   player[j].animTarget==staffspinhitanim)&&
-                                                  distsq(&player[j].coords,&player[i].coords)<2))){
-                                            if(target>=0)
-                                                target=-1;
+                            if (numplayers > 1)
+                                for (int j = 0; j < numplayers; j++) {
+                                    if (j != i && !player[j].skeleton.free && player[j].victim && player[i].lowreversaldelay <= 0) {
+                                        if (distsq(&player[j].coords, &player[j].victim->coords) < 3 &&
+                                                player[j].victim == &player[i] &&
+                                                (player[j].animTarget == sweepanim ||
+                                                 player[j].animTarget == upunchanim ||
+                                                 player[j].animTarget == wolfslapanim ||
+                                                 ((player[j].animTarget == swordslashanim ||
+                                                   player[j].animTarget == knifeslashstartanim ||
+                                                   player[j].animTarget == staffhitanim ||
+                                                   player[j].animTarget == staffspinhitanim) &&
+                                                  distsq(&player[j].coords, &player[i].coords) < 2))) {
+                                            if (target >= 0)
+                                                target = -1;
                                             else
-                                                target=j;
+                                                target = j;
                                         }
                                     }
                                 }
-                            if(target>=0)
+                            if (target >= 0)
                                 player[target].Reverse();
-                            player[i].lowreversaldelay=.5;
+                            player[i].lowreversaldelay = .5;
 
-                            if(player[i].isIdle()){
+                            if (player[i].isIdle()) {
                                 player[i].setAnimation(player[i].getCrouch());
-                                player[i].transspeed=10;
+                                player[i].transspeed = 10;
                             }
-                            if(player[i].isRun()||
-                                    (player[i].isStop()&&
-                                     (player[i].leftkeydown||
-                                      player[i].rightkeydown||
-                                      player[i].forwardkeydown||
-                                      player[i].backkeydown))){
+                            if (player[i].isRun() ||
+                                    (player[i].isStop() &&
+                                     (player[i].leftkeydown ||
+                                      player[i].rightkeydown ||
+                                      player[i].forwardkeydown ||
+                                      player[i].backkeydown))) {
                                 player[i].setAnimation(rollanim);
-                                player[i].transspeed=20;
+                                player[i].transspeed = 20;
                             }
                         }
-                        if(!player[i].crouchkeydown){
+                        if (!player[i].crouchkeydown) {
                             //Uncrouch
-                            if(!player[i].isRun()&&player[i].animTarget!=sneakanim&&i==0)player[i].superruntoggle=0;
-                            target=-2;
-                            if(player[i].isCrouch()){
-                                if(numplayers>1)
-                                    for(int j=0;j<numplayers;j++){
-                                        if(j!=i&&
-                                                !player[j].skeleton.free&&
-                                                player[j].victim&&
-                                                player[i].highreversaldelay<=0){
-                                            if(distsq(&player[j].coords,&player[j].victim->coords)<3&&
-                                                    player[j].victim==&player[i]&&
-                                                    (player[j].animTarget==spinkickanim)&&
-                                                    player[i].isCrouch()){
-                                                if(target>=0)
-                                                    target=-1;
+                            if (!player[i].isRun() && player[i].animTarget != sneakanim && i == 0)player[i].superruntoggle = 0;
+                            target = -2;
+                            if (player[i].isCrouch()) {
+                                if (numplayers > 1)
+                                    for (int j = 0; j < numplayers; j++) {
+                                        if (j != i &&
+                                                !player[j].skeleton.free &&
+                                                player[j].victim &&
+                                                player[i].highreversaldelay <= 0) {
+                                            if (distsq(&player[j].coords, &player[j].victim->coords) < 3 &&
+                                                    player[j].victim == &player[i] &&
+                                                    (player[j].animTarget == spinkickanim) &&
+                                                    player[i].isCrouch()) {
+                                                if (target >= 0)
+                                                    target = -1;
                                                 else
-                                                    target=j;
+                                                    target = j;
                                             }
                                         }
                                     }
-                                if(target>=0)
+                                if (target >= 0)
                                     player[target].Reverse();
-                                player[i].highreversaldelay=.5;
+                                player[i].highreversaldelay = .5;
 
-                                if(player[i].isCrouch()){
-                                    if(!player[i].wasCrouch()){
-                                        player[i].animCurrent=player[i].getCrouch();
-                                        player[i].frameCurrent=0;
+                                if (player[i].isCrouch()) {
+                                    if (!player[i].wasCrouch()) {
+                                        player[i].animCurrent = player[i].getCrouch();
+                                        player[i].frameCurrent = 0;
                                     }
                                     player[i].setAnimation(player[i].getIdle());
-                                    player[i].transspeed=10;
+                                    player[i].transspeed = 10;
                                 }
                             }
-                            if(player[i].animTarget==sneakanim){
+                            if (player[i].animTarget == sneakanim) {
                                 player[i].setAnimation(player[i].getIdle());
-                                player[i].transspeed=10;
+                                player[i].transspeed = 10;
                             }
                         }
-                        if(player[i].forwardkeydown){
-                            if(player[i].isIdle()||
-                                    (player[i].isStop()&&
-                                     player[i].targetyaw==player[i].yaw)||
-                                    (player[i].isLanding()&&
-                                     player[i].frameTarget>0&&
-                                     !player[i].jumpkeydown)||
-                                    (player[i].isLandhard()&&
-                                     player[i].frameTarget>0&&
-                                     !player[i].jumpkeydown&&
-                                     player[i].crouchkeydown)){
-                                if(player[i].aitype==passivetype)
+                        if (player[i].forwardkeydown) {
+                            if (player[i].isIdle() ||
+                                    (player[i].isStop() &&
+                                     player[i].targetyaw == player[i].yaw) ||
+                                    (player[i].isLanding() &&
+                                     player[i].frameTarget > 0 &&
+                                     !player[i].jumpkeydown) ||
+                                    (player[i].isLandhard() &&
+                                     player[i].frameTarget > 0 &&
+                                     !player[i].jumpkeydown &&
+                                     player[i].crouchkeydown)) {
+                                if (player[i].aitype == passivetype)
                                     player[i].setAnimation(walkanim);
                                 else
                                     player[i].setAnimation(player[i].getRun());
                             }
-                            if(player[i].isCrouch()){
-                                player[i].animTarget=sneakanim;
-                                if(player[i].wasCrouch())
-                                    player[i].target=0;
-                                player[i].frameTarget=0;
+                            if (player[i].isCrouch()) {
+                                player[i].animTarget = sneakanim;
+                                if (player[i].wasCrouch())
+                                    player[i].target = 0;
+                                player[i].frameTarget = 0;
                             }
-                            if(player[i].animTarget==hanganim/*&&(!player[i].forwardstogglekeydown||player[i].aitype!=playercontrolled)*/){
+                            if (player[i].animTarget == hanganim/*&&(!player[i].forwardstogglekeydown||player[i].aitype!=playercontrolled)*/) {
                                 player[i].setAnimation(climbanim);
-                                player[i].frameTarget=1;
-                                player[i].jumpclimb=1;
+                                player[i].frameTarget = 1;
+                                player[i].jumpclimb = 1;
                             }
-                            if(player[i].animTarget==jumpupanim||player[i].animTarget==jumpdownanim||player[i].isFlip()){
-                                player[i].velocity+=absflatfacing*5*multiplier;
+                            if (player[i].animTarget == jumpupanim || player[i].animTarget == jumpdownanim || player[i].isFlip()) {
+                                player[i].velocity += absflatfacing * 5 * multiplier;
                             }
-                            player[i].forwardstogglekeydown=1;
-                            movekey=1;
+                            player[i].forwardstogglekeydown = 1;
+                            movekey = 1;
                         }
-                        if (player[i].rightkeydown){
-                            if(player[i].isIdle()||
-                                    (player[i].isStop()&&
-                                     player[i].targetyaw==player[i].yaw)||
-                                    (player[i].isLanding()&&
-                                     player[i].frameTarget>0&&
-                                     !player[i].jumpkeydown)||
-                                    (player[i].isLandhard()&&
-                                     player[i].frameTarget>0&&
-                                     !player[i].jumpkeydown&&
-                                     player[i].crouchkeydown)){
+                        if (player[i].rightkeydown) {
+                            if (player[i].isIdle() ||
+                                    (player[i].isStop() &&
+                                     player[i].targetyaw == player[i].yaw) ||
+                                    (player[i].isLanding() &&
+                                     player[i].frameTarget > 0 &&
+                                     !player[i].jumpkeydown) ||
+                                    (player[i].isLandhard() &&
+                                     player[i].frameTarget > 0 &&
+                                     !player[i].jumpkeydown &&
+                                     player[i].crouchkeydown)) {
                                 player[i].setAnimation(player[i].getRun());
                             }
-                            if(player[i].isCrouch()){
-                                player[i].animTarget=sneakanim;
-                                if(player[i].wasCrouch())
-                                    player[i].target=0;
-                                player[i].frameTarget=0;
+                            if (player[i].isCrouch()) {
+                                player[i].animTarget = sneakanim;
+                                if (player[i].wasCrouch())
+                                    player[i].target = 0;
+                                player[i].frameTarget = 0;
                             }
-                            if(player[i].animTarget==jumpupanim||player[i].animTarget==jumpdownanim||player[i].isFlip()){
-                                player[i].velocity+=DoRotation(absflatfacing*5*multiplier,0,-90,0);
+                            if (player[i].animTarget == jumpupanim || player[i].animTarget == jumpdownanim || player[i].isFlip()) {
+                                player[i].velocity += DoRotation(absflatfacing * 5 * multiplier, 0, -90, 0);
                             }
-                            player[i].targetyaw-=90;
-                            if(player[i].forwardkeydown)player[i].targetyaw+=45;
-                            if(player[i].backkeydown)player[i].targetyaw-=45;
-                            movekey=1;
+                            player[i].targetyaw -= 90;
+                            if (player[i].forwardkeydown)player[i].targetyaw += 45;
+                            if (player[i].backkeydown)player[i].targetyaw -= 45;
+                            movekey = 1;
                         }
-                        if ( player[i].leftkeydown){
-                            if(player[i].isIdle()||
-                                    (player[i].isStop()&&
-                                     player[i].targetyaw==player[i].yaw)||
-                                    (player[i].isLanding()&&
-                                     player[i].frameTarget>0&&
-                                     !player[i].jumpkeydown)||
-                                    (player[i].isLandhard()&&
-                                     player[i].frameTarget>0&&
-                                     !player[i].jumpkeydown&&
-                                     player[i].crouchkeydown)){
+                        if ( player[i].leftkeydown) {
+                            if (player[i].isIdle() ||
+                                    (player[i].isStop() &&
+                                     player[i].targetyaw == player[i].yaw) ||
+                                    (player[i].isLanding() &&
+                                     player[i].frameTarget > 0 &&
+                                     !player[i].jumpkeydown) ||
+                                    (player[i].isLandhard() &&
+                                     player[i].frameTarget > 0 &&
+                                     !player[i].jumpkeydown &&
+                                     player[i].crouchkeydown)) {
                                 player[i].setAnimation(player[i].getRun());
                             }
-                            if(player[i].isCrouch()){
-                                player[i].animTarget=sneakanim;
-                                if(player[i].wasCrouch())
-                                    player[i].target=0;
-                                player[i].frameTarget=0;
+                            if (player[i].isCrouch()) {
+                                player[i].animTarget = sneakanim;
+                                if (player[i].wasCrouch())
+                                    player[i].target = 0;
+                                player[i].frameTarget = 0;
                             }
-                            if(player[i].animTarget==jumpupanim||player[i].animTarget==jumpdownanim||player[i].isFlip()){
-                                player[i].velocity-=DoRotation(absflatfacing*5*multiplier,0,-90,0);
+                            if (player[i].animTarget == jumpupanim || player[i].animTarget == jumpdownanim || player[i].isFlip()) {
+                                player[i].velocity -= DoRotation(absflatfacing * 5 * multiplier, 0, -90, 0);
                             }
-                            player[i].targetyaw+=90;
-                            if(player[i].forwardkeydown)player[i].targetyaw-=45;
-                            if(player[i].backkeydown)player[i].targetyaw+=45;
-                            movekey=1;
+                            player[i].targetyaw += 90;
+                            if (player[i].forwardkeydown)player[i].targetyaw -= 45;
+                            if (player[i].backkeydown)player[i].targetyaw += 45;
+                            movekey = 1;
                         }
-                        if(player[i].backkeydown){
-                            if(player[i].isIdle()||
-                                    (player[i].isStop()&&
-                                     player[i].targetyaw==player[i].yaw)||
-                                    (player[i].isLanding()&&
-                                     player[i].frameTarget>0&&
-                                     !player[i].jumpkeydown)||
-                                    (player[i].isLandhard()&&
-                                     player[i].frameTarget>0&&
-                                     !player[i].jumpkeydown&&
-                                     player[i].crouchkeydown)){
+                        if (player[i].backkeydown) {
+                            if (player[i].isIdle() ||
+                                    (player[i].isStop() &&
+                                     player[i].targetyaw == player[i].yaw) ||
+                                    (player[i].isLanding() &&
+                                     player[i].frameTarget > 0 &&
+                                     !player[i].jumpkeydown) ||
+                                    (player[i].isLandhard() &&
+                                     player[i].frameTarget > 0 &&
+                                     !player[i].jumpkeydown &&
+                                     player[i].crouchkeydown)) {
                                 player[i].setAnimation(player[i].getRun());
                             }
-                            if(player[i].isCrouch()){
-                                player[i].animTarget=sneakanim;
-                                if(player[i].wasCrouch())
-                                    player[i].target=0;
-                                player[i].frameTarget=0;
+                            if (player[i].isCrouch()) {
+                                player[i].animTarget = sneakanim;
+                                if (player[i].wasCrouch())
+                                    player[i].target = 0;
+                                player[i].frameTarget = 0;
                             }
-                            if(player[i].animTarget==jumpupanim||player[i].animTarget==jumpdownanim||player[i].isFlip()){
-                                player[i].velocity-=absflatfacing*5*multiplier;
+                            if (player[i].animTarget == jumpupanim || player[i].animTarget == jumpdownanim || player[i].isFlip()) {
+                                player[i].velocity -= absflatfacing * 5 * multiplier;
                             }
-                            if(player[i].animTarget==hanganim){
-                                player[i].animCurrent=jumpdownanim;
-                                player[i].animTarget=jumpdownanim;
-                                player[i].target=0;
-                                player[i].frameCurrent=0;
-                                player[i].frameTarget=1;
-                                player[i].velocity=0;
-                                player[i].velocity.y+=gravity;
-                                player[i].coords.y-=1.4;
-                                player[i].grabdelay=1;
+                            if (player[i].animTarget == hanganim) {
+                                player[i].animCurrent = jumpdownanim;
+                                player[i].animTarget = jumpdownanim;
+                                player[i].target = 0;
+                                player[i].frameCurrent = 0;
+                                player[i].frameTarget = 1;
+                                player[i].velocity = 0;
+                                player[i].velocity.y += gravity;
+                                player[i].coords.y -= 1.4;
+                                player[i].grabdelay = 1;
                             }
-                            if ( !player[i].leftkeydown&&!player[i].rightkeydown)
-                                player[i].targetyaw+=180;
-                            movekey=1;
+                            if ( !player[i].leftkeydown && !player[i].rightkeydown)
+                                player[i].targetyaw += 180;
+                            movekey = 1;
                         }
-                        if((player[i].jumpkeydown&&!player[i].jumpclimb)||player[i].jumpstart){
-                            if((((player[i].isLanding()&&player[i].frameTarget>=3)||
-                                            player[i].isRun()||
-                                            player[i].animTarget==walkanim||
-                                            player[i].isCrouch()||
-                                            player[i].animTarget==sneakanim)&&
-                                        player[i].jumppower>1)&&
-                                    ((player[i].animTarget!=rabbitrunninganim&&
-                                      player[i].animTarget!=wolfrunninganim)||i!=0)){
-                                player[i].jumpstart=0;
+                        if ((player[i].jumpkeydown && !player[i].jumpclimb) || player[i].jumpstart) {
+                            if ((((player[i].isLanding() && player[i].frameTarget >= 3) ||
+                                    player[i].isRun() ||
+                                    player[i].animTarget == walkanim ||
+                                    player[i].isCrouch() ||
+                                    player[i].animTarget == sneakanim) &&
+                                    player[i].jumppower > 1) &&
+                                    ((player[i].animTarget != rabbitrunninganim &&
+                                      player[i].animTarget != wolfrunninganim) || i != 0)) {
+                                player[i].jumpstart = 0;
                                 player[i].setAnimation(jumpupanim);
-                                player[i].yaw=player[i].targetyaw;
-                                player[i].transspeed=20;
-                                player[i].FootLand(0,1);
-                                player[i].FootLand(1,1);
+                                player[i].yaw = player[i].targetyaw;
+                                player[i].transspeed = 20;
+                                player[i].FootLand(0, 1);
+                                player[i].FootLand(1, 1);
 
-                                facing=0;
-                                facing.z=-1;
-                                flatfacing=DoRotation(facing,0,player[i].targetyaw+180,0);
+                                facing = 0;
+                                facing.z = -1;
+                                flatfacing = DoRotation(facing, 0, player[i].targetyaw + 180, 0);
 
-                                if(movekey)player[i].velocity=flatfacing*player[i].speed*45*player[i].scale;
-                                if(!movekey)player[i].velocity=0;
+                                if (movekey)player[i].velocity = flatfacing * player[i].speed * 45 * player[i].scale;
+                                if (!movekey)player[i].velocity = 0;
 
                                 //Dodge sweep?
-                                target=-2;
-                                if(numplayers>1)
-                                    for(int j=0;j<numplayers;j++){
-                                        if(j!=i&&!player[j].skeleton.free&&player[j].victim){
-                                            if(distsq(&player[j].coords,&player[j].victim->coords)<3&&
-                                                    player[j].victim==&player[i]&&
-                                                    (player[j].animTarget==sweepanim)){
-                                                if(target>=0)target=-1;
-                                                else target=j;
+                                target = -2;
+                                if (numplayers > 1)
+                                    for (int j = 0; j < numplayers; j++) {
+                                        if (j != i && !player[j].skeleton.free && player[j].victim) {
+                                            if (distsq(&player[j].coords, &player[j].victim->coords) < 3 &&
+                                                    player[j].victim == &player[i] &&
+                                                    (player[j].animTarget == sweepanim)) {
+                                                if (target >= 0)target = -1;
+                                                else target = j;
                                             }
                                         }
                                     }
-                                    if(target>=0)player[i].velocity.y=1;
-                                    else if(player[i].crouchkeydown||player[i].aitype!=playercontrolled){
-                                        player[i].velocity.y=7;
-                                        player[i].crouchtogglekeydown=1;
-                                    }
-                                    else player[i].velocity.y=5;
-
-                                    if(mousejump&&i==0&&debugmode){
-                                        if(!player[i].isLanding())player[i].tempdeltav=deltav;
-                                        if(player[i].tempdeltav<0)player[i].velocity.y-=(float)(player[i].tempdeltav)/multiplier/1000;
-                                    }
+                                if (target >= 0)player[i].velocity.y = 1;
+                                else if (player[i].crouchkeydown || player[i].aitype != playercontrolled) {
+                                    player[i].velocity.y = 7;
+                                    player[i].crouchtogglekeydown = 1;
+                                } else player[i].velocity.y = 5;
+
+                                if (mousejump && i == 0 && debugmode) {
+                                    if (!player[i].isLanding())player[i].tempdeltav = deltav;
+                                    if (player[i].tempdeltav < 0)player[i].velocity.y -= (float)(player[i].tempdeltav) / multiplier / 1000;
+                                }
 
-                                    player[i].coords.y+=.2;
-                                    player[i].jumppower-=1;
+                                player[i].coords.y += .2;
+                                player[i].jumppower -= 1;
 
-                                    if (!i)
-                                      emit_sound_at(whooshsound, player[i].coords, 128.);
+                                if (!i)
+                                    emit_sound_at(whooshsound, player[i].coords, 128.);
 
-                                    emit_sound_at(jumpsound, player[i].coords, 128.);
+                                emit_sound_at(jumpsound, player[i].coords, 128.);
                             }
-                            if((player[i].isIdle())&&player[i].jumppower>1){
+                            if ((player[i].isIdle()) && player[i].jumppower > 1) {
                                 player[i].setAnimation(player[i].getLanding());
-                                player[i].frameTarget=2;
-                                player[i].landhard=0;
-                                player[i].jumpstart=1;
-                                player[i].tempdeltav=deltav;
+                                player[i].frameTarget = 2;
+                                player[i].landhard = 0;
+                                player[i].jumpstart = 1;
+                                player[i].tempdeltav = deltav;
                             }
-                            if(player[i].animTarget==jumpupanim&&
-                                    (((!floatjump&&
-                                       !editorenabled)||
-                                      !debugmode)||
-                                     player[i].aitype!=playercontrolled)){
-                                if(player[i].jumppower>multiplier*6){
-                                    player[i].velocity.y+=multiplier*6;
-                                    player[i].jumppower-=multiplier*6;
+                            if (player[i].animTarget == jumpupanim &&
+                                    (((!floatjump &&
+                                       !editorenabled) ||
+                                      !debugmode) ||
+                                     player[i].aitype != playercontrolled)) {
+                                if (player[i].jumppower > multiplier * 6) {
+                                    player[i].velocity.y += multiplier * 6;
+                                    player[i].jumppower -= multiplier * 6;
                                 }
-                                if(player[i].jumppower<=multiplier*6){
-                                    player[i].velocity.y+=player[i].jumppower;
-                                    player[i].jumppower=0;
+                                if (player[i].jumppower <= multiplier * 6) {
+                                    player[i].velocity.y += player[i].jumppower;
+                                    player[i].jumppower = 0;
                                 }
                             }
-                            if(((floatjump||editorenabled)&&debugmode)&&i==0)player[i].velocity.y+=multiplier*30;
+                            if (((floatjump || editorenabled) && debugmode) && i == 0)player[i].velocity.y += multiplier * 30;
                         }
 
-                        if(!movekey){
-                            if(player[i].isRun()||player[i].animTarget==walkanim)
+                        if (!movekey) {
+                            if (player[i].isRun() || player[i].animTarget == walkanim)
                                 player[i].setAnimation(player[i].getStop());
-                            if(player[i].animTarget==sneakanim){
-                                player[i].animTarget=player[i].getCrouch();
-                                if(player[i].animCurrent==sneakanim)
-                                    player[i].target=0;
-                                player[i].frameTarget=0;
+                            if (player[i].animTarget == sneakanim) {
+                                player[i].animTarget = player[i].getCrouch();
+                                if (player[i].animCurrent == sneakanim)
+                                    player[i].target = 0;
+                                player[i].frameTarget = 0;
                             }
                         }
-                        if(player[i].animTarget==walkanim&&
-                                (player[i].aitype==attacktypecutoff||
-                                 player[i].aitype==searchtype||
-                                 (player[i].aitype==passivetype&&
-                                  player[i].numwaypoints<=1)))
+                        if (player[i].animTarget == walkanim &&
+                                (player[i].aitype == attacktypecutoff ||
+                                 player[i].aitype == searchtype ||
+                                 (player[i].aitype == passivetype &&
+                                  player[i].numwaypoints <= 1)))
                             player[i].setAnimation(player[i].getStop());
-                        if(player[i].isRun()&&(player[i].aitype==passivetype))
+                        if (player[i].isRun() && (player[i].aitype == passivetype))
                             player[i].setAnimation(player[i].getStop());
                     }
                 }
-                if(player[i].animTarget==rollanim)
-                    player[i].targetyaw=oldtargetyaw;
+                if (player[i].animTarget == rollanim)
+                    player[i].targetyaw = oldtargetyaw;
             }
 
             //Rotation
-            for(int k=0;k<numplayers;k++){
-                if(fabs(player[k].yaw-player[k].targetyaw)>180){
-                    if(player[k].yaw>player[k].targetyaw)
-                        player[k].yaw-=360;
+            for (int k = 0; k < numplayers; k++) {
+                if (fabs(player[k].yaw - player[k].targetyaw) > 180) {
+                    if (player[k].yaw > player[k].targetyaw)
+                        player[k].yaw -= 360;
                     else
-                        player[k].yaw+=360;
+                        player[k].yaw += 360;
                 }
 
                 //stop to turn in right direction
-                if(fabs(player[k].yaw-player[k].targetyaw)>90&&(player[k].isRun()||player[k].animTarget==walkanim))
+                if (fabs(player[k].yaw - player[k].targetyaw) > 90 && (player[k].isRun() || player[k].animTarget == walkanim))
                     player[k].setAnimation(player[k].getStop());
 
-                if(player[k].animTarget==backhandspringanim||player[k].animTarget==dodgebackanim)
-                    player[k].targettilt=0;
-
-                if(player[k].animTarget!=jumpupanim&&
-                        player[k].animTarget!=backhandspringanim&&
-                        player[k].animTarget!=jumpdownanim&&
-                        !player[k].isFlip()){
-                    player[k].targettilt=0;
-                    if(player[k].jumppower<0&&!player[k].jumpkeydown)
-                        player[k].jumppower=0;
-                    player[k].jumppower+=multiplier*7;
-                    if(player[k].isCrouch())
-                        player[k].jumppower+=multiplier*7;
-                    if(player[k].jumppower>5)
-                        player[k].jumppower=5;
+                if (player[k].animTarget == backhandspringanim || player[k].animTarget == dodgebackanim)
+                    player[k].targettilt = 0;
+
+                if (player[k].animTarget != jumpupanim &&
+                        player[k].animTarget != backhandspringanim &&
+                        player[k].animTarget != jumpdownanim &&
+                        !player[k].isFlip()) {
+                    player[k].targettilt = 0;
+                    if (player[k].jumppower < 0 && !player[k].jumpkeydown)
+                        player[k].jumppower = 0;
+                    player[k].jumppower += multiplier * 7;
+                    if (player[k].isCrouch())
+                        player[k].jumppower += multiplier * 7;
+                    if (player[k].jumppower > 5)
+                        player[k].jumppower = 5;
                 }
 
-                if(player[k].isRun())
-                    player[k].targettilt=(player[k].yaw-player[k].targetyaw)/4;
+                if (player[k].isRun())
+                    player[k].targettilt = (player[k].yaw - player[k].targetyaw) / 4;
 
-                player[k].tilt=stepTowardf(player[k].tilt,player[k].targettilt,multiplier*150);
-                player[k].grabdelay-=multiplier;
+                player[k].tilt = stepTowardf(player[k].tilt, player[k].targettilt, multiplier * 150);
+                player[k].grabdelay -= multiplier;
             }
 
             //do animations
-            for(int k=0;k<numplayers;k++){
+            for (int k = 0; k < numplayers; k++) {
                 player[k].DoAnimations();
-                player[k].whichpatchx=player[k].coords.x/(terrain.size/subdivision*terrain.scale);
-                player[k].whichpatchz=player[k].coords.z/(terrain.size/subdivision*terrain.scale);
+                player[k].whichpatchx = player[k].coords.x / (terrain.size / subdivision * terrain.scale);
+                player[k].whichpatchz = player[k].coords.z / (terrain.size / subdivision * terrain.scale);
             }
 
             //do stuff
             objects.DoStuff();
-            
-            for(int j=numenvsounds-1;j>=0;j--){
-                envsoundlife[j]-=multiplier;
-                if(envsoundlife[j]<0){
+
+            for (int j = numenvsounds - 1; j >= 0; j--) {
+                envsoundlife[j] -= multiplier;
+                if (envsoundlife[j] < 0) {
                     numenvsounds--;
-                    envsoundlife[j]=envsoundlife[numenvsounds];
-                    envsound[j]=envsound[numenvsounds];
+                    envsoundlife[j] = envsoundlife[numenvsounds];
+                    envsound[j] = envsound[numenvsounds];
                 }
             }
-            if(slomo)
+            if (slomo)
                 OPENAL_SetFrequency(OPENAL_ALL, slomofreq);
             else
                 OPENAL_SetFrequency(OPENAL_ALL, 22050);
 
-            if(tutoriallevel==1){
+            if (tutoriallevel == 1) {
                 XYZ temp;
                 XYZ temp2;
                 XYZ temp3;
                 XYZ oldtemp;
                 XYZ oldtemp2;
-                temp.x=1011;
-                temp.y=84;
-                temp.z=491;
-                temp2.x=1025;
-                temp2.y=75;
-                temp2.z=447;
-                temp3.x=1038;
-                temp3.y=76;
-                temp3.z=453;
-                oldtemp=temp;
-                oldtemp2=temp2;
-                if(tutorialstage>=51)
-                    if(distsq(&temp,&player[0].coords)>=distsq(&temp,&temp2)-1||distsq(&temp3,&player[0].coords)<4){
+                temp.x = 1011;
+                temp.y = 84;
+                temp.z = 491;
+                temp2.x = 1025;
+                temp2.y = 75;
+                temp2.z = 447;
+                temp3.x = 1038;
+                temp3.y = 76;
+                temp3.z = 453;
+                oldtemp = temp;
+                oldtemp2 = temp2;
+                if (tutorialstage >= 51)
+                    if (distsq(&temp, &player[0].coords) >= distsq(&temp, &temp2) - 1 || distsq(&temp3, &player[0].coords) < 4) {
                         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_menutheme);
 
-                        gameon=0;
-                        mainmenu=5;
+                        gameon = 0;
+                        mainmenu = 5;
 
                         fireSound();
 
                         flash();
                     }
-                if(tutorialstage<51)
-                    if(distsq(&temp,&player[0].coords)>=distsq(&temp,&temp2)-1||distsq(&temp3,&player[0].coords)<4){
+                if (tutorialstage < 51)
+                    if (distsq(&temp, &player[0].coords) >= distsq(&temp, &temp2) - 1 || distsq(&temp3, &player[0].coords) < 4) {
                         emit_sound_at(fireendsound, player[0].coords);
 
-                        player[0].coords=(oldtemp+oldtemp2)/2;
+                        player[0].coords = (oldtemp + oldtemp2) / 2;
 
                         flash();
                     }
-                if(tutorialstage>=14&&tutorialstage<50)
-                    if(distsq(&temp,&player[1].coords)>=distsq(&temp,&temp2)-1||distsq(&temp3,&player[1].coords)<4){
+                if (tutorialstage >= 14 && tutorialstage < 50)
+                    if (distsq(&temp, &player[1].coords) >= distsq(&temp, &temp2) - 1 || distsq(&temp3, &player[1].coords) < 4) {
                         emit_sound_at(fireendsound, player[1].coords);
 
-                        for(int i=0;i<player[1].skeleton.num_joints;i++){
-                            if(Random()%2==0){
-                                if(!player[1].skeleton.free)temp2=(player[1].coords-player[1].oldcoords)/multiplier/2;//velocity/2;
-                                if(player[1].skeleton.free)temp2=player[1].skeleton.joints[i].velocity*player[1].scale/2;
-                                if(!player[1].skeleton.free)temp=DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position,0,0,player[1].tilt),player[1].tilt2,0,0),0,player[1].yaw,0)*player[1].scale+player[1].coords;
-                                if(player[1].skeleton.free)temp=player[1].skeleton.joints[i].position*player[1].scale+player[1].coords;
-                                Sprite::MakeSprite(breathsprite, temp,temp2, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
+                        for (int i = 0; i < player[1].skeleton.num_joints; i++) {
+                            if (Random() % 2 == 0) {
+                                if (!player[1].skeleton.free)temp2 = (player[1].coords - player[1].oldcoords) / multiplier / 2; //velocity/2;
+                                if (player[1].skeleton.free)temp2 = player[1].skeleton.joints[i].velocity * player[1].scale / 2;
+                                if (!player[1].skeleton.free)temp = DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position, 0, 0, player[1].tilt), player[1].tilt2, 0, 0), 0, player[1].yaw, 0) * player[1].scale + player[1].coords;
+                                if (player[1].skeleton.free)temp = player[1].skeleton.joints[i].position * player[1].scale + player[1].coords;
+                                Sprite::MakeSprite(breathsprite, temp, temp2, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1);
                             }
                         }
 
-                        player[1].coords=(oldtemp+oldtemp2)/2;
-                        for(int i=0;i<player[1].skeleton.num_joints;i++){
-                            player[1].skeleton.joints[i].velocity=0;
-                            if(Random()%2==0){
-                                if(!player[1].skeleton.free)temp2=(player[1].coords-player[1].oldcoords)/multiplier/2;//velocity/2;
-                                if(player[1].skeleton.free)temp2=player[1].skeleton.joints[i].velocity*player[1].scale/2;
-                                if(!player[1].skeleton.free)temp=DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position,0,0,player[1].tilt),player[1].tilt2,0,0),0,player[1].yaw,0)*player[1].scale+player[1].coords;
-                                if(player[1].skeleton.free)temp=player[1].skeleton.joints[i].position*player[1].scale+player[1].coords;
-                                Sprite::MakeSprite(breathsprite, temp,temp2, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
+                        player[1].coords = (oldtemp + oldtemp2) / 2;
+                        for (int i = 0; i < player[1].skeleton.num_joints; i++) {
+                            player[1].skeleton.joints[i].velocity = 0;
+                            if (Random() % 2 == 0) {
+                                if (!player[1].skeleton.free)temp2 = (player[1].coords - player[1].oldcoords) / multiplier / 2; //velocity/2;
+                                if (player[1].skeleton.free)temp2 = player[1].skeleton.joints[i].velocity * player[1].scale / 2;
+                                if (!player[1].skeleton.free)temp = DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position, 0, 0, player[1].tilt), player[1].tilt2, 0, 0), 0, player[1].yaw, 0) * player[1].scale + player[1].coords;
+                                if (player[1].skeleton.free)temp = player[1].skeleton.joints[i].position * player[1].scale + player[1].coords;
+                                Sprite::MakeSprite(breathsprite, temp, temp2, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1);
                             }
                         }
                     }
@@ -7717,27 +7914,27 @@ void Game::Tick(){
 
             //3d sound
             static float gLoc[3];
-            gLoc[0]=viewer.x;
-            gLoc[1]=viewer.y;
-            gLoc[2]=viewer.z;
+            gLoc[0] = viewer.x;
+            gLoc[1] = viewer.y;
+            gLoc[2] = viewer.z;
             static float vel[3];
-            vel[0]=(viewer.x-oldviewer.x)/multiplier;
-            vel[1]=(viewer.y-oldviewer.y)/multiplier;
-            vel[2]=(viewer.z-oldviewer.z)/multiplier;
+            vel[0] = (viewer.x - oldviewer.x) / multiplier;
+            vel[1] = (viewer.y - oldviewer.y) / multiplier;
+            vel[2] = (viewer.z - oldviewer.z) / multiplier;
 
             //Set orientation with forward and up vectors
             static XYZ upvector;
-            upvector=0;
-            upvector.z=-1;
+            upvector = 0;
+            upvector.z = -1;
 
-            upvector=DoRotation(upvector,-pitch+90,0,0);
-            upvector=DoRotation(upvector,0,0-yaw,0);
+            upvector = DoRotation(upvector, -pitch + 90, 0, 0);
+            upvector = DoRotation(upvector, 0, 0 - yaw, 0);
 
-            facing=0;
-            facing.z=-1;
+            facing = 0;
+            facing.z = -1;
 
-            facing=DoRotation(facing,-pitch,0,0);
-            facing=DoRotation(facing,0,0-yaw,0);
+            facing = DoRotation(facing, -pitch, 0, 0);
+            facing = DoRotation(facing, 0, 0 - yaw, 0);
 
 
             static float ori[6];
@@ -7751,425 +7948,426 @@ void Game::Tick(){
             OPENAL_3D_Listener_SetAttributes(&gLoc[0], &vel[0], ori[0], ori[1], ori[2], ori[3], ori[4], ori[5]);
             OPENAL_Update();
 
-            oldviewer=viewer;
-               }
-       }
+            oldviewer = viewer;
+        }
+    }
 
-       if(Input::isKeyPressed(SDLK_F1))
-               Screenshot();
+    if (Input::isKeyPressed(SDLK_F1))
+        Screenshot();
 }
 
-void Game::TickOnce(){
-       if(mainmenu)
-               yaw+=multiplier*5;
-       else
-               if(directing||indialogue==-1) {
-                       yaw+=deltah*.7;
-                       if(!invertmouse)
-                pitch+=deltav*.7;
-                       if(invertmouse)
-                pitch-=deltav*.7;
-                       if(pitch>90)
-                pitch=90;
-                       if(pitch<-70)
-                pitch=-70;
-               }
+void Game::TickOnce()
+{
+    if (mainmenu)
+        yaw += multiplier * 5;
+    else if (directing || indialogue == -1) {
+        yaw += deltah * .7;
+        if (!invertmouse)
+            pitch += deltav * .7;
+        if (invertmouse)
+            pitch -= deltav * .7;
+        if (pitch > 90)
+            pitch = 90;
+        if (pitch < -70)
+            pitch = -70;
+    }
 }
 
-void Game::TickOnceAfter(){
-       static XYZ colviewer;
-       static XYZ coltarget;
-       static XYZ target;
-       static XYZ col;
-       static XYZ facing;
-       static float changedelay;
-       static bool alldead;
-       static float unseendelay;
-       static float cameraspeed;
-
-       if(!mainmenu){
-        static int oldmusictype=musictype;
-
-               if(environment==snowyenvironment)
-            leveltheme=stream_snowtheme;
-               if(environment==grassyenvironment)
-            leveltheme=stream_grasstheme;
-               if(environment==desertenvironment)
-            leveltheme=stream_deserttheme;
-
-               realthreat=0;
-
-               musictype=leveltheme;
-               for(int i=0;i<numplayers;i++){
-                       if((player[i].aitype==attacktypecutoff||
-                        player[i].aitype==getweapontype||
-                        player[i].aitype==gethelptype||
-                        player[i].aitype==searchtype)&&
-                    !player[i].dead/*&&player[i].surprised<=0*/&&
-                    (player[i].animTarget!=sneakattackedanim&&
-                     player[i].animTarget!=knifesneakattackedanim&&
-                     player[i].animTarget!=swordsneakattackedanim)){
-                               musictype=stream_fighttheme;
-                               realthreat=1;
-                       }
-               }
-               if(player[0].dead)
-            musictype=stream_menutheme;
-
-
-               if(musictype==stream_fighttheme)
-                       unseendelay=1;
-
-               if(oldmusictype==stream_fighttheme&&musictype!=stream_fighttheme){
-                       unseendelay-=multiplier;
-                       if(unseendelay>0)
-                               musictype=stream_fighttheme;
-               }
-
-
-               if(loading==2){
-                       musictype=stream_menutheme;
-                       musicvolume[2]=512;
-                       musicvolume[0]=0;
-                       musicvolume[1]=0;
-                       musicvolume[3]=0;
-               }
-
-               if(musictoggle)
-                       if(musictype!=oldmusictype&&musictype==stream_fighttheme)
-                               emit_sound_np(alarmsound);
-               musicselected=musictype;
-
-               if(musicselected==leveltheme)
-            musicvolume[0]+=multiplier*450;
-               else
-            musicvolume[0]-=multiplier*450;
-               if(musicselected==stream_fighttheme)
-            musicvolume[1]+=multiplier*450;
-               else
-            musicvolume[1]-=multiplier*450;
-               if(musicselected==stream_menutheme)
-            musicvolume[2]+=multiplier*450;
-               else
-            musicvolume[2]-=multiplier*450;
-
-               for(int i=0;i<3;i++){
-                       if(musicvolume[i]<0)
-                musicvolume[i]=0;
-                       if(musicvolume[i]>512)
-                musicvolume[i]=512;
-               }
-
-               if(musicvolume[2]>128&&!loading&&!mainmenu)
-            musicvolume[2]=128;
-
-               if(musictoggle){
-                       if(musicvolume[0]>0&&oldmusicvolume[0]<=0)
-                         emit_stream_np(leveltheme, musicvolume[0]);
-                       if(musicvolume[1]>0&&oldmusicvolume[1]<=0)
-                         emit_stream_np(stream_fighttheme, musicvolume[1]);
-                       if(musicvolume[2]>0&&oldmusicvolume[2]<=0)
-                         emit_stream_np(stream_menutheme, musicvolume[2]);
-                       if(musicvolume[0]<=0&&oldmusicvolume[0]>0)
-                               pause_sound(leveltheme);
-                       if(musicvolume[1]<=0&&oldmusicvolume[1]>0)
-                               pause_sound(stream_fighttheme);
-                       if(musicvolume[2]<=0&&oldmusicvolume[2]>0)
-                               pause_sound(stream_menutheme);
-
-                       if(musicvolume[0]!=oldmusicvolume[0])
-                               OPENAL_SetVolume(channels[leveltheme], musicvolume[0]);
-                       if(musicvolume[1]!=oldmusicvolume[1])
-                               OPENAL_SetVolume(channels[stream_fighttheme], musicvolume[1]);
-                       if(musicvolume[2]!=oldmusicvolume[2])
-                               OPENAL_SetVolume(channels[stream_menutheme], musicvolume[2]);
-
-                       for(int i=0;i<3;i++)
-                               oldmusicvolume[i]=musicvolume[i];
-               } 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;
-                       }
-               }
-
-               killhotspot=2;
-               for(int i=0;i<numhotspots;i++){
-                       if(hotspottype[i]>10&&hotspottype[i]<20){
-                               if(player[hotspottype[i]-10].dead==0)
-                                       killhotspot=0;
-                               else if(killhotspot==2)
-                                       killhotspot=1;
-                       }
-               }
-               if(killhotspot==2)
-            killhotspot=0;
-
-
-               winhotspot=false;
-               for(int i=0;i<numhotspots;i++)
-                       if(hotspottype[i]==-1)
-                               if(distsq(&player[0].coords,&hotspot[i])<hotspotsize[i])
-                                       winhotspot=true;
-
-               int numalarmed=0;
-               for(int i=1;i<numplayers;i++)
-                       if(!player[i].dead&&player[i].aitype==attacktypecutoff&&player[i].surprised<=0)
+void Game::TickOnceAfter()
+{
+    static XYZ colviewer;
+    static XYZ coltarget;
+    static XYZ target;
+    static XYZ col;
+    static XYZ facing;
+    static float changedelay;
+    static bool alldead;
+    static float unseendelay;
+    static float cameraspeed;
+
+    if (!mainmenu) {
+        static int oldmusictype = musictype;
+
+        if (environment == snowyenvironment)
+            leveltheme = stream_snowtheme;
+        if (environment == grassyenvironment)
+            leveltheme = stream_grasstheme;
+        if (environment == desertenvironment)
+            leveltheme = stream_deserttheme;
+
+        realthreat = 0;
+
+        musictype = leveltheme;
+        for (int i = 0; i < numplayers; i++) {
+            if ((player[i].aitype == attacktypecutoff ||
+                    player[i].aitype == getweapontype ||
+                    player[i].aitype == gethelptype ||
+                    player[i].aitype == searchtype) &&
+                    !player[i].dead/*&&player[i].surprised<=0*/ &&
+                    (player[i].animTarget != sneakattackedanim &&
+                     player[i].animTarget != knifesneakattackedanim &&
+                     player[i].animTarget != swordsneakattackedanim)) {
+                musictype = stream_fighttheme;
+                realthreat = 1;
+            }
+        }
+        if (player[0].dead)
+            musictype = stream_menutheme;
+
+
+        if (musictype == stream_fighttheme)
+            unseendelay = 1;
+
+        if (oldmusictype == stream_fighttheme && musictype != stream_fighttheme) {
+            unseendelay -= multiplier;
+            if (unseendelay > 0)
+                musictype = stream_fighttheme;
+        }
+
+
+        if (loading == 2) {
+            musictype = stream_menutheme;
+            musicvolume[2] = 512;
+            musicvolume[0] = 0;
+            musicvolume[1] = 0;
+            musicvolume[3] = 0;
+        }
+
+        if (musictoggle)
+            if (musictype != oldmusictype && musictype == stream_fighttheme)
+                emit_sound_np(alarmsound);
+        musicselected = musictype;
+
+        if (musicselected == leveltheme)
+            musicvolume[0] += multiplier * 450;
+        else
+            musicvolume[0] -= multiplier * 450;
+        if (musicselected == stream_fighttheme)
+            musicvolume[1] += multiplier * 450;
+        else
+            musicvolume[1] -= multiplier * 450;
+        if (musicselected == stream_menutheme)
+            musicvolume[2] += multiplier * 450;
+        else
+            musicvolume[2] -= multiplier * 450;
+
+        for (int i = 0; i < 3; i++) {
+            if (musicvolume[i] < 0)
+                musicvolume[i] = 0;
+            if (musicvolume[i] > 512)
+                musicvolume[i] = 512;
+        }
+
+        if (musicvolume[2] > 128 && !loading && !mainmenu)
+            musicvolume[2] = 128;
+
+        if (musictoggle) {
+            if (musicvolume[0] > 0 && oldmusicvolume[0] <= 0)
+                emit_stream_np(leveltheme, musicvolume[0]);
+            if (musicvolume[1] > 0 && oldmusicvolume[1] <= 0)
+                emit_stream_np(stream_fighttheme, musicvolume[1]);
+            if (musicvolume[2] > 0 && oldmusicvolume[2] <= 0)
+                emit_stream_np(stream_menutheme, musicvolume[2]);
+            if (musicvolume[0] <= 0 && oldmusicvolume[0] > 0)
+                pause_sound(leveltheme);
+            if (musicvolume[1] <= 0 && oldmusicvolume[1] > 0)
+                pause_sound(stream_fighttheme);
+            if (musicvolume[2] <= 0 && oldmusicvolume[2] > 0)
+                pause_sound(stream_menutheme);
+
+            if (musicvolume[0] != oldmusicvolume[0])
+                OPENAL_SetVolume(channels[leveltheme], musicvolume[0]);
+            if (musicvolume[1] != oldmusicvolume[1])
+                OPENAL_SetVolume(channels[stream_fighttheme], musicvolume[1]);
+            if (musicvolume[2] != oldmusicvolume[2])
+                OPENAL_SetVolume(channels[stream_menutheme], musicvolume[2]);
+
+            for (int i = 0; i < 3; i++)
+                oldmusicvolume[i] = musicvolume[i];
+        } 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;
+            }
+        }
+
+        killhotspot = 2;
+        for (int i = 0; i < numhotspots; i++) {
+            if (hotspottype[i] > 10 && hotspottype[i] < 20) {
+                if (player[hotspottype[i] - 10].dead == 0)
+                    killhotspot = 0;
+                else if (killhotspot == 2)
+                    killhotspot = 1;
+            }
+        }
+        if (killhotspot == 2)
+            killhotspot = 0;
+
+
+        winhotspot = false;
+        for (int i = 0; i < numhotspots; i++)
+            if (hotspottype[i] == -1)
+                if (distsq(&player[0].coords, &hotspot[i]) < hotspotsize[i])
+                    winhotspot = true;
+
+        int numalarmed = 0;
+        for (int i = 1; i < numplayers; i++)
+            if (!player[i].dead && player[i].aitype == attacktypecutoff && player[i].surprised <= 0)
                 numalarmed++;
-               if(numalarmed>maxalarmed)
-            maxalarmed=numalarmed;
-
-               if(changedelay<=0&&!loading&&!editorenabled&&gameon&&!tutoriallevel&&changedelay!=-999&&!won){
-                       if(player[0].dead&&changedelay<=0){
-                               changedelay=1;
-                               targetlevel=whichlevel;
-                       }
-                       alldead=true;
-                       for(int i=1;i<numplayers;i++) {
-                               if(!player[i].dead&&player[i].howactive<typedead1) {
-                    alldead=false;
+        if (numalarmed > maxalarmed)
+            maxalarmed = numalarmed;
+
+        if (changedelay <= 0 && !loading && !editorenabled && gameon && !tutoriallevel && changedelay != -999 && !won) {
+            if (player[0].dead && changedelay <= 0) {
+                changedelay = 1;
+                targetlevel = whichlevel;
+            }
+            alldead = true;
+            for (int i = 1; i < numplayers; i++) {
+                if (!player[i].dead && player[i].howactive < typedead1) {
+                    alldead = false;
                     break;
-                               }
-                       }
-
-
-                       if(alldead&&!player[0].dead&&maptype==mapkilleveryone) {
-                               changedelay=1;
-                               targetlevel=whichlevel+1;
-                               if(targetlevel>numchallengelevels-1)targetlevel=0;
-                       }
-                       if(winhotspot||windialogue) {
-                               changedelay=0.1;
-                               targetlevel=whichlevel+1;
-                               if(targetlevel>numchallengelevels-1)targetlevel=0;
-                       }
-
-
-                       if(killhotspot){
-                               changedelay=1;
-                               targetlevel=whichlevel+1;
-                               if(targetlevel>numchallengelevels-1)targetlevel=0;
-                       }
-
-                       if(changedelay>0&&!player[0].dead&&!won) {
-                               //high scores, awards, win
-                               if(campaign) {
-                                       accountactive->winCampaignLevel(whichchoice, bonustotal, leveltime);
-                                       scoreadded=1;
-                               } else {
-                                       accountactive->winLevel(whichlevel,bonustotal-startbonustotal,leveltime);
-                               }
-                               won=1;
-                       }
-               }
-
-               if(!winfreeze){
-
-                       if(leveltime<1){
-                               loading=0;
-                               changedelay=.1;
-                               alldead=false;
-                               winhotspot=false;
-                               killhotspot=0;
-                       }
-
-                       if(!editorenabled&&gameon&&!mainmenu) {
-                               if(changedelay!=-999)
-                    changedelay-=multiplier/7;
-                               if(player[0].dead)
-                    targetlevel=whichlevel;
-                               if(loading==2&&!campaign){
-                                       flash();
-
-                                       fireSound(firestartsound);
-
-                                       if(!player[0].dead&&targetlevel!=whichlevel)
-                                               startbonustotal=bonustotal;
-                                       if(player[0].dead)
+                }
+            }
+
+
+            if (alldead && !player[0].dead && maptype == mapkilleveryone) {
+                changedelay = 1;
+                targetlevel = whichlevel + 1;
+                if (targetlevel > numchallengelevels - 1)targetlevel = 0;
+            }
+            if (winhotspot || windialogue) {
+                changedelay = 0.1;
+                targetlevel = whichlevel + 1;
+                if (targetlevel > numchallengelevels - 1)targetlevel = 0;
+            }
+
+
+            if (killhotspot) {
+                changedelay = 1;
+                targetlevel = whichlevel + 1;
+                if (targetlevel > numchallengelevels - 1)targetlevel = 0;
+            }
+
+            if (changedelay > 0 && !player[0].dead && !won) {
+                //high scores, awards, win
+                if (campaign) {
+                    accountactive->winCampaignLevel(whichchoice, bonustotal, leveltime);
+                    scoreadded = 1;
+                } else {
+                    accountactive->winLevel(whichlevel, bonustotal - startbonustotal, leveltime);
+                }
+                won = 1;
+            }
+        }
+
+        if (!winfreeze) {
+
+            if (leveltime < 1) {
+                loading = 0;
+                changedelay = .1;
+                alldead = false;
+                winhotspot = false;
+                killhotspot = 0;
+            }
+
+            if (!editorenabled && gameon && !mainmenu) {
+                if (changedelay != -999)
+                    changedelay -= multiplier / 7;
+                if (player[0].dead)
+                    targetlevel = whichlevel;
+                if (loading == 2 && !campaign) {
+                    flash();
+
+                    fireSound(firestartsound);
+
+                    if (!player[0].dead && targetlevel != whichlevel)
+                        startbonustotal = bonustotal;
+                    if (player[0].dead)
                         Loadlevel(whichlevel);
-                                       else
+                    else
                         Loadlevel(targetlevel);
 
-                                       fireSound();
+                    fireSound();
 
-                                       loading=3;
-                               }
-                               if(loading==2&&targetlevel==whichlevel){
-                                       flash();
-                                       loadtime=0;
+                    loading = 3;
+                }
+                if (loading == 2 && targetlevel == whichlevel) {
+                    flash();
+                    loadtime = 0;
 
-                                       fireSound(firestartsound);
+                    fireSound(firestartsound);
 
-                                       Loadlevel(campaignlevels[accountactive->getCampaignChoicesMade()].mapname.c_str());
+                    Loadlevel(campaignlevels[accountactive->getCampaignChoicesMade()].mapname.c_str());
 
-                                       fireSound();
+                    fireSound();
 
-                                       loading=3;
-                               }
-                               if(changedelay<=-999&&
-                        whichlevel!=-2&&
-                        !loading&&
-                        (player[0].dead||
-                         (alldead&&maptype==mapkilleveryone)||
-                         (winhotspot)||
+                    loading = 3;
+                }
+                if (changedelay <= -999 &&
+                        whichlevel != -2 &&
+                        !loading &&
+                        (player[0].dead ||
+                         (alldead && maptype == mapkilleveryone) ||
+                         (winhotspot) ||
                          (killhotspot)))
-                    loading=1;
-                               if((player[0].dead||
-                            (alldead&&maptype==mapkilleveryone)||
-                            (winhotspot)||
-                            (windialogue)||
-                            (killhotspot))&&
-                        changedelay<=0) {
-                    if(whichlevel!=-2&&!loading&&!player[0].dead) {
-                        winfreeze=true;
-                        changedelay=-999;
+                    loading = 1;
+                if ((player[0].dead ||
+                        (alldead && maptype == mapkilleveryone) ||
+                        (winhotspot) ||
+                        (windialogue) ||
+                        (killhotspot)) &&
+                        changedelay <= 0) {
+                    if (whichlevel != -2 && !loading && !player[0].dead) {
+                        winfreeze = true;
+                        changedelay = -999;
                     }
-                    if(player[0].dead)
-                        loading=1;
-                               }
-                       }
+                    if (player[0].dead)
+                        loading = 1;
+                }
+            }
 
-                       if(campaign) {
+            if (campaign) {
                 // campaignchoosenext determines what to do when the level is complete:
                 // 0 = load next level
                 // 1 = go back to level select screen
                 // 2 = stealthload next level
-                               if(mainmenu==0&&winfreeze&&(campaignlevels[actuallevel].choosenext)==1) {
-                                       if(campaignlevels[actuallevel].nextlevel.empty())
-                                               endgame=1;
-                               } else if(mainmenu==0&&winfreeze) {
-                                       stealthloading = (campaignlevels[actuallevel].choosenext==2);
+                if (mainmenu == 0 && winfreeze && (campaignlevels[actuallevel].choosenext) == 1) {
+                    if (campaignlevels[actuallevel].nextlevel.empty())
+                        endgame = 1;
+                } else if (mainmenu == 0 && winfreeze) {
+                    stealthloading = (campaignlevels[actuallevel].choosenext == 2);
 
-                                       if(!stealthloading){
-                                               fireSound(firestartsound);
+                    if (!stealthloading) {
+                        fireSound(firestartsound);
 
-                                               flash();
-                                       }
-
-                                       startbonustotal=0;
-
-                                       LoadCampaign();
-
-                                       loading=2;
-                                       loadtime=0;
-                                       targetlevel=7;
-                                       if(!firstload)
-                                               LoadStuff();
-                                       whichchoice=0;
-                                       actuallevel=campaignlevels[actuallevel].nextlevel.front();
-                                       visibleloading=1;
-                                       stillloading=1;
-                                       Loadlevel(campaignlevels[actuallevel].mapname.c_str());
-                                       campaign=1;
-                                       mainmenu=0;
-                                       gameon=1;
-                                       pause_sound(stream_menutheme);
+                        flash();
+                    }
 
-                                       stealthloading=0;
-                               }
+                    startbonustotal = 0;
+
+                    LoadCampaign();
+
+                    loading = 2;
+                    loadtime = 0;
+                    targetlevel = 7;
+                    if (!firstload)
+                        LoadStuff();
+                    whichchoice = 0;
+                    actuallevel = campaignlevels[actuallevel].nextlevel.front();
+                    visibleloading = 1;
+                    stillloading = 1;
+                    Loadlevel(campaignlevels[actuallevel].mapname.c_str());
+                    campaign = 1;
+                    mainmenu = 0;
+                    gameon = 1;
+                    pause_sound(stream_menutheme);
+
+                    stealthloading = 0;
+                }
             }
 
-            if(loading==3)
-                loading=0;
+            if (loading == 3)
+                loading = 0;
 
         }
 
-        oldmusictype=musictype;
-       }
-
-       facing=0;
-       facing.z=-1;
-
-       facing=DoRotation(facing,-pitch,0,0);
-       facing=DoRotation(facing,0,0-yaw,0);
-       viewerfacing=facing;
-
-       if(!cameramode){
-               if((animation[player[0].animTarget].attack!=3&&animation[player[0].animCurrent].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;
-               target.y+=.1;
-               if(player[0].skeleton.free){
-                       for(int i=0;i<player[0].skeleton.num_joints;i++){
-                               if(player[0].skeleton.joints[i].position.y*player[0].scale+player[0].coords.y>target.y)
-                                       target.y=player[0].skeleton.joints[i].position.y*player[0].scale+player[0].coords.y;
-                       }
-                       target.y+=.1;
-               }
-               if(player[0].skeleton.free!=2/*&&!autocam*/){
-                       cameraspeed=20;
-                       if(findLengthfast(&player[0].velocity)>400){
-                               cameraspeed=20+(findLength(&player[0].velocity)-20)*.96;
-                       }
-                       if(player[0].skeleton.free==0&&player[0].animTarget!=hanganim&&player[0].animTarget!=climbanim)target.y+=1.4;
-                       coltarget=target-cameraloc;
-                       if(findLengthfast(&coltarget)<multiplier*multiplier*400)cameraloc=target;
-                       else {
-                               Normalise(&coltarget);
-                               if(player[0].animTarget!=hanganim&&player[0].animTarget!=climbanim&&player[0].animCurrent!=climbanim&&player[0].currentoffset.x==0)cameraloc=cameraloc+coltarget*multiplier*cameraspeed;
-                               else cameraloc=cameraloc+coltarget*multiplier*8;
-                       }
-                       if(editorenabled)cameraloc=target;
-                       cameradist+=multiplier*5;
-                       if(cameradist>2.3)cameradist=2.3;
-                       viewer=cameraloc-facing*cameradist;
-                       colviewer=viewer;
-                       coltarget=cameraloc;
-                       objects.SphereCheckPossible(&colviewer, findDistance(&colviewer,&coltarget));
-                       if(terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz])
-                               for(int j=0;j<terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz];j++){
-                                       int i=terrain.patchobjects[player[0].whichpatchx][player[0].whichpatchz][j];
-                                       colviewer=viewer;
-                                       coltarget=cameraloc;
-                                       if(objects.model[i].LineCheckPossible(&colviewer,&coltarget,&col,&objects.position[i],&objects.yaw[i])!=-1)viewer=col;
-                               }
-            if(terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz])
-                for(int j=0;j<terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz];j++){
-                    int i=terrain.patchobjects[player[0].whichpatchx][player[0].whichpatchz][j];
-                    colviewer=viewer;
-                    if(objects.model[i].SphereCheck(&colviewer,.15,&col,&objects.position[i],&objects.yaw[i])!=-1){
-                        viewer=colviewer;
+        oldmusictype = musictype;
+    }
+
+    facing = 0;
+    facing.z = -1;
+
+    facing = DoRotation(facing, -pitch, 0, 0);
+    facing = DoRotation(facing, 0, 0 - yaw, 0);
+    viewerfacing = facing;
+
+    if (!cameramode) {
+        if ((animation[player[0].animTarget].attack != 3 && animation[player[0].animCurrent].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;
+        target.y += .1;
+        if (player[0].skeleton.free) {
+            for (int i = 0; i < player[0].skeleton.num_joints; i++) {
+                if (player[0].skeleton.joints[i].position.y * player[0].scale + player[0].coords.y > target.y)
+                    target.y = player[0].skeleton.joints[i].position.y * player[0].scale + player[0].coords.y;
+            }
+            target.y += .1;
+        }
+        if (player[0].skeleton.free != 2/*&&!autocam*/) {
+            cameraspeed = 20;
+            if (findLengthfast(&player[0].velocity) > 400) {
+                cameraspeed = 20 + (findLength(&player[0].velocity) - 20) * .96;
+            }
+            if (player[0].skeleton.free == 0 && player[0].animTarget != hanganim && player[0].animTarget != climbanim)target.y += 1.4;
+            coltarget = target - cameraloc;
+            if (findLengthfast(&coltarget) < multiplier * multiplier * 400)cameraloc = target;
+            else {
+                Normalise(&coltarget);
+                if (player[0].animTarget != hanganim && player[0].animTarget != climbanim && player[0].animCurrent != climbanim && player[0].currentoffset.x == 0)cameraloc = cameraloc + coltarget * multiplier * cameraspeed;
+                else cameraloc = cameraloc + coltarget * multiplier * 8;
+            }
+            if (editorenabled)cameraloc = target;
+            cameradist += multiplier * 5;
+            if (cameradist > 2.3)cameradist = 2.3;
+            viewer = cameraloc - facing * cameradist;
+            colviewer = viewer;
+            coltarget = cameraloc;
+            objects.SphereCheckPossible(&colviewer, findDistance(&colviewer, &coltarget));
+            if (terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz])
+                for (int j = 0; j < terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz]; j++) {
+                    int i = terrain.patchobjects[player[0].whichpatchx][player[0].whichpatchz][j];
+                    colviewer = viewer;
+                    coltarget = cameraloc;
+                    if (objects.model[i].LineCheckPossible(&colviewer, &coltarget, &col, &objects.position[i], &objects.yaw[i]) != -1)viewer = col;
+                }
+            if (terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz])
+                for (int j = 0; j < terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz]; j++) {
+                    int i = terrain.patchobjects[player[0].whichpatchx][player[0].whichpatchz][j];
+                    colviewer = viewer;
+                    if (objects.model[i].SphereCheck(&colviewer, .15, &col, &objects.position[i], &objects.yaw[i]) != -1) {
+                        viewer = colviewer;
                     }
                 }
-            cameradist=findDistance(&viewer,&target);
-            viewer.y=max((double)viewer.y,terrain.getHeight(viewer.x,viewer.z)+.6);
-            if(cameraloc.y<terrain.getHeight(cameraloc.x,cameraloc.z)){
-                cameraloc.y=terrain.getHeight(cameraloc.x,cameraloc.z);
+            cameradist = findDistance(&viewer, &target);
+            viewer.y = max((double)viewer.y, terrain.getHeight(viewer.x, viewer.z) + .6);
+            if (cameraloc.y < terrain.getHeight(cameraloc.x, cameraloc.z)) {
+                cameraloc.y = terrain.getHeight(cameraloc.x, cameraloc.z);
             }
-               }
+        }
         /*
         //what did autocam do?
-               if(player[0].skeleton.free!=2&&autocam){
-                       cameraspeed=20;
-                       if(findLengthfast(&player[0].velocity)>400){
-                               cameraspeed=20+(findLength(&player[0].velocity)-20)*.96;
-                       }
-                       if(player[0].skeleton.free==0&&player[0].animTarget!=hanganim&&player[0].animTarget!=climbanim)target.y+=1.4;
-                       cameradist+=multiplier*5;
-                       if(cameradist>3.3)cameradist=3.3;
-                       coltarget=target-cameraloc;
-                       if(findLengthfast(&coltarget)<multiplier*multiplier*400)cameraloc=target;
-                       else if(findLengthfast(&coltarget)>1)
-                       {
-                               Normalise(&coltarget);
-                               if(player[0].animTarget!=hanganim&&player[0].animTarget!=climbanim&&player[0].animCurrent!=climbanim&&player[0].currentoffset.x==0)cameraloc=cameraloc+coltarget*multiplier*cameraspeed;
-                               else cameraloc=cameraloc+coltarget*multiplier*8;
-                       }
-                       if(editorenabled)cameraloc=target;
-                       viewer=cameraloc;
-                       colviewer=viewer;
-                       coltarget=cameraloc;
-                       objects.SphereCheckPossible(&colviewer, findDistance(&colviewer,&coltarget));
-                       if(terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz])
-                               for(int j=0;j<terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz];j++){
-                                       int i=terrain.patchobjects[player[0].whichpatchx][player[0].whichpatchz][j];
-                                       colviewer=viewer;
-                                       coltarget=cameraloc;
-                                       if(objects.model[i].LineCheckPossible(&colviewer,&coltarget,&col,&objects.position[i],&objects.yaw[i])!=-1)viewer=col;
-                               }
+        if(player[0].skeleton.free!=2&&autocam){
+               cameraspeed=20;
+               if(findLengthfast(&player[0].velocity)>400){
+                       cameraspeed=20+(findLength(&player[0].velocity)-20)*.96;
+               }
+               if(player[0].skeleton.free==0&&player[0].animTarget!=hanganim&&player[0].animTarget!=climbanim)target.y+=1.4;
+               cameradist+=multiplier*5;
+               if(cameradist>3.3)cameradist=3.3;
+               coltarget=target-cameraloc;
+               if(findLengthfast(&coltarget)<multiplier*multiplier*400)cameraloc=target;
+               else if(findLengthfast(&coltarget)>1)
+               {
+                       Normalise(&coltarget);
+                       if(player[0].animTarget!=hanganim&&player[0].animTarget!=climbanim&&player[0].animCurrent!=climbanim&&player[0].currentoffset.x==0)cameraloc=cameraloc+coltarget*multiplier*cameraspeed;
+                       else cameraloc=cameraloc+coltarget*multiplier*8;
+               }
+               if(editorenabled)cameraloc=target;
+               viewer=cameraloc;
+               colviewer=viewer;
+               coltarget=cameraloc;
+               objects.SphereCheckPossible(&colviewer, findDistance(&colviewer,&coltarget));
+               if(terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz])
+                       for(int j=0;j<terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz];j++){
+                               int i=terrain.patchobjects[player[0].whichpatchx][player[0].whichpatchz][j];
+                               colviewer=viewer;
+                               coltarget=cameraloc;
+                               if(objects.model[i].LineCheckPossible(&colviewer,&coltarget,&col,&objects.position[i],&objects.yaw[i])!=-1)viewer=col;
+                       }
             if(terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz])
                 for(int j=0;j<terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz];j++){
                     int i=terrain.patchobjects[player[0].whichpatchx][player[0].whichpatchz][j];
@@ -8183,25 +8381,25 @@ void Game::TickOnceAfter(){
             if(cameraloc.y<terrain.getHeight(cameraloc.x,cameraloc.z)){
                 cameraloc.y=terrain.getHeight(cameraloc.x,cameraloc.z);
             }
-               }
+        }
         */
-               if(camerashake>.8)camerashake=.8;
-               //if(woozy>10)woozy=10;
-               //woozy+=multiplier;
-               woozy+=multiplier;
-               if(player[0].dead)camerashake=0;
-               if(player[0].dead)woozy=0;
-               camerashake-=multiplier*2;
-               blackout-=multiplier*2;
-               //if(player[0].isCrouch())woozy-=multiplier*8;
-               if(camerashake<0)camerashake=0;
-               if(blackout<0)blackout=0;
-               //if(woozy<0)woozy=0;
-               if(camerashake){
-                       viewer.x+=(float)(Random()%100)*.0005*camerashake;
-                       viewer.y+=(float)(Random()%100)*.0005*camerashake;
-                       viewer.z+=(float)(Random()%100)*.0005*camerashake;
-               }
-       }
+        if (camerashake > .8)camerashake = .8;
+        //if(woozy>10)woozy=10;
+        //woozy+=multiplier;
+        woozy += multiplier;
+        if (player[0].dead)camerashake = 0;
+        if (player[0].dead)woozy = 0;
+        camerashake -= multiplier * 2;
+        blackout -= multiplier * 2;
+        //if(player[0].isCrouch())woozy-=multiplier*8;
+        if (camerashake < 0)camerashake = 0;
+        if (blackout < 0)blackout = 0;
+        //if(woozy<0)woozy=0;
+        if (camerashake) {
+            viewer.x += (float)(Random() % 100) * .0005 * camerashake;
+            viewer.y += (float)(Random() % 100) * .0005 * camerashake;
+            viewer.z += (float)(Random() % 100) * .0005 * camerashake;
+        }
+    }
 }
 
index 6add2e26c628899f353e29288aa39fb1d618798f..b3f36133ab10ff96829fba4a10604cf5c8e86d11 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -54,11 +54,11 @@ float windvar = 0;
 float precipdelay = 0;
 float gamespeed = 0;
 float oldgamespeed = 0;
-float tintr = 0,tintg = 0,tintb = 0;
+float tintr = 0, tintg = 0, tintb = 0;
 int difficulty = 0;
 float multiplier = 0;
 float realmultiplier = 0;
-float screenwidth = 0,screenheight = 0;
+float screenwidth = 0, screenheight = 0;
 float viewdistance = 0;
 XYZ viewer;
 XYZ viewerfacing;
@@ -85,8 +85,8 @@ float playerdist = 0;
 Objects objects;
 int slomo = 0;
 float slomodelay = 0;
-GLubyte bloodText[512*512*3] = {0};
-GLubyte wolfbloodText[512*512*3] = {0};
+GLubyte bloodText[512 * 512 * 3] = {0};
+GLubyte wolfbloodText[512 * 512 * 3] = {0};
 float colors[3] = {0};
 int bloodtoggle = 0;
 bool osx = false;
@@ -103,7 +103,7 @@ bool ambientsound = false;
 bool mousejump = false;
 bool freeze = false;
 bool winfreeze = false;
-float flashamount = 0,flashr = 0,flashg = 0,flashb = 0;
+float flashamount = 0, flashr = 0, flashg = 0, flashb = 0;
 int flashdelay = 0;
 bool vblsync = false;
 float motionbluramount = 0;
@@ -129,7 +129,7 @@ XYZ hotspot[40];
 int hotspottype[40] = {0};
 float hotspotsize[40] = {0};
 char hotspottext[40][256] = {0};
-int currenthotspot = 0;        
+int currenthotspot = 0;
 int killhotspot = 0;
 
 float menupulse = 0;
index f7ab1ffa3dc6a5328c99a061575f0ba3df1410ca..08c5732f35e4b289c5f1bae0e4784a7e8fa1b7fe 100644 (file)
@@ -11,7 +11,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -25,62 +25,68 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 extern bool keyboardfrozen;
 
-bool keyDown[SDLK_LAST+6];
-bool keyPressed[SDLK_LAST+6];
+bool keyDown[SDLK_LAST + 6];
+bool keyPressed[SDLK_LAST + 6];
 
-void Input::Tick(){
+void Input::Tick()
+{
     SDL_PumpEvents();
-       Uint8 *keyState = SDL_GetKeyState(NULL);
-    for(int i=0;i<SDLK_LAST;i++){
-        keyPressed[i] = !keyDown[i]&&keyState[i];
+    Uint8 *keyState = SDL_GetKeyState(NULL);
+    for (int i = 0; i < SDLK_LAST; i++) {
+        keyPressed[i] = !keyDown[i] && keyState[i];
         keyDown[i] = keyState[i];
     }
-    Uint8 mb = SDL_GetMouseState(NULL,NULL);
-    for(int i=1;i<6;i++){
-        keyPressed[SDLK_LAST+i] = !keyDown[SDLK_LAST+i]&&(mb&SDL_BUTTON(i));
-        keyDown[SDLK_LAST+i] = (mb&SDL_BUTTON(i));
+    Uint8 mb = SDL_GetMouseState(NULL, NULL);
+    for (int i = 1; i < 6; i++) {
+        keyPressed[SDLK_LAST + i] = !keyDown[SDLK_LAST + i] && (mb & SDL_BUTTON(i));
+        keyDown[SDLK_LAST + i] = (mb & SDL_BUTTON(i));
     }
 }
 
-bool Input::isKeyDown(int k) {
-       if(keyboardfrozen||k>=SDLK_LAST+6) // really useful? check that.
+bool Input::isKeyDown(int k)
+{
+    if (keyboardfrozen || k >= SDLK_LAST + 6) // really useful? check that.
         return false;
     return keyDown[k];
 }
 
-bool Input::isKeyPressed(int k) {
-       if(keyboardfrozen||k>=SDLK_LAST+6)
+bool Input::isKeyPressed(int k)
+{
+    if (keyboardfrozen || k >= SDLK_LAST + 6)
         return false;
     return keyPressed[k];
 }
 
-const char* Input::keyToChar(unsigned short i) {
-       if(i<SDLK_LAST)
-               return SDL_GetKeyName(SDLKey(i));
-       else if(i==SDLK_LAST+SDL_BUTTON_LEFT)
-               return "mouse1";
-       else if(i==SDLK_LAST+SDL_BUTTON_RIGHT)
-               return "mouse2";
-       else if(i==SDLK_LAST+SDL_BUTTON_MIDDLE)
-               return "mouse3";
-       else
-               return "unknown";
+const char* Input::keyToChar(unsigned short i)
+{
+    if (i < SDLK_LAST)
+        return SDL_GetKeyName(SDLKey(i));
+    else if (i == SDLK_LAST + SDL_BUTTON_LEFT)
+        return "mouse1";
+    else if (i == SDLK_LAST + SDL_BUTTON_RIGHT)
+        return "mouse2";
+    else if (i == SDLK_LAST + SDL_BUTTON_MIDDLE)
+        return "mouse3";
+    else
+        return "unknown";
 }
 
-unsigned short         Input::CharToKey(const char* which) {
-       for(unsigned short i=0;i<SDLK_LAST;i++) {
-               if(!strcasecmp(which,SDL_GetKeyName(SDLKey(i))))
-                       return i;
-       }
-       if(!strcasecmp(which,"mouse1")){
-               return MOUSEBUTTON1;
-       }
-       if(!strcasecmp(which,"mouse2")){
-               return MOUSEBUTTON2;
-       }
-       return SDLK_LAST;
+unsigned short         Input::CharToKey(const char* which)
+{
+    for (unsigned short i = 0; i < SDLK_LAST; i++) {
+        if (!strcasecmp(which, SDL_GetKeyName(SDLKey(i))))
+            return i;
+    }
+    if (!strcasecmp(which, "mouse1")) {
+        return MOUSEBUTTON1;
+    }
+    if (!strcasecmp(which, "mouse2")) {
+        return MOUSEBUTTON2;
+    }
+    return SDLK_LAST;
 }
 
-Boolean Input::MouseClicked(){
-    return isKeyPressed(SDLK_LAST+SDL_BUTTON_LEFT);
+Boolean Input::MouseClicked()
+{
+    return isKeyPressed(SDLK_LAST + SDL_BUTTON_LEFT);
 }
index 0895cb4b3f4fdec63af229f46d4cdeb65649f4ad..3719c07ed409a8868d3de8273f85f12ab4c2ec5f 100644 (file)
@@ -11,7 +11,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -32,14 +32,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #define MOUSEBUTTON2           SDLK_LAST+SDL_BUTTON_RIGHT
 
 /**> FUNCTION PROTOTYPES <**/
-class Input {
-       public:
-               static void Tick();
-               static bool isKeyDown(int k);
-               static bool isKeyPressed(int k);
-               static const char* keyToChar(unsigned short which);
-               static unsigned short   CharToKey(const char* which);
-               static Boolean MouseClicked();
+class Input
+{
+public:
+    static void Tick();
+    static bool isKeyDown(int k);
+    static bool isKeyPressed(int k);
+    static const char* keyToChar(unsigned short which);
+    static unsigned short      CharToKey(const char* which);
+    static Boolean MouseClicked();
 };
 
 #endif
index 9a351c9ae070b7a02fd1e02a18df53f99d0d4a08..ab93c865dde655c5fa8df63ac8f5b087aead4480 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -22,73 +22,75 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 /**> HEADER FILES <**/
 #include "Lights.h"
 
-void SetUpLight(Light* whichsource, int whichlight){
-       static float qattenuation[]={0.0002f};
-       static float cattenuation[]={1.5f};
-       static float lattenuation[]={0.5f};
-       static float zattenuation[]={0.0f};
-       
-       //Initialize lights
-       if(whichlight==0){
-               GLfloat LightAmbient[]=         { whichsource->ambient[0], whichsource->ambient[1], whichsource->ambient[2], 1.0f};
-               GLfloat LightDiffuse[]=         { whichsource->color[0], whichsource->color[1], whichsource->color[2], 1.0f };
-               GLfloat LightPosition[]=        { whichsource->location.x, whichsource->location.y, whichsource->location.z, 0.0f };
-
-               //glLightfv(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, qattenuation);
-               glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
-               glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);         
-               glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);         
-               glEnable(GL_LIGHT0);    
-       }else{
-               GLenum lightselect=GL_LIGHT1;
-               switch (whichlight){
-                       case 2:
-                               lightselect=GL_LIGHT2;
-                               break;
-                       case 3:
-                               lightselect=GL_LIGHT3;
-                               break;
-                       case 4:
-                               lightselect=GL_LIGHT4;
-                               break;
-                       case 5:
-                               lightselect=GL_LIGHT5;
-                               break;
-                       case 6:
-                               lightselect=GL_LIGHT6;
-                               break;
-                       case 7:
-                               lightselect=GL_LIGHT7;
-                               break;
-               }
-               
-               GLfloat LightAmbient[]=         { 0, 0, 0, 1.0f};
-               GLfloat LightDiffuse[]=         { whichsource->color[0], whichsource->color[1], whichsource->color[2], 1.0f };
-               GLfloat LightPosition[]=        { whichsource->location.x, whichsource->location.y, whichsource->location.z, 1.0f };
-
-               glLightfv(lightselect, GL_QUADRATIC_ATTENUATION, qattenuation);
-               glLightfv(lightselect, GL_POSITION, LightPosition);
-               glLightfv(lightselect, GL_AMBIENT, LightAmbient);               
-               glLightfv(lightselect, GL_DIFFUSE, LightDiffuse);               
-               glEnable(lightselect);  
-               
-               }       
+void SetUpLight(Light* whichsource, int whichlight)
+{
+    static float qattenuation[] = {0.0002f};
+    static float cattenuation[] = {1.5f};
+    static float lattenuation[] = {0.5f};
+    static float zattenuation[] = {0.0f};
+
+    //Initialize lights
+    if (whichlight == 0) {
+        GLfloat LightAmbient[] =               { whichsource->ambient[0], whichsource->ambient[1], whichsource->ambient[2], 1.0f};
+        GLfloat LightDiffuse[] =               { whichsource->color[0], whichsource->color[1], whichsource->color[2], 1.0f };
+        GLfloat LightPosition[] =      { whichsource->location.x, whichsource->location.y, whichsource->location.z, 0.0f };
+
+        //glLightfv(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, qattenuation);
+        glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
+        glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
+        glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
+        glEnable(GL_LIGHT0);
+    } else {
+        GLenum lightselect = GL_LIGHT1;
+        switch (whichlight) {
+        case 2:
+            lightselect = GL_LIGHT2;
+            break;
+        case 3:
+            lightselect = GL_LIGHT3;
+            break;
+        case 4:
+            lightselect = GL_LIGHT4;
+            break;
+        case 5:
+            lightselect = GL_LIGHT5;
+            break;
+        case 6:
+            lightselect = GL_LIGHT6;
+            break;
+        case 7:
+            lightselect = GL_LIGHT7;
+            break;
+        }
+
+        GLfloat LightAmbient[] =               { 0, 0, 0, 1.0f};
+        GLfloat LightDiffuse[] =               { whichsource->color[0], whichsource->color[1], whichsource->color[2], 1.0f };
+        GLfloat LightPosition[] =      { whichsource->location.x, whichsource->location.y, whichsource->location.z, 1.0f };
+
+        glLightfv(lightselect, GL_QUADRATIC_ATTENUATION, qattenuation);
+        glLightfv(lightselect, GL_POSITION, LightPosition);
+        glLightfv(lightselect, GL_AMBIENT, LightAmbient);
+        glLightfv(lightselect, GL_DIFFUSE, LightDiffuse);
+        glEnable(lightselect);
+
+    }
 }
 
-void SetUpMainLight(Light* whichsource, int whichlight, float ambientr, float ambientg, float ambientb){
-       static float qattenuation[]={0.0f};
+void SetUpMainLight(Light* whichsource, int whichlight, float ambientr, float ambientg, float ambientb)
+{
+    static float qattenuation[] = {0.0f};
 
-       //Initialize lights
+    //Initialize lights
 
-       if(whichlight==0){
-               GLfloat LightAmbient[]=         { ambientr, ambientg, ambientb, 1.0f};
-               GLfloat LightDiffuse[]=         { whichsource->color[0], whichsource->color[1], whichsource->color[2], 1.0f };
-               GLfloat LightPosition[]=        { whichsource->location.x, whichsource->location.y, whichsource->location.z, 1.0f };
+    if (whichlight == 0) {
+        GLfloat LightAmbient[] =               { ambientr, ambientg, ambientb, 1.0f};
+        GLfloat LightDiffuse[] =               { whichsource->color[0], whichsource->color[1], whichsource->color[2], 1.0f };
+        GLfloat LightPosition[] =      { whichsource->location.x, whichsource->location.y, whichsource->location.z, 1.0f };
 
-               glLightfv(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, qattenuation);
-               glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
-               glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);         
-               glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);         
-               glEnable(GL_LIGHT0);    
-       }
+        glLightfv(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, qattenuation);
+        glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
+        glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
+        glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
+        glEnable(GL_LIGHT0);
+    }
 }
index 483d1e0067f6d186106884b555abf48b23429ef0..275e3500485484de08ffa0476281bfe857452520 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -27,21 +27,22 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "gamegl.h"
 #include "Quaternions.h"
 
-class Light{
+class Light
+{
 public:
-       GLint type;
-       GLfloat color[3];
-       GLfloat ambient[3];
-       int attach;
-       XYZ location;
+    GLint type;
+    GLfloat color[3];
+    GLfloat ambient[3];
+    int attach;
+    XYZ location;
     inline void setColors(GLfloat cr, GLfloat cg, GLfloat cb,
-            GLfloat ar, GLfloat ag, GLfloat ab){
-        color[0]=cr;
-        color[1]=cg;
-        color[2]=cb;
-        ambient[0]=ar;
-        ambient[1]=ag;
-        ambient[2]=ab;
+                          GLfloat ar, GLfloat ag, GLfloat ab) {
+        color[0] = cr;
+        color[1] = cg;
+        color[2] = cb;
+        ambient[0] = ar;
+        ambient[1] = ag;
+        ambient[2] = ab;
     }
 };
 
index e82b1b758e276f99e4b18e8c2c56da1623ee5292..738739d1542673b4d04d1535d13c4d80e7e21089 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -62,83 +62,79 @@ static int QueryPerformanceCounter(LARGE_INTEGER *liptr)
 class AppTime
 {
 public:
-       AppTime()
-       {
-               counterRate = 1;
-               baseCounter = 0;
-               QueryPerformanceFrequency( (LARGE_INTEGER*)&counterRate);
-               QueryPerformanceCounter( (LARGE_INTEGER*)&baseCounter);
-       }
-       __int64 counterRate;            // LARGE_INTEGER type has no math functions so use int64
-       __int64 baseCounter;
+    AppTime() {
+        counterRate = 1;
+        baseCounter = 0;
+        QueryPerformanceFrequency( (LARGE_INTEGER*)&counterRate);
+        QueryPerformanceCounter( (LARGE_INTEGER*)&baseCounter);
+    }
+    __int64 counterRate;               // LARGE_INTEGER type has no math functions so use int64
+    __int64 baseCounter;
 };
 static AppTime g_appTime;
 
 
 void CopyCStringToPascal( const char* src, unsigned char dst[256])
 {
-       int len = strlen( src);
-       dst[ 0] = len;
-       memcpy( dst + 1, src, len);
+    int len = strlen( src);
+    dst[ 0] = len;
+    memcpy( dst + 1, src, len);
 }
 
 
 void CopyPascalStringToC( const unsigned char* src, char* dst)
 {
-       int len = src[ 0];
-       memcpy( dst, src + 1, len);
-       dst[ len] = 0;
+    int len = src[ 0];
+    memcpy( dst, src + 1, len);
+    dst[ len] = 0;
 }
 
 
 AbsoluteTime UpTime()
 {
-       __int64 counter;
-       QueryPerformanceCounter( (LARGE_INTEGER*)&counter);
+    __int64 counter;
+    QueryPerformanceCounter( (LARGE_INTEGER*)&counter);
 
-       counter -= g_appTime.baseCounter;
+    counter -= g_appTime.baseCounter;
 
-       AbsoluteTime time;
-       time.lo = (unsigned long)counter;
-       time.hi = (unsigned long)(counter >> 32);
-       return time;
+    AbsoluteTime time;
+    time.lo = (unsigned long)counter;
+    time.hi = (unsigned long)(counter >> 32);
+    return time;
 }
 
 
 Duration AbsoluteDeltaToDuration( AbsoluteTime& a, AbsoluteTime& b)
 {
-       __int64 value = a.hi;
-       value <<= 32;
-       value |= a.lo;
-       __int64 value2 = b.hi;
-       value2 <<= 32;
-       value2 |= b.lo;
-       value -= value2;
-
-       if (value <= 0)
-               return durationImmediate;
-
-       __int64 frac = value % g_appTime.counterRate;
-       value /= g_appTime.counterRate;
-
-       Duration time;
-
-       if (value == 0)
-       {
-               frac *= -1000000;
-               frac /= g_appTime.counterRate;
-               time = (Duration)frac;
-       }
-       else
-       {
-               frac *= 1000;
-               frac /= g_appTime.counterRate;
-               value *= 1000;
-               value += frac;
-               time = (Duration)value;
-       }
-
-       return time;
+    __int64 value = a.hi;
+    value <<= 32;
+    value |= a.lo;
+    __int64 value2 = b.hi;
+    value2 <<= 32;
+    value2 |= b.lo;
+    value -= value2;
+
+    if (value <= 0)
+        return durationImmediate;
+
+    __int64 frac = value % g_appTime.counterRate;
+    value /= g_appTime.counterRate;
+
+    Duration time;
+
+    if (value == 0) {
+        frac *= -1000000;
+        frac /= g_appTime.counterRate;
+        time = (Duration)frac;
+    } else {
+        frac *= 1000;
+        frac /= g_appTime.counterRate;
+        value *= 1000;
+        value += frac;
+        time = (Duration)value;
+    }
+
+    return time;
 }
 
 
@@ -163,13 +159,11 @@ static int locateOneElement(char *buf)
         return(1);  /* quick rejection: exists in current case. */
 
     ptr = strrchr(buf, '/');  /* find entry at end of path. */
-    if (ptr == NULL)
-    {
+    if (ptr == NULL) {
         dirp = opendir(".");
         ptr = buf;
     } /* if */
-    else
-    {
+    else {
         *ptr = '\0';
         dirp = opendir(buf);
         *ptr = '/';
@@ -177,10 +171,8 @@ static int locateOneElement(char *buf)
     } /* else */
 
     struct dirent *dent;
-    while ((dent = readdir(dirp)) != NULL)
-    {
-        if (strcasecmp(dent->d_name, ptr) == 0)
-        {
+    while ((dent = readdir(dirp)) != NULL) {
+        if (strcasecmp(dent->d_name, ptr) == 0) {
             strcpy(ptr, dent->d_name); /* found a match. Overwrite with this case. */
             closedir(dirp);
             return(1);
@@ -205,8 +197,7 @@ static inline const char *getUserDirByUID(void)
 static inline const char *getPrefPath(void)
 {
     static char *prefpath = NULL;
-    if (prefpath == NULL)
-    {
+    if (prefpath == NULL) {
         const char *homedir = getenv("HOME");
         if (homedir == NULL)
             homedir = getUserDirByUID();
@@ -232,16 +223,13 @@ static int locateCorrectCase(char *buf, bool makedirs)
     char *prevptr;
 
     ptr = prevptr = buf;
-    while (ptr = strchr(ptr + 1, '/'))
-    {
+    while (ptr = strchr(ptr + 1, '/')) {
         *ptr = '\0';  /* block this path section off */
         rc = locateOneElement(buf);
-        if (!rc)
-        {
+        if (!rc) {
             if (makedirs)  /* normal if we're writing; build dirs! */
                 mkdir(buf, S_IRWXU);
-            else
-            {
+            else {
                 *ptr = '/'; /* restore path separator */
                 return(-2);  /* missing element in path. */
             } /* else */
@@ -284,25 +272,24 @@ char* ConvertFileName( const char* orgfilename, const char *mode)
     if (orgfilename == g_filename) // recursion?
         return g_filename;
 
-       // translate filename into proper path name
-       if (orgfilename[ 0] == ':')
-               orgfilename++;
-       strcpy( g_filename, orgfilename);
+    // translate filename into proper path name
+    if (orgfilename[ 0] == ':')
+        orgfilename++;
+    strcpy( g_filename, orgfilename);
 
-       for (int n = 0; g_filename[ n]; n++)
-       {
-               if (g_filename[ n] == ':')
-                       g_filename[ n] = '/';
+    for (int n = 0; g_filename[ n]; n++) {
+        if (g_filename[ n] == ':')
+            g_filename[ n] = '/';
 
-               else if (g_filename[ n] == '\\')
-                       g_filename[ n] = '/';
-       }
+        else if (g_filename[ n] == '\\')
+            g_filename[ n] = '/';
+    }
 
-    #if PLATFORM_UNIX
+#if PLATFORM_UNIX
     locateCorrectFile(g_filename, mode);
-    #endif
+#endif
 
-       return g_filename;
+    return g_filename;
 }
 
 #endif
index e9b2905f714219e2b6d98ac65311450913a442a6..17745cd22eaa1f8ef957dbea08cdfdc202a2c4c9 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -55,10 +55,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 typedef bool Boolean;
 
 
-struct Point
-{
-       short v;
-       short h;
+struct Point {
+    short v;
+    short h;
 };
 
 typedef signed char SInt8;
@@ -72,35 +71,33 @@ void CopyCStringToPascal( const char* src, unsigned char dst[256]);
 void CopyPascalStringToC( const unsigned char* src, char* dst);
 
 
-typedef struct AbsoluteTime
-{
-       unsigned long   hi;
-       unsigned long   lo;
-} AbsoluteTime; 
+typedef struct AbsoluteTime {
+    unsigned long   hi;
+    unsigned long   lo;
+} AbsoluteTime;
 
 AbsoluteTime UpTime();         // NOTE: returns time since app started, not system start
 
-typedef long Duration; 
-
-enum
-{
-       durationMicrosecond             = -1,
-       durationMillisecond             = 1,
-       durationSecond                  = 1000,
-       durationMinute                  = 1000 * 60,
-       durationHour                    = 1000 * 60 * 60,
-       durationDay                     = 1000 * 60 * 60 * 24,
-       durationForever                 = 0x7FFFFFFF,
-       durationImmediate               = 0,
-}; 
+typedef long Duration;
+
+enum {
+    durationMicrosecond             = -1,
+    durationMillisecond             = 1,
+    durationSecond                  = 1000,
+    durationMinute                  = 1000 * 60,
+    durationHour                    = 1000 * 60 * 60,
+    durationDay                     = 1000 * 60 * 60 * 24,
+    durationForever                 = 0x7FFFFFFF,
+    durationImmediate               = 0,
+};
 
 Duration AbsoluteDeltaToDuration( AbsoluteTime& a, AbsoluteTime& b);
 
 #ifdef _MSC_VER
 inline bool isnormal( double x)
 {
-       int ret = _fpclass( x);
-       return (ret == _FPCLASS_NN || ret == _FPCLASS_PN);
+    int ret = _fpclass( x);
+    return (ret == _FPCLASS_NN || ret == _FPCLASS_PN);
 }
 #else
 #include <stdint.h>
index 541404903e5fd829891c4ccfb1ab51016b1b426a..8eb10e4e33091e04bc4acfbd9b9927bf8fb0d750 100644 (file)
@@ -8,34 +8,39 @@ using namespace Menu;
 extern float multiplier;
 
 struct MenuItem {
-    enum MenuItemType{NONE,LABEL,BUTTON,IMAGE,IMAGEBUTTON,MAPMARKER,MAPLINE,MAPLABEL} type;
+    enum MenuItemType {NONE, LABEL, BUTTON, IMAGE, IMAGEBUTTON, MAPMARKER, MAPLINE, MAPLABEL} type;
     int id;
     string text;
     Texture texture;
-    int x,y,w,h;
-    float r,g,b;
+    int x, y, w, h;
+    float r, g, b;
     float effectfade;
 
     float linestartsize;
     float lineendsize;
 
     void init(MenuItemType _type, int _id, const string& _text, Texture _texture,
-            int _x, int _y, int _w, int _h, float _r, float _g, float _b,
-            float _linestartsize=1, float _lineendsize=1){
-        type=_type;
-        id=_id;
-        text=_text;
-        texture=_texture;
-        x=_x; y=_y; w=_w; h=_h;
-        r=_r; g=_g; b=_b;
-        effectfade=0;
-        linestartsize=_linestartsize;
-        lineendsize=_lineendsize;
-        if(type==MenuItem::BUTTON){
-            if(w==-1)
-                w=text.length()*10;
-            if(h==-1)
-                h=20;
+              int _x, int _y, int _w, int _h, float _r, float _g, float _b,
+              float _linestartsize = 1, float _lineendsize = 1) {
+        type = _type;
+        id = _id;
+        text = _text;
+        texture = _texture;
+        x = _x;
+        y = _y;
+        w = _w;
+        h = _h;
+        r = _r;
+        g = _g;
+        b = _b;
+        effectfade = 0;
+        linestartsize = _linestartsize;
+        lineendsize = _lineendsize;
+        if (type == MenuItem::BUTTON) {
+            if (w == -1)
+                w = text.length() * 10;
+            if (h == -1)
+                h = 20;
         }
     }
 };
@@ -45,136 +50,149 @@ vector<MenuItem> items;
 
 
 
-void Menu::clearMenu(){
+void Menu::clearMenu()
+{
     items.clear();
 }
 
-void Menu::addLabel(int id,const string& text,int x,int y,float r,float g,float b){
+void Menu::addLabel(int id, const string& text, int x, int y, float r, float g, float b)
+{
     items.push_back(MenuItem());
-    items.back().init(MenuItem::LABEL,id,text,Texture(),x,y,-1,-1,r,g,b);
+    items.back().init(MenuItem::LABEL, id, text, Texture(), x, y, -1, -1, r, g, b);
 }
-void Menu::addButton(int id,const string& text,int x,int y,float r,float g,float b){
+void Menu::addButton(int id, const string& text, int x, int y, float r, float g, float b)
+{
     items.push_back(MenuItem());
-    items.back().init(MenuItem::BUTTON,id,text,Texture(),x,y,-1,-1,r,g,b);
+    items.back().init(MenuItem::BUTTON, id, text, Texture(), x, y, -1, -1, r, g, b);
 }
-void Menu::addImage(int id,Texture texture,int x,int y,int w,int h,float r,float g,float b){
+void Menu::addImage(int id, Texture texture, int x, int y, int w, int h, float r, float g, float b)
+{
     items.push_back(MenuItem());
-    items.back().init(MenuItem::IMAGE,id,"",texture,x,y,w,h,r,g,b);
+    items.back().init(MenuItem::IMAGE, id, "", texture, x, y, w, h, r, g, b);
 }
-void Menu::addButtonImage(int id,Texture texture,int x,int y,int w,int h,float r,float g,float b){
+void Menu::addButtonImage(int id, Texture texture, int x, int y, int w, int h, float r, float g, float b)
+{
     items.push_back(MenuItem());
-    items.back().init(MenuItem::IMAGEBUTTON,id,"",texture,x,y,w,h,r,g,b);
+    items.back().init(MenuItem::IMAGEBUTTON, id, "", texture, x, y, w, h, r, g, b);
 }
-void Menu::addMapLine(int x, int y, int w, int h, float startsize, float endsize, float r,float g,float b){
+void Menu::addMapLine(int x, int y, int w, int h, float startsize, float endsize, float r, float g, float b)
+{
     items.push_back(MenuItem());
-    items.back().init(MenuItem::MAPLINE,-1,"",Texture(),x,y,w,h,r,g,b,startsize,endsize);
+    items.back().init(MenuItem::MAPLINE, -1, "", Texture(), x, y, w, h, r, g, b, startsize, endsize);
 }
-void Menu::addMapMarker(int id,Texture texture,int x,int y,int w,int h,float r,float g,float b){
+void Menu::addMapMarker(int id, Texture texture, int x, int y, int w, int h, float r, float g, float b)
+{
     items.push_back(MenuItem());
-    items.back().init(MenuItem::MAPMARKER,id,"",texture,x,y,w,h,r,g,b);
+    items.back().init(MenuItem::MAPMARKER, id, "", texture, x, y, w, h, r, g, b);
 }
-void Menu::addMapLabel(int id,const string& text,int x,int y,float r,float g,float b){
+void Menu::addMapLabel(int id, const string& text, int x, int y, float r, float g, float b)
+{
     items.push_back(MenuItem());
-    items.back().init(MenuItem::MAPLABEL,id,text,Texture(),x,y,-1,-1,r,g,b);
+    items.back().init(MenuItem::MAPLABEL, id, text, Texture(), x, y, -1, -1, r, g, b);
 }
 
-void Menu::setText(int id,const string& text){
-    for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++)
-        if(it->id==id){
-            it->text=text;
-            it->w=it->text.length()*10;
+void Menu::setText(int id, const string& text)
+{
+    for (vector<MenuItem>::iterator it = items.begin(); it != items.end(); it++)
+        if (it->id == id) {
+            it->text = text;
+            it->w = it->text.length() * 10;
             break;
         }
 }
 
-void Menu::setText(int id,const string& text,int x,int y,int w,int h){
-    for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++)
-        if(it->id==id){
-            it->text=text;
-            it->x=x;
-            it->y=y;
-            if(w==-1)
-                it->w=it->text.length()*10;
-            if(h==-1)
-                it->h=20;
+void Menu::setText(int id, const string& text, int x, int y, int w, int h)
+{
+    for (vector<MenuItem>::iterator it = items.begin(); it != items.end(); it++)
+        if (it->id == id) {
+            it->text = text;
+            it->x = x;
+            it->y = y;
+            if (w == -1)
+                it->w = it->text.length() * 10;
+            if (h == -1)
+                it->h = 20;
             break;
         }
 }
 
-int Menu::getSelected(int mousex, int mousey){
-    for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++)
-        if(it->type==MenuItem::BUTTON || it->type==MenuItem::IMAGEBUTTON || it->type==MenuItem::MAPMARKER) {
-            int mx=mousex;
-            int my=mousey;
-            if(it->type==MenuItem::MAPMARKER){
-                mx-=1;
-                my+=2;
+int Menu::getSelected(int mousex, int mousey)
+{
+    for (vector<MenuItem>::iterator it = items.begin(); it != items.end(); it++)
+        if (it->type == MenuItem::BUTTON || it->type == MenuItem::IMAGEBUTTON || it->type == MenuItem::MAPMARKER) {
+            int mx = mousex;
+            int my = mousey;
+            if (it->type == MenuItem::MAPMARKER) {
+                mx -= 1;
+                my += 2;
             }
-            if(mx>=it->x && mx<it->x+it->w && my>=it->y && my<it->y+it->h)
+            if (mx >= it->x && mx < it->x + it->w && my >= it->y && my < it->y + it->h)
                 return it->id;
         }
     return -1;
 }
 
-void GUITick(){
-    for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++){
-               if(it->id==Game::selected){
-                       it->effectfade+=multiplier*5;
-                       if(it->effectfade>1)
-                it->effectfade=1;
-               }else{
-                       it->effectfade-=multiplier*5;
-                       if(it->effectfade<0)
-                it->effectfade=0;      
-               }        
+void GUITick()
+{
+    for (vector<MenuItem>::iterator it = items.begin(); it != items.end(); it++) {
+        if (it->id == Game::selected) {
+            it->effectfade += multiplier * 5;
+            if (it->effectfade > 1)
+                it->effectfade = 1;
+        } else {
+            it->effectfade -= multiplier * 5;
+            if (it->effectfade < 0)
+                it->effectfade = 0;
+        }
     }
 }
 
-void Menu::drawItems(){
+void Menu::drawItems()
+{
     GUITick();
     glEnable(GL_TEXTURE_2D);
     glEnable(GL_ALPHA_TEST);
     glEnable(GL_BLEND);
-    for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++){
-        switch(it->type){
+    for (vector<MenuItem>::iterator it = items.begin(); it != items.end(); it++) {
+        switch (it->type) {
         case MenuItem::IMAGE:
         case MenuItem::IMAGEBUTTON:
         case MenuItem::MAPMARKER:
-            glColor4f(it->r,it->g,it->b,1);
+            glColor4f(it->r, it->g, it->b, 1);
             glPushMatrix();
-            if(it->type==MenuItem::MAPMARKER){
-                glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                glTranslatef(2.5,-4.5,0); //from old code
-            }else{
-                glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+            if (it->type == MenuItem::MAPMARKER) {
+                glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                glTranslatef(2.5, -4.5, 0); //from old code
+            } else {
+                glBlendFunc(GL_SRC_ALPHA, GL_ONE);
             }
             it->texture.bind();
-                       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-                       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
             glBegin(GL_QUADS);
-            glTexCoord2f(0,0);
-            glVertex3f(it->x,it->y,0);
-            glTexCoord2f(1,0);
-            glVertex3f(it->x+it->w,it->y,0);
-            glTexCoord2f(1,1);
-            glVertex3f(it->x+it->w,it->y+it->h,0);
-            glTexCoord2f(0,1);
-            glVertex3f(it->x,it->y+it->h,0);
+            glTexCoord2f(0, 0);
+            glVertex3f(it->x, it->y, 0);
+            glTexCoord2f(1, 0);
+            glVertex3f(it->x + it->w, it->y, 0);
+            glTexCoord2f(1, 1);
+            glVertex3f(it->x + it->w, it->y + it->h, 0);
+            glTexCoord2f(0, 1);
+            glVertex3f(it->x, it->y + it->h, 0);
             glEnd();
-            if(it->type!=MenuItem::IMAGE){
+            if (it->type != MenuItem::IMAGE) {
                 //mouseover highlight
-                for(int i=0;i<10;i++){
-                    if(1-((float)i)/10-(1-it->effectfade)>0){
-                        glColor4f(it->r,it->g,it->b,(1-((float)i)/10-(1-it->effectfade))*.25);
+                for (int i = 0; i < 10; i++) {
+                    if (1 - ((float)i) / 10 - (1 - it->effectfade) > 0) {
+                        glColor4f(it->r, it->g, it->b, (1 - ((float)i) / 10 - (1 - it->effectfade))*.25);
                         glBegin(GL_QUADS);
-                        glTexCoord2f(0,0);
-                        glVertex3f(it->x-((float)i)*1/2, it->y-((float)i)*1/2, 0);
-                        glTexCoord2f(1,0);
-                        glVertex3f(it->x+it->w+((float)i)*1/2, it->y-((float)i)*1/2, 0);
-                        glTexCoord2f(1,1);
-                        glVertex3f(it->x+it->w+((float)i)*1/2, it->y+it->h+((float)i)*1/2, 0);
-                        glTexCoord2f(0,1);
-                        glVertex3f(it->x-((float)i)*1/2, it->y+it->h+((float)i)*1/2, 0);
+                        glTexCoord2f(0, 0);
+                        glVertex3f(it->x - ((float)i) * 1 / 2, it->y - ((float)i) * 1 / 2, 0);
+                        glTexCoord2f(1, 0);
+                        glVertex3f(it->x + it->w + ((float)i) * 1 / 2, it->y - ((float)i) * 1 / 2, 0);
+                        glTexCoord2f(1, 1);
+                        glVertex3f(it->x + it->w + ((float)i) * 1 / 2, it->y + it->h + ((float)i) * 1 / 2, 0);
+                        glTexCoord2f(0, 1);
+                        glVertex3f(it->x - ((float)i) * 1 / 2, it->y + it->h + ((float)i) * 1 / 2, 0);
                         glEnd();
                     }
                 }
@@ -183,55 +201,56 @@ void Menu::drawItems(){
             break;
         case MenuItem::LABEL:
         case MenuItem::BUTTON:
-            glColor4f(it->r,it->g,it->b,1);
-            glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-            Game::text->glPrint(it->x,it->y,it->text.c_str(),0,1,640,480);
-            if(it->type!=MenuItem::LABEL){
+            glColor4f(it->r, it->g, it->b, 1);
+            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            Game::text->glPrint(it->x, it->y, it->text.c_str(), 0, 1, 640, 480);
+            if (it->type != MenuItem::LABEL) {
                 //mouseover highlight
-                glBlendFunc(GL_SRC_ALPHA,GL_ONE);
-                for(int i=0;i<15;i++){
-                    if(1-((float)i)/15-(1-it->effectfade)>0){
-                        glColor4f(it->r,it->g,it->b,(1-((float)i)/10-(1-it->effectfade))*.25);
-                        Game::text->glPrint(it->x-((float)i),it->y,it->text.c_str(),0,1+((float)i)/70,640,480);
+                glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+                for (int i = 0; i < 15; i++) {
+                    if (1 - ((float)i) / 15 - (1 - it->effectfade) > 0) {
+                        glColor4f(it->r, it->g, it->b, (1 - ((float)i) / 10 - (1 - it->effectfade))*.25);
+                        Game::text->glPrint(it->x - ((float)i), it->y, it->text.c_str(), 0, 1 + ((float)i) / 70, 640, 480);
                     }
                 }
             }
             break;
         case MenuItem::MAPLABEL:
-            Game::text->glPrintOutlined(0.9,0,0,it->x,it->y,it->text.c_str(),0,0.6,640,480);
+            Game::text->glPrintOutlined(0.9, 0, 0, it->x, it->y, it->text.c_str(), 0, 0.6, 640, 480);
             break;
         case MenuItem::MAPLINE: {
             XYZ linestart;
-            linestart.x=it->x;
-            linestart.y=it->y;
-            linestart.z=0;
+            linestart.x = it->x;
+            linestart.y = it->y;
+            linestart.z = 0;
             XYZ lineend;
-            lineend.x=it->x+it->w;
-            lineend.y=it->y+it->h;
-            lineend.z=0;
-            XYZ offset=lineend-linestart;
-            XYZ fac=offset;
+            lineend.x = it->x + it->w;
+            lineend.y = it->y + it->h;
+            lineend.z = 0;
+            XYZ offset = lineend - linestart;
+            XYZ fac = offset;
             Normalise(&fac);
-            offset=DoRotation(offset,0,0,90);
+            offset = DoRotation(offset, 0, 0, 90);
             Normalise(&offset);
 
-            linestart+=fac*4*it->linestartsize;
-            lineend-=fac*4*it->lineendsize;
+            linestart += fac * 4 * it->linestartsize;
+            lineend -= fac * 4 * it->lineendsize;
 
-            glDisable(GL_TEXTURE_2D);                                                  
-            glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-            glColor4f(it->r,it->g,it->b,1);
+            glDisable(GL_TEXTURE_2D);
+            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            glColor4f(it->r, it->g, it->b, 1);
             glPushMatrix();
-            glTranslatef(2,-5,0); //from old code
+            glTranslatef(2, -5, 0); //from old code
             glBegin(GL_QUADS);
-            glVertex3f(linestart.x-offset.x*it->linestartsize, linestart.y-offset.y*it->linestartsize,          0.0f);
-            glVertex3f(linestart.x+offset.x*it->linestartsize, linestart.y+offset.y*it->linestartsize,          0.0f);
-            glVertex3f(lineend.x+offset.x*it->lineendsize,             lineend.y+offset.y*it->lineendsize, 0.0f);
-            glVertex3f(lineend.x-offset.x*it->lineendsize,             lineend.y-offset.y*it->lineendsize, 0.0f);
+            glVertex3f(linestart.x - offset.x * it->linestartsize,     linestart.y - offset.y * it->linestartsize,      0.0f);
+            glVertex3f(linestart.x + offset.x * it->linestartsize,     linestart.y + offset.y * it->linestartsize,      0.0f);
+            glVertex3f(lineend.x + offset.x * it->lineendsize,         lineend.y + offset.y * it->lineendsize, 0.0f);
+            glVertex3f(lineend.x - offset.x * it->lineendsize,                 lineend.y - offset.y * it->lineendsize, 0.0f);
             glEnd();
             glPopMatrix();
             glEnable(GL_TEXTURE_2D);
-            } break;
+        }
+        break;
         }
     }
 }
index 6a1911af746c6735afc67831e91fba17f27d3436..5abeeb10282655ce91f8ce82a4bfa668e47da1b3 100644 (file)
@@ -3,19 +3,20 @@
 
 #include "Game.h"
 
-namespace Menu {
-    void clearMenu();
-    void addLabel(int id,const string& text,int x,int y,float r=1,float g=0,float b=0);
-    void addButton(int id,const string& text,int x,int y,float r=1,float g=0,float b=0);
-    void addImage(int id,Texture texture,int x,int y,int w,int h,float r=1,float g=1,float b=1);
-    void addButtonImage(int id,Texture texture,int x,int y,int w,int h,float r=1,float g=1,float b=1);
-    void addMapLine(int x, int y, int w, int h, float startsize, float endsize, float r,float g,float b);
-    void addMapMarker(int id,Texture texture,int x,int y,int w,int h,float r,float g,float b);
-    void addMapLabel(int id,const string& text,int x,int y,float r=1,float g=0,float b=0);
-    void setText(int id,const string& text);
-    void setText(int id,const string& text,int x,int y,int w,int h);
-    int getSelected(int mousex, int mousey);
-    void drawItems();
+namespace Menu
+{
+void clearMenu();
+void addLabel(int id, const string& text, int x, int y, float r = 1, float g = 0, float b = 0);
+void addButton(int id, const string& text, int x, int y, float r = 1, float g = 0, float b = 0);
+void addImage(int id, Texture texture, int x, int y, int w, int h, float r = 1, float g = 1, float b = 1);
+void addButtonImage(int id, Texture texture, int x, int y, int w, int h, float r = 1, float g = 1, float b = 1);
+void addMapLine(int x, int y, int w, int h, float startsize, float endsize, float r, float g, float b);
+void addMapMarker(int id, Texture texture, int x, int y, int w, int h, float r, float g, float b);
+void addMapLabel(int id, const string& text, int x, int y, float r = 1, float g = 0, float b = 0);
+void setText(int id, const string& text);
+void setText(int id, const string& text, int x, int y, int w, int h);
+int getSelected(int mousex, int mousey);
+void drawItems();
 }
 
 #endif
index 9f92cb531d2f5eeabc43b4396ba7e83eb5905f49..609d1b1a24b28f3e7d971ff7d5f56533ca76d56c 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -31,1497 +31,1515 @@ extern bool decals;
 
 extern bool visibleloading;
 
-int Model::LineCheck(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate)
+int Model::LineCheck(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate)
 {
-       static int j;
-       static float distance;
-       static float olddistance;
-       static int intersecting;
-       static int firstintersecting;
-       static XYZ point;
-
-       *p1=*p1-*move;
-       *p2=*p2-*move;
-       if(*rotate)*p1=DoRotation(*p1,0,-*rotate,0);
-       if(*rotate)*p2=DoRotation(*p2,0,-*rotate,0);
-       if(!sphere_line_intersection(p1,p2,&boundingspherecenter,
-               &boundingsphereradius))return -1;
-       firstintersecting=-1;
-
-       for (j=0;j<TriangleNum;j++){
-               intersecting=LineFacetd(p1,p2,&vertex[Triangles[j].vertex[0]],&vertex[Triangles[j].vertex[1]],&vertex[Triangles[j].vertex[2]],&facenormals[j],&point);
-               distance=(point.x-p1->x)*(point.x-p1->x)+(point.y-p1->y)*(point.y-p1->y)+(point.z-p1->z)*(point.z-p1->z);
-               if((distance<olddistance||firstintersecting==-1)&&intersecting){olddistance=distance; firstintersecting=j; *p=point;}
-       }
-
-       if(*rotate)*p=DoRotation(*p,0,*rotate,0);
-       *p=*p+*move;
-       return firstintersecting;
+    static int j;
+    static float distance;
+    static float olddistance;
+    static int intersecting;
+    static int firstintersecting;
+    static XYZ point;
+
+    *p1 = *p1 - *move;
+    *p2 = *p2 - *move;
+    if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0);
+    if (*rotate)*p2 = DoRotation(*p2, 0, -*rotate, 0);
+    if (!sphere_line_intersection(p1, p2, &boundingspherecenter,
+                                  &boundingsphereradius))return -1;
+    firstintersecting = -1;
+
+    for (j = 0; j < TriangleNum; j++) {
+        intersecting = LineFacetd(p1, p2, &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]], &facenormals[j], &point);
+        distance = (point.x - p1->x) * (point.x - p1->x) + (point.y - p1->y) * (point.y - p1->y) + (point.z - p1->z) * (point.z - p1->z);
+        if ((distance < olddistance || firstintersecting == -1) && intersecting) {
+            olddistance = distance;
+            firstintersecting = j;
+            *p = point;
+        }
+    }
+
+    if (*rotate)*p = DoRotation(*p, 0, *rotate, 0);
+    *p = *p + *move;
+    return firstintersecting;
 }
 
-int Model::LineCheckSlide(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate)
+int Model::LineCheckSlide(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate)
 {
-       static int j;
-       static float distance;
-       static float olddistance;
-       static int intersecting;
-       static int firstintersecting;
-       static XYZ point;
-
-       *p1=*p1-*move;
-       *p2=*p2-*move;
-       if(!sphere_line_intersection(p1,p2,&boundingspherecenter,
-               &boundingsphereradius))return -1;
-       firstintersecting=-1;
-       if(*rotate)*p1=DoRotation(*p1,0,-*rotate,0);
-       if(*rotate)*p2=DoRotation(*p2,0,-*rotate,0);
-
-       for (j=0;j<TriangleNum;j++){
-               intersecting=LineFacetd(p1,p2,&vertex[Triangles[j].vertex[0]],&vertex[Triangles[j].vertex[1]],&vertex[Triangles[j].vertex[2]],&facenormals[j],&point);
-               distance=(point.x-p1->x)*(point.x-p1->x)+(point.y-p1->y)*(point.y-p1->y)+(point.z-p1->z)*(point.z-p1->z);
-               if((distance<olddistance||firstintersecting==-1)&&intersecting){olddistance=distance; firstintersecting=j;}
-       }
-
-       distance=abs((facenormals[firstintersecting].x*p2->x)+(facenormals[firstintersecting].y*p2->y)+(facenormals[firstintersecting].z*p2->z)-((facenormals[firstintersecting].x*vertex[Triangles[firstintersecting].vertex[0]].x)+(facenormals[firstintersecting].y*vertex[Triangles[firstintersecting].vertex[0]].y)+(facenormals[firstintersecting].z*vertex[Triangles[firstintersecting].vertex[0]].z)));
-       *p2-=facenormals[firstintersecting]*distance;
-
-       if(*rotate)*p2=DoRotation(*p2,0,*rotate,0);
-       *p2=*p2+*move;
-       return firstintersecting;
+    static int j;
+    static float distance;
+    static float olddistance;
+    static int intersecting;
+    static int firstintersecting;
+    static XYZ point;
+
+    *p1 = *p1 - *move;
+    *p2 = *p2 - *move;
+    if (!sphere_line_intersection(p1, p2, &boundingspherecenter,
+                                  &boundingsphereradius))return -1;
+    firstintersecting = -1;
+    if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0);
+    if (*rotate)*p2 = DoRotation(*p2, 0, -*rotate, 0);
+
+    for (j = 0; j < TriangleNum; j++) {
+        intersecting = LineFacetd(p1, p2, &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]], &facenormals[j], &point);
+        distance = (point.x - p1->x) * (point.x - p1->x) + (point.y - p1->y) * (point.y - p1->y) + (point.z - p1->z) * (point.z - p1->z);
+        if ((distance < olddistance || firstintersecting == -1) && intersecting) {
+            olddistance = distance;
+            firstintersecting = j;
+        }
+    }
+
+    distance = abs((facenormals[firstintersecting].x * p2->x) + (facenormals[firstintersecting].y * p2->y) + (facenormals[firstintersecting].z * p2->z) - ((facenormals[firstintersecting].x * vertex[Triangles[firstintersecting].vertex[0]].x) + (facenormals[firstintersecting].y * vertex[Triangles[firstintersecting].vertex[0]].y) + (facenormals[firstintersecting].z * vertex[Triangles[firstintersecting].vertex[0]].z)));
+    *p2 -= facenormals[firstintersecting] * distance;
+
+    if (*rotate)*p2 = DoRotation(*p2, 0, *rotate, 0);
+    *p2 = *p2 + *move;
+    return firstintersecting;
 }
 
-int Model::LineCheckPossible(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate)
+int Model::LineCheckPossible(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate)
 {
-       static int j;
-       static float distance;
-       static float olddistance;
-       static int intersecting;
-       static int firstintersecting;
-       static XYZ point;
-
-       *p1=*p1-*move;
-       *p2=*p2-*move;
-       if(!sphere_line_intersection(p1,p2,&boundingspherecenter,
-               &boundingsphereradius))return -1;
-       firstintersecting=-1;
-       if(*rotate)*p1=DoRotation(*p1,0,-*rotate,0);
-       if(*rotate)*p2=DoRotation(*p2,0,-*rotate,0);
-
-       if(numpossible>0&&numpossible<TriangleNum)
-               for (j=0;j<numpossible;j++){
-                       if(possible[j]>=0&&possible[j]<TriangleNum){
-                               intersecting=LineFacetd(p1,p2,&vertex[Triangles[possible[j]].vertex[0]],&vertex[Triangles[possible[j]].vertex[1]],&vertex[Triangles[possible[j]].vertex[2]],&facenormals[possible[j]],&point);
-                               distance=(point.x-p1->x)*(point.x-p1->x)+(point.y-p1->y)*(point.y-p1->y)+(point.z-p1->z)*(point.z-p1->z);
-                               if((distance<olddistance||firstintersecting==-1)&&intersecting){olddistance=distance; firstintersecting=possible[j]; *p=point;}
-                       }
-               }
-
-               if(*rotate)*p=DoRotation(*p,0,*rotate,0);
-               *p=*p+*move;
-               return firstintersecting;
+    static int j;
+    static float distance;
+    static float olddistance;
+    static int intersecting;
+    static int firstintersecting;
+    static XYZ point;
+
+    *p1 = *p1 - *move;
+    *p2 = *p2 - *move;
+    if (!sphere_line_intersection(p1, p2, &boundingspherecenter,
+                                  &boundingsphereradius))return -1;
+    firstintersecting = -1;
+    if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0);
+    if (*rotate)*p2 = DoRotation(*p2, 0, -*rotate, 0);
+
+    if (numpossible > 0 && numpossible < TriangleNum)
+        for (j = 0; j < numpossible; j++) {
+            if (possible[j] >= 0 && possible[j] < TriangleNum) {
+                intersecting = LineFacetd(p1, p2, &vertex[Triangles[possible[j]].vertex[0]], &vertex[Triangles[possible[j]].vertex[1]], &vertex[Triangles[possible[j]].vertex[2]], &facenormals[possible[j]], &point);
+                distance = (point.x - p1->x) * (point.x - p1->x) + (point.y - p1->y) * (point.y - p1->y) + (point.z - p1->z) * (point.z - p1->z);
+                if ((distance < olddistance || firstintersecting == -1) && intersecting) {
+                    olddistance = distance;
+                    firstintersecting = possible[j];
+                    *p = point;
+                }
+            }
+        }
+
+    if (*rotate)*p = DoRotation(*p, 0, *rotate, 0);
+    *p = *p + *move;
+    return firstintersecting;
 }
 
-int Model::LineCheckSlidePossible(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate)
+int Model::LineCheckSlidePossible(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate)
 {
-       static int j;
-       static float distance;
-       static float olddistance;
-       static int intersecting;
-       static int firstintersecting;
-       static XYZ point;
-
-       *p1=*p1-*move;
-       *p2=*p2-*move;
-       if(!sphere_line_intersection(p1,p2,&boundingspherecenter,
-               &boundingsphereradius))return -1;
-       firstintersecting=-1;
-       if(*rotate)*p1=DoRotation(*p1,0,-*rotate,0);
-       if(*rotate)*p2=DoRotation(*p2,0,-*rotate,0);
-
-       if(numpossible)
-               for (j=0;j<numpossible;j++){
-                       if(possible[j]>=0&&possible[j]<TriangleNum){
-                               intersecting=LineFacetd(p1,p2,&vertex[Triangles[possible[j]].vertex[0]],&vertex[Triangles[possible[j]].vertex[1]],&vertex[Triangles[possible[j]].vertex[2]],&facenormals[possible[j]],&point);
-                               distance=(point.x-p1->x)*(point.x-p1->x)+(point.y-p1->y)*(point.y-p1->y)+(point.z-p1->z)*(point.z-p1->z);
-                               if((distance<olddistance||firstintersecting==-1)&&intersecting){olddistance=distance; firstintersecting=possible[j];}
-                       }
-               }
-
-               if(firstintersecting>0){
-                       distance=abs((facenormals[firstintersecting].x*p2->x)+(facenormals[firstintersecting].y*p2->y)+(facenormals[firstintersecting].z*p2->z)-((facenormals[firstintersecting].x*vertex[Triangles[firstintersecting].vertex[0]].x)+(facenormals[firstintersecting].y*vertex[Triangles[firstintersecting].vertex[0]].y)+(facenormals[firstintersecting].z*vertex[Triangles[firstintersecting].vertex[0]].z)));
-                       *p2-=facenormals[firstintersecting]*distance;
-               }
-
-               if(*rotate)*p2=DoRotation(*p2,0,*rotate,0);
-               *p2=*p2+*move;
-               return firstintersecting;
+    static int j;
+    static float distance;
+    static float olddistance;
+    static int intersecting;
+    static int firstintersecting;
+    static XYZ point;
+
+    *p1 = *p1 - *move;
+    *p2 = *p2 - *move;
+    if (!sphere_line_intersection(p1, p2, &boundingspherecenter,
+                                  &boundingsphereradius))return -1;
+    firstintersecting = -1;
+    if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0);
+    if (*rotate)*p2 = DoRotation(*p2, 0, -*rotate, 0);
+
+    if (numpossible)
+        for (j = 0; j < numpossible; j++) {
+            if (possible[j] >= 0 && possible[j] < TriangleNum) {
+                intersecting = LineFacetd(p1, p2, &vertex[Triangles[possible[j]].vertex[0]], &vertex[Triangles[possible[j]].vertex[1]], &vertex[Triangles[possible[j]].vertex[2]], &facenormals[possible[j]], &point);
+                distance = (point.x - p1->x) * (point.x - p1->x) + (point.y - p1->y) * (point.y - p1->y) + (point.z - p1->z) * (point.z - p1->z);
+                if ((distance < olddistance || firstintersecting == -1) && intersecting) {
+                    olddistance = distance;
+                    firstintersecting = possible[j];
+                }
+            }
+        }
+
+    if (firstintersecting > 0) {
+        distance = abs((facenormals[firstintersecting].x * p2->x) + (facenormals[firstintersecting].y * p2->y) + (facenormals[firstintersecting].z * p2->z) - ((facenormals[firstintersecting].x * vertex[Triangles[firstintersecting].vertex[0]].x) + (facenormals[firstintersecting].y * vertex[Triangles[firstintersecting].vertex[0]].y) + (facenormals[firstintersecting].z * vertex[Triangles[firstintersecting].vertex[0]].z)));
+        *p2 -= facenormals[firstintersecting] * distance;
+    }
+
+    if (*rotate)*p2 = DoRotation(*p2, 0, *rotate, 0);
+    *p2 = *p2 + *move;
+    return firstintersecting;
 }
 
-int Model::SphereCheck(XYZ *p1,float radius, XYZ *p, XYZ *move, float *rotate)
+int Model::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate)
 {
-       static int i,j;
-       static float distance;
-       static float olddistance;
-       static int intersecting;
-       static int firstintersecting;
-       static XYZ point;
-       static XYZ oldp1;
-       static XYZ start,end;
-
-       firstintersecting=-1;
-
-       oldp1=*p1;
-       *p1=*p1-*move;
-       if(*rotate)*p1=DoRotation(*p1,0,-*rotate,0);
-       if(distsq(p1,&boundingspherecenter)>radius*radius+boundingsphereradius*boundingsphereradius)return -1;
-
-       for(i=0;i<4;i++){
-               for (j=0;j<TriangleNum;j++){
-                       intersecting=0;
-                       distance=abs((facenormals[j].x*p1->x)+(facenormals[j].y*p1->y)+(facenormals[j].z*p1->z)-((facenormals[j].x*vertex[Triangles[j].vertex[0]].x)+(facenormals[j].y*vertex[Triangles[j].vertex[0]].y)+(facenormals[j].z*vertex[Triangles[j].vertex[0]].z)));
-                       if(distance<radius){
-                               point=*p1-facenormals[j]*distance;
-                               if(PointInTriangle( &point, facenormals[j], &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]]))intersecting=1;
-                               if(!intersecting)intersecting=sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
-                                       &vertex[Triangles[j].vertex[1]],
-                                       p1, &radius);
-                               if(!intersecting)intersecting=sphere_line_intersection(&vertex[Triangles[j].vertex[1]],
-                                       &vertex[Triangles[j].vertex[2]],
-                                       p1, &radius);
-                               if(!intersecting)intersecting=sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
-                                       &vertex[Triangles[j].vertex[2]],
-                                       p1, &radius);
-                               if(intersecting){
-                                       *p1+=facenormals[j]*(distance-radius);
-                                       /*start=*p1;
-                                       end=*p1;
-                                       end.y-=radius;
-                                       if(LineFacetd(&start,&end,&vertex[Triangles[j].vertex[0]],&vertex[Triangles[j].vertex[1]],&vertex[Triangles[j].vertex[2]],&facenormals[j],&point)){
-                                       p1->y=point.y+radius;
-                                       }*/
-                               }
-                       }
-                       if((distance<olddistance||firstintersecting==-1)&&intersecting){olddistance=distance; firstintersecting=j; *p=point;}
-               }
-       }
-       if(*rotate)*p=DoRotation(*p,0,*rotate,0);
-       *p=*p+*move;
-       if(*rotate)*p1=DoRotation(*p1,0,*rotate,0);
-       *p1+=*move;
-       return firstintersecting;
+    static int i, j;
+    static float distance;
+    static float olddistance;
+    static int intersecting;
+    static int firstintersecting;
+    static XYZ point;
+    static XYZ oldp1;
+    static XYZ start, end;
+
+    firstintersecting = -1;
+
+    oldp1 = *p1;
+    *p1 = *p1 - *move;
+    if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0);
+    if (distsq(p1, &boundingspherecenter) > radius * radius + boundingsphereradius * boundingsphereradius)return -1;
+
+    for (i = 0; i < 4; i++) {
+        for (j = 0; j < TriangleNum; j++) {
+            intersecting = 0;
+            distance = abs((facenormals[j].x * p1->x) + (facenormals[j].y * p1->y) + (facenormals[j].z * p1->z) - ((facenormals[j].x * vertex[Triangles[j].vertex[0]].x) + (facenormals[j].y * vertex[Triangles[j].vertex[0]].y) + (facenormals[j].z * vertex[Triangles[j].vertex[0]].z)));
+            if (distance < radius) {
+                point = *p1 - facenormals[j] * distance;
+                if (PointInTriangle( &point, facenormals[j], &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]]))intersecting = 1;
+                if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
+                                                     &vertex[Triangles[j].vertex[1]],
+                                                     p1, &radius);
+                if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[1]],
+                                                     &vertex[Triangles[j].vertex[2]],
+                                                     p1, &radius);
+                if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
+                                                     &vertex[Triangles[j].vertex[2]],
+                                                     p1, &radius);
+                if (intersecting) {
+                    *p1 += facenormals[j] * (distance - radius);
+                    /*start=*p1;
+                    end=*p1;
+                    end.y-=radius;
+                    if(LineFacetd(&start,&end,&vertex[Triangles[j].vertex[0]],&vertex[Triangles[j].vertex[1]],&vertex[Triangles[j].vertex[2]],&facenormals[j],&point)){
+                    p1->y=point.y+radius;
+                    }*/
+                }
+            }
+            if ((distance < olddistance || firstintersecting == -1) && intersecting) {
+                olddistance = distance;
+                firstintersecting = j;
+                *p = point;
+            }
+        }
+    }
+    if (*rotate)*p = DoRotation(*p, 0, *rotate, 0);
+    *p = *p + *move;
+    if (*rotate)*p1 = DoRotation(*p1, 0, *rotate, 0);
+    *p1 += *move;
+    return firstintersecting;
 }
 
-int Model::SphereCheckPossible(XYZ *p1,float radius, XYZ *move, float *rotate)
+int Model::SphereCheckPossible(XYZ *p1, float radius, XYZ *move, float *rotate)
 {
-       static int i,j;
-       static float distance;
-       static float olddistance;
-       static int intersecting;
-       static int firstintersecting;
-       static XYZ point;
-       static XYZ oldp1;
-       static XYZ start,end;
-
-       firstintersecting=-1;
-
-       oldp1=*p1;
-       *p1=*p1-*move;
-
-       numpossible=0;
-
-       if(*rotate)*p1=DoRotation(*p1,0,-*rotate,0);
-       if(distsq(p1,&boundingspherecenter)>radius*radius+boundingsphereradius*boundingsphereradius){*p1=oldp1; return -1;}
-
-       for (j=0;j<TriangleNum;j++){
-               intersecting=0;
-               distance=abs((facenormals[j].x*p1->x)+(facenormals[j].y*p1->y)+(facenormals[j].z*p1->z)-((facenormals[j].x*vertex[Triangles[j].vertex[0]].x)+(facenormals[j].y*vertex[Triangles[j].vertex[0]].y)+(facenormals[j].z*vertex[Triangles[j].vertex[0]].z)));
-               if(distance<radius){
-                       point=*p1-facenormals[j]*distance;
-                       if(PointInTriangle( &point, facenormals[j], &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]]))intersecting=1;
-                       if(!intersecting)intersecting=sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
-                               &vertex[Triangles[j].vertex[1]],
-                               p1, &radius);
-                       if(!intersecting)intersecting=sphere_line_intersection(&vertex[Triangles[j].vertex[1]],
-                               &vertex[Triangles[j].vertex[2]],
-                               p1, &radius);
-                       if(!intersecting)intersecting=sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
-                               &vertex[Triangles[j].vertex[2]],
-                               p1, &radius);
-                       if(intersecting){
-                               //if(j>=0&&j<TriangleNum)
-                               possible[numpossible]=j;
-                               numpossible++;
-                       }
-               }
-               if((distance<olddistance||firstintersecting==-1)&&intersecting){olddistance=distance; firstintersecting=j;}
-       }
-       if(*rotate)*p1=DoRotation(*p1,0,*rotate,0);
-       *p1+=*move;
-       return firstintersecting;
+    static int i, j;
+    static float distance;
+    static float olddistance;
+    static int intersecting;
+    static int firstintersecting;
+    static XYZ point;
+    static XYZ oldp1;
+    static XYZ start, end;
+
+    firstintersecting = -1;
+
+    oldp1 = *p1;
+    *p1 = *p1 - *move;
+
+    numpossible = 0;
+
+    if (*rotate)*p1 = DoRotation(*p1, 0, -*rotate, 0);
+    if (distsq(p1, &boundingspherecenter) > radius * radius + boundingsphereradius * boundingsphereradius) {
+        *p1 = oldp1;
+        return -1;
+    }
+
+    for (j = 0; j < TriangleNum; j++) {
+        intersecting = 0;
+        distance = abs((facenormals[j].x * p1->x) + (facenormals[j].y * p1->y) + (facenormals[j].z * p1->z) - ((facenormals[j].x * vertex[Triangles[j].vertex[0]].x) + (facenormals[j].y * vertex[Triangles[j].vertex[0]].y) + (facenormals[j].z * vertex[Triangles[j].vertex[0]].z)));
+        if (distance < radius) {
+            point = *p1 - facenormals[j] * distance;
+            if (PointInTriangle( &point, facenormals[j], &vertex[Triangles[j].vertex[0]], &vertex[Triangles[j].vertex[1]], &vertex[Triangles[j].vertex[2]]))intersecting = 1;
+            if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
+                                                 &vertex[Triangles[j].vertex[1]],
+                                                 p1, &radius);
+            if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[1]],
+                                                 &vertex[Triangles[j].vertex[2]],
+                                                 p1, &radius);
+            if (!intersecting)intersecting = sphere_line_intersection(&vertex[Triangles[j].vertex[0]],
+                                                 &vertex[Triangles[j].vertex[2]],
+                                                 p1, &radius);
+            if (intersecting) {
+                //if(j>=0&&j<TriangleNum)
+                possible[numpossible] = j;
+                numpossible++;
+            }
+        }
+        if ((distance < olddistance || firstintersecting == -1) && intersecting) {
+            olddistance = distance;
+            firstintersecting = j;
+        }
+    }
+    if (*rotate)*p1 = DoRotation(*p1, 0, *rotate, 0);
+    *p1 += *move;
+    return firstintersecting;
 }
 
 
-void Model::UpdateVertexArray(){
-       if(type!=normaltype&&type!=decalstype)return;
-       static int i;
-       static int j;
-       if(!flat)
-               for(i=0;i<TriangleNum;i++){
-                       j=i*24;
-                       vArray[j+0]=Triangles[i].gx[0];
-                       vArray[j+1]=Triangles[i].gy[0];
-                       vArray[j+2]=normals[Triangles[i].vertex[0]].x;
-                       vArray[j+3]=normals[Triangles[i].vertex[0]].y;
-                       vArray[j+4]=normals[Triangles[i].vertex[0]].z;
-                       vArray[j+5]=vertex[Triangles[i].vertex[0]].x;
-                       vArray[j+6]=vertex[Triangles[i].vertex[0]].y;
-                       vArray[j+7]=vertex[Triangles[i].vertex[0]].z;
-
-                       vArray[j+8]=Triangles[i].gx[1];
-                       vArray[j+9]=Triangles[i].gy[1];
-                       vArray[j+10]=normals[Triangles[i].vertex[1]].x;
-                       vArray[j+11]=normals[Triangles[i].vertex[1]].y;
-                       vArray[j+12]=normals[Triangles[i].vertex[1]].z;
-                       vArray[j+13]=vertex[Triangles[i].vertex[1]].x;
-                       vArray[j+14]=vertex[Triangles[i].vertex[1]].y;
-                       vArray[j+15]=vertex[Triangles[i].vertex[1]].z;
-
-                       vArray[j+16]=Triangles[i].gx[2];
-                       vArray[j+17]=Triangles[i].gy[2];
-                       vArray[j+18]=normals[Triangles[i].vertex[2]].x;
-                       vArray[j+19]=normals[Triangles[i].vertex[2]].y;
-                       vArray[j+20]=normals[Triangles[i].vertex[2]].z;
-                       vArray[j+21]=vertex[Triangles[i].vertex[2]].x;
-                       vArray[j+22]=vertex[Triangles[i].vertex[2]].y;
-                       vArray[j+23]=vertex[Triangles[i].vertex[2]].z;
-               }
-               if(flat)
-                       for(i=0;i<TriangleNum;i++){
-                               j=i*24;
-                               vArray[j+0]=Triangles[i].gx[0];
-                               vArray[j+1]=Triangles[i].gy[0];
-                               vArray[j+2]=facenormals[i].x*-1;
-                               vArray[j+3]=facenormals[i].y*-1;
-                               vArray[j+4]=facenormals[i].z*-1;
-                               vArray[j+5]=vertex[Triangles[i].vertex[0]].x;
-                               vArray[j+6]=vertex[Triangles[i].vertex[0]].y;
-                               vArray[j+7]=vertex[Triangles[i].vertex[0]].z;
-
-                               vArray[j+8]=Triangles[i].gx[1];
-                               vArray[j+9]=Triangles[i].gy[1];
-                               vArray[j+10]=facenormals[i].x*-1;
-                               vArray[j+11]=facenormals[i].y*-1;
-                               vArray[j+12]=facenormals[i].z*-1;
-                               vArray[j+13]=vertex[Triangles[i].vertex[1]].x;
-                               vArray[j+14]=vertex[Triangles[i].vertex[1]].y;
-                               vArray[j+15]=vertex[Triangles[i].vertex[1]].z;
-
-                               vArray[j+16]=Triangles[i].gx[2];
-                               vArray[j+17]=Triangles[i].gy[2];
-                               vArray[j+18]=facenormals[i].x*-1;
-                               vArray[j+19]=facenormals[i].y*-1;
-                               vArray[j+20]=facenormals[i].z*-1;
-                               vArray[j+21]=vertex[Triangles[i].vertex[2]].x;
-                               vArray[j+22]=vertex[Triangles[i].vertex[2]].y;
-                               vArray[j+23]=vertex[Triangles[i].vertex[2]].z;
-
-                       }
+void Model::UpdateVertexArray()
+{
+    if (type != normaltype && type != decalstype)return;
+    static int i;
+    static int j;
+    if (!flat)
+        for (i = 0; i < TriangleNum; i++) {
+            j = i * 24;
+            vArray[j + 0] = Triangles[i].gx[0];
+            vArray[j + 1] = Triangles[i].gy[0];
+            vArray[j + 2] = normals[Triangles[i].vertex[0]].x;
+            vArray[j + 3] = normals[Triangles[i].vertex[0]].y;
+            vArray[j + 4] = normals[Triangles[i].vertex[0]].z;
+            vArray[j + 5] = vertex[Triangles[i].vertex[0]].x;
+            vArray[j + 6] = vertex[Triangles[i].vertex[0]].y;
+            vArray[j + 7] = vertex[Triangles[i].vertex[0]].z;
+
+            vArray[j + 8] = Triangles[i].gx[1];
+            vArray[j + 9] = Triangles[i].gy[1];
+            vArray[j + 10] = normals[Triangles[i].vertex[1]].x;
+            vArray[j + 11] = normals[Triangles[i].vertex[1]].y;
+            vArray[j + 12] = normals[Triangles[i].vertex[1]].z;
+            vArray[j + 13] = vertex[Triangles[i].vertex[1]].x;
+            vArray[j + 14] = vertex[Triangles[i].vertex[1]].y;
+            vArray[j + 15] = vertex[Triangles[i].vertex[1]].z;
+
+            vArray[j + 16] = Triangles[i].gx[2];
+            vArray[j + 17] = Triangles[i].gy[2];
+            vArray[j + 18] = normals[Triangles[i].vertex[2]].x;
+            vArray[j + 19] = normals[Triangles[i].vertex[2]].y;
+            vArray[j + 20] = normals[Triangles[i].vertex[2]].z;
+            vArray[j + 21] = vertex[Triangles[i].vertex[2]].x;
+            vArray[j + 22] = vertex[Triangles[i].vertex[2]].y;
+            vArray[j + 23] = vertex[Triangles[i].vertex[2]].z;
+        }
+    if (flat)
+        for (i = 0; i < TriangleNum; i++) {
+            j = i * 24;
+            vArray[j + 0] = Triangles[i].gx[0];
+            vArray[j + 1] = Triangles[i].gy[0];
+            vArray[j + 2] = facenormals[i].x * -1;
+            vArray[j + 3] = facenormals[i].y * -1;
+            vArray[j + 4] = facenormals[i].z * -1;
+            vArray[j + 5] = vertex[Triangles[i].vertex[0]].x;
+            vArray[j + 6] = vertex[Triangles[i].vertex[0]].y;
+            vArray[j + 7] = vertex[Triangles[i].vertex[0]].z;
+
+            vArray[j + 8] = Triangles[i].gx[1];
+            vArray[j + 9] = Triangles[i].gy[1];
+            vArray[j + 10] = facenormals[i].x * -1;
+            vArray[j + 11] = facenormals[i].y * -1;
+            vArray[j + 12] = facenormals[i].z * -1;
+            vArray[j + 13] = vertex[Triangles[i].vertex[1]].x;
+            vArray[j + 14] = vertex[Triangles[i].vertex[1]].y;
+            vArray[j + 15] = vertex[Triangles[i].vertex[1]].z;
+
+            vArray[j + 16] = Triangles[i].gx[2];
+            vArray[j + 17] = Triangles[i].gy[2];
+            vArray[j + 18] = facenormals[i].x * -1;
+            vArray[j + 19] = facenormals[i].y * -1;
+            vArray[j + 20] = facenormals[i].z * -1;
+            vArray[j + 21] = vertex[Triangles[i].vertex[2]].x;
+            vArray[j + 22] = vertex[Triangles[i].vertex[2]].y;
+            vArray[j + 23] = vertex[Triangles[i].vertex[2]].z;
+
+        }
 }
 
-void Model::UpdateVertexArrayNoTex(){
-       if(type!=normaltype&&type!=decalstype)return;
-       static int i;
-       static int j;
-       if(!flat)
-               for(i=0;i<TriangleNum;i++){
-                       j=i*24;
-                       vArray[j+2]=normals[Triangles[i].vertex[0]].x;
-                       vArray[j+3]=normals[Triangles[i].vertex[0]].y;
-                       vArray[j+4]=normals[Triangles[i].vertex[0]].z;
-                       vArray[j+5]=vertex[Triangles[i].vertex[0]].x;
-                       vArray[j+6]=vertex[Triangles[i].vertex[0]].y;
-                       vArray[j+7]=vertex[Triangles[i].vertex[0]].z;
-
-                       vArray[j+10]=normals[Triangles[i].vertex[1]].x;
-                       vArray[j+11]=normals[Triangles[i].vertex[1]].y;
-                       vArray[j+12]=normals[Triangles[i].vertex[1]].z;
-                       vArray[j+13]=vertex[Triangles[i].vertex[1]].x;
-                       vArray[j+14]=vertex[Triangles[i].vertex[1]].y;
-                       vArray[j+15]=vertex[Triangles[i].vertex[1]].z;
-
-                       vArray[j+18]=normals[Triangles[i].vertex[2]].x;
-                       vArray[j+19]=normals[Triangles[i].vertex[2]].y;
-                       vArray[j+20]=normals[Triangles[i].vertex[2]].z;
-                       vArray[j+21]=vertex[Triangles[i].vertex[2]].x;
-                       vArray[j+22]=vertex[Triangles[i].vertex[2]].y;
-                       vArray[j+23]=vertex[Triangles[i].vertex[2]].z;
-               }
-               if(flat)
-                       for(i=0;i<TriangleNum;i++){
-                               j=i*24;
-                               vArray[j+2]=facenormals[i].x*-1;
-                               vArray[j+3]=facenormals[i].y*-1;
-                               vArray[j+4]=facenormals[i].z*-1;
-                               vArray[j+5]=vertex[Triangles[i].vertex[0]].x;
-                               vArray[j+6]=vertex[Triangles[i].vertex[0]].y;
-                               vArray[j+7]=vertex[Triangles[i].vertex[0]].z;
-
-                               vArray[j+10]=facenormals[i].x*-1;
-                               vArray[j+11]=facenormals[i].y*-1;
-                               vArray[j+12]=facenormals[i].z*-1;
-                               vArray[j+13]=vertex[Triangles[i].vertex[1]].x;
-                               vArray[j+14]=vertex[Triangles[i].vertex[1]].y;
-                               vArray[j+15]=vertex[Triangles[i].vertex[1]].z;
-
-                               vArray[j+18]=facenormals[i].x*-1;
-                               vArray[j+19]=facenormals[i].y*-1;
-                               vArray[j+20]=facenormals[i].z*-1;
-                               vArray[j+21]=vertex[Triangles[i].vertex[2]].x;
-                               vArray[j+22]=vertex[Triangles[i].vertex[2]].y;
-                               vArray[j+23]=vertex[Triangles[i].vertex[2]].z;
-                       }
+void Model::UpdateVertexArrayNoTex()
+{
+    if (type != normaltype && type != decalstype)return;
+    static int i;
+    static int j;
+    if (!flat)
+        for (i = 0; i < TriangleNum; i++) {
+            j = i * 24;
+            vArray[j + 2] = normals[Triangles[i].vertex[0]].x;
+            vArray[j + 3] = normals[Triangles[i].vertex[0]].y;
+            vArray[j + 4] = normals[Triangles[i].vertex[0]].z;
+            vArray[j + 5] = vertex[Triangles[i].vertex[0]].x;
+            vArray[j + 6] = vertex[Triangles[i].vertex[0]].y;
+            vArray[j + 7] = vertex[Triangles[i].vertex[0]].z;
+
+            vArray[j + 10] = normals[Triangles[i].vertex[1]].x;
+            vArray[j + 11] = normals[Triangles[i].vertex[1]].y;
+            vArray[j + 12] = normals[Triangles[i].vertex[1]].z;
+            vArray[j + 13] = vertex[Triangles[i].vertex[1]].x;
+            vArray[j + 14] = vertex[Triangles[i].vertex[1]].y;
+            vArray[j + 15] = vertex[Triangles[i].vertex[1]].z;
+
+            vArray[j + 18] = normals[Triangles[i].vertex[2]].x;
+            vArray[j + 19] = normals[Triangles[i].vertex[2]].y;
+            vArray[j + 20] = normals[Triangles[i].vertex[2]].z;
+            vArray[j + 21] = vertex[Triangles[i].vertex[2]].x;
+            vArray[j + 22] = vertex[Triangles[i].vertex[2]].y;
+            vArray[j + 23] = vertex[Triangles[i].vertex[2]].z;
+        }
+    if (flat)
+        for (i = 0; i < TriangleNum; i++) {
+            j = i * 24;
+            vArray[j + 2] = facenormals[i].x * -1;
+            vArray[j + 3] = facenormals[i].y * -1;
+            vArray[j + 4] = facenormals[i].z * -1;
+            vArray[j + 5] = vertex[Triangles[i].vertex[0]].x;
+            vArray[j + 6] = vertex[Triangles[i].vertex[0]].y;
+            vArray[j + 7] = vertex[Triangles[i].vertex[0]].z;
+
+            vArray[j + 10] = facenormals[i].x * -1;
+            vArray[j + 11] = facenormals[i].y * -1;
+            vArray[j + 12] = facenormals[i].z * -1;
+            vArray[j + 13] = vertex[Triangles[i].vertex[1]].x;
+            vArray[j + 14] = vertex[Triangles[i].vertex[1]].y;
+            vArray[j + 15] = vertex[Triangles[i].vertex[1]].z;
+
+            vArray[j + 18] = facenormals[i].x * -1;
+            vArray[j + 19] = facenormals[i].y * -1;
+            vArray[j + 20] = facenormals[i].z * -1;
+            vArray[j + 21] = vertex[Triangles[i].vertex[2]].x;
+            vArray[j + 22] = vertex[Triangles[i].vertex[2]].y;
+            vArray[j + 23] = vertex[Triangles[i].vertex[2]].z;
+        }
 }
 
-void Model::UpdateVertexArrayNoTexNoNorm(){
-       if(type!=normaltype&&type!=decalstype)return;
-       static int i;
-       static int j;
-       for(i=0;i<TriangleNum;i++){
-               j=i*24;
-               vArray[j+5]=vertex[Triangles[i].vertex[0]].x;
-               vArray[j+6]=vertex[Triangles[i].vertex[0]].y;
-               vArray[j+7]=vertex[Triangles[i].vertex[0]].z;
-
-               vArray[j+13]=vertex[Triangles[i].vertex[1]].x;
-               vArray[j+14]=vertex[Triangles[i].vertex[1]].y;
-               vArray[j+15]=vertex[Triangles[i].vertex[1]].z;
-
-               vArray[j+21]=vertex[Triangles[i].vertex[2]].x;
-               vArray[j+22]=vertex[Triangles[i].vertex[2]].y;
-               vArray[j+23]=vertex[Triangles[i].vertex[2]].z;
-       }
+void Model::UpdateVertexArrayNoTexNoNorm()
+{
+    if (type != normaltype && type != decalstype)return;
+    static int i;
+    static int j;
+    for (i = 0; i < TriangleNum; i++) {
+        j = i * 24;
+        vArray[j + 5] = vertex[Triangles[i].vertex[0]].x;
+        vArray[j + 6] = vertex[Triangles[i].vertex[0]].y;
+        vArray[j + 7] = vertex[Triangles[i].vertex[0]].z;
+
+        vArray[j + 13] = vertex[Triangles[i].vertex[1]].x;
+        vArray[j + 14] = vertex[Triangles[i].vertex[1]].y;
+        vArray[j + 15] = vertex[Triangles[i].vertex[1]].z;
+
+        vArray[j + 21] = vertex[Triangles[i].vertex[2]].x;
+        vArray[j + 22] = vertex[Triangles[i].vertex[2]].y;
+        vArray[j + 23] = vertex[Triangles[i].vertex[2]].z;
+    }
 }
 
 bool Model::loadnotex(const char *filename )
 {
-       FILE                    *tfile;
-       long                            i;
-
-       int oldvertexNum,oldTriangleNum;
-       oldvertexNum=vertexNum;
-       oldTriangleNum=TriangleNum;
-
-       type=notextype;
-       color=0;
-
-       tfile=fopen( ConvertFileName(filename), "rb" );
-       // read model settings
-
-       fseek(tfile, 0, SEEK_SET);
-       funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
-
-       // read the model data
-       deallocate();
-
-       numpossible=0;
-
-       owner = (int*)malloc(sizeof(int)*vertexNum);
-       possible = (int*)malloc(sizeof(int)*TriangleNum);
-       vertex = (XYZ*)malloc(sizeof(XYZ)*vertexNum);
-       Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle)*TriangleNum);
-       vArray = (GLfloat*)malloc(sizeof(GLfloat)*TriangleNum*24);
-
-       for(i=0;i<vertexNum;i++){
-               funpackf(tfile, "Bf Bf Bf", &vertex[i].x,&vertex[i].y,&vertex[i].z);
-       }
-
-       for(i=0;i<TriangleNum;i++){
-               //              funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
-               short vertex[ 6];
-               funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
-               Triangles[i].vertex[ 0] = vertex[ 0];
-               Triangles[i].vertex[ 1] = vertex[ 2];
-               Triangles[i].vertex[ 2] = vertex[ 4];
-               funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
-               funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
-       }
-
-       fclose(tfile);
-
-       UpdateVertexArray();
-
-       for(i=0;i<vertexNum;i++){
-               owner[i]=-1;
-       }
-
-       static int j;
-       boundingsphereradius=0;
-       for(i=0;i<vertexNum;i++){
-               for(j=0;j<vertexNum;j++){
-                       if(j!=i&&distsq(&vertex[j],&vertex[i])/2>boundingsphereradius){
-                               boundingsphereradius=distsq(&vertex[j],&vertex[i])/2;
-                               boundingspherecenter=(vertex[i]+vertex[j])/2;
-                       }
-               }
-       }       
-       boundingsphereradius=fast_sqrt(boundingsphereradius);
-
-       return 1;
+    FILE                       *tfile;
+    long                               i;
+
+    int oldvertexNum, oldTriangleNum;
+    oldvertexNum = vertexNum;
+    oldTriangleNum = TriangleNum;
+
+    type = notextype;
+    color = 0;
+
+    tfile = fopen( ConvertFileName(filename), "rb" );
+    // read model settings
+
+    fseek(tfile, 0, SEEK_SET);
+    funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
+
+    // read the model data
+    deallocate();
+
+    numpossible = 0;
+
+    owner = (int*)malloc(sizeof(int) * vertexNum);
+    possible = (int*)malloc(sizeof(int) * TriangleNum);
+    vertex = (XYZ*)malloc(sizeof(XYZ) * vertexNum);
+    Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle) * TriangleNum);
+    vArray = (GLfloat*)malloc(sizeof(GLfloat) * TriangleNum * 24);
+
+    for (i = 0; i < vertexNum; i++) {
+        funpackf(tfile, "Bf Bf Bf", &vertex[i].x, &vertex[i].y, &vertex[i].z);
+    }
+
+    for (i = 0; i < TriangleNum; i++) {
+        //             funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
+        short vertex[ 6];
+        funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
+        Triangles[i].vertex[ 0] = vertex[ 0];
+        Triangles[i].vertex[ 1] = vertex[ 2];
+        Triangles[i].vertex[ 2] = vertex[ 4];
+        funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
+        funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
+    }
+
+    fclose(tfile);
+
+    UpdateVertexArray();
+
+    for (i = 0; i < vertexNum; i++) {
+        owner[i] = -1;
+    }
+
+    static int j;
+    boundingsphereradius = 0;
+    for (i = 0; i < vertexNum; i++) {
+        for (j = 0; j < vertexNum; j++) {
+            if (j != i && distsq(&vertex[j], &vertex[i]) / 2 > boundingsphereradius) {
+                boundingsphereradius = distsq(&vertex[j], &vertex[i]) / 2;
+                boundingspherecenter = (vertex[i] + vertex[j]) / 2;
+            }
+        }
+    }
+    boundingsphereradius = fast_sqrt(boundingsphereradius);
+
+    return 1;
 }
 
 
-bool Model::load(const char *filename,bool texture )
+bool Model::load(const char *filename, bool texture )
 {
-       FILE                    *tfile;
-       long                            i;
+    FILE                       *tfile;
+    long                               i;
 
-       LOGFUNC;
+    LOGFUNC;
 
-       LOG(std::string("Loading model...") + filename);
+    LOG(std::string("Loading model...") + filename);
 
-       if(visibleloading)
-               Game::LoadingScreen();
+    if (visibleloading)
+        Game::LoadingScreen();
 
-       int oldvertexNum,oldTriangleNum;
-       oldvertexNum=vertexNum;
-       oldTriangleNum=TriangleNum;
+    int oldvertexNum, oldTriangleNum;
+    oldvertexNum = vertexNum;
+    oldTriangleNum = TriangleNum;
 
-       type = normaltype;
-       color=0;
+    type = normaltype;
+    color = 0;
 
-       tfile=fopen( ConvertFileName(filename), "rb" );
-       // read model settings
+    tfile = fopen( ConvertFileName(filename), "rb" );
+    // read model settings
 
 
-       fseek(tfile, 0, SEEK_SET);
-       funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
+    fseek(tfile, 0, SEEK_SET);
+    funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
 
-       // read the model data
-       deallocate();
+    // read the model data
+    deallocate();
 
-       numpossible=0;
+    numpossible = 0;
 
-       owner = (int*)malloc(sizeof(int)*vertexNum);
-       possible = (int*)malloc(sizeof(int)*TriangleNum);
-       vertex = (XYZ*)malloc(sizeof(XYZ)*vertexNum);
-       normals = (XYZ*)malloc(sizeof(XYZ)*vertexNum);
-       facenormals = (XYZ*)malloc(sizeof(XYZ)*TriangleNum);
-       Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle)*TriangleNum);
-       vArray = (GLfloat*)malloc(sizeof(GLfloat)*TriangleNum*24);
+    owner = (int*)malloc(sizeof(int) * vertexNum);
+    possible = (int*)malloc(sizeof(int) * TriangleNum);
+    vertex = (XYZ*)malloc(sizeof(XYZ) * vertexNum);
+    normals = (XYZ*)malloc(sizeof(XYZ) * vertexNum);
+    facenormals = (XYZ*)malloc(sizeof(XYZ) * TriangleNum);
+    Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle) * TriangleNum);
+    vArray = (GLfloat*)malloc(sizeof(GLfloat) * TriangleNum * 24);
 
-       for(i=0;i<vertexNum;i++){
-               funpackf(tfile, "Bf Bf Bf", &vertex[i].x,&vertex[i].y,&vertex[i].z);
-       }
+    for (i = 0; i < vertexNum; i++) {
+        funpackf(tfile, "Bf Bf Bf", &vertex[i].x, &vertex[i].y, &vertex[i].z);
+    }
 
-       for(i=0;i<TriangleNum;i++){
-               //              funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
-               short vertex[ 6];
-               funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
-               Triangles[i].vertex[ 0] = vertex[ 0];
-               Triangles[i].vertex[ 1] = vertex[ 2];
-               Triangles[i].vertex[ 2] = vertex[ 4];
-               funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
-               funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
-       }
+    for (i = 0; i < TriangleNum; i++) {
+        //             funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
+        short vertex[ 6];
+        funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
+        Triangles[i].vertex[ 0] = vertex[ 0];
+        Triangles[i].vertex[ 1] = vertex[ 2];
+        Triangles[i].vertex[ 2] = vertex[ 4];
+        funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
+        funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
+    }
 
-       modelTexture.xsz=0;
+    modelTexture.xsz = 0;
 
-       fclose(tfile);
+    fclose(tfile);
 
-       UpdateVertexArray();
+    UpdateVertexArray();
 
-       for(i=0;i<vertexNum;i++){
-               owner[i]=-1;
-       }
+    for (i = 0; i < vertexNum; i++) {
+        owner[i] = -1;
+    }
 
-       static int j;
-       boundingsphereradius=0;
-       for(i=0;i<vertexNum;i++){
-               for(j=0;j<vertexNum;j++){
-                       if(j!=i&&distsq(&vertex[j],&vertex[i])/2>boundingsphereradius){
-                               boundingsphereradius=distsq(&vertex[j],&vertex[i])/2;
-                               boundingspherecenter=(vertex[i]+vertex[j])/2;
-                       }
-               }
-       }       
-       boundingsphereradius=fast_sqrt(boundingsphereradius);
+    static int j;
+    boundingsphereradius = 0;
+    for (i = 0; i < vertexNum; i++) {
+        for (j = 0; j < vertexNum; j++) {
+            if (j != i && distsq(&vertex[j], &vertex[i]) / 2 > boundingsphereradius) {
+                boundingsphereradius = distsq(&vertex[j], &vertex[i]) / 2;
+                boundingspherecenter = (vertex[i] + vertex[j]) / 2;
+            }
+        }
+    }
+    boundingsphereradius = fast_sqrt(boundingsphereradius);
 
-       return 1;
+    return 1;
 }
 
-bool Model::loaddecal(const char *filename,bool texture )
+bool Model::loaddecal(const char *filename, bool texture )
 {
-       FILE                    *tfile;
-       long                            i,j;
-
-       LOGFUNC;
-
-       // Changing the filename so that its more os specific
-       char * FixedFN = ConvertFileName(filename);
-
-       LOG(std::string("Loading decal...") + FixedFN);
-
-       int oldvertexNum,oldTriangleNum;
-       oldvertexNum=vertexNum;
-       oldTriangleNum=TriangleNum;
-
-       type = decalstype;
-       numdecals=0;
-       color=0;
-
-       tfile=fopen( FixedFN, "rb" );
-       // read model settings
-
-
-       fseek(tfile, 0, SEEK_SET);
-       funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
-
-       // read the model data
-
-       deallocate();
-
-       numpossible=0;
-
-       owner = (int*)malloc(sizeof(int)*vertexNum);
-       possible = (int*)malloc(sizeof(int)*TriangleNum);
-       vertex = (XYZ*)malloc(sizeof(XYZ)*vertexNum);
-       normals = (XYZ*)malloc(sizeof(XYZ)*vertexNum);
-       facenormals = (XYZ*)malloc(sizeof(XYZ)*TriangleNum);
-       Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle)*TriangleNum);
-       vArray = (GLfloat*)malloc(sizeof(GLfloat)*TriangleNum*24);
-
-
-       for(i=0;i<vertexNum;i++){
-               funpackf(tfile, "Bf Bf Bf", &vertex[i].x,&vertex[i].y,&vertex[i].z);
-       }
-
-       for(i=0;i<TriangleNum;i++){
-               //              funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
-               short vertex[ 6];
-               funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
-               Triangles[i].vertex[ 0] = vertex[ 0];
-               Triangles[i].vertex[ 1] = vertex[ 2];
-               Triangles[i].vertex[ 2] = vertex[ 4];
-               funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
-               funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
-       }
-
-
-       modelTexture.xsz=0;
-
-       fclose(tfile);
-
-       UpdateVertexArray();
-
-       for(i=0;i<vertexNum;i++){
-               owner[i]=-1;
-       }
-
-       boundingsphereradius=0;
-       for(i=0;i<vertexNum;i++){
-               for(j=0;j<vertexNum;j++){
-                       if(j!=i&&distsq(&vertex[j],&vertex[i])/2>boundingsphereradius){
-                               boundingsphereradius=distsq(&vertex[j],&vertex[i])/2;
-                               boundingspherecenter=(vertex[i]+vertex[j])/2;
-                       }
-               }
-       }       
-       boundingsphereradius=fast_sqrt(boundingsphereradius);
-
-       //allow decals
-       if(!decaltexcoords){
-               decaltexcoords = (float***)malloc(sizeof(float**)*max_model_decals);
-               for(i=0;i<max_model_decals;i++){
-                       decaltexcoords[i] = (float**)malloc(sizeof(float*)*3);
-                       for(j=0;j<3;j++){
-                               decaltexcoords[i][j] = (float*)malloc(sizeof(float)*2);
-                       }
-               }
-               //if(decalvertex)free(decalvertex);
-               decalvertex = (XYZ**)malloc(sizeof(XYZ*)*max_model_decals);
-               for(i=0;i<max_model_decals;i++){
-                       decalvertex[i] = (XYZ*)malloc(sizeof(XYZ)*3);
-               }
-
-               decaltype = (int*)malloc(sizeof(int)*max_model_decals);
-               decalopacity = (float*)malloc(sizeof(float)*max_model_decals);
-               decalrotation = (float*)malloc(sizeof(float)*max_model_decals);
-               decalalivetime = (float*)malloc(sizeof(float)*max_model_decals);
-               decalposition = (XYZ*)malloc(sizeof(XYZ)*max_model_decals);
-       }
-
-       return 1;
+    FILE                       *tfile;
+    long                               i, j;
+
+    LOGFUNC;
+
+    // Changing the filename so that its more os specific
+    char * FixedFN = ConvertFileName(filename);
+
+    LOG(std::string("Loading decal...") + FixedFN);
+
+    int oldvertexNum, oldTriangleNum;
+    oldvertexNum = vertexNum;
+    oldTriangleNum = TriangleNum;
+
+    type = decalstype;
+    numdecals = 0;
+    color = 0;
+
+    tfile = fopen( FixedFN, "rb" );
+    // read model settings
+
+
+    fseek(tfile, 0, SEEK_SET);
+    funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
+
+    // read the model data
+
+    deallocate();
+
+    numpossible = 0;
+
+    owner = (int*)malloc(sizeof(int) * vertexNum);
+    possible = (int*)malloc(sizeof(int) * TriangleNum);
+    vertex = (XYZ*)malloc(sizeof(XYZ) * vertexNum);
+    normals = (XYZ*)malloc(sizeof(XYZ) * vertexNum);
+    facenormals = (XYZ*)malloc(sizeof(XYZ) * TriangleNum);
+    Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle) * TriangleNum);
+    vArray = (GLfloat*)malloc(sizeof(GLfloat) * TriangleNum * 24);
+
+
+    for (i = 0; i < vertexNum; i++) {
+        funpackf(tfile, "Bf Bf Bf", &vertex[i].x, &vertex[i].y, &vertex[i].z);
+    }
+
+    for (i = 0; i < TriangleNum; i++) {
+        //             funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
+        short vertex[ 6];
+        funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
+        Triangles[i].vertex[ 0] = vertex[ 0];
+        Triangles[i].vertex[ 1] = vertex[ 2];
+        Triangles[i].vertex[ 2] = vertex[ 4];
+        funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
+        funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
+    }
+
+
+    modelTexture.xsz = 0;
+
+    fclose(tfile);
+
+    UpdateVertexArray();
+
+    for (i = 0; i < vertexNum; i++) {
+        owner[i] = -1;
+    }
+
+    boundingsphereradius = 0;
+    for (i = 0; i < vertexNum; i++) {
+        for (j = 0; j < vertexNum; j++) {
+            if (j != i && distsq(&vertex[j], &vertex[i]) / 2 > boundingsphereradius) {
+                boundingsphereradius = distsq(&vertex[j], &vertex[i]) / 2;
+                boundingspherecenter = (vertex[i] + vertex[j]) / 2;
+            }
+        }
+    }
+    boundingsphereradius = fast_sqrt(boundingsphereradius);
+
+    //allow decals
+    if (!decaltexcoords) {
+        decaltexcoords = (float***)malloc(sizeof(float**)*max_model_decals);
+        for (i = 0; i < max_model_decals; i++) {
+            decaltexcoords[i] = (float**)malloc(sizeof(float*) * 3);
+            for (j = 0; j < 3; j++) {
+                decaltexcoords[i][j] = (float*)malloc(sizeof(float) * 2);
+            }
+        }
+        //if(decalvertex)free(decalvertex);
+        decalvertex = (XYZ**)malloc(sizeof(XYZ*)*max_model_decals);
+        for (i = 0; i < max_model_decals; i++) {
+            decalvertex[i] = (XYZ*)malloc(sizeof(XYZ) * 3);
+        }
+
+        decaltype = (int*)malloc(sizeof(int) * max_model_decals);
+        decalopacity = (float*)malloc(sizeof(float) * max_model_decals);
+        decalrotation = (float*)malloc(sizeof(float) * max_model_decals);
+        decalalivetime = (float*)malloc(sizeof(float) * max_model_decals);
+        decalposition = (XYZ*)malloc(sizeof(XYZ) * max_model_decals);
+    }
+
+    return 1;
 }
 
 bool Model::loadraw(char *filename )
 {
-       FILE                    *tfile;
-       long                            i;
+    FILE                       *tfile;
+    long                               i;
 
-       LOGFUNC;
+    LOGFUNC;
 
-       LOG(std::string("Loading raw...") + filename);
+    LOG(std::string("Loading raw...") + filename);
 
-       int oldvertexNum,oldTriangleNum;
-       oldvertexNum=vertexNum;
-       oldTriangleNum=TriangleNum;
+    int oldvertexNum, oldTriangleNum;
+    oldvertexNum = vertexNum;
+    oldTriangleNum = TriangleNum;
 
-       type = rawtype;
-       color=0;
+    type = rawtype;
+    color = 0;
 
-       tfile=fopen( ConvertFileName(filename), "rb" );
-       // read model settings
+    tfile = fopen( ConvertFileName(filename), "rb" );
+    // read model settings
 
 
-       fseek(tfile, 0, SEEK_SET);
-       funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
+    fseek(tfile, 0, SEEK_SET);
+    funpackf(tfile, "Bs Bs", &vertexNum, &TriangleNum);
 
-       // read the model data
-       deallocate();
+    // read the model data
+    deallocate();
 
-       numpossible=0;
+    numpossible = 0;
 
-       owner = (int*)malloc(sizeof(int)*vertexNum);
-       possible = (int*)malloc(sizeof(int)*TriangleNum);
-       vertex = (XYZ*)malloc(sizeof(XYZ)*vertexNum);
-       Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle)*TriangleNum);
-       vArray = (GLfloat*)malloc(sizeof(GLfloat)*TriangleNum*24);
+    owner = (int*)malloc(sizeof(int) * vertexNum);
+    possible = (int*)malloc(sizeof(int) * TriangleNum);
+    vertex = (XYZ*)malloc(sizeof(XYZ) * vertexNum);
+    Triangles = (TexturedTriangle*)malloc(sizeof(TexturedTriangle) * TriangleNum);
+    vArray = (GLfloat*)malloc(sizeof(GLfloat) * TriangleNum * 24);
 
 
-       for(i=0;i<vertexNum;i++){
-               funpackf(tfile, "Bf Bf Bf", &vertex[i].x,&vertex[i].y,&vertex[i].z);
-       }
+    for (i = 0; i < vertexNum; i++) {
+        funpackf(tfile, "Bf Bf Bf", &vertex[i].x, &vertex[i].y, &vertex[i].z);
+    }
 
-       for(i=0;i<TriangleNum;i++){
-               //              funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
-               short vertex[ 6];
-               funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
-               Triangles[i].vertex[ 0] = vertex[ 0];
-               Triangles[i].vertex[ 1] = vertex[ 2];
-               Triangles[i].vertex[ 2] = vertex[ 4];
-               funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
-               funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
-       }
+    for (i = 0; i < TriangleNum; i++) {
+        //             funpackf(tfile, "Bi Bi Bi", &Triangles[i].vertex[0], &Triangles[i].vertex[1], &Triangles[i].vertex[2]);
+        short vertex[ 6];
+        funpackf(tfile, "Bs Bs Bs Bs Bs Bs", &vertex[ 0], &vertex[ 1], &vertex[ 2], &vertex[ 3], &vertex[ 4], &vertex[ 5]);
+        Triangles[i].vertex[ 0] = vertex[ 0];
+        Triangles[i].vertex[ 1] = vertex[ 2];
+        Triangles[i].vertex[ 2] = vertex[ 4];
+        funpackf(tfile, "Bf Bf Bf", &Triangles[i].gx[0], &Triangles[i].gx[1], &Triangles[i].gx[2]);
+        funpackf(tfile, "Bf Bf Bf", &Triangles[i].gy[0], &Triangles[i].gy[1], &Triangles[i].gy[2]);
+    }
 
 
-       fclose(tfile);
+    fclose(tfile);
 
-       for(i=0;i<vertexNum;i++){
-               owner[i]=-1;
-       }
+    for (i = 0; i < vertexNum; i++) {
+        owner[i] = -1;
+    }
 
-       return 1;
+    return 1;
 }
 
 
 void Model::UniformTexCoords()
 {
-       static int i;
-       for(i=0; i<TriangleNum; i++){
-               Triangles[i].gy[0]=vertex[Triangles[i].vertex[0]].y;
-               Triangles[i].gy[1]=vertex[Triangles[i].vertex[1]].y;
-               Triangles[i].gy[2]=vertex[Triangles[i].vertex[2]].y;            
-               Triangles[i].gx[0]=vertex[Triangles[i].vertex[0]].x;
-               Triangles[i].gx[1]=vertex[Triangles[i].vertex[1]].x;
-               Triangles[i].gx[2]=vertex[Triangles[i].vertex[2]].x;            
-       }
-       UpdateVertexArray();
+    static int i;
+    for (i = 0; i < TriangleNum; i++) {
+        Triangles[i].gy[0] = vertex[Triangles[i].vertex[0]].y;
+        Triangles[i].gy[1] = vertex[Triangles[i].vertex[1]].y;
+        Triangles[i].gy[2] = vertex[Triangles[i].vertex[2]].y;
+        Triangles[i].gx[0] = vertex[Triangles[i].vertex[0]].x;
+        Triangles[i].gx[1] = vertex[Triangles[i].vertex[1]].x;
+        Triangles[i].gx[2] = vertex[Triangles[i].vertex[2]].x;
+    }
+    UpdateVertexArray();
 }
 
 
 void Model::FlipTexCoords()
 {
-       static int i;
-       for(i=0; i<TriangleNum; i++){
-               Triangles[i].gy[0]=-Triangles[i].gy[0];
-               Triangles[i].gy[1]=-Triangles[i].gy[1];
-               Triangles[i].gy[2]=-Triangles[i].gy[2];         
-       }
-       UpdateVertexArray();
+    static int i;
+    for (i = 0; i < TriangleNum; i++) {
+        Triangles[i].gy[0] = -Triangles[i].gy[0];
+        Triangles[i].gy[1] = -Triangles[i].gy[1];
+        Triangles[i].gy[2] = -Triangles[i].gy[2];
+    }
+    UpdateVertexArray();
 }
 
 void Model::ScaleTexCoords(float howmuch)
 {
-       static int i;
-       for(i=0; i<TriangleNum; i++){
-               Triangles[i].gx[0]*=howmuch;
-               Triangles[i].gx[1]*=howmuch;
-               Triangles[i].gx[2]*=howmuch;    
-               Triangles[i].gy[0]*=howmuch;
-               Triangles[i].gy[1]*=howmuch;
-               Triangles[i].gy[2]*=howmuch;            
-       }
-       UpdateVertexArray();
+    static int i;
+    for (i = 0; i < TriangleNum; i++) {
+        Triangles[i].gx[0] *= howmuch;
+        Triangles[i].gx[1] *= howmuch;
+        Triangles[i].gx[2] *= howmuch;
+        Triangles[i].gy[0] *= howmuch;
+        Triangles[i].gy[1] *= howmuch;
+        Triangles[i].gy[2] *= howmuch;
+    }
+    UpdateVertexArray();
 }
 
-void Model::Scale(float xscale,float yscale,float zscale)
+void Model::Scale(float xscale, float yscale, float zscale)
 {
-       static int i;
-       for(i=0; i<vertexNum; i++){
-               vertex[i].x*=xscale;
-               vertex[i].y*=yscale;
-               vertex[i].z*=zscale;
-       }
-       UpdateVertexArray();
-
-       static int j;
-
-       boundingsphereradius=0;
-       for(i=0;i<vertexNum;i++){
-               for(j=0;j<vertexNum;j++){
-                       if(j!=i&&distsq(&vertex[j],&vertex[i])/2>boundingsphereradius){
-                               boundingsphereradius=distsq(&vertex[j],&vertex[i])/2;
-                               boundingspherecenter=(vertex[i]+vertex[j])/2;
-                       }
-               }
-       }       
-       boundingsphereradius=fast_sqrt(boundingsphereradius);
+    static int i;
+    for (i = 0; i < vertexNum; i++) {
+        vertex[i].x *= xscale;
+        vertex[i].y *= yscale;
+        vertex[i].z *= zscale;
+    }
+    UpdateVertexArray();
+
+    static int j;
+
+    boundingsphereradius = 0;
+    for (i = 0; i < vertexNum; i++) {
+        for (j = 0; j < vertexNum; j++) {
+            if (j != i && distsq(&vertex[j], &vertex[i]) / 2 > boundingsphereradius) {
+                boundingsphereradius = distsq(&vertex[j], &vertex[i]) / 2;
+                boundingspherecenter = (vertex[i] + vertex[j]) / 2;
+            }
+        }
+    }
+    boundingsphereradius = fast_sqrt(boundingsphereradius);
 }
 
-void Model::ScaleNormals(float xscale,float yscale,float zscale)
+void Model::ScaleNormals(float xscale, float yscale, float zscale)
 {
-       if(type!=normaltype&&type!=decalstype)return;
-       static int i;
-       for(i=0; i<vertexNum; i++){
-               normals[i].x*=xscale;
-               normals[i].y*=yscale;
-               normals[i].z*=zscale;
-       }
-       for(i=0; i<TriangleNum; i++){
-               facenormals[i].x*=xscale;
-               facenormals[i].y*=yscale;
-               facenormals[i].z*=zscale;
-       }
-       UpdateVertexArray();
+    if (type != normaltype && type != decalstype)return;
+    static int i;
+    for (i = 0; i < vertexNum; i++) {
+        normals[i].x *= xscale;
+        normals[i].y *= yscale;
+        normals[i].z *= zscale;
+    }
+    for (i = 0; i < TriangleNum; i++) {
+        facenormals[i].x *= xscale;
+        facenormals[i].y *= yscale;
+        facenormals[i].z *= zscale;
+    }
+    UpdateVertexArray();
 }
 
-void Model::Translate(float xtrans,float ytrans,float ztrans)
+void Model::Translate(float xtrans, float ytrans, float ztrans)
 {
-       static int i;
-       for(i=0; i<vertexNum; i++){
-               vertex[i].x+=xtrans;
-               vertex[i].y+=ytrans;
-               vertex[i].z+=ztrans;
-       }
-       UpdateVertexArray();
-
-       static int j;
-       boundingsphereradius=0;
-       for(i=0;i<vertexNum;i++){
-               for(j=0;j<vertexNum;j++){
-                       if(j!=i&&distsq(&vertex[j],&vertex[i])/2>boundingsphereradius){
-                               boundingsphereradius=distsq(&vertex[j],&vertex[i])/2;
-                               boundingspherecenter=(vertex[i]+vertex[j])/2;
-                       }
-               }
-       }       
-       boundingsphereradius=fast_sqrt(boundingsphereradius);
+    static int i;
+    for (i = 0; i < vertexNum; i++) {
+        vertex[i].x += xtrans;
+        vertex[i].y += ytrans;
+        vertex[i].z += ztrans;
+    }
+    UpdateVertexArray();
+
+    static int j;
+    boundingsphereradius = 0;
+    for (i = 0; i < vertexNum; i++) {
+        for (j = 0; j < vertexNum; j++) {
+            if (j != i && distsq(&vertex[j], &vertex[i]) / 2 > boundingsphereradius) {
+                boundingsphereradius = distsq(&vertex[j], &vertex[i]) / 2;
+                boundingspherecenter = (vertex[i] + vertex[j]) / 2;
+            }
+        }
+    }
+    boundingsphereradius = fast_sqrt(boundingsphereradius);
 }
 
-void Model::Rotate(float xang,float yang,float zang)
+void Model::Rotate(float xang, float yang, float zang)
 {
-       static int i;
-       for(i=0; i<vertexNum; i++){
-               vertex[i]=DoRotation(vertex[i],xang,yang,zang);
-       }
-       UpdateVertexArray();
-
-       static int j;
-       boundingsphereradius=0;
-       for(i=0;i<vertexNum;i++){
-               for(j=0;j<vertexNum;j++){
-                       if(j!=i&&distsq(&vertex[j],&vertex[i])/2>boundingsphereradius){
-                               boundingsphereradius=distsq(&vertex[j],&vertex[i])/2;
-                               boundingspherecenter=(vertex[i]+vertex[j])/2;
-                       }
-               }
-       }
-       boundingsphereradius=fast_sqrt(boundingsphereradius);   
+    static int i;
+    for (i = 0; i < vertexNum; i++) {
+        vertex[i] = DoRotation(vertex[i], xang, yang, zang);
+    }
+    UpdateVertexArray();
+
+    static int j;
+    boundingsphereradius = 0;
+    for (i = 0; i < vertexNum; i++) {
+        for (j = 0; j < vertexNum; j++) {
+            if (j != i && distsq(&vertex[j], &vertex[i]) / 2 > boundingsphereradius) {
+                boundingsphereradius = distsq(&vertex[j], &vertex[i]) / 2;
+                boundingspherecenter = (vertex[i] + vertex[j]) / 2;
+            }
+        }
+    }
+    boundingsphereradius = fast_sqrt(boundingsphereradius);
 }
 
 
 void Model::CalculateNormals(bool facenormalise)
 {
-       if(visibleloading)
-               Game::LoadingScreen();
-       static int i;
-       if(type!=normaltype&&type!=decalstype)return;
-
-       for(i=0; i<vertexNum; i++){
-               normals[i].x=0;
-               normals[i].y=0;
-               normals[i].z=0;
-       }
-
-       for(i=0;i<TriangleNum;i++){
-               CrossProduct(vertex[Triangles[i].vertex[1]]-vertex[Triangles[i].vertex[0]],vertex[Triangles[i].vertex[2]]-vertex[Triangles[i].vertex[0]],&facenormals[i]);
-
-               normals[Triangles[i].vertex[0]].x+=facenormals[i].x;
-               normals[Triangles[i].vertex[0]].y+=facenormals[i].y;
-               normals[Triangles[i].vertex[0]].z+=facenormals[i].z;
-
-               normals[Triangles[i].vertex[1]].x+=facenormals[i].x;
-               normals[Triangles[i].vertex[1]].y+=facenormals[i].y;
-               normals[Triangles[i].vertex[1]].z+=facenormals[i].z;
-
-               normals[Triangles[i].vertex[2]].x+=facenormals[i].x;
-               normals[Triangles[i].vertex[2]].y+=facenormals[i].y;
-               normals[Triangles[i].vertex[2]].z+=facenormals[i].z;
-               if(facenormalise)Normalise(&facenormals[i]);
-       }
-       for(i=0; i<vertexNum; i++){
-               Normalise(&normals[i]);
-               normals[i]*=-1;
-       }
-       UpdateVertexArrayNoTex();
+    if (visibleloading)
+        Game::LoadingScreen();
+    static int i;
+    if (type != normaltype && type != decalstype)return;
+
+    for (i = 0; i < vertexNum; i++) {
+        normals[i].x = 0;
+        normals[i].y = 0;
+        normals[i].z = 0;
+    }
+
+    for (i = 0; i < TriangleNum; i++) {
+        CrossProduct(vertex[Triangles[i].vertex[1]] - vertex[Triangles[i].vertex[0]], vertex[Triangles[i].vertex[2]] - vertex[Triangles[i].vertex[0]], &facenormals[i]);
+
+        normals[Triangles[i].vertex[0]].x += facenormals[i].x;
+        normals[Triangles[i].vertex[0]].y += facenormals[i].y;
+        normals[Triangles[i].vertex[0]].z += facenormals[i].z;
+
+        normals[Triangles[i].vertex[1]].x += facenormals[i].x;
+        normals[Triangles[i].vertex[1]].y += facenormals[i].y;
+        normals[Triangles[i].vertex[1]].z += facenormals[i].z;
+
+        normals[Triangles[i].vertex[2]].x += facenormals[i].x;
+        normals[Triangles[i].vertex[2]].y += facenormals[i].y;
+        normals[Triangles[i].vertex[2]].z += facenormals[i].z;
+        if (facenormalise)Normalise(&facenormals[i]);
+    }
+    for (i = 0; i < vertexNum; i++) {
+        Normalise(&normals[i]);
+        normals[i] *= -1;
+    }
+    UpdateVertexArrayNoTex();
 }
 
 void Model::drawimmediate()
 {
-       textureptr.bind();
-       glBegin(GL_TRIANGLES);
-       for(int i=0;i<TriangleNum;i++){
-               /*if(Triangles[i].vertex[0]<vertexNum&&Triangles[i].vertex[1]<vertexNum&&Triangles[i].vertex[2]<vertexNum&&Triangles[i].vertex[0]>=0&&Triangles[i].vertex[1]>=0&&Triangles[i].vertex[2]>=0){
-               if(isnormal(vertex[Triangles[i].vertex[0]].x)&&isnormal(vertex[Triangles[i].vertex[0]].y)&&isnormal(vertex[Triangles[i].vertex[0]].z)
-               &&isnormal(vertex[Triangles[i].vertex[1]].x)&&isnormal(vertex[Triangles[i].vertex[1]].y)&&isnormal(vertex[Triangles[i].vertex[1]].z)
-               &&isnormal(vertex[Triangles[i].vertex[2]].x)&&isnormal(vertex[Triangles[i].vertex[2]].y)&&isnormal(vertex[Triangles[i].vertex[2]].z)){
-               */
-               glTexCoord2f(Triangles[i].gx[0],Triangles[i].gy[0]);
-               if(color)glColor3f(normals[Triangles[i].vertex[0]].x,normals[Triangles[i].vertex[0]].y,normals[Triangles[i].vertex[0]].z);
-               if(!color&&!flat)glNormal3f(normals[Triangles[i].vertex[0]].x,normals[Triangles[i].vertex[0]].y,normals[Triangles[i].vertex[0]].z);
-               if(!color&&flat)glNormal3f(facenormals[i].x,facenormals[i].y,facenormals[i].y);
-               glVertex3f(vertex[Triangles[i].vertex[0]].x,vertex[Triangles[i].vertex[0]].y,vertex[Triangles[i].vertex[0]].z);
-
-               glTexCoord2f(Triangles[i].gx[1],Triangles[i].gy[1]);
-               if(color)glColor3f(normals[Triangles[i].vertex[1]].x,normals[Triangles[i].vertex[1]].y,normals[Triangles[i].vertex[1]].z);
-               if(!color&&!flat)glNormal3f(normals[Triangles[i].vertex[1]].x,normals[Triangles[i].vertex[1]].y,normals[Triangles[i].vertex[1]].z);
-               if(!color&&flat)glNormal3f(facenormals[i].x,facenormals[i].y,facenormals[i].y);
-               glVertex3f(vertex[Triangles[i].vertex[1]].x,vertex[Triangles[i].vertex[1]].y,vertex[Triangles[i].vertex[1]].z);
-
-               glTexCoord2f(Triangles[i].gx[2],Triangles[i].gy[2]);
-               if(color)glColor3f(normals[Triangles[i].vertex[2]].x,normals[Triangles[i].vertex[2]].y,normals[Triangles[i].vertex[2]].z);
-               if(!color&&!flat)glNormal3f(normals[Triangles[i].vertex[2]].x,normals[Triangles[i].vertex[2]].y,normals[Triangles[i].vertex[2]].z);
-               if(!color&&flat)glNormal3f(facenormals[i].x,facenormals[i].y,facenormals[i].y);
-               glVertex3f(vertex[Triangles[i].vertex[2]].x,vertex[Triangles[i].vertex[2]].y,vertex[Triangles[i].vertex[2]].z);
-               //}
-               //}
-       }
-       glEnd();
+    textureptr.bind();
+    glBegin(GL_TRIANGLES);
+    for (int i = 0; i < TriangleNum; i++) {
+        /*if(Triangles[i].vertex[0]<vertexNum&&Triangles[i].vertex[1]<vertexNum&&Triangles[i].vertex[2]<vertexNum&&Triangles[i].vertex[0]>=0&&Triangles[i].vertex[1]>=0&&Triangles[i].vertex[2]>=0){
+        if(isnormal(vertex[Triangles[i].vertex[0]].x)&&isnormal(vertex[Triangles[i].vertex[0]].y)&&isnormal(vertex[Triangles[i].vertex[0]].z)
+        &&isnormal(vertex[Triangles[i].vertex[1]].x)&&isnormal(vertex[Triangles[i].vertex[1]].y)&&isnormal(vertex[Triangles[i].vertex[1]].z)
+        &&isnormal(vertex[Triangles[i].vertex[2]].x)&&isnormal(vertex[Triangles[i].vertex[2]].y)&&isnormal(vertex[Triangles[i].vertex[2]].z)){
+        */
+        glTexCoord2f(Triangles[i].gx[0], Triangles[i].gy[0]);
+        if (color)glColor3f(normals[Triangles[i].vertex[0]].x, normals[Triangles[i].vertex[0]].y, normals[Triangles[i].vertex[0]].z);
+        if (!color && !flat)glNormal3f(normals[Triangles[i].vertex[0]].x, normals[Triangles[i].vertex[0]].y, normals[Triangles[i].vertex[0]].z);
+        if (!color && flat)glNormal3f(facenormals[i].x, facenormals[i].y, facenormals[i].y);
+        glVertex3f(vertex[Triangles[i].vertex[0]].x, vertex[Triangles[i].vertex[0]].y, vertex[Triangles[i].vertex[0]].z);
+
+        glTexCoord2f(Triangles[i].gx[1], Triangles[i].gy[1]);
+        if (color)glColor3f(normals[Triangles[i].vertex[1]].x, normals[Triangles[i].vertex[1]].y, normals[Triangles[i].vertex[1]].z);
+        if (!color && !flat)glNormal3f(normals[Triangles[i].vertex[1]].x, normals[Triangles[i].vertex[1]].y, normals[Triangles[i].vertex[1]].z);
+        if (!color && flat)glNormal3f(facenormals[i].x, facenormals[i].y, facenormals[i].y);
+        glVertex3f(vertex[Triangles[i].vertex[1]].x, vertex[Triangles[i].vertex[1]].y, vertex[Triangles[i].vertex[1]].z);
+
+        glTexCoord2f(Triangles[i].gx[2], Triangles[i].gy[2]);
+        if (color)glColor3f(normals[Triangles[i].vertex[2]].x, normals[Triangles[i].vertex[2]].y, normals[Triangles[i].vertex[2]].z);
+        if (!color && !flat)glNormal3f(normals[Triangles[i].vertex[2]].x, normals[Triangles[i].vertex[2]].y, normals[Triangles[i].vertex[2]].z);
+        if (!color && flat)glNormal3f(facenormals[i].x, facenormals[i].y, facenormals[i].y);
+        glVertex3f(vertex[Triangles[i].vertex[2]].x, vertex[Triangles[i].vertex[2]].y, vertex[Triangles[i].vertex[2]].z);
+        //}
+        //}
+    }
+    glEnd();
 }
 
 void Model::draw()
 {
-       if(type!=normaltype&&type!=decalstype)return;
+    if (type != normaltype && type != decalstype)return;
 
-       glEnableClientState(GL_NORMAL_ARRAY);
-       glEnableClientState(GL_VERTEX_ARRAY);
-       glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+    glEnableClientState(GL_NORMAL_ARRAY);
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 
-       if(!color)glInterleavedArrays( GL_T2F_N3F_V3F,8*sizeof(GLfloat),&vArray[0]);
-       if(color)glInterleavedArrays( GL_T2F_C3F_V3F,8*sizeof(GLfloat),&vArray[0]);
-       textureptr.bind();
+    if (!color)glInterleavedArrays( GL_T2F_N3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
+    if (color)glInterleavedArrays( GL_T2F_C3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
+    textureptr.bind();
 
 #if PLATFORM_MACOSX
-       glLockArraysEXT( 0, TriangleNum*3);
+    glLockArraysEXT( 0, TriangleNum * 3);
 #endif
-       glDrawArrays(GL_TRIANGLES, 0, TriangleNum*3);
+    glDrawArrays(GL_TRIANGLES, 0, TriangleNum * 3);
 #if PLATFORM_MACOSX
-       glUnlockArraysEXT();
+    glUnlockArraysEXT();
 #endif
 
 
-       if(!color)glDisableClientState(GL_NORMAL_ARRAY);
-       if(color)glDisableClientState(GL_COLOR_ARRAY);
-       glDisableClientState(GL_VERTEX_ARRAY);
-       glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-       //drawimmediate();
+    if (!color)glDisableClientState(GL_NORMAL_ARRAY);
+    if (color)glDisableClientState(GL_COLOR_ARRAY);
+    glDisableClientState(GL_VERTEX_ARRAY);
+    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+    //drawimmediate();
 }
 
 //TODO: phase out in favor of Texture
 void Model::drawdifftex(GLuint texture)
 {
-       glEnableClientState(GL_NORMAL_ARRAY);
-       glEnableClientState(GL_VERTEX_ARRAY);
-       glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-       if(!color)glInterleavedArrays( GL_T2F_N3F_V3F,8*sizeof(GLfloat),&vArray[0]);
-       if(color)glInterleavedArrays( GL_T2F_C3F_V3F,8*sizeof(GLfloat),&vArray[0]);
+    glEnableClientState(GL_NORMAL_ARRAY);
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+    if (!color)glInterleavedArrays( GL_T2F_N3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
+    if (color)glInterleavedArrays( GL_T2F_C3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
 
-       glBindTexture(GL_TEXTURE_2D,(unsigned long)texture);
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+    glBindTexture(GL_TEXTURE_2D, (unsigned long)texture);
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
 
 
 #ifndef WIN32
-       glLockArraysEXT( 0, TriangleNum*3);
+    glLockArraysEXT( 0, TriangleNum * 3);
 #endif
-       glDrawArrays(GL_TRIANGLES, 0, TriangleNum*3);
+    glDrawArrays(GL_TRIANGLES, 0, TriangleNum * 3);
 #ifndef WIN32
-       glUnlockArraysEXT();
+    glUnlockArraysEXT();
 #endif
 
 
-       if(!color)glDisableClientState(GL_NORMAL_ARRAY);
-       if(color)glDisableClientState(GL_COLOR_ARRAY);
-       glDisableClientState(GL_VERTEX_ARRAY);
-       glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-       //drawdiffteximmediate(texture);
+    if (!color)glDisableClientState(GL_NORMAL_ARRAY);
+    if (color)glDisableClientState(GL_COLOR_ARRAY);
+    glDisableClientState(GL_VERTEX_ARRAY);
+    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+    //drawdiffteximmediate(texture);
 }
 
 void Model::drawdifftex(Texture texture)
 {
-       glEnableClientState(GL_NORMAL_ARRAY);
-       glEnableClientState(GL_VERTEX_ARRAY);
-       glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-       if(!color)glInterleavedArrays( GL_T2F_N3F_V3F,8*sizeof(GLfloat),&vArray[0]);
-       if(color)glInterleavedArrays( GL_T2F_C3F_V3F,8*sizeof(GLfloat),&vArray[0]);
+    glEnableClientState(GL_NORMAL_ARRAY);
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+    if (!color)glInterleavedArrays( GL_T2F_N3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
+    if (color)glInterleavedArrays( GL_T2F_C3F_V3F, 8 * sizeof(GLfloat), &vArray[0]);
 
-       texture.bind();
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+    texture.bind();
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
 
 
 #ifndef WIN32
-       glLockArraysEXT( 0, TriangleNum*3);
+    glLockArraysEXT( 0, TriangleNum * 3);
 #endif
-       glDrawArrays(GL_TRIANGLES, 0, TriangleNum*3);
+    glDrawArrays(GL_TRIANGLES, 0, TriangleNum * 3);
 #ifndef WIN32
-       glUnlockArraysEXT();
+    glUnlockArraysEXT();
 #endif
 
 
-       if(!color)glDisableClientState(GL_NORMAL_ARRAY);
-       if(color)glDisableClientState(GL_COLOR_ARRAY);
-       glDisableClientState(GL_VERTEX_ARRAY);
-       glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-       //drawdiffteximmediate(texture);
+    if (!color)glDisableClientState(GL_NORMAL_ARRAY);
+    if (color)glDisableClientState(GL_COLOR_ARRAY);
+    glDisableClientState(GL_VERTEX_ARRAY);
+    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+    //drawdiffteximmediate(texture);
 }
 
 void Model::drawdiffteximmediate(GLuint texture)
 {
-       glBindTexture(GL_TEXTURE_2D,(unsigned long)texture);
-
-       glBegin(GL_TRIANGLES);
-       for(int i=0;i<TriangleNum;i++){
-               /*if(Triangles[i].vertex[0]<vertexNum&&Triangles[i].vertex[1]<vertexNum&&Triangles[i].vertex[2]<vertexNum&&Triangles[i].vertex[0]>=0&&Triangles[i].vertex[1]>=0&&Triangles[i].vertex[2]>=0){
-               if(isnormal(vertex[Triangles[i].vertex[0]].x)&&isnormal(vertex[Triangles[i].vertex[0]].y)&&isnormal(vertex[Triangles[i].vertex[0]].z)
-               &&isnormal(vertex[Triangles[i].vertex[1]].x)&&isnormal(vertex[Triangles[i].vertex[1]].y)&&isnormal(vertex[Triangles[i].vertex[1]].z)
-               &&isnormal(vertex[Triangles[i].vertex[2]].x)&&isnormal(vertex[Triangles[i].vertex[2]].y)&&isnormal(vertex[Triangles[i].vertex[2]].z)){
-               */glTexCoord2f(Triangles[i].gx[0],Triangles[i].gy[0]);
-               if(color)glColor3f(normals[Triangles[i].vertex[0]].x,normals[Triangles[i].vertex[0]].y,normals[Triangles[i].vertex[0]].z);
-               if(!color&&!flat)glNormal3f(normals[Triangles[i].vertex[0]].x,normals[Triangles[i].vertex[0]].y,normals[Triangles[i].vertex[0]].z);
-               if(!color&&flat)glNormal3f(facenormals[i].x,facenormals[i].y,facenormals[i].y);
-               glVertex3f(vertex[Triangles[i].vertex[0]].x,vertex[Triangles[i].vertex[0]].y,vertex[Triangles[i].vertex[0]].z);
-
-               glTexCoord2f(Triangles[i].gx[1],Triangles[i].gy[1]);
-               if(color)glColor3f(normals[Triangles[i].vertex[1]].x,normals[Triangles[i].vertex[1]].y,normals[Triangles[i].vertex[1]].z);
-               if(!color&&!flat)glNormal3f(normals[Triangles[i].vertex[1]].x,normals[Triangles[i].vertex[1]].y,normals[Triangles[i].vertex[1]].z);
-               if(!color&&flat)glNormal3f(facenormals[i].x,facenormals[i].y,facenormals[i].y);
-               glVertex3f(vertex[Triangles[i].vertex[1]].x,vertex[Triangles[i].vertex[1]].y,vertex[Triangles[i].vertex[1]].z);
-
-               glTexCoord2f(Triangles[i].gx[2],Triangles[i].gy[2]);
-               if(color)glColor3f(normals[Triangles[i].vertex[2]].x,normals[Triangles[i].vertex[2]].y,normals[Triangles[i].vertex[2]].z);
-               if(!color&&!flat)glNormal3f(normals[Triangles[i].vertex[2]].x,normals[Triangles[i].vertex[2]].y,normals[Triangles[i].vertex[2]].z);
-               if(!color&&flat)glNormal3f(facenormals[i].x,facenormals[i].y,facenormals[i].y);
-               glVertex3f(vertex[Triangles[i].vertex[2]].x,vertex[Triangles[i].vertex[2]].y,vertex[Triangles[i].vertex[2]].z);
-               //}
-               //}
-       }
-       glEnd();
+    glBindTexture(GL_TEXTURE_2D, (unsigned long)texture);
+
+    glBegin(GL_TRIANGLES);
+    for (int i = 0; i < TriangleNum; i++) {
+        /*if(Triangles[i].vertex[0]<vertexNum&&Triangles[i].vertex[1]<vertexNum&&Triangles[i].vertex[2]<vertexNum&&Triangles[i].vertex[0]>=0&&Triangles[i].vertex[1]>=0&&Triangles[i].vertex[2]>=0){
+        if(isnormal(vertex[Triangles[i].vertex[0]].x)&&isnormal(vertex[Triangles[i].vertex[0]].y)&&isnormal(vertex[Triangles[i].vertex[0]].z)
+        &&isnormal(vertex[Triangles[i].vertex[1]].x)&&isnormal(vertex[Triangles[i].vertex[1]].y)&&isnormal(vertex[Triangles[i].vertex[1]].z)
+        &&isnormal(vertex[Triangles[i].vertex[2]].x)&&isnormal(vertex[Triangles[i].vertex[2]].y)&&isnormal(vertex[Triangles[i].vertex[2]].z)){
+        */glTexCoord2f(Triangles[i].gx[0], Triangles[i].gy[0]);
+        if (color)glColor3f(normals[Triangles[i].vertex[0]].x, normals[Triangles[i].vertex[0]].y, normals[Triangles[i].vertex[0]].z);
+        if (!color && !flat)glNormal3f(normals[Triangles[i].vertex[0]].x, normals[Triangles[i].vertex[0]].y, normals[Triangles[i].vertex[0]].z);
+        if (!color && flat)glNormal3f(facenormals[i].x, facenormals[i].y, facenormals[i].y);
+        glVertex3f(vertex[Triangles[i].vertex[0]].x, vertex[Triangles[i].vertex[0]].y, vertex[Triangles[i].vertex[0]].z);
+
+        glTexCoord2f(Triangles[i].gx[1], Triangles[i].gy[1]);
+        if (color)glColor3f(normals[Triangles[i].vertex[1]].x, normals[Triangles[i].vertex[1]].y, normals[Triangles[i].vertex[1]].z);
+        if (!color && !flat)glNormal3f(normals[Triangles[i].vertex[1]].x, normals[Triangles[i].vertex[1]].y, normals[Triangles[i].vertex[1]].z);
+        if (!color && flat)glNormal3f(facenormals[i].x, facenormals[i].y, facenormals[i].y);
+        glVertex3f(vertex[Triangles[i].vertex[1]].x, vertex[Triangles[i].vertex[1]].y, vertex[Triangles[i].vertex[1]].z);
+
+        glTexCoord2f(Triangles[i].gx[2], Triangles[i].gy[2]);
+        if (color)glColor3f(normals[Triangles[i].vertex[2]].x, normals[Triangles[i].vertex[2]].y, normals[Triangles[i].vertex[2]].z);
+        if (!color && !flat)glNormal3f(normals[Triangles[i].vertex[2]].x, normals[Triangles[i].vertex[2]].y, normals[Triangles[i].vertex[2]].z);
+        if (!color && flat)glNormal3f(facenormals[i].x, facenormals[i].y, facenormals[i].y);
+        glVertex3f(vertex[Triangles[i].vertex[2]].x, vertex[Triangles[i].vertex[2]].y, vertex[Triangles[i].vertex[2]].z);
+        //}
+        //}
+    }
+    glEnd();
 }
 
-void Model::drawdecals(Texture shadowtexture,Texture bloodtexture,Texture bloodtexture2,Texture breaktexture)
+void Model::drawdecals(Texture shadowtexture, Texture bloodtexture, Texture bloodtexture2, Texture breaktexture)
 {
-       if(decals){
-               if(type!=decalstype)return;
-               static int i,j;
-               static float distancemult;
-               static int lasttype;
-               static float viewdistsquared;
-               static bool blend;
-
-               viewdistsquared=viewdistance*viewdistance;
-               blend=1;
-
-               lasttype=-1;
-               glEnable(GL_BLEND);
-               glDisable(GL_LIGHTING);
-               glDisable(GL_CULL_FACE);
-               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-               glDepthMask(0);
-               if(numdecals>max_model_decals)numdecals=max_model_decals;
-               for(i=0;i<numdecals;i++){
-                       if(decaltype[i]==blooddecalfast&&decalalivetime[i]<2)decalalivetime[i]=2;
-
-                       if(decaltype[i]==shadowdecal&&decaltype[i]!=lasttype){
-                               shadowtexture.bind();
-                               if(!blend){
-                                       blend=1;
-                                       glAlphaFunc(GL_GREATER, 0.0001);
-                                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                               }
-                       }
-                       if(decaltype[i]==breakdecal&&decaltype[i]!=lasttype){
-                               breaktexture.bind();
-                               if(!blend){
-                                       blend=1;
-                                       glAlphaFunc(GL_GREATER, 0.0001);
-                                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                               }
-                       }
-                       if((decaltype[i]==blooddecal||decaltype[i]==blooddecalslow)&&decaltype[i]!=lasttype){
-                               bloodtexture.bind();
-                               if(blend){
-                                       blend=0;
-                                       glAlphaFunc(GL_GREATER, 0.15);
-                                       glBlendFunc(GL_ONE,GL_ZERO);
-                               }
-                       }
-                       if((decaltype[i]==blooddecalfast)&&decaltype[i]!=lasttype){
-                               bloodtexture2.bind();
-                               if(blend){
-                                       blend=0;
-                                       glAlphaFunc(GL_GREATER, 0.15);
-                                       glBlendFunc(GL_ONE,GL_ZERO);
-                               }
-                       }
-                       if(decaltype[i]==shadowdecal){
-                               glColor4f(1,1,1,decalopacity[i]);
-                       }
-                       if(decaltype[i]==breakdecal){
-                               glColor4f(1,1,1,decalopacity[i]);
-                               if(decalalivetime[i]>58)glColor4f(1,1,1,decalopacity[i]*(60-decalalivetime[i])/2);
-                       }
-                       if((decaltype[i]==blooddecal||decaltype[i]==blooddecalfast||decaltype[i]==blooddecalslow)){
-                               glColor4f(1,1,1,decalopacity[i]);
-                               if(decalalivetime[i]<4)glColor4f(1,1,1,decalopacity[i]*decalalivetime[i]*.25);
-                               if(decalalivetime[i]>58)glColor4f(1,1,1,decalopacity[i]*(60-decalalivetime[i])/2);
-                       }
-                       lasttype=decaltype[i];
-                       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-                       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
-
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPushMatrix();
-                               glBegin(GL_TRIANGLES);
-                               for(int j=0;j<3;j++)
-                               {
-                                       glTexCoord2f(decaltexcoords[i][j][0], decaltexcoords[i][j][1]); glVertex3f(decalvertex[i][j].x,decalvertex[i][j].y,decalvertex[i][j].z);
-                               }
-                       glEnd();
-                       glPopMatrix();
-               }
-               for(i=numdecals-1;i>=0;i--){
-                       decalalivetime[i]+=multiplier;
-                       if(decaltype[i]==blooddecalslow)decalalivetime[i]-=multiplier*2/3;
-                       if(decaltype[i]==blooddecalfast)decalalivetime[i]+=multiplier*4;
-                       if(decaltype[i]==shadowdecal)DeleteDecal(i);
-                       if((decaltype[i]==blooddecal||decaltype[i]==blooddecalfast||decaltype[i]==blooddecalslow)&&decalalivetime[i]>=60)DeleteDecal(i);
-               }
-               glAlphaFunc(GL_GREATER, 0.0001);
-               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-       }
+    if (decals) {
+        if (type != decalstype)return;
+        static int i, j;
+        static float distancemult;
+        static int lasttype;
+        static float viewdistsquared;
+        static bool blend;
+
+        viewdistsquared = viewdistance * viewdistance;
+        blend = 1;
+
+        lasttype = -1;
+        glEnable(GL_BLEND);
+        glDisable(GL_LIGHTING);
+        glDisable(GL_CULL_FACE);
+        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+        glDepthMask(0);
+        if (numdecals > max_model_decals)numdecals = max_model_decals;
+        for (i = 0; i < numdecals; i++) {
+            if (decaltype[i] == blooddecalfast && decalalivetime[i] < 2)decalalivetime[i] = 2;
+
+            if (decaltype[i] == shadowdecal && decaltype[i] != lasttype) {
+                shadowtexture.bind();
+                if (!blend) {
+                    blend = 1;
+                    glAlphaFunc(GL_GREATER, 0.0001);
+                    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                }
+            }
+            if (decaltype[i] == breakdecal && decaltype[i] != lasttype) {
+                breaktexture.bind();
+                if (!blend) {
+                    blend = 1;
+                    glAlphaFunc(GL_GREATER, 0.0001);
+                    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                }
+            }
+            if ((decaltype[i] == blooddecal || decaltype[i] == blooddecalslow) && decaltype[i] != lasttype) {
+                bloodtexture.bind();
+                if (blend) {
+                    blend = 0;
+                    glAlphaFunc(GL_GREATER, 0.15);
+                    glBlendFunc(GL_ONE, GL_ZERO);
+                }
+            }
+            if ((decaltype[i] == blooddecalfast) && decaltype[i] != lasttype) {
+                bloodtexture2.bind();
+                if (blend) {
+                    blend = 0;
+                    glAlphaFunc(GL_GREATER, 0.15);
+                    glBlendFunc(GL_ONE, GL_ZERO);
+                }
+            }
+            if (decaltype[i] == shadowdecal) {
+                glColor4f(1, 1, 1, decalopacity[i]);
+            }
+            if (decaltype[i] == breakdecal) {
+                glColor4f(1, 1, 1, decalopacity[i]);
+                if (decalalivetime[i] > 58)glColor4f(1, 1, 1, decalopacity[i] * (60 - decalalivetime[i]) / 2);
+            }
+            if ((decaltype[i] == blooddecal || decaltype[i] == blooddecalfast || decaltype[i] == blooddecalslow)) {
+                glColor4f(1, 1, 1, decalopacity[i]);
+                if (decalalivetime[i] < 4)glColor4f(1, 1, 1, decalopacity[i]*decalalivetime[i]*.25);
+                if (decalalivetime[i] > 58)glColor4f(1, 1, 1, decalopacity[i] * (60 - decalalivetime[i]) / 2);
+            }
+            lasttype = decaltype[i];
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPushMatrix();
+            glBegin(GL_TRIANGLES);
+            for (int j = 0; j < 3; j++) {
+                glTexCoord2f(decaltexcoords[i][j][0], decaltexcoords[i][j][1]);
+                glVertex3f(decalvertex[i][j].x, decalvertex[i][j].y, decalvertex[i][j].z);
+            }
+            glEnd();
+            glPopMatrix();
+        }
+        for (i = numdecals - 1; i >= 0; i--) {
+            decalalivetime[i] += multiplier;
+            if (decaltype[i] == blooddecalslow)decalalivetime[i] -= multiplier * 2 / 3;
+            if (decaltype[i] == blooddecalfast)decalalivetime[i] += multiplier * 4;
+            if (decaltype[i] == shadowdecal)DeleteDecal(i);
+            if ((decaltype[i] == blooddecal || decaltype[i] == blooddecalfast || decaltype[i] == blooddecalslow) && decalalivetime[i] >= 60)DeleteDecal(i);
+        }
+        glAlphaFunc(GL_GREATER, 0.0001);
+        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+    }
 }
 
 void Model::DeleteDecal(int which)
 {
-       if(decals){
-               if(type!=decalstype)return;
-               decaltype[which]=decaltype[numdecals-1];
-               decalposition[which]=decalposition[numdecals-1];
-               for(int i=0;i<3;i++){
-                       decalvertex[which][i]=decalvertex[numdecals-1][i];
-                       decaltexcoords[which][i][0]=decaltexcoords[numdecals-1][i][0];
-                       decaltexcoords[which][i][1]=decaltexcoords[numdecals-1][i][1];
-               }
-               decalrotation[which]=decalrotation[numdecals-1];
-               decalalivetime[which]=decalalivetime[numdecals-1];
-               decalopacity[which]=decalopacity[numdecals-1];
-               numdecals--;
-       }
+    if (decals) {
+        if (type != decalstype)return;
+        decaltype[which] = decaltype[numdecals - 1];
+        decalposition[which] = decalposition[numdecals - 1];
+        for (int i = 0; i < 3; i++) {
+            decalvertex[which][i] = decalvertex[numdecals - 1][i];
+            decaltexcoords[which][i][0] = decaltexcoords[numdecals - 1][i][0];
+            decaltexcoords[which][i][1] = decaltexcoords[numdecals - 1][i][1];
+        }
+        decalrotation[which] = decalrotation[numdecals - 1];
+        decalalivetime[which] = decalalivetime[numdecals - 1];
+        decalopacity[which] = decalopacity[numdecals - 1];
+        numdecals--;
+    }
 }
 
-void Model::MakeDecal(int atype, XYZ *where,float *size, float *opacity, float *rotation){
-       if(decals){
-               if(type!=decalstype)return;
-
-               static float placex,placez;
-               static XYZ rot;
-               //static XYZ point,point1,point2;
-               static float distance;
-               static int i,j;
-
-               if(*opacity>0)
-                       if(distsq(where,&boundingspherecenter)<(boundingsphereradius+*size)*(boundingsphereradius+*size))
-                               for(i=0;i<TriangleNum;i++){
-                                       if(facenormals[i].y<-.1&&(vertex[Triangles[i].vertex[0]].y<where->y||vertex[Triangles[i].vertex[1]].y<where->y||vertex[Triangles[i].vertex[2]].y<where->y)){
-                                               decalposition[numdecals]=*where;
-                                               decaltype[numdecals]=atype;
-                                               decalrotation[numdecals]=*rotation;
-                                               decalalivetime[numdecals]=0;
-                                               distance=abs(((facenormals[i].x*where->x)+(facenormals[i].y*where->y)+(facenormals[i].z*where->z)-((facenormals[i].x*vertex[Triangles[i].vertex[0]].x)+(facenormals[i].y*vertex[Triangles[i].vertex[0]].y)+(facenormals[i].z*vertex[Triangles[i].vertex[0]].z)))/facenormals[i].y);
-                                               decalopacity[numdecals]=*opacity-distance/10;
-
-                                               if(decalopacity[numdecals>0]){
-                                                       placex=vertex[Triangles[i].vertex[0]].x;
-                                                       placez=vertex[Triangles[i].vertex[0]].z;
-
-                                                       decaltexcoords[numdecals][0][0]=(placex-where->x)/(*size)/2+.5;
-                                                       decaltexcoords[numdecals][0][1]=(placez-where->z)/(*size)/2+.5;
-
-                                                       decalvertex[numdecals][0].x=placex;
-                                                       decalvertex[numdecals][0].z=placez;
-                                                       decalvertex[numdecals][0].y=vertex[Triangles[i].vertex[0]].y;
-
-
-                                                       placex=vertex[Triangles[i].vertex[1]].x;
-                                                       placez=vertex[Triangles[i].vertex[1]].z;
-
-                                                       decaltexcoords[numdecals][1][0]=(placex-where->x)/(*size)/2+.5;
-                                                       decaltexcoords[numdecals][1][1]=(placez-where->z)/(*size)/2+.5;
-
-                                                       decalvertex[numdecals][1].x=placex;
-                                                       decalvertex[numdecals][1].z=placez;
-                                                       decalvertex[numdecals][1].y=vertex[Triangles[i].vertex[1]].y;
-
-
-                                                       placex=vertex[Triangles[i].vertex[2]].x;
-                                                       placez=vertex[Triangles[i].vertex[2]].z;
-
-                                                       decaltexcoords[numdecals][2][0]=(placex-where->x)/(*size)/2+.5;
-                                                       decaltexcoords[numdecals][2][1]=(placez-where->z)/(*size)/2+.5;
-
-                                                       decalvertex[numdecals][2].x=placex;
-                                                       decalvertex[numdecals][2].z=placez;
-                                                       decalvertex[numdecals][2].y=vertex[Triangles[i].vertex[2]].y;
-
-                                                       if(!(decaltexcoords[numdecals][0][0]<0&&decaltexcoords[numdecals][1][0]<0&&decaltexcoords[numdecals][2][0]<0))
-                                                               if(!(decaltexcoords[numdecals][0][1]<0&&decaltexcoords[numdecals][1][1]<0&&decaltexcoords[numdecals][2][1]<0))
-                                                                       if(!(decaltexcoords[numdecals][0][0]>1&&decaltexcoords[numdecals][1][0]>1&&decaltexcoords[numdecals][2][0]>1))
-                                                                               if(!(decaltexcoords[numdecals][0][1]>1&&decaltexcoords[numdecals][1][1]>1&&decaltexcoords[numdecals][2][1]>1))
-                                                                               {
-                                                                                       if(decalrotation[numdecals]){
-                                                                                               for(j=0;j<3;j++){                       
-                                                                                                       rot.y=0;
-                                                                                                       rot.x=decaltexcoords[numdecals][j][0]-.5;
-                                                                                                       rot.z=decaltexcoords[numdecals][j][1]-.5;
-                                                                                                       rot=DoRotation(rot,0,-decalrotation[numdecals],0);
-                                                                                                       decaltexcoords[numdecals][j][0]=rot.x+.5;
-                                                                                                       decaltexcoords[numdecals][j][1]=rot.z+.5;
-                                                                                               }
-                                                                                       }
-                                                                                       if(numdecals<max_model_decals-1)numdecals++;
-                                                                               }
-                                               }
-                                       }
-                               }
-       }
+void Model::MakeDecal(int atype, XYZ *where, float *size, float *opacity, float *rotation)
+{
+    if (decals) {
+        if (type != decalstype)return;
+
+        static float placex, placez;
+        static XYZ rot;
+        //static XYZ point,point1,point2;
+        static float distance;
+        static int i, j;
+
+        if (*opacity > 0)
+            if (distsq(where, &boundingspherecenter) < (boundingsphereradius + *size) * (boundingsphereradius + *size))
+                for (i = 0; i < TriangleNum; i++) {
+                    if (facenormals[i].y < -.1 && (vertex[Triangles[i].vertex[0]].y < where->y || vertex[Triangles[i].vertex[1]].y < where->y || vertex[Triangles[i].vertex[2]].y < where->y)) {
+                        decalposition[numdecals] = *where;
+                        decaltype[numdecals] = atype;
+                        decalrotation[numdecals] = *rotation;
+                        decalalivetime[numdecals] = 0;
+                        distance = abs(((facenormals[i].x * where->x) + (facenormals[i].y * where->y) + (facenormals[i].z * where->z) - ((facenormals[i].x * vertex[Triangles[i].vertex[0]].x) + (facenormals[i].y * vertex[Triangles[i].vertex[0]].y) + (facenormals[i].z * vertex[Triangles[i].vertex[0]].z))) / facenormals[i].y);
+                        decalopacity[numdecals] = *opacity - distance / 10;
+
+                        if (decalopacity[numdecals > 0]) {
+                            placex = vertex[Triangles[i].vertex[0]].x;
+                            placez = vertex[Triangles[i].vertex[0]].z;
+
+                            decaltexcoords[numdecals][0][0] = (placex - where->x) / (*size) / 2 + .5;
+                            decaltexcoords[numdecals][0][1] = (placez - where->z) / (*size) / 2 + .5;
+
+                            decalvertex[numdecals][0].x = placex;
+                            decalvertex[numdecals][0].z = placez;
+                            decalvertex[numdecals][0].y = vertex[Triangles[i].vertex[0]].y;
+
+
+                            placex = vertex[Triangles[i].vertex[1]].x;
+                            placez = vertex[Triangles[i].vertex[1]].z;
+
+                            decaltexcoords[numdecals][1][0] = (placex - where->x) / (*size) / 2 + .5;
+                            decaltexcoords[numdecals][1][1] = (placez - where->z) / (*size) / 2 + .5;
+
+                            decalvertex[numdecals][1].x = placex;
+                            decalvertex[numdecals][1].z = placez;
+                            decalvertex[numdecals][1].y = vertex[Triangles[i].vertex[1]].y;
+
+
+                            placex = vertex[Triangles[i].vertex[2]].x;
+                            placez = vertex[Triangles[i].vertex[2]].z;
+
+                            decaltexcoords[numdecals][2][0] = (placex - where->x) / (*size) / 2 + .5;
+                            decaltexcoords[numdecals][2][1] = (placez - where->z) / (*size) / 2 + .5;
+
+                            decalvertex[numdecals][2].x = placex;
+                            decalvertex[numdecals][2].z = placez;
+                            decalvertex[numdecals][2].y = vertex[Triangles[i].vertex[2]].y;
+
+                            if (!(decaltexcoords[numdecals][0][0] < 0 && decaltexcoords[numdecals][1][0] < 0 && decaltexcoords[numdecals][2][0] < 0))
+                                if (!(decaltexcoords[numdecals][0][1] < 0 && decaltexcoords[numdecals][1][1] < 0 && decaltexcoords[numdecals][2][1] < 0))
+                                    if (!(decaltexcoords[numdecals][0][0] > 1 && decaltexcoords[numdecals][1][0] > 1 && decaltexcoords[numdecals][2][0] > 1))
+                                        if (!(decaltexcoords[numdecals][0][1] > 1 && decaltexcoords[numdecals][1][1] > 1 && decaltexcoords[numdecals][2][1] > 1)) {
+                                            if (decalrotation[numdecals]) {
+                                                for (j = 0; j < 3; j++) {
+                                                    rot.y = 0;
+                                                    rot.x = decaltexcoords[numdecals][j][0] - .5;
+                                                    rot.z = decaltexcoords[numdecals][j][1] - .5;
+                                                    rot = DoRotation(rot, 0, -decalrotation[numdecals], 0);
+                                                    decaltexcoords[numdecals][j][0] = rot.x + .5;
+                                                    decaltexcoords[numdecals][j][1] = rot.z + .5;
+                                                }
+                                            }
+                                            if (numdecals < max_model_decals - 1)numdecals++;
+                                        }
+                        }
+                    }
+                }
+    }
 }
 
-void Model::MakeDecal(int atype, XYZ where,float size, float opacity, float rotation){
-       if(decals){
-               if(type!=decalstype)return;
-
-               static float placex,placez;
-               static XYZ rot;
-               //static XYZ point,point1,point2;
-               static float distance;
-               static int i,j;
-
-               if(opacity>0)
-                       if(distsq(&where,&boundingspherecenter)<(boundingsphereradius+size)*(boundingsphereradius+size))
-                               for(i=0;i<TriangleNum;i++){
-                                       distance=abs(((facenormals[i].x*where.x)+(facenormals[i].y*where.y)+(facenormals[i].z*where.z)-((facenormals[i].x*vertex[Triangles[i].vertex[0]].x)+(facenormals[i].y*vertex[Triangles[i].vertex[0]].y)+(facenormals[i].z*vertex[Triangles[i].vertex[0]].z))));
-                                       if(distance<.02&&abs(facenormals[i].y)>abs(facenormals[i].x)&&abs(facenormals[i].y)>abs(facenormals[i].z)){
-                                               decalposition[numdecals]=where;
-                                               decaltype[numdecals]=atype;
-                                               decalrotation[numdecals]=rotation;
-                                               decalalivetime[numdecals]=0;
-                                               decalopacity[numdecals]=opacity-distance/10;
-
-                                               if(decalopacity[numdecals>0]){
-                                                       placex=vertex[Triangles[i].vertex[0]].x;
-                                                       placez=vertex[Triangles[i].vertex[0]].z;
-
-                                                       decaltexcoords[numdecals][0][0]=(placex-where.x)/(size)/2+.5;
-                                                       decaltexcoords[numdecals][0][1]=(placez-where.z)/(size)/2+.5;
-
-                                                       decalvertex[numdecals][0].x=placex;
-                                                       decalvertex[numdecals][0].z=placez;
-                                                       decalvertex[numdecals][0].y=vertex[Triangles[i].vertex[0]].y;
-
-
-                                                       placex=vertex[Triangles[i].vertex[1]].x;
-                                                       placez=vertex[Triangles[i].vertex[1]].z;
-
-                                                       decaltexcoords[numdecals][1][0]=(placex-where.x)/(size)/2+.5;
-                                                       decaltexcoords[numdecals][1][1]=(placez-where.z)/(size)/2+.5;
-
-                                                       decalvertex[numdecals][1].x=placex;
-                                                       decalvertex[numdecals][1].z=placez;
-                                                       decalvertex[numdecals][1].y=vertex[Triangles[i].vertex[1]].y;
-
-
-                                                       placex=vertex[Triangles[i].vertex[2]].x;
-                                                       placez=vertex[Triangles[i].vertex[2]].z;
-
-                                                       decaltexcoords[numdecals][2][0]=(placex-where.x)/(size)/2+.5;
-                                                       decaltexcoords[numdecals][2][1]=(placez-where.z)/(size)/2+.5;
-
-                                                       decalvertex[numdecals][2].x=placex;
-                                                       decalvertex[numdecals][2].z=placez;
-                                                       decalvertex[numdecals][2].y=vertex[Triangles[i].vertex[2]].y;
-
-                                                       if(!(decaltexcoords[numdecals][0][0]<0&&decaltexcoords[numdecals][1][0]<0&&decaltexcoords[numdecals][2][0]<0))
-                                                               if(!(decaltexcoords[numdecals][0][1]<0&&decaltexcoords[numdecals][1][1]<0&&decaltexcoords[numdecals][2][1]<0))
-                                                                       if(!(decaltexcoords[numdecals][0][0]>1&&decaltexcoords[numdecals][1][0]>1&&decaltexcoords[numdecals][2][0]>1))
-                                                                               if(!(decaltexcoords[numdecals][0][1]>1&&decaltexcoords[numdecals][1][1]>1&&decaltexcoords[numdecals][2][1]>1))
-                                                                               {
-                                                                                       if(decalrotation[numdecals]){
-                                                                                               for(j=0;j<3;j++){                       
-                                                                                                       rot.y=0;
-                                                                                                       rot.x=decaltexcoords[numdecals][j][0]-.5;
-                                                                                                       rot.z=decaltexcoords[numdecals][j][1]-.5;
-                                                                                                       rot=DoRotation(rot,0,-decalrotation[numdecals],0);
-                                                                                                       decaltexcoords[numdecals][j][0]=rot.x+.5;
-                                                                                                       decaltexcoords[numdecals][j][1]=rot.z+.5;
-                                                                                               }
-                                                                                       }
-                                                                                       if(numdecals<max_model_decals-1)numdecals++;
-                                                                               }
-                                               }
-                                       }
-                                       else if(distance<.02&&abs(facenormals[i].x)>abs(facenormals[i].y)&&abs(facenormals[i].x)>abs(facenormals[i].z)){
-                                               decalposition[numdecals]=where;
-                                               decaltype[numdecals]=atype;
-                                               decalrotation[numdecals]=rotation;
-                                               decalalivetime[numdecals]=0;
-                                               decalopacity[numdecals]=opacity-distance/10;
-
-                                               if(decalopacity[numdecals>0]){
-                                                       placex=vertex[Triangles[i].vertex[0]].y;
-                                                       placez=vertex[Triangles[i].vertex[0]].z;
-
-                                                       decaltexcoords[numdecals][0][0]=(placex-where.y)/(size)/2+.5;
-                                                       decaltexcoords[numdecals][0][1]=(placez-where.z)/(size)/2+.5;
-
-                                                       decalvertex[numdecals][0].x=vertex[Triangles[i].vertex[0]].x;
-                                                       decalvertex[numdecals][0].z=placez;
-                                                       decalvertex[numdecals][0].y=placex;
-
-
-                                                       placex=vertex[Triangles[i].vertex[1]].y;
-                                                       placez=vertex[Triangles[i].vertex[1]].z;
-
-                                                       decaltexcoords[numdecals][1][0]=(placex-where.y)/(size)/2+.5;
-                                                       decaltexcoords[numdecals][1][1]=(placez-where.z)/(size)/2+.5;
-
-                                                       decalvertex[numdecals][1].x=vertex[Triangles[i].vertex[1]].x;
-                                                       decalvertex[numdecals][1].z=placez;
-                                                       decalvertex[numdecals][1].y=placex;
-
-
-                                                       placex=vertex[Triangles[i].vertex[2]].y;
-                                                       placez=vertex[Triangles[i].vertex[2]].z;
-
-                                                       decaltexcoords[numdecals][2][0]=(placex-where.y)/(size)/2+.5;
-                                                       decaltexcoords[numdecals][2][1]=(placez-where.z)/(size)/2+.5;
-
-                                                       decalvertex[numdecals][2].x=vertex[Triangles[i].vertex[2]].x;
-                                                       decalvertex[numdecals][2].z=placez;
-                                                       decalvertex[numdecals][2].y=placex;
-
-                                                       if(!(decaltexcoords[numdecals][0][0]<0&&decaltexcoords[numdecals][1][0]<0&&decaltexcoords[numdecals][2][0]<0))
-                                                               if(!(decaltexcoords[numdecals][0][1]<0&&decaltexcoords[numdecals][1][1]<0&&decaltexcoords[numdecals][2][1]<0))
-                                                                       if(!(decaltexcoords[numdecals][0][0]>1&&decaltexcoords[numdecals][1][0]>1&&decaltexcoords[numdecals][2][0]>1))
-                                                                               if(!(decaltexcoords[numdecals][0][1]>1&&decaltexcoords[numdecals][1][1]>1&&decaltexcoords[numdecals][2][1]>1))
-                                                                               {
-                                                                                       if(decalrotation[numdecals]){
-                                                                                               for(j=0;j<3;j++){                       
-                                                                                                       rot.y=0;
-                                                                                                       rot.x=decaltexcoords[numdecals][j][0]-.5;
-                                                                                                       rot.z=decaltexcoords[numdecals][j][1]-.5;
-                                                                                                       rot=DoRotation(rot,0,-decalrotation[numdecals],0);
-                                                                                                       decaltexcoords[numdecals][j][0]=rot.x+.5;
-                                                                                                       decaltexcoords[numdecals][j][1]=rot.z+.5;
-                                                                                               }
-                                                                                       }
-                                                                                       if(numdecals<max_model_decals-1)numdecals++;
-                                                                               }
-                                               }
-                                       }
-                                       else if(distance<.02&&abs(facenormals[i].z)>abs(facenormals[i].y)&&abs(facenormals[i].z)>abs(facenormals[i].x)){
-                                               decalposition[numdecals]=where;
-                                               decaltype[numdecals]=atype;
-                                               decalrotation[numdecals]=rotation;
-                                               decalalivetime[numdecals]=0;
-                                               decalopacity[numdecals]=opacity-distance/10;
-
-                                               if(decalopacity[numdecals>0]){
-                                                       placex=vertex[Triangles[i].vertex[0]].x;
-                                                       placez=vertex[Triangles[i].vertex[0]].y;
-
-                                                       decaltexcoords[numdecals][0][0]=(placex-where.x)/(size)/2+.5;
-                                                       decaltexcoords[numdecals][0][1]=(placez-where.y)/(size)/2+.5;
-
-                                                       decalvertex[numdecals][0].x=placex;
-                                                       decalvertex[numdecals][0].z=vertex[Triangles[i].vertex[0]].z;
-                                                       decalvertex[numdecals][0].y=placez;
-
-
-                                                       placex=vertex[Triangles[i].vertex[1]].x;
-                                                       placez=vertex[Triangles[i].vertex[1]].y;
-
-                                                       decaltexcoords[numdecals][1][0]=(placex-where.x)/(size)/2+.5;
-                                                       decaltexcoords[numdecals][1][1]=(placez-where.y)/(size)/2+.5;
-
-                                                       decalvertex[numdecals][1].x=placex;
-                                                       decalvertex[numdecals][1].z=vertex[Triangles[i].vertex[1]].z;
-                                                       decalvertex[numdecals][1].y=placez;
-
-
-                                                       placex=vertex[Triangles[i].vertex[2]].x;
-                                                       placez=vertex[Triangles[i].vertex[2]].y;
-
-                                                       decaltexcoords[numdecals][2][0]=(placex-where.x)/(size)/2+.5;
-                                                       decaltexcoords[numdecals][2][1]=(placez-where.y)/(size)/2+.5;
-
-                                                       decalvertex[numdecals][2].x=placex;
-                                                       decalvertex[numdecals][2].z=vertex[Triangles[i].vertex[2]].z;
-                                                       decalvertex[numdecals][2].y=placez;
-
-                                                       if(!(decaltexcoords[numdecals][0][0]<0&&decaltexcoords[numdecals][1][0]<0&&decaltexcoords[numdecals][2][0]<0))
-                                                               if(!(decaltexcoords[numdecals][0][1]<0&&decaltexcoords[numdecals][1][1]<0&&decaltexcoords[numdecals][2][1]<0))
-                                                                       if(!(decaltexcoords[numdecals][0][0]>1&&decaltexcoords[numdecals][1][0]>1&&decaltexcoords[numdecals][2][0]>1))
-                                                                               if(!(decaltexcoords[numdecals][0][1]>1&&decaltexcoords[numdecals][1][1]>1&&decaltexcoords[numdecals][2][1]>1))
-                                                                               {
-                                                                                       if(decalrotation[numdecals]){
-                                                                                               for(j=0;j<3;j++){                       
-                                                                                                       rot.y=0;
-                                                                                                       rot.x=decaltexcoords[numdecals][j][0]-.5;
-                                                                                                       rot.z=decaltexcoords[numdecals][j][1]-.5;
-                                                                                                       rot=DoRotation(rot,0,-decalrotation[numdecals],0);
-                                                                                                       decaltexcoords[numdecals][j][0]=rot.x+.5;
-                                                                                                       decaltexcoords[numdecals][j][1]=rot.z+.5;
-                                                                                               }
-                                                                                       }
-                                                                                       if(numdecals<max_model_decals-1)numdecals++;
-                                                                               }
-                                               }
-                                       }
-                               }
-       }
+void Model::MakeDecal(int atype, XYZ where, float size, float opacity, float rotation)
+{
+    if (decals) {
+        if (type != decalstype)return;
+
+        static float placex, placez;
+        static XYZ rot;
+        //static XYZ point,point1,point2;
+        static float distance;
+        static int i, j;
+
+        if (opacity > 0)
+            if (distsq(&where, &boundingspherecenter) < (boundingsphereradius + size) * (boundingsphereradius + size))
+                for (i = 0; i < TriangleNum; i++) {
+                    distance = abs(((facenormals[i].x * where.x) + (facenormals[i].y * where.y) + (facenormals[i].z * where.z) - ((facenormals[i].x * vertex[Triangles[i].vertex[0]].x) + (facenormals[i].y * vertex[Triangles[i].vertex[0]].y) + (facenormals[i].z * vertex[Triangles[i].vertex[0]].z))));
+                    if (distance < .02 && abs(facenormals[i].y) > abs(facenormals[i].x) && abs(facenormals[i].y) > abs(facenormals[i].z)) {
+                        decalposition[numdecals] = where;
+                        decaltype[numdecals] = atype;
+                        decalrotation[numdecals] = rotation;
+                        decalalivetime[numdecals] = 0;
+                        decalopacity[numdecals] = opacity - distance / 10;
+
+                        if (decalopacity[numdecals > 0]) {
+                            placex = vertex[Triangles[i].vertex[0]].x;
+                            placez = vertex[Triangles[i].vertex[0]].z;
+
+                            decaltexcoords[numdecals][0][0] = (placex - where.x) / (size) / 2 + .5;
+                            decaltexcoords[numdecals][0][1] = (placez - where.z) / (size) / 2 + .5;
+
+                            decalvertex[numdecals][0].x = placex;
+                            decalvertex[numdecals][0].z = placez;
+                            decalvertex[numdecals][0].y = vertex[Triangles[i].vertex[0]].y;
+
+
+                            placex = vertex[Triangles[i].vertex[1]].x;
+                            placez = vertex[Triangles[i].vertex[1]].z;
+
+                            decaltexcoords[numdecals][1][0] = (placex - where.x) / (size) / 2 + .5;
+                            decaltexcoords[numdecals][1][1] = (placez - where.z) / (size) / 2 + .5;
+
+                            decalvertex[numdecals][1].x = placex;
+                            decalvertex[numdecals][1].z = placez;
+                            decalvertex[numdecals][1].y = vertex[Triangles[i].vertex[1]].y;
+
+
+                            placex = vertex[Triangles[i].vertex[2]].x;
+                            placez = vertex[Triangles[i].vertex[2]].z;
+
+                            decaltexcoords[numdecals][2][0] = (placex - where.x) / (size) / 2 + .5;
+                            decaltexcoords[numdecals][2][1] = (placez - where.z) / (size) / 2 + .5;
+
+                            decalvertex[numdecals][2].x = placex;
+                            decalvertex[numdecals][2].z = placez;
+                            decalvertex[numdecals][2].y = vertex[Triangles[i].vertex[2]].y;
+
+                            if (!(decaltexcoords[numdecals][0][0] < 0 && decaltexcoords[numdecals][1][0] < 0 && decaltexcoords[numdecals][2][0] < 0))
+                                if (!(decaltexcoords[numdecals][0][1] < 0 && decaltexcoords[numdecals][1][1] < 0 && decaltexcoords[numdecals][2][1] < 0))
+                                    if (!(decaltexcoords[numdecals][0][0] > 1 && decaltexcoords[numdecals][1][0] > 1 && decaltexcoords[numdecals][2][0] > 1))
+                                        if (!(decaltexcoords[numdecals][0][1] > 1 && decaltexcoords[numdecals][1][1] > 1 && decaltexcoords[numdecals][2][1] > 1)) {
+                                            if (decalrotation[numdecals]) {
+                                                for (j = 0; j < 3; j++) {
+                                                    rot.y = 0;
+                                                    rot.x = decaltexcoords[numdecals][j][0] - .5;
+                                                    rot.z = decaltexcoords[numdecals][j][1] - .5;
+                                                    rot = DoRotation(rot, 0, -decalrotation[numdecals], 0);
+                                                    decaltexcoords[numdecals][j][0] = rot.x + .5;
+                                                    decaltexcoords[numdecals][j][1] = rot.z + .5;
+                                                }
+                                            }
+                                            if (numdecals < max_model_decals - 1)numdecals++;
+                                        }
+                        }
+                    } else if (distance < .02 && abs(facenormals[i].x) > abs(facenormals[i].y) && abs(facenormals[i].x) > abs(facenormals[i].z)) {
+                        decalposition[numdecals] = where;
+                        decaltype[numdecals] = atype;
+                        decalrotation[numdecals] = rotation;
+                        decalalivetime[numdecals] = 0;
+                        decalopacity[numdecals] = opacity - distance / 10;
+
+                        if (decalopacity[numdecals > 0]) {
+                            placex = vertex[Triangles[i].vertex[0]].y;
+                            placez = vertex[Triangles[i].vertex[0]].z;
+
+                            decaltexcoords[numdecals][0][0] = (placex - where.y) / (size) / 2 + .5;
+                            decaltexcoords[numdecals][0][1] = (placez - where.z) / (size) / 2 + .5;
+
+                            decalvertex[numdecals][0].x = vertex[Triangles[i].vertex[0]].x;
+                            decalvertex[numdecals][0].z = placez;
+                            decalvertex[numdecals][0].y = placex;
+
+
+                            placex = vertex[Triangles[i].vertex[1]].y;
+                            placez = vertex[Triangles[i].vertex[1]].z;
+
+                            decaltexcoords[numdecals][1][0] = (placex - where.y) / (size) / 2 + .5;
+                            decaltexcoords[numdecals][1][1] = (placez - where.z) / (size) / 2 + .5;
+
+                            decalvertex[numdecals][1].x = vertex[Triangles[i].vertex[1]].x;
+                            decalvertex[numdecals][1].z = placez;
+                            decalvertex[numdecals][1].y = placex;
+
+
+                            placex = vertex[Triangles[i].vertex[2]].y;
+                            placez = vertex[Triangles[i].vertex[2]].z;
+
+                            decaltexcoords[numdecals][2][0] = (placex - where.y) / (size) / 2 + .5;
+                            decaltexcoords[numdecals][2][1] = (placez - where.z) / (size) / 2 + .5;
+
+                            decalvertex[numdecals][2].x = vertex[Triangles[i].vertex[2]].x;
+                            decalvertex[numdecals][2].z = placez;
+                            decalvertex[numdecals][2].y = placex;
+
+                            if (!(decaltexcoords[numdecals][0][0] < 0 && decaltexcoords[numdecals][1][0] < 0 && decaltexcoords[numdecals][2][0] < 0))
+                                if (!(decaltexcoords[numdecals][0][1] < 0 && decaltexcoords[numdecals][1][1] < 0 && decaltexcoords[numdecals][2][1] < 0))
+                                    if (!(decaltexcoords[numdecals][0][0] > 1 && decaltexcoords[numdecals][1][0] > 1 && decaltexcoords[numdecals][2][0] > 1))
+                                        if (!(decaltexcoords[numdecals][0][1] > 1 && decaltexcoords[numdecals][1][1] > 1 && decaltexcoords[numdecals][2][1] > 1)) {
+                                            if (decalrotation[numdecals]) {
+                                                for (j = 0; j < 3; j++) {
+                                                    rot.y = 0;
+                                                    rot.x = decaltexcoords[numdecals][j][0] - .5;
+                                                    rot.z = decaltexcoords[numdecals][j][1] - .5;
+                                                    rot = DoRotation(rot, 0, -decalrotation[numdecals], 0);
+                                                    decaltexcoords[numdecals][j][0] = rot.x + .5;
+                                                    decaltexcoords[numdecals][j][1] = rot.z + .5;
+                                                }
+                                            }
+                                            if (numdecals < max_model_decals - 1)numdecals++;
+                                        }
+                        }
+                    } else if (distance < .02 && abs(facenormals[i].z) > abs(facenormals[i].y) && abs(facenormals[i].z) > abs(facenormals[i].x)) {
+                        decalposition[numdecals] = where;
+                        decaltype[numdecals] = atype;
+                        decalrotation[numdecals] = rotation;
+                        decalalivetime[numdecals] = 0;
+                        decalopacity[numdecals] = opacity - distance / 10;
+
+                        if (decalopacity[numdecals > 0]) {
+                            placex = vertex[Triangles[i].vertex[0]].x;
+                            placez = vertex[Triangles[i].vertex[0]].y;
+
+                            decaltexcoords[numdecals][0][0] = (placex - where.x) / (size) / 2 + .5;
+                            decaltexcoords[numdecals][0][1] = (placez - where.y) / (size) / 2 + .5;
+
+                            decalvertex[numdecals][0].x = placex;
+                            decalvertex[numdecals][0].z = vertex[Triangles[i].vertex[0]].z;
+                            decalvertex[numdecals][0].y = placez;
+
+
+                            placex = vertex[Triangles[i].vertex[1]].x;
+                            placez = vertex[Triangles[i].vertex[1]].y;
+
+                            decaltexcoords[numdecals][1][0] = (placex - where.x) / (size) / 2 + .5;
+                            decaltexcoords[numdecals][1][1] = (placez - where.y) / (size) / 2 + .5;
+
+                            decalvertex[numdecals][1].x = placex;
+                            decalvertex[numdecals][1].z = vertex[Triangles[i].vertex[1]].z;
+                            decalvertex[numdecals][1].y = placez;
+
+
+                            placex = vertex[Triangles[i].vertex[2]].x;
+                            placez = vertex[Triangles[i].vertex[2]].y;
+
+                            decaltexcoords[numdecals][2][0] = (placex - where.x) / (size) / 2 + .5;
+                            decaltexcoords[numdecals][2][1] = (placez - where.y) / (size) / 2 + .5;
+
+                            decalvertex[numdecals][2].x = placex;
+                            decalvertex[numdecals][2].z = vertex[Triangles[i].vertex[2]].z;
+                            decalvertex[numdecals][2].y = placez;
+
+                            if (!(decaltexcoords[numdecals][0][0] < 0 && decaltexcoords[numdecals][1][0] < 0 && decaltexcoords[numdecals][2][0] < 0))
+                                if (!(decaltexcoords[numdecals][0][1] < 0 && decaltexcoords[numdecals][1][1] < 0 && decaltexcoords[numdecals][2][1] < 0))
+                                    if (!(decaltexcoords[numdecals][0][0] > 1 && decaltexcoords[numdecals][1][0] > 1 && decaltexcoords[numdecals][2][0] > 1))
+                                        if (!(decaltexcoords[numdecals][0][1] > 1 && decaltexcoords[numdecals][1][1] > 1 && decaltexcoords[numdecals][2][1] > 1)) {
+                                            if (decalrotation[numdecals]) {
+                                                for (j = 0; j < 3; j++) {
+                                                    rot.y = 0;
+                                                    rot.x = decaltexcoords[numdecals][j][0] - .5;
+                                                    rot.z = decaltexcoords[numdecals][j][1] - .5;
+                                                    rot = DoRotation(rot, 0, -decalrotation[numdecals], 0);
+                                                    decaltexcoords[numdecals][j][0] = rot.x + .5;
+                                                    decaltexcoords[numdecals][j][1] = rot.z + .5;
+                                                }
+                                            }
+                                            if (numdecals < max_model_decals - 1)numdecals++;
+                                        }
+                        }
+                    }
+                }
+    }
 }
 
 Model::~Model()
 {
-       deallocate();
+    deallocate();
     textureptr.destroy();
 }
 
 void Model::deallocate()
 {
-       int i = 0, j = 0;
+    int i = 0, j = 0;
 
-       if(owner)free(owner);
-       owner = 0;
+    if (owner)free(owner);
+    owner = 0;
 
-       if(possible)free(possible);
-       possible = 0;
+    if (possible)free(possible);
+    possible = 0;
 
-       if(vertex)free(vertex);
-       vertex = 0;
+    if (vertex)free(vertex);
+    vertex = 0;
 
-       if(normals)free(normals);
-       normals = 0;
+    if (normals)free(normals);
+    normals = 0;
 
-       if(facenormals)free(facenormals);
-       facenormals = 0;
+    if (facenormals)free(facenormals);
+    facenormals = 0;
 
-       if(Triangles)free(Triangles);
-       Triangles = 0;
+    if (Triangles)free(Triangles);
+    Triangles = 0;
 
-       if(vArray)free(vArray);
-       vArray = 0;
+    if (vArray)free(vArray);
+    vArray = 0;
 
 
-       //allow decals
-       if(decaltexcoords)
-       {
-               for(i=0;i<max_model_decals;i++)
-               {
-                       for(j=0;j<3;j++)
-                       {
-                               free(decaltexcoords[i][j]);
-                       }
-                       free(decaltexcoords[i]);
-               }
-               free(decaltexcoords);
-       }
-       decaltexcoords = 0;
+    //allow decals
+    if (decaltexcoords) {
+        for (i = 0; i < max_model_decals; i++) {
+            for (j = 0; j < 3; j++) {
+                free(decaltexcoords[i][j]);
+            }
+            free(decaltexcoords[i]);
+        }
+        free(decaltexcoords);
+    }
+    decaltexcoords = 0;
 
 
-       if (decalvertex)
-       {
-               for(i=0;i<max_model_decals;i++)
-               {
-                       free(decalvertex[i]);
-               }
-               free(decalvertex);
-       }
-       decalvertex = 0;
+    if (decalvertex) {
+        for (i = 0; i < max_model_decals; i++) {
+            free(decalvertex[i]);
+        }
+        free(decalvertex);
+    }
+    decalvertex = 0;
 
 
-       free(decaltype);
-       decaltype = 0;
+    free(decaltype);
+    decaltype = 0;
 
-       free(decalopacity);
-       decalopacity = 0;
+    free(decalopacity);
+    decalopacity = 0;
 
-       free(decalrotation);
-       decalrotation = 0;
+    free(decalrotation);
+    decalrotation = 0;
 
-       free(decalalivetime);
-       decalalivetime = 0;
+    free(decalalivetime);
+    decalalivetime = 0;
 
-       free(decalposition);
-       decalposition = 0;
+    free(decalposition);
+    decalposition = 0;
 
 };
 
 Model::Model()
 {
-       vertexNum = 0,TriangleNum = 0;
-       hastexture = 0;
+    vertexNum = 0, TriangleNum = 0;
+    hastexture = 0;
 
-       type = 0,oldtype = 0;
+    type = 0, oldtype = 0;
 
-       possible=0;
-       owner=0;
-       vertex=0;
-       normals=0;
-       facenormals=0;
-       Triangles=0;
-       vArray=0;
+    possible = 0;
+    owner = 0;
+    vertex = 0;
+    normals = 0;
+    facenormals = 0;
+    Triangles = 0;
+    vArray = 0;
 
-       memset(&modelTexture, 0, sizeof(modelTexture));
-       numpossible = 0;
-       color = 0;
+    memset(&modelTexture, 0, sizeof(modelTexture));
+    numpossible = 0;
+    color = 0;
 
-       boundingspherecenter = 0;
-       boundingsphereradius = 0;
+    boundingspherecenter = 0;
+    boundingsphereradius = 0;
 
-       decaltexcoords=0;
-       decalvertex=0;
-       decaltype=0;
-       decalopacity=0;
-       decalrotation=0;
-       decalalivetime=0;
-       decalposition=0;
+    decaltexcoords = 0;
+    decalvertex = 0;
+    decaltype = 0;
+    decalopacity = 0;
+    decalrotation = 0;
+    decalalivetime = 0;
+    decalposition = 0;
 
-       numdecals = 0;
+    numdecals = 0;
 
-       flat = 0;
+    flat = 0;
 
-       type=nothing;
+    type = nothing;
 }
 
index a82f85d04287ec55a750fddebfb80ed5364da274..e69cca93a7f7af4fcf7b39d521214de652a32151 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -41,18 +41,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 // Textures List
 //
 typedef struct         {
-       long                    xsz,ysz;
-       GLubyte                         *txt;
+    long                       xsz, ysz;
+    GLubyte                            *txt;
 } ModelTexture;
 
 //
 // Model Structures
 //
 
-class TexturedTriangle{
+class TexturedTriangle
+{
 public:
-       short                   vertex[3];
-       float gx[3],gy[3];
+    short                      vertex[3];
+    float gx[3], gy[3];
 };
 
 #define max_model_decals 300
@@ -63,90 +64,91 @@ public:
 #define rawtype 2
 #define decalstype 3
 
-class Model{
+class Model
+{
 public:
-       short   vertexNum,TriangleNum;
-       bool hastexture;
-
-       int type,oldtype;
-
-       int* possible;
-       int* owner;
-       XYZ* vertex;
-       XYZ* normals;
-       XYZ* facenormals;
-       TexturedTriangle* Triangles;
-       GLfloat* vArray;
-
-       /*int possible[max_model_vertex];
-       int owner[max_textured_triangle];
-       XYZ vertex[max_model_vertex];
-       XYZ normals[max_model_vertex];
-       XYZ facenormals[max_textured_triangle];
-       TexturedTriangle Triangles[max_textured_triangle];
-       GLfloat vArray[max_textured_triangle*24];*/
-
-       Texture textureptr;
-       ModelTexture modelTexture;
-       int numpossible;
-       bool color;
-
-       XYZ boundingspherecenter;
-       float boundingsphereradius;
-
-       float*** decaltexcoords;
-       XYZ** decalvertex;
-       int* decaltype;
-       float* decalopacity;
-       float* decalrotation;
-       float* decalalivetime;
-       XYZ* decalposition;
-
-       /*float decaltexcoords[max_model_decals][3][2];
-       XYZ decalvertex[max_model_decals][3];
-       int decaltype[max_model_decals];
-       float decalopacity[max_model_decals];
-       float decalrotation[max_model_decals];
-       float decalalivetime[max_model_decals];
-       XYZ decalposition[max_model_decals];*/
-
-       int numdecals;
-
-       bool flat;
-
-       void DeleteDecal(int which);
-       void MakeDecal(int atype, XYZ *where, float *size, float *opacity, float *rotation);
-       void MakeDecal(int atype, XYZ where, float size, float opacity, float rotation);
-       void drawdecals(Texture shadowtexture,Texture bloodtexture,Texture bloodtexture2,Texture breaktexture);
-       int SphereCheck(XYZ *p1,float radius, XYZ *p, XYZ *move, float *rotate);
-       int SphereCheckPossible(XYZ *p1,float radius, XYZ *move, float *rotate);
-       int LineCheck(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate);
-       int LineCheckSlide(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate);
-       int LineCheckPossible(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate);
-       int LineCheckSlidePossible(XYZ *p1,XYZ *p2, XYZ *p, XYZ *move, float *rotate);
-       void UpdateVertexArray();
-       void UpdateVertexArrayNoTex();
-       void UpdateVertexArrayNoTexNoNorm();
-       bool loadnotex(const char *filename);
-       bool loadraw(char *filename);
-       bool load(const char *filename,bool texture);
-       bool loaddecal(const char *filename,bool texture);
-       void Scale(float xscale,float yscale,float zscale);
-       void FlipTexCoords();
-       void UniformTexCoords();
-       void ScaleTexCoords(float howmuch);
-       void ScaleNormals(float xscale,float yscale,float zscale);
-       void Translate(float xtrans,float ytrans,float ztrans);
-       void CalculateNormals(bool facenormalise);
-       void draw();
-       void drawdifftex(GLuint texture);
-       void drawdifftex(Texture texture);
-       void drawimmediate();
-       void drawdiffteximmediate(GLuint texture);
-       void Rotate(float xang,float yang,float zang);
-       ~Model();
-       void deallocate();
-       Model();
+    short      vertexNum, TriangleNum;
+    bool hastexture;
+
+    int type, oldtype;
+
+    int* possible;
+    int* owner;
+    XYZ* vertex;
+    XYZ* normals;
+    XYZ* facenormals;
+    TexturedTriangle* Triangles;
+    GLfloat* vArray;
+
+    /*int possible[max_model_vertex];
+    int owner[max_textured_triangle];
+    XYZ vertex[max_model_vertex];
+    XYZ normals[max_model_vertex];
+    XYZ facenormals[max_textured_triangle];
+    TexturedTriangle Triangles[max_textured_triangle];
+    GLfloat vArray[max_textured_triangle*24];*/
+
+    Texture textureptr;
+    ModelTexture modelTexture;
+    int numpossible;
+    bool color;
+
+    XYZ boundingspherecenter;
+    float boundingsphereradius;
+
+    float*** decaltexcoords;
+    XYZ** decalvertex;
+    int* decaltype;
+    float* decalopacity;
+    float* decalrotation;
+    float* decalalivetime;
+    XYZ* decalposition;
+
+    /*float decaltexcoords[max_model_decals][3][2];
+    XYZ decalvertex[max_model_decals][3];
+    int decaltype[max_model_decals];
+    float decalopacity[max_model_decals];
+    float decalrotation[max_model_decals];
+    float decalalivetime[max_model_decals];
+    XYZ decalposition[max_model_decals];*/
+
+    int numdecals;
+
+    bool flat;
+
+    void DeleteDecal(int which);
+    void MakeDecal(int atype, XYZ *where, float *size, float *opacity, float *rotation);
+    void MakeDecal(int atype, XYZ where, float size, float opacity, float rotation);
+    void drawdecals(Texture shadowtexture, Texture bloodtexture, Texture bloodtexture2, Texture breaktexture);
+    int SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate);
+    int SphereCheckPossible(XYZ *p1, float radius, XYZ *move, float *rotate);
+    int LineCheck(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate);
+    int LineCheckSlide(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate);
+    int LineCheckPossible(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate);
+    int LineCheckSlidePossible(XYZ *p1, XYZ *p2, XYZ *p, XYZ *move, float *rotate);
+    void UpdateVertexArray();
+    void UpdateVertexArrayNoTex();
+    void UpdateVertexArrayNoTexNoNorm();
+    bool loadnotex(const char *filename);
+    bool loadraw(char *filename);
+    bool load(const char *filename, bool texture);
+    bool loaddecal(const char *filename, bool texture);
+    void Scale(float xscale, float yscale, float zscale);
+    void FlipTexCoords();
+    void UniformTexCoords();
+    void ScaleTexCoords(float howmuch);
+    void ScaleNormals(float xscale, float yscale, float zscale);
+    void Translate(float xtrans, float ytrans, float ztrans);
+    void CalculateNormals(bool facenormalise);
+    void draw();
+    void drawdifftex(GLuint texture);
+    void drawdifftex(Texture texture);
+    void drawimmediate();
+    void drawdiffteximmediate(GLuint texture);
+    void Rotate(float xang, float yang, float zang);
+    ~Model();
+    void deallocate();
+    Model();
 };
 
 #endif
index 06c8b8bdd360f41c9c8f754971a2c514ddde6e71..df5f1bcabb58561c6622b3eab9db1e18dbabfd90 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -39,747 +39,748 @@ extern bool skyboxtexture;
 
 //Functions
 
-bool   Objects::checkcollide(XYZ startpoint,XYZ endpoint,int which){
-       static XYZ colpoint,colviewer,coltarget;
-       static int i;
-
-       startpoint.y+=.1;
-       endpoint.y+=.1;
-       startpoint.y-=.1;
-       endpoint.y-=.1;
-
-       for(i=0;i<numobjects;i++){
-               if(type[i]!=treeleavestype&&type[i]!=treetrunktype&&type[i]!=bushtype&&type[i]!=firetype&&i!=which){
-                       colviewer=startpoint;
-                       coltarget=endpoint;
-                       if(model[i].LineCheck(&colviewer,&coltarget,&colpoint,&position[i],&yaw[i])!=-1)return 1;       
-               }
-       }
-
-       return 0;
+bool   Objects::checkcollide(XYZ startpoint, XYZ endpoint, int which)
+{
+    static XYZ colpoint, colviewer, coltarget;
+    static int i;
+
+    startpoint.y += .1;
+    endpoint.y += .1;
+    startpoint.y -= .1;
+    endpoint.y -= .1;
+
+    for (i = 0; i < numobjects; i++) {
+        if (type[i] != treeleavestype && type[i] != treetrunktype && type[i] != bushtype && type[i] != firetype && i != which) {
+            colviewer = startpoint;
+            coltarget = endpoint;
+            if (model[i].LineCheck(&colviewer, &coltarget, &colpoint, &position[i], &yaw[i]) != -1)return 1;
+        }
+    }
+
+    return 0;
 }
 
-void Objects::SphereCheckPossible(XYZ *p1,float radius)
+void Objects::SphereCheckPossible(XYZ *p1, float radius)
 {
-       static int i,j;
-       static int whichpatchx;
-       static int whichpatchz;
-
-       whichpatchx=p1->x/(terrain.size/subdivision*terrain.scale);
-       whichpatchz=p1->z/(terrain.size/subdivision*terrain.scale);
-
-       if(whichpatchx>=0&&whichpatchz>=0&&whichpatchx<subdivision&&whichpatchz<subdivision)
-               if(terrain.patchobjectnum[whichpatchx][whichpatchz]>0&&terrain.patchobjectnum[whichpatchx][whichpatchz]<500)
-                       for(j=0;j<terrain.patchobjectnum[whichpatchx][whichpatchz];j++){
-                               i=terrain.patchobjects[whichpatchx][whichpatchz][j];
-                               possible[i]=0;
-                               if(model[i].SphereCheckPossible(p1, radius, &position[i], &yaw[i])!=-1){
-                                       possible[i]=1;
-                               }
-                       }
+    static int i, j;
+    static int whichpatchx;
+    static int whichpatchz;
+
+    whichpatchx = p1->x / (terrain.size / subdivision * terrain.scale);
+    whichpatchz = p1->z / (terrain.size / subdivision * terrain.scale);
+
+    if (whichpatchx >= 0 && whichpatchz >= 0 && whichpatchx < subdivision && whichpatchz < subdivision)
+        if (terrain.patchobjectnum[whichpatchx][whichpatchz] > 0 && terrain.patchobjectnum[whichpatchx][whichpatchz] < 500)
+            for (j = 0; j < terrain.patchobjectnum[whichpatchx][whichpatchz]; j++) {
+                i = terrain.patchobjects[whichpatchx][whichpatchz][j];
+                possible[i] = 0;
+                if (model[i].SphereCheckPossible(p1, radius, &position[i], &yaw[i]) != -1) {
+                    possible[i] = 1;
+                }
+            }
 }
 
 void Objects::Draw()
 {
-       static float distance;
-       static int i,j;
-       static XYZ moved,terrainlight;
-       bool hidden;
-
-       for(i=0;i<numobjects;i++){
-               if(type[i]!=firetype){
-                       moved=DoRotation(model[i].boundingspherecenter,0,yaw[i],0);
-                       if(type[i]==tunneltype||frustum.SphereInFrustum(position[i].x+moved.x,position[i].y+moved.y,position[i].z+moved.z,model[i].boundingsphereradius)){   
-                               distance=distsq(&viewer,&position[i]);
-                               distance*=1.2;
-                               hidden=!(distsqflat(&viewer,&position[i])>playerdist+3||(type[i]!=bushtype&&type[i]!=treeleavestype));
-                               if(!hidden){
-
-                                       if(detail==2&&distance>viewdistance*viewdistance/4&&environment==desertenvironment)glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, blurness );
-                                       else glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
-                                       distance=(viewdistance*viewdistance-(distance-(viewdistance*viewdistance*fadestart))*(1/(1-fadestart)))/viewdistance/viewdistance;
-                                       if(distance>1)distance=1;
-                                       if(distance>0){
-
-                                               /*if(checkcollide(viewer,DoRotation(model[i].vertex[model[i].vertexNum],0,yaw[i],0)*scale[i]+position[i],i)){
-                                               occluded[i]+=1;
-                                               }
-                                               else occluded[i]=0;*/
-                                               if(occluded[i]<6){
-                                                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                                                       glPushMatrix();
-                                                               if(!model[i].color)glEnable(GL_LIGHTING);
-                                                               else glDisable(GL_LIGHTING);
-                                                               glDepthMask(1);
-                                                               glTranslatef(position[i].x,position[i].y,position[i].z);
-                                                               if(type[i]==bushtype){
-                                                                       messedwith[i]-=multiplier;
-                                                                       if(rotxvel[i]||rotx[i]){
-                                                                               if(rotx[i]>0)rotxvel[i]-=multiplier*8*fabs(rotx[i]);
-                                                                               if(rotx[i]<0)rotxvel[i]+=multiplier*8*fabs(rotx[i]);
-                                                                               if(rotx[i]>0)rotxvel[i]-=multiplier*4;
-                                                                               if(rotx[i]<0)rotxvel[i]+=multiplier*4;
-                                                                               if(rotxvel[i]>0)rotxvel[i]-=multiplier*4;
-                                                                               if(rotxvel[i]<0)rotxvel[i]+=multiplier*4;
-                                                                               if(fabs(rotx[i])<multiplier*4)rotx[i]=0;
-                                                                               if(fabs(rotxvel[i])<multiplier*4)rotxvel[i]=0;
-
-                                                                               rotx[i]+=rotxvel[i]*multiplier*4;
-                                                                       }
-                                                                       if(rotyvel[i]||roty[i]){
-                                                                               if(roty[i]>0)rotyvel[i]-=multiplier*8*fabs(roty[i]);
-                                                                               if(roty[i]<0)rotyvel[i]+=multiplier*8*fabs(roty[i]);
-                                                                               if(roty[i]>0)rotyvel[i]-=multiplier*4;
-                                                                               if(roty[i]<0)rotyvel[i]+=multiplier*4;
-                                                                               if(rotyvel[i]>0)rotyvel[i]-=multiplier*4;
-                                                                               if(rotyvel[i]<0)rotyvel[i]+=multiplier*4;
-                                                                               if(fabs(roty[i])<multiplier*4)roty[i]=0;
-                                                                               if(fabs(rotyvel[i])<multiplier*4)rotyvel[i]=0;
-
-                                                                               roty[i]+=rotyvel[i]*multiplier*4;
-                                                                       }
-                                                                       if(roty[i]){
-                                                                               glRotatef(roty[i],1,0,0);
-                                                                       }
-                                                                       if(rotx[i]){
-                                                                               glRotatef(-rotx[i],0,0,1);
-                                                                       }
-                                                                       if(rotx[i]>10)rotx[i]=10;
-                                                                       if(rotx[i]<-10)rotx[i]=-10;
-                                                                       if(roty[i]>10)roty[i]=10;
-                                                                       if(roty[i]<-10)roty[i]=-10;
-                                                               }
-                                                               if(type[i]==treetrunktype||type[i]==treeleavestype){
-                                                                       if(type[i]==treetrunktype||environment==2){
-                                                                               messedwith[i]-=multiplier;
-                                                                               if(rotxvel[i]||rotx[i]){
-                                                                                       if(rotx[i]>0)rotxvel[i]-=multiplier*8*fabs(rotx[i]);
-                                                                                       if(rotx[i]<0)rotxvel[i]+=multiplier*8*fabs(rotx[i]);
-                                                                                       if(rotx[i]>0)rotxvel[i]-=multiplier*4;
-                                                                                       if(rotx[i]<0)rotxvel[i]+=multiplier*4;
-                                                                                       if(rotxvel[i]>0)rotxvel[i]-=multiplier*4;
-                                                                                       if(rotxvel[i]<0)rotxvel[i]+=multiplier*4;
-                                                                                       if(fabs(rotx[i])<multiplier*4)rotx[i]=0;
-                                                                                       if(fabs(rotxvel[i])<multiplier*4)rotxvel[i]=0;
-
-                                                                                       rotx[i]+=rotxvel[i]*multiplier*4;
-                                                                               }
-                                                                               if(rotyvel[i]||roty[i]){
-                                                                                       if(roty[i]>0)rotyvel[i]-=multiplier*8*fabs(roty[i]);
-                                                                                       if(roty[i]<0)rotyvel[i]+=multiplier*8*fabs(roty[i]);
-                                                                                       if(roty[i]>0)rotyvel[i]-=multiplier*4;
-                                                                                       if(roty[i]<0)rotyvel[i]+=multiplier*4;
-                                                                                       if(rotyvel[i]>0)rotyvel[i]-=multiplier*4;
-                                                                                       if(rotyvel[i]<0)rotyvel[i]+=multiplier*4;
-                                                                                       if(fabs(roty[i])<multiplier*4)roty[i]=0;
-                                                                                       if(fabs(rotyvel[i])<multiplier*4)rotyvel[i]=0;
-
-                                                                                       roty[i]+=rotyvel[i]*multiplier*4;
-                                                                               }
-                                                                               if(roty[i]){
-                                                                                       glRotatef(roty[i]/6,1,0,0);
-                                                                               }
-                                                                               if(rotx[i]){
-                                                                                       glRotatef(-rotx[i]/6,0,0,1);
-                                                                               }
-                                                                               if(rotx[i]>10)rotx[i]=10;
-                                                                               if(rotx[i]<-10)rotx[i]=-10;
-                                                                               if(roty[i]>10)roty[i]=10;
-                                                                               if(roty[i]<-10)roty[i]=-10;
-                                                                       }
-                                                                       else
-                                                                       {
-                                                                               messedwith[i]-=multiplier;
-                                                                               if(rotxvel[i]||rotx[i]){
-                                                                                       if(rotx[i]>0)rotxvel[i]-=multiplier*8*fabs(rotx[i]);
-                                                                                       if(rotx[i]<0)rotxvel[i]+=multiplier*8*fabs(rotx[i]);
-                                                                                       if(rotx[i]>0)rotxvel[i]-=multiplier*4;
-                                                                                       if(rotx[i]<0)rotxvel[i]+=multiplier*4;
-                                                                                       if(rotxvel[i]>0)rotxvel[i]-=multiplier*4;
-                                                                                       if(rotxvel[i]<0)rotxvel[i]+=multiplier*4;
-                                                                                       if(fabs(rotx[i])<multiplier*4)rotx[i]=0;
-                                                                                       if(fabs(rotxvel[i])<multiplier*4)rotxvel[i]=0;
-
-                                                                                       rotx[i]+=rotxvel[i]*multiplier*4;
-                                                                               }
-                                                                               if(rotyvel[i]||roty[i]){
-                                                                                       if(roty[i]>0)rotyvel[i]-=multiplier*8*fabs(roty[i]);
-                                                                                       if(roty[i]<0)rotyvel[i]+=multiplier*8*fabs(roty[i]);
-                                                                                       if(roty[i]>0)rotyvel[i]-=multiplier*4;
-                                                                                       if(roty[i]<0)rotyvel[i]+=multiplier*4;
-                                                                                       if(rotyvel[i]>0)rotyvel[i]-=multiplier*4;
-                                                                                       if(rotyvel[i]<0)rotyvel[i]+=multiplier*4;
-                                                                                       if(fabs(roty[i])<multiplier*4)roty[i]=0;
-                                                                                       if(fabs(rotyvel[i])<multiplier*4)rotyvel[i]=0;
-
-                                                                                       roty[i]+=rotyvel[i]*multiplier*4;
-                                                                               }
-                                                                               if(roty[i]){
-                                                                                       glRotatef(roty[i]/4,1,0,0);
-                                                                               }
-                                                                               if(rotx[i]){
-                                                                                       glRotatef(-rotx[i]/4,0,0,1);
-                                                                               }
-                                                                               if(rotx[i]>10)rotx[i]=10;
-                                                                               if(rotx[i]<-10)rotx[i]=-10;
-                                                                               if(roty[i]>10)roty[i]=10;
-                                                                               if(roty[i]<-10)roty[i]=-10;
-                                                                       }
-
-                                                               }
-                                                               if(/*detail==2&&*/environment==snowyenvironment){
-                                                                       if(type[i]==treeleavestype){
-                                                                               glRotatef((sin(windvar+position[i].x*.3)+.5)*1.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
-                                                                       }
-                                                                       if(type[i]==treetrunktype){
-                                                                               glRotatef((sin(windvar+position[i].x*.3)+.5)*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
-                                                                       }
-                                                                       if(type[i]==bushtype){
-                                                                               glRotatef((sin(windvar+position[i].x*.3)+.5)*4*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
-                                                                       }
-                                                               }
-                                                               if(/*detail==2&&*/environment==grassyenvironment){
-                                                                       if(type[i]==treeleavestype){
-                                                                               glRotatef((sin(windvar+position[i].x*.3)+.5)*1.5*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
-                                                                       }
-                                                                       if(type[i]==treetrunktype){
-                                                                               glRotatef((sin(windvar+position[i].x*.3)+.5)*.5*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
-                                                                       }
-                                                                       if(type[i]==bushtype){
-                                                                               glRotatef((sin(windvar+position[i].x*.3)+.5)*4*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
-                                                                       }
-                                                               }
-                                                               if(/*detail==2&&*/environment==desertenvironment){
-                                                                       if(type[i]==bushtype){
-                                                                               glRotatef((sin(windvar+position[i].x*.3)+.5)*4*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
-                                                                       }
-                                                               }
-                                                               glRotatef(yaw[i],0,1,0);
-                                                               if(distance>1)distance=1;
-                                                               glColor4f((1-shadowed[i])/2+.5,(1-shadowed[i])/2+.5,(1-shadowed[i])/2+.5,distance);
-                                                               if(distance>=1){
-                                                                       glDisable(GL_BLEND);
-                                                                       glAlphaFunc(GL_GREATER, 0.5);
-                                                               }
-                                                               if(distance<1){
-                                                                       glEnable(GL_BLEND);
-                                                                       glAlphaFunc(GL_GREATER, 0.1);
-                                                               }
-                                                               if(type[i]!=treetrunktype&&type[i]!=treeleavestype&&type[i]!=bushtype&&type[i]!=rocktype){
-                                                                       glEnable(GL_CULL_FACE);
-                                                                       glAlphaFunc(GL_GREATER, 0.0001);
-                                                                       model[i].drawdifftex(boxtextureptr);
-                                                                       model[i].drawdecals(terrain.shadowtexture,terrain.bloodtexture,terrain.bloodtexture2,terrain.breaktexture);
-                                                               }
-                                                               if(type[i]==rocktype){
-                                                                       glEnable(GL_CULL_FACE);
-                                                                       glAlphaFunc(GL_GREATER, 0.0001);
-                                                                       glColor4f((1-shadowed[i])/2+light.ambient[0],(1-shadowed[i])/2+light.ambient[1],(1-shadowed[i])/2+light.ambient[2],distance);
-                                                                       model[i].drawdifftex(rocktextureptr);
-                                                                       model[i].drawdecals(terrain.shadowtexture,terrain.bloodtexture,terrain.bloodtexture2,terrain.breaktexture);
-                                                               }
-                                                               if(type[i]==treeleavestype){
-                                                                       glDisable(GL_CULL_FACE);
-                                                                       glDisable(GL_LIGHTING);
-                                                                       terrainlight=terrain.getLighting(position[i].x,position[i].z);
-                                                                       if(!hidden){
-                                                                               glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance);
-                                                                               if(distance<1)glAlphaFunc(GL_GREATER, 0.2);
-                                                                       }
-                                                                       if(hidden){
-                                                                               glDepthMask(0);
-                                                                               glEnable(GL_BLEND);
-                                                                               glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance/3);
-                                                                               glAlphaFunc(GL_GREATER, 0);
-                                                                       }
-                                                                       model[i].drawdifftex(treetextureptr);
-                                                               }
-                                                               if(type[i]==bushtype){
-                                                                       glDisable(GL_CULL_FACE);
-                                                                       glDisable(GL_LIGHTING);
-                                                                       terrainlight=terrain.getLighting(position[i].x,position[i].z);
-                                                                       if(!hidden){
-                                                                               glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance);
-                                                                               if(distance<1)glAlphaFunc(GL_GREATER, 0.2);
-                                                                       }
-                                                                       if(hidden){
-                                                                               glDepthMask(0);
-                                                                               glEnable(GL_BLEND);
-                                                                               glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance/3);
-                                                                               glAlphaFunc(GL_GREATER, 0);
-                                                                       }
-                                                                       model[i].drawdifftex(bushtextureptr);
-                                                               }
-                                                               if(type[i]==treetrunktype){
-                                                                       glEnable(GL_CULL_FACE);
-                                                                       terrainlight=terrain.getLighting(position[i].x,position[i].z);
-                                                                       glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,distance);
-                                                                       model[i].drawdifftex(treetextureptr);
-                                                               }
-                                                       glPopMatrix();
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-
-       glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
-       for(i=0;i<numobjects;i++){
-               if(type[i]==treeleavestype||type[i]==bushtype){
-                       moved=DoRotation(model[i].boundingspherecenter,0,yaw[i],0);
-                       if(frustum.SphereInFrustum(position[i].x+moved.x,position[i].y+moved.y,position[i].z+moved.z,model[i].boundingsphereradius)){   
-                               hidden=distsqflat(&viewer,&position[i])<=playerdist+3;
-                               if(hidden){
-                                       distance=1;
-                                       if(distance>0){
-                                               if(1==1||occluded[i]<6){
-                                                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                                                       glPushMatrix();
-                                                               glEnable(GL_LIGHTING);
-                                                               glDepthMask(1);
-                                                               glTranslatef(position[i].x,position[i].y,position[i].z);
-                                                               if(type[i]==bushtype){
-                                                                       messedwith[i]-=multiplier;
-                                                                       if(rotxvel[i]||rotx[i]){
-                                                                               if(rotx[i]>0)rotxvel[i]-=multiplier*8*fabs(rotx[i]);
-                                                                               if(rotx[i]<0)rotxvel[i]+=multiplier*8*fabs(rotx[i]);
-                                                                               if(rotx[i]>0)rotxvel[i]-=multiplier*4;
-                                                                               if(rotx[i]<0)rotxvel[i]+=multiplier*4;
-                                                                               if(rotxvel[i]>0)rotxvel[i]-=multiplier*4;
-                                                                               if(rotxvel[i]<0)rotxvel[i]+=multiplier*4;
-                                                                               if(fabs(rotx[i])<multiplier*4)rotx[i]=0;
-                                                                               if(fabs(rotxvel[i])<multiplier*4)rotxvel[i]=0;
-
-                                                                               rotx[i]+=rotxvel[i]*multiplier*4;
-                                                                       }
-                                                                       if(rotyvel[i]||roty[i]){
-                                                                               if(roty[i]>0)rotyvel[i]-=multiplier*8*fabs(roty[i]);
-                                                                               if(roty[i]<0)rotyvel[i]+=multiplier*8*fabs(roty[i]);
-                                                                               if(roty[i]>0)rotyvel[i]-=multiplier*4;
-                                                                               if(roty[i]<0)rotyvel[i]+=multiplier*4;
-                                                                               if(rotyvel[i]>0)rotyvel[i]-=multiplier*4;
-                                                                               if(rotyvel[i]<0)rotyvel[i]+=multiplier*4;
-                                                                               if(fabs(roty[i])<multiplier*4)roty[i]=0;
-                                                                               if(fabs(rotyvel[i])<multiplier*4)rotyvel[i]=0;
-
-                                                                               roty[i]+=rotyvel[i]*multiplier*4;
-                                                                       }
-                                                                       if(roty[i]){
-                                                                               glRotatef(roty[i],1,0,0);
-                                                                       }
-                                                                       if(rotx[i]){
-                                                                               glRotatef(-rotx[i],0,0,1);
-                                                                       }
-                                                                       if(rotx[i]>10)rotx[i]=10;
-                                                                       if(rotx[i]<-10)rotx[i]=-10;
-                                                                       if(roty[i]>10)roty[i]=10;
-                                                                       if(roty[i]<-10)roty[i]=-10;
-                                                               }
-                                                               if(type[i]==treetrunktype||type[i]==treeleavestype){
-                                                                       messedwith[i]-=multiplier;
-                                                                       if(rotxvel[i]||rotx[i]){
-                                                                               if(rotx[i]>0)rotxvel[i]-=multiplier*8*fabs(rotx[i]);
-                                                                               if(rotx[i]<0)rotxvel[i]+=multiplier*8*fabs(rotx[i]);
-                                                                               if(rotx[i]>0)rotxvel[i]-=multiplier*4;
-                                                                               if(rotx[i]<0)rotxvel[i]+=multiplier*4;
-                                                                               if(rotxvel[i]>0)rotxvel[i]-=multiplier*4;
-                                                                               if(rotxvel[i]<0)rotxvel[i]+=multiplier*4;
-                                                                               if(fabs(rotx[i])<multiplier*4)rotx[i]=0;
-                                                                               if(fabs(rotxvel[i])<multiplier*4)rotxvel[i]=0;
-
-                                                                               rotx[i]+=rotxvel[i]*multiplier*4;
-                                                                       }
-                                                                       if(rotyvel[i]||roty[i]){
-                                                                               if(roty[i]>0)rotyvel[i]-=multiplier*8*fabs(roty[i]);
-                                                                               if(roty[i]<0)rotyvel[i]+=multiplier*8*fabs(roty[i]);
-                                                                               if(roty[i]>0)rotyvel[i]-=multiplier*4;
-                                                                               if(roty[i]<0)rotyvel[i]+=multiplier*4;
-                                                                               if(rotyvel[i]>0)rotyvel[i]-=multiplier*4;
-                                                                               if(rotyvel[i]<0)rotyvel[i]+=multiplier*4;
-                                                                               if(fabs(roty[i])<multiplier*4)roty[i]=0;
-                                                                               if(fabs(rotyvel[i])<multiplier*4)rotyvel[i]=0;
-
-                                                                               roty[i]+=rotyvel[i]*multiplier*4;
-                                                                       }
-                                                                       if(roty[i]){
-                                                                               glRotatef(roty[i]/2,1,0,0);
-                                                                       }
-                                                                       if(rotx[i]){
-                                                                               glRotatef(-rotx[i]/2,0,0,1);
-                                                                       }
-                                                                       if(rotx[i]>10)rotx[i]=10;
-                                                                       if(rotx[i]<-10)rotx[i]=-10;
-                                                                       if(roty[i]>10)roty[i]=10;
-                                                                       if(roty[i]<-10)roty[i]=-10;
-                                                               }
-                                                               if(environment==snowyenvironment){
-                                                                       if(type[i]==treeleavestype){
-                                                                               glRotatef((sin(windvar+position[i].x*.3)+.5)*1.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
-                                                                       }
-                                                                       if(type[i]==treetrunktype){
-                                                                               glRotatef((sin(windvar+position[i].x*.3)+.5)*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
-                                                                       }
-                                                                       if(type[i]==bushtype){
-                                                                               glRotatef((sin(windvar+position[i].x*.3)+.5)*4*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
-                                                                       }
-                                                               }
-                                                               if(environment==grassyenvironment){
-                                                                       if(type[i]==treeleavestype){
-                                                                               glRotatef((sin(windvar+position[i].x*.3)+.5)*1.5*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
-                                                                       }
-                                                                       if(type[i]==treetrunktype){
-                                                                               glRotatef((sin(windvar+position[i].x*.3)+.5)*.5*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
-                                                                       }
-                                                                       if(type[i]==bushtype){
-                                                                               glRotatef((sin(windvar+position[i].x*.3)+.5)*4*.5*(sin(windvar*2+position[i].x*.3)+1)/2,1,0,0);
-                                                                       }
-                                                               }
-                                                               glRotatef(yaw[i],0,1,0);
-                                                               glColor4f(1,1,1,distance);
-                                                               if(type[i]==treeleavestype){
-                                                                       glDisable(GL_CULL_FACE);
-                                                                       glDisable(GL_LIGHTING);
-                                                                       terrainlight=terrain.getLighting(position[i].x,position[i].z);
-                                                                       glDepthMask(0);
-                                                                       glEnable(GL_BLEND);
-                                                                       glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,.3);
-                                                                       glAlphaFunc(GL_GREATER, 0);
-                                                                       glDisable(GL_ALPHA_TEST);
-                                                                       model[i].drawdifftex(treetextureptr);
-                                                               }
-                                                               if(type[i]==bushtype){
-                                                                       glDisable(GL_CULL_FACE);
-                                                                       glDisable(GL_LIGHTING);
-                                                                       terrainlight=terrain.getLighting(position[i].x,position[i].z);
-                                                                       glDepthMask(0);
-                                                                       glEnable(GL_BLEND);
-                                                                       glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,.3);
-                                                                       glAlphaFunc(GL_GREATER, 0);
-                                                                       glDisable(GL_ALPHA_TEST);
-                                                                       model[i].drawdifftex(bushtextureptr);
-                                                               }
-                                                       glPopMatrix();
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-       if(environment==desertenvironment)glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
-       glEnable(GL_ALPHA_TEST);                                                
-       SetUpLight(&light,0);
+    static float distance;
+    static int i, j;
+    static XYZ moved, terrainlight;
+    bool hidden;
+
+    for (i = 0; i < numobjects; i++) {
+        if (type[i] != firetype) {
+            moved = DoRotation(model[i].boundingspherecenter, 0, yaw[i], 0);
+            if (type[i] == tunneltype || frustum.SphereInFrustum(position[i].x + moved.x, position[i].y + moved.y, position[i].z + moved.z, model[i].boundingsphereradius)) {
+                distance = distsq(&viewer, &position[i]);
+                distance *= 1.2;
+                hidden = !(distsqflat(&viewer, &position[i]) > playerdist + 3 || (type[i] != bushtype && type[i] != treeleavestype));
+                if (!hidden) {
+
+                    if (detail == 2 && distance > viewdistance * viewdistance / 4 && environment == desertenvironment)glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, blurness );
+                    else glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
+                    distance = (viewdistance * viewdistance - (distance - (viewdistance * viewdistance * fadestart)) * (1 / (1 - fadestart))) / viewdistance / viewdistance;
+                    if (distance > 1)distance = 1;
+                    if (distance > 0) {
+
+                        /*if(checkcollide(viewer,DoRotation(model[i].vertex[model[i].vertexNum],0,yaw[i],0)*scale[i]+position[i],i)){
+                        occluded[i]+=1;
+                        }
+                        else occluded[i]=0;*/
+                        if (occluded[i] < 6) {
+                            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+                            glPushMatrix();
+                            if (!model[i].color)glEnable(GL_LIGHTING);
+                            else glDisable(GL_LIGHTING);
+                            glDepthMask(1);
+                            glTranslatef(position[i].x, position[i].y, position[i].z);
+                            if (type[i] == bushtype) {
+                                messedwith[i] -= multiplier;
+                                if (rotxvel[i] || rotx[i]) {
+                                    if (rotx[i] > 0)rotxvel[i] -= multiplier * 8 * fabs(rotx[i]);
+                                    if (rotx[i] < 0)rotxvel[i] += multiplier * 8 * fabs(rotx[i]);
+                                    if (rotx[i] > 0)rotxvel[i] -= multiplier * 4;
+                                    if (rotx[i] < 0)rotxvel[i] += multiplier * 4;
+                                    if (rotxvel[i] > 0)rotxvel[i] -= multiplier * 4;
+                                    if (rotxvel[i] < 0)rotxvel[i] += multiplier * 4;
+                                    if (fabs(rotx[i]) < multiplier * 4)rotx[i] = 0;
+                                    if (fabs(rotxvel[i]) < multiplier * 4)rotxvel[i] = 0;
+
+                                    rotx[i] += rotxvel[i] * multiplier * 4;
+                                }
+                                if (rotyvel[i] || roty[i]) {
+                                    if (roty[i] > 0)rotyvel[i] -= multiplier * 8 * fabs(roty[i]);
+                                    if (roty[i] < 0)rotyvel[i] += multiplier * 8 * fabs(roty[i]);
+                                    if (roty[i] > 0)rotyvel[i] -= multiplier * 4;
+                                    if (roty[i] < 0)rotyvel[i] += multiplier * 4;
+                                    if (rotyvel[i] > 0)rotyvel[i] -= multiplier * 4;
+                                    if (rotyvel[i] < 0)rotyvel[i] += multiplier * 4;
+                                    if (fabs(roty[i]) < multiplier * 4)roty[i] = 0;
+                                    if (fabs(rotyvel[i]) < multiplier * 4)rotyvel[i] = 0;
+
+                                    roty[i] += rotyvel[i] * multiplier * 4;
+                                }
+                                if (roty[i]) {
+                                    glRotatef(roty[i], 1, 0, 0);
+                                }
+                                if (rotx[i]) {
+                                    glRotatef(-rotx[i], 0, 0, 1);
+                                }
+                                if (rotx[i] > 10)rotx[i] = 10;
+                                if (rotx[i] < -10)rotx[i] = -10;
+                                if (roty[i] > 10)roty[i] = 10;
+                                if (roty[i] < -10)roty[i] = -10;
+                            }
+                            if (type[i] == treetrunktype || type[i] == treeleavestype) {
+                                if (type[i] == treetrunktype || environment == 2) {
+                                    messedwith[i] -= multiplier;
+                                    if (rotxvel[i] || rotx[i]) {
+                                        if (rotx[i] > 0)rotxvel[i] -= multiplier * 8 * fabs(rotx[i]);
+                                        if (rotx[i] < 0)rotxvel[i] += multiplier * 8 * fabs(rotx[i]);
+                                        if (rotx[i] > 0)rotxvel[i] -= multiplier * 4;
+                                        if (rotx[i] < 0)rotxvel[i] += multiplier * 4;
+                                        if (rotxvel[i] > 0)rotxvel[i] -= multiplier * 4;
+                                        if (rotxvel[i] < 0)rotxvel[i] += multiplier * 4;
+                                        if (fabs(rotx[i]) < multiplier * 4)rotx[i] = 0;
+                                        if (fabs(rotxvel[i]) < multiplier * 4)rotxvel[i] = 0;
+
+                                        rotx[i] += rotxvel[i] * multiplier * 4;
+                                    }
+                                    if (rotyvel[i] || roty[i]) {
+                                        if (roty[i] > 0)rotyvel[i] -= multiplier * 8 * fabs(roty[i]);
+                                        if (roty[i] < 0)rotyvel[i] += multiplier * 8 * fabs(roty[i]);
+                                        if (roty[i] > 0)rotyvel[i] -= multiplier * 4;
+                                        if (roty[i] < 0)rotyvel[i] += multiplier * 4;
+                                        if (rotyvel[i] > 0)rotyvel[i] -= multiplier * 4;
+                                        if (rotyvel[i] < 0)rotyvel[i] += multiplier * 4;
+                                        if (fabs(roty[i]) < multiplier * 4)roty[i] = 0;
+                                        if (fabs(rotyvel[i]) < multiplier * 4)rotyvel[i] = 0;
+
+                                        roty[i] += rotyvel[i] * multiplier * 4;
+                                    }
+                                    if (roty[i]) {
+                                        glRotatef(roty[i] / 6, 1, 0, 0);
+                                    }
+                                    if (rotx[i]) {
+                                        glRotatef(-rotx[i] / 6, 0, 0, 1);
+                                    }
+                                    if (rotx[i] > 10)rotx[i] = 10;
+                                    if (rotx[i] < -10)rotx[i] = -10;
+                                    if (roty[i] > 10)roty[i] = 10;
+                                    if (roty[i] < -10)roty[i] = -10;
+                                } else {
+                                    messedwith[i] -= multiplier;
+                                    if (rotxvel[i] || rotx[i]) {
+                                        if (rotx[i] > 0)rotxvel[i] -= multiplier * 8 * fabs(rotx[i]);
+                                        if (rotx[i] < 0)rotxvel[i] += multiplier * 8 * fabs(rotx[i]);
+                                        if (rotx[i] > 0)rotxvel[i] -= multiplier * 4;
+                                        if (rotx[i] < 0)rotxvel[i] += multiplier * 4;
+                                        if (rotxvel[i] > 0)rotxvel[i] -= multiplier * 4;
+                                        if (rotxvel[i] < 0)rotxvel[i] += multiplier * 4;
+                                        if (fabs(rotx[i]) < multiplier * 4)rotx[i] = 0;
+                                        if (fabs(rotxvel[i]) < multiplier * 4)rotxvel[i] = 0;
+
+                                        rotx[i] += rotxvel[i] * multiplier * 4;
+                                    }
+                                    if (rotyvel[i] || roty[i]) {
+                                        if (roty[i] > 0)rotyvel[i] -= multiplier * 8 * fabs(roty[i]);
+                                        if (roty[i] < 0)rotyvel[i] += multiplier * 8 * fabs(roty[i]);
+                                        if (roty[i] > 0)rotyvel[i] -= multiplier * 4;
+                                        if (roty[i] < 0)rotyvel[i] += multiplier * 4;
+                                        if (rotyvel[i] > 0)rotyvel[i] -= multiplier * 4;
+                                        if (rotyvel[i] < 0)rotyvel[i] += multiplier * 4;
+                                        if (fabs(roty[i]) < multiplier * 4)roty[i] = 0;
+                                        if (fabs(rotyvel[i]) < multiplier * 4)rotyvel[i] = 0;
+
+                                        roty[i] += rotyvel[i] * multiplier * 4;
+                                    }
+                                    if (roty[i]) {
+                                        glRotatef(roty[i] / 4, 1, 0, 0);
+                                    }
+                                    if (rotx[i]) {
+                                        glRotatef(-rotx[i] / 4, 0, 0, 1);
+                                    }
+                                    if (rotx[i] > 10)rotx[i] = 10;
+                                    if (rotx[i] < -10)rotx[i] = -10;
+                                    if (roty[i] > 10)roty[i] = 10;
+                                    if (roty[i] < -10)roty[i] = -10;
+                                }
+
+                            }
+                            if (/*detail==2&&*/environment == snowyenvironment) {
+                                if (type[i] == treeleavestype) {
+                                    glRotatef((sin(windvar + position[i].x * .3) + .5) * 1.5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+                                }
+                                if (type[i] == treetrunktype) {
+                                    glRotatef((sin(windvar + position[i].x * .3) + .5)*.5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+                                }
+                                if (type[i] == bushtype) {
+                                    glRotatef((sin(windvar + position[i].x * .3) + .5) * 4 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+                                }
+                            }
+                            if (/*detail==2&&*/environment == grassyenvironment) {
+                                if (type[i] == treeleavestype) {
+                                    glRotatef((sin(windvar + position[i].x * .3) + .5) * 1.5 * .5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+                                }
+                                if (type[i] == treetrunktype) {
+                                    glRotatef((sin(windvar + position[i].x * .3) + .5)*.5 * .5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+                                }
+                                if (type[i] == bushtype) {
+                                    glRotatef((sin(windvar + position[i].x * .3) + .5) * 4 * .5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+                                }
+                            }
+                            if (/*detail==2&&*/environment == desertenvironment) {
+                                if (type[i] == bushtype) {
+                                    glRotatef((sin(windvar + position[i].x * .3) + .5) * 4 * .5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+                                }
+                            }
+                            glRotatef(yaw[i], 0, 1, 0);
+                            if (distance > 1)distance = 1;
+                            glColor4f((1 - shadowed[i]) / 2 + .5, (1 - shadowed[i]) / 2 + .5, (1 - shadowed[i]) / 2 + .5, distance);
+                            if (distance >= 1) {
+                                glDisable(GL_BLEND);
+                                glAlphaFunc(GL_GREATER, 0.5);
+                            }
+                            if (distance < 1) {
+                                glEnable(GL_BLEND);
+                                glAlphaFunc(GL_GREATER, 0.1);
+                            }
+                            if (type[i] != treetrunktype && type[i] != treeleavestype && type[i] != bushtype && type[i] != rocktype) {
+                                glEnable(GL_CULL_FACE);
+                                glAlphaFunc(GL_GREATER, 0.0001);
+                                model[i].drawdifftex(boxtextureptr);
+                                model[i].drawdecals(terrain.shadowtexture, terrain.bloodtexture, terrain.bloodtexture2, terrain.breaktexture);
+                            }
+                            if (type[i] == rocktype) {
+                                glEnable(GL_CULL_FACE);
+                                glAlphaFunc(GL_GREATER, 0.0001);
+                                glColor4f((1 - shadowed[i]) / 2 + light.ambient[0], (1 - shadowed[i]) / 2 + light.ambient[1], (1 - shadowed[i]) / 2 + light.ambient[2], distance);
+                                model[i].drawdifftex(rocktextureptr);
+                                model[i].drawdecals(terrain.shadowtexture, terrain.bloodtexture, terrain.bloodtexture2, terrain.breaktexture);
+                            }
+                            if (type[i] == treeleavestype) {
+                                glDisable(GL_CULL_FACE);
+                                glDisable(GL_LIGHTING);
+                                terrainlight = terrain.getLighting(position[i].x, position[i].z);
+                                if (!hidden) {
+                                    glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, distance);
+                                    if (distance < 1)glAlphaFunc(GL_GREATER, 0.2);
+                                }
+                                if (hidden) {
+                                    glDepthMask(0);
+                                    glEnable(GL_BLEND);
+                                    glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, distance / 3);
+                                    glAlphaFunc(GL_GREATER, 0);
+                                }
+                                model[i].drawdifftex(treetextureptr);
+                            }
+                            if (type[i] == bushtype) {
+                                glDisable(GL_CULL_FACE);
+                                glDisable(GL_LIGHTING);
+                                terrainlight = terrain.getLighting(position[i].x, position[i].z);
+                                if (!hidden) {
+                                    glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, distance);
+                                    if (distance < 1)glAlphaFunc(GL_GREATER, 0.2);
+                                }
+                                if (hidden) {
+                                    glDepthMask(0);
+                                    glEnable(GL_BLEND);
+                                    glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, distance / 3);
+                                    glAlphaFunc(GL_GREATER, 0);
+                                }
+                                model[i].drawdifftex(bushtextureptr);
+                            }
+                            if (type[i] == treetrunktype) {
+                                glEnable(GL_CULL_FACE);
+                                terrainlight = terrain.getLighting(position[i].x, position[i].z);
+                                glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, distance);
+                                model[i].drawdifftex(treetextureptr);
+                            }
+                            glPopMatrix();
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
+    for (i = 0; i < numobjects; i++) {
+        if (type[i] == treeleavestype || type[i] == bushtype) {
+            moved = DoRotation(model[i].boundingspherecenter, 0, yaw[i], 0);
+            if (frustum.SphereInFrustum(position[i].x + moved.x, position[i].y + moved.y, position[i].z + moved.z, model[i].boundingsphereradius)) {
+                hidden = distsqflat(&viewer, &position[i]) <= playerdist + 3;
+                if (hidden) {
+                    distance = 1;
+                    if (distance > 0) {
+                        if (1 == 1 || occluded[i] < 6) {
+                            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+                            glPushMatrix();
+                            glEnable(GL_LIGHTING);
+                            glDepthMask(1);
+                            glTranslatef(position[i].x, position[i].y, position[i].z);
+                            if (type[i] == bushtype) {
+                                messedwith[i] -= multiplier;
+                                if (rotxvel[i] || rotx[i]) {
+                                    if (rotx[i] > 0)rotxvel[i] -= multiplier * 8 * fabs(rotx[i]);
+                                    if (rotx[i] < 0)rotxvel[i] += multiplier * 8 * fabs(rotx[i]);
+                                    if (rotx[i] > 0)rotxvel[i] -= multiplier * 4;
+                                    if (rotx[i] < 0)rotxvel[i] += multiplier * 4;
+                                    if (rotxvel[i] > 0)rotxvel[i] -= multiplier * 4;
+                                    if (rotxvel[i] < 0)rotxvel[i] += multiplier * 4;
+                                    if (fabs(rotx[i]) < multiplier * 4)rotx[i] = 0;
+                                    if (fabs(rotxvel[i]) < multiplier * 4)rotxvel[i] = 0;
+
+                                    rotx[i] += rotxvel[i] * multiplier * 4;
+                                }
+                                if (rotyvel[i] || roty[i]) {
+                                    if (roty[i] > 0)rotyvel[i] -= multiplier * 8 * fabs(roty[i]);
+                                    if (roty[i] < 0)rotyvel[i] += multiplier * 8 * fabs(roty[i]);
+                                    if (roty[i] > 0)rotyvel[i] -= multiplier * 4;
+                                    if (roty[i] < 0)rotyvel[i] += multiplier * 4;
+                                    if (rotyvel[i] > 0)rotyvel[i] -= multiplier * 4;
+                                    if (rotyvel[i] < 0)rotyvel[i] += multiplier * 4;
+                                    if (fabs(roty[i]) < multiplier * 4)roty[i] = 0;
+                                    if (fabs(rotyvel[i]) < multiplier * 4)rotyvel[i] = 0;
+
+                                    roty[i] += rotyvel[i] * multiplier * 4;
+                                }
+                                if (roty[i]) {
+                                    glRotatef(roty[i], 1, 0, 0);
+                                }
+                                if (rotx[i]) {
+                                    glRotatef(-rotx[i], 0, 0, 1);
+                                }
+                                if (rotx[i] > 10)rotx[i] = 10;
+                                if (rotx[i] < -10)rotx[i] = -10;
+                                if (roty[i] > 10)roty[i] = 10;
+                                if (roty[i] < -10)roty[i] = -10;
+                            }
+                            if (type[i] == treetrunktype || type[i] == treeleavestype) {
+                                messedwith[i] -= multiplier;
+                                if (rotxvel[i] || rotx[i]) {
+                                    if (rotx[i] > 0)rotxvel[i] -= multiplier * 8 * fabs(rotx[i]);
+                                    if (rotx[i] < 0)rotxvel[i] += multiplier * 8 * fabs(rotx[i]);
+                                    if (rotx[i] > 0)rotxvel[i] -= multiplier * 4;
+                                    if (rotx[i] < 0)rotxvel[i] += multiplier * 4;
+                                    if (rotxvel[i] > 0)rotxvel[i] -= multiplier * 4;
+                                    if (rotxvel[i] < 0)rotxvel[i] += multiplier * 4;
+                                    if (fabs(rotx[i]) < multiplier * 4)rotx[i] = 0;
+                                    if (fabs(rotxvel[i]) < multiplier * 4)rotxvel[i] = 0;
+
+                                    rotx[i] += rotxvel[i] * multiplier * 4;
+                                }
+                                if (rotyvel[i] || roty[i]) {
+                                    if (roty[i] > 0)rotyvel[i] -= multiplier * 8 * fabs(roty[i]);
+                                    if (roty[i] < 0)rotyvel[i] += multiplier * 8 * fabs(roty[i]);
+                                    if (roty[i] > 0)rotyvel[i] -= multiplier * 4;
+                                    if (roty[i] < 0)rotyvel[i] += multiplier * 4;
+                                    if (rotyvel[i] > 0)rotyvel[i] -= multiplier * 4;
+                                    if (rotyvel[i] < 0)rotyvel[i] += multiplier * 4;
+                                    if (fabs(roty[i]) < multiplier * 4)roty[i] = 0;
+                                    if (fabs(rotyvel[i]) < multiplier * 4)rotyvel[i] = 0;
+
+                                    roty[i] += rotyvel[i] * multiplier * 4;
+                                }
+                                if (roty[i]) {
+                                    glRotatef(roty[i] / 2, 1, 0, 0);
+                                }
+                                if (rotx[i]) {
+                                    glRotatef(-rotx[i] / 2, 0, 0, 1);
+                                }
+                                if (rotx[i] > 10)rotx[i] = 10;
+                                if (rotx[i] < -10)rotx[i] = -10;
+                                if (roty[i] > 10)roty[i] = 10;
+                                if (roty[i] < -10)roty[i] = -10;
+                            }
+                            if (environment == snowyenvironment) {
+                                if (type[i] == treeleavestype) {
+                                    glRotatef((sin(windvar + position[i].x * .3) + .5) * 1.5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+                                }
+                                if (type[i] == treetrunktype) {
+                                    glRotatef((sin(windvar + position[i].x * .3) + .5)*.5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+                                }
+                                if (type[i] == bushtype) {
+                                    glRotatef((sin(windvar + position[i].x * .3) + .5) * 4 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+                                }
+                            }
+                            if (environment == grassyenvironment) {
+                                if (type[i] == treeleavestype) {
+                                    glRotatef((sin(windvar + position[i].x * .3) + .5) * 1.5 * .5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+                                }
+                                if (type[i] == treetrunktype) {
+                                    glRotatef((sin(windvar + position[i].x * .3) + .5)*.5 * .5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+                                }
+                                if (type[i] == bushtype) {
+                                    glRotatef((sin(windvar + position[i].x * .3) + .5) * 4 * .5 * (sin(windvar * 2 + position[i].x * .3) + 1) / 2, 1, 0, 0);
+                                }
+                            }
+                            glRotatef(yaw[i], 0, 1, 0);
+                            glColor4f(1, 1, 1, distance);
+                            if (type[i] == treeleavestype) {
+                                glDisable(GL_CULL_FACE);
+                                glDisable(GL_LIGHTING);
+                                terrainlight = terrain.getLighting(position[i].x, position[i].z);
+                                glDepthMask(0);
+                                glEnable(GL_BLEND);
+                                glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, .3);
+                                glAlphaFunc(GL_GREATER, 0);
+                                glDisable(GL_ALPHA_TEST);
+                                model[i].drawdifftex(treetextureptr);
+                            }
+                            if (type[i] == bushtype) {
+                                glDisable(GL_CULL_FACE);
+                                glDisable(GL_LIGHTING);
+                                terrainlight = terrain.getLighting(position[i].x, position[i].z);
+                                glDepthMask(0);
+                                glEnable(GL_BLEND);
+                                glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, .3);
+                                glAlphaFunc(GL_GREATER, 0);
+                                glDisable(GL_ALPHA_TEST);
+                                model[i].drawdifftex(bushtextureptr);
+                            }
+                            glPopMatrix();
+                        }
+                    }
+                }
+            }
+        }
+    }
+    if (environment == desertenvironment)glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
+    glEnable(GL_ALPHA_TEST);
+    SetUpLight(&light, 0);
 }
 
 void Objects::DeleteObject(int which)
 {
-       type[numobjects-1]=0;
-       yaw[numobjects-1]=0;
-       position[numobjects-1]=0;
-       scale[numobjects-1]=0;
-       friction[numobjects-1]=0;
+    type[numobjects - 1] = 0;
+    yaw[numobjects - 1] = 0;
+    position[numobjects - 1] = 0;
+    scale[numobjects - 1] = 0;
+    friction[numobjects - 1] = 0;
 
-       numobjects--;
+    numobjects--;
 }
 
-void Objects::MakeObject(int atype, XYZ where, float ayaw, float ascale){
-       if((atype!=treeleavestype&&atype!=bushtype)||foliage==1){
-               scale[numobjects]=ascale;
-               if(atype==treeleavestype)scale[numobjects]+=fabs((float)(Random()%100)/900)*ascale;
-
-               onfire[numobjects]=0;
-               flamedelay[numobjects]=0;
-               type[numobjects]=atype;
-
-               if(atype==firetype)onfire[numobjects]=1;
-
-               position[numobjects]=where;
-               if(atype==bushtype)position[numobjects].y=terrain.getHeight(position[numobjects].x,position[numobjects].z)-.3;
-               yaw[numobjects]=ayaw;
-
-               rotxvel[numobjects]=0;
-               rotyvel[numobjects]=0;
-               rotx[numobjects]=0;
-               roty[numobjects]=0;
-
-               if(atype==boxtype)model[numobjects].loaddecal((char *)":Data:Models:Box.solid",0);
-               if(atype==cooltype)model[numobjects].loaddecal((char *)":Data:Models:Cool.solid",0);
-               if(atype==walltype)model[numobjects].loaddecal((char *)":Data:Models:Wall.solid",0);
-               if(atype==tunneltype)model[numobjects].loaddecal((char *)":Data:Models:Tunnel.solid",0);
-               if(atype==chimneytype)model[numobjects].loaddecal((char *)":Data:Models:Chimney.solid",0);
-               if(atype==spiketype)model[numobjects].load((char *)":Data:Models:Spike.solid",0);
-               if(atype==weirdtype)model[numobjects].loaddecal((char *)":Data:Models:Weird.solid",0);
-               if(atype==rocktype)model[numobjects].loaddecal((char *)":Data:Models:Rock.solid",0);
-               if(atype==treetrunktype)model[numobjects].load((char *)":Data:Models:Treetrunk.solid",0);
-               if(atype==treeleavestype)model[numobjects].load((char *)":Data:Models:Leaves.solid",0);
-               if(atype==bushtype)model[numobjects].load((char *)":Data:Models:Bush.solid",0);
-
-               if(atype==boxtype)friction[numobjects]=1.5;
-               if(atype==cooltype)friction[numobjects]=1.5;
-               if(atype==walltype)friction[numobjects]=1.5;
-               if(atype==platformtype)friction[numobjects]=1.5;
-               if(atype==tunneltype)friction[numobjects]=1.5;
-               if(atype==chimneytype)friction[numobjects]=1.5;
-               if(atype==rocktype)friction[numobjects]=.5;
-               if(atype==rocktype&&ascale>.5)friction[numobjects]=1.5;
-               if(atype==weirdtype)friction[numobjects]=1.5;
-               if(atype==spiketype)friction[numobjects]=.4;
-               if(atype==treetrunktype)friction[numobjects]=.4;
-               if(atype==treeleavestype)friction[numobjects]=0;
-
-               if(atype==platformtype){
-                       model[numobjects].loaddecal((char *)":Data:Models:Platform.solid",0);
-                       model[numobjects].Rotate(90,0,0);
-               }
-
-               if(type[numobjects]==boxtype||type[numobjects]==cooltype||type[numobjects]==spiketype||type[numobjects]==weirdtype||type[numobjects]==walltype||type[numobjects]==chimneytype||type[numobjects]==tunneltype||type[numobjects]==platformtype){
-                       model[numobjects].ScaleTexCoords(scale[numobjects]*1.5);
-               }
-               if(type[numobjects]==rocktype){
-                       model[numobjects].ScaleTexCoords(scale[numobjects]*3);
-               }
-               model[numobjects].flat=1;
-               if(atype==treetrunktype||atype==treeleavestype||atype==rocktype){
-                       model[numobjects].flat=0;
-               }
-               model[numobjects].Scale(.3*scale[numobjects],.3*scale[numobjects],.3*scale[numobjects]);
-               model[numobjects].Rotate(90,1,1);
-               if(type[numobjects]==rocktype){
-                       model[numobjects].Rotate(ayaw*5,1,1);
-               }
-               model[numobjects].CalculateNormals(1);
-               model[numobjects].ScaleNormals(-1,-1,-1);
-
-               if(atype==treetrunktype&&position[numobjects].y<terrain.getHeight(position[numobjects].x,position[numobjects].z)+1){
-                       if(detail==2)terrain.MakeDecal(shadowdecalpermanent,position[numobjects],2,.4,0);
-               }       
-
-               if(atype==bushtype&&position[numobjects].y<terrain.getHeight(position[numobjects].x,position[numobjects].z)+1){
-                       if(detail==2)terrain.MakeDecal(shadowdecalpermanent,position[numobjects],1,.4,0);
-               }
-
-               if(atype!=treeleavestype&&atype!=bushtype&&atype!=firetype)
-                       terrain.AddObject(where+DoRotation(model[numobjects].boundingspherecenter,0,ayaw,0),model[numobjects].boundingsphereradius,numobjects);
-
-               numobjects++;
-       }       
+void Objects::MakeObject(int atype, XYZ where, float ayaw, float ascale)
+{
+    if ((atype != treeleavestype && atype != bushtype) || foliage == 1) {
+        scale[numobjects] = ascale;
+        if (atype == treeleavestype)scale[numobjects] += fabs((float)(Random() % 100) / 900) * ascale;
+
+        onfire[numobjects] = 0;
+        flamedelay[numobjects] = 0;
+        type[numobjects] = atype;
+
+        if (atype == firetype)onfire[numobjects] = 1;
+
+        position[numobjects] = where;
+        if (atype == bushtype)position[numobjects].y = terrain.getHeight(position[numobjects].x, position[numobjects].z) - .3;
+        yaw[numobjects] = ayaw;
+
+        rotxvel[numobjects] = 0;
+        rotyvel[numobjects] = 0;
+        rotx[numobjects] = 0;
+        roty[numobjects] = 0;
+
+        if (atype == boxtype)model[numobjects].loaddecal((char *)":Data:Models:Box.solid", 0);
+        if (atype == cooltype)model[numobjects].loaddecal((char *)":Data:Models:Cool.solid", 0);
+        if (atype == walltype)model[numobjects].loaddecal((char *)":Data:Models:Wall.solid", 0);
+        if (atype == tunneltype)model[numobjects].loaddecal((char *)":Data:Models:Tunnel.solid", 0);
+        if (atype == chimneytype)model[numobjects].loaddecal((char *)":Data:Models:Chimney.solid", 0);
+        if (atype == spiketype)model[numobjects].load((char *)":Data:Models:Spike.solid", 0);
+        if (atype == weirdtype)model[numobjects].loaddecal((char *)":Data:Models:Weird.solid", 0);
+        if (atype == rocktype)model[numobjects].loaddecal((char *)":Data:Models:Rock.solid", 0);
+        if (atype == treetrunktype)model[numobjects].load((char *)":Data:Models:Treetrunk.solid", 0);
+        if (atype == treeleavestype)model[numobjects].load((char *)":Data:Models:Leaves.solid", 0);
+        if (atype == bushtype)model[numobjects].load((char *)":Data:Models:Bush.solid", 0);
+
+        if (atype == boxtype)friction[numobjects] = 1.5;
+        if (atype == cooltype)friction[numobjects] = 1.5;
+        if (atype == walltype)friction[numobjects] = 1.5;
+        if (atype == platformtype)friction[numobjects] = 1.5;
+        if (atype == tunneltype)friction[numobjects] = 1.5;
+        if (atype == chimneytype)friction[numobjects] = 1.5;
+        if (atype == rocktype)friction[numobjects] = .5;
+        if (atype == rocktype && ascale > .5)friction[numobjects] = 1.5;
+        if (atype == weirdtype)friction[numobjects] = 1.5;
+        if (atype == spiketype)friction[numobjects] = .4;
+        if (atype == treetrunktype)friction[numobjects] = .4;
+        if (atype == treeleavestype)friction[numobjects] = 0;
+
+        if (atype == platformtype) {
+            model[numobjects].loaddecal((char *)":Data:Models:Platform.solid", 0);
+            model[numobjects].Rotate(90, 0, 0);
+        }
+
+        if (type[numobjects] == boxtype || type[numobjects] == cooltype || type[numobjects] == spiketype || type[numobjects] == weirdtype || type[numobjects] == walltype || type[numobjects] == chimneytype || type[numobjects] == tunneltype || type[numobjects] == platformtype) {
+            model[numobjects].ScaleTexCoords(scale[numobjects] * 1.5);
+        }
+        if (type[numobjects] == rocktype) {
+            model[numobjects].ScaleTexCoords(scale[numobjects] * 3);
+        }
+        model[numobjects].flat = 1;
+        if (atype == treetrunktype || atype == treeleavestype || atype == rocktype) {
+            model[numobjects].flat = 0;
+        }
+        model[numobjects].Scale(.3 * scale[numobjects], .3 * scale[numobjects], .3 * scale[numobjects]);
+        model[numobjects].Rotate(90, 1, 1);
+        if (type[numobjects] == rocktype) {
+            model[numobjects].Rotate(ayaw * 5, 1, 1);
+        }
+        model[numobjects].CalculateNormals(1);
+        model[numobjects].ScaleNormals(-1, -1, -1);
+
+        if (atype == treetrunktype && position[numobjects].y < terrain.getHeight(position[numobjects].x, position[numobjects].z) + 1) {
+            if (detail == 2)terrain.MakeDecal(shadowdecalpermanent, position[numobjects], 2, .4, 0);
+        }
+
+        if (atype == bushtype && position[numobjects].y < terrain.getHeight(position[numobjects].x, position[numobjects].z) + 1) {
+            if (detail == 2)terrain.MakeDecal(shadowdecalpermanent, position[numobjects], 1, .4, 0);
+        }
+
+        if (atype != treeleavestype && atype != bushtype && atype != firetype)
+            terrain.AddObject(where + DoRotation(model[numobjects].boundingspherecenter, 0, ayaw, 0), model[numobjects].boundingsphereradius, numobjects);
+
+        numobjects++;
+    }
 }
 
-void Objects::MakeObject(int atype, XYZ where, float ayaw, float apitch, float ascale){
-       if((atype!=treeleavestype&&atype!=bushtype)||foliage==1){
-               scale[numobjects]=ascale;
-               if(atype==treeleavestype)scale[numobjects]+=fabs((float)(Random()%100)/900)*ascale;
-
-               onfire[numobjects]=0;
-               flamedelay[numobjects]=0;
-               type[numobjects]=atype;
-
-               if(atype==firetype)onfire[numobjects]=1;
-
-               position[numobjects]=where;
-               if(atype==bushtype)position[numobjects].y=terrain.getHeight(position[numobjects].x,position[numobjects].z)-.3;
-               /*if(atype==firetype){
-               if(position[numobjects].y<terrain.getHeight(position[numobjects].x,position[numobjects].z)-.3)
-               position[numobjects].y=terrain.getHeight(position[numobjects].x,position[numobjects].z)-.3;
-               }*/
-               yaw[numobjects]=ayaw;
-               pitch[numobjects]=apitch;
-
-               rotxvel[numobjects]=0;
-               rotyvel[numobjects]=0;
-               rotx[numobjects]=0;
-               roty[numobjects]=0;
-
-               if(atype==boxtype)model[numobjects].loaddecal((char *)":Data:Models:Box.solid",0);
-               if(atype==cooltype)model[numobjects].loaddecal((char *)":Data:Models:Cool.solid",0);
-               if(atype==walltype)model[numobjects].loaddecal((char *)":Data:Models:Wall.solid",0);
-               if(atype==tunneltype)model[numobjects].loaddecal((char *)":Data:Models:Tunnel.solid",0);
-               if(atype==chimneytype)model[numobjects].loaddecal((char *)":Data:Models:Chimney.solid",0);
-               if(atype==spiketype)model[numobjects].load((char *)":Data:Models:Spike.solid",0);
-               if(atype==weirdtype)model[numobjects].loaddecal((char *)":Data:Models:Weird.solid",0);
-               if(atype==rocktype)model[numobjects].loaddecal((char *)":Data:Models:Rock.solid",0);
-               if(atype==treetrunktype)model[numobjects].load((char *)":Data:Models:Treetrunk.solid",0);
-               if(atype==treeleavestype)model[numobjects].load((char *)":Data:Models:Leaves.solid",0);
-               if(atype==bushtype)model[numobjects].load((char *)":Data:Models:Bush.solid",0);
-
-               if(atype==boxtype)friction[numobjects]=1.5;
-               if(atype==cooltype)friction[numobjects]=1.5;
-               if(atype==walltype)friction[numobjects]=1.5;
-               if(atype==platformtype)friction[numobjects]=1.5;
-               if(atype==tunneltype)friction[numobjects]=1.5;
-               if(atype==chimneytype)friction[numobjects]=1.5;
-               if(atype==rocktype)friction[numobjects]=.5;
-               if(atype==rocktype&&ascale>.5)friction[numobjects]=1.5;
-               if(atype==weirdtype)friction[numobjects]=1.5;
-               if(atype==spiketype)friction[numobjects]=.4;
-               if(atype==treetrunktype)friction[numobjects]=.4;
-               if(atype==treeleavestype)friction[numobjects]=0;
-
-               if(friction[numobjects]==1.5&&fabs(apitch)>5)friction[numobjects]=.5;
-
-               if(atype==platformtype){
-                       model[numobjects].loaddecal((char *)":Data:Models:Platform.solid",0);
-                       model[numobjects].Rotate(90,0,0);
-               }
-
-               if(type[numobjects]==boxtype||type[numobjects]==cooltype||type[numobjects]==spiketype||type[numobjects]==weirdtype||type[numobjects]==walltype||type[numobjects]==chimneytype||type[numobjects]==tunneltype||type[numobjects]==platformtype){
-                       model[numobjects].ScaleTexCoords(scale[numobjects]*1.5);
-               }
-               if(type[numobjects]==rocktype){
-                       model[numobjects].ScaleTexCoords(scale[numobjects]*3);
-               }
-               model[numobjects].flat=1;
-               if(atype==treetrunktype||atype==treeleavestype||atype==rocktype){
-                       model[numobjects].flat=0;
-               }
-               model[numobjects].Scale(.3*scale[numobjects],.3*scale[numobjects],.3*scale[numobjects]);
-               model[numobjects].Rotate(90,1,1);
-               model[numobjects].Rotate(apitch,0,0);
-               if(type[numobjects]==rocktype){
-                       model[numobjects].Rotate(ayaw*5,0,0);
-               }
-               model[numobjects].CalculateNormals(1);
-               model[numobjects].ScaleNormals(-1,-1,-1);
-
-               if(atype==treetrunktype&&position[numobjects].y<terrain.getHeight(position[numobjects].x,position[numobjects].z)+1){
-                       if(detail==2)terrain.MakeDecal(shadowdecalpermanent,position[numobjects],2,.4,0);
-               }       
-
-               if(atype==bushtype&&position[numobjects].y<terrain.getHeight(position[numobjects].x,position[numobjects].z)+1){
-                       if(detail==2)terrain.MakeDecal(shadowdecalpermanent,position[numobjects],1,.4,0);
-               }
-
-               if(atype!=treeleavestype&&atype!=bushtype&&atype!=firetype)
-                       terrain.AddObject(where+DoRotation(model[numobjects].boundingspherecenter,0,ayaw,0),model[numobjects].boundingsphereradius,numobjects);
-
-               numobjects++;
-       }       
+void Objects::MakeObject(int atype, XYZ where, float ayaw, float apitch, float ascale)
+{
+    if ((atype != treeleavestype && atype != bushtype) || foliage == 1) {
+        scale[numobjects] = ascale;
+        if (atype == treeleavestype)scale[numobjects] += fabs((float)(Random() % 100) / 900) * ascale;
+
+        onfire[numobjects] = 0;
+        flamedelay[numobjects] = 0;
+        type[numobjects] = atype;
+
+        if (atype == firetype)onfire[numobjects] = 1;
+
+        position[numobjects] = where;
+        if (atype == bushtype)position[numobjects].y = terrain.getHeight(position[numobjects].x, position[numobjects].z) - .3;
+        /*if(atype==firetype){
+        if(position[numobjects].y<terrain.getHeight(position[numobjects].x,position[numobjects].z)-.3)
+        position[numobjects].y=terrain.getHeight(position[numobjects].x,position[numobjects].z)-.3;
+        }*/
+        yaw[numobjects] = ayaw;
+        pitch[numobjects] = apitch;
+
+        rotxvel[numobjects] = 0;
+        rotyvel[numobjects] = 0;
+        rotx[numobjects] = 0;
+        roty[numobjects] = 0;
+
+        if (atype == boxtype)model[numobjects].loaddecal((char *)":Data:Models:Box.solid", 0);
+        if (atype == cooltype)model[numobjects].loaddecal((char *)":Data:Models:Cool.solid", 0);
+        if (atype == walltype)model[numobjects].loaddecal((char *)":Data:Models:Wall.solid", 0);
+        if (atype == tunneltype)model[numobjects].loaddecal((char *)":Data:Models:Tunnel.solid", 0);
+        if (atype == chimneytype)model[numobjects].loaddecal((char *)":Data:Models:Chimney.solid", 0);
+        if (atype == spiketype)model[numobjects].load((char *)":Data:Models:Spike.solid", 0);
+        if (atype == weirdtype)model[numobjects].loaddecal((char *)":Data:Models:Weird.solid", 0);
+        if (atype == rocktype)model[numobjects].loaddecal((char *)":Data:Models:Rock.solid", 0);
+        if (atype == treetrunktype)model[numobjects].load((char *)":Data:Models:Treetrunk.solid", 0);
+        if (atype == treeleavestype)model[numobjects].load((char *)":Data:Models:Leaves.solid", 0);
+        if (atype == bushtype)model[numobjects].load((char *)":Data:Models:Bush.solid", 0);
+
+        if (atype == boxtype)friction[numobjects] = 1.5;
+        if (atype == cooltype)friction[numobjects] = 1.5;
+        if (atype == walltype)friction[numobjects] = 1.5;
+        if (atype == platformtype)friction[numobjects] = 1.5;
+        if (atype == tunneltype)friction[numobjects] = 1.5;
+        if (atype == chimneytype)friction[numobjects] = 1.5;
+        if (atype == rocktype)friction[numobjects] = .5;
+        if (atype == rocktype && ascale > .5)friction[numobjects] = 1.5;
+        if (atype == weirdtype)friction[numobjects] = 1.5;
+        if (atype == spiketype)friction[numobjects] = .4;
+        if (atype == treetrunktype)friction[numobjects] = .4;
+        if (atype == treeleavestype)friction[numobjects] = 0;
+
+        if (friction[numobjects] == 1.5 && fabs(apitch) > 5)friction[numobjects] = .5;
+
+        if (atype == platformtype) {
+            model[numobjects].loaddecal((char *)":Data:Models:Platform.solid", 0);
+            model[numobjects].Rotate(90, 0, 0);
+        }
+
+        if (type[numobjects] == boxtype || type[numobjects] == cooltype || type[numobjects] == spiketype || type[numobjects] == weirdtype || type[numobjects] == walltype || type[numobjects] == chimneytype || type[numobjects] == tunneltype || type[numobjects] == platformtype) {
+            model[numobjects].ScaleTexCoords(scale[numobjects] * 1.5);
+        }
+        if (type[numobjects] == rocktype) {
+            model[numobjects].ScaleTexCoords(scale[numobjects] * 3);
+        }
+        model[numobjects].flat = 1;
+        if (atype == treetrunktype || atype == treeleavestype || atype == rocktype) {
+            model[numobjects].flat = 0;
+        }
+        model[numobjects].Scale(.3 * scale[numobjects], .3 * scale[numobjects], .3 * scale[numobjects]);
+        model[numobjects].Rotate(90, 1, 1);
+        model[numobjects].Rotate(apitch, 0, 0);
+        if (type[numobjects] == rocktype) {
+            model[numobjects].Rotate(ayaw * 5, 0, 0);
+        }
+        model[numobjects].CalculateNormals(1);
+        model[numobjects].ScaleNormals(-1, -1, -1);
+
+        if (atype == treetrunktype && position[numobjects].y < terrain.getHeight(position[numobjects].x, position[numobjects].z) + 1) {
+            if (detail == 2)terrain.MakeDecal(shadowdecalpermanent, position[numobjects], 2, .4, 0);
+        }
+
+        if (atype == bushtype && position[numobjects].y < terrain.getHeight(position[numobjects].x, position[numobjects].z) + 1) {
+            if (detail == 2)terrain.MakeDecal(shadowdecalpermanent, position[numobjects], 1, .4, 0);
+        }
+
+        if (atype != treeleavestype && atype != bushtype && atype != firetype)
+            terrain.AddObject(where + DoRotation(model[numobjects].boundingspherecenter, 0, ayaw, 0), model[numobjects].boundingsphereradius, numobjects);
+
+        numobjects++;
+    }
 }
 
 void Objects::DoStuff()
 {
-       XYZ spawnpoint;
-       for(int i=0;i<numobjects;i++){
-               /*if(type[i]==firetype){
-               Sprite::MakeSprite(weaponshinesprite, position[i],position[i]*0, 1,1,1, 5, 1);
-               }*/
-
-               if(type[i]==firetype)onfire[i]=1;
-               if(onfire[i]){
-                       if(type[i]==bushtype)flamedelay[i]-=multiplier*3;
-                       if(type[i]==firetype)flamedelay[i]-=multiplier*3;
-                       if(type[i]==treeleavestype)flamedelay[i]-=multiplier*4;
-                       while(flamedelay[i]<0&&onfire[i]){
-                               flamedelay[i]+=.006;
-                               if(type[i]==bushtype||type[i]==firetype){
-                                       spawnpoint.x=((float)(Random()%100))/30*scale[i];
-                                       spawnpoint.y=((float)(Random()%100)+60)/30*scale[i];
-                                       spawnpoint.z=0;
-                                       spawnpoint=DoRotation(spawnpoint,0,Random()%360,0);
-                                       spawnpoint+=position[i];
-                                       Sprite::MakeSprite(flamesprite, spawnpoint,spawnpoint*0, 1,1,1, (.6+(float)abs(Random()%100)/200-.25)*5*scale[i], 1);
-                               }
-                               if(type[i]==treeleavestype){
-                                       spawnpoint.x=((float)(Random()%100))/80*scale[i];
-                                       spawnpoint.y=((float)(Random()%100)+80)/12*scale[i];
-                                       spawnpoint.z=0;
-                                       spawnpoint=DoRotation(spawnpoint,0,Random()%360,0);
-                                       spawnpoint+=position[i];
-                                       Sprite::MakeSprite(flamesprite, spawnpoint,spawnpoint*0, 1,1,1, (.6+(float)abs(Random()%100)/200-.25)*6, 1);
-                               }
-                       }
-
-               }
-       }
+    XYZ spawnpoint;
+    for (int i = 0; i < numobjects; i++) {
+        /*if(type[i]==firetype){
+        Sprite::MakeSprite(weaponshinesprite, position[i],position[i]*0, 1,1,1, 5, 1);
+        }*/
+
+        if (type[i] == firetype)onfire[i] = 1;
+        if (onfire[i]) {
+            if (type[i] == bushtype)flamedelay[i] -= multiplier * 3;
+            if (type[i] == firetype)flamedelay[i] -= multiplier * 3;
+            if (type[i] == treeleavestype)flamedelay[i] -= multiplier * 4;
+            while (flamedelay[i] < 0 && onfire[i]) {
+                flamedelay[i] += .006;
+                if (type[i] == bushtype || type[i] == firetype) {
+                    spawnpoint.x = ((float)(Random() % 100)) / 30 * scale[i];
+                    spawnpoint.y = ((float)(Random() % 100) + 60) / 30 * scale[i];
+                    spawnpoint.z = 0;
+                    spawnpoint = DoRotation(spawnpoint, 0, Random() % 360, 0);
+                    spawnpoint += position[i];
+                    Sprite::MakeSprite(flamesprite, spawnpoint, spawnpoint * 0, 1, 1, 1, (.6 + (float)abs(Random() % 100) / 200 - .25) * 5 * scale[i], 1);
+                }
+                if (type[i] == treeleavestype) {
+                    spawnpoint.x = ((float)(Random() % 100)) / 80 * scale[i];
+                    spawnpoint.y = ((float)(Random() % 100) + 80) / 12 * scale[i];
+                    spawnpoint.z = 0;
+                    spawnpoint = DoRotation(spawnpoint, 0, Random() % 360, 0);
+                    spawnpoint += position[i];
+                    Sprite::MakeSprite(flamesprite, spawnpoint, spawnpoint * 0, 1, 1, 1, (.6 + (float)abs(Random() % 100) / 200 - .25) * 6, 1);
+                }
+            }
+
+        }
+    }
 }
 
 void Objects::DoShadows()
 {
-       int i,j,k,l;
-       static XYZ testpoint,testpoint2, terrainpoint,lightloc,col;
-       lightloc=light.location;
-       if(!skyboxtexture)lightloc=0;
-       lightloc.y+=10;
-       Normalise(&lightloc);
-       int patchx,patchz;
-
-       if(numobjects>0)
-               for(i=0;i<numobjects;i++){
-                       if(type[i]!=treeleavestype&&type[i]!=treetrunktype&&type[i]!=bushtype&&type[i]!=firetype){
-                               for(j=0;j<model[i].vertexNum;j++){
-                                       terrainpoint=position[i]+DoRotation(model[i].vertex[j]+model[i].normals[j]*.1,0,yaw[i],0);
-                                       //terrainpoint.y+=model[i].boundingsphereradius;
-                                       shadowed[i]=0;
-                                       patchx=terrainpoint.x/(terrain.size/subdivision*terrain.scale);
-                                       patchz=terrainpoint.z/(terrain.size/subdivision*terrain.scale);
-                                       if(patchx>=0&&patchz>=0&&patchx<subdivision&&patchz<subdivision)
-                                               if(terrain.patchobjectnum[patchx][patchz])
-                                                       for(k=0;k<terrain.patchobjectnum[patchx][patchz];k++){
-                                                               l=terrain.patchobjects[patchx][patchz][k];
-                                                               if(type[l]!=treetrunktype/*&&l!=i*/){
-                                                                       testpoint=terrainpoint;
-                                                                       testpoint2=terrainpoint+lightloc*50*(1-shadowed[i]);
-                                                                       if(model[l].LineCheck(&testpoint,&testpoint2,&col,&position[l],&yaw[l])!=-1){
-                                                                               shadowed[i]=1-(findDistance(&terrainpoint,&col)/50);    
-                                                                       }
-                                                               }
-                                                       }
-                                                       if(shadowed[i]>0){
-                                                               col=model[i].normals[j]-DoRotation(lightloc*shadowed[i],0,-yaw[i],0);
-                                                               Normalise(&col);
-                                                               for(k=0;k<model[i].TriangleNum;k++){
-                                                                       if(model[i].Triangles[k].vertex[0]==j){
-                                                                               l=k*24;
-                                                                               model[i].vArray[l+2]=col.x;
-                                                                               model[i].vArray[l+3]=col.y;
-                                                                               model[i].vArray[l+4]=col.z;
-                                                                       }
-                                                                       if(model[i].Triangles[k].vertex[1]==j){
-                                                                               l=k*24;
-                                                                               model[i].vArray[l+10]=col.x;
-                                                                               model[i].vArray[l+11]=col.y;
-                                                                               model[i].vArray[l+12]=col.z;
-                                                                       }
-                                                                       if(model[i].Triangles[k].vertex[2]==j){
-                                                                               l=k*24;
-                                                                               model[i].vArray[l+18]=col.x;
-                                                                               model[i].vArray[l+19]=col.y;
-                                                                               model[i].vArray[l+20]=col.z;
-                                                                       }
-                                                               }
-                                                       }
-                               }
-                       }
-                       shadowed[i]=0;
-               }
+    int i, j, k, l;
+    static XYZ testpoint, testpoint2, terrainpoint, lightloc, col;
+    lightloc = light.location;
+    if (!skyboxtexture)lightloc = 0;
+    lightloc.y += 10;
+    Normalise(&lightloc);
+    int patchx, patchz;
+
+    if (numobjects > 0)
+        for (i = 0; i < numobjects; i++) {
+            if (type[i] != treeleavestype && type[i] != treetrunktype && type[i] != bushtype && type[i] != firetype) {
+                for (j = 0; j < model[i].vertexNum; j++) {
+                    terrainpoint = position[i] + DoRotation(model[i].vertex[j] + model[i].normals[j] * .1, 0, yaw[i], 0);
+                    //terrainpoint.y+=model[i].boundingsphereradius;
+                    shadowed[i] = 0;
+                    patchx = terrainpoint.x / (terrain.size / subdivision * terrain.scale);
+                    patchz = terrainpoint.z / (terrain.size / subdivision * terrain.scale);
+                    if (patchx >= 0 && patchz >= 0 && patchx < subdivision && patchz < subdivision)
+                        if (terrain.patchobjectnum[patchx][patchz])
+                            for (k = 0; k < terrain.patchobjectnum[patchx][patchz]; k++) {
+                                l = terrain.patchobjects[patchx][patchz][k];
+                                if (type[l] != treetrunktype/*&&l!=i*/) {
+                                    testpoint = terrainpoint;
+                                    testpoint2 = terrainpoint + lightloc * 50 * (1 - shadowed[i]);
+                                    if (model[l].LineCheck(&testpoint, &testpoint2, &col, &position[l], &yaw[l]) != -1) {
+                                        shadowed[i] = 1 - (findDistance(&terrainpoint, &col) / 50);
+                                    }
+                                }
+                            }
+                    if (shadowed[i] > 0) {
+                        col = model[i].normals[j] - DoRotation(lightloc * shadowed[i], 0, -yaw[i], 0);
+                        Normalise(&col);
+                        for (k = 0; k < model[i].TriangleNum; k++) {
+                            if (model[i].Triangles[k].vertex[0] == j) {
+                                l = k * 24;
+                                model[i].vArray[l + 2] = col.x;
+                                model[i].vArray[l + 3] = col.y;
+                                model[i].vArray[l + 4] = col.z;
+                            }
+                            if (model[i].Triangles[k].vertex[1] == j) {
+                                l = k * 24;
+                                model[i].vArray[l + 10] = col.x;
+                                model[i].vArray[l + 11] = col.y;
+                                model[i].vArray[l + 12] = col.z;
+                            }
+                            if (model[i].Triangles[k].vertex[2] == j) {
+                                l = k * 24;
+                                model[i].vArray[l + 18] = col.x;
+                                model[i].vArray[l + 19] = col.y;
+                                model[i].vArray[l + 20] = col.z;
+                            }
+                        }
+                    }
+                }
+            }
+            shadowed[i] = 0;
+        }
 }
 
 Objects::Objects()
 {
-       center = 0;
-       radius = 0;
-       numobjects = 0;
-
-       memset(position, 0, sizeof(position));
-       memset(type, 0, sizeof(type));
-       memset(yaw, 0, sizeof(yaw));
-       memset(pitch, 0, sizeof(pitch));
-       memset(rotx, 0, sizeof(rotx));
-       memset(rotxvel, 0, sizeof(rotxvel));
-       memset(roty, 0, sizeof(roty));
-       memset(rotyvel, 0, sizeof(rotyvel));
-       memset(possible, 0, sizeof(possible));
-       memset(model, 0, sizeof(model));
-       memset(displaymodel, 0, sizeof(displaymodel));
-       memset(friction, 0, sizeof(friction));
-       memset(scale, 0, sizeof(scale));
-       memset(messedwith, 0, sizeof(messedwith));
-       memset(checked, 0, sizeof(checked));
-       memset(shadowed, 0, sizeof(shadowed));
-       memset(occluded, 0, sizeof(occluded));
-       memset(onfire, 0, sizeof(onfire));
-       memset(flamedelay, 0, sizeof(flamedelay));
-}      
+    center = 0;
+    radius = 0;
+    numobjects = 0;
+
+    memset(position, 0, sizeof(position));
+    memset(type, 0, sizeof(type));
+    memset(yaw, 0, sizeof(yaw));
+    memset(pitch, 0, sizeof(pitch));
+    memset(rotx, 0, sizeof(rotx));
+    memset(rotxvel, 0, sizeof(rotxvel));
+    memset(roty, 0, sizeof(roty));
+    memset(rotyvel, 0, sizeof(rotyvel));
+    memset(possible, 0, sizeof(possible));
+    memset(model, 0, sizeof(model));
+    memset(displaymodel, 0, sizeof(displaymodel));
+    memset(friction, 0, sizeof(friction));
+    memset(scale, 0, sizeof(scale));
+    memset(messedwith, 0, sizeof(messedwith));
+    memset(checked, 0, sizeof(checked));
+    memset(shadowed, 0, sizeof(shadowed));
+    memset(occluded, 0, sizeof(occluded));
+    memset(onfire, 0, sizeof(onfire));
+    memset(flamedelay, 0, sizeof(flamedelay));
+}
 
 Objects::~Objects()
 {
index a99c646f7e445b240629d0a59f660cc67c999c2d..735c377ce63c3714d59e1b26efa74931465baa9f 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -54,46 +54,47 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #define firetype 13
 
 
-class Objects{
+class Objects
+{
 public:
-       XYZ center;
-       float radius;
-       XYZ position[max_objects];
-       int type[max_objects];
-       float yaw[max_objects];
-       float pitch[max_objects];
-       float rotx[max_objects];
-       float rotxvel[max_objects];
-       float roty[max_objects];
-       float rotyvel[max_objects];
-       int numobjects;
-       bool possible[max_objects];
-       Model model[max_objects];
-       Model displaymodel[max_objects];
-       float friction[max_objects];
-       float scale[max_objects];
-       float messedwith[max_objects];
-       float checked[max_objects];
-       Texture boxtextureptr;
-       Texture treetextureptr;
-       Texture bushtextureptr;
-       Texture rocktextureptr;
-       float shadowed[max_objects];
-       float occluded[max_objects];
-       bool checkcollide(XYZ startpoint, XYZ endpoint,int which);
-       bool onfire[max_objects];
-       float flamedelay[max_objects];
+    XYZ center;
+    float radius;
+    XYZ position[max_objects];
+    int type[max_objects];
+    float yaw[max_objects];
+    float pitch[max_objects];
+    float rotx[max_objects];
+    float rotxvel[max_objects];
+    float roty[max_objects];
+    float rotyvel[max_objects];
+    int numobjects;
+    bool possible[max_objects];
+    Model model[max_objects];
+    Model displaymodel[max_objects];
+    float friction[max_objects];
+    float scale[max_objects];
+    float messedwith[max_objects];
+    float checked[max_objects];
+    Texture boxtextureptr;
+    Texture treetextureptr;
+    Texture bushtextureptr;
+    Texture rocktextureptr;
+    float shadowed[max_objects];
+    float occluded[max_objects];
+    bool checkcollide(XYZ startpoint, XYZ endpoint, int which);
+    bool onfire[max_objects];
+    float flamedelay[max_objects];
 
-       void SphereCheckPossible(XYZ *p1,float radius);
-       void DeleteObject(int which);
-       void MakeObject(int atype, XYZ where, float ayaw, float ascale);
-       void MakeObject(int atype, XYZ where, float ayaw, float apitch, float ascale);
-       void Draw();
-       void DoShadows();
-       void DoStuff();
+    void SphereCheckPossible(XYZ *p1, float radius);
+    void DeleteObject(int which);
+    void MakeObject(int atype, XYZ where, float ayaw, float ascale);
+    void MakeObject(int atype, XYZ where, float ayaw, float apitch, float ascale);
+    void Draw();
+    void DoShadows();
+    void DoStuff();
 
-       Objects();
-       ~Objects();
+    Objects();
+    ~Objects();
 };
 
 #endif
index 5a5b0f10bc7b8481649b32633c44ef89bc31931c..a0ace20b7ac291148281b2d202ae3841fc8c20bb 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -34,15 +34,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include "Game.h"
 extern "C" {
-       #include "zlib.h"
-       #include "png.h"
-   #ifdef WIN32
-               #define INT32 INT32_jpeg
-               #include "jpeglib.h"
-               #undef INT32
-       #else
-               #include "jpeglib.h"
-       #endif
+#include "zlib.h"
+#include "png.h"
+#ifdef WIN32
+#define INT32 INT32_jpeg
+#include "jpeglib.h"
+#undef INT32
+#else
+#include "jpeglib.h"
+#endif
 }
 
 using namespace Game;
@@ -67,7 +67,8 @@ extern bool osx;
 extern bool freeze;
 extern bool stillloading;
 extern int mainmenu;
-/*extern*/ bool gameFocused;
+/*extern*/
+bool gameFocused;
 
 extern float slomospeed;
 extern float slomofreq;
@@ -128,8 +129,7 @@ void CleanUp (void);
 static bool lookup_glsym(const char *funcname, void **func)
 {
     *func = SDL_GL_GetProcAddress(funcname);
-    if (*func == NULL)
-    {
+    if (*func == NULL) {
         fprintf(stderr, "Failed to find OpenGL symbol \"%s\"\n", funcname);
         return false;
     }
@@ -139,10 +139,10 @@ static bool lookup_glsym(const char *funcname, void **func)
 static bool lookup_all_glsyms(void)
 {
     bool retval = true;
-    #define GL_FUNC(ret,fn,params,call,rt) \
+#define GL_FUNC(ret,fn,params,call,rt) \
         if (!lookup_glsym(#fn, (void **) &p##fn)) retval = false;
-    #include "glstubs.h"
-    #undef GL_FUNC
+#include "glstubs.h"
+#undef GL_FUNC
     return retval;
 }
 
@@ -170,8 +170,7 @@ static char **_argv = NULL;
 
 bool cmdline(const char *cmd)
 {
-    for (int i = 1; i < _argc; i++)
-    {
+    for (int i = 1; i < _argc; i++) {
         char *arg = _argv[i];
         while (*arg == '-')
             arg++;
@@ -186,95 +185,97 @@ bool cmdline(const char *cmd)
 
 // OpenGL Drawing
 
-void initGL(){
-       glClear( GL_COLOR_BUFFER_BIT );
-       swap_gl_buffers();
-
-       // clear all states
-       glDisable( GL_ALPHA_TEST);
-       glDisable( GL_BLEND);
-       glDisable( GL_DEPTH_TEST);
-       //      glDisable( GL_DITHER);
-       glDisable( GL_FOG);
-       glDisable( GL_LIGHTING);
-       glDisable( GL_LOGIC_OP);
-       glDisable( GL_TEXTURE_1D);
-       glDisable( GL_TEXTURE_2D);
-       glPixelTransferi( GL_MAP_COLOR, GL_FALSE);
-       glPixelTransferi( GL_RED_SCALE, 1);
-       glPixelTransferi( GL_RED_BIAS, 0);
-       glPixelTransferi( GL_GREEN_SCALE, 1);
-       glPixelTransferi( GL_GREEN_BIAS, 0);
-       glPixelTransferi( GL_BLUE_SCALE, 1);
-       glPixelTransferi( GL_BLUE_BIAS, 0);
-       glPixelTransferi( GL_ALPHA_SCALE, 1);
-       glPixelTransferi( GL_ALPHA_BIAS, 0);
-
-       // set initial rendering states
-       glShadeModel( GL_SMOOTH);
-       glClearDepth( 1.0f);
-       glDepthFunc( GL_LEQUAL);
-       glDepthMask( GL_TRUE);
-       //      glDepthRange( FRONT_CLIP, BACK_CLIP);
-       glEnable( GL_DEPTH_TEST);
-       glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
-       glCullFace( GL_FRONT);
-       glEnable( GL_CULL_FACE);
-       glEnable( GL_LIGHTING);
+void initGL()
+{
+    glClear( GL_COLOR_BUFFER_BIT );
+    swap_gl_buffers();
+
+    // clear all states
+    glDisable( GL_ALPHA_TEST);
+    glDisable( GL_BLEND);
+    glDisable( GL_DEPTH_TEST);
+    // glDisable( GL_DITHER);
+    glDisable( GL_FOG);
+    glDisable( GL_LIGHTING);
+    glDisable( GL_LOGIC_OP);
+    glDisable( GL_TEXTURE_1D);
+    glDisable( GL_TEXTURE_2D);
+    glPixelTransferi( GL_MAP_COLOR, GL_FALSE);
+    glPixelTransferi( GL_RED_SCALE, 1);
+    glPixelTransferi( GL_RED_BIAS, 0);
+    glPixelTransferi( GL_GREEN_SCALE, 1);
+    glPixelTransferi( GL_GREEN_BIAS, 0);
+    glPixelTransferi( GL_BLUE_SCALE, 1);
+    glPixelTransferi( GL_BLUE_BIAS, 0);
+    glPixelTransferi( GL_ALPHA_SCALE, 1);
+    glPixelTransferi( GL_ALPHA_BIAS, 0);
+
+    // set initial rendering states
+    glShadeModel( GL_SMOOTH);
+    glClearDepth( 1.0f);
+    glDepthFunc( GL_LEQUAL);
+    glDepthMask( GL_TRUE);
+    // glDepthRange( FRONT_CLIP, BACK_CLIP);
+    glEnable( GL_DEPTH_TEST);
+    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+    glCullFace( GL_FRONT);
+    glEnable( GL_CULL_FACE);
+    glEnable( GL_LIGHTING);
 //     glEnable( GL_LIGHT_MODEL_AMBIENT);
-       glEnable( GL_DITHER);
-       glEnable( GL_COLOR_MATERIAL);
-       glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-       glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-       glAlphaFunc( GL_GREATER, 0.5f);
-
-       if ( CanInitStereo(stereomode) ) {
-               InitStereo(stereomode);
-       } else {
-               fprintf(stderr, "Failed to initialize stereo, disabling.\n");
-               stereomode = stereoNone;
-       }
+    glEnable( GL_DITHER);
+    glEnable( GL_COLOR_MATERIAL);
+    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glAlphaFunc( GL_GREATER, 0.5f);
+
+    if ( CanInitStereo(stereomode) ) {
+        InitStereo(stereomode);
+    } else {
+        fprintf(stderr, "Failed to initialize stereo, disabling.\n");
+        stereomode = stereoNone;
+    }
 }
 
-static void toggleFullscreen(){
-       if(!SDL_WM_ToggleFullScreen(SDL_GetVideoSurface())){
-        SDL_Surface* screen=SDL_GetVideoSurface();
-        Uint32 flags=screen->flags;
-        screen=SDL_SetVideoMode(0,0,0,flags^SDL_FULLSCREEN);
-        if(!screen)
-            screen=SDL_SetVideoMode(0,0,0,flags);
-        if(!screen)
+static void toggleFullscreen()
+{
+    if (!SDL_WM_ToggleFullScreen(SDL_GetVideoSurface())) {
+        SDL_Surface* screen = SDL_GetVideoSurface();
+        Uint32 flags = screen->flags;
+        screen = SDL_SetVideoMode(0, 0, 0, flags ^ SDL_FULLSCREEN);
+        if (!screen)
+            screen = SDL_SetVideoMode(0, 0, 0, flags);
+        if (!screen)
             exit(1);
         //reload opengl state
         initGL();
         Texture::reloadAll();
-        if(text)
+        if (text)
             text->BuildFont();
-        if(firstload){
-            screentexture=0;
+        if (firstload) {
+            screentexture = 0;
             LoadScreenTexture();
         }
-        screentexture2=0;
+        screentexture2 = 0;
     }
 }
 
 static void sdlEventProc(const SDL_Event &e)
 {
-    switch(e.type) {
-        case SDL_MOUSEMOTION:
-            deltah += e.motion.xrel;
-            deltav += e.motion.yrel;
-            break;
-
-        case SDL_KEYDOWN:
-            if ((e.key.keysym.sym == SDLK_g) &&
-                                (e.key.keysym.mod & KMOD_CTRL) &&
-                                !(SDL_GetVideoSurface()->flags & SDL_FULLSCREEN) ) {
-                                SDL_WM_GrabInput( ((SDL_WM_GrabInput(SDL_GRAB_QUERY)==SDL_GRAB_ON) ? SDL_GRAB_OFF:SDL_GRAB_ON) );
-            } else if ( (e.key.keysym.sym == SDLK_RETURN) && (e.key.keysym.mod & KMOD_ALT) ) {
-                                toggleFullscreen();
-            }
-            break;
+    switch (e.type) {
+    case SDL_MOUSEMOTION:
+        deltah += e.motion.xrel;
+        deltav += e.motion.yrel;
+        break;
+
+    case SDL_KEYDOWN:
+        if ((e.key.keysym.sym == SDLK_g) &&
+                (e.key.keysym.mod & KMOD_CTRL) &&
+                !(SDL_GetVideoSurface()->flags & SDL_FULLSCREEN) ) {
+            SDL_WM_GrabInput( ((SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_ON) ? SDL_GRAB_OFF : SDL_GRAB_ON) );
+        } else if ( (e.key.keysym.sym == SDLK_RETURN) && (e.key.keysym.mod & KMOD_ALT) ) {
+            toggleFullscreen();
+        }
+        break;
     }
 }
 
@@ -286,78 +287,72 @@ static Point gMidPoint;
 
 Boolean SetUp ()
 {
-       char string[10];
+    char string[10];
+
+    LOGFUNC;
 
-       LOGFUNC;
+    osx = 0;
+    cellophane = 0;
+    texdetail = 4;
+    slomospeed = 0.25;
+    slomofreq = 8012;
+    numplayers = 1;
 
-       osx = 0;
-       cellophane=0;
-       texdetail=4;
-       slomospeed=0.25;
-       slomofreq=8012;
-       numplayers=1;
-       
-       DefaultSettings();
+    DefaultSettings();
 
     if (!SDL_WasInit(SDL_INIT_VIDEO))
-        if (SDL_Init(SDL_INIT_VIDEO) == -1)
-        {
+        if (SDL_Init(SDL_INIT_VIDEO) == -1) {
             fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError());
             return false;
         }
-       if(!LoadSettings()) {
-               fprintf(stderr, "Failed to load config, creating default\n");
-               SaveSettings();
-       }
-       if(kBitsPerPixel!=32&&kBitsPerPixel!=16){
-               kBitsPerPixel=16;
-       }
-
-       if (SDL_GL_LoadLibrary(NULL) == -1)
-       {
-               fprintf(stderr, "SDL_GL_LoadLibrary() failed: %s\n", SDL_GetError());
-               SDL_Quit();
-               return false;
-       }
-
-       SDL_Rect **res = SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_OPENGL);
-       if ( (res == NULL) || (res == ((SDL_Rect **)-1)) || (res[0] == NULL) || (res[0]->w < 640) || (res[0]->h < 480) )
-               res = hardcoded_resolutions;
-
-       // reverse list (it was sorted biggest to smallest by SDL)...
-       int count;
-       for (count = 0; res[count]; count++)
-       {
-               if ((res[count]->w < 640) || (res[count]->h < 480))
-                       break;   // sane lower limit.
-       }
-
-       static SDL_Rect *resolutions_block = NULL;
-       resolutions_block = (SDL_Rect*) realloc(resolutions_block, sizeof (SDL_Rect) * count);
-       resolutions = (SDL_Rect**) realloc(resolutions, sizeof (SDL_Rect *) * (count + 1));
-       if ((resolutions_block == NULL) || (resolutions == NULL))
-       {
-               SDL_Quit();
-               fprintf(stderr, "Out of memory!\n");
-               return false;
-       }
-
-       resolutions[count--] = NULL;
-       for (int i = 0; count >= 0; i++, count--)
-       {
-               memcpy(&resolutions_block[count], res[i], sizeof (SDL_Rect));
-               resolutions[count] = &resolutions_block[count];
-       }
-
-       if (cmdline("showresolutions"))
-       {
-               printf("Resolutions we think are okay:\n");
-               for (int i = 0; resolutions[i]; i++)
-                       printf("  %d x %d\n", (int) resolutions[i]->w, (int) resolutions[i]->h);
-       }
+    if (!LoadSettings()) {
+        fprintf(stderr, "Failed to load config, creating default\n");
+        SaveSettings();
+    }
+    if (kBitsPerPixel != 32 && kBitsPerPixel != 16) {
+        kBitsPerPixel = 16;
+    }
+
+    if (SDL_GL_LoadLibrary(NULL) == -1) {
+        fprintf(stderr, "SDL_GL_LoadLibrary() failed: %s\n", SDL_GetError());
+        SDL_Quit();
+        return false;
+    }
+
+    SDL_Rect **res = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_OPENGL);
+    if ( (res == NULL) || (res == ((SDL_Rect **) - 1)) || (res[0] == NULL) || (res[0]->w < 640) || (res[0]->h < 480) )
+        res = hardcoded_resolutions;
+
+    // reverse list (it was sorted biggest to smallest by SDL)...
+    int count;
+    for (count = 0; res[count]; count++) {
+        if ((res[count]->w < 640) || (res[count]->h < 480))
+            break;   // sane lower limit.
+    }
+
+    static SDL_Rect *resolutions_block = NULL;
+    resolutions_block = (SDL_Rect*) realloc(resolutions_block, sizeof (SDL_Rect) * count);
+    resolutions = (SDL_Rect**) realloc(resolutions, sizeof (SDL_Rect *) * (count + 1));
+    if ((resolutions_block == NULL) || (resolutions == NULL)) {
+        SDL_Quit();
+        fprintf(stderr, "Out of memory!\n");
+        return false;
+    }
+
+    resolutions[count--] = NULL;
+    for (int i = 0; count >= 0; i++, count--) {
+        memcpy(&resolutions_block[count], res[i], sizeof (SDL_Rect));
+        resolutions[count] = &resolutions_block[count];
+    }
+
+    if (cmdline("showresolutions")) {
+        printf("Resolutions we think are okay:\n");
+        for (int i = 0; resolutions[i]; i++)
+            printf("  %d x %d\n", (int) resolutions[i]->w, (int) resolutions[i]->h);
+    }
 
     Uint32 sdlflags = SDL_OPENGL;
-    
+
     if (!cmdline("windowed"))
         sdlflags |= SDL_FULLSCREEN;
 
@@ -370,20 +365,17 @@ Boolean SetUp ()
 #if SDL_VERSION_ATLEAST(1, 2, 10)
     SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, vblsync);
 #endif
-    
-    if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL)
-    {
+
+    if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL) {
         fprintf(stderr, "SDL_SetVideoMode() failed: %s\n", SDL_GetError());
         fprintf(stderr, "forcing 640x480...\n");
         kContextWidth = 640;
         kContextHeight = 480;
-        if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL)
-        {
+        if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL) {
             fprintf(stderr, "SDL_SetVideoMode() failed: %s\n", SDL_GetError());
             fprintf(stderr, "forcing 640x480 windowed mode...\n");
             sdlflags &= ~SDL_FULLSCREEN;
-            if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL)
-            {
+            if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL) {
                 fprintf(stderr, "SDL_SetVideoMode() failed: %s\n", SDL_GetError());
                 return false;
             }
@@ -391,15 +383,13 @@ Boolean SetUp ()
     }
 
     int dblbuf = 0;
-    if ((SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &dblbuf) == -1) || (!dblbuf))
-    {
+    if ((SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &dblbuf) == -1) || (!dblbuf)) {
         fprintf(stderr, "Failed to get double buffered GL context!\n");
         SDL_Quit();
         return false;
     }
 
-    if (!lookup_all_glsyms())
-    {
+    if (!lookup_all_glsyms()) {
         SDL_Quit();
         return false;
     }
@@ -410,32 +400,31 @@ Boolean SetUp ()
 
     initGL();
 
-       GLint width = kContextWidth;
-       GLint height = kContextHeight;
-       gMidPoint.h = width / 2;
-       gMidPoint.v = height / 2;
-       screenwidth=width;
-       screenheight=height;
+    GLint width = kContextWidth;
+    GLint height = kContextHeight;
+    gMidPoint.h = width / 2;
+    gMidPoint.v = height / 2;
+    screenwidth = width;
+    screenheight = height;
 
-       newdetail=detail;
-       newscreenwidth=screenwidth;
-       newscreenheight=screenheight;
+    newdetail = detail;
+    newscreenwidth = screenwidth;
+    newscreenheight = screenheight;
 
-       InitGame();
+    InitGame();
 
-       return true;
+    return true;
 }
 
 
 static void DoMouse()
 {
 
-       if(mainmenu|| ( (abs(deltah)<10*realmultiplier*1000) && (abs(deltav)<10*realmultiplier*1000) ))
-       {
-               deltah *= usermousesensitivity;
-               deltav *= usermousesensitivity;
-               mousecoordh += deltah;
-               mousecoordv += deltav;
+    if (mainmenu || ( (abs(deltah) < 10 * realmultiplier * 1000) && (abs(deltav) < 10 * realmultiplier * 1000) )) {
+        deltah *= usermousesensitivity;
+        deltav *= usermousesensitivity;
+        mousecoordh += deltah;
+        mousecoordv += deltav;
         if (mousecoordh < 0)
             mousecoordh = 0;
         else if (mousecoordh >= kContextWidth)
@@ -444,121 +433,119 @@ static void DoMouse()
             mousecoordv = 0;
         else if (mousecoordv >= kContextHeight)
             mousecoordv = kContextHeight - 1;
-       }
+    }
 
 }
 
 void DoFrameRate (int update)
-{      
-       static long frames = 0;
-
-       static AbsoluteTime time = {0,0};
-       static AbsoluteTime frametime = {0,0};
-       AbsoluteTime currTime = UpTime ();
-       double deltaTime = (float) AbsoluteDeltaToDuration (currTime, frametime);
-
-       if (0 > deltaTime)      // if negative microseconds
-               deltaTime /= -1000000.0;
-       else                            // else milliseconds
-               deltaTime /= 1000.0;
-
-       multiplier=deltaTime;
-       if(multiplier<.001) multiplier=.001;
-       if(multiplier>10) multiplier=10;
-       if(update) frametime = currTime;        // reset for next time interval
-
-       deltaTime = (float) AbsoluteDeltaToDuration (currTime, time);
-
-       if (0 > deltaTime)      // if negative microseconds
-               deltaTime /= -1000000.0;
-       else                            // else milliseconds
-               deltaTime /= 1000.0;
-       frames++;
-       if (0.001 <= deltaTime) // has update interval passed
-       {
-               if(update){
-                       time = currTime;        // reset for next time interval
-                       frames = 0;
-               }
-       }
+{
+    static long frames = 0;
+
+    static AbsoluteTime time = {0, 0};
+    static AbsoluteTime frametime = {0, 0};
+    AbsoluteTime currTime = UpTime ();
+    double deltaTime = (float) AbsoluteDeltaToDuration (currTime, frametime);
+
+    if (0 > deltaTime) // if negative microseconds
+        deltaTime /= -1000000.0;
+    else                               // else milliseconds
+        deltaTime /= 1000.0;
+
+    multiplier = deltaTime;
+    if (multiplier < .001) multiplier = .001;
+    if (multiplier > 10) multiplier = 10;
+    if (update) frametime = currTime;  // reset for next time interval
+
+    deltaTime = (float) AbsoluteDeltaToDuration (currTime, time);
+
+    if (0 > deltaTime) // if negative microseconds
+        deltaTime /= -1000000.0;
+    else                               // else milliseconds
+        deltaTime /= 1000.0;
+    frames++;
+    if (0.001 <= deltaTime) {  // has update interval passed
+        if (update) {
+            time = currTime;   // reset for next time interval
+            frames = 0;
+        }
+    }
 }
 
 
 void DoUpdate ()
 {
-       static float sps=200;
-       static int count;
-       static float oldmult;
-
-       DoFrameRate(1);
-       if(multiplier>.6)multiplier=.6;
-
-       fps=1/multiplier;
-
-       count = multiplier*sps;
-       if(count<2)count=2;
-
-       realmultiplier=multiplier;
-       multiplier*=gamespeed;
-       if(difficulty==1)multiplier*=.9;
-       if(difficulty==0)multiplier*=.8;
-
-       if(loading==4)multiplier*=.00001;
-       if(slomo&&!mainmenu)multiplier*=slomospeed;
-       oldmult=multiplier;
-       multiplier/=(float)count;
-
-       DoMouse();
-
-       TickOnce();
-
-       for(int i=0;i<count;i++)
-       {
-               Tick();
-       }
-       multiplier=oldmult;
-
-       TickOnceAfter();
-/* - Debug code to test how many channels were active on average per frame
-       static long frames = 0;
-
-       static AbsoluteTime start = {0,0};
-       AbsoluteTime currTime = UpTime ();
-       static int num_channels = 0;
-       
-       num_channels += OPENAL_GetChannelsPlaying();
-       double deltaTime = (float) AbsoluteDeltaToDuration (currTime, start);
-
-       if (0 > deltaTime)      // if negative microseconds
-               deltaTime /= -1000000.0;
-       else                            // else milliseconds
-               deltaTime /= 1000.0;
-
-       ++frames;
-
-       if (deltaTime >= 1)
-       {
-               start = currTime;
-               float avg_channels = (float)num_channels / (float)frames;
-
-               ofstream opstream("log.txt",ios::app); 
-               opstream << "Average frame count: ";
-               opstream << frames;
-               opstream << " frames - ";
-               opstream << avg_channels;
-               opstream << " per frame.\n";
-               opstream.close();
-
-               frames = 0;
-               num_channels = 0;
-       }
-*/
-       if ( stereomode == stereoNone ) {
-               DrawGLScene(stereoCenter);
-       } else {
-               DrawGLScene(stereoLeft);
-               DrawGLScene(stereoRight);
-       }
+    static float sps = 200;
+    static int count;
+    static float oldmult;
+
+    DoFrameRate(1);
+    if (multiplier > .6)multiplier = .6;
+
+    fps = 1 / multiplier;
+
+    count = multiplier * sps;
+    if (count < 2)count = 2;
+
+    realmultiplier = multiplier;
+    multiplier *= gamespeed;
+    if (difficulty == 1)multiplier *= .9;
+    if (difficulty == 0)multiplier *= .8;
+
+    if (loading == 4)multiplier *= .00001;
+    if (slomo && !mainmenu)multiplier *= slomospeed;
+    oldmult = multiplier;
+    multiplier /= (float)count;
+
+    DoMouse();
+
+    TickOnce();
+
+    for (int i = 0; i < count; i++) {
+        Tick();
+    }
+    multiplier = oldmult;
+
+    TickOnceAfter();
+    /* - Debug code to test how many channels were active on average per frame
+       static long frames = 0;
+
+       static AbsoluteTime start = {0,0};
+       AbsoluteTime currTime = UpTime ();
+       static int num_channels = 0;
+
+       num_channels += OPENAL_GetChannelsPlaying();
+       double deltaTime = (float) AbsoluteDeltaToDuration (currTime, start);
+
+       if (0 > deltaTime)      // if negative microseconds
+               deltaTime /= -1000000.0;
+       else                            // else milliseconds
+               deltaTime /= 1000.0;
+
+       ++frames;
+
+       if (deltaTime >= 1)
+       {
+               start = currTime;
+               float avg_channels = (float)num_channels / (float)frames;
+
+               ofstream opstream("log.txt",ios::app);
+               opstream << "Average frame count: ";
+               opstream << frames;
+               opstream << " frames - ";
+               opstream << avg_channels;
+               opstream << " per frame.\n";
+               opstream.close();
+
+               frames = 0;
+               num_channels = 0;
+       }
+    */
+    if ( stereomode == stereoNone ) {
+        DrawGLScene(stereoCenter);
+    } else {
+        DrawGLScene(stereoLeft);
+        DrawGLScene(stereoRight);
+    }
 }
 
 // --------------------------------------------------------------------------
@@ -566,12 +553,12 @@ void DoUpdate ()
 
 void CleanUp (void)
 {
-       LOGFUNC;
+    LOGFUNC;
 
     SDL_Quit();
-    #define GL_FUNC(ret,fn,params,call,rt) p##fn = NULL;
-    #include "glstubs.h"
-    #undef GL_FUNC
+#define GL_FUNC(ret,fn,params,call,rt) p##fn = NULL;
+#include "glstubs.h"
+#undef GL_FUNC
     // cheat here...static destructors are calling glDeleteTexture() after
     //  the context is destroyed and libGL unloaded by SDL_Quit().
     pglDeleteTextures = glDeleteTextures_doNothing;
@@ -596,19 +583,16 @@ static char *findBinaryInPath(const char *bin, char *envr)
     char *start = envr;
     char *ptr;
 
-    do
-    {
+    do {
         size_t size;
         ptr = strchr(start, ':');  /* find next $PATH separator. */
         if (ptr)
             *ptr = '\0';
 
         size = strlen(start) + strlen(bin) + 2;
-        if (size > alloc_size)
-        {
+        if (size > alloc_size) {
             char *x = (char *) realloc(exe, size);
-            if (x == NULL)
-            {
+            if (x == NULL) {
                 if (exe != NULL)
                     free(exe);
                 return(NULL);
@@ -624,8 +608,7 @@ static char *findBinaryInPath(const char *bin, char *envr)
             strcat(exe, "/");
         strcat(exe, bin);
 
-        if (access(exe, X_OK) == 0)  /* Exists as executable? We're done. */
-        {
+        if (access(exe, X_OK) == 0) { /* Exists as executable? We're done. */
             strcpy(exe, start);  /* i'm lazy. piss off. */
             return(exe);
         } /* if */
@@ -647,8 +630,7 @@ char *calcBaseDir(const char *argv0)
     char *envr;
 
     const char *ptr = strrchr((char *)argv0, '/');
-    if (strchr(argv0, '/'))
-    {
+    if (strchr(argv0, '/')) {
         retval = strdup(argv0);
         if (retval)
             *((char *) strrchr(retval, '/')) = '\0';
@@ -667,21 +649,19 @@ char *calcBaseDir(const char *argv0)
 static inline void chdirToAppPath(const char *argv0)
 {
     char *dir = calcBaseDir(argv0);
-    if (dir)
-    {
-        #if (defined(__APPLE__) && defined(__MACH__))
+    if (dir) {
+#if (defined(__APPLE__) && defined(__MACH__))
         // Chop off /Contents/MacOS if it's at the end of the string, so we
         //  land in the base of the app bundle.
         const size_t len = strlen(dir);
         const char *bundledirs = "/Contents/MacOS";
         const size_t bundledirslen = strlen(bundledirs);
-        if (len > bundledirslen)
-        {
+        if (len > bundledirslen) {
             char *ptr = (dir + len) - bundledirslen;
             if (strcasecmp(ptr, bundledirs) == 0)
                 *ptr = '\0';
         }
-        #endif
+#endif
         chdir(dir);
         free(dir);
     }
@@ -701,89 +681,79 @@ int main(int argc, char **argv)
     chdirToAppPath(argv[0]);
 #endif
 
-       LOGFUNC;
+    LOGFUNC;
 
-       try
-       {
-               {
-                       newGame();
+    try {
+        {
+            newGame();
 
-                       //ofstream os("error.txt");
-                       //os.close();
-                       //ofstream os("log.txt");
-                       //os.close();
+            //ofstream os("error.txt");
+            //os.close();
+            //ofstream os("log.txt");
+            //os.close();
 
-                       if (!SetUp ())
+            if (!SetUp ())
                 return 42;
 
-                       while (!gDone&&!tryquit)
-                       {
-                                       if (IsFocused())
-                                       {
-                                                       gameFocused = true;
-
-                                                       // check windows messages
-                       
-                                                       deltah = 0;
-                                                       deltav = 0;
-                                                       SDL_Event e;
-                                                       if(!waiting) {
-                                                                       // message pump
-                                                                       while( SDL_PollEvent( &e ) )
-                                                                       {
-                                                                                       if( e.type == SDL_QUIT )
-                                                                                       {
-                                                                                                       gDone=true;
-                                                                                                       break;
-                                                                                       }
-                                                                                       sdlEventProc(e);
-                                                                       }
-                                                       }
-
-                                                       // game
-                                                       DoUpdate();
-                                       }
-                                       else
-                                       {
-                                                       if (gameFocused)
-                                                       {
-                                                                       // allow game chance to pause
-                                                                       gameFocused = false;
-                                                                       DoUpdate();
-                                                       }
-
-                                                       // game is not in focus, give CPU time to other apps by waiting for messages instead of 'peeking'
-                                                       SDL_ActiveEvent evt;
-                                                       SDL_WaitEvent((SDL_Event*)&evt);
-                                                       if (evt.type == SDL_ACTIVEEVENT && evt.gain == 1)
-                                                                       gameFocused = true;
-                                                       else if (evt.type == SDL_QUIT)
-                                                                       gDone = true;
-                                       }
-                       }
+            while (!gDone && !tryquit) {
+                if (IsFocused()) {
+                    gameFocused = true;
+
+                    // check windows messages
+
+                    deltah = 0;
+                    deltav = 0;
+                    SDL_Event e;
+                    if (!waiting) {
+                        // message pump
+                        while ( SDL_PollEvent( &e ) ) {
+                            if ( e.type == SDL_QUIT ) {
+                                gDone = true;
+                                break;
+                            }
+                            sdlEventProc(e);
+                        }
+                    }
+
+                    // game
+                    DoUpdate();
+                } else {
+                    if (gameFocused) {
+                        // allow game chance to pause
+                        gameFocused = false;
+                        DoUpdate();
+                    }
+
+                    // game is not in focus, give CPU time to other apps by waiting for messages instead of 'peeking'
+                    SDL_ActiveEvent evt;
+                    SDL_WaitEvent((SDL_Event*)&evt);
+                    if (evt.type == SDL_ACTIVEEVENT && evt.gain == 1)
+                        gameFocused = true;
+                    else if (evt.type == SDL_QUIT)
+                        gDone = true;
+                }
+            }
 
             deleteGame();
-               }
+        }
 
-               CleanUp ();
+        CleanUp ();
 
-               return 0;
-       }
-       catch (const std::exception& error)
-       {
-               CleanUp();
+        return 0;
+    } catch (const std::exception& error) {
+        CleanUp();
 
-               std::string e = "Caught exception: ";
-               e += error.what();
+        std::string e = "Caught exception: ";
+        e += error.what();
 
-               LOG(e);
+        LOG(e);
 
-               MessageBox(g_windowHandle, error.what(), "ERROR", MB_OK | MB_ICONEXCLAMATION);
-       }
+        MessageBox(g_windowHandle, error.what(), "ERROR", MB_OK | MB_ICONEXCLAMATION);
+    }
 
-       CleanUp();
+    CleanUp();
 
-       return -1;
+    return -1;
 }
 
 
@@ -793,15 +763,15 @@ int main(int argc, char **argv)
 
 bool LoadImage(const char * fname, TGAImageRec & tex)
 {
-       if ( tex.data == NULL )
-               return false;
-       else
-               return load_image(fname, tex);
+    if ( tex.data == NULL )
+        return false;
+    else
+        return load_image(fname, tex);
 }
 
 void ScreenShot(const char * fname)
 {
-       
+
 }
 
 
@@ -809,11 +779,10 @@ void ScreenShot(const char * fname)
 static bool load_image(const char *file_name, TGAImageRec &tex)
 {
     const char *ptr = strrchr((char *)file_name, '.');
-    if (ptr)
-    {
-        if (strcasecmp(ptr+1, "png") == 0)
+    if (ptr) {
+        if (strcasecmp(ptr + 1, "png") == 0)
             return load_png(file_name, tex);
-        else if (strcasecmp(ptr+1, "jpg") == 0)
+        else if (strcasecmp(ptr + 1, "jpg") == 0)
             return load_jpg(file_name, tex);
     }
 
@@ -823,16 +792,16 @@ static bool load_image(const char *file_name, TGAImageRec &tex)
 
 
 struct my_error_mgr {
-  struct jpeg_error_mgr pub;   /* "public" fields */
-  jmp_buf setjmp_buffer;       /* for return to caller */
+    struct jpeg_error_mgr pub; /* "public" fields */
+    jmp_buf setjmp_buffer;     /* for return to caller */
 };
 typedef struct my_error_mgr * my_error_ptr;
 
 
 static void my_error_exit(j_common_ptr cinfo)
 {
-       struct my_error_mgr *err = (struct my_error_mgr *)cinfo->err;
-       longjmp(err->setjmp_buffer, 1);
+    struct my_error_mgr *err = (struct my_error_mgr *)cinfo->err;
+    longjmp(err->setjmp_buffer, 1);
 }
 
 /* stolen from public domain example.c code in libjpg distribution. */
@@ -871,7 +840,7 @@ static bool load_jpg(const char *file_name, TGAImageRec &tex)
 
     while (cinfo.output_scanline < cinfo.output_height) {
         buffer[0] = (JSAMPROW)(char *)tex.data +
-                        ((cinfo.output_height-1) - cinfo.output_scanline) * row_stride;
+                    ((cinfo.output_height - 1) - cinfo.output_scanline) * row_stride;
         (void) jpeg_read_scanlines(&cinfo, buffer, 1);
     }
 
@@ -897,9 +866,9 @@ static bool load_png(const char *file_name, TGAImageRec &tex)
     FILE *fp = fopen(file_name, "rb");
 
     if (fp == NULL) {
-               cerr << file_name << " not found" << endl;
+        cerr << file_name << " not found" << endl;
         return(NULL);
-       }
+    }
 
     png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
     if (png_ptr == NULL)
@@ -933,14 +902,11 @@ static bool load_png(const char *file_name, TGAImageRec &tex)
     if (!row_pointers)
         goto png_done;
 
-    if (!hasalpha)
-    {
+    if (!hasalpha) {
         png_byte *dst = tex.data;
-        for (int i = height-1; i >= 0; i--)
-        {
+        for (int i = height - 1; i >= 0; i--) {
             png_byte *src = row_pointers[i];
-            for (int j = 0; j < width; j++)
-            {
+            for (int j = 0; j < width; j++) {
                 dst[0] = src[0];
                 dst[1] = src[1];
                 dst[2] = src[2];
@@ -951,11 +917,10 @@ static bool load_png(const char *file_name, TGAImageRec &tex)
         }
     }
 
-    else
-    {
+    else {
         png_byte *dst = tex.data;
         int pitch = width * 4;
-        for (int i = height-1; i >= 0; i--, dst += pitch)
+        for (int i = height - 1; i >= 0; i--, dst += pitch)
             memcpy(dst, row_pointers[i], pitch);
     }
 
@@ -963,11 +928,11 @@ static bool load_png(const char *file_name, TGAImageRec &tex)
     tex.sizeY = height;
     tex.bpp = 32;
     retval = true;
-    
+
 png_done:
-       if(!retval) {
-               cerr << "There was a problem loading " << file_name << endl;
-       }
+    if (!retval) {
+        cerr << "There was a problem loading " << file_name << endl;
+    }
     png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
     if (fp)
         fclose(fp);
@@ -978,9 +943,8 @@ png_done:
 bool save_image(const char *file_name)
 {
     const char *ptr = strrchr((char *)file_name, '.');
-    if (ptr)
-    {
-        if (strcasecmp(ptr+1, "png") == 0)
+    if (ptr) {
+        if (strcasecmp(ptr + 1, "png") == 0)
             return save_png(file_name);
     }
 
@@ -1012,7 +976,7 @@ static bool save_png(const char *file_name)
         goto save_png_done;
 
     for (int i = 0; i < kContextHeight; i++)
-        row_pointers[i] = screenshot + ((kContextWidth * ((kContextHeight-1) - i)) * 3);
+        row_pointers[i] = screenshot + ((kContextWidth * ((kContextHeight - 1) - i)) * 3);
 
     png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
     if (png_ptr == NULL)
@@ -1039,9 +1003,9 @@ static bool save_png(const char *file_name)
     if (setjmp(png_jmpbuf(png_ptr)))
         goto save_png_done;
 
-       png_write_image(png_ptr, row_pointers);
+    png_write_image(png_ptr, row_pointers);
 
-       if (setjmp(png_jmpbuf(png_ptr)))
+    if (setjmp(png_jmpbuf(png_ptr)))
         goto save_png_done;
 
     png_write_end(png_ptr, NULL);
index a4dcb496e8735e42f50df61eea64954beb9a21df..52b9b207b20984374edb08d0458b7996b85dab92 100644 (file)
@@ -87,9 +87,18 @@ Person player[maxplayers];
 
 /* convenience functions
  */
-Joint& Person::joint(int bodypart) { return skeleton.joints[skeleton.jointlabels[bodypart]]; }
-XYZ& Person::jointPos(int bodypart) { return joint(bodypart).position; }
-XYZ& Person::jointVel(int bodypart) { return joint(bodypart).velocity; }
+Joint& Person::joint(int bodypart)
+{
+    return skeleton.joints[skeleton.jointlabels[bodypart]];
+}
+XYZ& Person::jointPos(int bodypart)
+{
+    return joint(bodypart).position;
+}
+XYZ& Person::jointVel(int bodypart)
+{
+    return joint(bodypart).velocity;
+}
 
 /* EFFECT
  *
@@ -510,7 +519,7 @@ void Person::DoBloodBig(float howmuch, int which)
         if (creature == rabbittype)
             for (i = 0; i < 512; i++) {
                 for (j = 0; j < 512; j++) {
-                    if (bloodText[i*512*3 + j*3 + 0] <= which + 4 && bloodText[i*512*3 + j*3 + 0] >= which - 4) {
+                    if (bloodText[i * 512 * 3 + j * 3 + 0] <= which + 4 && bloodText[i * 512 * 3 + j * 3 + 0] >= which - 4) {
                         if (i < startx) startx = i;
                         if (j < starty) starty = j;
                         if (i > endx) endx = i;
@@ -521,7 +530,7 @@ void Person::DoBloodBig(float howmuch, int which)
         if (creature == wolftype)
             for (i = 0; i < 512; i++) {
                 for (j = 0; j < 512; j++) {
-                    if (wolfbloodText[i*512*3 + j*3 + 0] <= which + 4 && wolfbloodText[i*512*3 + j*3 + 0] >= which - 4) {
+                    if (wolfbloodText[i * 512 * 3 + j * 3 + 0] <= which + 4 && wolfbloodText[i * 512 * 3 + j * 3 + 0] >= which - 4) {
                         if (i < startx) startx = i;
                         if (j < starty) starty = j;
                         if (i > endx) endx = i;
@@ -5876,7 +5885,8 @@ void Person::DoStuff()
 /* EFFECT
  * inverse kinematics helper function
  */
-void IKHelper(Person *p, float interp){
+void IKHelper(Person *p, float interp)
+{
     XYZ point, newpoint, change, change2;
     float heightleft, heightright;
 
@@ -5979,9 +5989,9 @@ int Person::DrawSkeleton()
             if (!isSleeping() && !isSitting()) {
                 // TODO: give these meaningful names
                 const bool cond1 = (isIdle() || isCrouch() || isLanding() || isLandhard()
-                        || animTarget == drawrightanim || animTarget == drawleftanim || animTarget == crouchdrawrightanim);
+                                    || animTarget == drawrightanim || animTarget == drawleftanim || animTarget == crouchdrawrightanim);
                 const bool cond2 = (wasIdle() || wasCrouch() || wasLanding() || wasLandhard()
-                        || animCurrent == drawrightanim || animCurrent == drawleftanim || animCurrent == crouchdrawrightanim);
+                                    || animCurrent == drawrightanim || animCurrent == drawleftanim || animCurrent == crouchdrawrightanim);
 
                 if (onterrain && (cond1 && cond2) && !skeleton.free) {
                     IKHelper(this, 1);
@@ -6087,21 +6097,21 @@ int Person::DrawSkeleton()
                             glMatrixMode(GL_MODELVIEW);
                             glPushMatrix();
                             if (p1 == abdomen || p2 == abdomen)
-                                glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionbody.x,
-                                             (v0.y * (1-morphness) + v1.y * morphness) * proportionbody.y,
-                                             (v0.z * (1-morphness) + v1.z * morphness) * proportionbody.z);
+                                glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionbody.x,
+                                             (v0.y * (1 - morphness) + v1.y * morphness) * proportionbody.y,
+                                             (v0.z * (1 - morphness) + v1.z * morphness) * proportionbody.z);
                             if (p1 == lefthand || p1 == righthand || p1 == leftwrist || p1 == rightwrist || p1 == leftelbow || p1 == rightelbow || p2 == leftelbow || p2 == rightelbow)
-                                glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionarms.x,
-                                             (v0.y * (1-morphness) + v1.y * morphness) * proportionarms.y,
-                                             (v0.z * (1-morphness) + v1.z * morphness) * proportionarms.z);
+                                glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionarms.x,
+                                             (v0.y * (1 - morphness) + v1.y * morphness) * proportionarms.y,
+                                             (v0.z * (1 - morphness) + v1.z * morphness) * proportionarms.z);
                             if (p1 == leftfoot || p1 == rightfoot || p1 == leftankle || p1 == rightankle || p1 == leftknee || p1 == rightknee || p2 == leftknee || p2 == rightknee)
-                                glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionlegs.x,
-                                             (v0.y * (1-morphness) + v1.y * morphness) * proportionlegs.y,
-                                             (v0.z * (1-morphness) + v1.z * morphness) * proportionlegs.z);
+                                glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionlegs.x,
+                                             (v0.y * (1 - morphness) + v1.y * morphness) * proportionlegs.y,
+                                             (v0.z * (1 - morphness) + v1.z * morphness) * proportionlegs.z);
                             if (p1 == head || p2 == head)
-                                glTranslatef((v0.x * (1-morphness) + v1.x * morphness) * proportionhead.x,
-                                             (v0.y * (1-morphness) + v1.y * morphness) * proportionhead.y,
-                                             (v0.z * (1-morphness) + v1.z * morphness) * proportionhead.z);
+                                glTranslatef((v0.x * (1 - morphness) + v1.x * morphness) * proportionhead.x,
+                                             (v0.y * (1 - morphness) + v1.y * morphness) * proportionhead.y,
+                                             (v0.z * (1 - morphness) + v1.z * morphness) * proportionhead.z);
                             glGetFloatv(GL_MODELVIEW_MATRIX, M);
                             //if(!isnormal(M[12])||!isnormal(M[13])||!isnormal(M[14]))test=0;
                             //if(!isnormal(scale))test=1;
@@ -6640,16 +6650,16 @@ int Person::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate,
                         intersecting = 1;
                     if (!intersecting)
                         intersecting = sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[0]],
-                                                         &model->vertex[model->Triangles[j].vertex[1]],
-                                                         p1, &radius);
+                                                                &model->vertex[model->Triangles[j].vertex[1]],
+                                                                p1, &radius);
                     if (!intersecting)
                         intersecting = sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[1]],
-                                                         &model->vertex[model->Triangles[j].vertex[2]],
-                                                         p1, &radius);
+                                                                &model->vertex[model->Triangles[j].vertex[2]],
+                                                                p1, &radius);
                     if (!intersecting)
                         intersecting = sphere_line_intersection(&model->vertex[model->Triangles[j].vertex[0]],
-                                                         &model->vertex[model->Triangles[j].vertex[2]],
-                                                         p1, &radius);
+                                                                &model->vertex[model->Triangles[j].vertex[2]],
+                                                                p1, &radius);
                     end = *p1 - point;
                     if (dotproduct(&model->facenormals[j], &end) > 0 && intersecting) {
                         start = *p1;
@@ -6707,21 +6717,21 @@ int Person::SphereCheck(XYZ *p1, float radius, XYZ *p, XYZ *move, float *rotate,
                 XYZ &v1 = model->vertex[model->Triangles[j].vertex[1]];
                 XYZ &v2 = model->vertex[model->Triangles[j].vertex[2]];
                 distance = abs((model->facenormals[j].x * start.x)
-                        + (model->facenormals[j].y * start.y)
-                        + (model->facenormals[j].z * start.z)
-                        - ((model->facenormals[j].x * v0.x)
-                            + (model->facenormals[j].y * v0.y)
-                            + (model->facenormals[j].z * v0.z)));
+                               + (model->facenormals[j].y * start.y)
+                               + (model->facenormals[j].z * start.z)
+                               - ((model->facenormals[j].x * v0.x)
+                                  + (model->facenormals[j].y * v0.y)
+                                  + (model->facenormals[j].z * v0.z)));
                 if (distance < radius * .5) {
                     point = start - model->facenormals[j] * distance;
                     if (PointInTriangle( &point, model->facenormals[j], &v0, &v1, &v2))
                         intersecting = 1;
                     if (!intersecting)
-                        intersecting = sphere_line_intersection(v0.x,v0.y,v0.z, v1.x,v1.y,v1.z, p1->x, p1->y, p1->z, radius / 2);
+                        intersecting = sphere_line_intersection(v0.x, v0.y, v0.z, v1.x, v1.y, v1.z, p1->x, p1->y, p1->z, radius / 2);
                     if (!intersecting)
-                        intersecting = sphere_line_intersection(v1.x,v1.y,v1.z, v2.x,v2.y,v2.z, p1->x, p1->y, p1->z, radius / 2);
+                        intersecting = sphere_line_intersection(v1.x, v1.y, v1.z, v2.x, v2.y, v2.z, p1->x, p1->y, p1->z, radius / 2);
                     if (!intersecting)
-                        intersecting = sphere_line_intersection(v0.x,v0.y,v0.z, v2.x,v2.y,v2.z, p1->x, p1->y, p1->z, radius / 2);
+                        intersecting = sphere_line_intersection(v0.x, v0.y, v0.z, v2.x, v2.y, v2.z, p1->x, p1->y, p1->z, radius / 2);
                     end = *p1 - point;
                     if (dotproduct(&model->facenormals[j], &end) > 0 && intersecting) {
                         if ((animTarget == jumpdownanim || animTarget == jumpupanim || isFlip())) {
index 75aa7a861e0893decb57f8d6bd5d484479519e55..70821b916988174368b96549ea27c7c5a16e237f 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -33,7 +33,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 float  const   pi      = 3.14159265f;
 float  const   g       = -32.174f;             // acceleration due to gravity, ft/s^2
 float  const   rho = 0.0023769f;       // desity of air at sea level, slugs/ft^3
-float  const   tol = 0.0000000001f;            // float type tolerance 
+float  const   tol = 0.0000000001f;            // float type tolerance
 
 
 //------------------------------------------------------------------------//
@@ -44,36 +44,37 @@ inline      float   RadiansToDegrees(float rad);
 
 inline float   DegreesToRadians(float deg)
 {
-       return deg * pi / 180.0f;
+    return deg * pi / 180.0f;
 }
 
 inline float   RadiansToDegrees(float rad)
-{      
-       return rad * 180.0f / pi;
+{
+    return rad * 180.0f / pi;
 }
 
 //------------------------------------------------------------------------//
 // Vector Class and vector functions
 //------------------------------------------------------------------------//
-class Vector {
+class Vector
+{
 public:
-       float x;
-       float y;
-       float z;
+    float x;
+    float y;
+    float z;
 
-       Vector(void);
-       Vector(float xi, float yi, float zi);
+    Vector(void);
+    Vector(float xi, float yi, float zi);
 
-       float Magnitude(void);
-       void  Normalize(void);
-       void  Reverse(void);
+    float Magnitude(void);
+    void  Normalize(void);
+    void  Reverse(void);
 
-       Vector& operator+=(Vector u);   // vector addition
-       Vector& operator-=(Vector u);   // vector subtraction
-       Vector& operator*=(float s);    // scalar multiply
-       Vector& operator/=(float s);    // scalar divide
+    Vector& operator+=(Vector u);      // vector addition
+    Vector& operator-=(Vector u);      // vector subtraction
+    Vector& operator*=(float s);       // scalar multiply
+    Vector& operator/=(float s);       // scalar divide
 
-       Vector operator-(void);
+    Vector operator-(void);
 
 };
 
@@ -88,7 +89,7 @@ inline        float TripleScalarProduct(Vector u, Vector v, Vector w);
 /*
 float fast_sqrt2 (register float arg);
 float fast_sqrt2 (register float arg)
-{      
+{
 // Can replace with slower return std::sqrt(arg);
 register float result;
 
@@ -96,7 +97,7 @@ if (arg == 0.0) return 0.0;
 
 asm {
 frsqrte                result,arg                      // Calculate Square root
-}      
+}
 
 // Newton Rhapson iterations.
 result = result + 0.5 * result * (1.0 - arg * result * result);
@@ -107,127 +108,127 @@ return result * arg;
 */
 inline Vector::Vector(void)
 {
-       x = 0;
-       y = 0;
-       z = 0;
+    x = 0;
+    y = 0;
+    z = 0;
 }
 
 inline Vector::Vector(float xi, float yi, float zi)
 {
-       x = xi;
-       y = yi;
-       z = zi;
+    x = xi;
+    y = yi;
+    z = zi;
 }
 
 inline float Vector::Magnitude(void)
 {
-       return (float) sqrt(x*x + y*y + z*z);
+    return (float) sqrt(x * x + y * y + z * z);
 }
 
 inline void  Vector::Normalize(void)
 {
-       float m = (float) sqrt(x*x + y*y + z*z);
-       if(m <= tol) m = 1;
-       x /= m;
-       y /= m;
-       z /= m; 
+    float m = (float) sqrt(x * x + y * y + z * z);
+    if (m <= tol) m = 1;
+    x /= m;
+    y /= m;
+    z /= m;
 
-       if (fabs(x) < tol) x = 0.0f;
-       if (fabs(y) < tol) y = 0.0f;
-       if (fabs(z) < tol) z = 0.0f;
+    if (fabs(x) < tol) x = 0.0f;
+    if (fabs(y) < tol) y = 0.0f;
+    if (fabs(z) < tol) z = 0.0f;
 }
 
 inline void  Vector::Reverse(void)
 {
-       x = -x;
-       y = -y;
-       z = -z;
+    x = -x;
+    y = -y;
+    z = -z;
 }
 
 inline Vector& Vector::operator+=(Vector u)
 {
-       x += u.x;
-       y += u.y;
-       z += u.z;
-       return *this;
+    x += u.x;
+    y += u.y;
+    z += u.z;
+    return *this;
 }
 
 inline Vector& Vector::operator-=(Vector u)
 {
-       x -= u.x;
-       y -= u.y;
-       z -= u.z;
-       return *this;
+    x -= u.x;
+    y -= u.y;
+    z -= u.z;
+    return *this;
 }
 
 inline Vector& Vector::operator*=(float s)
 {
-       x *= s;
-       y *= s;
-       z *= s;
-       return *this;
+    x *= s;
+    y *= s;
+    z *= s;
+    return *this;
 }
 
 inline Vector& Vector::operator/=(float s)
 {
-       x /= s;
-       y /= s;
-       z /= s;
-       return *this;
+    x /= s;
+    y /= s;
+    z /= s;
+    return *this;
 }
 
 inline Vector Vector::operator-(void)
 {
-       return Vector(-x, -y, -z);
+    return Vector(-x, -y, -z);
 }
 
 
 inline Vector operator+(Vector u, Vector v)
 {
-       return Vector(u.x + v.x, u.y + v.y, u.z + v.z);
+    return Vector(u.x + v.x, u.y + v.y, u.z + v.z);
 }
 
 inline Vector operator-(Vector u, Vector v)
 {
-       return Vector(u.x - v.x, u.y - v.y, u.z - v.z);
+    return Vector(u.x - v.x, u.y - v.y, u.z - v.z);
 }
 
 // Vector cross product (u cross v)
 inline Vector operator^(Vector u, Vector v)
 {
-       return Vector(  u.y*v.z - u.z*v.y,
-               -u.x*v.z + u.z*v.x,
-               u.x*v.y - u.y*v.x );
+    return Vector(     u.y * v.z - u.z * v.y,
+                    -u.x * v.z + u.z * v.x,
+                    u.x * v.y - u.y * v.x );
 }
 
 // Vector dot product
 inline float operator*(Vector u, Vector v)
 {
-       return (u.x*v.x + u.y*v.y + u.z*v.z);
+    return (u.x * v.x + u.y * v.y + u.z * v.z);
 }
 
 inline Vector operator*(float s, Vector u)
 {
-       return Vector(u.x*s, u.y*s, u.z*s);
+    return Vector(u.x * s, u.y * s, u.z * s);
 }
 
 inline Vector operator*(Vector u, float s)
 {
-       return Vector(u.x*s, u.y*s, u.z*s);
+    return Vector(u.x * s, u.y * s, u.z * s);
 }
 
 inline Vector operator/(Vector u, float s)
 {
-       return Vector(u.x/s, u.y/s, u.z/s);
+    return Vector(u.x / s, u.y / s, u.z / s);
 }
 
 // triple scalar product (u dot (v cross w))
 inline float TripleScalarProduct(Vector u, Vector v, Vector w)
 {
-       return float(   (u.x * (v.y*w.z - v.z*w.y)) +
-               (u.y * (-v.x*w.z + v.z*w.x)) +
-               (u.z * (v.x*w.y - v.y*w.x)) );
-       //return u*(v^w);
+    return float(      (u.x * (v.y * w.z - v.z * w.y)) +
+                    (u.y * (-v.x * w.z + v.z * w.x)) +
+                    (u.z * (v.x * w.y - v.y * w.x)) );
+    //return u*(v^w);
 
 }
 
@@ -237,24 +238,25 @@ inline    float TripleScalarProduct(Vector u, Vector v, Vector w)
 // Matrix Class and matrix functions
 //------------------------------------------------------------------------//
 
-class Matrix3x3 {
+class Matrix3x3
+{
 public:
-       // elements eij: i -> row, j -> column
-       float   e11, e12, e13, e21, e22, e23, e31, e32, e33;    
-
-       Matrix3x3(void);
-       Matrix3x3(      float r1c1, float r1c2, float r1c3, 
-               float r2c1, float r2c2, float r2c3, 
-               float r3c1, float r3c2, float r3c3 );
-
-       float   det(void);
-       Matrix3x3       Transpose(void);
-       Matrix3x3       Inverse(void);
-
-       Matrix3x3& operator+=(Matrix3x3 m);
-       Matrix3x3& operator-=(Matrix3x3 m);
-       Matrix3x3& operator*=(float s);
-       Matrix3x3& operator/=(float s);
+    // elements eij: i -> row, j -> column
+    float      e11, e12, e13, e21, e22, e23, e31, e32, e33;
+
+    Matrix3x3(void);
+    Matrix3x3( float r1c1, float r1c2, float r1c3,
+                float r2c1, float r2c2, float r2c3,
+                float r3c1, float r3c2, float r3c3 );
+
+    float      det(void);
+    Matrix3x3  Transpose(void);
+    Matrix3x3  Inverse(void);
+
+    Matrix3x3& operator+=(Matrix3x3 m);
+    Matrix3x3& operator-=(Matrix3x3 m);
+    Matrix3x3& operator*=(float s);
+    Matrix3x3& operator/=(float s);
 };
 
 inline Matrix3x3 operator+(Matrix3x3 m1, Matrix3x3 m2);
@@ -272,237 +274,240 @@ inline  Vector operator*(Vector u, Matrix3x3 m);
 
 inline Matrix3x3::Matrix3x3(void)
 {
-       e11 = 0;
-       e12 = 0;
-       e13 = 0;
-       e21 = 0;
-       e22 = 0;
-       e23 = 0;
-       e31 = 0;
-       e32 = 0;
-       e33 = 0;
+    e11 = 0;
+    e12 = 0;
+    e13 = 0;
+    e21 = 0;
+    e22 = 0;
+    e23 = 0;
+    e31 = 0;
+    e32 = 0;
+    e33 = 0;
 }
 
-inline Matrix3x3::Matrix3x3(   float r1c1, float r1c2, float r1c3, 
-                                                        float r2c1, float r2c2, float r2c3, 
-                                                        float r3c1, float r3c2, float r3c3 )
+inline Matrix3x3::Matrix3x3(   float r1c1, float r1c2, float r1c3,
+                                float r2c1, float r2c2, float r2c3,
+                                float r3c1, float r3c2, float r3c3 )
 {
-       e11 = r1c1;
-       e12 = r1c2;
-       e13 = r1c3;
-       e21 = r2c1;
-       e22 = r2c2;
-       e23 = r2c3;
-       e31 = r3c1;
-       e32 = r3c2;
-       e33 = r3c3;
+    e11 = r1c1;
+    e12 = r1c2;
+    e13 = r1c3;
+    e21 = r2c1;
+    e22 = r2c2;
+    e23 = r2c3;
+    e31 = r3c1;
+    e32 = r3c2;
+    e33 = r3c3;
 }
 
 inline float   Matrix3x3::det(void)
 {
-       return  e11*e22*e33 - 
-               e11*e32*e23 + 
-               e21*e32*e13 - 
-               e21*e12*e33 + 
-               e31*e12*e23 - 
-               e31*e22*e13;    
+    return     e11 * e22 * e33 -
+            e11 * e32 * e23 +
+            e21 * e32 * e13 -
+            e21 * e12 * e33 +
+            e31 * e12 * e23 -
+            e31 * e22 * e13;
 }
 
 inline Matrix3x3       Matrix3x3::Transpose(void)
 {
-       return Matrix3x3(e11,e21,e31,e12,e22,e32,e13,e23,e33);
+    return Matrix3x3(e11, e21, e31, e12, e22, e32, e13, e23, e33);
 }
 
 inline Matrix3x3       Matrix3x3::Inverse(void)
 {
-       float   d = e11*e22*e33 - 
-               e11*e32*e23 + 
-               e21*e32*e13 - 
-               e21*e12*e33 + 
-               e31*e12*e23 - 
-               e31*e22*e13;
+    float      d = e11 * e22 * e33 -
+                e11 * e32 * e23 +
+                e21 * e32 * e13 -
+                e21 * e12 * e33 +
+                e31 * e12 * e23 -
+                e31 * e22 * e13;
 
-       if (d == 0) d = 1;
+    if (d == 0) d = 1;
 
-       return  Matrix3x3(      (e22*e33-e23*e32)/d,
-               -(e12*e33-e13*e32)/d,
-               (e12*e23-e13*e22)/d,
-               -(e21*e33-e23*e31)/d,
-               (e11*e33-e13*e31)/d,
-               -(e11*e23-e13*e21)/d,
-               (e21*e32-e22*e31)/d,
-               -(e11*e32-e12*e31)/d,
-               (e11*e22-e12*e21)/d );  
+    return     Matrix3x3(      (e22 * e33 - e23 * e32) / d,
+                        -(e12 * e33 - e13 * e32) / d,
+                        (e12 * e23 - e13 * e22) / d,
+                        -(e21 * e33 - e23 * e31) / d,
+                        (e11 * e33 - e13 * e31) / d,
+                        -(e11 * e23 - e13 * e21) / d,
+                        (e21 * e32 - e22 * e31) / d,
+                        -(e11 * e32 - e12 * e31) / d,
+                        (e11 * e22 - e12 * e21) / d );
 }
 
 inline Matrix3x3& Matrix3x3::operator+=(Matrix3x3 m)
 {
-       e11 += m.e11;
-       e12 += m.e12;
-       e13 += m.e13;
-       e21 += m.e21;
-       e22 += m.e22;
-       e23 += m.e23;
-       e31 += m.e31;
-       e32 += m.e32;
-       e33 += m.e33;
-       return *this;
+    e11 += m.e11;
+    e12 += m.e12;
+    e13 += m.e13;
+    e21 += m.e21;
+    e22 += m.e22;
+    e23 += m.e23;
+    e31 += m.e31;
+    e32 += m.e32;
+    e33 += m.e33;
+    return *this;
 }
 
 inline Matrix3x3& Matrix3x3::operator-=(Matrix3x3 m)
 {
-       e11 -= m.e11;
-       e12 -= m.e12;
-       e13 -= m.e13;
-       e21 -= m.e21;
-       e22 -= m.e22;
-       e23 -= m.e23;
-       e31 -= m.e31;
-       e32 -= m.e32;
-       e33 -= m.e33;
-       return *this;
+    e11 -= m.e11;
+    e12 -= m.e12;
+    e13 -= m.e13;
+    e21 -= m.e21;
+    e22 -= m.e22;
+    e23 -= m.e23;
+    e31 -= m.e31;
+    e32 -= m.e32;
+    e33 -= m.e33;
+    return *this;
 }
 
 inline Matrix3x3& Matrix3x3::operator*=(float s)
 {
-       e11 *= s;
-       e12 *= s;
-       e13 *= s;
-       e21 *= s;
-       e22 *= s;
-       e23 *= s;
-       e31 *= s;
-       e32 *= s;
-       e33 *= s;
-       return *this;
+    e11 *= s;
+    e12 *= s;
+    e13 *= s;
+    e21 *= s;
+    e22 *= s;
+    e23 *= s;
+    e31 *= s;
+    e32 *= s;
+    e33 *= s;
+    return *this;
 }
 
 inline Matrix3x3& Matrix3x3::operator/=(float s)
 {
-       e11 /= s;
-       e12 /= s;
-       e13 /= s;
-       e21 /= s;
-       e22 /= s;
-       e23 /= s;
-       e31 /= s;
-       e32 /= s;
-       e33 /= s;
-       return *this;
+    e11 /= s;
+    e12 /= s;
+    e13 /= s;
+    e21 /= s;
+    e22 /= s;
+    e23 /= s;
+    e31 /= s;
+    e32 /= s;
+    e33 /= s;
+    return *this;
 }
 
 inline Matrix3x3 operator+(Matrix3x3 m1, Matrix3x3 m2)
 {
-       return  Matrix3x3(      m1.e11+m2.e11,
-               m1.e12+m2.e12,
-               m1.e13+m2.e13,
-               m1.e21+m2.e21,
-               m1.e22+m2.e22,
-               m1.e23+m2.e23,
-               m1.e31+m2.e31,
-               m1.e32+m2.e32,
-               m1.e33+m2.e33);
+    return     Matrix3x3(      m1.e11 + m2.e11,
+                        m1.e12 + m2.e12,
+                        m1.e13 + m2.e13,
+                        m1.e21 + m2.e21,
+                        m1.e22 + m2.e22,
+                        m1.e23 + m2.e23,
+                        m1.e31 + m2.e31,
+                        m1.e32 + m2.e32,
+                        m1.e33 + m2.e33);
 }
 
 inline Matrix3x3 operator-(Matrix3x3 m1, Matrix3x3 m2)
 {
-       return  Matrix3x3(      m1.e11-m2.e11,
-               m1.e12-m2.e12,
-               m1.e13-m2.e13,
-               m1.e21-m2.e21,
-               m1.e22-m2.e22,
-               m1.e23-m2.e23,
-               m1.e31-m2.e31,
-               m1.e32-m2.e32,
-               m1.e33-m2.e33);
+    return     Matrix3x3(      m1.e11 - m2.e11,
+                        m1.e12 - m2.e12,
+                        m1.e13 - m2.e13,
+                        m1.e21 - m2.e21,
+                        m1.e22 - m2.e22,
+                        m1.e23 - m2.e23,
+                        m1.e31 - m2.e31,
+                        m1.e32 - m2.e32,
+                        m1.e33 - m2.e33);
 }
 
 inline Matrix3x3 operator/(Matrix3x3 m, float s)
-{      
-       return  Matrix3x3(      m.e11/s,
-               m.e12/s,
-               m.e13/s,
-               m.e21/s,
-               m.e22/s,
-               m.e23/s,
-               m.e31/s,
-               m.e32/s,
-               m.e33/s);
+{
+    return     Matrix3x3(      m.e11 / s,
+                        m.e12 / s,
+                        m.e13 / s,
+                        m.e21 / s,
+                        m.e22 / s,
+                        m.e23 / s,
+                        m.e31 / s,
+                        m.e32 / s,
+                        m.e33 / s);
 }
 
 inline Matrix3x3 operator*(Matrix3x3 m1, Matrix3x3 m2)
 {
-       return Matrix3x3(       m1.e11*m2.e11 + m1.e12*m2.e21 + m1.e13*m2.e31,
-               m1.e11*m2.e12 + m1.e12*m2.e22 + m1.e13*m2.e32,
-               m1.e11*m2.e13 + m1.e12*m2.e23 + m1.e13*m2.e33,
-               m1.e21*m2.e11 + m1.e22*m2.e21 + m1.e23*m2.e31,
-               m1.e21*m2.e12 + m1.e22*m2.e22 + m1.e23*m2.e32,
-               m1.e21*m2.e13 + m1.e22*m2.e23 + m1.e23*m2.e33,
-               m1.e31*m2.e11 + m1.e32*m2.e21 + m1.e33*m2.e31,
-               m1.e31*m2.e12 + m1.e32*m2.e22 + m1.e33*m2.e32,
-               m1.e31*m2.e13 + m1.e32*m2.e23 + m1.e33*m2.e33 );
+    return Matrix3x3(  m1.e11 * m2.e11 + m1.e12 * m2.e21 + m1.e13 * m2.e31,
+                        m1.e11 * m2.e12 + m1.e12 * m2.e22 + m1.e13 * m2.e32,
+                        m1.e11 * m2.e13 + m1.e12 * m2.e23 + m1.e13 * m2.e33,
+                        m1.e21 * m2.e11 + m1.e22 * m2.e21 + m1.e23 * m2.e31,
+                        m1.e21 * m2.e12 + m1.e22 * m2.e22 + m1.e23 * m2.e32,
+                        m1.e21 * m2.e13 + m1.e22 * m2.e23 + m1.e23 * m2.e33,
+                        m1.e31 * m2.e11 + m1.e32 * m2.e21 + m1.e33 * m2.e31,
+                        m1.e31 * m2.e12 + m1.e32 * m2.e22 + m1.e33 * m2.e32,
+                        m1.e31 * m2.e13 + m1.e32 * m2.e23 + m1.e33 * m2.e33 );
 }
 
 inline Matrix3x3 operator*(Matrix3x3 m, float s)
 {
-       return  Matrix3x3(      m.e11*s,
-               m.e12*s,
-               m.e13*s,
-               m.e21*s,
-               m.e22*s,
-               m.e23*s,
-               m.e31*s,
-               m.e32*s,
-               m.e33*s);
+    return     Matrix3x3(      m.e11 * s,
+                        m.e12 * s,
+                        m.e13 * s,
+                        m.e21 * s,
+                        m.e22 * s,
+                        m.e23 * s,
+                        m.e31 * s,
+                        m.e32 * s,
+                        m.e33 * s);
 }
 
 inline Matrix3x3 operator*(float s, Matrix3x3 m)
 {
-       return  Matrix3x3(      m.e11*s,
-               m.e12*s,
-               m.e13*s,
-               m.e21*s,
-               m.e22*s,
-               m.e23*s,
-               m.e31*s,
-               m.e32*s,
-               m.e33*s);
+    return     Matrix3x3(      m.e11 * s,
+                        m.e12 * s,
+                        m.e13 * s,
+                        m.e21 * s,
+                        m.e22 * s,
+                        m.e23 * s,
+                        m.e31 * s,
+                        m.e32 * s,
+                        m.e33 * s);
 }
 
 inline Vector operator*(Matrix3x3 m, Vector u)
 {
-       return Vector(  m.e11*u.x + m.e12*u.y + m.e13*u.z,
-               m.e21*u.x + m.e22*u.y + m.e23*u.z,
-               m.e31*u.x + m.e32*u.y + m.e33*u.z);                                     
+    return Vector(     m.e11 * u.x + m.e12 * u.y + m.e13 * u.z,
+                    m.e21 * u.x + m.e22 * u.y + m.e23 * u.z,
+                    m.e31 * u.x + m.e32 * u.y + m.e33 * u.z);
 }
 
 inline Vector operator*(Vector u, Matrix3x3 m)
 {
-       return Vector(  u.x*m.e11 + u.y*m.e21 + u.z*m.e31,
-               u.x*m.e12 + u.y*m.e22 + u.z*m.e32,
-               u.x*m.e13 + u.y*m.e23 + u.z*m.e33);
+    return Vector(     u.x * m.e11 + u.y * m.e21 + u.z * m.e31,
+                    u.x * m.e12 + u.y * m.e22 + u.z * m.e32,
+                    u.x * m.e13 + u.y * m.e23 + u.z * m.e33);
 }
 
 //------------------------------------------------------------------------//
 // Quaternion Class and Quaternion functions
 //------------------------------------------------------------------------//
 
-class Quaternion {
+class Quaternion
+{
 public:
-       float   n;      // number (scalar) part
-       Vector  v;      // vector part: v.x, v.y, v.z
-
-       Quaternion(void);
-       Quaternion(float e0, float e1, float e2, float e3);
-
-       float   Magnitude(void);
-       Vector  GetVector(void);
-       float   GetScalar(void);
-       Quaternion      operator+=(Quaternion q);
-       Quaternion      operator-=(Quaternion q);
-       Quaternion operator*=(float s);
-       Quaternion operator/=(float s);
-       Quaternion      operator~(void) const { return Quaternion(n, -v.x, -v.y, -v.z);}
+    float      n;      // number (scalar) part
+    Vector     v;      // vector part: v.x, v.y, v.z
+
+    Quaternion(void);
+    Quaternion(float e0, float e1, float e2, float e3);
+
+    float      Magnitude(void);
+    Vector     GetVector(void);
+    float      GetScalar(void);
+    Quaternion operator+=(Quaternion q);
+    Quaternion operator-=(Quaternion q);
+    Quaternion operator*=(float s);
+    Quaternion operator/=(float s);
+    Quaternion operator~(void) const {
+        return Quaternion(n, -v.x, -v.y, -v.z);
+    }
 };
 
 inline Quaternion operator+(Quaternion q1, Quaternion q2);
@@ -523,69 +528,69 @@ inline    Vector  MakeEulerAnglesFromQ(Quaternion q);
 
 inline Quaternion::Quaternion(void)
 {
-       n = 0;
-       v.x = 0;
-       v.y =  0;
-       v.z = 0;
+    n = 0;
+    v.x = 0;
+    v.y =  0;
+    v.z = 0;
 }
 
 inline Quaternion::Quaternion(float e0, float e1, float e2, float e3)
 {
-       n = e0;
-       v.x = e1;
-       v.y = e2;
-       v.z = e3;
+    n = e0;
+    v.x = e1;
+    v.y = e2;
+    v.z = e3;
 }
 
 inline float   Quaternion::Magnitude(void)
 {
-       return (float) sqrt(n*n + v.x*v.x + v.y*v.y + v.z*v.z);
+    return (float) sqrt(n * n + v.x * v.x + v.y * v.y + v.z * v.z);
 }
 
 inline Vector  Quaternion::GetVector(void)
 {
-       return Vector(v.x, v.y, v.z);
+    return Vector(v.x, v.y, v.z);
 }
 
 inline float   Quaternion::GetScalar(void)
 {
-       return n;
+    return n;
 }
 
 inline Quaternion      Quaternion::operator+=(Quaternion q)
 {
-       n += q.n;
-       v.x += q.v.x;
-       v.y += q.v.y;
-       v.z += q.v.z;
-       return *this;
+    n += q.n;
+    v.x += q.v.x;
+    v.y += q.v.y;
+    v.z += q.v.z;
+    return *this;
 }
 
 inline Quaternion      Quaternion::operator-=(Quaternion q)
 {
-       n -= q.n;
-       v.x -= q.v.x;
-       v.y -= q.v.y;
-       v.z -= q.v.z;
-       return *this;
+    n -= q.n;
+    v.x -= q.v.x;
+    v.y -= q.v.y;
+    v.z -= q.v.z;
+    return *this;
 }
 
 inline Quaternion Quaternion::operator*=(float s)
 {
-       n *= s;
-       v.x *= s;
-       v.y *= s;
-       v.z *= s;
-       return *this;
+    n *= s;
+    v.x *= s;
+    v.y *= s;
+    v.z *= s;
+    return *this;
 }
 
 inline Quaternion Quaternion::operator/=(float s)
 {
-       n /= s;
-       v.x /= s;
-       v.y /= s;
-       v.z /= s;
-       return *this;
+    n /= s;
+    v.x /= s;
+    v.y /= s;
+    v.z /= s;
+    return *this;
 }
 
 /*inline       Quaternion      Quaternion::operator~()
@@ -595,157 +600,156 @@ return Quaternion(n, -v.x, -v.y, -v.z);
 
 inline Quaternion operator+(Quaternion q1, Quaternion q2)
 {
-       return  Quaternion(     q1.n + q2.n,
-               q1.v.x + q2.v.x,
-               q1.v.y + q2.v.y,
-               q1.v.z + q2.v.z);
+    return     Quaternion(     q1.n + q2.n,
+                        q1.v.x + q2.v.x,
+                        q1.v.y + q2.v.y,
+                        q1.v.z + q2.v.z);
 }
 
 inline Quaternion operator-(Quaternion q1, Quaternion q2)
 {
-       return  Quaternion(     q1.n - q2.n,
-               q1.v.x - q2.v.x,
-               q1.v.y - q2.v.y,
-               q1.v.z - q2.v.z);
+    return     Quaternion(     q1.n - q2.n,
+                        q1.v.x - q2.v.x,
+                        q1.v.y - q2.v.y,
+                        q1.v.z - q2.v.z);
 }
 
 inline Quaternion operator*(Quaternion q1, Quaternion q2)
 {
-       return  Quaternion(     q1.n*q2.n - q1.v.x*q2.v.x - q1.v.y*q2.v.y - q1.v.z*q2.v.z,
-               q1.n*q2.v.x + q1.v.x*q2.n + q1.v.y*q2.v.z - q1.v.z*q2.v.y,
-               q1.n*q2.v.y + q1.v.y*q2.n + q1.v.z*q2.v.x - q1.v.x*q2.v.z,
-               q1.n*q2.v.z + q1.v.z*q2.n + q1.v.x*q2.v.y - q1.v.y*q2.v.x);                                                     
+    return     Quaternion(     q1.n * q2.n - q1.v.x * q2.v.x - q1.v.y * q2.v.y - q1.v.z * q2.v.z,
+                        q1.n * q2.v.x + q1.v.x * q2.n + q1.v.y * q2.v.z - q1.v.z * q2.v.y,
+                        q1.n * q2.v.y + q1.v.y * q2.n + q1.v.z * q2.v.x - q1.v.x * q2.v.z,
+                        q1.n * q2.v.z + q1.v.z * q2.n + q1.v.x * q2.v.y - q1.v.y * q2.v.x);
 }
 
 inline Quaternion operator*(Quaternion q, float s)
 {
-       return  Quaternion(q.n*s, q.v.x*s, q.v.y*s, q.v.z*s);
+    return     Quaternion(q.n * s, q.v.x * s, q.v.y * s, q.v.z * s);
 }
 
 inline Quaternion operator*(float s, Quaternion q)
 {
-       return  Quaternion(q.n*s, q.v.x*s, q.v.y*s, q.v.z*s);
+    return     Quaternion(q.n * s, q.v.x * s, q.v.y * s, q.v.z * s);
 }
 
 inline Quaternion operator*(Quaternion q, Vector v)
 {
-       return  Quaternion(     -(q.v.x*v.x + q.v.y*v.y + q.v.z*v.z),
-               q.n*v.x + q.v.y*v.z - q.v.z*v.y,
-               q.n*v.y + q.v.z*v.x - q.v.x*v.z,
-               q.n*v.z + q.v.x*v.y - q.v.y*v.x);
+    return     Quaternion(     -(q.v.x * v.x + q.v.y * v.y + q.v.z * v.z),
+                        q.n * v.x + q.v.y * v.z - q.v.z * v.y,
+                        q.n * v.y + q.v.z * v.x - q.v.x * v.z,
+                        q.n * v.z + q.v.x * v.y - q.v.y * v.x);
 }
 
 inline Quaternion operator*(Vector v, Quaternion q)
 {
-       return  Quaternion(     -(q.v.x*v.x + q.v.y*v.y + q.v.z*v.z),
-               q.n*v.x + q.v.z*v.y - q.v.y*v.z,
-               q.n*v.y + q.v.x*v.z - q.v.z*v.x,
-               q.n*v.z + q.v.y*v.x - q.v.x*v.y);
+    return     Quaternion(     -(q.v.x * v.x + q.v.y * v.y + q.v.z * v.z),
+                        q.n * v.x + q.v.z * v.y - q.v.y * v.z,
+                        q.n * v.y + q.v.x * v.z - q.v.z * v.x,
+                        q.n * v.z + q.v.y * v.x - q.v.x * v.y);
 }
 
 inline Quaternion operator/(Quaternion q, float s)
 {
-       return  Quaternion(q.n/s, q.v.x/s, q.v.y/s, q.v.z/s);
+    return     Quaternion(q.n / s, q.v.x / s, q.v.y / s, q.v.z / s);
 }
 
 inline float QGetAngle(Quaternion q)
 {
-       return  (float) (2*acosf(q.n));
+    return     (float) (2 * acosf(q.n));
 }
 
 inline Vector QGetAxis(Quaternion q)
 {
-       Vector v;
-       float m;
+    Vector v;
+    float m;
 
-       v = q.GetVector();
-       m = v.Magnitude();
+    v = q.GetVector();
+    m = v.Magnitude();
 
-       if (m <= tol)
-               return Vector();
-       else
-               return v/m;     
+    if (m <= tol)
+        return Vector();
+    else
+        return v / m;
 }
 
 inline Quaternion QRotate(Quaternion q1, Quaternion q2)
 {
-       return  q1*q2*(~q1);
+    return     q1 * q2 * (~q1);
 }
 
 inline Vector  QVRotate(Quaternion q, Vector v)
 {
-       Quaternion t;
+    Quaternion t;
 
 
-       t = q*v*(~q);
+    t = q * v * (~q);
 
-       return  t.GetVector();
+    return     t.GetVector();
 }
 
 inline Quaternion      MakeQFromEulerAngles(float x, float y, float z)
 {
-       Quaternion      q;
-       double  roll = DegreesToRadians(x);
-       double  pitch = DegreesToRadians(y);
-       double  yaw = DegreesToRadians(z);
+    Quaternion q;
+    double     roll = DegreesToRadians(x);
+    double     pitch = DegreesToRadians(y);
+    double     yaw = DegreesToRadians(z);
 
-       double  cyaw, cpitch, croll, syaw, spitch, sroll;
-       double  cyawcpitch, syawspitch, cyawspitch, syawcpitch;
+    double     cyaw, cpitch, croll, syaw, spitch, sroll;
+    double     cyawcpitch, syawspitch, cyawspitch, syawcpitch;
 
-       cyaw = cos(0.5f * yaw);
-       cpitch = cos(0.5f * pitch);
-       croll = cos(0.5f * roll);
-       syaw = sin(0.5f * yaw);
-       spitch = sin(0.5f * pitch);
-       sroll = sin(0.5f * roll);
+    cyaw = cos(0.5f * yaw);
+    cpitch = cos(0.5f * pitch);
+    croll = cos(0.5f * roll);
+    syaw = sin(0.5f * yaw);
+    spitch = sin(0.5f * pitch);
+    sroll = sin(0.5f * roll);
 
-       cyawcpitch = cyaw*cpitch;
-       syawspitch = syaw*spitch;
-       cyawspitch = cyaw*spitch;
-       syawcpitch = syaw*cpitch;
+    cyawcpitch = cyaw * cpitch;
+    syawspitch = syaw * spitch;
+    cyawspitch = cyaw * spitch;
+    syawcpitch = syaw * cpitch;
 
-       q.n = (float) (cyawcpitch * croll + syawspitch * sroll);
-       q.v.x = (float) (cyawcpitch * sroll - syawspitch * croll); 
-       q.v.y = (float) (cyawspitch * croll + syawcpitch * sroll);
-       q.v.z = (float) (syawcpitch * croll - cyawspitch * sroll);
+    q.n = (float) (cyawcpitch * croll + syawspitch * sroll);
+    q.v.x = (float) (cyawcpitch * sroll - syawspitch * croll);
+    q.v.y = (float) (cyawspitch * croll + syawcpitch * sroll);
+    q.v.z = (float) (syawcpitch * croll - cyawspitch * sroll);
 
-       return q;
+    return q;
 }
 
 inline Vector  MakeEulerAnglesFromQ(Quaternion q)
 {
-       double  r11, r21, r31, r32, r33;
-       double  q00, q11, q22, q33;
-       double  tmp;
-       Vector  u;
-
-       q00 = q.n * q.n;
-       q11 = q.v.x * q.v.x;
-       q22 = q.v.y * q.v.y;
-       q33 = q.v.z * q.v.z;
-
-       r11 = q00 + q11 - q22 - q33;
-       r21 = 2 * (q.v.x*q.v.y + q.n*q.v.z);
-       r31 = 2 * (q.v.x*q.v.z - q.n*q.v.y);
-       r32 = 2 * (q.v.y*q.v.z + q.n*q.v.x);
-       r33 = q00 - q11 - q22 + q33;
-
-       tmp = fabs(r31);
-       if(tmp > 0.999999)
-       {
-               double r12 = 2 * (q.v.x*q.v.y - q.n*q.v.z);
-               double r13 = 2 * (q.v.x*q.v.z + q.n*q.v.y);
-
-               u.x = RadiansToDegrees(0.0f); //roll
-               u.y = RadiansToDegrees((float) (-(pi/2) * r31/tmp)); // pitch
-               u.z = RadiansToDegrees((float) atan2(-r12, -r31*r13)); // yaw
-               return u;
-       }
-
-       u.x = RadiansToDegrees((float) atan2(r32, r33)); // roll
-       u.y = RadiansToDegrees((float) asinf(-r31));             // pitch
-       u.z = RadiansToDegrees((float) atan2(r21, r11)); // yaw
-       return u;
+    double     r11, r21, r31, r32, r33;
+    double     q00, q11, q22, q33;
+    double     tmp;
+    Vector     u;
+
+    q00 = q.n * q.n;
+    q11 = q.v.x * q.v.x;
+    q22 = q.v.y * q.v.y;
+    q33 = q.v.z * q.v.z;
+
+    r11 = q00 + q11 - q22 - q33;
+    r21 = 2 * (q.v.x * q.v.y + q.n * q.v.z);
+    r31 = 2 * (q.v.x * q.v.z - q.n * q.v.y);
+    r32 = 2 * (q.v.y * q.v.z + q.n * q.v.x);
+    r33 = q00 - q11 - q22 + q33;
+
+    tmp = fabs(r31);
+    if (tmp > 0.999999) {
+        double r12 = 2 * (q.v.x * q.v.y - q.n * q.v.z);
+        double r13 = 2 * (q.v.x * q.v.z + q.n * q.v.y);
+
+        u.x = RadiansToDegrees(0.0f); //roll
+        u.y = RadiansToDegrees((float) (-(pi / 2) * r31 / tmp)); // pitch
+        u.z = RadiansToDegrees((float) atan2(-r12, -r31 * r13)); // yaw
+        return u;
+    }
+
+    u.x = RadiansToDegrees((float) atan2(r32, r33)); // roll
+    u.y = RadiansToDegrees((float) asinf(-r31));                // pitch
+    u.z = RadiansToDegrees((float) atan2(r21, r11)); // yaw
+    return u;
 
 
 }
index 08394e1a93b4a67f8079eab252822306f7770f58..b73b047be1fce708ab30401576d3b6288cf90b35 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -24,507 +24,520 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 // Functions
 quaternion Quat_Mult(quaternion q1, quaternion q2)
 {
-       quaternion QResult;
-       float a, b, c, d, e, f, g, h;
-       a = (q1.w + q1.x) * (q2.w + q2.x);
-       b = (q1.z - q1.y) * (q2.y - q2.z);
-       c = (q1.w - q1.x) * (q2.y + q2.z);
-       d = (q1.y + q1.z) * (q2.w - q2.x);
-       e = (q1.x + q1.z) * (q2.x + q2.y);
-       f = (q1.x - q1.z) * (q2.x - q2.y);
-       g = (q1.w + q1.y) * (q2.w - q2.z);
-       h = (q1.w - q1.y) * (q2.w + q2.z);
-       QResult.w = b + (-e - f + g + h) / 2;
-       QResult.x = a - (e + f + g + h) / 2;
-       QResult.y = c + (e - f + g - h) / 2;
-       QResult.z = d + (e - f - g + h) / 2;
-       return QResult;
+    quaternion QResult;
+    float a, b, c, d, e, f, g, h;
+    a = (q1.w + q1.x) * (q2.w + q2.x);
+    b = (q1.z - q1.y) * (q2.y - q2.z);
+    c = (q1.w - q1.x) * (q2.y + q2.z);
+    d = (q1.y + q1.z) * (q2.w - q2.x);
+    e = (q1.x + q1.z) * (q2.x + q2.y);
+    f = (q1.x - q1.z) * (q2.x - q2.y);
+    g = (q1.w + q1.y) * (q2.w - q2.z);
+    h = (q1.w - q1.y) * (q2.w + q2.z);
+    QResult.w = b + (-e - f + g + h) / 2;
+    QResult.x = a - (e + f + g + h) / 2;
+    QResult.y = c + (e - f + g - h) / 2;
+    QResult.z = d + (e - f - g + h) / 2;
+    return QResult;
 }
 
 
 
 quaternion To_Quat(Matrix_t m)
 {
-       // From Jason Shankel, (C) 2000.
-       static quaternion Quat;
-
-       static double Tr = m[0][0] + m[1][1] + m[2][2] + 1.0, fourD;
-       static double q[4];
-
-       static int i,j,k;
-       if (Tr >= 1.0)
-       {
-               fourD = 2.0*fast_sqrt(Tr);
-               q[3] = fourD/4.0;
-               q[0] = (m[2][1] - m[1][2]) / fourD;
-               q[1] = (m[0][2] - m[2][0]) / fourD;
-               q[2] = (m[1][0] - m[0][1]) / fourD;
-       }
-       else
-       {
-               if (m[0][0] > m[1][1])
-               {
-                       i = 0;
-               }
-               else
-               {
-                       i = 1;
-               }
-               if (m[2][2] > m[i][i])
-               {
-                       i = 2;
-               }
-               j = (i+1)%3;
-               k = (j+1)%3;
-               fourD = 2.0*fast_sqrt(m[i][i] - m[j][j] - m[k][k] + 1.0);
-               q[i] = fourD / 4.0;
-               q[j] = (m[j][i] + m[i][j]) / fourD;
-               q[k] = (m[k][i] + m[i][k]) / fourD;
-               q[3] = (m[j][k] - m[k][j]) / fourD;
-       }
-
-       Quat.x = q[0];
-       Quat.y = q[1];
-       Quat.z = q[2];
-       Quat.w = q[3];
-       return Quat;
+    // From Jason Shankel, (C) 2000.
+    static quaternion Quat;
+
+    static double Tr = m[0][0] + m[1][1] + m[2][2] + 1.0, fourD;
+    static double q[4];
+
+    static int i, j, k;
+    if (Tr >= 1.0) {
+        fourD = 2.0 * fast_sqrt(Tr);
+        q[3] = fourD / 4.0;
+        q[0] = (m[2][1] - m[1][2]) / fourD;
+        q[1] = (m[0][2] - m[2][0]) / fourD;
+        q[2] = (m[1][0] - m[0][1]) / fourD;
+    } else {
+        if (m[0][0] > m[1][1]) {
+            i = 0;
+        } else {
+            i = 1;
+        }
+        if (m[2][2] > m[i][i]) {
+            i = 2;
+        }
+        j = (i + 1) % 3;
+        k = (j + 1) % 3;
+        fourD = 2.0 * fast_sqrt(m[i][i] - m[j][j] - m[k][k] + 1.0);
+        q[i] = fourD / 4.0;
+        q[j] = (m[j][i] + m[i][j]) / fourD;
+        q[k] = (m[k][i] + m[i][k]) / fourD;
+        q[3] = (m[j][k] - m[k][j]) / fourD;
+    }
+
+    Quat.x = q[0];
+    Quat.y = q[1];
+    Quat.z = q[2];
+    Quat.w = q[3];
+    return Quat;
 }
 void Quat_2_Matrix(quaternion Quat, Matrix_t m)
 {
-       // From the GLVelocity site (http://glvelocity.gamedev.net)
-       float fW = Quat.w;
-       float fX = Quat.x;
-       float fY = Quat.y;
-       float fZ = Quat.z;
-       float fXX = fX * fX;
-       float fYY = fY * fY;
-       float fZZ = fZ * fZ;
-       m[0][0] = 1.0f - 2.0f * (fYY + fZZ);
-       m[1][0] = 2.0f * (fX * fY + fW * fZ);
-       m[2][0] = 2.0f * (fX * fZ - fW * fY);
-       m[3][0] = 0.0f;
-       m[0][1] = 2.0f * (fX * fY - fW * fZ);
-       m[1][1] = 1.0f - 2.0f * (fXX + fZZ);
-       m[2][1] = 2.0f * (fY * fZ + fW * fX);
-       m[3][1] = 0.0f;
-       m[0][2] = 2.0f * (fX * fZ + fW * fY);
-       m[1][2] = 2.0f * (fX * fZ - fW * fX);
-       m[2][2] = 1.0f - 2.0f * (fXX + fYY);
-       m[3][2] = 0.0f;
-       m[0][3] = 0.0f;
-       m[1][3] = 0.0f;
-       m[2][3] = 0.0f;
-       m[3][3] = 1.0f;
+    // From the GLVelocity site (http://glvelocity.gamedev.net)
+    float fW = Quat.w;
+    float fX = Quat.x;
+    float fY = Quat.y;
+    float fZ = Quat.z;
+    float fXX = fX * fX;
+    float fYY = fY * fY;
+    float fZZ = fZ * fZ;
+    m[0][0] = 1.0f - 2.0f * (fYY + fZZ);
+    m[1][0] = 2.0f * (fX * fY + fW * fZ);
+    m[2][0] = 2.0f * (fX * fZ - fW * fY);
+    m[3][0] = 0.0f;
+    m[0][1] = 2.0f * (fX * fY - fW * fZ);
+    m[1][1] = 1.0f - 2.0f * (fXX + fZZ);
+    m[2][1] = 2.0f * (fY * fZ + fW * fX);
+    m[3][1] = 0.0f;
+    m[0][2] = 2.0f * (fX * fZ + fW * fY);
+    m[1][2] = 2.0f * (fX * fZ - fW * fX);
+    m[2][2] = 1.0f - 2.0f * (fXX + fYY);
+    m[3][2] = 0.0f;
+    m[0][3] = 0.0f;
+    m[1][3] = 0.0f;
+    m[2][3] = 0.0f;
+    m[3][3] = 1.0f;
 }
 quaternion To_Quat(angle_axis Ang_Ax)
 {
-       // From the Quaternion Powers article on gamedev.net
-       static quaternion Quat;
-
-       Quat.x = Ang_Ax.x * sin(Ang_Ax.angle / 2);
-       Quat.y = Ang_Ax.y * sin(Ang_Ax.angle / 2);
-       Quat.z = Ang_Ax.z * sin(Ang_Ax.angle / 2);
-       Quat.w = cos(Ang_Ax.angle / 2);
-       return Quat;
+    // From the Quaternion Powers article on gamedev.net
+    static quaternion Quat;
+
+    Quat.x = Ang_Ax.x * sin(Ang_Ax.angle / 2);
+    Quat.y = Ang_Ax.y * sin(Ang_Ax.angle / 2);
+    Quat.z = Ang_Ax.z * sin(Ang_Ax.angle / 2);
+    Quat.w = cos(Ang_Ax.angle / 2);
+    return Quat;
 }
 angle_axis Quat_2_AA(quaternion Quat)
 {
-       static angle_axis Ang_Ax;
-       static float scale, tw;
-       tw = (float)acosf(Quat.w) * 2;
-       scale = (float)sin(tw / 2.0);
-       Ang_Ax.x = Quat.x / scale;
-       Ang_Ax.y = Quat.y / scale;
-       Ang_Ax.z = Quat.z / scale;
-
-       Ang_Ax.angle = 2.0 * acosf(Quat.w)/(float)PI*180;
-       return Ang_Ax;
+    static angle_axis Ang_Ax;
+    static float scale, tw;
+    tw = (float)acosf(Quat.w) * 2;
+    scale = (float)sin(tw / 2.0);
+    Ang_Ax.x = Quat.x / scale;
+    Ang_Ax.y = Quat.y / scale;
+    Ang_Ax.z = Quat.z / scale;
+
+    Ang_Ax.angle = 2.0 * acosf(Quat.w) / (float)PI * 180;
+    return Ang_Ax;
 }
 
 quaternion To_Quat(int In_Degrees, euler Euler)
 {
-       // From the gamasutra quaternion article
-       static quaternion Quat;
-       static float cr, cp, cy, sr, sp, sy, cpcy, spsy;
-       //If we are in Degree mode, convert to Radians
-       if (In_Degrees) {
-               Euler.x = Euler.x * (float)PI / 180;
-               Euler.y = Euler.y * (float)PI / 180;
-               Euler.z = Euler.z * (float)PI / 180;
-       }
-       //Calculate trig identities
-       //Formerly roll, pitch, yaw
-       cr = float(cos(Euler.x/2));
-       cp = float(cos(Euler.y/2));
-       cy = float(cos(Euler.z/2));
-       sr = float(sin(Euler.x/2));
-       sp = float(sin(Euler.y/2));
-       sy = float(sin(Euler.z/2));
-
-       cpcy = cp * cy;
-       spsy = sp * sy;
-       Quat.w = cr * cpcy + sr * spsy;
-       Quat.x = sr * cpcy - cr * spsy;
-       Quat.y = cr * sp * cy + sr * cp * sy;
-       Quat.z = cr * cp * sy - sr * sp * cy;
-
-       return Quat;
+    // From the gamasutra quaternion article
+    static quaternion Quat;
+    static float cr, cp, cy, sr, sp, sy, cpcy, spsy;
+    //If we are in Degree mode, convert to Radians
+    if (In_Degrees) {
+        Euler.x = Euler.x * (float)PI / 180;
+        Euler.y = Euler.y * (float)PI / 180;
+        Euler.z = Euler.z * (float)PI / 180;
+    }
+    //Calculate trig identities
+    //Formerly roll, pitch, yaw
+    cr = float(cos(Euler.x / 2));
+    cp = float(cos(Euler.y / 2));
+    cy = float(cos(Euler.z / 2));
+    sr = float(sin(Euler.x / 2));
+    sp = float(sin(Euler.y / 2));
+    sy = float(sin(Euler.z / 2));
+
+    cpcy = cp * cy;
+    spsy = sp * sy;
+    Quat.w = cr * cpcy + sr * spsy;
+    Quat.x = sr * cpcy - cr * spsy;
+    Quat.y = cr * sp * cy + sr * cp * sy;
+    Quat.z = cr * cp * sy - sr * sp * cy;
+
+    return Quat;
 }
 
 quaternion QNormalize(quaternion Quat)
 {
-       static float norm;
-       norm =  Quat.x * Quat.x + 
-               Quat.y * Quat.y + 
-               Quat.z * Quat.z + 
-               Quat.w * Quat.w;
-       Quat.x = float(Quat.x / norm);
-       Quat.y = float(Quat.y / norm);
-       Quat.z = float(Quat.z / norm);
-       Quat.w = float(Quat.w / norm);
-       return Quat;
+    static float norm;
+    norm =  Quat.x * Quat.x +
+            Quat.y * Quat.y +
+            Quat.z * Quat.z +
+            Quat.w * Quat.w;
+    Quat.x = float(Quat.x / norm);
+    Quat.y = float(Quat.y / norm);
+    Quat.z = float(Quat.z / norm);
+    Quat.w = float(Quat.w / norm);
+    return Quat;
 }
 
 XYZ Quat2Vector(quaternion Quat)
 {
-       QNormalize(Quat);
+    QNormalize(Quat);
 
-       float fW = Quat.w;
-       float fX = Quat.x;
-       float fY = Quat.y;
-       float fZ = Quat.z;
+    float fW = Quat.w;
+    float fX = Quat.x;
+    float fY = Quat.y;
+    float fZ = Quat.z;
 
-       XYZ tempvec;
+    XYZ tempvec;
 
-       tempvec.x = 2.0f*(fX*fZ-fW*fY);
-       tempvec.y = 2.0f*(fY*fZ+fW*fX);
-       tempvec.z = 1.0f-2.0f*(fX*fX+fY*fY);
+    tempvec.x = 2.0f * (fX * fZ - fW * fY);
+    tempvec.y = 2.0f * (fY * fZ + fW * fX);
+    tempvec.z = 1.0f - 2.0f * (fX * fX + fY * fY);
 
-       return tempvec;
+    return tempvec;
 }
 
 bool PointInTriangle(Vector *p, Vector normal, float p11, float p12, float p13, float p21, float p22, float p23, float p31, float p32, float p33)
 {
-       static float u0, u1, u2;
-       static float v0, v1, v2;
-       static float a, b;
-       static float max;
-       static int i, j;
-       static bool bInter;
-       static float pointv[3];
-       static float p1v[3];
-       static float p2v[3];
-       static float p3v[3];
-       static float normalv[3];
+    static float u0, u1, u2;
+    static float v0, v1, v2;
+    static float a, b;
+    static float max;
+    static int i, j;
+    static bool bInter;
+    static float pointv[3];
+    static float p1v[3];
+    static float p2v[3];
+    static float p3v[3];
+    static float normalv[3];
 
-       bInter=0;
+    bInter = 0;
 
-       pointv[0]=p->x;
-       pointv[1]=p->y;
-       pointv[2]=p->z;
+    pointv[0] = p->x;
+    pointv[1] = p->y;
+    pointv[2] = p->z;
 
 
-       p1v[0]=p11;
-       p1v[1]=p12;
-       p1v[2]=p13;
+    p1v[0] = p11;
+    p1v[1] = p12;
+    p1v[2] = p13;
 
-       p2v[0]=p21;
-       p2v[1]=p22;
-       p2v[2]=p23;
+    p2v[0] = p21;
+    p2v[1] = p22;
+    p2v[2] = p23;
 
-       p3v[0]=p31;
-       p3v[1]=p32;
-       p3v[2]=p33;
+    p3v[0] = p31;
+    p3v[1] = p32;
+    p3v[2] = p33;
 
-       normalv[0]=normal.x;
-       normalv[1]=normal.y;
-       normalv[2]=normal.z;
+    normalv[0] = normal.x;
+    normalv[1] = normal.y;
+    normalv[2] = normal.z;
 
 #define ABS(X) (((X)<0.f)?-(X):(X) )
-#define MAX(A, B) (((A)<(B))?(B):(A))  
-       max = MAX(MAX(ABS(normalv[0]), ABS(normalv[1])), ABS(normalv[2]));
+#define MAX(A, B) (((A)<(B))?(B):(A))
+    max = MAX(MAX(ABS(normalv[0]), ABS(normalv[1])), ABS(normalv[2]));
 #undef MAX
-       if (max == ABS(normalv[0])) {i = 1; j = 2;} // y, z
-       if (max == ABS(normalv[1])) {i = 0; j = 2;} // x, z
-       if (max == ABS(normalv[2])) {i = 0; j = 1;} // x, y
+    if (max == ABS(normalv[0])) {
+        i = 1;    // y, z
+        j = 2;
+    }
+    if (max == ABS(normalv[1])) {
+        i = 0;    // x, z
+        j = 2;
+    }
+    if (max == ABS(normalv[2])) {
+        i = 0;    // x, y
+        j = 1;
+    }
 #undef ABS
 
-       u0 = pointv[i] - p1v[i];
-       v0 = pointv[j] - p1v[j];
-       u1 = p2v[i] - p1v[i];
-       v1 = p2v[j] - p1v[j];
-       u2 = p3v[i] - p1v[i];
-       v2 = p3v[j] - p1v[j];
-
-       if (u1 > -1.0e-05f && u1 < 1.0e-05f)// == 0.0f)
-       {
-               b = u0 / u2;
-               if (0.0f <= b && b <= 1.0f)
-               {
-                       a = (v0 - b * v2) / v1;
-                       if ((a >= 0.0f) && (( a + b ) <= 1.0f))
-                               bInter = 1;
-               }
-       }
-       else
-       {
-               b = (v0 * u1 - u0 * v1) / (v2 * u1 - u2 * v1);
-               if (0.0f <= b && b <= 1.0f)
-               {
-                       a = (u0 - b * u2) / u1;
-                       if ((a >= 0.0f) && (( a + b ) <= 1.0f ))
-                               bInter = 1;
-               }
-       }
-
-       return bInter;
+    u0 = pointv[i] - p1v[i];
+    v0 = pointv[j] - p1v[j];
+    u1 = p2v[i] - p1v[i];
+    v1 = p2v[j] - p1v[j];
+    u2 = p3v[i] - p1v[i];
+    v2 = p3v[j] - p1v[j];
+
+    if (u1 > -1.0e-05f && u1 < 1.0e-05f) { // == 0.0f)
+        b = u0 / u2;
+        if (0.0f <= b && b <= 1.0f) {
+            a = (v0 - b * v2) / v1;
+            if ((a >= 0.0f) && (( a + b ) <= 1.0f))
+                bInter = 1;
+        }
+    } else {
+        b = (v0 * u1 - u0 * v1) / (v2 * u1 - u2 * v1);
+        if (0.0f <= b && b <= 1.0f) {
+            a = (u0 - b * u2) / u1;
+            if ((a >= 0.0f) && (( a + b ) <= 1.0f ))
+                bInter = 1;
+        }
+    }
+
+    return bInter;
 }
 
-bool LineFacet(Vector p1,Vector p2,Vector pa,Vector pb,Vector pc,Vector *p)
+bool LineFacet(Vector p1, Vector p2, Vector pa, Vector pb, Vector pc, Vector *p)
 {
-       static float d;
-       static float a1,a2,a3;
-       static float total,denom,mu;
-       static Vector n,pa1,pa2,pa3;
-
-       //Calculate the parameters for the plane 
-       n.x = (pb.y - pa.y)*(pc.z - pa.z) - (pb.z - pa.z)*(pc.y - pa.y);
-       n.y = (pb.z - pa.z)*(pc.x - pa.x) - (pb.x - pa.x)*(pc.z - pa.z);
-       n.z = (pb.x - pa.x)*(pc.y - pa.y) - (pb.y - pa.y)*(pc.x - pa.x);
-       n.Normalize();
-       d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
-
-       //Calculate the position on the line that intersects the plane 
-       denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
-       if (fabs(denom) < 0.0000001)        // Line and plane don't intersect 
-               return 0;
-       mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
-       p->x = p1.x + mu * (p2.x - p1.x);
-       p->y = p1.y + mu * (p2.y - p1.y);
-       p->z = p1.z + mu * (p2.z - p1.z);
-       if (mu < 0 || mu > 1)   // Intersection not along line segment 
-               return 0;
-
-       if(!PointInTriangle( p, n, pa.x, pa.y, pa.z, pb.x, pb.y, pb.z, pc.x, pc.y, pc.z)){return 0;}
-
-       return 1;
+    static float d;
+    static float a1, a2, a3;
+    static float total, denom, mu;
+    static Vector n, pa1, pa2, pa3;
+
+    //Calculate the parameters for the plane
+    n.x = (pb.y - pa.y) * (pc.z - pa.z) - (pb.z - pa.z) * (pc.y - pa.y);
+    n.y = (pb.z - pa.z) * (pc.x - pa.x) - (pb.x - pa.x) * (pc.z - pa.z);
+    n.z = (pb.x - pa.x) * (pc.y - pa.y) - (pb.y - pa.y) * (pc.x - pa.x);
+    n.Normalize();
+    d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
+
+    //Calculate the position on the line that intersects the plane
+    denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
+    if (fabs(denom) < 0.0000001)        // Line and plane don't intersect
+        return 0;
+    mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
+    p->x = p1.x + mu * (p2.x - p1.x);
+    p->y = p1.y + mu * (p2.y - p1.y);
+    p->z = p1.z + mu * (p2.z - p1.z);
+    if (mu < 0 || mu > 1)   // Intersection not along line segment
+        return 0;
+
+    if (!PointInTriangle( p, n, pa.x, pa.y, pa.z, pb.x, pb.y, pb.z, pc.x, pc.y, pc.z)) {
+        return 0;
+    }
+
+    return 1;
 }
 
 bool PointInTriangle(XYZ *p, XYZ normal, XYZ *p1, XYZ *p2, XYZ *p3)
 {
-       static float u0, u1, u2;
-       static float v0, v1, v2;
-       static float a, b;
-       static float max;
-       static int i, j;
-       static bool bInter = 0;
-       static float pointv[3];
-       static float p1v[3];
-       static float p2v[3];
-       static float p3v[3];
-       static float normalv[3];
+    static float u0, u1, u2;
+    static float v0, v1, v2;
+    static float a, b;
+    static float max;
+    static int i, j;
+    static bool bInter = 0;
+    static float pointv[3];
+    static float p1v[3];
+    static float p2v[3];
+    static float p3v[3];
+    static float normalv[3];
 
-       bInter=0;
+    bInter = 0;
 
-       pointv[0]=p->x;
-       pointv[1]=p->y;
-       pointv[2]=p->z;
+    pointv[0] = p->x;
+    pointv[1] = p->y;
+    pointv[2] = p->z;
 
 
-       p1v[0]=p1->x;
-       p1v[1]=p1->y;
-       p1v[2]=p1->z;
+    p1v[0] = p1->x;
+    p1v[1] = p1->y;
+    p1v[2] = p1->z;
 
-       p2v[0]=p2->x;
-       p2v[1]=p2->y;
-       p2v[2]=p2->z;
+    p2v[0] = p2->x;
+    p2v[1] = p2->y;
+    p2v[2] = p2->z;
 
-       p3v[0]=p3->x;
-       p3v[1]=p3->y;
-       p3v[2]=p3->z;
+    p3v[0] = p3->x;
+    p3v[1] = p3->y;
+    p3v[2] = p3->z;
 
-       normalv[0]=normal.x;
-       normalv[1]=normal.y;
-       normalv[2]=normal.z;
+    normalv[0] = normal.x;
+    normalv[1] = normal.y;
+    normalv[2] = normal.z;
 
 #define ABS(X) (((X)<0.f)?-(X):(X) )
-#define MAX(A, B) (((A)<(B))?(B):(A))  
-       max = MAX(MAX(ABS(normalv[0]), ABS(normalv[1])), ABS(normalv[2]));
+#define MAX(A, B) (((A)<(B))?(B):(A))
+    max = MAX(MAX(ABS(normalv[0]), ABS(normalv[1])), ABS(normalv[2]));
 #undef MAX
-       if (max == ABS(normalv[0])) {i = 1; j = 2;} // y, z
-       if (max == ABS(normalv[1])) {i = 0; j = 2;} // x, z
-       if (max == ABS(normalv[2])) {i = 0; j = 1;} // x, y
+    if (max == ABS(normalv[0])) {
+        i = 1;    // y, z
+        j = 2;
+    }
+    if (max == ABS(normalv[1])) {
+        i = 0;    // x, z
+        j = 2;
+    }
+    if (max == ABS(normalv[2])) {
+        i = 0;    // x, y
+        j = 1;
+    }
 #undef ABS
 
-       u0 = pointv[i] - p1v[i];
-       v0 = pointv[j] - p1v[j];
-       u1 = p2v[i] - p1v[i];
-       v1 = p2v[j] - p1v[j];
-       u2 = p3v[i] - p1v[i];
-       v2 = p3v[j] - p1v[j];
-
-       if (u1 > -1.0e-05f && u1 < 1.0e-05f)// == 0.0f)
-       {
-               b = u0 / u2;
-               if (0.0f <= b && b <= 1.0f)
-               {
-                       a = (v0 - b * v2) / v1;
-                       if ((a >= 0.0f) && (( a + b ) <= 1.0f))
-                               bInter = 1;
-               }
-       }
-       else
-       {
-               b = (v0 * u1 - u0 * v1) / (v2 * u1 - u2 * v1);
-               if (0.0f <= b && b <= 1.0f)
-               {
-                       a = (u0 - b * u2) / u1;
-                       if ((a >= 0.0f) && (( a + b ) <= 1.0f ))
-                               bInter = 1;
-               }
-       }
-
-       return bInter;
+    u0 = pointv[i] - p1v[i];
+    v0 = pointv[j] - p1v[j];
+    u1 = p2v[i] - p1v[i];
+    v1 = p2v[j] - p1v[j];
+    u2 = p3v[i] - p1v[i];
+    v2 = p3v[j] - p1v[j];
+
+    if (u1 > -1.0e-05f && u1 < 1.0e-05f) { // == 0.0f)
+        b = u0 / u2;
+        if (0.0f <= b && b <= 1.0f) {
+            a = (v0 - b * v2) / v1;
+            if ((a >= 0.0f) && (( a + b ) <= 1.0f))
+                bInter = 1;
+        }
+    } else {
+        b = (v0 * u1 - u0 * v1) / (v2 * u1 - u2 * v1);
+        if (0.0f <= b && b <= 1.0f) {
+            a = (u0 - b * u2) / u1;
+            if ((a >= 0.0f) && (( a + b ) <= 1.0f ))
+                bInter = 1;
+        }
+    }
+
+    return bInter;
 }
 
-bool LineFacet(XYZ p1,XYZ p2,XYZ pa,XYZ pb,XYZ pc,XYZ *p)
+bool LineFacet(XYZ p1, XYZ p2, XYZ pa, XYZ pb, XYZ pc, XYZ *p)
 {
-       static float d;
-       static float a1,a2,a3;
-       static float total,denom,mu;
-       static XYZ n,pa1,pa2,pa3;
-
-       //Calculate the parameters for the plane 
-       n.x = (pb.y - pa.y)*(pc.z - pa.z) - (pb.z - pa.z)*(pc.y - pa.y);
-       n.y = (pb.z - pa.z)*(pc.x - pa.x) - (pb.x - pa.x)*(pc.z - pa.z);
-       n.z = (pb.x - pa.x)*(pc.y - pa.y) - (pb.y - pa.y)*(pc.x - pa.x);
-       Normalise(&n);
-       d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
-
-       //Calculate the position on the line that intersects the plane 
-       denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
-       if (fabs(denom) < 0.0000001)        // Line and plane don't intersect 
-               return 0;
-       mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
-       p->x = p1.x + mu * (p2.x - p1.x);
-       p->y = p1.y + mu * (p2.y - p1.y);
-       p->z = p1.z + mu * (p2.z - p1.z);
-       if (mu < 0 || mu > 1)   // Intersection not along line segment 
-               return 0;
-
-       if(!PointInTriangle( p, n, &pa, &pb, &pc)){return 0;}
-
-       return 1;
+    static float d;
+    static float a1, a2, a3;
+    static float total, denom, mu;
+    static XYZ n, pa1, pa2, pa3;
+
+    //Calculate the parameters for the plane
+    n.x = (pb.y - pa.y) * (pc.z - pa.z) - (pb.z - pa.z) * (pc.y - pa.y);
+    n.y = (pb.z - pa.z) * (pc.x - pa.x) - (pb.x - pa.x) * (pc.z - pa.z);
+    n.z = (pb.x - pa.x) * (pc.y - pa.y) - (pb.y - pa.y) * (pc.x - pa.x);
+    Normalise(&n);
+    d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
+
+    //Calculate the position on the line that intersects the plane
+    denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
+    if (fabs(denom) < 0.0000001)        // Line and plane don't intersect
+        return 0;
+    mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
+    p->x = p1.x + mu * (p2.x - p1.x);
+    p->y = p1.y + mu * (p2.y - p1.y);
+    p->z = p1.z + mu * (p2.z - p1.z);
+    if (mu < 0 || mu > 1)   // Intersection not along line segment
+        return 0;
+
+    if (!PointInTriangle( p, n, &pa, &pb, &pc)) {
+        return 0;
+    }
+
+    return 1;
 }
 
-float LineFacetd(XYZ p1,XYZ p2,XYZ pa,XYZ pb,XYZ pc,XYZ *p)
+float LineFacetd(XYZ p1, XYZ p2, XYZ pa, XYZ pb, XYZ pc, XYZ *p)
 {
-       static float d;
-       static float a1,a2,a3;
-       static float total,denom,mu;
-       static XYZ n,pa1,pa2,pa3;
-
-       //Calculate the parameters for the plane 
-       n.x = (pb.y - pa.y)*(pc.z - pa.z) - (pb.z - pa.z)*(pc.y - pa.y);
-       n.y = (pb.z - pa.z)*(pc.x - pa.x) - (pb.x - pa.x)*(pc.z - pa.z);
-       n.z = (pb.x - pa.x)*(pc.y - pa.y) - (pb.y - pa.y)*(pc.x - pa.x);
-       Normalise(&n);
-       d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
-
-       //Calculate the position on the line that intersects the plane 
-       denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
-       if (fabs(denom) < 0.0000001)        // Line and plane don't intersect 
-               return 0;
-       mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
-       p->x = p1.x + mu * (p2.x - p1.x);
-       p->y = p1.y + mu * (p2.y - p1.y);
-       p->z = p1.z + mu * (p2.z - p1.z);
-       if (mu < 0 || mu > 1)   // Intersection not along line segment 
-               return 0;
-
-       if(!PointInTriangle( p, n, &pa, &pb, &pc)){return 0;}
-
-       return 1;
+    static float d;
+    static float a1, a2, a3;
+    static float total, denom, mu;
+    static XYZ n, pa1, pa2, pa3;
+
+    //Calculate the parameters for the plane
+    n.x = (pb.y - pa.y) * (pc.z - pa.z) - (pb.z - pa.z) * (pc.y - pa.y);
+    n.y = (pb.z - pa.z) * (pc.x - pa.x) - (pb.x - pa.x) * (pc.z - pa.z);
+    n.z = (pb.x - pa.x) * (pc.y - pa.y) - (pb.y - pa.y) * (pc.x - pa.x);
+    Normalise(&n);
+    d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
+
+    //Calculate the position on the line that intersects the plane
+    denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
+    if (fabs(denom) < 0.0000001)        // Line and plane don't intersect
+        return 0;
+    mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
+    p->x = p1.x + mu * (p2.x - p1.x);
+    p->y = p1.y + mu * (p2.y - p1.y);
+    p->z = p1.z + mu * (p2.z - p1.z);
+    if (mu < 0 || mu > 1)   // Intersection not along line segment
+        return 0;
+
+    if (!PointInTriangle( p, n, &pa, &pb, &pc)) {
+        return 0;
+    }
+
+    return 1;
 }
 
-float LineFacetd(XYZ p1,XYZ p2,XYZ pa,XYZ pb,XYZ pc, XYZ n, XYZ *p)
+float LineFacetd(XYZ p1, XYZ p2, XYZ pa, XYZ pb, XYZ pc, XYZ n, XYZ *p)
 {
-       static float d;
-       static float a1,a2,a3;
-       static float total,denom,mu;
-       static XYZ pa1,pa2,pa3;
-
-       //Calculate the parameters for the plane 
-       d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
-
-       //Calculate the position on the line that intersects the plane 
-       denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
-       if (fabs(denom) < 0.0000001)        // Line and plane don't intersect 
-               return 0;
-       mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
-       p->x = p1.x + mu * (p2.x - p1.x);
-       p->y = p1.y + mu * (p2.y - p1.y);
-       p->z = p1.z + mu * (p2.z - p1.z);
-       if (mu < 0 || mu > 1)   // Intersection not along line segment 
-               return 0;
-
-       if(!PointInTriangle( p, n, &pa, &pb, &pc)){return 0;}
-       return 1;
+    static float d;
+    static float a1, a2, a3;
+    static float total, denom, mu;
+    static XYZ pa1, pa2, pa3;
+
+    //Calculate the parameters for the plane
+    d = - n.x * pa.x - n.y * pa.y - n.z * pa.z;
+
+    //Calculate the position on the line that intersects the plane
+    denom = n.x * (p2.x - p1.x) + n.y * (p2.y - p1.y) + n.z * (p2.z - p1.z);
+    if (fabs(denom) < 0.0000001)        // Line and plane don't intersect
+        return 0;
+    mu = - (d + n.x * p1.x + n.y * p1.y + n.z * p1.z) / denom;
+    p->x = p1.x + mu * (p2.x - p1.x);
+    p->y = p1.y + mu * (p2.y - p1.y);
+    p->z = p1.z + mu * (p2.z - p1.z);
+    if (mu < 0 || mu > 1)   // Intersection not along line segment
+        return 0;
+
+    if (!PointInTriangle( p, n, &pa, &pb, &pc)) {
+        return 0;
+    }
+    return 1;
 }
 
-float LineFacetd(XYZ *p1,XYZ *p2,XYZ *pa,XYZ *pb,XYZ *pc, XYZ *p)
+float LineFacetd(XYZ *p1, XYZ *p2, XYZ *pa, XYZ *pb, XYZ *pc, XYZ *p)
 {
-       static float d;
-       static float a1,a2,a3;
-       static float total,denom,mu;
-       static XYZ pa1,pa2,pa3,n;
-
-       //Calculate the parameters for the plane 
-       n.x = (pb->y - pa->y)*(pc->z - pa->z) - (pb->z - pa->z)*(pc->y - pa->y);
-       n.y = (pb->z - pa->z)*(pc->x - pa->x) - (pb->x - pa->x)*(pc->z - pa->z);
-       n.z = (pb->x - pa->x)*(pc->y - pa->y) - (pb->y - pa->y)*(pc->x - pa->x);
-       Normalise(&n);
-       d = - n.x * pa->x - n.y * pa->y - n.z * pa->z;
-
-
-       //Calculate the position on the line that intersects the plane 
-       denom = n.x * (p2->x - p1->x) + n.y * (p2->y - p1->y) + n.z * (p2->z - p1->z);
-       if (fabs(denom) < 0.0000001)        // Line and plane don't intersect 
-               return 0;
-       mu = - (d + n.x * p1->x + n.y * p1->y + n.z * p1->z) / denom;
-       p->x = p1->x + mu * (p2->x - p1->x);
-       p->y = p1->y + mu * (p2->y - p1->y);
-       p->z = p1->z + mu * (p2->z - p1->z);
-       if (mu < 0 || mu > 1)   // Intersection not along line segment 
-               return 0;
-
-       if(!PointInTriangle( p, n, pa, pb, pc)){return 0;}
-       return 1;
+    static float d;
+    static float a1, a2, a3;
+    static float total, denom, mu;
+    static XYZ pa1, pa2, pa3, n;
+
+    //Calculate the parameters for the plane
+    n.x = (pb->y - pa->y) * (pc->z - pa->z) - (pb->z - pa->z) * (pc->y - pa->y);
+    n.y = (pb->z - pa->z) * (pc->x - pa->x) - (pb->x - pa->x) * (pc->z - pa->z);
+    n.z = (pb->x - pa->x) * (pc->y - pa->y) - (pb->y - pa->y) * (pc->x - pa->x);
+    Normalise(&n);
+    d = - n.x * pa->x - n.y * pa->y - n.z * pa->z;
+
+
+    //Calculate the position on the line that intersects the plane
+    denom = n.x * (p2->x - p1->x) + n.y * (p2->y - p1->y) + n.z * (p2->z - p1->z);
+    if (fabs(denom) < 0.0000001)        // Line and plane don't intersect
+        return 0;
+    mu = - (d + n.x * p1->x + n.y * p1->y + n.z * p1->z) / denom;
+    p->x = p1->x + mu * (p2->x - p1->x);
+    p->y = p1->y + mu * (p2->y - p1->y);
+    p->z = p1->z + mu * (p2->z - p1->z);
+    if (mu < 0 || mu > 1)   // Intersection not along line segment
+        return 0;
+
+    if (!PointInTriangle( p, n, pa, pb, pc)) {
+        return 0;
+    }
+    return 1;
 }
 
-float LineFacetd(XYZ *p1,XYZ *p2,XYZ *pa,XYZ *pb,XYZ *pc, XYZ *n, XYZ *p)
+float LineFacetd(XYZ *p1, XYZ *p2, XYZ *pa, XYZ *pb, XYZ *pc, XYZ *n, XYZ *p)
 {
-       static float d;
-       static float a1,a2,a3;
-       static float total,denom,mu;
-       static XYZ pa1,pa2,pa3;
-
-       //Calculate the parameters for the plane 
-       d = - n->x * pa->x - n->y * pa->y - n->z * pa->z;
-
-       //Calculate the position on the line that intersects the plane 
-       denom = n->x * (p2->x - p1->x) + n->y * (p2->y - p1->y) + n->z * (p2->z - p1->z);
-       if (fabs(denom) < 0.0000001)        // Line and plane don't intersect 
-               return 0;
-       mu = - (d + n->x * p1->x + n->y * p1->y + n->z * p1->z) / denom;
-       p->x = p1->x + mu * (p2->x - p1->x);
-       p->y = p1->y + mu * (p2->y - p1->y);
-       p->z = p1->z + mu * (p2->z - p1->z);
-       if (mu < 0 || mu > 1)   // Intersection not along line segment 
-               return 0;
-
-       if(!PointInTriangle( p, *n, pa, pb, pc)){return 0;}
-       return 1;
+    static float d;
+    static float a1, a2, a3;
+    static float total, denom, mu;
+    static XYZ pa1, pa2, pa3;
+
+    //Calculate the parameters for the plane
+    d = - n->x * pa->x - n->y * pa->y - n->z * pa->z;
+
+    //Calculate the position on the line that intersects the plane
+    denom = n->x * (p2->x - p1->x) + n->y * (p2->y - p1->y) + n->z * (p2->z - p1->z);
+    if (fabs(denom) < 0.0000001)        // Line and plane don't intersect
+        return 0;
+    mu = - (d + n->x * p1->x + n->y * p1->y + n->z * p1->z) / denom;
+    p->x = p1->x + mu * (p2->x - p1->x);
+    p->y = p1->y + mu * (p2->y - p1->y);
+    p->z = p1->z + mu * (p2->z - p1->z);
+    if (mu < 0 || mu > 1)   // Intersection not along line segment
+        return 0;
+
+    if (!PointInTriangle( p, *n, pa, pb, pc)) {
+        return 0;
+    }
+    return 1;
 }
 
 
index 417c299ef27b091ba3876e7045ca5c25f7b35a25..cfa2bace88ab4ff0fb5c057400f6501c45898bf3 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -40,38 +40,36 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 //using namespace std;
 typedef float Matrix_t [4][4];
-struct euler
-{
-       float x, y, z;
+struct euler {
+    float x, y, z;
 };
-struct angle_axis
-{
-       float x, y, z, angle;
+struct angle_axis {
+    float x, y, z, angle;
 };
-struct quaternion
-{
-       float x, y, z, w;
+struct quaternion {
+    float x, y, z, w;
 };
 
-class XYZ{
+class XYZ
+{
 public:
-       float x;
-       float y;
-       float z;
+    float x;
+    float y;
+    float z;
     XYZ() : x(0.0f), y(0.0f), z(0.0f) {}
-       inline XYZ operator+(XYZ add);
-       inline XYZ operator-(XYZ add);
-       inline XYZ operator*(float add);
-       inline XYZ operator*(XYZ add);
-       inline XYZ operator/(float add);
-       inline void operator+=(XYZ add);
-       inline void operator-=(XYZ add);
-       inline void operator*=(float add);
-       inline void operator*=(XYZ add);
-       inline void operator/=(float add);
-       inline void operator=(float add);
-       inline void vec(Vector add);
-       inline bool operator==(XYZ add);
+    inline XYZ operator+(XYZ add);
+    inline XYZ operator-(XYZ add);
+    inline XYZ operator*(float add);
+    inline XYZ operator*(XYZ add);
+    inline XYZ operator/(float add);
+    inline void operator+=(XYZ add);
+    inline void operator-=(XYZ add);
+    inline void operator*=(float add);
+    inline void operator*=(XYZ add);
+    inline void operator/=(float add);
+    inline void operator=(float add);
+    inline void vec(Vector add);
+    inline bool operator==(XYZ add);
 };
 
 /*********************> Quaternion Function definition <********/
@@ -91,13 +89,13 @@ inline void Normalise(XYZ *vectory);
 inline float normaldotproduct(XYZ point1, XYZ point2);
 inline float fast_sqrt (register float arg);
 bool PointInTriangle(XYZ *p, XYZ normal, XYZ *p1, XYZ *p2, XYZ *p3);
-bool LineFacet(XYZ p1,XYZ p2,XYZ pa,XYZ pb,XYZ pc,XYZ *p);
-float LineFacetd(XYZ p1,XYZ p2,XYZ pa,XYZ pb,XYZ pc,XYZ *p);
-float LineFacetd(XYZ p1,XYZ p2,XYZ pa,XYZ pb,XYZ pc,XYZ n, XYZ *p);
-float LineFacetd(XYZ *p1,XYZ *p2,XYZ *pa,XYZ *pb,XYZ *pc,XYZ *n, XYZ *p);
-float LineFacetd(XYZ *p1,XYZ *p2,XYZ *pa,XYZ *pb,XYZ *pc, XYZ *p);
+bool LineFacet(XYZ p1, XYZ p2, XYZ pa, XYZ pb, XYZ pc, XYZ *p);
+float LineFacetd(XYZ p1, XYZ p2, XYZ pa, XYZ pb, XYZ pc, XYZ *p);
+float LineFacetd(XYZ p1, XYZ p2, XYZ pa, XYZ pb, XYZ pc, XYZ n, XYZ *p);
+float LineFacetd(XYZ *p1, XYZ *p2, XYZ *pa, XYZ *pb, XYZ *pc, XYZ *n, XYZ *p);
+float LineFacetd(XYZ *p1, XYZ *p2, XYZ *pa, XYZ *pb, XYZ *pc, XYZ *p);
 bool PointInTriangle(Vector *p, Vector normal, float p11, float p12, float p13, float p21, float p22, float p23, float p31, float p32, float p33);
-bool LineFacet(Vector p1,Vector p2,Vector pa,Vector pb,Vector pc,Vector *p);
+bool LineFacet(Vector p1, Vector p2, Vector pa, Vector pb, Vector pc, Vector *p);
 inline void ReflectVector(XYZ *vel, const XYZ *n);
 inline void ReflectVector(XYZ *vel, const XYZ &n);
 inline XYZ DoRotation(XYZ thePoint, float xang, float yang, float zang);
@@ -110,152 +108,171 @@ inline float distsq(XYZ point1, XYZ point2);
 inline float distsqflat(XYZ *point1, XYZ *point2);
 inline float dotproduct(const XYZ *point1, const XYZ *point2);
 bool sphere_line_intersection (
-                                                          float x1, float y1 , float z1,
-                                                          float x2, float y2 , float z2,
-                                                          float x3, float y3 , float z3, float r );
+    float x1, float y1 , float z1,
+    float x2, float y2 , float z2,
+    float x3, float y3 , float z3, float r );
 bool sphere_line_intersection (
-                                                          XYZ *p1, XYZ *p2, XYZ *p3, float *r );
+    XYZ *p1, XYZ *p2, XYZ *p3, float *r );
 inline bool DistancePointLine( XYZ *Point, XYZ *LineStart, XYZ *LineEnd, float *Distance, XYZ *Intersection );
 
 
-inline void Normalise(XYZ *vectory) {
-       static float d;
-       d = fast_sqrt(vectory->x*vectory->x+vectory->y*vectory->y+vectory->z*vectory->z);
-       if(d==0){return;}
-       vectory->x /= d;
-       vectory->y /= d;
-       vectory->z /= d;
+inline void Normalise(XYZ *vectory)
+{
+    static float d;
+    d = fast_sqrt(vectory->x * vectory->x + vectory->y * vectory->y + vectory->z * vectory->z);
+    if (d == 0) {
+        return;
+    }
+    vectory->x /= d;
+    vectory->y /= d;
+    vectory->z /= d;
 }
 
-inline XYZ XYZ::operator+(XYZ add){
-       static XYZ ne;
-       ne=add;
-       ne.x+=x;
-       ne.y+=y;
-       ne.z+=z;
-       return ne;
+inline XYZ XYZ::operator+(XYZ add)
+{
+    static XYZ ne;
+    ne = add;
+    ne.x += x;
+    ne.y += y;
+    ne.z += z;
+    return ne;
 }
 
-inline XYZ XYZ::operator-(XYZ add){
-       static XYZ ne;
-       ne=add;
-       ne.x=x-ne.x;
-       ne.y=y-ne.y;
-       ne.z=z-ne.z;
-       return ne;
+inline XYZ XYZ::operator-(XYZ add)
+{
+    static XYZ ne;
+    ne = add;
+    ne.x = x - ne.x;
+    ne.y = y - ne.y;
+    ne.z = z - ne.z;
+    return ne;
 }
 
-inline XYZ XYZ::operator*(float add){
-       static XYZ ne;
-       ne.x=x*add;
-       ne.y=y*add;
-       ne.z=z*add;
-       return ne;
+inline XYZ XYZ::operator*(float add)
+{
+    static XYZ ne;
+    ne.x = x * add;
+    ne.y = y * add;
+    ne.z = z * add;
+    return ne;
 }
 
-inline XYZ XYZ::operator*(XYZ add){
-       static XYZ ne;
-       ne.x=x*add.x;
-       ne.y=y*add.y;
-       ne.z=z*add.z;
-       return ne;
+inline XYZ XYZ::operator*(XYZ add)
+{
+    static XYZ ne;
+    ne.x = x * add.x;
+    ne.y = y * add.y;
+    ne.z = z * add.z;
+    return ne;
 }
 
-inline XYZ XYZ::operator/(float add){
-       static XYZ ne;
-       ne.x=x/add;
-       ne.y=y/add;
-       ne.z=z/add;
-       return ne;
+inline XYZ XYZ::operator/(float add)
+{
+    static XYZ ne;
+    ne.x = x / add;
+    ne.y = y / add;
+    ne.z = z / add;
+    return ne;
 }
 
-inline void XYZ::operator+=(XYZ add){
-       x+=add.x;
-       y+=add.y;
-       z+=add.z;
+inline void XYZ::operator+=(XYZ add)
+{
+    x += add.x;
+    y += add.y;
+    z += add.z;
 }
 
-inline void XYZ::operator-=(XYZ add){
-       x=x-add.x;
-       y=y-add.y;
-       z=z-add.z;
+inline void XYZ::operator-=(XYZ add)
+{
+    x = x - add.x;
+    y = y - add.y;
+    z = z - add.z;
 }
 
-inline void XYZ::operator*=(float add){
-       x=x*add;
-       y=y*add;
-       z=z*add;
+inline void XYZ::operator*=(float add)
+{
+    x = x * add;
+    y = y * add;
+    z = z * add;
 }
 
-inline void XYZ::operator*=(XYZ add){
-       x=x*add.x;
-       y=y*add.y;
-       z=z*add.z;
+inline void XYZ::operator*=(XYZ add)
+{
+    x = x * add.x;
+    y = y * add.y;
+    z = z * add.z;
 }
 
-inline void XYZ::operator/=(float add){
-       x=x/add;
-       y=y/add;
-       z=z/add;
+inline void XYZ::operator/=(float add)
+{
+    x = x / add;
+    y = y / add;
+    z = z / add;
 }
 
-inline void XYZ::operator=(float add){
-       x=add;
-       y=add;
-       z=add;
+inline void XYZ::operator=(float add)
+{
+    x = add;
+    y = add;
+    z = add;
 }
 
-inline void XYZ::vec(Vector add){
-       x=add.x;
-       y=add.y;
-       z=add.z;
+inline void XYZ::vec(Vector add)
+{
+    x = add.x;
+    y = add.y;
+    z = add.z;
 }
 
-inline bool XYZ::operator==(XYZ add){
-       if(x==add.x&&y==add.y&&z==add.z)return 1;
-       return 0;
+inline bool XYZ::operator==(XYZ add)
+{
+    if (x == add.x && y == add.y && z == add.z)return 1;
+    return 0;
 }
 
-inline void CrossProduct(XYZ *P, XYZ *Q, XYZ *V){
-       V->x = P->y * Q->z - P->z * Q->y;
-       V->y = P->z * Q->x - P->x * Q->z;
-       V->z = P->x * Q->y - P->y * Q->x;
+inline void CrossProduct(XYZ *P, XYZ *Q, XYZ *V)
+{
+    V->x = P->y * Q->z - P->z * Q->y;
+    V->y = P->z * Q->x - P->x * Q->z;
+    V->z = P->x * Q->y - P->y * Q->x;
 }
 
-inline void CrossProduct(XYZ P, XYZ Q, XYZ *V){
-       V->x = P.y * Q.z - P.z * Q.y;
-       V->y = P.z * Q.x - P.x * Q.z;
-       V->z = P.x * Q.y - P.y * Q.x;
+inline void CrossProduct(XYZ P, XYZ Q, XYZ *V)
+{
+    V->x = P.y * Q.z - P.z * Q.y;
+    V->y = P.z * Q.x - P.x * Q.z;
+    V->z = P.x * Q.y - P.y * Q.x;
 }
 
 inline float fast_sqrt (register float arg)
-{      
+{
 #if PLATFORM_MACOSX
-       // Can replace with slower return std::sqrt(arg);
-       register float result;
+    // Can replace with slower return std::sqrt(arg);
+    register float result;
 
-       if (arg == 0.0) return 0.0;
+    if (arg == 0.0) return 0.0;
 
-       asm {
-               frsqrte         result,arg                      // Calculate Square root
-       }       
+    asm {
+        frsqrte                result, arg                     // Calculate Square root
+    }
 
-       // Newton Rhapson iterations.
-       result = result + 0.5 * result * (1.0 - arg * result * result);
-       result = result + 0.5 * result * (1.0 - arg * result * result);
+    // Newton Rhapson iterations.
+    result = result + 0.5 * result * (1.0 - arg * result * result);
+    result = result + 0.5 * result * (1.0 - arg * result * result);
 
-       return result * arg;
+    return result * arg;
 #else
-       return sqrtf( arg);
+    return sqrtf( arg);
 #endif
 }
 
-inline float normaldotproduct(XYZ point1, XYZ point2){
-       static GLfloat returnvalue;
-       Normalise(&point1);
-       Normalise(&point2);
-       returnvalue=(point1.x*point2.x+point1.y*point2.y+point1.z*point2.z);
-       return returnvalue;
+inline float normaldotproduct(XYZ point1, XYZ point2)
+{
+    static GLfloat returnvalue;
+    Normalise(&point1);
+    Normalise(&point2);
+    returnvalue = (point1.x * point2.x + point1.y * point2.y + point1.z * point2.z);
+    return returnvalue;
 }
 
 inline void ReflectVector(XYZ *vel, const XYZ *n)
@@ -265,230 +282,240 @@ inline void ReflectVector(XYZ *vel, const XYZ *n)
 
 inline void ReflectVector(XYZ *vel, const XYZ &n)
 {
-       static XYZ vn;
-       static XYZ vt;
-       static float dotprod;
+    static XYZ vn;
+    static XYZ vt;
+    static float dotprod;
 
-       dotprod=dotproduct(&n,vel);
-       vn.x=n.x*dotprod;
-       vn.y=n.y*dotprod;
-       vn.z=n.z*dotprod;
+    dotprod = dotproduct(&n, vel);
+    vn.x = n.x * dotprod;
+    vn.y = n.y * dotprod;
+    vn.z = n.z * dotprod;
 
-       vt.x=vel->x-vn.x;
-       vt.y=vel->y-vn.y;
-       vt.z=vel->z-vn.z;
+    vt.x = vel->x - vn.x;
+    vt.y = vel->y - vn.y;
+    vt.z = vel->z - vn.z;
 
-       vel->x = vt.x - vn.x;
-       vel->y = vt.y - vn.y;
-       vel->z = vt.z - vn.z;
+    vel->x = vt.x - vn.x;
+    vel->y = vt.y - vn.y;
+    vel->z = vt.z - vn.z;
 }
 
-inline float dotproduct(const XYZ *point1, const XYZ *point2){
-       static GLfloat returnvalue;
-       returnvalue=(point1->x*point2->x+point1->y*point2->y+point1->z*point2->z);
-       return returnvalue;
+inline float dotproduct(const XYZ *point1, const XYZ *point2)
+{
+    static GLfloat returnvalue;
+    returnvalue = (point1->x * point2->x + point1->y * point2->y + point1->z * point2->z);
+    return returnvalue;
 }
 
-inline float findDistance(XYZ *point1, XYZ *point2){
-       return(fast_sqrt((point1->x-point2->x)*(point1->x-point2->x)+(point1->y-point2->y)*(point1->y-point2->y)+(point1->z-point2->z)*(point1->z-point2->z)));
+inline float findDistance(XYZ *point1, XYZ *point2)
+{
+    return(fast_sqrt((point1->x - point2->x) * (point1->x - point2->x) + (point1->y - point2->y) * (point1->y - point2->y) + (point1->z - point2->z) * (point1->z - point2->z)));
 }
 
-inline float findLength(XYZ *point1){
-       return(fast_sqrt((point1->x)*(point1->x)+(point1->y)*(point1->y)+(point1->z)*(point1->z)));
+inline float findLength(XYZ *point1)
+{
+    return(fast_sqrt((point1->x) * (point1->x) + (point1->y) * (point1->y) + (point1->z) * (point1->z)));
 }
 
 
-inline float findLengthfast(XYZ *point1){
-       return((point1->x)*(point1->x)+(point1->y)*(point1->y)+(point1->z)*(point1->z));
+inline float findLengthfast(XYZ *point1)
+{
+    return((point1->x) * (point1->x) + (point1->y) * (point1->y) + (point1->z) * (point1->z));
 }
 
-inline float distsq(XYZ *point1, XYZ *point2){
-       return((point1->x-point2->x)*(point1->x-point2->x)+(point1->y-point2->y)*(point1->y-point2->y)+(point1->z-point2->z)*(point1->z-point2->z));
+inline float distsq(XYZ *point1, XYZ *point2)
+{
+    return((point1->x - point2->x) * (point1->x - point2->x) + (point1->y - point2->y) * (point1->y - point2->y) + (point1->z - point2->z) * (point1->z - point2->z));
 }
 
-inline float distsq(XYZ point1, XYZ point2){
-       return((point1.x-point2.x)*(point1.x-point2.x)+(point1.y-point2.y)*(point1.y-point2.y)+(point1.z-point2.z)*(point1.z-point2.z));
+inline float distsq(XYZ point1, XYZ point2)
+{
+    return((point1.x - point2.x) * (point1.x - point2.x) + (point1.y - point2.y) * (point1.y - point2.y) + (point1.z - point2.z) * (point1.z - point2.z));
 }
 
-inline float distsqflat(XYZ *point1, XYZ *point2){
-       return((point1->x-point2->x)*(point1->x-point2->x)+(point1->z-point2->z)*(point1->z-point2->z));
+inline float distsqflat(XYZ *point1, XYZ *point2)
+{
+    return((point1->x - point2->x) * (point1->x - point2->x) + (point1->z - point2->z) * (point1->z - point2->z));
 }
 
-inline XYZ DoRotation(XYZ thePoint, float xang, float yang, float zang){
-       static XYZ newpoint;
-       if(xang){
-               xang*=6.283185f;
-               xang/=360;
-       }
-       if(yang){
-               yang*=6.283185f;
-               yang/=360;
-       }
-       if(zang){
-               zang*=6.283185f;
-               zang/=360;
-       }
+inline XYZ DoRotation(XYZ thePoint, float xang, float yang, float zang)
+{
+    static XYZ newpoint;
+    if (xang) {
+        xang *= 6.283185f;
+        xang /= 360;
+    }
+    if (yang) {
+        yang *= 6.283185f;
+        yang /= 360;
+    }
+    if (zang) {
+        zang *= 6.283185f;
+        zang /= 360;
+    }
+
+
+    if (yang) {
+        newpoint.z = thePoint.z * cosf(yang) - thePoint.x * sinf(yang);
+        newpoint.x = thePoint.z * sinf(yang) + thePoint.x * cosf(yang);
+        thePoint.z = newpoint.z;
+        thePoint.x = newpoint.x;
+    }
+
+    if (zang) {
+        newpoint.x = thePoint.x * cosf(zang) - thePoint.y * sinf(zang);
+        newpoint.y = thePoint.y * cosf(zang) + thePoint.x * sinf(zang);
+        thePoint.x = newpoint.x;
+        thePoint.y = newpoint.y;
+    }
+
+    if (xang) {
+        newpoint.y = thePoint.y * cosf(xang) - thePoint.z * sinf(xang);
+        newpoint.z = thePoint.y * sinf(xang) + thePoint.z * cosf(xang);
+        thePoint.z = newpoint.z;
+        thePoint.y = newpoint.y;
+    }
+
+    return thePoint;
+}
+
+inline float square( float f )
+{
+    return (f * f) ;
+}
 
+inline bool sphere_line_intersection (
+    float x1, float y1 , float z1,
+    float x2, float y2 , float z2,
+    float x3, float y3 , float z3, float r )
+{
+
+    // x1,y1,z1  P1 coordinates (point of line)
+    // x2,y2,z2  P2 coordinates (point of line)
+    // x3,y3,z3, r  P3 coordinates and radius (sphere)
+    // x,y,z   intersection coordinates
+    //
+    // This function returns a pointer array which first index indicates
+    // the number of intersection point, followed by coordinate pairs.
+
+    //~ static float x , y , z;
+    static float a, b, c, /*mu,*/ i ;
+
+    if (x1 > x3 + r && x2 > x3 + r)return(0);
+    if (x1 < x3 - r && x2 < x3 - r)return(0);
+    if (y1 > y3 + r && y2 > y3 + r)return(0);
+    if (y1 < y3 - r && y2 < y3 - r)return(0);
+    if (z1 > z3 + r && z2 > z3 + r)return(0);
+    if (z1 < z3 - r && z2 < z3 - r)return(0);
+    a =  square(x2 - x1) + square(y2 - y1) + square(z2 - z1);
+    b =  2 * ( (x2 - x1) * (x1 - x3)
+               + (y2 - y1) * (y1 - y3)
+               + (z2 - z1) * (z1 - z3) ) ;
+    c =  square(x3) + square(y3) +
+         square(z3) + square(x1) +
+         square(y1) + square(z1) -
+         2 * ( x3 * x1 + y3 * y1 + z3 * z1 ) - square(r) ;
+    i =   b * b - 4 * a * c ;
+
+    if ( i < 0.0 ) {
+        // no intersection
+        return(0);
+    }
+    return(1);
+}
 
-       if(yang){
-               newpoint.z=thePoint.z*cosf(yang)-thePoint.x*sinf(yang);
-               newpoint.x=thePoint.z*sinf(yang)+thePoint.x*cosf(yang);
-               thePoint.z=newpoint.z;
-               thePoint.x=newpoint.x;
-       }
+inline bool sphere_line_intersection (
+    XYZ *p1, XYZ *p2, XYZ *p3, float *r )
+{
 
-       if(zang){
-               newpoint.x=thePoint.x*cosf(zang)-thePoint.y*sinf(zang);
-               newpoint.y=thePoint.y*cosf(zang)+thePoint.x*sinf(zang);
-               thePoint.x=newpoint.x;
-               thePoint.y=newpoint.y;
-       }
+    // x1,p1->y,p1->z  P1 coordinates (point of line)
+    // p2->x,p2->y,p2->z  P2 coordinates (point of line)
+    // p3->x,p3->y,p3->z, r  P3 coordinates and radius (sphere)
+    // x,y,z   intersection coordinates
+    //
+    // This function returns a pointer array which first index indicates
+    // the number of intersection point, followed by coordinate pairs.
+
+    //~ static float x , y , z;
+    static float a, b, c, /*mu,*/ i ;
+
+    if (p1->x > p3->x + *r && p2->x > p3->x + *r)return(0);
+    if (p1->x < p3->x - *r && p2->x < p3->x - *r)return(0);
+    if (p1->y > p3->y + *r && p2->y > p3->y + *r)return(0);
+    if (p1->y < p3->y - *r && p2->y < p3->y - *r)return(0);
+    if (p1->z > p3->z + *r && p2->z > p3->z + *r)return(0);
+    if (p1->z < p3->z - *r && p2->z < p3->z - *r)return(0);
+    a =  square(p2->x - p1->x) + square(p2->y - p1->y) + square(p2->z - p1->z);
+    b =  2 * ( (p2->x - p1->x) * (p1->x - p3->x)
+               + (p2->y - p1->y) * (p1->y - p3->y)
+               + (p2->z - p1->z) * (p1->z - p3->z) ) ;
+    c =  square(p3->x) + square(p3->y) +
+         square(p3->z) + square(p1->x) +
+         square(p1->y) + square(p1->z) -
+         2 * ( p3->x * p1->x + p3->y * p1->y + p3->z * p1->z ) - square(*r) ;
+    i =   b * b - 4 * a * c ;
+
+    if ( i < 0.0 ) {
+        // no intersection
+        return(0);
+    }
+    return(1);
+}
+
+inline XYZ DoRotationRadian(XYZ thePoint, float xang, float yang, float zang)
+{
+    static XYZ newpoint;
+    static XYZ oldpoint;
 
-       if(xang){
-               newpoint.y=thePoint.y*cosf(xang)-thePoint.z*sinf(xang);
-               newpoint.z=thePoint.y*sinf(xang)+thePoint.z*cosf(xang);
-               thePoint.z=newpoint.z;
-               thePoint.y=newpoint.y;  
-       }
+    oldpoint = thePoint;
 
-       return thePoint;
-}
+    if (yang != 0) {
+        newpoint.z = oldpoint.z * cosf(yang) - oldpoint.x * sinf(yang);
+        newpoint.x = oldpoint.z * sinf(yang) + oldpoint.x * cosf(yang);
+        oldpoint.z = newpoint.z;
+        oldpoint.x = newpoint.x;
+    }
 
-inline float square( float f ) { return (f*f) ;}
+    if (zang != 0) {
+        newpoint.x = oldpoint.x * cosf(zang) - oldpoint.y * sinf(zang);
+        newpoint.y = oldpoint.y * cosf(zang) + oldpoint.x * sinf(zang);
+        oldpoint.x = newpoint.x;
+        oldpoint.y = newpoint.y;
+    }
 
-inline bool sphere_line_intersection (
-                                                                         float x1, float y1 , float z1,
-                                                                         float x2, float y2 , float z2,
-                                                                         float x3, float y3 , float z3, float r )
-{
-
-       // x1,y1,z1  P1 coordinates (point of line)
-       // x2,y2,z2  P2 coordinates (point of line)
-       // x3,y3,z3, r  P3 coordinates and radius (sphere)
-       // x,y,z   intersection coordinates
-       //
-       // This function returns a pointer array which first index indicates
-       // the number of intersection point, followed by coordinate pairs.
-
-       //~ static float x , y , z;
-       static float a, b, c, /*mu,*/ i ;
-
-       if(x1>x3+r&&x2>x3+r)return(0);
-       if(x1<x3-r&&x2<x3-r)return(0);
-       if(y1>y3+r&&y2>y3+r)return(0);
-       if(y1<y3-r&&y2<y3-r)return(0);
-       if(z1>z3+r&&z2>z3+r)return(0);
-       if(z1<z3-r&&z2<z3-r)return(0);
-       a =  square(x2 - x1) + square(y2 - y1) + square(z2 - z1);
-       b =  2* ( (x2 - x1)*(x1 - x3)
-               + (y2 - y1)*(y1 - y3)
-               + (z2 - z1)*(z1 - z3) ) ;
-       c =  square(x3) + square(y3) +
-               square(z3) + square(x1) +
-               square(y1) + square(z1) -
-               2* ( x3*x1 + y3*y1 + z3*z1 ) - square(r) ;
-       i =   b * b - 4 * a * c ;
-
-       if ( i < 0.0 )
-       {
-               // no intersection
-               return(0);
-       }
-       return(1);
-}
+    if (xang != 0) {
+        newpoint.y = oldpoint.y * cosf(xang) - oldpoint.z * sinf(xang);
+        newpoint.z = oldpoint.y * sinf(xang) + oldpoint.z * cosf(xang);
+        oldpoint.z = newpoint.z;
+        oldpoint.y = newpoint.y;
+    }
 
-inline bool sphere_line_intersection (
-                                                                         XYZ *p1, XYZ *p2, XYZ *p3, float *r )
-{
-
-       // x1,p1->y,p1->z  P1 coordinates (point of line)
-       // p2->x,p2->y,p2->z  P2 coordinates (point of line)
-       // p3->x,p3->y,p3->z, r  P3 coordinates and radius (sphere)
-       // x,y,z   intersection coordinates
-       //
-       // This function returns a pointer array which first index indicates
-       // the number of intersection point, followed by coordinate pairs.
-
-       //~ static float x , y , z;
-       static float a, b, c, /*mu,*/ i ;
-
-       if(p1->x>p3->x+*r&&p2->x>p3->x+*r)return(0);
-       if(p1->x<p3->x-*r&&p2->x<p3->x-*r)return(0);
-       if(p1->y>p3->y+*r&&p2->y>p3->y+*r)return(0);
-       if(p1->y<p3->y-*r&&p2->y<p3->y-*r)return(0);
-       if(p1->z>p3->z+*r&&p2->z>p3->z+*r)return(0);
-       if(p1->z<p3->z-*r&&p2->z<p3->z-*r)return(0);
-       a =  square(p2->x - p1->x) + square(p2->y - p1->y) + square(p2->z - p1->z);
-       b =  2* ( (p2->x - p1->x)*(p1->x - p3->x)
-               + (p2->y - p1->y)*(p1->y - p3->y)
-               + (p2->z - p1->z)*(p1->z - p3->z) ) ;
-       c =  square(p3->x) + square(p3->y) +
-               square(p3->z) + square(p1->x) +
-               square(p1->y) + square(p1->z) -
-               2* ( p3->x*p1->x + p3->y*p1->y + p3->z*p1->z ) - square(*r) ;
-       i =   b * b - 4 * a * c ;
-
-       if ( i < 0.0 )
-       {
-               // no intersection
-               return(0);
-       }
-       return(1);
-}
-
-inline XYZ DoRotationRadian(XYZ thePoint, float xang, float yang, float zang){
-       static XYZ newpoint;
-       static XYZ oldpoint;
-
-       oldpoint=thePoint;
-
-       if(yang!=0){
-               newpoint.z=oldpoint.z*cosf(yang)-oldpoint.x*sinf(yang);
-               newpoint.x=oldpoint.z*sinf(yang)+oldpoint.x*cosf(yang);
-               oldpoint.z=newpoint.z;
-               oldpoint.x=newpoint.x;
-       }
-
-       if(zang!=0){
-               newpoint.x=oldpoint.x*cosf(zang)-oldpoint.y*sinf(zang);
-               newpoint.y=oldpoint.y*cosf(zang)+oldpoint.x*sinf(zang);
-               oldpoint.x=newpoint.x;
-               oldpoint.y=newpoint.y;
-       }
-
-       if(xang!=0){
-               newpoint.y=oldpoint.y*cosf(xang)-oldpoint.z*sinf(xang);
-               newpoint.z=oldpoint.y*sinf(xang)+oldpoint.z*cosf(xang);
-               oldpoint.z=newpoint.z;
-               oldpoint.y=newpoint.y;  
-       }
-
-       return oldpoint;
+    return oldpoint;
 
 }
 
 inline bool DistancePointLine( XYZ *Point, XYZ *LineStart, XYZ *LineEnd, float *Distance, XYZ *Intersection )
 {
-       float LineMag;
-       float U;
+    float LineMag;
+    float U;
 
-       LineMag = findDistance( LineEnd, LineStart );
+    LineMag = findDistance( LineEnd, LineStart );
 
-       U = ( ( ( Point->x - LineStart->x ) * ( LineEnd->x - LineStart->x ) ) +
-               ( ( Point->y - LineStart->y ) * ( LineEnd->y - LineStart->y ) ) +
-               ( ( Point->z - LineStart->z ) * ( LineEnd->z - LineStart->z ) ) ) /
-               ( LineMag * LineMag );
+    U = ( ( ( Point->x - LineStart->x ) * ( LineEnd->x - LineStart->x ) ) +
+          ( ( Point->y - LineStart->y ) * ( LineEnd->y - LineStart->y ) ) +
+          ( ( Point->z - LineStart->z ) * ( LineEnd->z - LineStart->z ) ) ) /
+        ( LineMag * LineMag );
 
-       if( U < 0.0f || U > 1.0f )
-               return 0;   // closest point does not fall within the line segment
+    if ( U < 0.0f || U > 1.0f )
+        return 0;   // closest point does not fall within the line segment
 
-       Intersection->x = LineStart->x + U * ( LineEnd->x - LineStart->x );
-       Intersection->y = LineStart->y + U * ( LineEnd->y - LineStart->y );
-       Intersection->z = LineStart->z + U * ( LineEnd->z - LineStart->z );
+    Intersection->x = LineStart->x + U * ( LineEnd->x - LineStart->x );
+    Intersection->y = LineStart->y + U * ( LineEnd->y - LineStart->y );
+    Intersection->z = LineStart->z + U * ( LineEnd->z - LineStart->z );
 
-       *Distance = findDistance( Point, Intersection );
+    *Distance = findDistance( Point, Intersection );
 
-       return 1;
+    return 1;
 }
 
 #endif
index 3d53ebeb66897a533483922314ec1f908fa38cec..20667e2f93733ef295dcae1a1c060ca91e6f957c 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
index 7b5854f461c7586004c4de7fdd07ae11789995f7..9b99459ad3f8d70eb3830be0020e24457a7e0041 100644 (file)
 
 using namespace Game;
 
-void DefaultSettings() {
-       detail=1;
-       ismotionblur=0;
-       usermousesensitivity=1;
-       newscreenwidth=kContextWidth=640;
-       newscreenheight=kContextHeight=480;
-       kBitsPerPixel = 32;
-       floatjump=0;
-       autoslomo=1;
-       decals=1;
-       invertmouse=0;
-       bloodtoggle=0;
-       foliage=1;
-       musictoggle=1;
-       trilinear=1;
-       gamespeed=1;
-       difficulty=1;
-       damageeffects=0;
-       texttoggle=1;
-       alwaysblur=0;
-       showpoints=0;
-       showdamagebar=0;
-       immediate=0;
-       velocityblur=0;
-       volume = 0.8f;
-       ambientsound=1;
-       vblsync=1;
-       debugmode=0;
-       
-       crouchkey=SDLK_LSHIFT;
-       jumpkey=SDLK_SPACE;
-       leftkey=SDLK_a;
-       forwardkey=SDLK_w;
-       backkey=SDLK_s;
-       rightkey=SDLK_d;
-       drawkey=SDLK_e;
-       throwkey=SDLK_q;
-       attackkey=MOUSEBUTTON1;
-       consolekey=SDLK_BACKQUOTE;
-       chatkey=SDLK_t;
+void DefaultSettings()
+{
+    detail = 1;
+    ismotionblur = 0;
+    usermousesensitivity = 1;
+    newscreenwidth = kContextWidth = 640;
+    newscreenheight = kContextHeight = 480;
+    kBitsPerPixel = 32;
+    floatjump = 0;
+    autoslomo = 1;
+    decals = 1;
+    invertmouse = 0;
+    bloodtoggle = 0;
+    foliage = 1;
+    musictoggle = 1;
+    trilinear = 1;
+    gamespeed = 1;
+    difficulty = 1;
+    damageeffects = 0;
+    texttoggle = 1;
+    alwaysblur = 0;
+    showpoints = 0;
+    showdamagebar = 0;
+    immediate = 0;
+    velocityblur = 0;
+    volume = 0.8f;
+    ambientsound = 1;
+    vblsync = 1;
+    debugmode = 0;
+
+    crouchkey = SDLK_LSHIFT;
+    jumpkey = SDLK_SPACE;
+    leftkey = SDLK_a;
+    forwardkey = SDLK_w;
+    backkey = SDLK_s;
+    rightkey = SDLK_d;
+    drawkey = SDLK_e;
+    throwkey = SDLK_q;
+    attackkey = MOUSEBUTTON1;
+    consolekey = SDLK_BACKQUOTE;
+    chatkey = SDLK_t;
 }
 
-void SaveSettings() {
-       if(newdetail<0) newdetail=0;
-       if(newdetail>2) newdetail=2;
-       if(newscreenwidth>3000) newscreenwidth=screenwidth;
-       if(newscreenwidth<0) newscreenwidth=screenwidth;
-       if(newscreenheight>3000) newscreenheight=screenheight;
-       if(newscreenheight<0) newscreenheight=screenheight;
-       ofstream opstream(ConvertFileName(":Data:config.txt", "w"));
-       opstream << "Screenwidth:\n";
-       opstream << newscreenwidth;
-       opstream << "\nScreenheight:\n";
-       opstream << newscreenheight;
-       opstream << "\nMouse sensitivity:\n";
-       opstream << usermousesensitivity;
-       opstream << "\nBlur(0,1):\n";
-       opstream << ismotionblur;
-       opstream << "\nOverall Detail(0,1,2) higher=better:\n";
-       opstream << newdetail;
-       opstream << "\nFloating jump:\n";
-       opstream << floatjump;
-       opstream << "\nMouse jump:\n";
-       opstream << mousejump;
-       opstream << "\nAmbient sound:\n";
-       opstream << ambientsound;
-       opstream << "\nBlood (0,1,2):\n";
-       opstream << bloodtoggle;
-       opstream << "\nAuto slomo:\n";
-       opstream << autoslomo;
-       opstream << "\nFoliage:\n";
-       opstream << foliage;
-       opstream << "\nMusic:\n";
-       opstream << musictoggle;
-       opstream << "\nTrilinear:\n";
-       opstream << trilinear;
-       opstream << "\nDecals(shadows,blood puddles,etc):\n";
-       opstream << decals;
-       opstream << "\nInvert mouse:\n";
-       opstream << invertmouse;
-       opstream << "\nGamespeed:\n";
-       if(oldgamespeed==0)oldgamespeed=1;
-       opstream << oldgamespeed;
-       opstream << "\nDifficulty(0,1,2) higher=harder:\n";
-       opstream << difficulty;
-       opstream << "\nDamage effects(blackout, doublevision):\n";
-       opstream << damageeffects;
-       opstream << "\nText:\n";
-       opstream << texttoggle;
-       opstream << "\nDebug:\n";
-       opstream << debugmode;
-       opstream << "\nVBL Sync:\n";
-       opstream << vblsync;
-       opstream << "\nShow Points:\n";
-       opstream << showpoints;
-       opstream << "\nAlways Blur:\n";
-       opstream << alwaysblur;
-       opstream << "\nImmediate mode (turn on on G5):\n";
-       opstream << immediate;
-       opstream << "\nVelocity blur:\n";
-       opstream << velocityblur;
-       opstream << "\nVolume:\n";
-       opstream << volume;
-       opstream << "\nForward key:\n";
-       opstream << Input::keyToChar(forwardkey);
-       opstream << "\nBack key:\n";
-       opstream << Input::keyToChar(backkey);
-       opstream << "\nLeft key:\n";
-       opstream << Input::keyToChar(leftkey);
-       opstream << "\nRight key:\n";
-       opstream << Input::keyToChar(rightkey);
-       opstream << "\nJump key:\n";
-       opstream << Input::keyToChar(jumpkey);
-       opstream << "\nCrouch key:\n";
-       opstream << Input::keyToChar(crouchkey);
-       opstream << "\nDraw key:\n";
-       opstream << Input::keyToChar(drawkey);
-       opstream << "\nThrow key:\n";
-       opstream << Input::keyToChar(throwkey);
-       opstream << "\nAttack key:\n";
-       opstream << Input::keyToChar(attackkey);
-       opstream << "\nConsole key:\n";
-       opstream << Input::keyToChar(consolekey);
-       opstream << "\nChat key:\n";
-       opstream << Input::keyToChar(chatkey);
-       opstream << "\nDamage bar:\n";
-       opstream << showdamagebar;
-       opstream << "\nStereoMode:\n";
-       opstream << stereomode;
-       opstream << "\nStereoSeparation:\n";
-       opstream << stereoseparation;
-       opstream << "\nStereoReverse:\n";
-       opstream << stereoreverse;
-       opstream.close();
+void SaveSettings()
+{
+    if (newdetail < 0) newdetail = 0;
+    if (newdetail > 2) newdetail = 2;
+    if (newscreenwidth > 3000) newscreenwidth = screenwidth;
+    if (newscreenwidth < 0) newscreenwidth = screenwidth;
+    if (newscreenheight > 3000) newscreenheight = screenheight;
+    if (newscreenheight < 0) newscreenheight = screenheight;
+    ofstream opstream(ConvertFileName(":Data:config.txt", "w"));
+    opstream << "Screenwidth:\n";
+    opstream << newscreenwidth;
+    opstream << "\nScreenheight:\n";
+    opstream << newscreenheight;
+    opstream << "\nMouse sensitivity:\n";
+    opstream << usermousesensitivity;
+    opstream << "\nBlur(0,1):\n";
+    opstream << ismotionblur;
+    opstream << "\nOverall Detail(0,1,2) higher=better:\n";
+    opstream << newdetail;
+    opstream << "\nFloating jump:\n";
+    opstream << floatjump;
+    opstream << "\nMouse jump:\n";
+    opstream << mousejump;
+    opstream << "\nAmbient sound:\n";
+    opstream << ambientsound;
+    opstream << "\nBlood (0,1,2):\n";
+    opstream << bloodtoggle;
+    opstream << "\nAuto slomo:\n";
+    opstream << autoslomo;
+    opstream << "\nFoliage:\n";
+    opstream << foliage;
+    opstream << "\nMusic:\n";
+    opstream << musictoggle;
+    opstream << "\nTrilinear:\n";
+    opstream << trilinear;
+    opstream << "\nDecals(shadows,blood puddles,etc):\n";
+    opstream << decals;
+    opstream << "\nInvert mouse:\n";
+    opstream << invertmouse;
+    opstream << "\nGamespeed:\n";
+    if (oldgamespeed == 0)oldgamespeed = 1;
+    opstream << oldgamespeed;
+    opstream << "\nDifficulty(0,1,2) higher=harder:\n";
+    opstream << difficulty;
+    opstream << "\nDamage effects(blackout, doublevision):\n";
+    opstream << damageeffects;
+    opstream << "\nText:\n";
+    opstream << texttoggle;
+    opstream << "\nDebug:\n";
+    opstream << debugmode;
+    opstream << "\nVBL Sync:\n";
+    opstream << vblsync;
+    opstream << "\nShow Points:\n";
+    opstream << showpoints;
+    opstream << "\nAlways Blur:\n";
+    opstream << alwaysblur;
+    opstream << "\nImmediate mode (turn on on G5):\n";
+    opstream << immediate;
+    opstream << "\nVelocity blur:\n";
+    opstream << velocityblur;
+    opstream << "\nVolume:\n";
+    opstream << volume;
+    opstream << "\nForward key:\n";
+    opstream << Input::keyToChar(forwardkey);
+    opstream << "\nBack key:\n";
+    opstream << Input::keyToChar(backkey);
+    opstream << "\nLeft key:\n";
+    opstream << Input::keyToChar(leftkey);
+    opstream << "\nRight key:\n";
+    opstream << Input::keyToChar(rightkey);
+    opstream << "\nJump key:\n";
+    opstream << Input::keyToChar(jumpkey);
+    opstream << "\nCrouch key:\n";
+    opstream << Input::keyToChar(crouchkey);
+    opstream << "\nDraw key:\n";
+    opstream << Input::keyToChar(drawkey);
+    opstream << "\nThrow key:\n";
+    opstream << Input::keyToChar(throwkey);
+    opstream << "\nAttack key:\n";
+    opstream << Input::keyToChar(attackkey);
+    opstream << "\nConsole key:\n";
+    opstream << Input::keyToChar(consolekey);
+    opstream << "\nChat key:\n";
+    opstream << Input::keyToChar(chatkey);
+    opstream << "\nDamage bar:\n";
+    opstream << showdamagebar;
+    opstream << "\nStereoMode:\n";
+    opstream << stereomode;
+    opstream << "\nStereoSeparation:\n";
+    opstream << stereoseparation;
+    opstream << "\nStereoReverse:\n";
+    opstream << stereoreverse;
+    opstream.close();
 }
 
-bool LoadSettings() {
-       ifstream ipstream(ConvertFileName(":Data:config.txt"), std::ios::in);
-       if ( !ipstream || ipstream.fail() ) {
-               printf("Config file not found\n");
-               return false;
-       }
-       char setting[256];
-       char string[256];
-       
-       printf("Loading config\n");
-       while(!ipstream.eof()) {
-               ipstream.getline( setting, sizeof(setting) );
-               
-               // skip blank lines
-               // assume lines starting with spaces are all blank
-               if ( strlen(setting) == 0 || setting[0] == ' ' || setting[0] == '\t') continue;
-               //~ printf("setting : %s\n",setting);
+bool LoadSettings()
+{
+    ifstream ipstream(ConvertFileName(":Data:config.txt"), std::ios::in);
+    if ( !ipstream || ipstream.fail() ) {
+        printf("Config file not found\n");
+        return false;
+    }
+    char setting[256];
+    char string[256];
+
+    printf("Loading config\n");
+    while (!ipstream.eof()) {
+        ipstream.getline( setting, sizeof(setting) );
+
+        // skip blank lines
+        // assume lines starting with spaces are all blank
+        if ( strlen(setting) == 0 || setting[0] == ' ' || setting[0] == '\t') continue;
+        //~ printf("setting : %s\n",setting);
+
+        if ( ipstream.eof() || ipstream.fail() ) {
+            fprintf(stderr, "Error reading config file: Got setting name '%s', but value can't be read\n", setting);
+            ipstream.close();
+            return false;
+        }
+
+
+        if ( !strncmp(setting, "Screenwidth", 11) ) {
+            ipstream >> kContextWidth;
+        } else if ( !strncmp(setting, "Screenheight", 12) ) {
+            ipstream >> kContextHeight;
+        } else if ( !strncmp(setting, "Mouse sensitivity", 17) ) {
+            ipstream >> usermousesensitivity;
+        } else if ( !strncmp(setting, "Blur", 4) ) {
+            ipstream >> ismotionblur;
+        } else if ( !strncmp(setting, "Overall Detail", 14) ) {
+            ipstream >> detail;
+            if (detail != 0)kBitsPerPixel = 32;
+            else kBitsPerPixel = 16;
+        } else if ( !strncmp(setting, "Floating jump", 13) ) {
+            ipstream >> floatjump;
+        } else if ( !strncmp(setting, "Mouse jump", 10) ) {
+            ipstream >> mousejump;
+        } else if ( !strncmp(setting, "Ambient sound", 13) ) {
+            ipstream >> ambientsound;
+        } else if ( !strncmp(setting, "Blood ", 6) ) {
+            ipstream >> bloodtoggle;
+        } else if ( !strncmp(setting, "Auto slomo", 10) ) {
+            ipstream >> autoslomo;
+        } else if ( !strncmp(setting, "Foliage", 7) ) {
+            ipstream >> foliage;
+        } else if ( !strncmp(setting, "Music", 5) ) {
+            ipstream >> musictoggle;
+        } else if ( !strncmp(setting, "Trilinear", 9) ) {
+            ipstream >> trilinear;
+        } else if ( !strncmp(setting, "Decals", 6) ) {
+            ipstream >> decals;
+        } else if ( !strncmp(setting, "Invert mouse", 12) ) {
+            ipstream >> invertmouse;
+        } else if ( !strncmp(setting, "Gamespeed", 9) ) {
+            ipstream >> gamespeed;
+            oldgamespeed = gamespeed;
+            if (oldgamespeed == 0) {
+                gamespeed = 1;
+                oldgamespeed = 1;
+            }
+        } else if ( !strncmp(setting, "Difficulty", 10) ) {
+            ipstream >> difficulty;
+        } else if ( !strncmp(setting, "Damage effects", 14) ) {
+            ipstream >> damageeffects;
+        } else if ( !strncmp(setting, "Text", 4) ) {
+            ipstream >> texttoggle;
+        } else if ( !strncmp(setting, "Debug", 5) ) {
+            ipstream >> debugmode;
+        } else if ( !strncmp(setting, "VBL Sync", 8) ) {
+            ipstream >> vblsync;
+        } else if ( !strncmp(setting, "Show Points", 11) ) {
+            ipstream >> showpoints;
+        } else if ( !strncmp(setting, "Always Blur", 11) ) {
+            ipstream >> alwaysblur;
+        } else if ( !strncmp(setting, "Immediate mode ", 15) ) {
+            ipstream >> immediate;
+        } else if ( !strncmp(setting, "Velocity blur", 13) ) {
+            ipstream >> velocityblur;
+        } else if ( !strncmp(setting, "Volume", 6) ) {
+            ipstream >> volume;
+        } else if ( !strncmp(setting, "Forward key", 11) ) {
+            ipstream.getline( string, sizeof(string) );
+            forwardkey = Input::CharToKey(string);
+        } else if ( !strncmp(setting, "Back key", 8) ) {
+            ipstream.getline( string, sizeof(string) );
+            backkey = Input::CharToKey(string);
+        } else if ( !strncmp(setting, "Left key", 8) ) {
+            ipstream.getline( string, sizeof(string) );
+            leftkey = Input::CharToKey(string);
+        } else if ( !strncmp(setting, "Right key", 9) ) {
+            ipstream.getline( string, sizeof(string) );
+            rightkey = Input::CharToKey(string);
+        } else if ( !strncmp(setting, "Jump key", 8) ) {
+            ipstream.getline( string, sizeof(string) );
+            jumpkey = Input::CharToKey(string);
+        } else if ( !strncmp(setting, "Crouch key", 10) ) {
+            ipstream.getline( string, sizeof(string) );
+            crouchkey = Input::CharToKey(string);
+        } else if ( !strncmp(setting, "Draw key", 8) ) {
+            ipstream.getline( string, sizeof(string) );
+            drawkey = Input::CharToKey(string);
+        } else if ( !strncmp(setting, "Throw key", 9) ) {
+            ipstream.getline( string, sizeof(string) );
+            throwkey = Input::CharToKey(string);
+        } else if ( !strncmp(setting, "Attack key", 10) ) {
+            ipstream.getline( string, sizeof(string) );
+            attackkey = Input::CharToKey(string);
+        } else if ( !strncmp(setting, "Console key", 11) ) {
+            ipstream.getline( string, sizeof(string) );
+            consolekey = Input::CharToKey(string);
+        } else if ( !strncmp(setting, "Chat key", 8) ) {
+            ipstream.getline( string, sizeof(string) );
+            chatkey = Input::CharToKey(string);
+        } else if ( !strncmp(setting, "Damage bar", 10) ) {
+            ipstream >> showdamagebar;
+        } else if ( !strncmp(setting, "StereoMode", 10) ) {
+            int i;
+            ipstream >> i;
+            stereomode = (StereoMode)i;
+        } else if ( !strncmp(setting, "StereoSeparation", 16) ) {
+            ipstream >> stereoseparation;
+        } else if ( !strncmp(setting, "StereoReverse", 13) ) {
+            ipstream >> stereoreverse;
+        } else {
+            ipstream >> string;
+            fprintf(stderr, "Unknown config option '%s' with value '%s'. Ignoring.\n", setting, string);
+        }
+
+        if ( ipstream.fail() ) {
+            fprintf(stderr, "Error reading config file: EOF reached when trying to read value for setting '%s'.\n", setting);
+            ipstream.close();
+            return false;
+        }
+
+        if ( ipstream.bad() ) {
+            fprintf(stderr, "Error reading config file: Failed to read value for setting '%s'.\n", setting);
+            ipstream.close();
+            return false;
+        }
+    }
+
+    ipstream.close();
+
+    if (detail > 2)detail = 2;
+    if (detail < 0)detail = 0;
+    if (screenwidth < 0)screenwidth = 640;
+    if (screenheight < 0)screenheight = 480;
 
-               if ( ipstream.eof() || ipstream.fail() ) {
-                       fprintf(stderr, "Error reading config file: Got setting name '%s', but value can't be read\n", setting);
-                       ipstream.close();                       
-                       return false;
-               }
-               
-       
-               if ( !strncmp(setting, "Screenwidth", 11) ) {
-                       ipstream >> kContextWidth;
-               } else if ( !strncmp(setting, "Screenheight", 12) ) {
-                       ipstream >> kContextHeight;
-               } else if ( !strncmp(setting, "Mouse sensitivity", 17) ) {
-                       ipstream >> usermousesensitivity;
-               } else if ( !strncmp(setting, "Blur", 4) ) {
-                       ipstream >> ismotionblur;
-               } else if ( !strncmp(setting, "Overall Detail", 14) ) {
-                       ipstream >> detail;
-                       if(detail!=0)kBitsPerPixel=32;
-                       else kBitsPerPixel=16;
-               } else if ( !strncmp(setting, "Floating jump", 13) ) {
-                       ipstream >> floatjump;
-               } else if ( !strncmp(setting, "Mouse jump", 10) ) {
-                       ipstream >> mousejump;
-               } else if ( !strncmp(setting, "Ambient sound", 13) ) {
-                       ipstream >> ambientsound;
-               } else if ( !strncmp(setting, "Blood ", 6) ) {
-                       ipstream >> bloodtoggle;
-               } else if ( !strncmp(setting, "Auto slomo", 10) ) {
-                       ipstream >> autoslomo;
-               } else if ( !strncmp(setting, "Foliage", 7) ) {
-                       ipstream >> foliage;
-               } else if ( !strncmp(setting, "Music", 5) ) {
-                       ipstream >> musictoggle;
-               } else if ( !strncmp(setting, "Trilinear", 9) ) {
-                       ipstream >> trilinear;
-               } else if ( !strncmp(setting, "Decals", 6) ) {
-                       ipstream >> decals;
-               } else if ( !strncmp(setting, "Invert mouse", 12) ) {
-                       ipstream >> invertmouse;
-               } else if ( !strncmp(setting, "Gamespeed", 9) ) {
-                       ipstream >> gamespeed;
-                       oldgamespeed=gamespeed;
-                       if(oldgamespeed==0){
-                               gamespeed=1;
-                               oldgamespeed=1;
-                       }
-               } else if ( !strncmp(setting, "Difficulty", 10) ) {
-                       ipstream >> difficulty;
-               } else if ( !strncmp(setting, "Damage effects", 14) ) {
-                       ipstream >> damageeffects;
-               } else if ( !strncmp(setting, "Text", 4) ) {
-                       ipstream >> texttoggle;
-               } else if ( !strncmp(setting, "Debug", 5) ) {
-                       ipstream >> debugmode;
-               } else if ( !strncmp(setting, "VBL Sync", 8) ) {
-                       ipstream >> vblsync;
-               } else if ( !strncmp(setting, "Show Points", 11) ) {
-                       ipstream >> showpoints;
-               } else if ( !strncmp(setting, "Always Blur", 11) ) {
-                       ipstream >> alwaysblur;
-               } else if ( !strncmp(setting, "Immediate mode ", 15) ) {
-                       ipstream >> immediate;
-               } else if ( !strncmp(setting, "Velocity blur", 13) ) {
-                       ipstream >> velocityblur;
-               } else if ( !strncmp(setting, "Volume", 6) ) {
-                       ipstream >> volume;
-               } else if ( !strncmp(setting, "Forward key", 11) ) {
-                       ipstream.getline( string, sizeof(string) );
-                       forwardkey = Input::CharToKey(string);
-               } else if ( !strncmp(setting, "Back key", 8) ) {
-                       ipstream.getline( string, sizeof(string) );
-                       backkey = Input::CharToKey(string);
-               } else if ( !strncmp(setting, "Left key", 8) ) {
-                       ipstream.getline( string, sizeof(string) );
-                       leftkey = Input::CharToKey(string);
-               } else if ( !strncmp(setting, "Right key", 9) ) {
-                       ipstream.getline( string, sizeof(string) );
-                       rightkey = Input::CharToKey(string);
-               } else if ( !strncmp(setting, "Jump key", 8) ) {
-                       ipstream.getline( string, sizeof(string) );
-                       jumpkey = Input::CharToKey(string);
-               } else if ( !strncmp(setting, "Crouch key", 10) ) {
-                       ipstream.getline( string, sizeof(string) );
-                       crouchkey = Input::CharToKey(string);
-               } else if ( !strncmp(setting, "Draw key", 8) ) {
-                       ipstream.getline( string, sizeof(string) );
-                       drawkey = Input::CharToKey(string);
-               } else if ( !strncmp(setting, "Throw key", 9) ) {
-                       ipstream.getline( string, sizeof(string) );
-                       throwkey = Input::CharToKey(string);
-               } else if ( !strncmp(setting, "Attack key", 10) ) {
-                       ipstream.getline( string, sizeof(string) );
-                       attackkey = Input::CharToKey(string);
-               } else if ( !strncmp(setting, "Console key", 11) ) {
-                       ipstream.getline( string, sizeof(string) );
-                       consolekey = Input::CharToKey(string);
-               } else if ( !strncmp(setting, "Chat key", 8) ) {
-                       ipstream.getline( string, sizeof(string) );
-                       chatkey = Input::CharToKey(string);
-               } else if ( !strncmp(setting, "Damage bar", 10) ) {
-                       ipstream >> showdamagebar;
-               } else if ( !strncmp(setting, "StereoMode", 10) ) {
-                       int i;
-                       ipstream >> i;
-                       stereomode = (StereoMode)i;
-               } else if ( !strncmp(setting, "StereoSeparation", 16) ) {
-                       ipstream >> stereoseparation;
-               } else if ( !strncmp(setting, "StereoReverse", 13) ) {
-                       ipstream >> stereoreverse;
-               } else {
-                       ipstream >> string;
-                       fprintf(stderr, "Unknown config option '%s' with value '%s'. Ignoring.\n", setting, string);
-               }
-               
-               if ( ipstream.fail() ) {
-                       fprintf(stderr, "Error reading config file: EOF reached when trying to read value for setting '%s'.\n", setting);
-                       ipstream.close();                       
-                       return false;
-               }
-               
-               if ( ipstream.bad() ) {
-                       fprintf(stderr, "Error reading config file: Failed to read value for setting '%s'.\n", setting);
-                       ipstream.close();
-                       return false;
-               }
-       }
-       
-       ipstream.close();
-       
-       if(detail>2)detail=2;
-       if(detail<0)detail=0;
-       if(screenwidth<0)screenwidth=640;
-       if(screenheight<0)screenheight=480;
-       
-       return true;
+    return true;
 }
index e7526a91dd9f6b83e6efdc1f11a7d8eee0a92d80..07779559f7676b354cbc4ba0bdae38179f5d4770 100644 (file)
@@ -32,7 +32,7 @@ extern int detail;
 extern int kBitsPerPixel;
 extern int kContextWidth;
 extern int kContextHeight;
-extern float screenwidth,screenheight;
+extern float screenwidth, screenheight;
 
 void DefaultSettings();
 void SaveSettings();
index 11d7fa9d339b8cff6fca078c36e45be412ccd482..c8207a0ea8066f9b8c8689c475cc3bba1b34c4db 100644 (file)
@@ -47,9 +47,18 @@ extern bool visibleloading;
 
 /* convenience functions
  */
-Joint& Skeleton::joint(int bodypart) { return joints[jointlabels[bodypart]]; }
-XYZ& Skeleton::jointPos(int bodypart) { return joint(bodypart).position; }
-XYZ& Skeleton::jointVel(int bodypart) { return joint(bodypart).velocity; }
+Joint& Skeleton::joint(int bodypart)
+{
+    return joints[jointlabels[bodypart]];
+}
+XYZ& Skeleton::jointPos(int bodypart)
+{
+    return joint(bodypart).position;
+}
+XYZ& Skeleton::jointVel(int bodypart)
+{
+    return joint(bodypart).velocity;
+}
 
 
 /* EFFECT
@@ -217,17 +226,20 @@ float Skeleton::DoConstraints(XYZ *coords, float *scale)
             joints[i].position = joints[i].position + joints[i].velocity * multiplier;
 
             switch (joints[i].label) {
-                case head:
-                    groundlevel = .8; break;
-                case righthand:
-                case rightwrist:
-                case rightelbow:
-                case lefthand:
-                case leftwrist:
-                case leftelbow:
-                    groundlevel = .2; break;
-                default:
-                    groundlevel = .15; break;
+            case head:
+                groundlevel = .8;
+                break;
+            case righthand:
+            case rightwrist:
+            case rightelbow:
+            case lefthand:
+            case leftwrist:
+            case leftelbow:
+                groundlevel = .2;
+                break;
+            default:
+                groundlevel = .15;
+                break;
             }
 
             joints[i].position.y -= groundlevel;
@@ -509,17 +521,20 @@ float Skeleton::DoConstraints(XYZ *coords, float *scale)
 
         for (i = 0; i < num_joints; i++) {
             switch (joints[i].label) {
-                case head:
-                    groundlevel = .8; break;
-                case righthand:
-                case rightwrist:
-                case rightelbow:
-                case lefthand:
-                case leftwrist:
-                case leftelbow:
-                    groundlevel = .2; break;
-                default:
-                    groundlevel = .15; break;
+            case head:
+                groundlevel = .8;
+                break;
+            case righthand:
+            case rightwrist:
+            case rightelbow:
+            case lefthand:
+            case leftwrist:
+            case leftelbow:
+                groundlevel = .2;
+                break;
+            default:
+                groundlevel = .15;
+                break;
             }
             joints[i].position.y += groundlevel;
             joints[i].mass = 1;
@@ -597,34 +612,39 @@ void Skeleton::FindRotationMuscle(int which, int animation)
     const int label1 = muscles[which].parent1->label;
     const int label2 = muscles[which].parent2->label;
     switch (label1) {
-        case head:
-            fwd = specialforward[0]; break;
-        case rightshoulder:
-        case rightelbow:
-        case rightwrist:
-        case righthand:
-            fwd = specialforward[1]; break;
-        case leftshoulder:
-        case leftelbow:
-        case leftwrist:
-        case lefthand:
-            fwd = specialforward[2]; break;
-        case righthip:
-        case rightknee:
-        case rightankle:
-        case rightfoot:
-            fwd = specialforward[3]; break;
-        case lefthip:
-        case leftknee:
-        case leftankle:
-        case leftfoot:
-            fwd = specialforward[4]; break;
-        default:
-            if (muscles[which].parent1->lower)
-                fwd = lowforward;
-            else
-                fwd = forward;
-            break;
+    case head:
+        fwd = specialforward[0];
+        break;
+    case rightshoulder:
+    case rightelbow:
+    case rightwrist:
+    case righthand:
+        fwd = specialforward[1];
+        break;
+    case leftshoulder:
+    case leftelbow:
+    case leftwrist:
+    case lefthand:
+        fwd = specialforward[2];
+        break;
+    case righthip:
+    case rightknee:
+    case rightankle:
+    case rightfoot:
+        fwd = specialforward[3];
+        break;
+    case lefthip:
+    case leftknee:
+    case leftankle:
+    case leftfoot:
+        fwd = specialforward[4];
+        break;
+    default:
+        if (muscles[which].parent1->lower)
+            fwd = lowforward;
+        else
+            fwd = forward;
+        break;
     }
 
     if (animation == hanganim) {
@@ -938,7 +958,7 @@ void Skeleton::Load(const char *filename,       const char *lowfilename, const c
 
         newload = 1;
 
-        // for each muscle... 
+        // for each muscle...
         for (i = 0; i < num_muscles; i++) {
             // read info
             tempmuscle = muscles[i].numvertices;
index bf145f23b965128a15671f29dfe44290d86c4936..776d05e0e8c8e0b005227ce37a608584f44efdaa 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -32,104 +32,128 @@ extern float skyboxb;
 
 void
 SkyBox::load (const char *ffront, const char *fleft, const char *fback,
-             const char *fright, const char *fup,   const char *fdown)
+              const char *fright, const char *fup,   const char *fdown)
 {
-       front.load(ffront, true, false);
-       left.load(fleft, true, false);
-       back.load(fback, true, false);
-       right.load(fright, true, false);
-       up.load(fup, true, false);
-       down.load(fdown, true, false);
+    front.load(ffront, true, false);
+    left.load(fleft, true, false);
+    back.load(fback, true, false);
+    right.load(fright, true, false);
+    up.load(fup, true, false);
+    down.load(fdown, true, false);
 }
 
 void   SkyBox::draw()
 {
-       static float size=viewdistance/4;
-       glPushMatrix();
-       static GLfloat M[16];
-       glGetFloatv(GL_MODELVIEW_MATRIX,M);
-       M[12]=0;
-       M[13]=0;
-       M[14]=0;
-       glLoadMatrixf(M);
-       if(environment==2)glScalef(1+blurness/1000,1,1+blurness/1000);
-       if(environment!=2)glColor3f(.85*skyboxr,.85*skyboxg,.95*skyboxb);
-       else glColor3f(1*skyboxr,.95*skyboxg,.95*skyboxb);
+    static float size = viewdistance / 4;
+    glPushMatrix();
+    static GLfloat M[16];
+    glGetFloatv(GL_MODELVIEW_MATRIX, M);
+    M[12] = 0;
+    M[13] = 0;
+    M[14] = 0;
+    glLoadMatrixf(M);
+    if (environment == 2)glScalef(1 + blurness / 1000, 1, 1 + blurness / 1000);
+    if (environment != 2)glColor3f(.85 * skyboxr, .85 * skyboxg, .95 * skyboxb);
+    else glColor3f(1 * skyboxr, .95 * skyboxg, .95 * skyboxb);
 
-       if(!skyboxtexture){
-               glDisable(GL_TEXTURE_2D); 
-               glColor3f(skyboxr*.8,skyboxg*.8,skyboxb*.8);
-       }
-       glDepthMask(0);
-       glDisable(GL_CULL_FACE);
-       glEnable(GL_BLEND);
-       glDisable(GL_LIGHTING);
-       if(skyboxtexture)glEnable(GL_TEXTURE_2D);
-       glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
-       front.bind(); 
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
-       glBegin(GL_QUADS);
-       glNormal3f( 0.0f, 0.0f, -1);
-       glTexCoord2f(0, 0); glVertex3f(-size, -size,  size);
-       glTexCoord2f(1, 0); glVertex3f( size, -size,  size);
-       glTexCoord2f(1, 1); glVertex3f( size,  size,  size);
-       glTexCoord2f(0, 1); glVertex3f(-size,  size,  size);
-       glEnd();
-       back.bind();
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
-       glBegin(GL_QUADS);
-       glNormal3f( 0.0f, 0.0f, 1);
-       glTexCoord2f(1, 0); glVertex3f(-size, -size, -size);
-       glTexCoord2f(1, 1); glVertex3f(-size,  size, -size);
-       glTexCoord2f(0, 1); glVertex3f( size,  size, -size);
-       glTexCoord2f(0, 0); glVertex3f( size, -size, -size);
-       glEnd();
-       up.bind();
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
-       glBegin(GL_QUADS);
-       glNormal3f( 0.0f, -1.0f, 0);
-       glTexCoord2f(0, 1); glVertex3f(-size,  size, -size);
-       glTexCoord2f(0, 0); glVertex3f(-size,  size,  size);
-       glTexCoord2f(1, 0); glVertex3f( size,  size,  size);
-       glTexCoord2f(1, 1); glVertex3f( size,  size, -size);
-       glEnd();
-       down.bind();
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
-       glBegin(GL_QUADS);
-       glNormal3f( 0.0f, 1.0f, 0);
+    if (!skyboxtexture) {
+        glDisable(GL_TEXTURE_2D);
+        glColor3f(skyboxr * .8, skyboxg * .8, skyboxb * .8);
+    }
+    glDepthMask(0);
+    glDisable(GL_CULL_FACE);
+    glEnable(GL_BLEND);
+    glDisable(GL_LIGHTING);
+    if (skyboxtexture)glEnable(GL_TEXTURE_2D);
+    glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+    front.bind();
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+    glBegin(GL_QUADS);
+    glNormal3f( 0.0f, 0.0f, -1);
+    glTexCoord2f(0, 0);
+    glVertex3f(-size, -size,  size);
+    glTexCoord2f(1, 0);
+    glVertex3f( size, -size,  size);
+    glTexCoord2f(1, 1);
+    glVertex3f( size,  size,  size);
+    glTexCoord2f(0, 1);
+    glVertex3f(-size,  size,  size);
+    glEnd();
+    back.bind();
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+    glBegin(GL_QUADS);
+    glNormal3f( 0.0f, 0.0f, 1);
+    glTexCoord2f(1, 0);
+    glVertex3f(-size, -size, -size);
+    glTexCoord2f(1, 1);
+    glVertex3f(-size,  size, -size);
+    glTexCoord2f(0, 1);
+    glVertex3f( size,  size, -size);
+    glTexCoord2f(0, 0);
+    glVertex3f( size, -size, -size);
+    glEnd();
+    up.bind();
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+    glBegin(GL_QUADS);
+    glNormal3f( 0.0f, -1.0f, 0);
+    glTexCoord2f(0, 1);
+    glVertex3f(-size,  size, -size);
+    glTexCoord2f(0, 0);
+    glVertex3f(-size,  size,  size);
+    glTexCoord2f(1, 0);
+    glVertex3f( size,  size,  size);
+    glTexCoord2f(1, 1);
+    glVertex3f( size,  size, -size);
+    glEnd();
+    down.bind();
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+    glBegin(GL_QUADS);
+    glNormal3f( 0.0f, 1.0f, 0);
 
-       glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
-       glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
-       glTexCoord2f(1, 1); glVertex3f( size, -size,  size);
-       glTexCoord2f(0, 1); glVertex3f(-size, -size,  size);
-       glEnd();
-       right.bind();
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
-       glBegin(GL_QUADS);
-       glNormal3f( -1.0f, 0.0f, 0);
-       glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
-       glTexCoord2f(1, 1); glVertex3f( size,  size, -size);
-       glTexCoord2f(0, 1); glVertex3f( size,  size,  size);
-       glTexCoord2f(0, 0); glVertex3f( size, -size,  size);
-       glEnd();
-       left.bind();
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
-       glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
-       glBegin(GL_QUADS);
-       glNormal3f( 1.0f, 0.0f, 0);
-       glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
-       glTexCoord2f(1, 0); glVertex3f(-size, -size,  size);
-       glTexCoord2f(1, 1); glVertex3f(-size,  size,  size);
-       glTexCoord2f(0, 1); glVertex3f(-size,  size, -size);
-       glEnd();
-       glEnable(GL_CULL_FACE);
-       glDepthMask(1);
-       glPopMatrix();
+    glTexCoord2f(0, 0);
+    glVertex3f(-size, -size, -size);
+    glTexCoord2f(1, 0);
+    glVertex3f( size, -size, -size);
+    glTexCoord2f(1, 1);
+    glVertex3f( size, -size,  size);
+    glTexCoord2f(0, 1);
+    glVertex3f(-size, -size,  size);
+    glEnd();
+    right.bind();
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+    glBegin(GL_QUADS);
+    glNormal3f( -1.0f, 0.0f, 0);
+    glTexCoord2f(1, 0);
+    glVertex3f( size, -size, -size);
+    glTexCoord2f(1, 1);
+    glVertex3f( size,  size, -size);
+    glTexCoord2f(0, 1);
+    glVertex3f( size,  size,  size);
+    glTexCoord2f(0, 0);
+    glVertex3f( size, -size,  size);
+    glEnd();
+    left.bind();
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+    glBegin(GL_QUADS);
+    glNormal3f( 1.0f, 0.0f, 0);
+    glTexCoord2f(0, 0);
+    glVertex3f(-size, -size, -size);
+    glTexCoord2f(1, 0);
+    glVertex3f(-size, -size,  size);
+    glTexCoord2f(1, 1);
+    glVertex3f(-size,  size,  size);
+    glTexCoord2f(0, 1);
+    glVertex3f(-size,  size, -size);
+    glEnd();
+    glEnable(GL_CULL_FACE);
+    glDepthMask(1);
+    glPopMatrix();
 }
 
 SkyBox::~SkyBox()
index f1f54229aa36f61c5353162414db9999da9cec8b..77e0b3797dd853bfe8d7e2b38c3534dfd33337a2 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -28,16 +28,17 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "gamegl.h"
 #include "Texture.h"
 
-class SkyBox{
+class SkyBox
+{
 public:
-       Texture front, left, back, right, up, down;
+    Texture front, left, back, right, up, down;
 
-       void load(const char *ffront, const char *fleft, const char *fback,
-                 const char *fright, const char *fup,   const char *fdown);
-       void draw();
+    void load(const char *ffront, const char *fleft, const char *fback,
+              const char *fright, const char *fup,   const char *fdown);
+    void draw();
 
-       SkyBox() {}
-       ~SkyBox();
+    SkyBox() {}
+    ~SkyBox();
 };
 
 #endif
index f5c33988c3a630759bdf087bbdaf79f94b08e0ab..9905a0fed08de113e3c66d4379813e19e4a0bfb5 100644 (file)
@@ -39,83 +39,81 @@ static const char *sound_data[sounds_count] = {
 // This should be decided at the time of playback
 static int snd_mode(int snd)
 {
-  switch (snd)
-    {
+    switch (snd) {
     case alarmsound:
     case consolefailsound:
     case consolesuccesssound:
     case firestartsound:
     case fireendsound:
-      return OPENAL_2D;
+        return OPENAL_2D;
     default:
-      return OPENAL_HW3D;
+        return OPENAL_HW3D;
     }
 }
 
 void loadAllSounds()
 {
-  for (int i = 0; i < sounds_count; i++)
-    {
-      char buf[64];
-      snprintf(buf, 64, ":Data:Sounds:%s", sound_data[i]);
-      samp[i] = OPENAL_Sample_Load(OPENAL_FREE,
-                                  ConvertFileName(buf),
-                                  snd_mode(i),
-                                  0, 0);
+    for (int i = 0; i < sounds_count; i++) {
+        char buf[64];
+        snprintf(buf, 64, ":Data:Sounds:%s", sound_data[i]);
+        samp[i] = OPENAL_Sample_Load(OPENAL_FREE,
+                                     ConvertFileName(buf),
+                                     snd_mode(i),
+                                     0, 0);
     }
-  footstepsound = footstepsn1;
-  footstepsound2 = footstepsn2;
-  footstepsound3 = footstepst1;
-  footstepsound4 = footstepst2;
-  // Huh?
-  // OPENAL_Sample_SetMode(samp[whooshsound], OPENAL_LOOP_NORMAL);
-  for (int i = stream_firesound; i <= stream_menutheme; i++)
-    OPENAL_Stream_SetMode(samp[i], OPENAL_LOOP_NORMAL);
+    footstepsound = footstepsn1;
+    footstepsound2 = footstepsn2;
+    footstepsound3 = footstepst1;
+    footstepsound4 = footstepst2;
+    // Huh?
+    // OPENAL_Sample_SetMode(samp[whooshsound], OPENAL_LOOP_NORMAL);
+    for (int i = stream_firesound; i <= stream_menutheme; i++)
+        OPENAL_Stream_SetMode(samp[i], OPENAL_LOOP_NORMAL);
 }
 
 void
 emit_sound_at(int soundid, const XYZ &pos, float vol)
 {
-  PlaySoundEx (soundid, samp[soundid], NULL, true);
-  OPENAL_3D_SetAttributes_ (channels[soundid], pos, NULL);
-  OPENAL_SetVolume (channels[soundid], vol);
-  OPENAL_SetPaused (channels[soundid], false);
+    PlaySoundEx (soundid, samp[soundid], NULL, true);
+    OPENAL_3D_SetAttributes_ (channels[soundid], pos, NULL);
+    OPENAL_SetVolume (channels[soundid], vol);
+    OPENAL_SetPaused (channels[soundid], false);
 }
 
 void
 emit_sound_np(int soundid, float vol)
 {
-  PlaySoundEx (soundid, samp[soundid], NULL, true);
-  OPENAL_SetVolume (channels[soundid], vol);
-  OPENAL_SetPaused (channels[soundid], false);
+    PlaySoundEx (soundid, samp[soundid], NULL, true);
+    OPENAL_SetVolume (channels[soundid], vol);
+    OPENAL_SetPaused (channels[soundid], false);
 }
 
 void
 emit_stream_at(int soundid, const XYZ &pos, float vol)
 {
-  PlayStreamEx (soundid, samp[soundid], NULL, true);
-  OPENAL_3D_SetAttributes_ (channels[soundid], pos, NULL);
-  OPENAL_SetVolume (channels[soundid], vol);
-  OPENAL_SetPaused (channels[soundid], false);
+    PlayStreamEx (soundid, samp[soundid], NULL, true);
+    OPENAL_3D_SetAttributes_ (channels[soundid], pos, NULL);
+    OPENAL_SetVolume (channels[soundid], vol);
+    OPENAL_SetPaused (channels[soundid], false);
 }
 
 void
 emit_stream_np(int soundid, float vol)
 {
-  PlayStreamEx (soundid, samp[soundid], NULL, true);
-  OPENAL_SetVolume (channels[soundid], vol);
-  OPENAL_SetPaused (channels[soundid], false);
+    PlayStreamEx (soundid, samp[soundid], NULL, true);
+    OPENAL_SetVolume (channels[soundid], vol);
+    OPENAL_SetPaused (channels[soundid], false);
 }
 
 void
 resume_stream(int soundid)
 {
-  OPENAL_SetPaused (channels[soundid], false);
+    OPENAL_SetPaused (channels[soundid], false);
 }
 
 void
 pause_sound(int soundid)
 {
-  OPENAL_SetPaused (channels[soundid], true);
+    OPENAL_SetPaused (channels[soundid], true);
 }
 
index 20cd2b0c3dc0732269e0a380d24126e59af757be..80a76c172314d53f6be15920da03a5c2b0e5bbfe 100644 (file)
@@ -26,7 +26,7 @@ enum sound_types {
 #define DECLARE_SOUND(id, filename) id,
 #include "Sounds.def"
 #undef DECLARE_SOUND
-sounds_count
+    sounds_count
 };
 
 extern struct OPENAL_SAMPLE *samp[sounds_count];
index 8b7385f160e10119009a951f6d87db16b4aa489e..c3ac298cc958685170bac4ee845731d5a3f5a9ec 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -57,397 +57,403 @@ vector<Sprite*> Sprite::sprites = vector<Sprite*>();
 //Functions
 void Sprite::Draw()
 {
-       int i,j,k;
-       static float M[16];
-       static XYZ point;
-       static float distancemult;
-       static int lasttype;
-       static int lastspecial;
-       static int whichpatchx,whichpatchz;
-       static XYZ start,end,colpoint;
-       static bool check;
-       static bool blend;
-       static float tempmult;
-       static XYZ difference;
-       static float lightcolor[3];
-       static float viewdistsquared=viewdistance*viewdistance;
-       static XYZ tempviewer;
+    int i, j, k;
+    static float M[16];
+    static XYZ point;
+    static float distancemult;
+    static int lasttype;
+    static int lastspecial;
+    static int whichpatchx, whichpatchz;
+    static XYZ start, end, colpoint;
+    static bool check;
+    static bool blend;
+    static float tempmult;
+    static XYZ difference;
+    static float lightcolor[3];
+    static float viewdistsquared = viewdistance * viewdistance;
+    static XYZ tempviewer;
 
-       tempviewer=viewer+viewerfacing*6;
-       check=0;
+    tempviewer = viewer + viewerfacing * 6;
+    check = 0;
 
-       lightcolor[0]=light.color[0]*.5+light.ambient[0];
-       lightcolor[1]=light.color[1]*.5+light.ambient[1];
-       lightcolor[2]=light.color[2]*.5+light.ambient[2];
+    lightcolor[0] = light.color[0] * .5 + light.ambient[0];
+    lightcolor[1] = light.color[1] * .5 + light.ambient[1];
+    lightcolor[2] = light.color[2] * .5 + light.ambient[2];
 
-       checkdelay-=multiplier*10;
+    checkdelay -= multiplier * 10;
 
-       if(checkdelay<=0){
-               check=1;
-               checkdelay=1;
-       }
+    if (checkdelay <= 0) {
+        check = 1;
+        checkdelay = 1;
+    }
 
-       lasttype=-1;
-       lastspecial=-1;
-       glEnable(GL_BLEND);
-       glDisable(GL_LIGHTING);
-       glDisable(GL_CULL_FACE);
-       glEnable(GL_TEXTURE_2D);
-       blend = 1;
-       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-       glDepthMask(0);
-       glAlphaFunc(GL_GREATER, 0.0001);
-       for(i=0;i<sprites.size();i++){
-               if(lasttype!=sprites[i]->type) {
-                       switch(sprites[i]->type) {
-                               case cloudsprite:
-                                       cloudtexture.bind();
-                                       if(!blend){
-                                               blend=1;
-                                               glAlphaFunc(GL_GREATER, 0.0001);
-                                               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                                       }
-                               break;
-                               case cloudimpactsprite:
-                                       cloudimpacttexture.bind();
-                                       if(!blend){
-                                               blend=1;
-                                               glAlphaFunc(GL_GREATER, 0.0001);
-                                               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                                       }
-                               break;
-                               case breathsprite:
-                                       cloudimpacttexture.bind();
-                                       if(!blend){
-                                               blend=1;
-                                               glAlphaFunc(GL_GREATER, 0.0001);
-                                               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                                       }
-                               break;
-                               case smoketype:
-                                       smoketexture.bind();
-                                       if(!blend){
-                                               blend=1;
-                                               glAlphaFunc(GL_GREATER, 0.0001);
-                                               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                                       }
-                               break;
-                               case bloodsprite:
-                                       bloodtexture.bind();
-                                       if(!blend){
-                                               blend=1;
-                                               glAlphaFunc(GL_GREATER, 0.0001);
-                                               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                                       }
-                               break;
-                               case splintersprite :
-                                       if(lastspecial!=sprites[i]->special) {
-                                               if(sprites[i]->special==0)splintertexture.bind();
-                                               if(sprites[i]->special==1)leaftexture.bind();
-                                               if(sprites[i]->special==2)snowflaketexture.bind();
-                                               if(sprites[i]->special==3)toothtexture.bind();
-                                               if(!blend){
-                                                       blend=1;
-                                                       glAlphaFunc(GL_GREATER, 0.0001);
-                                                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                                               }
-                                       }
-                               break;
-                               case snowsprite:
-                                       snowflaketexture.bind();
-                                       if(!blend){
-                                               blend=1;
-                                               glAlphaFunc(GL_GREATER, 0.0001);
-                                               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                                       }
-                               break;
-                               case weaponshinesprite:
-                                       shinetexture.bind();
-                                       if(blend){
-                                               blend=0;
-                                               glAlphaFunc(GL_GREATER, 0.001);
-                                               glBlendFunc(GL_SRC_ALPHA,GL_ONE);
-                                       }
-                               break;
-                               case flamesprite:
-                               case weaponflamesprite:
-                                       flametexture.bind();
-                                       if(blend||lasttype==bloodflamesprite){
-                                               blend=0;
-                                               glAlphaFunc(GL_GREATER, 0.3);
-                                               glBlendFunc(GL_SRC_ALPHA,GL_ONE);
-                                       }
-                               break;
-                               case bloodflamesprite:
-                                       bloodflametexture.bind();
-                                       if(blend){
-                                               blend=0;
-                                               glAlphaFunc(GL_GREATER, 0.3);
-                                               glBlendFunc(GL_ONE,GL_ZERO);
-                                       }
-                               break;
-                       }
-               }
-               if(sprites[i]->type==snowsprite)
-                       distancemult=(144-(distsq(&tempviewer,&sprites[i]->position)-(144*fadestart))*(1/(1-fadestart)))/144;
-               else
-                       distancemult=(viewdistsquared-(distsq(&viewer,&sprites[i]->position)-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
-               if(sprites[i]->type==flamesprite){
-                       if(distancemult>=1) glColor4f(sprites[i]->color[0],sprites[i]->color[1],sprites[i]->color[2],sprites[i]->opacity);
-                       else glColor4f(sprites[i]->color[0],sprites[i]->color[1],sprites[i]->color[2],sprites[i]->opacity*distancemult);
-               } else {
-                       if(distancemult>=1) glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],sprites[i]->opacity);
-                       else glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],sprites[i]->opacity*distancemult);
-               }
-               lasttype=sprites[i]->type;
-               lastspecial=sprites[i]->special;
-               glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-               glPushMatrix();
-                       glTranslatef(sprites[i]->position.x,sprites[i]->position.y,sprites[i]->position.z);
-                       if((sprites[i]->type==flamesprite||sprites[i]->type==weaponflamesprite||sprites[i]->type==weaponshinesprite)){
-                               difference=viewer-sprites[i]->position;
-                               Normalise(&difference);
-                               glTranslatef(difference.x*sprites[i]->size/4, difference.y*sprites[i]->size/4, difference.z*sprites[i]->size/4);
-                       }
-                       if(sprites[i]->type==snowsprite){
-                               glRotatef(sprites[i]->rotation*.2,0,.3,1);
-                               glTranslatef(1,0,0);
-                       }
-                       glGetFloatv(GL_MODELVIEW_MATRIX,M);
-                       point.x=M[12];
-                       point.y=M[13];
-                       point.z=M[14];
-                       glLoadIdentity();
-                       glTranslatef(point.x, point.y, point.z);
+    lasttype = -1;
+    lastspecial = -1;
+    glEnable(GL_BLEND);
+    glDisable(GL_LIGHTING);
+    glDisable(GL_CULL_FACE);
+    glEnable(GL_TEXTURE_2D);
+    blend = 1;
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+    glDepthMask(0);
+    glAlphaFunc(GL_GREATER, 0.0001);
+    for (i = 0; i < sprites.size(); i++) {
+        if (lasttype != sprites[i]->type) {
+            switch (sprites[i]->type) {
+            case cloudsprite:
+                cloudtexture.bind();
+                if (!blend) {
+                    blend = 1;
+                    glAlphaFunc(GL_GREATER, 0.0001);
+                    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                }
+                break;
+            case cloudimpactsprite:
+                cloudimpacttexture.bind();
+                if (!blend) {
+                    blend = 1;
+                    glAlphaFunc(GL_GREATER, 0.0001);
+                    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                }
+                break;
+            case breathsprite:
+                cloudimpacttexture.bind();
+                if (!blend) {
+                    blend = 1;
+                    glAlphaFunc(GL_GREATER, 0.0001);
+                    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                }
+                break;
+            case smoketype:
+                smoketexture.bind();
+                if (!blend) {
+                    blend = 1;
+                    glAlphaFunc(GL_GREATER, 0.0001);
+                    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                }
+                break;
+            case bloodsprite:
+                bloodtexture.bind();
+                if (!blend) {
+                    blend = 1;
+                    glAlphaFunc(GL_GREATER, 0.0001);
+                    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                }
+                break;
+            case splintersprite :
+                if (lastspecial != sprites[i]->special) {
+                    if (sprites[i]->special == 0)splintertexture.bind();
+                    if (sprites[i]->special == 1)leaftexture.bind();
+                    if (sprites[i]->special == 2)snowflaketexture.bind();
+                    if (sprites[i]->special == 3)toothtexture.bind();
+                    if (!blend) {
+                        blend = 1;
+                        glAlphaFunc(GL_GREATER, 0.0001);
+                        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                    }
+                }
+                break;
+            case snowsprite:
+                snowflaketexture.bind();
+                if (!blend) {
+                    blend = 1;
+                    glAlphaFunc(GL_GREATER, 0.0001);
+                    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                }
+                break;
+            case weaponshinesprite:
+                shinetexture.bind();
+                if (blend) {
+                    blend = 0;
+                    glAlphaFunc(GL_GREATER, 0.001);
+                    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+                }
+                break;
+            case flamesprite:
+            case weaponflamesprite:
+                flametexture.bind();
+                if (blend || lasttype == bloodflamesprite) {
+                    blend = 0;
+                    glAlphaFunc(GL_GREATER, 0.3);
+                    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+                }
+                break;
+            case bloodflamesprite:
+                bloodflametexture.bind();
+                if (blend) {
+                    blend = 0;
+                    glAlphaFunc(GL_GREATER, 0.3);
+                    glBlendFunc(GL_ONE, GL_ZERO);
+                }
+                break;
+            }
+        }
+        if (sprites[i]->type == snowsprite)
+            distancemult = (144 - (distsq(&tempviewer, &sprites[i]->position) - (144 * fadestart)) * (1 / (1 - fadestart))) / 144;
+        else
+            distancemult = (viewdistsquared - (distsq(&viewer, &sprites[i]->position) - (viewdistsquared * fadestart)) * (1 / (1 - fadestart))) / viewdistsquared;
+        if (sprites[i]->type == flamesprite) {
+            if (distancemult >= 1) glColor4f(sprites[i]->color[0], sprites[i]->color[1], sprites[i]->color[2], sprites[i]->opacity);
+            else glColor4f(sprites[i]->color[0], sprites[i]->color[1], sprites[i]->color[2], sprites[i]->opacity * distancemult);
+        } else {
+            if (distancemult >= 1) glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity);
+            else glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity * distancemult);
+        }
+        lasttype = sprites[i]->type;
+        lastspecial = sprites[i]->special;
+        glMatrixMode(GL_MODELVIEW);                                                    // Select The Modelview Matrix
+        glPushMatrix();
+        glTranslatef(sprites[i]->position.x, sprites[i]->position.y, sprites[i]->position.z);
+        if ((sprites[i]->type == flamesprite || sprites[i]->type == weaponflamesprite || sprites[i]->type == weaponshinesprite)) {
+            difference = viewer - sprites[i]->position;
+            Normalise(&difference);
+            glTranslatef(difference.x * sprites[i]->size / 4, difference.y * sprites[i]->size / 4, difference.z * sprites[i]->size / 4);
+        }
+        if (sprites[i]->type == snowsprite) {
+            glRotatef(sprites[i]->rotation * .2, 0, .3, 1);
+            glTranslatef(1, 0, 0);
+        }
+        glGetFloatv(GL_MODELVIEW_MATRIX, M);
+        point.x = M[12];
+        point.y = M[13];
+        point.z = M[14];
+        glLoadIdentity();
+        glTranslatef(point.x, point.y, point.z);
 
-                       glRotatef(sprites[i]->rotation,0,0,1);
+        glRotatef(sprites[i]->rotation, 0, 0, 1);
 
-                       if((sprites[i]->type==flamesprite||sprites[i]->type==weaponflamesprite||sprites[i]->type==weaponshinesprite||sprites[i]->type==bloodflamesprite)){
-                               if(sprites[i]->alivetime<.14)glScalef(sprites[i]->alivetime/.14,sprites[i]->alivetime/.14,sprites[i]->alivetime/.14);
-                       }
-                       if(sprites[i]->type==smoketype||sprites[i]->type==snowsprite||sprites[i]->type==weaponshinesprite||sprites[i]->type==breathsprite){
-                               if(sprites[i]->alivetime<.3){
-                                       if(distancemult>=1)glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],sprites[i]->opacity*sprites[i]->alivetime/.3);
-                                       if(distancemult<1)glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],sprites[i]->opacity*distancemult*sprites[i]->alivetime/.3);
-                               }
-                       }
-                       if(sprites[i]->type==splintersprite&&sprites[i]->special>0&&sprites[i]->special!=3){
-                               if(sprites[i]->alivetime<.2){
-                                       if(distancemult>=1) glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],sprites[i]->alivetime/.2);
-                                       else glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],distancemult*sprites[i]->alivetime/.2);
-                               }
-                               else {
-                                       if(distancemult>=1) glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],1);
-                                       else glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],1);
-                               }
-                       }
-                       if(sprites[i]->type==splintersprite&&(sprites[i]->special==0||sprites[i]->special==3)){
-                               if(distancemult>=1) glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],1);
-                               else glColor4f(sprites[i]->color[0]*lightcolor[0],sprites[i]->color[1]*lightcolor[1],sprites[i]->color[2]*lightcolor[2],1);
-                       }
+        if ((sprites[i]->type == flamesprite || sprites[i]->type == weaponflamesprite || sprites[i]->type == weaponshinesprite || sprites[i]->type == bloodflamesprite)) {
+            if (sprites[i]->alivetime < .14)glScalef(sprites[i]->alivetime / .14, sprites[i]->alivetime / .14, sprites[i]->alivetime / .14);
+        }
+        if (sprites[i]->type == smoketype || sprites[i]->type == snowsprite || sprites[i]->type == weaponshinesprite || sprites[i]->type == breathsprite) {
+            if (sprites[i]->alivetime < .3) {
+                if (distancemult >= 1)glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity * sprites[i]->alivetime / .3);
+                if (distancemult < 1)glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->opacity * distancemult * sprites[i]->alivetime / .3);
+            }
+        }
+        if (sprites[i]->type == splintersprite && sprites[i]->special > 0 && sprites[i]->special != 3) {
+            if (sprites[i]->alivetime < .2) {
+                if (distancemult >= 1) glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], sprites[i]->alivetime / .2);
+                else glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], distancemult * sprites[i]->alivetime / .2);
+            } else {
+                if (distancemult >= 1) glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
+                else glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
+            }
+        }
+        if (sprites[i]->type == splintersprite && (sprites[i]->special == 0 || sprites[i]->special == 3)) {
+            if (distancemult >= 1) glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
+            else glColor4f(sprites[i]->color[0]*lightcolor[0], sprites[i]->color[1]*lightcolor[1], sprites[i]->color[2]*lightcolor[2], 1);
+        }
 
-                       glBegin(GL_TRIANGLES);
-                       glTexCoord2f(1.0f, 1.0f); glVertex3f( .5*sprites[i]->size, .5*sprites[i]->size, 0.0f);
-                       glTexCoord2f(0.0f, 1.0f); glVertex3f(-.5*sprites[i]->size, .5*sprites[i]->size, 0.0f);
-                       glTexCoord2f(1.0f, 0.0f); glVertex3f( .5*sprites[i]->size,-.5*sprites[i]->size, 0.0f);
-                       glTexCoord2f(0.0f, 0.0f); glVertex3f(-.5*sprites[i]->size,-.5*sprites[i]->size, 0.0f);
-                       glTexCoord2f(1.0f, 0.0f); glVertex3f( .5*sprites[i]->size, -.5*sprites[i]->size, 0.0f);
-                       glTexCoord2f(0.0f, 1.0f); glVertex3f(-.5*sprites[i]->size, .5*sprites[i]->size, 0.0f);
-                       glEnd();
-               glPopMatrix();
-       }
-       tempmult=multiplier;
-       for(i=sprites.size()-1;i>=0;i--){
-               multiplier=tempmult;
-               if(sprites[i]->type!=snowsprite) {
-                       sprites[i]->position+=sprites[i]->velocity*multiplier;
-                       sprites[i]->velocity+=windvector*multiplier;
-               }
-               if(sprites[i]->type==flamesprite||sprites[i]->type==smoketype)sprites[i]->position+=windvector*multiplier/2;
-               if((sprites[i]->type==flamesprite||sprites[i]->type==weaponflamesprite||sprites[i]->type==weaponshinesprite||sprites[i]->type==bloodflamesprite))
-                       multiplier*=sprites[i]->speed*.7;
-               sprites[i]->alivetime+=multiplier;
+        glBegin(GL_TRIANGLES);
+        glTexCoord2f(1.0f, 1.0f);
+        glVertex3f( .5 * sprites[i]->size, .5 * sprites[i]->size, 0.0f);
+        glTexCoord2f(0.0f, 1.0f);
+        glVertex3f(-.5 * sprites[i]->size, .5 * sprites[i]->size, 0.0f);
+        glTexCoord2f(1.0f, 0.0f);
+        glVertex3f( .5 * sprites[i]->size, -.5 * sprites[i]->size, 0.0f);
+        glTexCoord2f(0.0f, 0.0f);
+        glVertex3f(-.5 * sprites[i]->size, -.5 * sprites[i]->size, 0.0f);
+        glTexCoord2f(1.0f, 0.0f);
+        glVertex3f( .5 * sprites[i]->size, -.5 * sprites[i]->size, 0.0f);
+        glTexCoord2f(0.0f, 1.0f);
+        glVertex3f(-.5 * sprites[i]->size, .5 * sprites[i]->size, 0.0f);
+        glEnd();
+        glPopMatrix();
+    }
+    tempmult = multiplier;
+    for (i = sprites.size() - 1; i >= 0; i--) {
+        multiplier = tempmult;
+        if (sprites[i]->type != snowsprite) {
+            sprites[i]->position += sprites[i]->velocity * multiplier;
+            sprites[i]->velocity += windvector * multiplier;
+        }
+        if (sprites[i]->type == flamesprite || sprites[i]->type == smoketype)sprites[i]->position += windvector * multiplier / 2;
+        if ((sprites[i]->type == flamesprite || sprites[i]->type == weaponflamesprite || sprites[i]->type == weaponshinesprite || sprites[i]->type == bloodflamesprite))
+            multiplier *= sprites[i]->speed * .7;
+        sprites[i]->alivetime += multiplier;
 
-               if(sprites[i]->type==cloudsprite||sprites[i]->type==cloudimpactsprite){
-                       sprites[i]->opacity-=multiplier/2;
-                       sprites[i]->size+=multiplier/2;
-                       sprites[i]->velocity.y+=gravity*multiplier*.25;
-               }
-               if(sprites[i]->type==breathsprite){
-                       sprites[i]->opacity-=multiplier/2;
-                       sprites[i]->size+=multiplier/2;
-                       if(findLength(&sprites[i]->velocity)<=multiplier)sprites[i]->velocity=0;
-                       else{
-                               XYZ slowdown;
-                               slowdown=sprites[i]->velocity*-1;
-                               Normalise(&slowdown);
-                               slowdown*=multiplier;
-                               sprites[i]->velocity+=slowdown;
-                       }
-               }
-               if(sprites[i]->type==snowsprite){
-                       sprites[i]->size-=multiplier/120;
-                       sprites[i]->rotation+=multiplier*360;
-                       sprites[i]->position.y-=multiplier;
-                       sprites[i]->position+=windvector*multiplier;
-                       if(sprites[i]->position.y<tempviewer.y-6)sprites[i]->position.y+=12;
-                       if(sprites[i]->position.y>tempviewer.y+6)sprites[i]->position.y-=12;
-                       if(sprites[i]->position.z<tempviewer.z-6)sprites[i]->position.z+=12;
-                       if(sprites[i]->position.z>tempviewer.z+6)sprites[i]->position.z-=12;
-                       if(sprites[i]->position.x<tempviewer.x-6)sprites[i]->position.x+=12;
-                       if(sprites[i]->position.x>tempviewer.x+6)sprites[i]->position.x-=12;
-               }
-               if(sprites[i]->type==bloodsprite){
-                       bool spritehit=0;
-                       sprites[i]->rotation+=multiplier*100;
-                       sprites[i]->velocity.y+=gravity*multiplier;
-                       if(check){
-                               XYZ where,startpoint,endpoint,movepoint,footpoint;
-                               float rotationpoint;
-                               int whichtri;
+        if (sprites[i]->type == cloudsprite || sprites[i]->type == cloudimpactsprite) {
+            sprites[i]->opacity -= multiplier / 2;
+            sprites[i]->size += multiplier / 2;
+            sprites[i]->velocity.y += gravity * multiplier * .25;
+        }
+        if (sprites[i]->type == breathsprite) {
+            sprites[i]->opacity -= multiplier / 2;
+            sprites[i]->size += multiplier / 2;
+            if (findLength(&sprites[i]->velocity) <= multiplier)sprites[i]->velocity = 0;
+            else {
+                XYZ slowdown;
+                slowdown = sprites[i]->velocity * -1;
+                Normalise(&slowdown);
+                slowdown *= multiplier;
+                sprites[i]->velocity += slowdown;
+            }
+        }
+        if (sprites[i]->type == snowsprite) {
+            sprites[i]->size -= multiplier / 120;
+            sprites[i]->rotation += multiplier * 360;
+            sprites[i]->position.y -= multiplier;
+            sprites[i]->position += windvector * multiplier;
+            if (sprites[i]->position.y < tempviewer.y - 6)sprites[i]->position.y += 12;
+            if (sprites[i]->position.y > tempviewer.y + 6)sprites[i]->position.y -= 12;
+            if (sprites[i]->position.z < tempviewer.z - 6)sprites[i]->position.z += 12;
+            if (sprites[i]->position.z > tempviewer.z + 6)sprites[i]->position.z -= 12;
+            if (sprites[i]->position.x < tempviewer.x - 6)sprites[i]->position.x += 12;
+            if (sprites[i]->position.x > tempviewer.x + 6)sprites[i]->position.x -= 12;
+        }
+        if (sprites[i]->type == bloodsprite) {
+            bool spritehit = 0;
+            sprites[i]->rotation += multiplier * 100;
+            sprites[i]->velocity.y += gravity * multiplier;
+            if (check) {
+                XYZ where, startpoint, endpoint, movepoint, footpoint;
+                float rotationpoint;
+                int whichtri;
 
-                               for(j=0;j<numplayers;j++){
-                                       if(!spritehit&&player[j].dead&&sprites[i]->alivetime>.1){
-                                               where=sprites[i]->oldposition;
-                                               where-=player[j].coords;
-                                               if(!player[j].skeleton.free)where=DoRotation(where,0,-player[j].yaw,0);
-                                               startpoint=where;
-                                               where=sprites[i]->position;
-                                               where-=player[j].coords;
-                                               if(!player[j].skeleton.free)where=DoRotation(where,0,-player[j].yaw,0);
-                                               endpoint=where;
+                for (j = 0; j < numplayers; j++) {
+                    if (!spritehit && player[j].dead && sprites[i]->alivetime > .1) {
+                        where = sprites[i]->oldposition;
+                        where -= player[j].coords;
+                        if (!player[j].skeleton.free)where = DoRotation(where, 0, -player[j].yaw, 0);
+                        startpoint = where;
+                        where = sprites[i]->position;
+                        where -= player[j].coords;
+                        if (!player[j].skeleton.free)where = DoRotation(where, 0, -player[j].yaw, 0);
+                        endpoint = where;
 
-                                               movepoint=0;
-                                               rotationpoint=0;
-                                               whichtri=player[j].skeleton.drawmodel.LineCheck(&startpoint,&endpoint, &footpoint, &movepoint, &rotationpoint);
-                                               if(whichtri!=-1){
-                                                       spritehit=1;
-                                                       player[j].DoBloodBigWhere(0,160,sprites[i]->oldposition);
-                                                       DeleteSprite(i);
-                                               }
-                                       }
-                               }
+                        movepoint = 0;
+                        rotationpoint = 0;
+                        whichtri = player[j].skeleton.drawmodel.LineCheck(&startpoint, &endpoint, &footpoint, &movepoint, &rotationpoint);
+                        if (whichtri != -1) {
+                            spritehit = 1;
+                            player[j].DoBloodBigWhere(0, 160, sprites[i]->oldposition);
+                            DeleteSprite(i);
+                        }
+                    }
+                }
 
-                               whichpatchx=sprites[i]->position.x/(terrain.size/subdivision*terrain.scale);
-                               whichpatchz=sprites[i]->position.z/(terrain.size/subdivision*terrain.scale);
-                               if(whichpatchx>0&&whichpatchz>0&&whichpatchx<subdivision&&whichpatchz<subdivision)
-                                       if(terrain.patchobjectnum[whichpatchx][whichpatchz]){
-                                               if(!spritehit)
-                                                       for(j=0;j<terrain.patchobjectnum[whichpatchx][whichpatchz];j++){
-                                                               k=terrain.patchobjects[whichpatchx][whichpatchz][j];
-                                                               start=sprites[i]->oldposition;
-                                                               end=sprites[i]->position;
-                                                               if(!spritehit)
-                                                                       if(objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k])!=-1){
-                                                                               if(detail==2||(detail==1&&abs(Random()%4)==0)||(detail==0&&abs(Random()%8)==0))objects.model[k].MakeDecal(blooddecalfast,DoRotation(colpoint-objects.position[k],0,-objects.yaw[k],0),sprites[i]->size*1.6/*+abs((float)(Random()%100))/2400*/,.5,Random()%360);
-                                                                               DeleteSprite(i);
-                                                                               spritehit=1;
-                                                                       }       
-                                                       }
-                                       }
-                                       if(!spritehit)
-                                               if(sprites[i]->position.y<terrain.getHeight(sprites[i]->position.x,sprites[i]->position.z)){
-                                                       terrain.MakeDecal(blooddecalfast,sprites[i]->position,sprites[i]->size*1.6/*+abs((float)(Random()%100))/2400*/,.6,Random()%360);
-                                                       DeleteSprite(i);
-                                               }
-                       }
-               }
-               if(sprites[i]->type==splintersprite){
-                       sprites[i]->rotation+=sprites[i]->rotatespeed*multiplier;
-                       sprites[i]->opacity-=multiplier/2;
-                       if(sprites[i]->special==0||sprites[i]->special==2||sprites[i]->special==3)sprites[i]->velocity.y+=gravity*multiplier;
-                       if(sprites[i]->special==1)sprites[i]->velocity.y+=gravity*multiplier*.5;
-               }
-               if(sprites[i]->type==flamesprite||sprites[i]->type==weaponflamesprite||sprites[i]->type==weaponshinesprite||sprites[i]->type==bloodflamesprite){
-                       sprites[i]->rotation+=multiplier*sprites[i]->rotatespeed;
-                       sprites[i]->opacity-=multiplier*5/4;
-                       if(sprites[i]->type!=weaponshinesprite&&sprites[i]->type!=bloodflamesprite)
-                               if(sprites[i]->opacity<.5&&sprites[i]->opacity+multiplier*5/4>=.5&&(abs(Random()%4)==0||(sprites[i]->initialsize>2&&Random()%2==0)))
-                                       MakeSprite(smoketype, sprites[i]->position,sprites[i]->velocity, .9,.9,.6, sprites[i]->size*1.2, .4);
-                       if(sprites[i]->alivetime>.14&&(sprites[i]->type==flamesprite)){
-                               sprites[i]->velocity=0;
-                               sprites[i]->velocity.y=1.5;
-                       }
-               }
-               if(sprites[i]->type==smoketype){
-                       sprites[i]->opacity-=multiplier/3/sprites[i]->initialsize;
-                       sprites[i]->color[0]-=multiplier;
-                       sprites[i]->color[1]-=multiplier;
-                       sprites[i]->color[2]-=multiplier;
-                       if(sprites[i]->color[0]<.6)sprites[i]->color[0]=.6;
-                       if(sprites[i]->color[1]<.6)sprites[i]->color[1]=.6;
-                       if(sprites[i]->color[2]<.6)sprites[i]->color[2]=.6;
-                       sprites[i]->size+=multiplier;
-                       sprites[i]->velocity=0;
-                       sprites[i]->velocity.y=1.5;
-                       sprites[i]->rotation+=multiplier*sprites[i]->rotatespeed/5;
-               }
-               if(sprites[i]->opacity<=0||sprites[i]->size<=0)DeleteSprite(i);
-       }
-       if(check)
-               for(i=sprites.size()-1;i>=0;i--){
-                       sprites[i]->oldposition=sprites[i]->position;
-               }
-               glAlphaFunc(GL_GREATER, 0.0001);
-               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+                whichpatchx = sprites[i]->position.x / (terrain.size / subdivision * terrain.scale);
+                whichpatchz = sprites[i]->position.z / (terrain.size / subdivision * terrain.scale);
+                if (whichpatchx > 0 && whichpatchz > 0 && whichpatchx < subdivision && whichpatchz < subdivision)
+                    if (terrain.patchobjectnum[whichpatchx][whichpatchz]) {
+                        if (!spritehit)
+                            for (j = 0; j < terrain.patchobjectnum[whichpatchx][whichpatchz]; j++) {
+                                k = terrain.patchobjects[whichpatchx][whichpatchz][j];
+                                start = sprites[i]->oldposition;
+                                end = sprites[i]->position;
+                                if (!spritehit)
+                                    if (objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]) != -1) {
+                                        if (detail == 2 || (detail == 1 && abs(Random() % 4) == 0) || (detail == 0 && abs(Random() % 8) == 0))objects.model[k].MakeDecal(blooddecalfast, DoRotation(colpoint - objects.position[k], 0, -objects.yaw[k], 0), sprites[i]->size * 1.6/*+abs((float)(Random()%100))/2400*/, .5, Random() % 360);
+                                        DeleteSprite(i);
+                                        spritehit = 1;
+                                    }
+                            }
+                    }
+                if (!spritehit)
+                    if (sprites[i]->position.y < terrain.getHeight(sprites[i]->position.x, sprites[i]->position.z)) {
+                        terrain.MakeDecal(blooddecalfast, sprites[i]->position, sprites[i]->size * 1.6/*+abs((float)(Random()%100))/2400*/, .6, Random() % 360);
+                        DeleteSprite(i);
+                    }
+            }
+        }
+        if (sprites[i]->type == splintersprite) {
+            sprites[i]->rotation += sprites[i]->rotatespeed * multiplier;
+            sprites[i]->opacity -= multiplier / 2;
+            if (sprites[i]->special == 0 || sprites[i]->special == 2 || sprites[i]->special == 3)sprites[i]->velocity.y += gravity * multiplier;
+            if (sprites[i]->special == 1)sprites[i]->velocity.y += gravity * multiplier * .5;
+        }
+        if (sprites[i]->type == flamesprite || sprites[i]->type == weaponflamesprite || sprites[i]->type == weaponshinesprite || sprites[i]->type == bloodflamesprite) {
+            sprites[i]->rotation += multiplier * sprites[i]->rotatespeed;
+            sprites[i]->opacity -= multiplier * 5 / 4;
+            if (sprites[i]->type != weaponshinesprite && sprites[i]->type != bloodflamesprite)
+                if (sprites[i]->opacity < .5 && sprites[i]->opacity + multiplier * 5 / 4 >= .5 && (abs(Random() % 4) == 0 || (sprites[i]->initialsize > 2 && Random() % 2 == 0)))
+                    MakeSprite(smoketype, sprites[i]->position, sprites[i]->velocity, .9, .9, .6, sprites[i]->size * 1.2, .4);
+            if (sprites[i]->alivetime > .14 && (sprites[i]->type == flamesprite)) {
+                sprites[i]->velocity = 0;
+                sprites[i]->velocity.y = 1.5;
+            }
+        }
+        if (sprites[i]->type == smoketype) {
+            sprites[i]->opacity -= multiplier / 3 / sprites[i]->initialsize;
+            sprites[i]->color[0] -= multiplier;
+            sprites[i]->color[1] -= multiplier;
+            sprites[i]->color[2] -= multiplier;
+            if (sprites[i]->color[0] < .6)sprites[i]->color[0] = .6;
+            if (sprites[i]->color[1] < .6)sprites[i]->color[1] = .6;
+            if (sprites[i]->color[2] < .6)sprites[i]->color[2] = .6;
+            sprites[i]->size += multiplier;
+            sprites[i]->velocity = 0;
+            sprites[i]->velocity.y = 1.5;
+            sprites[i]->rotation += multiplier * sprites[i]->rotatespeed / 5;
+        }
+        if (sprites[i]->opacity <= 0 || sprites[i]->size <= 0)DeleteSprite(i);
+    }
+    if (check)
+        for (i = sprites.size() - 1; i >= 0; i--) {
+            sprites[i]->oldposition = sprites[i]->position;
+        }
+    glAlphaFunc(GL_GREATER, 0.0001);
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 }
 
 void Sprite::DeleteSprite(int i)
 {
-       sprites.erase(sprites.begin()+i);
+    sprites.erase(sprites.begin() + i);
 }
 
-void Sprite::MakeSprite(int atype, XYZ where, XYZ avelocity, float red, float green, float blue, float asize, float aopacity){
-       if(sprites.size()<max_sprites-1){
-               sprites.push_back(new Sprite());
-               if((atype!=bloodsprite&&atype!=bloodflamesprite)||bloodtoggle){
-                       sprites.back()->special=0;
-                       sprites.back()->type=atype;
-                       sprites.back()->position=where;
-                       sprites.back()->oldposition=where;
-                       sprites.back()->velocity=avelocity;
-                       sprites.back()->alivetime=0;
-                       sprites.back()->opacity=aopacity;
-                       sprites.back()->size=asize;
-                       sprites.back()->initialsize=asize;
-                       sprites.back()->color[0]=red;
-                       sprites.back()->color[1]=green;
-                       sprites.back()->color[2]=blue;
-                       sprites.back()->rotatespeed=abs(Random()%720)-360;
-                       sprites.back()->speed=float(abs(Random()%100))/200+1.5;
-               }               
-       }
+void Sprite::MakeSprite(int atype, XYZ where, XYZ avelocity, float red, float green, float blue, float asize, float aopacity)
+{
+    if (sprites.size() < max_sprites - 1) {
+        sprites.push_back(new Sprite());
+        if ((atype != bloodsprite && atype != bloodflamesprite) || bloodtoggle) {
+            sprites.back()->special = 0;
+            sprites.back()->type = atype;
+            sprites.back()->position = where;
+            sprites.back()->oldposition = where;
+            sprites.back()->velocity = avelocity;
+            sprites.back()->alivetime = 0;
+            sprites.back()->opacity = aopacity;
+            sprites.back()->size = asize;
+            sprites.back()->initialsize = asize;
+            sprites.back()->color[0] = red;
+            sprites.back()->color[1] = green;
+            sprites.back()->color[2] = blue;
+            sprites.back()->rotatespeed = abs(Random() % 720) - 360;
+            sprites.back()->speed = float(abs(Random() % 100)) / 200 + 1.5;
+        }
+    }
 }
 
 Sprite::Sprite()
 {
-       oldposition = 0;
-       position = 0;
-       velocity = 0;
-       size = 0;
-       initialsize = 0;
-       type = 0;
-       special = 0;
-       memset(color,0,sizeof(color));
-       opacity = 0;
-       rotation = 0;
-       alivetime = 0;
-       speed = 0;
-       rotatespeed = 0;        
+    oldposition = 0;
+    position = 0;
+    velocity = 0;
+    size = 0;
+    initialsize = 0;
+    type = 0;
+    special = 0;
+    memset(color, 0, sizeof(color));
+    opacity = 0;
+    rotation = 0;
+    alivetime = 0;
+    speed = 0;
+    rotatespeed = 0;
 }
 
 void Sprite::clearTextures()
 {
-       toothtexture.destroy();
-       cloudtexture.destroy();
-       cloudimpacttexture.destroy();
-       bloodtexture.destroy();
-       flametexture.destroy();
-       bloodflametexture.destroy();
-       smoketexture.destroy();
-       snowflaketexture.destroy();
-       shinetexture.destroy();
-       splintertexture.destroy();
-       leaftexture.destroy();
+    toothtexture.destroy();
+    cloudtexture.destroy();
+    cloudimpacttexture.destroy();
+    bloodtexture.destroy();
+    flametexture.destroy();
+    bloodflametexture.destroy();
+    smoketexture.destroy();
+    snowflaketexture.destroy();
+    shinetexture.destroy();
+    splintertexture.destroy();
+    leaftexture.destroy();
 }
 
index 819db208edc45fed7b19a96e8a73d77cf9bc9def..bdffb692266f36d56a2f5ccb7ad01cd9ba8ddff9 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -37,75 +37,76 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #define max_sprites 20000
 
 enum {
-       cloudsprite = 0,
-       bloodsprite,
-       flamesprite,
-       smoketype,
-       weaponflamesprite,
-       cloudimpactsprite,
-       snowsprite,
-       weaponshinesprite,
-       bloodflamesprite,
-       breathsprite,
-       splintersprite,
-       spritenumber
+    cloudsprite = 0,
+    bloodsprite,
+    flamesprite,
+    smoketype,
+    weaponflamesprite,
+    cloudimpactsprite,
+    snowsprite,
+    weaponshinesprite,
+    bloodflamesprite,
+    breathsprite,
+    splintersprite,
+    spritenumber
 };
 
-class Sprite{
-       private:
-               XYZ oldposition;
-               XYZ position;
-               XYZ velocity;
-               float size;
-               float initialsize;
-               int type;
-               int special;
-               float color[3];
-               float opacity;
-               float rotation;
-               float alivetime;
-               float speed;
-               float rotatespeed;
-               
-               static float checkdelay;
-       
-               static vector<Sprite*> sprites;
-       
-       public:
-               static void DeleteSprite(int which);
-               static void MakeSprite(int atype, XYZ where, XYZ avelocity, float red, float green, float blue, float asize, float aopacity);
-               static void Draw();
-               static void deleteSprites() {
-                       sprites.clear();
-               }
-               static void setLastSpriteSpecial(int s) {
-                       sprites.back()->special = s;
-               }
-               static void setLastSpriteSpeed(int s) {
-                       sprites.back()->speed = s;
-               }
-               static void setLastSpriteAlivetime(float al) {
-                       sprites.back()->alivetime = al;
-               }
-               static void clearTextures();
-               
-               static Texture cloudtexture;
-               static Texture bloodtexture;
-               static Texture flametexture;
-               static Texture smoketexture;
-               
-               static Texture cloudimpacttexture;
-               static Texture snowflaketexture;
-               static Texture shinetexture;
-               static Texture bloodflametexture;
-               
-               static Texture splintertexture;
-               
-               static Texture leaftexture;
-               static Texture toothtexture;
-
-               Sprite();
-               ~Sprite();
+class Sprite
+{
+private:
+    XYZ oldposition;
+    XYZ position;
+    XYZ velocity;
+    float size;
+    float initialsize;
+    int type;
+    int special;
+    float color[3];
+    float opacity;
+    float rotation;
+    float alivetime;
+    float speed;
+    float rotatespeed;
+
+    static float checkdelay;
+
+    static vector<Sprite*> sprites;
+
+public:
+    static void DeleteSprite(int which);
+    static void MakeSprite(int atype, XYZ where, XYZ avelocity, float red, float green, float blue, float asize, float aopacity);
+    static void Draw();
+    static void deleteSprites() {
+        sprites.clear();
+    }
+    static void setLastSpriteSpecial(int s) {
+        sprites.back()->special = s;
+    }
+    static void setLastSpriteSpeed(int s) {
+        sprites.back()->speed = s;
+    }
+    static void setLastSpriteAlivetime(float al) {
+        sprites.back()->alivetime = al;
+    }
+    static void clearTextures();
+
+    static Texture cloudtexture;
+    static Texture bloodtexture;
+    static Texture flametexture;
+    static Texture smoketexture;
+
+    static Texture cloudimpacttexture;
+    static Texture snowflaketexture;
+    static Texture shinetexture;
+    static Texture bloodflametexture;
+
+    static Texture splintertexture;
+
+    static Texture leaftexture;
+    static Texture toothtexture;
+
+    Sprite();
+    ~Sprite();
 };
 
 #endif
index 6680c43c8acac9d53b32f8d3939d0441f3ff5b1e..69013bf4f58509caf29dc27f5ac62ca1bf88416b 100644 (file)
 extern int kContextWidth;
 extern int kContextHeight;
 
-bool CanInitStereo(StereoMode mode) {
-       GLint stencilbits = 0;
-       
-       switch(mode) {
-               case stereoNone:
-                       return true;
-                       break;
-               case stereoAnaglyph:
-                       return true;
-                       break;
-               case stereoHorizontalInterlaced:
-               case stereoVerticalInterlaced:
-                       glGetIntegerv(GL_STENCIL_BITS, &stencilbits);
-                       if ( stencilbits < 1 ) {
-                               fprintf(stderr, "Failed to get a stencil buffer, interlaced stereo not available.\n");
-                               return false;
-                       } else {
-                               fprintf(stderr, "Stencil buffer has %i bits, good.\n", stencilbits);
-                       }
-                       return true;
-                       break;
-               default:
-                       return false;
-       }
+bool CanInitStereo(StereoMode mode)
+{
+    GLint stencilbits = 0;
+
+    switch (mode) {
+    case stereoNone:
+        return true;
+        break;
+    case stereoAnaglyph:
+        return true;
+        break;
+    case stereoHorizontalInterlaced:
+    case stereoVerticalInterlaced:
+        glGetIntegerv(GL_STENCIL_BITS, &stencilbits);
+        if ( stencilbits < 1 ) {
+            fprintf(stderr, "Failed to get a stencil buffer, interlaced stereo not available.\n");
+            return false;
+        } else {
+            fprintf(stderr, "Stencil buffer has %i bits, good.\n", stencilbits);
+        }
+        return true;
+        break;
+    default:
+        return false;
+    }
 
 }
 
-void InitStereo(StereoMode mode) {
-       switch(mode) {
-               case stereoNone:
-                       glDisable( GL_STENCIL_TEST);
-                       return;
-               case stereoAnaglyph:
-                       glDisable( GL_STENCIL_TEST);
-                       return;
-               case stereoHorizontalInterlaced:
-               case stereoVerticalInterlaced:
-                       
-                       fprintf(stderr, "Screen width is %i, height is %i\n", kContextWidth, kContextHeight);
-                       
-                       // Setup stencil buffer
-                       glDisable( GL_DEPTH_TEST);
-                       glDisable(GL_CULL_FACE);
-                       glDisable(GL_LIGHTING);
-                       glDisable(GL_TEXTURE_2D);
-
-                       glEnable( GL_STENCIL_TEST);
-                       glClearStencil(0);
-                       glClear(  GL_STENCIL_BUFFER_BIT );
-                       glStencilFunc(GL_ALWAYS, 0x1, 0x1);
-                       glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
-                       
-                       // Setup viewport
-                       glViewport(0,0, kContextWidth, kContextHeight);
-                       glMatrixMode(GL_PROJECTION);
-                       glPushMatrix();
-                               glLoadIdentity();
-                               glOrtho((GLdouble)0, (GLdouble)kContextWidth, (GLdouble)kContextHeight, 0, -1, 1);
-                               glMatrixMode(GL_MODELVIEW);
-                               glPushMatrix();
-                                       glLoadIdentity();
-                                       glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
-                                       glDisable(GL_LINE_SMOOTH);
-
-                                       // Add 0.5 to the coordinates, because OpenGL considers a pixel should be
-                                       // turned on when a line passes through the center of it.
-                                       if ( mode == stereoHorizontalInterlaced ) {
-                                               for(int y=0;y<kContextHeight;y+=2) {
-                                                       glBegin(GL_LINES);
-                                                               glVertex3f(0.5, y+0.5, 0);
-                                                               glVertex3f(kContextWidth+0.5, y+0.5, 0);
-                                                       glEnd();
-                                               }
-                                       } else {
-                                               for(int x=0;x<kContextWidth;x+=2) {
-                                                       glBegin(GL_LINES);
-                                                               glVertex3f(x+0.5, 0.5, 0);
-                                                               glVertex3f(x+0.5, kContextHeight+0.5, 0);
-                                                       glEnd();
-                                               }
-                                       }
-
-                                       glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
-                                       
-                               glPopMatrix();
-                               glMatrixMode(GL_PROJECTION);
-                       glPopMatrix();
-                       
-                       glStencilFunc(GL_NOTEQUAL, 0x01, 0x01);
-                       glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
-                       glEnable( GL_DEPTH_TEST);
-                       glEnable(GL_CULL_FACE);
-                       glEnable(GL_LIGHTING);
-                       glEnable(GL_TEXTURE_2D);
-
-       }
-       
+void InitStereo(StereoMode mode)
+{
+    switch (mode) {
+    case stereoNone:
+        glDisable( GL_STENCIL_TEST);
+        return;
+    case stereoAnaglyph:
+        glDisable( GL_STENCIL_TEST);
+        return;
+    case stereoHorizontalInterlaced:
+    case stereoVerticalInterlaced:
+
+        fprintf(stderr, "Screen width is %i, height is %i\n", kContextWidth, kContextHeight);
+
+        // Setup stencil buffer
+        glDisable( GL_DEPTH_TEST);
+        glDisable(GL_CULL_FACE);
+        glDisable(GL_LIGHTING);
+        glDisable(GL_TEXTURE_2D);
+
+        glEnable( GL_STENCIL_TEST);
+        glClearStencil(0);
+        glClear(  GL_STENCIL_BUFFER_BIT );
+        glStencilFunc(GL_ALWAYS, 0x1, 0x1);
+        glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
+
+        // Setup viewport
+        glViewport(0, 0, kContextWidth, kContextHeight);
+        glMatrixMode(GL_PROJECTION);
+        glPushMatrix();
+        glLoadIdentity();
+        glOrtho((GLdouble)0, (GLdouble)kContextWidth, (GLdouble)kContextHeight, 0, -1, 1);
+        glMatrixMode(GL_MODELVIEW);
+        glPushMatrix();
+        glLoadIdentity();
+        glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
+        glDisable(GL_LINE_SMOOTH);
+
+        // Add 0.5 to the coordinates, because OpenGL considers a pixel should be
+        // turned on when a line passes through the center of it.
+        if ( mode == stereoHorizontalInterlaced ) {
+            for (int y = 0; y < kContextHeight; y += 2) {
+                glBegin(GL_LINES);
+                glVertex3f(0.5, y + 0.5, 0);
+                glVertex3f(kContextWidth + 0.5, y + 0.5, 0);
+                glEnd();
+            }
+        } else {
+            for (int x = 0; x < kContextWidth; x += 2) {
+                glBegin(GL_LINES);
+                glVertex3f(x + 0.5, 0.5, 0);
+                glVertex3f(x + 0.5, kContextHeight + 0.5, 0);
+                glEnd();
+            }
+        }
+
+        glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
+
+        glPopMatrix();
+        glMatrixMode(GL_PROJECTION);
+        glPopMatrix();
+
+        glStencilFunc(GL_NOTEQUAL, 0x01, 0x01);
+        glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+        glEnable( GL_DEPTH_TEST);
+        glEnable(GL_CULL_FACE);
+        glEnable(GL_LIGHTING);
+        glEnable(GL_TEXTURE_2D);
+
+    }
+
 }
 
-const char* StereoModeName(StereoMode mode) {
-       switch(mode) {
-               case stereoNone:                 return "None"; break;
-               case stereoAnaglyph:             return "Anaglyph"; break;
-               case stereoHorizontalInterlaced: return "Horizontal interlacing"; break;
-               case stereoVerticalInterlaced:   return "Vertical interlacing"; break;
-               case stereoHorizontalSplit:      return "Horizontal split"; break;
-               case stereoVerticalSplit:        return "Vertical split"; break;
-               case stereoOpenGL:               return "OpenGL"; break;
-               default:                         return "(error)"; break; 
-       }
+const char* StereoModeName(StereoMode mode)
+{
+    switch (mode) {
+    case stereoNone:
+        return "None";
+        break;
+    case stereoAnaglyph:
+        return "Anaglyph";
+        break;
+    case stereoHorizontalInterlaced:
+        return "Horizontal interlacing";
+        break;
+    case stereoVerticalInterlaced:
+        return "Vertical interlacing";
+        break;
+    case stereoHorizontalSplit:
+        return "Horizontal split";
+        break;
+    case stereoVerticalSplit:
+        return "Vertical split";
+        break;
+    case stereoOpenGL:
+        return "OpenGL";
+        break;
+    default:
+        return "(error)";
+        break;
+    }
 }
\ No newline at end of file
index f5d86c1a34a7850a81bb93df5e233accffcf21bb..499f4f9db755c0f79cfe40faf81dd6a15fc56d76 100644 (file)
@@ -3,22 +3,22 @@
 #define STEREO_H_
 
 enum StereoMode {
-       stereoNone,
-       stereoAnaglyph,             /* red/cyan */
-       stereoHorizontalInterlaced, /* some 3D monitors */
-       stereoVerticalInterlaced,
-       stereoHorizontalSplit,      /* cross-eyed view */
-       stereoVerticalSplit,
-       stereoOpenGL,               /* Whatever OpenGL does, if supported */
-       stereoCount                 /* must be last element */
+    stereoNone,
+    stereoAnaglyph,             /* red/cyan */
+    stereoHorizontalInterlaced, /* some 3D monitors */
+    stereoVerticalInterlaced,
+    stereoHorizontalSplit,      /* cross-eyed view */
+    stereoVerticalSplit,
+    stereoOpenGL,               /* Whatever OpenGL does, if supported */
+    stereoCount                 /* must be last element */
 };
 
 
 enum StereoSide {
-       // Code multiplies by StereoSide to calculate camera offsets
-       stereoLeft   = -1,
-       stereoCenter = 0,
-       stereoRight  = 1
+    // Code multiplies by StereoSide to calculate camera offsets
+    stereoLeft   = -1,
+    stereoCenter = 0,
+    stereoRight  = 1
 };
 
 extern StereoMode stereomode;
index 172ed5f1218f7c5b03efa9c06a3405cf37f7967d..81697d19c76f2f6dce762006fbc0c68435e69bb0 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -33,146 +33,142 @@ extern bool LoadImage(const char * fname, TGAImageRec & tex);
 /********************> LoadTGA() <*****/
 bool upload_image(const unsigned char* filePath, bool hasalpha)
 {
-       if(visibleloading) 
-               Game::LoadingScreen();
+    if (visibleloading)
+        Game::LoadingScreen();
 
 #if !PLATFORM_MACOSX
 
-       // for Windows, just use TGA loader for now
-       char fileName[256];
-       CopyPascalStringToC( filePath, fileName);
-/*
-       // change extension to .TGA
-       int len = strlen( fileName);
-       if (len > 3)
-       {
-               fileName[ len - 3] = 't';
-               fileName[ len - 2] = 'g';
-               fileName[ len - 1] = 'a';
-       }
-*/
+    // for Windows, just use TGA loader for now
+    char fileName[256];
+    CopyPascalStringToC( filePath, fileName);
+    /*
+       // change extension to .TGA
+       int len = strlen( fileName);
+       if (len > 3)
+       {
+               fileName[ len - 3] = 't';
+               fileName[ len - 2] = 'g';
+               fileName[ len - 1] = 'a';
+       }
+    */
 //     return (LoadTGA( fileName) != NULL);
-       return (LoadImage(fileName, texture));
+    return (LoadImage(fileName, texture));
 
 #else
 
-       OSStatus err;
-       ComponentResult cr;
-
-       /*FSRef fsref;
-       Boolean isdir;
-       err = FSPathMakeRef((const UInt8*)filePath, &fsref, &isdir);
-       if(err)return;
-
-       FSSpec fsspec;
-       err = FSGetCatalogInfo(&fsref, kFSCatInfoNone, NULL, NULL, &fsspec, NULL);
-       if(err)return;
-       */
-
-       //Boolean isdir;
-       FSSpec fsspec;
-       //err = FSMakeFSSpec (0, 0, (const unsigned char*)filePath, &fsspec);
-       err = FSMakeFSSpec (0, 0, filePath, &fsspec);
-       //err=FSPathMakeFSSpec((const UInt8*)filePath,&fsspec,&isdir);*/
-       if(err)return;
-
-       GraphicsImportComponent gi;
-       err = GetGraphicsImporterForFile(&fsspec, &gi);
-       if(err)return;
-
-       Rect natbounds;
-       cr = GraphicsImportGetNaturalBounds(gi, &natbounds);
-
-       //~ size_t buffersize = 4 * natbounds.bottom * natbounds.right;
-       //void* buf = malloc(buffersize);
-       texture.sizeX=natbounds.right;
-       texture.sizeY=natbounds.bottom;
-       /*if(hasalpha)*/texture.bpp = 32;
-       //if(!hasalpha)texture.bpp = 24;
-
-       GWorldPtr gw;
-       err = QTNewGWorldFromPtr(&gw, k32ARGBPixelFormat, &natbounds, NULL, NULL,
-               0, texture.data, 4 * natbounds.right);
-       if(err)return;
-
-       cr = GraphicsImportSetGWorld(gi, gw, NULL);
-
-       natbounds.top = natbounds.bottom;
-       natbounds.bottom = 0;
-
-       cr = GraphicsImportSetBoundsRect(gi, &natbounds);
-
-       cr = GraphicsImportDraw(gi);
-
-       err = CloseComponent(gi);
-       if(err)return;
-
-       /*glTexImage2D(textureTarget, 0, GL_RGBA, natbounds.right, natbounds.top, 0,
-       GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, buf);
-       */
-
-       //free(buf);
-       DisposeGWorld(gw);
-
-       // Loop Through The Image Data
-       GLuint                  imageSize;                                                                      // Used To Store The Image Size When Setting Aside Ram
-       GLuint                  temp;                                                                           // Temporary Variable
-       GLuint                  bytesPerPixel;                                                                          // Temporary Variable
-       bytesPerPixel=texture.bpp/8;
-       imageSize = texture.sizeX * texture.sizeY * bytesPerPixel;
-       //~ int alltrans=10;
-
-       for( GLuint i = 0; i < int( imageSize ); i += 4 )
-       {
-               // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue)
-               temp = texture.data[i];                                 // Temporarily Store The Value At Image Data 'i'
-               texture.data[i] = texture.data[i + 1];  // Set The 1st Byte To The Value Of The 3rd Byte
-               texture.data[i + 1] = texture.data[i + 2];                              // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
-               texture.data[i + 2] = texture.data[i + 3];
-               texture.data[i + 3] = temp;
-       }
-
-       //~ int tempplace;
-       //~ tempplace=0;
-       if(!hasalpha){
-               for( GLuint i = 0; i < int( imageSize ); i += 4 )
-               {
-                       texture.data[i + 3] = 255;
-                       /*texture.data[tempplace] = texture.data[i];    // Set The 1st Byte To The Value Of The 3rd Byte
-                       texture.data[tempplace + 1] = texture.data[i + 1];                              // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
-                       texture.data[tempplace + 2] = texture.data[i + 2];
-                       tempplace+=3;*/
-               }
-       }
-
-       if(texdetail>1){
-               int which=0;
-               float temp;
-               float howmany;
-               for( GLuint k = 0; k < int( imageSize); k += bytesPerPixel*texture.sizeX*texdetail )
-               {
-                       for( GLuint i = 0; i < int( imageSize/texture.sizeY ); i += bytesPerPixel*texdetail )
-                       {
-                               for( GLuint b = 0; b < bytesPerPixel ; b ++ ){  
-                                       temp=0;
-                                       howmany=0;
-                                       for( GLuint l = 0; l < texdetail*texture.sizeX ; l +=texture.sizeX ){
-                                               for( GLuint j = 0; j < texdetail ; j ++ )
-                                               {
-                                                       temp += (int)texture.data[k+i+j*bytesPerPixel+l*bytesPerPixel+b];       // Set The 1st Byte To The Value Of The 3rd Byte
-                                                       howmany++;
-                                               }
-                                       }
-                                       texture.data[which+b]=GLubyte(temp/howmany);
-                               }
-                               which+=bytesPerPixel;
-                       }
-               }
-               texture.sizeX/=texdetail;
-               texture.sizeY/=texdetail;
-       }
-
-       return true;
+    OSStatus err;
+    ComponentResult cr;
+
+    /*FSRef fsref;
+    Boolean isdir;
+    err = FSPathMakeRef((const UInt8*)filePath, &fsref, &isdir);
+    if(err)return;
+
+    FSSpec fsspec;
+    err = FSGetCatalogInfo(&fsref, kFSCatInfoNone, NULL, NULL, &fsspec, NULL);
+    if(err)return;
+    */
+
+    //Boolean isdir;
+    FSSpec fsspec;
+    //err = FSMakeFSSpec (0, 0, (const unsigned char*)filePath, &fsspec);
+    err = FSMakeFSSpec (0, 0, filePath, &fsspec);
+    //err=FSPathMakeFSSpec((const UInt8*)filePath,&fsspec,&isdir);*/
+    if (err)return;
+
+    GraphicsImportComponent gi;
+    err = GetGraphicsImporterForFile(&fsspec, &gi);
+    if (err)return;
+
+    Rect natbounds;
+    cr = GraphicsImportGetNaturalBounds(gi, &natbounds);
+
+    //~ size_t buffersize = 4 * natbounds.bottom * natbounds.right;
+    //void* buf = malloc(buffersize);
+    texture.sizeX = natbounds.right;
+    texture.sizeY = natbounds.bottom;
+    /*if(hasalpha)*/
+    texture.bpp = 32;
+    //if(!hasalpha)texture.bpp = 24;
+
+    GWorldPtr gw;
+    err = QTNewGWorldFromPtr(&gw, k32ARGBPixelFormat, &natbounds, NULL, NULL,
+                             0, texture.data, 4 * natbounds.right);
+    if (err)return;
+
+    cr = GraphicsImportSetGWorld(gi, gw, NULL);
+
+    natbounds.top = natbounds.bottom;
+    natbounds.bottom = 0;
+
+    cr = GraphicsImportSetBoundsRect(gi, &natbounds);
+
+    cr = GraphicsImportDraw(gi);
+
+    err = CloseComponent(gi);
+    if (err)return;
+
+    /*glTexImage2D(textureTarget, 0, GL_RGBA, natbounds.right, natbounds.top, 0,
+    GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, buf);
+    */
+
+    //free(buf);
+    DisposeGWorld(gw);
+
+    // Loop Through The Image Data
+    GLuint                     imageSize;                                                                      // Used To Store The Image Size When Setting Aside Ram
+    GLuint                     temp;                                                                           // Temporary Variable
+    GLuint                     bytesPerPixel;                                                                          // Temporary Variable
+    bytesPerPixel = texture.bpp / 8;
+    imageSize = texture.sizeX * texture.sizeY * bytesPerPixel;
+    //~ int alltrans=10;
+
+    for ( GLuint i = 0; i < int( imageSize ); i += 4 ) {
+        // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue)
+        temp = texture.data[i];                                        // Temporarily Store The Value At Image Data 'i'
+        texture.data[i] = texture.data[i + 1]; // Set The 1st Byte To The Value Of The 3rd Byte
+        texture.data[i + 1] = texture.data[i + 2];                             // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
+        texture.data[i + 2] = texture.data[i + 3];
+        texture.data[i + 3] = temp;
+    }
+
+    //~ int tempplace;
+    //~ tempplace=0;
+    if (!hasalpha) {
+        for ( GLuint i = 0; i < int( imageSize ); i += 4 ) {
+            texture.data[i + 3] = 255;
+            /*texture.data[tempplace] = texture.data[i];       // Set The 1st Byte To The Value Of The 3rd Byte
+            texture.data[tempplace + 1] = texture.data[i + 1];                         // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
+            texture.data[tempplace + 2] = texture.data[i + 2];
+            tempplace+=3;*/
+        }
+    }
+
+    if (texdetail > 1) {
+        int which = 0;
+        float temp;
+        float howmany;
+        for ( GLuint k = 0; k < int( imageSize); k += bytesPerPixel * texture.sizeX * texdetail ) {
+            for ( GLuint i = 0; i < int( imageSize / texture.sizeY ); i += bytesPerPixel * texdetail ) {
+                for ( GLuint b = 0; b < bytesPerPixel ; b ++ ) {
+                    temp = 0;
+                    howmany = 0;
+                    for ( GLuint l = 0; l < texdetail * texture.sizeX ; l += texture.sizeX ) {
+                        for ( GLuint j = 0; j < texdetail ; j ++ ) {
+                            temp += (int)texture.data[k + i + j * bytesPerPixel + l * bytesPerPixel + b];      // Set The 1st Byte To The Value Of The 3rd Byte
+                            howmany++;
+                        }
+                    }
+                    texture.data[which + b] = GLubyte(temp / howmany);
+                }
+                which += bytesPerPixel;
+            }
+        }
+        texture.sizeX /= texdetail;
+        texture.sizeY /= texdetail;
+    }
+
+    return true;
 
 #endif
 }
index 7b54de8e18a0abaecc7e9345ac31882ba85857f1..f3b6af7a90a05856b03a99f9be6c6168f49862c7 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -46,12 +46,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 //#include <QuickTime.h>
 
 /**> DATA STRUCTURES <**/
-typedef struct TGAImageRec
-{
-       GLubyte *data;          // Image Data (Up To 32 Bits)
-       GLuint  bpp;            // Image Color Depth In Bits Per Pixel.
-       GLuint  sizeX;
-       GLuint  sizeY;
+typedef struct TGAImageRec {
+    GLubyte    *data;          // Image Data (Up To 32 Bits)
+    GLuint     bpp;            // Image Color Depth In Bits Per Pixel.
+    GLuint     sizeX;
+    GLuint     sizeY;
 }      TGAImageRec;
 
 bool upload_image(const unsigned char* filePath, bool hasalpha);
index 1af30585241816c182360a913e813c112270bcfc..58a31f919f8d543ce518684a93abe53a9e58db2f 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -43,1525 +43,1611 @@ extern int tutoriallevel;
 
 //Functions
 
-int Terrain::lineTerrain(XYZ p1,XYZ p2, XYZ *p)
+int Terrain::lineTerrain(XYZ p1, XYZ p2, XYZ *p)
 {
-       static int i,j,k;
-       static float distance;
-       static float olddistance;
-       static int intersecting;
-       static int firstintersecting;
-       static XYZ point;
-       static int startx,starty;
-       static float slope;
-       static int endx,endy;
-       static int numtris=(size-1)*(size-1)*2;
-       static float highest,lowest;
-
-       firstintersecting=-1;
-       olddistance=10000;
-       distance=1;
-
-       XYZ triangles[3];
-
-       p1/=scale;
-       p2/=scale;
-
-       startx=p1.x;
-       starty=p1.z;
-       endx=p2.x;
-       endy=p2.z;
-
-       if(startx>endx){i=endx;endx=startx;startx=i;}
-       if(starty>endy){i=endy;endy=starty;starty=i;}
-
-       if(startx<0)startx=0;
-       if(starty<0)starty=0;
-       if(endx>size-1)endx=size-1;
-       if(endy>size-1)endy=size-1;
-
-       for(i=startx;i<=endx;i++){
-               for(j=starty;j<=endy;j++){
-                       highest=-1000;
-                       lowest=1000;
-                       for(k=0;k<2;k++){
-                               if(heightmap[i+k][j]>highest)highest=heightmap[i+k][j];
-                               if(heightmap[i+k][j]<lowest)lowest=heightmap[i+k][j];
-                               if(heightmap[i+k][j+1]>highest)highest=heightmap[i+k][j+1];
-                               if(heightmap[i+k][j+1]<lowest)lowest=heightmap[i+k][j+1];
-                       }
-                       if((p1.y<=highest||p2.y<=highest)&&(p1.y>=lowest||p2.y>=lowest)){
-                               triangles[0].x=i;
-                               triangles[0].y=heightmap[i][j];
-                               triangles[0].z=j;
-
-                               triangles[1].x=i;
-                               triangles[1].y=heightmap[i][j+1];
-                               triangles[1].z=j+1;
-
-                               triangles[2].x=i+1;
-                               triangles[2].y=heightmap[i+1][j];
-                               triangles[2].z=j;
-
-                               intersecting=LineFacet(p1,p2,triangles[0],triangles[1],triangles[2],&point);
-                               distance=distsq(&p1,&point);
-                               if((distance<olddistance||firstintersecting==-1)&&intersecting==1){olddistance=distance; firstintersecting=1; *p=point;}
-
-                               triangles[0].x=i+1;
-                               triangles[0].y=heightmap[i+1][j];
-                               triangles[0].z=j;
-
-                               triangles[1].x=i;
-                               triangles[1].y=heightmap[i][j+1];
-                               triangles[1].z=j+1;
-
-                               triangles[2].x=i+1;
-                               triangles[2].y=heightmap[i+1][j+1];
-                               triangles[2].z=j+1;
-
-                               intersecting=LineFacet(p1,p2,triangles[0],triangles[1],triangles[2],&point);
-                               distance=distsq(&p1,&point);
-                               if((distance<olddistance||firstintersecting==-1)&&intersecting==1){olddistance=distance; firstintersecting=1; *p=point;}
-                       }
-               }
-       }
-       return firstintersecting;
+    static int i, j, k;
+    static float distance;
+    static float olddistance;
+    static int intersecting;
+    static int firstintersecting;
+    static XYZ point;
+    static int startx, starty;
+    static float slope;
+    static int endx, endy;
+    static int numtris = (size - 1) * (size - 1) * 2;
+    static float highest, lowest;
+
+    firstintersecting = -1;
+    olddistance = 10000;
+    distance = 1;
+
+    XYZ triangles[3];
+
+    p1 /= scale;
+    p2 /= scale;
+
+    startx = p1.x;
+    starty = p1.z;
+    endx = p2.x;
+    endy = p2.z;
+
+    if (startx > endx) {
+        i = endx;
+        endx = startx;
+        startx = i;
+    }
+    if (starty > endy) {
+        i = endy;
+        endy = starty;
+        starty = i;
+    }
+
+    if (startx < 0)startx = 0;
+    if (starty < 0)starty = 0;
+    if (endx > size - 1)endx = size - 1;
+    if (endy > size - 1)endy = size - 1;
+
+    for (i = startx; i <= endx; i++) {
+        for (j = starty; j <= endy; j++) {
+            highest = -1000;
+            lowest = 1000;
+            for (k = 0; k < 2; k++) {
+                if (heightmap[i + k][j] > highest)highest = heightmap[i + k][j];
+                if (heightmap[i + k][j] < lowest)lowest = heightmap[i + k][j];
+                if (heightmap[i + k][j + 1] > highest)highest = heightmap[i + k][j + 1];
+                if (heightmap[i + k][j + 1] < lowest)lowest = heightmap[i + k][j + 1];
+            }
+            if ((p1.y <= highest || p2.y <= highest) && (p1.y >= lowest || p2.y >= lowest)) {
+                triangles[0].x = i;
+                triangles[0].y = heightmap[i][j];
+                triangles[0].z = j;
+
+                triangles[1].x = i;
+                triangles[1].y = heightmap[i][j + 1];
+                triangles[1].z = j + 1;
+
+                triangles[2].x = i + 1;
+                triangles[2].y = heightmap[i + 1][j];
+                triangles[2].z = j;
+
+                intersecting = LineFacet(p1, p2, triangles[0], triangles[1], triangles[2], &point);
+                distance = distsq(&p1, &point);
+                if ((distance < olddistance || firstintersecting == -1) && intersecting == 1) {
+                    olddistance = distance;
+                    firstintersecting = 1;
+                    *p = point;
+                }
+
+                triangles[0].x = i + 1;
+                triangles[0].y = heightmap[i + 1][j];
+                triangles[0].z = j;
+
+                triangles[1].x = i;
+                triangles[1].y = heightmap[i][j + 1];
+                triangles[1].z = j + 1;
+
+                triangles[2].x = i + 1;
+                triangles[2].y = heightmap[i + 1][j + 1];
+                triangles[2].z = j + 1;
+
+                intersecting = LineFacet(p1, p2, triangles[0], triangles[1], triangles[2], &point);
+                distance = distsq(&p1, &point);
+                if ((distance < olddistance || firstintersecting == -1) && intersecting == 1) {
+                    olddistance = distance;
+                    firstintersecting = 1;
+                    *p = point;
+                }
+            }
+        }
+    }
+    return firstintersecting;
 }
 
-void Terrain::UpdateTransparency(int whichx, int whichy){
-       static XYZ vertex;
-       static int i,j,a,b,c,d,patch_size,stepsize;
-       static float distance;
+void Terrain::UpdateTransparency(int whichx, int whichy)
+{
+    static XYZ vertex;
+    static int i, j, a, b, c, d, patch_size, stepsize;
+    static float distance;
 
-       static float viewdistsquared;
+    static float viewdistsquared;
 
-       viewdistsquared=viewdistance*viewdistance;
-       patch_size=size/subdivision;
+    viewdistsquared = viewdistance * viewdistance;
+    patch_size = size / subdivision;
 
-       stepsize=1;
-       c=whichx*patch_elements+whichy*patch_elements*subdivision;
+    stepsize = 1;
+    c = whichx * patch_elements + whichy * patch_elements * subdivision;
 
-       for(i=patch_size*whichx;i<patch_size*(whichx+1)+1;i+=stepsize){
-               for(j=patch_size*whichy;j<patch_size*(whichy+1)+1;j+=stepsize){
-                       if(i<size&&j<size){
-                               vertex.x=i*scale;
-                               vertex.z=j*scale;
-                               vertex.y=heightmap[i][j]*scale;
-                               distance=distsq(&viewer,&vertex);
-                               if(distance>viewdistsquared)distance=viewdistsquared;
-                               colors[i][j][3]=(viewdistsquared-(distance-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
-                       }
-               }
-       }
+    for (i = patch_size * whichx; i < patch_size * (whichx + 1) + 1; i += stepsize) {
+        for (j = patch_size * whichy; j < patch_size * (whichy + 1) + 1; j += stepsize) {
+            if (i < size && j < size) {
+                vertex.x = i * scale;
+                vertex.z = j * scale;
+                vertex.y = heightmap[i][j] * scale;
+                distance = distsq(&viewer, &vertex);
+                if (distance > viewdistsquared)distance = viewdistsquared;
+                colors[i][j][3] = (viewdistsquared - (distance - (viewdistsquared * fadestart)) * (1 / (1 - fadestart))) / viewdistsquared;
+            }
+        }
+    }
 
-       for(i=patch_size*whichx;i<patch_size*(whichx+1);i+=stepsize){
-               for(j=patch_size*whichy;j<patch_size*(whichy+1);j+=stepsize){
-                       a=(i-(patch_size*whichx))/stepsize;
-                       b=(j-(patch_size*whichy))/stepsize;
-                       d=(a*54)+(b*54*patch_size/stepsize);
-                       vArray[d+c+6]=colors[i][j][3];
+    for (i = patch_size * whichx; i < patch_size * (whichx + 1); i += stepsize) {
+        for (j = patch_size * whichy; j < patch_size * (whichy + 1); j += stepsize) {
+            a = (i - (patch_size * whichx)) / stepsize;
+            b = (j - (patch_size * whichy)) / stepsize;
+            d = (a * 54) + (b * 54 * patch_size / stepsize);
+            vArray[d + c + 6] = colors[i][j][3];
 
-                       vArray[d+c+15]=colors[i][j+stepsize][3];
+            vArray[d + c + 15] = colors[i][j + stepsize][3];
 
-                       vArray[d+c+24]=colors[i+stepsize][j][3];
+            vArray[d + c + 24] = colors[i + stepsize][j][3];
 
-                       vArray[d+c+33]=colors[i+stepsize][j][3];
+            vArray[d + c + 33] = colors[i + stepsize][j][3];
 
-                       vArray[d+c+42]=colors[i][j+stepsize][3];
+            vArray[d + c + 42] = colors[i][j + stepsize][3];
 
-                       vArray[d+c+51]=colors[i+stepsize][j+stepsize][3];
-               }
-       }
+            vArray[d + c + 51] = colors[i + stepsize][j + stepsize][3];
+        }
+    }
 }
 
-void Terrain::UpdateTransparencyother(int whichx, int whichy){
-       static XYZ vertex;
-       static int i,j,a,b,c,d,patch_size,stepsize;
-       static float distance;
+void Terrain::UpdateTransparencyother(int whichx, int whichy)
+{
+    static XYZ vertex;
+    static int i, j, a, b, c, d, patch_size, stepsize;
+    static float distance;
 
-       patch_size=size/subdivision;
+    patch_size = size / subdivision;
 
-       stepsize=1;
-       c=whichx*patch_elements+whichy*patch_elements*subdivision;
+    stepsize = 1;
+    c = whichx * patch_elements + whichy * patch_elements * subdivision;
 
-       for(i=patch_size*whichx;i<patch_size*(whichx+1);i+=stepsize){
-               for(j=patch_size*whichy;j<patch_size*(whichy+1);j+=stepsize){
-                       a=(i-(patch_size*whichx))/stepsize;
-                       b=(j-(patch_size*whichy))/stepsize;
-                       d=(a*54)+(b*54*patch_size/stepsize);
-                       vArray[d+c+6]=colors[i][j][3]*opacityother[i][j];
+    for (i = patch_size * whichx; i < patch_size * (whichx + 1); i += stepsize) {
+        for (j = patch_size * whichy; j < patch_size * (whichy + 1); j += stepsize) {
+            a = (i - (patch_size * whichx)) / stepsize;
+            b = (j - (patch_size * whichy)) / stepsize;
+            d = (a * 54) + (b * 54 * patch_size / stepsize);
+            vArray[d + c + 6] = colors[i][j][3] * opacityother[i][j];
 
-                       vArray[d+c+15]=colors[i][j+stepsize][3]*opacityother[i][j+stepsize];
+            vArray[d + c + 15] = colors[i][j + stepsize][3] * opacityother[i][j + stepsize];
 
-                       vArray[d+c+24]=colors[i+stepsize][j][3]*opacityother[i+stepsize][j];
+            vArray[d + c + 24] = colors[i + stepsize][j][3] * opacityother[i + stepsize][j];
 
-                       vArray[d+c+33]=colors[i+stepsize][j][3]*opacityother[i+stepsize][j];
+            vArray[d + c + 33] = colors[i + stepsize][j][3] * opacityother[i + stepsize][j];
 
-                       vArray[d+c+42]=colors[i][j+stepsize][3]*opacityother[i][j+stepsize];
+            vArray[d + c + 42] = colors[i][j + stepsize][3] * opacityother[i][j + stepsize];
 
-                       vArray[d+c+51]=colors[i+stepsize][j+stepsize][3]*opacityother[i+stepsize][j+stepsize];
-               }
-       }
+            vArray[d + c + 51] = colors[i + stepsize][j + stepsize][3] * opacityother[i + stepsize][j + stepsize];
+        }
+    }
 }
 
-void Terrain::UpdateTransparencyotherother(int whichx, int whichy){
-       static XYZ vertex;
-       static int i,j,a,b,c,d,patch_size,stepsize;
-       static float distance;
+void Terrain::UpdateTransparencyotherother(int whichx, int whichy)
+{
+    static XYZ vertex;
+    static int i, j, a, b, c, d, patch_size, stepsize;
+    static float distance;
 
-       static float viewdistsquared;
+    static float viewdistsquared;
 
-       viewdistsquared=viewdistance*viewdistance;
-       patch_size=size/subdivision;
+    viewdistsquared = viewdistance * viewdistance;
+    patch_size = size / subdivision;
 
-       stepsize=1;
-       c=whichx*patch_elements+whichy*patch_elements*subdivision;
+    stepsize = 1;
+    c = whichx * patch_elements + whichy * patch_elements * subdivision;
 
-       for(i=patch_size*whichx;i<patch_size*(whichx+1)+1;i+=stepsize){
-               for(j=patch_size*whichy;j<patch_size*(whichy+1)+1;j+=stepsize){
-                       if(i<size&&j<size){
-                               vertex.x=i*scale;
-                               vertex.z=j*scale;
-                               vertex.y=heightmap[i][j]*scale;
-                               distance=distsq(&viewer,&vertex);
-                               if(distance>viewdistsquared)distance=viewdistsquared;
-                               colors[i][j][3]=(viewdistsquared-(distance-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
-                       }
-               }
-       }
+    for (i = patch_size * whichx; i < patch_size * (whichx + 1) + 1; i += stepsize) {
+        for (j = patch_size * whichy; j < patch_size * (whichy + 1) + 1; j += stepsize) {
+            if (i < size && j < size) {
+                vertex.x = i * scale;
+                vertex.z = j * scale;
+                vertex.y = heightmap[i][j] * scale;
+                distance = distsq(&viewer, &vertex);
+                if (distance > viewdistsquared)distance = viewdistsquared;
+                colors[i][j][3] = (viewdistsquared - (distance - (viewdistsquared * fadestart)) * (1 / (1 - fadestart))) / viewdistsquared;
+            }
+        }
+    }
 
-       for(i=patch_size*whichx;i<patch_size*(whichx+1);i+=stepsize){
-               for(j=patch_size*whichy;j<patch_size*(whichy+1);j+=stepsize){
-                       a=(i-(patch_size*whichx))/stepsize;
-                       b=(j-(patch_size*whichy))/stepsize;
-                       d=(a*54)+(b*54*patch_size/stepsize);
-                       vArray[d+c+6]=colors[i][j][3];
+    for (i = patch_size * whichx; i < patch_size * (whichx + 1); i += stepsize) {
+        for (j = patch_size * whichy; j < patch_size * (whichy + 1); j += stepsize) {
+            a = (i - (patch_size * whichx)) / stepsize;
+            b = (j - (patch_size * whichy)) / stepsize;
+            d = (a * 54) + (b * 54 * patch_size / stepsize);
+            vArray[d + c + 6] = colors[i][j][3];
 
-                       vArray[d+c+15]=colors[i][j+stepsize][3];
+            vArray[d + c + 15] = colors[i][j + stepsize][3];
 
-                       vArray[d+c+24]=colors[i+stepsize][j][3];
+            vArray[d + c + 24] = colors[i + stepsize][j][3];
 
-                       vArray[d+c+33]=colors[i+stepsize][j][3];
+            vArray[d + c + 33] = colors[i + stepsize][j][3];
 
-                       vArray[d+c+42]=colors[i][j+stepsize][3];
+            vArray[d + c + 42] = colors[i][j + stepsize][3];
 
-                       vArray[d+c+51]=colors[i+stepsize][j+stepsize][3];
-               }
-       }
+            vArray[d + c + 51] = colors[i + stepsize][j + stepsize][3];
+        }
+    }
 }
 
-void Terrain::UpdateVertexArray(int whichx, int whichy){
-       static int i,j,a,b,c,patch_size,stepsize;
-
-
-       numtris[whichx][whichy]=0;
-
-       patch_size=size/subdivision;
-
-       stepsize=1;
-       c=whichx*patch_elements+whichy*patch_elements*subdivision;
-       for(i=patch_size*whichx;i<patch_size*(whichx+1);i+=stepsize){
-               for(j=patch_size*whichy;j<patch_size*(whichy+1);j+=stepsize){
-                       a=(i-((float)size/subdivision*(float)whichx))/stepsize;
-                       b=(j-((float)size/subdivision*(float)whichy))/stepsize;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+0]=i*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+1]=heightmap[i][j]*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+2]=j*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+3]=colors[i][j][0];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+4]=colors[i][j][1];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+5]=colors[i][j][2];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+6]=colors[i][j][3];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+7]=i*scale*texscale+texoffsetx[i][j];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+8]=j*scale*texscale+texoffsety[i][j];
-
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+9]=i*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+10]=heightmap[i][j+stepsize]*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+11]=j*scale+stepsize*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+12]=colors[i][j+stepsize][0];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+13]=colors[i][j+stepsize][1];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+14]=colors[i][j+stepsize][2];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+15]=colors[i][j+stepsize][3];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+16]=i*scale*texscale+texoffsetx[i][j+stepsize];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+17]=j*scale*texscale+stepsize*scale*texscale+texoffsety[i][j+stepsize];
-
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+18]=i*scale+stepsize*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+19]=heightmap[i+stepsize][j]*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+20]=j*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+21]=colors[i+stepsize][j][0];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+22]=colors[i+stepsize][j][1];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+23]=colors[i+stepsize][j][2];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+24]=colors[i+stepsize][j][3];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+25]=i*scale*texscale+stepsize*scale*texscale+texoffsetx[i+stepsize][j];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+26]=j*scale*texscale+texoffsety[i+stepsize][j];
-
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+27]=i*scale+stepsize*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+28]=heightmap[i+stepsize][j]*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+29]=j*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+30]=colors[i+stepsize][j][0];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+31]=colors[i+stepsize][j][1];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+32]=colors[i+stepsize][j][2];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+33]=colors[i+stepsize][j][3];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+34]=i*scale*texscale+stepsize*scale*texscale+texoffsetx[i+stepsize][j];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+35]=j*scale*texscale+texoffsety[i+stepsize][j];
-
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+36]=i*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+37]=heightmap[i][j+stepsize]*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+38]=j*scale+stepsize*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+39]=colors[i][j+stepsize][0];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+40]=colors[i][j+stepsize][1];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+41]=colors[i][j+stepsize][2];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+42]=colors[i][j+stepsize][3];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+43]=i*scale*texscale+texoffsetx[i][j+stepsize];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+44]=j*scale*texscale+stepsize*scale*texscale+texoffsety[i][j+stepsize];
-
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+45]=i*scale+stepsize*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+46]=heightmap[i+stepsize][j+stepsize]*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+47]=j*scale+stepsize*scale;
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+48]=colors[i+stepsize][j+stepsize][0];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+49]=colors[i+stepsize][j+stepsize][1];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+50]=colors[i+stepsize][j+stepsize][2];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+51]=colors[i+stepsize][j+stepsize][3];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+52]=i*scale*texscale+stepsize*scale*texscale+texoffsetx[i+stepsize][j+stepsize];
-                       vArray[(a*54)+(b*54*patch_size/stepsize)+c+53]=j*scale*texscale+stepsize*scale*texscale+texoffsety[i+stepsize][j+stepsize];
-                       numtris[whichx][whichy]+=2;
-               }
-       }
-
-       maxypatch[whichx][whichy]=-10000;
-       minypatch[whichx][whichy]=10000;
-       for(a=0;a<size/subdivision;a++){
-               for(b=0;b<size/subdivision;b++){
-                       if(heightmap[(size/subdivision)*whichx+a][(size/subdivision)*whichy+b]*scale>maxypatch[whichx][whichy]) maxypatch[whichx][whichy]=heightmap[(size/subdivision)*whichx+a][(size/subdivision)*whichy+b]*scale;
-                       if(heightmap[(size/subdivision)*whichx+a][(size/subdivision)*whichy+b]*scale<minypatch[whichx][whichy]) minypatch[whichx][whichy]=heightmap[(size/subdivision)*whichx+a][(size/subdivision)*whichy+b]*scale;
-               }
-       }
-       heightypatch[whichx][whichy]=(maxypatch[whichx][whichy]-minypatch[whichx][whichy]);
-       if(heightypatch[whichx][whichy]<size/subdivision*scale)heightypatch[whichx][whichy]=size/subdivision*scale;
-       avgypatch[whichx][whichy]=(minypatch[whichx][whichy]+maxypatch[whichx][whichy])/2;
-
-       for(i=whichx*size/subdivision;i<(whichx+1)*size/subdivision-1;i++){
-               for(j=whichy*size/subdivision;j<(whichy+1)*size/subdivision-1;j++){
-                       triangles[(i*(size-1)*2)+(j*2)][0].x=i*scale;
-                       triangles[(i*(size-1)*2)+(j*2)][0].y=heightmap[i][j]*scale;
-                       triangles[(i*(size-1)*2)+(j*2)][0].z=j*scale;
-
-                       triangles[(i*(size-1)*2)+(j*2)][1].x=i*scale;
-                       triangles[(i*(size-1)*2)+(j*2)][1].y=heightmap[i][j+1]*scale;
-                       triangles[(i*(size-1)*2)+(j*2)][1].z=j*scale+scale;
-
-                       triangles[(i*(size-1)*2)+(j*2)][2].x=i*scale+1*scale;
-                       triangles[(i*(size-1)*2)+(j*2)][2].y=heightmap[i+1][j]*scale;
-                       triangles[(i*(size-1)*2)+(j*2)][2].z=j*scale;
-
-                       triangles[(i*(size-1)*2)+(j*2)+1][0].x=i*scale+1*scale;
-                       triangles[(i*(size-1)*2)+(j*2)+1][0].y=heightmap[i+1][j]*scale;
-                       triangles[(i*(size-1)*2)+(j*2)+1][0].z=j*scale;
-
-                       triangles[(i*(size-1)*2)+(j*2)+1][1].x=i*scale;
-                       triangles[(i*(size-1)*2)+(j*2)+1][1].y=heightmap[i][j+1]*scale;
-                       triangles[(i*(size-1)*2)+(j*2)+1][1].z=j*scale+1*scale;
-
-                       triangles[(i*(size-1)*2)+(j*2)+1][2].x=i*scale+1*scale;
-                       triangles[(i*(size-1)*2)+(j*2)+1][2].y=heightmap[i+1][j+1]*scale;
-                       triangles[(i*(size-1)*2)+(j*2)+1][2].z=j*scale+1*scale;
-               }
-       }
+void Terrain::UpdateVertexArray(int whichx, int whichy)
+{
+    static int i, j, a, b, c, patch_size, stepsize;
+
+
+    numtris[whichx][whichy] = 0;
+
+    patch_size = size / subdivision;
+
+    stepsize = 1;
+    c = whichx * patch_elements + whichy * patch_elements * subdivision;
+    for (i = patch_size * whichx; i < patch_size * (whichx + 1); i += stepsize) {
+        for (j = patch_size * whichy; j < patch_size * (whichy + 1); j += stepsize) {
+            a = (i - ((float)size / subdivision * (float)whichx)) / stepsize;
+            b = (j - ((float)size / subdivision * (float)whichy)) / stepsize;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 0] = i * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 1] = heightmap[i][j] * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 2] = j * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 3] = colors[i][j][0];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 4] = colors[i][j][1];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 5] = colors[i][j][2];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 6] = colors[i][j][3];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 7] = i * scale * texscale + texoffsetx[i][j];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 8] = j * scale * texscale + texoffsety[i][j];
+
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 9] = i * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 10] = heightmap[i][j + stepsize] * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 11] = j * scale + stepsize * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 12] = colors[i][j + stepsize][0];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 13] = colors[i][j + stepsize][1];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 14] = colors[i][j + stepsize][2];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 15] = colors[i][j + stepsize][3];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 16] = i * scale * texscale + texoffsetx[i][j + stepsize];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 17] = j * scale * texscale + stepsize * scale * texscale + texoffsety[i][j + stepsize];
+
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 18] = i * scale + stepsize * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 19] = heightmap[i + stepsize][j] * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 20] = j * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 21] = colors[i + stepsize][j][0];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 22] = colors[i + stepsize][j][1];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 23] = colors[i + stepsize][j][2];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 24] = colors[i + stepsize][j][3];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 25] = i * scale * texscale + stepsize * scale * texscale + texoffsetx[i + stepsize][j];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 26] = j * scale * texscale + texoffsety[i + stepsize][j];
+
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 27] = i * scale + stepsize * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 28] = heightmap[i + stepsize][j] * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 29] = j * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 30] = colors[i + stepsize][j][0];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 31] = colors[i + stepsize][j][1];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 32] = colors[i + stepsize][j][2];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 33] = colors[i + stepsize][j][3];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 34] = i * scale * texscale + stepsize * scale * texscale + texoffsetx[i + stepsize][j];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 35] = j * scale * texscale + texoffsety[i + stepsize][j];
+
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 36] = i * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 37] = heightmap[i][j + stepsize] * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 38] = j * scale + stepsize * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 39] = colors[i][j + stepsize][0];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 40] = colors[i][j + stepsize][1];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 41] = colors[i][j + stepsize][2];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 42] = colors[i][j + stepsize][3];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 43] = i * scale * texscale + texoffsetx[i][j + stepsize];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 44] = j * scale * texscale + stepsize * scale * texscale + texoffsety[i][j + stepsize];
+
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 45] = i * scale + stepsize * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 46] = heightmap[i + stepsize][j + stepsize] * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 47] = j * scale + stepsize * scale;
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 48] = colors[i + stepsize][j + stepsize][0];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 49] = colors[i + stepsize][j + stepsize][1];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 50] = colors[i + stepsize][j + stepsize][2];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 51] = colors[i + stepsize][j + stepsize][3];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 52] = i * scale * texscale + stepsize * scale * texscale + texoffsetx[i + stepsize][j + stepsize];
+            vArray[(a * 54) + (b * 54 * patch_size / stepsize) + c + 53] = j * scale * texscale + stepsize * scale * texscale + texoffsety[i + stepsize][j + stepsize];
+            numtris[whichx][whichy] += 2;
+        }
+    }
+
+    maxypatch[whichx][whichy] = -10000;
+    minypatch[whichx][whichy] = 10000;
+    for (a = 0; a < size / subdivision; a++) {
+        for (b = 0; b < size / subdivision; b++) {
+            if (heightmap[(size / subdivision)*whichx + a][(size / subdivision)*whichy + b]*scale > maxypatch[whichx][whichy]) maxypatch[whichx][whichy] = heightmap[(size / subdivision) * whichx + a][(size / subdivision) * whichy + b] * scale;
+            if (heightmap[(size / subdivision)*whichx + a][(size / subdivision)*whichy + b]*scale < minypatch[whichx][whichy]) minypatch[whichx][whichy] = heightmap[(size / subdivision) * whichx + a][(size / subdivision) * whichy + b] * scale;
+        }
+    }
+    heightypatch[whichx][whichy] = (maxypatch[whichx][whichy] - minypatch[whichx][whichy]);
+    if (heightypatch[whichx][whichy] < size / subdivision * scale)heightypatch[whichx][whichy] = size / subdivision * scale;
+    avgypatch[whichx][whichy] = (minypatch[whichx][whichy] + maxypatch[whichx][whichy]) / 2;
+
+    for (i = whichx * size / subdivision; i < (whichx + 1)*size / subdivision - 1; i++) {
+        for (j = whichy * size / subdivision; j < (whichy + 1)*size / subdivision - 1; j++) {
+            triangles[(i * (size - 1) * 2) + (j * 2)][0].x = i * scale;
+            triangles[(i * (size - 1) * 2) + (j * 2)][0].y = heightmap[i][j] * scale;
+            triangles[(i * (size - 1) * 2) + (j * 2)][0].z = j * scale;
+
+            triangles[(i * (size - 1) * 2) + (j * 2)][1].x = i * scale;
+            triangles[(i * (size - 1) * 2) + (j * 2)][1].y = heightmap[i][j + 1] * scale;
+            triangles[(i * (size - 1) * 2) + (j * 2)][1].z = j * scale + scale;
+
+            triangles[(i * (size - 1) * 2) + (j * 2)][2].x = i * scale + 1 * scale;
+            triangles[(i * (size - 1) * 2) + (j * 2)][2].y = heightmap[i + 1][j] * scale;
+            triangles[(i * (size - 1) * 2) + (j * 2)][2].z = j * scale;
+
+            triangles[(i * (size - 1) * 2) + (j * 2) + 1][0].x = i * scale + 1 * scale;
+            triangles[(i * (size - 1) * 2) + (j * 2) + 1][0].y = heightmap[i + 1][j] * scale;
+            triangles[(i * (size - 1) * 2) + (j * 2) + 1][0].z = j * scale;
+
+            triangles[(i * (size - 1) * 2) + (j * 2) + 1][1].x = i * scale;
+            triangles[(i * (size - 1) * 2) + (j * 2) + 1][1].y = heightmap[i][j + 1] * scale;
+            triangles[(i * (size - 1) * 2) + (j * 2) + 1][1].z = j * scale + 1 * scale;
+
+            triangles[(i * (size - 1) * 2) + (j * 2) + 1][2].x = i * scale + 1 * scale;
+            triangles[(i * (size - 1) * 2) + (j * 2) + 1][2].y = heightmap[i + 1][j + 1] * scale;
+            triangles[(i * (size - 1) * 2) + (j * 2) + 1][2].z = j * scale + 1 * scale;
+        }
+    }
 
 }
 
 
 bool Terrain::load(const char *fileName)
 {
-       static long                             i,j;
-       static long x,y;
-       static float patch_size;
-
-       float temptexdetail=texdetail;
-       //LoadTGA( fileName );
-
-       // Fixing filename so that it works with its own os
-       char * FixedFN = ConvertFileName(fileName);
-
-       unsigned char fileNamep[256];
-       CopyCStringToPascal(FixedFN, fileNamep);
-       //Load Image
-       upload_image( fileNamep ,0); 
-
-       //Is it valid?
-       if(texture.bpp>24){
-               int bytesPerPixel=texture.bpp/8;
-
-               int tempnum=0;
-               for(i=0;i<(long)(texture.sizeY*texture.sizeX*bytesPerPixel);i++){
-                       if((i+1)%4){
-                               texture.data[tempnum]=texture.data[i];
-                               tempnum++;
-                       }
-               }
-       }
-       texture.bpp=24;
-       if(visibleloading) Game::LoadingScreen();
-
-       texdetail=temptexdetail;
-
-       size=128;
-       if(1==1){
-               /*if ( texture.bpp == 24 )
-               type = GL_RGB;
-               else
-               type = GL_RGBA;
-
-               glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
-
-               if(!terraintexture)glGenTextures( 1, &terraintexture );
-               glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
-
-               glBindTexture( GL_TEXTURE_2D, terraintexture);
-               //glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
-               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
-
-               gluBuild2DMipmaps( GL_TEXTURE_2D, type, texture.sizeX, texture.sizeY, type, GL_UNSIGNED_BYTE, texture.data );
-               */
-
-               size=texture.sizeX;
-
-               for(i=0;i<size;i++){
-                       for(j=0;j<size;j++){
-                               heightmap[size-1-i][j]=(float)((texture.data[(i+(j*size))*texture.bpp/8]))/5;
-                       }
-               }
-
-       }
-       if(visibleloading) Game::LoadingScreen();
-
-       float slopeness;
-
-       for(i=0;i<subdivision;i++){
-               for(j=0;j<subdivision;j++){
-                       textureness[i][j]=-1;
-               }
-       }
-       if(visibleloading) Game::LoadingScreen();
-
-
-       for(i=0;i<size;i++){
-               for(j=0;j<size;j++){
-                       heightmap[i][j]*=.5;
-
-                       texoffsetx[i][j]=(float)abs(Random()%100)/1200/scale*3;
-                       texoffsety[i][j]=(float)abs(Random()%100)/1200/scale*3;
-
-                       slopeness=0;
-                       if(environment==snowyenvironment){
-                               if(j!=0&&heightmap[i][j]-heightmap[i][j-1]>slopeness){          slopeness=heightmap[i][j]-heightmap[i][j-1];}
-                               opacityother[i][j]=slopeness*slopeness*2;
-                               if(opacityother[i][j]>1)opacityother[i][j]=1;
-                               opacityother[i][j]-=(float)abs(Random()%100)/300;
-                       }
-                       if(environment==desertenvironment){
-                               if(j!=0&&heightmap[i][j]-heightmap[i][j-1]>slopeness){          slopeness=heightmap[i][j]-heightmap[i][j-1];}
-                               opacityother[i][j]=slopeness*slopeness*2;
-                               if(opacityother[i][j]>1)opacityother[i][j]=1;
-                               opacityother[i][j]-=(float)abs(Random()%100)/300;
-                       }
-                       if(environment==grassyenvironment){
-                               if(i!=0&&heightmap[i][j]-heightmap[i-1][j]>slopeness){          slopeness=heightmap[i][j]-heightmap[i-1][j];}
-                               if(j!=0&&heightmap[i][j]-heightmap[i][j-1]>slopeness){          slopeness=heightmap[i][j]-heightmap[i][j-1];}
-                               if(i<size-1&&heightmap[i][j]-heightmap[i+1][j]>slopeness){              slopeness=heightmap[i][j]-heightmap[i+1][j];}
-                               if(j<size-1&&heightmap[i][j]-heightmap[i][j+1]>slopeness){              slopeness=heightmap[i][j]-heightmap[i][j+1];}
-                               opacityother[i][j]=slopeness*slopeness*10;
-                               if(opacityother[i][j]>1)opacityother[i][j]=1;
-                               opacityother[i][j]-=(float)abs(Random()%100)/100;
-                       }
-               }
-       }
-       if(visibleloading) Game::LoadingScreen();
-
-       for(i=0;i<size;i++){
-               for(j=0;j<size;j++){
-                       if(environment==snowyenvironment){
-                               heightmap[i][j]-=opacityother[i][j];
-                       }
-                       if(environment==desertenvironment){
-                               heightmap[i][j]-=opacityother[i][j];
-                       }
-               }
-       }
-       if(visibleloading) Game::LoadingScreen();
-
-       /*float total;
-       int todivide;
-       //Smooth opacityother
-       for(i=0;i<size;i++){
-       for(j=0;j<size;j++){
-       total=0;
-       todivide=0;
-       if(i!=0){                               total+=opacityother[j][i-1]; todivide++;}
-       if(i!=size-1){                          total+=opacityother[j][i+1]; todivide++;}
-       if(j!=0){                               total+=opacityother[j-1][i]; todivide++;}
-       if(j!=size-1){                          total+=opacityother[j+1][i]; todivide++;}
-       if(i!=0&&j!=0){                 total+=opacityother[j-1][i-1]; todivide++;}
-       if(i!=size-1&&j!=0){            total+=opacityother[j-1][i+1]; todivide++;}
-       if(j!=size-1&&i!=size-1){               total+=opacityother[j+1][i+1]; todivide++;}
-       if(j!=size-1&&i!=0){            total+=opacityother[j+1][i-1]; todivide++;}
-       total+=opacityother[j][i]; todivide++;
-
-       opacityother[j][i]=total/(float)todivide;
-       }
-       }*/
-
-
-       for(i=0;i<size;i++){
-               for(j=0;j<size;j++){
-                       if(opacityother[i][j]<.1)opacityother[i][j]=0;
-                       if(textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==-1){
-                               if(!opacityother[i][j])textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=allfirst;
-                               if(opacityother[i][j]==1)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=allsecond;
-                       }
-                       if(opacityother[i][j]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                       if(opacityother[i][j]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-
-                       x=i;
-                       y=j;
-                       if(i>0){
-                               i--;
-                               if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                               if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                               if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-                               if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-
-                               if(j>0){
-                                       j--;
-                                       if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                                       if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                                       if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-                                       if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-                                       j++;
-                               }
-
-                               if(j<size-1){
-                                       j++;
-                                       if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                                       if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                                       if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-                                       if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-                                       j--;
-                               }
-                               i++;
-                       }
-
-                       if(i<size-1){
-                               i++;
-                               if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                               if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                               if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-                               if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-
-                               if(j>0){
-                                       j--;
-                                       if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                                       if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                                       if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-                                       if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-                                       j++;
-                               }
-
-                               if(j<size-1){
-                                       j++;
-                                       if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                                       if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                                       if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-                                       if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-                                       j--;
-                               }
-                               i--;
-                       }
-
-                       if(j>0){
-                               j--;
-                               if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                               if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                               if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-                               if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-                               j++;
-                       }
-
-                       if(j<size-1){
-                               j++;
-                               if(opacityother[x][y]&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allfirst)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                               if(opacityother[x][y]!=1&&textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]==allsecond)textureness[(int)(i*subdivision/size)][(int)(j*subdivision/size)]=mixed;
-                               if(opacityother[i][j]&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allfirst)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-                               if(opacityother[i][j]!=1&&textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]==allsecond)textureness[(int)(x*subdivision/size)][(int)(y*subdivision/size)]=mixed;
-                               j--;
-
-                       }
-               }
-       }
-       if(visibleloading) Game::LoadingScreen();
-
-       patch_size=size/subdivision;
-       patch_elements=(patch_size)*(patch_size)*54;
-       CalculateNormals();
-       /*DoShadows();
-
-       for(i=0;i<subdivision;i++){
-       for(j=0;j<subdivision;j++){
-       UpdateVertexArray(i,j);
-       }
-       }*/
-
-       return 1;
+    static long                                i, j;
+    static long x, y;
+    static float patch_size;
+
+    float temptexdetail = texdetail;
+    //LoadTGA( fileName );
+
+    // Fixing filename so that it works with its own os
+    char * FixedFN = ConvertFileName(fileName);
+
+    unsigned char fileNamep[256];
+    CopyCStringToPascal(FixedFN, fileNamep);
+    //Load Image
+    upload_image( fileNamep , 0);
+
+    //Is it valid?
+    if (texture.bpp > 24) {
+        int bytesPerPixel = texture.bpp / 8;
+
+        int tempnum = 0;
+        for (i = 0; i < (long)(texture.sizeY * texture.sizeX * bytesPerPixel); i++) {
+            if ((i + 1) % 4) {
+                texture.data[tempnum] = texture.data[i];
+                tempnum++;
+            }
+        }
+    }
+    texture.bpp = 24;
+    if (visibleloading) Game::LoadingScreen();
+
+    texdetail = temptexdetail;
+
+    size = 128;
+    if (1 == 1) {
+        /*if ( texture.bpp == 24 )
+        type = GL_RGB;
+        else
+        type = GL_RGBA;
+
+        glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
+
+        if(!terraintexture)glGenTextures( 1, &terraintexture );
+        glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+
+        glBindTexture( GL_TEXTURE_2D, terraintexture);
+        //glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
+        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+
+        gluBuild2DMipmaps( GL_TEXTURE_2D, type, texture.sizeX, texture.sizeY, type, GL_UNSIGNED_BYTE, texture.data );
+        */
+
+        size = texture.sizeX;
+
+        for (i = 0; i < size; i++) {
+            for (j = 0; j < size; j++) {
+                heightmap[size - 1 - i][j] = (float)((texture.data[(i + (j * size)) * texture.bpp / 8])) / 5;
+            }
+        }
+
+    }
+    if (visibleloading) Game::LoadingScreen();
+
+    float slopeness;
+
+    for (i = 0; i < subdivision; i++) {
+        for (j = 0; j < subdivision; j++) {
+            textureness[i][j] = -1;
+        }
+    }
+    if (visibleloading) Game::LoadingScreen();
+
+
+    for (i = 0; i < size; i++) {
+        for (j = 0; j < size; j++) {
+            heightmap[i][j] *= .5;
+
+            texoffsetx[i][j] = (float)abs(Random() % 100) / 1200 / scale * 3;
+            texoffsety[i][j] = (float)abs(Random() % 100) / 1200 / scale * 3;
+
+            slopeness = 0;
+            if (environment == snowyenvironment) {
+                if (j != 0 && heightmap[i][j] - heightmap[i][j - 1] > slopeness) {
+                    slopeness = heightmap[i][j] - heightmap[i][j - 1];
+                }
+                opacityother[i][j] = slopeness * slopeness * 2;
+                if (opacityother[i][j] > 1)opacityother[i][j] = 1;
+                opacityother[i][j] -= (float)abs(Random() % 100) / 300;
+            }
+            if (environment == desertenvironment) {
+                if (j != 0 && heightmap[i][j] - heightmap[i][j - 1] > slopeness) {
+                    slopeness = heightmap[i][j] - heightmap[i][j - 1];
+                }
+                opacityother[i][j] = slopeness * slopeness * 2;
+                if (opacityother[i][j] > 1)opacityother[i][j] = 1;
+                opacityother[i][j] -= (float)abs(Random() % 100) / 300;
+            }
+            if (environment == grassyenvironment) {
+                if (i != 0 && heightmap[i][j] - heightmap[i - 1][j] > slopeness) {
+                    slopeness = heightmap[i][j] - heightmap[i - 1][j];
+                }
+                if (j != 0 && heightmap[i][j] - heightmap[i][j - 1] > slopeness) {
+                    slopeness = heightmap[i][j] - heightmap[i][j - 1];
+                }
+                if (i < size - 1 && heightmap[i][j] - heightmap[i + 1][j] > slopeness) {
+                    slopeness = heightmap[i][j] - heightmap[i + 1][j];
+                }
+                if (j < size - 1 && heightmap[i][j] - heightmap[i][j + 1] > slopeness) {
+                    slopeness = heightmap[i][j] - heightmap[i][j + 1];
+                }
+                opacityother[i][j] = slopeness * slopeness * 10;
+                if (opacityother[i][j] > 1)opacityother[i][j] = 1;
+                opacityother[i][j] -= (float)abs(Random() % 100) / 100;
+            }
+        }
+    }
+    if (visibleloading) Game::LoadingScreen();
+
+    for (i = 0; i < size; i++) {
+        for (j = 0; j < size; j++) {
+            if (environment == snowyenvironment) {
+                heightmap[i][j] -= opacityother[i][j];
+            }
+            if (environment == desertenvironment) {
+                heightmap[i][j] -= opacityother[i][j];
+            }
+        }
+    }
+    if (visibleloading) Game::LoadingScreen();
+
+    /*float total;
+    int todivide;
+    //Smooth opacityother
+    for(i=0;i<size;i++){
+    for(j=0;j<size;j++){
+    total=0;
+    todivide=0;
+    if(i!=0){                          total+=opacityother[j][i-1]; todivide++;}
+    if(i!=size-1){                             total+=opacityother[j][i+1]; todivide++;}
+    if(j!=0){                          total+=opacityother[j-1][i]; todivide++;}
+    if(j!=size-1){                             total+=opacityother[j+1][i]; todivide++;}
+    if(i!=0&&j!=0){                    total+=opacityother[j-1][i-1]; todivide++;}
+    if(i!=size-1&&j!=0){               total+=opacityother[j-1][i+1]; todivide++;}
+    if(j!=size-1&&i!=size-1){          total+=opacityother[j+1][i+1]; todivide++;}
+    if(j!=size-1&&i!=0){               total+=opacityother[j+1][i-1]; todivide++;}
+    total+=opacityother[j][i]; todivide++;
+
+    opacityother[j][i]=total/(float)todivide;
+    }
+    }*/
+
+
+    for (i = 0; i < size; i++) {
+        for (j = 0; j < size; j++) {
+            if (opacityother[i][j] < .1)opacityother[i][j] = 0;
+            if (textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == -1) {
+                if (!opacityother[i][j])textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = allfirst;
+                if (opacityother[i][j] == 1)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = allsecond;
+            }
+            if (opacityother[i][j] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+            if (opacityother[i][j] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+
+            x = i;
+            y = j;
+            if (i > 0) {
+                i--;
+                if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+                if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+
+                if (j > 0) {
+                    j--;
+                    if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                    if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                    if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+                    if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+                    j++;
+                }
+
+                if (j < size - 1) {
+                    j++;
+                    if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                    if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                    if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+                    if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+                    j--;
+                }
+                i++;
+            }
+
+            if (i < size - 1) {
+                i++;
+                if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+                if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+
+                if (j > 0) {
+                    j--;
+                    if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                    if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                    if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+                    if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+                    j++;
+                }
+
+                if (j < size - 1) {
+                    j++;
+                    if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                    if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                    if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+                    if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+                    j--;
+                }
+                i--;
+            }
+
+            if (j > 0) {
+                j--;
+                if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+                if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+                j++;
+            }
+
+            if (j < size - 1) {
+                j++;
+                if (opacityother[x][y] && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allfirst)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                if (opacityother[x][y] != 1 && textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] == allsecond)textureness[(int)(i * subdivision / size)][(int)(j * subdivision / size)] = mixed;
+                if (opacityother[i][j] && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allfirst)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+                if (opacityother[i][j] != 1 && textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] == allsecond)textureness[(int)(x * subdivision / size)][(int)(y * subdivision / size)] = mixed;
+                j--;
+
+            }
+        }
+    }
+    if (visibleloading) Game::LoadingScreen();
+
+    patch_size = size / subdivision;
+    patch_elements = (patch_size) * (patch_size) * 54;
+    CalculateNormals();
+    /*DoShadows();
+
+    for(i=0;i<subdivision;i++){
+    for(j=0;j<subdivision;j++){
+    UpdateVertexArray(i,j);
+    }
+    }*/
+
+    return 1;
 }
 
 void Terrain::CalculateNormals()
 {
-       static int i,j;
-       static XYZ facenormal;
-       static XYZ p,q,a,b,c;
-
-       for(i=0; i<size; i++){
-               for(j=0; j<size; j++){
-                       normals[i][j].x=0;
-                       normals[i][j].y=0;
-                       normals[i][j].z=0;
-               }
-       }
-
-       for(i=0;i<size-1;i++){
-               for(j=0;j<size-1;j++){
-                       a.x=i;
-                       a.y=heightmap[i][j];
-                       a.z=j;
-                       b.x=i;
-                       b.y=heightmap[i][j+1];
-                       b.z=j+1;
-                       c.x=i+1;
-                       c.y=heightmap[i+1][j];
-                       c.z=j;
-
-                       p.x=b.x-a.x;
-                       p.y=b.y-a.y;
-                       p.z=b.z-a.z;
-                       q.x=c.x-a.x;
-                       q.y=c.y-a.y;
-                       q.z=c.z-a.z;
-
-                       CrossProduct(&p,&q,&facenormal);
-
-                       facenormals[i][j]=facenormal;
-
-                       normals[i][j]=normals[i][j]+facenormal;
-                       normals[i][j+1]=normals[i][j+1]+facenormal;
-                       normals[i+1][j]=normals[i+1][j]+facenormal;
-
-
-                       a.x=i+1;
-                       a.y=heightmap[i+1][j];
-                       a.z=j;
-                       b.x=i;
-                       b.y=heightmap[i][j+1];
-                       b.z=j+1;
-                       c.x=i+1;
-                       c.y=heightmap[i+1][j+1];
-                       c.z=j+1;
-
-                       p.x=b.x-a.x;
-                       p.y=b.y-a.y;
-                       p.z=b.z-a.z;
-                       q.x=c.x-a.x;
-                       q.y=c.y-a.y;
-                       q.z=c.z-a.z;
-
-                       CrossProduct(&p,&q,&facenormal);
-
-                       normals[i+1][j+1]=normals[i+1][j+1]+facenormal;
-                       normals[i][j+1]=normals[i][j+1]+facenormal;
-                       normals[i+1][j]=normals[i+1][j]+facenormal;
-
-                       Normalise(&facenormals[i][j]);
-               }
-       }
-
-       for(i=0; i<size; i++){
-               for(j=0; j<size; j++){
-                       Normalise(&normals[i][j]);
-                       normals[i][j]=normals[i][j];
-               }
-       }
+    static int i, j;
+    static XYZ facenormal;
+    static XYZ p, q, a, b, c;
+
+    for (i = 0; i < size; i++) {
+        for (j = 0; j < size; j++) {
+            normals[i][j].x = 0;
+            normals[i][j].y = 0;
+            normals[i][j].z = 0;
+        }
+    }
+
+    for (i = 0; i < size - 1; i++) {
+        for (j = 0; j < size - 1; j++) {
+            a.x = i;
+            a.y = heightmap[i][j];
+            a.z = j;
+            b.x = i;
+            b.y = heightmap[i][j + 1];
+            b.z = j + 1;
+            c.x = i + 1;
+            c.y = heightmap[i + 1][j];
+            c.z = j;
+
+            p.x = b.x - a.x;
+            p.y = b.y - a.y;
+            p.z = b.z - a.z;
+            q.x = c.x - a.x;
+            q.y = c.y - a.y;
+            q.z = c.z - a.z;
+
+            CrossProduct(&p, &q, &facenormal);
+
+            facenormals[i][j] = facenormal;
+
+            normals[i][j] = normals[i][j] + facenormal;
+            normals[i][j + 1] = normals[i][j + 1] + facenormal;
+            normals[i + 1][j] = normals[i + 1][j] + facenormal;
+
+
+            a.x = i + 1;
+            a.y = heightmap[i + 1][j];
+            a.z = j;
+            b.x = i;
+            b.y = heightmap[i][j + 1];
+            b.z = j + 1;
+            c.x = i + 1;
+            c.y = heightmap[i + 1][j + 1];
+            c.z = j + 1;
+
+            p.x = b.x - a.x;
+            p.y = b.y - a.y;
+            p.z = b.z - a.z;
+            q.x = c.x - a.x;
+            q.y = c.y - a.y;
+            q.z = c.z - a.z;
+
+            CrossProduct(&p, &q, &facenormal);
+
+            normals[i + 1][j + 1] = normals[i + 1][j + 1] + facenormal;
+            normals[i][j + 1] = normals[i][j + 1] + facenormal;
+            normals[i + 1][j] = normals[i + 1][j] + facenormal;
+
+            Normalise(&facenormals[i][j]);
+        }
+    }
+
+    for (i = 0; i < size; i++) {
+        for (j = 0; j < size; j++) {
+            Normalise(&normals[i][j]);
+            normals[i][j] = normals[i][j];
+        }
+    }
 }
 
-void Terrain::drawpatch(int whichx, int whichy, float opacity){
-       if(opacity>=1)glDisable(GL_BLEND);
-       if(opacity<1){
-               glEnable(GL_BLEND);
-               UpdateTransparency(whichx,whichy);
-       }
-       glColor4f(1,1,1,1);
-       //Set up vertex array
-       glEnableClientState(GL_VERTEX_ARRAY);
-       glEnableClientState(GL_COLOR_ARRAY);
-       glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-       glVertexPointer(3, GL_FLOAT, 9*sizeof(GLfloat),&vArray[0+whichx*patch_elements+whichy*patch_elements*subdivision]);
-       glColorPointer(4,GL_FLOAT, 9*sizeof(GLfloat),&vArray[3+whichx*patch_elements+whichy*patch_elements*subdivision]);
-       glTexCoordPointer(2, GL_FLOAT, 9*sizeof(GLfloat),&vArray[7+whichx*patch_elements+whichy*patch_elements*subdivision]);
-
-       //Draw
-       glDrawArrays(GL_TRIANGLES, 0, numtris[whichx][whichy]*3);
-
-       glDisableClientState(GL_VERTEX_ARRAY);
-       glDisableClientState(GL_COLOR_ARRAY);
-       glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+void Terrain::drawpatch(int whichx, int whichy, float opacity)
+{
+    if (opacity >= 1)glDisable(GL_BLEND);
+    if (opacity < 1) {
+        glEnable(GL_BLEND);
+        UpdateTransparency(whichx, whichy);
+    }
+    glColor4f(1, 1, 1, 1);
+    //Set up vertex array
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glEnableClientState(GL_COLOR_ARRAY);
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+    glVertexPointer(3, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[0 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+    glColorPointer(4, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[3 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+    glTexCoordPointer(2, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[7 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+
+    //Draw
+    glDrawArrays(GL_TRIANGLES, 0, numtris[whichx][whichy] * 3);
+
+    glDisableClientState(GL_VERTEX_ARRAY);
+    glDisableClientState(GL_COLOR_ARRAY);
+    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 }
 
-void Terrain::drawpatchother(int whichx, int whichy, float opacity){
-       glEnable(GL_BLEND);
-       if(opacity<1){
-               UpdateTransparency(whichx,whichy);
-       }
-       UpdateTransparencyother(whichx,whichy);
-       glColor4f(1,1,1,1);
-       //Set up vertex array
-       glEnableClientState(GL_VERTEX_ARRAY);
-       glEnableClientState(GL_COLOR_ARRAY);
-       glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-       glVertexPointer(3, GL_FLOAT, 9*sizeof(GLfloat),&vArray[0+whichx*patch_elements+whichy*patch_elements*subdivision]);
-       glColorPointer(4,GL_FLOAT, 9*sizeof(GLfloat),&vArray[3+whichx*patch_elements+whichy*patch_elements*subdivision]);
-       glTexCoordPointer(2, GL_FLOAT, 9*sizeof(GLfloat),&vArray[7+whichx*patch_elements+whichy*patch_elements*subdivision]);
-
-       //Draw
-       glDrawArrays(GL_TRIANGLES, 0, numtris[whichx][whichy]*3);
-
-       glDisableClientState(GL_VERTEX_ARRAY);
-       glDisableClientState(GL_COLOR_ARRAY);
-       glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+void Terrain::drawpatchother(int whichx, int whichy, float opacity)
+{
+    glEnable(GL_BLEND);
+    if (opacity < 1) {
+        UpdateTransparency(whichx, whichy);
+    }
+    UpdateTransparencyother(whichx, whichy);
+    glColor4f(1, 1, 1, 1);
+    //Set up vertex array
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glEnableClientState(GL_COLOR_ARRAY);
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+    glVertexPointer(3, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[0 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+    glColorPointer(4, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[3 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+    glTexCoordPointer(2, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[7 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+
+    //Draw
+    glDrawArrays(GL_TRIANGLES, 0, numtris[whichx][whichy] * 3);
+
+    glDisableClientState(GL_VERTEX_ARRAY);
+    glDisableClientState(GL_COLOR_ARRAY);
+    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 }
 
-void Terrain::drawpatchotherother(int whichx, int whichy, float opacity){
-       glEnable(GL_BLEND);
-       UpdateTransparencyotherother(whichx,whichy);
+void Terrain::drawpatchotherother(int whichx, int whichy, float opacity)
+{
+    glEnable(GL_BLEND);
+    UpdateTransparencyotherother(whichx, whichy);
 
-       glMatrixMode(GL_TEXTURE);
-       glPushMatrix();
-               glScalef(6, 6, 6);
+    glMatrixMode(GL_TEXTURE);
+    glPushMatrix();
+    glScalef(6, 6, 6);
 
-               glColor4f(1,1,1,1);
+    glColor4f(1, 1, 1, 1);
 
-               //Set up vertex array
-               glEnableClientState(GL_VERTEX_ARRAY);
-               glEnableClientState(GL_COLOR_ARRAY);
-               glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-               glVertexPointer(3, GL_FLOAT, 9*sizeof(GLfloat),&vArray[0+whichx*patch_elements+whichy*patch_elements*subdivision]);
-               glColorPointer(4,GL_FLOAT, 9*sizeof(GLfloat),&vArray[3+whichx*patch_elements+whichy*patch_elements*subdivision]);
-               glTexCoordPointer(2, GL_FLOAT, 9*sizeof(GLfloat),&vArray[7+whichx*patch_elements+whichy*patch_elements*subdivision]);
+    //Set up vertex array
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glEnableClientState(GL_COLOR_ARRAY);
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+    glVertexPointer(3, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[0 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+    glColorPointer(4, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[3 + whichx * patch_elements + whichy * patch_elements * subdivision]);
+    glTexCoordPointer(2, GL_FLOAT, 9 * sizeof(GLfloat), &vArray[7 + whichx * patch_elements + whichy * patch_elements * subdivision]);
 
-               //Draw
-               glDrawArrays(GL_TRIANGLES, 0, numtris[whichx][whichy]*3);
+    //Draw
+    glDrawArrays(GL_TRIANGLES, 0, numtris[whichx][whichy] * 3);
 
-               glDisableClientState(GL_VERTEX_ARRAY);
-               glDisableClientState(GL_COLOR_ARRAY);
-               glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+    glDisableClientState(GL_VERTEX_ARRAY);
+    glDisableClientState(GL_COLOR_ARRAY);
+    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 
-       glPopMatrix();
-       glMatrixMode(GL_MODELVIEW);
+    glPopMatrix();
+    glMatrixMode(GL_MODELVIEW);
 }
 
 
 float Terrain::getHeight(float pointx, float pointz)
 {
-       static float height1,height2;
-       static int tilex,tiley;
-       static XYZ startpoint,endpoint,intersect,triangle[3],average;
+    static float height1, height2;
+    static int tilex, tiley;
+    static XYZ startpoint, endpoint, intersect, triangle[3], average;
 
-       pointx/=scale;
-       pointz/=scale;
+    pointx /= scale;
+    pointz /= scale;
 
-       if(pointx>=size-1||pointz>=size-1||pointx<=0||pointz<=0)return 0;
+    if (pointx >= size - 1 || pointz >= size - 1 || pointx <= 0 || pointz <= 0)return 0;
 
-       startpoint.x=pointx;
-       startpoint.y=-1000;
-       startpoint.z=pointz;
+    startpoint.x = pointx;
+    startpoint.y = -1000;
+    startpoint.z = pointz;
 
-       endpoint=startpoint;
-       endpoint.y=1000;
+    endpoint = startpoint;
+    endpoint.y = 1000;
 
-       tilex=pointx;
-       tiley=pointz;
+    tilex = pointx;
+    tiley = pointz;
 
-       triangle[0].x=tilex;
-       triangle[0].z=tiley;
-       triangle[0].y=heightmap[tilex][tiley];
+    triangle[0].x = tilex;
+    triangle[0].z = tiley;
+    triangle[0].y = heightmap[tilex][tiley];
 
-       triangle[1].x=tilex+1;
-       triangle[1].z=tiley;
-       triangle[1].y=heightmap[tilex+1][tiley];
+    triangle[1].x = tilex + 1;
+    triangle[1].z = tiley;
+    triangle[1].y = heightmap[tilex + 1][tiley];
 
-       triangle[2].x=tilex;
-       triangle[2].z=tiley+1;
-       triangle[2].y=heightmap[tilex][tiley+1];
+    triangle[2].x = tilex;
+    triangle[2].z = tiley + 1;
+    triangle[2].y = heightmap[tilex][tiley + 1];
 
-       if(!LineFacetd(&startpoint,&endpoint,&triangle[0],&triangle[1],&triangle[2],&intersect)){
-               triangle[0].x=tilex+1;
-               triangle[0].z=tiley;
-               triangle[0].y=heightmap[tilex+1][tiley];
+    if (!LineFacetd(&startpoint, &endpoint, &triangle[0], &triangle[1], &triangle[2], &intersect)) {
+        triangle[0].x = tilex + 1;
+        triangle[0].z = tiley;
+        triangle[0].y = heightmap[tilex + 1][tiley];
 
-               triangle[1].x=tilex+1;
-               triangle[1].z=tiley+1;
-               triangle[1].y=heightmap[tilex+1][tiley+1];
+        triangle[1].x = tilex + 1;
+        triangle[1].z = tiley + 1;
+        triangle[1].y = heightmap[tilex + 1][tiley + 1];
 
-               triangle[2].x=tilex;
-               triangle[2].z=tiley+1;
-               triangle[2].y=heightmap[tilex][tiley+1];
-               LineFacetd(&startpoint,&endpoint,&triangle[0],&triangle[1],&triangle[2],&intersect);
-       }
-       return intersect.y*scale+getOpacity(pointx*scale,pointz*scale)/8;
+        triangle[2].x = tilex;
+        triangle[2].z = tiley + 1;
+        triangle[2].y = heightmap[tilex][tiley + 1];
+        LineFacetd(&startpoint, &endpoint, &triangle[0], &triangle[1], &triangle[2], &intersect);
+    }
+    return intersect.y * scale + getOpacity(pointx * scale, pointz * scale) / 8;
 
-       //height1=heightmap[tilex][tiley]*(1-(pointx-tilex))+heightmap[tilex+1][tiley]*(pointx-tilex);
-       //height2=heightmap[tilex][tiley+1]*(1-(pointx-tilex))+heightmap[tilex+1][tiley+1]*(pointx-tilex);
+    //height1=heightmap[tilex][tiley]*(1-(pointx-tilex))+heightmap[tilex+1][tiley]*(pointx-tilex);
+    //height2=heightmap[tilex][tiley+1]*(1-(pointx-tilex))+heightmap[tilex+1][tiley+1]*(pointx-tilex);
 
-       //return height1*(1-(pointz-tiley))*scale+height2*(pointz-tiley)*scale;
+    //return height1*(1-(pointz-tiley))*scale+height2*(pointz-tiley)*scale;
 }
 
-float Terrain::getHeightExtrude(float pointx, float pointz,float point2x, float point2z)
+float Terrain::getHeightExtrude(float pointx, float pointz, float point2x, float point2z)
 {
-       static float height1,height2;
-       static int tilex,tiley;
-       static XYZ startpoint,endpoint,intersect,triangle[3],average;
+    static float height1, height2;
+    static int tilex, tiley;
+    static XYZ startpoint, endpoint, intersect, triangle[3], average;
 
-       pointx/=scale;
-       pointz/=scale;
-       point2x/=scale;
-       point2z/=scale;
+    pointx /= scale;
+    pointz /= scale;
+    point2x /= scale;
+    point2z /= scale;
 
-       if(pointx>=size-1||pointz>=size-1||pointx<=0||pointz<=0)return 0;
-       if(point2x>=size-1||point2z>=size-1||point2x<=0||point2z<=0)return 0;
+    if (pointx >= size - 1 || pointz >= size - 1 || pointx <= 0 || pointz <= 0)return 0;
+    if (point2x >= size - 1 || point2z >= size - 1 || point2x <= 0 || point2z <= 0)return 0;
 
-       startpoint.x=point2x;
-       startpoint.y=-1000;
-       startpoint.z=point2z;
+    startpoint.x = point2x;
+    startpoint.y = -1000;
+    startpoint.z = point2z;
 
-       endpoint=startpoint;
-       endpoint.y=1000;
+    endpoint = startpoint;
+    endpoint.y = 1000;
 
-       tilex=pointx;
-       tiley=pointz;
+    tilex = pointx;
+    tiley = pointz;
 
-       triangle[0].x=tilex;
-       triangle[0].z=tiley;
-       triangle[0].y=heightmap[tilex][tiley];
+    triangle[0].x = tilex;
+    triangle[0].z = tiley;
+    triangle[0].y = heightmap[tilex][tiley];
 
-       triangle[1].x=tilex+1;
-       triangle[1].z=tiley;
-       triangle[1].y=heightmap[tilex+1][tiley];
+    triangle[1].x = tilex + 1;
+    triangle[1].z = tiley;
+    triangle[1].y = heightmap[tilex + 1][tiley];
 
-       triangle[2].x=tilex;
-       triangle[2].z=tiley+1;
-       triangle[2].y=heightmap[tilex][tiley+1];
+    triangle[2].x = tilex;
+    triangle[2].z = tiley + 1;
+    triangle[2].y = heightmap[tilex][tiley + 1];
 
-       XYZ mid;
+    XYZ mid;
 
-       mid=(triangle[0]+triangle[1]+triangle[2])/2;
+    mid = (triangle[0] + triangle[1] + triangle[2]) / 2;
 
-       triangle[0]=mid+(triangle[0]-mid)*10;
-       triangle[1]=mid+(triangle[0]-mid)*10;
-       triangle[2]=mid+(triangle[0]-mid)*10;
+    triangle[0] = mid + (triangle[0] - mid) * 10;
+    triangle[1] = mid + (triangle[0] - mid) * 10;
+    triangle[2] = mid + (triangle[0] - mid) * 10;
 
-       /*
-       if(!LineFacetd(&startpoint,&endpoint,&triangle[0],&triangle[1],&triangle[2],&intersect)){
-       triangle[0].x=tilex+1;
-       triangle[0].z=tiley;
-       triangle[0].y=heightmap[tilex+1][tiley];
+    /*
+    if(!LineFacetd(&startpoint,&endpoint,&triangle[0],&triangle[1],&triangle[2],&intersect)){
+    triangle[0].x=tilex+1;
+    triangle[0].z=tiley;
+    triangle[0].y=heightmap[tilex+1][tiley];
 
-       triangle[1].x=tilex+1;
-       triangle[1].z=tiley+1;
-       triangle[1].y=heightmap[tilex+1][tiley+1];
+    triangle[1].x=tilex+1;
+    triangle[1].z=tiley+1;
+    triangle[1].y=heightmap[tilex+1][tiley+1];
 
-       triangle[2].x=tilex;
-       triangle[2].z=tiley+1;
-       triangle[2].y=heightmap[tilex][tiley+1];
-       LineFacetd(&startpoint,&endpoint,&triangle[0],&triangle[1],&triangle[2],&intersect);
-       }*/
-       return intersect.y*scale+getOpacity(pointx*scale,pointz*scale)/8;
+    triangle[2].x=tilex;
+    triangle[2].z=tiley+1;
+    triangle[2].y=heightmap[tilex][tiley+1];
+    LineFacetd(&startpoint,&endpoint,&triangle[0],&triangle[1],&triangle[2],&intersect);
+    }*/
+    return intersect.y * scale + getOpacity(pointx * scale, pointz * scale) / 8;
 
-       //height1=heightmap[tilex][tiley]*(1-(pointx-tilex))+heightmap[tilex+1][tiley]*(pointx-tilex);
-       //height2=heightmap[tilex][tiley+1]*(1-(pointx-tilex))+heightmap[tilex+1][tiley+1]*(pointx-tilex);
+    //height1=heightmap[tilex][tiley]*(1-(pointx-tilex))+heightmap[tilex+1][tiley]*(pointx-tilex);
+    //height2=heightmap[tilex][tiley+1]*(1-(pointx-tilex))+heightmap[tilex+1][tiley+1]*(pointx-tilex);
 
-       //return height1*(1-(pointz-tiley))*scale+height2*(pointz-tiley)*scale;
+    //return height1*(1-(pointz-tiley))*scale+height2*(pointz-tiley)*scale;
 }
 
 
 float Terrain::getOpacity(float pointx, float pointz)
 {
-       static float height1,height2;
-       static int tilex,tiley;
+    static float height1, height2;
+    static int tilex, tiley;
 
-       pointx/=scale;
-       pointz/=scale;
+    pointx /= scale;
+    pointz /= scale;
 
-       if(pointx>=size-1||pointz>=size-1||pointx<=0||pointz<=0)return 0;
+    if (pointx >= size - 1 || pointz >= size - 1 || pointx <= 0 || pointz <= 0)return 0;
 
-       tilex=pointx;
-       tiley=pointz;
+    tilex = pointx;
+    tiley = pointz;
 
-       height1=opacityother[tilex][tiley]*(1-(pointx-tilex))+opacityother[tilex+1][tiley]*(pointx-tilex);
-       height2=opacityother[tilex][tiley+1]*(1-(pointx-tilex))+opacityother[tilex+1][tiley+1]*(pointx-tilex);
+    height1 = opacityother[tilex][tiley] * (1 - (pointx - tilex)) + opacityother[tilex + 1][tiley] * (pointx - tilex);
+    height2 = opacityother[tilex][tiley + 1] * (1 - (pointx - tilex)) + opacityother[tilex + 1][tiley + 1] * (pointx - tilex);
 
-       return height1*(1-(pointz-tiley))+height2*(pointz-tiley);
+    return height1 * (1 - (pointz - tiley)) + height2 * (pointz - tiley);
 }
 
 XYZ Terrain::getNormal(float pointx, float pointz)
 {
-       static XYZ height1,height2,total;
-       static int tilex,tiley;
-
-       pointx/=scale;
-       pointz/=scale;
-
-       height1=0;
-       if(pointx>=size-1||pointz>=size-1||pointx<=0||pointz<=0)return height1;
-       tilex=pointx;
-       tiley=pointz;
-
-       height1=normals[tilex][tiley]*(1-(pointx-tilex))+normals[tilex+1][tiley]*(pointx-tilex);
-       height2=normals[tilex][tiley+1]*(1-(pointx-tilex))+normals[tilex+1][tiley+1]*(pointx-tilex);
-       total=height1*(1-(pointz-tiley))+height2*(pointz-tiley);
-       Normalise(&total);
-       return total;
+    static XYZ height1, height2, total;
+    static int tilex, tiley;
+
+    pointx /= scale;
+    pointz /= scale;
+
+    height1 = 0;
+    if (pointx >= size - 1 || pointz >= size - 1 || pointx <= 0 || pointz <= 0)return height1;
+    tilex = pointx;
+    tiley = pointz;
+
+    height1 = normals[tilex][tiley] * (1 - (pointx - tilex)) + normals[tilex + 1][tiley] * (pointx - tilex);
+    height2 = normals[tilex][tiley + 1] * (1 - (pointx - tilex)) + normals[tilex + 1][tiley + 1] * (pointx - tilex);
+    total = height1 * (1 - (pointz - tiley)) + height2 * (pointz - tiley);
+    Normalise(&total);
+    return total;
 }
 
 XYZ Terrain::getLighting(float pointx, float pointz)
 {
-       static XYZ height1,height2;
-       static int tilex,tiley;
+    static XYZ height1, height2;
+    static int tilex, tiley;
 
-       pointx/=scale;
-       pointz/=scale;
+    pointx /= scale;
+    pointz /= scale;
 
-       height1=0;
-       if(pointx>=size-1||pointz>=size-1||pointx<=0||pointz<=0)return height1;
-       tilex=pointx;
-       tiley=pointz;
+    height1 = 0;
+    if (pointx >= size - 1 || pointz >= size - 1 || pointx <= 0 || pointz <= 0)return height1;
+    tilex = pointx;
+    tiley = pointz;
 
-       height1.x=colors[tilex][tiley][0]*(1-(pointx-tilex))+colors[tilex+1][tiley][0]*(pointx-tilex);
-       height1.y=colors[tilex][tiley][1]*(1-(pointx-tilex))+colors[tilex+1][tiley][1]*(pointx-tilex);
-       height1.z=colors[tilex][tiley][2]*(1-(pointx-tilex))+colors[tilex+1][tiley][2]*(pointx-tilex);
-       height2.x=colors[tilex][tiley+1][0]*(1-(pointx-tilex))+colors[tilex+1][tiley+1][0]*(pointx-tilex);
-       height2.y=colors[tilex][tiley+1][1]*(1-(pointx-tilex))+colors[tilex+1][tiley+1][1]*(pointx-tilex);
-       height2.z=colors[tilex][tiley+1][2]*(1-(pointx-tilex))+colors[tilex+1][tiley+1][2]*(pointx-tilex);
+    height1.x = colors[tilex][tiley][0] * (1 - (pointx - tilex)) + colors[tilex + 1][tiley][0] * (pointx - tilex);
+    height1.y = colors[tilex][tiley][1] * (1 - (pointx - tilex)) + colors[tilex + 1][tiley][1] * (pointx - tilex);
+    height1.z = colors[tilex][tiley][2] * (1 - (pointx - tilex)) + colors[tilex + 1][tiley][2] * (pointx - tilex);
+    height2.x = colors[tilex][tiley + 1][0] * (1 - (pointx - tilex)) + colors[tilex + 1][tiley + 1][0] * (pointx - tilex);
+    height2.y = colors[tilex][tiley + 1][1] * (1 - (pointx - tilex)) + colors[tilex + 1][tiley + 1][1] * (pointx - tilex);
+    height2.z = colors[tilex][tiley + 1][2] * (1 - (pointx - tilex)) + colors[tilex + 1][tiley + 1][2] * (pointx - tilex);
 
-       return height1*(1-(pointz-tiley))+height2*(pointz-tiley);
+    return height1 * (1 - (pointz - tiley)) + height2 * (pointz - tiley);
 }
 
 void Terrain::draw(int layer)
 {
-       static int i,j;
-       static float opacity;
-       static XYZ terrainpoint;
-       static float distance[subdivision][subdivision];
-
-       static int beginx,endx;
-       static int beginz,endz;
-
-       static float patch_size=size/subdivision*scale;
-       static float viewdistsquared;
-
-       viewdistsquared=viewdistance*viewdistance;
-
-       //Only nearby blocks
-       beginx=(viewer.x-viewdistance)/(patch_size)-1;
-       if(beginx<0)beginx=0;
-       beginz=(viewer.z-viewdistance)/(patch_size)-1;
-       if(beginz<0)beginz=0;
-
-       endx=(viewer.x+viewdistance)/(patch_size)+1;
-       if(endx>subdivision)endx=subdivision;
-       endz=(viewer.z+viewdistance)/(patch_size)+1;
-       if(endz>subdivision)endz=subdivision;
-
-       if(!layer) {
-               for(i=beginx;i<endx;i++){       
-                       for(j=beginz;j<endz;j++){       
-                               terrainpoint.x=i*patch_size+(patch_size)/2;
-                               terrainpoint.y=viewer.y;//heightmap[i][j]*scale;
-                               terrainpoint.z=j*patch_size+(patch_size)/2;
-                               distance[i][j]=distsq(&viewer,&terrainpoint);
-                       }
-               }
-       }
-       for(i=beginx;i<endx;i++){
-               for(j=beginz;j<endz;j++){       
-                       if(distance[i][j]<(viewdistance+patch_size)*(viewdistance+patch_size)){
-                               opacity=1;
-                               if(distance[i][j]>viewdistsquared*fadestart-viewdistsquared)
-                                       opacity=0;
-                               if(opacity==1&&i!=subdivision)
-                                       if(distance[i+1][j]>viewdistsquared*fadestart-viewdistsquared)
-                                               opacity=0;
-                               if(opacity==1&&j!=subdivision)
-                                       if(distance[i][j+1]>viewdistsquared*fadestart-viewdistsquared)
-                                               opacity=0;
-                               if(opacity==1&&j!=subdivision&&i!=subdivision)
-                                       if(distance[i+1][j+1]>viewdistsquared*fadestart-viewdistsquared)
-                                               opacity=0;
-                               glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                               glPushMatrix();
-                                       if(frustum.CubeInFrustum(i*patch_size+patch_size*.5,avgypatch[i][j],j*patch_size+patch_size*.5,heightypatch[i][j]/2))
-                                       {   
-                                               if(environment==desertenvironment&&distance[i][j]>viewdistsquared/4)
-                                                       glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, blurness);
-                                               else if(environment==desertenvironment)
-                                                       glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
-                                               if(!layer&&textureness[i][j]!=allsecond)
-                                                       drawpatch(i,j,opacity);
-                                               if(layer==1&&textureness[i][j]!=allfirst)
-                                                       drawpatchother(i,j,opacity);
-                                               if(layer==2&&textureness[i][j]!=allfirst)
-                                                       drawpatchotherother(i,j,opacity);
-                                       }
-                               glPopMatrix();
-                       }
-               }
-       }
-       if(environment==desertenvironment)
-               glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
+    static int i, j;
+    static float opacity;
+    static XYZ terrainpoint;
+    static float distance[subdivision][subdivision];
+
+    static int beginx, endx;
+    static int beginz, endz;
+
+    static float patch_size = size / subdivision * scale;
+    static float viewdistsquared;
+
+    viewdistsquared = viewdistance * viewdistance;
+
+    //Only nearby blocks
+    beginx = (viewer.x - viewdistance) / (patch_size) - 1;
+    if (beginx < 0)beginx = 0;
+    beginz = (viewer.z - viewdistance) / (patch_size) - 1;
+    if (beginz < 0)beginz = 0;
+
+    endx = (viewer.x + viewdistance) / (patch_size) + 1;
+    if (endx > subdivision)endx = subdivision;
+    endz = (viewer.z + viewdistance) / (patch_size) + 1;
+    if (endz > subdivision)endz = subdivision;
+
+    if (!layer) {
+        for (i = beginx; i < endx; i++) {
+            for (j = beginz; j < endz; j++) {
+                terrainpoint.x = i * patch_size + (patch_size) / 2;
+                terrainpoint.y = viewer.y; //heightmap[i][j]*scale;
+                terrainpoint.z = j * patch_size + (patch_size) / 2;
+                distance[i][j] = distsq(&viewer, &terrainpoint);
+            }
+        }
+    }
+    for (i = beginx; i < endx; i++) {
+        for (j = beginz; j < endz; j++) {
+            if (distance[i][j] < (viewdistance + patch_size) * (viewdistance + patch_size)) {
+                opacity = 1;
+                if (distance[i][j] > viewdistsquared * fadestart - viewdistsquared)
+                    opacity = 0;
+                if (opacity == 1 && i != subdivision)
+                    if (distance[i + 1][j] > viewdistsquared * fadestart - viewdistsquared)
+                        opacity = 0;
+                if (opacity == 1 && j != subdivision)
+                    if (distance[i][j + 1] > viewdistsquared * fadestart - viewdistsquared)
+                        opacity = 0;
+                if (opacity == 1 && j != subdivision && i != subdivision)
+                    if (distance[i + 1][j + 1] > viewdistsquared * fadestart - viewdistsquared)
+                        opacity = 0;
+                glMatrixMode(GL_MODELVIEW);                                                    // Select The Modelview Matrix
+                glPushMatrix();
+                if (frustum.CubeInFrustum(i * patch_size + patch_size * .5, avgypatch[i][j], j * patch_size + patch_size * .5, heightypatch[i][j] / 2)) {
+                    if (environment == desertenvironment && distance[i][j] > viewdistsquared / 4)
+                        glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, blurness);
+                    else if (environment == desertenvironment)
+                        glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
+                    if (!layer && textureness[i][j] != allsecond)
+                        drawpatch(i, j, opacity);
+                    if (layer == 1 && textureness[i][j] != allfirst)
+                        drawpatchother(i, j, opacity);
+                    if (layer == 2 && textureness[i][j] != allfirst)
+                        drawpatchotherother(i, j, opacity);
+                }
+                glPopMatrix();
+            }
+        }
+    }
+    if (environment == desertenvironment)
+        glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0 );
 }
 
 void Terrain::drawdecals()
 {
-       if(decals) {
-               static int i,j;
-               static float distancemult;
-               static int lasttype;
-
-               static float patch_size=size/subdivision*scale;
-               static float viewdistsquared;
-               static bool blend;
-
-               viewdistsquared=viewdistance*viewdistance;
-               blend=1;
-
-               lasttype=-1;
-               glEnable(GL_BLEND);
-               glDisable(GL_LIGHTING);
-               glDisable(GL_CULL_FACE);
-               glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-               glDepthMask(0);
-               for(i=0;i<numdecals;i++){
-                       if(decaltype[i]==blooddecalfast&&decalalivetime[i]<2)decalalivetime[i]=2;
-                       if((decaltype[i]==shadowdecal||decaltype[i]==shadowdecalpermanent)&&decaltype[i]!=lasttype){
-                               shadowtexture.bind();
-                               if(!blend){
-                                       blend=1;
-                                       glAlphaFunc(GL_GREATER, 0.0001);
-                                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                               }
-                       }
-                       if(decaltype[i]==footprintdecal&&decaltype[i]!=lasttype){
-                               footprinttexture.bind();
-                               if(!blend){
-                                       blend=1;
-                                       glAlphaFunc(GL_GREATER, 0.0001);
-                                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                               }
-                       }
-                       if(decaltype[i]==bodyprintdecal&&decaltype[i]!=lasttype){
-                               bodyprinttexture.bind();
-                               if(!blend){
-                                       blend=1;
-                                       glAlphaFunc(GL_GREATER, 0.0001);
-                                       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-                               }
-                       }
-                       if((decaltype[i]==blooddecal||decaltype[i]==blooddecalslow)&&decaltype[i]!=lasttype){
-                               bloodtexture.bind();
-                               if(blend){
-                                       blend=0;
-                                       glAlphaFunc(GL_GREATER, 0.15);
-                                       glBlendFunc(GL_ONE,GL_ZERO);
-                               }
-                       }
-                       if((decaltype[i]==blooddecalfast)&&decaltype[i]!=lasttype){
-                               bloodtexture2.bind();
-                               if(blend){
-                                       blend=0;
-                                       glAlphaFunc(GL_GREATER, 0.15);
-                                       glBlendFunc(GL_ONE,GL_ZERO);
-                               }
-                       }
-                       if(decaltype[i]==shadowdecal||decaltype[i]==shadowdecalpermanent){
-                               distancemult=(viewdistsquared-(distsq(&viewer,&decalposition[i])-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
-                               if(distancemult>=1)glColor4f(1,1,1,decalopacity[i]);
-                               if(distancemult<1)glColor4f(1,1,1,decalopacity[i]*distancemult);
-                       }
-                       if(decaltype[i]==footprintdecal||decaltype[i]==bodyprintdecal){
-                               distancemult=(viewdistsquared-(distsq(&viewer,&decalposition[i])-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
-                               if(distancemult>=1){
-                                       glColor4f(1,1,1,decalopacity[i]);
-                                       if(decalalivetime[i]>3)glColor4f(1,1,1,decalopacity[i]*(5-decalalivetime[i])/2);
-                               }
-                               if(distancemult<1){
-                                       glColor4f(1,1,1,decalopacity[i]*distancemult);
-                                       if(decalalivetime[i]>3)glColor4f(1,1,1,decalopacity[i]*(5-decalalivetime[i])/2*distancemult);
-                               }
-                       }
-                       if((decaltype[i]==blooddecal||decaltype[i]==blooddecalfast||decaltype[i]==blooddecalslow)){
-                               distancemult=(viewdistsquared-(distsq(&viewer,&decalposition[i])-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared;
-                               if(distancemult>=1){
-                                       glColor4f(decalbrightness[i],decalbrightness[i],decalbrightness[i],decalopacity[i]);
-                                       if(decalalivetime[i]<4)glColor4f(decalbrightness[i],decalbrightness[i],decalbrightness[i],decalopacity[i]*decalalivetime[i]*.25);
-                                       if(decalalivetime[i]>58)glColor4f(decalbrightness[i],decalbrightness[i],decalbrightness[i],decalopacity[i]*(60-decalalivetime[i])/2);
-                               }
-                               if(distancemult<1){
-                                       glColor4f(decalbrightness[i],decalbrightness[i],decalbrightness[i],decalopacity[i]*distancemult);
-                                       if(decalalivetime[i]<4)glColor4f(decalbrightness[i],decalbrightness[i],decalbrightness[i],decalopacity[i]*decalalivetime[i]*distancemult*.25);
-                                       if(decalalivetime[i]>58)glColor4f(decalbrightness[i],decalbrightness[i],decalbrightness[i],decalopacity[i]*(60-decalalivetime[i])/2*distancemult);
-                               }
-                       }
-                       lasttype=decaltype[i];
-                       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-                       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
-
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPushMatrix();
-                               glBegin(GL_TRIANGLES);
-                               for(int j=0;j<3;j++)
-                               {
-                                       glTexCoord2f(decaltexcoords[i][j][0], decaltexcoords[i][j][1]); glVertex3f(decalvertex[i][j].x,decalvertex[i][j].y,decalvertex[i][j].z);
-                               }
-                               glEnd();
-                       glPopMatrix();
-               }
-               for(i=numdecals-1;i>=0;i--){
-                       decalalivetime[i]+=multiplier;
-                       if(decaltype[i]==blooddecalslow)decalalivetime[i]-=multiplier*2/3;
-                       if(decaltype[i]==blooddecalfast)decalalivetime[i]+=multiplier*4;
-                       if(decaltype[i]==shadowdecal)DeleteDecal(i);
-                       if(decaltype[i]==footprintdecal&&decalalivetime[i]>=5)DeleteDecal(i);
-                       if(decaltype[i]==bodyprintdecal&&decalalivetime[i]>=5)DeleteDecal(i);
-                       if((decaltype[i]==blooddecal||decaltype[i]==blooddecalfast||decaltype[i]==blooddecalslow)&&decalalivetime[i]>=60)DeleteDecal(i);
-               }
-               glAlphaFunc(GL_GREATER, 0.0001);
-       }
+    if (decals) {
+        static int i, j;
+        static float distancemult;
+        static int lasttype;
+
+        static float patch_size = size / subdivision * scale;
+        static float viewdistsquared;
+        static bool blend;
+
+        viewdistsquared = viewdistance * viewdistance;
+        blend = 1;
+
+        lasttype = -1;
+        glEnable(GL_BLEND);
+        glDisable(GL_LIGHTING);
+        glDisable(GL_CULL_FACE);
+        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+        glDepthMask(0);
+        for (i = 0; i < numdecals; i++) {
+            if (decaltype[i] == blooddecalfast && decalalivetime[i] < 2)decalalivetime[i] = 2;
+            if ((decaltype[i] == shadowdecal || decaltype[i] == shadowdecalpermanent) && decaltype[i] != lasttype) {
+                shadowtexture.bind();
+                if (!blend) {
+                    blend = 1;
+                    glAlphaFunc(GL_GREATER, 0.0001);
+                    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                }
+            }
+            if (decaltype[i] == footprintdecal && decaltype[i] != lasttype) {
+                footprinttexture.bind();
+                if (!blend) {
+                    blend = 1;
+                    glAlphaFunc(GL_GREATER, 0.0001);
+                    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                }
+            }
+            if (decaltype[i] == bodyprintdecal && decaltype[i] != lasttype) {
+                bodyprinttexture.bind();
+                if (!blend) {
+                    blend = 1;
+                    glAlphaFunc(GL_GREATER, 0.0001);
+                    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                }
+            }
+            if ((decaltype[i] == blooddecal || decaltype[i] == blooddecalslow) && decaltype[i] != lasttype) {
+                bloodtexture.bind();
+                if (blend) {
+                    blend = 0;
+                    glAlphaFunc(GL_GREATER, 0.15);
+                    glBlendFunc(GL_ONE, GL_ZERO);
+                }
+            }
+            if ((decaltype[i] == blooddecalfast) && decaltype[i] != lasttype) {
+                bloodtexture2.bind();
+                if (blend) {
+                    blend = 0;
+                    glAlphaFunc(GL_GREATER, 0.15);
+                    glBlendFunc(GL_ONE, GL_ZERO);
+                }
+            }
+            if (decaltype[i] == shadowdecal || decaltype[i] == shadowdecalpermanent) {
+                distancemult = (viewdistsquared - (distsq(&viewer, &decalposition[i]) - (viewdistsquared * fadestart)) * (1 / (1 - fadestart))) / viewdistsquared;
+                if (distancemult >= 1)glColor4f(1, 1, 1, decalopacity[i]);
+                if (distancemult < 1)glColor4f(1, 1, 1, decalopacity[i]*distancemult);
+            }
+            if (decaltype[i] == footprintdecal || decaltype[i] == bodyprintdecal) {
+                distancemult = (viewdistsquared - (distsq(&viewer, &decalposition[i]) - (viewdistsquared * fadestart)) * (1 / (1 - fadestart))) / viewdistsquared;
+                if (distancemult >= 1) {
+                    glColor4f(1, 1, 1, decalopacity[i]);
+                    if (decalalivetime[i] > 3)glColor4f(1, 1, 1, decalopacity[i] * (5 - decalalivetime[i]) / 2);
+                }
+                if (distancemult < 1) {
+                    glColor4f(1, 1, 1, decalopacity[i]*distancemult);
+                    if (decalalivetime[i] > 3)glColor4f(1, 1, 1, decalopacity[i] * (5 - decalalivetime[i]) / 2 * distancemult);
+                }
+            }
+            if ((decaltype[i] == blooddecal || decaltype[i] == blooddecalfast || decaltype[i] == blooddecalslow)) {
+                distancemult = (viewdistsquared - (distsq(&viewer, &decalposition[i]) - (viewdistsquared * fadestart)) * (1 / (1 - fadestart))) / viewdistsquared;
+                if (distancemult >= 1) {
+                    glColor4f(decalbrightness[i], decalbrightness[i], decalbrightness[i], decalopacity[i]);
+                    if (decalalivetime[i] < 4)glColor4f(decalbrightness[i], decalbrightness[i], decalbrightness[i], decalopacity[i]*decalalivetime[i]*.25);
+                    if (decalalivetime[i] > 58)glColor4f(decalbrightness[i], decalbrightness[i], decalbrightness[i], decalopacity[i] * (60 - decalalivetime[i]) / 2);
+                }
+                if (distancemult < 1) {
+                    glColor4f(decalbrightness[i], decalbrightness[i], decalbrightness[i], decalopacity[i]*distancemult);
+                    if (decalalivetime[i] < 4)glColor4f(decalbrightness[i], decalbrightness[i], decalbrightness[i], decalopacity[i]*decalalivetime[i]*distancemult * .25);
+                    if (decalalivetime[i] > 58)glColor4f(decalbrightness[i], decalbrightness[i], decalbrightness[i], decalopacity[i] * (60 - decalalivetime[i]) / 2 * distancemult);
+                }
+            }
+            lasttype = decaltype[i];
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPushMatrix();
+            glBegin(GL_TRIANGLES);
+            for (int j = 0; j < 3; j++) {
+                glTexCoord2f(decaltexcoords[i][j][0], decaltexcoords[i][j][1]);
+                glVertex3f(decalvertex[i][j].x, decalvertex[i][j].y, decalvertex[i][j].z);
+            }
+            glEnd();
+            glPopMatrix();
+        }
+        for (i = numdecals - 1; i >= 0; i--) {
+            decalalivetime[i] += multiplier;
+            if (decaltype[i] == blooddecalslow)decalalivetime[i] -= multiplier * 2 / 3;
+            if (decaltype[i] == blooddecalfast)decalalivetime[i] += multiplier * 4;
+            if (decaltype[i] == shadowdecal)DeleteDecal(i);
+            if (decaltype[i] == footprintdecal && decalalivetime[i] >= 5)DeleteDecal(i);
+            if (decaltype[i] == bodyprintdecal && decalalivetime[i] >= 5)DeleteDecal(i);
+            if ((decaltype[i] == blooddecal || decaltype[i] == blooddecalfast || decaltype[i] == blooddecalslow) && decalalivetime[i] >= 60)DeleteDecal(i);
+        }
+        glAlphaFunc(GL_GREATER, 0.0001);
+    }
 }
 
 void Terrain::AddObject(XYZ where, float radius, int id)
 {
-       bool done;
-       int i,j;
-       XYZ points[4];
-       if(id>=0&&id<10000)
-               for(i=0;i<subdivision;i++){
-                       for(j=0;j<subdivision;j++){
-                               if(patchobjectnum[i][j]<300-1){
-                                       done=0;
-                                       points[0].x=(size/subdivision)*i;
-                                       points[0].z=(size/subdivision)*j;
-                                       points[0].y=heightmap[(int)points[0].x][(int)points[0].z];
-                                       points[1].x=(size/subdivision)*(i+1);
-                                       points[1].z=(size/subdivision)*j;
-                                       points[1].y=heightmap[(int)points[1].x][(int)points[1].z];
-                                       points[2].x=(size/subdivision)*(i+1);
-                                       points[2].z=(size/subdivision)*(j+1);
-                                       points[2].y=heightmap[(int)points[2].x][(int)points[2].z];
-                                       points[3].x=(size/subdivision)*i;
-                                       points[3].z=(size/subdivision)*(j+1);
-                                       points[3].y=heightmap[(int)points[3].x][(int)points[3].z];
-                                       points[0]*=scale;
-                                       points[1]*=scale;
-                                       points[2]*=scale;
-                                       points[3]*=scale;
-                                       if(!done&&where.x+radius>points[0].x&&where.x-radius<points[2].x&&where.z+radius>points[0].z&&where.z-radius<points[2].z){
-                                               patchobjects[i][j][patchobjectnum[i][j]]=id;
-                                               patchobjectnum[i][j]++;
-                                               done=1;
-                                       }
-                               }
-                       }
-               }
+    bool done;
+    int i, j;
+    XYZ points[4];
+    if (id >= 0 && id < 10000)
+        for (i = 0; i < subdivision; i++) {
+            for (j = 0; j < subdivision; j++) {
+                if (patchobjectnum[i][j] < 300 - 1) {
+                    done = 0;
+                    points[0].x = (size / subdivision) * i;
+                    points[0].z = (size / subdivision) * j;
+                    points[0].y = heightmap[(int)points[0].x][(int)points[0].z];
+                    points[1].x = (size / subdivision) * (i + 1);
+                    points[1].z = (size / subdivision) * j;
+                    points[1].y = heightmap[(int)points[1].x][(int)points[1].z];
+                    points[2].x = (size / subdivision) * (i + 1);
+                    points[2].z = (size / subdivision) * (j + 1);
+                    points[2].y = heightmap[(int)points[2].x][(int)points[2].z];
+                    points[3].x = (size / subdivision) * i;
+                    points[3].z = (size / subdivision) * (j + 1);
+                    points[3].y = heightmap[(int)points[3].x][(int)points[3].z];
+                    points[0] *= scale;
+                    points[1] *= scale;
+                    points[2] *= scale;
+                    points[3] *= scale;
+                    if (!done && where.x + radius > points[0].x && where.x - radius < points[2].x && where.z + radius > points[0].z && where.z - radius < points[2].z) {
+                        patchobjects[i][j][patchobjectnum[i][j]] = id;
+                        patchobjectnum[i][j]++;
+                        done = 1;
+                    }
+                }
+            }
+        }
 }
 
 void Terrain::DeleteDecal(int which)
 {
-       if(decals){
-               decaltype[which]=decaltype[numdecals-1];
-               decalposition[which]=decalposition[numdecals-1];
-               for(int i=0;i<3;i++){
-                       decalvertex[which][i]=decalvertex[numdecals-1][i];
-                       decaltexcoords[which][i][0]=decaltexcoords[numdecals-1][i][0];
-                       decaltexcoords[which][i][1]=decaltexcoords[numdecals-1][i][1];
-               }
-               decalrotation[which]=decalrotation[numdecals-1];
-               decalalivetime[which]=decalalivetime[numdecals-1];
-               decalopacity[which]=decalopacity[numdecals-1];
-               decalbrightness[which]=decalbrightness[numdecals-1];
-               numdecals--;
-       }
+    if (decals) {
+        decaltype[which] = decaltype[numdecals - 1];
+        decalposition[which] = decalposition[numdecals - 1];
+        for (int i = 0; i < 3; i++) {
+            decalvertex[which][i] = decalvertex[numdecals - 1][i];
+            decaltexcoords[which][i][0] = decaltexcoords[numdecals - 1][i][0];
+            decaltexcoords[which][i][1] = decaltexcoords[numdecals - 1][i][1];
+        }
+        decalrotation[which] = decalrotation[numdecals - 1];
+        decalalivetime[which] = decalalivetime[numdecals - 1];
+        decalopacity[which] = decalopacity[numdecals - 1];
+        decalbrightness[which] = decalbrightness[numdecals - 1];
+        numdecals--;
+    }
 }
 
-void Terrain::MakeDecal(int type, XYZ where, float size, float opacity, float rotation){
-       if(decals) {
-               if(opacity>0&&size>0) {
-                       static int patchx[4];
-                       static int patchy[4];
-
-                       decaltexcoords[numdecals][0][0]=1;
-                       decaltexcoords[numdecals][0][1]=0;
-
-                       patchx[0]=(where.x+size)/scale;
-                       patchx[1]=(where.x-size)/scale;
-                       patchx[2]=(where.x-size)/scale;
-                       patchx[3]=(where.x+size)/scale;
-
-                       patchy[0]=(where.z-size)/scale;
-                       patchy[1]=(where.z-size)/scale;
-                       patchy[2]=(where.z+size)/scale;
-                       patchy[3]=(where.z+size)/scale;
-
-                       /*if(patchx[1]<subdivision-1&&patchy[1]<subdivision-1&&patchx[1]>0&&patchy[1]>0)
-                       if(patchx[2]<subdivision-1&&patchy[2]<subdivision-1&&patchx[2]>0&&patchy[2]>0)
-                       if(patchx[3]<subdivision-1&&patchy[3]<subdivision-1&&patchx[3]>0&&patchy[3]>0)
-                       if(patchx[0]<subdivision-1&&patchy[0]<subdivision-1&&patchx[0]>0&&patchy[0]>0){
-                       */
-                       if((patchx[0]!=patchx[1]||patchy[0]!=patchy[1])&&(patchx[0]!=patchx[2]||patchy[0]!=patchy[2])&&(patchx[0]!=patchx[3]||patchy[0]!=patchy[3])){
-                               MakeDecalLock(type,where,patchx[0],patchy[0],size,opacity,rotation);
-                       }
-
-                       if((patchx[1]!=patchx[2]||patchy[1]!=patchy[2])&&(patchx[1]!=patchx[3]||patchy[1]!=patchy[3])){
-                               MakeDecalLock(type,where,patchx[1],patchy[1],size,opacity,rotation);
-                       }
-
-                       if((patchx[2]!=patchx[3]||patchy[2]!=patchy[3])){
-                               MakeDecalLock(type,where,patchx[2],patchy[2],size,opacity,rotation);
-                       }
-                       MakeDecalLock(type,where,patchx[3],patchy[3],size,opacity,rotation);
-               }
-       }
-       //}
+void Terrain::MakeDecal(int type, XYZ where, float size, float opacity, float rotation)
+{
+    if (decals) {
+        if (opacity > 0 && size > 0) {
+            static int patchx[4];
+            static int patchy[4];
+
+            decaltexcoords[numdecals][0][0] = 1;
+            decaltexcoords[numdecals][0][1] = 0;
+
+            patchx[0] = (where.x + size) / scale;
+            patchx[1] = (where.x - size) / scale;
+            patchx[2] = (where.x - size) / scale;
+            patchx[3] = (where.x + size) / scale;
+
+            patchy[0] = (where.z - size) / scale;
+            patchy[1] = (where.z - size) / scale;
+            patchy[2] = (where.z + size) / scale;
+            patchy[3] = (where.z + size) / scale;
+
+            /*if(patchx[1]<subdivision-1&&patchy[1]<subdivision-1&&patchx[1]>0&&patchy[1]>0)
+            if(patchx[2]<subdivision-1&&patchy[2]<subdivision-1&&patchx[2]>0&&patchy[2]>0)
+            if(patchx[3]<subdivision-1&&patchy[3]<subdivision-1&&patchx[3]>0&&patchy[3]>0)
+            if(patchx[0]<subdivision-1&&patchy[0]<subdivision-1&&patchx[0]>0&&patchy[0]>0){
+            */
+            if ((patchx[0] != patchx[1] || patchy[0] != patchy[1]) && (patchx[0] != patchx[2] || patchy[0] != patchy[2]) && (patchx[0] != patchx[3] || patchy[0] != patchy[3])) {
+                MakeDecalLock(type, where, patchx[0], patchy[0], size, opacity, rotation);
+            }
+
+            if ((patchx[1] != patchx[2] || patchy[1] != patchy[2]) && (patchx[1] != patchx[3] || patchy[1] != patchy[3])) {
+                MakeDecalLock(type, where, patchx[1], patchy[1], size, opacity, rotation);
+            }
+
+            if ((patchx[2] != patchx[3] || patchy[2] != patchy[3])) {
+                MakeDecalLock(type, where, patchx[2], patchy[2], size, opacity, rotation);
+            }
+            MakeDecalLock(type, where, patchx[3], patchy[3], size, opacity, rotation);
+        }
+    }
+    //}
 }
 
-void Terrain::MakeDecalLock(int type, XYZ where,int whichx, int whichy, float size, float opacity, float rotation){
-       if(decals){
-               static float placex,placez;
-               static XYZ rot;
+void Terrain::MakeDecalLock(int type, XYZ where, int whichx, int whichy, float size, float opacity, float rotation)
+{
+    if (decals) {
+        static float placex, placez;
+        static XYZ rot;
 
-               float decalbright;
+        float decalbright;
 
-               rot=getLighting(where.x,where.z);
-               decalbrightness[numdecals]=(rot.x+rot.y+rot.z)/3;
-               if(decalbrightness[numdecals]<.4)decalbrightness[numdecals]=.4;
+        rot = getLighting(where.x, where.z);
+        decalbrightness[numdecals] = (rot.x + rot.y + rot.z) / 3;
+        if (decalbrightness[numdecals] < .4)decalbrightness[numdecals] = .4;
 
-               if(environment==grassyenvironment){
-                       decalbrightness[numdecals]*=.6;
-               }
+        if (environment == grassyenvironment) {
+            decalbrightness[numdecals] *= .6;
+        }
 
-               if(decalbrightness[numdecals]>1)decalbrightness[numdecals]=1;
-               decalbright=decalbrightness[numdecals];
+        if (decalbrightness[numdecals] > 1)decalbrightness[numdecals] = 1;
+        decalbright = decalbrightness[numdecals];
 
-               decalposition[numdecals]=where;
-               decaltype[numdecals]=type;
-               decalopacity[numdecals]=opacity;
-               decalrotation[numdecals]=rotation;
-               decalalivetime[numdecals]=0;
+        decalposition[numdecals] = where;
+        decaltype[numdecals] = type;
+        decalopacity[numdecals] = opacity;
+        decalrotation[numdecals] = rotation;
+        decalalivetime[numdecals] = 0;
 
-               placex=(float)whichx*scale+scale;
-               placez=(float)whichy*scale;
+        placex = (float)whichx * scale + scale;
+        placez = (float)whichy * scale;
 
-               decaltexcoords[numdecals][0][0]=(placex-where.x)/size/2+.5;
-               decaltexcoords[numdecals][0][1]=(placez-where.z)/size/2+.5;
+        decaltexcoords[numdecals][0][0] = (placex - where.x) / size / 2 + .5;
+        decaltexcoords[numdecals][0][1] = (placez - where.z) / size / 2 + .5;
 
-               decalvertex[numdecals][0].x=placex;
-               decalvertex[numdecals][0].z=placez;
-               decalvertex[numdecals][0].y=heightmap[whichx+1][whichy]*scale+.01;
+        decalvertex[numdecals][0].x = placex;
+        decalvertex[numdecals][0].z = placez;
+        decalvertex[numdecals][0].y = heightmap[whichx + 1][whichy] * scale + .01;
 
 
-               placex=(float)whichx*scale+scale;
-               placez=(float)whichy*scale+scale;
+        placex = (float)whichx * scale + scale;
+        placez = (float)whichy * scale + scale;
 
-               decaltexcoords[numdecals][1][0]=(placex-where.x)/size/2+.5;
-               decaltexcoords[numdecals][1][1]=(placez-where.z)/size/2+.5;
+        decaltexcoords[numdecals][1][0] = (placex - where.x) / size / 2 + .5;
+        decaltexcoords[numdecals][1][1] = (placez - where.z) / size / 2 + .5;
 
-               decalvertex[numdecals][1].x=placex;
-               decalvertex[numdecals][1].z=placez;
-               decalvertex[numdecals][1].y=heightmap[whichx+1][whichy+1]*scale+.01;
+        decalvertex[numdecals][1].x = placex;
+        decalvertex[numdecals][1].z = placez;
+        decalvertex[numdecals][1].y = heightmap[whichx + 1][whichy + 1] * scale + .01;
 
 
-               placex=(float)whichx*scale;
-               placez=(float)whichy*scale+scale;
+        placex = (float)whichx * scale;
+        placez = (float)whichy * scale + scale;
 
-               decaltexcoords[numdecals][2][0]=(placex-where.x)/size/2+.5;
-               decaltexcoords[numdecals][2][1]=(placez-where.z)/size/2+.5;
+        decaltexcoords[numdecals][2][0] = (placex - where.x) / size / 2 + .5;
+        decaltexcoords[numdecals][2][1] = (placez - where.z) / size / 2 + .5;
 
-               decalvertex[numdecals][2].x=placex;
-               decalvertex[numdecals][2].z=placez;
-               decalvertex[numdecals][2].y=heightmap[whichx][whichy+1]*scale+.01;
+        decalvertex[numdecals][2].x = placex;
+        decalvertex[numdecals][2].z = placez;
+        decalvertex[numdecals][2].y = heightmap[whichx][whichy + 1] * scale + .01;
 
-               if(decalrotation[numdecals]){
-                       for(int i=0;i<3;i++){                   
-                               rot.y=0;
-                               rot.x=decaltexcoords[numdecals][i][0]-.5;
-                               rot.z=decaltexcoords[numdecals][i][1]-.5;
-                               rot=DoRotation(rot,0,-decalrotation[numdecals],0);
-                               decaltexcoords[numdecals][i][0]=rot.x+.5;
-                               decaltexcoords[numdecals][i][1]=rot.z+.5;
-                       }
-               }
+        if (decalrotation[numdecals]) {
+            for (int i = 0; i < 3; i++) {
+                rot.y = 0;
+                rot.x = decaltexcoords[numdecals][i][0] - .5;
+                rot.z = decaltexcoords[numdecals][i][1] - .5;
+                rot = DoRotation(rot, 0, -decalrotation[numdecals], 0);
+                decaltexcoords[numdecals][i][0] = rot.x + .5;
+                decaltexcoords[numdecals][i][1] = rot.z + .5;
+            }
+        }
 
-               if(!(decaltexcoords[numdecals][0][0]<0&&decaltexcoords[numdecals][1][0]<0&&decaltexcoords[numdecals][2][0]<0))
-                       if(!(decaltexcoords[numdecals][0][1]<0&&decaltexcoords[numdecals][1][1]<0&&decaltexcoords[numdecals][2][1]<0))
-                               if(!(decaltexcoords[numdecals][0][0]>1&&decaltexcoords[numdecals][1][0]>1&&decaltexcoords[numdecals][2][0]>1))
-                                       if(!(decaltexcoords[numdecals][0][1]>1&&decaltexcoords[numdecals][1][1]>1&&decaltexcoords[numdecals][2][1]>1))
-                                               if(numdecals<max_decals-1)numdecals++;
+        if (!(decaltexcoords[numdecals][0][0] < 0 && decaltexcoords[numdecals][1][0] < 0 && decaltexcoords[numdecals][2][0] < 0))
+            if (!(decaltexcoords[numdecals][0][1] < 0 && decaltexcoords[numdecals][1][1] < 0 && decaltexcoords[numdecals][2][1] < 0))
+                if (!(decaltexcoords[numdecals][0][0] > 1 && decaltexcoords[numdecals][1][0] > 1 && decaltexcoords[numdecals][2][0] > 1))
+                    if (!(decaltexcoords[numdecals][0][1] > 1 && decaltexcoords[numdecals][1][1] > 1 && decaltexcoords[numdecals][2][1] > 1))
+                        if (numdecals < max_decals - 1)numdecals++;
 
-               decalbrightness[numdecals]=decalbright;
+        decalbrightness[numdecals] = decalbright;
 
-               decalposition[numdecals]=where;
-               decaltype[numdecals]=type;
-               decalopacity[numdecals]=opacity;
-               decalrotation[numdecals]=rotation;
-               decalalivetime[numdecals]=0;
+        decalposition[numdecals] = where;
+        decaltype[numdecals] = type;
+        decalopacity[numdecals] = opacity;
+        decalrotation[numdecals] = rotation;
+        decalalivetime[numdecals] = 0;
 
-               placex=(float)whichx*scale+scale;
-               placez=(float)whichy*scale;
+        placex = (float)whichx * scale + scale;
+        placez = (float)whichy * scale;
 
-               decaltexcoords[numdecals][0][0]=(placex-where.x)/size/2+.5;
-               decaltexcoords[numdecals][0][1]=(placez-where.z)/size/2+.5;
+        decaltexcoords[numdecals][0][0] = (placex - where.x) / size / 2 + .5;
+        decaltexcoords[numdecals][0][1] = (placez - where.z) / size / 2 + .5;
 
-               decalvertex[numdecals][0].x=placex;
-               decalvertex[numdecals][0].z=placez;
-               decalvertex[numdecals][0].y=heightmap[whichx+1][whichy]*scale+.01;
+        decalvertex[numdecals][0].x = placex;
+        decalvertex[numdecals][0].z = placez;
+        decalvertex[numdecals][0].y = heightmap[whichx + 1][whichy] * scale + .01;
 
 
-               placex=(float)whichx*scale;
-               placez=(float)whichy*scale;
+        placex = (float)whichx * scale;
+        placez = (float)whichy * scale;
 
-               decaltexcoords[numdecals][1][0]=(placex-where.x)/size/2+.5;
-               decaltexcoords[numdecals][1][1]=(placez-where.z)/size/2+.5;
+        decaltexcoords[numdecals][1][0] = (placex - where.x) / size / 2 + .5;
+        decaltexcoords[numdecals][1][1] = (placez - where.z) / size / 2 + .5;
 
-               decalvertex[numdecals][1].x=placex;
-               decalvertex[numdecals][1].z=placez;
-               decalvertex[numdecals][1].y=heightmap[whichx][whichy]*scale+.01;
+        decalvertex[numdecals][1].x = placex;
+        decalvertex[numdecals][1].z = placez;
+        decalvertex[numdecals][1].y = heightmap[whichx][whichy] * scale + .01;
 
 
-               placex=(float)whichx*scale;
-               placez=(float)whichy*scale+scale;
+        placex = (float)whichx * scale;
+        placez = (float)whichy * scale + scale;
 
-               decaltexcoords[numdecals][2][0]=(placex-where.x)/size/2+.5;
-               decaltexcoords[numdecals][2][1]=(placez-where.z)/size/2+.5;
+        decaltexcoords[numdecals][2][0] = (placex - where.x) / size / 2 + .5;
+        decaltexcoords[numdecals][2][1] = (placez - where.z) / size / 2 + .5;
 
-               decalvertex[numdecals][2].x=placex;
-               decalvertex[numdecals][2].z=placez;
-               decalvertex[numdecals][2].y=heightmap[whichx][whichy+1]*scale+.01;
+        decalvertex[numdecals][2].x = placex;
+        decalvertex[numdecals][2].z = placez;
+        decalvertex[numdecals][2].y = heightmap[whichx][whichy + 1] * scale + .01;
 
-               if(decalrotation[numdecals]){
-                       for(int i=0;i<3;i++){                   
-                               rot.y=0;
-                               rot.x=decaltexcoords[numdecals][i][0]-.5;
-                               rot.z=decaltexcoords[numdecals][i][1]-.5;
-                               rot=DoRotation(rot,0,-decalrotation[numdecals],0);
-                               decaltexcoords[numdecals][i][0]=rot.x+.5;
-                               decaltexcoords[numdecals][i][1]=rot.z+.5;
-                       }
-               }
+        if (decalrotation[numdecals]) {
+            for (int i = 0; i < 3; i++) {
+                rot.y = 0;
+                rot.x = decaltexcoords[numdecals][i][0] - .5;
+                rot.z = decaltexcoords[numdecals][i][1] - .5;
+                rot = DoRotation(rot, 0, -decalrotation[numdecals], 0);
+                decaltexcoords[numdecals][i][0] = rot.x + .5;
+                decaltexcoords[numdecals][i][1] = rot.z + .5;
+            }
+        }
 
-               if(!(decaltexcoords[numdecals][0][0]<0&&decaltexcoords[numdecals][1][0]<0&&decaltexcoords[numdecals][2][0]<0))
-                       if(!(decaltexcoords[numdecals][0][1]<0&&decaltexcoords[numdecals][1][1]<0&&decaltexcoords[numdecals][2][1]<0))
-                               if(!(decaltexcoords[numdecals][0][0]>1&&decaltexcoords[numdecals][1][0]>1&&decaltexcoords[numdecals][2][0]>1))
-                                       if(!(decaltexcoords[numdecals][0][1]>1&&decaltexcoords[numdecals][1][1]>1&&decaltexcoords[numdecals][2][1]>1))
-                                               if(numdecals<max_decals-1)numdecals++;
-       }
+        if (!(decaltexcoords[numdecals][0][0] < 0 && decaltexcoords[numdecals][1][0] < 0 && decaltexcoords[numdecals][2][0] < 0))
+            if (!(decaltexcoords[numdecals][0][1] < 0 && decaltexcoords[numdecals][1][1] < 0 && decaltexcoords[numdecals][2][1] < 0))
+                if (!(decaltexcoords[numdecals][0][0] > 1 && decaltexcoords[numdecals][1][0] > 1 && decaltexcoords[numdecals][2][0] > 1))
+                    if (!(decaltexcoords[numdecals][0][1] > 1 && decaltexcoords[numdecals][1][1] > 1 && decaltexcoords[numdecals][2][1] > 1))
+                        if (numdecals < max_decals - 1)numdecals++;
+    }
 }
 
 void Terrain::DoLighting()
 {
-       static int i,j,k,todivide;
-       static float brightness, total;
-       static XYZ blank, terrainpoint,lightloc;
-       lightloc=light.location;
-       Normalise(&lightloc);
-       //Calculate shadows
-       for(i=0;i<size;i++){
-               for(j=0;j<size;j++){
-                       terrainpoint.x=(float)i*scale;
-                       terrainpoint.z=(float)j*scale;
-                       terrainpoint.y=heightmap[i][j]*scale+.1;
-                       /*brightness=0;
-                       if(lineTerrain(lightlocation*10+terrainpoint,terrainpoint,&blank)==-1)
-                       */
-                       brightness=dotproduct(&lightloc,&normals[i][j]);
-
-                       if(brightness>1)brightness=1;
-                       if(brightness<0)brightness=0;
-
-                       colors[i][j][0]=light.color[0]*brightness+light.ambient[0];
-                       colors[i][j][1]=light.color[1]*brightness+light.ambient[1];
-                       colors[i][j][2]=light.color[2]*brightness+light.ambient[2];
-
-                       if(colors[i][j][0]>1)colors[i][j][0]=1;
-                       if(colors[i][j][1]>1)colors[i][j][1]=1;
-                       if(colors[i][j][2]>1)colors[i][j][2]=1;
-                       if(colors[i][j][0]<0)colors[i][j][0]=0;
-                       if(colors[i][j][1]<0)colors[i][j][1]=0;
-                       if(colors[i][j][2]<0)colors[i][j][2]=0;
-               }
-       }
-
-       //Smooth shadows
-       for(i=0;i<size;i++){
-               for(j=0;j<size;j++){
-                       for(k=0;k<3;k++){
-                               total=0;
-                               todivide=0;
-                               if(i!=0){                               total+=colors[j][i-1][k]; todivide++;}
-                               if(i!=size-1){                          total+=colors[j][i+1][k]; todivide++;}
-                               if(j!=0){                               total+=colors[j-1][i][k]; todivide++;}
-                               if(j!=size-1){                          total+=colors[j+1][i][k]; todivide++;}
-                               if(i!=0&&j!=0){                 total+=colors[j-1][i-1][k]; todivide++;}
-                               if(i!=size-1&&j!=0){            total+=colors[j-1][i+1][k]; todivide++;}
-                               if(j!=size-1&&i!=size-1){               total+=colors[j+1][i+1][k]; todivide++;}
-                               if(j!=size-1&&i!=0){            total+=colors[j+1][i-1][k]; todivide++;}
-                               total+=colors[j][i][k]; todivide++;
-
-                               colors[j][i][k]=total/todivide;
-                       }
-               }
-       }
+    static int i, j, k, todivide;
+    static float brightness, total;
+    static XYZ blank, terrainpoint, lightloc;
+    lightloc = light.location;
+    Normalise(&lightloc);
+    //Calculate shadows
+    for (i = 0; i < size; i++) {
+        for (j = 0; j < size; j++) {
+            terrainpoint.x = (float)i * scale;
+            terrainpoint.z = (float)j * scale;
+            terrainpoint.y = heightmap[i][j] * scale + .1;
+            /*brightness=0;
+            if(lineTerrain(lightlocation*10+terrainpoint,terrainpoint,&blank)==-1)
+            */
+            brightness = dotproduct(&lightloc, &normals[i][j]);
+
+            if (brightness > 1)brightness = 1;
+            if (brightness < 0)brightness = 0;
+
+            colors[i][j][0] = light.color[0] * brightness + light.ambient[0];
+            colors[i][j][1] = light.color[1] * brightness + light.ambient[1];
+            colors[i][j][2] = light.color[2] * brightness + light.ambient[2];
+
+            if (colors[i][j][0] > 1)colors[i][j][0] = 1;
+            if (colors[i][j][1] > 1)colors[i][j][1] = 1;
+            if (colors[i][j][2] > 1)colors[i][j][2] = 1;
+            if (colors[i][j][0] < 0)colors[i][j][0] = 0;
+            if (colors[i][j][1] < 0)colors[i][j][1] = 0;
+            if (colors[i][j][2] < 0)colors[i][j][2] = 0;
+        }
+    }
+
+    //Smooth shadows
+    for (i = 0; i < size; i++) {
+        for (j = 0; j < size; j++) {
+            for (k = 0; k < 3; k++) {
+                total = 0;
+                todivide = 0;
+                if (i != 0) {
+                    total += colors[j][i - 1][k];
+                    todivide++;
+                }
+                if (i != size - 1) {
+                    total += colors[j][i + 1][k];
+                    todivide++;
+                }
+                if (j != 0) {
+                    total += colors[j - 1][i][k];
+                    todivide++;
+                }
+                if (j != size - 1) {
+                    total += colors[j + 1][i][k];
+                    todivide++;
+                }
+                if (i != 0 && j != 0) {
+                    total += colors[j - 1][i - 1][k];
+                    todivide++;
+                }
+                if (i != size - 1 && j != 0) {
+                    total += colors[j - 1][i + 1][k];
+                    todivide++;
+                }
+                if (j != size - 1 && i != size - 1) {
+                    total += colors[j + 1][i + 1][k];
+                    todivide++;
+                }
+                if (j != size - 1 && i != 0) {
+                    total += colors[j + 1][i - 1][k];
+                    todivide++;
+                }
+                total += colors[j][i][k];
+                todivide++;
+
+                colors[j][i][k] = total / todivide;
+            }
+        }
+    }
 }
 
 void Terrain::DoShadows()
 {
-       static int i,j,k,l,todivide;
-       static float brightness, total;
-       static XYZ testpoint,testpoint2, terrainpoint,lightloc,col;
-       lightloc=light.location;
-       if(!skyboxtexture){
-               lightloc.x=0;
-               lightloc.z=0;
-       }
-       if(skyboxtexture&&tutoriallevel){
-               lightloc.x*=.4;
-               lightloc.z*=.4;
-       }
-       int patchx,patchz;
-       float shadowed;
-       Normalise(&lightloc);
-       //Calculate shadows
-       for(i=0;i<size;i++){
-               for(j=0;j<size;j++){
-                       terrainpoint.x=(float)(i)*scale;
-                       terrainpoint.z=(float)(j)*scale;
-                       terrainpoint.y=heightmap[i][j]*scale;
-
-                       shadowed=0;
-                       patchx=(float)(i)*subdivision/size;
-                       patchz=(float)(j)*subdivision/size;
-                       if(patchobjectnum[patchx][patchz]){
-                               for(k=0;k<patchobjectnum[patchx][patchz];k++){
-                                       l=patchobjects[patchx][patchz][k];
-                                       if(objects.type[l]!=treetrunktype){
-                                               testpoint=terrainpoint;
-                                               testpoint2=terrainpoint+lightloc*50*(1-shadowed);
-                                               if(objects.model[l].LineCheck(&testpoint,&testpoint2,&col,&objects.position[l],&objects.yaw[l])!=-1){
-                                                       shadowed=1-(findDistance(&terrainpoint,&col)/50);       
-                                               }
-                                       }
-                               }
-                               if(visibleloading) Game::LoadingScreen();
-                       }
-                       brightness=dotproduct(&lightloc,&normals[i][j]);
-                       if(shadowed)brightness*=1-shadowed;
-
-                       if(brightness>1)brightness=1;
-                       if(brightness<0)brightness=0;
-
-                       colors[i][j][0]=light.color[0]*brightness+light.ambient[0];
-                       colors[i][j][1]=light.color[1]*brightness+light.ambient[1];
-                       colors[i][j][2]=light.color[2]*brightness+light.ambient[2];
-
-                       if(colors[i][j][0]>1)colors[i][j][0]=1;
-                       if(colors[i][j][1]>1)colors[i][j][1]=1;
-                       if(colors[i][j][2]>1)colors[i][j][2]=1;
-                       if(colors[i][j][0]<0)colors[i][j][0]=0;
-                       if(colors[i][j][1]<0)colors[i][j][1]=0;
-                       if(colors[i][j][2]<0)colors[i][j][2]=0;
-               }
-       }
-
-       if(visibleloading) Game::LoadingScreen();
-
-       //Smooth shadows
-       for(i=0;i<size;i++){
-               for(j=0;j<size;j++){
-                       for(k=0;k<3;k++){
-                               total=0;
-                               todivide=0;
-                               if(i!=0){                               total+=colors[j][i-1][k]; todivide++;}
-                               if(i!=size-1){                          total+=colors[j][i+1][k]; todivide++;}
-                               if(j!=0){                               total+=colors[j-1][i][k]; todivide++;}
-                               if(j!=size-1){                          total+=colors[j+1][i][k]; todivide++;}
-                               if(i!=0&&j!=0){                 total+=colors[j-1][i-1][k]; todivide++;}
-                               if(i!=size-1&&j!=0){            total+=colors[j-1][i+1][k]; todivide++;}
-                               if(j!=size-1&&i!=size-1){               total+=colors[j+1][i+1][k]; todivide++;}
-                               if(j!=size-1&&i!=0){            total+=colors[j+1][i-1][k]; todivide++;}
-                               total+=colors[j][i][k]; todivide++;
-
-                               colors[j][i][k]=total/todivide;
-                       }
-               }
-       }
-
-       for(i=0;i<subdivision;i++){
-               for(j=0;j<subdivision;j++){
-                       UpdateVertexArray(i,j);
-               }
-       }
+    static int i, j, k, l, todivide;
+    static float brightness, total;
+    static XYZ testpoint, testpoint2, terrainpoint, lightloc, col;
+    lightloc = light.location;
+    if (!skyboxtexture) {
+        lightloc.x = 0;
+        lightloc.z = 0;
+    }
+    if (skyboxtexture && tutoriallevel) {
+        lightloc.x *= .4;
+        lightloc.z *= .4;
+    }
+    int patchx, patchz;
+    float shadowed;
+    Normalise(&lightloc);
+    //Calculate shadows
+    for (i = 0; i < size; i++) {
+        for (j = 0; j < size; j++) {
+            terrainpoint.x = (float)(i) * scale;
+            terrainpoint.z = (float)(j) * scale;
+            terrainpoint.y = heightmap[i][j] * scale;
+
+            shadowed = 0;
+            patchx = (float)(i) * subdivision / size;
+            patchz = (float)(j) * subdivision / size;
+            if (patchobjectnum[patchx][patchz]) {
+                for (k = 0; k < patchobjectnum[patchx][patchz]; k++) {
+                    l = patchobjects[patchx][patchz][k];
+                    if (objects.type[l] != treetrunktype) {
+                        testpoint = terrainpoint;
+                        testpoint2 = terrainpoint + lightloc * 50 * (1 - shadowed);
+                        if (objects.model[l].LineCheck(&testpoint, &testpoint2, &col, &objects.position[l], &objects.yaw[l]) != -1) {
+                            shadowed = 1 - (findDistance(&terrainpoint, &col) / 50);
+                        }
+                    }
+                }
+                if (visibleloading) Game::LoadingScreen();
+            }
+            brightness = dotproduct(&lightloc, &normals[i][j]);
+            if (shadowed)brightness *= 1 - shadowed;
+
+            if (brightness > 1)brightness = 1;
+            if (brightness < 0)brightness = 0;
+
+            colors[i][j][0] = light.color[0] * brightness + light.ambient[0];
+            colors[i][j][1] = light.color[1] * brightness + light.ambient[1];
+            colors[i][j][2] = light.color[2] * brightness + light.ambient[2];
+
+            if (colors[i][j][0] > 1)colors[i][j][0] = 1;
+            if (colors[i][j][1] > 1)colors[i][j][1] = 1;
+            if (colors[i][j][2] > 1)colors[i][j][2] = 1;
+            if (colors[i][j][0] < 0)colors[i][j][0] = 0;
+            if (colors[i][j][1] < 0)colors[i][j][1] = 0;
+            if (colors[i][j][2] < 0)colors[i][j][2] = 0;
+        }
+    }
+
+    if (visibleloading) Game::LoadingScreen();
+
+    //Smooth shadows
+    for (i = 0; i < size; i++) {
+        for (j = 0; j < size; j++) {
+            for (k = 0; k < 3; k++) {
+                total = 0;
+                todivide = 0;
+                if (i != 0) {
+                    total += colors[j][i - 1][k];
+                    todivide++;
+                }
+                if (i != size - 1) {
+                    total += colors[j][i + 1][k];
+                    todivide++;
+                }
+                if (j != 0) {
+                    total += colors[j - 1][i][k];
+                    todivide++;
+                }
+                if (j != size - 1) {
+                    total += colors[j + 1][i][k];
+                    todivide++;
+                }
+                if (i != 0 && j != 0) {
+                    total += colors[j - 1][i - 1][k];
+                    todivide++;
+                }
+                if (i != size - 1 && j != 0) {
+                    total += colors[j - 1][i + 1][k];
+                    todivide++;
+                }
+                if (j != size - 1 && i != size - 1) {
+                    total += colors[j + 1][i + 1][k];
+                    todivide++;
+                }
+                if (j != size - 1 && i != 0) {
+                    total += colors[j + 1][i - 1][k];
+                    todivide++;
+                }
+                total += colors[j][i][k];
+                todivide++;
+
+                colors[j][i][k] = total / todivide;
+            }
+        }
+    }
+
+    for (i = 0; i < subdivision; i++) {
+        for (j = 0; j < subdivision; j++) {
+            UpdateVertexArray(i, j);
+        }
+    }
 }
 
 Terrain::Terrain()
 {
-       size = 0;
-
-       memset(patchobjectnum, 0, sizeof(patchobjectnum));
-       memset(patchobjects, 0, sizeof(patchobjects));
-
-       scale = 1.0f;
-       type = 0;
-       memset(heightmap, 0, sizeof(heightmap));
-       memset(normals, 0, sizeof(normals));
-       memset(facenormals, 0, sizeof(facenormals));
-       memset(triangles, 0, sizeof(triangles));
-       memset(colors, 0, sizeof(colors));
-       memset(opacityother, 0, sizeof(opacityother));
-       memset(texoffsetx, 0, sizeof(texoffsetx));
-       memset(texoffsety, 0, sizeof(texoffsety));
-       memset(numtris, 0, sizeof(numtris));
-       memset(textureness, 0, sizeof(textureness));
-
-       memset(vArray, 0, sizeof(vArray));
-
-       memset(visible, 0, sizeof(visible));
-       memset(avgypatch, 0, sizeof(avgypatch));
-       memset(maxypatch, 0, sizeof(maxypatch));
-       memset(minypatch, 0, sizeof(minypatch));
-       memset(heightypatch, 0, sizeof(heightypatch));
-
-       patch_elements = 0;
-
-       memset(decaltexcoords, 0, sizeof(decaltexcoords));
-       memset(decalvertex, 0, sizeof(decalvertex));
-       memset(decaltype, 0, sizeof(decaltype));
-       memset(decalopacity, 0, sizeof(decalopacity));
-       memset(decalrotation, 0, sizeof(decalrotation));
-       memset(decalalivetime, 0, sizeof(decalalivetime));
-       memset(decalbrightness, 0, sizeof(decalbrightness));
-       memset(decalposition, 0, sizeof(decalposition));
-       numdecals = 0;
+    size = 0;
+
+    memset(patchobjectnum, 0, sizeof(patchobjectnum));
+    memset(patchobjects, 0, sizeof(patchobjects));
+
+    scale = 1.0f;
+    type = 0;
+    memset(heightmap, 0, sizeof(heightmap));
+    memset(normals, 0, sizeof(normals));
+    memset(facenormals, 0, sizeof(facenormals));
+    memset(triangles, 0, sizeof(triangles));
+    memset(colors, 0, sizeof(colors));
+    memset(opacityother, 0, sizeof(opacityother));
+    memset(texoffsetx, 0, sizeof(texoffsetx));
+    memset(texoffsety, 0, sizeof(texoffsety));
+    memset(numtris, 0, sizeof(numtris));
+    memset(textureness, 0, sizeof(textureness));
+
+    memset(vArray, 0, sizeof(vArray));
+
+    memset(visible, 0, sizeof(visible));
+    memset(avgypatch, 0, sizeof(avgypatch));
+    memset(maxypatch, 0, sizeof(maxypatch));
+    memset(minypatch, 0, sizeof(minypatch));
+    memset(heightypatch, 0, sizeof(heightypatch));
+
+    patch_elements = 0;
+
+    memset(decaltexcoords, 0, sizeof(decaltexcoords));
+    memset(decalvertex, 0, sizeof(decalvertex));
+    memset(decaltype, 0, sizeof(decaltype));
+    memset(decalopacity, 0, sizeof(decalopacity));
+    memset(decalrotation, 0, sizeof(decalrotation));
+    memset(decalalivetime, 0, sizeof(decalalivetime));
+    memset(decalbrightness, 0, sizeof(decalbrightness));
+    memset(decalposition, 0, sizeof(decalposition));
+    numdecals = 0;
 }
 Terrain::~Terrain()
 {
-       terraintexture.destroy();
-       shadowtexture.destroy();
-       bodyprinttexture.destroy();
-       footprinttexture.destroy();
-       bloodtexture.destroy();
-       bloodtexture2.destroy();
-       breaktexture.destroy();
+    terraintexture.destroy();
+    shadowtexture.destroy();
+    bodyprinttexture.destroy();
+    footprinttexture.destroy();
+    bloodtexture.destroy();
+    bloodtexture2.destroy();
+    breaktexture.destroy();
 }
 
index 051065617675b5e259580423a81c386c4b885cbc..f9a127be5d84da4b9e31d2f706e398dba1459647 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -30,7 +30,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "Quaternions.h"
 #include "Texture.h"
 
-#define max_terrain_size                       256             
+#define max_terrain_size                       256
 #define curr_terrain_size                      size
 #define subdivision                            64
 #define max_patch_elements                     (max_terrain_size/subdivision)*(max_terrain_size/subdivision)*54
@@ -57,79 +57,80 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 // Model Structures
 //
 
-class Terrain{
+class Terrain
+{
 public:
-       Texture bloodtexture;
-       Texture bloodtexture2;
-       Texture shadowtexture;
-       Texture footprinttexture;
-       Texture bodyprinttexture;
-       Texture breaktexture;
-       Texture terraintexture;
-       short   size;
-
-       int patchobjectnum[subdivision][subdivision];
-       int patchobjects[subdivision][subdivision][300];
-
-       float scale;
-       int type;
-       float heightmap[max_terrain_size+1][max_terrain_size+1];
-       XYZ normals[max_terrain_size][max_terrain_size];
-       XYZ facenormals[max_terrain_size][max_terrain_size];
-       XYZ triangles[(max_terrain_size-1)*(max_terrain_size-1)*2][3];
-       float colors[max_terrain_size][max_terrain_size][4];
-       float opacityother[max_terrain_size][max_terrain_size];
-       float texoffsetx[max_terrain_size][max_terrain_size];
-       float texoffsety[max_terrain_size][max_terrain_size];
-       int numtris[subdivision][subdivision];
-       int textureness[subdivision][subdivision];
-
-       GLfloat vArray[(max_patch_elements)*subdivision*subdivision];
-
-       bool visible[subdivision][subdivision];
-       float avgypatch[subdivision][subdivision];
-       float maxypatch[subdivision][subdivision];
-       float minypatch[subdivision][subdivision];
-       float heightypatch[subdivision][subdivision];
-
-       int patch_elements;
-
-       float decaltexcoords[max_decals][3][2];
-       XYZ decalvertex[max_decals][3];
-       int decaltype[max_decals];
-       float decalopacity[max_decals];
-       float decalrotation[max_decals];
-       float decalalivetime[max_decals];
-       float decalbrightness[max_decals];
-       XYZ decalposition[max_decals];
-       int numdecals;
-
-       void AddObject(XYZ where, float radius,int id);
-       void DeleteDecal(int which);
-       void MakeDecal(int type, XYZ where, float size, float opacity, float rotation);
-       void MakeDecalLock(int type, XYZ where, int whichx, int whichy, float size, float opacity, float rotation);
-       int lineTerrain(XYZ p1,XYZ p2, XYZ *p);
-       float getHeight(float pointx, float pointz);
-       float getHeightExtrude(float pointx, float pointz,float point2x, float point2z);
-       float getOpacity(float pointx, float pointz);
-       XYZ getLighting(float pointx, float pointz);
-       XYZ getNormal(float pointx, float pointz);
-       void UpdateVertexArray(int whichx, int whichy);
-       void UpdateTransparency(int whichx, int whichy);
-       void UpdateTransparencyother(int whichx, int whichy);
-       void UpdateTransparencyotherother(int whichx, int whichy);
-       bool load(const char *fileName);
-       void CalculateNormals();
-       void drawdecals();
-       void draw(int layer);
-       void drawpatch(int whichx, int whichy, float opacity);
-       void drawpatchother(int whichx, int whichy, float opacity);
-       void drawpatchotherother(int whichx, int whichy, float opacity);
-       void DoLighting();
-       void DoShadows();
-
-       Terrain();
-       ~Terrain();
+    Texture bloodtexture;
+    Texture bloodtexture2;
+    Texture shadowtexture;
+    Texture footprinttexture;
+    Texture bodyprinttexture;
+    Texture breaktexture;
+    Texture terraintexture;
+    short      size;
+
+    int patchobjectnum[subdivision][subdivision];
+    int patchobjects[subdivision][subdivision][300];
+
+    float scale;
+    int type;
+    float heightmap[max_terrain_size + 1][max_terrain_size + 1];
+    XYZ normals[max_terrain_size][max_terrain_size];
+    XYZ facenormals[max_terrain_size][max_terrain_size];
+    XYZ triangles[(max_terrain_size - 1) * (max_terrain_size - 1) * 2][3];
+    float colors[max_terrain_size][max_terrain_size][4];
+    float opacityother[max_terrain_size][max_terrain_size];
+    float texoffsetx[max_terrain_size][max_terrain_size];
+    float texoffsety[max_terrain_size][max_terrain_size];
+    int numtris[subdivision][subdivision];
+    int textureness[subdivision][subdivision];
+
+    GLfloat vArray[(max_patch_elements)*subdivision*subdivision];
+
+    bool visible[subdivision][subdivision];
+    float avgypatch[subdivision][subdivision];
+    float maxypatch[subdivision][subdivision];
+    float minypatch[subdivision][subdivision];
+    float heightypatch[subdivision][subdivision];
+
+    int patch_elements;
+
+    float decaltexcoords[max_decals][3][2];
+    XYZ decalvertex[max_decals][3];
+    int decaltype[max_decals];
+    float decalopacity[max_decals];
+    float decalrotation[max_decals];
+    float decalalivetime[max_decals];
+    float decalbrightness[max_decals];
+    XYZ decalposition[max_decals];
+    int numdecals;
+
+    void AddObject(XYZ where, float radius, int id);
+    void DeleteDecal(int which);
+    void MakeDecal(int type, XYZ where, float size, float opacity, float rotation);
+    void MakeDecalLock(int type, XYZ where, int whichx, int whichy, float size, float opacity, float rotation);
+    int lineTerrain(XYZ p1, XYZ p2, XYZ *p);
+    float getHeight(float pointx, float pointz);
+    float getHeightExtrude(float pointx, float pointz, float point2x, float point2z);
+    float getOpacity(float pointx, float pointz);
+    XYZ getLighting(float pointx, float pointz);
+    XYZ getNormal(float pointx, float pointz);
+    void UpdateVertexArray(int whichx, int whichy);
+    void UpdateTransparency(int whichx, int whichy);
+    void UpdateTransparencyother(int whichx, int whichy);
+    void UpdateTransparencyotherother(int whichx, int whichy);
+    bool load(const char *fileName);
+    void CalculateNormals();
+    void drawdecals();
+    void draw(int layer);
+    void drawpatch(int whichx, int whichy, float opacity);
+    void drawpatchother(int whichx, int whichy, float opacity);
+    void drawpatchotherother(int whichx, int whichy, float opacity);
+    void DoLighting();
+    void DoShadows();
+
+    Terrain();
+    ~Terrain();
 };
 
 #endif
index 8f9b1524ef99757edea61e64fc2f5713c8819ea8..934093aaa7598ca3ed26dabbb20a5b1bb1344855 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -26,169 +26,164 @@ extern TGAImageRec texture;
 
 void Text::LoadFontTexture(const char *fileName)
 {
-       GLuint          type;
-
-       LOGFUNC;
-
-       LOG(std::string("Loading font texture...") + fileName);
-
-       FontTexture.load(fileName, false, false);
-/*
-       //Load Image
-       //LoadTGA( fileName ); 
-       unsigned char fileNamep[256];
-       CopyCStringToPascal(fileName,fileNamep);
-       //Load Image
-       upload_image( fileNamep ,1); 
-
-       //Is it valid?
-       if(1==1){
-               //Alpha channel?
-               if ( texture.bpp == 24 )
-                       type = GL_RGB;
-               else
-                       type = GL_RGBA;
-
-               glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
-
-               if(!FontTexture)glGenTextures( 1, &FontTexture );
-               glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
-
-               glBindTexture( GL_TEXTURE_2D, FontTexture);
-               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
-               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
-
-               gluBuild2DMipmaps( GL_TEXTURE_2D, type, texture.sizeX, texture.sizeY, type, GL_UNSIGNED_BYTE, texture.data );
-       }
-*/
-       if (base)
-       {
-               glDeleteLists(base, 512);
-               base = 0;
-       }
+    GLuint             type;
+
+    LOGFUNC;
+
+    LOG(std::string("Loading font texture...") + fileName);
+
+    FontTexture.load(fileName, false, false);
+    /*
+       //Load Image
+       //LoadTGA( fileName );
+       unsigned char fileNamep[256];
+       CopyCStringToPascal(fileName,fileNamep);
+       //Load Image
+       upload_image( fileNamep ,1);
+
+       //Is it valid?
+       if(1==1){
+               //Alpha channel?
+               if ( texture.bpp == 24 )
+                       type = GL_RGB;
+               else
+                       type = GL_RGBA;
+
+               glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
+
+               if(!FontTexture)glGenTextures( 1, &FontTexture );
+               glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+
+               glBindTexture( GL_TEXTURE_2D, FontTexture);
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+
+               gluBuild2DMipmaps( GL_TEXTURE_2D, type, texture.sizeX, texture.sizeY, type, GL_UNSIGNED_BYTE, texture.data );
+       }
+    */
+    if (base) {
+        glDeleteLists(base, 512);
+        base = 0;
+    }
 }
 
 void Text::BuildFont()                                                         // Build Our Font Display List
 {
-       float   cx;                                                                                     // Holds Our X Character Coord
-       float   cy;                                                                                     // Holds Our Y Character Coord
-       int loop;
+    float      cx;                                                                                     // Holds Our X Character Coord
+    float      cy;                                                                                     // Holds Our Y Character Coord
+    int loop;
 
-       LOGFUNC;
+    LOGFUNC;
 
-       if (base)
-       {
-               glDeleteLists(base, 512);
-               base = 0;
-               //LOG("Font already created...");
-               //return;
-       }
+    if (base) {
+        glDeleteLists(base, 512);
+        base = 0;
+        //LOG("Font already created...");
+        //return;
+    }
 
 //     base=glGenLists(256);                                                           // Creating 256 Display Lists
-       base=glGenLists(512);                                                           // Creating 256 Display Lists
-       FontTexture.bind();
-       for (loop=0; loop<512; loop++)                                          // Loop Through All 256 Lists
-       {
-               if (loop < 256)
-               {
-                       cx=float(loop%16)/16.0f;                                                // X Position Of Current Character
-                       cy=float(loop/16)/16.0f;                                                // Y Position Of Current Character
-               }
-               else
-               {
-                       cx=float((loop-256)%16)/16.0f;                                          // X Position Of Current Character
-                       cy=float((loop-256)/16)/16.0f;                                          // Y Position Of Current Character
-               }
-               glNewList(base+loop,GL_COMPILE);                                // Start Building A List
-               glBegin(GL_QUADS);                                                      // Use A Quad For Each Character
-               glTexCoord2f(cx,1-cy-0.0625f+.001);                     // Texture Coord (Bottom Left)
-               glVertex2i(0,0);                                                // Vertex Coord (Bottom Left)
-               glTexCoord2f(cx+0.0625f,1-cy-0.0625f+.001);     // Texture Coord (Bottom Right)
-               glVertex2i(16,0);                                               // Vertex Coord (Bottom Right)
-               glTexCoord2f(cx+0.0625f,1-cy-.001);                     // Texture Coord (Top Right)
-               glVertex2i(16,16);                                              // Vertex Coord (Top Right)
-               glTexCoord2f(cx,1-cy-+.001);                                    // Texture Coord (Top Left)
-               glVertex2i(0,16);                                               // Vertex Coord (Top Left)
-               glEnd();                                                                        // Done Building Our Quad (Character)
-               if (loop < 256)
-                       glTranslated(10,0,0);                                           // Move To The Right Of The Character
-               else
-                       glTranslated(8,0,0);                                            // Move To The Right Of The Character
-               glEndList();                                                                    // Done Building The Display List
-       }                                                                                                       // Loop Until All 256 Are Built
+    base = glGenLists(512);                                                            // Creating 256 Display Lists
+    FontTexture.bind();
+    for (loop = 0; loop < 512; loop++) {                                       // Loop Through All 256 Lists
+        if (loop < 256) {
+            cx = float(loop % 16) / 16.0f;                                             // X Position Of Current Character
+            cy = float(loop / 16) / 16.0f;                                             // Y Position Of Current Character
+        } else {
+            cx = float((loop - 256) % 16) / 16.0f;                                             // X Position Of Current Character
+            cy = float((loop - 256) / 16) / 16.0f;                                             // Y Position Of Current Character
+        }
+        glNewList(base + loop, GL_COMPILE);                            // Start Building A List
+        glBegin(GL_QUADS);                                                     // Use A Quad For Each Character
+        glTexCoord2f(cx, 1 - cy - 0.0625f + .001);                     // Texture Coord (Bottom Left)
+        glVertex2i(0, 0);                                              // Vertex Coord (Bottom Left)
+        glTexCoord2f(cx + 0.0625f, 1 - cy - 0.0625f + .001);   // Texture Coord (Bottom Right)
+        glVertex2i(16, 0);                                             // Vertex Coord (Bottom Right)
+        glTexCoord2f(cx + 0.0625f, 1 - cy - .001);                     // Texture Coord (Top Right)
+        glVertex2i(16, 16);                                            // Vertex Coord (Top Right)
+        glTexCoord2f(cx, 1 - cy - +.001);                                      // Texture Coord (Top Left)
+        glVertex2i(0, 16);                                             // Vertex Coord (Top Left)
+        glEnd();                                                                       // Done Building Our Quad (Character)
+        if (loop < 256)
+            glTranslated(10, 0, 0);                                            // Move To The Right Of The Character
+        else
+            glTranslated(8, 0, 0);                                             // Move To The Right Of The Character
+        glEndList();                                                                   // Done Building The Display List
+    }                                                                                                  // Loop Until All 256 Are Built
 }
 
 void Text::glPrint(float x, float y, const char *string, int set, float size, float width, float height)       // Where The Printing Happens
 {
-       glPrint(x, y, string, set, size, width, height, 0, strlen(string));
+    glPrint(x, y, string, set, size, width, height, 0, strlen(string));
 }
 
-void Text::_glPrint(float x, float y, const char *string, int set, float size, float width, float height,int start,int end, int offset)        // Where The Printing Happens
+void Text::_glPrint(float x, float y, const char *string, int set, float size, float width, float height, int start, int end, int offset)      // Where The Printing Happens
 {
-       if (set>1)
-       {
-               set=1;
-       }
-       glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
-       FontTexture.bind();
-       glDisable(GL_DEPTH_TEST);                                                       // Disables Depth Testing
-       glDisable(GL_LIGHTING);
-       glEnable(GL_BLEND);
-       glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-       glPushMatrix();                                                                         // Store The Projection Matrix
-               glLoadIdentity();                                                                       // Reset The Projection Matrix
-               glOrtho(0,width,0,height,-100,100);                                             // Set Up An Ortho Screen
-               glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-               glPushMatrix();                                                                         // Store The Modelview Matrix
-                       glLoadIdentity();
-                       glTranslated(x,y,0);                                                            // Position The Text (0,0 - Bottom Left)
-                       glScalef(size,size,1);                                                                  // Reset The Modelview Matrix
-                       glListBase(base-32+(128*set) + offset);                                         // Choose The Font Set (0 or 1)
-                       glCallLists(end-start,GL_BYTE,&string[start]);                  // Write The Text To The Screen
-                       glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
-               glPopMatrix();                                                                          // Restore The Old Projection Matrix
-               glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-       glPopMatrix();                                                                          // Restore The Old Projection Matrix
-       glEnable(GL_DEPTH_TEST);                                                        // Enables Depth Testing
-       glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+    if (set > 1) {
+        set = 1;
+    }
+    glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
+    FontTexture.bind();
+    glDisable(GL_DEPTH_TEST);                                                  // Disables Depth Testing
+    glDisable(GL_LIGHTING);
+    glEnable(GL_BLEND);
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+    glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+    glPushMatrix();                                                                            // Store The Projection Matrix
+    glLoadIdentity();                                                                  // Reset The Projection Matrix
+    glOrtho(0, width, 0, height, -100, 100);                                           // Set Up An Ortho Screen
+    glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+    glPushMatrix();                                                                            // Store The Modelview Matrix
+    glLoadIdentity();
+    glTranslated(x, y, 0);                                                             // Position The Text (0,0 - Bottom Left)
+    glScalef(size, size, 1);                                                                   // Reset The Modelview Matrix
+    glListBase(base - 32 + (128 * set) + offset);                                              // Choose The Font Set (0 or 1)
+    glCallLists(end - start, GL_BYTE, &string[start]);                 // Write The Text To The Screen
+    glMatrixMode(GL_PROJECTION);                                               // Select The Projection Matrix
+    glPopMatrix();                                                                             // Restore The Old Projection Matrix
+    glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+    glPopMatrix();                                                                             // Restore The Old Projection Matrix
+    glEnable(GL_DEPTH_TEST);                                                   // Enables Depth Testing
+    glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
 }
 
-void Text::glPrint(float x, float y, const char *string, int set, float size, float width, float height,int start,int end)     // Where The Printing Happens
+void Text::glPrint(float x, float y, const char *string, int set, float size, float width, float height, int start, int end)   // Where The Printing Happens
 {
-       _glPrint(x, y, string, set, size, width, height, start, end, 0);
+    _glPrint(x, y, string, set, size, width, height, start, end, 0);
 }
 
 void Text::glPrintOutline(float x, float y, const char *string, int set, float size, float width, float height)        // Where The Printing Happens
 {
-       glPrintOutline(x, y, string, set, size, width, height, 0, strlen(string));
+    glPrintOutline(x, y, string, set, size, width, height, 0, strlen(string));
 }
 
-void Text::glPrintOutline(float x, float y, const char *string, int set, float size, float width, float height,int start,int end)      // Where The Printing Happens
+void Text::glPrintOutline(float x, float y, const char *string, int set, float size, float width, float height, int start, int end)    // Where The Printing Happens
 {
-       _glPrint(x, y, string, set, size, width, height, start, end, 256);
+    _glPrint(x, y, string, set, size, width, height, start, end, 256);
 }
 void Text::glPrintOutlined(float x, float y, const char *string, int set, float size, float width, float height)       // Where The Printing Happens
 {
-       glPrintOutlined(1, 1, 1, x, y, string, set, size, width, height);
+    glPrintOutlined(1, 1, 1, x, y, string, set, size, width, height);
 }
 
 void Text::glPrintOutlined(float r, float g, float b, float x, float y, const char *string, int set, float size, float width, float height)    // Where The Printing Happens
 {
-       glColor4f(0,0,0,1);
-       glPrintOutline( x-2*size,  y-2*size, string,  set,  size*2.5/2,  width,  height);
-       glColor4f(r,g,b,1);
-       glPrint( x,  y, string,  set,  size,  width,  height);
+    glColor4f(0, 0, 0, 1);
+    glPrintOutline( x - 2 * size,  y - 2 * size, string,  set,  size * 2.5 / 2,  width,  height);
+    glColor4f(r, g, b, 1);
+    glPrint( x,  y, string,  set,  size,  width,  height);
 }
 
-Text::Text() {
-       base = 0;
+Text::Text()
+{
+    base = 0;
 }
-Text::~Text() {
-       if (base) {
-               glDeleteLists(base, 512);
-               base = 0;
-       }
-       FontTexture.destroy();
+Text::~Text()
+{
+    if (base) {
+        glDeleteLists(base, 512);
+        base = 0;
+    }
+    FontTexture.destroy();
 }
 
index cec999569450723082be3f462a8cde904575561c..201c9bf0a04deb333608a191e4e27f981efbdf16 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -31,25 +31,26 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "TGALoader.h"
 #include "Texture.h"
 
-class Text{
+class Text
+{
 public:
-       Texture FontTexture;
-       GLuint base;
+    Texture FontTexture;
+    GLuint base;
 
-       void LoadFontTexture(const char *fileName);
-       void BuildFont();
-       void glPrint(float x, float y, const char *string, int set, float size, float width, float height);
-       void glPrintOutline(float x, float y, const char *string, int set, float size, float width, float height);
-       void glPrint(float x, float y, const char *string, int set, float size, float width, float height,int start,int end);
-       void glPrintOutline(float x, float y, const char *string, int set, float size, float width, float height,int start,int end);
-       void glPrintOutlined(float x, float y, const char *string, int set, float size, float width, float height);
-       void glPrintOutlined(float r, float g, float b, float x, float y, const char *string, int set, float size, float width, float height);
+    void LoadFontTexture(const char *fileName);
+    void BuildFont();
+    void glPrint(float x, float y, const char *string, int set, float size, float width, float height);
+    void glPrintOutline(float x, float y, const char *string, int set, float size, float width, float height);
+    void glPrint(float x, float y, const char *string, int set, float size, float width, float height, int start, int end);
+    void glPrintOutline(float x, float y, const char *string, int set, float size, float width, float height, int start, int end);
+    void glPrintOutlined(float x, float y, const char *string, int set, float size, float width, float height);
+    void glPrintOutlined(float r, float g, float b, float x, float y, const char *string, int set, float size, float width, float height);
 
-       Text();
-       ~Text();
+    Text();
+    ~Text();
 
 private:
-       void _glPrint(float x, float y, const char *string, int set, float size, float width, float height, int start, int end, int offset);
+    void _glPrint(float x, float y, const char *string, int set, float size, float width, float height, int start, int end, int offset);
 };
 
 #endif
index ef20536da7b37f7268607d0a52ba0e44df69569e..fc5c06be6d626f8775cece3384aa289cd75d7fce 100644 (file)
@@ -8,7 +8,8 @@ extern TGAImageRec texture;
 extern bool trilinear;
 
 
-class TextureRes {
+class TextureRes
+{
 private:
     static vector<TextureRes*> list;
 
@@ -36,87 +37,93 @@ public:
 
 vector<TextureRes*> TextureRes::list;
 
-void TextureRes::load(){
+void TextureRes::load()
+{
     //load image into 'texture' global var
-    if(!skindata){
+    if (!skindata) {
         unsigned char filenamep[256];
-        CopyCStringToPascal(ConvertFileName(filename.c_str()),filenamep);
-        upload_image(filenamep,hasAlpha);
+        CopyCStringToPascal(ConvertFileName(filename.c_str()), filenamep);
+        upload_image(filenamep, hasAlpha);
     }
-       
-       skinsize=texture.sizeX;
-       GLuint type=GL_RGBA;
-       if(texture.bpp==24)
-               type=GL_RGB;
-       
-       glPixelStorei(GL_UNPACK_ALIGNMENT,1);
-
-    glDeleteTextures(1,&id);
-    glGenTextures(1,&id);
-       glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
-
-       glBindTexture(GL_TEXTURE_2D, id);
-       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
-       if(hasMipmap){
-               glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,(trilinear?GL_LINEAR_MIPMAP_LINEAR:GL_LINEAR_MIPMAP_NEAREST));
-        glTexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_TRUE);
-    }else{
-               glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+
+    skinsize = texture.sizeX;
+    GLuint type = GL_RGBA;
+    if (texture.bpp == 24)
+        type = GL_RGB;
+
+    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+    glDeleteTextures(1, &id);
+    glGenTextures(1, &id);
+    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+    glBindTexture(GL_TEXTURE_2D, id);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    if (hasMipmap) {
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (trilinear ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR_MIPMAP_NEAREST));
+        glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
+    } else {
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     }
-       
-       if(isSkin){
-        if(skindata){
+
+    if (isSkin) {
+        if (skindata) {
             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, skinsize, skinsize, 0, GL_RGB, GL_UNSIGNED_BYTE, skindata);
-        }else{
+        } else {
             free(data);
-            const int nb=texture.sizeY*texture.sizeX*(texture.bpp/8);
-            data=(GLubyte*)malloc(nb*sizeof(GLubyte));
-            datalen=0;
-            for(int i=0;i<nb;i++)
-                if((i+1)%4||type==GL_RGB)
-                    data[datalen++]=texture.data[i];
+            const int nb = texture.sizeY * texture.sizeX * (texture.bpp / 8);
+            data = (GLubyte*)malloc(nb * sizeof(GLubyte));
+            datalen = 0;
+            for (int i = 0; i < nb; i++)
+                if ((i + 1) % 4 || type == GL_RGB)
+                    data[datalen++] = texture.data[i];
             glTexImage2D(GL_TEXTURE_2D, 0, type, texture.sizeX, texture.sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
         }
-       }else{
+    } else {
         glTexImage2D(GL_TEXTURE_2D, 0, type, texture.sizeX, texture.sizeY, 0, type, GL_UNSIGNED_BYTE, texture.data);
-       }
+    }
 }
 
-void TextureRes::bind(){
-    glBindTexture(GL_TEXTURE_2D,id);
+void TextureRes::bind()
+{
+    glBindTexture(GL_TEXTURE_2D, id);
 }
 
 TextureRes::TextureRes(const string& _filename, bool _hasMipmap, bool _hasAlpha):
-    id(0),filename(_filename),hasMipmap(_hasMipmap),hasAlpha(_hasAlpha),isSkin(false),
-    skinsize(0),data(NULL),datalen(0),skindata(NULL) {
+    id(0), filename(_filename), hasMipmap(_hasMipmap), hasAlpha(_hasAlpha), isSkin(false),
+    skinsize(0), data(NULL), datalen(0), skindata(NULL)
+{
     load();
     list.push_back(this);
 }
 
 TextureRes::TextureRes(const string& _filename, bool _hasMipmap, GLubyte* array, int* skinsizep):
-    id(0),filename(_filename),hasMipmap(_hasMipmap),hasAlpha(false),isSkin(true),
-    skinsize(0),data(NULL),datalen(0),skindata(NULL) {
+    id(0), filename(_filename), hasMipmap(_hasMipmap), hasAlpha(false), isSkin(true),
+    skinsize(0), data(NULL), datalen(0), skindata(NULL)
+{
     load();
-    *skinsizep=skinsize;
-    for(int i=0;i<datalen;i++)
-        array[i]=data[i];
-    skindata=array;
+    *skinsizep = skinsize;
+    for (int i = 0; i < datalen; i++)
+        array[i] = data[i];
+    skindata = array;
     list.push_back(this);
 }
 
-TextureRes::~TextureRes(){
+TextureRes::~TextureRes()
+{
     free(data);
-    glDeleteTextures(1,&id);
-    for(vector<TextureRes*>::iterator it=list.begin();it!=list.end();it++)
-        if(*it==this){
+    glDeleteTextures(1, &id);
+    for (vector<TextureRes*>::iterator it = list.begin(); it != list.end(); it++)
+        if (*it == this) {
             list.erase(it);
             break;
         }
 }
 
-void TextureRes::reloadAll(){
-    for(vector<TextureRes*>::iterator it=list.begin();it!=list.end();it++){
-        (*it)->id=0;
+void TextureRes::reloadAll()
+{
+    for (vector<TextureRes*>::iterator it = list.begin(); it != list.end(); it++) {
+        (*it)->id = 0;
         (*it)->load();
     }
 }
@@ -124,31 +131,36 @@ void TextureRes::reloadAll(){
 
 
 
-void Texture::load(const string& filename, bool hasMipmap, bool hasAlpha){
+void Texture::load(const string& filename, bool hasMipmap, bool hasAlpha)
+{
     destroy();
-    tex=new TextureRes(filename,hasMipmap,hasAlpha);
+    tex = new TextureRes(filename, hasMipmap, hasAlpha);
 }
 
-void Texture::load(const string& filename, bool hasMipmap, GLubyte* array, int* skinsizep){
+void Texture::load(const string& filename, bool hasMipmap, GLubyte* array, int* skinsizep)
+{
     destroy();
-    tex=new TextureRes(filename,hasMipmap,array,skinsizep);
+    tex = new TextureRes(filename, hasMipmap, array, skinsizep);
 }
 
-void Texture::destroy(){
-    if(tex){
+void Texture::destroy()
+{
+    if (tex) {
         delete tex;
-        tex=NULL;
+        tex = NULL;
     }
 }
 
-void Texture::bind(){
-    if(tex)
+void Texture::bind()
+{
+    if (tex)
         tex->bind();
     else
-        glBindTexture(GL_TEXTURE_2D,0);
+        glBindTexture(GL_TEXTURE_2D, 0);
 }
 
-void Texture::reloadAll(){
+void Texture::reloadAll()
+{
     TextureRes::reloadAll();
 }
 
index a684bd53f565e5d4e589a3c6b0a15006bafa139f..9731dca0ff807448cd46a542b9449c2b6f5408fb 100644 (file)
@@ -8,7 +8,8 @@ using namespace std;
 
 class TextureRes;
 
-class Texture {
+class Texture
+{
 private:
     TextureRes* tex;
 public:
index 0346e57da74276347263ff297410b55cce4c154b..144d9cc31334fbd1c3ae5c97947e3a3fc06ba4f1 100644 (file)
@@ -39,7 +39,7 @@ extern int slomo;
 extern float slomodelay;
 extern bool cellophane;
 extern float texdetail;
-extern GLubyte bloodText[512*512*3];
+extern GLubyte bloodText[512 * 512 * 3];
 extern int bloodtoggle;
 extern Objects objects;
 extern bool osx;
@@ -66,1005 +66,984 @@ Texture Weapon::bloodswordtextureptr;
 Model Weapon::staffmodel;
 Texture Weapon::stafftextureptr;
 
-Weapon::Weapon(int t, int o) : owner(o) {
-       setType(t);
-       bloody=0;
-       blooddrip=0;
-       blooddripdelay=0;
-       onfire=0;
-       flamedelay=0;
-       damage=0;
-       position=-1000;
-       tippoint=-1000;
+Weapon::Weapon(int t, int o) : owner(o)
+{
+    setType(t);
+    bloody = 0;
+    blooddrip = 0;
+    blooddripdelay = 0;
+    onfire = 0;
+    flamedelay = 0;
+    damage = 0;
+    position = -1000;
+    tippoint = -1000;
 }
 
-void Weapon::setType(int t) {
-       type = t;
-       if(type==sword){
-               mass=1.5;
-               tipmass=1;
-               length=.8;
-       }
-       if(type==staff){
-               mass=2;
-               tipmass=1;
-               length=1.5;
-       }
-       if(type==knife){
-               mass=1;
-               tipmass=1.2;
-               length=.25;
-       }
+void Weapon::setType(int t)
+{
+    type = t;
+    if (type == sword) {
+        mass = 1.5;
+        tipmass = 1;
+        length = .8;
+    }
+    if (type == staff) {
+        mass = 2;
+        tipmass = 1;
+        length = 1.5;
+    }
+    if (type == knife) {
+        mass = 1;
+        tipmass = 1.2;
+        length = .25;
+    }
 }
 
-void Weapon::DoStuff(int i) {
-       //~ cout << position.x << "," << position.y << "," << position.z << "|" << tippoint.x << "," << tippoint.y << "," << tippoint.z << endl;
-       static int whichpatchx,whichpatchz,whichhit;
-       static XYZ start,end,colpoint,normalrot,footvel,footpoint;
-       static XYZ terrainnormal;
-       static XYZ vel;
-       static XYZ midp;
-       static XYZ newpoint1,newpoint2;
-       static float friction=3.5;
-       static float elasticity=.4;
-       static XYZ bounceness;
-       static float frictionness;
-       static float closestdistance;
-       static float distance;
-       static XYZ point[3];
-       static XYZ closestpoint;
-       static XYZ closestswordpoint;
-       static XYZ extramove;
-       static float tempmult;
-       
-       if(owner!=-1) {
-               oldowner=owner;
-       }
-       if(damage>=2 && type==staff && owner!=-1) { // the staff breaks
-               emit_sound_at(staffbreaksound, tippoint);
-               XYZ tempvel;
-               for(int j=0;j<40;j++) {
-                       tempvel.x=float(abs(Random()%100)-50)/20;
-                       tempvel.y=float(abs(Random()%100)-50)/20;
-                       tempvel.z=float(abs(Random()%100)-50)/20;
-                       Sprite::MakeSprite(splintersprite, position+(tippoint-position)*((float)j-8)/32,tempvel*.5, 115/255,73/255,12/255, .1, 1);
-               }
-               if(owner!=-1) {
-                       player[owner].weaponactive=-1;
-                       player[owner].num_weapons--;
-                       if(player[owner].num_weapons) {
-                               player[owner].weaponids[0]=player[owner].weaponids[player[owner].num_weapons];
-                               if(player[owner].weaponstuck==player[owner].num_weapons)
-                                       player[owner].weaponstuck=0;
-                       }
-               }
-               owner=-1;
-               hitsomething=0;
-               missed=1;
-               freetime=0;
-               firstfree=1;
-               position=0;
-               physics=0;
-       }
-       oldposition=position;
-       oldtippoint=tippoint;
-       if(owner==-1 && (velocity.x||velocity.y||velocity.z) && !physics) { // if the weapon is flying
-               position+=velocity*multiplier;
-               tippoint+=velocity*multiplier;
-               whichpatchx=position.x/(terrain.size/subdivision*terrain.scale);
-               whichpatchz=position.z/(terrain.size/subdivision*terrain.scale);
-               if(whichpatchx>0 && whichpatchz>0 && whichpatchx<subdivision && whichpatchz<subdivision) {
-                       if(terrain.patchobjectnum[whichpatchx][whichpatchz]) { // if there are objects where the weapon is
-                               for(int j=0;j<terrain.patchobjectnum[whichpatchx][whichpatchz];j++) { // check for collision
-                                       int k=terrain.patchobjects[whichpatchx][whichpatchz][j];
-                                       start=oldtippoint;
-                                       end=tippoint;
-                                       whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
-                                       if(whichhit!=-1) {
-                                               if(objects.type[k]==treetrunktype){
-                                                       objects.model[k].MakeDecal(breakdecal,DoRotation(colpoint-objects.position[k],0,-objects.yaw[k],0),.1,1,Random()%360);
-                                                       normalrot=DoRotation(objects.model[k].facenormals[whichhit],0,objects.yaw[k],0);
-                                                       velocity=0;
-                                                       if(type==knife)
-                                                               position=colpoint-normalrot*.1;
-                                                       else if(type==sword)
-                                                               position=colpoint-normalrot*.2;
-                                                       else if(type==staff)
-                                                               position=colpoint-normalrot*.2;
-                                                       XYZ temppoint1,temppoint2,tempforward;
-                                                       float distance;
-
-                                                       temppoint1=0;
-                                                       temppoint2=normalrot;
-                                                       distance=findDistance(&temppoint1,&temppoint2);
-                                                       rotation2=asin((temppoint1.y-temppoint2.y)/distance);
-                                                       rotation2*=360/6.28;
-                                                       temppoint1.y=0;
-                                                       temppoint2.y=0;
-                                                       rotation1=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
-                                                       rotation1*=360/6.28;
-                                                       if(temppoint1.x>temppoint2.x)
-                                                               rotation1=360-rotation1;
-
-                                                       rotation3=0;
-                                                       smallrotation=90;
-                                                       smallrotation2=0;
-                                                       bigtilt=0;
-                                                       bigtilt2=0;
-                                                       bigrotation=0;
-
-                                                       emit_sound_at(knifesheathesound, position, 128.);
-
-                                                       bloody=0;
-
-                                                       Sprite::MakeSprite(cloudimpactsprite, position,velocity, 1,1,1, .8, .3);
-                                               }
-                                               else {
-                                                       physics=1;
-                                                       firstfree=1;
-                                                       position-=velocity*multiplier;
-                                                       tippoint-=velocity*multiplier;
-                                                       tipvelocity=velocity;
-                                               }
-                                       }
-                               }
-                       }
-               }
-               
-               if(velocity.x||velocity.y||velocity.z) {
-                       for(int j=0;j<numplayers;j++) {
-                               footvel=0;
-                               footpoint=DoRotation((player[j].jointPos(abdomen)+player[j].jointPos(neck))/2,0,player[j].yaw,0)*player[j].scale+player[j].coords;
-                               if(owner==-1 && distsqflat(&position,&player[j].coords)<1.5 && 
-                               distsq(&position,&player[j].coords)<4 && player[j].weaponstuck==-1 &&
-                               !player[j].skeleton.free && j!=oldowner) {
-                                       if((player[j].aitype!=attacktypecutoff||abs(Random()%6)==0||(player[j].animTarget!=backhandspringanim&&player[j].animTarget!=rollanim&&player[j].animTarget!=flipanim&&Random()%2==0))&&!missed) {
-                                               if( (player[j].creature==wolftype       &&      Random()%3!=0 && player[j].weaponactive==-1 && (player[j].isIdle()||player[j].isRun()||player[j].animTarget==walkanim))||
-                                                       (player[j].creature==rabbittype &&      Random()%2==0 && player[j].aitype==attacktypecutoff && player[j].weaponactive==-1)) {
-                                                       emit_sound_at(knifedrawsound, player[j].coords, 128.);
-
-                                                       player[j].weaponactive=0;
-                                                       player[j].animTarget=removeknifeanim;
-                                                       player[j].frameTarget=1;
-                                                       player[j].target=1;
-                                                       owner=player[j].id;
-                                                       if(player[j].num_weapons>0){
-                                                               player[j].weaponids[player[j].num_weapons]=player[j].weaponids[0];
-                                                       }
-                                                       player[j].num_weapons++;
-                                                       player[j].weaponids[0]=i;
-
-                                                       player[j].aitype=attacktypecutoff;
-                                               }
-                                               else {
-                                                       if(j!=0) numthrowkill++;
-                                                       player[j].num_weapons++;
-                                                       player[j].weaponstuck=player[j].num_weapons-1;
-                                                       if(normaldotproduct(player[j].facing,velocity)>0)
-                                                               player[j].weaponstuckwhere=1;
-                                                       else
-                                                               player[j].weaponstuckwhere=0;
-
-                                                       player[j].weaponids[player[j].num_weapons-1]=i;
-
-                                                       player[j].RagDoll(0);
-                                                       player[j].jointVel(abdomen)+=velocity*2;
-                                                       player[j].jointVel(neck)+=velocity*2;
-                                                       player[j].jointVel(rightshoulder)+=velocity*2;
-                                                       player[j].jointVel(leftshoulder)+=velocity*2;
-                                                       if(bloodtoggle&&tutoriallevel!=1)
-                                                               Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3);
-                                                       if(tutoriallevel==1)
-                                                               Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,1,1, .8, .3);
-                                                       footvel=tippoint-position;
-                                                       Normalise(&footvel);
-                                                       if(bloodtoggle&&tutoriallevel!=1)
-                                                               Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*-1, 1,0,0, .6, 1);
-
-                                                       if(tutoriallevel!=1) {
-                                                               if(player[j].weaponstuckwhere==0)
-                                                                       player[j].DoBloodBig(2,205);
-                                                               if(player[j].weaponstuckwhere==1)
-                                                                       player[j].DoBloodBig(2,200);
-                                                               player[j].damage+=200/player[j].armorhigh;
-                                                               player[j].deathbleeding=1;
-                                                               player[j].bloodloss+=(200+abs((float)(Random()%40))-20)/player[j].armorhigh;
-                                                               owner=j;
-                                                               bloody=2;
-                                                               blooddrip=5;
-                                                       }
-
-                                                       emit_sound_at(fleshstabsound, position, 128.);
-
-                                                       if(animation[player[0].animTarget].height==highheight)
-                                                         award_bonus(0, ninja);
-                                                       else
-                                                         award_bonus(0, Bullseyebonus);
-                                               }
-                                       }
-                                       else missed=1;
-                               }
-                       }
-               }
-               if(position.y<terrain.getHeight(position.x,position.z)) {
-                       if(terrain.getOpacity(position.x,position.z)<.2) {
-                               velocity=0;
-                               if(terrain.lineTerrain(oldposition,position,&colpoint)!=-1) {
-                                       position=colpoint*terrain.scale;
-                               } else {
-                                       position.y=terrain.getHeight(position.x,position.z);
-                               }
-
-                               terrain.MakeDecal(shadowdecalpermanent,position,.06,.5,0);
-                               normalrot=terrain.getNormal(position.x,position.z)*-1;
-                               velocity=0;
-                               glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                               glPushMatrix();
-                                       GLfloat M[16];
-                                       glLoadIdentity();
-                                       glRotatef(bigrotation,0,1,0);
-                                       glRotatef(bigtilt2,1,0,0);
-                                       glRotatef(bigtilt,0,0,1);
-                                       glRotatef(-rotation1+90,0,1,0);
-                                       glRotatef(-rotation2+90,0,0,1);
-                                       glRotatef(-rotation3,0,1,0);
-                                       glRotatef(smallrotation,1,0,0);
-                                       glRotatef(smallrotation2,0,1,0);
-                                       glTranslatef(0,0,1);
-                                       glGetFloatv(GL_MODELVIEW_MATRIX,M);
-                                       tippoint.x=M[12];
-                                       tippoint.y=M[13];
-                                       tippoint.z=M[14];
-                               glPopMatrix();
-                               position-=tippoint*.15;
-                               XYZ temppoint1,temppoint2,tempforward;
-
-                               rotation3=0;
-                               smallrotation=90;
-                               smallrotation2=0;
-                               bigtilt=0;
-                               bigtilt2=0;
-                               bigrotation=0;
-
-                               emit_sound_at(knifesheathesound, position, 128.);
-
-                               XYZ terrainlight;
-                               terrainlight=terrain.getLighting(position.x,position.z);
-                               if(environment==snowyenvironment){
-                                       if(distsq(&position,&viewer)<viewdistance*viewdistance/4)
-                                               Sprite::MakeSprite(cloudsprite, position,velocity, terrainlight.x,terrainlight.y,terrainlight.z, .5, .7);
-                               }
-                               else if(environment==grassyenvironment){
-                                       if(distsq(&position,&viewer)<viewdistance*viewdistance/4)
-                                               Sprite::MakeSprite(cloudsprite, position,velocity, terrainlight.x*90/255,terrainlight.y*70/255,terrainlight.z*8/255, .5, .5);
-                               }
-                               else if(environment==desertenvironment){
-                                       if(distsq(&position,&viewer)<viewdistance*viewdistance/4)
-                                               Sprite::MakeSprite(cloudsprite, position,velocity, terrainlight.x*190/255,terrainlight.y*170/255,terrainlight.z*108/255, .5, .7);
-                               }
-
-                               bloody=0;
-                       }
-                       else {
-                               physics=1;
-                               firstfree=1;
-                               position-=velocity*multiplier;
-                               tippoint-=velocity*multiplier;
-                               tipvelocity=velocity;
-                       }
-               }
-               if(velocity.x!=0||velocity.z!=0||velocity.y!=0) {
-                       velocity.y+=gravity*multiplier;
-
-                       XYZ temppoint1,temppoint2,tempforward;
-                       float distance;
-
-                       temppoint1=0;
-                       temppoint2=velocity;
-                       distance=findDistance(&temppoint1,&temppoint2);
-                       rotation2=asin((temppoint1.y-temppoint2.y)/distance);
-                       rotation2*=360/6.28;
-                       temppoint1.y=0;
-                       temppoint2.y=0;
-                       rotation1=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
-                       rotation1*=360/6.28;
-                       rotation3=0;
-                       smallrotation=90;
-                       smallrotation2=0;
-                       bigtilt=0;
-                       bigtilt2=0;
-                       bigrotation=0;
-                       if(temppoint1.x>temppoint2.x) rotation1=360-rotation1;
-               }
-
-       }
-       
-       //Sword physics
-       XYZ mid;
-       XYZ oldmid;
-       XYZ oldmid2;
-
-       tempmult=multiplier;
-       multiplier/=10;
-       for(int l=0;l<10;l++) {
-               if(owner==-1&&(velocity.x||velocity.y||velocity.z)&&physics) {
-                       //move
-                       position+=velocity*multiplier;
-                       tippoint+=tipvelocity*multiplier;
-
-                       //Length constrain
-                       midp=(position*mass+tippoint*tipmass)/(mass+tipmass);
-                       vel=tippoint-midp;
-                       Normalise(&vel);
-                       newpoint1=midp-vel*length*(tipmass/(mass+tipmass));
-                       newpoint2=midp+vel*length*(mass/(mass+tipmass));
-                       if(!freeze){
-                               if(freetime>.04) {
-                                       velocity=velocity+(newpoint1-position)/multiplier;
-                                       tipvelocity=tipvelocity+(newpoint2-tippoint)/multiplier;
-                               }
-                       }
-                       position=newpoint1;
-                       tippoint=newpoint2;
-
-
-                       //Object collisions
-                       whichpatchx=(position.x)/(terrain.size/subdivision*terrain.scale);
-                       whichpatchz=(position.z)/(terrain.size/subdivision*terrain.scale);
-                       if(whichpatchx>0&&whichpatchz>0&&whichpatchx<subdivision&&whichpatchz<subdivision)
-                               if(terrain.patchobjectnum[whichpatchx][whichpatchz]) {
-                                       for(int j=0;j<terrain.patchobjectnum[whichpatchx][whichpatchz];j++) {
-                                               int k=terrain.patchobjects[whichpatchx][whichpatchz][j];
-
-                                               if(firstfree) {
-                                                       if(type==staff) {
-                                                               start=tippoint-(position-tippoint)/5;
-                                                               end=position+(position-tippoint)/30;
-                                                               whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
-                                                               if(whichhit!=-1) {
-                                                                       XYZ diff;
-                                                                       diff=(colpoint-position);
-                                                                       Normalise(&diff);
-                                                                       hitsomething=1;
-
-                                                                       tippoint+=(colpoint-position)+diff*.05;
-                                                                       position=colpoint+diff*.05;
-                                                                       oldtippoint=tippoint;
-                                                                       oldposition=tippoint;
-                                                               }
-                                                       } else {
-                                                               start=position-(tippoint-position)/5;
-                                                               end=tippoint+(tippoint-position)/30;
-                                                               whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
-                                                               if(whichhit!=-1){
-                                                                       XYZ diff;
-                                                                       diff=(colpoint-tippoint);
-                                                                       Normalise(&diff);
-                                                                       hitsomething=1;
-
-                                                                       position+=(colpoint-tippoint)+diff*.05;
-                                                                       tippoint=colpoint+diff*.05;
-                                                                       oldposition=position;
-                                                                       oldtippoint=tippoint;
-                                                               }
-                                                       }
-                                               }
-
-                                               start=oldposition;
-                                               end=position;
-                                               whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
-                                               if(whichhit!=-1) {
-                                                       hitsomething=1;
-                                                       position=colpoint;
-                                                       terrainnormal=DoRotation(objects.model[k].facenormals[whichhit],0,objects.yaw[k],0)*-1;
-                                                       ReflectVector(&velocity,&terrainnormal);
-                                                       position+=terrainnormal*.002;
-
-                                                       bounceness=terrainnormal*findLength(&velocity)*(abs(normaldotproduct(velocity,terrainnormal)));
-                                                       if(findLengthfast(&velocity)<findLengthfast(&bounceness))
-                                                               bounceness=0;
-                                                       frictionness=abs(normaldotproduct(velocity,terrainnormal));
-                                                       velocity-=bounceness;
-                                                       if(1-friction*frictionness>0)velocity*=1-friction*frictionness;
-                                                       else velocity=0;
-                                                       velocity+=bounceness*elasticity;
-
-                                                       if(findLengthfast(&bounceness)>1) {
-                                                               int whichsound;
-                                                               if(type==staff)
-                                                                       whichsound=footstepsound3+abs(Random()%2);
-                                                               else
-                                                                       whichsound=clank1sound+abs(Random()%4);
-                                                               emit_sound_at(whichsound, position, 128*findLengthfast(&bounceness));
-                                                       }
-                                               }
-                                               start=oldtippoint;
-                                               end=tippoint;
-                                               whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
-                                               if(whichhit!=-1) {
-                                                       hitsomething=1;
-                                                       tippoint=colpoint;
-                                                       terrainnormal=DoRotation(objects.model[k].facenormals[whichhit],0,objects.yaw[k],0)*-1;
-                                                       ReflectVector(&tipvelocity,&terrainnormal);
-                                                       tippoint+=terrainnormal*.002;
-
-                                                       bounceness=terrainnormal*findLength(&tipvelocity)*(abs(normaldotproduct(tipvelocity,terrainnormal)));
-                                                       if(findLengthfast(&tipvelocity)<findLengthfast(&bounceness))bounceness=0;
-                                                       frictionness=abs(normaldotproduct(tipvelocity,terrainnormal));
-                                                       tipvelocity-=bounceness;
-                                                       if(1-friction*frictionness>0)tipvelocity*=1-friction*frictionness;
-                                                       else tipvelocity=0;
-                                                       tipvelocity+=bounceness*elasticity;
-
-                                                       if(findLengthfast(&bounceness)>1){
-                                                               int whichsound;
-                                                               if(type==staff)
-                                                                       whichsound=footstepsound3+abs(Random()%2);
-                                                               else
-                                                                       whichsound=clank1sound+abs(Random()%4);
-                                                               emit_sound_at(whichsound, position, 128*findLengthfast(&bounceness));
-                                                       }
-                                               }
-
-                                               if((objects.type[k]!=boxtype && objects.type[k]!=platformtype && objects.type[k]!=walltype && objects.type[k]!=weirdtype)||objects.pitch[k]!=0)
-                                                       for(int m=0;m<2;m++){
-                                                               mid=(position*(21+(float)m*10)+tippoint*(19-(float)m*10))/40;
-                                                               oldmid2=mid;
-                                                               oldmid=(oldposition*(21+(float)m*10)+oldtippoint*(19-(float)m*10))/40;
-
-                                                               start=oldmid;
-                                                               end=mid;
-                                                               whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
-                                                               if(whichhit!=-1) {
-                                                                       hitsomething=1;
-                                                                       mid=colpoint;
-                                                                       terrainnormal=DoRotation(objects.model[k].facenormals[whichhit],0,objects.yaw[k],0)*-1;
-                                                                       ReflectVector(&velocity,&terrainnormal);
-
-                                                                       bounceness=terrainnormal*findLength(&velocity)*(abs(normaldotproduct(velocity,terrainnormal)));
-                                                                       if(findLengthfast(&velocity)<findLengthfast(&bounceness))bounceness=0;
-                                                                       frictionness=abs(normaldotproduct(velocity,terrainnormal));
-                                                                       velocity-=bounceness;
-                                                                       if(1-friction*frictionness>0)velocity*=1-friction*frictionness;
-                                                                       else velocity=0;
-                                                                       velocity+=bounceness*elasticity;
-
-                                                                       if(findLengthfast(&bounceness)>1){
-                                                                               int whichsound;
-                                                                               if(type==staff)
-                                                                                       whichsound=footstepsound3+abs(Random()%2);
-                                                                               else
-                                                                                       whichsound=clank1sound+abs(Random()%4);
-                                                                               emit_sound_at(whichsound, mid, 128*findLengthfast(&bounceness));
-                                                                       }
-                                                                       position+=(mid-oldmid2)*(20/(1+(float)m*10));
-                                                               }
-
-                                                               mid=(position*(19-(float)m*10)+tippoint*(21+(float)m*10))/40;
-                                                               oldmid2=mid;
-                                                               oldmid=(oldposition*(19-(float)m*10)+oldtippoint*(21+(float)m*10))/40;
-
-                                                               start=oldmid;
-                                                               end=mid;
-                                                               whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
-                                                               if(whichhit!=-1) {
-                                                                       hitsomething=1;
-                                                                       mid=colpoint;
-                                                                       terrainnormal=DoRotation(objects.model[k].facenormals[whichhit],0,objects.yaw[k],0)*-1;
-                                                                       ReflectVector(&tipvelocity,&terrainnormal);
-
-                                                                       bounceness=terrainnormal*findLength(&tipvelocity)*(abs(normaldotproduct(tipvelocity,terrainnormal)));
-                                                                       if(findLengthfast(&tipvelocity)<findLengthfast(&bounceness))bounceness=0;
-                                                                       frictionness=abs(normaldotproduct(tipvelocity,terrainnormal));
-                                                                       tipvelocity-=bounceness;
-                                                                       if(1-friction*frictionness>0)tipvelocity*=1-friction*frictionness;
-                                                                       else tipvelocity=0;
-                                                                       tipvelocity+=bounceness*elasticity;
-
-                                                                       if(findLengthfast(&bounceness)>1){
-                                                                               int whichsound;
-                                                                               if(type==staff)
-                                                                                       whichsound=footstepsound3+abs(Random()%2);
-                                                                               else
-                                                                                       whichsound=clank1sound+abs(Random()%4);
-                                                                               emit_sound_at(whichsound, mid, 128*findLengthfast(&bounceness));
-                                                                       }
-                                                                       tippoint+=(mid-oldmid2)*(20/(1+(float)m*10));
-                                                               }
-                                                       }
-                                               else
-                                               {
-                                                       start=position;
-                                                       end=tippoint;
-                                                       whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.yaw[k]);
-                                                       if(whichhit!=-1) {
-                                                               hitsomething=1;
-                                                               closestdistance=-1;
-                                                               closestswordpoint=colpoint;//(position+tippoint)/2;
-                                                               point[0]=DoRotation(objects.model[k].vertex[objects.model[k].Triangles[whichhit].vertex[0]],0,objects.yaw[k],0)+objects.position[k];
-                                                               point[1]=DoRotation(objects.model[k].vertex[objects.model[k].Triangles[whichhit].vertex[1]],0,objects.yaw[k],0)+objects.position[k];
-                                                               point[2]=DoRotation(objects.model[k].vertex[objects.model[k].Triangles[whichhit].vertex[2]],0,objects.yaw[k],0)+objects.position[k];
-                                                               if(DistancePointLine(&closestswordpoint, &point[0], &point[1], &distance,&colpoint )) {
-                                                                       if(distance<closestdistance||closestdistance==-1){
-                                                                               closestpoint=colpoint;
-                                                                               closestdistance=distance;
-                                                                       }
-                                                               }
-                                                               if(DistancePointLine(&closestswordpoint, &point[1], &point[2], &distance,&colpoint )) {
-                                                                       if(distance<closestdistance||closestdistance==-1){
-                                                                               closestpoint=colpoint;
-                                                                               closestdistance=distance;
-                                                                       }
-                                                               }
-                                                               if(DistancePointLine(&closestswordpoint, &point[2], &point[0], &distance,&colpoint )) {
-                                                                       if(distance<closestdistance||closestdistance==-1){
-                                                                               closestpoint=colpoint;
-                                                                               closestdistance=distance;
-                                                                       }
-                                                               }
-                                                               if(closestdistance!=-1 && isnormal(closestdistance)) {
-                                                                       if(DistancePointLine(&closestpoint, &position, &tippoint, &distance,&colpoint )) {
-                                                                               closestswordpoint=colpoint;
-                                                                               velocity+=(closestpoint-closestswordpoint);
-                                                                               tipvelocity+=(closestpoint-closestswordpoint);
-                                                                               position+=(closestpoint-closestswordpoint);
-                                                                               tippoint+=(closestpoint-closestswordpoint);
-                                                                       }
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
-                               //Terrain collisions
-                               whichhit=terrain.lineTerrain(oldposition,position,&colpoint);
-                               if(whichhit!=-1||position.y<terrain.getHeight(position.x,position.z)) {
-                                       hitsomething=1;
-                                       if(whichhit!=-1)
-                                               position=colpoint*terrain.scale;
-                                       else
-                                               position.y=terrain.getHeight(position.x,position.z);
-
-                                       terrainnormal=terrain.getNormal(position.x,position.z);
-                                       ReflectVector(&velocity,&terrainnormal);
-                                       position+=terrainnormal*.002;
-                                       bounceness=terrainnormal*findLength(&velocity)*(abs(normaldotproduct(velocity,terrainnormal)));
-                                       if(findLengthfast(&velocity)<findLengthfast(&bounceness))bounceness=0;
-                                       frictionness=abs(normaldotproduct(velocity,terrainnormal));
-                                       velocity-=bounceness;
-                                       if(1-friction*frictionness>0)velocity*=1-friction*frictionness;
-                                       else velocity=0;
-                                       if(terrain.getOpacity(position.x,position.z)<.2)velocity+=bounceness*elasticity*.3;
-                                       else velocity+=bounceness*elasticity;
-
-                                       if(findLengthfast(&bounceness)>1) {
-                                               int whichsound;
-                                               if(terrain.getOpacity(position.x,position.z)>.2){
-                                                       if(type==staff)
-                                                               whichsound=footstepsound3+abs(Random()%2);
-                                                       else
-                                                               whichsound=clank1sound+abs(Random()%4);
-                                               } else {
-                                                       whichsound=footstepsound+abs(Random()%2);
-                                               }
-                                               emit_sound_at(whichsound, position,
-                                                                 findLengthfast(&bounceness)
-                                                                 * (terrain.getOpacity(position.x,position.z) > .2 ? 128. : 32.));
-
-                                               if(terrain.getOpacity(position.x,position.z)<.2) {
-                                                       XYZ terrainlight;
-                                                       terrainlight=terrain.getLighting(position.x,position.z);
-                                                       if(environment==snowyenvironment){
-                                                               if(distsq(&position,&viewer)<viewdistance*viewdistance/4)
-                                                                       Sprite::MakeSprite(cloudsprite, position,velocity, terrainlight.x,terrainlight.y,terrainlight.z, .5, .7);
-                                                       }
-                                                       else if(environment==grassyenvironment){
-                                                               if(distsq(&position,&viewer)<viewdistance*viewdistance/4)
-                                                                       Sprite::MakeSprite(cloudsprite, position,velocity, terrainlight.x*90/255,terrainlight.y*70/255,terrainlight.z*8/255, .5, .5);
-                                                       }
-                                                       else if(environment==desertenvironment){
-                                                               if(distsq(&position,&viewer)<viewdistance*viewdistance/4)
-                                                                       Sprite::MakeSprite(cloudsprite, position,velocity, terrainlight.x*190/255,terrainlight.y*170/255,terrainlight.z*108/255, .5, .7);
-                                                       }
-                                               }
-                                       }
-                               }
-                               whichhit=terrain.lineTerrain(oldtippoint,tippoint,&colpoint);
-                               if(whichhit!=-1||tippoint.y<terrain.getHeight(tippoint.x,tippoint.z)) {
-                                       if(whichhit!=-1)
-                                               tippoint=colpoint*terrain.scale;
-                                       else
-                                               tippoint.y=terrain.getHeight(tippoint.x,tippoint.z);
-
-                                       terrainnormal=terrain.getNormal(tippoint.x,tippoint.z);
-                                       ReflectVector(&tipvelocity,&terrainnormal);
-                                       tippoint+=terrainnormal*.002;
-                                       bounceness=terrainnormal*findLength(&tipvelocity)*(abs(normaldotproduct(tipvelocity,terrainnormal)));
-                                       if(findLengthfast(&tipvelocity)<findLengthfast(&bounceness))bounceness=0;
-                                       frictionness=abs(normaldotproduct(tipvelocity,terrainnormal));
-                                       tipvelocity-=bounceness;
-                                       if(1-friction*frictionness>0)tipvelocity*=1-friction*frictionness;
-                                       else tipvelocity=0;
-                                       if(terrain.getOpacity(tippoint.x,tippoint.z)<.2)tipvelocity+=bounceness*elasticity*.3;
-                                       else tipvelocity+=bounceness*elasticity;
-
-                                       if(findLengthfast(&bounceness)>1){ 
-                                               int whichsound;
-                                               if(terrain.getOpacity(tippoint.x,tippoint.z)>.2){
-                                                       if(type==staff)
-                                                               whichsound=footstepsound3+abs(Random()%2);
-                                                       else
-                                                               whichsound=clank1sound+abs(Random()%4);
-                                               } else {
-                                                       whichsound=footstepsound+abs(Random()%2);
-                                               }
-                                               emit_sound_at(whichsound, tippoint,
-                                                                 findLengthfast(&bounceness)
-                                                                 * (terrain.getOpacity(tippoint.x,tippoint.z) > .2  ? 128. : 32.));
-
-                                               if(terrain.getOpacity(tippoint.x,tippoint.z)<.2) {
-                                                       XYZ terrainlight;
-                                                       terrainlight=terrain.getLighting(tippoint.x,tippoint.z);
-                                                       if(environment==snowyenvironment){
-                                                               if(distsq(&tippoint,&viewer)<viewdistance*viewdistance/4)
-                                                                       Sprite::MakeSprite(cloudsprite, tippoint,tipvelocity, terrainlight.x,terrainlight.y,terrainlight.z, .5, .7);
-                                                       }
-                                                       else if(environment==grassyenvironment){
-                                                               if(distsq(&tippoint,&viewer)<viewdistance*viewdistance/4)
-                                                                       Sprite::MakeSprite(cloudsprite, tippoint,tipvelocity, terrainlight.x*90/255,terrainlight.y*70/255,terrainlight.z*8/255, .5, .5);
-                                                       }
-                                                       else if(environment==desertenvironment){
-                                                               if(distsq(&tippoint,&viewer)<viewdistance*viewdistance/4)
-                                                                       Sprite::MakeSprite(cloudsprite, tippoint,tipvelocity, terrainlight.x*190/255,terrainlight.y*170/255,terrainlight.z*108/255, .5, .7);
-                                                       }
-                                               }
-                                       }
-                               }
-
-                               //Edges
-                               mid=position+tippoint;
-                               mid/=2;
-                               mid+=(position-mid)/20;
-                               oldmid=mid;
-                               if(mid.y<terrain.getHeight(mid.x,mid.z)){
-                                       hitsomething=1;
-                                       mid.y=terrain.getHeight(mid.x,mid.z);
-
-                                       terrainnormal=terrain.getNormal(mid.x,mid.z);
-                                       ReflectVector(&velocity,&terrainnormal);
-                                       //mid+=terrainnormal*.002;
-                                       bounceness=terrainnormal*findLength(&velocity)*(abs(normaldotproduct(velocity,terrainnormal)));
-                                       if(findLengthfast(&velocity)<findLengthfast(&bounceness))bounceness=0;
-                                       frictionness=abs(normaldotproduct(velocity,terrainnormal));
-                                       velocity-=bounceness;
-                                       if(1-friction*frictionness>0)velocity*=1-friction*frictionness;
-                                       else velocity=0;
-                                       if(terrain.getOpacity(mid.x,mid.z)<.2)velocity+=bounceness*elasticity*.3;
-                                       else velocity+=bounceness*elasticity;
-
-                                       if(findLengthfast(&bounceness)>1){
-                                               int whichsound;
-                                               if(terrain.getOpacity(mid.x,mid.z)>.2){
-                                                       if(type==staff)whichsound=footstepsound3+abs(Random()%2);
-                                                       if(type!=staff)whichsound=clank1sound+abs(Random()%4);
-                                               }
-                                               else whichsound=footstepsound+abs(Random()%2);
-                                               emit_sound_at(whichsound, mid,
-                                                                 findLengthfast(&bounceness)
-                                                                 * (terrain.getOpacity(position.x,position.z) > .2
-                                                                ? 128.
-                                                                : 32.));
-                                       }
-                                       position+=(mid-oldmid)*20;
-                               }
-
-                               mid=position+tippoint;
-                               mid/=2;
-                               mid+=(tippoint-mid)/20;
-                               oldmid=mid;
-                               if(mid.y<terrain.getHeight(mid.x,mid.z)){
-                                       hitsomething=1;
-                                       mid.y=terrain.getHeight(mid.x,mid.z);
-
-                                       terrainnormal=terrain.getNormal(mid.x,mid.z);
-                                       ReflectVector(&tipvelocity,&terrainnormal);
-                                       //mid+=terrainnormal*.002;
-                                       bounceness=terrainnormal*findLength(&tipvelocity)*(abs(normaldotproduct(tipvelocity,terrainnormal)));
-                                       if(findLengthfast(&tipvelocity)<findLengthfast(&bounceness))bounceness=0;
-                                       frictionness=abs(normaldotproduct(tipvelocity,terrainnormal));
-                                       tipvelocity-=bounceness;
-                                       if(1-friction*frictionness>0)tipvelocity*=1-friction*frictionness;
-                                       else tipvelocity=0;
-                                       if(terrain.getOpacity(mid.x,mid.z)<.2)tipvelocity+=bounceness*elasticity*.3;
-                                       else tipvelocity+=bounceness*elasticity;
-
-                                       if(findLengthfast(&bounceness)>1){
-                                               int whichsound;
-                                               if(terrain.getOpacity(mid.x,mid.z)>.2){
-                                                       if(type==staff)whichsound=footstepsound3+abs(Random()%2);
-                                                       if(type!=staff)whichsound=clank1sound+abs(Random()%4);
-                                               }
-                                               else whichsound=footstepsound+abs(Random()%2);
-                                               emit_sound_at(whichsound, mid,
-                                                                 findLengthfast(&bounceness)
-                                                                 * (terrain.getOpacity(position.x,position.z) > .2
-                                                                ? 128.
-                                                                : 32.));
-                                       }
-                                       tippoint+=(mid-oldmid)*20;
-                               }
-                               //Gravity
-                               velocity.y+=gravity*multiplier;
-                               tipvelocity.y+=gravity*multiplier;
-
-                               //Rotation
-                               XYZ temppoint1,temppoint2,tempforward;
-                               float distance;
-
-                               temppoint1=position;
-                               temppoint2=tippoint;
-                               distance=findDistance(&temppoint1,&temppoint2);
-                               rotation2=asin((temppoint1.y-temppoint2.y)/distance);
-                               rotation2*=360/6.28;
-                               temppoint1.y=0;
-                               temppoint2.y=0;
-                               rotation1=acos((temppoint1.z-temppoint2.z)/findDistance(&temppoint1,&temppoint2));
-                               rotation1*=360/6.28;
-                               rotation3=0;
-                               smallrotation=90;
-                               smallrotation2=0;
-                               bigtilt=0;
-                               bigtilt2=0;
-                               bigrotation=0;
-                               if(temppoint1.x>temppoint2.x)rotation1=360-rotation1;
-
-                               //Stop moving
-                               if(findLengthfast(&velocity)<.3&&findLengthfast(&tipvelocity)<.3&&hitsomething){
-                                       freetime+=multiplier;
-                               }
-
-                               if(freetime>.4){
-                                       velocity=0;
-                                       tipvelocity=0;
-                               }
-                               firstfree=0;
-               }
-       }
-       multiplier=tempmult;
-       if(blooddrip && bloody) {
-               blooddripdelay-=blooddrip*multiplier/2;
-               blooddrip-=multiplier;
-               if(blooddrip<0) blooddrip=0;
-               if(blooddrip>5) blooddrip=5;
-               if(blooddripdelay<0 && bloodtoggle) {
-                       blooddripdelay=1;
-                       XYZ bloodvel;
-                       XYZ bloodloc;
-                       bloodloc=position+(tippoint-position)*.7;
-                       bloodloc.y-=.05;
-                       if(bloodtoggle) {
-                               bloodvel=0;
-                               Sprite::MakeSprite(bloodsprite, bloodloc,bloodvel, 1,1,1, .03, 1);
-                       }
-               }
-       }
-       if(onfire) {
-               flamedelay-=multiplier;
-               if(onfire&&flamedelay<=0) {
-                       flamedelay=.020;
-                       flamedelay-=multiplier;
-                       normalrot=0;
-                       if(owner!=-1) {
-                               normalrot=player[owner].velocity;
-                       }
-                       normalrot.y+=1;
-                       if(owner!=-1) {
-                               if(player[owner].onterrain) {
-                                       normalrot.y=1;
-                               }
-                       }
-                       Sprite::MakeSprite(weaponflamesprite, position+tippoint*(((float)abs(Random()%100))/600+.05),normalrot, 1,1,1, (.6+(float)abs(Random()%100)/200-.25)*1/3, 1);
-                       Sprite::setLastSpriteSpeed(4);
-                       Sprite::setLastSpriteAlivetime(.3);
-               }
-       }
-
-       if(!onfire && owner==-1 && type!=staff) {
-               flamedelay-=multiplier;
-               if(flamedelay<=0) {
-                       flamedelay=.020;
-                       flamedelay-=multiplier;
-                       normalrot=0;
-                       if(Random()%50==0&&distsq(&position,&viewer)>80) {
-                               XYZ shinepoint;
-                               shinepoint=position+(tippoint-position)*(((float)abs(Random()%100))/100);
-                               Sprite::MakeSprite(weaponshinesprite, shinepoint,normalrot, 1,1,1, (.1+(float)abs(Random()%100)/200-.25)*1/3*fast_sqrt(findDistance(&shinepoint,&viewer)), 1);
-                               Sprite::setLastSpriteSpeed(4);
-                               Sprite::setLastSpriteAlivetime(.3);
-                       }
-               }
-       }
+void Weapon::DoStuff(int i)
+{
+    //~ cout << position.x << "," << position.y << "," << position.z << "|" << tippoint.x << "," << tippoint.y << "," << tippoint.z << endl;
+    static int whichpatchx, whichpatchz, whichhit;
+    static XYZ start, end, colpoint, normalrot, footvel, footpoint;
+    static XYZ terrainnormal;
+    static XYZ vel;
+    static XYZ midp;
+    static XYZ newpoint1, newpoint2;
+    static float friction = 3.5;
+    static float elasticity = .4;
+    static XYZ bounceness;
+    static float frictionness;
+    static float closestdistance;
+    static float distance;
+    static XYZ point[3];
+    static XYZ closestpoint;
+    static XYZ closestswordpoint;
+    static XYZ extramove;
+    static float tempmult;
+
+    if (owner != -1) {
+        oldowner = owner;
+    }
+    if (damage >= 2 && type == staff && owner != -1) { // the staff breaks
+        emit_sound_at(staffbreaksound, tippoint);
+        XYZ tempvel;
+        for (int j = 0; j < 40; j++) {
+            tempvel.x = float(abs(Random() % 100) - 50) / 20;
+            tempvel.y = float(abs(Random() % 100) - 50) / 20;
+            tempvel.z = float(abs(Random() % 100) - 50) / 20;
+            Sprite::MakeSprite(splintersprite, position + (tippoint - position) * ((float)j - 8) / 32, tempvel * .5, 115 / 255, 73 / 255, 12 / 255, .1, 1);
+        }
+        if (owner != -1) {
+            player[owner].weaponactive = -1;
+            player[owner].num_weapons--;
+            if (player[owner].num_weapons) {
+                player[owner].weaponids[0] = player[owner].weaponids[player[owner].num_weapons];
+                if (player[owner].weaponstuck == player[owner].num_weapons)
+                    player[owner].weaponstuck = 0;
+            }
+        }
+        owner = -1;
+        hitsomething = 0;
+        missed = 1;
+        freetime = 0;
+        firstfree = 1;
+        position = 0;
+        physics = 0;
+    }
+    oldposition = position;
+    oldtippoint = tippoint;
+    if (owner == -1 && (velocity.x || velocity.y || velocity.z) && !physics) { // if the weapon is flying
+        position += velocity * multiplier;
+        tippoint += velocity * multiplier;
+        whichpatchx = position.x / (terrain.size / subdivision * terrain.scale);
+        whichpatchz = position.z / (terrain.size / subdivision * terrain.scale);
+        if (whichpatchx > 0 && whichpatchz > 0 && whichpatchx < subdivision && whichpatchz < subdivision) {
+            if (terrain.patchobjectnum[whichpatchx][whichpatchz]) { // if there are objects where the weapon is
+                for (int j = 0; j < terrain.patchobjectnum[whichpatchx][whichpatchz]; j++) { // check for collision
+                    int k = terrain.patchobjects[whichpatchx][whichpatchz][j];
+                    start = oldtippoint;
+                    end = tippoint;
+                    whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+                    if (whichhit != -1) {
+                        if (objects.type[k] == treetrunktype) {
+                            objects.model[k].MakeDecal(breakdecal, DoRotation(colpoint - objects.position[k], 0, -objects.yaw[k], 0), .1, 1, Random() % 360);
+                            normalrot = DoRotation(objects.model[k].facenormals[whichhit], 0, objects.yaw[k], 0);
+                            velocity = 0;
+                            if (type == knife)
+                                position = colpoint - normalrot * .1;
+                            else if (type == sword)
+                                position = colpoint - normalrot * .2;
+                            else if (type == staff)
+                                position = colpoint - normalrot * .2;
+                            XYZ temppoint1, temppoint2, tempforward;
+                            float distance;
+
+                            temppoint1 = 0;
+                            temppoint2 = normalrot;
+                            distance = findDistance(&temppoint1, &temppoint2);
+                            rotation2 = asin((temppoint1.y - temppoint2.y) / distance);
+                            rotation2 *= 360 / 6.28;
+                            temppoint1.y = 0;
+                            temppoint2.y = 0;
+                            rotation1 = acos((temppoint1.z - temppoint2.z) / findDistance(&temppoint1, &temppoint2));
+                            rotation1 *= 360 / 6.28;
+                            if (temppoint1.x > temppoint2.x)
+                                rotation1 = 360 - rotation1;
+
+                            rotation3 = 0;
+                            smallrotation = 90;
+                            smallrotation2 = 0;
+                            bigtilt = 0;
+                            bigtilt2 = 0;
+                            bigrotation = 0;
+
+                            emit_sound_at(knifesheathesound, position, 128.);
+
+                            bloody = 0;
+
+                            Sprite::MakeSprite(cloudimpactsprite, position, velocity, 1, 1, 1, .8, .3);
+                        } else {
+                            physics = 1;
+                            firstfree = 1;
+                            position -= velocity * multiplier;
+                            tippoint -= velocity * multiplier;
+                            tipvelocity = velocity;
+                        }
+                    }
+                }
+            }
+        }
+
+        if (velocity.x || velocity.y || velocity.z) {
+            for (int j = 0; j < numplayers; j++) {
+                footvel = 0;
+                footpoint = DoRotation((player[j].jointPos(abdomen) + player[j].jointPos(neck)) / 2, 0, player[j].yaw, 0) * player[j].scale + player[j].coords;
+                if (owner == -1 && distsqflat(&position, &player[j].coords) < 1.5 &&
+                        distsq(&position, &player[j].coords) < 4 && player[j].weaponstuck == -1 &&
+                        !player[j].skeleton.free && j != oldowner) {
+                    if ((player[j].aitype != attacktypecutoff || abs(Random() % 6) == 0 || (player[j].animTarget != backhandspringanim && player[j].animTarget != rollanim && player[j].animTarget != flipanim && Random() % 2 == 0)) && !missed) {
+                        if ( (player[j].creature == wolftype   &&      Random() % 3 != 0 && player[j].weaponactive == -1 && (player[j].isIdle() || player[j].isRun() || player[j].animTarget == walkanim)) ||
+                                (player[j].creature == rabbittype      &&      Random() % 2 == 0 && player[j].aitype == attacktypecutoff && player[j].weaponactive == -1)) {
+                            emit_sound_at(knifedrawsound, player[j].coords, 128.);
+
+                            player[j].weaponactive = 0;
+                            player[j].animTarget = removeknifeanim;
+                            player[j].frameTarget = 1;
+                            player[j].target = 1;
+                            owner = player[j].id;
+                            if (player[j].num_weapons > 0) {
+                                player[j].weaponids[player[j].num_weapons] = player[j].weaponids[0];
+                            }
+                            player[j].num_weapons++;
+                            player[j].weaponids[0] = i;
+
+                            player[j].aitype = attacktypecutoff;
+                        } else {
+                            if (j != 0) numthrowkill++;
+                            player[j].num_weapons++;
+                            player[j].weaponstuck = player[j].num_weapons - 1;
+                            if (normaldotproduct(player[j].facing, velocity) > 0)
+                                player[j].weaponstuckwhere = 1;
+                            else
+                                player[j].weaponstuckwhere = 0;
+
+                            player[j].weaponids[player[j].num_weapons - 1] = i;
+
+                            player[j].RagDoll(0);
+                            player[j].jointVel(abdomen) += velocity * 2;
+                            player[j].jointVel(neck) += velocity * 2;
+                            player[j].jointVel(rightshoulder) += velocity * 2;
+                            player[j].jointVel(leftshoulder) += velocity * 2;
+                            if (bloodtoggle && tutoriallevel != 1)
+                                Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .8, .3);
+                            if (tutoriallevel == 1)
+                                Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 1, 1, .8, .3);
+                            footvel = tippoint - position;
+                            Normalise(&footvel);
+                            if (bloodtoggle && tutoriallevel != 1)
+                                Sprite::MakeSprite(bloodflamesprite, footpoint, footvel * -1, 1, 0, 0, .6, 1);
+
+                            if (tutoriallevel != 1) {
+                                if (player[j].weaponstuckwhere == 0)
+                                    player[j].DoBloodBig(2, 205);
+                                if (player[j].weaponstuckwhere == 1)
+                                    player[j].DoBloodBig(2, 200);
+                                player[j].damage += 200 / player[j].armorhigh;
+                                player[j].deathbleeding = 1;
+                                player[j].bloodloss += (200 + abs((float)(Random() % 40)) - 20) / player[j].armorhigh;
+                                owner = j;
+                                bloody = 2;
+                                blooddrip = 5;
+                            }
+
+                            emit_sound_at(fleshstabsound, position, 128.);
+
+                            if (animation[player[0].animTarget].height == highheight)
+                                award_bonus(0, ninja);
+                            else
+                                award_bonus(0, Bullseyebonus);
+                        }
+                    } else missed = 1;
+                }
+            }
+        }
+        if (position.y < terrain.getHeight(position.x, position.z)) {
+            if (terrain.getOpacity(position.x, position.z) < .2) {
+                velocity = 0;
+                if (terrain.lineTerrain(oldposition, position, &colpoint) != -1) {
+                    position = colpoint * terrain.scale;
+                } else {
+                    position.y = terrain.getHeight(position.x, position.z);
+                }
+
+                terrain.MakeDecal(shadowdecalpermanent, position, .06, .5, 0);
+                normalrot = terrain.getNormal(position.x, position.z) * -1;
+                velocity = 0;
+                glMatrixMode(GL_MODELVIEW);                                                    // Select The Modelview Matrix
+                glPushMatrix();
+                GLfloat M[16];
+                glLoadIdentity();
+                glRotatef(bigrotation, 0, 1, 0);
+                glRotatef(bigtilt2, 1, 0, 0);
+                glRotatef(bigtilt, 0, 0, 1);
+                glRotatef(-rotation1 + 90, 0, 1, 0);
+                glRotatef(-rotation2 + 90, 0, 0, 1);
+                glRotatef(-rotation3, 0, 1, 0);
+                glRotatef(smallrotation, 1, 0, 0);
+                glRotatef(smallrotation2, 0, 1, 0);
+                glTranslatef(0, 0, 1);
+                glGetFloatv(GL_MODELVIEW_MATRIX, M);
+                tippoint.x = M[12];
+                tippoint.y = M[13];
+                tippoint.z = M[14];
+                glPopMatrix();
+                position -= tippoint * .15;
+                XYZ temppoint1, temppoint2, tempforward;
+
+                rotation3 = 0;
+                smallrotation = 90;
+                smallrotation2 = 0;
+                bigtilt = 0;
+                bigtilt2 = 0;
+                bigrotation = 0;
+
+                emit_sound_at(knifesheathesound, position, 128.);
+
+                XYZ terrainlight;
+                terrainlight = terrain.getLighting(position.x, position.z);
+                if (environment == snowyenvironment) {
+                    if (distsq(&position, &viewer) < viewdistance * viewdistance / 4)
+                        Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x, terrainlight.y, terrainlight.z, .5, .7);
+                } else if (environment == grassyenvironment) {
+                    if (distsq(&position, &viewer) < viewdistance * viewdistance / 4)
+                        Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x * 90 / 255, terrainlight.y * 70 / 255, terrainlight.z * 8 / 255, .5, .5);
+                } else if (environment == desertenvironment) {
+                    if (distsq(&position, &viewer) < viewdistance * viewdistance / 4)
+                        Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x * 190 / 255, terrainlight.y * 170 / 255, terrainlight.z * 108 / 255, .5, .7);
+                }
+
+                bloody = 0;
+            } else {
+                physics = 1;
+                firstfree = 1;
+                position -= velocity * multiplier;
+                tippoint -= velocity * multiplier;
+                tipvelocity = velocity;
+            }
+        }
+        if (velocity.x != 0 || velocity.z != 0 || velocity.y != 0) {
+            velocity.y += gravity * multiplier;
+
+            XYZ temppoint1, temppoint2, tempforward;
+            float distance;
+
+            temppoint1 = 0;
+            temppoint2 = velocity;
+            distance = findDistance(&temppoint1, &temppoint2);
+            rotation2 = asin((temppoint1.y - temppoint2.y) / distance);
+            rotation2 *= 360 / 6.28;
+            temppoint1.y = 0;
+            temppoint2.y = 0;
+            rotation1 = acos((temppoint1.z - temppoint2.z) / findDistance(&temppoint1, &temppoint2));
+            rotation1 *= 360 / 6.28;
+            rotation3 = 0;
+            smallrotation = 90;
+            smallrotation2 = 0;
+            bigtilt = 0;
+            bigtilt2 = 0;
+            bigrotation = 0;
+            if (temppoint1.x > temppoint2.x) rotation1 = 360 - rotation1;
+        }
+
+    }
+
+    //Sword physics
+    XYZ mid;
+    XYZ oldmid;
+    XYZ oldmid2;
+
+    tempmult = multiplier;
+    multiplier /= 10;
+    for (int l = 0; l < 10; l++) {
+        if (owner == -1 && (velocity.x || velocity.y || velocity.z) && physics) {
+            //move
+            position += velocity * multiplier;
+            tippoint += tipvelocity * multiplier;
+
+            //Length constrain
+            midp = (position * mass + tippoint * tipmass) / (mass + tipmass);
+            vel = tippoint - midp;
+            Normalise(&vel);
+            newpoint1 = midp - vel * length * (tipmass / (mass + tipmass));
+            newpoint2 = midp + vel * length * (mass / (mass + tipmass));
+            if (!freeze) {
+                if (freetime > .04) {
+                    velocity = velocity + (newpoint1 - position) / multiplier;
+                    tipvelocity = tipvelocity + (newpoint2 - tippoint) / multiplier;
+                }
+            }
+            position = newpoint1;
+            tippoint = newpoint2;
+
+
+            //Object collisions
+            whichpatchx = (position.x) / (terrain.size / subdivision * terrain.scale);
+            whichpatchz = (position.z) / (terrain.size / subdivision * terrain.scale);
+            if (whichpatchx > 0 && whichpatchz > 0 && whichpatchx < subdivision && whichpatchz < subdivision)
+                if (terrain.patchobjectnum[whichpatchx][whichpatchz]) {
+                    for (int j = 0; j < terrain.patchobjectnum[whichpatchx][whichpatchz]; j++) {
+                        int k = terrain.patchobjects[whichpatchx][whichpatchz][j];
+
+                        if (firstfree) {
+                            if (type == staff) {
+                                start = tippoint - (position - tippoint) / 5;
+                                end = position + (position - tippoint) / 30;
+                                whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+                                if (whichhit != -1) {
+                                    XYZ diff;
+                                    diff = (colpoint - position);
+                                    Normalise(&diff);
+                                    hitsomething = 1;
+
+                                    tippoint += (colpoint - position) + diff * .05;
+                                    position = colpoint + diff * .05;
+                                    oldtippoint = tippoint;
+                                    oldposition = tippoint;
+                                }
+                            } else {
+                                start = position - (tippoint - position) / 5;
+                                end = tippoint + (tippoint - position) / 30;
+                                whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+                                if (whichhit != -1) {
+                                    XYZ diff;
+                                    diff = (colpoint - tippoint);
+                                    Normalise(&diff);
+                                    hitsomething = 1;
+
+                                    position += (colpoint - tippoint) + diff * .05;
+                                    tippoint = colpoint + diff * .05;
+                                    oldposition = position;
+                                    oldtippoint = tippoint;
+                                }
+                            }
+                        }
+
+                        start = oldposition;
+                        end = position;
+                        whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+                        if (whichhit != -1) {
+                            hitsomething = 1;
+                            position = colpoint;
+                            terrainnormal = DoRotation(objects.model[k].facenormals[whichhit], 0, objects.yaw[k], 0) * -1;
+                            ReflectVector(&velocity, &terrainnormal);
+                            position += terrainnormal * .002;
+
+                            bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal)));
+                            if (findLengthfast(&velocity) < findLengthfast(&bounceness))
+                                bounceness = 0;
+                            frictionness = abs(normaldotproduct(velocity, terrainnormal));
+                            velocity -= bounceness;
+                            if (1 - friction * frictionness > 0)velocity *= 1 - friction * frictionness;
+                            else velocity = 0;
+                            velocity += bounceness * elasticity;
+
+                            if (findLengthfast(&bounceness) > 1) {
+                                int whichsound;
+                                if (type == staff)
+                                    whichsound = footstepsound3 + abs(Random() % 2);
+                                else
+                                    whichsound = clank1sound + abs(Random() % 4);
+                                emit_sound_at(whichsound, position, 128 * findLengthfast(&bounceness));
+                            }
+                        }
+                        start = oldtippoint;
+                        end = tippoint;
+                        whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+                        if (whichhit != -1) {
+                            hitsomething = 1;
+                            tippoint = colpoint;
+                            terrainnormal = DoRotation(objects.model[k].facenormals[whichhit], 0, objects.yaw[k], 0) * -1;
+                            ReflectVector(&tipvelocity, &terrainnormal);
+                            tippoint += terrainnormal * .002;
+
+                            bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal)));
+                            if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness))bounceness = 0;
+                            frictionness = abs(normaldotproduct(tipvelocity, terrainnormal));
+                            tipvelocity -= bounceness;
+                            if (1 - friction * frictionness > 0)tipvelocity *= 1 - friction * frictionness;
+                            else tipvelocity = 0;
+                            tipvelocity += bounceness * elasticity;
+
+                            if (findLengthfast(&bounceness) > 1) {
+                                int whichsound;
+                                if (type == staff)
+                                    whichsound = footstepsound3 + abs(Random() % 2);
+                                else
+                                    whichsound = clank1sound + abs(Random() % 4);
+                                emit_sound_at(whichsound, position, 128 * findLengthfast(&bounceness));
+                            }
+                        }
+
+                        if ((objects.type[k] != boxtype && objects.type[k] != platformtype && objects.type[k] != walltype && objects.type[k] != weirdtype) || objects.pitch[k] != 0)
+                            for (int m = 0; m < 2; m++) {
+                                mid = (position * (21 + (float)m * 10) + tippoint * (19 - (float)m * 10)) / 40;
+                                oldmid2 = mid;
+                                oldmid = (oldposition * (21 + (float)m * 10) + oldtippoint * (19 - (float)m * 10)) / 40;
+
+                                start = oldmid;
+                                end = mid;
+                                whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+                                if (whichhit != -1) {
+                                    hitsomething = 1;
+                                    mid = colpoint;
+                                    terrainnormal = DoRotation(objects.model[k].facenormals[whichhit], 0, objects.yaw[k], 0) * -1;
+                                    ReflectVector(&velocity, &terrainnormal);
+
+                                    bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal)));
+                                    if (findLengthfast(&velocity) < findLengthfast(&bounceness))bounceness = 0;
+                                    frictionness = abs(normaldotproduct(velocity, terrainnormal));
+                                    velocity -= bounceness;
+                                    if (1 - friction * frictionness > 0)velocity *= 1 - friction * frictionness;
+                                    else velocity = 0;
+                                    velocity += bounceness * elasticity;
+
+                                    if (findLengthfast(&bounceness) > 1) {
+                                        int whichsound;
+                                        if (type == staff)
+                                            whichsound = footstepsound3 + abs(Random() % 2);
+                                        else
+                                            whichsound = clank1sound + abs(Random() % 4);
+                                        emit_sound_at(whichsound, mid, 128 * findLengthfast(&bounceness));
+                                    }
+                                    position += (mid - oldmid2) * (20 / (1 + (float)m * 10));
+                                }
+
+                                mid = (position * (19 - (float)m * 10) + tippoint * (21 + (float)m * 10)) / 40;
+                                oldmid2 = mid;
+                                oldmid = (oldposition * (19 - (float)m * 10) + oldtippoint * (21 + (float)m * 10)) / 40;
+
+                                start = oldmid;
+                                end = mid;
+                                whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+                                if (whichhit != -1) {
+                                    hitsomething = 1;
+                                    mid = colpoint;
+                                    terrainnormal = DoRotation(objects.model[k].facenormals[whichhit], 0, objects.yaw[k], 0) * -1;
+                                    ReflectVector(&tipvelocity, &terrainnormal);
+
+                                    bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal)));
+                                    if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness))bounceness = 0;
+                                    frictionness = abs(normaldotproduct(tipvelocity, terrainnormal));
+                                    tipvelocity -= bounceness;
+                                    if (1 - friction * frictionness > 0)tipvelocity *= 1 - friction * frictionness;
+                                    else tipvelocity = 0;
+                                    tipvelocity += bounceness * elasticity;
+
+                                    if (findLengthfast(&bounceness) > 1) {
+                                        int whichsound;
+                                        if (type == staff)
+                                            whichsound = footstepsound3 + abs(Random() % 2);
+                                        else
+                                            whichsound = clank1sound + abs(Random() % 4);
+                                        emit_sound_at(whichsound, mid, 128 * findLengthfast(&bounceness));
+                                    }
+                                    tippoint += (mid - oldmid2) * (20 / (1 + (float)m * 10));
+                                }
+                            }
+                        else {
+                            start = position;
+                            end = tippoint;
+                            whichhit = objects.model[k].LineCheck(&start, &end, &colpoint, &objects.position[k], &objects.yaw[k]);
+                            if (whichhit != -1) {
+                                hitsomething = 1;
+                                closestdistance = -1;
+                                closestswordpoint = colpoint; //(position+tippoint)/2;
+                                point[0] = DoRotation(objects.model[k].vertex[objects.model[k].Triangles[whichhit].vertex[0]], 0, objects.yaw[k], 0) + objects.position[k];
+                                point[1] = DoRotation(objects.model[k].vertex[objects.model[k].Triangles[whichhit].vertex[1]], 0, objects.yaw[k], 0) + objects.position[k];
+                                point[2] = DoRotation(objects.model[k].vertex[objects.model[k].Triangles[whichhit].vertex[2]], 0, objects.yaw[k], 0) + objects.position[k];
+                                if (DistancePointLine(&closestswordpoint, &point[0], &point[1], &distance, &colpoint )) {
+                                    if (distance < closestdistance || closestdistance == -1) {
+                                        closestpoint = colpoint;
+                                        closestdistance = distance;
+                                    }
+                                }
+                                if (DistancePointLine(&closestswordpoint, &point[1], &point[2], &distance, &colpoint )) {
+                                    if (distance < closestdistance || closestdistance == -1) {
+                                        closestpoint = colpoint;
+                                        closestdistance = distance;
+                                    }
+                                }
+                                if (DistancePointLine(&closestswordpoint, &point[2], &point[0], &distance, &colpoint )) {
+                                    if (distance < closestdistance || closestdistance == -1) {
+                                        closestpoint = colpoint;
+                                        closestdistance = distance;
+                                    }
+                                }
+                                if (closestdistance != -1 && isnormal(closestdistance)) {
+                                    if (DistancePointLine(&closestpoint, &position, &tippoint, &distance, &colpoint )) {
+                                        closestswordpoint = colpoint;
+                                        velocity += (closestpoint - closestswordpoint);
+                                        tipvelocity += (closestpoint - closestswordpoint);
+                                        position += (closestpoint - closestswordpoint);
+                                        tippoint += (closestpoint - closestswordpoint);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            //Terrain collisions
+            whichhit = terrain.lineTerrain(oldposition, position, &colpoint);
+            if (whichhit != -1 || position.y < terrain.getHeight(position.x, position.z)) {
+                hitsomething = 1;
+                if (whichhit != -1)
+                    position = colpoint * terrain.scale;
+                else
+                    position.y = terrain.getHeight(position.x, position.z);
+
+                terrainnormal = terrain.getNormal(position.x, position.z);
+                ReflectVector(&velocity, &terrainnormal);
+                position += terrainnormal * .002;
+                bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal)));
+                if (findLengthfast(&velocity) < findLengthfast(&bounceness))bounceness = 0;
+                frictionness = abs(normaldotproduct(velocity, terrainnormal));
+                velocity -= bounceness;
+                if (1 - friction * frictionness > 0)velocity *= 1 - friction * frictionness;
+                else velocity = 0;
+                if (terrain.getOpacity(position.x, position.z) < .2)velocity += bounceness * elasticity * .3;
+                else velocity += bounceness * elasticity;
+
+                if (findLengthfast(&bounceness) > 1) {
+                    int whichsound;
+                    if (terrain.getOpacity(position.x, position.z) > .2) {
+                        if (type == staff)
+                            whichsound = footstepsound3 + abs(Random() % 2);
+                        else
+                            whichsound = clank1sound + abs(Random() % 4);
+                    } else {
+                        whichsound = footstepsound + abs(Random() % 2);
+                    }
+                    emit_sound_at(whichsound, position,
+                                  findLengthfast(&bounceness)
+                                  * (terrain.getOpacity(position.x, position.z) > .2 ? 128. : 32.));
+
+                    if (terrain.getOpacity(position.x, position.z) < .2) {
+                        XYZ terrainlight;
+                        terrainlight = terrain.getLighting(position.x, position.z);
+                        if (environment == snowyenvironment) {
+                            if (distsq(&position, &viewer) < viewdistance * viewdistance / 4)
+                                Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x, terrainlight.y, terrainlight.z, .5, .7);
+                        } else if (environment == grassyenvironment) {
+                            if (distsq(&position, &viewer) < viewdistance * viewdistance / 4)
+                                Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x * 90 / 255, terrainlight.y * 70 / 255, terrainlight.z * 8 / 255, .5, .5);
+                        } else if (environment == desertenvironment) {
+                            if (distsq(&position, &viewer) < viewdistance * viewdistance / 4)
+                                Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x * 190 / 255, terrainlight.y * 170 / 255, terrainlight.z * 108 / 255, .5, .7);
+                        }
+                    }
+                }
+            }
+            whichhit = terrain.lineTerrain(oldtippoint, tippoint, &colpoint);
+            if (whichhit != -1 || tippoint.y < terrain.getHeight(tippoint.x, tippoint.z)) {
+                if (whichhit != -1)
+                    tippoint = colpoint * terrain.scale;
+                else
+                    tippoint.y = terrain.getHeight(tippoint.x, tippoint.z);
+
+                terrainnormal = terrain.getNormal(tippoint.x, tippoint.z);
+                ReflectVector(&tipvelocity, &terrainnormal);
+                tippoint += terrainnormal * .002;
+                bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal)));
+                if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness))bounceness = 0;
+                frictionness = abs(normaldotproduct(tipvelocity, terrainnormal));
+                tipvelocity -= bounceness;
+                if (1 - friction * frictionness > 0)tipvelocity *= 1 - friction * frictionness;
+                else tipvelocity = 0;
+                if (terrain.getOpacity(tippoint.x, tippoint.z) < .2)tipvelocity += bounceness * elasticity * .3;
+                else tipvelocity += bounceness * elasticity;
+
+                if (findLengthfast(&bounceness) > 1) {
+                    int whichsound;
+                    if (terrain.getOpacity(tippoint.x, tippoint.z) > .2) {
+                        if (type == staff)
+                            whichsound = footstepsound3 + abs(Random() % 2);
+                        else
+                            whichsound = clank1sound + abs(Random() % 4);
+                    } else {
+                        whichsound = footstepsound + abs(Random() % 2);
+                    }
+                    emit_sound_at(whichsound, tippoint,
+                                  findLengthfast(&bounceness)
+                                  * (terrain.getOpacity(tippoint.x, tippoint.z) > .2  ? 128. : 32.));
+
+                    if (terrain.getOpacity(tippoint.x, tippoint.z) < .2) {
+                        XYZ terrainlight;
+                        terrainlight = terrain.getLighting(tippoint.x, tippoint.z);
+                        if (environment == snowyenvironment) {
+                            if (distsq(&tippoint, &viewer) < viewdistance * viewdistance / 4)
+                                Sprite::MakeSprite(cloudsprite, tippoint, tipvelocity, terrainlight.x, terrainlight.y, terrainlight.z, .5, .7);
+                        } else if (environment == grassyenvironment) {
+                            if (distsq(&tippoint, &viewer) < viewdistance * viewdistance / 4)
+                                Sprite::MakeSprite(cloudsprite, tippoint, tipvelocity, terrainlight.x * 90 / 255, terrainlight.y * 70 / 255, terrainlight.z * 8 / 255, .5, .5);
+                        } else if (environment == desertenvironment) {
+                            if (distsq(&tippoint, &viewer) < viewdistance * viewdistance / 4)
+                                Sprite::MakeSprite(cloudsprite, tippoint, tipvelocity, terrainlight.x * 190 / 255, terrainlight.y * 170 / 255, terrainlight.z * 108 / 255, .5, .7);
+                        }
+                    }
+                }
+            }
+
+            //Edges
+            mid = position + tippoint;
+            mid /= 2;
+            mid += (position - mid) / 20;
+            oldmid = mid;
+            if (mid.y < terrain.getHeight(mid.x, mid.z)) {
+                hitsomething = 1;
+                mid.y = terrain.getHeight(mid.x, mid.z);
+
+                terrainnormal = terrain.getNormal(mid.x, mid.z);
+                ReflectVector(&velocity, &terrainnormal);
+                //mid+=terrainnormal*.002;
+                bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal)));
+                if (findLengthfast(&velocity) < findLengthfast(&bounceness))bounceness = 0;
+                frictionness = abs(normaldotproduct(velocity, terrainnormal));
+                velocity -= bounceness;
+                if (1 - friction * frictionness > 0)velocity *= 1 - friction * frictionness;
+                else velocity = 0;
+                if (terrain.getOpacity(mid.x, mid.z) < .2)velocity += bounceness * elasticity * .3;
+                else velocity += bounceness * elasticity;
+
+                if (findLengthfast(&bounceness) > 1) {
+                    int whichsound;
+                    if (terrain.getOpacity(mid.x, mid.z) > .2) {
+                        if (type == staff)whichsound = footstepsound3 + abs(Random() % 2);
+                        if (type != staff)whichsound = clank1sound + abs(Random() % 4);
+                    } else whichsound = footstepsound + abs(Random() % 2);
+                    emit_sound_at(whichsound, mid,
+                                  findLengthfast(&bounceness)
+                                  * (terrain.getOpacity(position.x, position.z) > .2
+                                     ? 128.
+                                     : 32.));
+                }
+                position += (mid - oldmid) * 20;
+            }
+
+            mid = position + tippoint;
+            mid /= 2;
+            mid += (tippoint - mid) / 20;
+            oldmid = mid;
+            if (mid.y < terrain.getHeight(mid.x, mid.z)) {
+                hitsomething = 1;
+                mid.y = terrain.getHeight(mid.x, mid.z);
+
+                terrainnormal = terrain.getNormal(mid.x, mid.z);
+                ReflectVector(&tipvelocity, &terrainnormal);
+                //mid+=terrainnormal*.002;
+                bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal)));
+                if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness))bounceness = 0;
+                frictionness = abs(normaldotproduct(tipvelocity, terrainnormal));
+                tipvelocity -= bounceness;
+                if (1 - friction * frictionness > 0)tipvelocity *= 1 - friction * frictionness;
+                else tipvelocity = 0;
+                if (terrain.getOpacity(mid.x, mid.z) < .2)tipvelocity += bounceness * elasticity * .3;
+                else tipvelocity += bounceness * elasticity;
+
+                if (findLengthfast(&bounceness) > 1) {
+                    int whichsound;
+                    if (terrain.getOpacity(mid.x, mid.z) > .2) {
+                        if (type == staff)whichsound = footstepsound3 + abs(Random() % 2);
+                        if (type != staff)whichsound = clank1sound + abs(Random() % 4);
+                    } else whichsound = footstepsound + abs(Random() % 2);
+                    emit_sound_at(whichsound, mid,
+                                  findLengthfast(&bounceness)
+                                  * (terrain.getOpacity(position.x, position.z) > .2
+                                     ? 128.
+                                     : 32.));
+                }
+                tippoint += (mid - oldmid) * 20;
+            }
+            //Gravity
+            velocity.y += gravity * multiplier;
+            tipvelocity.y += gravity * multiplier;
+
+            //Rotation
+            XYZ temppoint1, temppoint2, tempforward;
+            float distance;
+
+            temppoint1 = position;
+            temppoint2 = tippoint;
+            distance = findDistance(&temppoint1, &temppoint2);
+            rotation2 = asin((temppoint1.y - temppoint2.y) / distance);
+            rotation2 *= 360 / 6.28;
+            temppoint1.y = 0;
+            temppoint2.y = 0;
+            rotation1 = acos((temppoint1.z - temppoint2.z) / findDistance(&temppoint1, &temppoint2));
+            rotation1 *= 360 / 6.28;
+            rotation3 = 0;
+            smallrotation = 90;
+            smallrotation2 = 0;
+            bigtilt = 0;
+            bigtilt2 = 0;
+            bigrotation = 0;
+            if (temppoint1.x > temppoint2.x)rotation1 = 360 - rotation1;
+
+            //Stop moving
+            if (findLengthfast(&velocity) < .3 && findLengthfast(&tipvelocity) < .3 && hitsomething) {
+                freetime += multiplier;
+            }
+
+            if (freetime > .4) {
+                velocity = 0;
+                tipvelocity = 0;
+            }
+            firstfree = 0;
+        }
+    }
+    multiplier = tempmult;
+    if (blooddrip && bloody) {
+        blooddripdelay -= blooddrip * multiplier / 2;
+        blooddrip -= multiplier;
+        if (blooddrip < 0) blooddrip = 0;
+        if (blooddrip > 5) blooddrip = 5;
+        if (blooddripdelay < 0 && bloodtoggle) {
+            blooddripdelay = 1;
+            XYZ bloodvel;
+            XYZ bloodloc;
+            bloodloc = position + (tippoint - position) * .7;
+            bloodloc.y -= .05;
+            if (bloodtoggle) {
+                bloodvel = 0;
+                Sprite::MakeSprite(bloodsprite, bloodloc, bloodvel, 1, 1, 1, .03, 1);
+            }
+        }
+    }
+    if (onfire) {
+        flamedelay -= multiplier;
+        if (onfire && flamedelay <= 0) {
+            flamedelay = .020;
+            flamedelay -= multiplier;
+            normalrot = 0;
+            if (owner != -1) {
+                normalrot = player[owner].velocity;
+            }
+            normalrot.y += 1;
+            if (owner != -1) {
+                if (player[owner].onterrain) {
+                    normalrot.y = 1;
+                }
+            }
+            Sprite::MakeSprite(weaponflamesprite, position + tippoint * (((float)abs(Random() % 100)) / 600 + .05), normalrot, 1, 1, 1, (.6 + (float)abs(Random() % 100) / 200 - .25) * 1 / 3, 1);
+            Sprite::setLastSpriteSpeed(4);
+            Sprite::setLastSpriteAlivetime(.3);
+        }
+    }
+
+    if (!onfire && owner == -1 && type != staff) {
+        flamedelay -= multiplier;
+        if (flamedelay <= 0) {
+            flamedelay = .020;
+            flamedelay -= multiplier;
+            normalrot = 0;
+            if (Random() % 50 == 0 && distsq(&position, &viewer) > 80) {
+                XYZ shinepoint;
+                shinepoint = position + (tippoint - position) * (((float)abs(Random() % 100)) / 100);
+                Sprite::MakeSprite(weaponshinesprite, shinepoint, normalrot, 1, 1, 1, (.1 + (float)abs(Random() % 100) / 200 - .25) * 1 / 3 * fast_sqrt(findDistance(&shinepoint, &viewer)), 1);
+                Sprite::setLastSpriteSpeed(4);
+                Sprite::setLastSpriteAlivetime(.3);
+            }
+        }
+    }
 }
 
-void Weapons::DoStuff() {
-       //Move
-       int i = 0;
-       for(std::vector<Weapon>::iterator weapon = begin(); weapon != end(); ++weapon) {
-               weapon->DoStuff(i++);
-       }
+void Weapons::DoStuff()
+{
+    //Move
+    int i = 0;
+    for (std::vector<Weapon>::iterator weapon = begin(); weapon != end(); ++weapon) {
+        weapon->DoStuff(i++);
+    }
 }
 
-void Weapon::Draw() {
-       static XYZ terrainlight;
-       static GLfloat M[16];
-       
-       if((frustum.SphereInFrustum(position.x,position.y,position.z,1)&&
-               distsq(&viewer,&position)<viewdistance*viewdistance))
-       {
-               bool draw=false;
-               if(owner==-1)
-               {
-                       draw=true;
-                       if(velocity.x && !physics)
-                               drawhowmany=10;
-                       else
-                               drawhowmany=1;
-               } else {
-                       if(player[owner].occluded<25)
-                               if((frustum.SphereInFrustum(player[owner].coords.x,player[owner].coords.y+player[owner].scale*3,player[owner].coords.z,player[owner].scale*8)&&distsq(&viewer,&player[owner].coords)<viewdistance*viewdistance)||player[owner].skeleton.free==3)
-                                       draw=true;
-                       if      (
-                               (player[owner].animTarget==knifeslashstartanim||
-                                player[owner].animTarget==swordsneakattackanim||
-                                (player[owner].animCurrent==staffhitanim       &&                              player[owner].frameCurrent>1)||
-                                (player[owner].animCurrent==staffhitreversedanim       &&              player[owner].frameCurrent>1)||
-                                (player[owner].animCurrent==staffspinhitanim   &&                      player[owner].frameCurrent>1)||
-                                (player[owner].animCurrent==staffspinhitreversedanim   &&      player[owner].frameCurrent>1)||
-                                (player[owner].animCurrent==staffgroundsmashanim       &&              player[owner].frameCurrent>1)||
-                                (player[owner].animTarget==swordslashanim      &&                              player[owner].frameTarget<7)||
-                                player[owner].animTarget==crouchstabanim||
-                                player[owner].animTarget==swordslashreversalanim||
-                                player[owner].animTarget==swordslashreversedanim||
-                                player[owner].animTarget==knifefollowanim||
-                                player[owner].animTarget==swordgroundstabanim||
-                                player[owner].animTarget==knifethrowanim)&&
-                                player[owner].animTarget==lastdrawnanim&&
-                                !player[owner].skeleton.free
-                               )
-                       {
-                               drawhowmany=10;
-                       } else {
-                               drawhowmany=1;
-                       }
-                       if(player[owner].animTarget==swordgroundstabanim)
-                       {
-                               lastdrawnrotation1=rotation1;
-                               lastdrawnrotation2=rotation2;
-                               lastdrawnrotation3=rotation3;
-                               lastdrawnbigrotation=bigrotation;
-                               lastdrawnbigtilt=bigtilt;
-                               lastdrawnbigtilt2=bigtilt2;
-                               lastdrawnsmallrotation=smallrotation;
-                               lastdrawnsmallrotation2=smallrotation2;
-                       }
-               }
-               if(draw)
-               {
-                       terrainlight=terrain.getLighting(position.x,position.z);
-                       if(drawhowmany>0)
-                       {
-                               glAlphaFunc(GL_GREATER, 0.01);
-                       }
-                       for(int j=drawhowmany;j>0;j--)
-                       {
-                               glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                               glPushMatrix();
-                                       glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,j/drawhowmany);
-                                       if(owner==-1)
-                                               glTranslatef(position.x*(((float)(j))/drawhowmany)+lastdrawnposition.x*(1-((float)(j))/drawhowmany),position.y*(((float)(j))/drawhowmany)+lastdrawnposition.y*(1-((float)(j))/drawhowmany),position.z*(((float)(j))/drawhowmany)+lastdrawnposition.z*(1-((float)(j))/drawhowmany));
-                                       else
-                                               glTranslatef(position.x*(((float)(j))/drawhowmany)+lastdrawnposition.x*(1-((float)(j))/drawhowmany),position.y*(((float)(j))/drawhowmany)-.02+lastdrawnposition.y*(1-((float)(j))/drawhowmany),position.z*(((float)(j))/drawhowmany)+lastdrawnposition.z*(1-((float)(j))/drawhowmany));
-                                       glRotatef(bigrotation*(((float)(j))/drawhowmany)+lastdrawnbigrotation*(1-((float)(j))/drawhowmany),0,1,0);
-                                       glRotatef(bigtilt2*(((float)(j))/drawhowmany)+lastdrawnbigtilt2*(1-((float)(j))/drawhowmany),1,0,0);
-                                       glRotatef(bigtilt*(((float)(j))/drawhowmany)+lastdrawnbigtilt*(1-((float)(j))/drawhowmany),0,0,1);
-                                       glRotatef(-rotation1*(((float)(j))/drawhowmany)-lastdrawnrotation1*(1-((float)(j))/drawhowmany)+90,0,1,0);
-                                       glRotatef(-rotation2*(((float)(j))/drawhowmany)-lastdrawnrotation2*(1-((float)(j))/drawhowmany)+90,0,0,1);
-                                       glRotatef(-rotation3*(((float)(j))/drawhowmany)-lastdrawnrotation3*(1-((float)(j))/drawhowmany),0,1,0);
-                                       glRotatef(smallrotation*(((float)(j))/drawhowmany)+lastdrawnsmallrotation*(1-((float)(j))/drawhowmany),1,0,0);
-                                       glRotatef(smallrotation2*(((float)(j))/drawhowmany)+lastdrawnsmallrotation2*(1-((float)(j))/drawhowmany),0,1,0);
-
-                                       if(owner!=-1)
-                                       {
-                                               if(player[owner].animTarget==staffhitanim||player[owner].animCurrent==staffhitanim||player[owner].animTarget==staffhitreversedanim||player[owner].animCurrent==staffhitreversedanim)
-                                               {
-                                                       glTranslatef(0,0,-.3);
-                                               }
-                                               if(player[owner].animTarget==staffgroundsmashanim||player[owner].animCurrent==staffgroundsmashanim||player[owner].animTarget==staffspinhitreversedanim||player[owner].animCurrent==staffspinhitreversedanim||player[owner].animTarget==staffspinhitanim||player[owner].animCurrent==staffspinhitanim)
-                                               {
-                                                       glTranslatef(0,0,-.1);
-                                               }
-                                       }
-
-                                       glEnable(GL_LIGHTING);
-                                       switch(type) {
-                                               case knife:
-                                                       if(!bloody||!bloodtoggle)
-                                                               throwingknifemodel.drawdifftex(knifetextureptr);
-                                                       if(bloodtoggle)
-                                                       {
-                                                               if(bloody==1)
-                                                                       throwingknifemodel.drawdifftex(lightbloodknifetextureptr);
-                                                               if(bloody==2)
-                                                                       throwingknifemodel.drawdifftex(bloodknifetextureptr);
-                                                       }
-                                                       break;
-                                               case sword:
-                                                       if(!bloody||!bloodtoggle)
-                                                               swordmodel.drawdifftex(swordtextureptr);
-                                                       if(bloodtoggle)
-                                                       {
-                                                               if(bloody==1)
-                                                                       swordmodel.drawdifftex(lightbloodswordtextureptr);
-                                                               if(bloody==2)
-                                                                       swordmodel.drawdifftex(bloodswordtextureptr);
-                                                       }
-                                                       break;
-                                               case staff:
-                                                       staffmodel.drawdifftex(stafftextureptr);
-                                                       break;
-                                       }
-
-                               glPopMatrix();
-                       }
-
-                       lastdrawnposition=position;
-                       lastdrawntippoint=tippoint;
-                       lastdrawnrotation1=rotation1;
-                       lastdrawnrotation2=rotation2;
-                       lastdrawnrotation3=rotation3;
-                       lastdrawnbigrotation=bigrotation;
-                       lastdrawnbigtilt=bigtilt;
-                       lastdrawnbigtilt2=bigtilt2;
-                       lastdrawnsmallrotation=smallrotation;
-                       lastdrawnsmallrotation2=smallrotation2;
-                       if(owner!=-1)lastdrawnanim=player[owner].animCurrent;
-               }
-               if(owner!=-1)
-               {
-                       glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
-                       glPushMatrix();
-                               glLoadIdentity();
-                               glTranslatef(position.x,position.y-.02,position.z);
-                               glRotatef(bigrotation,0,1,0);
-                               glRotatef(bigtilt2,1,0,0);
-                               glRotatef(bigtilt,0,0,1);
-                               glRotatef(-rotation1+90,0,1,0);
-                               glRotatef(-rotation2+90,0,0,1);
-                               glRotatef(-rotation3,0,1,0);
-                               glRotatef(smallrotation,1,0,0);
-                               glRotatef(smallrotation2,0,1,0);
-                               glTranslatef(0,0,length);
-                               glGetFloatv(GL_MODELVIEW_MATRIX,M);
-                               tippoint.x=M[12];
-                               tippoint.y=M[13];
-                               tippoint.z=M[14];
-                       glPopMatrix();
-               }
-       }
+void Weapon::Draw()
+{
+    static XYZ terrainlight;
+    static GLfloat M[16];
+
+    if ((frustum.SphereInFrustum(position.x, position.y, position.z, 1) &&
+            distsq(&viewer, &position) < viewdistance * viewdistance)) {
+        bool draw = false;
+        if (owner == -1) {
+            draw = true;
+            if (velocity.x && !physics)
+                drawhowmany = 10;
+            else
+                drawhowmany = 1;
+        } else {
+            if (player[owner].occluded < 25)
+                if ((frustum.SphereInFrustum(player[owner].coords.x, player[owner].coords.y + player[owner].scale * 3, player[owner].coords.z, player[owner].scale * 8) && distsq(&viewer, &player[owner].coords) < viewdistance * viewdistance) || player[owner].skeleton.free == 3)
+                    draw = true;
+            if (
+                (player[owner].animTarget == knifeslashstartanim ||
+                 player[owner].animTarget == swordsneakattackanim ||
+                 (player[owner].animCurrent == staffhitanim    &&                              player[owner].frameCurrent > 1) ||
+                 (player[owner].animCurrent == staffhitreversedanim    &&              player[owner].frameCurrent > 1) ||
+                 (player[owner].animCurrent == staffspinhitanim        &&                      player[owner].frameCurrent > 1) ||
+                 (player[owner].animCurrent == staffspinhitreversedanim        &&      player[owner].frameCurrent > 1) ||
+                 (player[owner].animCurrent == staffgroundsmashanim    &&              player[owner].frameCurrent > 1) ||
+                 (player[owner].animTarget == swordslashanim   &&                              player[owner].frameTarget < 7) ||
+                 player[owner].animTarget == crouchstabanim ||
+                 player[owner].animTarget == swordslashreversalanim ||
+                 player[owner].animTarget == swordslashreversedanim ||
+                 player[owner].animTarget == knifefollowanim ||
+                 player[owner].animTarget == swordgroundstabanim ||
+                 player[owner].animTarget == knifethrowanim) &&
+                player[owner].animTarget == lastdrawnanim &&
+                !player[owner].skeleton.free
+            ) {
+                drawhowmany = 10;
+            } else {
+                drawhowmany = 1;
+            }
+            if (player[owner].animTarget == swordgroundstabanim) {
+                lastdrawnrotation1 = rotation1;
+                lastdrawnrotation2 = rotation2;
+                lastdrawnrotation3 = rotation3;
+                lastdrawnbigrotation = bigrotation;
+                lastdrawnbigtilt = bigtilt;
+                lastdrawnbigtilt2 = bigtilt2;
+                lastdrawnsmallrotation = smallrotation;
+                lastdrawnsmallrotation2 = smallrotation2;
+            }
+        }
+        if (draw) {
+            terrainlight = terrain.getLighting(position.x, position.z);
+            if (drawhowmany > 0) {
+                glAlphaFunc(GL_GREATER, 0.01);
+            }
+            for (int j = drawhowmany; j > 0; j--) {
+                glMatrixMode(GL_MODELVIEW);                                                    // Select The Modelview Matrix
+                glPushMatrix();
+                glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, j / drawhowmany);
+                if (owner == -1)
+                    glTranslatef(position.x * (((float)(j)) / drawhowmany) + lastdrawnposition.x * (1 - ((float)(j)) / drawhowmany), position.y * (((float)(j)) / drawhowmany) + lastdrawnposition.y * (1 - ((float)(j)) / drawhowmany), position.z * (((float)(j)) / drawhowmany) + lastdrawnposition.z * (1 - ((float)(j)) / drawhowmany));
+                else
+                    glTranslatef(position.x * (((float)(j)) / drawhowmany) + lastdrawnposition.x * (1 - ((float)(j)) / drawhowmany), position.y * (((float)(j)) / drawhowmany) - .02 + lastdrawnposition.y * (1 - ((float)(j)) / drawhowmany), position.z * (((float)(j)) / drawhowmany) + lastdrawnposition.z * (1 - ((float)(j)) / drawhowmany));
+                glRotatef(bigrotation * (((float)(j)) / drawhowmany) + lastdrawnbigrotation * (1 - ((float)(j)) / drawhowmany), 0, 1, 0);
+                glRotatef(bigtilt2 * (((float)(j)) / drawhowmany) + lastdrawnbigtilt2 * (1 - ((float)(j)) / drawhowmany), 1, 0, 0);
+                glRotatef(bigtilt * (((float)(j)) / drawhowmany) + lastdrawnbigtilt * (1 - ((float)(j)) / drawhowmany), 0, 0, 1);
+                glRotatef(-rotation1 * (((float)(j)) / drawhowmany) - lastdrawnrotation1 * (1 - ((float)(j)) / drawhowmany) + 90, 0, 1, 0);
+                glRotatef(-rotation2 * (((float)(j)) / drawhowmany) - lastdrawnrotation2 * (1 - ((float)(j)) / drawhowmany) + 90, 0, 0, 1);
+                glRotatef(-rotation3 * (((float)(j)) / drawhowmany) - lastdrawnrotation3 * (1 - ((float)(j)) / drawhowmany), 0, 1, 0);
+                glRotatef(smallrotation * (((float)(j)) / drawhowmany) + lastdrawnsmallrotation * (1 - ((float)(j)) / drawhowmany), 1, 0, 0);
+                glRotatef(smallrotation2 * (((float)(j)) / drawhowmany) + lastdrawnsmallrotation2 * (1 - ((float)(j)) / drawhowmany), 0, 1, 0);
+
+                if (owner != -1) {
+                    if (player[owner].animTarget == staffhitanim || player[owner].animCurrent == staffhitanim || player[owner].animTarget == staffhitreversedanim || player[owner].animCurrent == staffhitreversedanim) {
+                        glTranslatef(0, 0, -.3);
+                    }
+                    if (player[owner].animTarget == staffgroundsmashanim || player[owner].animCurrent == staffgroundsmashanim || player[owner].animTarget == staffspinhitreversedanim || player[owner].animCurrent == staffspinhitreversedanim || player[owner].animTarget == staffspinhitanim || player[owner].animCurrent == staffspinhitanim) {
+                        glTranslatef(0, 0, -.1);
+                    }
+                }
+
+                glEnable(GL_LIGHTING);
+                switch (type) {
+                case knife:
+                    if (!bloody || !bloodtoggle)
+                        throwingknifemodel.drawdifftex(knifetextureptr);
+                    if (bloodtoggle) {
+                        if (bloody == 1)
+                            throwingknifemodel.drawdifftex(lightbloodknifetextureptr);
+                        if (bloody == 2)
+                            throwingknifemodel.drawdifftex(bloodknifetextureptr);
+                    }
+                    break;
+                case sword:
+                    if (!bloody || !bloodtoggle)
+                        swordmodel.drawdifftex(swordtextureptr);
+                    if (bloodtoggle) {
+                        if (bloody == 1)
+                            swordmodel.drawdifftex(lightbloodswordtextureptr);
+                        if (bloody == 2)
+                            swordmodel.drawdifftex(bloodswordtextureptr);
+                    }
+                    break;
+                case staff:
+                    staffmodel.drawdifftex(stafftextureptr);
+                    break;
+                }
+
+                glPopMatrix();
+            }
+
+            lastdrawnposition = position;
+            lastdrawntippoint = tippoint;
+            lastdrawnrotation1 = rotation1;
+            lastdrawnrotation2 = rotation2;
+            lastdrawnrotation3 = rotation3;
+            lastdrawnbigrotation = bigrotation;
+            lastdrawnbigtilt = bigtilt;
+            lastdrawnbigtilt2 = bigtilt2;
+            lastdrawnsmallrotation = smallrotation;
+            lastdrawnsmallrotation2 = smallrotation2;
+            if (owner != -1)lastdrawnanim = player[owner].animCurrent;
+        }
+        if (owner != -1) {
+            glMatrixMode(GL_MODELVIEW);                                                        // Select The Modelview Matrix
+            glPushMatrix();
+            glLoadIdentity();
+            glTranslatef(position.x, position.y - .02, position.z);
+            glRotatef(bigrotation, 0, 1, 0);
+            glRotatef(bigtilt2, 1, 0, 0);
+            glRotatef(bigtilt, 0, 0, 1);
+            glRotatef(-rotation1 + 90, 0, 1, 0);
+            glRotatef(-rotation2 + 90, 0, 0, 1);
+            glRotatef(-rotation3, 0, 1, 0);
+            glRotatef(smallrotation, 1, 0, 0);
+            glRotatef(smallrotation2, 0, 1, 0);
+            glTranslatef(0, 0, length);
+            glGetFloatv(GL_MODELVIEW_MATRIX, M);
+            tippoint.x = M[12];
+            tippoint.y = M[13];
+            tippoint.z = M[14];
+            glPopMatrix();
+        }
+    }
 }
 
 int Weapons::Draw()
 {
-       glAlphaFunc(GL_GREATER, 0.9);
-       glEnable(GL_TEXTURE_2D);
-       glEnable(GL_BLEND);
-       glEnable(GL_CULL_FACE);
-       glCullFace(GL_FRONT);
-       glDepthMask(1);
-       
-       for(std::vector<Weapon>::iterator weapon = begin(); weapon != end(); ++weapon) {
-               weapon->Draw();
-       }
-       return 0;
+    glAlphaFunc(GL_GREATER, 0.9);
+    glEnable(GL_TEXTURE_2D);
+    glEnable(GL_BLEND);
+    glEnable(GL_CULL_FACE);
+    glCullFace(GL_FRONT);
+    glDepthMask(1);
+
+    for (std::vector<Weapon>::iterator weapon = begin(); weapon != end(); ++weapon) {
+        weapon->Draw();
+    }
+    return 0;
 }
 
 Weapons::Weapons()
@@ -1073,12 +1052,12 @@ Weapons::Weapons()
 
 Weapons::~Weapons()
 {
-       Weapon::stafftextureptr.destroy();
-       Weapon::knifetextureptr.destroy();
-       Weapon::lightbloodknifetextureptr.destroy();
-       Weapon::bloodknifetextureptr.destroy();
-       Weapon::swordtextureptr.destroy();
-       Weapon::lightbloodswordtextureptr.destroy();
-       Weapon::bloodswordtextureptr.destroy();
+    Weapon::stafftextureptr.destroy();
+    Weapon::knifetextureptr.destroy();
+    Weapon::lightbloodknifetextureptr.destroy();
+    Weapon::bloodknifetextureptr.destroy();
+    Weapon::swordtextureptr.destroy();
+    Weapon::lightbloodswordtextureptr.destroy();
+    Weapon::bloodswordtextureptr.destroy();
 }
 
index 6b2ebbaa8dac0128147ed8c4fa81d14f7715549f..91064b06603bb77556c814b089764044a513f17b 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -41,88 +41,91 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #define sword 2
 #define staff 3
 
-class Weapon {
-       public:
-               Weapon(int type, int owner);
-                       
-               static Model throwingknifemodel;
-               static Texture knifetextureptr;
-               static Texture lightbloodknifetextureptr;
-               static Texture bloodknifetextureptr;
-
-               static Model swordmodel;
-               static Texture swordtextureptr;
-               static Texture lightbloodswordtextureptr;
-               static Texture bloodswordtextureptr;
-
-               static Model staffmodel;
-               static Texture stafftextureptr;
-       
-               void Draw();
-               void DoStuff(int);
-               
-               int getType() { return type; }
-               void setType(int);
-               
-               int owner;
-               XYZ position;
-               XYZ tippoint;
-               XYZ velocity;
-               XYZ tipvelocity;
-               bool missed;
-               bool hitsomething;
-               float freetime;
-               bool firstfree;
-               bool physics;
-               
-               float damage;
-               int bloody;
-               float blooddrip;
-               float blooddripdelay;
-               
-               float rotation1;
-               float rotation2;
-               float rotation3;
-               float bigrotation;
-               float bigtilt;
-               float bigtilt2;
-               float smallrotation;
-               float smallrotation2;
-       private:
-               int type;
-               
-               XYZ oldtippoint;
-               float lastmult;
-               XYZ oldposition;
-               int oldowner;
-               bool onfire;
-               float flamedelay;
-               float mass;
-               float tipmass;
-               float length;
-               float drawhowmany;
-
-               XYZ lastdrawnposition;
-               XYZ lastdrawntippoint;
-               float lastdrawnrotation1;
-               float lastdrawnrotation2;
-               float lastdrawnrotation3;
-               float lastdrawnbigrotation;
-               float lastdrawnbigtilt;
-               float lastdrawnbigtilt2;
-               float lastdrawnsmallrotation;
-               float lastdrawnsmallrotation2;
-               int lastdrawnanim;
+class Weapon
+{
+public:
+    Weapon(int type, int owner);
+
+    static Model throwingknifemodel;
+    static Texture knifetextureptr;
+    static Texture lightbloodknifetextureptr;
+    static Texture bloodknifetextureptr;
+
+    static Model swordmodel;
+    static Texture swordtextureptr;
+    static Texture lightbloodswordtextureptr;
+    static Texture bloodswordtextureptr;
+
+    static Model staffmodel;
+    static Texture stafftextureptr;
+
+    void Draw();
+    void DoStuff(int);
+
+    int getType() {
+        return type;
+    }
+    void setType(int);
+
+    int owner;
+    XYZ position;
+    XYZ tippoint;
+    XYZ velocity;
+    XYZ tipvelocity;
+    bool missed;
+    bool hitsomething;
+    float freetime;
+    bool firstfree;
+    bool physics;
+
+    float damage;
+    int bloody;
+    float blooddrip;
+    float blooddripdelay;
+
+    float rotation1;
+    float rotation2;
+    float rotation3;
+    float bigrotation;
+    float bigtilt;
+    float bigtilt2;
+    float smallrotation;
+    float smallrotation2;
+private:
+    int type;
+
+    XYZ oldtippoint;
+    float lastmult;
+    XYZ oldposition;
+    int oldowner;
+    bool onfire;
+    float flamedelay;
+    float mass;
+    float tipmass;
+    float length;
+    float drawhowmany;
+
+    XYZ lastdrawnposition;
+    XYZ lastdrawntippoint;
+    float lastdrawnrotation1;
+    float lastdrawnrotation2;
+    float lastdrawnrotation3;
+    float lastdrawnbigrotation;
+    float lastdrawnbigtilt;
+    float lastdrawnbigtilt2;
+    float lastdrawnsmallrotation;
+    float lastdrawnsmallrotation2;
+    int lastdrawnanim;
 };
 
 class Weapons : public std::vector<Weapon>
 {
 public:
-       Weapons();
-       ~Weapons();
-       
-       int Draw();
-       void DoStuff();
+    Weapons();
+    ~Weapons();
+
+    int Draw();
+    void DoStuff();
 };
 
 extern Weapons weapons;
index 36bdf4a0c0cee6d840986a0db8c31a10a7b7686b..3c5e3252dc72934bb3c1eebccd3989ba1a569157 100644 (file)
@@ -30,15 +30,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 class AppTime
 {
 public:
-       AppTime()
-       {
-               counterRate = 1;
-               baseCounter = 0;
-               QueryPerformanceFrequency( (LARGE_INTEGER*)&counterRate);
-               QueryPerformanceCounter( (LARGE_INTEGER*)&baseCounter);
-       }
-       __int64 counterRate;            // LARGE_INTEGER type has no math functions so use int64
-       __int64 baseCounter;
+    AppTime() {
+        counterRate = 1;
+        baseCounter = 0;
+        QueryPerformanceFrequency( (LARGE_INTEGER*)&counterRate);
+        QueryPerformanceCounter( (LARGE_INTEGER*)&baseCounter);
+    }
+    __int64 counterRate;               // LARGE_INTEGER type has no math functions so use int64
+    __int64 baseCounter;
 };
 static AppTime g_appTime;
 
@@ -46,89 +45,85 @@ static AppTime g_appTime;
 
 void CopyCStringToPascal( const char* src, unsigned char dst[256])
 {
-       int len = strlen( src);
-       dst[0] = len;
-       memcpy( dst + 1, src, len);
+    int len = strlen( src);
+    dst[0] = len;
+    memcpy( dst + 1, src, len);
 }
 
 
 void CopyPascalStringToC( const unsigned char* src, char* dst)
 {
-       int len = src[0];
-       memcpy( dst, src + 1, len);
-       dst[len] = 0;
+    int len = src[0];
+    memcpy( dst, src + 1, len);
+    dst[len] = 0;
 }
 
 
 AbsoluteTime UpTime()
 {
-       __int64 counter;
-       QueryPerformanceCounter( (LARGE_INTEGER*)&counter);
+    __int64 counter;
+    QueryPerformanceCounter( (LARGE_INTEGER*)&counter);
 
-       counter -= g_appTime.baseCounter;
+    counter -= g_appTime.baseCounter;
 
-       AbsoluteTime time;
-       time.lo = (unsigned long)counter;
-       time.hi = (unsigned long)(counter >> 32);
-       return time;
+    AbsoluteTime time;
+    time.lo = (unsigned long)counter;
+    time.hi = (unsigned long)(counter >> 32);
+    return time;
 }
 
 
 Duration AbsoluteDeltaToDuration( AbsoluteTime& a, AbsoluteTime& b)
 {
-       __int64 value = a.hi;
-       value <<= 32;
-       value |= a.lo;
-       __int64 value2 = b.hi;
-       value2 <<= 32;
-       value2 |= b.lo;
-       value -= value2;
-
-       if (value <= 0)
-               return durationImmediate;
-
-       __int64 frac = value % g_appTime.counterRate;
-       value /= g_appTime.counterRate;
-
-       Duration time;
-
-       if (value == 0)
-       {
-               frac *= -1000000;
-               frac /= g_appTime.counterRate;
-               time = (Duration)frac;
-       }
-       else
-       {
-               frac *= 1000;
-               frac /= g_appTime.counterRate;
-               value *= 1000;
-               value += frac;
-               time = (Duration)value;
-       }
-
-       return time;
+    __int64 value = a.hi;
+    value <<= 32;
+    value |= a.lo;
+    __int64 value2 = b.hi;
+    value2 <<= 32;
+    value2 |= b.lo;
+    value -= value2;
+
+    if (value <= 0)
+        return durationImmediate;
+
+    __int64 frac = value % g_appTime.counterRate;
+    value /= g_appTime.counterRate;
+
+    Duration time;
+
+    if (value == 0) {
+        frac *= -1000000;
+        frac /= g_appTime.counterRate;
+        time = (Duration)frac;
+    } else {
+        frac *= 1000;
+        frac /= g_appTime.counterRate;
+        value *= 1000;
+        value += frac;
+        time = (Duration)value;
+    }
+
+    return time;
 }
 
 
 static char g_filename[ 256];
 char* ConvertFileName( const char* orgfilename)
 {
-       // translate filename into proper path name
-       if (orgfilename[ 0] == ':')
-               orgfilename++;
-       strcpy( g_filename, orgfilename);
-
-       for (int n = 0; g_filename[ n]; n++)
-       {
-               if (g_filename[ n] == ':')
-                       g_filename[ n] = '/';
-       }
-
-       return g_filename;
+    // translate filename into proper path name
+    if (orgfilename[ 0] == ':')
+        orgfilename++;
+    strcpy( g_filename, orgfilename);
+
+    for (int n = 0; g_filename[ n]; n++) {
+        if (g_filename[ n] == ':')
+            g_filename[ n] = '/';
+    }
+
+    return g_filename;
 }
 
 char* ConvertFileName( const char* orgfilename, const char* junk)
 {
-       return ConvertFileName(orgfilename);
+    return ConvertFileName(orgfilename);
 }
index e7d05708aa59c0f80c982b04dcee9581b77ae7cd..de92c5f7180534c0cab82776ddcd9b26f27757f2 100644 (file)
@@ -42,10 +42,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 typedef bool Boolean;
 
-struct Point
-{
-       short v;
-       short h;
+struct Point {
+    short v;
+    short h;
 };
 
 typedef signed char SInt8;
@@ -59,8 +58,7 @@ void CopyCStringToPascal( const char* src, unsigned char dst[256]);
 void CopyPascalStringToC( const unsigned char* src, char* dst);
 
 
-typedef struct AbsoluteTime
-{
+typedef struct AbsoluteTime {
     unsigned long   hi;
     unsigned long   lo;
 } AbsoluteTime;
@@ -69,8 +67,7 @@ AbsoluteTime UpTime();                // NOTE: returns time since app started, not system star
 
 typedef long Duration;
 
-enum
-{
+enum {
     durationMicrosecond             = -1,
     durationMillisecond             = 1,
     durationSecond                  = 1000,
@@ -104,16 +101,16 @@ char* ConvertFileName( const char* orgfilename, const char* junk);
 
 inline float abs(float f)
 {
-       if (f < 0)
-               return -f;
-       return f;
+    if (f < 0)
+        return -f;
+    return f;
 }
 
 inline double abs(double f)
 {
-       if (f < 0)
-               return -f;
-       return f;
+    if (f < 0)
+        return -f;
+    return f;
 }
 
 
index 43d05a22fd09e5f0afbdf048d0c792e62fcbfd1d..f0503294f9744c7545cb47c81a40b779b1f3513c 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -20,32 +20,32 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
 
 
-AL_FUNC(AL,void,alGenSources,(ALsizei n, ALuint* sources),(n,sources),)
-AL_FUNC(AL,void,alDeleteSources,(ALsizei n, ALuint* sources),(n,sources),)
-AL_FUNC(AL,void,alSourcei,(ALuint sid, ALenum param, ALint value),(sid,param,value),)
-AL_FUNC(AL,void,alSourcef,(ALuint sid, ALenum param, ALfloat value),(sid,param,value),)
-AL_FUNC(AL,void,alSource3f,(ALuint sid, ALenum param, ALfloat f1, ALfloat f2, ALfloat f3),(sid,param,f1,f2,f3),)
-AL_FUNC(AL,void,alGetSourceiv,(ALuint sid, ALenum pname, ALint* values),(sid,pname,values),)
-AL_FUNC(AL,void,alSourcePlay,(ALuint sid),(sid),)
-AL_FUNC(AL,void,alSourcePause,(ALuint sid),(sid),)
-AL_FUNC(AL,void,alSourceStop,(ALuint sid),(sid),)
-AL_FUNC(AL,void,alGenBuffers,(ALsizei n, ALuint* buffers),(n,buffers),)
-AL_FUNC(AL,void,alDeleteBuffers,(ALsizei n, ALuint* buffers),(n,buffers),)
-AL_FUNC(AL,void,alBufferData,(ALuint buffer, ALenum format, ALvoid *data, ALsizei size, ALsizei freq),(buffer,format,data,size,freq),)
-AL_FUNC(AL,void,alListenerfv,(ALenum pname, ALfloat* param),(pname,param),)
-AL_FUNC(AL,void,alListener3f,(ALenum pname, ALfloat f1, ALfloat f2, ALfloat f3),(pname,f1,f2,f3),)
-AL_FUNC(AL,void,alListenerf,(ALenum pname, ALfloat param),(pname,param),)
-AL_FUNC(AL,ALenum,alGetError,(ALvoid),(),return)
-AL_FUNC(AL,const ALubyte*,alGetString,(ALenum param),(param),return)
-AL_FUNC(AL,ALboolean,alIsExtensionPresent,(const ALubyte* fname),(fname),return)
-AL_FUNC(AL,ALenum,alGetEnumValue,(const ALubyte* ename),(ename),return)
-AL_FUNC(ALC,ALCcontext *,alcCreateContext,(ALCdevice *dev, ALint* attrlist),(dev,attrlist),return)
-AL_FUNC(ALC,ALCenum,alcMakeContextCurrent,(ALCcontext *alcHandle),(alcHandle),return)
-AL_FUNC(ALC,ALCcontext *,alcProcessContext,(ALCcontext *alcHandle),(alcHandle),return)
-AL_FUNC(ALC,void,alcSuspendContext,(ALCcontext *alcHandle),(alcHandle),)
-AL_FUNC(ALC,ALCenum,alcDestroyContext,(ALCcontext *alcHandle),(alcHandle),return)
-AL_FUNC(ALC,ALCenum,alcGetError,(ALCdevice *dev),(dev),return)
-AL_FUNC(ALC,ALCcontext *,alcGetCurrentContext,(ALvoid),(),return)
-AL_FUNC(ALC,ALCdevice *,alcOpenDevice,(const ALubyte *tokstr),(tokstr),return)
-AL_FUNC(ALC,void,alcCloseDevice,(ALCdevice *dev),(dev),)
-AL_FUNC(ALC,ALCdevice*,alcGetContextsDevice,(ALCcontext *context),(context),return)
+AL_FUNC(AL, void, alGenSources, (ALsizei n, ALuint* sources), (n, sources),)
+AL_FUNC(AL, void, alDeleteSources, (ALsizei n, ALuint* sources), (n, sources),)
+AL_FUNC(AL, void, alSourcei, (ALuint sid, ALenum param, ALint value), (sid, param, value),)
+AL_FUNC(AL, void, alSourcef, (ALuint sid, ALenum param, ALfloat value), (sid, param, value),)
+AL_FUNC(AL, void, alSource3f, (ALuint sid, ALenum param, ALfloat f1, ALfloat f2, ALfloat f3), (sid, param, f1, f2, f3),)
+AL_FUNC(AL, void, alGetSourceiv, (ALuint sid, ALenum pname, ALint* values), (sid, pname, values),)
+AL_FUNC(AL, void, alSourcePlay, (ALuint sid), (sid),)
+AL_FUNC(AL, void, alSourcePause, (ALuint sid), (sid),)
+AL_FUNC(AL, void, alSourceStop, (ALuint sid), (sid),)
+AL_FUNC(AL, void, alGenBuffers, (ALsizei n, ALuint* buffers), (n, buffers),)
+AL_FUNC(AL, void, alDeleteBuffers, (ALsizei n, ALuint* buffers), (n, buffers),)
+AL_FUNC(AL, void, alBufferData, (ALuint buffer, ALenum format, ALvoid *data, ALsizei size, ALsizei freq), (buffer, format, data, size, freq),)
+AL_FUNC(AL, void, alListenerfv, (ALenum pname, ALfloat* param), (pname, param),)
+AL_FUNC(AL, void, alListener3f, (ALenum pname, ALfloat f1, ALfloat f2, ALfloat f3), (pname, f1, f2, f3),)
+AL_FUNC(AL, void, alListenerf, (ALenum pname, ALfloat param), (pname, param),)
+AL_FUNC(AL, ALenum, alGetError, (ALvoid), (), return)
+AL_FUNC(AL, const ALubyte*, alGetString, (ALenum param), (param), return)
+AL_FUNC(AL, ALboolean, alIsExtensionPresent, (const ALubyte* fname), (fname), return)
+AL_FUNC(AL, ALenum, alGetEnumValue, (const ALubyte* ename), (ename), return)
+AL_FUNC(ALC, ALCcontext *, alcCreateContext, (ALCdevice *dev, ALint* attrlist), (dev, attrlist), return)
+AL_FUNC(ALC, ALCenum, alcMakeContextCurrent, (ALCcontext *alcHandle), (alcHandle), return)
+AL_FUNC(ALC, ALCcontext *, alcProcessContext, (ALCcontext *alcHandle), (alcHandle), return)
+AL_FUNC(ALC, void, alcSuspendContext, (ALCcontext *alcHandle), (alcHandle),)
+AL_FUNC(ALC, ALCenum, alcDestroyContext, (ALCcontext *alcHandle), (alcHandle), return)
+AL_FUNC(ALC, ALCenum, alcGetError, (ALCdevice *dev), (dev), return)
+AL_FUNC(ALC, ALCcontext *, alcGetCurrentContext, (ALvoid), (), return)
+AL_FUNC(ALC, ALCdevice *, alcOpenDevice, (const ALubyte *tokstr), (tokstr), return)
+AL_FUNC(ALC, void, alcCloseDevice, (ALCdevice *dev), (dev),)
+AL_FUNC(ALC, ALCdevice*, alcGetContextsDevice, (ALCcontext *context), (context), return)
index 71016ed9f044eedfa09b569dfa419c2ec212cae5..c67ad584862125a51a53d5c92e8989d7d1246678 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -29,90 +29,89 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 extern "C" {
 #endif
 
-       /*
-       Notes on format of format strings:
-       * whitespace is ignored
-       * each "group" consists of an optional count (defaults to 1),
-       an optional byte-order marker (defaults to H, "host-native"),
-       and a  data-type specifier.
-       * when unpacking, each variable argument is a pointer to the
-       appropriate number of objects of the appropriate type.
-       * when packing, each variable argument is an object of the
-       appropriate type if the count is omitted, or a pointer to the
-       appropriate number of objects of the appropriate type if the
-       count is specified.
-       * the buffer supplied to pack/unpack must be of sufficient length
-       to hold all the data, or the behavior is unspecified.
-       * the file provided to the "f" versions of the functions must be
-       open in the appropriate mode, or the behavior is unspecified.
-       * the file supplied to funpackf must be of sufficient length to
-       hold all the data, or the behavior is unspecified.
-       * the behavior of all functions is unspecified if the format string
-       is incorrectly-formed.
-
-       Data-type specifiers:
-       x skipped byte; no corresponding argument
-       b byte
-       s two-byte two's-complement integer
-       i four-byte two's-complement integer
-       l eight-byte two's-complement integer
-       f four-byte IEEE754 float
-       d eight-byte IEEE754 double
-
-       Byte-order specifiers:
-       L little-endian
-       B big-endian
-       H host's native byte order
-       N network byte order
-       */
+    /*
+    Notes on format of format strings:
+    * whitespace is ignored
+    * each "group" consists of an optional count (defaults to 1),
+    an optional byte-order marker (defaults to H, "host-native"),
+    and a  data-type specifier.
+    * when unpacking, each variable argument is a pointer to the
+    appropriate number of objects of the appropriate type.
+    * when packing, each variable argument is an object of the
+    appropriate type if the count is omitted, or a pointer to the
+    appropriate number of objects of the appropriate type if the
+    count is specified.
+    * the buffer supplied to pack/unpack must be of sufficient length
+    to hold all the data, or the behavior is unspecified.
+    * the file provided to the "f" versions of the functions must be
+    open in the appropriate mode, or the behavior is unspecified.
+    * the file supplied to funpackf must be of sufficient length to
+    hold all the data, or the behavior is unspecified.
+    * the behavior of all functions is unspecified if the format string
+    is incorrectly-formed.
+
+    Data-type specifiers:
+    x skipped byte; no corresponding argument
+    b byte
+    s two-byte two's-complement integer
+    i four-byte two's-complement integer
+    l eight-byte two's-complement integer
+    f four-byte IEEE754 float
+    d eight-byte IEEE754 double
+
+    Byte-order specifiers:
+    L little-endian
+    B big-endian
+    H host's native byte order
+    N network byte order
+    */
 
 #ifndef ALREADY_DID_BINIO_STDINT
 #define ALREADY_DID_BINIO_STDINT
 #if defined(BinIO_STDINT_HEADER)
 #include BinIO_STDINT_HEADER
-       typedef float              float32_t;
-       typedef double             float64_t;
+    typedef float              float32_t;
+    typedef double             float64_t;
 #else
-       typedef unsigned char      uint8_t;
-       typedef unsigned short     uint16_t;
-       typedef unsigned long       uint32_t;
+    typedef unsigned char      uint8_t;
+    typedef unsigned short     uint16_t;
+    typedef unsigned long       uint32_t;
 #ifdef WIN32
-       typedef unsigned __int64        uint64_t;
+    typedef unsigned __int64   uint64_t;
 #else
-       typedef unsigned long long uint64_t;
+    typedef unsigned long long uint64_t;
 #endif
-       typedef float              float32_t;
-       typedef double             float64_t;
+    typedef float              float32_t;
+    typedef double             float64_t;
 #endif
 #endif
 
-       typedef struct
-       {
-               float64_t d;
-               uint64_t  l;
-               int  i;
-               float32_t f;
-               uint16_t  s;
-               uint8_t   b;
-       }
-       test_data;
-
-       extern void packf    (                    const char *format, ...);
-       extern void spackf   (void *buffer,       const char *format, ...);
-       extern void fpackf   (FILE *file,         const char *format, ...);
-       extern void vspackf  (void *buffer,       const char *format, va_list args);
-       extern void vfpackf  (FILE *file,         const char *format, va_list args);
-
-       extern void unpackf  (                    const char *format, ...);
-       extern void sunpackf (const void *buffer, const char *format, ...);
-       extern void funpackf (FILE       *file,   const char *format, ...);
-       extern void vsunpackf(const void *buffer, const char *format, va_list args);
-       extern void vfunpackf(FILE       *file,   const char *format, va_list args);
+    typedef struct {
+        float64_t d;
+        uint64_t  l;
+        int  i;
+        float32_t f;
+        uint16_t  s;
+        uint8_t   b;
+    }
+    test_data;
+
+    extern void packf    (                    const char *format, ...);
+    extern void spackf   (void *buffer,       const char *format, ...);
+    extern void fpackf   (FILE *file,         const char *format, ...);
+    extern void vspackf  (void *buffer,       const char *format, va_list args);
+    extern void vfpackf  (FILE *file,         const char *format, va_list args);
+
+    extern void unpackf  (                    const char *format, ...);
+    extern void sunpackf (const void *buffer, const char *format, ...);
+    extern void funpackf (FILE       *file,   const char *format, ...);
+    extern void vsunpackf(const void *buffer, const char *format, va_list args);
+    extern void vfunpackf(FILE       *file,   const char *format, va_list args);
 
 #ifdef _MSC_VER
-    #ifndef va_copy
-        #define va_copy(dest,src) do { dest = src; } while (0)
-    #endif
+#ifndef va_copy
+#define va_copy(dest,src) do { dest = src; } while (0)
+#endif
 #endif
 
 #if defined(__cplusplus)
index 5e832fb5bc6959099b292cc2eea29e4aeb22184b..589901276b6b541aa1ccf6581078a3de257befbd 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -55,10 +55,9 @@ static bool lookup_alsym(const char *funcname, void **func, const char *libname)
         return false;
 
     *func = dlsym(aldlhandle, funcname);
-    if (*func == NULL)
-    {
+    if (*func == NULL) {
         fprintf(stderr, "Failed to find OpenAL symbol \"%s\" in \"%s\"\n",
-                 funcname, libname);
+                funcname, libname);
         return false;
     }
     return true;
@@ -66,11 +65,10 @@ static bool lookup_alsym(const char *funcname, void **func, const char *libname)
 
 static void unload_alsyms(void)
 {
-    #define AL_FUNC(t,ret,fn,params,call,rt) p##fn = NULL;
-    #include "alstubs.h"
-    #undef AL_FUNC
-    if (aldlhandle)
-    {
+#define AL_FUNC(t,ret,fn,params,call,rt) p##fn = NULL;
+#include "alstubs.h"
+#undef AL_FUNC
+    if (aldlhandle) {
         dlclose(aldlhandle);
         aldlhandle = NULL;
     }
@@ -78,17 +76,16 @@ static void unload_alsyms(void)
 
 static bool lookup_all_alsyms(const char *libname)
 {
-    if (!aldlhandle)
-    {
+    if (!aldlhandle) {
         if ( (aldlhandle = dlopen(libname, RTLD_GLOBAL | RTLD_NOW)) == NULL )
             return false;
     }
 
     bool retval = true;
-    #define AL_FUNC(t,ret,fn,params,call,rt) \
+#define AL_FUNC(t,ret,fn,params,call,rt) \
         if (!lookup_alsym(#fn, (void **) &p##fn, libname)) retval = false;
-    #include "alstubs.h"
-    #undef AL_FUNC
+#include "alstubs.h"
+#undef AL_FUNC
 
     if (!retval)
         unload_alsyms();
@@ -100,16 +97,14 @@ static bool lookup_all_alsyms(const char *libname)
 #define unload_alsyms()
 #endif
 
-typedef struct
-{
+typedef struct {
     ALuint sid;
     OPENAL_SAMPLE *sample;
     bool startpaused;
     float position[3];
 } OPENAL_Channels;
 
-typedef struct OPENAL_SAMPLE
-{
+typedef struct OPENAL_SAMPLE {
     char *name;
     ALuint bid;  // buffer id.
     int mode;
@@ -137,13 +132,10 @@ static void set_channel_position(const int channel, const float x,
     const ALuint sid = chan->sid;
     const bool no_attenuate = sptr->is2d;
 
-    if (no_attenuate)
-    {
+    if (no_attenuate) {
         alSourcei(sid, AL_SOURCE_RELATIVE, AL_TRUE);
         alSource3f(sid, AL_POSITION, 0.0f, 0.0f, 0.0f);
-    }
-    else
-    {
+    } else {
         alSourcei(sid, AL_SOURCE_RELATIVE, AL_FALSE);
         alSource3f(sid, AL_POSITION, x, y, z);
     }
@@ -153,8 +145,7 @@ static void set_channel_position(const int channel, const float x,
 AL_API void OPENAL_3D_Listener_SetAttributes(const float *pos, const float *vel, float fx, float fy, float fz, float tx, float ty, float tz)
 {
     if (!initialized) return;
-    if (pos != NULL)
-    {
+    if (pos != NULL) {
         alListener3f(AL_POSITION, pos[0], pos[1], -pos[2]);
         listener_position[0] = pos[0];
         listener_position[1] = pos[1];
@@ -167,8 +158,7 @@ AL_API void OPENAL_3D_Listener_SetAttributes(const float *pos, const float *vel,
     // we ignore velocity, since doppler's broken in the Linux AL at the moment...
 
     // adjust existing positions...
-    for (int i = 0; i < num_channels; i++)
-    {
+    for (int i = 0; i < num_channels; i++) {
         const float *p = impl_channels[i].position;
         set_channel_position(i, p[0], p[1], p[2]);
     }
@@ -205,10 +195,8 @@ AL_API signed char OPENAL_Init(int mixrate, int maxsoftwarechannels, unsigned in
     if (flags != 0)  // unsupported.
         return false;
 
-    if (!lookup_all_alsyms("./openal.so"))  // !!! FIXME: linux specific lib name
-    {
-        if (!lookup_all_alsyms("openal.so.1"))  // !!! FIXME: linux specific lib name
-        {
+    if (!lookup_all_alsyms("./openal.so")) { // !!! FIXME: linux specific lib name
+        if (!lookup_all_alsyms("openal.so.1")) { // !!! FIXME: linux specific lib name
             if (!lookup_all_alsyms("openal.so"))  // !!! FIXME: linux specific lib name
                 return false;
         }
@@ -220,8 +208,7 @@ AL_API signed char OPENAL_Init(int mixrate, int maxsoftwarechannels, unsigned in
 
     ALint caps[] = { ALC_FREQUENCY, mixrate, 0 };
     ALCcontext *ctx = alcCreateContext(dev, caps);
-    if (!ctx)
-    {
+    if (!ctx) {
         alcCloseDevice(dev);
         return false;
     }
@@ -229,9 +216,8 @@ AL_API signed char OPENAL_Init(int mixrate, int maxsoftwarechannels, unsigned in
     alcMakeContextCurrent(ctx);
     alcProcessContext(ctx);
 
-    bool cmdline(const char *cmd);
-    if (cmdline("openalinfo"))
-    {
+    bool cmdline(const char * cmd);
+    if (cmdline("openalinfo")) {
         printf("AL_VENDOR: %s\n", (char *) alGetString(AL_VENDOR));
         printf("AL_RENDERER: %s\n", (char *) alGetString(AL_RENDERER));
         printf("AL_VERSION: %s\n", (char *) alGetString(AL_VERSION));
@@ -253,10 +239,8 @@ AL_API void OPENAL_Close()
     if (!initialized) return;
 
     ALCcontext *ctx = alcGetCurrentContext();
-    if (ctx)
-    {
-        for (int i = 0; i < num_channels; i++)
-        {
+    if (ctx) {
+        for (int i = 0; i < num_channels; i++) {
             alSourceStop(impl_channels[i].sid);
             alSourcei(impl_channels[i].sid, AL_BUFFER, 0);
             alDeleteSources(1, &impl_channels[i].sid);
@@ -320,14 +304,11 @@ static int OPENAL_PlaySoundEx(int channel, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *
     if (!initialized) return -1;
     if (sptr == NULL) return -1;
     if (dsp != NULL) return -1;
-    if (channel == OPENAL_FREE)
-    {
-        for (int i = 0; i < num_channels; i++)
-        {
+    if (channel == OPENAL_FREE) {
+        for (int i = 0; i < num_channels; i++) {
             ALint state = 0;
             alGetSourceiv(impl_channels[i].sid, AL_SOURCE_STATE, &state);
-            if ((state != AL_PLAYING) && (state != AL_PAUSED))
-            {
+            if ((state != AL_PLAYING) && (state != AL_PAUSED)) {
                 channel = i;
                 break;
             }
@@ -364,17 +345,16 @@ static void *decode_to_pcm(const char *_fname, ALenum &format, ALsizei &size, AL
     strcat(fname, ".ogg");
 
     // just in case...
-    #undef fopen
+#undef fopen
     FILE *io = fopen(fname, "rb");
     if (io == NULL)
         return NULL;
 
     ALubyte *retval = NULL;
 
-    #if 0  // untested, so disable this!
+#if 0  // untested, so disable this!
     // Can we just feed it to the AL compressed?
-    if (alIsExtensionPresent((const ALubyte *) "AL_EXT_vorbis"))
-    {
+    if (alIsExtensionPresent((const ALubyte *) "AL_EXT_vorbis")) {
         format = alGetEnumValue((const ALubyte *) "AL_FORMAT_VORBIS_EXT");
         freq = 44100;
         fseek(io, 0, SEEK_END);
@@ -383,28 +363,25 @@ static void *decode_to_pcm(const char *_fname, ALenum &format, ALsizei &size, AL
         retval = (ALubyte *) malloc(size);
         size_t rc = fread(retval, size, 1, io);
         fclose(io);
-        if (rc != 1)
-        {
+        if (rc != 1) {
             free(retval);
             return NULL;
         }
         return retval;
     }
-    #endif
+#endif
 
     // Uncompress and feed to the AL.
     OggVorbis_File vf;
     memset(&vf, '\0', sizeof (vf));
-    if (ov_open(io, &vf, NULL, 0) == 0)
-    {
+    if (ov_open(io, &vf, NULL, 0) == 0) {
         int bitstream = 0;
         vorbis_info *info = ov_info(&vf, -1);
         size = 0;
         format = (info->channels == 1) ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;
         freq = info->rate;
 
-        if ((info->channels != 1) && (info->channels != 2))
-        {
+        if ((info->channels != 1) && (info->channels != 2)) {
             ov_clear(&vf);
             return NULL;
         }
@@ -413,17 +390,13 @@ static void *decode_to_pcm(const char *_fname, ALenum &format, ALsizei &size, AL
         long rc = 0;
         size_t allocated = 64 * 1024;
         retval = (ALubyte *) malloc(allocated);
-        while ( (rc = ov_read(&vf, buf, sizeof (buf), bigendian, 2, 1, &bitstream)) != 0 )
-        {
-            if (rc > 0)
-            {
+        while ( (rc = ov_read(&vf, buf, sizeof (buf), bigendian, 2, 1, &bitstream)) != 0 ) {
+            if (rc > 0) {
                 size += rc;
-                if (size >= allocated)
-                {
+                if (size >= allocated) {
                     allocated *= 2;
                     ALubyte *tmp = (ALubyte *) realloc(retval, allocated);
-                    if (tmp == NULL)
-                    {
+                    if (tmp == NULL) {
                         free(retval);
                         retval = NULL;
                         break;
@@ -462,8 +435,7 @@ AL_API OPENAL_SAMPLE *OPENAL_Sample_Load(int index, const char *name_or_data, un
     ALuint bid = 0;
     alGetError();
     alGenBuffers(1, &bid);
-    if (alGetError() == AL_NO_ERROR)
-    {
+    if (alGetError() == AL_NO_ERROR) {
         alBufferData(bid, format, data, size, frequency);
         retval = new OPENAL_SAMPLE;
         retval->bid = bid;
@@ -481,12 +453,9 @@ AL_API OPENAL_SAMPLE *OPENAL_Sample_Load(int index, const char *name_or_data, un
 AL_API void OPENAL_Sample_Free(OPENAL_SAMPLE *sptr)
 {
     if (!initialized) return;
-    if (sptr)
-    {
-        for (int i = 0; i < num_channels; i++)
-        {
-            if (impl_channels[i].sample == sptr)
-            {
+    if (sptr) {
+        for (int i = 0; i < num_channels; i++) {
+            if (impl_channels[i].sample == sptr) {
                 alSourceStop(impl_channels[i].sid);
                 alSourcei(impl_channels[i].sid, AL_BUFFER, 0);
                 impl_channels[i].sample = NULL;
@@ -510,8 +479,7 @@ static signed char OPENAL_Sample_SetMode(OPENAL_SAMPLE *sptr, unsigned int mode)
 AL_API signed char OPENAL_SetFrequency(int channel, int freq)
 {
     if (!initialized) return false;
-    if (channel == OPENAL_ALL)
-    {
+    if (channel == OPENAL_ALL) {
         for (int i = 0; i < num_channels; i++)
             OPENAL_SetFrequency(i, freq);
         return true;
@@ -529,8 +497,7 @@ AL_API signed char OPENAL_SetVolume(int channel, int vol)
 {
     if (!initialized) return false;
 
-    if (channel == OPENAL_ALL)
-    {
+    if (channel == OPENAL_ALL) {
         for (int i = 0; i < num_channels; i++)
             OPENAL_SetVolume(i, vol);
         return true;
@@ -549,8 +516,7 @@ AL_API signed char OPENAL_SetPaused(int channel, signed char paused)
 {
     if (!initialized) return false;
 
-    if (channel == OPENAL_ALL)
-    {
+    if (channel == OPENAL_ALL) {
         for (int i = 0; i < num_channels; i++)
             OPENAL_SetPaused(i, paused);
         return true;
@@ -566,8 +532,7 @@ AL_API signed char OPENAL_SetPaused(int channel, signed char paused)
 
     if ((paused) && (state == AL_PLAYING))
         alSourcePause(impl_channels[channel].sid);
-    else if ((!paused) && (state == AL_PAUSED))
-    {
+    else if ((!paused) && (state == AL_PAUSED)) {
         alSourcePlay(impl_channels[channel].sid);
         impl_channels[channel].startpaused = false;
     }
@@ -585,8 +550,7 @@ AL_API signed char OPENAL_StopSound(int channel)
 {
     if (!initialized) return false;
 
-    if (channel == OPENAL_ALL)
-    {
+    if (channel == OPENAL_ALL) {
         for (int i = 0; i < num_channels; i++)
             OPENAL_StopSound(i);
         return true;
@@ -617,10 +581,8 @@ static int OPENAL_Stream_PlayEx(int channel, OPENAL_STREAM *stream, OPENAL_DSPUN
 static signed char OPENAL_Stream_Stop(OPENAL_STREAM *stream)
 {
     if (!initialized) return false;
-    for (int i = 0; i < num_channels; i++)
-    {
-        if (impl_channels[i].sample == (OPENAL_SAMPLE *) stream)
-        {
+    for (int i = 0; i < num_channels; i++) {
+        if (impl_channels[i].sample == (OPENAL_SAMPLE *) stream) {
             alSourceStop(impl_channels[i].sid);
             impl_channels[i].startpaused = false;
         }
@@ -648,54 +610,42 @@ extern int channels[];
 
 extern "C" void PlaySoundEx(int chan, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused)
 {
-       const OPENAL_SAMPLE * currSample = OPENAL_GetCurrentSample(channels[chan]);
-       if (currSample && currSample == samp[chan])
-       {
-               if (OPENAL_GetPaused(channels[chan]))
-               {
-                       OPENAL_StopSound(channels[chan]);
-                       channels[chan] = OPENAL_FREE;
-               }
-               else if (OPENAL_IsPlaying(channels[chan]))
-               {
-                       int loop_mode = OPENAL_GetLoopMode(channels[chan]);
-                       if (loop_mode & OPENAL_LOOP_OFF)
-                       {
-                               channels[chan] = OPENAL_FREE;
-                       }
-               }
-       }
-       else
-       {
-               channels[chan] = OPENAL_FREE;
-       }
-
-       channels[chan] = OPENAL_PlaySoundEx(channels[chan], sptr, dsp, startpaused);
-       if (channels[chan] < 0)
-       {
-               channels[chan] = OPENAL_PlaySoundEx(OPENAL_FREE, sptr, dsp, startpaused);
-       }
+    const OPENAL_SAMPLE * currSample = OPENAL_GetCurrentSample(channels[chan]);
+    if (currSample && currSample == samp[chan]) {
+        if (OPENAL_GetPaused(channels[chan])) {
+            OPENAL_StopSound(channels[chan]);
+            channels[chan] = OPENAL_FREE;
+        } else if (OPENAL_IsPlaying(channels[chan])) {
+            int loop_mode = OPENAL_GetLoopMode(channels[chan]);
+            if (loop_mode & OPENAL_LOOP_OFF) {
+                channels[chan] = OPENAL_FREE;
+            }
+        }
+    } else {
+        channels[chan] = OPENAL_FREE;
+    }
+
+    channels[chan] = OPENAL_PlaySoundEx(channels[chan], sptr, dsp, startpaused);
+    if (channels[chan] < 0) {
+        channels[chan] = OPENAL_PlaySoundEx(OPENAL_FREE, sptr, dsp, startpaused);
+    }
 }
 
 extern "C" void PlayStreamEx(int chan, OPENAL_STREAM *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused)
 {
-       const OPENAL_SAMPLE * currSample = OPENAL_GetCurrentSample(channels[chan]);
-       if (currSample && currSample == OPENAL_Stream_GetSample(sptr))
-       {
-                       OPENAL_StopSound(channels[chan]);
-                       OPENAL_Stream_Stop(sptr);
-       }
-       else
-       {
-               OPENAL_Stream_Stop(sptr);
-               channels[chan] = OPENAL_FREE;
-       }
-
-       channels[chan] = OPENAL_Stream_PlayEx(channels[chan], sptr, dsp, startpaused);
-       if (channels[chan] < 0)
-       {
-               channels[chan] = OPENAL_Stream_PlayEx(OPENAL_FREE, sptr, dsp, startpaused);
-       }
+    const OPENAL_SAMPLE * currSample = OPENAL_GetCurrentSample(channels[chan]);
+    if (currSample && currSample == OPENAL_Stream_GetSample(sptr)) {
+        OPENAL_StopSound(channels[chan]);
+        OPENAL_Stream_Stop(sptr);
+    } else {
+        OPENAL_Stream_Stop(sptr);
+        channels[chan] = OPENAL_FREE;
+    }
+
+    channels[chan] = OPENAL_Stream_PlayEx(channels[chan], sptr, dsp, startpaused);
+    if (channels[chan] < 0) {
+        channels[chan] = OPENAL_Stream_PlayEx(OPENAL_FREE, sptr, dsp, startpaused);
+    }
 }
 
 #endif
index e0c8b7d7b586ec190edac1160e2bd88a90db2fb2..a7d6af2c28438f7bc9ab7eecfae87d69c963065a 100644 (file)
@@ -47,11 +47,10 @@ typedef struct OPENAL_SAMPLE    OPENAL_SAMPLE;
 typedef OPENAL_SAMPLE    OPENAL_STREAM;
 typedef struct OPENAL_DSPUNIT   OPENAL_DSPUNIT;
 
-enum OPENAL_OUTPUTTYPES
-{
-       OPENAL_OUTPUT_NOSOUND,    /* NoSound driver, all calls to this succeed but do nothing. */
-       OPENAL_OUTPUT_OSS,        /* Linux/Unix OSS (Open Sound System) driver, i.e. the kernel sound drivers. */
-       OPENAL_OUTPUT_ALSA,       /* Linux Alsa driver. */
+enum OPENAL_OUTPUTTYPES {
+    OPENAL_OUTPUT_NOSOUND,    /* NoSound driver, all calls to this succeed but do nothing. */
+    OPENAL_OUTPUT_OSS,        /* Linux/Unix OSS (Open Sound System) driver, i.e. the kernel sound drivers. */
+    OPENAL_OUTPUT_ALSA,       /* Linux Alsa driver. */
 };
 
 #define OPENAL_LOOP_OFF      0x00000001  /* For non looping samples. */
@@ -68,24 +67,24 @@ extern "C" {
 #undef AL_API
 #define AL_API
 
-AL_API void OPENAL_3D_Listener_SetAttributes(const float *pos, const float *vel, float fx, float fy, float fz, float tx, float ty, float tz);
-AL_API signed char OPENAL_3D_SetAttributes(int channel, const float *pos, const float *vel);
-AL_API signed char OPENAL_3D_SetAttributes_(int channel, const XYZ &pos, const float *vel);
-AL_API signed char OPENAL_Init(int mixrate, int maxsoftwarechannels, unsigned int flags);
-AL_API void OPENAL_Close();
-AL_API OPENAL_SAMPLE *OPENAL_Sample_Load(int index, const char *name_or_data, unsigned int mode, int offset, int length);
-AL_API void OPENAL_Sample_Free(OPENAL_SAMPLE *sptr);
-AL_API signed char OPENAL_SetFrequency(int channel, int freq);
-AL_API signed char OPENAL_SetVolume(int channel, int vol);
-AL_API signed char OPENAL_SetPaused(int channel, signed char paused);
-AL_API void OPENAL_SetSFXMasterVolume(int volume);
-AL_API signed char OPENAL_StopSound(int channel);
-AL_API void OPENAL_Stream_Close(OPENAL_STREAM *stream);
-AL_API signed char OPENAL_Stream_SetMode(OPENAL_STREAM *stream, unsigned int mode);
-AL_API void OPENAL_Update();
-AL_API signed char OPENAL_SetOutput(int outputtype);
-void PlaySoundEx(int chan, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused);
-void PlayStreamEx(int chan, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused);
+    AL_API void OPENAL_3D_Listener_SetAttributes(const float *pos, const float *vel, float fx, float fy, float fz, float tx, float ty, float tz);
+    AL_API signed char OPENAL_3D_SetAttributes(int channel, const float *pos, const float *vel);
+    AL_API signed char OPENAL_3D_SetAttributes_(int channel, const XYZ &pos, const float *vel);
+    AL_API signed char OPENAL_Init(int mixrate, int maxsoftwarechannels, unsigned int flags);
+    AL_API void OPENAL_Close();
+    AL_API OPENAL_SAMPLE *OPENAL_Sample_Load(int index, const char *name_or_data, unsigned int mode, int offset, int length);
+    AL_API void OPENAL_Sample_Free(OPENAL_SAMPLE *sptr);
+    AL_API signed char OPENAL_SetFrequency(int channel, int freq);
+    AL_API signed char OPENAL_SetVolume(int channel, int vol);
+    AL_API signed char OPENAL_SetPaused(int channel, signed char paused);
+    AL_API void OPENAL_SetSFXMasterVolume(int volume);
+    AL_API signed char OPENAL_StopSound(int channel);
+    AL_API void OPENAL_Stream_Close(OPENAL_STREAM *stream);
+    AL_API signed char OPENAL_Stream_SetMode(OPENAL_STREAM *stream, unsigned int mode);
+    AL_API void OPENAL_Update();
+    AL_API signed char OPENAL_SetOutput(int outputtype);
+    void PlaySoundEx(int chan, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused);
+    void PlayStreamEx(int chan, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused);
 
 #ifdef __cplusplus
 }
index 7c371f8ff83b6f8a2bdafd242d61c651e0710993..f26b2e2b0abc0bff0f95ee70db6aa4a1e0b7bc6d 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -24,8 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "binio.h"
 #include "private.h"
 
-struct BinIOPackContext
-{
+struct BinIOPackContext {
     uint8_t *buffer;
     va_list  args;
 };
@@ -33,70 +32,78 @@ struct BinIOPackContext
 static void BinIOPack(void *context, int type, int byte_order, int count)
 {
     struct BinIOPackContext *ctx = (struct BinIOPackContext*)context;
-    if (count == -1)
-    {
-        switch (type)
-        {
-            case BinIO_TYPE_IGNORE_BYTE:
-                {
-                    ctx->buffer += 1;
-                }
-                break;
-            case BinIO_TYPE_BYTE:
-                {
-                    uint8_t value = va_arg(ctx->args, int);
-                    BinIOConvert1(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
-                    ctx->buffer += 1;
-                }
-                break;
-            case BinIO_TYPE_INT16:
-                {
-                    uint16_t value = va_arg(ctx->args, int);
-                    BinIOConvert2(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
-                    ctx->buffer += 2;
-                }
-                break;
-            case BinIO_TYPE_INT32:
-                {
-                    int value = va_arg(ctx->args, int);
-                    BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
-                    ctx->buffer += 4;
-                }
-                break;
-            case BinIO_TYPE_INT64:
-                {
-                    uint64_t value = va_arg(ctx->args, uint64_t);
-                    BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
-                    ctx->buffer += 8;
-                }
-                break;
-            case BinIO_TYPE_FLOAT32:
-                {
-                    float32_t value = (float32_t)va_arg(ctx->args, double);
-                    BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
-                    ctx->buffer += 4;
-                }
-                break;
-            case BinIO_TYPE_FLOAT64:
-                {
-                    float64_t value = va_arg(ctx->args, float64_t);
-                    BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
-                    ctx->buffer += 8;
-                }
-                break;
+    if (count == -1) {
+        switch (type) {
+        case BinIO_TYPE_IGNORE_BYTE: {
+            ctx->buffer += 1;
         }
-    }
-    else
-    {
-        switch (type)
-        {
-            case BinIO_TYPE_IGNORE_BYTE:                                                                                                     ctx->buffer += 1 * count; break;
-            case BinIO_TYPE_BYTE:        BinIOConvert1(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count); ctx->buffer += 1 * count; break;
-            case BinIO_TYPE_INT16:       BinIOConvert2(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count); ctx->buffer += 2 * count; break;
-            case BinIO_TYPE_INT32:       BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count); ctx->buffer += 4 * count; break;
-            case BinIO_TYPE_INT64:       BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count); ctx->buffer += 8 * count; break;
-            case BinIO_TYPE_FLOAT32:     BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count); ctx->buffer += 4 * count; break;
-            case BinIO_TYPE_FLOAT64:     BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count); ctx->buffer += 8 * count; break;
+        break;
+        case BinIO_TYPE_BYTE: {
+            uint8_t value = va_arg(ctx->args, int);
+            BinIOConvert1(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
+            ctx->buffer += 1;
+        }
+        break;
+        case BinIO_TYPE_INT16: {
+            uint16_t value = va_arg(ctx->args, int);
+            BinIOConvert2(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
+            ctx->buffer += 2;
+        }
+        break;
+        case BinIO_TYPE_INT32: {
+            int value = va_arg(ctx->args, int);
+            BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
+            ctx->buffer += 4;
+        }
+        break;
+        case BinIO_TYPE_INT64: {
+            uint64_t value = va_arg(ctx->args, uint64_t);
+            BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
+            ctx->buffer += 8;
+        }
+        break;
+        case BinIO_TYPE_FLOAT32: {
+            float32_t value = (float32_t)va_arg(ctx->args, double);
+            BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
+            ctx->buffer += 4;
+        }
+        break;
+        case BinIO_TYPE_FLOAT64: {
+            float64_t value = va_arg(ctx->args, float64_t);
+            BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, (const uint8_t *)&value, ctx->buffer, 1);
+            ctx->buffer += 8;
+        }
+        break;
+        }
+    } else {
+        switch (type) {
+        case BinIO_TYPE_IGNORE_BYTE:
+            ctx->buffer += 1 * count;
+            break;
+        case BinIO_TYPE_BYTE:
+            BinIOConvert1(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count);
+            ctx->buffer += 1 * count;
+            break;
+        case BinIO_TYPE_INT16:
+            BinIOConvert2(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count);
+            ctx->buffer += 2 * count;
+            break;
+        case BinIO_TYPE_INT32:
+            BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count);
+            ctx->buffer += 4 * count;
+            break;
+        case BinIO_TYPE_INT64:
+            BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count);
+            ctx->buffer += 8 * count;
+            break;
+        case BinIO_TYPE_FLOAT32:
+            BinIOConvert4(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count);
+            ctx->buffer += 4 * count;
+            break;
+        case BinIO_TYPE_FLOAT64:
+            BinIOConvert8(BinIO_HOST_BYTE_ORDER, byte_order, va_arg(ctx->args, uint8_t *), ctx->buffer, count);
+            ctx->buffer += 8 * count;
+            break;
         }
     }
 }
@@ -144,9 +151,9 @@ extern void vfpackf(FILE *file, const char *format, va_list args)
 {
     size_t n_bytes = BinIOFormatByteCount(format);
     void* buffer = malloc(n_bytes);
-    
+
     vspackf(buffer, format, args);
-    
+
     fwrite(buffer, n_bytes, 1, file);
     free(buffer);
 }
index c18946c1713a2f270bfa1efeff9505439089fb6d..69eec69b3f2f1ed27fb386b477b32fc84699f67a 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -28,18 +28,14 @@ void BinIOConvert1(int from_byte_order, int to_byte_order,
                    unsigned int count)
 {
     if (BinIONormalizeByteOrder(from_byte_order) !=
-        BinIONormalizeByteOrder(to_byte_order))
-    {
+            BinIONormalizeByteOrder(to_byte_order)) {
         unsigned int i;
-        for (i = 0; i < count; ++i)
-        {
+        for (i = 0; i < count; ++i) {
             BinIOSwap1(src, dst);
             src += 1;
             dst += 1;
         }
-    }
-    else
-    {
+    } else {
         memcpy(dst, src, 1 * count);
     }
 }
@@ -49,18 +45,14 @@ void BinIOConvert2(int from_byte_order, int to_byte_order,
                    unsigned int count)
 {
     if (BinIONormalizeByteOrder(from_byte_order) !=
-        BinIONormalizeByteOrder(to_byte_order))
-    {
+            BinIONormalizeByteOrder(to_byte_order)) {
         unsigned int i;
-        for (i = 0; i < count; ++i)
-        {
+        for (i = 0; i < count; ++i) {
             BinIOSwap2(src, dst);
             src += 2;
             dst += 2;
         }
-    }
-    else
-    {
+    } else {
         memcpy(dst, src, 2 * count);
     }
 }
@@ -70,18 +62,14 @@ void BinIOConvert4(int from_byte_order, int to_byte_order,
                    unsigned int count)
 {
     if (BinIONormalizeByteOrder(from_byte_order) !=
-        BinIONormalizeByteOrder(to_byte_order))
-    {
+            BinIONormalizeByteOrder(to_byte_order)) {
         unsigned int i;
-        for (i = 0; i < count; ++i)
-        {
+        for (i = 0; i < count; ++i) {
             BinIOSwap4(src, dst);
             src += 4;
             dst += 4;
         }
-    }
-    else
-    {
+    } else {
         memcpy(dst, src, 4 * count);
     }
 }
@@ -91,18 +79,14 @@ void BinIOConvert8(int from_byte_order, int to_byte_order,
                    unsigned int count)
 {
     if (BinIONormalizeByteOrder(from_byte_order) !=
-        BinIONormalizeByteOrder(to_byte_order))
-    {
+            BinIONormalizeByteOrder(to_byte_order)) {
         unsigned int i;
-        for (i = 0; i < count; ++i)
-        {
+        for (i = 0; i < count; ++i) {
             BinIOSwap8(src, dst);
             src += 8;
             dst += 8;
         }
-    }
-    else
-    {
+    } else {
         memcpy(dst, src, 8 * count);
     }
 }
@@ -121,71 +105,90 @@ int BinIONextChar(void                     *context,
 {
     int count, value;
     int c;
-    switch (c = *(cursor->cursor)++)
-    {
-        case BinIO_LITTLE_ENDIAN_BYTE_ORDER:
-        case BinIO_BIG_ENDIAN_BYTE_ORDER:
-        case BinIO_HOST_BYTE_ORDER:
-        case BinIO_NETWORK_BYTE_ORDER:
-            cursor->byte_order = c;
-            break;
-        
-        case '0': case '1': case '2': case '3': case '4':
-        case '5': case '6': case '7': case '8': case '9':
-            count = cursor->count;
-            value = c - '0';
-            if (count == -1)
-            {
-                cursor->count = value;
-            }
-            else
-            {
-                cursor->count = (count * 10) + value;
-            }
-            break;
-            
-        case BinIO_TYPE_IGNORE_BYTE:
-        case BinIO_TYPE_BYTE:
-        case BinIO_TYPE_INT16:
-        case BinIO_TYPE_INT32:
-        case BinIO_TYPE_INT64:
-        case BinIO_TYPE_FLOAT32:
-        case BinIO_TYPE_FLOAT64:
-            func(context, c, cursor->byte_order, cursor->count);
-            cursor->byte_order = BinIO_HOST_BYTE_ORDER;
-            cursor->count = -1;
-            break;
-            
-        case ' ': case '\t': case '\r': case '\n':
-            break;
-            
-        default:
-            return 0;
+    switch (c = *(cursor->cursor)++) {
+    case BinIO_LITTLE_ENDIAN_BYTE_ORDER:
+    case BinIO_BIG_ENDIAN_BYTE_ORDER:
+    case BinIO_HOST_BYTE_ORDER:
+    case BinIO_NETWORK_BYTE_ORDER:
+        cursor->byte_order = c;
+        break;
+
+    case '0':
+    case '1':
+    case '2':
+    case '3':
+    case '4':
+    case '5':
+    case '6':
+    case '7':
+    case '8':
+    case '9':
+        count = cursor->count;
+        value = c - '0';
+        if (count == -1) {
+            cursor->count = value;
+        } else {
+            cursor->count = (count * 10) + value;
+        }
+        break;
+
+    case BinIO_TYPE_IGNORE_BYTE:
+    case BinIO_TYPE_BYTE:
+    case BinIO_TYPE_INT16:
+    case BinIO_TYPE_INT32:
+    case BinIO_TYPE_INT64:
+    case BinIO_TYPE_FLOAT32:
+    case BinIO_TYPE_FLOAT64:
+        func(context, c, cursor->byte_order, cursor->count);
+        cursor->byte_order = BinIO_HOST_BYTE_ORDER;
+        cursor->count = -1;
+        break;
+
+    case ' ':
+    case '\t':
+    case '\r':
+    case '\n':
+        break;
+
+    default:
+        return 0;
     }
-    
+
     return 1;
 }
 
 extern void BinIOCountBytes(void *context, int type, int byte_order, int count)
 {
     size_t type_size = 0;
-    
-    if (count == -1)
-    {
+
+    if (count == -1) {
         count = 1;
     }
-    
-    switch (type)
-    {
-        case BinIO_TYPE_IGNORE_BYTE: type_size = 1; break;
-        case BinIO_TYPE_BYTE:        type_size = 1; break;
-        case BinIO_TYPE_INT16:       type_size = 2; break;
-        case BinIO_TYPE_INT32:       type_size = 4; break;
-        case BinIO_TYPE_INT64:       type_size = 8; break;
-        case BinIO_TYPE_FLOAT32:     type_size = 4; break;
-        case BinIO_TYPE_FLOAT64:     type_size = 8; break;
+
+    switch (type) {
+    case BinIO_TYPE_IGNORE_BYTE:
+        type_size = 1;
+        break;
+    case BinIO_TYPE_BYTE:
+        type_size = 1;
+        break;
+    case BinIO_TYPE_INT16:
+        type_size = 2;
+        break;
+    case BinIO_TYPE_INT32:
+        type_size = 4;
+        break;
+    case BinIO_TYPE_INT64:
+        type_size = 8;
+        break;
+    case BinIO_TYPE_FLOAT32:
+        type_size = 4;
+        break;
+    case BinIO_TYPE_FLOAT64:
+        type_size = 8;
+        break;
     }
-    
+
     *(size_t*)context += type_size * count;
 }
 
@@ -195,8 +198,8 @@ extern size_t BinIOFormatByteCount(const char *format)
     size_t n_bytes = 0;
 
     BinIOInitFormatCursor(&cursor, format);
-    
+
     while (BinIONextChar(&n_bytes, &cursor, BinIOCountBytes)) {}
-    
+
     return n_bytes;
 }
index 44962a1dd54b61e7bca602c7d48ef37aeb9b3d5c..0c40c671123cf7b8de9928428f16c6c33dd43ae9 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -49,9 +49,9 @@ typedef unsigned char      uint8_t;
 typedef unsigned short     uint16_t;
 typedef unsigned long      uint32_t;
 #ifdef WIN32
-       typedef unsigned __int64        uint64_t;
+typedef unsigned __int64       uint64_t;
 #else
-       typedef unsigned long long uint64_t;
+typedef unsigned long long uint64_t;
 #endif
 typedef float              float32_t;
 typedef double             float64_t;
@@ -107,15 +107,12 @@ BinIO_INLINE void BinIOSwap8(const uint8_t *src, uint8_t *dst)
 
 BinIO_INLINE int BinIONormalizeByteOrder(int byte_order)
 {
-    if (byte_order == BinIO_HOST_BYTE_ORDER)
-    {
+    if (byte_order == BinIO_HOST_BYTE_ORDER) {
         byte_order = BinIO_BYTE_ORDER;
-    }
-    else if (byte_order == BinIO_NETWORK_BYTE_ORDER)
-    {
+    } else if (byte_order == BinIO_NETWORK_BYTE_ORDER) {
         byte_order = BinIO_BIG_ENDIAN_BYTE_ORDER;
     }
-    
+
     return byte_order;
 }
 
@@ -132,8 +129,7 @@ extern void BinIOConvert8(int from_byte_order, int to_byte_order,
                           const uint8_t *src, uint8_t *dst,
                           unsigned int count);
 
-struct BinIOFormatCursor
-{
+struct BinIOFormatCursor {
     const char *cursor;
     int         byte_order;
     int         count;
index c40c5b7cb42ecda8d20990a4d6f915bb1d10c067..429a2cdf5039f5ea202bdd0a45b06efbc3fe4fe2 100644 (file)
@@ -10,7 +10,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -24,8 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "binio.h"
 #include "private.h"
 
-struct BinIOUnpackContext
-{
+struct BinIOUnpackContext {
     const uint8_t *data;
     va_list        args;
 };
@@ -33,20 +32,38 @@ struct BinIOUnpackContext
 static void BinIOUnpack(void *context, int type, int byte_order, int count)
 {
     struct BinIOUnpackContext *ctx = (struct BinIOUnpackContext*)context;
-    if (count == -1)
-    {
+    if (count == -1) {
         count = 1;
     }
 
-    switch (type)
-    {
-        case BinIO_TYPE_IGNORE_BYTE:                                                                                                   ctx->data += 1 * count; break;
-        case BinIO_TYPE_BYTE:        BinIOConvert1(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count); ctx->data += 1 * count; break;
-        case BinIO_TYPE_INT16:       BinIOConvert2(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count); ctx->data += 2 * count; break;
-        case BinIO_TYPE_INT32:       BinIOConvert4(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count); ctx->data += 4 * count; break;
-        case BinIO_TYPE_INT64:       BinIOConvert8(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count); ctx->data += 8 * count; break;
-        case BinIO_TYPE_FLOAT32:     BinIOConvert4(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count); ctx->data += 4 * count; break;
-        case BinIO_TYPE_FLOAT64:     BinIOConvert8(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count); ctx->data += 8 * count; break;
+    switch (type) {
+    case BinIO_TYPE_IGNORE_BYTE:
+        ctx->data += 1 * count;
+        break;
+    case BinIO_TYPE_BYTE:
+        BinIOConvert1(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count);
+        ctx->data += 1 * count;
+        break;
+    case BinIO_TYPE_INT16:
+        BinIOConvert2(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count);
+        ctx->data += 2 * count;
+        break;
+    case BinIO_TYPE_INT32:
+        BinIOConvert4(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count);
+        ctx->data += 4 * count;
+        break;
+    case BinIO_TYPE_INT64:
+        BinIOConvert8(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count);
+        ctx->data += 8 * count;
+        break;
+    case BinIO_TYPE_FLOAT32:
+        BinIOConvert4(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count);
+        ctx->data += 4 * count;
+        break;
+    case BinIO_TYPE_FLOAT64:
+        BinIOConvert8(byte_order, BinIO_HOST_BYTE_ORDER, ctx->data, va_arg(ctx->args, uint8_t *), count);
+        ctx->data += 8 * count;
+        break;
     }
 }
 
@@ -80,10 +97,10 @@ void vsunpackf(const void *buffer, const char *format, va_list args)
     struct BinIOUnpackContext context;
 
     BinIOInitFormatCursor(&cursor, format);
-    
+
     context.data = (const unsigned char*)buffer;
     va_copy(context.args, args);
-    
+
     while (BinIONextChar(&context, &cursor, BinIOUnpack)) {}
 
     va_end(context.args);
@@ -94,8 +111,8 @@ void vfunpackf(FILE *file, const char *format, va_list args)
     size_t n_bytes = BinIOFormatByteCount(format);
     void* buffer = malloc(n_bytes);
     fread(buffer, n_bytes, 1, file);
-    
+
     vsunpackf(buffer, format, args);
-    
+
     free(buffer);
 }