src/Application.cc
changeset 409 1a03ff151abc
parent 408 e6cfc44266af
child 411 106aaf6eadfe
--- a/src/Application.cc	Tue Jan 20 23:30:18 2009 +0200
+++ b/src/Application.cc	Wed Jan 21 00:21:42 2009 +0200
@@ -2,6 +2,7 @@
 #include "Application.hh"
 
 #include <stdexcept>
+#include <sstream>
 #include <cstdio>
 #include <cassert>
 
@@ -14,10 +15,22 @@
     ARG_FULLSCREEN  = 'F',
     ARG_RESOLUTION  = 'R',
 
-    ARG_LIST_MODES  = 0xff01,
-    ARG_VERSION     = 0xff02,
+    ARG_LIST_MODES      = 0xff01,
+    ARG_VERSION         = 0xff02,
+    ARG_TERRAIN_SEED    = 0xff03,
+    ARG_TERRAIN_SIZE    = 0xff04,
+
 };
 
+        
+Main::Main (void) :
+    graphics_enabled(false),
+    net_port(NETWORK_PORT_STR),
+    net_server(false),
+    net_connect("")
+{
+
+}
 
 /**
  * Set the arg_* members
@@ -48,17 +61,15 @@
     args.add_option(ARG_LIST_MODES, "list-modes", "",
             "output a list of available display modes and exit");
 
+    args.add_option(ARG_TERRAIN_SEED, "terrain-seed", "SEED",
+            "set seed for terrain random generator");
+
+    args.add_option(ARG_TERRAIN_SIZE, "terrain-size", "WIDTHxHEIGHT",
+            "set terrain size for random generator");
+
     args.add_option(ARG_VERSION, "version", "",
             "output application version and exit");
 
-    // set defaults
-    arg_graphics = false;
-    arg_port = NETWORK_PORT_STR;
-    arg_server = false;
-    arg_connect = "";
-    graphics.fullscreen = GRAPHICS_FULLSCREEN;
-    graphics.resolution = PixelCoordinate(GRAPHICS_RESOLUTION_WIDTH, GRAPHICS_RESOLUTION_HEIGHT);
-
     // extra state
     bool resolution_default = true;
     
@@ -77,19 +88,19 @@
                 return false;
 
             case ARG_PORT:
-                arg_port = args.get_argument();
+                net_port = args.get_argument();
                 break;
 
             case ARG_SERVER:
-                arg_server = true;
+                net_server = true;
                 break;
 
             case ARG_CLIENT:
-                arg_connect = args.get_argument();
+                net_connect = args.get_argument();
                 break;
 
             case ARG_GRAPHICS:
-                arg_graphics = true;
+                graphics_enabled = true;
                 break;
 
             case ARG_FULLSCREEN:
@@ -106,7 +117,7 @@
                 break;
 
             case ARG_RESOLUTION:
-                parse_arg_resolution(args.get_argument());
+                graphics.resolution = parse_arg_dimensions(args.get_argument(), "--resolution");
                 resolution_default = false;
                 break;
 
@@ -118,36 +129,55 @@
                 dump_version();
                 return false;
 
+            case ARG_TERRAIN_SEED:
+                terrain.random_seed = parse_arg_int(args.get_argument(), "--terrain-seed");
+                break;
+
+            case ARG_TERRAIN_SIZE:
+                terrain.dimensions = parse_arg_dimensions(args.get_argument(), "--terrain-size");
+                break;
+
             case CL_CommandLine::REST_ARG:
-                throw ArgumentError(args.get_argument());
+                throw ArgumentError("Trailing arguments: " + args.get_argument());
 
             default:
-                throw ArgumentError(std::string(1, (char) args.get_key()));
+                throw ArgumentError(std::string() + "Unknown argument key: " + (char) args.get_key());
 
         }
     }
 
     // check for invalid combinations of arugments
-    if (arg_server and !arg_connect.empty())
+    if (net_server and !net_connect.empty())
         throw ArgumentError("cannot be both server and client");
 
     // enable graphics by default unless server
-    if (!arg_server)
-        arg_graphics = true;
+    if (!net_server)
+        graphics_enabled = true;
     
     // continue
     return true;
 }
         
-void Main::parse_arg_resolution (const std::string &val) {
+int Main::parse_arg_int (const std::string &arg_val, const char *arg_name) {
+    int int_val;
+    
+    // read using istringstream
+    std::istringstream ss(arg_val);
+    
+    if (!(ss >> int_val))
+        throw ArgumentError(std::string() + "invalid integer arugment for " + arg_name + ": " + arg_val);
+
+    return int_val;
+}
+
+PixelCoordinate Main::parse_arg_dimensions (const std::string &arg_val, const char *arg_name) {
     unsigned int w, h;
     
     // sccanf as unsigned
-    if (sscanf(val.c_str(), "%ux%u", &w, &h) != 2)
-        throw ArgumentError("invalid format for --resolution");
+    if (sscanf(arg_val.c_str(), "%ux%u", &w, &h) != 2)
+        throw ArgumentError(std::string() + "invalid format for " + arg_name + ": " + arg_val);
     
-    // store as PixelCoordinate
-    graphics.resolution = PixelCoordinate(w, h);
+    return PixelCoordinate(w, h);
 }
         
 void Main::dump_display_modes (void) {
@@ -180,17 +210,21 @@
 
         // our engine
         Engine engine;
+
+        // setup game unless client
+        if (net_connect.empty())
+            engine.setupGame(terrain);
         
         // setup graphics
-        if (arg_graphics)
+        if (graphics_enabled)
             engine.setupGraphics(graphics);
 
         // setup either network server, client or singleplayer
-        if (arg_server) {
-            engine.setupNetworkServer(arg_port);
+        if (net_server) {
+            engine.setupNetworkServer(net_port);
 
-        } else if (!arg_connect.empty()) {
-            engine.setupNetworkClient(arg_connect, arg_port);
+        } else if (!net_connect.empty()) {
+            engine.setupNetworkClient(net_connect, net_port);
         
         } else {
             engine.setupSinglePlayer();