]> git.jsancho.org Git - lugaru.git/blobdiff - Source/Sprite.cpp
Reading debug mode from config again, but command line option overrides it
[lugaru.git] / Source / Sprite.cpp
index c3ac298cc958685170bac4ee845731d5a3f5a9ec..a0502d2e3377b9520e15c2277eb7f726395b5331 100644 (file)
@@ -1,22 +1,21 @@
 /*
 Copyright (C) 2003, 2010 - Wolfire Games
+Copyright (C) 2010-2016 - Lugaru contributors (see AUTHORS file)
 
 This file is part of Lugaru.
 
-Lugaru is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
+Lugaru is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
+Lugaru 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.
-
-See the GNU General Public License for more details.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+along with Lugaru.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "Sprite.h"
@@ -57,7 +56,7 @@ vector<Sprite*> Sprite::sprites = vector<Sprite*>();
 //Functions
 void Sprite::Draw()
 {
-    int i, j, k;
+    int k;
     static float M[16];
     static XYZ point;
     static float distancemult;
@@ -97,7 +96,7 @@ void Sprite::Draw()
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     glDepthMask(0);
     glAlphaFunc(GL_GREATER, 0.0001);
-    for (i = 0; i < sprites.size(); i++) {
+    for (unsigned i = 0; i < sprites.size(); i++) {
         if (lasttype != sprites[i]->type) {
             switch (sprites[i]->type) {
             case cloudsprite:
@@ -108,15 +107,8 @@ void Sprite::Draw()
                     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:
+            case cloudimpactsprite:
                 cloudimpacttexture.bind();
                 if (!blend) {
                     blend = 1;
@@ -142,10 +134,14 @@ void Sprite::Draw()
                 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 (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);
@@ -193,15 +189,19 @@ void Sprite::Draw()
         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);
+            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);
+            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
+        glMatrixMode(GL_MODELVIEW);
         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)) {
@@ -223,26 +223,35 @@ void Sprite::Draw()
         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]->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 (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);
+                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 (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 (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);
@@ -262,13 +271,14 @@ void Sprite::Draw()
         glPopMatrix();
     }
     tempmult = multiplier;
-    for (i = sprites.size() - 1; i >= 0; i--) {
+    for (int 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 == 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;
@@ -281,8 +291,9 @@ void Sprite::Draw()
         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 {
+            if (findLength(&sprites[i]->velocity) <= multiplier) {
+                sprites[i]->velocity = 0;
+            } else {
                 XYZ slowdown;
                 slowdown = sprites[i]->velocity * -1;
                 Normalise(&slowdown);
@@ -295,12 +306,12 @@ void Sprite::Draw()
             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]->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;
@@ -311,23 +322,25 @@ void Sprite::Draw()
                 float rotationpoint;
                 int whichtri;
 
-                for (j = 0; j < numplayers; j++) {
-                    if (!spritehit && player[j].dead && sprites[i]->alivetime > .1) {
+                for (unsigned j = 0; j < Person::players.size(); j++) {
+                    if (!spritehit && Person::players[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);
+                        where -= Person::players[j]->coords;
+                        if (!Person::players[j]->skeleton.free)
+                            where = DoRotation(where, 0, -Person::players[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);
+                        where -= Person::players[j]->coords;
+                        if (!Person::players[j]->skeleton.free)
+                            where = DoRotation(where, 0, -Person::players[j]->yaw, 0);
                         endpoint = where;
 
                         movepoint = 0;
                         rotationpoint = 0;
-                        whichtri = player[j].skeleton.drawmodel.LineCheck(&startpoint, &endpoint, &footpoint, &movepoint, &rotationpoint);
+                        whichtri = Person::players[j]->skeleton.drawmodel.LineCheck(&startpoint, &endpoint, &footpoint, &movepoint, &rotationpoint);
                         if (whichtri != -1) {
                             spritehit = 1;
-                            player[j].DoBloodBigWhere(0, 160, sprites[i]->oldposition);
+                            Person::players[j]->DoBloodBigWhere(0, 160, sprites[i]->oldposition);
                             DeleteSprite(i);
                         }
                     }
@@ -338,13 +351,14 @@ void Sprite::Draw()
                 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++) {
+                            for (int 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);
+                                        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, .5, Random() % 360);
                                         DeleteSprite(i);
                                         spritehit = 1;
                                     }
@@ -352,7 +366,7 @@ void Sprite::Draw()
                     }
                 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);
+                        terrain.MakeDecal(blooddecalfast, sprites[i]->position, sprites[i]->size * 1.6, .6, Random() % 360);
                         DeleteSprite(i);
                     }
             }
@@ -360,8 +374,10 @@ void Sprite::Draw()
         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]->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;
@@ -379,18 +395,22 @@ void Sprite::Draw()
             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;
+            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 (sprites[i]->opacity <= 0 || sprites[i]->size <= 0)
+            DeleteSprite(i);
     }
     if (check)
-        for (i = sprites.size() - 1; i >= 0; i--) {
+        for (int i = sprites.size() - 1; i >= 0; i--) {
             sprites[i]->oldposition = sprites[i]->position;
         }
     glAlphaFunc(GL_GREATER, 0.0001);