]> git.jsancho.org Git - lugaru.git/blobdiff - Source/Devtools/ConsoleCmds.cpp
Creating map saving folder if needed
[lugaru.git] / Source / Devtools / ConsoleCmds.cpp
index a65315bc9cec89db224ff017310217e8042cb1cb..f3ac22c0fbeaf594f225d5191e5c43d38fdfc1a1 100644 (file)
@@ -24,6 +24,7 @@ along with Lugaru.  If not, see <http://www.gnu.org/licenses/>.
 #include "Level/Dialog.hpp"
 #include "Level/Hotspot.hpp"
 #include "Utils/Folders.hpp"
+#include "Tutorial.hpp"
 
 const char *cmd_names[cmd_count] = {
 #define DECLARE_COMMAND(cmd) #cmd,
@@ -49,10 +50,8 @@ extern int environment;
 extern float fadestart;
 extern float slomospeed;
 extern float slomofreq;
-extern int tutoriallevel;
 extern int hostile;
 extern int maptype;
-extern Objects objects;
 extern int slomo;
 extern float slomodelay;
 extern bool skyboxtexture;
@@ -129,7 +128,7 @@ static void set_metal(int pnum, const char *args)
     Person::players[pnum]->metallow  = low;
 }
 
-static void set_noclothes(int pnum, const char *args)
+static void set_noclothes(int pnum, const char*)
 {
     Person::players[pnum]->numclothes = 0;
     Person::players[pnum]->skeleton.drawmodel.textureptr.load(
@@ -143,7 +142,7 @@ static void set_clothes(int pnum, const char *args)
     snprintf(buf, 63, "Textures/%s.png", args);
 
     int id = Person::players[pnum]->numclothes;
-    strcpy(Person::players[pnum]->clothes[id], buf);
+    strncpy(Person::players[pnum]->clothes[id], buf, 64);
     Person::players[pnum]->clothestintr[id] = tintr;
     Person::players[pnum]->clothestintg[id] = tintg;
     Person::players[pnum]->clothestintb[id] = tintb;
@@ -157,26 +156,39 @@ static void set_clothes(int pnum, const char *args)
 
 /* Console commands themselves */
 
-void ch_quit(const char *args)
+void ch_quit(const char *)
 {
     tryquit = 1;
 }
 
 void ch_map(const char *args)
 {
-    Loadlevel(args);
+    if (!LoadLevel(args)) {
+        // FIXME: Reduce code duplication with GameTick (should come from a Console class)
+        for (int k = 14; k >= 1; k--) {
+            consoletext[k] = consoletext[k - 1];
+        }
+        consoletext[0] = std::string("Could not load the requested level '") + args + "', aborting.";
+        consoleselected = 0;
+    }
     whichlevel = -2;
     campaign = 0;
 }
 
 void ch_save(const char *args)
 {
-    std::string map_path = Folders::getUserDataPath() + "/Maps/" + args;
+    std::string map_path = Folders::getUserDataPath() + "/Maps";
+    Folders::makeDirectory(map_path);
+    map_path = map_path + "/" + args;
 
     int mapvers = 12;
 
     FILE *tfile;
     tfile = fopen( map_path.c_str(), "wb" );
+    if (tfile == NULL) {
+        perror((std::string("Couldn't open file ") + map_path + " for saving").c_str());
+        return;
+    }
     fpackf(tfile, "Bi", mapvers);
     fpackf(tfile, "Bi", maptype);
     fpackf(tfile, "Bi", hostile);
@@ -210,14 +222,15 @@ void ch_save(const char *args)
 
     fpackf(tfile, "Bi", environment);
 
-    fpackf(tfile, "Bi", objects.numobjects);
+    fpackf(tfile, "Bi", Object::objects.size());
 
-    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]);
+    for (unsigned int k = 0; k < Object::objects.size(); k++) {
+        fpackf(tfile, "Bi Bf Bf Bf Bf Bf Bf", Object::objects[k]->type, Object::objects[k]->yaw, Object::objects[k]->pitch,
+               Object::objects[k]->position.x, Object::objects[k]->position.y, Object::objects[k]->position.z, Object::objects[k]->scale);
+    }
 
     fpackf(tfile, "Bi", Hotspot::hotspots.size());
-    for (int i = 0; i < Hotspot::hotspots.size(); i++) {
+    for (unsigned 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);
@@ -262,7 +275,8 @@ void ch_save(const char *args)
             bodyprop = Person::players[j]->proportionbody.x / 1.1;
             armprop = Person::players[j]->proportionarms.x / 1.1;
             legprop = Person::players[j]->proportionlegs.x / 1.1;
-        } else if (Person::players[j]->creature == rabbittype) {
+        } else {
+            // rabbittype
             headprop = Person::players[j]->proportionhead.x / 1.2;
             bodyprop = Person::players[j]->proportionbody.x / 1.05;
             armprop = Person::players[j]->proportionarms.x / 1.00;
@@ -295,7 +309,7 @@ void ch_save(const char *args)
     fclose(tfile);
 }
 
-void ch_cellar(const char *args)
+void ch_cellar(const char *)
 {
     Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/Furdarko.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
 }
@@ -383,7 +397,7 @@ void ch_armornear(const char *args)
         set_armor(closest, args);
 }
 
