]> git.jsancho.org Git - lugaru.git/commitdiff
Added a class for Hotspots to avoid using several arrays
authorCôme Chilliet <come@chilliet.eu>
Fri, 9 Dec 2016 18:14:42 +0000 (01:14 +0700)
committerCôme Chilliet <come@chilliet.eu>
Fri, 9 Dec 2016 18:14:42 +0000 (01:14 +0700)
CMakeLists.txt
Source/ConsoleCmds.cpp
Source/GameDraw.cpp
Source/GameTick.cpp
Source/Globals.cpp
Source/Hotspot.cpp [new file with mode: 0644]
Source/Hotspot.h [new file with mode: 0644]

index c1a3e6b5030f7255f214ef47c56e7b237e9c0188..0d3af5b9468c5210f390af30aaee4f894d53b3fa 100644 (file)
@@ -47,6 +47,7 @@ set(LUGARU_SRCS
     ${SRCDIR}/Account.cpp
     ${SRCDIR}/ConsoleCmds.cpp
     ${SRCDIR}/Dialog.cpp
+    ${SRCDIR}/Hotspot.cpp
     ${SRCDIR}/Game.cpp
     ${SRCDIR}/GameDraw.cpp
     ${SRCDIR}/GameInitDispose.cpp
@@ -86,6 +87,7 @@ set(LUGARU_H
     ${SRCDIR}/Account.h
     ${SRCDIR}/ConsoleCmds.h
     ${SRCDIR}/Dialog.h
+    ${SRCDIR}/Hotspot.h
     ${SRCDIR}/Game.h
     ${SRCDIR}/Lights.h
     ${SRCDIR}/Menu.h
index cdce93cec9cf014e6c14b0b7d2931d9f798a5f59..df26f820498d05c4a28f6ff1967430ba101b248b 100644 (file)
@@ -21,6 +21,7 @@ along with Lugaru.  If not, see <http://www.gnu.org/licenses/>.
 #include "ConsoleCmds.h"
 #include "Game.h"
 #include "Dialog.h"
+#include "Hotspot.h"
 #include "Utils/Folders.h"
 
 const char *cmd_names[cmd_count] = {
@@ -49,12 +50,7 @@ extern float slomospeed;
 extern float slomofreq;
 extern int tutoriallevel;
 extern int hostile;
-extern XYZ hotspot[40];
-extern int hotspottype[40];
-extern float hotspotsize[40];
-extern char hotspottext[40][256];
 extern int maptype;
-extern int numhotspots;
 extern Objects objects;
 extern int slomo;
 extern float slomodelay;
@@ -219,13 +215,13 @@ void ch_save(const char *args)
         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]);
 
-    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", Hotspot::hotspots.size());
+    for (int i = 0; i < Hotspot::hotspots.size(); i++) {
+        fpackf(tfile, "Bi Bf Bf Bf Bf", Hotspot::hotspots[i].type, Hotspot::hotspots[i].size, Hotspot::hotspots[i].position.x, Hotspot::hotspots[i].position.y, Hotspot::hotspots[i].position.z);
+        int templength = strlen(Hotspot::hotspots[i].text);
         fpackf(tfile, "Bi", templength);
         for (int l = 0; l < templength; l++)
-            fpackf(tfile, "Bb", hotspottext[i][l]);
+            fpackf(tfile, "Bb", Hotspot::hotspots[i].text[l]);
     }
 
     fpackf(tfile, "Bi", Person::players.size());
@@ -537,19 +533,14 @@ void ch_path(const char *args)
 
 void ch_hs(const char *args)
 {
-    hotspot[numhotspots] = Person::players[0]->coords;
-
     float size;
     int type, shift;
     sscanf(args, "%f%d %n", &size, &type, &shift);
 
-    hotspotsize[numhotspots] = size;
-    hotspottype[numhotspots] = type;
-
-    strcpy(hotspottext[numhotspots], args + shift);
-    strcat(hotspottext[numhotspots], "\n");
+    Hotspot::hotspots.emplace_back(Person::players[0]->coords, type, size);
 
-    numhotspots++;
+    strcpy(Hotspot::hotspots.back().text, args + shift);
+    strcat(Hotspot::hotspots.back().text, "\n");
 }
 
 void ch_dialogue(const char *args)
@@ -593,13 +584,16 @@ void ch_fixrotation(const char *args)
 
 void ch_ddialogue(const char *args)
 {
-    Dialog::dialogs.pop_back();
+    if (!Dialog::dialogs.empty()) {
+        Dialog::dialogs.pop_back();
+    }
 }
 
 void ch_dhs(const char *args)
 {
-    if (numhotspots)
-        numhotspots--;
+    if (!Hotspot::hotspots.empty()) {
+        Hotspot::hotspots.pop_back();
+    }
 }
 
 void ch_immobile(const char *args)
index 45d2873ef862092cfc4af50ff2c2b0d5b2f9a788..7ee322eb48eaec9ee32858938a9170cf58fb68e6 100644 (file)
@@ -24,6 +24,7 @@ along with Lugaru.  If not, see <http://www.gnu.org/licenses/>.
 #include "Awards.h"
 #include "Menu.h"
 #include "Dialog.h"
+#include "Hotspot.h"
 
 extern XYZ viewer;
 extern int environment;
@@ -77,14 +78,6 @@ extern bool againbonus;
 extern float damagedealt;
 extern bool invertmouse;
 
-extern int numhotspots;
-extern int killhotspot;
-extern XYZ hotspot[40];
-extern int hotspottype[40];
-extern float hotspotsize[40];
-extern char hotspottext[40][256];
-extern int currenthotspot;
-
 extern bool campaign;
 extern bool winfreeze;
 
@@ -893,23 +886,23 @@ int Game::DrawGLScene(StereoSide side)
             }
 
             //Hot spots
