]> git.jsancho.org Git - lugaru.git/blobdiff - Source/GameTick.cpp
Replaced patchobjects arrays by vectors, cleaned code a bit
[lugaru.git] / Source / GameTick.cpp
index 2a4f4bd8a644cbc0fcd174390a4ee1aad7c3ab1c..b94d2e8b0162dce0f373c2c6ca6e363960de3b10 100644 (file)
@@ -214,7 +214,7 @@ inline float stepTowardf(float from, float to, float by)
 void Game::playdialoguescenesound()
 {
     XYZ temppos;
-    temppos = Person::players[Dialog::currentScene().participantfocus]->coords;
+    temppos = Person::players.at(Dialog::currentScene().participantfocus)->coords;
     temppos = temppos - viewer;
     Normalise(&temppos);
     temppos += viewer;
@@ -491,24 +491,30 @@ void Setenvironment(int which)
     texdetail = temptexdetail;
 }
 
-void Game::Loadlevel(int which)
+bool Game::LoadLevel(int which)
 {
     stealthloading = 0;
     whichlevel = which;
 
     if (which == -1) {
-        Loadlevel("tutorial", true);
+        return LoadLevel("tutorial", true);
     } else if (which >= 0 && which <= 15) {
         char buf[32];
         snprintf(buf, 32, "map%d", which + 1); // challenges
-        Loadlevel(buf);
+        return LoadLevel(buf);
     } else {
-        Loadlevel("mapsave");
+        return LoadLevel("mapsave");
     }
 }
 