-void ch_protectionreset(const char *args)
+void ch_protectionreset(const char *)
 {
     set_protection(0, "1 1 1");
     set_armor(0, "1 1 1");
@@ -418,13 +432,13 @@ void ch_clothesnear(const char *args)
         set_clothes(closest, args);
 }
 
-void ch_belt(const char *args)
+void ch_belt(const char *)
 {
     Person::players[0]->skeleton.clothes = !Person::players[0]->skeleton.clothes;
 }
 
 
-void ch_cellophane(const char *args)
+void ch_cellophane(const char *)
 {
     cellophane = !cellophane;
     float mul = (cellophane ? 0 : 1);
@@ -437,7 +451,7 @@ void ch_cellophane(const char *args)
     }
 }
 
-void ch_funnybunny(const char *args)
+void ch_funnybunny(const char *)
 {
     Person::players[0]->creature = rabbittype;
     Person::players[0]->skeletonLoad(true);
@@ -447,7 +461,7 @@ void ch_funnybunny(const char *args)
     set_proportion(0, "1 1 1 1");
 }
 
-void ch_wolfie(const char *args)
+void ch_wolfie(const char *)
 {
     Person::players[0]->creature = wolftype;
     Person::players[0]->skeletonLoad();
@@ -460,42 +474,42 @@ void ch_wolfieisgod(const char *args)
     ch_wolfie(args);
 }
 
-void ch_wolf(const char *args)
+void ch_wolf(const char *)
 {
     Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/Wolf.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
 }
 
-void ch_snowwolf(const char *args)
+void ch_snowwolf(const char *)
 {
     Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/SnowWolf.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
 }
 
-void ch_darkwolf(const char *args)
+void ch_darkwolf(const char *)
 {
     Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/DarkWolf.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
 }
 
-void ch_lizardwolf(const char *args)
+void ch_lizardwolf(const char *)
 {
     Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/LizardWolf.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
 }
 
-void ch_white(const char *args)
+void ch_white(const char *)
 {
     Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/Fur.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
 }
 
-void ch_brown(const char *args)
+void ch_brown(const char *)
 {
     Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/Fur3.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
 }
 
-void ch_black(const char *args)
+void ch_black(const char *)
 {
     Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/Fur2.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
 }
 