-            if (numhotspots && (bonustime >= 1 || bonus <= 0 || bonustime < 0) && !tutoriallevel) {
+            if (Hotspot::hotspots.size() && (bonustime >= 1 || bonus <= 0 || bonustime < 0) && !tutoriallevel) {
                 float closestdist = -1;
                 float distance = 0;
-                int closest = currenthotspot;
-                for (int i = 0; i < numhotspots; i++) {
-                    distance = distsq(&Person::players[0]->coords, &hotspot[i]);
+                int closest = Hotspot::current;
+                for (int i = 0; i < Hotspot::hotspots.size(); i++) {
+                    distance = distsq(&Person::players[0]->coords, &Hotspot::hotspots[i].position);
                     if (closestdist == -1 || distance < closestdist) {
-                        if (distsq(&Person::players[0]->coords, &hotspot[i]) < hotspotsize[i] && ((hotspottype[i] <= 10 && hotspottype[i] >= 0) || (hotspottype[i] <= 40 && hotspottype[i] >= 20))) {
+                        if (distsq(&Person::players[0]->coords, &Hotspot::hotspots[i].position) < Hotspot::hotspots[i].size && ((Hotspot::hotspots[i].type <= 10 && Hotspot::hotspots[i].type >= 0) || (Hotspot::hotspots[i].type <= 40 && Hotspot::hotspots[i].type >= 20))) {
                             closestdist = distance;
                             closest = i;
                         }
                     }
                 }
                 if (closest != -1) {
-                    currenthotspot = closest;
-                    if (hotspottype[closest] <= 10) {
-                        if (distsq(&Person::players[0]->coords, &hotspot[closest]) < hotspotsize[closest])
+                    Hotspot::current = closest;
+                    if (Hotspot::hotspots[closest].type <= 10) {
+                        if (distsq(&Person::players[0]->coords, &Hotspot::hotspots[closest].position) < Hotspot::hotspots[closest].size)
                             tutorialstagetime = 0;
                         tutorialmaxtime = 1;
                         tutorialopac = tutorialmaxtime - tutorialstagetime;
@@ -918,7 +911,7 @@ int Game::DrawGLScene(StereoSide side)
                         if (tutorialopac < 0)
                             tutorialopac = 0;
 
-                        sprintf (string, "%s", hotspottext[closest]);
+                        sprintf (string, "%s", Hotspot::hotspots[closest].text);
 
                         int lastline = 0;
                         int line = 0;
@@ -939,8 +932,8 @@ int Game::DrawGLScene(StereoSide side)
                                 done = 1;
                             i++;
                         }
-                    } else if ((hotspottype[closest] >= 20) && (Dialog::dialogs[hotspottype[closest] - 20].gonethrough == 0)) {
-                        Dialog::whichdialogue = hotspottype[closest] - 20;
+                    } else if ((Hotspot::hotspots[closest].type >= 20) && (Dialog::dialogs[Hotspot::hotspots[closest].type - 20].gonethrough == 0)) {
+                        Dialog::whichdialogue = Hotspot::hotspots[closest].type - 20;
                         Dialog::currentDialog().play();
                         Dialog::currentDialog().gonethrough++;
                     }
index 7ec218f4bf966239e056e9883b1e8b4256b8f555..13eb1cbff770768c09f14b06622ef81508e62a93 100644 (file)
@@ -44,6 +44,7 @@ along with Lugaru.  If not, see <http://www.gnu.org/licenses/>.
 #include "ConsoleCmds.h"
 #include "Dialog.h"
 #include "Utils/Folders.h"
+#include "Hotspot.h"
 
 #include <algorithm>
 #include <set>
@@ -130,14 +131,6 @@ extern float hostiletime;
 
 extern bool gamestarted;
 
-extern int numhotspots;
-extern int killhotspot;
-extern XYZ hotspot[40];
-extern int hotspottype[40];
-extern float hotspotsize[40];
-extern char hotspottext[40][256];
-extern int currenthotspot;
-
 extern int hostile;
 
 extern bool stillloading;
@@ -840,8 +833,8 @@ void Game::Loadlevel(const std::string& name)
     if (accountactive)
         difficulty = accountactive->getDifficulty();
 
-    numhotspots = 0;
-    currenthotspot = -1;
+    Hotspot::hotspots.clear();
+    Hotspot::current = -1;
     bonustime = 1;
 
     skyboxtexture = 1;
@@ -997,19 +990,22 @@ void Game::Loadlevel(const std::string& name)
     }
 
     if (mapvers >= 7) {
+        int numhotspots;
         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);
+        Hotspot::hotspots.resize(numhotspots);
+        for (int i = 0; i < Hotspot::hotspots.size(); i++) {
+            funpackf(tfile, "Bi Bf Bf Bf Bf", &Hotspot::hotspots[i].type, &Hotspot::hotspots[i].size, &Hotspot::hotspots[i].position.x, &Hotspot::hotspots[i].position.y, &Hotspot::hotspots[i].position.z);
             funpackf(tfile, "Bi", &templength);
             if (templength)
                 for (int l = 0; l < templength; l++)
-                    funpackf(tfile, "Bb", &hotspottext[i][l]);
-            hotspottext[i][templength] = '\0';
-            if (hotspottype[i] == -111)
+                    funpackf(tfile, "Bb", &Hotspot::hotspots[i].text[l]);
+            Hotspot::hotspots[i].text[templength] = '\0';
+            if (Hotspot::hotspots[i].type == -111)
                 indemo = 1;
         }
-    } else
-        numhotspots = 0;
+    } else {
+        Hotspot::hotspots.clear();
+    }
 
     if (visibleloading)
         LoadingScreen();
@@ -5438,27 +5434,27 @@ void Game::Tick()
 
             //hotspots
             static float hotspotvisual[40];
-            if (numhotspots) {
+            if (Hotspot::hotspots.size()) {
                 XYZ hotspotsprite;
                 if (editorenabled)
-                    for (int i = 0; i < numhotspots; i++)
+                    for (int i = 0; i < Hotspot::hotspots.size(); i++)
                         hotspotvisual[i] -= multiplier / 320;
 
-                for (int i = 0; i < numhotspots; i++) {
+                for (int i = 0; i < Hotspot::hotspots.size(); i++) {
                     while (hotspotvisual[i] < 0) {
                         hotspotsprite = 0;
-                        hotspotsprite.x = float(abs(Random() % 100000)) / 100000 * hotspotsize[i];
+                        hotspotsprite.x = float(abs(Random() % 100000)) / 100000 * Hotspot::hotspots[i].size;
                         hotspotsprite = DoRotation(hotspotsprite, 0, 0, Random() % 360);
                         hotspotsprite = DoRotation(hotspotsprite, 0, Random() % 360, 0);
-                        hotspotsprite += hotspot[i];
+                        hotspotsprite += Hotspot::hotspots[i].position;
                         Sprite::MakeSprite(breathsprite, hotspotsprite, hotspotsprite * 0, 1, 0.5, 0, 7, 0.4);
-                        hotspotvisual[i] += 0.1 / hotspotsize[i] / hotspotsize[i] / hotspotsize[i];
+                        hotspotvisual[i] += 0.1 / Hotspot::hotspots[i].size / Hotspot::hotspots[i].size / Hotspot::hotspots[i].size;
                     }
                 }
 
-                for (int i = 0; i < numhotspots; i++) {
-                    if (hotspottype[i] <= 10 && hotspottype[i] > 0) {
-                        hotspot[i] = Person::players[hotspottype[i]]->coords;
+                for (int i = 0; i < Hotspot::hotspots.size(); i++) {
+                    if (Hotspot::hotspots[i].type <= 10 && Hotspot::hotspots[i].type > 0) {
+                        Hotspot::hotspots[i].position = Person::players[Hotspot::hotspots[i].type]->coords;
                     }
                 }
             }
@@ -5667,11 +5663,7 @@ void Game::Tick()
                                 if (Dialog::currentScene().sound != 0) {
                                     playdialoguescenesound();
                                     if (Dialog::currentScene().sound == -5) {
-                                        hotspot[numhotspots] = Person::players[0]->coords;
-                                        hotspotsize[numhotspots] = 10;
-                                        hotspottype[numhotspots] = -1;
-
-                                        numhotspots++;
+                                        Hotspot::hotspots.emplace_back(Person::players[0]->coords, -1, 10);
                                     }
                                     if (Dialog::currentScene().sound == -6) {
                                         hostile = 1;
@@ -6911,23 +6903,23 @@ void Game::TickOnceAfter()
             }
         }
 
-        killhotspot = 2;
-        for (int i = 0; i < numhotspots; i++) {
-            if (hotspottype[i] > 10 && hotspottype[i] < 20) {
-                if (Person::players[hotspottype[i] - 10]->dead == 0)
-                    killhotspot = 0;
-                else if (killhotspot == 2)
-                    killhotspot = 1;
+        Hotspot::killhotspot = 2;
+        for (int i = 0; i < Hotspot::hotspots.size(); i++) {
+            if (Hotspot::hotspots[i].type > 10 && Hotspot::hotspots[i].type < 20) {
+                if (Person::players[Hotspot::hotspots[i].type - 10]->dead == 0)
+                    Hotspot::killhotspot = 0;
+                else if (Hotspot::killhotspot == 2)
+                    Hotspot::killhotspot = 1;
             }
         }
-        if (killhotspot == 2)
-            killhotspot = 0;
+        if (Hotspot::killhotspot == 2)
+            Hotspot::killhotspot = 0;
 
 
         winhotspot = false;
-        for (int i = 0; i < numhotspots; i++)
-            if (hotspottype[i] == -1)
-                if (distsq(&Person::players[0]->coords, &hotspot[i]) < hotspotsize[i])
+        for (int i = 0; i < Hotspot::hotspots.size(); i++)
+            if (Hotspot::hotspots[i].type == -1)
+                if (distsq(&Person::players[0]->coords, &Hotspot::hotspots[i].position) < Hotspot::hotspots[i].size)
                     winhotspot = true;
 
         int numalarmed = 0;
@@ -6965,7 +6957,7 @@ void Game::TickOnceAfter()
             }
 
 
-            if (killhotspot) {
+            if (Hotspot::killhotspot) {
                 changedelay = 1;
                 targetlevel = whichlevel + 1;
                 if (targetlevel > numchallengelevels - 1)
@@ -6991,7 +6983,7 @@ void Game::TickOnceAfter()
                 changedelay = .1;
                 alldead = false;
                 winhotspot = false;
-                killhotspot = 0;
+                Hotspot::killhotspot = 0;
             }
 
             if (!editorenabled && gameon && !mainmenu) {
@@ -7033,13 +7025,13 @@ void Game::TickOnceAfter()
                         (Person::players[0]->dead ||
                          (alldead && maptype == mapkilleveryone) ||
                          (winhotspot) ||
-                         (killhotspot)))
+                         (Hotspot::killhotspot)))
                     loading = 1;
                 if ((Person::players[0]->dead ||
                         (alldead && maptype == mapkilleveryone) ||
                         (winhotspot) ||
                         (windialogue) ||
-                        (killhotspot)) &&
+                        (Hotspot::killhotspot)) &&
                         changedelay <= 0) {
                     if (whichlevel != -2 && !loading && !Person::players[0]->dead) {
                         winfreeze = true;
index 8c09b7b1304eaa3740fdf77ea4d7cc76d00db31b..9c5d79d6114faff20c08bd53f6d920e7f88f5000 100644 (file)
@@ -108,14 +108,6 @@ int mainmenu = 0;
 int whichjointstartarray[26] = {0};
 int whichjointendarray[26] = {0};
 
-int numhotspots = 0;
-XYZ hotspot[40];
-int hotspottype[40] = {0};
-float hotspotsize[40] = {0};
-char hotspottext[40][256] = {0};
-int currenthotspot = 0;
-int killhotspot = 0;
-
 float smoketex = 0;
 
 float slomospeed = 0;
diff --git a/Source/Hotspot.cpp b/Source/Hotspot.cpp
new file mode 100644 (file)
index 0000000..03bf3a1
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+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 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.
+
+You should have received a copy of the GNU General Public License
+along with Lugaru.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "Hotspot.h"
+
+std::vector<Hotspot> Hotspot::hotspots;
+int Hotspot::current = 0;
+int Hotspot::killhotspot = 0;
+
+Hotspot::Hotspot() :
+    position(),
+    type(0),
+    size(0)
+{
+}
+
+Hotspot::Hotspot(XYZ p, int t, float s) :
+    position(p),
+    type(t),
+    size(s)
+{
+}
diff --git a/Source/Hotspot.h b/Source/Hotspot.h
new file mode 100644 (file)
index 0000000..3139f98
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+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 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.
+
+You should have received a copy of the GNU General Public License
+along with Lugaru.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _HOTSPOT_H_
+#define _HOTSPOT_H_
+
+#include "Quaternions.h"
+#include <vector>
+
+class Hotspot
+{
+public:
+    static std::vector<Hotspot> hotspots;
+    static int current;
+    static int killhotspot;
+
+    Hotspot();
+    Hotspot(XYZ position, int type, float size);
+
+    XYZ position;
+    int type;
+    float size;
+    char text[256] = {0};
+};
+
+#endif