-void Game::Loadlevel(const std::string& name, bool tutorial)
+bool Game::LoadLevel(const std::string& name, bool tutorial)
 {
+    const std::string level_path = Folders::getResourcePath("Maps/" + name);
+    if (!Folders::file_exists(level_path)) {
+        perror(std::string("LoadLevel: Could not open file '" + level_path).c_str());
+        return false;
+    }
+
     int indemo; // FIXME this should be removed
     int templength;
     float lamefloat;
@@ -542,7 +548,7 @@ void Game::Loadlevel(const std::string& name, bool tutorial)
     int mapvers;
     FILE *tfile;
     errno = 0;
-    tfile = Folders::openMandatoryFile( Folders::getResourcePath("Maps/"+name), "rb" );
+    tfile = Folders::openMandatoryFile(level_path, "rb");
 
     pause_sound(stream_firesound);
     scoreadded = 0;
@@ -612,7 +618,7 @@ void Game::Loadlevel(const std::string& name, bool tutorial)
 
         for (int i = 0; i < subdivision; i++) {
             for (int j = 0; j < subdivision; j++) {
-                terrain.patchobjectnum[i][j] = 0;
+                terrain.patchobjects[i][j].clear();
             }
         }
         Game::LoadingScreen();
@@ -707,6 +713,10 @@ void Game::Loadlevel(const std::string& name, bool tutorial)
 
     funpackf(tfile, "Bi", &environment);
 
+    if (environment != oldenvironment)
+        Setenvironment(environment);
+    oldenvironment = environment;
+
     Object::LoadObjectsFromFile(tfile, stealthloading);
 
     if (mapvers >= 7) {
@@ -770,9 +780,6 @@ void Game::Loadlevel(const std::string& name, bool tutorial)
     funpackf(tfile, "Bf Bf Bf Bf", &mapcenter.x, &mapcenter.y, &mapcenter.z, &mapradius);
 
     SetUpLighting();
-    if (environment != oldenvironment)
-        Setenvironment(environment);
-    oldenvironment = environment;
 
     if (!stealthloading) {
         Object::AddObjectsToTerrain();
@@ -928,6 +935,8 @@ void Game::Loadlevel(const std::string& name, bool tutorial)
     leveltime = 0;
     wonleveltime = 0;
     visibleloading = false;
+
+    return true;
 }
 
 void doDevKeys()
@@ -1741,8 +1750,8 @@ void doAerialAcrobatics()
             //clip to terrain
             Person::players[k]->coords.y = max(Person::players[k]->coords.y, terrain.getHeight(Person::players[k]->coords.x, Person::players[k]->coords.z));
 
-            for (int l = 0; l < terrain.patchobjectnum[Person::players[k]->whichpatchx][Person::players[k]->whichpatchz]; l++) {
-                int i = terrain.patchobjects[Person::players[k]->whichpatchx][Person::players[k]->whichpatchz][l];
+            for (unsigned int l = 0; l < terrain.patchobjects[Person::players[k]->whichpatchx][Person::players[k]->whichpatchz].size(); l++) {
+                unsigned int i = terrain.patchobjects[Person::players[k]->whichpatchx][Person::players[k]->whichpatchz][l];
                 if (Object::objects[i]->type != rocktype ||
                         Object::objects[i]->scale > .5 && Person::players[k]->aitype == playercontrolled ||
                         Object::objects[i]->position.y > Person::players[k]->coords.y) {
@@ -1891,7 +1900,7 @@ void doAerialAcrobatics()
             }
 
             if (tempcollide)
-                for (int l = 0; l < terrain.patchobjectnum[Person::players[k]->whichpatchx][Person::players[k]->whichpatchz]; l++) {
+                for (unsigned int l = 0; l < terrain.patchobjects[Person::players[k]->whichpatchx][Person::players[k]->whichpatchz].size(); l++) {
                     int i = terrain.patchobjects[Person::players[k]->whichpatchx][Person::players[k]->whichpatchz][l];
                     lowpoint = Person::players[k]->coords;
                     lowpoint.y += 1.35;
@@ -3220,7 +3229,7 @@ void Game::Tick()
                                         hostile = 1;
                                     }
 
-                                    if (Person::players[Dialog::currentScene().participantfocus]->dead) {
+                                    if (Person::players.at(Dialog::currentScene().participantfocus)->dead) {
                                         Dialog::indialogue = -1;
                                         Dialog::directing = false;
                                         cameramode = 0;
@@ -4288,7 +4297,7 @@ void Game::TickOnceAfter()
                     Person::players[i]->aitype == getweapontype ||
                     Person::players[i]->aitype == gethelptype ||
                     Person::players[i]->aitype == searchtype) &&
-                    !Person::players[i]->dead/*&&Person::players[i]->surprised<=0*/ &&
+                    !Person::players[i]->dead &&
                     (Person::players[i]->animTarget != sneakattackedanim &&
                      Person::players[i]->animTarget != knifesneakattackedanim &&
                      Person::players[i]->animTarget != swordsneakattackedanim)) {
@@ -4483,11 +4492,8 @@ void Game::TickOnceAfter()
 
                     if (!Person::players[0]->dead && targetlevel != whichlevel)
                         startbonustotal = bonustotal;
-                    if (Person::players[0]->dead)
-                        Loadlevel(whichlevel);
-                    else
-                        Loadlevel(targetlevel);
 
+                    LoadLevel(targetlevel);
                     fireSound();
 
                     loading = 3;
@@ -4498,7 +4504,7 @@ void Game::TickOnceAfter()
 
                     fireSound(firestartsound);
 
-                    Loadlevel(campaignlevels[Account::active().getCampaignChoicesMade()].mapname.c_str());
+                    LoadLevel(campaignlevels[Account::active().getCampaignChoicesMade()].mapname.c_str());
 
                     fireSound();
 
@@ -4558,7 +4564,7 @@ void Game::TickOnceAfter()
                     actuallevel = campaignlevels[actuallevel].nextlevel.front();
                     visibleloading = true;
                     stillloading = 1;
-                    Loadlevel(campaignlevels[actuallevel].mapname.c_str());
+                    LoadLevel(campaignlevels[actuallevel].mapname.c_str());
                     campaign = 1;
                     mainmenu = 0;
                     gameon = 1;
@@ -4622,22 +4628,21 @@ void Game::TickOnceAfter()
             colviewer = viewer;
             coltarget = cameraloc;
             Object::SphereCheckPossible(&colviewer, findDistance(&colviewer, &coltarget));
-            if (terrain.patchobjectnum[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz])
-                for (int j = 0; j < terrain.patchobjectnum[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz]; j++) {
-                    int i = terrain.patchobjects[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz][j];
-                    colviewer = viewer;
-                    coltarget = cameraloc;
-                    if (Object::objects[i]->model.LineCheckPossible(&colviewer, &coltarget, &col, &Object::objects[i]->position, &Object::objects[i]->yaw) != -1)
-                        viewer = col;
+            for (unsigned int j = 0; j < terrain.patchobjects[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz].size(); j++) {
+                unsigned int i = terrain.patchobjects[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz][j];
+                colviewer = viewer;
+                coltarget = cameraloc;
+                if (Object::objects[i]->model.LineCheckPossible(&colviewer, &coltarget, &col, &Object::objects[i]->position, &Object::objects[i]->yaw) != -1) {
+                    viewer = col;
                 }
-            if (terrain.patchobjectnum[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz])
-                for (int j = 0; j < terrain.patchobjectnum[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz]; j++) {
-                    int i = terrain.patchobjects[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz][j];
-                    colviewer = viewer;
-                    if (Object::objects[i]->model.SphereCheck(&colviewer, .15, &col, &Object::objects[i]->position, &Object::objects[i]->yaw) != -1) {
-                        viewer = colviewer;
-                    }
+            }
+            for (unsigned int j = 0; j < terrain.patchobjects[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz].size(); j++) {
+                unsigned int i = terrain.patchobjects[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz][j];
+                colviewer = viewer;
+                if (Object::objects[i]->model.SphereCheck(&colviewer, .15, &col, &Object::objects[i]->position, &Object::objects[i]->yaw) != -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)) {