]> git.jsancho.org Git - lugaru.git/blobdiff - Source/GameTick.cpp
Moved Weapon model and texture loading in Weapon class
[lugaru.git] / Source / GameTick.cpp
index 85224889b81343609ea219d2bd42d5a9cecd7aa5..ed22ee26b33e57f299ee51cd61f5c9fc450b8013 100644 (file)
@@ -102,7 +102,7 @@ extern float envsoundlife[30];
 extern float usermousesensitivity;
 extern bool ismotionblur;
 extern bool showdamagebar; // (des)activate the damage bar
-extern bool decals;
+extern bool decalstoggle;
 extern bool skyboxtexture;
 extern float skyboxr;
 extern float skyboxg;
@@ -502,8 +502,9 @@ void Game::Loadlevel(int which)
         char buf[32];
         snprintf(buf, 32, "map%d", which + 1); // challenges
         Loadlevel(buf);
-    } else
+    } else {
         Loadlevel("mapsave");
+    }
 }
 
 void Game::Loadlevel(const std::string& name, bool tutorial)
@@ -606,7 +607,7 @@ void Game::Loadlevel(const std::string& name, bool tutorial)
     }
 
     if (!stealthloading) {
-        terrain.numdecals = 0;
+        terrain.decals.clear();
         Sprite::deleteSprites();
 
         for (int i = 0; i < subdivision; i++) {
@@ -706,6 +707,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) {
@@ -769,9 +774,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();
@@ -924,9 +926,6 @@ void Game::Loadlevel(const std::string& name, bool tutorial)
     oldmusicvolume[2] = 0;
     oldmusicvolume[3] = 0;
 
-    if (!firstload)
-        firstload = 1;
-
     leveltime = 0;
     wonleveltime = 0;
     visibleloading = false;
@@ -1775,13 +1774,13 @@ void doAerialAcrobatics()
                             lowpointtarget = lowpoint + DoRotation(Person::players[k]->facing, 0, -90, 0) * 1.5;
                             XYZ tempcoords1 = lowpoint;
                             whichhit = Object::objects[i]->model.LineCheck(&lowpoint, &lowpointtarget, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw);
-                            if (whichhit != -1 && fabs(Object::objects[i]->model.facenormals[whichhit].y) < .3) {
+                            if (whichhit != -1 && fabs(Object::objects[i]->model.Triangles[whichhit].facenormal.y) < .3) {
                                 Person::players[k]->setTargetAnimation(walljumpleftanim);
                                 emit_sound_at(movewhooshsound, Person::players[k]->coords);
                                 if (k == 0)
                                     pause_sound(whooshsound);
 
-                                lowpointtarget = DoRotation(Object::objects[i]->model.facenormals[whichhit], 0, Object::objects[i]->yaw, 0);
+                                lowpointtarget = DoRotation(Object::objects[i]->model.Triangles[whichhit].facenormal, 0, Object::objects[i]->yaw, 0);
                                 Person::players[k]->yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
                                 if (lowpointtarget.z < 0)
                                     Person::players[k]->yaw = 180 - Person::players[k]->yaw;
@@ -1793,13 +1792,13 @@ void doAerialAcrobatics()
                                 lowpoint = tempcoords1;
                                 lowpointtarget = lowpoint + DoRotation(Person::players[k]->facing, 0, 90, 0) * 1.5;
                                 whichhit = Object::objects[i]->model.LineCheck(&lowpoint, &lowpointtarget, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw);
-                                if (whichhit != -1 && fabs(Object::objects[i]->model.facenormals[whichhit].y) < .3) {
+                                if (whichhit != -1 && fabs(Object::objects[i]->model.Triangles[whichhit].facenormal.y) < .3) {
                                     Person::players[k]->setTargetAnimation(walljumprightanim);
                                     emit_sound_at(movewhooshsound, Person::players[k]->coords);
                                     if (k == 0)
                                         pause_sound(whooshsound);
 
-                                    lowpointtarget = DoRotation(Object::objects[i]->model.facenormals[whichhit], 0, Object::objects[i]->yaw, 0);
+                                    lowpointtarget = DoRotation(Object::objects[i]->model.Triangles[whichhit].facenormal, 0, Object::objects[i]->yaw, 0);
                                     Person::players[k]->yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
                                     if (lowpointtarget.z < 0)
                                         Person::players[k]->yaw = 180 - Person::players[k]->yaw;
@@ -1811,13 +1810,13 @@ void doAerialAcrobatics()
                                     lowpoint = tempcoords1;
                                     lowpointtarget = lowpoint + Person::players[k]->facing * 2;
                                     whichhit = Object::objects[i]->model.LineCheck(&lowpoint, &lowpointtarget, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw);
-                                    if (whichhit != -1 && fabs(Object::objects[i]->model.facenormals[whichhit].y) < .3) {
+                                    if (whichhit != -1 && fabs(Object::objects[i]->model.Triangles[whichhit].facenormal.y) < .3) {
                                         Person::players[k]->setTargetAnimation(walljumpbackanim);
                                         emit_sound_at(movewhooshsound, Person::players[k]->coords);
                                         if (k == 0)
                                             pause_sound(whooshsound);
 
-                                        lowpointtarget = DoRotation(Object::objects[i]->model.facenormals[whichhit], 0, Object::objects[i]->yaw, 0);
+                                        lowpointtarget = DoRotation(Object::objects[i]->model.Triangles[whichhit].facenormal, 0, Object::objects[i]->yaw, 0);
                                         Person::players[k]->yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
                                         if (lowpointtarget.z < 0)
                                             Person::players[k]->yaw = 180 - Person::players[k]->yaw;
@@ -1829,13 +1828,13 @@ void doAerialAcrobatics()
                                         lowpoint = tempcoords1;
                                         lowpointtarget = lowpoint - Person::players[k]->facing * 2;
                                         whichhit = Object::objects[i]->model.LineCheck(&lowpoint, &lowpointtarget, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw);
-                                        if (whichhit != -1 && fabs(Object::objects[i]->model.facenormals[whichhit].y) < .3) {
+                                        if (whichhit != -1 && fabs(Object::objects[i]->model.Triangles[whichhit].facenormal.y) < .3) {
                                             Person::players[k]->setTargetAnimation(walljumpfrontanim);
                                             emit_sound_at(movewhooshsound, Person::players[k]->coords);
                                             if (k == 0)
                                                 pause_sound(whooshsound);
 
-                                            lowpointtarget = DoRotation(Object::objects[i]->model.facenormals[whichhit], 0, Object::objects[i]->yaw, 0);
+                                            lowpointtarget = DoRotation(Object::objects[i]->model.Triangles[whichhit].facenormal, 0, Object::objects[i]->yaw, 0);
                                             Person::players[k]->yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
                                             if (lowpointtarget.z < 0)
                                                 Person::players[k]->yaw = 180 - Person::players[k]->yaw;
@@ -1978,7 +1977,7 @@ void doAerialAcrobatics()
                                                                     lowpoint.y += (float)j / 13;
                                                                     lowpointtarget = lowpoint + facing * 1.3;
                                                                     flatfacing = Person::players[k]->coords;
-                                                                    Person::players[k]->coords = colpoint - DoRotation(Object::objects[i]->model.facenormals[whichhit], 0, Object::objects[k]->yaw, 0) * .01;
+                                                                    Person::players[k]->coords = colpoint - DoRotation(Object::objects[i]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0) * .01;
                                                                     Person::players[k]->coords.y = lowpointtarget.y - .07;
                                                                     Person::players[k]->currentoffset = (flatfacing - Person::players[k]->coords) / Person::players[k]->scale;
 
@@ -1989,7 +1988,7 @@ void doAerialAcrobatics()
                                                                         }
                                                                         emit_sound_at(jumpsound, Person::players[k]->coords, 128.);
 
-                                                                        lowpointtarget = DoRotation(Object::objects[i]->model.facenormals[whichhit], 0, Object::objects[i]->yaw, 0);
+                                                                        lowpointtarget = DoRotation(Object::objects[i]->model.Triangles[whichhit].facenormal, 0, Object::objects[i]->yaw, 0);
                                                                         Person::players[k]->yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
                                                                         if (lowpointtarget.z < 0)
                                                                             Person::players[k]->yaw = 180 - Person::players[k]->yaw;
@@ -2458,20 +2457,11 @@ void doAttacks()
                                                     Person::players[i]->skeleton.free &&
                                                     Person::players[i]->skeleton.longdead > 1000) {
                                                 Person::players[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)
-                                                        terrain.DeleteDecal(j);
-                                                }
+                                                terrain.deleteDeadDecals();
                                                 for (unsigned int l = 0; l < Object::objects.size(); l++) {
-                                                    if (Object::objects[l]->model.type == decalstype)
-                                                        for (int j = 0; j < Object::objects[l]->model.numdecals; j++) {
-                                                            if ((Object::objects[l]->model.decaltype[j] == blooddecal ||
-                                                                    Object::objects[l]->model.decaltype[j] == blooddecalslow) &&
-                                                                    Object::objects[l]->model.decalalivetime[j] < 2)
-                                                                Object::objects[l]->model.DeleteDecal(j);
-                                                        }
+                                                    if (Object::objects[l]->model.type == decalstype) {
+                                                        Object::objects[l]->model.deleteDeadDecals();
+                                                    }
                                                 }
                                             }
                                             if (!Person::players[i]->dead || musictype != 2)
@@ -2484,21 +2474,11 @@ void doAttacks()
                                                          Person::players[i]->skeleton.free) &&
                                                         (!Person::players[i]->dead || musictype != stream_fighttheme)) {
                                                     Person::players[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);
-                                                        }
-                                                    }
+                                                    terrain.deleteDeadDecals();
                                                     for (unsigned int l = 0; l < Object::objects.size(); l++) {
-                                                        if (Object::objects[l]->model.type == decalstype)
-                                                            for (int j = 0; j < Object::objects[l]->model.numdecals; j++) {
-                                                                if ((Object::objects[l]->model.decaltype[j] == blooddecal ||
-                                                                        Object::objects[l]->model.decaltype[j] == blooddecalslow) &&
-                                                                        Object::objects[l]->model.decalalivetime[j] < 2) {
-                                                                    Object::objects[l]->model.DeleteDecal(j);
-                                                                }
-                                                            }
+                                                        if (Object::objects[l]->model.type == decalstype) {
+                                                            Object::objects[l]->model.deleteDeadDecals();
+                                                        }
                                                     }
                                                 }
                                         }
@@ -4309,7 +4289,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)) {
@@ -4572,8 +4552,9 @@ void Game::TickOnceAfter()
                     loading = 2;
                     loadtime = 0;
                     targetlevel = 7;
-                    if (!firstload)
+                    if (!firstLoadDone) {
                         LoadStuff();
+                    }
                     whichchoice = 0;
                     actuallevel = campaignlevels[actuallevel].nextlevel.front();
                     visibleloading = true;