Add-on Manager rewrite
[supertux.git] / src / main.cpp
index 20ea613..5006882 100644 (file)
@@ -59,6 +59,7 @@ namespace supertux_apple {
 #include "physfs/physfs_sdl.hpp"
 #include "random_generator.hpp"
 #include "worldmap/worldmap.hpp"
+#include "addon/addon_manager.hpp"
 #include "binreloc/binreloc.h"
 
 namespace { DrawingContext *context_pointer; }
@@ -98,11 +99,13 @@ static void init_physfs(const char* argv0)
     throw std::runtime_error(msg.str());
   }
 
+  // allow symbolic links
+  PHYSFS_permitSymbolicLinks(1);
+
   // Initialize physfs (this is a slightly modified version of
   // PHYSFS_setSaneConfig
   const char* application = "supertux2"; //instead of PACKAGE_NAME so we can coexist with MS1
   const char* userdir = PHYSFS_getUserDir();
-  const char* dirsep = PHYSFS_getDirSeparator();
   char* writedir = new char[strlen(userdir) + strlen(application) + 2];
 
   // Set configuration directory
@@ -132,27 +135,6 @@ static void init_physfs(const char* argv0)
   PHYSFS_addToSearchPath(writedir, 0);
   delete[] writedir;
 
-  // Search for archives and add them to the search path
-  const char* archiveExt = "zip";
-  char** rc = PHYSFS_enumerateFiles("/");
-  size_t extlen = strlen(archiveExt);
-
-  for(char** i = rc; *i != 0; ++i) {
-    size_t l = strlen(*i);
-    if((l > extlen) && ((*i)[l - extlen - 1] == '.')) {
-      const char* ext = (*i) + (l - extlen);
-      if(strcasecmp(ext, archiveExt) == 0) {
-        const char* d = PHYSFS_getRealDir(*i);
-        char* str = new char[strlen(d) + strlen(dirsep) + l + 1];
-        sprintf(str, "%s%s%s", d, dirsep, *i);
-        PHYSFS_addToSearchPath(str, 1);
-        delete[] str;
-      }
-    }
-  }
-
-  PHYSFS_freeList(rc);
-
   // when started from source dir...
   std::string dir = PHYSFS_getBaseDir();
   dir += "/data";
@@ -224,9 +206,6 @@ static void init_physfs(const char* argv0)
 #endif
   }
 
-  // allow symbolic links
-  PHYSFS_permitSymbolicLinks(1);
-
   //show search Path
   char** searchpath = PHYSFS_getSearchPath();
   for(char** i = searchpath; *i != NULL; i++)
@@ -289,9 +268,10 @@ static bool parse_commandline(int argc, char** argv)
       config->use_fullscreen = true;
     } else if(arg == "--default" || arg == "-d") {
       config->use_fullscreen = false;
-      config->aspect_ratio = -1;
-      config->screenwidth = 800;
-      config->screenheight = 600;
+      config->aspect_width  = 800;
+      config->aspect_height = 600;
+      config->screenwidth   = 800;
+      config->screenheight  = 600;
     } else if(arg == "--window" || arg == "-w") {
       config->use_fullscreen = false;
     } else if(arg == "--geometry" || arg == "-g") {
@@ -299,27 +279,38 @@ static bool parse_commandline(int argc, char** argv)
         print_usage(argv[0]);
         throw std::runtime_error("Need to specify a parameter for geometry switch");
       }