-void ch_sizemin(const char *args)
+void ch_sizemin(const char *)
 {
     for (unsigned i = 1; i < Person::players.size(); i++)
         if (Person::players[i]->scale < 0.8 * 0.2)
@@ -504,7 +518,7 @@ void ch_sizemin(const char *args)
 
 void ch_tutorial(const char *args)
 {
-    tutoriallevel = atoi(args);
+    Tutorial::active = atoi(args);
 }
 
 void ch_hostile(const char *args)
@@ -524,8 +538,8 @@ void ch_type(const char *args)
 
 void ch_path(const char *args)
 {
-    int n = sizeof(pathtypenames) / sizeof(pathtypenames[0]);
-    for (int i = 0; i < n; i++)
+    unsigned int n = sizeof(pathtypenames) / sizeof(pathtypenames[0]);
+    for (unsigned int i = 0; i < n; i++)
         if (stripfx(args, pathtypenames[i])) {
             editorpathtype = i;
             break;
@@ -577,43 +591,43 @@ void ch_fixtype(const char *args)
     Dialog::dialogs[0].type = dlg;
 }
 
-void ch_fixrotation(const char *args)
+void ch_fixrotation(const char *)
 {
     int playerId = Dialog::currentScene().participantfocus;
     Dialog::currentDialog().participantyaw[playerId] = Person::players[playerId]->yaw;
 }
 
-void ch_ddialogue(const char *args)
+void ch_ddialogue(const char *)
 {
     if (!Dialog::dialogs.empty()) {
         Dialog::dialogs.pop_back();
     }
 }
 
-void ch_dhs(const char *args)
+void ch_dhs(const char *)
 {
     if (!Hotspot::hotspots.empty()) {
         Hotspot::hotspots.pop_back();
     }
 }
 
-void ch_immobile(const char *args)
+void ch_immobile(const char *)
 {
     Person::players[0]->immobile = 1;
 }
 
-void ch_allimmobile(const char *args)
+void ch_allimmobile(const char *)
 {
     for (unsigned i = 1; i < Person::players.size(); i++)
         Person::players[i]->immobile = 1;
 }
 
-void ch_mobile(const char *args)
+void ch_mobile(const char *)
 {
     Person::players[0]->immobile = 0;
 }
 
-void ch_default(const char *args)
+void ch_default(const char *)
 {
     Person::players[0]->armorhead = 1;
     Person::players[0]->armorhigh = 1;
@@ -656,29 +670,29 @@ void ch_play(const char *args)
     sscanf(args, "%d", &dlg);
     Dialog::whichdialogue = dlg;
 
-    if (Dialog::whichdialogue >= Dialog::dialogs.size()) {
+    if (Dialog::whichdialogue >= int(Dialog::dialogs.size())) {
         return;
     }
 
     Dialog::currentDialog().play();
 }
 
-void ch_mapkilleveryone(const char *args)
+void ch_mapkilleveryone(const char *)
 {
     maptype = mapkilleveryone;
 }
 
-void ch_mapkillmost(const char *args)
+void ch_mapkillmost(const char *)
 {
     maptype = mapkillmost;
 }
 
-void ch_mapkillsomeone(const char *args)
+void ch_mapkillsomeone(const char *)
 {
     maptype = mapkillsomeone;
 }
 
-void ch_mapgosomewhere(const char *args)
+void ch_mapgosomewhere(const char *)
 {
     maptype = mapgosomewhere;
 }
@@ -716,7 +730,7 @@ void ch_skytint(const char *args)
     SetUpLighting();
 
     terrain.DoShadows();
-    objects.DoShadows();
+    Object::DoShadows();
 }
 
 void ch_skylight(const char *args)
@@ -726,15 +740,15 @@ void ch_skylight(const char *args)
     SetUpLighting();
 
     terrain.DoShadows();
-    objects.DoShadows();
+    Object::DoShadows();
 }
 
-void ch_skybox(const char *args)
+void ch_skybox(const char*)
 {
     skyboxtexture = !skyboxtexture;
 
     SetUpLighting();
 
     terrain.DoShadows();
-    objects.DoShadows();
+    Object::DoShadows();
 }