-      if(sscanf(argv[++i], "%dx%d", &config->screenwidth, &config->screenheight)
-         != 2) {
-        print_usage(argv[0]);
-        throw std::runtime_error("Invalid geometry spec, should be WIDTHxHEIGHT");
-      }
+      i += 1;
+      if (sscanf(argv[i], "%dx%d:%dx%d",
+                 &config->screenwidth,  &config->screenheight,
+                 &config->aspect_width, &config->aspect_height) != 4 &&
+          sscanf(argv[i], "%dx%d", &config->screenwidth, &config->screenheight) != 2)
+        {
+          print_usage(argv[0]);
+          throw std::runtime_error("Invalid geometry spec, should be WIDTHxHEIGHT");
+        }
     } else if(arg == "--aspect" || arg == "-a") {
       if(i+1 >= argc) {
         print_usage(argv[0]);
         throw std::runtime_error("Need to specify a parameter for aspect switch");
-      }
-      if(strcasecmp(argv[i+1], "auto") == 0) {
-        i++;
-        config->aspect_ratio = -1;
       } else {
-        int aspect_width, aspect_height;
+        int aspect_width  = 4;
+        int aspect_height = 3;
         if(sscanf(argv[++i], "%d:%d", &aspect_width, &aspect_height) != 2) {
           print_usage(argv[0]);
           throw std::runtime_error("Invalid aspect spec, should be WIDTH:HEIGHT");
+        } else {
+          float aspect_ratio = static_cast<double>(config->aspect_width) /
+            static_cast<double>(config->aspect_height);
+
+          // use aspect ratio to calculate logical resolution
+          if (aspect_ratio > 1) {
+            config->aspect_width  = static_cast<int> (600 * aspect_ratio + 0.5);
+            config->aspect_height = 600;
+          } else {
+            config->aspect_width  = 600;
+            config->aspect_height = static_cast<int> (600 * 1/aspect_ratio + 0.5);
+          }
         }
-        config->aspect_ratio = static_cast<double>(aspect_width) /
-                               static_cast<double>(aspect_height);
       }
     } else if(arg == "--show-fps") {
       config->show_fps = true;
@@ -400,33 +391,9 @@ void init_video()
     desktop_height = info->current_h;
   }
 #endif
-
-  double aspect_ratio = config->aspect_ratio;
-
-  // try to guess aspect ratio of monitor if needed
-  if (aspect_ratio <= 0) {
-// TODO: commented out because 
-// 1) it tends to guess wrong if widescreen-monitors don't stretch 800x600 to fit, but just display black borders
-// 2) aspect ratios other than 4:3 are largely untested
-/*
-    if(config->use_fullscreen && desktop_width > 0) {
-      aspect_ratio = static_cast<double>(desktop_width) / static_cast<double>(desktop_height);
-    } else {
-*/
-      aspect_ratio = 4.0 / 3.0;
-/*
-    }
-*/
-  }
-
-  // use aspect ratio to calculate logical resolution
-  if (aspect_ratio > 1) {
-    SCREEN_WIDTH  = static_cast<int> (600 * aspect_ratio + 0.5);
-    SCREEN_HEIGHT = 600;
-  } else {
-    SCREEN_WIDTH  = 600;
-    SCREEN_HEIGHT = static_cast<int> (600 * 1/aspect_ratio + 0.5);
-  }
+  
+  SCREEN_WIDTH  = config->aspect_width;
+  SCREEN_HEIGHT = config->aspect_height;
 
   context_pointer->init_renderer();
   screen = SDL_GetVideoSurface();
@@ -452,7 +419,9 @@ void init_video()
 
   SDL_ShowCursor(0);
 
-  log_info << (config->use_fullscreen?"fullscreen ":"window ") << SCREEN_WIDTH << "x" << SCREEN_HEIGHT << " Ratio: " << aspect_ratio << "\n";
+  log_info << (config->use_fullscreen?"fullscreen ":"window ")
+           << " Window: " << config->screenwidth << "x" << config->screenheight
+           << " Area: "   << config->aspect_width << "x" << config->aspect_height << std::endl;
 }
 
 static void init_audio()
@@ -551,6 +520,8 @@ int main(int argc, char** argv)
     main_controller = new JoystickKeyboardController();
     timelog("config");
     init_config();
+    timelog("addons");
+    AddonManager::get_instance().load_addons();
     timelog("tinygettext");
     init_tinygettext();
     timelog("commandline");